回顾我的服务器使用经历/重新配置Debian服务器

接触过的主机商

为了搭建自己的网站和进行测试,虽然是个前端狗,却不得不使用各种服务器。迄今为止我使用过的主机/VPS有:

  • 90启航(3块钱一个月的主机,速度死慢,用了一个月)
  • LocVPS(最初是和Ricter菊苣、Faceair菊苣和qwe小华一起合租,后来大家纷纷离开这台服务器使用自己的独立服务器,我也随之开始寻觅自己的服务器)
  • hostker主机壳(试用过这家的空间,限制很多,但是价格还可以;这家的VPS没用过,不予置评;点击这个链接注册的话,购买新的虚拟主机可以延长10天)
  • Linode(目前我用过最好用的一个VPS商,需要信用卡支付美金,这里要感谢囧叔一直以来的帮助。点击这个链接使用优惠码注册/购买)

服务器使用历程

我的Linode服务器已经使用了很久了(再次感谢囧叔)。具体的学习历程:

  • 2013年 - 使用服务器是搭建静态的纯HTML的页面做测试,那时候我还在高中,使用的是普通的90启航的静态空间,域名还是最初的nocti.me
  • 2014年上 - 困囿于服务器功能的限制,想自己手动去折腾一些php的东西,在RP主机上面开始跟着教程搭建wordpress。
  • 2014年下 - 合租VPS后,服务器的Apache配置文件当然要自己写,这阵子就开始接触到了Apache和Nginx,当时服务器使用的是Apache。
  • 2015年上 - 开始使用自己的VPS,有了自己的东京Linode服务器,尽管是最低配置($10),但是使用起来还是相当不错。这半年开始自己搭建LNMP环境,进行简单的PHP使用;搭建了自己的ShadowSocks(然而服务器重置之后是yu帮我进行的搭建…);初步开始搭建Node.js环境。
  • 2015年下 - 学习状态比较好,对于服务器的使用次数愈加频繁也更喜欢折腾,完善了Node的运行环境,又在星河的推荐下使用了Gogs,但是这时候Go语言的环境和Node的环境配置没弄好,产生了一定的冲突。
  • 2016年初 - 使用ROOT账户直接操作系统太凶残,而且也很不好,为了解决各种麻烦,让服务器更加干净有条理,将服务器进行了重新配置。
    在面板上把系统重置为Debian8.1,尝试着用更现代更易于管理的方法去使用它。

重新配置Debian服务器

新的服务器上,依旧使用Nginx作为服务器软件,php版本5.6。
数据库方面,使用了Perocna这个MySQL的分支作为数据库软件,版本信息5.6.27-76.0 Percona Server
一直以来都只用root账户对服务器进行操作修改,感觉这样并不方便,所以这次添加了用户Nocti。
在编程环境方面,为了让环境之间能够不冲突,除了php和python,都将使用Docker,将环境放进container,保持服务器整体环境的整洁有序。部分php程序也将放到container里面,做一定量的研究。

过程中的几个小问题

添加用户的问题

useradd添加用户之后,用新建用户登录,shell左侧只能见到一个$符号,而且没有tab补全、也不能使用上下左右方向键。
这个情况是因为,新添加用户所使用的shell软件与root不同。
root账户使用的shell软件是bash,而新账户使用的shell软件地址在/bin/sh,而在这里ls -l一下,就会发现如下情况:

/bin/sh -> /bin/dash

也就是说,我们的新用户使用的shell软件是dash。
此时我们应该修改用户的默认shell软件,让其使用bash。具体方法可分成3类:

  1. chsh命令来设定用户的shell
  2. 编辑/etc/passwd来设定用户的shell
  3. 修改/bin/sh的软连接,让它连接到root使用的bash软件(注:国内大部分教程采用此方法,但是极力不推荐这种方法)

将shell软件重新指定之后,就可以使用bash正常进行补全了。不过,需要重新进行登录。
再强调一次,修改软连接的方法真心不好

shell的左侧只有$符号,可以补全的情况

在修改了shell软件之后,重新登录发现可以正常补全和使用方向键,可左侧还是只有一个$符号,这是shell配置没有生效的原因。此时使用:

cd /home/username
ls -a

查看你的用户根目录有没有.bashrc这个文件。这个文件没有的话,请按照bash官方的手册进行配置或者在网上找一个。已经有这个文件之后,我们在这个目录进行source命令来执行配置:

source ./.bashrc

然后就可以直接看见效果了。左侧的$符号处的具体形态配置,可以搜索关键词PS1
可以点击bash官方文档查看更多bash相关内容,有兴趣的可以自己去折腾一下哈。

