Canonical Voices

Posts tagged with 'chinese'

liam zheng

为了庆祝Ubuntu Core 16正式发布,我们在IoT领域高手云集的深圳,专为欲大展拳脚的各路开发高手,创客团队举办了主题为“Jamming with Ubuntu Core”的黑客松活动。

为了庆祝Ubuntu Core 16正式发布,我们在IoT领域高手云集的深圳,专为欲大展拳脚的各路开发高手,创客团队举办了主题为“Jamming with Ubuntu Core”的黑客松活动。本次活动也是第一次以Ubuntu Core为开发主题的开发活动。活动吸引了来自不同行业的软硬件开发者踊跃参与,他们也通过Ubuntu Core展示了他们独特且创意的作品。

目前,Ubuntu Core 在柜顶交换机、工业网关、家庭网关、无线接入网络、数字标牌机器人和无人机等领域得到了广泛应用。部分活动开发者也来自于上述行业,在36小时的hack时间内,创意和作品将是他们对物联网的完美诠释。

与以往Hackathon活动相比,这次Ubuntu Hackathon多了一些不同,因为不同从而产生不同创意之作。本次活动迎来了远从台北而来的QNAP开发者,致力于在Ubuntu Core上打造IoT与NAS存储器的应用解决方案,同时也有上一届Hackathon的参赛者,更重要的是赢了很多新的开发者参与。他们的精彩项目也为本次黑客松活动添加了特别的气氛。

作品及项目:短短36小时,开发者们为Ubuntu Core带来了8个佳作。他们分别是:

 

天台聚落

团队:Jarvis Chung,Lucas Lu

项目介绍:(snap:water-iot-service)

天台聚落是指在IoT 物联⽹环境下监控⽔质,在不同环境下实现远程监控对水质的监控,解决了因为环境问题而不能时刻掌握水质的困境。该项目利用Ubuntu Core稳定且时刻保持最新的优势将传感器收集的信息传输到NAS再通过web服务显示在前端,实现了数据的采集和分析。

项目的愿景:为水资源的监测和管理提供更加便捷、直观、科学的思路,可用水库、蓄水池、水塔等无人照看且检修、监测困难水资源管理领域。

团队介绍:

威联通科技股份有限公司 (QNAP Systems, Inc.) ,公司专注于提供专业级的网络附加存储(NAS)和网络视频录像机(NVR)解决方案, 威联通的集成技术和设计带来优质的产品,其文件共享,虚拟化应用程序,存储管理和商业环境检测有效地提高企业运行效率。官网:(www.qnap.com/zh-cn)

 

Cooltools

团队:郝建林

项目介绍:(snap:sensor-gw)

用蓝牙连接TI Sensor Tag传感器套件,收集光照传感器数据,并通过本地WebServer实时显示在网页上。结合照明控制系统可以实现用Sensor Tag的物理按键开关灯,以及在环境亮度过小时自动开灯,整个系统都是通过高通 Dragonboard 410c与Ubuntu Core16 连接实现。在现实生活中,本项目可用于自动化环境光照控制,无需派人控制,也可避免因固定设置产生的能源浪费。

团队介绍:参赛团队来自深圳市酷图软件开发有限公司,公司专注于物联网应用开发,目前主要业务是为硬件产品开发APP。正在实践将物联网技术应用于实际生产生活,欢迎各界朋友交流合作。邮箱:cooltools@qq.com

 

Crazyou

团队:张研

项目介绍:(snap:crazy-app)

Crazyou来着深圳,是一家致力于打造智能机器人及开发板的初创团队,本次活动展示的项目则是可远程获取机器人运行状态,可远程开发调试,远程控制机器人或获取机器人摄像头捕捉的图像内容,绘制3D地图等。

团队介绍:趣之科技通过互联网构建实时远控能力,为Robotic类物联产品提供实时远控云应用服务与开放式核心硬件模块,致力用远程技术消除感知的空间距离。官网:www.crazyou.com

 

Simcaffe

团队:老梁

项目介绍:(snap:simcaffe)

simcaffe采用了高通DragonBoard 410c硬件计算能力,整合Ubuntu Cor以及Caffe深度识别平台,用斯坦福的开源深度学习算法, 用Python调用Caffe得到的识别结果实现图片分析和识别。未来可用在视频监控领域,并且该项目也是基于高通 Dragonboard 410c。Github:github.com/curiousguy98

团队介绍:

ABI Hackerspace管理员,目前为多家创业公司合伙人。从事研发工作近20年,在各类型公司实现过量产产品,辅助创业公司十多家。多次获得各类创意比赛大奖。小米硬件黑客马拉松第一名, Global Urban Datafest全球第三名, Moser穿戴式设备大赛一等奖。

 

PCBA

团队:臧鹏,Batur

项目介绍:(snap:sutop/movieword)

sutop是一款系统使用snap应用,基于node.js编写,可进行系统任务、资源、性能监控,并且以图形化的方式展示,界面简洁直观。PCBA团队另外一个项目则是movie word,可对字幕文件进行处理,去除数字、标点、去重,从而从电影字幕学习英语单词。

团队介绍:

臧鹏,热爱科技、电子产品,热爱开源,热爱ubuntu等一些有趣的事;目前致力于嵌入式软件;期望自由,做一些可以改变自己生活、改变自己世界的事,然后影响更多人。

Batur, 一个梦想成为大神的菜鸟。喜欢新奇的技术,最近正在学函数式编程。

 

我的衣柜

团队:黎健成

项目介绍:

使用树莓派上的Ubuntu Core进行衣服图片的自动分类,并存储起来,方便以后进行浏览和搭配。图片暂时使用上传的方式,之后有摄像头可通过摄像头获取。

