佛山,一座你来了就不想走的小城

来佛山定居已经一年有多了,选择写下这篇文章,是源于自己对佛山的喜欢。对了,这里我说的佛山,是指狭义的佛山(即禅城)。这里的城区不大,住下来就让人感觉很舒服。可能是之前在广州居住过,所以对比下来真的好太多了。主要有以下3点:

  • 生活节奏不快,生活气息浓厚,作为23线城市,人不算太多,人与人之间的感情更为真挚
  • 离广州近,平时可以参加广州的活动和感受一线城市的气氛
  • 公共设施完善,规划好,附近的公园和单车亭覆盖很到位,去图书馆很方便,平时出行和锻炼很方便

说来也巧,早在高中的时候,我人生第一次出远门就是来佛山,那时候对佛山的印象就只有黄飞鸿了。可能冥冥中跟佛山有着不解之缘,阴差阳错最终会选择在佛山落脚。之前没选择广州一则房价太贵,二则人实在太多了,自己也没找到特别喜欢的地方。随着年龄的慢慢增长,我偏向喜欢安静的地方,所以目前在这里居住,实在太对自己的胃口了,也大大增加了自己的归属感。例如早上/晚上可以去附近的公园跑步,吃饭基本不用等位。

但目前不便的地方是自己仍在广州上班,每天两边跑,过着候鸟式的生活。说实在内心也有点厌倦的感觉,只能把每天通勤的时间尽量利用起来,看书,听博客。但目前切换回佛山工作的模式还不太成熟,一是对这边的环境不太了解,二是对自己的定位不太清晰。再则我对现任的公司还是有感情的,所以比较难割舍。随着小孩一天天地长大,我知道我的生活重心应该更多花一点时间在家庭上,把家庭这个后方的支撑做好我才能更安心的做好我的工作。另外一个就是要找到自己真正想做的事情,当然能够结合本地的资源更好了。比较好的结局是找到自己感兴趣或做出自己的产品,既能支撑家庭,又能做出有价值的东西。如果你对着一份你不怎么感兴趣的或者你不想尽力把他做好的工作,每天对8个小时(加上通勤时间不止)。说句不好听,是在浪费你自己的时间和生命。总想着在年轻的时候,能再冲一冲就冲吧,撸一把。希望这个事情能在2-3年内想好并实施。

生活总是在变化的,无论人或事。

接下来我要做什么呢?

今天起开始到国庆假期前,小孩被送去了外婆家带。接下来的一小段时间里面,我终于有了点属于自己的空间。虽然时间很短,但显得极为可贵。可能就要开始计划下接下来要做什么事情了。目前自己的状态其实并不算太好,不停去调整自己,其实也是为了找到最合适自己的工作和生活方式。

个人提升/学习

资料整理

整理Evernote和Pocket的文章,目前里面的东西太多了,需要抽取有用的东西并重新归类
重新整理自己的RSS列表和Podcast的分类
RSS 这里我把他分为高频率和低频率 (高频:每天 低频:每周1-2次)
高频:

Podcast:

  • IT公论
  • 比特新声
  • 狗熊有话说
  • 晓松奇谈
  • 吴晓波频道
  • 罗辑思维 (只关注60秒语音)

英语学习

书籍:

  • 牧羊少年奇幻之旅 - The Alchemist
  • 麦田守望者 - The Catcher in the Rye
    听力:
  • 每天1篇VOA慢速英语(力取听懂)
  • 每周2-3篇RoundTable或环球英语听力(听感觉)
    翻译:
    尝试翻译1-2篇外国文章

工作技能提升

前端学习:

  • 集中学习ReactJS并进行实战,做一个简单的Demo和技术分享来验证学习成果
  • 深入研究前端页面路由,整理技术博客
  • 整理前端XSS注入
  • 前端代码测试框架 Mocha
  • 前端打包webpack VS FIS
    书籍:
    - 打造Facebook
    后端学习:
    - Ruby on Rails

个人理财

书籍:

  • 聪明的投资者
  • 通往财物自由之路

运动计划

目前已基本放弃马拉松啥的想法,锻炼身体为主,装逼为副。每周跑步的时间保持2-3次,每次保证2-3公里左右的量。
之前一直感觉自己手的力气不够大,决定最近开始上哑铃。以增强自己的肌肉和力量。

