基于HEXO静态博客生成系统的站点建设

这一篇文章可以说是上一篇日志:静态网站系统的构建与思考具体实现
在经历了2009年至今的若干次网站迁徙和改版之后,三年前就对自己持有的域名作出了重新规划,原则就是只记录精品信息,一些生活中的琐碎由第三方SNS来消化(有响应群体更容易产生互动)。但是再琐碎也是生活的一部分,第三方平台在一次又一次的变化中,曾经的记录也随之流失。几经思考后,既不想丢失数据,又不想产生开销,所以寻求了一套免费建站方案,具体实施如下:
1. 域名
顶级域名基本就不要想了,如果不介意经常重新注册,可以考虑TK那一类的。最后我选择的是eu.org二级域名,这个后缀的域目前已经被Q,所以需要使用https访问模式,果断上cloudflare
2. 空间
免费的虚拟主机一搜一大片儿,根据以往经验,速度和性能简直惨不忍睹,而且动不动就被Q被封。所以要找就要找大企业下的免费方案,比如众多的PaaS,其中Github作为程序猿的地盘还是挺厚道的,就暂时用它好了。
3. 构架程序
空间已经是静态的了,那么程序就不可能是WP或者其他的PHP/ASP,找用户数量多的例如HEXO算是稳妥的选择。为了拉近和动态网站的差距,除去使用NEXT主题并采用第三方评论系统“多说”,又做了如下设置:
a) 修正feed中的相对路径
因为主要内容还是以图片居多,所以挂了一个专门放置图片的文件下在根目录下,在编辑日志时可以用相对路径插入图片(使用相对路径的好处是今后若是更换域名,站点文件不需做变动)。那么问题随之而来,在使用hexo-generator-feed产生feed后,其中的图片仍旧以相对路径出现,给之后使用IFTTT同步至blogger和facebook带来了不便,所以使用replace插件来修复feed。
先安装replace
npm install replace
新建一个rss.js文件

var replace = require(“replace”);
replace({
regex: “/p/”, //存放图片的相对路径
replacement: “http://domain/p/”, //存放图片的绝对路径
paths: [‘./public/atom.xml’], //feed文件所在路径
recursive: true,
silent: true,
});

最后每次生成完网站后,执行node rss.js即可。
为了调试和上传方便,分别写了两个脚本,完美滴实现了程序桌面化XDDDDDDDD

//debug.sh
hexo clean
hexo g
node rss.js
hexo s

//run.sh
hexo clean
hexo g
node rss.js
hexo d

b) 实现相册功能
因为有好多图片是存在在lofter的,所以先把图片下载下来。
新建一个lofterphoto.js

//依赖模块
var fs = require(‘fs’);
var request = require(“request”);
var cheerio = require(“cheerio”);
var mkdirp = require(‘mkdirp’);
var http = require(‘http’);
var urlparse = require(‘url’).parse;

//目标网址
var url = ‘http://xxxxxx.lofter.com/?page=’;

//本地存储目录
var dir = ‘./images’;

//创建目录
mkdirp(dir, function (err) {
if (err) {
console.log(err);
}
});

function sleep(milliSeconds) {
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + milliSeconds); }; //发送请求 var getFile = function (url, i, max) { if (i > max)return;
request(url + i, function (error, response, body) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(body);
$(‘.img img’).each(function () {
var src = $(this).attr(‘src’);
getDetailFile($(this).parent().attr(‘href’));
console.log(‘正在下载’ + src);
var name = src.match(‘[^=/]\\w*\\.jpg\\w*’)[0];
saveImg(src,dir, name);
// sleep(2000);
});
i++;
getFile(url,i,max);

}
});
};

var getDetailFile = function (url){
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(body);
$(‘.img img’).each(function () {
var src = $(this).attr(‘src’);
console.log(‘正在下载detail’ + src);
saveImg(src,dir, Math.floor(Math.random() * 100000) + src.substr(-4, 4));

});
}
});
}

function saveImg(url, dir,name){
sleep(500);
http.get(url, function(res){
res.setEncoding(‘binary’);
var data=”;
res.on(‘data’, function(chunk){
data+=chunk;
});
res.on(‘end’, function(){
fs.writeFile(dir + “/”+name, data, ‘binary’, function (err) {
if (err) throw err;
console.log(‘file saved ‘+name);
});
});
}).on(‘error’, function(e) {
console.log(‘error’+e)
});
}
var i = 1;
getFile(url, i, 100);

然后我为了省事儿,直接用了一个相册生成器VisualLightBox产生一个网页,将网页中的主体代码复制到HEXO下新建page的index.md文件里,重命名并删除原先产生的index.html文件,而后在CSS里找到定义DIV的那段代码,修改width为auto。这样页面就成了自适应的,无论在PC上还是手机上都能顺畅浏览。


至于如何搭建HEXO,如何部署到Github或者双部署,这里就不再赘述。

静态网站系统的构建与思考

