Speed up Cordova app development using http server

Cordova helps us make apps easily. The ability to run the apps inside browser greatly speeds up the development cycle. But I feel that it is hard to debug and rerun in a real device, especially I need to debug some plugin which needs real devices support. Normally I need to compile and redeploy the app. It takes at least 1 minutes to get all things ready even running inside Samsung
S5.

The cordova apps are running inside a WebKit, Chrome helps to connect the apps and you can inspect element or use any javascript debugging tool. Imaging the app is loaded from a self-hosted server, in the chrome developer tool, I can refresh the browser to load modified content. This is cool because you don’t need to compile and restart the app, it saves a lot of when need to go through a lot of steps to reach that page. Question: How to do it?

The basic idea is to serve /www folder in http server. You could use nodejs “http-server” as a quick start. But compare to the /platforms/android/assets/www folder, there are some files missing including cordova.js, cordova_plugins.js and plugins folder. We need to copy these files into /www folder so apps can get the cordova initialized.

We need to modify the entry page (index.html) for apps to load from the server, otherwise it will load local content inside apps. It is a simple redirect. Then we need to create a new app.html which is same as original index.html.

<!DOCTYPE html>
<html>
<head lang="en">
<meta http-equiv="refresh" content="0; url=http://SERVER:IP/app.html" />
<title></title>
</head>
</html>

When app is loaded, the index.html will redirect to the app.html which is hosted in server. If you want to modify the app, just modify the apps and then refresh the page.

Demo:

Clone the app: https://github.com/derekhe/speed-up-cordova/
Serve the server

npm install -g http-server
cd www
http-server

Run the app

cordova emulate android

20天3D打印总结

mbot cube 3D打印机拿到手也有20多天了,有空就玩玩,还是做了一些好玩实用的东西出来,总结一些经验来分享。总体来讲3D打印技术还不是太难掌握,对于打印素材来源及模型选择有一些讲究,要特别注意一些模型打印起来非常困难,甚至无法打印。

模型来源

我自己的3D模型主要来源于thingiverse网站,丰富的模型分类及社区的力量提供了非常多的资源。很可惜的是中国访问奇慢,主要原因是网站使用了亚马逊S3和cloudflare云,这两个基本被中国屏蔽,要不就是慢的死人。所以一个给力的代理是唯一的解决方案,否则你会失去很多的乐趣。代理可以参考我之前的shadowsocks在digitalocean上用的例子。

国内有一个叫“天工社”的论坛,上面有很多的模型可供选择,我看大部分还是来自于thingiverse网站的,有些人靠这些来赚积分。

在thingiverse网站上,我做自己做了一些东西,请直接打开网站看

一些成功的例子

失败的例子

模型的选择

尽量不选择太复杂太精细的模型,有些细小的部件,打印机会吐出来一点材料,根本无法顺利的打印出来。有些结构一次性打印的话需要很多的支撑材料,这些支撑会产生很大的麻烦,去除材料的时候会显得很郁闷。当然如果你的打印机是双头的,并且有水溶的材料,那就另当别论了。

所以比较好的模型都是一些稍微简单,甚至是组装的模型。组装的模型比较好打印每个部件,但是有些接插件会遇到无法插入的问题。内孔一般会缩小,外孔一般会变大,这和孔的大小有关。一般得后处理一下。由于我的材料一直是PLA的,所以试过用钻枪扩孔,但是效果不好,钻头会卡在洞里面。另外要注意有些模型如果提供了细杆之内的,强度一般都不会够,对于PLA很容易就折断了。

完全插不进去的外壳,其中一个装齿轮的细杆已经折断

打印模型的时候的方向也比较重要,要看你的模型在什么方向上需要什么的精度。Z方向的精度似乎比较差,XY的还比较靠谱。对于一些比较尖的部件,如果到最后只有这个尖的东东,则打印头会持续的在附近一栋,造成温度很高,下层的尖会软化,导致整个模型报废。所以可以在旁边比较远的地方放一个无关紧要的物件,这样打印头会移动开,等再回来的时候就已经冷却了。

