作者归档:wwang

从 React Native 到 Flutter,移动跨平台方案的真相

作者:LeanCloud 工程师郑鹏

2018 年 12 月,Google 发布了 Flutter 1.0 正式版,似乎再次点燃了人们对移动跨平台开发的热情。上一次出现类似的情况,是在 15 年年初,Facebook 发布 React Native 的时候。四年不到的时间里,有两家大公司相继推出了自己的移动跨平台方案(当然还有 16 年的时候,微软收购了 Xamarin,不过没有前两个那么引人注目罢了),同时这些方案也受到了市场的追逐。这些现象,似乎预示着,跨平台开发才是移动开发的未来,或者说,跨平台开发才是一种更好的开发方式。

既然它是热点,那肯定有可以讨论的地方。不过,在说 React Native 和 Flutter 之前,我觉得要先谈一谈「跨平台开发」。

移动跨平台方案

那什么是「跨平台开发」呢?

通常意义上来说,如果你想在 iOS 以及 Android 系统里,提供有相同内容的 App,那么使用 Apple 提供的构建工具,开发一个 App,然后上架到 AppStore,同时使用 Google 提供的构建工具,开发一个 App,然后上架到 Google Play。这两个 App 的实现,除了使用的工具不同之外,大部分业务逻辑是相同的。你可以发现,在这个过程中,产生了「重复」。

在重构时,如果项目里有大量的重复代码,或者重复逻辑,我们一般会将这些代码或逻辑以函数,模块或库的形式做封装,这个过程最大化的消除了重复的代码,最终达到简化项目的代码这一目的。

所以在我看来,「跨平台开发」也是基于这个思想而产生的,人们想要一套减少甚至不用写重复逻辑的解决方案,然后市场给予了人们期望的方案。跨平台方案的最大特点,可以用 Sun 当年在推广 Java 时,所使用的一句口号:」Write once, run anywhere」 作为总结。这一句话,也被如今的 React Native 以及 Flutter 引用或继承。

React Native

React Native 是由 Facebook 所主导的跨平台方案,得益于 Javascript 以及 ReactJS 的流行,React Native 在推出时,便受到了大量的追捧。除了跨平台的特性,React Native 最大的特点就是,可以使用 Javascript 来构建移动应用,并且最终应用的表现形式,可以做到和使用原生开发套件开发的应用相差无几。

React Native 能做到这些的核心原理就是 JavaScriptCore,一个 JavaScript 虚拟机。通过 JavaScriptCore,Javascript 能和其它语言互相转义,同时 JavaScriptCore 能运行在 iOS,Android 以及其它平台上,这些可能性放在一起,就成为了 React Native 的基底。有了这个基底之后,Facebook 便在这个基础之上,封装了各平台的应用层接口,定义了 Javascript 和封装后的接口之间的通信协议,最终,实现了使用 JavaScript 在不同平台开发具有原生体验的应用。

从实现原理以及架构上来看,React Native 似乎是一个不错的跨平台方案,只要封装好各平台的 API,那么我们有理由去相信,人们能够使用 React Native 开发出品质优秀的应用。但是事实上,理想和现实,还是有差距的。在 18 年,Airbnb 以及 Udacity 相继发表了博文,声明全面放弃 React Native,转向原生应用的开发。他们在文章中,提到的最多的就是,React Native 是一个不成熟的方案,虽然它有许许多多的优点,但是这些并不足以去弥补它的缺点带来的损失。AirBnB 以及 Udacity 可能是因为各种预期的理由而放弃了 React Native,不过在我看到 Discord 团队发表的 Why Discord is Sticking with React Native 博文后,算是彻底打消了我在生产环境使用 React Native 的念头。整篇文章看下来,让 Discord 团队仍然继续使用 React Native 的最大原因,似乎就是项目已经使用了它,骑虎难下了。

JavaScriptCore 的局限性,Facebook 在项目管理上的不成熟,以及不断出现的放弃声明,最终让人们发现,React Native 是一个有趣的方案,但并不是一个成熟稳定的方案。

Flutter

