My TWI

前言

对TWI没有什么特别的印象,因为有一个更出名的TWU,而我去年又刚好错过了它,因此TWU的光辉完全掩盖了TWI。对TWI印象最深的是在邮件中看到的38th北京的这期,看到他们的图文记录,在圈子中看到了他们同一期学员之间的友情,特别是我等到这期又在成都,心中满是期待。

终于,我们在星期四的下午动身了,于当晚十点到了酒店和各地office的同学汇合,大家一起warmup,通过一个游戏记住了学员和讲师的名字。奔波劳顿,然后居然还去九眼桥吃了好吃的牛莽莽火锅,真的好吃!

正经事

看到安排的满满的时间表,就知道这两天的知识量爆炸。讲了很多东西,这里就大致记录一下我的所得吧。

Read More

Share Comments

ThoughtWorks三个月工作记录与总结

是的,5.9号入职的我已经在TW待了三个月了,那么,离开拾光小盒子也是三个月了,时间,可真快啊..

当初,由于内心对未来的迷茫以及内心对技术的渴望,我放弃了很多,选择了TW,因为在我的人生中,TW曾使我找到了对技术的热情以及对其的卓越追求,产生了对TWer代表的这一类技术精英们的崇敬与向往之意,让我看到了专业的人来做专业的事能产生的社会价值以及影响力,以致毕业那时没能进入TW让我觉得这算是我此次人生的一大憾事。

Read More

Share Comments

Angular2开发笔记

Problem

  1. 使用依赖注入应该注意些什么
  2. 服务一般用来做什么
  3. 指令一般用来做什么
  4. angular2如何提取公共组件
  5. angular2为什么不需要提公共组件
  6. 父组件与子组件之间如何通讯
  7. 什么时候应该使用ngModel
  8. 为什么要用Typescript?我喜欢JavaScript
  9. 为什么如Input之类的语法后面必须加()

Read More

Share Comments

我是Nodejs-Everywhere新闻稿志愿者

Node.js Foundation在全球各地聚集 Node.js 开发者,举办了一系列的会议。每个会议都各具特色。会议时长、合作伙伴都取决于当地的 Node.js社区或开发者,可以说是为当地社区量身定制的。这次node基金会来到了北京,征集了大批讲师提交的主题演讲,最后筛选了一些众多开发者关心的话题,于北京时间5.21这个特别的日子在微软大厦分享,下面是此次大会的主要内容。

Read More

Share Comments

好喜欢的大家

踟蹰了许久,心里有了答案,还是一直拖着,像是什么都没有发生过,照常工作睡觉工作,就像什么都没有发生,什么都不会发生一样。

我又待了好久呢,待到了5.6号,星期五。还是像平常一样,给狗带安排着任务,帮着王潭东看代码。大榴晚上有事,走之前将一张对折的纸交给我的时候,我还在和王潭东讨论呢,真的就是像什么都不会发生一样,点点头,继续说着。一个空隙,还是没忍住,打开了那张对折的白纸,《离职证明》。一下子就给合上了,情绪一下就上来了,眼睛也跟着湿润了。一个人去了厕所,看了看自己,关上门,给自己两分钟释放情绪。

好喜欢大家啊。

Read More

Share Comments

nodejs项目mysql使用sequelize支持存储emoji

本篇主要记录nodejs项目阿里云mysql如何支持存储emoji表情。

因由

最近项目遇到用户在文本输入emoji进行存储的时候导致存储失败的问题。经本地调试发现emoji表情在存储时转成的四个字节(\xF0\x9F\x90\xAC)导致sequelize报错,Unhandled rejection SequelizeDatabaseError。由于数据库使用的是utf8字符集utf8_general_ci,这个校对规则(collation)最大只支持3个字节,所以四个字节的emoji就抛异常了…

Read More

Share Comments

北京2月27号NodeParty

第一次参加cnode社区的技术交流分享会,感触良多。

物联网

这一次的分享,有两个topic,第一个是关于物联网的,由现就职于Microduino的陈昊前辈带来的《How Arduino is open-sourcing imagination》分享,一个小时的时间里,向我们介绍了物联网以及他是如何一步一步的深入物联网这个领域,分享了他所在公司做的一些很酷的事情以及一些项目的基本实现,还带了一些成品demo,大开眼界。这个我未曾接触的新新领域->物联网,于我来说像打开了一扇新世界的大门一样,思考了很多。这个软硬件结合的领域里,感觉更加能够深入到生活的点滴之中,能够帮助人们解决很多实际性的问题,就比如Microduino他们的《秃鹫蛋》项目,在条件苛刻的环境之下,完成了一款坚持40+天记录秃鹫蛋各种参数的作品,切实的帮助了科学家们的研究。在我看来,物联网这个领域重要程度不会低于互联网太多,在将来,能够更直观的改善人们生活的,一定会有物联网的一席之地。