Nginx配置不生效

从旧服务器上搬运过来的Nginx配置我丝毫没动,只是简单修正了文件目录的修改,可是在php5-fpm一切正常的情况下却不能打开php文件,进行的任何php操作都是一片空白。
同种情况可能发生的原因,首先是php的起始符号的问题。有时php的配置里面是禁止使用<?这种简写的符号作为php的起始符号的,这时候修改配置(Debian下apt-get到的php的话,配置文件在/etc/php5/fpm/php.ini),修改文件内容使short_open_tag = on就好。可以在文件里进行检索关键词 short ,如果检索到:

; short_open_tag
;   Default Value: On
;   Development Value: Off
;   Production Value: Off

这样的配置,那说明默认已经是short_open_tag = on了。
而我遇到的情况不在这里。经过对于log文件的检索发现,nginx端成功地把请求甩锅给了fastCGI,然后就没有然后了,php5-fpm也接收不到,所以问题应该在fastCGI上面。
经过检索,发现需要修改fastCGI的params,我的配置位置:/etc/nginx/fastcgi_params。里面可能是少了这样一句话:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

当然直接把这句话放进你的nginx网站具体配置也可以

location ~ .*\.php(\/.*)*$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
}

总结

折腾服务器很麻烦,部分软件的服务器环境很难搞定,互相之间的兼容也总是会出现意想不到的问题。
为了保证日后服务器管理的便利,应该熟练Docker,并配置好自己常用的几个container,以便于在更换服务器或者布置项目的时候,在处理解决服务器配置的问题上花费更少的时间。

Time is expensive.

一只柴犬的2015

概览

整个2015中,经历了很多人很多事。
去了一些地方,没有好好旅游,但是好好地看了当地的居住和交通。
没学会多少东西,踩了很多坑,不过很开心。
终于开始用自己学的东西,来换取经济利益。
知道了自己喜欢怎样的东西,喜欢怎样的生活,喜欢怎样的人。
年末了,终于知道该收拾自己,用更好的形象,去面对更好的人。
跟上了银魂的三百多集动画,跟上了银魂的五百多话漫画。
满意程度: 7.5 / 10 。

刘看山的酒馆

有了这个新的家园
女神ii,污妖王xu,5岁群主,心灵导师硬座,前妻小樱,老司机我e,小司机亖亖,鱼酱,k崽,楼主人,豆腐,碧老师,夏老师,牛少,耗子……
家人太多数不过来。
这里我可以随便污,随便搅,虽然来自各地,有各种脏各种黑,也有各种秀各种夜间档,很和谐。
也很感谢。

总收支

2015自收支图

这是我2015年的个人收支,不包括正常的大学生活的开销,也不包括生活费。
收入大部分来自于给在上海工作的大哥提供的移动端页面制作、canvas小游戏制作,极小部分来自给老师批量生成普通网页。
期间虽然也有自己去谈基于wp的全栈制作,但都因为种种原因无疾而终。
大体上知道了一些基础项目的价目,也开始渐渐了解我所学习的技术、所向往的行业,在未来工作的时候要面对哪些不得不面对的困难和窘迫。

设备使用

很开心,凭自己的能力分期入手了一台MacBook Air(13.3寸,128GB储存,4GB内存)。
入手之后渐渐从Win系统转到了OS X上面,现在有点OS X依赖了……。
年末收到了任狗送的KugouM1耳机,是我第一副蓝牙耳机,在此谢谢任狗

技术

基本选定了web前端的方向,也对这个行业有了一个更深的认识。
我喜欢前端,这种即时看得见效果的东西,真的会让人很开心。
2015里面熟悉起来的技术:

  • JQuery : 从了解到熟悉
  • Gulp工作流 : 从抄写到会写
  • Sass Jade Coffee : Coffee较为冷落,还是比较喜欢原生的js;Sass和Jade都因为大量的使用产生了一些亲切感
  • CreateJs : 因为项目需要,更深入了解了cjs,也用到了它的更多强大的功能
  • Node.js : 基本能够实现一个简单的后端功能,了解了回调的基础处理方式
  • Swiper2 : 为了做移动端项目没少使用它,使用的时候通常也配合AnimateCss

这些技术在使用过程中越发熟练了。

2015后半年做了各种小型的项目,给我带来收入的同时让我掌握了更多内容,比如基本的项目默认需求:图片预加载 / 移动端屏幕尺寸兼容等等。

服务器方面,学习和熟练了更多的命令,也对于搭建环境时的bug解决有了一些基础的思路。
搭建Go语言环境导致node环境出现了这样那样的问题,暂时未解决,打算重新配置服务器,具体预想见后文。