翘边问题

刚拿到打印的时候,基本上都会翘边,还是PLA材料啊。后来打电话给售后问有没有比较好的办法,他们推荐用3M胶带。但是3M胶带实在是太难贴了,而且贴完了打印后会影响底层的平整度。如果贴的位置不是很恰当,还是会造成一些翘边,甚至中间凹陷的情况。

3M胶没有hold住,很难知道哪些地方需要贴
3M胶,造成底部凹凸不平

后来买了蓝色的3M美纹纸胶带,完美解决问题。非常好贴,而且效果很好。
美纹胶,完美解决
儿子很喜欢

打印软件

ReplicateG

这个开源软件很古老了,已经停止更新。试过一两个模型速度都非常的慢,而且界面不好用。还是最好别用这个了。

MPrint

MBot3D自己出的软件,易用性还算过得去,生成速度也挺快的,能够预览生成的路径,看到打印时间和材料克数。win平台和mac都有。作为初学及简单的配置还是很方便的。

不方便的地方在于没有像Slic3r或者Cura提供的打印一个底层边界的功能(不是底垫哈),这样刚开始打印的时候打印后没有材料挤出,要等上几秒钟才连续出料,造成一部分底层打印失败。办法是自己做个物体放在旁边,或者打印底垫。
Screen Shot 2015 04 22 At 12.24.17 PM

Slic3r和Cura

开源利器,两个软件不相上下,我还是比较喜欢Cura,界面比较好用一些。

刚开始用的时候,需要设置好边界,mbot cube我最大设置为200左右,太大的话会造成XY移动到最外面撞到。打印机是没有限位开关的,所以会导致电机堵转或者跳齿,很伤机械。还有一个Machine Settings选项:Machine Center 0,0,如果没有设置,则会按照左上角为0,0,会撞车。

0,0
具体设置可以参考:https://github.com/derekhe-3dprinting/print-settings

材料

当时买机器的时候给了一卷透明的PLA,但似乎材料有些问题,打印效果不好,比较粗糙。后来买了个橘红色的PLA,就好了。

PLA还是比较脆的,有一些玻璃的质感。橘红色的打印出来还是比较好看,但是透明的就完全瞎火。
比较漂亮
修锁扣,强度还是不错
透明的很难看

上色

最安全的方式上色还是用丙烯材料好了,需要涂得比较厚一些后期才不会开裂和掉色。可以借助吹风机速干。
涂的太薄,干了就掉

吐槽打印机

这个打印机价格还是不便宜,要是双头的价格都5200多了。打印的噪音还是比较大,关了门还能听得到明显的噪音。可能是出厂的时候质量有一些问题,Y轴似乎是直线轴承出了问题,方向移动的时候嘎嘎嘎的响。联系的厂商给免费维修,只不过要寄回去比较麻烦。

为了减少噪音,是否需要在外面加一层盖子,这个我还在考虑之中,看轴承修好了以后会不会好一些。

对比Flashforge的creator pro,这个机子的底板能够能够取下板子比较好,毕竟在机器里面拆模型不是非常的方便,贴胶也不好贴。

淘宝旅行API分析

这一篇博客中我分析一下如何分析得到淘宝旅行的API,如何得到实时的机票信息。

我们先看看阿里旅行的机票页面。打开Chrome Developer Tools发现要得到其中的信息感觉颇为复杂,很难去下手,一般我不会从主站下手。主站的各种防御做得比较好,往往页面结构复杂。其实如果我们换个思路,直接访问手机的站点,会简单很多。这是因为为手机做的站点其性能比较重要,往往做得比较简单,而且容易暴露一些API接口。

点击Chrome Developer

Screen Shot 2015 03 11 At 16.30.17

试着查一下深圳到成都的机票,看看会返回些什么。忽略掉图片等,发现h5apiUpdate.do这个call有意思

我注意到一个jsonp的call

将这个URL放到浏览器上面试一下,果断返回了所有的信息。
Screen Shot 2015 03 11 At 16.35.13