就在 React Native 的人气不断下跌的时候,Google 在一个恰到好处的时机,推出了一套跨平台方案:Flutter,将人们的目光再次聚集到跨平台开发上面。

Flutter 使用 Dart 这门较为冷门的语言来做开发,底基引擎主要由 Skia 和 Dart runtime 构成。Flutter 通过 Skia 和各平台的底层图形库对接,同时提供丰富的基于 Skia 的控件,来实现跨平台的开发。React Native 采用的方式是封装各个平台的应用层接口,而 Flutter 则直接打造了一套跨平台的应用层的开发套件。对这两种不同的方式,我们可以有一个直觉上的判断,Flutter 在性能上是要优于 React Native 的。因为 Flutter 的这种实现方式,其实早已被大量并广泛的使用了,最明显的例子就是游戏引擎。

种种对比和迹象表明,似乎 Flutter 是一个比 React Native 更好的跨平台方案。目前 Flutter 仍旧处于一个上升的势头,也有如阿里巴巴这种大厂给 Flutter 背书,颇具野心的底基框架让开发者有理由相信,只要投入足够的人力,Flutter 可以做到和原生开发一样好。

然而,Flutter 的缺点,也是源于它自行打造了框架,在很多平台特性上,诸如密码管理,选择光标等,Flutter 目前并不能支持,未来能否支持也要打上大大的问号,平台的特性可能和原生组件深度绑定,且目前没有其它接口,所以 Flutter 在现在这种状态下,只能是放弃这些特性的支持。需要提一点的是,React Native 在这方面没有太大的问题。

尽管有一些问题,不过 Flutter 表现出的潜力,还是让人们觉得,这是一个值得一试的方案,只要 Google 给予足够的支持。所以 Google 会吗?

结语

那么,我该选择哪种方案呢?答案:It depends on you.

事实上就是,没有一个完美的方案,任何方案都有利弊和取舍。想使用 Javascript 开发应用,那么就使用 React Native;想构建高性能的跨平台应用,Flutter 是个不错的选择;想最大化平台特性,那自然是原生的开发方式。

除了跨平台方案之间的比较之外,跨平台方案也在和原生开发方式竞争,而且这种竞争往往是不平等的,跨平台方案在新特性的支持上,始终要慢于原生开发方式,所以在市场占有率方面,原生开发方式就有天然的先发优势,这种差距很难被抹平。最终,你可能会发现,也许原生开发方式才是最合适的,因为除了「重复」外,原生开发方式相比跨平台方案,没有其它缺点了。

附记:之前我在 2019 年 3 月的 RTC Dev Meetup 北京站交流过上面的想法,感兴趣的读者可以查看演讲视频和 slide。

题图:Chris Sabor

如何能够保证自己应用数据的安全?|四月汇报

产品动态

应用归档自助激活

为了节省后端数据库的存储空间,我们会自动对近期(最近 30 天内)无数据 API 访问的应用进行归档,开发者要再次使用该应用,则需要联系技术支持进行手动激活。现在,我们在应用控制台上线了「自助激活」的功能,以方便大家使用。

如果有应用被归档了,打开控制台,会看到如下新的变化:

开发者可以点击「激活」按钮,并按照提示完成操作。一般而言,恢复一个归档应用大约需要 10-30 分钟,稍作等待之后您就可以正常使用了。

云引擎支持 MySQL 数据库

LeanCloud 云引擎作为一个带运维的托管平台,其实可以完成很多功能。现在我们计划让云引擎支持 MySQL 数据库,在底层数据存储上与 LeanCloud 存储服务解耦合,使之可以适用更多的业务场景,譬如自定义的业务后台、开源的 CMS 系统,等等。

使用方式上,增加一个 MySQL 数据库实例,其操作流程与云缓存类似:

MySQL 数据库的支持会首先在华北节点上线,之后会逐步扩大到其他节点,以后我们还会支持 MongoDB 数据库,敬请期待。

推荐内容

2019 前端框架对比及评测

测评名单中有没有你正在使用的框架,来看看它的成绩吧!

微信小程序 unionid 登录解决方案

如何在小程序中支持 unionid 登录,既能得到 unionid 登录机制的灵活性,又保留一键登录功能的便利性。