我们一起去跑步吧(写在自己第一个慢跑的MileStone:5公里)


今天是纪念法西斯战争70周年胜利的日子,早上因为带娃早早起来,六点多7点看雨下了一会就停了。于是匆匆洗漱就出发去跑步了。其实是想兑现自己假期许下的第一个计划:慢跑5公里。但似乎天公不作美,刚出来不久发现天开始下雨了,但也不算特别大。心里寻思既然出来了,那就跑吧。简单做了一下热身运动,刚刚跑了一会雨又渐渐大了起来。在大雨中跑步,估计很多人都以为我傻掉了。其实who care呢?心里又想,既然跑了,那就跑下去吧。因为之前已经可以跑4公里左右,想想5公里应该也问题不大吧。但其实我高估了自己,跑到最后一圈的时候,膝盖已经稍微有点不太舒服了。但最后也是坚持下来了,成功达成自己事先定下的5公里的目标。此刻心里自然收获了满满的成就感。看似是一篇简单的流水帐是不是?其实不然。通过跑步我自己收获了不少的东西。

哦?对了。我好像没提到我为什么无端端要跑步?难道是闲的蛋疼么?

随着年龄的增长,无论家庭还有公司自己都需要承担一定的职责和担当,最近我试过几次直接在地铁里面睡着了或是睡过站。我渐渐意识到,我需要一个强健的体魄去支撑我的工作。在此之前还受到狗熊有话说的蛊惑,但我也要感谢狗熊哥的podcast节目,在一定程度拓展了我的视野和思路。我跑步的目的一开始很简单,只是想锻炼自己的身体,没想到慢慢跑着跑着竟然跑上瘾了。一周不去跑会觉得浑身不舒服。无论是早跑还是夜跑(当然我更喜欢夜跑),如果时间允许。我都会去附近的小公园跑步。之前也考虑去跟群里跑步的人一起去跑,最终也是作罢。或是在目前阶段,我还是喜欢自己孤独一个人去跑步。或者应该说,我非常享受跑步过程中与自己内心的独处。从刚刚一开始跑的不适感,到慢慢跑起来对自己信心的倍增,一公里,二公里,三公里… 慢慢感觉跑多了也没啥。当自己要放弃的时候告诉自己再坚持一会吧。跑着跑着也就支撑下去了。说到这里你可能会说,你这不是扯淡么。这么简单的事情,对。没错。其实也没啥。但我觉得这个起码是对我自己的肯定。想想自己一个十几年没怎么运动的人,整天坐电脑前的人。挺负能量的对吧。

这里不得不说另外一个事情,前不久团队一个比较重要的成员离职,多少对我也是有点感触的。之前又有1-2个同事私下跟我说想离职。到这里我才渐渐意识到我的团队管理和建设没做好。如果做的好,或者就不会有这些事情发生。当然了,我也可以置之不理。但我不是这样的人。我想把这个事情做好。首先团队需要正能量,团队需要气氛。发掘组员的特性和跟他们走在一起,了解他们的想法。这个是我可以做到的。我并不是很喜欢花大量的工作在管理上面,知道每个人的长处并赋予责任和信任是最重要的。甚至我极端地认为其实不需要管理,每个人都自己要做什么,各施其职就对了。经过自己这段时间的小努力,我觉得目前我还做得挺不错的。最起码我的做法得到组员的认可和肯定。我更希望把自己工作的重点倾注在自己的本质工作上面。一方面需要在技术上跟得上,另外一方面是技术的东西不能放下。一放下就很难再拿起来。说到这里,我想说的是我们的人生应该需要去试探自己的边界。不要满足于自己的现状。你不去试,就永远都不会知道会发生什么事情。记得有个人告诉我要keep住心中的一团火,在这里我要谢谢他。真心的。坚持很难,放弃很容易,而且一下子就容易溃之千里。逃离自己的舒适圈,不依靠体制的保护伞,靠自己的双手,成为一个手艺人。让市场去证明你的价值。我想,这个应该是我们每个人应该思考和去追求的东西。有时候我觉得很奇怪,身边大部分人都喜欢过着得过且过的安逸日子,不愿意去冒险。其实这个也没啥,每个人都会自己的追求嘛对不对。我也不见活得就比别人好。但更让我接受不了的很多人对于”自由”的需求并没有那么强烈。可能我感觉类似我自己这类人对”自由”特别敏感。自由我这里加了引号,既包括了精神自由,也包括了肉身自由。当然你到达财务自由,基本上2者也实现了。现在国内的大环境一直都很不好,不能说已经对某些东西已经失望吧,应该是不再有什么期望了。希望在下一个十年,可以通过努力,遇见更好的自己,甚至有机会去另外的国度去居住,生活。目前自己可以努力的就是拼命地学东西,学英语,慢慢等待适合自己的好机会。其实也不一定,可能最后会走上freelancer这条路。