剩下的事情就简单很多了,一个GET请求就可以得到所有的信息。让我们来分析一下URL里面具体是怎么请求的。

URL请求,不要直接点击,点击后是请求失败的。

http://api.m.taobao.com/rest/h5ApiUpdate.do?callback=mtopjsonp1&type=originaljsonp&api=mtop.trip.flight.flightSuperSearch&v=1.0&data=%7B%22searchType%22%3A%221%22%2C%22depCityCode%22%3A%22SZX%22%2C%22arrCityCode%22%3A%22CTU%22%2C%22leaveDate%22%3A%222015-03-12%22%2C%22backDate%22%3A%222015-03-12%22%2C%22itineraryFilter%22%3A%220%22%2C%22sellerIds%22%3A%22%22%2C%22leaveFlightNo%22%3A%22%22%2C%22leaveCabinClass%22%3A%220%22%2C%22backCabinClass%22%3A%220%22%2C%22utdid%22%3A%22%22%2C%22depDate%22%3A%222015-03-12%22%7D&useNative=true&ttid=201300@travel_h5_3.1.0&appKey=12574478&t=1426062775998&sign=3feb52aed67967a2c47aa7a2b9f2a417

首先我们精简一下这个请求,更少的参数更能让我们专注,我最终去掉了callback和type,请求成功。但注意这个请求和之前的请求有一些区别,这个请求不是jsonp的,如果不是从浏览器直接访问,没有跨域请求的时候是可以不用jsonp的。

Screen Shot 2015 03 11 At 16.40.01

剩下事情就有点复杂了。

  • api=mtop.trip.flight.flightSuperSearch&v=1.0&
    这一串是版本号及API调用的接口,一般不用改变

  • data=%7B%22searchType%22%3A%221%22%2C%22depCityCode%22%3A%22SZX%22%2C%22arrCityCode%22%3A%22CTU%22%2C%22leaveDate%22%3A%222015-03-12%22%2C%22backDate%22%3A%222015-03-12%22%2C%22itineraryFilter%22%3A%220%22%2C%22sellerIds%22%3A%22%22%2C%22leaveFlightNo%22%3A%22%22%2C%22leaveCabinClass%22%3A%220%22%2C%22backCabinClass%22%3A%220%22%2C%22utdid%22%3A%22%22%2C%22depDate%22%3A%222015-03-12%22%7D
    包含了一些数据,但已经被quote过,基本上是一个json类一样,里面包含一些请求的数据。decode之后长这样:
    Screen Shot 2015 03 11 At 16.43.51

  • useNative=true&ttid=201300@travel_h5_3.1.0&appKey=12574478
    这些固定字符串,暂时不管了

  • t=1426062775998&sign=3feb52aed67967a2c47aa7a2b9f2a417
    这两个参数,在不断请求的过程中是变化的,这个值一旦不对应,则API请求是失败的。这对我们的造成了很大的困扰。如果不清楚这里的算法,你不能算出sign,API请求完全无力。遇到这种情况,只有从javascript下手了。

是什么地方调用了这个API呢?我采用搜索url的方式。找h5ApiUpdate这个关键字,看有没有什么线索。最后在这个文件中发现了这个关键字。

Screen Shot 2015 03 11 At 16.48.59

糟糕的是这个代码已经被压缩过,你可能知道一些站点,能够将javascript反混淆吧。但你不能直接利用这个代码做事情。我之前考虑是否做个proxy的站点,类似fiddler这种工具将这个压缩过的js给劫持了,然后返回我解压过的。想想整个过程都很复杂。

然后我去找了一下chrome的插件和stackoverflow。庆幸的是,chrome已经内置了一个非常牛逼的工具,且看这里。这一个简简单单的{}符号简直帮了大忙。

Screen Shot 2015 03 11 At 16.52.13

你看,pretty print后的代码,简直就是开卷考试了一样。
Screen Shot 2015 03 11 At 16.52.59

