APP创业项目-密码加密

用户名和密码是用户登录系统的身份凭证,用户注册时向服务器提交用户名和密码,服务器写入数据库后,用户登录时提交相同的用户名和密码,如果两者能够跟数据库中的某一条记录匹配,则身份认证通过,建立会话。用户名和密码数据的安全至关重要。本文主要讨论密码的加密问题。

为什么要对密码加密?

首先,将密码明文写入数据库是一件没有道德的事情。很多用户习惯于在各个网络平台使用同一个用户名和密码,如果系统记录了用户的密码明文,那么开发人员就可以直接看到用户的密码,如果用户注册时还留下了邮箱,且用户的邮箱使用了相同的密码,那么开发人员就可以进入用户的邮箱随意浏览了。

其次,一旦网站被攻击,数据库泄露,攻击者将获取到所有用户的密码,这是一件非常可怕的事情,这类事情CSDN博客网站就发生过。

将密码加密后写入数据库,网站开发人员和窃取了数据的黑客都无法知道密码明文,只能依赖密码破解,这一定程度上保障用户的安全。那么,如何加密密码才尽可能安全?下面讨论密码加密相关的几个概念。 继续阅读 [ APP创业项目-密码加密 ]

APP创业项目-PHP框架选择

本文继《APP创业项目-后端语言选择》之后讨论PHP开发框架选择问题。PHP从诞生至今出现了数以百计的大小框架,有人说PHP生来就是反框架的自由语言,框架的使用反而会降低PHP的性能。确实,引入复杂的架构带来了性能的降低,但我认为从团队合作的角度来说,基于统一的框架开发有助于合作与未来扩展。框架的优与劣关系到程序的性能,也关系到开发的效率,性能与开发效率很多时候在项目开发中是一对矛盾体,正如C与JAVA,一个以性能著称、一个以开发效率而流行。在矛盾中寻找平衡从来没有对于错。

PHP的众多框架中,也存在性能与效率的平衡问题,名声在外的Laravel被称为最优雅的框架,Yaf、Phalcon被誉为最快的框架,还有Yii、Codeigniter、Zend Framework等知名框架。并不是说优雅就不快或者快就不优雅,这只是一个相对的评价。那么我们该如何选择框架?

第一、选择的依据是什么?是性能还是效率?

虽然Laravel官网首页大大的字“Love beautiful code? We do too.”表明它对优雅的情怀,这并不影响Phalcon、Yii、Zend Framework的优雅,在开发效率上也并没有比Phalcon有明显地提升,但是不同的框架在性能上的差距还是比较明显的。参见性能比较,该网页从JSON、单查询、多查询等角度进行了框架性能比较,除了PHP原生之外,Phalcon-micro、Yaf、Phalcon都表现出数倍于Laravel的性能。

第二、我们需要框架做到多少,是一个全包保姆型的,还是一个极简爸爸型的?

全包保姆型框架像保姆一样帮你考虑得细致周到,照顾得你基本上不能独立生活。这类框架尽可能考虑到WEB开发的各个方面,框架对开发模式限制较多,开发者最好遵循其限制,较小的项目会显得高效轻松,随着开发的深入,会渐渐在遵循和突破之间进退两难。

极简爸爸型框架像爸爸一样给你提供大方向的导引,小细节充分给你自由。这类框架只实现了框架该实现Route、MVC、Request、Response、AutoLoader,而ORM、Cache、ACL等重要功能都由开发者自由实现。

Phalcon、Laravel在架构上都解耦得很好,他们既可以当做保姆型也可以当做爸爸型。Phalcon同时还提供了Phalcon-micro简化框架以进一步提升性能。

下面简要对Phalcon、Yaf、Laravel分析。 继续阅读 [ APP创业项目-PHP框架选择 ]

APP创业项目-用户身份认证架构

一个互联网项目通常会标配一个用户模块,主要实现用户注册、登录、忘记密码、密码加密、session创建与销毁。随着第三方认证的流行,还需要实现微信、QQ、微博等第三方账号登录及其账号绑定。另外,需要解决APP用户的持久登录问题,多应用服务器身份共享问题,APP内嵌H5应用的身份注入问题等。

首先我们聊以下几个顶层设计的问题。

用户中心是做成一个模块还是一个独立服务?

