Frossky 发布的文章

官方原文为系统内置事件之触摸事件冒泡
感觉原文讲得并不清晰, 并且似乎和实际有出入.
原文中讲到两种冒泡:
* 一种是沿着节点树, 也就是层级管理器中的节点关系, 从子节点向父节点冒泡;
* 另一种是沿着视图中的上下层覆盖关系, 从上层往下层冒泡.
经过测试发现, 沿着节点树冒泡, 每一层节点都可以捕获到事件, 除非在某一层上明确使用e.stopPropagation()
而沿着视图冒泡, 有两点不同:
1. 事件会在最先捕获touch事件的节点上终止,不继续向下层冒泡;
2. 捕获任一touch事件(如touchend), 其他touch事件(touchstart, touchmove, touchcancel)都在此节点上终止, 下层视图都不能收到事件;

href里面也可以运行javascript!

<a href="javascript:alert('i am href')">

那么, onclick和href哪个先运行? 答案是onclick

<a href="javascript:alert('i am href')" onclick="alert('i am onclick')">

并且onclick返回false会阻止href的运行.

<a href="javascript:alert('i am href')" onclick="alert('i am onclick');return false;">

额, 当然是替代console.log了. 在node.js中用process.stdout.write(). 浏览器环境? 如果你是为了不换行输出数组值, 可以先把数组连接了再输出: console.log(somearray.join())

  1. 早上约9点访问魅族官网, 选择寄送快修服务, 填写如下资料:

序列号, 手机号, 故障类型, 收件地址, 返回地址等.
页面UI体验, 然而存在问题是:

A. 显示可以填写SN/IMEI的地方, 填入IMEI, 在第二步提交时候却报错,需要返回第一步, 重新填写SN, 而第一步又是再次需要输入手机验证码的. 这样的话, 应该在第一步验证好了IMEI或者SN后再继续下一步.
B. 第一页的SN在手机的关于页面中写的是"序列号", 很多人其实不知道SN就是序列号的.

  1. 大约1个半小时后(10:50),魅族来电, 一个mm询问手机故障类型是否和网上所选的相同, 我是进水后触屏不能用. 额外再问了这几个问题:

A. 手机触屏不能使用是在进水前还是进水后;
B. 是否购买了手机保险;

回答完后, MM做了如下警示:

A. 如维修发现是人为问题, 需要支付费用, 费用以检测为准;
B. 送修邮寄费用双程往返为40元, 含保价费.(额, 有点儿贵, 深圳同城单程一般是6元)询问是要自己寄送还是上门来收. 选择上门来收体验一下,也方便些.
C. 说明会清理所有个人信息, 要求我做好备份. 手机外表请我自行拍照以防备损害. 同时发送了短信请我查看.
D. 询问还有什么问题, 请我评价服务.

  1. 查收短信

立刻收到的第一条短信

尊敬的用户,您好:感谢您选择魅族寄送快修服务,请您在寄出之前按照以下事项操作:1、请自行备份资料,公司不做备份;2、配件、贴膜、装饰物,请您自行保留无需寄出;3、如有保修卡和包装盒,请尽量随机器一同寄出;4、请在包裹内附上一张纸注明机器的报修故障,以便于工程师处理;5、寄出前对手机进行拍照自行保留,以免运输造成物流损坏可作为凭证;6、建议选择顺丰“到付”至寄修中心(请勿保价)。【魅族科技】

几乎同时收到的第二条短信

您好,您的服务请求已受理,快递工作人员将尽快为您上门取件,请保持电话畅通。如超时未能取得联系,请致电魅族客服为您重新预约,或可自行邮寄至以下地址:深圳市福田区华强北路1002号赛格广场38层3809,腾新奎收,0755-23895496/23895497。【魅族科技】

约半小时后收到的第三条短信

