快乐的旅途与汇聚的奇迹:《动物朋友》推荐

本文大概有 14k 字,我也不知道阅读完需要多少分钟。

不过为了方便各位看官的时间管理,我还是贴心地提供了 TL;DR(太长不看)简介:

《动物朋友》超好看的!!!

标题上的「推荐」二字只是为了念起来好听,实际上本文并无多少安利意图。

谨以此文纪念《动物朋友》这部奇迹的作品。

一、什么是《动物朋友》?

『动物朋友』(けものフレンズ,又译作『兽娘动物园』、『萌兽之友』)是由けものフレンズプロジェクト发起的日本跨媒体制作企划,有手游、漫画、动画等衍生作品。本文主要讲述企划中于 2017 年 1 月开播的 TV 动画。

个人比较喜欢「动物朋友」这个译名,看不惯的朋友们请自行脑内替换。以我奇妙的感性来看,「动物朋友」更能体现出「人」与「动物」之间的亲密关系,而不是像「兽娘动物园」那样有种淡淡的疏离感。毕竟这部作品讲述的是人类与各种动物们和睦相处、互相扶持渡过难关的温馨故事,而不是人类通过牢笼般的「动物园」观察动物们。

这部动画讲述的是在疑似人类灭绝、看不到其他人类存在的巨大综合美少女动物园「Japari Park(ジャパリパーク)」里,动画里目前唯一的人类「小包(かばんちゃん)」在旅途中与各式各样因「砂之星(サンドスター)」的力量而拥有人类姿态的动物女孩 —— 通称「Friends(フレンズ)」们邂逅的故事。

动画主视觉图

……当然,如果仅仅是这样,我是不可能为它专门写一篇博客的,毕竟我这博客又不是什么 ACG 资讯站点 (・_ゝ・)

阅读全文→

至臻完美,只为阅读 —— Kindle Paperwhite 简评

Kindle Paperwhite 3

最近入手了 Kindle Paperwhite 电子书阅读器,用了一段时间后给大家简单地评价一下。


缘起

前些天去日本亚马逊上查看我喜欢的轻小说新刊的出版情况时发现「エロマンガ先生」已经更新到第八卷了,而我只买到第六卷。在网上查了一下,似乎第七卷的翻译都还是遥遥无期,也就不用指望近期有第八卷的中文翻译可以看了,于是打算再次海淘一波轻小说新刊回来看。

但是不幸的是,因为第七卷是在去年八月份发售的,日亚上已经没有现货了,得等 1~3 个星期调货来,再加上两星期多的运输时间,非常吃瘪。再加上海淘高昂的运费,这样下去肯定不是个办法啊,毕竟日版书籍直邮和转运的运费可都不是开玩笑的:

日亚直邮运费

您可能是正版书籍的受害者(摊手)

就在这时,我正好瞄到了这本书有 Kindle 版,又正好看见很多轻小说都在 Kindle 商店出版了,以前又正好得知 Kindle 阅读体验很好而且中亚上有很多便宜的电子书,于是。。。

阅读全文→

博客样式与字体的更新报告

一直想改进一下博客的字体和在手机上的样式,奈何最近一直没有时间,只好作罢。昨天晚上抽出一些时间做了一些改进,顺便写篇博文算是记录灌水(笑)。

【更新 17/04/23】

  • 正文字体已由 Monda 改为 PT Serif
  • 调整 blockquote 的引号样式为 normal

标题字体改为 Roboto Slab

Roboto Slab 是粗衬线体,比起 Georgia 更适合做标题。

效果图

(上面是 Georgia,下面是 Roboto Slab)

全局除正文外的西文字体使用 Alegreya

之前正文以外的西文字体都是使用的 Georgia,同样是衬线字体,Alegreya 的衬线更加富有书法气息,比较帅气。

阅读全文→

为何 shadowsocks 要弃用一次性验证 (OTA)

前些天,shadowsocks 提出了 SIP004 草案,旨在使用 AEAD 算法 取代原先的不安全的 流加密 + OTA,并弃用了一次性验证 (OTA)。

新协议的提出对于 shadowsocks 是一个非常非常重大的改进,因此我写了这篇博文为看不懂洋文的友们科普一下「为什么 OTA 会被这么快被弃用」以及「为什么应该使用新协议」。

一、OTA 是什么

OTA(One Time Auth,一次性验证),是之前 shadowsocks 为了增强安全性,抵抗 CCA(Chosen-ciphertext Attack,选择密文攻击)而加入的实验性功能。

我觉得应该很多人都听过这玩意 —— 就算不知道 OTA 是啥好歹也在 shadowsocks 各分支的客户端上看到过「一次性验证」的开关吧?虽然这个名字确实起得有点让人不明所以就是了(笑)。

那么下面我来科普下当初为什么要加入 OTA 功能。

阅读全文→

我的 2016 年终总结

人生天地之间,若白驹之过隙,忽然而已。——《庄子·知北游》

又到了写年终总结的时候了,时间过得真鸡儿快啊。虽然没有 Maxine Caulfield 那样操控时间轴的能力,但是回顾一下我在 2016 的大事件的能力还是有的:

概览

过去的一年里,本博客的基本访问情况如下图:

Google Analytics Overview

这期间,本博客一共迎来了 36,637 位用户,他们一共产生了 56,667 次会话以及 96,728 次浏览。平均每天 100 位用户、155 次会话以及 265 次浏览。

阅读全文→

