主页

日志 - Node实战

express模块简单集成了一个日志模块morgan,可以将请求的一些消息打印在后台终端上,然而在实际的生产系统中,我们通常需要更完备的日志功能,以便供运维人员定期查看。

这里简单介绍winston模块的引入,实现最简单的日志写入文件功能,首先项目中安装模块,如下命令:

npm install --save express-winston
npm install --save winston

然后在项目app.js文件中引入对应的模块,如下代码所示:

var winston = require('winston');
var expressWinston = require('express-winston');
// 正常请求的日志
app.use(expressWinston.logger({
  transports: [
    new (winston.transports.Console)({
        json: true,
        colorize: true
    }),
    new winston.transports.File({
      filename: 'logs/success.log'
    })
  ]
}));
// 正常访问路由
routes(app);
// 错误请求的日志
app.use(expressWinston.errorLogger({
  transports: [
    new winston.transports.Console({
        json: true,
        colorize: true
    }),
    new winston.transports.File({
      filename: 'logs/error.log'
    })
  ]
}));

日志文件分为success.logerror.log,放在正常路由之前则为成功日志,放在正常访问路由之后,则为错误日志。如不需过多功能,这样放进项目里即可,详细了解可查看官方文档: winstonjs/winston: A logger for just about everything.

阅读更多

给自己做一个SWOT分析

最近一段时间在给领导写年终总结报告,领导要求要用《SWOT分析法》来描述这一年的工作不足以及改善对策。

以前写这块内容的时候,我通常都是使用列举法,将内容一条条的列出来,然后针对每个问题,做简单介绍以及改善对策,down个模板,填下内容,整齐的排列出来,看起来还算不错。

在听领导说到要用SWOT的分析法来写这块内容的时候,起初我是抵触的,又得改报告,好不容易憋出来的内容以及花大量时间调整的格式,又付之一炬了。

反正,这一页得重写了。于是花了点时间,简单了解了一下什么是SWOT分析法,然后将大致的内容通过这种分析方法填补进去,顿时感觉内容不仅逻辑清晰了,也似乎显得有意义了。

什么是SWOT?

SWOT分析法(也称TOWS分析法、道斯矩阵)即态势分析法,20世纪80年代初由美国旧金山大学的管理学教授韦里克提出,经常被用于企业战略制定竞争对手分析等场合。

这是MBA的一种方法论,以前对方法论这种东西总是不屑一顾,总觉得似乎有些空大,没什么实际作用。这很有可能是因为自己站的高度不够,很多问题的分析还压根用不上什么方法论这些高端的概念。但是简单了解一下,总归是好的。

S代表优势(Strengths),W代表劣势(Weaknesses),O代表机会(Opportunities),T代表威胁(Threats)或风险。优劣势分析主要是着眼于企业自身的实力及其与竞争对手的比较,而机会和威胁分析将注意力放在外部环境的变化及对企业的可能影响上 。在分析时,应把所有的内部因素集中在一起,然后用外部的力量来对这些因素进行评估。

那么知道了这个方法论的关键点,再设身处地的思考一下,不足分析与改善。你所分析的问题内部因素有哪些(优势和劣势)?外部因素又有哪些(机会和风险)?画出象限图如下:

再把之前列举的那些123456内容往象限图里一套,你会发现内容从简单的列表顿时上升的一个高度,从象限图中能看出一些逻辑。但还是没有达到分析的效果,接下来的内容才是这个方法论最关键的地方。

我们已经列出了优势,劣势,机会以及风险,那么接下来的问题就是如何去应对,制定出实际可实施的战略,这个才是最精彩的地方。我们将4个象限拓展,变成8个象限,如下图所示:

针对优势和机会,我们要如何利用?这是SO战略;针对劣势和机会,我们要怎么改进?这是WO战略;针对优势和风险,我们要如何管控?这是ST战略;针对劣势和风险,我们要如何消除?这是WT战略。

当你填完表格后,对于你要分析的问题将会有个非常清晰的思路。本来很乱的一些想法,似乎感觉明朗了。这可能就是方法论的作用吧。以下是网上的一个小例子。

来分析一下自己吧

SWOT分析法通常用于企业战略制定以及竞争对手分析,但是我觉得用这种方法来分析一下自己也是可行的。因为通常情况下,你并非很了解你自己,通过这个方式可以客观的认识一下自己。

这里就以我自己为例,使用SWOT分析法对自己再做一个客观全面的了解,分析如下:

同样,当你在做一些问题分析的时候,尝试一下SWOT分析法。没准会产生一些惊喜哦。

参考文档:

阅读更多

Bootstrap-Table初使用

温故而知新。学习使用Bootstrap Table已经完整的完成了一个项目,这里还是简单对Bootstrap-Table的使用做一个简单的介绍以及实例的演示。

什么是Bootstrap Table,自行查看官网介绍。刚接触可能一头雾水,建议直接从官方文档的开始使用开始看,后面再看一些例子,最后详细读文档部分,学习使用它,自定义一些自己想要实现的功能。