首先,我们打开百度、淘宝、京东、QQ等互联网产品,你会发现他们都提供了多种多样的独立服务(网站),例如百度有:贴吧、知道、百度云、音乐随心听、糯米团购、外卖等等,京东作为一个主营电商的网站也划分为若干独立的服务:首页www.jd.com、商品列表list.jd.com、商品详情item.jd.com、订单order.jd.com、个人中心home.jd.com等等。每个公司的各种服务都共用同一个身份认证系统:百度登录对话框、淘宝https://login.taobao.com、京东https://passport.jd.com、QQ登录对话框。可见大公司常见的模式是将用户中心做成一个独立服务。

共用一个身份认证服务有什么好处呢?

假如不使用同一个身份认证服务,各自开发各自的身份认证模块,那么各网站服务之间用户无法共通,从一个网站跳到另一个网站需要重新登录,对用户来说很繁琐。

数据共通能够帮助产品团队更好地了解用户,例如用户使用百度搜索“美人鱼”想看下周星驰导演的这部电影的影评,但是除了周星驰导演的《美人鱼》之外,美人鱼还有别的实体,如伊丽莎白·艾伦导演的《美人鱼》,周杰伦的歌《美人鱼》,如果用户多次点击了周星驰的《美人鱼》的相关网页,那用户可能是这部电影的潜在消费者,如果用户随后进入百度的糯米网(包含电影票销售服务),则可以在首页显示《美人鱼》的片花和优惠信息。因此,打通了各服务之间的用户,可以整合各服务的数据去了解用户(即用户画像)。

京东作为一个电商网站,并不像百度,产品那么多样化,为什么也要把首页、商品列表、商品详情、订单等等这些功能模块分到不同的子域名上,由https://passport.jd.com负责认证呢?

一个大型网站项目,通常由很多开发人员分成小组进行开发,各小组既要解耦又要相互合作。解耦的位置可以在模块化代码层面,也可以在网站架构层面。这里将他们称为:代码模块化解耦、多网站架构解耦。

代码模块化解耦要求各小组基于一个基础核心代码,使用同一个语言在同一个框架下各自编写模块,各模块处理好包管理和命名空间,最终合并代码形成一个独立站点。所有代码运行于同一个服务器环境,运维相对简单。但是这部分代码被各个网站平台共用,代码维护将十分困难。

多网站架构解耦要求各小组共用身份认证服务,其他开发细节不再关心,理论上可自由发挥,甚至可以采用不同的语言、框架和服务器,相比代码模块化更加灵活;在服务器负载均衡上也可以更加灵活,可以针对访问频繁的功能部署更多的服务器以提升速度,针对冷门的功能部署较少的服务器以减少开支。

不管是代码模块化解耦还是多网站架构解耦,只要涉及到多应用服务器架构,实现独立的身份认证服务都是一个最佳的选择。

我们知道不同子域名通常意味着不同的网站,不同的网站应该放置到不同的服务器,那么他们之间不可以使用本地文件系统存储session,因为这将导致各网站之间无法共享session。如何解决这个问题呢? 继续阅读 [ APP创业项目-用户身份认证架构 ]

APP创业项目-基于阿里云的服务器架构

阿里云、AWS等各类云计算平台使得互联网创业成本大大降低,不仅仅是服务器硬件成本,更重要的是硬件运维成本。每多购置一台服务器,就多增加一份维护压力,而优秀的服务器运维人员是很难得的,因为这种技术在大学里面没有相关专业,仅凭经验摸索。阿里云不仅仅提供了云服务器硬件资源,更是有一群优秀的运维人员提供技术支持。回想2005年以前的互联网创业,购置服务器、托管服务器、运维服务器,每个服务器都要有一个备份服务器进行容灾,这门槛让很多创业团队难以跨越。如今,我们可以花费很少的成本,拥有一套大互联网公司级别的服务器架构。本文讨论一个APP创业项目如何基于阿里云架构服务器。

一个APP项目可能需要如下服务器:

应用服务器、数据库服务器、文件服务器(CDN加速)、图片处理服务器、LOG服务器、内存服务器、全文检索服务器、负载均衡器、NoSQL服务器(MongoDB)、消息队列服务器等。 继续阅读 [ APP创业项目-基于阿里云的服务器架构 ]

APP创业项目-APP开发技术选型:Hybird还是Native

开发一个APP有很多种可行方案:原生开发(Native)、混合式开发(Hybird)、PhoneGap生成(H5)、React Native、Python+kivy、Lua+Wax等等。本文挑选前三种常见的说说。

原生开发