博客启用新域名 Blessing.Studio

原来的域名 prinzeugen.net 一直被人吐槽说不好记,但苦于没有什么中意的其他的好记的域名,所以换域名的计划就一直搁置着。

其实我以前就听说过 .studio 这个顶级域名了,但是当时(15 年中旬)还没有开放注册,所以后来也就忘却了它的存在。然而几天前在机缘巧合下我得知了它早在 2015.10 就已经开放注册了,并且现在一年只要百来块就能搞到,于是。。

QQ20161224205054.png

这也是没有办法的事情嘛~ QQ20161225134536.jpg

そういうわけで、博客要迁移至新域名 blessing.studio 啦~

目前 prinzeugen.net 已经 301 至新域名,并且提交了 Google Search Console 和 Disqus 评论的转移请求,估计过个一天可以迁移完毕。

嗯?你说 .studio 不能备案,对百度 SEO 不好?

Who cares. QQ20161225135139.jpg

阅读全文→

Laravel 使用 whoops 处理错误最优雅的姿势

filp/whoops 这个错误处理类库有什么好处我这里就不赘述了,谁用谁知道。

Laravel 在 4.x 时代是有集成了 whoops 的,但是在 5.x 去掉了。不过作为一个 out-of-the-box 的错误处理类库,我们依然可以很方便地将 whoops 带回 Laravel 中。

网上有很多文章都讲述了 Laravel 使用 whoops 的方法,但总有些小问题(像是代码太丑了啊,代码太丑了啊之类的)。其中我认为最优雅的实现是这篇文章所描述的:Bringing Whoops Back to Laravel 5,我下面的也是基于他给出的代码修改的。


安装 whoops 之类的步骤我这里就不说了,这些在它的 README 上都有。安装完后打开 app/Exceptions/Handler.php 这个文件,进行如下修改:

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e)  
{
    if ($e instanceof
阅读全文→

手动修改 Laravel url() 函数生成的 URL 中的根地址

大家都晓得 Larevel 的一票帮助函数中有个 url(),可以通过给予的目录生成完整的 URL,是非常方便的一个函数:

// return: https://skin.dev/user/profile
url('user/profile')  

但是这玩意生成的 URL 中要补完的部分是框架内部根据 Request 自动判断的,而自动判断出的东西有时候会出错(譬如在套了一层反向代理之类的情况下)。

文档上并没有提到我们要如何才能自定义它生成的 URL 中的根地址和协议头部分(http(s)),这就非常吃瘪了。那我们要咋办呢?

首先我们来看看 url() 被定义的位置:

# File: src/Illuminate/Foundation/helpers.php

/**
 * Generate a url for the application.
 *
 * @param  string  $path
 * @param  mixed   $parameters
 * @param  bool    $secure
 * @return Illuminate\Contracts\Routing\UrlGenerator|string
 */
function url($path = null, $parameters = [], $secure = null)  
{
    if (is_null($path)) {
        return app(UrlGenerator::class);
    }

    return app(UrlGenerator::class)-&
阅读全文→

Artisan::call('migrate') 在 APP_ENV 为 production 时不工作的解决方法

最近把版本库里 .env.exampleAPP_ENV 字段值从原来的 local 改为了 production,原意是为了更好的区分开发和生产环境。

然而今天在主机壳的虚拟主机上测试我的程序的时候(准备把演示站搬过去),却出现了奇怪的问题——数据库 Migration 不管用了。

我是在控制器里通过调用 Artisan::call('migrate') 来执行数据库迁移操作的(毕竟虚拟主机哪来的 shell 访问),但是这次这条命令竟然没有执行任何事务。

通过 Artisan 执行 Command 的简化流程大概是像这样的:

Illuminate\Foundation\Console\Kernel  
↓
Illuminate\Console\Application  
↓
Illuminate\Console\Command  
↓
Illuminate\Container\Container  
↓
// 这个就是执行 Artisan::call('migrate') 时调用的类
Illuminate\Database\Console\Migrations\MigrateCommand  
↓
……

经过一段时间的排查,最后锁定了是在 MigrateCommand 这个类停止继续往下执行的,即接下来的脚本都没有被执行到,也就是说问题就出在 MigrateCommand 这里。

阅读全文→

使用 Certbot 更新 Let's Encrypt 证书

Let's Encrypt 证书即将过期时会给你发送邮件,这个还是比较贴心的。这样也就不会陷入证书过期却没发现的尴尬境地(Let's Encrypt 的证书只有 90 天的有效期)。

2826714bc9645e4b9828433b8e674800.png

以前我写过使用 Certbot 这个工具申请证书的文章,而同样使用这个工具更新证书只需要一行命令:

certbot renew --post-hook "service nginx reload"  

certbot 这个脚本的位置呀名称啥的自己看着改,对于我来说是 ./certbot-auto。加了个钩子可以让它在证书更新更新完毕后重载 Nginx 配置来更新证书。

b2134999636066c29c9e93a40bd88a57.png

不想每次都登上去更新的也可以把上面那行脚本加入 crontab(crontab -e),让它每个月执行一次:

# 这里用绝对路径,保险一点
0 0 1 * * /home/xxx/certbot-auto renew --post-hook "service nginx reload" >/dev/null 2>&1  

P.S. Xshell 管理远程机子比起单纯的终端来还是很方便的,而且最近也对 Home/School 发放免费许可了。

参考链接:Renewing certificates - Certbot User Guide

阅读全文→