How to replace multiple strings with multiple other strings in Javascript?

Question

I have a string called I have cats, dogs, and goats., and I want to replace to I have AA, BB, and CC..

How to make it happen only with one function?

Answer

If you only wanna it happen easily, just need one function to replace all of them.

1
2
3
4
5
6
7
8
9
var str = "I have cats, dogs, and goats";
var mapObj = {
cats:"AA",
dogs:"BB",
goats:"CC"
};
str = str.replace(/cat|dog|goat/gi, function(matched){
return mapObj[matched];
});

Reference


This is the end of post

How to get properties values of a object without knowing their keys in Javascript?

Question

So there is a javascript object like

1
2
3
4
5
var objects = {
type:"Fiat",
model:"500",
color:"white"
}

If the key names are random, and we don’t know. How to get each property’s value with a loop?

Answer

By using for..in.. loop:

1
2
3
for(var key in objects) {
var value = objects[key];
}

Reference


This is the end of post

How to solve [cannot read property bar of undefined] in Javascript?

Question

I have a property of an Obejct, like profile.user.name.lastName, but somethings, name is undefined, so there is no way to access profile.user.name.lastName, the error message will be:

1
Uncaught TypeError: Cannot read property 'name' of undefined

Answer

Just need to check for profile.user.name, if it exists, pass the name value. Using ternary conditional operator to solve this issue.

1
profile.user.name ? profile.user.name.lastName : undefined

Reference


This is the end of post

NBA 球馆巡礼:波士顿凯尔特人 - TD 花园

基本信息

  • 球队:波士顿凯尔特人(Boston Celtics)
  • 城市:波士顿,马萨诸塞州
  • 球馆名称:TD 花园(TD Garden)
  • 第一次现场看球日期:2018 年 2 月 4 日
  • 对阵双方:波特兰开拓者 @ 波士顿凯尔特人

现场观赛体验

波士顿不愧是体育之都!怎么说呢,看下图就知道了,这是波士顿过去在美国四大联赛(NBA、NFL、MLB、NHL)收获的冠军。

01

去的当天因为是 NFL 超级碗比赛日,对阵双方是新英格兰爱国者和费城老鹰(当晚比赛赛果是费城老鹰夺得历史上球队第一个超级碗冠军),所以有很多观众身着爱国者的球衣,同时也有很多观众身着凯尔特人的球衣,而且数量还不少,目测是我看到过身穿球衣球迷占所有球迷比重最高的一次,足以彰显体育已经成为了波士顿人民生活的一部分。

进入球馆,抬头望上看就能看到挂满了凯尔特人的旗帜,总冠军旗帜、东部冠军旗帜、分区冠军旗帜,满满地挂满了球馆屋顶,彰显了波士顿凯尔特人曾经的辉煌岁月。如此之多的旗帜,能与之匹敌的大概只有洛杉矶湖人了,当然我还没去过斯坦普斯球馆,但 TD 花园的旗帜是我目前看到过最多的。

说一个小小的细节,如果去球队历史战绩不好的球馆,比如篮网主场巴克莱中心,你会看到篮网会把分区冠军旗帜、东部冠军旗帜分别罗列出来,例如 2002 年和 2003 年东部冠军旗帜会挂出两面,然后退役球衣也会分别单独挂出来。但凯尔特人不同,因为历史上获得了太多东部和分区冠军,退役了太多的球衣号码,所以一面旗帜上写上很多年份(每面 10 个年份),然而还是不够,挂了很多面,下图可以看到。退役球衣的号码也是一面旗帜挂八个号码,挂了很多面。只有 NBA 总冠军的旗帜才是单独挂出来,然后也是因为多年夺冠,也是非常多的旗。由于 TD 花园是篮球和冰球共用的球馆,这导致球馆的上空挂满了超级多的旗帜,其中也包括 NHL 冰球队 Boston Bruins(波士顿棕熊)的旗帜。

01 01 01

现场看球的体验也是非常好,球迷都非常热情,声浪此起彼伏,特别是两队比分焦灼的时候,呼喊声真的是震耳欲聋。每次主队进球,现场球迷都会给予非常高的喝彩!

比赛的高潮是第四节,双方比分非常接近,球迷也被点燃了,每次进攻回合都会呐喊「Let’s Go, Celtics!」,每次防守回合也会高呼「Defence!」。

特别是最后霍福德的压哨绝杀,燃爆全场,真是不虚此行。这也是我现场看球几十次来,第一次经历压哨绝杀!

球馆体验

这是一个非常具有历史的球馆,从我之前的描述中就可以看到。球馆内部也有很多特别历史纪念意义的东西,墙壁上也有很多凯尔特人退役球员的图片。见下图。

01 01

每个座位之间间距比较窄,离了比较近,所以观众坐多了的话,会看起来满满堂堂全是人。

