AIoT开发者的灵魂拷问:过程低效且成本高的问题你解决了么?

企业将业务搬上云端已是大势所趋,云服务经过多年的发展,也已进入稳定增长的2.0时代。

2019年1月,华为基于ARM架构打造了自己的鲲鹏处理器。紧接着,华为云又基于鲲鹏处理器推出了鲲鹏云服务和解决方案。“鲲鹏”一词逐渐在互联网圈内成为热议的焦点,对于技术人而言,迫切地想揭开鲲鹏背后的技术细节,想知道鲲鹏到底有多牛。

机会来了!

10月18日,“DevRun · 选择不凡,华为云开发者沙龙 ”北京站将邀请华为云鲲鹏凌云计划架构师白雁,全面解析华为云鲲鹏云服务中的关键技术,并从操作系统、中间件、数据库以及代码层级对开源和自有软件的鲲鹏移植进行指导,通过实际案例分享移植经验,给开发者讲解为什么移植,以及如何移植。

除此之外,华为云的4位技术专家也针对各自擅长的领域,与开发者交流技术难点与解决方案,这些话题如下:

1、企业上云之前,数据库的痛点怎么解决?

数据库逐渐演变为云时代下核心竞争力的关键。如今,传统存储计算一体、一主多辅的数据库虽然仍有不小的价值,但局限性也愈加明显:资源利用率低、扩展性弱、有许多冗余写入、数据回档慢等难题,也造成了企业的上云需求越发难以满足。

在数字化、智能化时代下,企业面对的是海量的用户和交易,拥有超过几百个节点的业务系统并不稀奇,未来这种规模还将不断扩大,这为系统的运营和管理提出了不小的挑战。随着摩尔定律遇到瓶颈,不同领域的计算平台呈现出多样化的趋势。虽然这在一定程度上满足了不同场合的应用需要,但如何通过软件实现计算能力的整体协调和优化,这对于应用开发人员和 DBA 而言,是新的挑战。此外,海量的半结构、结构化数据,也迫切需要一个行之有效的解决方案来实现统一的计算和管理,并进行优化。

华为从2001年就已经开始布局数据库的研发,针对当下数据库技术的发展痛点有着深刻的理解,华为云也推出了新的解决方案。本次沙龙,华为云数据库高级技术专家宋立勇将为大家分享华为在数据库领域的研发经验,带来应对诸多数据库挑战的实战经验,并分享针对不同的业务场景,数据库如何布局才能经济高效地满足高算力、低时延、敏捷部署的业务诉求。

2、AI开发者最棘手的难题,你是不是也遇到过?

对于AI开发者而言,训练一个模型通常需要经历几个“难关”:数据标注、调参、大规模分布式训练和训练部署,然后才有可能开发出一个普通的AI应用。每一步几乎都是AI开发者的痛:数据标注需要耗费大量的人工时间,难以在最短的时间内找到最优的参数配置,需要漫长的时间进行大规模训练,最后还要面对复杂的模型部署。

一直以来,AI开发者对普惠算力的需求从未间断过,但现实情况是:稀缺、昂贵的算力将AI束之高阁,大量的资源被重复耗费,开发者宝贵的时间和精力也未能创造出真正的价值,整个AI开发过程低效且成本高昂,不利于企业及行业的智能化升级。基于这些痛点,华为推出了ModelArts 一站式AI开发平台。

相信 AI 开发者对于这一平台一定不陌生,但如何用好 ModelArts 恰恰是开发者最该了解的内容。本次沙龙,华为云EI布道师、华为开源中心算法专家王龙步将为AI开发者解析在云上构建及部署AI模型的具体过程。为什么有的 AI 开发者可以更快速、更高效地开发AI模型?差别在哪?专家给你支招!

3、都在聊 IoT,落地的事谁来负责?

在物联网业务快速发展的同时,企业和创业者也面临着网络连接复杂的问题,而且终端和传感器种类众多,这就导致集成困难,新业务上市周期长。企业都在聊IoT,但归根结底还在于谁能解决IoT开发中的难题。

对于开发者而言,如何切实可行地解决开发周期长、开发成本高、稳定性不佳、维护成本高等一系列问题,高效地完成行业应用构建,将物联网能力快速投入到生产流程或业务运营中?华为IoT生态服务产品总监谢冲,基于自己深耕IoT领域多年的经验,针对开发者在IoT 上经常“纸上谈兵”、缺乏落地实践的问题,全方位地“对症下药”。 