如何保护您的服务器免受黑客攻击

虽然我是一名经验丰富的开发人员,但在注册服务器两周后却遭到了黑客入侵。

常见问题

【数据安全】如何能够保证自己应用数据的安全?

最灵活的保护应用数据安全的方式是通过访问控制列表(Access Control List),通常简称为「ACL 机制」。ACL 背后的机制是将每个操作授权给一部分 用户(User)或者 角色(Role),只允许这些用户或角色执行这些操作。对 ACL 机制和数据安全方面更详细的解释可以参考文档:数据和安全

【控制台】控制台创建应用时,有两种应用计费方式:开发版与商用版。我该怎么选择创建何种应用?

开发版是针对开发测试阶段的项目或个人项目的解决方案。由于开发版是免费的,所以不提供数据备份恢复服务,在集群的设计上是不对可用性和数据的可靠性做保证的。

商用版应用底层使用的是高性能、高可用的基础设施,有更好的冗余和 SLA 保证。除了性能和稳定性方面的保证外,商用版用户还将免费得到工单技术支持、域名备案和绑定、自助数据恢复、自定义 SSL 证书、云引擎性能管理等增值服务。

综上,个人开发或者测试阶段可以选择「开发版」应用,商用项目建议选择「商用版」应用。

【绑定域名】文件不绑定自定义域名有什么影响?云引擎服务不绑定自定义域名有什么影响?

如果没绑定自定义域名,使用 LeanCloud 提供的公用域名,由于受到网络法规的管控与限制,我们无法 100% 保证该公用域名随时可用。为确保您的应用体验不会受到影响,请前往控制台 > 存储 >设置 >文件 设置好自定义文件域名。在控制台 > 个人中心 > 账号设置 > 域名绑定 中绑定云引擎域名。

点击查看更多 LeanCloud 用户常见问题解决办法

2019 前端框架对比及评测

Jacek Schae 原作,授权 LeanCloud 翻译。

我们将基于 RealWorld 示例应用对比前端框架。RealWorld 示例应用的特点:

  • RealWorld 应用

    比待办事项类应用更复杂。通常待办事项类应用不足以传达足够多的知识见解构建实际应用。

  • 标准化

    项目遵循特定规则。提供后端 API、静态标记语言、风格、API 规范。

  • 专业人士编写、审阅

    理想情况下,会是高一致性、高真实度的项目,由使用该技术的专业人士编写或审阅。

比较的库和框架

撰写本文时,RealWorld 示例应用仓库共包括 18 个 Conduit(Medium.com 克隆应用)实现。

本文不考虑框架的流行程度,RealWorld 仓库中列出的前端框架皆纳入对比范围。

RealWorld 前端框架

测度

性能

应用显示内容、可以使用需要花多久?

尺寸

应用有多大?我们只比较编译后的 JavaScript 文件大小。所有应用使用同样的 CSS 样式文件,CSS 文件加载自 CDN。所有应用使用的 HTML 也是一样的。这些框架都支持编译或转换为 JavaScript,所以我们仅仅测量 JavaScript 文件大小。

代码行数

根据规范创建 RealWorld 应用需要多少行代码?公平地说,某些实现的功能要略微多一点,但这应该没有什么显著的影响。我们仅仅测量每个应用的 src/ 目录。

性能

我们将使用 Chrome 的 Lighthouse Audit 测试性能。Lighthouse 返回 0 至 100 间的评分。0 为最低分。
继续阅读

Swift SDK 即时通讯功能(beta 版)发布|三月月报

产品更新

Swift SDK 即时通讯功能(beta 版)发布

3 月份我们发布了新版本的 Swift SDK(v16.0.0-beta),该版本包含了即时通讯的绝大部分常用功能,已经可以满足多数应用场景的需求,大家可以通过 CocoaPods 安装使用:

# Podfile sample
platform :ios, '10.0'
use_frameworks!

target 'YOUR_APP_TARGET' do # 替换 YOUR_APP_TARGET 为你的应用名称。
    pod 'LeanCloud'
end

