使用 ADB Shell 刷入 Recovery

众所周知 MTK(联发科)的大部分机器都是没有 fastboot 模式的,也就意味着不能进行普通的依赖于 fastboot 系列命令的线刷模式。普通来讲这也没啥特别大的影响,毕竟刷 recovery 可以直接系统里拿到 root 后用工具刷,救砖有 MTK 专用的线刷工具(这玩意的驱动坑的不行)

但是,在一些神秘的状况下,我有可能会被没有 fastboot 的情况下坑到。

这次我想刷的是「朵唯 iSuper S1」,用的是 MTK6589 芯片组。按照惯例刷机之前首先要把 Recovery 换掉以刷入第三方 ROM 包。照理来说这块是没有问题的,但是不知道为什么,市面上的 Root 工具能够让手机拿到 Root 权限,但是在手机上安装权限管理应用时均告失败,也是迷的不行。

明明 Root 权限都已经拿到了却刷不了 Rec,这也太吃瘪了吧!然而没有 MTK 机子也不能用 fastboot 刷 rec,专门的线刷工具又太难用。。就在这时,我突然想到了一个命令 —— dd

dd 是一个 Unix 和类 Unix 系统上的命令,主要功能为转换和复制文件。

在Unix上,硬件的设备驱动(如硬盘)就像普通文件一样,出现在文件系统中;只要在各自的驱动程序中实现了对应的功能,dd 也可以读取自和/或写入到这些文件。

阅读全文→

轻小说推荐 —— 「GAMERS 电玩咖!」

这次想要推荐的轻小说是「碧阳学园学生会议事录」的作者 —— 葵せきな 的最新作,「ゲーマーズ!」(台译 电玩咖)。说是推荐其实我也没什么好文笔写长文,所以还是贴点链接吧。

cover

简介

雨野景太,兴趣是电玩,除此之外没有醒目特征, 却又不爱平凡的日常生活,在高中属于如假包换的落单路人角。

尽管这样的他并没有突然在学生会发表后宫宣言,更没有被关进名为游戏但并非儿戏的 MMO 世界……

「……要不要陪我……加入电玩社呢?」

可是,他却得到了全校第一美少女兼电玩社社长天道花怜钦点,惊人际遇简直可比老梗恋爱喜剧。

还以为跟喜欢电玩的美少女们之间会有恋爱喜剧上演,实则不然!?


【輕小說心得】 ...我...胃好痛—《GAMERS 電玩咖!》

【短心得】電玩好可怕!-《GAMERS電玩咖!》


看了学生会系列后我就成了 葵せきな 老师的粉了,这个系列我也看得很开心(贵圈真 TM 乱)。

本作的人物描写非常不错,每个角色都很有自己的特点(毕竟写出了学生会呀),通过对话以及视角的转换(本作是双男主视角的群像剧)将角色的魅力很好的体现了出来。虽然剧情的发展是各种误会吊人胃口,单总体来说还是偏搞笑风的。

总的来说,这个系列对于我来说和「为美好的世界献上祝福」一样,是只要一出新卷就会屁颠屁颠去代购日版的那种(笑)。

可惜我一介高中生并没有几个钱,就只入了日版第五卷聊表支持 emotion(十一月 konosuba 第十卷发售还得攒钱呢 QwQ)

order screenshot