4、想用微服务架构,如何保证数据一致性?    

我们知道,微服务架构中的各个模块可以独立地开发,迭代;不同团队之间的技术栈分离可以根据团队的特点来使用更合适的技术解决问题;将系统切分为细粒度的服务,好处不言而喻,但问题是,如何保证数据的一致性?越来越多的企业开始向微服务架构转型,不幸的是,很多企业发现微服务实施起来并不像看上去那么轻松。各家公司提出的解决方案并不少,不过哪一种才最适合?

对此,华为云PaaS团队架构师王启军将在本次沙龙为大家分享华为在微服务架构中的实践,帮助企业和开发者清楚地了解为什么要做微服务,以及在过程中有哪些必须要避的坑。

干货满满的讲解与实操演练相结合,10月18日“DevRun · 选择不凡,华为云开发者沙龙 2019”北京站,将与开发者一道,深挖技术背后的细节,重新审视如何落地 AI 的问题。

5、北京站讲师和议题安排

温馨提示:因为现场设置实操环节,建议开发者携带笔记本电脑参会,与讲师一起在现场快速构建一套AI模型。

报名地址: https://e-campaign.huawei.com/cloud/CloudUniversalForm/register/199/phoneRegister.html?access_token=2d22ca77-2dbd-4cd3-afc9-15e92366779a (请在微信中打开)

一条命令将树莓派变成Wi-Fi接入点

很多开发者都配过无线AP,这几乎是IoT网络配置的一个基本技能。像TP-Link和D-Link那种小盒子,用不了几个步骤就能快速开启无线网络。

这次我们要介绍的是把树莓派编程无线AP的方法。

和之前动则十几个步骤的教程不同。我们借助一个叫 RaspAP 的工具,只要一条命令就能完成部署。

wget -q https://git.io/voEUQ -O /tmp/raspap && bash /tmp/raspap

等到命令执行完成后,重启树莓派,无线AP就做好了。

默认的连接信息如下:

IP 地址: 10.3.141.1
用户名: admin
密码: secret
DHCP 范围: 10.3.141.50 – 10.3.141.255
SSID: raspi-webgui
WiFi 密码: ChangeMe

其实树莓派的Raspbian已经自带了一些无线AP所需的组件, 而RaspAP的好处是它不但自动化相关操作,而且还有一套响应式的 WebUI。非常省事。

对手机浏览器的支持也很好。

官方团队是建议大家在Raspbian Buster版本的树莓派上使用这个工具,在执行安装命令前最好先更新系统。

sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot

然后用sudo raspi-config 命令,在 菜单Localisation Options中设置 WiFi 地区。

如果你还再用没有Wi-Fi模块的老树莓派,可以装一个USB无线网卡。

目前 RaspAP 已通过 GNU Gettext 支持简体中文在内的多国语言,但你得确定系统内已经装中文环境了,如果没装,需要用 sudo dpkg-reconfigure locales  之类的命令自行配置一下语言包。

RaspAP 建议的最佳搭配就是一条有线接树莓派eth0的以太网口,然后通过树莓派自带的Wi-Fi提供无线AP服务。不用重启,也不用额外的操作。

还有一句话官方没明说:为使效果最佳,还是用树莓派3B或3B以后的硬件版本吧。

作者:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。热爱Linux、Python、Micro:bit和树莓派。

解析Python开发的一款迷你跑步游戏

之前“IoT前哨站”上发了一些用Python写文本游戏的文章。不管对于Python开发者来说还是对于游戏爱好者来说,都非常适合打基础。

这次我们迈入图形时代,来看看国外开发者“Rik Cross”制作的一款迷你跑步游戏。

他用了不到一百行代码,就写出了值得一玩的2D动作游戏,怎么做到的?

在此之前,先向大家介绍一个游戏框架:pgzero。

该框架全名Pygame Zero,是一个基于Pygame的游戏编程框架。它可以更容易地编辑游戏,无需模板、不用编写事件循环,也无需学习复杂的Pygame API,而且支持树莓派。

安装
pip install pgzero

需求:
通过键盘的左右键操作,让运动员向前奔跑,每过25米有路标提醒,最后看谁在百米跑步中耗时最少。

代码下载地址:
https://github.com/IoToutpost/Python_game/tree/master/Sprint