乱七八糟地聊了这么多,好像也跟跑步没啥关系(歪楼了)。通过跑步的时间与自己独处无疑是最好的,梳理自己的思路和想法。而且没有太吵杂的东西,周围都是你不熟悉的人。例如早跑想想今天要做什么事情,夜跑想想今天做了什么事情,明天要做什么事情。这样不是挺好的吗?

说到这里,可能有人还是说,你好像说的挺有道理哦,不过我觉得很难去做。例如…., 例如…..。好吧,我也不是来洗脑的。我只是把自己真实的想法说出来,如果有人看到会觉得喜欢。那也就算是挺不错的一个事情,对不对。
最后想说的,跑步这个事情,最好还真的是要量力而为,想我这里2B逞强的事情是不值得赞扬的。循序渐进地跑,慢慢增加运动量才是正确的跑步方式。写到这里,我感觉我那小膝盖感觉还是怪怪的。呜呜,希望它没事吧。

Hexo + GitHub 搭建个人博客

这篇文章主要作为自己折腾Hexo搭建自己个人博客的体验及记录。其实Hexo部署远没有想得那么简单,中间自己前后折腾了2个多小时。可能自己对于整个环境和概念半桶水的原因,另外一方面网上这方面的资料也很多了,Google了可以抓到一把。这里不细说,只是结合自己的实际情况来记录。


背景知识

为什么选择Hexo

我的需求是纯静态,轻量,部署简单,不需要数据库,并能支持markdown。
本来想选用jekyll,不过本地执行第一条安装指令总是提示服务器超时。无奈之下选择了Hexo, 看过他的介绍, 基于nodejs, 安装和部署都比较小白,合适我这种想装B而又担心太麻烦的人。所以决定上Hexo的贼船。另外还有一个轻博客叫Octopress, 也是基于jekyll, 时间不允许,以后有时间再折腾。

安装步骤

安装Hexo前需要有nodejs的运行环境,可以先去nodejs的官网下载并安装。
Mac下直接下载binary的安装包(32bit和64bit)直接解压就可以运行了。
另外需要一个Github账号,并启用独立Github账号的Pages服务。其实就是相当于给你提供了一个二级域名的博客功能,而且每个用户只能有一个。

安装Hexo

1
2
3
4
5
6
7
8
9
npm install -g hexo
hexo init
npm install
```
### 本地部署Hexo
``` bash
hexo n 'title' 新建文章
hexo g 生成文章
hexo s 启动服务

GitHub设置SSH

可以直接参考 如何搭建一个独立博客——简明Github Pages与Hexo教程的[配置和使用Github小节]

将本地的博客文章发布到GitHub

修改本地hexo博客根目录的配置文件_config.yml
vi文件最后面的deploy加上

1
2
3
4
5
... ...
deploy:
type: git
respoitory: https://github.com/[yourname]/[yourname].github.io.git
branch: master

这里有个特别要注意的地方,就是每个值后面冒号需要英文半角的空格。而且type的类型一定要是git。之前在其他文章里面说是用github,但是在hexo 3.0之后部署总是会提示unknown type。然后就是部署到GitHub上了。

1
hexo d 部署服务

这里是hexo比较赞的地方。

HHKB Lite2 修改键位

2个月前入了Mac版的HHKB Lite2的外置键盘,作为Mac下外置的入门键盘。但使用起来略感键位使用的不方便。因为习惯了PC的键位,所以需要针对自己的使用习惯重新定制HHKB Lite2的键位映射。大概GG搜索了一下,找到了Karabiner这个软件。一开始并没有抱着折腾的心态,只想网上找个东西抄抄改改就算了。但好像确实没找到太合适的。于是自己撸了一把,总体感觉还是满意。基本上几个PC的键位都对应上了。下面是我自己详细的Karabiner的配置,贴出来希望对大家有用:

<?xml version="1.0"?>
<root>
    <item>
        <name>HHKB Lite2 KeyBoard</name>
        <identifier>remap.pc_to_mac</identifier>
        <autogen>
            __KeyToKey__
            KeyCode::KEY_6, ModifierFlag::SHIFT_L,
            KeyCode::EQUAL
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::KEY_7, ModifierFlag::SHIFT_L,
            KeyCode::KEY_6, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::KEY_8, ModifierFlag::SHIFT_L,
            KeyCode::QUOTE, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::KEY_9, ModifierFlag::SHIFT_L,
            KeyCode::KEY_8, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::KEY_0, ModifierFlag::SHIFT_L,
            KeyCode::KEY_9, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::MINUS, ModifierFlag::SHIFT_L,
            KeyCode::JIS_UNDERSCORE, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::KEY_2, ModifierFlag::SHIFT_L,
            KeyCode::BRACKET_LEFT
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::SEMICOLON, ModifierFlag::SHIFT_L,
            KeyCode::QUOTE
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::QUOTE,
            KeyCode::KEY_6, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::EQUAL, ModifierFlag::SHIFT_L,
            KeyCode::SEMICOLON, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::EQUAL,
            KeyCode::MINUS, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::BRACKET_LEFT,
            KeyCode::BRACKET_RIGHT
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::BRACKET_LEFT, ModifierFlag::SHIFT_L,
            KeyCode::BRACKET_RIGHT, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::BRACKET_RIGHT,
            KeyCode::BACKSLASH
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::BRACKET_RIGHT, ModifierFlag::SHIFT_L,
            KeyCode::BACKSLASH, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::JIS_YEN,
            KeyCode::JIS_YEN, ModifierFlag::OPTION_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::BACKSLASH, ModifierFlag::SHIFT_L,
            KeyCode::EQUAL, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __KeyToKey__
            KeyCode::BACKSLASH,
            KeyCode::BRACKET_LEFT, ModifierFlag::SHIFT_L
        </autogen>
        <autogen>
            __DoublePressModifier__
            KeyCode::JIS_EISUU,
            KeyCode::VK_CHANGE_INPUTSOURCE_CHINESE_SIMPLIFIED,
            KeyCode::VK_CHANGE_INPUTSOURCE_US
        </autogen>
    </item>
</root>

写好你的css代码

最近在review其他同事的代码时,经常会看到一些写得比较难看的css代码。一方面开发人员经验不是很足,另外一个方面我虽然知道有问题,但如何将css代码写好我自己确实也是缺乏一套比较完整的理论知识来驾驭。这里把我看到和工作中遇到的问题稍微总结一下。

命名空间

组件应该使用唯一的命名空间做为前缀.
例如ddl是drop down list组件的缩写。这里可能需要大家对这个缩写有一定的共识。

1
2
3
4
5
6
7
8
9
10
11
.ddl-container {
//
}


.ddl-item-list {

}


.ddl-item {

}

css类会被大量使用,所以应该用唯一的命名空间来将其分组归类。

类名

单词间用单横杠符分隔
尽量短,但必要时可以长

html标签

其他

强烈不建议使用!important规则

Typescript 学习笔记

最近Typescript好像很火,有2个原因是不容忽视的。其一,背后靠着微软和Google(AngularJS 2.0)两大巨头的支持,其二,随着ES6的推广普及,肯定会有大量的网站需要同时兼顾ES5, ES6共存的情况,所以我想也是Typescript的催生剂之一。首先Typescript有2个地方是很吸引我的:

Typescript出自微软大牛Anders Hejlsberg之手.

了解Delphi, Pascal, C#的朋友都应该听过他的名字,所以Typescript理论上应该不至于太差。

Typescript是属于Javascript的超集

如何理解这句话呢?理论上Typescript完全兼容ES5和ES6的语法。也就是说,我写一个typescript的代码,我可以base原来的ES5的基础上进行改造,里面可以混用两种语法(当然是不太希望出现大量这种情况), 但可以适用于我们改造慢慢javascript代码。

那么Typescript和ES6实际语法的差别有多大呢?