更为强大的是,用这个代码我居然可以打断点!
好吧,那我看看sign是怎么得到的。简单的搜索一下就可以找到了:
Screen Shot 2015 03 11 At 16.55.17

看到了没有,所有的秘密都在这里。
Screen Shot 2015 03 11 At 16.57.20

这些值和cookie相关,做一次请求,打几个断点,所有的秘密都清楚了。
Screen Shot 2015 03 11 At 16.59.22

好吧,我们来写一个简单的程序来模拟吧,请参考:https://github.com/derekhe/alitripAPI

nodejs可以非常好的完成任务,而且阿里不会阻止你采集(这点很大方啊)。我后来想把它写到手机上,用cordova做个app的,但可惜cordova不支持cookie这事情,让整个事情搁浅了。后续试试原生的http request,应该可以解决问题。

3D打印及技巧

春节过完,花了4699买了个mBot的木头3D打印机。为什么要买呢?这还是要起源于公司内部有个同事在年前发起的一个众筹,每人可以捐一些培训经费采购一台3D打印机,很多人响应,凑了1万多块钱,昨天问他后来买了个6600多块的,那么这事情也就成了。

硕大的箱子
开箱,其实不怎么重里面
一堆东西,工具还很好用

为啥公司有自己还要自己买一个呢?我不怎么喜欢共用一个东西,独自拥有了怎么折腾都好,也不会受谁的限制。其实买3D打印机这个想法也不是没有,之前主要是觉得价格太贵然后加上不怎么成熟。记得前一两年最常见的创客活动就是秀3D打印机了,感觉有一个是多么的神奇。在等上个一段时间以后,现在看来各项指标都好了很多,生产厂家也逐渐的丰富了起来,是时候下手了。

开机

只有原点开关,没有限位开关
只有原点开关,没有限位开关
只有原点开关,没有限位开关
只有原点开关,没有限位开关

拿到打印机后,迫不及待的拆好,装上软件,很顺利的打了一个简单的测试图形。我本来叫卖家给我白色的料的,结果寄过来个透明的,打印出来的东西有点奇葩。

卡里面的测试图形

撑牙刷的,打印中。。
撑牙刷的,人家打印出来是那样,我的是这样。。。汗死

刚开始选择的层高0.1,实在是太小了,打印了好久。
打印时间

感觉不错。后来想要不直接来个猛的?下载了个埃菲尔铁塔,结果ReplicatorG花了半个多小时,最后无法生成路径。也罢,后来选了个发动机引擎来打印,结果第一个严重也是常见的问题出现了————翘边。

ReplicateG生成很久,还不如用厂家的MPlay
刚出炉,还没有去掉底部的底座
翘边啦
拆下来的支撑

大图形很容易翘边
自己想当然,搞个黑胶布粘上,一点用也没

出现翘边以后,网上搜索了一下然后打电话给技术支持。技术支持告诉我我最牢固的方式是用丙酮,但家里面有小孩不能用,挥发性大易燃易爆;美纹胶也可以,增加接触面的粗糙度,但效果不一定好;还有一个方式是3M胶,效果也比较好的。

最终我选择了3M胶。京东上睡一觉第二天就到货。第一天就废了15块钱左右,感觉还是比较值。还好用的是PLA材料,生物可降解,其实强度那些也是很棒的,之前我还担心用力捏一下就断呢。

92克,每克1.5,算下来15块钱左右

今天早上3M胶到了,贴上去倒是很方便,问题来了,背面的红色的胶非常难取,一般用手是抠不下来的。使了用铲子顶进去压住下面的胶,然后再配合美工刀,完美解决问题。

很难取

打印一个电池盒子
试一下
不错

贴上后试了一个比较长的物体,再没出现翘边了,但又有另外的问题发生。
继续打印

由于双面胶有一定的厚度,大概1.5张名片的厚度,贴胶的时候贴到了打印部件的位置,造成下面的底座和打印的工件粘合在一起,很难去除。下次一定小心点测量。

很难去除,将就了