架构经验分享

第二个topic来自百度前员工现XLegal架构师的王啸,主要分享总结了他在项目初期遇到的一些坑以及自己总结的一套项目经验,都是实打实的干货啊。分析了项目中的技术债是怎么起源的,并且用了一个对于咱们程序员来说十分写实的例子来讲述这个故事,真是听得滋滋有味的..这个故事也让我重温了曾经看到过的一句话:“同样的代码出现第二次,咱们就该停下想想,想想自己代码是不是出现了什么问题,需要如何优化”。粘贴、复制真不是什么程序员,更多的像是打字员?不能自我学习、自我总结提高的程序员,一辈子也就只是个普普通通的程序员..还有一点灰常干,就是不要随便引入第三方库,在我后端来说,一般的工具库我都会参考源码之后来抉择如何引入,太重的,采取剥离的方法。这一点让我想起在和keep的小星星@NSWBMW聊过之后受到的最大启发之一,项目引入的第三方库的版本号一定要是一个确定的数字,否则各版本之间的接口差别真可能让人调试的崩溃的,并且给我推荐了一个用于自动升级依赖包的库-> npm-check-updates,酷酷的,我也要这么做~
王啸前辈关于这些经验的总结也挺棒的,

  1. 按重要性设计方案,参考紧急程度考虑实现顺序
  2. 技术债由非功能性需求产生,被功能实现掩藏,务必警惕其造成的减速效应
  3. 非功能性需求的完善,会将项目导入加速曲线
  4. 项目初期技术方案,应尽可能以撑过长期为目标
  5. 项目迭代的过程,最终一定会导向自有的技术方案

Thinking

这次的技术分享会也有和很厉害的人交流,比如卡耐基梅隆大学海龟的@罗诗亚,给我讲了好多关于3D技术方面的东西,告诉我了一些新东西,比如我都不怎么了解的3Dweb技术方向的程序员,关系到比较深入的算法方向,了解了硅谷程序员基本都是要考算法的,真爽啊,爽的浑身冒气那种,感觉要在算法方面去战斗了!

程序员这个群体来说,大多数人其实都挺内向的,比如我自己..特别是在大伙吃晚饭的时候,这气氛真是让我biubiubiu…一会大伙都聊得兴起,一会全桌子十多个人鸦雀无声..这就是他人眼中呆萌的技术宅嘛- -

Share Comments

记录我这一年的技术之路(nodejs纯干货)

2015年12月28日23:19:54 更新koa应用、学习型网站和开发者工具等

coding伊始

开始认认真真的学习技术还是2015.10.21日开始的,记得很清楚,那天,是我在龙湖正式学习的第一天。还记得硕哥面我的样子,高高瘦瘦的,一双白色休闲鞋加牛仔裤,典型的程序员风格。

“有什么爱好吗” “自学过ps,dreamweaver,自己搞过简单的网页,很简单的那种,喜欢摄影,所以才自学的ps,现在也就会些抠图啊什么的…”
ns
这段对话之所以印象深刻是因为后来硕哥给我们说,有感兴趣的事物,还得实际的动手去做了,有想法还得有行动,才算是优秀的入门。我想,当时可能是因为我真正的去做了才会被选中吧,对了,这里的录取率貌似不到10%..

coding环境

首先,接触coding,你得有自己的一套开发环境,没有mac的同学我推荐Ubuntu 14.04,可以参考我的一篇blog ubuntu14.04安装及web环境的搭建,其次,就是世界上程序员最大的社交网站Github了,哈哈,关于如何配置自己的github可以参考github官网,也可以参考廖雪峰的git教程

coding龙湖

在龙湖,搭好coding环境之后,首先接触的是前端方面的知识,HTML、CSS、Javascript,这些基础知识可以参考这个几米家的网站。有了基础之后,就可以自己实际上手做些例子了,毕竟实战中得来的经验才是最好的。

