致我所深爱着的世界

开发 Blessing Skin Server 所学到的

开发这个皮肤站程序也有一段时间了,写篇文章稍微总结一下。挺久以前的草稿了,可能有些过时内容。


起初接触到 PHP 是在搭建博客的时候,经常因为某种需求而需要对 WordPress 做一些定制。也就是那个时候我写出了人生中 第一行 PHP 代码

当时对 PHP 也没太大感觉,因为当时也没接触过 Web 开发。真正开始使用 PHP,是萌发想做一个皮肤站的念头后。

在开发语言中,我选择了 PHP 而不是喜欢的 Python。一是因为作为模板语言的PHP天生适合写 web 项目,二也是为了能涨点姿势。

因为基础还算过得去,我也没必要去看什么 PHP 新手入门教程,上手就直接开始写了。依样画葫芦撸了个基本架构就开始写前端逻辑。

> READ MORE...

为 Ghost 博客添加页面访问计数器

博客搬迁到 Ghost 后,原来的 Post Views 无法显示一直是窝的一大心病。

众所周知 Ghost 是使用模板语言 handlebars 来开发主题的,这也就造成了主题开发者们很难输出一些动态内容,而只能使用其内置的助手函数输出有限的可变内容。

总不能就这样下去吧,于是窝经过了一番搜索,找到了这个东西 —— 不算子

看来困扰于静态页面访问计数的不止窝一个啊。然而看了一下,不算子并不提供可调用的 API,也就是说窝没办法在文章分页上显示每篇文章的点击数了。

这怎么行?于是窝动了自己写计数服务的念头。

> READ MORE...

VPS 被 DDoS 后与 ConoHa 客服的邮件记录

挺醉的。翻译如下:


(お客様センター) - 2016/01/23 22:21

ご担当者 様

いつもご利用いただき、まことにありがとうございます。

ConoHa お客様センターです。

突然のご連絡失礼いたします。

このたびお客様にご利用いただいておりますVPSに対して、
外部からの不正なトラフィック(DDOS攻撃)を検知いたしました。

IPv4アドレス :157.7.108.189

大変恐縮ではございますが、他のご利用者様への影響が懸念される
状況となっておりましたので、該当VPSに対する外部からの通信を
すべてDropするようにさせていただきました。

サービスの安定運用上、何卒ご了承くださいますよう、お願い
申しあげます。

今後ともConoHaをよろしくお願いいたします。

(客服中心) - 2016/01/23 22:21

尊敬的用户

非常感谢您一直以来的使用,这里是 ConoHa 客服中心。

突然的通知失礼了。

这次对于我们为您提供的 VPS,发现了外来的异常流量(DDOS攻击)。

IPv4 地址 :157.7.108.189

虽然很过意不去,但是由于不知道是否会对其他使用者造成影响,所以我们将被攻击的 VPS 的外部通信全部 Drop 了。

为了对服务的稳定而进行的操作,敬请谅解。

今后也请多多关照 ConoHa。

> READ MORE...

Hello Ghost, goodbye Wordpress

虽然以前就一直想要弃用 WordPress 了,但是由于没有时间(懒) ,而且也是对这个完善的 CMS 有了感情。

然而在 ConoHa 的 VPS 被 DDoS 而搬迁至 DigitalOcean 后,我奇怪的发现 WordPress 的响应速度慢了很多。TTFB 甚至达到了史无前例的 16s。

对于这种情况,我第一个想到的就是数据库的锅。然而看了慢查询日志,导出 wp query 却发现问题不在数据库查询上。

后来又使用了排除大法,最终将问题定位于我所使用的 Seventeen 主题上。

看来是主题中做了什么耗费大量 CPU 时间的事件,导致前后台响应慢成狗(默认主题没事)。

要知道同样内存,ConoHa 和 DigitalOcean 的 CPU 配置可不只差了一点半点。这也是我最初选择 ConoHa 的原因之一。

然而发生了这档子事,反正我是再也不会去用 ConoHa 了。

那么怎么办呢?活人总不能让尿憋死吧。

> READ MORE...

通过 Socks5 代理进行 SSH 连接

为什么要写这个呢?

这次 ConoHa 把我被 DDoS 的 VPS 所有对外连接 DROP 了。最开始是所有的连接都 DROP,只有控制台的 VNC 才连的上。连上以后只能 Ping 到内网。

所幸后来放宽了 DROP,日本的 IP 可以访问了。于是借用了同学的搭建于 ConoHa 的 Shadowsocks,准备把数据备份下来(ConoHa 删除被 D 主机不是一次两次了)。