还有个问题是由于两边的胶稍微高一点,会造成两边高中间低的问题。或许在零件的中间贴合一些胶能够解决。

如果不怕浪费点材料,在刚开始打印底座的时候,会打印一个图出来,当打的差不多的时候,就停下来,然后在边角的位置贴上3M胶,不要贴的太进去就好。

春节

今天初六,最后一天的休假,感觉时间过得很快。自从结婚以后每年都要回广州一两次,春节是必不可少的。爸妈也非常愿意我回广州,他们好出去旅游。在小的时候,春节走亲戚是必不可少的环节,年三十在外婆外公家吃一顿,大年初二在我家弄一大家子人的吃的,大人打牌,小孩哭闹。然而这些都是小时候的记忆了,随着爷爷奶奶辈的老人越来越少,工作压力的增加,过年的节奏已经变成了出去旅游的好时光了。春节从成都回广州过年机票便宜,提早一点买的话能买到很便宜的机票。在广州这边,老一辈的人们还保持着过年走亲戚的传统,年轻人可以稍微做个短途旅行,让春节不再那么闷。

初到香港

今年去了趟迪士尼,带着小孩去,算是一趟很折腾的旅行。网上订的香港迪士尼的票,住香港九龙酒店两晚。从从化出发到深圳的班车有到罗湖口岸的班车,比较方便,两个半小时一趟。罗湖口岸过关很方便,比起之前的皇岗方便很多,人少,过去以后直接买个八达通坐火车到红磡。火车大概要40多分钟的样子到达红磡。到达红磡后到酒店还需要打个车,35港币左右。在这些地方坐出租车那是一个心跳啊,表跳的那是一个开心。

罗湖火车站
酒店
酒店内景

九龙酒店就在地铁的上面,楼下购物啥的也挺方便,晚上找吃的也不是很难,最好先做好功课,在隔壁街的小道里面。房间也不大,虽然选的是大床房,但也只有大概1.4m左右,单床的是0.9m,真是寸土寸金。这里距离维多利亚港也是非常的近,只不过天公不作美,雾蒙蒙的啥都看不见,晚上就没有去海边了。在旁边的商场转了一圈,各种英文看不懂,搞得老婆化妆品也没买成。丁仔一路上都吵着要买玩具,就去旁边的一个玩具反斗城,转了好久,终于选定了自己喜欢的乐高消防车。弄得妈妈都没有时间购物了。

消防队组装中
完工

晚上出去吃了个捞面,贵的要死又不好吃。完了去逛了个超市。感觉香港这里和澳洲看起来差不多,超市啥的布局,习惯都比较像,可能是因为同样是英殖民地的缘故吧。

晚上美美的睡了一觉,开始第二天的折腾。

迪士尼第一天

早上拖拖拉拉的,坐地铁到迪士尼乐园花费40分钟左右,还是很快了。迪士尼的专线比较有意思,列车是定做的,上面有米奇的头像的窗户和各种摆设品。

坐车到迪士尼


到达迪士尼,第一个游玩点就是迪士尼的观光火车。丁仔这个车神,喜欢火车、汽车不得了,只好排队来坐火车。基本上迪士尼里面的排队都是半个小时以上,甚至一个小时都是有可能的。刚开场我还不怎么相信排队处写的时间,但经过实践我还真的信了。迪士尼的排队,往往在外面看起来不长,哪知道进去屋子里面以后还有非常长的一长截,耐心不好的人真的是会被弄崩溃。老婆说她以前来人都不多,或许是因为寒暑假的缘故吧。

迪士尼特色火车
迪士尼特色火车
迪士尼特色火车
迪士尼特色火车

火车绕场一圈,中途停靠一个站,然后再回来。有些人喜欢转一圈把景色看完再多走半圈下来,所以每次轮到这个站点的时候,人都不下来,等的人就只有干捉急了。服务员也没办法,也不能要求他们强行下车。最终在等了三四次以后,终于等到了座位,而此时已经过了一个多小时了,到了中午吃饭时间。