最开始使用Bootstrap Table的原因是做后台数据管理使用。后台的一些业务数据习惯通过表格的形式展现出来,以便于做一些增删改查的操作。如果有一个通用的模块直接能在前台渲染出表格,服务器端只需要传输基础数据就可以了,那就太方便了。于是就找到了Bootstrap Table

1. 引入文件

首先要引入Bootstrap Table的相关文件,下载源码引入或者直接引入CDNJS提供的外链地址,不过建议还是下载源码,源码文件结构如下:

bootstrap-table/
├── dist/
│   ├── extensions/
│   ├── locale/
│   ├── bootstrap-table.css
│   └── bootstrap-table.js
├── docs/
└── src/
    ├── extensions/
    ├── locale/
    ├── bootstrap-table.css
    └── bootstrap-table.js

引入dist目录下的bootstrap-table.css以及bootstrap-table.js,如果使用中文,还要应用locale/bootstrap-table-zh-CN.js注意每个文件均提供了min版本以及正常版本,建议在开发测试阶段引入正常版本,便于调试。

当然最后不要忘了引入bootstrap以及jQuery的文件。最后在页面head部分引入css文件如下:

<link rel="stylesheet" href="/bootstrap/dist/css/bootstrap.css">
<link rel="stylesheet" href="/bootstrap-table/dist/bootstrap-table.css">

在页面body最后引入js文件如下:(注意:1. 顺序不要乱;2. 根目录依据自己项目而定)

<script src="/jquery/dist/jquery.js"></script>
<script src="/bootstrap/dist/js/bootstrap.js"></script>
<script src="/bootstrap-table/dist/bootstrap-table.js"></script>
<script src="/bootstrap-table/dist/locale/bootstrap-table-zh-CN.js"></script>

2. 使用方式介绍

根据官方文档介绍,使用方式有两种,一种:通过 data 属性的方式;另一种:通过 JavaScript 的方式。说白了就是把控制代码写在HTML里还是写在JS里。在实际项目的开发中,大多数是将控制代码写入JS里,这样更方便灵活,数据通过ajax异步请求的方式获取,数据格式为json。所以下面我就介绍最后这一种的实现方式。也就是官方提供的这段示例代码:

$('#table').bootstrapTable({
    url: 'data1.json',
    columns: [{
        field: 'id',
        title: 'Item ID'
    }, {
        field: 'name',
        title: 'Item Name'
    }, {
        field: 'price',
        title: 'Item Price'
    }, ]
});

3. 具体功能具体分析

官方文档的开始使用部分基本上就上面那些内容。接下来就是文档部分了,该部分详细的讲解了Bootstrap table每个参数每个方法事件的使用。

这里我不准备按照官方参数说明一个一个来叙述,那样没有什么效果,因为官方文档已经做了简要介绍,再啰嗦一遍不会用还是不会用。所以这里以我项目里实际的例子来叙述,后台使用的是Node.js作为服务端。

3.1 请求获取json数据

前面说了使用Bootstrap table有两种方式,一种是把代码写在html里,一种是把代码写在js里。这里的示例都是采用第二种方式(下面就不再贴出HTML的代码里)。HTML里的代码就这么一行,如下:

<table id="table"></table>

table的数据都是从后台异步获取,这也是最常用的一种方式,通常在项目开发中,数据基本上是来自后台。下面看一段js代码:

$('#table').bootstrapTable({
      url: '/admin/staff/ajax/table',
      height: 550,
      toolbar: '#toolbar',
      search: true,
      showRefresh: true,
      showExport: true,
      ajaxOptions: {global: false},
      pagination: true,
      sidePagination: 'client',
      pageNumber: 1,
      pageSize: 10,
      pageList: '[10, 20, 50, ALL]',
      sortOrder: 'desc',
      sortName: 'uid',
      columns: [{
        field: 'uid',
        title: 'id',
        visible: false
      }, {
        field: 'userid',
        title: '员工号'
      }, {
        field: 'username',
        title: '姓名'
      }, {
        field: 'department',
        title: '部门'
      }, {
        field: 'office',
        title: '科室'
      }, {
        field: 'produce',
        title: '工序'
      }, {
        field: 'team',
        title: '班组'
      }, {
        field: 'operate',
        title: '操作',
        align: 'center',
        valign: 'middle',
        events: operateEvents,
        formatter: operateFormatter
      }]
    });

上面是我一个练手项目的实际代码,功能是对员工信息的一个处理。官方文档里分为表格参数和列参数。上面代码中例如url,height等是表格参数,其中表格参数columns的值是一个数组,数组里每个元素都是一个对象,对象里的一些参数属于列参数。具体参数有哪些,大致功能是什么查看文档即可。

其中url表格参数定义的是异步请求的地址,例如上面/admin/staff/ajax/table意思就是要从这个地址来获取表格所需要的json数据。那么现在来看看后台取到的数据格式。由于后台使用Node,那么又是一段js代码如下:

// 人员管理-ajax返回bootstrap-table数据
router.get('/admin/staff/ajax/table', function (req, res, next) {
  var adminid = req.session.adminInfo.adminid;
  dbSelect.getUsersByAdminNoPage(adminid, function (err, rows, fields) {
    if (!err) {
      res.json(rows);
    } else {
      errHandle(res, 'db return err', err);
    }
  });
});

后台代码可以不用太关心,因为不同的编程语言后台实现是不一样的。直接看下返回的数据格式:

[{
    "uid": 181,
    "userid": "1000000",
    "username": "赵彦飞",
    "department": "Cell制造部",
    "office": "Cell检测科",
    "produce": "Q Boxing",
    "team": "A"
},{
    "uid": 257,
    "userid": "盛雪增",
    "username": "1820",
    "department": "Cell制造部",
    "office": "Cell检测科",
    "produce": "Q Boxing",
    "team": "A"
}]

返回的数据是个数组,每一个对象对应一行数据,字段名对应列参数里的field,都匹配上了,那么数据就能显示出来。最终效果如下:

3.2 操作功能(修改&删除)

可能你会发现,列参数里最后一列的操作是从哪里来的,返回的json里并不存在这个数据,点击之后需要有一些数据处理的操作。弄明白这个需要了解eventsformatter两个列参数的用法。

formatter是格式化表格数据的一个参数,返回一个function,还是上面那个表格,定义一个operateFormatter函数,如下:

function operateFormatter(value, row, index) {
    return [
      '<a class="op" href="javascript:void(0)" title="修改">',
      '<i class="glyphicon glyphicon-pencil text-primary"></i></a>  ',
      '<a class="op" href="javascript:void(0)" title="删除">',
      '<i class="glyphicon glyphicon-trash text-danger"></i></a>'
    ].join('');
  }

当然你可以把函数直接写在列参数下。函数的意思就是直接返回两个链接当作operate这个field的值。有了样式,那么点击动作同样需要定义,那么参数events就起作用了,代码如下:

window.operateEvents = {
    'click [title=修改]': function (e, value, row, index) {
      alert('编辑功能暂不开放');
    },
    'click [title=删除]': function (e, value, row, index) {
      $('#delModal').modal('show');
      clickId = row.uid;
    }
  };

3.3 分页功能

当表格数据比较多时,那么就会用到分页的功能,分页分为前台分页和后台分页。什么是前台分页?什么是后台分页?前台分页指的是一次性加载全部的数据到客户端,然后进行分页;后台分页指的是分页请求服务器资源。这两种分页方式各有利弊,不多介绍,这里给个参考值,数据量不上万,建议使用前台分页,一次性加载完毕,其他操作就是前台处理了。

确定使用什么类型分类首先定义表格参数sidePagination,不设置的话,默认值是client,也就是前台分页模式;如果设置为server就是后台分页模式。

我自己写的项目里目前均是通过前台分页的模式来实现的,最初的考虑是前台一次性加载所需的数据保存在浏览器端更便于前台的一些操作,翻页和浏览的过程中也无需再向服务器端请求了。这种方式实现起来,后台以及数据库请求的代码逻辑较简单。

pageNumber: 1,
pageSize: 10,
pageList: '[10, 20, 50, ALL]',
pagination: true,
paginationLoopz: true

这些表格参数是控制分页的,详情翻翻文档,不难理解,显示出来的样式如下图:

3.4 自动分页功能

分页很简单,样式功能基本上都定义好了,只要使用对应的表格参数即可。那么如何让它自动翻页呢?因为在做这个项目的时候,接到一个前台需求,那就是表格数据直接放在大厅屏幕上,上面的数据需要轮回的滚动,这样就没有了人去点击下一页了。

表格数据怎么自动滚动呢?如果把人为去点的动作,直接设置成自动点击就可以了。于是写个function如下:

// 定时翻页
function changePage(){
    $pageNext.click();
}
setInterval('changePage()', 1000*3);

改变页面,用JQuery定义下一页按钮,每隔3秒执行一下click函数就可以了。还有一个问题就是我们要在表格加载完成之后,才能去定义$pageNext这个元素,所以还要使用一个表格事件才能生效,如下代码:

$table.on('post-body.bs.table',function(){
    $pageNext = $('.page-next');
});

post-body.bs.table这个事件就是渲染完成之后触发的(Fires after the table body is rendered and available in the DOM),这个时候再合适不过了。

3.5 数据预处理自定义

数据预处理指的是在从服务器处取得原始数据后,我们提前先进行加工处理,然后渲染到前台table中。我自己最常用的一个功能就是给数据添加编号,就像每次在Excel中总是喜欢在最前面一列加上编号1,2,3,4,5…

这里就用这个例子来展示一下实现方式,数据预处理我们要用到responseHandler这个表格参数。

responseHandler: function(res) {
    for (var i = 0; i < res.length; i++) {
        res[i].rid = i + 1;
    }
    return res;
},