那么要怎么样才能通过代理进行 SSH 连接呢?窝起先以为是像 curl 那样提供了参数,不曾想 man ssh 未果,只好 Google 解决方法。不过大部分都是搜到了 SSH 代理的教程,找了挺久的,为了让后来人少走弯路,遂记录一下。

下面介绍的是 connect 的使用方法,Corkscrew 可以看这篇

0x01 下载并安装 connect

这是 connect 的 Bitbucket 项目地址

如果你是 Linux/Mac 用户,克隆项目到本地(然而窝不用 Mercurial),编译安装:

$ hg clone https://bitbucket.org/gotoh/connect 
$ cd connect 
$ make && make install

也可以:

$ gcc connect.c -o connect 
$ cp connect /usr/local/bin

如果你是 Windows 下的 Cygwin 用户,直接下载发行的二进制文件C:/Windows 中即可

0x02 配置 SSH

如果你使用的是 socks5 代理(Shadowsocks),添加这两行到 ~/.ssh/config

Host * 
    ProxyCommand connect -H 127.0.0.1:1080 %h %p

如果你是使用 HTTP 代理,将 -H 改为 -S。

0x03 连接

success

成功


装逼地使用了十六进制的标题序号

临时迁移至 DigitalOcean

由于 ConoHa 的 VPS 被 DDoS,被 DROP 了除日本 IP 外的所有连接,故紧急迁移至 DigitalOcean。同时导致了从昨晚 21 时到今天早上 10 点之间的服务不可用。

发了 Tickets,ConoHa 客服至今没有回应,看来星期天客服不上班是真的了QQ图片20160124152956

遂临时迁移至 DigitalOcean。所有数据迁移后,发现 WordPress 的响应变得非常慢,TTFB 长时间大于 20s。经过排查,将问题锁定至主题。由于 DO 主频的问题,原先的 Seventeen 主题中不知道有什么占用了大量 CPU 时间的操作,导致响应时间延长。

遂换回 WordPress 默认主题 Twenty Fifteen。

不知道 ConoHa 的傻逼客服什么时候才会回复。

– (お客様センター) – 2016/01/23 22:21
ご担当者 様

いつもご利用いただき、まことにありがとうございます。
ConoHa お客様センターです。

突然のご連絡失礼いたします。

このたびお客様にご利用いただいておりますVPSに対して、
外部からの不正なトラフィック(DDOS攻撃)を検知いたしました。

IPv4アドレス :157.7.108.189

大変恐縮ではございますが、他のご利用者様への影響が懸念される
状況となっておりましたので、該当VPSに対する外部からの通信を
すべてDropするようにさせていただきました。

サービスの安定運用上、何卒ご了承くださいますよう、お願い
申しあげます。

今後ともConoHaをよろしくお願いいたします。

使用 MySQLi 重写 Do you like me

这次升级 PHP7,一切顺利,到了恢复站点数据的时候,发现上次搞的 “Do you like me?” 不工作了。看了日志发现是 mysql_connect() 这个函数的问题。

看了下文档,原来在 PHP7 中全面移除了 mysql_ 系列函数,转而使用 mysqli 或者 PDO。。fuck 劳资皮肤站里都是 mysql_ 系列函数啊啊

上次偷懒用的 LWL12 写的,看来他也没想到这种情况呢。遂使用 mysqli 重写之。

mysqli 改为以面向对象的方式操作数据库,而不是 mysql_ 系列函数的面向过程,这点倒是挺好的。

不知道为何原来 LWL12 写的版本单独使用了一个表来存投票数,可能是怕效率问题。不过 SELECT COUNT(*) 在没有指定 WHICH 的时候效率还是蛮高的,参见:知乎:mysql select count(*) 与 select count(id) 两个执行效率怎样?

其实也没改多少,另外把建表的 SQL 也顺便封装在文件里了,托管在 Gist 上。

不忘初心,方得始终

如白驹过隙,2015 年已经悄悄离去,新年的钟声已经敲响。

虽然早就过了发年终总结的日子,但本着宁缺毋滥的原则,一直捂着草稿没发,我博客第一次的年度总结,总要搞得有逼格一点。

回首 2015

2015,毫不夸张的说是我收获最大的一年。去年的 3 月 28 日,不知道哪里来的兴趣,开始折腾起了独立博客。

我从来不是一个喜欢写文学性文字的人,以前不是,将来也应该不会是。开始搭建博客的理由已经不可考,但是我仍然庆幸当初选择了这条道路。

2015 年,我高中一年级。真的只是一个平凡的,刚上完一般的高一课程,终于开始习惯了高中生活的死小孩。

稍微和其他孩子不一样的,也就是我对计算机的兴趣了。嘛,讲的这么高大上,其实就是比起用电脑玩游戏,更喜欢折腾一些乱七八糟的东西。