下个月我们计划发布正式版,在 beta 版基础上会增加本地缓存、安全签名、黑名单和用户权限管理功能。同时,我们也会同步推出基于新 SDK 开发的全新 ChatKit 应用,新 ChatKit 会支持最新的 iOS 设备以及最近的三个 OS 大版本,它不会再以库的方式集成,而是以开源 Demo 的形式推出,其主要目的是展示如何使用 Swift SDK 来实现各种聊天功能。

除了即时通讯之外,Swift SDK 接下来也会加入 LiveQuery 功能,以及支持 Carthage 和 Swift Package Manager 两种集成方式,敬请期待。

vivo 混合推送(beta 版)发布

这一次我们采用了源码配 demo 的形式来公开这一功能:

vivo 混合推送 SDK 源代码:可参照这里
vivo 混合推送 demo:可参照这里
具体接入的流程可参考文档:vivo 混合推送

欢迎感兴趣的开发者试用,也期待大家给我们更多的反馈。

发票申请变化

从 2019 年 4 月 1 日起,我们将为普通发票申请额在壹万元以下的(含壹万元)用户开具增值税电子普通发票,超过壹万元的开具增值税纸质普通发票,电子发票将默认发送到用户信息中的邮箱。如果您有特殊要求(如必须要纸质发票或者发送到其他指定邮箱),请在申请发票备注栏里写明。

内容推荐

游戏出海技术指南:海外网络实践及优化专场

4 月 20 日,围绕海外市场趋势及网络优化等问题,一起来现场听听他们的实践经验。

 

七款酷炫的 Mac 屏保

你的桌面屏保是什么?

常见问题

【推送】为什么我收不到离线消息推送,该如何排查原因?

消息推送收不到的排查步骤如下:

  • 检查消息是否正常发送到服务器
  • 检查接收者用户是否离线,是否在 _Installation 表中有关联的设备记录
  • 检查是否有设置推送内容
  • 使用控制台推送在线发送工具实际发推送给目标设备查看推送是否出错,比如 iOS 证书不匹配,设备 Token 过期,设备 Token 和推送环境不匹配等

排查问题更具体的细节可以参考文档:为什么我收不到离线消息推送

【在线参数】统计服务下线以后,有办法给我单独开启在线参数功能吗?

作为统计服务的一个附属功能,在线参数已经和统计服务一同下线了。但为了不影响客户的线上业务,我们云端还支持在线参数的读取(4 月底才彻底下线)。

我们建议自行切换到存储服务里面来继续使用在线参数的功能,并且建议应用数特别多的时候将所有应用的在线参数合并到一个应用中,通过不同的名字或属性区分,这样可能最多也只需要开通一个商用版应用了。

如果不能短时间内完成迁移,可以走付费延长「在线参数」这一功能的方案,有此需求的用户可以发邮件至 support@leancloud.rocks 与我们联系,我们会对符合条件的应用重新开放在线参数的访问入口。

点击查看更多常见问题

安卓混合推送升级|二月刊

产品动态

游戏解决方案(Play)

二月份我们的游戏服务迎来了更多的开发者,同时也经历了他出生之后的第一次春节流量考验,虽然出现了临时扩容的紧张与慌乱,但所幸结果一切顺利,没有在全国人民面前掉链子,也让我们倍感欣慰。

实时对战 JavaScript SDK 支持 Promise 方式

前两天我们发布了 JavaScript SDK v0.18.0 正式版本,将异步调用的处理方式进行了一次升级,在原来的事件回调基础上,增加了 Promise 方式。例如在老版本 SDK 里用户连接至实时对战服务器的过程为:

// 发起请求
client.connect();

// 响应连接成功事件
client.on(Event.CONNECTED, () => {
  console.log('on joined lobby');
});

现在可以直接这样实现:

client.connect().then(()=> {
  // 连接成功
  console.log('on joined lobby');
}).catch((error) => {
  // 连接失败
    console.error(error.code, error.detail);
});

新版本完全遵循 ES6 Promises 标准,相信可以让大家开发起来更加方便。

游戏开发教程

应广大开发者的要求,我们工程师小姐姐还专门录制了四期直播课程,介绍游戏开发中的一些小窍门,有兴趣的朋友可以访问官网的学习页面或通过以下地址直接观看:

安卓混合推送升级

华为 HMS 推送增加 IntentUri 支持

对于华为的 HMS 推送,之前我们支持的版本缺少通知栏点击的自定义动作支持(推送请求的 IntentUri 参数),本月我们服务端上线了这一功能,现在开发者使用 v4.7.0 以上版本的混合推送 SDK,就可以使用这一功能,具体用法可以参考文档:HMS 推送接入指南

新功能预告

我们计划在 3 月份增加对 VIVO 推送支持,但是因为我们自己客户端数量有限,怕测试不完全,所以我们会推出一个 early-bird 版本,邀请大家参与前期测试。欢迎感兴趣的开发者通过发送邮件或者在项目 repo 下直接报名参与,谢谢。

Share

使用 Leancloud 实现 React Native App 的消息推送 – Android 篇

在 React Native 开发过程中征服的一个小小领域:消息推送。

【游戏开发】如何实现手游中的账户系统

这篇文章以 Unity 游戏引擎中的 C# 语言为示例,主要讲解如何实现几种主流的登录方式,包括游客登录、游客账号升级、手机号验证码登录、用户名密码注册及登录。

常见问题

【存储】怎么存储和获取音频/视频文件的时长 ?

AV.File 的 metaData 属性,可以用来保存和获取该文件对象的元数据信息。可以在上传音频文件时获取音频长度然后通过 metaData 方法手动添加文件时长。

【即时通信】对话查询如何区分单聊还是群聊?

SDK 层面不区分单聊和群聊。可以使用会话的成员数量做区分。「会话成员数量为 2」即是单聊,大于 2 即可看作群聊。

【即时通信】语音消息如何标记消息是否已经播放,类似微信语音消息标记是否已读的小红点,可以提供一些思路吗?

因为一个群里可能有很多人,每个人对一条消息都有一个「是否已播放」的状态,所以建议在客户端维护这个「未播放」状态。

做法之一是可以在客户端维护一个「收到了但是没有播放的音频文件」列表,然后拿到消息文件对比一下客户端是否已经播放过。

【即时通信】使用 where 查询条件查询某用户的会话列表,为什么查询结果是系统内所有用户的会话?

当没有添加任何 where 查询条件时,query 会使用默认查询条件 where={"m":{"$in":["client ID"]}},即查询成员含有此 client ID 的对话;当添加了任意 where 查询条件时,query 会严格按 where 条件来查询,即覆盖默认的 where 查询条件。

以 Objective – C 举例,添加了自定义的 where 查询条件时,如果想查询含有此 client ID 的对话,使用 [query whereKey:@"m" containedIn:@[@"client ID"]] 增加一个查询条件即可。

LeanCloud 月刊|国际节点正式独立运行

产品动态

国际节点正式独立运行

我们为了适应用户的需求变化以及产品下一步的发展,让 LeanCloud 正式成为国际化的产品,从 2019 年 1 月 1 日开始国际节点与国内节点完全分离,这将带来以下几方面的变化。

  • 国际节点使用独立的账户体系,并由 LeanCloud 的境外公司作为主体运营。

  • 我们将会逐步完成网站、开发者控制台、文档的国际化,提供英语技术支持,让英文环境的开发者也可以使用 LeanCloud。

  • 充值方式将支持国际信用卡、PayPal、境外银行转账。余额使用美元结算,无需像原来一样进行与人民币的转换。

  • 我们会和其他国外的服务一样按月提供电子发票,您无需再在控制台进行手动申请。

游戏解决方案(Play)在国际节点全部部署上线

首先,告诉大家一个好消息,游戏解决方案在国际节点全部部署上线,使用国际节点开拓海外市场的游戏开发者,可以抢先体验一下。

接下来我们分别说说实时对战和排行榜方面的变化。

实时对战

  • Client Engine:作为服务端控制游戏逻辑的一种扩展机制,我们已经完善了底层架构,完成了使用框架和文档,并发布了一个基于该方式实现的猜拳小游戏,作为 demo 希望给广大游戏开发者带来参考价值。