输入一个参数res,也就是服务器返回的那个对象,处理完后也返回res这个对象,通常情况下,res是个数组,数组元素是对象,所以上面代码就是在每个数组中每个对象的前面加上一个字段rid,rid从1开始累加,就是编号了。 如下图所示:

3.6 表格数据自定义

看到上图表格,优先级字段那块显示的1234,是不是觉得还挺酷的,怎么实现的呢?从上面了解的情况,我们知道,表格的数据都是来源于后台的数据表,而数据表中存储的都是原始数据,是不带样式的,而表格中如果想要显示一些带样式的数据,需要用到列参数的formatter参数。

优先级这块,后台直接储存的是[重要紧急,重要不紧急,不重要紧急,不重要不紧急] 四类,而这里我用1,2,3,4来替代了。使用formatter参数如下代码:

formatter: function(value, row, index) {
    var msg = '';
    switch (value) {
        case '重要紧急':
            msg = '<lable class="label label-danger" title="' + value + '">1</lable>';
            break;
        case '重要不紧急':
            msg = '<lable class="label label-primary" title="' + value + '">2</lable>';
            break;
        case '不重要紧急':
            msg = '<lable class="label label-warning" title="' + value + '">3</lable>';
            break;
        case '不重要不紧急':
            msg = '<lable class="label label-success" title="' + value + '">4</lable>';
            break;
    }
    return msg;
}

注意这是列参数,而非表格参数,每一列都可以使用它自定义显示样式。

3.7 详细展开功能

上面介绍了表格数据自定义功能,它是一个列参数,可以表格数据的样式。这里介绍一个表格参数,针对整个表格有效的格式化功能。如下图所示,每一列前面都有个加号用来展开详细信息。

那就是参数detailViewdetailFormatter的作用,简单设置这两个参数如下所示:

detailView: true,
detailFormatter: function () {
    return 'somethings';
},

很好理解,第一个参数打开详细展开视图,也就是前面会多一个加号;第二个参数是格式化详细展开的内容,这里返回somethings字符串,那么每一行点开都是显示somethings的字样,如下图所示:

大概了解了这块功能,现在我们实现一个实际的需求。如果后台要显示的字段很多,全部在前台表格中显示会显得太拥挤,也没有主次,于是可以考虑将一部分次要内容放在详细展开这里显示,比如一些备注信息等等。

参考:

阅读更多

我的2017总结

个人对我的2017年总体不太满意,本来想放弃去写这样的一篇总结,但是看到别人都在总结,觉得不管得失,总结一下总归是好的,所以还是挣扎着写完了。

生活:

生活看似不平凡,实则没有多大的惊喜。看似不平凡的是,这一年我买车买房了。1月份的时候买了车,结束了班车地铁的通勤生活,走上了每周定期办理进京证的日子。买车给生活带来便利的同时,也带来了一些负面因素,每况愈下的通勤交通让我不再有耐心,浮躁了不少。

年中考虑买房,从看第一套房到签约,总共不超过两周时间。就这么快的定了,并不是手上的钱够了,而是觉得北京房地产这个时间正适合,担心再不入手,怕以后没有机会了。时间刚好这么巧,2018年1月正式开始还贷,2018是我的房奴元年。

这一年虽然搞定了房子车子,但是这些事情都是: 时间到了,自然就有了,并没有多大的意外和惊喜。希望2018年能主动创造一些惊喜。

工作:

工作上看似取得一些成就,实则内心很矛盾。这一年我升职了,而且升职的跨度似乎有点大,公司换了,工作地点换了,工作内容换了,甚至是工作思维都给换了,俗称被「洗脑」了。与其用「换」字,倒不如用「颠覆」一词可能更合适点。

各种不适应随之而来,从最开始听到要升职消息时的忐忑不安,到激动,到换工作的新鲜,再到对新工作内容的热情,到自豪,再到思维理念不一致的反感,到抵触,到冷漠,最后到现在的归于平静。这个过程走得却是有些艰辛,甚至是痛苦。

有时我会想,甚至给自己标榜「工作中,如果你在一段时间内觉得很不适应,累,烦躁,那么,坚持住,坚持过去了,你就成长了。相反,如果有一段时间,工作特别轻松,没什么挑战,那么,你该注意了,自己是不是处在混吃等死的状态。」,而现在我想补充一点「如果长期处在烦躁的状态,那么应该考虑一下合适不合适的问题了」。直到现在,我依然不是很确定,这次升职给我带来的影响是否是正向的。这个问题的答案通常要等到多年以后才能知晓,但到那时可能就有些晚了。

学习:

在学习方面,2017年可算是悲惨至极,没读几本书,没学什么技术,也没写几篇文章。相比2016年,2017可以说是完败。这也是为什么我对自己的2017非常不满意的原因。如果工作和生活方面都算是加分项的话,那么学习方面一下就把分数拉到了负数。

出现这种情况,跟上述生活&工作发生的变化有着密切的关系。我也抱怨过《你有计算过你的通勤成本吗?》,同时,我也有自我鼓励过《再坚持一下就好了》,坚持的内容不算特别成功,但也没有宣告失败。