顺丰小哥150xxxxxxxx正上门收件,运单号xxxxxxxxxxxxxx,验证码xxxx。【顺丰速运】
  1. 写好了故障纸条, 清理好手机, 大约过了40分钟, 到12:00时顺丰上门收件. 额, 这个收件过程感觉很不专业, 直接拿走了手机和纸条, 没有现场封装, 也没有给任何回执, 拿了就走....???问了一下没有什么单据吗? 回答是系统里有...

  2. 之后约5个小时顺丰的这个运单都查不到的物流跟踪, 心想似乎真的不如自己寄送的好... 直到下午5:00物流跟踪出现"已收取快件"信息.

  3. 第二天早上10:43分, 显示已签收.
  4. 在10:40的时候(额, 比签收时间还早), 收到0755-23895480的来电, 说屏幕要换, 加邮费总共需要收302元...额, 赶上一台二手机价格了...考虑了一下, 给此电话回电说不需要了, 你还是给我寄回来吧...
  5. 卖掉如何? 在魅族的手机回收mcycle上评估了一下, 价格为50元...汗...

由于serialport里面有一些原生编译的代码需要运行node-gyp提前build一下, 而node-gyp使用的node V8引擎版本与electron的V8引擎版本不同, 导致直接在node中可以require('serialport'),而在electron中却不行.
在electron中报错如下:

var SP = require('serialport')
C:\r\electron\macgetter\node_modules\bindings\bindings.js:83 Uncaught Error: A dynamic link library (DLL) initialization routine failed.
\\?\C:\r\electron\macgetter\node_modules\serialport\build\Release\serialport.node
    at Error (native)
    at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:168:20)
    at Object.Module._extensions..node (module.js:583:18)
    at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:168:20)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.require (module.js:483:17)
    at require (internal/module.js:20:19)
    at bindings (C:\r\electron\macgetter\node_modules\bindings\bindings.js:76:44)module.(anonymous function) @ ELECTRON_ASAR.js:168Module._extensions..node @ module.js:583module.(anonymous function) @ ELECTRON_ASAR.js:168Module.load @ module.js:473tryModuleLoad @ module.js:432Module._load @ module.js:424Module.require @ module.js:483require @ internal/module.js:20bindings @ C:\r\electron\macgetter\node_modules\bindings\bindings.js:76(anonymous function) @ C:\r\electron\macgetter\node_modules\serialport\lib\bindings.js:3Module._compile @ module.js:556Module._extensions..js @ module.js:565Module.load @ module.js:473tryModuleLoad @ module.js:432Module._load @ module.js:424Module.require @ module.js:483require @ internal/module.js:20(anonymous function) @ C:\r\electron\macgetter\node_modules\serialport\lib\serialport.js:12Module._compile @ module.js:556Module._extensions..js @ module.js:565Module.load @ module.js:473tryModuleLoad @ module.js:432Module._load @ module.js:424Module.require @ module.js:483require @ internal/module.js:20(anonymous function) @ VM133:1

查找了一些相关文档, 如下:
electron使用serialport
Using node-serialport in an electron app

node-serialport的官方回答, 看下面voodootikigod的回答:
Tracking Electron support #538

electron的官方回答:
Using Native Node Modules

先实践着...

下面这篇文章看完让人感慨万分, 父母将自己从一个习惯而舒适的老地方连根拔起, 随着儿女看小孩, 甚至再次为儿女付出金钱的故事, 可能每天都在上演, 尤其对于深圳, 是一种很典型的情况. 其实去了美国只是这种典型情况的极端表现. 我们这一代人拼命意图在一个看上去更好的城市甚至更好的国家扎根, 意图有更好的工作甚至跟着风潮去创业, 而生活稍有波动起伏就难以承受. 除此文中之人外, 前阵子那个疑似华为的离职员工, 房租加月供近两万, 一旦离职便哭穷又是一个例子. 而今年春节后的深圳新闻又提到反向过年: 父母随子女在大城市过年已经渐渐成了气候, 更说明了上一代父母随儿女而动已经渐渐成了典型而普遍的事情. 在这其中, 年迈的父母们又成为了身心钱财的付出对象. 身为这些父母们的儿女, 我们这一代人是不是太自私了?

“卖房投儿”赴美养老的悲剧

         (文/茕茕 海海)      
