致我所深爱着的世界

同时使用 Laravel Elixir 和同名自定义 Gulp Task 时的坑

今天上午我把 Blessing Skin Server 的框架改为了 Laravel,到处修修改改一会后终于可以跑起来了。因为我之前也是使用的 Blade 模板引擎和与 Illuminate\Routing 语法类似的路由库,所以迁移过程还算是挺无痛的。

迁移稍微告一段落后,我就准备使用一下以前一直很想用的 Laravel 对常用 Gulp Task 的封装:Laravel Elixir

改写原来 gulpfile.js 中的原生 Gulp Tasks 到 Laravel Elixir 的模式并不算麻烦,常用的 task 都有集成,并且通过链式调用的方式依次执行各个 Task。

改写好后,直接运行 $ gulp 即可执行所有的 elixir tasks,并且执行完毕后还会有详细的表格报告和 Toast 通知,非常的方便。

但是,不知道是我的姿势不对还是怎么回事,我没有找到能够把一个目录下所有的 css/js 文件压缩后复制到另一个目录的 elixir task,无奈之下只好写成原生的 Gulp Task,并且使用 elixir 的 mix.task() 方法来调用:

> READ MORE...

为 Blade 模板引擎添加新文件扩展名

因为一些原因,我准备把 Blessing Skin 的框架换成 Laravel 了(之前是自己搭建的一个框架),但是在模板迁移的时候遇到了一点问题。

之前我是使用的 XiaoLer/blade 这个从 Laravel 中抽离出来的 Blade 模板引擎,并且自定义为使用 .tpl 文件后缀。你问为啥不用默认的 .blade.php 而是用这个 Smarty 的模板扩展名?能有啥,好看呗 :-D

不过之前我是直接调用 FileViewFinder 类的 addExtension 方法来添加扩展名的,但是在 Laravel 里就不能这样了。你总不能在 Illuminate\View 加几句话吧?

去 Google 搜索了下,没发现有可以很方便使用的方法(当然是搜的鹰文,说不定是我姿势不对),就只好自己找了。

首先先从 View Facade 入手,可以看到它是从服务容器中解析出了 view 这个绑定。继续往下找,打开 Illuminate\View\ViewServiceProvider,看看 View 的服务提供者到底是把啥给绑定到 view 上去了:

> READ MORE...

喜闻乐见被 DDoS + CC 攻击

今早起来准备修一个 Blessing Skin Server 的 BUG 的时候,打开演示站发现慢到没朋友,最起码要 60s+ 才会有响应。当时我也没多想,觉着大概是 DO 线路又抽风了,然后挂上代理访问演示站,但依然是无响应。这时候我开始觉得不对劲了,SSH 连上 VPS,top 一看,诶哟,90% 的 CPU 占用,清一色的 php-fpm 进程。

当时我就有点方了,去 DO 的控制台看了下图表,CPU 从上午十点左右开始就一直是爆满状态。再去看了一下 netstat,有几个 SYN_RECV 和一大票 ESTABLISHED,我就觉得有可能是被 cc 了。

随后去看了一下 Nginx 的访问日志,发现从早上开始就一直有人不断地 HEAD / 请求,排查了一下最后发现请求的是 skin.prinzeugen.net 这个域名,也就是 Blessing Skin Server 的演示站点。

> READ MORE...

使用 Git 生成增量更新包

上次有人叫我在 Blessing Skin 每次升级的时候带上一个增量更新包,只包含所有上一个版本后修改过的文件。

我听到这个需求,最开始想到的是使用 git diff --name-only,加上这个参数后可以只显示 commit 之间修改过的文件名,然后就可以用管道通给 zip 之类的程序来压缩。

去网上搜了搜,发现还有更简单的方法

$ git archive -o ../latest.zip NEW_COMMIT_ID $(git diff --name-only OLD_COMMIT_ID NEW_COMMIT_ID)

这是用了 git archieve 命令,本质上和我上面说的也差不离。

如果你打了 tag,就可以写成这样:

$ git archive -o ../latest.zip HEAD $(git diff --name-only v3.0.1 HEAD)