这个方向关键的地方还是在自己,趁自己还未到中年,尽量多蓄劲,好一举越过中年危机。

总结:

有房有车又如何 还是被生活所追赶 迫不得已的过着 升职了又如何 却是被工作所安排 盲目的适应着 埋怨生活的压力又如何 该做的事情还是得去做 何不开开心心的 抱怨工作的烦恼又如何 该是你的活还是你的活 何不尽快的搞定它 倒是自身的问题不容忽视 学习绝对不能放弃 只有自身不断的提高 才能尽快摆脱生活&工作中的困境

2018年计划:

  • 一次远程旅行,给生活添点乐趣;
  • 一次心里救赎,好好想想自己真正想要的;
  • 一门引以为傲的「手艺」,专注的学点东西;

阅读更多

Access denied for user 'xxx'@'localhost' 报错

Unhandled rejection SequelizeAccessDeniedError: Access denied for user 'lupeng'@'localhost' (using password: YES)

这是Node在使用Sequlize连接Mysql数据时报的错,关键看冒号后面的错误:访问拒绝,关键是访问拒绝的错误,说明数据库连接这里有问题,数据库连接访问拒绝,要么是没有相应的操作权限,要么是账号密码错误。

这样就把问题定位在访问权限以及账号密码错误两点上了,千万不要往其他方面去找问题了,那样只会是浪费时间。

1. 用户权限的问题

权限问题从数据库着手,确认用户授权后,是否刷新的权限列表。也就是在使用Grant命令授权用户后,应该要使用flush privileges命令,这个是很多人会忽略的问题。

如果用户授权没有问题,那么尝试重启mysql服务器。使用命令/etc/init.d/mysql restart重启mysql服务器,不同Linux版本重启命令可能不一样,我这里是Debain系。

如果重启了问题还没有解决,那么可能就不是数据库用户权限的问题了。

2. 账号密码的问题

账号密码错误,这个问题听起来很扯,但是开发过程中,很多人会忽略掉。为什么这么说?我使用的是config-lite模块来配置数据库参数,因为会在多个系统环境中切换开发,使用config-lite模块可以通过简单的环境变量配置,来加载不同的参数文件。具体用法参照:不同环境下配置文件使用 - Node实战 - 技术人生 - SegmentFault

我的问题就出现在这里,打开一个终端运行项目npm run testpackage.json文件里配置着test的运行脚本NODE_ENV=test supervisor --harmony -i views/ ./bin/www。另打开一个终端,运行数据库同步的命令,同步命令是单独写在一个js脚本中,脚本里引用了数据连接方法(通用的),连接方法如下:

var Sequelize = require('sequelize');
// 引入数据库配置文件
var sqlConfig = require('config-lite')(__dirname).mysql;
var sequelize = new Sequelize(sqlConfig.database, sqlConfig.user, sqlConfig.password, {
    host: sqlConfig.host,
    dialect: 'mysql',
    pool: {
        max: 10,
        min: 0,
        idle: 10000
    }
});
module.exports = sequelize;

于是在同步数据库的时候,总是如标题报错,然而觉得没错啊,最后检查才发现问题所在:运行test脚本里的NODE_ENV环境变量只在当前终端下才有效,如果要另开一个终端来同步数据库,那么需要在另开的终端里再设置一下环境变量。不然加载的数据库参数是不一致的,也就是说连接数据库的用户名密码是不对的。

阅读更多

博客时代虽已没落,但内容创作永远不会过时

有人说,别写了,博客时代早就过去了,现在谁还看博客呀,没错,现在确实很少有人再订阅博客来获取资讯了,如今是移动互联网时代,使用电脑订阅资讯的时代一去不复返,但是过时的仅仅只是内容产生的一种方式,更多的方式正在诞生来取代博客。

永远不会过时的是内容创作。

「1」最简单的方式: 直接使用第三方平台

在这个互联网的广阔地域中,我想有一间属于自己的房间,在上面放一些我的「思绪」,「记忆」亦或是「情感」。这类平台有很多,并且基本上涵盖所有的领域。比如博客园 - 开发者的网上家园简书 - 创作你的创作LOFTER(乐乎) - 让兴趣,更有趣SegmentFault,甚至是微博,知乎,豆瓣,汽车之家等等站点基本上都是带有博客属性的。或分享技术,或分享人生经验,或分享书评,影评,车评……

拥有这类博客的方式非常简单,注册对应的账号即可,然后你就可以开始做内容的产出了,坚持下去没准你就成为了某个平台的网红。可是这么多的站点都带有博客属性,我该如何选择呢?其实很简单,平时你在网上搜索文章资讯的时候,你看得比较多的内容产生自哪个平台,那么你就去对应的平台开通博客即可。