我绝对不算早接触计算机的那一批人,我的父母也没有那么高瞻远瞩,不过在 2008 年,我还是碰到了人生中第一台电脑。

我至今记得她刚刚被父亲抬回家的样子。

清华同方 真爱 G2000 品牌机,棱角分明,散发出一股冷峻气息的黑色机箱,漂亮的镜面设计的前面板,这么一个酷爆了的铁疙瘩,给那个卧室客厅合一的蜗居和我以后的人生,涂上了浓密重彩的一笔。

她刚刚被请回家时,我凭借着不知道哪里学来的技能将其正确的与那台 14 吋液晶彩电连在一起并且成功点亮了,不过看到的是一个黑黑的屏幕,上面闪烁着光标与一个字符。我在键盘上乱按一通,它也会显示对应的字母。

这和我在别人家里玩的不一样啊,我哭着喊着要父亲拿回店里修。知道那是 DOS,已经是几年后的事情了。

同其他同龄的孩子一样,打 CF 到废寝忘食在我身上也发生过。然而不知道什么时候,甚至连我也没注意到,当我已经把管理 Windows 的文件系统,浏览 system32,折腾美化,优化系统作为一种乐趣的时候,我已经走上了一条不归路。

初中二年级,照理来说应该是在本子上写写画画人物设定,写写右臂封印着黑炎龙的世界第一勇者流落民间扮猪吃老虎一路装逼如风抱得美人归的小说的年纪,但窝不知道从哪里知道了编程这个词汇,并且发现了吴涛大哥的中文编程语言后,我又在这条不归路上前进了一步。

易语言,中文编程从入门到精通,海洋出版社出版。这就是当初我书架上最大部头的一本书了。感谢这本书,虽然现在的我再去看,可能会嗤之以鼻,但是这本书给予了我一个起点,给予了我对编程的兴趣,给予了我完成一个作品的满足感。

感谢这门语言,没有它,就不会有今天的我。愿它可以吸引更多的希望学习编程的中国人初学者踏上这条道路。

> READ MORE...

Blessing Skin Server 0.1 —— 开源 PHP Minecraft 皮肤站

bss upload

很久以前就有想写一个皮肤站的想法了,但是苦于没有时间且 PHP、前端的 coding 都不熟练,所以一直搁置着,当作一个目标。

恰逢前几周稍微有点时间(其实是克服了懒癌),就写了一个皮肤站的原型。PHP + MySQL,表单 POST 数据,基本的登录/注册/上传 功能还是实现了的。但是前端完全没有写,全是 webkit 的默认样式。

不过盼星星盼月亮终于等到了元旦假期(连上周末三天),于是把整个项目重构了一下,并且用鞋拔子写了个稍微能看的页面。

前端页面引用的资源/库均位于根目录下的 /assets/libs,这是不知道从哪里学来的,总之觉得这样挺好的就这样放了(笑)

然后是实现了全站 Ajax,登录/注册 均 POST 请求 check.php 返回 json,加入了 SQL 注入防护(虽然还没有 sqlmap 测试过),加入了基于 IP 的注册数量限制,支持保存 cookie,token 验证自动登录。token 就是使用普通的用于验证的不可逆算法得到(用户名 + MD5 密码 + 盐,MD5 二次加密)。

Ajax 文件上传带 token POST 请求 upload.php,同样返回 json,上次后的文件位于 /uploads。(其实窝觉着这俩可以放一个文件里的)

user.php 为用户页面,本来是想用 php 路由到 /user/admin 等子目录的,但是想想还是算了。因为窝对路由之类的理解并不多,边查边写的话窝也没有那么多时间了。准备放在下一个版本里。

user.php 中使用了 djazz 的 Minecraft Skin Previewer 实现 3D 皮肤预览(就是 skinme 使用的那个),窝将其封装了一下放入了 three.msp.js 中,可以使用类似 MSP.getStatus()MSP.changeSkin() 的接口来访问。

后端就没啥出彩的地方了(话说前端也没有吧),所有使用了数据库连接的操作均封装为函数放在 connect.php 里面。不过感觉这个放根目录不合适就是了。

config.php 中定义了数据库连接信息,站点名称等常量以供调用。这是从 WordPress 那学来的(笑

遗憾的是由于没有时间,后台管理页面还没写,目前只能通过自己管理数据库和文件的方式来管理用户。而且现在的数据表结构也不支持后台管理 qwq

而且前端的 JS 和 CSS 都写得乱糟糟的,CSS 选择器一半是 id 一般是 class,文件关系也没处理好,没有响应式设计,有些地方还用了绝对定位 emotion1

不过由于时间所限,这些都放到下一个版本吧~


项目开源在 GitHub 上,欢迎 Pull Request~ 在线演示:https://skin.prinzeugen.net/