中午吃饭,价格很贵啊,108港元,这两天吃了四顿饭就用了800多港元。千万别点面,看起来就不好吃,点了炒饭还好,送可乐。吃饭的时候,顺便去看了一下飞天巡游。只是去的时间有点晚,所以只能排到后面。这个巡游还真的很好看,第二天老婆又带着丁仔去看了一次,站到前面看起来感觉相当不错。

我觉得最好玩的项目是小小世界,排队40多分钟,非常值得。进去后坐到小船里面,左右两边一边有世界上各种不同地域的小小人用不同的语言唱小小世界。丁仔的眼睛都用不过来了,完了以后还不肯下车。

小小世界
视频:http://pan.baidu.com/s/1gdkZMd9

带着小孩子真的是不容易,抱一会儿又不舒服,又要下来到处乱跑,还好丁仔的耐心很好,不会说很烦躁。

一边玩一边等

戴上眼镜很帅

看米奇幻想曲。丁丁第一次看3D的电影,加上眼镜太大不好戴,在看唐老鸭坐飞毯的时候觉得头晕。最后还是坚持看完了,最后结束的场景特别好玩,唐老鸭从屏幕飞出来撞到墙上,把丁仔笑惨了。

还有一些大人才能玩的玩具我们没有太多的玩,这样丁仔就只有等我们很无聊。
迷离大宅,丁仔睡觉,我和老婆轮流玩
看起来很刺激的灰熊山过山车
现场演绎
泰山,我们没有去

去玩森林河流之旅,我们坐的英文版的,看起来要比普通话和粤语的队伍短很多,要快一些。
坐在引擎旁边船,坐在引擎旁边,轰隆轰隆的很带感

游玩船等待坐赛车,这个项目太折腾人了,等待75分钟以上。实际等待90分钟左右。我都差点放弃了这个项目。这个赛车是有轨道的赛车,在直线的一些地方可以自己转一点方向,对我来说实际吸引力不大。但丁仔太喜欢了,妈妈和丁丁坐一个车,妈妈踩油门,丁仔打方向。

等待坐赛车
我来咯
等待
我就是不下来

开完车,夜幕降临,赶紧去排剧场看舞台剧。只可惜丁仔怕太吵的环境,还没看就和妈妈出去吃饭去了。
飞天巡演晚间场,没去看
夜晚
夜晚
夜晚

晚上看了烟火,仔仔一直闹买玩具,脾气还挺大的,好吧,买了玩具回家。最后不得不赞一下迪士尼的地铁,车很快,烟花完了以后很多人上车,但是不算太拥挤,乘坐地铁很快的回到了酒店。

迪士尼第二天

迪士尼周二早上9:30开门,到了已经10点钟了,还好人不算多。由于有些项目可以预约,这样就可以安排时间插队。老婆先去预约了飞跃太空山项目,我带丁丁去玩巴西光年打枪。这个小子还真的胆小,玩了一半说怕。。。。无语中。然后去史迪仔,没啥意思,丁仔还没进就闹着要走,肚子饿~
巴西光年

预约的飞越太空山项目到点了,这个项目非常刺激,是我玩过的过山车中最好玩的一个。在黑漆漆的“宇宙”中上下飞梭,永远不知道下一个是上坡还是急速下坠,是急速转弯还是一马平川,那感觉,只能亲自去体会一下了。丁仔由于年龄不到不能玩这个项目,我和老婆换着玩,丁丁就在外面等。很乖:)
飞车

中途和一个演魔术的老人相遇,赶紧照个相留念:)
和魔术老人合影
没有坐小飞象还是可以合影的嘛,开心

然后去排了对,看了一下维尼熊,但丁仔不怎么喜欢
维尼熊,丁仔不怎么喜欢
视频:http://pan.baidu.com/s/1c0Emg5i

卖气球咯,120块钱一个。。。贼贵
和公主合影,我有点不适应呢。。。

中午吃完饭就就出发回广州了,折腾了两天,将人的耐心、体力发挥到了极限。如果下一次还来,就别选人多的时候了。