第二次拉斯维加斯之行见闻

上一次去拉斯维加斯是参加 2012 年 1 月的 AT&T 开发者峰会,这一次是去参加 2014 年的,每次基本上是只待三四天,算上路上时间也就一周左右。

上次的行程是从北京飞旧金山,在旧金山转了9个小时然后转机去拉斯维加斯;这次是乘坐达美航空从北京绕道东京,待两个半小时再到西雅图,然后再待两个半小时飞拉斯维加斯。

这一次由于会议安排的原因空闲时间比较多了一点,每天都能抽出一些时间安排一些额外的研讨会、购物、逛街和吃饭,通过自己的所见所闻,再加上有美国的老板全程陪同,算是对美国有了一些初步的印象。

环境

美国的建筑也许不是很高 – 在西雅图和拉斯维加斯看到的很多建筑都是两三层,三四层的小房子,也许不是很新 – 拉斯维加斯有些建筑比两年前看起来是要旧了一些,比如 China Town 门口的唐僧师徒雕像,再比如金色的 Trump 大楼,但是路上,停车场等看起来都很干净,都不会给人脏和乱的感觉,当然空气质量好,能见度高也是很大的原因。(想想北京的天空,马路和过街天桥)。

sky

我们两次都是住在 stratosphere 赌场酒店,每个房间每天只要 $30, 相当于国内快捷酒店的价格。每次我们要离开的时候都是 CES 大展开始的时候,所以每次离开的前一天都会看到大量的中国人在酒店的赌场里面晃,感觉是被中国人占领了。每个酒店和洗手间都有大量热水和纸供应,但是据说纸全都是回收循环利用的;我在麦当劳买的巨无霸包装上也说有25%是来自重复利用的。

hotel

每个 hotel 都配有一个巨大的免费停车楼

photo 4 (4)

麦当劳的小汉堡 $1, 巨无霸 $7, 星巴克:赌场里面 $5.25, 据说外面是 %5, 牛排:一小块牛排,一个小个的龙虾,一个烤土豆+玉米,大概 $10, 还是在一个比较有名的牛排店,这个是9点半以后打了折扣的价格。

Landry – 一个比较有名的海鲜店,十几个个头不小的虾,一个螃蟹,一个烤土豆米饭+蘑菇 = $22,这个是煎的价格,如果炸的话的是 $20。沙拉是送的,在国内感觉至少要卖你10块钱。

对了,在美国没有热水,冬天也是喝冰水;我住的酒店也不提供热水,也没有烧水壶,吃不习惯西餐带方便面过去的就惨了;可以去超市自己买点水备着。

还有就是中国城的超市几乎能买到和中国超市一样的东西,而且很多比中国还便宜。但是因为是在美国,所以去中餐馆吃中餐有点贵,每个菜的菜价跟国内差不多,比方一个回锅肉 20 多,不过是美元。拉斯维加斯的中国城有金鼎川菜,味道还比较地道,还有越南米粉,韩国料理等等。

landryseafood640

购物(穿和用)

baby care 的东西可以去 CVS 购买,沐浴乳,护臀霜等等经常会有优惠活动和折扣;小宝宝的衣服可以去 Carter’s, 是美国的百年老店,质量,舒适性和样式都很好,很漂亮,2-7折不等,平均大概不到 $10,最后还有50送10的活动,当然只能下一次去再使用。我在 Carter’s 一次买了 200多美元的衣服,大概 20件,感觉比国内要值很多。

拉斯维加斯的奥特莱斯 Coach 工厂店很便宜,我买的一个包 $103,后来在京东看了一下,大概 2000 人民币,Coach 的小钱夹大概 $30, 国内高的能卖到 700,因为 Coach 是美国的品牌;TJMax 有一些打折的商品,我给我闺女淘到了两件 Polo Ralph Lauren 的经典款 T-shirt, 每件只要 $9.99, 不过得等她一岁多之后才能穿。

photo 1 (5)

逛街

拉斯维加斯著名的 Stripe 大街,沿街有很多 hotel 和世界其他地方著名建筑的模仿品,像 Paris 的卢浮宫和埃菲尔铁塔,凯撒,音乐喷泉,金字塔等。

还有 old down town 的大屏幕,比世贸天阶的要大很多,而且是穹顶式的,非常震撼;还有各种艺人表演,重金属热舞,大提琴演奏,各种 几乎可以以假乱真的 cosplay:美国队长,蜘蛛侠,变形金刚,钢铁侠等等,可以跟他们合影。

Old downtown

photo 2 (1)

strip 街

photo 5 (1)

交通

租车很便宜,租当天特价的车更便宜,像迈锐宝才 $20/天,雪佛兰的吉普是 $30/天,比国内的神州租车还要便宜。