这类平台的内容都有很强的用户属性,比如技术人员可能更愿意在CSDN上发表文章,而不会去LOFTER上发表。在功能上都会有各自的一些特点,你可以结合你的需求进行选择,或是拥有多个博客都不是问题,我个人比较喜欢简书上的专题功能,可以创建特定领域的专题,作为版主,你可以收集别人的文章,也可以接受别人的投稿,聚类一些相似主题的文章。

「2」略显极客的方式: 使用Git第三方服务

使用Git服务来搭建一个博客,最开始可能是源于GitHub 上为一些开源项目提供的GitHub Pages服务,它的初衷是为了帮助开发者创建页面来宣传开源项目的。将页面内容push到github的仓库上,就可以通过github提供的域名进行访问了。

官方甚至提供了对Jekyll的支持让你更快捷的搭建页面,什么是Jekyll?Jekyll是一种能够快速将纯文本转化为静态网站和博客的工具,具体的看官方介绍,不多赘述了。Jekyll • 简单的博客、静态网站工具。然而官方提供的这个功能却被大家普遍「滥用」了,大家都用来搭建自己的静态博客网站了。除了Github,还有国内的coding同样也提供这样的服务。

这种使用Git服务的博客方式与上面第三方平台有什么不同呢?为什么称作是略显极客的方式?因为通过它,你完全可以拥有一个完全自由的页面,页面上的所有元素完全由你来定义(需要前端开发技能),还有略显极客的一点就是,你可以通过自己的域名来访问,在这一点上第一种方式可就无法实现了。

这种方式的本质上就是将你创建的静态页面映射出来。利用github和Coding提供的这么一个功能,于是基于Hexo的各式各样的博客站点就诞生了,什么是Hexo呢?Hexo是一个静态页面生成的工具,主要功能就是将Markdown文档转换成静态页面,它不同于Jekyll的最大特色就是博客主题功能的抽象,使用Hexo可以非常方便的制作或是更换博客主题,基于这个特性,你甚至不需要任何的前端开发技能,就可以拥有非常耀眼的博客,并且可以随时切换主题。

于是很多最开始为了博客而使用Hexo的人都去从事页面设计了,我也是其中一个,很长一段时间在做前端页面设计的事情,因为找到一个完全符合自己「品味」的主题没有那么容易,于是修改页面就开始了,随着品味的变化,很不容易设计好的一个页面,没多长时间就看腻了,那么再重来一遍,渐渐都忘了,当初是为了做前端页面设计,还是为了写文章而搭建的博客。

「不要因为走得太远,就忘了当初为什么而出发」,一直很喜欢锤子便签图标上的这句话。

「3」自由极客的方式: 使用自有服务

自由极客通常都喜欢对事物完全的控制,享受一切掌握在自己手中的感觉。就算搭建一个小小的博客也不例外,首先需要一台独立的服务器,拥有对外独立的IP地址,在任何有网络的地方都可以随时访问服务器,做任何不受束缚的更改。

如果把博客当作是一间房间的话,前面所述的第一种方式,利用第三方平台就类似于你租了一间房间,你只有使用权,里面的布局只能按别人给你布置的方式来,有些房东还算开放的话,也许还能让你调调布局啥的,例如博客园等;第二种略显极客的方式就类似于你购买了一套房子,房子里房间的布局你可以随意控制,但是房子的大小是固定的,你无法随心所欲的摆布;而第三种自由极客的方式,就类似于你购置了一块地,你想盖成怎么样的房子,拥有怎样的房间,完全取决于你。你可以盖一栋楼,也可以盖成两栋小的都无所谓,我甚至可以盖其他建筑,例如建个仓库(数据库),建堵墙(代理服务器)用来「翻越长城」。

自由极客的方式的优点就是自由,想要什么网站什么服务都可以实现,更别说区区一个博客了。那么缺点就是你需要有足够的能力,需要时间成本,金钱成本。我相信大部分人购买服务器都不会仅仅为了搭个博客,这有点大材小用了。当然也会有这样的极客存在,可能仅仅只是为了满足完全的控制欲。

自有服务器的开源博客系统,最火的可能就是WordPress了,这也是很多人初学Linux服务器运维的练手项目,想当年自己在虚拟机上为了搭建这么个LMAP环境,对着教程都花了一天的时间,过程中总是会出现各种各样的问题,正所谓「无折腾,不Linux」。

「4」最热门的方式: 微信公众账号

文章最开始的时候就说过,博客时代的没落,并不代表内容产出的没落,写作永远不会过时,即使是人工智能时代的到来,也绝对取代不了人类对于文学、艺术以及思想的创作,因为这些是个性化的,是意识与思想的一种表达,机器是取代不了的。

所以说,过时的只是内容产出的一种方式,在信息时代,最初有社交属性的实现方式应该是论坛,随着内容的细分与聚焦,进而有了个人博客这个载体,再到后来信息爆炸时代,微博取代了博客,直到现在,成为了微信的时代。微信几乎取代了我们社交的方方面面,即时通讯,资讯获取,个性化推荐等等。正是由于微信时代的到来,自媒体这个词才得以膨胀式发展。