至于做什么,目前这个阶段当然是做最基础的啊,可以参考我的一些小项目

  • pos机相关逻辑操作练习 练习git相关命名操作,感受小步提交的好处,层层递进的感受编程之美
  • 猜数字 附有详细练习步骤,可学习TDD开发模式
  • posjQuery网页版 可以称得上一个单独的小小型项目,纯页面端的逻辑,可学习bootstrap、jQuery、dom操作、页面数据存储等
  • 一个简单的博客 我的node入门项目,所以@nswbmw也可以说是我的入门导师,哈哈,小星星。通过这个项目,可以了解如何构建一个node项目,学习express框架、ejs模板、mongodb数据库等
  • posNode版 这个就是在学习一个简单的博客之后,将前面的pos机项目做成node版本的,学以致用

学习完这些之后,你可能觉得自己已经不错了,很多都能自己做了,其实不然。优秀的程序员之路,其实才刚刚开始呢…

一般来说,优秀的程序员都不是单打独斗,只身钻研的,你得借鉴前人经验,与志同道合的人一起讨论交流,这对于提升自身能力来说是很有必要的,那么接下来的这些信息,你是很有必要知道的:

  • 国内nodejs专业社区 这里有很多国内的nodejs大神,当然也有很多小白,他们输出了很多十分有价值的分享、经验,并且提供一个问题求助与交流的平台,当然你也能看到nodejs相关火爆的招聘来提升你的激情
  • 阮一峰的javascript教程 这里有javascript初级、高级用法,也有koa相关介绍与使用
  • 阮一峰的es6入门 很棒的一个学习es6的网站,关于es6一些新增的内容讲解很到位,对于中文学者来说,零门槛了..
  • 粉丝日志 一个很牛逼的CTO,你会发现你想研究的东西他几乎都已经研究过并且携程教程博客了!能在这里学到很多新东西
  • 廖雪峰的官方网站 这里你能学习javascript、Python、git等,方便你快速入门的一个很好的地方

coding reference

再分享一些对于我来说帮助挺大的网站吧,来个分门别类的,

koa应用

>

  • koa官方文档 这里你能找到koa开发中常用的各种库,middleware、session、router、body parsing等
  • node微信开发文档 繁杂的微信开发过程已经由国内几位大神@TZ | 天猪 @Jackson Tian @Jesse Yang 将其封装的很好了,es5、es6通吃,是学习、借鉴的好地方

Promise相关

Mac开发

工具库

  • underscore 一个javascript工具库,方便我们对string、array、collections、object等数据的操作
  • lodash 一个fork underscore的库,最后性能比underscore高出好几倍,并且提供了underscore没有的优秀API…为什么说lodash比underscore性能高出好几倍呢?因为这是比lodash性能还要高出很多的lazy.js测出来的థ౪థ这个世界如你所见,确实很疯狂…

学习型网站

  • CodeForDream Program changes the world ,适合初学者,这里你能以互动的形式较为全面的学习HTML、CSS、Javascript等
  • 慕课网 算得上国内一线学习平台了吧,其中的课程涵盖前端、移动端、后端、数据处理,甚至是ps。程序员的梦工厂,这里你几乎能找到自己想学的任何语言,很多不错的课程,也有很多爱学习的小伙伴
  • 爱酷学习网 与慕课网类型差不多的学习类平台,在我看来这里貌似培训学校老师的分享多一些,风格不一

类似的学习平台,挺多的,比如极客学院汇智网等,不过这些学习型网站,对于小白童鞋来说不错,但是对于有一定基础的童鞋可能就不太适合循规蹈矩的跟着看、做了,有些东西知道、会用、会写,是三个不同的级别了…

开发相关工具

  • WebStorm 首推webstorm,集成各种功能,只有你没想到的,你觉得没有的很可能是你还没发现而已,我使用的过程中就经常这种体会,‘诶,居然有这功能’ ‘哇靠,这都支持!’ ‘webstorm是神器..’
  • sublime 速度超快的一款ide,package control 中有很多强大的插件包,你能定义自己的ide
  • atom 类似于Sublime的一款高度自定义ide,说的是比Sublime更快,就我用起来,感觉两者差不太多,相同的包管理,自定义各种插件等,前段时间,一个atom的代码编写插件 刷遍了程序员的朋友圈,一种星际战斗的感觉,哈哈
  • Cmd Markdown 一款在线的mark编辑工具,有详细的markdown语法,更新迭代挺快的,现在都出全平台桌面版了…
  • haroopad 一款强大的本地markdown编辑器,支持代码高亮,带格式、无格式HTML导出等,一个月之前,我一直都用的是这款本地markdown编辑器
  • macdown osx下比较好用的markdown编辑器,现在我是haroopad和macdown轮着用,macdown就显示而言,简洁大方,haroopad功能强大一些