出租车比国内的体积要大很多,而且每辆都顶着广告箱,看起来很漂亮;巴士也设计的很漂亮;汽车总体跟北京差不多,尼桑,大众,奔驰,宝马,福特等各种车型都有,区别有两个:一个是美国的皮卡很多,有小一点的,一排坐的,也有像福特 F150, 250, 悍马等两排座大一点的,看到一辆悍马的皮卡是 5 点多排量的,得算是卡车了;另一个区别是像林肯加长的比较多,估计在北京会被堵车和停车愁死。

每个 hotel 都配备巨大的停车楼,每个人都很守规矩,禁止停车的车位和残疾人车位一般是不会有人占的。

十字路口的地方,汽车一般在离行人很远就停下来了(国内基本都是压着你的脚尖拐弯过去的);很少有人会鸣笛。

上飞机的时候,如果前面人正在往上放行李,后面的人会静静地等着(中国人会侧身过去,或者让对方让开;中国人不排队,不守规矩还是很严重的);另外在路上碰到过一次消防车出动,其他所有车听到声音真的是立马停车或是靠边停车。没有看到应急车道,也绝不会出现像北京这种跟在救护车后面飞奔的情况。

其他

  1. 参加技术大会的看起来就像是联合国,除了美国人,还有很多亚裔,印度,非洲裔等,年龄层次也排的很开,二三十到五六十的都有,不像国内年轻人居多,在国外做技术真的可以做得很久。
  2. 空气质量很好,能见度很高。
  3. 明确的规定不到21岁的禁止进入演唱会,小于21岁(这个有点记不太清了)也不能在拉斯维加斯开赌(赌博机上明确提示),就像电影和网络的分级制度一样,这一点美国做的挺好的。
  4. 安全:old down town 每天晚上 10 点多会有大量警车在路口外围待命,但是我最多看到有喝高了的老兄在等红绿灯的时候下车挥舞双臂大吼大叫,其他感觉还是很和谐的;但是过了 10 点在人少的停车场区域步行还是挺可怕的。

总之,感觉在美国,吃的用的相对都很便宜而且质量很好,虽然使用很多资源但是尽量回收重复利用,自尊守规矩同时也很尊重其他人和其他人的劳动。最后在拉斯维加斯,租车,住店, 吃饭都很便宜,要习惯吃美国的牛排,海鲜和墨西哥汉堡和肉卷。还有赌场的啤酒是免费供应的,只要你在那里 play。

 

(更多…)

MongoDB 常用命令

简单的的增删改查数据

在查询结果中指定显示或者不显示某个字段

例如,我们希望在 lessons 集合中查找所有数据,但是不希望在返回结果中包含 slides 字段;因为 slides 是一个巨长的以 base64 表示的图片数组,影响查询结果的阅读。
那么我们就可以在 query object 后面跟上一个参数。如下:

db.lessons.find({}, {slides:0});

同样也可以明确指定显示哪些字段:

db.bios.find(
{ },
{ name: 1, contribs: 1, _id: 0 }
)

比较操作 – 大于和小于

我们要查询时间范围在 startTime 和 endTime 间的数据记录,同时要求 Content 内容是数字 1 到 5。

db.wemessages.find( {$and: [
    { CreateTime: {$gt: (startTime.getTime()/1000).toString()} },
    { CreateTime: {$lt: (endTime.getTime()/1000).toString()} },
    { Content: {$in: ['1','2','3','4','5']} }
  ]}
);

这里我们使用了 $and 逻辑操作符,和 $gt, $lt, $in 比较操作符。

有关 MongoDB 的操作符,参见:http://docs.mongodb.org/manual/reference/operator/query/

更新一条记录的某些属性

使用 $set 表示只更新指定的字段,而不修改其他字段,我们一般情况下都会是这种意图。

db.lessons.update({}, {$set:{'course_id':'c.101'}});

更新多条记录

使用 {multi: true}

db.lessons.update({}, {$set:{'course_id':'c.101'}}, {multi: true});

db.muusers.update({username: 'tom'}, {$set: {mobile: '6508639713'}}, {multi: true});

排序查询结果

使用 sort 方法

db.muusers.find().sort({firsttime: -1});

-1 降序,1 升序

清爽地查看查询结果

使用 pretty 方法

db.lessons.find({lesson: 1}, {slides: 0, mp3voice:0, wavvoice:0, wavvoicemin: 0}).pretty();

查看不存在某个字段的记录

使用 $exists

db.questions.find({'sequence_id': 1, 'pngslide': {$exists: false}});

db.mycollection.find( { "price" : { "$exists" : false } } )

限定查询结果个数 limit, 以及跳过开始的多少条记录 skip

使用 limitskip

db.translation_memory.find({mp3voice: {$exists: false}}, null, {limit: 100});

删除 collection 中的所有内容

使用 collection 的 remove 方法

db.collection.remove();

得到 collection 中一个字段的长度

链式调用

db.lessons.find({lesson: 1}).toArray()[0].slides.join('').length

Collection 操作

更名 collection