只要你想去写,宣泄情感也好,表达观点也罢,那么就去开通微信公众账号吧,没有任何技术门槛,就能拥有当前最热门的「博客」方式,唯一的门槛可能就是你是否有坚持写下去的动力。

「完」

阅读更多

观展览的一点拙见

周末有空去了趟市里,赶在“砥砺奋进的五年”展览的最后一段时间,参观了国家展览馆。对于我个人来说,其实是不太喜欢参观这样类似的展馆,因为看到的都是片面的成就,过于夸大的成果让人有种目眩的感觉,而背后所存在的问题我们并不知道,无法对实际问题的解决产生任何的帮助。

但其实展览也是非常有必要的,最起码能给予人乐观向上的态度以及积极乐观的心态,很多时候,乐观的心态比任何实际问题的解决,从改善整体的角度,会更加的有效。

公司的展览也参加过不少,有时会发现,甚至是不敢相信,原来自己所实际接触的那些“不堪入目”的内容,也是可以展示得这么靓丽。这样就会产生两种看法:一是,积极向上型,这种看法的人被展台光环所笼罩,原来我们的工作是如此的重要,两眼发光的看着这些展台内容,一种荣誉感,自豪感油然而生。另一种看法是黯然神伤型,这种看法的人会认为这些光鲜的外表内藏着太多的不为认知的艰辛或是问题,把片面的成果展示给别人看,其实就是一种隐藏和欺骗。

当然还会有最后一类大众看法:那就是无感型,映入眼前的震撼或是背后的问题都不会对你内心产生太大的波澜,生活本是如此,怎么着还是一样过。

下面简单看下国家展览馆的风采,给人直接的感官还是很震撼的。

入口

共享单车:ofo和摩拜

高铁&核电

计算机

东方红&核试验堆

阅读更多

科技与艺术结合 - 旧电子设备最好的归宿

苹果的产品一直是科技与艺术结合最好的代名词。

iPod touch 4 是我见过的最精致的音乐播放器,没有之一,别说在2010那个年代了,就算是放眼现在,它的工业设计也毫不逊色。

当然再精致的产品也有淘汰的一天,信息时代下的产品迭代也快,iPod touch 4在2013年的时候就已经停产了,而随着时间不断向前推移,它也就渐渐被人们所遗忘,我想大部分人手中的iPod touch4 都已经在抽屉里堆灰了。

与其被回收50块钱都不值,还不如加上50块钱做成「艺术品」让它一直留在我们的心中。

很多事情都是头脑一热,然后就去做,这个想法从脑海中冒出直到完工,前后正好5天,其中4天是在等快递,该死的双12。

电脑倒是拆过不少,这么精细的电子设备还是头一回拆,想着反正也是装裱,也就不用管他的完整性了,尽可能多拆出些零件,装裱的时候会更好看些。

下面是拆解图展示,先撬开前后面板,拔下屏幕接口,

然后拧掉所有的螺丝,拿下屏蔽版,再接着拿下音频接口、电池以及一系列小零件,例如前摄像头,天线等,

拆完之后,找一张白纸摆出你想要的造型,

最后在相册纸板上用502或是双面胶贴上所有的零件,包括小螺丝。

通过排版设计,最后的成品看起来还是不错的,人生第一件手工艺术品诞生了,摆在书桌还是挺高大上的。

阅读更多

莫名的罪恶感

周末小记

这个周末,两天的时间,表面看来办了很多事情,可是在我看来,无所事是,一事无成,有一种深深的罪恶感在我的心里,让我闷闷不乐。

从上学时候开始最喜欢的就是星期六,结束了一周的学习,不用为下周的事担忧。直到现在上班了,也还是这样,最喜欢的是周六的感觉,一觉睡到了9点半,准备两杯牛奶,若干面包,早餐就这样对付过去了,收拾完自己,收拾收拾家里就到中午饭时间,周六的中午饭从来就不会在家里准备,因为什么食材也没有。

这周周六去食堂吃了点饭,下午去电影院看了个电影,自从上次8月份看过«战狼2»之后就很久没再去过了,这次恰巧又遇到一个高分电影«寻梦环游记»,第一次在电影院看电影感动到流泪,迪士尼&皮克斯的动画电影真是不能错过,3D效果就算了,弄成3D倒成了减分项,没啥效果还得带个眼镜,难受。

看完电影就下午4点多了,顺道去超市买点菜,然后回来尝试做了个红烧排骨,感觉还不错,起码都吃完了。吃完晚饭日常堕落就开始了,我都记不太清乱七八糟看了些啥玩意,反正往那一瘫,播放啥看啥。其实这个时间我应该做点有意义的事来着,然而并没有,完全被自己安于舒适的意识打败了。

