半吊子全栈开发者的日常

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

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

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

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

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

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

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

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

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

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

动画主视觉图

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

> READ MORE...

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

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

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

> READ MORE...

我的 2016 年终总结

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

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

> READ MORE...

博客启用新域名 Blessing.Studio

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

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

> READ MORE...

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

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

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

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

> READ MORE...

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

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

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

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

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

> READ MORE...

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 这里。

> READ MORE...

使用 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 配置来更新证书。

> READ MORE...