01

在一层有个购买纪念品、球衣的商店,里面售卖 NBA 凯尔特人和 NHL 棕熊两队的商品。

交通指引

球馆的具体地址是:100 Legends Way, Boston, Massachusetts, 02114

如果你是从波士顿机场过去的话,搭乘地铁需要 40 分钟,如果打车的话,大概 15 分钟左右。我是从纽约飞往波士顿的,然后直接打车过去的话,Uber 差不多 15 刀左右。

球馆在波士顿的市中心,交通也是十分便利。同时球馆也是和波士顿地铁站连在一起的,如果坐地铁的话,到站之后直接按指示牌走就能不用出大楼抵达球馆内部。

当地风土人情

波士顿是美国的历史名城、文化古城,波士顿见证了美国建国初期的历史,同时也是学术之都。如果时间充裕,十分推荐在波士顿多玩一两天。稍微推荐几个游玩景点,也是本人去玩过的。

自由之路:在波士顿城区有一条红砖铺出的路,全场 4 公里,因为全部是红砖,所以非常容易辨认。在这条自由之路上一共有 16 处历史古迹,可以走着瞧瞧。图二则是「指环王」比尔·拉塞尔的一块地砖。

01 01

哈佛大学与麻省理工学院:这两个大学不在波士顿主城区,属于郊外,但可以坐地铁直接达到。两个学校连一起,走着走着就可以把两个学校一起逛了。下图歪歪扭扭的建筑是 MIT 的著名建筑 Ray and Maria Stata Center,出自著名建筑师 Frank Gehry 之手。雕像则是哈佛大学的创始人,John Harvard。

02 01 01

昆西市场:坐落在波士顿的市区,是一个集商业与美食于一身的大市场,在这里可以买到各种各样的小玩意儿,也可以吃到不同国家都美食。

01

波士顿大龙虾:大龙虾属于波士顿的招牌之一,来了这里一定要找个当地餐馆吃一整只大龙虾。

01 01


本文完

詹姆斯 · 哈登:「天神下凡」般的 60 分三双

新闻:1 月 30 日晚,在火箭主场对阵魔术的比赛中,詹姆斯哈登砍下 60 分 10 篮板 11 助攻,拿到生涯第 34 次三双,带领球队 114-107 取胜。

评价

先上结论:詹姆斯 · 哈登犹如天神下凡,打出了史诗级别般的数据。

吹的部分在结尾,打出这种「前无古人后无来者」的数据,在我看来,必须要满足「天时、地利、人和」三者缺一不可。

天时地利人和

天时:

  • 保罗和阿里扎的缺阵。轮换阵容缺少两员大将,意味着其他球员的出场时间会有所增加,出场时间的增加意味着数据会更加亮眼。
  • 埃里克 · 戈登的临时退出。如果说保罗和阿里扎的缺阵是在提前计划中的话,那戈登的退出完全就是意料之外。火箭健康阵容下的后卫轮换是哈登、保罗和戈登,在后两位同时缺阵的情况下,哈登变成了后卫中的独苗,把三个人的时间和出手都给到一个人,数据爆炸也没有那么意外。
  • 队友的发挥不佳。除去哈登外,只有安德森、卡佩拉、格林三人得分上双,分别是 10、11、12 分。如果队友发挥出色,比赛早花了,也没哈登什么事情了。
  • 对手的发挥出色。魔术在 31 次三分出手的情况下,命中了其中的 15 计,三分命中率达到 48.39%,其中 6 人得分上双。在打出历史级别数据的比赛中,两队比分必须焦灼,不然比赛肯定是一边倒,也早花了。在此,特别感谢奥兰多魔术队。

地利:

  • 火箭丰田中心主场。主场优势在第四节特别明显,在得分、助攻、篮板慢慢上涨的同时,主场观众的情绪也慢慢高涨,预料到肯定有记录要被打破。如果说哈登最后时刻的 3+1 是杀死比赛的进球,那么主场观众给了哈登这一助攻。情绪高昂的主场情绪,往往也可以带动球星的情绪,打出神奇般的表现。
  • 安德森的发挥。为什么我把这个放在地利呢?因为这是火箭主场啊!安德森本场发挥不佳,作为火箭进攻端的一门火炮,安德森本场并没有获得太多的出手,仅仅获得 10 分。

人和:

  • 必须要手感非常好。虽然哈登上半场七次三分投篮无一命中,但下半场命中五计三分,而且两分命中率也非常高,不断突破到魔术的内线。
  • 必须体力非常好。在戈登中场决定不回来之后,同时在保罗没有出场的情况下,哈登肯定从德安东尼里的嘴里听到,他必须在下半场多加点班,谁想,直接打满下半场。在出场时间保证的前提下,哈登防守端开启省电模式,进攻端再关闭省电模式,合理地分配体力,才保证了第四节最后五分钟仍然在进攻端打出非常优秀的表现。
  • 鲍比 · 布朗的短信。啥也不说了,直接看短信吧,注意看时间。 01