相关文章:如何在服务端实现游戏逻辑

  • SDK:完成了白鹭引擎(Egret)的匹配。现在我们的游戏解决方案已经支持如下平台:

    • 微信开发者工具,包括微信小游戏和小程序

    • Cocos Creator:包括 Web、微信小游戏、Facebook Instant Game、OSX/iOS、Android

    • LayaAir:微信小游戏

    • Egret:Web 小游戏

排行榜

  • 增强了防作弊的策略,只放行可信环境的数据更新请求,避免被恶意刷榜。

我们在 LeanCloud 成立五周年之际,发布了一款名为《LeanCloud 周年游戏》的微信小游戏。《LeanCloud 周年游戏》玩起来很简单,参与者要在 15 秒内从迅速掉落的蛋糕和炸弹中点中尽可能多的蛋糕来得分,蛋糕有好几种,分值也不一样,而误点到炸弹就要扣分。游戏一结束参与者能在排行榜中看到自己的名次,我们给前 50 名都设置了奖品。上个月,我们工程师从「客户端」、「服务端」和「作弊检测」几个方面,总结了一下开发这个小游戏的经验,感兴趣的朋友可以看看下面这篇文章。

相关文章:使用 LeanCloud Play 开发抢蛋糕小游戏的经验谈(附防作弊机制)

Android SDK 仓库的变化

我们已经将 Android SDK 最新版本(4.7.9)已经发布到了 The Central Repository,同时 Android SDK 的替代品—— Java Unified SDK 也都直接发布到了中央仓库,以后我们也会将两个 SDK 的后续版本都发布到这里,开发者可以不用再增加 LeanCloud 自己的私有仓库作为 maven 源,直接使用 jCenter() 包含的源即可引用 LeanCloud 最新的 Java/Android SDK。

统计服务下线

按照之前公告的计划,从 1 月 17 日开始,统计服务的后端系统正式停止接收各种客户端上报的数据,在 2 月 27 号之后控制台会停止统计指标的展示,今后我们会集中资源将核心服务做的更好更全面。
考虑到个别用户的使用情况,我们也提供了将统计服务私有部署的选项(有一次性的部署费用),如果您需要继续使用我们的统计分析功能,可以通过邮件(support@leancloud.rocks)或工单联系我们。

Share

优秀的命令行工具整理(一)

如果你用命令行,那么这些工具中大概至少有一个能让你的生活更舒心。

优秀的命令行工具整理(二)

本文是「命令行威力提升」系列的第二篇,这一系列展示一些出色的非标准工具,这些工具能让命令行用起来更容易、更享受。

优秀的命令行工具整理(三)

本文是「优秀的命令行工具」系列的第三篇。本文将展示五个命令行工具,这些工具能助你更方便地解决常见问题。

常见问题

【存储】数据存储表的字段是否有数量上限?字段多对性能是否有影响?

我们的存储功能基于 MongoDB,属于文档型数据库,这里的文档类似于 JSON 这样的非结构化数据,与传统的关系型数据库不一样, 所以讨论字段(关系型数据库中称为列)多少是没有意义的。
一个文档大小有 16 M 的限制,但是开发者真正使用时应远小于这个值,保证在几百 KB 之内能有较好的插入、查询、更新速度。
因为字段名是存在每个文档中的,所以字段名越短越节约空间。

【即时通信】安卓客户端怎么获取对话免打扰状态?

对于 Android 来说,不存在免打扰状态的。消息静音是针对 iOS 设备而言的(指不发送离线消息)。

Android 没有离线通知,因为聊天和推送使用的是同一个 WebSocket 长链接,聊天那里不在线,推送也是过不去的。

【控制台】控制台的应用为什么会被归档,被归档的应用怎么重新激活?

近三个月内没有 API 请求的开发版应用会被归档,归档后无法请求应用数据。

被归档的应用如需重新开启,可提供应用信息发邮件至 support@leancloud.rocks 申请激活。

【计费】通过 API 发送实时通信消息收费吗?

使用 API 发送即时通信消息也是收费的。计费标准就是 API 调用费用标准(每万次 1.0 元)。

