<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Aaron Lau（韩栖） · App-scope</title>
<link>https://aaronlau.me/tags/app-scope/</link>
<atom:link href="https://aaronlau.me/tags/app-scope/feed.xml" rel="self" type="application/rss+xml"/>
<description>Aaron Lau（韩栖） 带 #App-scope 标签的推送。</description>
<language>zh-Hans</language>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<lastBuildDate>Tue, 27 Aug 2019 00:00:00 GMT</lastBuildDate>
<item>
<title>Nginx 学习笔记 (8) —— 缓存加速指南</title>
<link>https://aaronlau.me/2019/08/27/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/27/</guid>
<pubDate>Tue, 27 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[Nginx proxy_cache 基本配置：缓存目录、缓存键、有效期、防缓存雪崩，以及手动清除缓存。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>proxy_cache 运用局部性的原理，备存一些先前被访问过、料将被再度使用的资源，从而减少后端服务器的资源开销。缓存也是反代的用途之一。</p>
<p>1) 定义缓存目录，二级目录结构，10MB 的共享内存区存放缓存键和元数据，不活跃的缓存文件 1 小时后清除，磁盘上限 512MB；</p>
<pre><code>proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=the_cache_zone:10m inactive=1h max_size=512m use_temp_path=off;</code></pre>
<p>2) 启用缓存，并添加一响应头指示缓存状态（MISS / BYPASS / HIT …）。key 是决定缓存命中率的因素之一，要特别留心 Query String；</p>
<pre><code>location / {
    proxy_pass http://www.example.com;
    proxy_cache the_cache_zone;
    # (default) proxy_cache_key $scheme$proxy_host$request_uri;
    add_header X-Cache-Status $upstream_cache_status;
}</code></pre>
<p>3) 若希望抓取的源站内容总是新鲜，需要忽略上游的 Cache-Control 和 Expires，再来配置自己的缓存期限。proxy_cache_valid 控制的是有效期，inactive 决定的是保留期限，时间一到管你新不新鲜都要丢掉；</p>
<pre><code>proxy_ignore_headers X-Accel-Expires Cache-Control Expires;
proxy_cache_valid 200 30m;
proxy_cache_valid any 1m;
proxy_cache_revalidate on;</code></pre>
<p>4) 缓存一时爽，全家火葬场。一大波缓存同时失效，会导致缓存雪崩，使得大批请求涌向源站。网站不是特别大的话，可以加锁排队、暂时返回陈旧数据；但根本的还是要各别设定缓存期限，错峰更新缓存，不要一窝蜂。</p>
<pre><code>proxy_cache_lock on;
proxy_cache_use_stale error timeout updating http_503;
proxy_cache_background_update on;</code></pre>
<p>5) 倘若有手动清除缓存的需求，又用不起 NGINX Plus，不妨编译进 ngx_cache_purge。URI 前面加上 /purge 即为清除缓存接口（最好不要被外部访问）。</p>
<pre><code>location ~ /purge(/.*) {
    allow 127.0.0.1;
    deny all;
    proxy_cache_purge the_cache_zone $scheme$proxy_host$1$is_args$args;
}</code></pre>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (a4) —— 浅谈负载均衡</title>
<link>https://aaronlau.me/2019/08/26/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/26/</guid>
<pubDate>Mon, 26 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[Nginx upstream 常用负载均衡策略：热备、轮询、最小连接、源地址哈希、加权与健康检查。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>Nginx 以高并发、低消耗而闻名，很适合作为一个负载均衡器，有策略地分发请求给不同的后端服务器。避免单点故障之余，亦增强整个系统的可用性，简单说不容易宕机。假设有一组名为 backend 的 upstream，调用方式是 proxy_pass <a href="http://backend" rel="noopener">http://backend</a>。</p>
<p>热备：平时使用 www 提供服务，bad 暂时下线，bak 作为发生故障时兜底的一台机器。</p>
<pre><code>upstream backend {
    server www.example.com;
    server bad.example.com down;
    server bak.example.com backup;
}</code></pre>
<p>轮询是经（mò）典（rèn）的负载均衡算法，按照时间先后来分发请求。理论上会跳过不能用的 server，但预设的超时太长，实务上可把 proxy_connect_timeout 等改成 1。最小连接（least_conn）因应忙闲不均而生，把新请求分发至没那么忙的主机。源地址哈希（ip_hash）保证一个用户对应一台服务器，解决 Session 不一致的问题（通常表现为无法登录），但出于容灾理由，不建议大量使用。</p>
<p>集群中难免有算力不均的情况。不问性能的齐头式平等，很可能让配置最差的那个服务器决定整个集群的性能。可跑一次 bench.sh，再依据测试结果分配权重；max_fails 缺省值是 1，fail_timeout 缺省值是 10s。</p>
<pre><code>upstream backend {
    server srv1.example.com weight=3;
    server srv2.example.com max_fails=2 fail_timeout=1d;
    server srv3.example.com;
}</code></pre>
<p>即使某台后端返回了 500，它也会参与负载均衡，毕竟能收到状态码就表示它还活着。但这在用户眼里跟 Connection Refused 可没啥区别，所以把 500 一并纳入“在下一台服务器重试”的机制里。</p>
<pre><code>proxy_next_upstream error timeout http_500;</code></pre>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (7) —— 启用 Brotli 压缩</title>
<link>https://aaronlau.me/2019/08/25/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/25/</guid>
<pubDate>Sun, 25 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[为 Nginx 编译 ngx_brotli 模块，启用压缩率高于 Gzip 的 Brotli 算法。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>Brotli 是 Google 研发的一种新兴压缩算法，可以加快网页的载入速度。相较于 Gzip 压缩率更高、性能也非常好，再基于 Chrome 的市场支配地位，Brotli 便得到迅速普及。不过要注意，它仅适用于 HTTPS。</p>
<p>1) 下载 Brotli 的源码；</p>
<pre><code>yum install git &amp;&amp; cd /usr/local/src
git clone https://github.com/google/ngx_brotli.git
pushd ngx_brotli
git submodule update --init
popd</code></pre>
<p>2) 执行 nginx -V，configure arguments 即为现有的参数。追加 --add-module=../ngx_brotli，重新编译。如需平滑升级，make 之后请不要 make install，而是替换二进制后 make upgrade；</p>
<pre><code>cd nginx-1.16.1
./configure \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_sub_module \
--with-openssl=../openssl-1.1.1c \
--add-module=../ngx_brotli
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/nginx
make upgrade</code></pre>
<p>3) 修改 nginx.conf。缺省值就够用，不妨再留意一下 gzip_types 和 brotli_types，以允许压缩 text/html 以外的文件；</p>
<pre><code>http {
    ...
    gzip on;
    brotli on;
    # brotli_types text/css text/javascript application/rss+xml;
    ...
}</code></pre>
<p>4) 重载 Nginx，可借由 Brotli Test 等工具检验效果。</p>
<pre><code>nginx -t &amp;&amp; nginx -s reload</code></pre>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (a3) —— 让 sub_filter 替换 Gzip 内容</title>
<link>https://aaronlau.me/2019/08/24/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/24/</guid>
<pubDate>Sat, 24 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[对方无视 Accept-Encoding 硬塞 Gzip，sub_filter 替换失败？两次 proxy_pass 先解压再替换。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>在微信小程序 web-view 跳转外部链接？甲方的需求千奇百怪，好在办法总比困难多。不是只允许业务域名吗？此时反代不失为一个办法。就算绕开了限制，由于内容经你方服务器转发，你方也须承担责任。</p>
<p>先 proxy_pass，再用 sub_filter 把对方域名换成我方域名，避免打开非业务域名。可有些网站无视 Accept-Encoding: ''，不管三七二十一，统统返回压过的，所以替换失败。先来看人家怎么办到的：对方 frontend 向 upstream 请求 gzip，backend 则把 gzip_http_version 设成 1.0（Nginx 默认以 HTTP/1.0 连接上游）。</p>
<p>思路清晰了有没有？先解压、再替换就好了呗。Maxim Dounin 写了个 gunzip filter 模块，还有人直接修改 Nginx 源码。另一种 trick（感谢 ryd994 大大的原帖）比较直观：做两次 proxy_pass，先反代源站 gzip 过的内容，再反代一次即可获得未压缩的内容。</p>
<pre><code>location /forward {
    proxy_pass https://example.com;
    # proxy_set_header Accept-Encoding 'gzip';
    # gunzip on;
}

location / {
    proxy_pass https://yourdomain.com/forward;
    proxy_set_header Accept-Encoding '';

    sub_filter_types *;
    sub_filter_once off;
    sub_filter 'example.com' 'yourdomain.com';
}</code></pre>
<p>上面的 gunzip on 和下面的 Accept-Encoding '' 互为替代。即使禁用压缩就能顺利替换，也可以试看看这招。这种需求很能吃出站流量，带宽嘛，总是省一点算一点。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (6) —— sub_filter 替换响应内容</title>
<link>https://aaronlau.me/2019/08/23/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/23/</guid>
<pubDate>Fri, 23 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[用 Nginx 的 sub_filter 查找并替换反代回来的内容，记得先禁用上游压缩。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>Accept-Encoding 设为空值以禁用压缩，是因为 sub_filter 只能处理未经压缩的内容；又 sub_filter 一般只替换 text/html 且仅工作一次，不符合需求，故对配置稍做微调。</p>
<pre><code>location / {
    ...
    proxy_set_header Accept-Encoding '';
    sub_filter_types *;
    sub_filter_once off;
    sub_filter '查找内容：源站域名' '替换为：反代站域名';
    ...
}</code></pre>
<p>如果禁用上游压缩的 trick 无效，或是心疼回源带宽，下一篇也许能帮到你。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (a2) —— $host、$http_host 与 $server_name</title>
<link>https://aaronlau.me/2019/08/22/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/22/</guid>
<pubDate>Thu, 22 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[Nginx 三个容易混淆的变量 $host、$http_host、$server_name 各取自哪里，以及 server 的匹配顺序。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>$host 的值，首先是请求行中的 host name，打个比方，GET <a href="http://example.com/" rel="noopener">http://example.com/</a> HTTP/1.1 中的 host name 就是 example.com；然后是请求头内 Host 字段的值；最后是匹配成功的 server name，有点儿“调剂”的意思。值得留意，$host 总是小写且不带端口号。</p>
<p>$http_host 的值，其实就是请求头中 Host 字段的值。同理可得请求头中任意字段的值，如 User-Agent 就可以用 $http_user_agent 来调用。它可简单理解为（但不等同）$host:$server_port。另外 $proxy_port 为 backend 的端口，通常会隐藏起来，如 8080；$server_port 为客户端访问 frontend 使用的端口，如 80。</p>
<p>$server_name 的值，是实际处理该请求的 server block 的 server_name。Nginx 分发请求时，会依据客户端请求的 Host 按优先级逐次匹配：首先做精确匹配，其次查找通配符 * 开头的，再次查找通配符 * 结尾的，最后以正则表达式做模糊匹配。</p>
<p>若请求的 Host 匹配不上（或许根本是空值），则分派给默认的 server，可以在 listen 指令中附上 default_server 参数来指定。若没有指定，该请求将会走 http block 里面的第一个 server block。减少攻击面计，实务上应返回 444 以关闭连接。</p>
<pre><code>server {
    listen 80 default_server;
    server_name _;
    return 444;
}</code></pre>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (a1) —— proxy_set_header 默认值</title>
<link>https://aaronlau.me/2019/08/21/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/21/</guid>
<pubDate>Wed, 21 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[proxy_set_header 默认只改 Host 和 Connection 两个字段：为什么这样设，以及何时要改。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>proxy_set_header 默认重定义两个 Header 头字段：</p>
<pre><code>proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;</code></pre>
<p>Host 初始值 $proxy_host，这是因为 HTTP/1.1 必须包含 Host 字段以指定主机。$proxy_host 是 backend 即后端的主机名，$host 是 frontend 即自身的主机名。要不要改成 $host 或 $http_host，视后端会不会校验域名和端口而定。举个例子，proxy_pass 的目标是一组 upstream 时，$proxy_host 是这组 upstream 的名字，如果后端只接收 Host 是 www.example.com 的请求，那么后端不会响应，变通办法正是改写 Host 字段的值。</p>
<p>Connection 初始值 close，是因为在 HTTP/1.1 中所有连接都是长连接，而后端的 Web 应用程序（HTTP/1.0 或更古早的）未必支持连接复用，所以统统设成 close 以免出错。跟后端通讯真需要用到 keep-alive，先配置一组 upstream，回头再清空 Connection 字段即可。</p>
<pre><code>upstream backend {
    server www.example.com;
    keepalive 16;
}

server {
    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection '';
        # proxy_set_header Host www.example.com;
    }
}</code></pre>
<p>并没有 proxy_http_version 2.0，甚至于 nginx → upstream 也是默认 HTTP/1.0。HTTP/2 多路复用可减少客户端到 frontend 的连接数，不过在 frontend 到服务端的情境中，连接数并非瓶颈，共用一个连接反而更限制并发能力。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (5) —— 被反代被镜像了怎么办？</title>
<link>https://aaronlau.me/2019/08/20/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/20/</guid>
<pubDate>Tue, 20 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[网站被反代、被镜像时的几种 Nginx 反制手段：封 IP、屏蔽 UA、禁 IP 直访、图片反盗链和访问认证。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>须知请求头的所有字段都是可以被人为修改的，镜像跟反镜像、反盗链跟反反盗链……都是一个斗智斗勇的过程，没有办法一劳永逸。以下几招，按需取用。</p>
<p>封锁 IP 段，也可以用来遵守特定国家的法令（譬如锁区、GDPR 等）；屏蔽 UA 这招有点“防君子不防小人”，不过起码能挡住一批小白。</p>
<pre><code>deny xxx.xxx.0.0/16;
if ($http_user_agent ~* (spider|bot)) { return 403; }
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) { return 403; }</code></pre>
<p>禁止 IP 直接访问，防止 DNS 恶意解析：</p>
<pre><code>server {
    listen 80 default_server;
    server_name _;
    return 444;
}</code></pre>
<p>图片反盗链。如果 Referer 与 valid_referers 约定不符，$invalid_referer 变为 1，服务器返回 403 Forbidden。</p>
<pre><code>location ~* \.(jpg|jpeg|png|gif|tiff|webp)$ {
    valid_referers none blocked yourdomain.com;
    if ($invalid_referer) { return 403; }
}</code></pre>
<p>始终返回 Gzip 过的内容，能稍微增加对方替换的难度。最后是访问认证：借由 httpd-tools 里的 htpasswd 生成密码文件，再修改 server.conf。应当搭配 HTTPS；因浏览器会记住密钥，缺乏合理的注销手段，故不建议大量使用（通常应用于内网）。</p>
<pre><code>yum install httpd-tools
cd /usr/local/nginx/conf &amp;&amp; htpasswd -bc passwd admin password

auth_basic 'Confirm password to continue';
auth_basic_user_file passwd;</code></pre>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (4) —— 自动跳转 https 或 www</title>
<link>https://aaronlau.me/2019/08/19/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/19/</guid>
<pubDate>Mon, 19 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[Nginx 把 HTTP 301 到 HTTPS、开启 HSTS 并加入预加载列表，以及 non-www 统一跳转 www。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>单单开启 HTTPS 不足以保障安全，若仍保留 HTTP 更是门户大开，况且从 SEO 的角度来说，协议不同也会视为内容重复的两个网站。比较稳妥的做法是，重定向 HTTP 请求至 HTTPS，这是服务器端跳转。</p>
<pre><code>server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$host$request_uri;
}</code></pre>
<p>更进一步地，建议开启 HSTS 以防范 SSL 剥离攻击。HSTS 会告知浏览器今后访问该站点都得使用 HTTPS，即使用户在地址栏输入的 HTTP 亦然。这是浏览器端跳转，不用再 301。</p>
<pre><code>add_header Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload';</code></pre>
<p>不过还是有盲点存在。新访客首次访问，可不晓得 HSTS 的规矩，得经历一次 HTTP → HTTPS 的过程才行，这中间攻击者就大有文章可做。所以有一个 HSTS 预加载列表，第一次访问就教你做人。合法证书、全站 HTTPS、子域名全数 HTTPS、响应头带 Strict-Transport-Security，条件满足就向 hstspreload.org 提交。但要提醒，启用了 HSTS 的网站恢复原状比较困难。</p>
<p>至于 www，虽说带 www 俨然是一种 old-school 的做法，但实务上显得更 formal，同时免除裸域不支持 CNAME 记录且 Cookie 作用域过大的尴尬。www 和 non-www 最好两者择其一，以免权重分散。</p>
<pre><code>server {
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;

    if ($host != www.yourdomain.com) {
        return 301 https://www.yourdomain.com$request_uri;
    }
}</code></pre>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (a0) —— HTTP/2、TLS 1.3 和 HSTS</title>
<link>https://aaronlau.me/2019/08/18/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/18/</guid>
<pubDate>Sun, 18 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[升级 OpenSSL 1.1.1 并重新编译 Nginx，开启 HTTP/2、TLS 1.3 和 HSTS，冲 SSL Server Test 的 A+。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>不过瘾？再折腾 HTTP/2、TLS 1.3 和 HSTS，力求在 SSL Server Test 达到 A+！</p>
<p>1) 要启用 TLS 1.3，OpenSSL 起码得 1.1.1 以上才行。安装新版并替换掉旧版，尔后以 openssl version 判断是否升级完成；</p>
<pre><code>cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz &amp;&amp; tar zxf openssl-1.1.1d.tar.gz &amp;&amp; cd openssl-1.1.1d
./config --prefix=/usr/local/openssl
make &amp;&amp; make install

mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/include/openssl /usr/include/openssl.old
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
echo &quot;/usr/local/openssl/lib/&quot; &gt;&gt; /etc/ld.so.conf
ldconfig -v</code></pre>
<p>2) 追加参数 --with-openssl=../openssl-1.1.1d 后，重新编译 Nginx 并平滑升级；</p>
<pre><code>cd /usr/local/src/nginx-1.16.1
./configure \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_sub_module \
--with-openssl=../openssl-1.1.1d
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/nginx
make upgrade</code></pre>
<p>3) 回去编辑 server.conf。另外提醒 HSTS 是浏览器端直接强制 HTTPS，而非 HTTP 301 重定向至 HTTPS，如不确定后续会否继续使用 HTTPS，请注释掉那行代码。</p>
<pre><code>server {
    ...
    listen 443 ssl http2;
    ssl_protocols TLSv1.3;
    add_header Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload';
    ...
}</code></pre>
<p>如果前面使用的 Certbot，要么注释掉 include /etc/letsencrypt/options-ssl-nginx.conf;，要么不用加 ssl_protocols TLSv1.3;。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (3) —— Let's Encrypt 证书</title>
<link>https://aaronlau.me/2019/08/17/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/17/</guid>
<pubDate>Sat, 17 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[用 Certbot 为 Nginx 申请 Let's Encrypt 证书，并用 cron 定时任务自动续期。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>倘源站只支持 HTTP，也许做到上一篇就够了。但都 9102 年，还不支持 HTTPS 的网站很少了。即使后端不支持 HTTPS，经过反代服务器的中转，也能实现 HTTPS 加密访问。</p>
<p>1) 启用 EPEL 源。官方源因版权顾虑，移除了有争议的软件包，而 Extra Packages for Enterprise Linux 的尺度更宽一些，算是个有益补充； 2) 安装并配置 Certbot，应指定 Nginx 的安装目录。Certbot 拥有傻瓜式的交互，键入邮箱、接受条款、选取主机名、决定 HTTP 是否重定向至 HTTPS，视情况操作即可；</p>
<pre><code>yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install certbot python2-certbot-nginx
certbot --nginx --nginx-server-root=/usr/local/nginx/conf</code></pre>
<p>3) 创建一个 cron 定时任务，以实现自动续期；</p>
<pre><code>echo &quot;0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' &amp;&amp; certbot renew&quot; | sudo tee -a /etc/crontab &gt; /dev/null</code></pre>
<p>4) 完事了。就这么简单。来看看 Certbot 都动了哪些配置：</p>
<pre><code>listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;</code></pre>
<p>options-ssl-nginx.conf 里默认是 ssl_protocols TLSv1.2 TLSv1.3。如需开启 HTTP/2、TLS 1.3 和 HSTS，见下一篇。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (2) —— 反向代理基本配置</title>
<link>https://aaronlau.me/2019/08/16/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/16/</guid>
<pubDate>Fri, 16 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[Nginx 反向代理的基本配置：拆分 server block、resolver 动态解析、Referer、X-Forwarded-For 与 Cookie。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>1) Nginx 配置文件的路径，可透过 nginx -t 命令找出。nginx.conf 的内容相当庞杂，为日后维护方便，建议拆分出 server block，即在 http block 引用外部配置文件；</p>
<pre><code>http {
    ...
    include server.conf;
    ...
}</code></pre>
<p>2) 以反代 www.example.com 为例。proxy_pass 遇有变量是不会走系统 /etc/hosts 和 /etc/resolv.conf 的，而是走 resolver 指定的 DNS 服务器，好处是可以实现域名的动态解析。</p>
<p>出于防止跨站攻击和反盗链的目的，对方一般会校验 Referer，不是他们的域名统统返回 403，作出修改可绕过此限制。X-Real-IP 用于记录客户端的 IP（但不一定是真实的），X-Forwarded-For 则反映链路信息，两者的伪造相当容易，毕竟作弊在应用层是难免的。借由传递 Set-Cookie，既可反代又不影响注册登录等功能运作。</p>
<pre><code>server {
    listen 80;
    server_name yourdomain.com;

    location / {
        resolver 8.8.8.8;
        set $TARGET 'www.example.com';
        proxy_pass http://$TARGET;

        # proxy_set_header Host $TARGET;
        proxy_set_header Referer http://$TARGET;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass_header Set-Cookie;
        # proxy_cookie_domain www.example.com yourdomain.com;
    }
}</code></pre>
<p>3) 先检测配置文件语法，再热加载或重启 Nginx；从外部访问，还需要打开 firewalld 防火墙的相应端口。</p>
<pre><code>nginx -t &amp;&amp; (nginx -s reload || service nginx restart)
firewall-cmd --add-service=http --add-service=https --permanent
firewall-cmd --reload</code></pre>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Nginx 学习笔记 (1) —— 源码安装与开机自启</title>
<link>https://aaronlau.me/2019/08/15/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/08/15/</guid>
<pubDate>Thu, 15 Aug 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Nginx</category>
<description><![CDATA[在 CentOS 7 上从源码编译安装 Nginx 1.16，并用 systemd 实现开机自启。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Nginx</p>
<p>测试系统为 CentOS 7.x，在其他 Linux 发行版的操作略有不同。为行文简洁起见，省去非 root 用户的 sudo 赋权命令，下同。</p>
<p>1) 准备好编译环境，安装依赖：PCRE (for regex)、zlib (for gzip) 和 OpenSSL；</p>
<pre><code>yum groupinstall 'Development Tools'
yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel</code></pre>
<p>2) 工作目录可以是任何路径，本系列文依惯例选定 /usr/local/src。源码有 mainline 和 stable 之分，本系列文选择稳定版；</p>
<pre><code>cd /usr/local/src
wget https://nginx.org/download/nginx-1.16.1.tar.gz
tar zxf nginx-1.16.1.tar.gz
cd nginx-1.16.1</code></pre>
<p>3) 编译安装，通常是安装到 /usr/local/nginx。Nginx 的模块一般是静态编译，如果需求有变更，都需要修改参数（可借由 nginx -V 列出现有的）并重编译；</p>
<pre><code>./configure --with-http_ssl_module --with-http_v2_module --with-http_sub_module
make &amp;&amp; make install</code></pre>
<p>4) 加入至 systemd 守护进程，实现开机自启，再创建软连接以方便使用。</p>
<pre><code>cd /lib/systemd/system/
wget https://raw.githubusercontent.com/Surfine/Code-Snippets/master/nginx.service
systemctl enable nginx.service
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin</code></pre>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>清理 Time Machine 本地快照以升级 macOS</title>
<link>https://aaronlau.me/2019/07/17/</link>
<guid isPermaLink="true">https://aaronlau.me/2019/07/17/</guid>
<pubDate>Wed, 17 Jul 2019 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>教程</category><category>Mac</category>
<description><![CDATA[升级 macOS 提示空间不足，可用空间却明明够？可能是 Time Machine 本地快照在作怪，用 tmutil 删除。]]></description>
<content:encoded><![CDATA[<p>#App-scope #教程 #Mac</p>
<p>记一次翻车现场。在升级 macOS Catalina 到新近的 Developer Beta 4 的时候，由于不是增量更新，故须要完全安装，但却提示“没有足够的可用空间”。不可能啊？明明剩余容量还有这么多。“关于本机”中的可用空间，跟“磁盘工具”（亦可用终端的 df 指令）展示的也不一致。</p>
<p>移走了大文件、清理了缓存垃圾、甚至卸载了好些应用……还是那样。见鬼了吗？查阅一番资料以后，发现有可能是 Time Machine 的本地快照的关系。照理讲，备份磁盘不可用才会产生本地快照。Apple 的帮助文档亦提到，“快照占用的空间计为可用储存空间”，如果真正需要空间，系统会自动删除旧快照。但显然这一次是个例外。</p>
<p>在终端试试看，相信会列出一长串本地快照：</p>
<pre><code>tmutil listlocalsnapshots /
tmutil listlocalsnapshots /System/Volumes/Data
# com.apple.TimeMachine.2019-07-16-101514.local
# com.apple.TimeMachine.2019-07-16-111046.local
# ...</code></pre>
<p>再来按快照日期来删除，&lt;snapshot_date&gt; 可以是 2019-07-16-101514：</p>
<pre><code>tmutil deletelocalsnapshots &lt;snapshot_date&gt;</code></pre>
<p>再回到安装程序，此时问题应已得到解决了。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Mapbox Studio：3D 地图就这么简单</title>
<link>https://aaronlau.me/2018/02/24/</link>
<guid isPermaLink="true">https://aaronlau.me/2018/02/24/</guid>
<pubDate>Sat, 24 Feb 2018 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>分享</category>
<description><![CDATA[不用建模也能做立体分析图：Mapbox Studio 加路网、拉伸建物高度，再用开发者工具截高清图。]]></description>
<content:encoded><![CDATA[<p>#App-scope #分享</p>
<p>动手做一张立体分析图，固然复杂，所幸有 Mapbox Studio，可以省却建模的痛苦。</p>
<p>一张白纸好作画：选 Empty 模板，背景改黑色。按 n 新增 road 图层，过滤出主要道路，改白色。线粗怎么缩放都一样，不科学啊。Width 选“Set value by zoom”，诺利图的部分就结束啰。</p>
<p>再新增 building 图层，Type 选 Fill extrusion。Zoom 到 15，建物就会 biu 出来啦！但为什么不是立体的呀？Height 选“Set value by data”，大功告成。</p>
<p>出图时打开 Share URL，在开发者工具里自定义解析度，再在命令列打“cfss”，比常规截图更清晰。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Mapbox Studio Classic：上手诺利图</title>
<link>https://aaronlau.me/2018/02/23/</link>
<guid isPermaLink="true">https://aaronlau.me/2018/02/23/</guid>
<pubDate>Fri, 23 Feb 2018 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>分享</category>
<description><![CDATA[赶分析图不想截图描图？用 Mapbox Studio Classic 写几行 CartoCSS，快速做出黑白诺利图。]]></description>
<content:encoded><![CDATA[<p>#App-scope #分享</p>
<p>Google Maps 就在眼前，想要做分析图，图底却看得见摸不着。死线将近，截图抠图再描图吗？太费工了吧！要求不高，颜色纯净些，去掉有的没的标签，就够了。如果赶时间，不妨试一试 Mapbox Studio Classic，短平快，易出效果。</p>
<p>从 Basic 模板开始，清除所有的程式码，搜索并缩放至指定区域（缩放级别至少到 z13），再改颜色：</p>
<pre><code>@land: #fff;
@building: #323232;

#building {
  polygon-fill: @building;
}

Map { background-color: @land; }</code></pre>
<p>记得存档，再点样式码编辑处右上角形似相片的按钮出图，Crop Size 改尺寸，DPI 可以到 600，极为便利大图输出。相比线上的 Mapbox Studio，Classic 出图没有次数限制，不需要付费；如果习惯写代码的话，CartoCSS 能做的效果更多。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>ADB/Fastboot —— 官方出品</title>
<link>https://aaronlau.me/2017/01/12/</link>
<guid isPermaLink="true">https://aaronlau.me/2017/01/12/</guid>
<pubDate>Thu, 12 Jan 2017 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Android</category>
<description><![CDATA[不是开发者只想刷机，官方放出独立精简版 adb、fastboot、systrace。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Android</p>
<p>随着安卓生态圈日益成熟，刷机亦成 old-fashioned，时至今日甘愿折腾的发烧友不多了。不过试想一下，刷机的工具从何而来？论坛上“好心人”上传的提取版？还是整套 Android Studio？若不是开发者，只想刷机怎么办？还得麻烦官方出马，放出精简版，独立使用，adb、fastboot、systrace 一应俱全，便于解锁、烧录系统和进行调试。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Android Tool —— 一键录屏</title>
<link>https://aaronlau.me/2017/01/02/</link>
<guid isPermaLink="true">https://aaronlau.me/2017/01/02/</guid>
<pubDate>Mon, 02 Jan 2017 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Mac</category>
<description><![CDATA[macOS/Android 双栖用家需要短平快的调试工具，插线即享。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Mac</p>
<p>对于不少身在曹营的 macOS/Android 双栖用家，最痛苦的，莫过于没有一个短、平、快的调试工具，要求不高，截屏、录屏、旁加载 APK、BUG 报告，总得有吧？如果可以一键操作，就更好了。Android Tool 正好满足这些需求，插线即享。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Image Cyborg —— 批量下载网页图片</title>
<link>https://aaronlau.me/2016/09/05/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/09/05/</guid>
<pubDate>Mon, 05 Sep 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category>
<description><![CDATA[抓图等于抓狂？输入网址自动打包，延迟载入和动态产生的图也能处理。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用</p>
<p>抓图等于抓狂？抓取网页的所有图片，类似需求并不罕见，但一般的应对方法都过于繁琐。市面也有扩展解决，可是哪有线上应用方便快捷！Image Cyborg 主要批量下载/备份网图，输入网址、自动打包。更神奇的是，URI Scheme 格式的，以及有延迟载入脚本的，甚至动态产生的图，都能处理。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>教你打开 YouTube 的画中画</title>
<link>https://aaronlau.me/2016/07/29/youtube-pip/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/07/29/youtube-pip/</guid>
<pubDate>Fri, 29 Jul 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>iOS</category>
<description><![CDATA[iOS 画中画好用，但 YouTube 不支持，可以用 Youtube P.I.P 简单 hack 一下。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #iOS</p>
<p>iOS 的 Picture in Picture（画中画）功能，相信各位都深感其好。然而由于视频网站的不合作，尤其是 YouTube 的不支持，让效果大打折扣。这里介绍 Youtube P.I.P，透过简单的 hack，让你能一边工作，一边欣赏创意视频、MV 和大电影。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Snipaste —— 随心截图贴图备忘</title>
<link>https://aaronlau.me/2016/07/29/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/07/29/</guid>
<pubDate>Fri, 29 Jul 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Windows</category>
<description><![CDATA[截图和便笺结合会擦出什么火花？我敢保证这是我用过最轻便、最不流氓的截图工具。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Windows</p>
<p>截图或许是最为司空见惯的操作，便笺也是效率工作者的至爱。当两者结合起来，会擦出怎样的火花？Snipaste 便是令你脑洞大开的软件。我敢保证，这是本人用过的最轻便、最不流氓、最强大的截图工具。</p>
<p>作为截图器，它可以精确控制范围、自动检测元素、取色值，编辑器的形状、箭头、马赛克等功能可堪一用。作为便笺，它可以把内容贴在桌面并保持置顶，以供参考对照，对于码农、设计师，甚至文字工作者都大有裨益。贴图窗口可缩放、旋转和调整透明度，GIF 动画也不在话下。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>论 Apple 的设计哲学 —— 从快捷键说开去</title>
<link>https://aaronlau.me/2016/07/17/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/07/17/</guid>
<pubDate>Sun, 17 Jul 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>观点</category><category>Mac</category>
<description><![CDATA[Command 和 Control 为什么不能合并？从 ⌘ + Space 与 ⌃ + Space 的对调看 Apple 的自洽。]]></description>
<content:encoded><![CDATA[<p>#App-scope #观点 #Mac</p>
<p>初来乍到的 Mac 使用者，由于受到 Windows 思维影响，多会认为 Command 和 Control 没有必要同时存在，可以合并。果真如此？不其然。</p>
<p>命令行界面时代，Ctrl 快捷键业已成为通用标准，比如 ⌃ + c 用于中断。为了确保兼容性，图形界面必须另觅修饰键。于是乎，Macintosh 开发团队便规定：命令行用 ⌃，图形对应 ⌘，两者泾渭分明，井水不犯河水。早期的 Windows 没有专门的 Winkey，所以拿 Ctrl 来充数，如此产生一系列遗留问题。</p>
<p>OS X 出道之时，⌘ + Space 被设计为切换输入源的快捷键；后引入的 Spotlight 只好被安排到 ⌃ + Space。这可是 GUI 的功能，摆在 CLI 的位置，明显不自洽。Yosemite 把两者对调，让老用户大呼不适应，却纠正了历史错误。iOS 总是要慢半拍，所幸在 iOS 10 得到统一。</p>
<p>这充分体现 Apple 的设计哲学：不因习惯而妥协，只为自洽而完善。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Timetrack.io —— 大美之时间记录</title>
<link>https://aaronlau.me/2016/07/16/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/07/16/</guid>
<pubDate>Sat, 16 Jul 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>方法</category>
<description><![CDATA[番茄钟加活动记录，找出耗时的黑洞，你不理时间，时间不理你。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #方法</p>
<p>时间管理的必要性，就在于人生只有一次、光阴不可浪费。如同记账一样，你不理时间，时间不理你。乔布斯曾指出，每一天都当作最后一天看待，才能用心做事情。有言道“向死而生”，Timetrack 正是实践此理念的完美应用：番茄钟加活动记录，帮助你找到耗时的黑洞并解决它，达到有限时间的最大化利用。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>WWDC 的前途与命运 —— 拐点抑是起点？</title>
<link>https://aaronlau.me/2016/06/02/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/06/02/</guid>
<pubDate>Thu, 02 Jun 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>观点</category><category>Apple</category>
<description><![CDATA[WWDC 2016 前夕：微创新不少、实质创新欠奉。护城河有用，但迷信护城河不可取。]]></description>
<content:encoded><![CDATA[<p>#App-scope #观点 #Apple</p>
<p>WWDC 的邀请函一发，全民竞猜也随之开始。依我看，不外乎是先吹嘘一番业绩，然后祭出“全新”MacBook Pro，再来几款 Apple Watch 的新表带。微创新不少、实质创新则欠奉，只好感叹“少一点套路，多一点真诚”。</p>
<p>在高大上的互联网圈，不贬低一下苹果、唱衰一下微软、拔高一下谷歌就跟不上潮流。</p>
<p>护城河的本质，是友商在短期内无法模仿、也难以替代的竞争优势。iPhone SE 照顾新兴市场，“iPhone 升级计划”缩短更新周期，都是在拓宽护城河。然而迷信护城河、将之奉若神明，并不可取。护城河的成立，有其特定的时空条件，现在起作用不代表日后还有用。</p>
<p>近些年来，尽管出过 Swift 那样的经典，但在软件质量方面却有所下滑；Aperture 的停止更新、Final Cut Pro X 的蜻蜓点水，连不少死忠都感到失望。</p>
<p>苹果有没有衰落，也许是个伪命题。其实质并不是“创新不再”，而是靓丽不再。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Quitter —— 自动退出闲置应用</title>
<link>https://aaronlau.me/2016/06/01/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/06/01/</guid>
<pubDate>Wed, 01 Jun 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Mac</category>
<description><![CDATA[Marco Arment 的 Quitter 自动退出或隐藏闲置应用，免得被打断思路。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Mac</p>
<p>知名苹果开发者 Marco Arment 日前推出 Quitter，自动退出或隐藏闲置应用，以免打扰、提高效率，算是一款时间管理小工具。您也许有酱紫的经历：忙工作，突然被新邮件、新通知打断思路，好不容易处理完了，又难以恢复原先状态。</p>
<p>自从有了 Quitter，这不再是问题。只要增加欲关闭的应用规则，如 Telegram 在闲置 15 分钟后自动退出即可。当然了，GTD 的精髓不在工具，也不在方法，而在意志。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Firefox 安装 Chrome 插件不是梦</title>
<link>https://aaronlau.me/2016/05/31/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/05/31/</guid>
<pubDate>Tue, 31 May 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Browsers</category>
<description><![CDATA[Chrome Store Foxified 把 Chrome 扩展转成 Firefox 附加组件，以我为主、为我所用。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Browsers</p>
<p>随着谷歌对 Chrome 的不断发力，其市场份额先后超越 Firefox 和 MSIE，成为当之无愧的第一。这也导致 Firefox 附加组件不再活跃。那怎么办？投奔敌营 Chrome 么？</p>
<p>不需要。凭借 Chrome Store Foxified，可以把 Chrome 的扩展转化为 Firefox 的附加组件，轻松实现“以我为主、为我所用”，集两大浏览器之大成。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>人人词典 —— 看美剧学英语</title>
<link>https://aaronlau.me/2016/05/28/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/05/28/</guid>
<pubDate>Sat, 28 May 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>语言</category>
<description><![CDATA[人人字幕组把双语字幕和词典结合，美剧例句加电影原声，印象深刻。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #语言</p>
<p>“看美剧学英语”，一直为人津津乐道。这回人人字幕组重出江湖，利用其雄厚的双语字幕资源，与英语词典相结合，创造出人人词典。尤为革命性的变化，莫过于基于美剧的例句，图文并茂的单词释义饶有趣味，电影原声更令人印象深刻。</p>
<p>学习一门语言，词汇量和语法固然重要，但体会背后的文化也是不可忽视的一环。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Emoji 翻译器 —— 文字转表情</title>
<link>https://aaronlau.me/2016/05/27/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/05/27/</guid>
<pubDate>Fri, 27 May 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category>
<description><![CDATA[圣经被翻译成 Emoji，靠的是批量字符转换，一个表情可以有多种释义。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用</p>
<p>惊传圣经被翻译成 Emoji，并上架至 iBooks Store，令人感觉“世界之大，无奇不有”。如此鸿篇巨著，难道靠人工吗？并不是。作者根据 Emoji 对应的单词，进行批量字符转换。这也是其奥妙之处：一个表情，可以有多种释义，随你解读。</p>
<p>有了 Emoji 翻译器，聊天想必更有乐趣。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>WhatMoji —— 看懂 Emoji</title>
<link>https://aaronlau.me/2016/05/26/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/05/26/</guid>
<pubDate>Thu, 26 May 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category>
<description><![CDATA[Emoji 风靡全球，看不懂也不必害羞，有了 WhatMoji 一样可以顺畅交流。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用</p>
<p>Emoji 风靡全球，却总有些老先生不明白其意思，因此产生误会，继而认为轻浮。其实看不懂不用紧，也无需作害羞状，有了 WhatMoji 一样可以顺畅交流。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Meeting Calculator</title>
<link>https://aaronlau.me/2016/05/25/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/05/25/</guid>
<pubDate>Wed, 25 May 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category>
<description><![CDATA[用 Google Calendar 的话，它帮你算出会议耗费的工作时间。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用</p>
<p>文山会海，“隆重召开”“进展顺利”“圆满完成”一类官话套话，比比皆是。倘若你在用 Google Calendar，透过 Meeting Calculator 的整理，便可以对会议耗费的宝贵工作时间有一个清晰的认识。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Lightgallery —— 多平台轻量看图器</title>
<link>https://aaronlau.me/2016/05/24/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/05/24/</guid>
<pubDate>Tue, 24 May 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category>
<description><![CDATA[梦寐以求的多平台轻量看图器，动画流畅，操作如丝般顺滑。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用</p>
<p>梦寐以求的多平台、轻量级看图器 Lightgallery，支持键鼠导航、缩略图浏览，流畅无比的动画效果令人垂涎，如丝顺滑的操作体验。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>程序哨兵 —— 拒绝流氓全家桶</title>
<link>https://aaronlau.me/2016/05/23/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/05/23/</guid>
<pubDate>Mon, 23 May 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Windows</category>
<description><![CDATA[“免费才是最贵的”，程序哨兵拦截国内全家桶，让空间清朗起来。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Windows</p>
<p>“免费才是最贵的”，尤其是国内各路“全家桶”，打着“终身免费”旗号，大肆捆绑家族软件，抢占系统资源，滥发广告、侵害隐私，可谓无恶不作。程序哨兵也许有用：拦截全家桶、锁定特定程序、流氓大排行，让空间清朗起来！</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Vieas —— 轻量级看图器</title>
<link>https://aaronlau.me/2016/05/22/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/05/22/</guid>
<pubDate>Sun, 22 May 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Windows</category>
<description><![CDATA[看图器越做越臃肿，用户无非要“麻雀虽小，五脏俱全”，Vieas 符合这个标准。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Windows</p>
<p>寻找一款轻量级的图片浏览器，缘何难？因为软件愈做愈大，从单一功能的看图器，逐渐变成臃肿的管理器。其实用户无非需要“麻雀虽小，五脏俱全”：支持各种图片格式、快速加载、旋转、缩放、EXIF 查看等。Vieas 在这个标准下，无疑是理想的选择。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>泼辣修图 —— 线上暗房</title>
<link>https://aaronlau.me/2016/04/16/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/16/</guid>
<pubDate>Sat, 16 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Photography</category>
<description><![CDATA[业余摄影爱好者不会用 Lightroom，泼辣修图专业又不失易用，还有网页版。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Photography</p>
<p>对于业余摄影爱好者来说，没有比修图更抓狂的事。Lightroom 是蛮强大，可惜他们不会用。泼辣修图的出现，正满足这一群体。色温、曝光、高光阴影、曲线，甚至历史记录，都能找到。</p>
<p>一张不怎么样的照片，经泼辣修图之手，分分钟化腐朽为神奇。滤镜也是可圈可点，旅游拍照等轻用途已然足够。此外值得欣赏的是，教程做得十分认真，哪怕是初学者也能轻松上手。这货甚至有网页版本，修图随时随地。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Never 10 —— 拒绝升级</title>
<link>https://aaronlau.me/2016/04/14/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/14/</guid>
<pubDate>Thu, 14 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Windows</category>
<description><![CDATA[微软强行升级不能忍，Never 10 删掉安装包并屏蔽升级程序。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Windows</p>
<p>Windows 10 好是好，但仍存在兼容问题，尤其是一些老旧硬件缺乏可用驱动，微软强行升级不能忍。Never 10 可以删除已经下载的 Windows 10 安装包，并屏蔽升级程序。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Seer —— Windows 也有空格预览</title>
<link>https://aaronlau.me/2016/04/12/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/12/</guid>
<pubDate>Tue, 12 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Windows</category>
<description><![CDATA[在 Windows 上按空格预览文件，OS X 的快速查看终于不用羡慕了。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Windows</p>
<p>OS X 的快速查看，一直为果粉所津津乐道。切换到 Windows，总觉得少了什么。好在有 Seer。按一下空格键，即可预览文件或文件夹，而不需要打开应用，大大提升工作效率。支持格式众多，PDF、PSD、MKV 都不在话下，特色是语法高亮和压缩包文件预览。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Near Lock —— 蓝牙解锁 Mac</title>
<link>https://aaronlau.me/2016/04/11/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/11/</guid>
<pubDate>Mon, 11 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Mac</category>
<description><![CDATA[靠 iPhone 的蓝牙距离锁定和解锁 Mac，实测不怎么耗电。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Mac</p>
<p>大家惯用 Touch ID 解锁 iPhone，殊不知 Mac 也可以。Near Lock 通过蓝牙判断手机跟电脑的距离，超出一定距离后便锁定，进入一定范围内又解锁，非常智能。高级版本（现正限免）支持后台，更加便利，经实测也不怎么耗电，又增添了安全性，可以防止他人闯入，值得考虑。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>WebTorrent —— 边下边看</title>
<link>https://aaronlau.me/2016/04/10/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/10/</guid>
<pubDate>Sun, 10 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category>
<description><![CDATA[边下边看的软件遍地都是，但大多臃肿，WebTorrent 胜在轻量。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用</p>
<p>边下边看的软件遍地都是，但大多都比较臃肿。WebTorrent 胜在轻量，拖拽种子或粘贴 Magnet 即可串流音视频，Airplay 和 Chromecast 的支持也使其增分不少。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Vivaldi —— 用心之作</title>
<link>https://aaronlau.me/2016/04/09/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/09/</guid>
<pubDate>Sat, 09 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Browsers</category>
<description><![CDATA[Opera 易主后死忠用户纷纷离开，Vivaldi 从 Chromium 入手，一切皆可定制。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Browsers</p>
<p>Opera 被你国的 360 收购以后，死忠用户纷纷离开，真是药丸。幸好挪威那帮人不死心，从 Chromium 入手，开发出新一代浏览器 Vivaldi，为用户着想、向社区靠拢，情怀满满。快捷键功能强大，支持完全的键盘导航；还有鼠标手势、标签组、随时笔记。最重要的，一切皆可定制，设置的选项不是一般多。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Rainmeter —— 个性化你的桌面</title>
<link>https://aaronlau.me/2016/04/08/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/08/</guid>
<pubDate>Fri, 08 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Windows</category>
<description><![CDATA[Windows 小工具无疾而终，Rainmeter 可以更进一步。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Windows</p>
<p>Windows 的小工具无疾而终，如此有用的功能却被砍掉，岂不可惜？其实可以更进一步。通过第三方面板 Rainmeter，可以定制你的桌面，比如显示 CPU 占用率、可用内存、剩余电量，或者便签、RSS 阅读器、天气状况等，总有一款适合你。还可以定制皮肤，尽情发挥创意和想象力，这里面大有学问。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>PS4 遥控游玩 —— 远程串流</title>
<link>https://aaronlau.me/2016/04/07/ps4-remoteplay/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/07/ps4-remoteplay/</guid>
<pubDate>Thu, 07 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Games</category>
<description><![CDATA[画质只到 720p@60fps，但实际体验非常顺畅，即使不在同一个局域网也没有延迟。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Games</p>
<p>今天的 PlayStation 系统更新来的正好。遥控游玩是本次更新的重头戏。虽说画质只支持到 720p@60fps，但实际体验非常顺畅，即使不在同一个局域网内，都出乎意料地没有延迟，就像在家操作一样。稍作简单设置之后，配上手柄和理想的网络连接（官方建议 12Mbps），即可畅玩。索尼大法好！</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>ImageOptim —— 不能再赞的图片压缩</title>
<link>https://aaronlau.me/2016/04/07/imageoptim/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/07/imageoptim/</guid>
<pubDate>Thu, 07 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Mac</category>
<description><![CDATA[整合各种压缩工具的前端，拖拽批量压缩，开源免费。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Mac</p>
<p>为节省网络流量和加载时间，上传图片前少不了压缩这道工序。ImageOptim 本质上是各种图片优化工具的前端，通过分析图片情况，找到最合适的方法，帮你解决 jpg、png、gif 的压缩问题。不同于其他软件，它支持批量压缩，不需要一个一个处理，全部拖拽过去就行。开源、免费、支持中文。</p>
<p>默认采用无损压缩，需要的时候也可以有损压缩，在设置中开启即可。如果一次只压缩一种格式，可以研究一下设置，只保留一两种方法，加快优化的速度。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Icons from File —— 提图标</title>
<link>https://aaronlau.me/2016/04/07/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/07/</guid>
<pubDate>Thu, 07 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Windows</category>
<description><![CDATA[从 exe、dll 提取图标，功能专一，没有杂七杂八的东西。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Windows</p>
<p>做简报的时候，需要图标辅助理解，怎么办？心想软件的图标蛮好看，却觉得提取过程好麻烦。Icons from File 可以简化这个流程，轻松从 exe、dll 或 ocx 提取图标，软件功能非常专一，没有杂七杂八的东西。既可以保存所选图标，也可以批量保存全部。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>anyClipboard —— 剪贴板历史记录</title>
<link>https://aaronlau.me/2016/04/06/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/06/</guid>
<pubDate>Wed, 06 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Windows</category>
<description><![CDATA[提供剪贴板历史的软件不少，轻便的真不多，绿色免安装的一款就够了。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Windows</p>
<p>复制、粘贴，恐怕是一些人离不开的操作。提供剪贴板历史记录的软件并不少，但轻便的真不多。其实在许多时候，一款绿色免安装的就够了。</p>
<p>anyClipboard 正如其名，可以记录被复制的任何东西，自动备份到自身的 data 文件夹。为避免占满空间、撑爆硬盘，也有文件大小限制的选项。有了它，曾经剪切过的内容就有保障，不怕忘了或丢了。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Safari 技术预览版 —— 生产测试两不误</title>
<link>https://aaronlau.me/2016/04/03/safari-tech-preview/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/03/safari-tech-preview/</guid>
<pubDate>Sun, 03 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Mac</category>
<description><![CDATA[OS X 测试版难用于生产环境，只想追踪网页新技术就用 Safari 技术预览版。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Mac</p>
<p>“互联网思维”强调快速迭代，而 OS X 自 Lion 以来，一直保持逐年更新。林林总总的测试版，大多围绕 Safari 的改进展开。只不过 OS X Beta 十分坑爹，难以用于生产环境。如果你是 Safari 开发者，只想追踪最新网页技术，不妨使用 Safari 技术预览版，使生产测试两不误。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>福利：原价 $499 的 Nik 插件集从此免费！</title>
<link>https://aaronlau.me/2016/04/03/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/03/</guid>
<pubDate>Sun, 03 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>分享</category><category>Photography</category>
<description><![CDATA[Snapseed 的出品商 Nik 有一套 Photoshop/Lightroom/Aperture 插件集，原价 $499，如今免费。]]></description>
<content:encoded><![CDATA[<p>#App-scope #分享 #Photography</p>
<p>Snapseed 在手机端是无往不胜的修图工具。殊不知，其出品商 Nik 还有一套更强大的 Photoshop/Lightroom/Aperture 插件集，降噪、锐化、HDR、黑白、调色，胶片模拟、创意滤镜，统统不在话下。难得的是，操作也是十分简单，更支持简体中文。原价 $499，从此免费。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>SmartFinder —— 管理手机</title>
<link>https://aaronlau.me/2016/04/01/smartfinder/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/01/smartfinder/</guid>
<pubDate>Fri, 01 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Mac</category>
<description><![CDATA[Android 和 Mac 之间传文件非常不便，锤子的 SmartFinder 自动归类手机内容。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Mac</p>
<p>Android 和 Mac，似乎鱼掌不可兼得。两者间的文件传输非常不便。就没有一个像样的工具吗？有！那就是锤子的 SmartFinder。手机中的照片、音乐和视频会被自动归类整理，你也可以对这些内容进行编辑操作。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>CSS Reloader —— 即刻重载 CSS</title>
<link>https://aaronlau.me/2016/04/01/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/04/01/</guid>
<pubDate>Fri, 01 Apr 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>开发</category>
<description><![CDATA[站点用了缓存，改完 CSS 看不到变化，按 F9 即刻重载。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #开发</p>
<p>作为站长，免不了有修改 CSS 的需求。若你网站用了缓存，很有可能会发现修改前后的网页样式一模一样。而 CSS Reloader 这个工具可以帮你清除缓存，即刻重载 CSS，还有一个快捷键 F9。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Open Live Writer —— 情怀</title>
<link>https://aaronlau.me/2016/03/13/open-live-writer/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/03/13/open-live-writer/</guid>
<pubDate>Sun, 13 Mar 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>Windows</category>
<description><![CDATA[微软把 Windows Live Writer 开源更名，美中不足是暂不支持中文，Markdown 也匮乏。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #Windows</p>
<p>Windows Live 关闭以后，旗下的 Writer 偃旗息鼓，博客市场也逐渐门庭冷落，愈来愈多人去了社交网站。微软宣布开放它的源代码，发布到 GitHub，更名为 Open Live Writer，移交给 .NET 基金会，使其焕发新春。</p>
<p>尤其值得赞赏的是，鸡肋功能得以删除、可以登录 Blogger、界面清爽、不卡顿。也有美中不足的，如暂不支持中文，Markdown 支持的匮乏、HTML 冗余更是一大槽点。讲真，线上程序可能更好用，当下不是离线编辑器的时代。</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
<item>
<title>Evernote 叛逃至 OneNote</title>
<link>https://aaronlau.me/2016/03/13/evernote-to-onenote/</link>
<guid isPermaLink="true">https://aaronlau.me/2016/03/13/evernote-to-onenote/</guid>
<pubDate>Sun, 13 Mar 2016 00:00:00 GMT</pubDate>
<author>Aaron Lau（韩栖）</author>
<dc:creator>Aaron Lau（韩栖）</dc:creator>
<category>App-scope</category><category>应用</category><category>写作</category>
<description><![CDATA[反感 Evernote 过度商业化和臃肿，OneNote 免费又强大，似乎更诱人。]]></description>
<content:encoded><![CDATA[<p>#App-scope #应用 #写作</p>
<p>相爱相杀的 OneNote 和 Evernote，各占笔记市场的半壁江山。笔者虽对微软不感冒，但反感 Evernote 过度的商业化和臃肿。细想一下，免费且功能强大的 Office 系软件 OneNote，似乎更诱人。</p>
<p>怎么从 Evernote 迁移笔记到 OneNote 呢？机灵的巨硬君放出大招，可以自动导入笔记，从此告别付费的离线访问，无限地创建笔记！</p>
<p class="note"><small>原载 App-scope，有删改。</small></p>]]></content:encoded>
</item>
</channel>
</rss>