第二天周日一大早起来,驱车前往4s店做保养,今年1月底买的车,到现在已经两万多公里了,可能属于中高度用车「患者」了吧。花了1千多的中保,让我感叹贵的同时,也觉得有钱真好,消费高的地方服务就是好,吃饭喝茶打游戏随便耍。在4s店试坐了几款新车,吃了个中午饭,玩了几把植物大战僵尸的时间基本上保养就结束了。回到家里就下午两点了,接下来的时间又开始堕落了,这个时候其实我是可以进图书馆待会的,但是又被自己安于舒适的意识打败了「都忙了一上午了,怪累的,回家歇会吧」,这一歇息就到晚饭时间了,简单下个厨,吃完饭收拾一下晚上七点多了,这会其实我也是可以找个安静的地方听会教程,写篇感想文章啥的,然而还是被现实打败了,又看了一些乱七八糟的玩意,就到了晚上9点了。

一想起明天就要上班了,再想想周末一件想做的事情都没有去做,满满的罪恶感油然而生,心情顿时很失落,堕落的理由千万多,唯独恨自己不能独善其中。

「完」

阅读更多

你有计算过你的通勤成本吗?

「1」

总是在为上下班路上堵车而心烦,也一直在抱怨通勤时间高,可是我却这样习以为常的过了好久。习惯是件可怕的事情,当你每天都是这样,偶尔有一天早了10分钟,你反倒觉得非常开心,然后继续这样反反复复下去。说得好听点,这叫乐观,适应能力强;说得不好听点,这就是安于现状。

没错,今天回家的路上再一次让我暴走了,心情也是坏到极点,独自在车里,前面是一片密集的车流,映入眼前的尽是红得刺眼的尾灯。想逃也逃不掉,只能跟着这条行车道一路走下去。而这种情况实在是太过于平常了,如果白天能遇到开心的事,心情不错忍忍也就过了。然而更多时候并非事事如意,好不容易熬到下班了,回家路上再被补个刀。最近这种糟糕的心情甚至已经影响到家人,这样的生活真的是……

在一篇公众账号文章中读到关于通勤成本的问题,文章下面有个统计表,我的选择是「超过120分钟」,居然被超过一词的选项带过,有点扎心了。说了这么多,我的通勤成本到底有多高?国家规定8小时上班时间,公司规定早上8:30上班,晚上17:30下班,中间有1小时午饭时间,待在公司的时间每天正常也就9个小时,而我每天却有超过一半的时间不是在公司,就是在去公司的路上

「2」

目前我的通勤方式是自己开车,相对以前班车-地铁-自行车,这已经是我最省时的方式了。然而就算这样,我每天早上6:45出门,每天下班路顺的时候能赶在19:00之前到,最晚有20:15到家,平均到家时间就按照19:25来算,那么我每天花在通勤以及上班的时间就有12小时40分钟

回到家里,偶尔想干点私事的时候,媳妇就会抱怨:你看你,每天也就这么2个小时能陪陪我,到家了还往电脑那一趴。每天晚上到家吃完晚饭差不多就8点了,10点多钟就要上床休息以确保第二天的精力。剩下的这两个小时,连陪家人的时间都不够,谈什么「工作外的那8个小时」,全是扯淡。

也许你提出异议了,学习无处不在啊,要善于利用零散的时间。比如在通勤的路上可以准备一些素材来进行学习的呀,但是我用我的亲身经历告诉你,这种方式完全是在安慰自己,实际并不会产生什么实质性的效果。

人的大脑是会骗人的,它不擅长于衡量量化指标,有时你会觉得1分钟好长,有时你会觉得1小时好快,你以为你花了60个1分钟去背单词,但其实还不如人家花半个小时记得牢靠。你是否有过这种感觉,平时零零散散也学了不少东西,感觉很充实,但是为什么过段时间感觉什么都没有留下,就是这个道理。

「3」

我们都知道时间是宝贵的,时间一去不复返,而钱没了可以再挣。话虽如此,而我们大多数人的时间其实是不值钱的,我中转一趟列车多花2个小时就可以省下1000块,这就是赚了。但是富人思维就会想,省下的2个小时时间可能会给我带来远远超过1000块钱的价值。这就是穷人与富人的思维差异。

跑远了,说到通勤成本,就得有钱的概念。通过简单的计算,掐头去尾,大约估算,我发现,我的时薪大约在60块钱。得到这个结果的时候,我很惊讶,老家乡下的砖瓦匠比我工资要高,更别说楼下卖煎饼的大妈了。

所以,跟你薪资一模一样,且工作类似的同事,所谓的工作待遇、归属感、幸福感是没有可比性的,可能仅仅只是因为他的家离公司近一些而造成几倍的差距。

对比媳妇在学校上班,税前工资比我低,走路上班10分钟,每年寒暑假有3个月的假期。同样的计算方式,她的时薪将近是我的两倍。我不禁自叹,我有什么资格去说因为我上班累回来得晚,到家了就可以什么都不干?又是什么一直支撑着我能够安于现状下去?是体面的工作?是相信我将会有更大的成长空间?还是说为了事业?为了梦想?不,不,这些空洞虚伪的承诺,无法平复我内心的烦躁与不甘,这不是我想要的生活状态。

「完」

阅读更多