静态网站,可以认为是网站构建的根本。 随着动态网站的出现,众多CMS程序已经十分全面的占据各大网站系统的后台。 基于Web标准,使得前端与后端分离化,数据与文件分开管理。由于这些好处,PHP+MySQL几乎横行了大部分的站点构架。然而,对于个人用户,或者小型企业而言,整站动态化是否真的必要?我认为,这是值得商榷的。

一般的静态网页,因为少了数据库的查询,对于所在服务器的要求大大降低,页面加载速度也就大幅度提升,用户体验度自然也就高,十分适合展示型或者更新频率较慢的网站。这两点要求,恰恰符合了个人博主与小型企业用户的需求。但问题在于,如果要构筑静态网站,那么会迫使非专业用户学会使用Dreamweaver等专业的建站程序,这无疑阻断了用户选择静态建站的道路。除此之外,诸如用户评论、RSS订阅、社区分享、访客统计等功能,在基本的静态站点中也是无法实现的。这一系列的问题,最终导致静态站点与整个互联网脱节,成为孤立的一个主体。

解决方法其实很简单,也是我目前尝试应用在企业站点中的手法,就是基于动态网站构架,静态化页面!原理很简单,因为在一个网站中,大部分东西都不需要实时更新的,比如网站名称,文章内容,页面介绍等。那么极端一些的方法就是,让所有的东西都不需要动态化,先整站静态化。当有内容更新时(比如新文章加入,新评论加入等操作),再进行一次静态化操作(或者只针对需要更新的页面做新的静态化处理)。这样一来,访客在打开页面时,SQL次数基本为0,但是使用者又可以在后台方便的实时更新,一举而两得。这个方法我定义为:由动至静。

那么反过来,由静至动是否可行呢?答案也是可以的,这必须归功于当下流行的静态网站生成器。原理就是在本地建立了一个网站模板,在本地写好日志后,通过批量化处理自动生成并更新所有的页面文件,最后想这些文件统一上传至服务器就完成了。与传统的静态网站构建方式相比,有两点不同:1.降低了更新文章的操作门槛,用记事本就能完成文章的添加,修改,删除。2.可以充分利用Web 2.0应用,将评论、订阅、分享、统计等功能托管在第三方服务。最终完成的站点效果,与“由动至静”法相差无几。

虽说相差无几,但毕竟还是略有些差异的:1.部分需要查询数据库的功能,比如搜索,无法在“由静至动”中实现。因为你无法预知用户会查询哪些关键词,故而无法实现准备好这些关键词对应的页面。2.“由静至动”法虽然降低了编辑的门槛,但大部分人更容易接受“由动至静”法的“所见即所得”。3.“由静至动”法的动态数据(如:评论)因为是托管在第三方服务器中,因而这部分内容可能会受制于第三方服务(能否数据导出与迁移等问题)。4.虽然两者在访客状态下都是静态网页形式,但“由静至动”法对于服务器要求远低于“由动至静”法,个人用户在考虑站点维护成本时应当有所考量。5.除此以外,在使用环境支持等方面,目前“由静至动”法只有极小众人群的用户,对于企业建站而言,依旧推荐使用主流方案,这对于数据的定期备份等均有保障。

总结一下,静态网站系统虽然目前并不适用于企业建站,但对于极小众的GEEK而言比较有趣味,可以探索与开发更好的用户界面。

2016春节尼泊尔归来感想

尼泊尔归来,总得说几句吧!

行程起因:
这条course,算得上是说走就走了。
起因是去年年中的时候,群里就已经开始约,但博士预答辩的日程未定,只能一拖再拖,始终没有给出确定答复。
直到12月底,数据分析柳暗花明,今年1月初确定了预答辩的时间,才立马下单机票,定于农历大年夜赶赴尼泊尔。

设计线路为:

上海-香港-加德满都-博卡拉-班迪布尔-纳加阔特-巴德岗-加德满都-香港-上海

实际线路为:

上海-香港-新德里-加德满都-博卡拉-班迪布尔-纳加阔特-巴德岗-加德满都-香港-上海

第一次的公务舱给了港龙:
很奇怪对不对?为毛陡然间多出了一个“新德里”?这里有个小插曲~
第一次乘坐港龙的灰机就选的商务舱(不是俺土豪,是真的订票的时候只有商务舱可选,而且是众多机票选择中最便宜的Orz…),没有想到就中了彩票遇上了延误(临检机械故障),原计划先抵达香港,再转机到加德满都,由于第一班航程的延误,第二班已然赶不上,只得改道先杀新德里(自行脑补整个机舱内都是阿三),再转去加德满都的路线。(哎,宝宝心里苦!)
guotai1
(国泰的商务舱比港龙好了至少1个级别呀~~)

落地签+免签证费:
其实在决定去尼泊尔之前,一开始是考虑去贝加尔湖的。无奈呀~护照一直随着人走,不能提前回国办理签证,再一查从日本办理俄罗斯签证的手续,各种坑~贼复杂。。。
而尼泊尔,是支持落地签的,到了加德满都办理签证时,工作人员翻了下护照,直接指示“中国人?去第一排~费用滴不要~”顿时赶脚尼泊尔人民好亲切!