———————————
      朱力和刘晓莉夫妇是天津实验中学退休老师,朱显明是他们的独生儿子。朱显明很争气,1997年被美国圣迭戈大学录取。在美留学期间,朱显明和东北姑娘柳婷婷相恋,两人大学毕业后决定在美国创业。当时朱力的弟弟已经在美国成家立业。朱力夫妇表示支持,节衣缩食,补课挣钱,尽全力资助儿子在美国亚凯迪亚市买房、结婚、生子。
      作为一对空巢老人,朱力和刘晓莉的烦恼难以启齿:这些年儿子非但没有寄回一分钱美金,结婚和生子也要老两口换些美金补贴他,一辈子的积蓄已被儿子掏空;由于家中只剩两位老人,每天毫无生气,水管坏了、灯管坏了也得去找邻居家的儿子帮忙。2000年,朱力又查出了心脏病。老两口经常叹息:把儿子送到国外去,是不是错了?朱显明在美的日子也不容易。由于他学的机械专业就业率低,工资也少,生活入不敷出。而妻子柳婷婷一直没固定工作,偶尔为企业做设计赚钱。
2012年底,朱显明携妻儿回天津过年。三代人聊起了各自的艰辛都感慨万分。朱显明告诉父母,他想创业,经营卡车租赁。可由于曾经拖欠信用卡还款,现在他和妻子无法贷款。朱力夫妇也没什么存款,但市中心的房子价值300多万。柳婷婷说:“天津雾霾很重,医疗条件比美国差,二老在这边我们也不放心……不如跟我们去美国养老吧。”
      老两口终于动了卖掉房子帮儿子创业的念头——去美国养老,不但一家团圆,还能帮他们带孩子、卖房钱帮他们解决创业资金,一举多得……但朱力和刘晓莉还是慎重,又电话咨询在美国的弟弟,弟弟认为:“在美国养老当然不错,离我也近。不过你们先把财产分清楚,省得发生纠纷……”
      2013年夏天,朱力、刘晓莉卖掉房子,把300多万房款换成美元,然后飞往美国。
      朱显明住的是一套联排公寓,倒也够用。白天朱显明跑业务,柳婷婷在家画图。朱力夫妇像国内退休老人一样做饭、接送孙子上学,其乐融融。
      但朱力和刘晓莉在美住了半个多月,新奇劲儿过了,开始感到诸多不便。
      虽然附近也有中国人,可大家并不熟识,很难交心。以前朱力喜欢在楼下找其他老头儿下象棋,刘晓莉喜欢跳广场舞,在这边都不可能。且他们买菜必须去超市。虽然受过高等教育,可他们的英语早已退化,只靠认识的寥寥几个单词根本没办法生存,看不懂家用电器说明书,听不懂大家讲话,没办法看电视,没办法问路,慢慢地对出门产生了恐惧。
      柳婷婷性子比较急躁。一天早上她和朱显明去办事,冰箱里没有食物了,朱力随口说:“你买了菜再走吧。”柳婷婷不耐烦地叫:“哎呀,你们不会英语就不知道学吗?谁生下来就会英语?再说你们早晚得学买菜。实在不行买点牛肉罐头凑合一下算了。”
      柳婷婷走后,朱力压抑多日的火气蹿了上来。他问刘晓莉:“咱们来给他们当保姆的?又出钱又出力还讨不到好脸色?”刘晓莉虽然心中不快,但为了避免矛盾加深,只得安慰老伴:“想跟孩子住一块儿,这一点咱们就得有心理准备。”更让他们无法接受的是,孙子也不太领他们的情,感情也不深,每次老人对他们说话声音大点,他们就会立刻跑到妈妈面前用英语告状。朱力夫妇听不懂嘀咕什么,但感到柳婷婷安慰孙子的时候会说自己的不好,好像他们就是一些外人。