此项计费在控制台 > 财务 > 消费明细中对应扣费服务项目是:「数据存储(API 请求)」。

【小程序】小程序真机上传数据时,控制台存储中显示的 Class 表名被压缩为单个字母,这个是为什么?

例如新建一个名为「Todo」的表,上传数据成功后进入控制台查看,其表名称显示为像 i、u 这样的单个字母。

这是因为真机上代码会被压缩,解决办法是在创建 Class 后向 SDK 注册该 Class 的名字:AV.Object.register(Todo, ‘Todo’);。

【云引擎】在云引擎部署时,会显示 [ERROR] exit status 128,请问会有什么影响吗?

是命令行工具在上传统计数据的时候的一个错误,不影响后续的部署,升级到最新版本的 lean-cli 就不会有这个提示了。

【CQL】LeanCloud 平台的 CQL 语句,与标准的 SQL 有什么区别。离线数据分析使用的 SQL 语句又有什么不同?

CQL 只是 API 的一点封装,是 SQL 的一个很小的子集,离线分析的 SQL 是 Hive SQL。标准 SQL 里面有很多内置的函数,CQL 里面都不支持。

也就是说标准 SQL 和离线分析的 Hive SQL 支持的内置函数有差异,而 CQL 基本不支持内置函数。

LeanCloud 推出 10x 程序员专用笔记本

在过去十多年里,苹果笔记本逐步从非主流的产品成为了程序员的标配,但是苹果从 2016 年开始使用的新键盘实在让大家失望,而其他厂商的笔记本中又难以找到在各方面能与 MacBook Pro* 抗衡的产品。在强大的需求驱动下,我们决定自己来解决这个问题。

我们最初把目标定为打造一款最适合程序员用的笔记本,但是经过一些早期的调研,发现这个群体太大,需求过于多样,还是把目标限定为资深程序员(也就是在硅谷喜欢说的 10x 程序员)这个更加垂直的群体比较好。这个产品需要满足以下条件:

  • 手感要好
  • 长时间使用不伤眼
  • 轻薄便于携带
  • 突破电池技术瓶颈实现超长持续使用时间
  • 价格低廉

在一个产品上同时达到这些条件的追求使得我们必须从 first principles 出发从全新的角度审视这个问题。

Jeff Atwood 说「最好的代码是没有的代码」,因为不存在的代码就不需要维护。在和多位成功的资深程序员的访谈中我们发现,其实他们大部分时候只要画画流程图,具体细节让初级程序员和实习生去实现就好了,所以键盘对他们来说其实是个伪需求。最好的键盘就是没有键盘。

为了满足高效地画流程图的需求,我们决定支持用笔的操作,并兼容几乎所有采用有机溶剂的第三方配件,在我们的测试中大部分笔在操作 10x 程序员笔记本时灵敏度比 Apple Pencil* 高一个数量级**。在显示技术方面,我们使用了比 Retina Display 分辨率高两倍、使用自然光反射技术的界面,有效视角接近 180 度(超过所有 LCD、LED 显示器),并且长时间使用眼睛也不会疲劳。

使用传统技术的笔记本厂商不得不在电池容量/使用时长和便携性之间做痛苦的权衡,然而最好的电池是没有电池,使用时长最长的笔记本是不耗电的笔记本。得益于可以反射自然光的显示材料,我们的笔记本真正实现了零功耗,所以做到了无需充电永久使用。

在小批量内测的过程中我们还发现了一个重要的隐藏需求。资深程序员即使实际很少使用 vim、sed、awk 等工具,也要对相关知识非常熟悉,这样与用 Visual Studio Code*** 的初级程序员相比才能树立优越感和区分度。所以我们的笔记本里包含了 10 种 10x 程序员常用工具的快速参考。

10x 程序员笔记本重新定义了 10x 程序员。

点击购买你的第一个 10x 程序员笔记本

* Apple、MacBook Pro 和 Apple Pencil 是 Apple Inc. 在美国和其他国家或地区注册的商标
** 在实验室条件下得到的结,实际使用中可能有偏差
*** Visual Studio 是 Microsoft 在美国和其他国家或地区注册的商标