吹的部分:

  • 哈登拿到 60 分,刷新了个人得分纪录;
  • 哈登拿到 60 分,刷新休斯敦火箭队队史得分记录;
  • 哈登拿到 60 分,成为历史第 25 位拿到 60 + 得分的球员,现役球员中的第五位;
  • 哈登拿到 60 + 三双,联盟第一位得到 60 + 三双的队员;
  • 此役过后,哈登职业生涯拿到三次 50 + 三双,与威少并列联盟历史第一;

本文完

我的第一个云端机器人:Hubot

「扭腰日报」今天招募了一位新员工:hubot!它是一位 24 小时都在运行的机器人,而且是「免费」的!在工作之前的组,我们也有这样一位 bot 生活在 Slack 的频道里,每当需要 deployment 的时候,直接 @ 一下它就好,或者网站出了什么问题,bot 也会立即发送消息到指定的 Slack 频道里。

这次亲自动手配置属于自己的 bot 完全是因为看到湾区日报的第一个 “员工”:Slack/Hubot·的文章,通过 bot 不仅可以大大节省时间,而且增强了移动性,很多事情都可以直接在手机上通过 slack 来控制。

开始第一步

前提:一台装有 npm 和 node.js 的电脑。

下载 Hubot

用 terminal 打开到指定文件夹的目录,使用以下命令全局安装 hubot:

1
npm install -g yo generator-hubot

然后使用以下命令新建一个 hubot:

1
yo hubot --adapter=slack

这时候 terminal 会让你输入 bot 的属性,比如名字描述之类的,输入安装完成后,一个 hubot 就出生在你的本地电脑里。

配置 Slack

进入 Slack 的 App Directory 的页面,选择 Bots 或者 Hubot 都行,生成之后会产生一个 API Token,这样 Slack 的配置算是完成了,同时你也可以修改 bot 的名字和头像。

配置脚本

开始第一个「Hello World」脚本。进入 scripts 的文件夹,新建一个 hello-world.coffee 的script,然后将以下代码复制进去。

1
2
3
module.exports = (robot) ->
robot.respond /hello/i, (msg) ->
msg.send 'World!'

运行与部署

运行 Hubot

本地运行很简单,直接运行以下的命令行,就可以本地运行了,将 xoxb-YOUR-TOKEN-HERE 替换成你自己的 API Token。

1
HUBOT_SLACK_TOKEN=xoxb-YOUR-TOKEN-HERE ./bin/hubot --adapter slack

想必你的 Slack 已经有了一个 bot,你可以直接在它的对话栏里输入 hello, 它就会回复 World!。同时你可以把它加入指定的频道 Channel,@它以后在加上命令也会得到相应的回复,比如@bot hello

部署到 Heroku 云端运行

第一步完成了,需要将 hubot 部署到云端,文档中提供了好几个方案,这里选择 Heroku 作为平台,可以作为免费云部署。

  1. 在 terminal 中使用 heroku login 进入 heroku,然后创建一个新的 app,使用以下命令:heroku create
  2. 将 Slack 的 API Token 加入 configure,使用以下命令:heroku config:set HUBOT_SLACK_TOKEN=xoxb-YOUR-TOKEN-HERE
  3. 将代码上传到 Heroku 的服务器,使用以下命令:git push heroku master

这样你的 hubot 就进入云上了,生活在了 Heroku 的服务器上了。

24/7 工作

因为 Heroku 的免费 app 有自动睡眠的设置,这里是关于 Free Dyno Hours 的介绍:Free Dyno Hours

这就导致 Hubot 不能 24 小时一直都在运行,所以我们需要间隔一段时间去唤醒这个 app。Kaffeine 就是一个让 Heroku app 持续唤醒的网站,把你 app 的网址输入进去,Kaffeine 就会让它一直处于运行状态了。

Heroku 命令行

  • heroku ps -a your-app-name : 查询使用时间
  • heroku logs -a your-app-name : 查询 app 的日志

参考


本文完

我对智能家居的理解

现在市面上有越来越多的智能家居,那「智能」应该如何服务我们呢?我想谈谈我对此的理解。

我把「智能家居」分成了以下四类,从「最智能」到「最不智能」。

  1. 场景自动化
  2. 语音智能化
  3. 中心连接化
  4. 应用控制化

场景自动化