慢慢地,朱力和刘晓莉感到在这个家里,其实比在国内更加孤独。见老伴不开心,刘晓莉无奈地提醒他:“是咱们需要孩子,不是孩子需要咱们。再说到美国来也是咱们自己的选择。”
      7月的一天,朱力邀请住在洛杉矶的弟弟一家过来做客。弟弟带来几张学英语的碟片,刘晓莉让他把碟片放自己卧室柜子上,免得被贪玩的小孙子弄坏。结果朱力的弟弟推错孩子们的房门,大孙子和小孙子在房内“嗷嗷”地叫起来,大声让他出去。媳妇柳婷婷也在房内和孩子游戏,但她既不阻止和安抚孩子,就连向叔叔抱歉的表示也没有。
      朱力气坏了,找柳婷婷兴师问罪:“不管怎么说我弟弟是他们的长辈,你是怎么教育的孩子?”柳婷婷却反问道:“是谁没有礼貌在先?”朱力说:“朱显明是我生的,这房子是我们掏了大半钱支援你们买的,你们创业的钱也是我们出的,我弟弟开错一个门就是没有礼貌了?”不料柳婷婷一点也不饶人:“这就是我们不愿回国的原因,你们始终不尊重孩子,他们是全新的个体,不属于任何人。”一直不赞成双方吵架的刘晓莉忍不住,替老伴帮腔:“孩子需要尊重,老人不需要尊重吗?”事后,刘晓莉曾向朱力的弟弟抱怨:“柳婷婷既想享受中国式的长辈为她牺牲,又想享受美国式的自由和不负责,谁能有她鸡贼?”弟弟一家深表理解,说:“如果你们觉得生活不便,可以把卖房子的钱要回来,重新归国养老,谁也别指望。”
      朱力和刘晓莉在失落之余,心中有些动摇。此后不久,双方再次爆发大战争。
      那天早上,朱力推着两岁的小孙子去买东西,没注意小孙子拆了一袋饼干。店员在监控里看到,大声制止他。朱力深感抱歉,就像小时候训诫儿子一样,呵斥小孙子把小手伸出来,在他的手上拍了两下。不料店员立马打电话报警。朱力好说歹说,店员答应先打电话让孩子的监护人过来。
      柳婷婷和刘晓莉匆匆赶来,一见面就和朱力吵起来。朱力解释:“我这么做一是训诫孩子,二也是做给店员看的,孩子的手轻轻地拍两下怎么了?”柳婷婷大叫:“一是一二是二,孩子吃了饼干你买单就是了,做给店员看什么?你知道这对孩子是多大的伤害吗?”刘晓莉见朱力委屈,也心头很有气,加入争吵阵营:“我和你爸爸从小这么教育朱显明的,不也照样把他培养到美国来了吗?”
      店员见双方越吵越凶,再一次电话报警。警方赶到后,做了笔录,要求他们当面和解。
      为防止事情闹大,刘晓莉再一次说服老伴忍气吞声。因为两人非但不通这边的语言,连法律也不懂,根本不知自己哪一步会惹来什么样的后果。
      回家后,朱力和刘晓莉拒绝和儿媳说话,也不做晚饭。朱显明听说此事,先和妻子谈,过了会儿他到父母房间叹了一声:“我生意焦头烂额,对你们的矛盾有心无力。我跟柳婷婷说过很多次,让她别给我添乱,她就是不听,也只能求你们做出让步。要不你们去叔叔家住段时间,我手头缓一缓帮你们凑点钱再回国买一套房子吧。”见40出头的儿子已经早生华发,刘晓莉心里也不是滋味,她和老伴接受了他的建议。
      第二天一清早,朱力夫妇暂时搬到了洛杉矶的朱力弟弟家。自从到美国,他们经常感到心慌气短、焦虑抑郁。有时打电话给天津的亲朋好友,一听到他们的声音刘晓莉就想流泪。天津的老头老太们都对朱力夫妇万分羡慕,他们的酸楚也不知道该怎么说起……恨不得立即回国的念头越来越强烈。
      朱力和刘晓莉决定,只要儿子把卖房的钱还给他们,他们立刻回天津,以后养老也不需他负责。“与其死在美国养老院,还不如死在中国养老院。”一辈子没这么憋屈的朱力恨恨地说。
      2014年1月,老两口回到朱显明家,和他商量回国的事。但朱显明告诉他们,他确实拿不出钱来。1月6日晚,朱力又和儿子、媳妇谈,没有谈好。
      第二天朱显明出门上班了,大孙子上幼儿园。朱力和刘晓莉决定说服最大的障碍——媳妇。没想到当朱力一张嘴,柳婷婷就用汉语夹着英语讲起来:“当初到美国难道是我们逼你们来的吗?卖房子的时候我们用枪指着你们了吗?”她的刻薄和“装佯”瞬间将朱力的怒火点燃。双方大吵起来。柳婷婷在吵的时候说,在美国人们无需对父母生老病死负责,一切交给政府。她又用英语说了几句:“当初我有机会嫁给某某某的,如果不是你儿子死缠烂打我过得比现在好多了。”朱力和刘晓莉听懂了大概。朱力气得脸色发白。突然,他冲进厨房操起一把菜刀,当着刘晓莉和2岁孙子的面一顿乱砍!柳婷婷的“机关枪”一刹那变成惨叫,立即就被砍倒在地,浑身往外冒血!
      当吓蒙的刘晓莉反应过来,战战兢兢地拨打911报警。此时柳婷婷还在抽搐,朱力忽然又冲她踢了几脚,嘴里叫道:“你是活该!”
      案发后,刘晓莉说:“我也能理解老头子当时的愤怒和绝望。我们不适应美国生活,和儿子媳妇不能共同生活,没法在那边养老。唯一办法就是儿子把钱还给我们,我们回国。但这条路也被媳妇堵死了,我们怎么过呢?老头子比我更急,心理压力更大,但我万万没想到他会做出这种事来。”她告诉记者,老伴一辈子为人师表,口碑很好,性格爽朗,实在是把感情和精神全部寄托在儿子身上,最后过度失望,加上故乡的一切都被连根拔起,想回也回不了,无比绝望导致这样的悲剧。
      朱力满身是血一边往路上奔跑一边给弟弟打电话。看到一位华裔邻居,他放下电话说:“我捅死人了,我要死了。”这位邻居未反应过来,几名警察已经端枪冲上来,把朱力按倒在地铐上手铐。与此同时救援人员在家中宣告柳婷婷已当场死亡。
      朱力被扣押在洛杉矶双塔监狱内,警方要求支付100万美元方能保释。9日晚上9点左右,狱警发现朱力已经死亡。他将床单撕成布条,自缢身亡。
      两个月后,刘晓莉处理完后事,心力交瘁地与儿子重新生活。朱显明感到已经无法在美国生活,决意带孩子一起回到天津。飞机上,四人一路恸哭。朱力和刘晓莉望断的归国路,倾尽心血的养老梦,在众人羡慕中以最惨烈的结局落下帷幕……
      柳婷婷的父母也是千辛万苦将女儿培养出国,她同样是家中的骄傲、是父母的掌上明珠。活生生的女儿去了美国,回来却只是一捧骨灰,两位老人同样地悲痛欲绝,多次病倒。2015年底,柳婷婷的父母委托天津君荐律师事务所主任郭文礼担任代理律师,准备向刘晓莉和朱显明要求民事赔偿。此时刘晓莉和朱显明的日子非常狼狈。朱显明在美国投资和生意均失败,房子已抵押,又加上房里发生血案无法拍卖,资不抵债,已落得身无分文。两个儿子要抚养、要读书,刘晓莉回国元气大伤,经常因高血压住院,和儿子、孙子同住一套简陋的出租屋,生活惨不忍睹。
      据代理律师郭文礼介绍,这起民事诉讼案件的起诉程序很复杂,必须取得美国警方的相关资料和许多证明材料。目前律师已经向天津市南开区人民法院递交诉状和取证申请,获得受理,但尚未确定开庭审理时间。