暂时先写这么多吧,后续再跟新~

ps: 我很期待明天,因为我对明天充满希望与热情,哈哈

Share Comments

Javascript实用方法二

Object

keys

object的keys方法能够获取一个给定对象的所有键(key/属性名)并以数组的形式返回。这个方法可以用于键的筛选、匹配等。

1
2
3
4
5
6
7
8
9
var basket = {
strawberry: 12,
banana: 20,
apple: 30,
juice: 20
};

console.log(Object.keys(basket));
//[ 'strawberry', 'banana', 'apple', 'juice' ]

create

create方法用于创建一个新的对象,可选参数(proto, [ propertiesObject ]),第一个为原型,比如Array.prototype之类的,第二个为需要给新建对象的一些新属性之类的,这个参数对象的属性名将是新建对象的属性,值则是属性描述符(value、writable、configurable等)。

1
2
3
4
5
6
7
8
var o = Object.create({}, {p: {value: 42}});
var O = Object.create({}, {p: {value: 66, writable: true, enumerable: true}});
console.log(o.p); //42
console.log(O.p); //66
o.p = 20;
O.p = 80;
console.log(o.p); //42
console.log(O.p); //80

属性描述符中writable默认为false,因此o.p即便在后来重新赋值也是不能改变其值的,而O.p则能够在后来改变值,此外,create方法proto必须传入相应参数,否则会报错TypeError,当然以上代码在严格模式下也会报错,因为o.p被重写- -

assign

assign方法,es6的新特性,支持传参(target, …sources),用于将任意多个源对象的键值对添加的目标对象,类似于lodash的assign和underscore的extendOwn方法。

1
2
3
4
var boy = {handsome: true, rich: true}, girl = {cute: true, hair: 'long'};
var couples = Object.assign({}, boy, girl);

console.log(couples); //{ handsome: true, rich: true, cute: true, hair: 'long' }

assign方法常用于框架层面的数据处理,比如你定义了一个client用于发送HTTP请求,使用的时候获取接受到的参数之外自己可能得加上什么默认的属性。

Number

isNaN

Number的isNaN方法用来判断传入值是否是NaN的值,与全局的isNaN方法不同的是它不会强制将传入参数转化为数字类型,只有在参数是真正的数字类型,且值为 NaN 的时候才会返回 true。不过就自己而言全局的isNaN用的多一点,就用来判断字符串是不是只包含数字,

1
2
console.log(isNaN('123f')); //true
console.log(isNaN('123')); //true

此外,isFinite(value)方法用于判断传入参数是否是有穷数,isInteger(value)方法用于判断传入参数是否是整数。

toFixed

toFixed方法用来将数字转化为特定的字符串,支持传入参数(digits),0 < digits <= 20,在转换的时候会自动进行四舍五入以及0补充。

1
2
3
var cool = 666.666;
console.log(cool.toFixed(1)); //666.7
console.log(cool.toFixed(6)); //666.666000

这段时间发生了很多事情,从待了116天的杭州来到北京,开始一段新的工作与生活。不舍、惆怅、激动、兴奋等情绪交织缠绵…七匹狼,认识了其余六狼,很珍惜这段大家一起努力一起嗨皮的日子,尤记得夜爬宝石山,俯瞰西湖,English poor,哈哈哈…

向着梦想,go!baby!

Share Comments

Javascript实用方法

这篇我主要记录一些在工作中常用的、实用的方法。

String

trim

字符串方法中的trim主要用来去空格使用,很多时候,在后台做参数处理的时候,我们都会使用该方法,比如在获取用户输入的账户时

1
2
3
4
5
6
var a = String(' 1234         ');
var b = "hello world";

console.log(b.trim()); //hello world
console.log(a.trim()); //1234
console.log(a); // 1234

以上,可以看出,trim方法去掉的是两头的空格,对中间的空格并不会产生影响。值得注意的是,trim方法,返回的是一个新的字符串,对原来的变量没有影响。

slice

slice方法用于切割字符串,用到的地方挺多的,比如在处理文件流的时候,我们就可以用slice来切割,当然,大多时候,也就仅仅是对字符串做一个简单处理

1
2
3
4
5
6
var b = "hello world, I like you";

console.log(b.slice(13)); //I like you
console.log(b.slice(15,20)); //like
console.log(b.slice(15,-4)); //like
console.log(b); //hello world, I like you

slice方法,支持传入两个参数,开始位置与结束位置,传入负数时,代表此次计数从末尾开始。