(葵老贼第四卷结尾吊足了我胃口啊魂淡 (´∀((☆ミつ

阅读全文→

使用 Nginx 反代并缓存动态内容

因为着实没想到一个皮肤站竟然会有这么大的并发(好吧其实也不大,QPS 大概 50 左右),所以我之前 开发/部署 Blessing Skin Server 的时候是完全没考虑到缓存优化的。直到后来出现了 神秘的高并发(QPS 上 200)导致皮肤站宕机我才意识到缓存的重要性。

我到现在也还是搞不懂那到底是正常流量还是 CC 攻击。。难道正常用户会每秒请求 20+ 次 Json Profile 吗?又不是天天退/进游戏玩 emotion

虽然当时我就花了一点时间给 Json Profile 和皮肤预览之类的地方 加上了缓存,但是由于这些缓存方案都是在 Laravel 层之上的,所以框架的性能依旧是硬伤。试了下 Stone 之类的优化措施也没什么卵效果,再加上我学业也忙了起来,这个问题就被搁置了。

正好最近国庆放假(虽然只有四天),我就抽了点时间出来研究了一下如何给我的皮肤站套一层缓存 ( ・_ゝ・)


网上关于页面缓存的解决方案大致有 SquidVarnishNginx 几种,他们之间各有优劣,有兴趣的可以自行搜索。我因为需求不大所以就选用了 Nginx 来缓存动态内容。

虽然说 Nginx 同时还可以做到负载均衡之类的事,但由于我这穷屌只有一台机子,所以只好普通地做成这样的架构:

[用户] --- 访问 ---> [skin.prinzeugen.net] 
  ^                           |
  |                           v
  |--- 返回缓存 <-(否)-缓存是否过期?
  |                           |
  |                           v
  |-------返回-------(
阅读全文→

劳资也是开得起 Minecraft 光影的男人辣!

这次国庆去电脑城摸了块 GTX750(原先的 9800GT 实在是烂得不行了)和一块新硬盘回来,克隆完硬盘后就迫不及待地给 MC 打上了 GLSL Shader Mod。玩了一会后我的表情是这样的:emotion1

不得不说上了光影之后的 MC 根本不是一个游戏啊

95e7cf170b0d4f5fbe87e97360faacb9.png

96bc99181f194605918d6425fb1a3609.png 4c9c5f4cf7c3b187b6cb61d063fa542b.png 0917360036c771407f8d79dd1b2439de.png


以上截图的 Shaderpack 是 Sildur,感觉蛮不错的,750 跑 Extreme 也有稳定 60FPS,主体的暖色调也挺对我胃口 :)

另,1.10.2 使用 GLSL Shader Mod 可能会出现方块材质丢失的情况,届时可以用 Optifine 加载 Shader 解决。

阅读全文→

String.prototype.endsWith() 的浏览器兼容性问题

String.prototype.endsWith() 这个方法是 ECMA6 新加入的,而我当初随手 Google 了一下,也没怎么看就直接用上去了,直到我今天在一台破手机上测试的时候发现有个用到这个方法的值神秘地变成了 undefined ( ´_ゝ`)

我记得上次好像也是这样随手搜索导致使用了不兼容的函数 ( -д-) 论面向搜索引擎编程的坏处

不过我们还是可以通过扩展 String 的原型来实现在不支持的浏览器上使用这个方法:

/**
 * 代码来自 MDN
 * 
 * @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
 */

if (!String.prototype.endsWith) {  
  String.prototype.endsWith = function(searchString, position) {
      var subjectString = this.toString();
      if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
        position = subjectString.length;
      }
      position -= searchString.length;
      var lastIndex = subjectString.lastIndexOf(searchString, position);
      return lastIndex !== -1 &
阅读全文→

使用 Laravel 的 RedirectResponse 重定向至任意 URL

Laravel 允许我们在控制器中返回一个 Illuminate\Http\RedirectResponse 的实例来执行重定向。根据文档,我们可以通过 redirect() 帮助函数或者 Redirect Facade 来生成实例,并且可以方便得重定向至命名路由、控制器行为等。

但如果我们想要重定向至自定义 URL 呢?

对于这样的需求,Laravel 官方的文档是完全没有提及的(至少到目前 5.3 是这样),所以估计很多人都是自己实现了一个使用 header() 或者 <meta http-equiv='Refresh' content=''> 的重定向函数(包括以前的我)。

但是刚才在做 Blessing Skin Server 的国际化的时候,要求重定向至之前的页面。不得不说 Laravel 的 back() 函数有时候鸡肋得不行,因为它是通过在 session 里维护一个 _previous 数组来实现跳转到之前的页面的。

然而这个 _previous 会在每次 Laravel 收到请求的时候更新。没错,包括验证码,包括由 PHP 生成的预览图等等请求。这样的话访问一个带有上述请求的页面时,你是无法使用 back() 的,因为 Laravel 会把你重定向到那些 URL 上而不是用户看到的页面上。

好了回到正题。

这个回到上一个页面的功能也是可以用 HTTP_REFERER 这个 HTTP

阅读全文→

使用 Certbot 自动签发 Let's Encrypt 证书

今晚一回来就看到 Google Search Console 给我发了封邮件说我站点上的 SSL 证书过期了。我上去一看还真是,这张我从 Andy 手里买来的通配符证书已经在昨天失效了。

唉,时间也是过得忒快啊,转眼间一年就过去了,我也成为了苦逼的高三党,真是惨得不行 ( ・_ゝ・)

不过正好,我从 之前就一直在关注 Let's Encrypt 这个项目了,这次正好试试看它好不好用。

首先先是去查看一下它官网上的文档,毕竟网上那些教程啊啥啥的可能已经过期了,所以还是官方文档靠谱。然后我们可以看到官方的 Getting Started 里是大力推荐 Certbot 这个自动化工具来签发证书的。

我们在 Certbot 的站点上选择好我们的 Web Server 和操作系统版本后,就可以看到详细些的教程了。按照它上面所写的一般就可以正常使用了,如果你看不懂鹰文的话可以去找找其他人写的中文教程。

screenshot1


下面把一些需要注意的地方记录一下:

一、注意 certonly 参数

如果不带参数地直接运行 certbot-auto 这个脚本的话,它是需要一个 installer 的。如果你懒得折腾这玩意就加上 certonly 参数吧,这样脚本就会只会在 /etc/letsencrypt/live/ 目录下生成对应证书文件了。然后你只需要在你的各站点 Nginx 配置中修改 ssl 证书目录就好了。

二、注意让 Nginx 允许访问 .well-known 目录

我安装的 Nginx (OneinStack)默认是不允许访问 . 开头的文件和目录的,估计其他 lnmp 包也是这样。

阅读全文→

Sublime Text 3 主题推荐 —— Boxy

BOXY

用了好久的 Predawn,打算换个 Theme 和 Color Scheme 试试。在网上逛了一段时间后,我找到了一个很不错的 ST3 主题,这里分享一下:

Boxy Theme

The most hackable theme for Sublime Text 3

这个主题在 Package Control 上的页面在这里,这是一个非常强大的主题,你可以去看看它的介绍视频。

Boxy 提供了很多自定义选项,因此你甚至可以把 Sublime 打扮成 Atom、VS Code,甚至是同为 ST 主题的 Predawn/Material 的样式,简直碉堡了好吗:

Screenshot

上图为 Boxy Theme 应用了 Predawn 的 Preset,自定义了 Predawn 的代码高亮,以及修改了一些小细节之后的样子~

Screenshot2

上图为应用了 Code Preset 和使用 Tomorrow Color Scheme 后的样子

是不是很不错呢,如果对你的胃口的话,就去赞助下作者或者给一个 Star 吧~ (σ゚∀゚)σ

阅读全文→

又是一种用于 JavaScript 的前端国际化方案

现在 Blessing Skin Server 的 HTML 模板是使用 Laravel 自带的本地化来实现多语言支持的,并且使用了 devitek/yaml-translation 这个包把 Laravel 语言文件从默认的 PHP 数组形式改为 YAML 格式的文件。

不得不说数组形式的语言文件简直反人类好吗,一大堆 => 看的眼晕。。YAML 大法好!(ゝ∀・)

回到正题。虽然 HTML 模板里的国际化是解决了,但是整个应用中需要国际化的地方可不止 HTML 模板,同时还有 JavaScript。但是静态的脚本文件中总不能内嵌 PHP 吧,所以我们得搞个单独的解决方案。

虽然说网上现成的 JS 国际化的库很多,但我总觉得有些看不上眼(可能是我没找到好的),就准备自己实现一下。

首先我们需要一个全局变量来保存从语言文件里读出来的东西:

// 保存所有加载的语言文件
$.locales = {};
// 当前选择的语言翻译文件
var locale = {};  

这里我们把 locales 这个字典绑到了 jQuery 定义的全局变量 $ 上,这也就意味着要依赖 jQuery 了。当然你不绑在 $ 上也是一点关系也没有的,因为我们下面并不需要用到 jQuery。

现在我们就可以在语言文件中这样写了:

(function ($) {
    "use strict";

    $.locales['zh-CN'] = {
        auth: {
            login: '登录',
            validation: {
                emptyPassword: '密码要好好填哦'
            }
        },
        user: {
            changeNickName: '确定要将昵称设置为 :new_
阅读全文→

自定义 Laravel Validator 所返回的响应

不得不说 Laravel 的 Validation 是极好的,非常易于使用,麻麻再也不用担心我要写一大堆验证啦 ~( ^ω^)

但是这个 Validator 有一个神秘的地方 ( -д-),正如官方文档所说,它会自动判断当前请求是否为 Ajax 发送的,如果是,则在验证失败的时候返回一个 JsonResponse 响应而不是 RedirectResponse 响应。

但是,这个 JSON 响应的状态码,是 422。

WTF!坑爹呢这是!要知道 422 这个状态码是通不过 jQuery.ajax.success 的啊!

在网上找了一圈,愣是没找着什么好一点的解决方法(全是叫你在 $.ajax.failed 里处理错误的)。

没办法,自己动手丰衣足食,总之先看看文档:自定义闪存的错误消息格式

哦哦,看来我们可以在控制器基类中自定义错误的格式,于是我试着在 formatValidationErrors 方法中返回了一个状态码为 200 的 Illuminate\Http\JsonResponse。但是这样是行不通的,这个方法要求我们要返回一个数组,所以我们就不能使用这种小 trick 了(当然如果你愿意直接在这个方法里输出 JSON 文本然后 exit 的话也没事)。

既然这里没办法了,我们就得从 ExceptionHandler 下手了。众所周知 Laravel 的验证器会抛出一个 ValidationException 异常,此异常在被捕获后会被 Laravel 的基异常处理器给渲染成 Http

阅读全文→