一起悲剧,浮出两道现实的难题:当儿女亟须父母“倾家荡产”支援创业,父母怎么办?当父母把生活连根拔起,赴异国养老,他们传统的养老期望和儿女“中西合璧”的思维怎么磨合?读者朋友,你对此有何高见?欢迎你登录知音网或关注知音、知音虎妈微信公众号参与讨论。
编辑/夏志军

因为企业的采购流程长, 使用人数多, 教育学习新产品需要成本, 所以企业采购产品非常偏向于保守, 并且规模越大的企业流程越多, 人数越多, 也就越保守. 而做一个创新的企业级产品与保守的企业采购是相背的, 故此创新的企业产品并不好做. 而不创新的企业产品, 趋向于市场同类产品的同质化, 只能拼价格, 而企业的保守又对稳定性要求很高, 创业公司开始很难有此资本抢到行业的占领者的蛋糕.
新产品有一个采纳曲线(adoption curve), 第一阶段的尝鲜者只是少数. 所以创业创新的方式做企业级产品需要避开天生采购流程长, 使用人数多的产品, 如考勤, OA和ERP等, 而应该选择采购流程短, 使用人数少的产品, 如个人工具. 最好是一人决定购买, 一人使用的产品, 并且产品的方向最好是一个空白, 并没有一个行业的绝对的领导者. 举个例子, 墨刀作为手机原型工具就是个不错的定位, 主要使用者是产品经理和设计师, 决定购买也是个人. 估计也多是创业公司使用. 在做原型的领域原本是axure是绝对的领导地位, 但axure定位于pc端网页原型, 其他原型虽然也能做但是并不专一, 而其单机化不便分享, 收费等等特点给予其他产品以机会.