split

split方法用于将字符串分组存放,是常用的方法之一。能够让我们对分组好的字符串进行分组操作

1
2
3
4
5
6
7
var b = "hello world, I like you, and you?";

console.log(b.split()); //[ 'hello world, I like you, and you?' ]
console.log(b.split('')); //["h","e","l","l","o"," ","w","o","r","l","d",","," ","I",
" ","l","i","k","e"," ","y","o","u",","," ","a","n","d"," ","y","o","u","?"]
console.log(b.split(' ')); //[ 'hello', 'world,', 'I', 'like', 'you,', 'and', 'you?' ]
console.log(b.split(' ',3)); //[ 'hello', 'world,', 'I' ]

以空字符分组的时候,会将字符串按每一个字符来分组,这点很实用,可以按字符分组,想想都会觉得程序的世界也是鸟语花香啊~

substr、substring

都是用来截取字符串的,substr方法,支持传入两个参数,一个是开始位置,一个是截取长度,而substring的两个参数一个是开始位置,一个是结束位置

1
2
3
4
5
6
var b = "hello world, I like you, and you?";

console.log(b.substr()); //hello world, I like you, and you?
console.log(b.substr(13,10)); //I like you
console.log(b.substring(15,-9)); //hello world, I
console.log(b.substring(15,-1)); //hello world, I

由此可见,substr、substring和slice这三者来说,各有所长(╯°O°)╯┻━┻
你能体会么~不能体会的就留个言咯

Array

filter

filter能够按一定条件筛选出满足条件的数据,比如在后台处理mongdb的id时,前台传过来的id必须得满足id.trim().length === 24

1
2
3
4
5
var b = [ 'hello', 'world,', 'I', 'like', 'you,', 'and', 'you?' ];

console.log(b.filter(function (item){
return item.length < 5;
})); //[ 'I', 'like', 'you,', 'and', 'you?' ]

concat

concat方法能够将多个数组组合成一个数组,这在异步处理数据最后进行组装的时候特别有用

1
2
3
4
5
6
var b = [ 'hello', 'world,', 'I', 'like'];
var a = [ 'you,', 'and', 'you?' ];
var c = [[1],[2]];

console.log(b.concat(a)); //[ 'hello', 'world,', 'I', 'like', 'you,', 'and', 'you?' ]
console.log(b.concat(a).concat(c)); //[ 'hello', 'world,', 'I', 'like', 'you,', 'and', 'you?', [ 1 ], [ 2 ] ]

很多时候,在最后处理数据的时候,这种数组中嵌套了数组的情况是比较烦的,不过很简单,underscore有方法能够轻松解决它,你知道吗?(๑•́ ₃ •̀๑)

forEach

forEach应该是用的最多的方法了吧,它的作用就是遍历数组中的每一个值,然后你就可以对每一个值进行操作了

1
2
3
4
5
6
var b = ['hello', 'world,', 'I', 'like', 'you,', 'and', 'you?'];

b.forEach(function (ele, index) {
ele = ele + 1;
});
console.log(b); //[ 'hello', 'world,', 'I', 'like', 'you,', 'and', 'you?' ]

关于forEach,更准确的说对于Javascript中的对象,我一直觉得自己的理解已经够解决遇到的一般问题了,但是这个forEach还是给我带来了难题。比如上面这个,我对ele进行改变之后,b数组并没有按照我想象中的改变,结果是一成不变。而在在我的经历中,forEach中对遍历的值进行改变,它最终的结果使能够被改变的。因此,在这个变与不变之间,我没有找到一条清晰的分界线…

map

说了forEach怎么可以没有map,同是遍历数组中的每一个值,map能够将对这些值的操作进行返回为一个新的数组

1
2
3
4
5
6
var b = ['hello', 'world,', 'I', 'like', 'you,', 'and', 'you?'];

console.log(b.map(function (ele){
ele = ele + 1;
return ele;
})); //[ 'hello1', 'world,1', 'I1', 'like1', 'you,1', 'and1', 'you?1' ]

reduce

再说说这个reduce吧,reduce方法遍历数组的每一个值,操作自己定,最后返回一个做了这些累积操作的值,常用来算和吧,实用的呢,它能够产生比filter更强力的功效,这个自己体会吧~

1
2
3
4
5
var summary = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(summary.reduce(function (pre, cur) {
pre += cur;
return pre;
}, 0)); //45

今天就先写这么多吧,细水长流~

你可以很厉害,也可以很坚强,baby~

Share Comments