首页 文章 精选 留言 我的

精选列表

搜索[鸿蒙课程],共8151篇文章
优秀的个人博客,低调大师

鸿蒙开发快速入门之:Hi3861 开发板(2)环境搭建

这是Hi3861 开发板进行OpenHarmony 开发快速入门的第二篇,主要学习如何搭建环境。 硬件要求 Linux服务器 Windows工作台(主机电脑) Hi3861 WLAN模组 USB Type-C线(Windows工作台通过USB与Hi3861 WLAN模组连接) 各硬件连接关系如下图所示。 图 1硬件连线图 软件系统要求 表 1Hi3861 WLAN模組开发平台要求 硬件 软件 描述 备注 Linux编译服务器 操作系统 Ubuntu16.04及以上64位系统版本,Shell使用bash 开发人员可以在Windows工作台中进行程序开发,或者远程登录到Linux服务器进行程序开发。 Windows工作台 操作系统 Windows XP/Windows7/Windows10 Linux构建工具要求 Linux服务器通用环境配置需要的工具及其获取途径如下表所示。 表 2Linux服务器开发工具及获取途径 开发工具 用途 获取途径 交叉编译器gcc_riscv32 交叉编译工具 http://tools.harmonyos.com/mirrors/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz Python3.7+ 编译构建工具 https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz SCons3.0.4+ 编译构建工具 通过互联网获取 bash 命令处理器 通过互联网获取 build-essential 编译依赖的基础软件包 通过互联网获取 gn 产生ninja编译脚本 http://tools.harmonyos.com/mirrors/gn/1523/linux/gn.1523.tar ninja 执行ninja编译脚本 http://tools.harmonyos.com/mirrors/ninja/1.9.0/linux/ninja.1.9.0.tar Windows开发工具要求 表 3Windows工作台开发工具及获取途径 开发工具 用途 获取途径 Visual Studio Code 代码编辑工具。 https://code.visualstudio.com/ HUAWEI DevEco Device Tool IDE开发工具,支持WLAN模组的代码编写、远程编译、版本烧录、串口调试等功能。 说明: HUAWEI DevEco Device Tool是OpenHarmony面向智能设备开发者提供的一站式集成开发环境,支持OpenHarmony的组件按需定制,支持C/C++语言,以插件的形式部署在Visual Studio Code上。 https://device.harmonyos.com/cn/ide IPOP、PuTTY或其他超级终端(选其一) 远程连接Linux编译服务器,连接模组串口工具。 通过互联网获取(如:https://www.putty.org/) CH341SER.EXE USB转串口驱动。 http://www.wch.cn/search?q=ch340g&t=downloads 安装编译基础环境 连接Linux服务器 使用Windows远程登录Linux,以PUTTY工具为例: 打开PuTTY工具,输入Linux服务器IP地址,后点击“open”,打开连接。 图 2PuTTY界面示例图 弹框告警选择“是(Y)”。 弹出界面中输入账号并按回车键,继续输入密码并回车键。 图 3登录界面图 登录成功。 图 4登录成功界面 将Linux shell改为bash 查看shell是否为bash,在终端运行如下命令 ls -l /bin/sh 如果为显示为/bin/sh -> bash则为正常,否则请按以下方式修改: 方法一:在终端运行如下命令,然后选择 no。 sudo dpkg-reconfigure dash 方法二:先删除sh,再创建软链接。 rm -rf /bin/sh sudo ln -s /bin/bash /bin/sh 安装Python环境 打开Linux编译服务器终端。 输入命令“python3 --version”,查看Python版本号。需使用python3.7以上版本,否则请按以下步骤执行,以python3.8为例: 如果Ubuntu 版本为18,运行"sudo apt-get install python3.8" 如果Ubuntu 版本为16,请以下载包的方式安装python: python安装环境依赖(gcc, g++, make, zlib, libffi)请运行: "sudo apt-get install gcc && sudo apt-get install g++ && sudo apt-get install make && sudo apt-get install zlib* && sudo apt-get install libffi-dev " 获取python3.8.5安装包,将其放至linux服务器中,运行 : "tar -xvzf Python-3.8.5.tgz && cd Python-3.8.5 && sudo ./configure && make && sudo make install" 确定Python-3.8.5安装好后,运行"which python3.8",将回显路径链接到"/usr/bin/python",示例: "cd /usr/bin && rm python && ln -s /usr/local/bin/python3.8 python && python --version" 安装Python包管理工具,运行“sudo apt-get install python3-setuptools python3-pip -y”命令。(需root/sudo权限安装),升级pip3运行"sudo pip3 install --upgrade pip"。 或按官网方式安装Python包管理工具:下载"curlhttps://bootstrap.pypa.io/get-pip.py-o get-pip.py"后,再执行"python get-pip.py" 安装python模块setuptools,运行"pip3 install setuptools" 运行“sudo pip3 install kconfiglib”命令,安装GUI menuconfig工具,建议安装Kconfiglib 13.2.0+版本。(需root/sudo权限安装)。 或者按以下方法安装Kconfiglib 13.2.0+。 下载.whl文件(例如:kconfiglib-13.2.0-py2.py3-none-any.whl)。 下载路径:“https://pypi.org/project/kconfiglib#files” 运行“sudo pip3 install kconfiglib-xxx.whl”命令(例如:sudo pip3 install kconfiglib-13.2.0-py2.py3-none-any.whl),安装.whl文件(需root/sudo权限安装)。 可能会遇到错误:"subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1.",解决方法:"find / -name lsb_release",找到lsb_release位置并删除,如:"rm -rf /usr/bin/lsb_release" 安装pycryptodome。运行“sudo pip3 install pycryptodome”命令,或者按照以下方式安装: 说明: 安装升级文件签名依赖的Python组件包,包括:pycryptodome、six、ecdsa。 安装ecdsa依赖six,请按文档要求,先安装six,再安装ecdsa。 下载.whl文件(例如:pycryptodome-3.7.3-cp37-cp37m-manylinux1_x86_64.whl)。 下载路径:“https://pypi.org/project/pycryptodome/#files”。 运行“sudo pip3 install pycryptodome-xxx.whl”命令(例如:sudo pip3 install pycryptodome-3.7.3-cp37-cp37m-manylinux1_x86_64.whl),安装.whl文件(需root/sudo权限安装)。 安装完成后界面会提示“Successfully installed pycryptodome-3.7.3”。 安装six。运行"sudo pip3 install six --upgrade --ignore-installed six"或者按照以下方式安装: 下载.whl文件(例如:six-1.12.0-py2.py3-none-any.whl)。 下载路径:“https://pypi.org/project/six/#files” 运行“sudo pip3 install six-xxx.whl”命令(例如:sudo pip3 install six-1.12.0-py2.py3-none-any.whl),安装.whl文件(需root/sudo权限安装)。 安装完成后界面会提示“Successfully installed six-1.12.0”。 安装ecdsa。运行"sudo pip3 install ecdsa"或者按照以下方式安装: 下载.whl文件(例如:ecdsa-0.14.1-py2.py3-none-any.whl)。 下载路径:“https://pypi.org/project/ecdsa/#files” 运行“sudo pip3 install ecdsa-xxx.whl”命令(例如:sudo pip3 install ecdsa-0.14.1-py2.py3-none-any.whl),安装.whl文件(需root/sudo权限安装)。 安装完成后界面会提示“Successfully installed ecdsa-0.14.1”。 安装Scons 打开Linux编译服务器终端。 安装SCons安装包(需root/sudo权限安装)。 运行命令:“sudo apt-get install scons -y”。如果软件源中无法找到安装包,请按以下步骤处理: 下载源码包(下载路径:“https://scons.org/pages/download.html”,推荐SCons版本是3.0.4+)。 解压源码包到任意目录。 安装源码包:进入解压目录,运行命令“sudo python3 setup.py install”(需root/sudo权限安装),等待安装完毕。 输入命令“scons -v”,查看是否安装成功。如果安装成功,查询结果下图所示。 图 5SCons安装成功界面 安装编译工具环境 须知: 如果后续通过“HPM组件方式”或“HPM包管理器命令行工具方式”获取源码,不需要安装gn、ninja、gcc_riscv32编译工具。 (推荐)如果后续通过“镜像站点方式”或“代码仓库方式”获取源码,需要安装gn、ninja、gcc_riscv32编译工具。 安装gn、ninja、gcc_riscv32编译工具时,请确保编译工具的环境变量路径唯一。 安装gn 打开Linux编译服务器终端。 下载gn工具。 解压gn安装包至~/gn路径下:"tar -xvf gn.1523.tar -C ~/"。 设置环境变量:"vim ~/.bashrc", 新增:"export PATH=~/gn:$PATH"。 生效环境变量:"source ~/.bashrc"。 安装ninja 打开Linux编译服务器终端 下载ninja工具。 解压ninja安装包至~/ninja路径下:"tar -xvf ninja.1.9.0.tar -C ~/"。 设置环境变量:"vim ~/.bashrc", 新增:"export PATH=~/ninja:$PATH"。 生效环境变量:"source ~/.bashrc"。 安装gcc_riscv32(WLAN模组类编译工具链) 须知:Hi3861平台仅支持使用libgcc运行时库的静态链接,不建议开发者使用libgcc运行时库的动态链接,会导致商业分发时被GPL V3污染。 打开Linux编译服务器终端。 下载gcc_riscv32工具。 解压gcc_riscv32安装包至/opt/gcc_riscv32路径下:"tar -xvf gcc_riscv32-linux-7.3.0.tar.gz -C ~/"。 设置环境变量:"vim ~/.bashrc",新增:"export PATH=~/gcc_riscv32/bin:$PATH"。 生效环境变量:"source ~/.bashrc"。 Shell命令行中输入“riscv32-unknown-elf-gcc -v”,如果能正确显示编译器版本号,表明编译器安装成功。