是不是很方便呢 |∀` )

开始使用搜狗拼音输入法

说起输入法,自从几年前我升级 win8 之后我就对自带的巨硬输入法一见钟情,从此再也没有换过其他输入法。

然而,前几天被升级 win10 14393 之后(之前是万年 TH2),虽然开始菜单呀,设置页面之类的地方变了许多,但总体来讲对日常使用并没有影响,因此我也就没有特别在意。

今天我在 Sublime Text 3 中打算进行全局替换的时候,按了快捷键 Ctrl + Shift + F,然而什么反应都没有。在排除了其他可能性(键盘坏了或者我瞎了)之后,就几乎可以确定是热键冲突了。然而排查了运行中的所有软件后,没有一个软件占用了这个快捷键,这就非常的迷了 (*´д`)

> READ MORE...

「このすば」第九卷终于他妈到啦

7 月 1 号发售,我 6.21 预订的,昨天刚到,整整 25 天,终于 tm 到了,就算是慢也不带这么慢的吧? emotion

果然不应该贪便宜挑了个便宜几块钱的店吗。。我他妈的中译版都快看两遍了,上次买伏见老贼新书的时候,即使店家在路上出了点事(书被海关扣了),最后也是两个星期多就到了,难道你也被扣了? emotion2 不是我不体谅做代购的,我也不说叫你多快多快到,你既然收了钱,好歹给个说得过去的速度吧?

难道说三个半星期还算是正常速度?


Screenshot

> READ MORE...

关于 FormData.get() 的兼容性问题

又踩到坑了,稍微记录一下 ( ・_ゝ・)

我在 Ajax 上传文件时是用的构建 FormData 对象的方法,构建完之后我很自然的打算从对象里面取出值来做验证,StackOverflow 里搜了一下之后就知道了有 FormData.get() 这个方法,我也没想太多就直接用了,并且在我本地环境(Chrome 51)上没有任何问题。

前天把 beta 版的 v3 皮肤站上线测试了,今天就有人发邮件给我,竟然是 FormData.get() 这个语句报错了,提示 e.get is not a function,当时我就知道八成又是兼容性问题了 ( `д´)

查了一下 MDN 文档 果然是这样,FormData.get() 方法竟然是从 Chrome 50.0 开始支持的,而那个用户用的是三六蛋浏览器,于是就喜闻乐见的 GG 了 emotion

Node 实现自动解析网易云音乐并转换为 APlayer 配置

最近在网易云音乐找到了很多很棒的歌,准备找个 HTML5 的播放器挂到博客上去。以前我的博客也是有音乐播放器的,用的是 WordPress 的一个叫 WP-Player 的插件。后来转到 Ghost 的时候就把以前文章里的插件短代码删掉了,也没有再搞播放器了。

今天正好心血来潮,于是去 GitHub 上搜了下,看中了 DIYGod 做的 HTML5 音乐播放器 APlayer。UI 之类的也很对我胃口于是就马上拿来用了。

配置 APlayer 的播放列表需要提供一个数组,数组里放存放了歌曲信息的字典,大概像这样:

> READ MORE...

Python 实现自动重命名网易云音乐下载文件

网易云音乐 PC 版的下载文件都是按照 歌手名 - 歌曲名.mp3 的格式命名的,然而我比较喜欢直接以歌曲名作为文件名。手动一个一个文件改肯定是不行的,太 tm 蠢了(笑

以前我是用 shell 写的脚本来实现自动重命名的,但是有一次需要处理一张 OST 内的所有歌曲时(Rabi-Ribi 的 OST,我想把所有的文件名前面加上音轨号),shell 脚本就有些力不从心了,而且我也不想去折腾 shell 读取 ID3,就打算用 Python 来实现。

不得不说 Python 用来写这种小脚本真的是贼 tm 方便,加上查 Mutagen 文档的时间写了也就半个小时:

> READ MORE...

关于 JavaScript 的函数默认参数的兼容性

最近在写 Blessing Skin Server V3 的前端的时候,定义带可选参数的函数的时候经常这样定义:

function showModal(msg, title = "Messgae", type = "default") {
    var btn_type = (type != "default") ? "btn-outline" : "btn-primary";
    var dom = '/* 省略 */';
    $(dom).modal();
}

因为 PHP 写多了,也就想当然的认为 Js 的默认参数也是这样写的,而且 PC 上的测试也是一切正常,所以也没多想什么。

然而今天我在一台手机上测试的时候,发现事件没有绑定上,找了好久原因(因为手机没有控制台也不能设置断点,只好用最原始的办法在可能出问题的行上加上 alert('fuck') 来调试)也只是把出错的函数找了出来,却死活看不出有哪里不对 emotion

> READ MORE...