关于开发者:黎健成,在读研究生,目前从事计算机视觉与深度学习的研究。除了对算法与数据结构等感兴趣外,对嵌入式、IoT等方面的开发也有所关注。喜欢参加各种各样的比赛,与各路大牛交流。个人博客(http://lijiancheng0614.github.io/)

团队介绍:

黎健成,在读研究生,目前从事计算机视觉与深度学习的研究。除了对算法与数据结构等感兴趣外,对嵌入式、IoT等方面的开发也有所关注。喜欢参加各种各样的比赛,与各路大牛交流。

 

Cellboot

团队:沈建丰

项目介绍:

使用Ubuntu Core进行物计算,将多台Ubuntu Core设备建立连接,可计算共享,每台设备都是计算集群的一部分。

团队介绍:

关于开发者:沈建丰是一名Ubuntu的用户,同时也是传媒公司的负责人,运营“华强北那些事儿”微信平台,主要擅长web应用开发。官网(http://www.editrobot.com)

 

在开发者们的精彩demo中,本次Ubuntu Core 16深圳黑客松活动圆满落下了帷幕,在2天的时间里开发者们用自己的code表达、诠释了心中的IoT是什么以及自己会如何去做。没有再见,只有再一次相见,期待与你相遇在下一站活动中。

 

Read more
liam zheng

Canonical 今日发布了面向物联网 (IoT) 的 Ubuntu Core 16,除了提供定期的可靠安全更新外,还为智能互联设备带来应用商店服务。

目前,Ubuntu Core 在柜顶交换机、工业网关、家庭网关、无线接入网络、数字标牌、机器人和无人机等领域得到了广泛应用。“Ubuntu Core 可为物联网提供安全保护,并为每部设备带去精彩的应用商店。”Ubuntu 和 Canonical 的创始人 Mark Shuttleworth 说。

“随着许多公司陆续拥抱物联网解决方案,强大的安全性和简单快速的系统更新就变得至关重要。”戴尔物联网战略及合作总监 Jason Shepherd 表示。“戴尔与 Canonical 就 Ubuntu Core 开展合作已经一年有余。目前,我们的 Dell Edge Gateway 系列网关已获得认证,全面支持 Ubuntu Core 16。这使戴尔能够提供工厂和楼宇自动化等物联网应用场合需要的长期支持和安全保护。”

新的 Ubuntu Core 系统提供突破性的安全性、管理功能、操作和升级能力,并且由于采用 Snap 应用包,整个平台具有体积小、对开发者友好的特性。Snap 应用包是受安全限制、只读且防篡改的应用程序映像,它们以数字签名的方式保证 IoT 软件的完整性。

IBM 副总裁兼新兴技术与高级创新部门首席技术官 Mac Devine 评价道:“认知时代的到来催生了更多的智能设备,这需要我们从根本上做出改变,以便处理庞大的数据和进行实时认知分析。Snap 让开发者能以一种可轻松在多个物联网设备间移植和升级的格式构建和部署应用程序,从而能够建立一种云与网络边缘之间的认知关系。”

更新控制功能让软件发行者和制造商可以在应用更新之前,先在生态系统中验证这些更新。Snap 更新属于事务性更新,这意味着一旦更新失败,系统将自动还原,因此开发者将更有信心定期更新他们的应用程序。

开源机器人基金会 (OSRF) 的首席执行官 Brian Gerkey 补充道:“OSRF 与全球各地的工程师、科学家和创业者开展合作,致力于让机器人走出研究实验室,进入我们的日常生活,广泛应用于工厂、施工现场、家庭生活和交通等领域。在将机器人部署到现实生活的过程中,有着许许多多的挑战。其中,远程管理和升级机器人软件是大家共同面临的一个重大问题。我认为,Ubuntu Core 16 能够通过 Snap 的形式部署 ROS 应用程序,让整个软件管理过程变得更加安全和简单,从而为开发者和组织部署机器人提供巨大帮助。”

Ubuntu Core 的操作系统和内核同样采用 Snap 架构,因此整个平台都可以进行事务性升级。所有 Ubuntu Core 设备,无论出自哪家制造商,都将获得免费、定期、可靠的操作系统安全更新。

英特尔制造商与创新集团总经理 James Jackson 表示:“从人们的健康到太空探索,机器人技术几乎对每个行业都能产生深远影响。这样的未来需要一个安全、可靠的平台。我们认为 Ubuntu Core 16 就是一个这样的平台,在 ROS 领域,Ubuntu 平台已经一路领先。”

通用或针对设备的 Snap 应用商店,可在设备的整个生命周期内为开发者提供支持,从 Beta 测试版一直到正式发布版,让开发者能够像云软件、企业软件和移动软件那样,轻松销售物联网软件。贴牌 (White Label) 应用商店则可帮助设备制造商打造品牌化、差异化的设备和软件体验。

“迈入物联网时代后,我们生活的方方面面将出现数十亿部设备。”Linaro 的首席执行官 George Grey 说。“Ubuntu Core 16 将使用 Snap 帮助开发者快速将产品推向市场,为市场带来新一代的基于 Linux 的物联网智能设备。”

Gartner 认为,到 2020 年,超过半数的新业务流程将包含物联网的某些要素。Ubuntu Core 16 带来的 OTA 更新、签名 Snap 和安全模型,可帮助开发者和设备制造商缩短产品上市时间。设备制造商可以从众多支持 Ubuntu Core 的芯片、SoC 及单板机供应商中进行选择,例如 Raspberry Pi 2 和 3、Qualcomm Dragonboard 410c 以及 Intel Joule。
 

Read more
liam zheng

北京时间9月7日下午1点,Ubuntu作为技术合作伙伴应邀参加亚马逊AWS黑客松活动,Ubuntu Core作为大赛多个技术开发主题之一,成为备受开发者的青睐的开发任务。Ubuntu Core为IoT(物联网)而生,拥有众多新特性以及配备不可获取的安全机制,并且事务性系统升级则是确保IoT(物联网)的高效稳定。

北京时间9月7日下午1点,Ubuntu作为技术合作伙伴应邀参加亚马逊AWS黑客松活动,Ubuntu Core作为大赛多个技术开发主题之一,成为备受开发者的青睐的开发任务。Ubuntu Core为IoT(物联网)而生,拥有众多新特性以及配备不可获取的安全机制,并且事务性系统升级则是确保IoT(物联网)的高效稳定。由于客观原因,大赛时长比普通的黑客松活动稍短,这也给开发者增加了挑战的难度,不过开发者们还是在有限的时间里面交出了满意的答卷。

Ubuntu Core作为将设备彼此连接的重要系统平台,给与设备和设备间创造了无限的可能性,连接至云端则是打通设备与设备间的最后一道障碍。AWS 黑客松活动期间,共有19支参赛队伍中有技术控、设计达人、资深开发者、学生、以及创业团队。在短短的20小时,活动现场有2支小组完成了Ubuntu Core的挑战项目。

 

智能照明:酷图软件

项目链接http://git.oschina.net/erabbit/OpenIoT

项目介绍:基于公有云的IoT实践,以JavaScript作为主要开发语言,通过将蓝牙串口将智能灯泡链接至AWS的公有云,可在Web端进行开关灯泡的动作,从而实现远程控制智能灯泡。。该项目也将制作成snap应用格式。

 

远程3D打印:UCR

项目链接:待更新

项目介绍:3D打印一直是创客、开发者所热衷的创新技术,当3D打印通过装有Ubuntu Core的Bubblegum-96开发板连接到公有云服务后将开创一键上传、自动切片、自动打印的创新应用。而Ubuntu Core则是为3D打印作业的稳定提供了保障。同时,本项目也会有snap格式应用。

除了以上完成项目开发的团队外,还有几个未完成Ubuntu Core任务的团队,相信在赛后开发团队将继续完善他们的项目,将Ubuntu Core带到更多的应用领域。Ubuntu Core的创新之旅才刚刚开始,未完待续。

 

 

 

Read more
liam zheng

第三届硬件自由日于6月23日在北京清华科技园 ∙ 科技大厦国际会议中心举行。Ubuntu应邀参加了以开源硬件为主题的第三届硬件自由日活动。作为Ubuntu Core合作伙伴的LeMaker、威控睿博现场展出了Ubuntu Core与96开发板、LeMaker Hikey在IoT应用场景。

第三届硬件自由日于6月23日在北京清华科技园 ∙ 科技大厦国际会议中心举行。Ubuntu应邀参加了以开源硬件为主题的第三届硬件自由日活动。作为Ubuntu Core合作伙伴的LeMaker、威控睿博现场展出了Ubuntu Core与96开发板、LeMaker Hikey在IoT应用场景。

威控睿博演示:

Ubuntu Core可以适用于很多场景,在硬件自由日活动上威控睿博利用装有Ubuntu Core的96开发板,控制多台3D打印机,从而解决单人同时控制、操作多台3D打印的问题。

LeMaker应用演示:

Lemaker是集开发板与解方案提供商的公司,Lemaker版的HiKey开发板可运行Ubuntu Core,现场还展出了另外一款LeMaker Guitar开发板,同样可运行Ubuntu Core。现场演示内容为:基于HiKey的硬件平台联动RosBot机器人,用Ubuntu Core加ROS的软件搭建的解决方案,可用于室内SLAM、机器人教学。

活动现场有超过100位的观众,在另外一个演讲会议厅有超过40人的行业参观者在场听取了Ubuntu Core技术以及应用的演说。

Read more
liam zheng

经过一段漫长的开发过程,我们很高兴地宣布,Ubuntu SDK IDE 的下一个版本从今天起进入 Beta 测试阶段。新版本包含全新的构建器 (Builder) 和运行时后端,最终消除了 SDK IDE 目前存在的最大问题。

Ubuntu SDK IDE 的下一个迭代

简单来说︰LXD 来了

经过一段漫长的开发过程,我们很高兴地宣布,Ubuntu SDK IDE 的下一个版本从今天起进入 Beta 测试阶段。新版本包含全新的构建器 (Builder) 和运行时后端,最终消除了 SDK IDE 目前存在的最大问题。

之前已经有传闻说基于 LXD 的新构建器将会取代基于 schroot 的构建器。没错,这些传闻都是真的。在几位值得信赖的测试人员对概念验证版本进行了一段时间的内部测试后,我们认为向更多人展示新版本 IDE 的时机已经到来。

下面,在直接介绍新软件包前,我们先来回顾一下不得不放弃 schroot 构建器的一些原因:

最大的问题无疑在于安装 SDK 后立即创建新的 chroot。从实时档案文件启动引导 (Bootstrapping) 完整的 Ubuntu 根文件系统非常缓慢,而且容易出错。每当档案文件或 Overlay PPA 存在打包问题时,就无法创建新的构建目标。这基本上导致 SDK 在打包问题修复前将一直不可用。LXD 已经解决了这个问题。新容器以现成可用的压缩映像文件形式下载,下载速度比以往快得多,而且得到的容器肯定可用,因为容器在发布前已经过我们的测试,而不是像 Overlay PPA 那样不断改变。映像下载完毕后将被缓存,而从缓存启动一个新容器只需要几秒钟!

第二个要强调的问题是,我们需要在桌面本地执行应用程序,但仍支持目前官方支持的所有 Ubuntu 版本。这意味着必须解决不同 Qt 和 UITK 版本的问题。我们曾经尝试过通过提供单独的 Qt+UITK 软件包来解决这个问题。但事实证明,这种方法需要破解和重构太多的软件包,因此是不可行的。而且,这不仅仅是构建时的问题,还是一个运行时的问题。那么如何既能在桌面上运行应用,使用最新、最流行的组件,同时又能保持 LTS 兼容性呢?

答案其实很简单:使用容器作为运行时目标,并在主机的 X 服务器上显示 UI。

此外还有一些问题,例如整体速度缓慢、挂载点泄漏(每个曾经因 schroot 而设置了数百个挂载的人都能明白我的意思)以及 ecryptfs 的问题等。

现在说够了过去,我们来聊聊将来,看看新版本有了哪些变化。在开始前需要指出的是,我们已经停止了对默认桌面套件的支持。默认已不再支持在主机上构建和运行应用。除了 qmake 和 cmake 插件自动创建的配置以外,SDK IDE 不会创建其他桌面运行配置。当然,我们还是有办法在主机上构建和运用应用的,但是需要手动创建运行配置。今后,我们需要创建一个与主机架构一致的容器来执行应用程序。这意味着,在主机系统上,几乎不需要使用额外的软件包作为依赖项。

IDE 将不再使用任何现有的基于 schroot 的构建器。click chroot 仍然留在主机上,但是将与 Ubuntu SDK IDE 分离。

开始

做法很简单,我们只需添加 SDK 发行版和适用于 Ubuntu SDK 工具的 Tools Development PPA:

sudo add-apt-repository ppa:ubuntu-sdk-team/tools-development

sudo apt update && sudo apt install ubuntu-sdk-ide

完成上面的操作后,IDE 现在完全可用。它会按照过去使用 click chroot 时相同的方式来发现容器。从各个方面看,开发者的体验并不会有太大变化。需要注意的是,目前我们还在 Beta 测试阶段,因此容器映像或 IDE 本身很有可能存在一些 Bug。请直接在 IRC 上或通过邮件列表向我们报告 Bug,更好的方式是通过 launchpad 中的官方 ubuntu-sdk-ide 项目来报告 Bug:https://bugs.launchpad.net/ubuntu-sdk-ide

已知问题和故障排除

lxd 组成员资格

通常,LXD 安装进程会配置必要的组成员资格。但如果该进程未配置成员资格,我们就需要确保当前用户属于 lxd 组。请发出以下命令:

sudo useradd -G lxd `whoami`

之后,重新登录将新组通知给登录会话。

重置 QtCreator 设置

有时,在不同版本间来回切换时,QtCreator(Ubuntu SDK IDE 的 Qt 应用程序)的设置会发生损坏。当发现已损坏或无法使用的套件、配置上可能有误的设备或者任何不寻常的问题时,按下 Qtcreator 上的重置按钮可能会有帮助。注意,这是一种相当激进的修复方法。操作上很简单,只需执行下面这条命令即可:

$ rm ~/.config/QtProject/qtcreator ~/.config/QtProject/QtC*

清理旧的 click chroot

前面提到,旧的 schroot 已与 SDK IDE 分离,但是仍留在文件系统中。使用以下命令可清理 click chroot:

$ sudo click chroot -a armhf -f ubuntu-sdk-15.04 destroy

$ sudo click chroot -a i386 -f ubuntu-sdk-15.04 destroy

这两个命令将释放大约 1.4GB 的磁盘空间。click chroot 位于 /var/lib/schroot/chroots 下。最好检查一下该文件夹是否为空,并且没有挂载任何内容。

$ mount|grep schroot

NVIDIA 显卡驱动程序

 

在使用 NVIDIA 显卡驱动程序的主机上,无法从 LXD 容器本地部署应用。如果主机具有双图形处理器,一种变通的方法是使用另一个图形处理器。

检查系统是否具有备用显卡

$ sudo lshw -class display

如果列表显示除 NVIDIA 以外的其他条目,则激活另一个显卡。prime-select 工具是一个简单易用的工具。

$ sudo prime-select intel

注意,你的系统上可能未安装这个工具,而且它不能与 bumblebee 一起使用。如果主机已安装 bumblebee 且缺少 prime-select 工具:

$ sudo apt-get remove bumblebee

$ sudo apt-get install nvidia-prime

如果主机除 NVIDIA 以外没有其他显卡,可以尝试 Nouveau 驱动程序,该驱动程序也许能用。不管怎样,这是一个非常严重的已知问题,我们目前正在着手解决。

启动新的 IDE

首先备份一些设置,以防在极少数情况下我们需要恢复回当前的 IDE。

$ tar zcvf ~/Qtproject.tar.gz ~/.config/QtProject

然后,在 Dash 中找到 Ubuntu SDK IDE 并启动它。

Ubuntu SDK IDE 首先会检查环境是否已正确设置。除非你是 LXC/LXD 超级用户,否则安全的做法是选择此对话框中的“Yes(是)”。

如果 Ubuntu SDK 是第一次启动,会打开一个欢迎向导帮助你设置套件和设备。

接下来,最好的建议是阅读向导的每个页面,并按照上面的说明操作。整个过程相当简单。
在下一页上,向导将帮助你创建套件。

按下“Create new Kit(创建新套件)”按钮,查看目标创建对话框。

在这一步中,可以在 3 种类型的目标间进行选择︰

  • Build to run on the desktop(构建以便在桌面上运行)- 筛选出所有与桌面兼容的映像
  • Build to run on device or emulator(构建以便在设备或模拟器上运行)- 筛选出所有可用于设备的映像
  • Show all available images(显示所有可用的映像)- 显示所有可用映像

我们选择“Show all available images”,查看所有现有映像的概览。

下一步,选择首选的目标架构。Ubuntu 手机和平板电脑是 armhf,主机 PC 是 i386 或 amd64。因此,要创建适用于手机的 click 包,需要 armhf 目标;要在桌面上测试应用程序,需要原生的 amd64 或 i386 目标。

我们可以为套件使用默认命名。

创建 LXD 容器需要系统管理员权限,所以下面我们需要验证自己的身份。

输入正确的密码后,LXD 映像下载将开始。

下载需要些时间,具体取决于网络的带宽。每个映像大约为 400MB。在向导下载和配置 LXD 映像期间,我们刚好有足够时间来看一篇简短的博客文章,了解一下到底什么是套件:你想了解却又羞于发问的关于套件的一切 。毫不夸张地说,花时间阅读这篇博客文章并了解开发套件是什么,是最佳的选择。

容器创建完毕后,会弹出一个简单的对话框显示一些基本详情。

向导的下一页将帮助你设置目标设备。在我们的例子中,我们已经有了一个 BQ (krillin) 手机和一个来自 rc-proposed 通道的模拟器。

但是,即使没有可用的手机、平板电脑或模拟器设备,结束向导肯定也是安全的。
在这个阶段,IDE 将自动发现 LXD 容器,并提示我们可以更新它。

这并不是一个必须要做的步骤,取消该对话框完全没有问题。

完成该向导后,IDE 将打开。

 

 

Read more
liam zheng

Ubuntu手机现在迎来第十一个重要更新:OTA-11,这次更新的亮点主要为Wifi Display(无线投射模式),借助Wifi Display的功能用户可以体验无线投射屏幕加桌面融合(convergence)的巨大便利。只要将Ubuntu手机连接至显示器或电视,桌面版的Ubuntu模式即可使用,一个移动设备可变身集多窗口模式的全尺寸桌面。目前该功能仅支持魅族PRO5 Ubuntu版,后续还将支持其他型号Ubuntu手机。

Ubuntu手机今天迎来第十一个重要更新:OTA-11,这次更新主要的亮点为Wifi Display(屏幕无线投射),借助Wifi Display的功能用户可以体验无线投射屏幕加桌面融合(convergence)的巨大便利。只要将Ubuntu手机连接至显示器或电视(需要支持Miracast),桌面版的Ubuntu界面即可使用,一个移动设备将变身集多窗口模式的全尺寸桌面环境。目前该功能仅支持魅族PRO5 Ubuntu版,后续还将支持其他型号Ubuntu手机。

 

Wifi Display:点击观看

Wifi Display使用的是魅族PRO 5 Ubuntu版内建的p2p(peer-to-peer)连接方式启动Ubuntu桌面模式,如直接将手机通过Wifi连接显示器或电视,那么手机将充当触摸板的功能,如已连接蓝牙鼠标、键盘,则将拥有传统桌面模式的体验,重要的是,手机的短信、电话功能可展现在外接显示器上。

 

Scope支持自动横屏模式

在OTA-11以前,Unity 8 Dash的Scope只能竖屏显示。而在OTA-11更新后,Scope将可以横屏显示,对于喜欢横屏的用户来说又多一个选择。并且主页Scope(今日、Nearby)会在解锁屏幕前完成更新,解锁屏幕后可获取最新的信息。

 

新增繁体中文输入法

Ubuntu 手机OTA-11又一新特点是支持繁体中文输入法——注音键盘布局。可通过设置——语言&文字——键盘布局,选择注音输入法即可使用。

 

DGU让Scope、App自动适配多端显示

桌面融合(convergence)作为Ubuntu手机的杀手锏功能,已经让给很多经常背包的用户减轻不必要的负担,作为开发者而言,Unity 8用户界面将支持DGU(dynamic grid units),在开发应用和Scope时更简单,一次开发就可以在多个显示端自动适配。

 

平板:M10性能改善

OTA-11是BQ M10 Ubuntu版的第一个大版本更新,改善操控体验,图形处理,提示性能。

 

其他改进总结:

  • 地理位置服务改善,获取地理位置更加准确;

  • 网络管理器更新到1.2版,在上网时更加安全;

  • 应用程序支持多窗口显示(M10桌面融合);

  • UITK滚动条设计更新,Head支持副标题;

  • VPN支持用户名和密码认证;

  • 浏览器应用改进;支持google hangout,重新设计的权限提示对话框;

  • 在桌面融合模式蓝牙鼠标反应更敏捷;

  • 修复了以下bug:语言包翻译,性能问题,自定义通知声音

Read more
liam zheng

5月7日,Ubuntu黑客松北京站在微软亚太研发总部正式开启,北京也出现了难见的晴天。北京站黑客松活动也如晴天一样,吸引了很多想挑战自己并富有创意的开发者到场一起hack。去年Ubuntu黑客松北京站是Ubuntu黑客松在中国的第一站,超高人气的参与度也为2016年黑客松活动打下了坚实基础。

5月7日,Ubuntu黑客松北京站在微软亚太研发总部正式开启,北京也出现了难见的晴天。北京站黑客松活动也如晴天一样,吸引了很多想挑战自己并富有创意的开发者到场一起hack。去年Ubuntu黑客松北京站是Ubuntu黑客松在中国的第一站,超高人气的参与度也为2016年黑客松活动打下了坚实基础。

开发创意的小船不翻,Ubuntu黑客松北京站的魔力不仅吸引了北京本地开发者、高校在校生还吸引了远从其他省市甚至是美国回来的开发者。他们在36个小时里,用创意、团队、超强的开发实力展现了凌晨四点的坚持和神奇。并且,现场还有特意赶来正在学开发的初中生,一探Ubuntu手机开发平台的魅力。

Ubuntu黑客松并不是单纯码代码的活动,而是一场充满学习交流、笑声的聚会。初次接触的开发者在得到现场工程师的指导后能快速解决碰到的问题,熟悉的开发者也会给与其他开发者帮助和支持。更重要的是,Ubuntu的工程师不止会帮助开发者解决码代码问题,还能与大家交流更多生活的经验,开发和谈笑风生两不误,硕果累累的开发成果就是有力的证明。

 

与往期黑客松活动不同的是,本次黑客松除了手机应用开发,特意加入了Convergence应用开发内容。现场共有8个小组参赛,码出了9个作品。游戏、创意原生应用一应俱全,还能在最新的BQ M10 Ubuntu版平板上运行。下面进入应用介绍环节:

Demo 1:死生忍者和疯狂赛车,基于HTML5的游戏,可玩性非常强,界面设计精美,可在Ubuntu手机、平板上流畅运行。

 

Demo 2:Amap,基于Scope的地图应用,使用高德地图API,可实现搜索地理位置,选择公交、步行的导航方式。

Demo 3:汤姆猫,最为熟悉和非常有趣的语音互动游戏。

Demo 4:水果侦探,由团队设计、开发的独立游戏,拥有排名机制,拥有很好的交互性和游戏性。

Demo 5:Ubuner,基于Scope的打车服务应用,可通过搜索地理位置,呼叫Uber司机使用打车服务。

Demo 6:Tuner ,原生应用,配合Ubuntu手机可为尤克里里、吉他调音,实用价值非常大。

Demo 7:Ubuntu 2048,数字游戏,界面上加入操作特效,并拥有排名机制。

Demo 8:Redheart,拥有AI功能的红心大战游戏,在平板上可流畅运行,游戏难度可调。

 

Ubuntu黑客松北京站在硕果累累的颁奖中落下帷幕,这也是2016年最为精彩的一次Hack,而北京站只是一个开始。下一次精彩的Hack还将在不久后与大家再度相见。

Read more
liam zheng

我们与我们的物联网业务主管 Maarten 进行了一次有趣的聊天。大家畅谈了投影仪与支持应用的软件无线电 (limeSDR.org) 相遇会发生什么。下面就是它们的结合带来的一些很酷的玩法,包括通过手势与无人机交流、进入无线电对讲机系统以及开辟实际上并不存在的覆盖区域。

我们与我们的物联网业务主管 Maarten 进行了一次有趣的聊天。大家畅谈了投影仪与支持应用的软件无线电 (limeSDR.org) 相遇会发生什么。下面就是它们的结合带来的一些很酷的玩法,包括通过手势与无人机交流、进入无线电对讲机系统以及开辟实际上并不存在的覆盖区域。

  • 使用软件无线电 (SDR) 接收电视广播,并使用投影仪作为电视屏幕

  • 添加 WiFi 应用但不必多交一部设备的电费

  • 添加 4G 应用,通过 REST API 获取电信提供商的频谱,并为建筑物内没有信号的地方提供信号覆盖

  • 探测进入房间的人是否随身携带了手机并开启投影仪,在周围没有人时关闭投影仪。如果照明、供暖等设备可通过 API 来控制,那么这些设备也包括在内

  • 创建你自己的物联网无线协议,从而可以连接房子周围的感应器,并将带有实时数据的仪表板投影到屏幕上

  • 使用支持蓝牙的手势感应器探测手的动作,通过手势与无人机或玩具车交流并控制它们,将无人机或玩具车看到的东西投影到屏幕上观看

  • 使用 3 台投影仪,根据每个人的蓝牙或手机信号以三角法定位每个人在办公室内的行动位置。连接他们的在线日历,按照他们的日程安排自动打开 Webex 或 Google Hangout。连接室内的无线监控摄像头,将监控画面传送给其他会议邀请。使用内置麦克风收听会议所讲的全部内容

  • 通过港口的 AIS 信号传输设备跟踪船舶航行或通过 Mode S 跟踪飞机飞行,并通过投影仪显示在 Google Map 上绘制的船舶和飞机航线

  • 通过直接式胎压监测系统 (TPMS) 将车辆状态的实时数据投影到屏幕上

  • 与诸如无线电对讲机的各类 2.4GHz 设备通话,以及通过投影仪连接婴儿监视器来显示婴儿当时的活动

  • 构建你自己的低功率 WAN 接收器解决方案(例如 LoRA),并在屏幕上显示接收到的内容

 

Read more
liam zheng

大会来了!三星年度大型开发者峰会即将于4月27日至28日在旧金山揭幕,旧金山是一个极具吸引力的地方,很多开发者、创新者聚集在这里讨论最新的技术和未来创新。

大会来了!三星年度大型开发者峰会即将于4月27日至28日在旧金山揭幕,旧金山是一个极具吸引力的地方,很多开发者、创新者聚集在这里讨论最新的技术和未来创新。

今年,物联网(IoT)将是一个巨大的焦点,特别是智能家庭和针对物联网设计的芯片——ARTIK,届时我们的同事Didier也会出现在大会现场做演示,也会发表关于ARTIK的演讲。

我们的演示将是一个可以让你方便在家庭网关(Home gateway)上部署其他应用的app。让你直观感受智能手机和家庭机器人之间是如何交流、通信从而为你服务的。当你到家时,机器人将用摄像头来识别是你回来了,同时麦克风也可以提供语音交互。

除此,你还可以部署其他app在家庭网关上,包括一个接入点(家庭WiFi),视频服务,本地的服务器(比如Skype和Google Hangout的数据都存储在本地),自动化家用设备等。

并且,我们的往期博客也有关于本次活动的内容,比如这里

Read more
liam zheng

空中移动基站来到英国

英国最大的移动运营商 EE(现已归属 BT 旗下)近日宣布,将与新一轮开源移动网络技术大潮领导者之一的 Lime Micro 以及 Canonical (Ubuntu) 合作,共同确保英国实现更好的移动网络覆盖。

英国最大的移动运营商 EE(现已归属 BT 旗下)近日宣布,将与新一轮开源移动网络技术大潮领导者之一的 Lime Micro 以及 Canonical (Ubuntu) 合作,共同确保英国实现更好的移动网络覆盖。

EE 正在大力投资网络建设,争取到 2020 年实现 95% 的 4G 网络地理覆盖率。但是,并不是所有地区都可以或者都适合建造新的大型信号塔。他们想充分利用现有基础设施,例如灯塔、高层建筑、山岭等等。另外的一大难题是,依靠现有手段覆盖偏远地区在经济上或技术上是不可行的。正因为如此,EE 才选择与技术创新公司合作开发成本更低、体积更小、弹性更高、效果更好的解决方案。

Lime Micro 即将以众筹形式推出首款支持应用的开源软件无线电,即 LimeSDR。通过 4G 应用,LimeSDR 将构成一个功能完善的基站的基础。将这个基站安装到热气球或无人机上,可以覆盖通过其他方式难以到达的地区。另外,将这些基站嵌入自动售货机、银行设施、智能灯杆、数字标牌等其他用途的设备内部,还将降低部署连接的成本。

EE 希望偏远社区也能加入网络建设当中。这些社区可以提出他们需要的功能,甚至可以参与网络的维护。这可以让社区与运营商以全新的方式合作。并且有了当地人的支持,甚至可以减少受过培训的技术人员长途跋涉解决问题的需要。例如,如果一个基站只是需要重新启动,那么派遣一位工程师从爱丁堡跋涉 300 英里前往诸岛将是一件很不经济(或者不切实际)的事情。

EE 将在英国多所大学举办挑战赛,鼓励大家集思广益,就如何连接未联网地区和降低运营成本提出更多创新和开源的想法。任何有好创意的人都可以参加。Ubuntu Core 具有开源、支持应用和随时可用于生产的特点。你只要购买一个 LimeSDR,下载 Ubuntu Core,就能向世界展示你的应用或设备可以怎样降低网络运营成本。帮助未联网地区实现网络覆盖将促进经济发展,因此你的努力将会造福我们的社会。我们非常期待看到你如何将无线网络的未来变得更加美好.

LimeSDR Crowd Supply 宣传视频(优酷)

Read more
April Wang

Ubuntu 手机平台的快速发展及其向物联网IoT和各种设备的广泛延伸,要求我们必须解决安全性和可靠性的实际问题。这些挑战同样存在于台式机和服务器系统平台,并令想使用长期支持版本来运行较新软件的用户和开发者感到格外烦恼。这促使我们开发了 snap 打包格式和工具。

在 Ubuntu 16.04 LTS 中,用户将可以同时安装 snap 包和传统的 deb 包。这两种打包格式可以和谐共存,并使我们能够保持现有的操作系统开发和升级流程。这种做法巩固了我们与 Debian 社区的关系,同时也使广大开发者和社区可以根据需要为 Ubuntu 用户发布 deb 应用或 snap 应用。

利用 snap 软件包,开发者可以为 Ubuntu 16.04 LTS 带来更新版本的应用。较新版本的 KDE、GNOME、浏览器或其他桌面环境应用通常很容易在较旧版本的 LTS 上构建,但是打包和提供更新的复杂程度令我们过去无法提供这类应用。

snap 包的安全机制让我们可以开放平台并在各个分支版本间更快地迭代,这是因为 snap 应用与系统的其余部分是隔离的。用户可以放心安装 snap 而不必担心会对系统或其他应用造成影响。同样,开发者可以自己决定为其应用打包的库的具体版本,从而更好地掌控更新周期。事务性更新使 snap 软件包的部署更加稳定和可靠。

通过在 Ubuntu 16.04 LTS 中加入 snap 软件包支持,我们使 Ubuntu 开发者拥有统一的体验,无论他们是为 PC、服务器、手机还是物联网设备开发软件。Snapcraft 是面向 snap 开发推出的一款工具,可帮助开发者轻松打包应用和依赖项。以 snap 软件包为目标的开发者将获得一个极佳的环境来直接在桌面上编写和测试他们的应用,而不必使用某个设备或虚拟机。

付费应用的开发者通常不得不管理各种库之间的依赖关系和兼容性,特别是在较旧版本的 Ubuntu 上,这令他们颇感烦恼。出于这个原因,这些应用将于 2016 年秋季从 deb 迁移到 snap。Canonical 将与开发者社区一同努力,在未来几个月内提供工具、培训和文档来支持大家顺利完成过渡。

虽然这对于 Ubuntu 社区来说一项重大的新功能,但这并不会使我们丧失传统。16.04 及后续版本仍将继续支持数以万计的所有 .deb 格式的应用和软件包,特别是将会继续提供 deb 档案文件,以供所有人使用和分发软件。

如果您想进一步了解在经典 Ubuntu 上使用 snap 的更多信息或对此有任何疑问,请访问 ubuntuonair.com 参加我们近期举办的以下活动:

Snaps on classic Ubuntu Q&A with Olli Ries,4 月 14 日星期四 15:00(UTC 时间)

Snappy Clinic,4 月 26 日星期二 15:00(UTC 时间)

像往常一样,您可以通过 snappy-app-devel@lists.ubuntu.com 邮件列表参与讨论,或在 Ask Ubuntu 上提出和解答有关 snappy 的问题。

原文作者:Olli Ries  最早发布时间:2016 年 4 月 13 日,原文网址

Read more
liam zheng

Ubuntu手机家族已迎来第四款Ubuntu手机——魅族 PRO5 Ubuntu版,特别举办本次魅族 PRO5 Ubuntu手机黑客松上海站活动。这也是2016Ubuntu黑客松活动的第一站。2016年4月9日,黑客松活动在上海浦东联合创业办公社(张江高科)正式开始,当天吸引了5个主力团队在短短的36个小时内hack出了成果。现场有参加过往届黑客松的开发者,也有第一次参加的码农们,还有在校的大学生。

 

Ubuntu黑客松上海站与之前的黑客松活动一样,让开发者在有限的时间内完成作品或Demo的开发,在参与活动的同时开发者结实更多朋友,分享开发经验,活动、社交两不误。活动正式开始后,开发者们开始互相交流,或向现场工程师咨询开发中遇见的问题。在上海站获得中,解决了一个开发者在安装Ubuntu SDK中安装chroot问题,如果你也碰到这个问题,不妨查阅下该方法。经过36个小时的奋斗、努力,开发者小组们完成了3个作品(Demo),并将其安装到Ubuntu手机上做演示,分别:Uper开发工具,一款可以简化Ubuntu手机开发的工具;chess Ubuntu手机下流畅运行的国际象棋游戏;股票大师Scope,在Scope上浏览最新的股票资讯。

 

Uper(Ubuntu手机开发工具)

国际象棋游戏(chess)

股票大师Scope(从股票行业网站获取最新的股票信息)

黑客松活动现场会列出开发活动时间表,开发者根据时间表可灵活安排开发时间和进度。Ubuntu手机黑客松活动在4月10号下午4点截止,4点20分进行作品介绍、演示,开发者将进行作品、设计理念以及用途做介绍。虽然笨次活动时间有限,但开发者在活动结束后依然可对作品进行完善、添加功能后上传至Ubuntu手机应用中心。如果你现在拥有Ubuntu手机,那么不久后你就能体验到黑客松活动开发的应用了。

 

上海站Ubuntu手机黑客松还邀请到了Techcrunch CEO卢刚、猫科技媒体运营斯文前来活动现场担当比赛评委。在开发者对作品进行介绍和演示后,评委最终评定3个团队可获得黑客松奖项。也许你因地域或其他原因不能来现场参加黑客松活动,在这里做一个预告:下一场黑客松即将开始,期待你的参与!

 

最后,留一个彩蛋,黑客松活动现场开发者自己不仅带了笔记本还带了大屏显示器。


Ubuntu手机黑客松

对于Ubuntu手机应用开发,不仅是开发一个应用,而是一个熟悉Ubuntu桌面、手机的机会。为了方便开发者轻松开发Ubuntu手机应用,Ubuntu在赛前会举行在线视频培训,介绍Ubuntu 手机SDK安装、配置,以及开发案例,这样让开发者提前熟悉Ubuntu SDK,做好开发,不仅有在线视频培训,活动现场也有经验丰富的软件工程师进行指导。

Read more
liam zheng

Ubuntu手机OTA-10已发布,比起OTA-9,本次更新不仅仅在UI上有所改善,修复了已知bug,还迎来诸多新功能,新增了更多预装应用。

Ubuntu手机和常见的IOS和安卓系统使用方式有很大的区别,它采用手势滑动操作完全不需要使用手机按钮。对于首次使用Ubuntu手机的用户来说,会需要经过简单的学习来熟悉这个系统界面,OTA-10对首次开机使用教程进行了重新设计,上手Ubuntu手机更加容易。虽然和传统智能手机器的操作方式有很大区别,但实际操作更加合理,新用户上手也极快。

这是Ubuntu手机从去年上市以来, 第10次系统更新。这次OTA-10版本更新中有以下几项重大新特征。

 

新增3个预装应用

OTA-10新增加了3个预装应用,分别是邮件(Dekko)、日历、和导航应用(uNav),这些都是是日常工作、生活中会重度使用的应用,现在无需再单独进行安装。

 

新增VPN功能

智能手机的功能早已不是仅仅局限于拨打电话和发送短信了,上网功能的使用需求越来越频繁、重要。尤其是对网络有特殊要求的用户。以往可在Ubuntu桌面端上使用VPN,现在在OTA-10上也可以使用VPN服务了。使用方法和Ubuntu桌面端一致,在设置——网络,点击开启即可。

 

浏览器——针对桌面融合模式优化

谈到网络,OTA-10另一项改进就是对默认浏览器应用的优化。在手机或平板触控模式下,可使用长按操作呼出选择器功能,选择网页内容进行复制/粘贴。在桌面融合模式下,终端打开的某个网页链接,系统会自动开启浏览器应用并打开一个新的页面, 而不是另外再打开一个浏览器应用。不仅如此,当手机、平板连接到鼠标后,浏览器底部提示自动变成可点击的侧边栏。除了上面的功能,还针对内存占用进行了优化。

 

Web应用功能丰富

Ubuntu手机支持三类原生app、Scope、Webapp应用,作为现在普遍使用HTML5语言的Webapp,OTA-10增加相机(可通过开启webrtc视频参数实现)、麦克风、震动、加速器等接口系统功能调用,Webapp的功能、体验将变得更好。SoundCloud用户可在Web应用登陆自己的账户,查看歌手信息,查看、发表歌曲评论,获取精心制作的精选集,欣赏喜欢的音乐。

 

中文输入法

在OTA-10中,拼音输入法更新libpinyin7了,进一步改善中文输入体验。如果你喜欢日语,本次更新也加入了对日语键盘布局支持。

 

桌面融合模式

OTA-10修复了在融合模式下已知bug,并提供更多设置的选择。例如,新增显示器设置,可选的语言输入方式,桌面融合模式开关按钮等。

其他

手机系统更新除了可在WiFi模式下载,亦可使用手机3G/4G网络进行下载更新。还改善对外置麦克风及音量控制的识别、支持。

以上为Ubuntu手机OTA-10更新信息,如果你还没有更新的话,请打开手机,点击设置—软件更新进行更新。详细的更新日志见:链接 

 

 

Read more
liam zheng

魅族Ubuntu版手机PRO 5已亮相2016 MWC,可在魅族官方网站开始接受预定,售价为369.99美元(全球包邮)。

 

今天是2016 MWC的第一天,Ubuntu在3号厅3J30展台为大家带来特别的一次展示,手机预装展示版Ubuntu手机系统,正式发售时会预装有下一个OTA系统更新。

 

魅族PRO 5 Ubuntu版手机可通过魅族官网预定并在Canonical新合作伙伴京东全球在线购物网站上进行购买。京东是中国最大的在线购物平台,为全球消费者更快、更方便的购物体验。届时,魅族PRO 5 Ubuntu版手机将通过京东全球购平台销售和快递。

 

时隔一年,魅族PRO 5 Ubuntu版手机自魅族和Canonical合作推出的第二款设备,也是第五款Ubuntu手机。魅族科技的副总裁李楠表示:“魅族和Canonical有很多有趣的计划,期待在未来能有更深入的合作”。

 

关于京东

京东是一个技术驱动型公司,专注于研究、开发一个可信赖和大规模的平台,旨在为广大消费者、合作伙伴提供专业的服务,为公司更快的发展提供基础。除了网络商城,京东还在物流、互联网金融、云计算、智能技术等领域拥有不凡的成绩,

Read more
liam zheng

(原文作者:刘晓国

在之前的培训教程"在Ubuntu OS上创建一个dianping Scope (Qt JSON)"中,介绍了如何使用C++来在Ubuntu平台上开发一个Scope;在文章"使用golang来设计Ubuntu Scope"里也展示了如何使用go语言来在Ubuntu上开发一个Scope。今天将展示如何利用Javascript语言来开发一个Scope。这对于网页开发的开发者来说,无疑是一个好消息,不需要学习另外一种语言就可以轻松地开发一个Scope。更多关于Scope开发的知识可以在这里获得。

一、安装 

首先,必须强调的是Javascrip支持Scope的开发始于Ubuntu 15.04(vivid)系统及以后的版本。在开发之前,开发者必须按照文章"Ubuntu SDK 安装"安装好的SDK。同时,必须做如下的JS Scope开发工具的安装:

$ sudo apt install unity-js-scopes-dev
$ unity-js-scopes-tool setup

在这里必须注意的是,必须在安装完Ubuntu SDK后才可以执行上面的安装,并在SDK的安装中chroots必须安装完整。经过上面的安装,基本上已经完成了所有的工具的安装。

 

二、JS Scope开发文档

所有的开发离不开所需要的技术文档,JS Scope的开发文档的地址可以在early build找到,当然也可以通过安装unity-js-scopes-doc包来得到帮助。

 

三、创建一个我们的Scope

A、Webservice API:

以使用百度天气API为例,该API的连接为:

http://api.map.baidu.com/telematics/v3/weather?output=json&ak=DdzwVcsGMoYpeg5xQlAFrXQt&location=%E5%8C%97%E4%BA%AC

点击上面的连接后,可以得到JSON格式的输出:

{"error":0,"status":"success","date":"2016-01-18","results":[{"currentCity":"北京","pm25":"13","index":[{"title":"穿衣","zs":"寒冷","tipt":"穿衣指数","des":"天气寒冷,建议着厚羽绒服、毛皮大衣加厚毛衣等隆冬服装。年老体弱者尤其要注意保暖防冻。"},{"title":"洗车","zs":"较适宜","tipt":"洗车指数","des":"较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。"},{"title":"旅游","zs":"一般","tipt":"旅游指数","des":"天气较好,温度稍低,而且风稍大,让您感觉有些冷,会对外出有一定影响,外出注意防风保暖。"},{"title":"感冒","zs":"极易发","tipt":"感冒指数","des":"天气寒冷,昼夜温差极大且空气湿度较大,易发生感冒,请注意适当增减衣服,加强自我防护避免感冒。"},{"title":"运动","zs":"较不宜","tipt":"运动指数","des":"天气较好,但考虑天气寒冷,风力较强,推荐您进行室内运动,若在户外运动请注意保暖并做好准备活动。"},{"title":"紫外线强度","zs":"弱","tipt":"紫外线强度指数","des":"紫外线强度较弱,建议出门前涂擦SPF在12-15之间、PA+的防晒护肤品。"}],"weather_data":[{"date":"周一 01月18日 (实时:-8℃)","dayPictureUrl":"http://api.map.baidu.com/images/weather/day/qing.png","nightPictureUrl":"http://api.map.baidu.com/images/weather/night/qing.png","weather":"晴","wind":"北风3-4级","temperature":"-4 ~ -11℃"},{"date":"周二","dayPictureUrl":"http://api.map.baidu.com/images/weather/day/qing.png","nightPictureUrl":"http://api.map.baidu.com/images/weather/night/duoyun.png","weather":"晴转多云","wind":"微风","temperature":"-1 ~ -8℃"},{"date":"周三","dayPictureUrl":"http://api.map.baidu.com/images/weather/day/duoyun.png","nightPictureUrl":"http://api.map.baidu.com/images/weather/night/yin.png","weather":"多云转阴","wind":"微风","temperature":"0 ~ -7℃"},{"date":"周四","dayPictureUrl":"http://api.map.baidu.com/images/weather/day/yin.png","nightPictureUrl":"http://api.map.baidu.com/images/weather/night/duoyun.png","weather":"阴转多云","wind":"微风","temperature":"-3 ~ -6℃"}]}]}

开发的Scope需要解析上面的JSON格式的输出,并在Scope中呈现。

 

B、创建一个最基本的scope

在这一节中,来练习创建一个JS Scope,可以利用在Ubuntu SDK中所提供的template来轻松地创建一个Scope。首先,打开SDK,选择"New File or Project":

在最后的几步中,必须为每个所选择的Kit都要做同样的步骤以完成整个项目的生成。这时可以运行(点击SDK左下角的绿色按钮)Scope:

显示如下,基本上没有什么特别的东西。它在默认的情况下显示的是一个天气的Scope,但可以在它里面输入一些感兴趣的城市的名称来得到当前城市的天气情况。也可以选择SDK屏幕做下角的Desktop或Ubuntu Desktop SDK kit来在Desktop的环境下运行。当在手机上运行时,必须选择Ubuntu SDK for armhf来运行:

 

项目总览及npm集成:

在上面的演示中,已经生产了一个scope项目。先来查看一下项目结构:

liuxg@liuxg:~/release/chinaweatherjs$ tree
.
├── chinaweatherjs.apparmor
├── CMakeLists.txt
├── CMakeLists.txt.user
├── manifest.json.in
├── po
│   ├── chinaweatherjs.pot
│   ├── CMakeLists.txt
│   ├── Makefile.in.in
│   ├── POTFILES.in
│   └── POTFILES.in.in
└── src
    ├── chinaweatherjs.js
    ├── CMakeLists.txt
    ├── data
    │   ├── chinaweatherjs.ini.in
    │   ├── chinaweatherjs-settings.ini.in
    │   ├── icon.png
    │   └── logo.png
    ├── etc
    └── node_modules
        ├── last-build-arch.txt
        └── unity-js-scopes
            ├── bin
            │   └── unity-js-scopes-launcher
            ├── index.js
            ├── lib
            │   └── scope-core.js
            └── unity_js_scopes_bindings.node

8 directories, 20 files

从上面的结构中,可以看出来核心的文件将是src/chinaweatherjs.js文件。在node_modules中含有所需要的库,如果先前已经做过一些Scope开发,那么重新利用该文件来构造Scope将是非常简单的。如果还没有开发过任何其它的Scope的话,那么,请继续阅读下面的介绍。

 

npm集成

细心的开发者可能已经注意到一个叫做node_modules的目录,JS Scope使用的框架就是npm + Scope,可以很方便地使用unity-js-scopes-tool来加入所需要的npm包到Scope项目中去,运行的命令如下:

$ unity-js-scopes-tool install <path/to/project/src/node_modules> <npm package>

上述命令将安装任何一个所需要的npm包到项目中去,如果对npm还不是很熟话,请参阅连接https://www.npmjs.com/

 

API总览

在这一节中,将介绍一下所使用的API及如何实现所需要的Scope。

Javascript Scope的基本架构

为了能够连接到Scope的runtime,Scope只需要遵守几个简单的准则:

  • 导入 Javascript Scope模块到你的代码中
  • 设置你的Scope的runtime上下文

这些步骤简单地说就是如下的代码:

var scopes = require('unity-js-scopes')
scopes.self.initialize({}, {});

一旦被导入,unity-js-scopes核心模块即是和Scope runtime交互的入口点,runtime可设置Scope,和Dash进行交互及显示用户在Scope交互所生产的结果等。

在上面的初始化代码中,"self"属性是用来实现交互,它引用当前正在运行的Scope的上下文。可以在上面显示的index.js文件中看到如下的代码:

Object.defineProperty(
    module.exports,
    "self",
    {
        get: function() {
            if (! self) {
                self = new Scope();
            }
            return self;
        },
    });

除了定义一些Scope在运行时的一下runtime元素以外,runtime上下文还允许检查当前Scope的设置及接受scope runtime环境变化时所生产的变化等。

 

Runtime 元素

现在,可以来重新回顾Scope代码并开始定义一些重要的运行时的函数的行为。

一旦Scope和runtime建立起连接并被用户所启动,scope runtime将发送来所有的由用户所产生的动作。最终这些动作将被发送到Scope在Initialize过程中所定义的API函数中。

这些API函数可以由Scope来有选择地定义。它们将在runtime时反应出那些最重要的被触发的步骤。下面列举那些最重要的runtime回调函数.

  • run: 当一个scope准备运行时,这个回调函数将被调用.
  • start: 当一个scope准备启动时,这个函数将被调用
  • stop: 当一个scope准备停止时,这个函数将被调用
  • search: 当用户请求一个搜索时,这个函数将被调用.runtime将将提供所有的关于搜索所需要的信息给这个函数的调用.开发者的任务就是通过和runtime的交互把所有可能的结果push给runttime.你也可以控制如何显示这些结果
  • preview: 显示一个在上面search中显示结果的preview.runtime将提供关于这个preview所需要的所有的信息

一个简单的模版为:

var scopes = require('unity-js-scopes')
scopes.self.initialize({}, {
    run: function() {
        console.log('Running...');
    },
    start: function(scope_id) {
        console.log('Starting scope id: ' + scope_id + ', ' + scopes.self.scope_config)
    },
    search: function(canned_query, metadata) {
        return null
    },
    preview: function(result, metadata) {
        return null
    },
}});

对于每一个scope runtime的回调函数来说,它相应于一个用户的交互。scope runtime希望scope发送回一个描述各个关键交互所需要的对象。

比如,对search回调函数来说,它希望scope发送回一个叫做SearchQuery的object。使用这个object来定义用户进行搜索时的行为。

SearchQuery object可以定义一个run回调函数。当搜索发生时,该函数将被调用。同时它也可以定义一个cancel的回调函数,当一个搜索被停止时,该函数将被调用。

Scope runtime同时也传入一个叫做SearchReply的object,这个object可以被用来push一些结果到scope runtime。

上面的这种交互模式是贯穿了整个scope及scope rumtime设计的核心交互模式。

 

推送搜索结果

上面讲到的一个最核心的搜索交互就是scope可以把所需要的结果推送到scope runtime。这些结果是通过SearchReply来完成推送的,这个函数希望一个叫做CategorisedResult类型的数据被创建,并被推送到scope runtime。这个result对象将让我们的scope来定义诸如title, icon,uri等信息。

 

CategorisedResult的一个额外的功能就是在创建它时,可以指定它结果显示的layout。这个layout是由Category及CategoryRender对象共同定义的。下面就是一个天气scope中所使用的一个例子。为了能够获取百度天气API的数据,必须重新定义tempalate中的变量:

var query_host = "api.map.baidu.com"
var weather_path = "/telematics/v3/weather?output=json&ak=DdzwVcsGMoYpeg5xQlAFrXQt&location=" 
var URI = "http://www.weather.com.cn/html/weather/101010100.shtml"; 

initialize中的search方法定义如下:

                search: function(canned_query, metadata) {
                    return new scopes.lib.SearchQuery(
                                canned_query,
                                metadata,
                                // run
                                function(search_reply) {
                                    var qs = canned_query.query_string();
                                    if (!qs) {
                                        qs = "北京"
                                    }

                                    console.log("query string: " + qs);

                                    var weather_cb = function(response) {
                                        var res = '';

                                        // Another chunk of data has been recieved, so append it to res
                                        response.on('data', function(chunk) {
                                            res += chunk;
                                        });

                                        // The whole response has been recieved
                                        response.on('end', function() {
                                            // console.log("res: " + res);

                                            r = JSON.parse(res);

                                            // Let's get the detailed info
                                            var request_date = r.date
                                            console.log("date: " + date);

                                            var city = r.results[0].currentCity;
                                            console.log("city: " + city);

                                            var pm25 = r.results[0].pm25
                                            console.log("pm25: " + pm25)

                                            var category_renderer = new scopes.lib.CategoryRenderer(JSON.stringify(WEATHER_TEMPLATE));
                                            var category = search_reply.register_category("Chineweather", city, "", category_renderer);

                                            try {
                                                r = JSON.parse(res);
                                                var length = r.results[0].weather_data.length
                                                console.log("length: " + length)

                                                for (var i = 0; i < length; i++) {
                                                    var categorised_result = new scopes.lib.CategorisedResult(category);

                                                    var date = r.results[0].weather_data[i].date
                                                    console.log("date: "+  date);

                                                    var dayPictureUrl = r.results[0].weather_data[i].dayPictureUrl;
                                                    console.log("dayPictureUrl: " + dayPictureUrl);

                                                    var nightPictureUrl = r.results[0].weather_data[i].nightPictureUrl;
                                                    console.log("nightPictureUrl: " + nightPictureUrl);

                                                    var weather = r.results[0].weather_data[i].weather;
                                                    console.log("weather: " + weather);

                                                    var wind = r.results[0].weather_data[i].wind;
                                                    console.log("wind: " + wind);

                                                    var temperature = r.results[0].weather_data[i].temperature;
                                                    console.log("temperature: " + temperature);

                                                    categorised_result.set("weather", weather);
                                                    categorised_result.set("wind", wind);
                                                    categorised_result.set("temperature", temperature);

                                                    categorised_result.set_uri(URI);
                                                    categorised_result.set_title("白天: " + date );
                                                    categorised_result.set_art(dayPictureUrl);
                                                    categorised_result.set("subtitle", weather);
                                                    search_reply.push(categorised_result);

                                                    categorised_result.set_title("夜晚: " + date );
                                                    categorised_result.set_art(nightPictureUrl);
                                                    search_reply.push(categorised_result);

                                                }

                                                // We are done, call finished() on our search_reply
//                                              search_reply.finished();
                                            }
                                            catch(e) {
                                                // Forecast not available
                                                console.log("Forecast for '" + qs + "' is unavailable: " + e)
                                            }
                                        });
                                    }

                                    console.log("request string: " + query_host + weather_path + qs);

                                    http.request({host: query_host, path: weather_path + encode_utf8(qs)}, weather_cb).end();
                                },

                                // cancelled
                                function() {
                                });
                },

 

Preview搜索结果

一旦搜索结果被推送到scope runtime并被显示,用户可以点击显示的结果并请求一个关于该结果的preview.Scope runtime将通过scope中所定义的preview回调来显示所需要的结果.

 

就像上面对search所描述的那样,scope runtime希望的scope返回一个PreViewQuery的对象来作为一个交互的桥梁。这个对象必须指定一个run及一个cancel的函数.这两个函数和上面介绍的search中的语义是一样的。这里不再累述。

 

对Preview来说,有两个最重要的元素:column layout及Preview Widgets。就像它们的名字所描述的那样,column layout元素是用来定义Preview页面中Preview Component的layout的。Preview Widget是用来在Preview页面中组成页面的。

 

一旦明白了上面所讲的,预览插件并且它被绑定的数据之间的关联是通过“ID”来完成。下面是百度天气里的preview的实现:

  preview: function(result, action_metadata) {
                    return new scopes.lib.PreviewQuery(
                                result,
                                action_metadata,
                                // run
                                function(preview_reply) {
                                    var layout1col = new scopes.lib.ColumnLayout(1);
                                    var layout2col = new scopes.lib.ColumnLayout(2);
                                    var layout3col = new scopes.lib.ColumnLayout(3);
                                    layout1col.add_column(["imageId", "headerId", "temperatureId", "windId"]);

                                    layout2col.add_column(["imageId"]);
                                    layout2col.add_column(["headerId", "temperatureId", "windId"]);

                                    layout3col.add_column(["imageId"]);
                                    layout3col.add_column(["headerId", "temperatureId", "windId"]);
                                    layout3col.add_column([]);

                                    preview_reply.register_layout([layout1col, layout2col, layout3col]);

                                    var header = new scopes.lib.PreviewWidget("headerId", "header");
                                    header.add_attribute_mapping("title", "title");
                                    header.add_attribute_mapping("subtitle", "subtitle");

                                    var image = new scopes.lib.PreviewWidget("imageId", "image");
                                    image.add_attribute_mapping("source", "art");

                                    var temperature = new scopes.lib.PreviewWidget("temperatureId", "text");
                                    temperature.add_attribute_mapping("text", "temperature");

                                    var wind = new scopes.lib.PreviewWidget("windId", "text");
                                    wind.add_attribute_mapping("text", "wind");

                                    preview_reply.push([image, header, temperature, wind ]);
                                    preview_reply.finished();
                                },
                                // cancelled
                                function() {
                                });
                }

运行Scope,可得到以下输出:

可以通过如下的方式来把Scope部署到手机上:

 

Read more
April Wang

2015中国移动全球合作伙伴大会于2015年12月14日在广州保利世贸博览馆正式开启,此次大会以“和移动助力互联网+”为主题,由中国移动通信集团有限公司主办,聚百家终端、互联网、渠道等合作伙伴于一堂共同展示一年来的进程和未来新一年的合作远景。科能(Canonical)公司也受邀参加了此次活动,在独立展位展出了目前Ubuntu操作系统在移动手机端和智能硬件方面的最新亮点及开发进程。 

Ubuntu的展台除了展示目前已上市欧洲的两款现有Ubuntu手机机型,还有核心的三大亮点部分组成,首先展出了即将推出的一个重大手机功能性更新 - 让Ubuntu手机轻松变身个人电脑的Convergence技术,此外亮相现场的还有目前与中国移动合作研发的一款手机展示,以及Ubuntu系统在智能物联网硬件芯片上应用的展示。 

从今年初开始Ubuntu陆续有三款机型上市欧洲,首款BQ E4.5机型还在2015年的MWC大会上有展出,此后魅族MX4和BQ E5也陆续上架欧洲。 除了欧洲市场,今年Ubuntu的BQ版手机还在印度, 俄罗斯两国分别进行了销售,让当地的小伙伴们也尝到了鲜。 

在此次中国移动全球合作伙伴大会上,有一项会让现有手机功能极大提升的特征,又被称为Convergence的技术,在现场亮相展出。 它通过蓝牙连接无线鼠标,键盘,HDMI接线连接显示屏,可以将手机内容呈现到屏幕上;这样用户可以将自己的手机作为一台电脑来使用,完成一些很难或根本无法操作的任务,比如在数据表中进行数据统计等等。这是一个移动设备发展的趋势,科能(Canonical)公司早在2013年就提出了讲个人手机转型成个人电脑的设想,并在国外众筹平台提交次项目,虽然项目没还有筹备到目标金额,却依然很明显的证明了整个移动设备和传统个人电脑边界模糊的趋势,以及现存的市场需求。而在这次的大会中,现场的小伙伴们可以亲身体验一下了。目前版本依然处于一个Alpha版本状态, 但是喜欢自己动手“折腾”的小朋友现在就可以通过使用Nexus 4手机或Nexus 7的平板来使用Ubuntu移动产品这一先锋性的技术。

而展台另一面的亮点便是和中国移动合作研发中的一款硬件设备,这款设备上除了Ubuntu特有的常用型Scope,还展现了集合中国移动咪咕平台内容的几款Scope,包括和阅读, 和音乐,以及和彩云服务。除了内容上的亮点,重头戏其实是这款设备上呈现的RCS技术。 RCS英文全名又被称为Rich Communication Services,简单而言这套技术就是可以让手机用户在传统手机短信的基础上可以有更加丰富的信息数据的发送接收, 例如语音对话,视频对话,发送图片,甚至类似阅后即焚的功能。RCS技术其实在国外已经有很多家运营商实现了此功能,中国移动是国内首家开始正式研发RCS的中国运营商,而在此次大会上这款技术首次在一款Ubuntu手机上展示了出来,不能不说这是很重要的一个亮点。 

Ubuntu作为一款开源操作系统除了运行在云,PC,和手机移动设备之外, 在智能物联网的世界其实已经存在有一段时间了。很多早期开发机器人,无人机的先锋都是在使用Ubuntu操作系统。Ubuntu还是开源机器人基金(Open source robotics foundation)的软件平台基础。目前戴尔的Edge Gateway 5000 Series,以及DJI大疆的机载电脑“妙算 Manifold”也都是运行着Ubuntu的系统。这次移动大会现场,大疆的妙算也亮相现场。 

中国移动全球合作伙伴大会历时三天,展示了整个移动硬件,软件,系统, 芯片等等一整套生态线。 科能也有幸通过这次机会给所有参会伙伴们展示了Ubuntu在2015年一年来的进展和未来手机移动开发的方向和在智能物联网行业的长久计划。 
 

 

Read more
April Wang

-大疆创新“妙算”Manifold是一台嵌入式高性能机载电脑

-无缝兼容大疆经纬M100飞行平台,优化无人机的实时数据分析能力并大幅提高计算效率,释放飞行平台的全部潜能。

全球飞行影像系统开拓者DJI大疆创新发布专为飞行平台设计的嵌入式高性能机载电脑“妙算” Manifold。配合大疆Onboard SDK,妙算提供了便捷易用的全新功能,让开发者释放创造力,打造更加强大的无人机行业应用。

大疆创新战略合作总监Michael Perry表示:“妙算将开启智能飞行平台的全新时代,作为联接地面设备和飞行终端的智能协作中枢,妙算可为复杂的行业应用提供解决方案。我们非常期待开发者通过妙算开发出令人眼前一亮的应用”。

妙算能够广泛扩展第三方传感器,开发者在经纬M 100上可通过妙算连接红外摄像机、气象研究设备以及地理信息采集设备,并可在飞行中实时收集和分析数据。

妙算搭载Canonical公司的Ubuntu操作系统,并支持CUDA, OpenCV以及ROS。配备英伟达Tegra嵌入式处理器,其包含四核ARM Cortex A-15处理器和Kepler架构的图形处理单元,这使得妙算不仅能实现强大的图像处理能力,且能高效地处理并行任务。此外,妙算还可广泛应用于计算机视觉、深度学习等人工智能领域,并提供USB、Ethernet、HDMI等丰富的接口,用于连接传感器、显示屏等多种扩展设备。

Canonical公司智能设备及全球战略合作副总裁Mark Murphy说:“我们非常高兴能与DJI大疆创新合作,Canonical和大疆创新分享同样的愿景,致力于推动科技进步,为开发者铺平前进的道路”。

搭载Ubuntu 14.04 LTS版本的妙算将于今日在大疆创新官方商城全球同步预售,中国大陆地区该产品售价为人民币2999元。欲获取更多详情,请访问https://developer.dji.com/cn/manifold/

Read more
April Wang

TC 北京黑客马拉松

Ubuntu在中国已经举办了两次黑客松了,而这次受TC 中国邀请有机会作为赞助方参加了TC北京黑客马拉松活动。规模当然更高、更大、更尚,这次活动让我们遇到了更多Ubuntu小伙伴们,也让更多志同道合的程序猿们进一步了解到Ubuntu;最开心的是在这次活动中还有遇到之前活动中认识的老朋友呢!

这次黑客松在位于北京五棵松的Hi-Park举行,这里需要特别强调并称赞一下TC中国TechNode队伍的能力和体力,让这个室内篮球场地一夜间变身Hi-Tech Power House. 正巧碰到是万圣节,活动现场诡异事件连连发生。开玩笑了,现场布置是一番万圣趴的气氛,相比寻常黑客松,也另增了一份活泼。

黑客松命题在这次活动中采用了混搭方式, 有三项挑战任务,设有专项命题和作品要求,有机会获得特别的几项大奖;同时开发者们也可以随意出作品做展示,依然有机会获得主办方为大家准备的丰厚礼品。作为命题挑战任务之一的Ubuntu任务,其实算是一个题目比较开放的任务,大家可以通过为Ubuntu手机开发应用或Scope来参与挑战, 也可以通过使用snappy Ubuntu Core来搭建任何智能物联网项目来参与挑战。

TC北京黑客松命题

这次黑马是正式从第一天的下午1点进入组队开工的,在第二天的上午9点半就开始提交作品, 实际真正写打码的时间也就是20多个小时的样子。作品展示是在次日上午10点钟正式开始的,一共有29组成功完成了作品展示,这里我们挑俩组针对Ubuntu挑战任务而来的作品介绍一下,希望在之后的日子里能看到所有参加挑战的作品成功上线。

 

Musicor:

双人小组, 专为难以入睡的你们(夜猫子们)定制。这是一款基于Ubuntu手机的应用,通过播放音乐来协助入眠, 同时这款应用可以和手环对接, 通过手环对人体睡眠状态的检测给到应用提示来调整音乐音量,从而达到你已入睡音乐也停,解决睡意正浓时刻起身关音的痛苦。这款应用巧妙结合使用不同智能设备,完成解决了一个大家都曾遇到过的问题。我已经期待能早日在Ubuntu商店中看到并下载这款应用了。

 

SnapChirp:

看这名字大家也大约可以猜到会和我们的snappy Ubuntu Core有些关系了,没错,这款应用通过使用snappy Ubuntu Core利用音频来测算智能设备之间距离的跨平台(ubuntu,安卓和IOS)应用,简而言之就是智能设备相互距离的量尺。听起来仿佛很简单,在这个智能设备日益寻常的今天,它被进一步应用的场景其实展示了更多的可能性。你有想到吗?

snapchirp

能在昼夜不停的黑马中获奖当然是非常让人兴奋的一件事情,而它更让人兴奋的应该是看到的下一个新起点吧。

TC Beijing Hackathon

 

 

 


 

 

 

 

 

Read more
April Wang

手机更新: OTA-7

Ubuntu手机最新更新如下:

Scopes

- 社交应用功能提高, 现在支持点“赞”和转发功能

浏览器

- 新增搜索历史记录
- 提高的场景菜单有下载链接选项
- Http基础验证支持

图片库

- 支持SVG格式
- Soundcloud网页版应用可以在后台播放

修复的“八哥”

- 修复 test.mmrow exploit
- https://launchpad.net/canonical-devices-system-image/+milestone/ww40-2015
- 修复UI冻结 (FD leaks)
- 默认不会在stable channel发布奔溃报告
- 修复 QML cache 和重新存储一致应用启动次数
- 在浏览器中默认使用更少的记忆空间,并且避免网页应用呈现白屏
- 用感应器侦测距离,自动关闭电话背光

Read more
April Wang

Ubuntu走向融合之路

原作者:Richard Collins

随着首款自带完整Ubuntu桌面界面的智能手机即将上市,Ubuntu设备融合也正在成为现实。

当一部智能手机能够为用户提供和他们常用电脑同样的用户体验时,这部智能手机才是在真正意义上同时起到了移动手机兼个人电脑的重任。 这也是我们作为真正智能手机融合的一个起点 - (通过一款智能手机)来为成千上百对Ubuntu桌面电脑非常熟悉的用户提供同样的Ubuntu个人电脑体验。 简而言之,就是用户对一台个人电脑的使用体验期待必须也能够在他们的智能手机上获得。 这包括了:

- 轻松的多任务多窗口管理
- 全套支持移动和生产力的桌面应用和瘦客户端支持
- 带有桌面提示的集成服务
- 具有应用管理及便捷打开常用应用的能力
- 简单翻阅文档,创建和管理文档文件夹
- 响应性应用专为触屏和点击输入开发,可以自行根据设备环境调整UI呈现方式
- 综合性系统操控以及在需要时对底层操作系统的访问
- 包含一系列兼容第三方服务的统一应用商店
- 在桌面界面上使用手机电话和短信应用来进行交流

操作系统融合之路最初是从Unity 8开始的。 Unity 8 是Ubuntu自有的用户界面和呈现框架,它将预计被运行于所有基于同样底层代码库的Ubuntu设备上,支持一个常用的应用和服务开发基础架构。Unity 8的目标就是能够作为首要呈现框架运行于任何Ubuntu智能产品上。

这就意味着应用程序拥有了其他操作系统无法提供的一个东西:唯一的视觉框架以及一套让应用程序可以在任何类型的Ubuntu智能设备上运行的工具。为移动设备开发的应用程序可以轻松的扩展适用于桌面呈现,同时还支持点击类输入。我们的SDK会为移动应用开发者提供创建这些应用桌面版场景的工具。 类似的,桌面应用的开发者可以使用我们的SDK来延伸并加强他们程序应用于移动端的功能。 融合为开发者们带来了一套全新的场景,而我们的SDK将为开发者们让他们应用程序轻松应用于任何界面提供了基础类工具。

你在(ubuntu)手机上和(ubuntu)桌面上看到和使用的同一款应用程序, 他们将会是完全一样的一套代码运行着这款应用。Ubuntu不需要区别这款应用是专门为移动端还是为桌面呈现而编写的,而是这款应用会自动根据运行的设备呈现环境来自动调用相应的交互界面。第三方开发者们只需要为Ubuntu编写一次代码完成应用开发, 这款应用便可以运行于不同的Ubuntu界面。

我谈论智能手机进化成为一个融合型形态,提供个人电脑体验,是一个业内真实相关的需求为时很久了。 但是一个真正融合化的智能手机或平板,结合移动和桌面生产力而设计,是在使用搭建于唯一而且完全受控代码库基础上的操作系统才可以为被称为真正完成。

Read more