素材(地址同上):
Images文件夹中有21张图,包括运动员的动作分解、跑道等。

其中的关键代码,是一个叫做Sprinter()的类。

class Sprinter(Actor):
     def init(self, **kwargs):
         super().init(image='idle', pos=(200,220), **kwargs)
         self.startTime = time()
         self.finishTime = time()
         self.runFrames = ['run' + str(i) for i in range(1,16)]
         self.timeOnCurrentFrame = 0
         self.speed = 0
         self.lastPressed = None
         self.keyPressed = False
         self.distance = 0
# 将运动员推进到下一帧
def nextFrame(self):
    # 如果当前空闲,则启动正在运行的动画。 
    if self.image == 'idle':
        self.image = self.runFrames[0]
    else:
        # 在列表中找到下一个图像,然后返回到第一个图像 
        # 当列表已经到末尾的时候
        nextImageIndex = (self.runFrames.index(self.image) + 1) % len(self.runFrames)
        self.image = self.runFrames[nextImageIndex]

# 检查左右方向键是否正确
# 被交替按下
def isNextKeyPressed(self):
    if keyboard.left and self.lastPressed is not 'left' and not keyboard.right:
        self.lastPressed = 'left'
        return True
    if keyboard.right and self.lastPressed is not 'right' and not keyboard.left:
        self.lastPressed = 'right'
        return True
    return False

def update(self):
    # 更新运动员的速度
    # 交替按键加速
    if self.isNextKeyPressed() and self.distance < 100:
        self.speed = min(self.speed + ACCELERATION, 0.15)
    # 如果没有按键,减速
    else:
        self.speed = max(0, self.speed-DECELERATION)
    # 根据运动员的速度更新距离 
    self.distance += self.speed
    # 根据运动员的速度对其进行动画 
    self.timeOnCurrentFrame += 1
    if self.speed > 0 and self.timeOnCurrentFrame > 10 - (self.speed * 75):
        self.timeOnCurrentFrame = 0
        self.nextFrame()
    # 如果不移动,则设置为空闲
    if self.speed <= 0:
        self.image = 'idle'

里面有一些变量用来跟踪运动员的速度和距离,以及全局的常量(ACCELERATION和DECELERATION的值)。这样可以确定玩家的速度变化。这些数字很小,因为它们代表了玩家加速和减速时,每一帧对应的米数。

玩家通过交替按左右键来增加运动员的速度。这个输入由Sprinter类中的isNextKeyPressed()方法处理,如果按下正确的键,该方法将返回True。

lastPressed变量用于确保左右键被交替按压。如果未按下任何键,玩家会减速,并且该减速程度应小于加速度,以免让玩家突然停下。

在游戏设计中,作者用了gameart2d.com上一个名为“The Boy”的免费形象来作为运动员,里面有15张跑步动作分解图构成的循环。他将从空闲状态开始,只要速度大于0,就切换到跑步动作循环。

这是通过index()在runFrames列表中查找当前运动员图像的名称来实现的,程序会将当前图像设置为列表中的下一个图像(并且在到达列表的末尾时返回第一个图像)。

我们还需要让运动员在跑步动作循环中以成比例的速度向前移动,通过跟踪当前图像显示的帧数来实现(在那个名为timeOnCurrentFrame的变量中)。

为了给玩家一种移动的错觉,作者添加了一些经过玩家的物品:一条终点线和三个显示跑动距离的标记。

这些物品出现的时机是根据运动员在屏幕上的x位置和运动距离计算出来的。

​然而,这意味着每个物品距离玩家最多只有100像素的距离,似乎移动的有点缓慢。我们可以通过SCALE因子来解决,它对应的是运动员跑过的米数和屏幕上像素之间的关系。比如设成1:75。

这些物品最初被绘制在屏幕看不见的右侧,然后向左移动并更快地经过运动员。

最后,startTime和finishTime变量用于计算比赛时间。这两个值最初都设置为比赛开始的时间,只要跑动的距离小于100,finishTime就会更新。使用time模块,比赛时间可以简单地计算为finishTime – startTime。

附注:该游戏在树莓派和Windows PC上都能跑,如果要试玩,记得在Python文件前面加pgzrun命令。

Have fun.

素材:Wireframe #23

编译:王文文,前51CTO安全频道主编,RedHat认证工程师,华为HCIP-IoT认证工程师。