原文链接

%YAML 1.1   # Reference card
---
Collection indicators:
    '? ' : Key indicator.
    ': ' : Value indicator.
    '- ' : Nested series entry indicator.
    ', ' : Separate in-line branch entries.
    '[]' : Surround in-line series branch.
    '{}' : Surround in-line keyed branch.
Scalar indicators:
    '''' : Surround in-line unescaped scalar ('' escaped ').
    '"'  : Surround in-line escaped scalar (see escape codes below).
    '|'  : Block scalar indicator.
    '>'  : Folded scalar indicator.
    '-'  : Strip chomp modifier ('|-' or '>-').
    '+'  : Keep chomp modifier ('|+' or '>+').
    1-9  : Explicit indentation modifier ('|1' or '>2').
           # Modifiers can be combined ('|2-', '>+1').
Alias indicators:
    '&'  : Anchor property.
    '*'  : Alias indicator.
Tag property: # Usually unspecified.
    none    : Unspecified tag (automatically resolved by application).
    '!'     : Non-specific tag (by default, "!!map"/"!!seq"/"!!str").
    '!foo'  : Primary (by convention, means a local "!foo" tag).
    '!!foo' : Secondary (by convention, means "tag:yaml.org,2002:foo").
    '!h!foo': Requires "%TAG !h! <prefix>" (and then means "<prefix>foo").
    '!<foo>': Verbatim tag (always means "foo").
Document indicators:
    '%'  : Directive indicator.
    '---': Document header.
    '...': Document terminator.
Misc indicators:
    ' #' : Throwaway comment indicator.
    '`@' : Both reserved for future use.
Special keys:
    '='  : Default "value" mapping key.
    '<<' : Merge keys from another mapping.
Core types: # Default automatic tags.
    '!!map' : { Hash table, dictionary, mapping }
    '!!seq' : { List, array, tuple, vector, sequence }
    '!!str' : Unicode string
More types:
    '!!set' : { cherries, plums, apples }
    '!!omap': [ one: 1, two: 2 ]
Language Independent Scalar types:
    { ~, null }              : Null (no value).
    [ 1234, 0x4D2, 02333 ]   : [ Decimal int, Hexadecimal int, Octal int ]
    [ 1_230.15, 12.3015e+02 ]: [ Fixed float, Exponential float ]
    [ .inf, -.Inf, .NAN ]    : [ Infinity (float), Negative, Not a number ]
    { Y, true, Yes, ON  }    : Boolean true
    { n, FALSE, No, off }    : Boolean false
    ? !!binary >
        R0lG...BADS=
    : >-
        Base 64 binary value.
Escape codes:
 Numeric   : { "\x12": 8-bit, "\u1234": 16-bit, "\U00102030": 32-bit }
 Protective: { "\\": '\', "\"": '"', "\ ": ' ', "\<TAB>": TAB }
 C         : { "\0": NUL, "\a": BEL, "\b": BS, "\f": FF, "\n": LF, "\r": CR,
               "\t": TAB, "\v": VTAB }
 Additional: { "\e": ESC, "\_": NBSP, "\N": NEL, "\L": LS, "\P": PS }
...

软件程序为了描述数据不遗余力有多重方式, 早期windows上有.ini文件, linux上有.conf文件. 后来.xml几乎成为了标配, 以及从.xml衍生的apple格式.plist.
xml衍生自html, 刚刚出来的时候大家都很兴奋, 确实在一段时间内几乎成为了一统江湖的格式. 然而xml与html不同的是, 在html中标签名称都比较简单短小, xml描述数据后key根据不同软件要求变得复杂, 前后一个括号将key写两遍变得很臃肿, key+value一共得占用三行,篇幅大阅读性也不够好.
后来json出来了, 大家就又松了口气, 舒服多了, key+value一行就够了, 写起来也舒服.
而现在yaml是要比json写更少内容的了. 甚至连大括号中括号都不用, 逗号也不用, 引号也不用, 所占用的行也没有了.

# 注释
name: John Smith
age: 37
spouse:
    name: Jane Smith
    age: 25
children:
    -   name: Jimmy Smith
        age: 15
    -   name: Jenny Smith
        age 12

从内容上看起来让人想到了python和markdown. 使用缩进, 描述语言更容易阅读. 上面这段包含了key value关系, 层次关系, 列表(数组)关系.
对比json:

  • 用缩进替代大括号表示层次关系, 这是python的手段;
  • 用回车替代逗号表示不同元素, 这也是python的手段
  • 继承了json使用冒号分隔key和value的方式
  • 用减号替代方括号表示列表, 这是markdown的方式
  • 注释使用井号#, 这是python的方式
  • 字符串断行使用反斜杠\, 这与js是相同的.
  • 最有趣的是, 如果你想在一行里面写多个元素, 你还可以使用js的[],{}语法
---
- [name        , hr, avg  ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa  , 63, 0.288]
---
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
    hr: 63,
    avg: 0.288
  }
  • 还有个比json强大的地方, 可以使用&定义常量并在后面使用星号*引用, 如
name: &JS Jhon Smith 
nameagain: *JS
  • 有一个现在不太明白怎么用的, 就是使用三减号---分隔不同文档,使用三点...终结文档. 这样可以在一个文档里描述多个文档, 干嘛用? spec里说用在通信频道上?不清楚列
  • 非常神奇的是, 可以使用一个复杂的对象作为key,而不是仅限于string, 这时候key需要以问号?开头
? - Detroit Tigers
  - Chicago cubs
:
  - 2001-07-23

? [ New York Yankees,
    Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
    2001-08-14 ]
  • 对于value的类型,常见的类型是自动判断的
number: 123
float: 123.13
string: something is something
string2: "123"
bool: true
canonical: 2001-12-15T02:59:43.1Z
iso8601: 2001-12-14t21:59:43.10-05:00
spaced: 2001-12-14 21:59:43.10 -5
date: 2002-12-14

  • 其他复杂的类型, 有些需要!!说明, 其他需要编程语言自己搞定. 通常是在key后面加叹号描述类型
---
not-date: !!str 2002-04-28

picture: !!binary |
 R0lGODlhDAAMAIQAAP//9/X
 17unp5WZmZgAAAOfn515eXv
 Pz7Y6OjuDg4J+fn5OTk6enp
 56enmleECcgggoBADs=

application specific tag: !something |
 The semantics of the tag
 above may be different for
 different documents.

# Sets are represented as a
# Mapping where each key is
# associated with a null value
--- !!set
? Mark McGwire
? Sammy Sosa
? Ken Griff

%TAG ! tag:clarkevans.com,2002:
--- !shape
  # Use the ! handle for presenting
  # tag:clarkevans.com,2002:circle
- !circle
  center: &ORIGIN {x: 73, y: 129}
  radius: 7
- !line
  start: *ORIGIN
  finish: { x: 89, y: 102 }
- !label
  start: *ORIGIN
  color: 0xFFEEBB
  text: Pretty vector drawing.

# Ordered maps are represented as
# A sequence of mappings, with
# each mapping having one key
--- !!omap
- Mark McGwire: 65
- Sammy Sosa: 63
- Ken Griffy: 58

需要预先安装如下工具: python2.x, npm, visual studio.
npm需要安装工具node-pre-gyp和node-gyp

npm install -g npm-pre-gyp
npm install -g npm-gyp

在项目中

npm install serialport

哦, 每次装到最后都不显示任何信息了....
如果这时候require('serialport'),会出现这个错误:

C:\r\electron\macgetter\node_modules\bindings\bindings.js:91
  throw err
  ^

Error: Could not locate the bindings file. Tried:
 → C:\r\electron\macgetter\node_modules\serialport\build\serialport.node
 → C:\r\electron\macgetter\node_modules\serialport\build\Debug\serialport.node
 → C:\r\electron\macgetter\node_modules\serialport\build\Release\serialport.node
 → C:\r\electron\macgetter\node_modules\serialport\out\Debug\serialport.node
 → C:\r\electron\macgetter\node_modules\serialport\Debug\serialport.node
 → C:\r\electron\macgetter\node_modules\serialport\out\Release\serialport.node
 → C:\r\electron\macgetter\node_modules\serialport\Release\serialport.node
 → C:\r\electron\macgetter\node_modules\serialport\build\default\serialport.node
 → C:\r\electron\macgetter\node_modules\serialport\compiled\5.2.0\win32\x64\serialport.node
    at bindings (C:\r\electron\macgetter\node_modules\bindings\bindings.js:88:9)
    at Object.<anonymous> (C:\r\electron\macgetter\node_modules\serialport\lib\bindings.js:3:35)
    at Module._compile (module.js:399:26)
    at Object.Module._extensions..js (module.js:406:10)
    at Module.load (module.js:345:32)
    at Function.Module._load (module.js:302:12)
    at Module.require (module.js:355:17)
    at require (internal/module.js:13:17)
    at Object.<anonymous> (C:\r\electron\macgetter\node_modules\serialport\lib\serialport.js:12:25)
    at Module._compile (module.js:399:26)

根据网上的解决方案:进入项目目录

C:\r\electron\macgetter>cd node_modules\serialport
C:\r\electron\macgetter\node_modules\serialport>node-gyp rebuild
输出一堆信息......最后
gyp info ok

然后就可以了.

通过如下命令建立WebSocket连接.

ws = new WebSocket('ws://' + WS_SERVER)

常常需要判断ws.readyState是否处于OPEN状态, 然后决定是否要进行操作.
然而, 对OPEN等几个常量的调用, 在Android与Web上有不同.
例如, 在Web上, 调用 ws.OPEN, 则值为1, 在Android上则为undefined.
所以在这儿一定要使用WebSocket.OPEN, 无论Web还是Android都是1.

假如xxx为app名

  1. 确定已经用debug模式完成编译, 生成了xxx_debug.apk文件.
  2. 确定已经可以使用vscode调试模拟器.
  3. USB连接手机, 在手机上安装xxx_debug.apk
  4. 使用adb运行此APP. 命令为:
    adb shell am start -n "org.cocos2d.xxx/org.cocos2dx.javascript.AppActivity"
    你此时应看到APP已经在手机上运行.
  5. adb转发端口
    adb forward tcp:5086 tcp:5086
  6. vscode开启调试模式, 查看console是否连接成功.
ar: attachRequest: address: localhost port: 5086 
ar: attachRequest: retry socket.connect 
ar: attachRequest: connected 

  1. 开始打断点调试.

  2. 使用adb logcat 和findstr过滤输出信息

adb logcat | findstr "cocos"

注意, 魅族手机的开发者选项中, 默认只输出部分log,需要在开发者选项中打开全部log 的输出.

以windows为例:
1. USB连接手机, 确认打开USB调试模式.
2. 找到USB KEY ID.
打开: 设备管理器->Android Phone->Android Composite ADB Interface->详细信息->属性->硬件Id
看到值为如下:

USB\VID_7A98&PID_0C02&REV_????&MI_01
USB\VID_7A98&PID_0C02&MI_01

7A98即为ID
3. 进入 "C:\Users\YourUsername.android" 目录. 确定是这个目录的方式是, 其中有adbkey.pub和adbkey文件.
4. 在此目录中新建文件adb_usb.ini文件, 内容为:

0x7A98

也就是写入id, 保存.
5. 再次查看adb devices,应该已经可以看到了

布尔运算有三种, 与或非.
在C中, 布尔运算一定会返回布尔值.
在JS中却不同, 只有"非"运算一定会返回布尔值, "与或"都不一定返回布尔值.

a && b 与运算:

a为false/NaN/undefined/null/0/""时, 则返回a;
a不为以上值,如true/Object/"0" 则返回b;
注意, "0"被认为是true, ""被认为是false.

a || b 或运算:

和&&相反, a不为false/NaN/undefined/null/0/""时, 则返回a;其他情况返回b;