应用能够发挥最佳性能,是高性能需求的应用的唯一选择,例如游戏开发、复杂应用。iOS用Object-C或Swfit、Android用Java、Win10用.NET,那么我们至少需要三个成熟的程序员。程序员各干各的事情,代码除了思想外都不能共用,相同的业务逻辑需要写三遍。应用发布新版本需要等待三个客户端同时开发测试完成才可。

PhoneGap生成

克服原生开发的平台鸿沟(Gap),几乎不涉及原生代码,使用H5编写应用的所有功能。PhoneGap为H5提供了调用系统的硬件资源的能力,并且提供了打包APP的功能,开发人员无需掌握原生代码。H5部分借助Jquery Mobile、React、Ratchet、Bootstrap、AngularJS等前端框架实现单页应用,APP仅仅是一个筐子,充当着浏览器的作用。一套程序既可以用作APP、也可以用作触屏版网站、还可以嵌入到微信公众平台,真是何乐而不为。但H5的性能和兼容性问题,需要一个出色的前端工程师才能驾驭。单页应用突出的问题在于页面之间的跳转,jQuery Mobile采用Div(Page)的显示与隐藏来模拟页面的跳转,虽然也能模拟转场动画效果、侧滑菜单等一系列类似原生的效果,但是视觉体验明显迟钝。如果界面非常复杂,例如电商网站的商品列表页,需要筛选品牌、类别、价格区间等等,那H5就显得捉襟见肘了。不建议创业产品使用单页应用开发,可以考虑传统网站多页面链接跳转的方式,即使这种方式没有单页应用的界面转换效果,但是更加可用。那界面之间的跳转空白岂不是很难看?这就是混合式的价值了。

混合式开发

采用原生开发与H5相结合,克服H5单页应用的体验限制,减少原生代码量。H5部分无需升级版本可以动态更新。借助Cordova实现H5与原生系统之间的通信。那么混合式怎么解决H5的界面跳转问题呢?混合式即要H5前端程序员,又要iOS、Android和Win10开发人员,并没有减少开发人员的数量,为何不直接原生开发?什么地方用H5,什么地方用原生开发呢? 继续阅读 [ APP创业项目-APP开发技术选型:Hybird还是Native ]

APP创业项目-后端语言选择

对于刚创业的团队,资金和人才配备没有成型的大公司充分,因此在技术选型上须充分思考。本文针对后端语言选择问题作出分析,不会涉及到语言优劣问题,笔者认为语言遵循优胜劣汰规则,能够继续生存下来的语言都是好的语言,只是各自适合解决不同的问题。

APP项目的后端语言通常有:JAVA、PHP、Python、Ruby、.NET、JS等。笔者在项目中只接触过JAVA、PHP、Python和JS,对于Ruby和.NET没有实践方面的认知,那么首先排除一下他们俩。据说Ruby以敏捷著称,但是它还是太年轻了,在创业项目上我更愿意选择一个成熟稳健的技术。.NET出自微软,从asp开始微软在WEB后端开发就非常优秀,但是一直不是互联网公司的首选,正如服务器领域Windows一直不是首选一样。NodeJS在JS风靡全栈的潮流下,也成为了很多团队的选择之一,但是不选择它的原因跟Ruby一样。那么就剩下JAVA、PHP和Python了。 继续阅读 [ APP创业项目-后端语言选择 ]

APP创业项目-数据库字段默认值的设计思想

本文讲述我们的常用Not Null和默认值设计规则。数据表中的一些字段不一定都必须有数据,例如一个内容管理系统(CMS)的文章表,有如下的字段:

20160413170323

id是自增的主键;

title和content表示标题和正文,不能为空值;

create_time是当前时间戳;

is_check表示是否审核,默认没有审核;

editor表示编辑人员,可以为空。

这些字段如何去设置它的Not Null和Default值呢? 继续阅读 [ APP创业项目-数据库字段默认值的设计思想 ]

APP创业项目-关系数据库冗余设计的场景

设计关系数据库的时候,表与表之间存在各种关联关系,例如设计一个论坛的数据库,用户与评论之间存在一对多的关系,那么需要评论表中设置用户表的id作为外键。为了使得数据库的读写操作尽可能优化,有时候不单单存储一个外键,需要冗余存储其他信息来提升数据查询的速度。下面说几个用到冗余存储的场景:

1. 存储查询复杂的静态数据
对于评论回复另一条评论,通常在论坛中会引用被回复的评论内容、用户名、时间等信息,如下图汽车之家论坛。在设计评论表时,通常会设置reply_comment_id指向被回复评论对象,这里为了方便理解,我们把被回复的评论称为父评论。20160413144412
如果父评论还有父评论,那么就形成了一个回复链。例如网易新闻的盖楼模式:

20160413144724

这两种模式在数据库存取上有什么差异呢? 继续阅读 [ APP创业项目-关系数据库冗余设计的场景 ]

Surface Pro(win10) 无线投屏与小米盒子3连接不成功的解决方法

前段时间买了surface pro3,用来连接投影做presentation的时候手写比较方便,原来有一个华为荣耀的盒子,尝试了各种方法都无法连接,安卓手机和Apple产品都可以正常连接,但surface不能。于是考虑重新购买一个无线显示适配器,搜索了很多产品,首选应该是买微软官方出品Microsoft Wireless Display Adapter,可以在京东或者亚马逊购买到,价格在400左右,据说也可以考虑ScreenBeam Mini,价格在200左右,两款产品我都没有实测,你可以到京东查看用户的评论。

我选择购买了小米盒子3,从小米官方网站购入,价格299,原因是所有的无线适配器HDMI接口都是公头,也就是说他只能插到带有HDMI的显示设备上,而大部分情况下投影都是VGA接口,因此需要购买一个“HDMI母转VGA母”的转接头,可以通过京东50元左右购买。另外还需要一个USB供电器,例如充电宝,无线适配器需要额外供电。电视盒一般是HDMI母接口,而我手头上正好有一个HDMI公转VGA母的转接线(这个很常用),而电视盒都自己有供电电源,而且电视盒放在家里偶尔还能看看电视(安装泰捷视频),是不是更合适呢?

装上电视盒,打开无线显示,提示等待连接,就OK了,然后就是surface端设置了。surface端可真是令人难受。

右侧侧滑出侧边栏,点击连接后能够看到“客厅的小米盒子”,但是始终连接不上,查了很多资料都说连接不上,而且surface pro 3的显卡是Marvell的,网上都说只有显卡和网卡都是intel的芯片才可以,快放弃的时候,尝试关闭surface的防火墙(网络设置->滚动到最下面->windows防火墙->启用和关闭windows防火墙->全部关闭,再次连接“客厅的小米盒子”,等待10s,居然连接上了,无语了,微软客服和小米客服都不能给出解决方案,仅仅是因为防火墙的原因

最后再说下surface pro 3的简单感受,手写方面暂时没有见到比surface更好的产品,如果你不配原装键盘的话,那么surface的最佳用途我觉得就两点:1. 记笔记;2. 讲PPT。如果你要把他当做出行电脑,那么一定要买个原装键盘,我买的是surface pro 4的键盘盖,感觉他可以替代mac air了。

对于APP UE创新的一点想法

创新是建立在扎实的基础之上的,追逐体验创新的前提是掌握体验的基本规律。APP作为网页与桌面软件之间的一种存在形式,小尺寸的屏幕要求其有更优的体验,这往往误导很多UE偏执地追求创新体验。实际上,无论是iOS还是Android都有其基础的交互范式,相比创新,UE们更应该先了解这些基础范式。

那么,如果所有APP都按照基础范式来做,岂不是APP体验都一样了,没有新意了?确实是这样的,大量的app都将体验雷同。但是,我们再回忆一下桌面时代的软件,他们是不是也是体验雷同?再看看iOS内置的地图、AppStore、音乐、iTunes等等,它们是不是也体验雷同?反而,当我们遇到一个体验独树一帜的APP的时候,心里是不是带有一丝恐惧,害怕花费很多时间却不会用?

iOS的TabBar、Navigation Bar、Segmented Control等等,Android的ActionBar、TabHost、PopUpWindow等等,系统原生提供了大量的UI组件帮助APP实现通用的功能,而很多UE出于对程序的恐惧,对这些基础组件的适用范围、能力边界并不了解,设计APP体验时,随心所欲,这将形成两种结果:

  1. 体验设计非常棒,技术团队也很给力,工期和资金也很充足,那么这很可能是一个很棒的APP;
  2. 体验设计不合理,技术团队内心抗争着去实现神奇的设计,工期不断延误,上线后发现用户无心使用;

本文认为,UE应该尝试了解系统层面基础范式,增大创新体验阅历,在中规中矩的APP设计中寻找创新的可能。在产品环境中,整体结构尽量使用基础范式,局部发挥创新。对于UE的知识体系,应该不断向硬件、操作系统、心理学等多方面拓展。