另外,在设计方面,PS切图开始使用PS CC2015带有的导出功能,极其方便;Mac入手之后则更加喜欢用Sketch,虽然不算熟练使用,但是勉强还是可以做基础设计的。

2016预想

2016计划要实现的内容,基本有以下这些:

  • 技术方面:
    • 自己实现一个完整的全栈
    • 制作新的Typecho主题
    • 学习更多的后端内容
    • 把前端技术向更高效的方向发展,学习更多前端的技术和框架
    • 强化排版和设计的美感
    • 把移动端常用的东西工程化,为了便于自己制作移动端的流程动画,研究CSS3动画生成的解决方案
  • 生活方面:
    • 入手一把SCX-48/56,学习五线谱
    • 入手一块移动硬盘,储存自己经手项目的素材和需求
    • 有规律整理自己每月的生活,记录成文字
    • 走出寝室,多走走,多看看
    • 去一次上海和广东
    • 更规律地管理开支

希望能完成自己的企划。
希望能用自己的手实现自己想要的那些小小梦想。
希望能有更安稳规律的睡眠。
希望能遇到一个愿意和我一起走的姑娘, 。
2016,不回头,继续走。

ソンナ强ク美シイモノニ私ハナリタイ
——银魂·33卷·卷名

萌新脱坑指南 - JavaScript回调函数&Node.js异步回调

这两天要给任狗解释什么是回调函数,想了想应该整理成文章,方便看,也当理清自己的思路了。

博客主题偷懒到现在没写完,代码看着可能有点不舒服,还请将就着看。

什么是回调函数