优秀的个人博客,低调大师

ChunJun支持异构数据源DDL转换与自动执行 丨DTMO 02期回顾(内含课程回放+课件)

导读: 4月26日晚,ChunJun项目核心成员、袋鼠云数栈大数据引擎开发专家渡劫为大家带来分享《ChunJun支持异构数据源DDL转换与自动执行》,我们将直播精华部分做了整理,带大家再次回顾内容,加深技术细节的了解。 你能看到 ▫ 数据还原介绍 ▫ DDL自动转换架构设计 ▫ Calcite解析DDL实战 直播课件获取: 关注公众号“数栈研习社”,后台私信“ChunJun01”获得直播课件 直播视频回看: 点击“阅读原文”,观看精彩视频 https://www.bilibili.com/video/BV1eR4y1P7AH?spm_id_from=333.999.0. 演讲 / 渡劫 整理 / 花夏 数据还原介绍 ChunJun实时同步支持mysql oracle postgresql sqlserver等数据源实时同步,但是同步之后的数据是以日志形式输出,数据还原在此基础上做到源数据的变动在目标表也发生对应变动,包含DML以及DDL的操作都会在目标表中执行对应的操作,保证源表和目标表schema一致 数据一致。 目前ChunJun数据还原已经支持mysql到rdb类型数据源的数据还原,仅限于支持DML的还原,DDL的自动执行下一版本支持。 实时还原增加了两个主要模块: 源表和目标表的映射(database table column信息的映射) 与外部交互,完成DDL状态更新,DML数据重新下发 为了完成逻辑解耦,我们增加了2个flatMap 算子完成上述操作: NameMappingFlatMap 根据映射关系对数据信息进行对应替换 RestorationFlatMap 对数据进行处理,对数据进行阻塞下发以及DDL状态监听 flatMap 算子介绍 接下来为大家介绍两个算子 01 NameMappingFlatMap 实时还原默认source端schema table column 是和sink端一致的,但是在大多数情况下source和sink的映射并不是完全一致的,因此需要NameMappingFlatMap算子对source的schema table column进行替换。NameMapping支持 schema table column的映射,其映射关系如下图所示: 图中映射关系代表源表schema为ChunJun_source下的source1这个表对应对应于目标端ChunJun_sink下的sink1,其中字段映射为 源表的C1字段对应目标id字段,C2字段对应目标name字段 在创建flink同步任务的时候,会判断脚本里是否配置了nameMapping的配置,如果没有配置则不会存在NameMappingFlatMap算子。 02 RestorationFlatMap 在数据还原中一定会涉及到DDL,但是目前sink端只支持DML的执行,因此在源表产生DDL之后的DML数据不能直接发给sink端执行,需要等到sink端对应的DDL执行完之后,DML才能重新下发。 因此RestorationFlatMap设计主要是为了解决 数据的下发 何时下发问题,何时下发就是下游sink的DDL执行完,但是这个sink端ddl的执行不是ChunJun完成的,ChunJun是无法得知完成时间的。因此RestorationFlatMap会和外部交互 获取这个DDL执行状态 从而判断DML数据何时下发。 结构设计 RestorationFlatMap内部会对每个表维护一个集合,DML&DDL数据都会存入此集合。集合会在非阻塞和阻塞状态间进行切换,同时内部会有两个组件分别为workerManager 以及 Monitor组件: WorkerManager:监听非阻塞集合数据,如果是DML下发,如果是DDL则将队列置为阻塞状态 Monitor:将ddl存储到外部数据源 以及监听阻塞队列的ddl执行情况,进行阻塞到非阻塞的改变 store 监听阻塞状态队列的第一个ddl数据,将其存储到外部表 fetcher 监听外部表DDL数据的状态 如果为已执行,则将此表对应的集合阻塞状态改为非阻塞 外部表设计 ChunJun 目前支持DDL数据存储外部Mysql数据源在数据还原中会将DDL数据写入到外部数据源,第三方修改此DDL数据的status为2后,ChunJun会认为下游DDL已执行完毕 数据还原脚本示例 脚本示例主要分为nameMapping及restoration两部分,分别对应NameMappingFlatMap及RestorationFlatMap 算子参数。 注意reader的split需要设置为true。 数据还原存在问题 binlog支持DDL读取,logminer暂未支持 需要所有数据源支持DDL的读取 RestorationFlatMap会将数据存储在内存中,后续会进行外部持久化 checkpoint支持不足,RestorationFlatMap模块数据续跑后会丢失 当前数据源产生DDL场景和外部交互过多,后续增加DDL自动执行,达到DML&DDL都由chunjun完成,用户无感知 DDL自动转换架构设计 当前数据还原DDL执行依赖外部进行操作,ChunJun仅根据DDL数据状态进行DML数据下发,为了做到整条链路由ChunJun闭环完成,减少外部依赖以及运维成本,ChunJun进行DDL自动转换操作,将source的DDL语法转换为sink的DDL语法,因此就有了DDL自动转换模块的设计。 DDL自动转换解决下列问题: 当前ddl数据ChunJun下游不会自动执行 外部表存储的DDL数据状态是客户手动修改 主要结构设计: 将DDL自动转换逻辑放在NameMappingFlatMap中,NameMappingFlatMap执行数据转换。 DDL技术方案 数据还原自动转换功能主要是以下三部分: 1、解析DDL语句 源表DDL SQL 转为一个中间对象以及中间对象转为目标端DDL语句。 2、异常数据管理 如果自动转换时失败,抛出conventException后,由对应的异常管理器处理。 3、DDL数据状态自动修改 DDL SQL在下游执行完毕后,基于事件通知方式将中间表存储的DDL状态改为已完成。 DDL架构设计 由于DDL没有统一标准,每个数据源的DDL语法不同,因此需要按照每个数据源的DDL语法进行解析,并将其解析为一个中间数据,然后将这个中间数据转为目标类型数据源的DDL语句。 因此DDLConvent顶层接口会抽象出三个基本方法: 1、RowData转为中间数据 2、中间数据转为DdlSql 3、获取数据源类型 Calcite解析DDL实战 Calcite解析DDL实战基于代码层面做此次演示,就不在公众号上做具体演示回顾,各位社区小伙伴们可前往B站查看视频直播回顾。 B站直播回顾地址: https://www.bilibili.com/video/BV1eR4y1P7AH?spm_id_from=333.999.0.0 结语 以上就是我们在数据还原上增加的DDL自动执行设计思路,我们规划将在上半年完成以上功能点,如果大家有好的想法也欢迎给我们提issue或者pr。 issue规范 在提交issue时须有对应脚本、提交模式、数据(非必要)、完整日志(重要的东西)等内容 pr提交规范 1、在pr里备注修复的issue 2、pr commit 模版[hotfix/feat/docs-#issueID][#fix-module] #fix-commit(尽量使用英文,内容描述清楚) 3、修改内容尽量保持与issue内容一致,如果出现无关修改,在pr中备注出来; 社区文档中心 同时为了帮助社区伙伴更好的了解和使用ChunJun,我们上线了社区文档中心,欢迎大家使用。 https://dtstack.github.io/chunj