雪山连峰:
全世界8000米海拔以上的高峰,一共有14座,其中半座在印度,3座在巴基斯坦,5座在我大天朝,剩下的5.5座就在尼泊尔。除去第一梯队的高峰,尼泊尔还拥有40多座海拔7000米以上的高峰,因而号称雪山王国一点都不为过~
8000mts
当在Pokhara看到了鱼尾峰(Machhapuchhre),在Nagarkot看到了喜马拉雅山脉,耳边总能回忆起那句经典”Why did you want to climb Mount Everest?” “Because it’s there” –George Mallory

在日本有一座长得和鱼尾峰很像的山,叫枪岳。和这座山头有关的故事那多得去辣~回头再写。插播一张菜大湿的图~
qiangyue
via 那一天,我也曾从枪尖上飞过!(FBinJapan)
为了凸显出雪山的圣洁,这次的后期,部分样片摒弃了远近空气法,采用黑白色加强。

观众是这样点评的:
wx1

星轨大片:
算上今回,第三次拍星轨啦~在魔都的时候全是光污染~放弃~
来到日本后第一次在河口湖畔,因为赶着酒店晚上10点关门,匆忙间就拍了1小时(拖影不够长!)

via 河口湖观富士山
第二次是在日光的泉眼,哎靠近地热,结果镜头起雾,白白在外头冻了后面那一小时。

via 日光新绿
这一次终于在Bandipur遂了心愿^^

人文情怀:
天气不好的时候,就去贫民窟,去巴德岗,去杜巴广场,去郊外的小镇,走走看看,体会一下尼泊尔人民的幸福感!在这样一个全民信教的国度,即便遇上去年这般灾难性的地震,也很难在他们的脸上看出对生活的失望与不满。

有木有文艺复兴时期那种油画的既视感丫?当你融入到尼泊尔的空气中,就发现这些人面对镜头时一点儿都不做作,按下快门的瞬间也极为自然啦~(直白点说就是偷拍^^)

尼泊尔大餐:
所谓的大餐,指的是“量大”!关键的关键每顿都是咖喱啊Orz…放个合集。。。你们体会一下?
nepalfood
最后那张点灯的,绝不是浪漫的烛光晚餐~是停电XDDDDD

与尼泊尔人民共舞:
绝对的私货!都是队友在表演,看视频就可以了,密码:sqdo

尼泊尔的五朵金花:
不得不说这是本次行程收获最大的部分啦!
在2/12那天清晨,清空万里,日照金山,画面太美。俺是凌晨3点就起床开始拍星轨了,见太阳初生,但雪山的主峰因为酒店位置的关系被挡住了,于是就在微信里提议杀回昨天的山顶观景台拍片儿!当咱们抵达观景台时,隐约有几个MM也在那里看景(赶着咔嚓,一开始没留意)。。。。等回过神来~发现崔哥不知何时施展了美男计~驾驭着他那台中画幅双反相机,对着MM们咔嚓咔嚓了。。。然后就说来合影吧~因为崔夫人在,崔哥自己不上,就叫我和老黄上。。。懂
nbeml
这张是与尼泊尔五朵金花的合影~从左到右,分别是Chandika Ghimire,Luna Lim Samsohang,Shrijana Shrestha,Priyanka Shrestha,和Pramisha Bajracharya
当然这不是重点,下面放出的才是硬货~
piku
其实合影的时候,俺就是群众演员跑龙套呀~崔哥说怎么摆咱就怎么摆~老黄的手放哪儿俺也跟着放哪儿~
当时Priyanka Shrestha留下了联系方式,然后就看到了这个。。。(吓屎本宝宝了!!!)
fbpiku
翻译:Purwanchal小姐 和 Bhedetar旅游大使。解释一下,啥叫Miss Purwanchal,俺也是抄维基的~

The Miss Purwanchal pageant (also known as The Miss Eastern pageant) is a beauty pageant that started in 2010, for several eastern developmentmental regions in Nepal. The regions are Sagarmatha, Koshi and Mechi. The pageant was formed to bring the communities together to reflect on the culture, beauty, and traditions of rural Nepal.

简单说就是尼泊尔东部地区的一个选美大赛,获胜者直接推荐进入评选下一年度的尼泊尔小姐,并且直接进四强。名人丫~咱和名人的合影史再也不是空白啦!感动地哗哗哗55555555555
但,大湿是这样点评的…………
wx2ml

大片合集地址:
最后,整理一下本次尼泊尔出行的大片地址
帕坦与加德满都杜巴广场
桑冉库特-鱼尾峰
博卡拉的寺庙与孩童
费瓦湖
班迪布尔的黄昏与星空
喜马拉雅连峰
巴德岗的杜巴广场
猴庙
崩嘎玛迪村和苦卡纳村

结束语

弟子问佛,世间最珍贵的是否为"已失去"和"得不到"。 佛不语。数年过去弟子垂暮,见佛,说:我知道了,世间最珍贵的是"正拥有"!

© 2016 杜少卿记事录 | Do! Blog

Up ↑