顾名思义,回调,回头再调用它(什么鬼 。
JS中的回调函数,作为萌新,我们会在这样的地方看见它:

app.get('/',function(req,res){
    res.send("hello world");
})

在这里面,作为 app.get方法(此处感谢老姐夫@faceair纠正)的第二个参数的,是一个函数,而这个,我们可以叫它回调函数。

回调函数是咋用的

我们来假设一个应用场景。

  1. 我们有两个初始参数
  2. 我们为二者求和
  3. 求和结果翻倍
  4. 调教
// 普通柴犬会先写个函数,返回其求和
function sum(a,b){
    var sum = a+b;
    return sum;
    console.log("sum函数结束");
}
// 然后用一个变量获取函数的返回值
var doge = sum(116,117);
// 数值翻倍
doge *= 2;
// 然后再随意地调教调教它
console.log(doge);

以上的代码,根据执行顺序,会在var doge = sum(116,117)的时候输出sum函数结束,最后才输出doge的最终值
这是一种普通的处理方式,顺序执行。然后我们用回调的方法嵌套执行:

// 普通柴犬会先写个函数,其中callback就是你需要写进参数的回调函数
function sum(a,b,callback){
    var sum = a+b;
    // 进行处理之后,调用回调函数,并把求得的和作为参数传进了它
    callback(sum);
    console.log("sum函数结束");
}
// 然后搞搞搞,前两个是参数,后面的就是回调函数
sum(233,233,function(data){
    // 然后用一个变量获取函数的返回值
    var doge = data;
    // 数值翻倍
    doge *= 2;
    // 然后再随意地调教调教它
    console.log(doge);
});

这里会先输出doge的值,然后才输出“sum函数结束”。

这就是回调函数最基本的形态和原理。

node.js的异步回调

我们使用node.js的时候,经常会用到回调函数,它在形态上和我们刚刚写的类似,但是它有着异步的特性。
这个特性,我们可以理解为“点菜”特性。
我们先扔出一个express中很常见的例子。

var express = require("express");
var fs = require("fs");// fs是node的文件系统模块
var app = express();

app.get('/',function(req,res){
    var doge = 0;
    // fs.readFile方法是一种读取文件的方法,未出错会把文件的内容赋值到data这个位置
    fs.readFile("./test.md",function(err,data){
        if(err){
            console.log("error : "+err)
        }else{
            doge = data.length;
            console.log("hello,doge : "+doge);
        }
    });
    // res.send的内容会输出到页面中
    res.send("hello,doge : "+doge);
});

app.listen(23333);

这里我们使用express进行了一个简单的服务构建,当启动的时候,访问localhost:23333/,我们会得到res.send的参数。下面我们忽略杂项只看正片内容:

    var doge = 0;
    fs.readFile("./test.md",function(err,data){
        if(err){
            console.log("error : "+err)
        }else{
            doge = data.length;//根据我的测试文件,这里假设文件内容的长度是30
            console.log("hello,doge : "+doge);
        }
    });
    res.send("hello,doge : "+doge);

按照正常的执行顺序,应该是这样运行的:

  1. 定义doge为0;
  2. 进行读文件操作,读取文件内容,读取成功后把文件内容的长度赋值给doge;
  3. 在控制台输出hello,doge : 30
  4. 在浏览器的页面里输出hello,doge : 30

抱着这样的信心,测试了一下,会被光速打脸。
真正的输出结果是:

  1. 在控制台输出hello,doge : 30
  2. 在浏览器的页面里输出hello,doge : 0

这是为什么呢?这正是刚刚我们提到的“node.js的'点菜'特性”。
在node.js中,我们能见到的很多模块的、需要写回调函数的方法,都具有这个点菜特性,比如刚刚的fs.readFile()
我们在餐馆中,我们进行了一次点菜,但是这不影响我们继续点其他的菜,或者结束点菜开始聊天、等到菜上来再开吃,对吧?
所以,我们的餐馆行为,是这样的:

进入餐馆 -> 点菜 -> 谈笑风生 ->(菜做好之后)吃菜

刚刚的行为,影射到我们的node代码中,其实是这样的:

//进入餐馆;
点菜("冷吃兔",function(菜){
    吃(菜);
})
谈笑风生();

也就是说,我们提前定义了一个回调函数,菜点好了,在做菜完成之后才去执行function(菜){吃(菜);},而我们会开始谈笑风生。
重新审视我们刚刚的代码:

    var doge = 0;
    // 我们现在点了个菜
    fs.readFile("./test.md",function(err,data){
        // 这里面,是菜做好了,产生了err和data值之后执行的内容
        if(err){
            console.log("error : "+err)
        }else{
            doge = data.length;
            console.log("hello,doge : "+doge);
        }
    });
    // 这是点菜之后 执行的内容
    res.send("hello,doge : "+doge);

这就是node的“点菜”特性,我们通常匪夷所思地叫它“异步回调”,其实理解为点菜,会更简单一些。正是因为有这样的特性,所以在基础的node写法中,我们总是会嵌套起很多层的回调函数,用以防止逻辑顺序不能正确执行。
在前人的不懈努力后,我们已经有了很多的对于异步回调嵌套问题的解决方案,比如co,Promise,yield,async等等等等,具体内容还请异步baidu/google。

总结

以上是关于JS的回调函数和Node.js的异步回调的一些脱坑帮助,一点拙见,如果哪里出现错误请邮箱或者评论告知。

感谢在创作过程中提供灵魂帮助的@名侦探羊神,事实上“点菜”这个生动的比喻正是羊神提出的。
同样感谢帮我纠错的老姐夫@faceair,上文中数处错误已在老姐夫指导下进行了修改。
参考:
· 文件系统 (fs)-Node.js中文网
· Node.js机制及原理理解初步(具体为什么会有点菜特性可以参考这篇文章)

整理11月

11月已逝,月常反思。

关于Canvas游戏的编写

10月末和11月上旬,一直在编写两个移动端的canvas休闲小游戏。
依旧用的熟悉的CreateJS,之前用过这个去实现动画,这次直接进行游戏开发,难免力不从心。
开发过程中遇见的几个坑:

  • 低级错误:在移动端的触碰兼容事件中,很难处理触碰事件点击事件滑动事件等。
    • 体现:拖动事件
    • 处理:使用框架hammer.js
  • 低级错误:在整体游戏的图形显示中,图片的层级错乱。
    • 体现:后添加的游戏元素理所应当会显示在之前的上面,影响视觉效果
    • 处理:分图层,在图层内添加新的游戏元素
  • 低级错误:不能很好的复用代码
    • 体现:相似的代码出现了多次
    • 处理:封装函数,复用代码,返回对象
  • 低级错误:游戏效率低下
    • 体现:逻辑错乱,导致游戏计算量过大
    • 处理:重构游戏逻辑,减少刷新和遍历操作
  • 常见问题:多次需求修改
    • 体现:需求多次修改,成本偏高
    • 处理:尽量降低部分与部分之间的耦合性,增强可修改性,不过重构代价低的时候尽量重构得更清晰好用

关于前端工程化的新认识

之前使用jade的过程中,只是简单作为了一个工程化的一部分,没有合理利用它。
在这个月的开发中,感受到了一个很重要的点就是,要把jade的template做得尽量的灵活。
之前,一个jade的基础template中,我们会留出这样几个代码块:

  • title - 页面标题
  • content - 页面内容
  • ??? - 页面内容中的特殊模块,如登录模块、nav

而现在,为了让一个template能应对更多特殊情况,我是这样划分的:

  • title - 页面标题
  • special-src - 页面特殊引用,这部分主要针对特殊的页面,应用场景举例:
    1. 页面中包含一个大型的js用来处理一个图标
    2. 页面中需要使用一个特殊的css文件来显示某一部分的样式
    3. 等等
  • content - 页面内容
  • footer-script - 页面特殊脚本,通常这个的下面只是一个script标签,针对小型的js引用

以及在目录划分上,现在我采用了分文件夹的内容处理方式,对于页面整体的组成有了更明显的展示,也更加便于引用。

关于物联网工程的“实习”(校方所组织的)

并不是什么正规的实习,但是有幸听到了杨正辉先生很好的一次讲座,有很多感受,会在之后的文章中详细叙述自己对于讲座内容等的理解和认识,对于先生所说的“互联网 与 互联网+”、“感知 - 传输 - 应用”等的一个个人理解。

关于IDE

自己比较懒,不喜欢折腾插件,所以最终放弃了Sublime Text。现在使用的是WebStorm。
在使用IDE上,之前一直坚持的一个理论是一直使用默认主题(懒),近期发现自己对于主题进行部分DIY是很有必要的,因为不同的人对于颜色的感知都有不同,所以要尽量去选择一个自己看着顺眼的配色,至少也要去官方主题库去斟酌一番。

关于后端

之前挖坑打算写后端,对GitHub项目 - Node_blog_V2进行了一个抄袭和研究循序并进的过程。

这个项目使用了一个标准的MVC结构,在学习过程中,发现了其中几个优缺点,优点:

  • 项目结构清晰
  • 数据处理方式很有借鉴意义

缺点:

  • 可修改之处很多
  • 没留出路由中间件的可行入口

后端的结构对于我一个一直在做前端的人来说是很新鲜的,这个坑基本是要弃了,打算带着这份新的理解去完成一个实际的后端项目用作自己的博客的一部分。

月常瞎扯

这个月,感谢玉酱带来的正能量,感谢强哥推荐的项目让我的毛爷爷越来越多,感谢Bilibili重新带给我的乐趣。
以及,费玉清的嘿嘿嘿的梗已经把我的室友洗脑了!!!
卸载了手机和电脑的炉石,更多的时间要用来休息和学习。
口琴方面,可以吹完千本樱了,换气又强了不少。
人生漫漫,仍需早睡早起,尚要不忘初心,如此。

整理这个十月

随着对于新一个月份的流量和生活费的热忱期盼。
十月份过去啦。
月初的时候有几单不错的企业网络平台,以为商量好了,结果却因为价格问题被放弃了。
赚钱很不容易。
现在是十一月月初,翻开账本和日记,想想也该写几个字记录一下自己的一个月了。

《平凡的世界》

借着一股热情,一口气读完了平凡的世界。对于小说而言,这部写得很文艺,那种接地气的文艺,不会总用华丽的词却还是很有意境感。
每个人都被困囿于自己的生活圈子里,这是一种平衡,显然有些平衡值得被打破。孙少平读了很多书,有着很强大的精神,虽然他的爱情是道不完美的疤痕,可他却真正地在风雨中活成了一个挺拔的男人。
这本书有很多很有意思的细节。孙少安和田润叶,那一曲也不知道什么时候就会传来的信天游,缩小的世界,人与人的关系交织、打散、再交织,徐老的黑猫,农村与城市,面子功夫与实干项目,“懂事”的政治套路,那个时代独有的“信仰”,等等。
有机会我会买成正版书收藏起来的,感谢作者以及让我想起这本书的刘小静。

跑步

提速跑过一次30min以内的5km之后,减慢速度开始尝试7min+/km的速度进行万米的尝试,也成功了。
这个月跑了很多,总里程50km左右。对于一个胖子,慢跑确实是一种很好的休闲方式,也能很好地消耗自己的卡路里。

学习与技术

太浮躁。
学swift的时候太过浮躁,不好好看书。一开始感觉swift跟canvas有点像吧,这还不分分钟上手,结果装逼被雷劈(所以这个月闲下来还是要继续)。
给项目排bug的时候,状态也不好。在技术方面的浮躁导致盲目自信,基础不稳定,很多东西没搞懂就直接上手,导致一些项目架构不合理。
十一月,好好做点该做的,看看什么结构才能够开发友好。
自己给自己想了很多坑没有去实现,很多想学的还没学。
还有好多书没看呢。
从之前很久一直拖到现在的一些事情,总归还是要尝试着去完成。


很多想说的但是却写不出什么东西。

有些话不要只是说说,有些话也只能够说说,有些话想要表达却不必说。还在路上,还在烦恼,尽人事,去特么的天命。