优秀的个人博客,低调大师

正在直播 | 4 大系列、33 课时,距离你成为架构师还差这一套课程

系列直播地址:https://yqh.aliyun.com/zhibo#J_8602371590 对于大部分程序员来说,架构师是一个令人向往的角色。如果说程序员的工作是谋一域,作为架构师就需要对技术的深度和广度都有深刻的了解,是不折不扣的谋全局者。 为了让更多普通开发者成为架构师,在不断的开发和学习各种知识,经验,在自我培养和技能强化中不断的提升,我们邀请 30+位阿里专家,整合 40+课时构建《架构师成长系列直播》以微服务、Devops、Serverless、消息中间件,4 个方向为切入点,以真实场景为例,深刻解读技术落地实践,洞悉技术发展方向,期待为广大程序员成为一名合格的架构师打下牢固的基础。 系列 1:云原生时代 Devops 实操笔记 系列 2:微服务架构从概念到实践 系列 3:Serverless 工程化落地与实践 系列 4:Ap

优秀的个人博客,低调大师

【大数据新手上路】“零基础”系列课程--日志服务(Log Service)采集 ECS 日志数据到 MaxCompute

随着公司业务的增多,云服务器 ECS 上的日志数据越来越多,存储开销越来越大,受限于日志的大小和格式,分析的速度非常缓慢,导致海量数据在沉睡,不知道发挥作用,如何能将这些数据进行归集、提炼和智能化的处理始终是一个困扰。通过日志服务投递日志数据到MaxCompute便可以让用户按照不同的场景和需求、以不同的方式复用数据,充分发挥日志数据的价值。 使用日志服务投递日志数据到MaxCompute具有如下优势: 使用非常简单。用户只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxCompute中。 避免重复收集工作。由于日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集一遍日志数据后再导入到MaxCompute。 充分复用日志服务内的日志分类管理工作。用户可让日志服务中不同类型的日志(存在不同Lo

优秀的个人博客,低调大师

Android官方开发文档Training系列课程中文版:Activity测试之创建功能性测试

原文地址:http://android.xsoftlab.net/training/activity-testing/activity-functional-testing.html 功能性测试包括模拟用户操作之类的组件验证。例如开发者可以通过功能性测试来验证在用户执行了UI操作之后Activity是否启动了Activity。 如要为Activity创建功能性测试,测试类应当继承ActivityInstrumentationTestCase2。与ActivityUnitTestCase不同,ActivityInstrumentationTestCase2既可以与Android系统通信,又能使程序可以接收键盘输入事件与屏幕点击事件。 验证功能行为 一般功能性测试可能会有以下测试目的: 验证在某个UI控制器被按下后,目标Activity是否被启动。 验证目标Activity是否将在启动之前的用户输入数据正确显示。 开发者所实现的代码可能如下: @MediumTest public void testSendMessageToReceiverActivity() { final Button sendToReceiverButton = (Button) mSenderActivity.findViewById(R.id.send_message_button); final EditText senderMessageEditText = (EditText) mSenderActivity.findViewById(R.id.message_input_edit_text); // Set up an ActivityMonitor ... // Send string input value ... // Validate that ReceiverActivity is started ... // Validate that ReceiverActivity has the correct data ... // Remove the ActivityMonitor ... } 测试框架会等待ReceiverActivity启动,否则的话将会在超时后返回null。如果ReceiverActivity启动,那么ActivityMonitor则会收到一个命中。开发者可以通过断言方法来验证ReceiverActivity是否被启动,命中数是否会如所期望的那样有所增长。 设置ActivityMonitor 如果需要监视Activity,可以注册ActivityMonitor。当目标Activity启动时,系统会通知ActivityMonitor一个事件。如果目标Activity启动,那么ActivityMonitor的计数器则会更新。 一般使用ActivityMonitor应当执行以下步骤: 1.通过getInstrumentation()方法获得用于测试的Instrumentation实例。 2.通过Instrumentation的addMonitor()重载方法将Instrumentation.ActivityMonitor的实例添加到当前的instrumentation中,具体的匹配规则可由IntentFilter或者类名指定。 3.等待被监视的Activity启动。 4.验证监视器的数字增长。 5.移除监视器。 例如: // Set up an ActivityMonitor ActivityMonitor receiverActivityMonitor = getInstrumentation().addMonitor(ReceiverActivity.class.getName(), null, false); // Validate that ReceiverActivity is started TouchUtils.clickView(this, sendToReceiverButton); ReceiverActivity receiverActivity = (ReceiverActivity) receiverActivityMonitor.waitForActivityWithTimeout(TIMEOUT_IN_MS); assertNotNull("ReceiverActivity is null", receiverActivity); assertEquals("Monitor for ReceiverActivity has not been called", 1, receiverActivityMonitor.getHits()); assertEquals("Activity is of wrong type", ReceiverActivity.class, receiverActivity.getClass()); // Remove the ActivityMonitor getInstrumentation().removeMonitor(receiverActivityMonitor); 使用Instrumentation发送键盘事件 如果Activity含有EditText,可能需要测试用户是否可以对其输入数据。 一般来说,要发送字符串到EditText,应当: 1.在runOnMainSync()方法中运行requestFocus()同步方法,这样会使UI线程一直等待接收焦点。 2.调用waitForIdleSync()方法使主线程变为空闲状态。 3.通过sendStringSync()方法发送一条字符串给EditText。 例如: // Send string input value getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { senderMessageEditText.requestFocus(); } }); getInstrumentation().waitForIdleSync(); getInstrumentation().sendStringSync("Hello Android!"); getInstrumentation().waitForIdleSync();

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册