使用 renameCollection 方法

db.quizzes.renameCollection('questions');

删除一个字段

使用 $unset

db.questions.update({}, {$unset: {quiz_name:1}}, {multi: true});

db.learning_progress.update({}, {$unset: {lesson:1}}, {multi: true});

db.lessons.update({}, {$unset: {wavvoice:1, wavvoicemin:1}}, {multi: true});

修改一个字段的名称

使用 $rename

db.students.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } )

注意:有些MongoDB的关键词不能用做Collection的名称,例如:group。

演讲:Node.js 软件开发实践分享

2013年12月5日,我在 51CTO 举办的 『Cloud框架和 Node.js 技术沙龙』上进行了主题为「Node.js 软件开发实践分享」的演讲。

内容包括 Node.js 的模块系统,异常捕捉和错误处理同步操作简化和异步工作流控制,以及生产环境运行和日志这四个方面的主题,同时还介绍了我在 Node.js 开发过程中的一些有趣的技术小故事。

非常感谢 51CTO和百度提供的 Node.js 技术交流的机会,也非常感谢参会同学的积极参加和提问。

应有关参会同学的要求,把演讲 PPT 贴了出来,下面是 PDF 格式的链接:
Node.js 软件开发实践分享

12.11 更新:51CTO网站把这次活动放到头条了,并且放出了所有的 ppt 和演讲视频,地址是:http://mobile.51cto.com/exp/cloudasalon1206/

JavaScript 中基本数据类型和引用类型的区别

大多数人系统学习过的程序设计语言,大概主要是在C/C++, Java,C#这些范畴里面,在这些语言的学习过程中最早学到的几个要点之一就是值类型和引用类型的区别,以及函数调用的时候,参数到底是被作为值传递,还是作为引用传递,在函数内部的修改能否反映到函数外部等。相反在 JavaScript 中,这个同样需要搞清楚的话题却往往容易被忽视(或者根本没被意识到)。

下面我们来看一下在 JavaScript 中基本数据类型(Primitive Types)和引用类型(Reference Types)的区别。

(更多…)

Sencha Touch 2.x FAQ – 多级目录下 Ext.application 中 views 的写法

原先我们的 view 目录下有两个文件:Main.js 和 Home.js,相应的在 Ext.application({…}) 中 views 的写法应该如下:

...
views: [
  'Main',
  'Home'
],
...

假设我们重新组织了 view 目录:在 view 目录下新建一个 login 目录,把 Home.js 放入新建的 login 目录;在 view 目录下再新建一个 main 目录,把 Main.js 放入 main 目录。那么现在 views 的写法应该如下:

...
views: [
  'main.Main',
  'login.Home'
],
...

注意,不是 ‘main/Main’,也不是 ‘main\Main’,而是 'main.Main'

Sencha Touch 2.x FAQ – 把 app/view 下面的文件再用几个目录组织起来之后,程序应该相应的做什么样的修改?

按照 Sencha Touch 的编码约定,把 view 下面的文件的类名改成带子目录的即可,
比如原先我们有一个 Main.js 的 view 文件在目录 app/view 下面,Main.js 中的类定义应该类似于:Ext.define(‘Sencha.view.Main‘, {… }); 这样。

现在我们在 app/view 下面又建了一个 main 目录,即 app/view/main 目录,我们把 Main.js 移到现在这个目录下面。那么现在 Main.js 中的类定义就得改成:Ext.define(‘Sencha.view.main.Main‘, {…}); 依此类推即可。

Sencha Touch 编码约定 -> 命名空间和代码组织

  1. OrganizationName.group[.subgroup].ClassName
  2. 每个类一个单独的文件
  3. 文件名称要和类名一致
  • Ext.chart.Label -> Ext/chart/Label.js
  • Ext.data.writer.Xml -> Ext/data/writer/Xml.js
  • MyApp.field.Password -> MyApp/field/Password.js

本文地址:http://www.tfan.org/sencha-touch-2-x-faq-namespacing-and-code-organization

Sencha Touch 2.x FAQ – 增加一个 View 到 tabpanel 都需要哪些必备的配置信息 ?

和 iOS 类似,要在 tabpanel 中作为一个 Tab 显示的 View 需要提供 tabbar 显示所需的的 title 和 icon 以供正常显示。其中 title 或 icon 两个必须提供一个。否则会提示:Uncaught Error: [ERROR][Ext.Container#onFirstItemAdd] Adding a card to a tab container without specifying any tab configuration

在 View 的 Config 下面配置 titleiconCls 两个属性,例如

Ext.define('mu.view.PresidentList', {
 extend: 'Ext.List',
 xtype: 'president_list',

 config: {
 title: 'presidents',
 iconCls: 'team',
 itemTpl: '{firstName} {lastName}',
 store: "Presidents"
 }
});

原文地址:http://www.tfan.org/faq-configuration-required-to-add-view-to-tab-panel/