这应该是最智能的家居类型,当然需要实现场景的自动化,前期需要花费一定的时间来配置,也少不了某些装备来作为桥烈。以下是几个我能想到的实例:

  • 打开房子门的瞬间,特定房间的灯将自动开启,同时也可以有时间限制,比如只有在晚上 6 点以后才会开灯;
  • 房间的温度、湿度降低或者升到某种程度,会开启空调、暖气、加湿器、去湿气等设备;
  • 在大门口有摄像头的前提下,如果有任何人的动静,自动通知同时也自动录制视频;
  • 在使用小米门窗传感器的情况下,在特定时间如果门窗开启,则多功能网关发出警戒声;

语音智能化

通过语音来控制你的装备,类似设备有 Amazon Echo, Google Home 和 Apple HomePod。以下是几个我能想到的实例:

  • 通过语音来控制某个房间灯泡的亮度、颜色、场景设置;
  • 通过语音来播放某个音乐人的专辑或者自己的播放列表;
  • 通过语音来降低、升高空调温度

中心连接化

在没有语音音箱作为桥梁衔接的情况下,使用某个单一手机 app 来作为 hub 控制整体的智能家居。比如如果你有大量的小米智能家居设备,只需要使用小米的 Mi Home app 来控制所有的小米智能家居。或者在没有 Apple HomePod 的前提下,使用 iPhone 内置的 Home app 来控制所有支持 HomeKit 的家居设备。以下是几个我能想到的实例:

  • 通过小米 Mi Home app 来查看房间的温度湿度,也可以控制某些设备;
  • 使用 iPhone 的 Home App 来设置场景,需要通过用户点击来实现;

应用控制化

这应该是最最基本的智能家居的应用场景。购买某个设备后,下载相应的 app,然后配置后使用 app 来控制。以下是几个我能想到的实例:

  • 使用 app 来开关空调,调节温度;
  • 使用 app 来开关灯泡,调节亮度;

本文完

智能家居场景之一:配合 Google Home 来控制 Yeelight 灯泡

在圣诞节的时候入手了一台 Google Home。它是什么呢?你可以把它理解成 Amazon Echo 的竞品,功能几乎相似,并无差别。

前提条件

  • Google Home
  • Yeelight 灯泡
  • ifttt 服务

开始配置

Yeelight 配置

购买 Yeelight 彩色灯泡后,下载 Yeelight 的 app,应该它是小米的生态链产品,使用小米账号即可登录,想灯泡和 app 相互 pair。然后在 app 里设置不同场景下的灯泡颜色和亮度,比如「游戏」、「睡觉」模式。

Google Home

打开 Google Home app,在 Home Control 里将 Yeelight 添加到你的 Device 里。

ifttt 设置

在 ifttt 上配置你的 Google Assistant 的服务,同时也配置 Yeelight 的服务,同样也是用小米账户登录,它会读取到你现有连接的灯泡。下面是我的 applet 原理: 如果「你对 Google Assistant 说游戏模式的命令」,那么就「将 Yeelight 的灯泡切换成游戏模式」。

对 Google Assistant 说命令就相当于你对 Google Home 说,你可以这样理解:Google Home 里内置了 Google Assistant 的服务。

场景唤起命令

在没有配置 ifttt 的前提下,可以直接通过「turn on my lights」、「turn off my lights」来控制灯泡的开关。

在配置 ifttt 的前提下,通过不同命令来调节不同的场景,比如「Change my lights to Game Mode」就会自动切换成「Game Mode」。

场景视频


本文完

别了,2017!

人的一生会经历七八十个「年」,但并不会记得清每一年发生了什么,然而有些年肯定会记忆犹新。

「2017」对我来说就是属于记忆犹新的那一年,因为在这一年里发生了很多事情,有好的事情,也有不好的事情,我都把它们当成 blessing。

2017 年过去了,我很怀念它。

01


本文完

机会是给有成就 > 有经历 > 有准备 > 没准备的人

有人在知乎上提问「有在美国 Google Facebook 的工作经历,回国发展会有怎样的机会?」

其中有一个叫做梁小明回答说的挺有道理的,与诸位共勉。

名校名企只是一种经历,不是一种成就。有经历的人多,有成就的人少

就好比名校的 MBA 每年有千千万万,但这只是一种经历。张小龙并没有读过什么名校 MBA,但是人家做出了 QQ 邮箱,做出了微信,这是一种成就。从我个人的经历来看,机会一般会先给有成就的人,然后会给有经历的人,最后会给有准备的人。举个例子,现在某巨头想进入社交网络领域,需要一个 CEO,这个机会会先给张小龙这样有成就的人;然后会给之前在 Facebook 或者 Wechat 做过经理职务的,这种有经历的人;如果这两种人都找不到,机会会给有准备的人。题主如果已经有了 Google,Facebook 的工作经历的话,不妨去努力做点成就出来吧,再去找个机会去个 BAT 什么的经历一番,其实已经没有太大意义了。

所以说,如果有一天「机会」来找人,是会按照这个顺序来找的:

  1. 成就的人
  2. 经历的人
  3. 准备的人
  4. 没准备的人

本文完