首页 文章 精选 留言 我的

精选列表

搜索[动效],共4758篇文章
优秀的个人博客,低调大师

Postcat 上线 AI 生成 API 功能,写接口几下就行!

近期 AI 风潮席卷全球,Postcat 作为新一代 API 生产力工具,从发布的第一天起就在思考如何通过 AI+API 以及插件化架构来更好地满足开发者的需求。 今天我们很高兴地向大家宣布,Postcat.com正式上线 AI 生成 API 的功能,并且是国内首个结合 AI + API 的产品! 本次更新,我们首先上线了自然语言生成 API 的功能,只需要通过语言描述需求,Postcat.com就可以自动生成对应的 API 文档,生成后的 API 文档可以直接修改并保存。 接下来让我们一起了解一下如何使用 Postcat 的 AI 生成 API 功能吧~ 1. 打开Postcat.com首页 ,先找到左侧的+选择AI 生成 API 2. 在输入框中输入你的描述,然后点击AI 生成 3. 待 API 生成完毕,选择保存 API 文档 有了咱这个 AI 生成 API 功能,工作效率直接翻倍,谁还加班手写 API 文档呀!打工人谁不爱呢?! 后续我们还会支持更多 AI+API 的功能,让 API 的开发、测试、维护更简单,期待大家的关注! 关于 Postcat Postcat 是Eolink 在 2022 年底开源的 API 管理工具,提供了 API 管理、自动化测试测试、Mock 等功能,帮助研发和测试团队高效开发、测试 API。 并且 Postcat 还拥有创新的插件架构,让几乎一切功能都可通过插件进行强化,Postcat 会继续与其他厂家一起努力开发更多的插件,共建 Postcat 的插件生态,让开发者可以充分挖掘 API 的价值。 Github:https://github.com/Postcatlab/postcat Gitee:https://gitee.com/eolink_admin/postcat

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

你就算不会 Web 开发,也能让数据“”起来的开源项目!

> 本文面向有 Python 基础的小伙伴,有 Web 基础的更好 作者:HelloGitHub-吱吱 这里是 HelloGitHub 推出的《讲解开源项目》系列,今天要向小伙伴们介绍的是一个能够快速地把数据制作成可视化、交互页面的 Python 框架:Streamlit,分分钟让你的数据动起来! > 项目地址:https://github.com/streamlit/streamlit 犹记得在做机器学习和数据分析方面的毕设时,曾经为了制作精美的图表而抓耳挠腮,曾经为了在页面可视化、交互式展示数据而绞尽脑汁。现在摆在我们面前的是一个能够快速可视化数据并且制作成交互页面的 Python 框架,只需几分钟,就可以快速构建和部署功能强大的数据应用程序,写到这里 Streamlit 的高傲已经尽数体现了。 > Streamlit - The fastest way to build and share data apps 👊 下面我们就一起来上手这个强大的 Python 数据可视化框架吧! 一、浅尝辄止 1、本地实验环境:Python 3.6 - Python 3.8。 2、安装 Streamlit 体验官方提供的 hello world 小 demo。 pip install streamlit streamlit hello 3、运行上述命令后会自动打开 Streamlit 的初始页面 http://localhost:8501/。 4、通过左边栏可以选择四个内置小项目并查看其代码,例如分形动画、折线图和层叠地图等,能在网页上点击选择设置一些参数,动态查看效果。 二、熟能生巧 通过 Streamlit 提供的接口,完美避开 Django 和 Flask 框架,无需编写 HTML、CSS、JavaScript 代码,与魔幻的前端 say goodbye。 2.1 开发自己的 app 1、首先创建一个 Python 文件,命名为 test.py,导入 Streamlit 库。 import streamlit as st 2、通过如下命令启动项目,Ctrl + c 即可结束项目。 # filename 自己的 py 文件名称 streamlit run [filename] 3、当应用程序正在运行时,每次修改 Python 文件并保存,网页都会弹出提示“Source file changed”,可以选择“Rerun”或者“Always rerun”,使得页面能够重新刷新。忽略掉小小的等待时间,我们能够在快速交互循环中「所见即所得」。 4、我们在任何时候对网页内容进行更新,包括:修改源码、使用者和网页进行交互(点击网页的按钮、输入文本),Streamlit 都是自上而下扫描解析并且运行整个代码。 2.2 基础命令 2.2.1 显示文本 命令 效果 st.title() 添加一个标题 st.write() Streamlit 的瑞士军刀,可渲染如文本、Matplotlib 和 Altair 图表等几乎任何数据参数 st.text() 显示纯文本 st.header()、st.subheader() 二级标题和三级标题 st.markdown() 显示 Markdown st.latex() 显示格式为 LaTeX 的数学表达式 st.code() 显示带有可选语法高亮显示的代码块 2.2.2「魔法」 我愿称之为懒人命令——用尽量少的代码达到同样的效果。在不调用任何 Streamlit 方法的情况下,当用户自定义的变量出现在单行中,等同于 st.write() 效果。 import pandas as pd df = pd.DataFrame({ 'first column': [1, 2, 3, 4], 'second column': [10, 20, 30, 40] }) df 也可以将 ''' 和 ' 包裹的内容直接显示。 # Draw a title and some text to the app: ''' # Welcome to HelloGitHub _快来加入我们吧_ ''' x = 10 'x', x # <-- Draw the string 'x' and then the value of x 2.2.3 显示数据表 Streamlit 能从多个不同角度快速、交互地可视化数据,原始数据、图表、JSON 数据等皆可。 命令 效果 st.dataframe() 将数据框显示为交互式表格 st.table() 显示静态表格 st.json() 将对象或字符串显示为 JSON 字符串 2.2.4 绘制图表和地图 Streamlit 支持多种流行的数据图表库,如 Matplotlib、Altair、deck.gl 等。 命令 效果 st.line_chart() 折线图 st.area_chart() 面积图 st.bar_chart() 条形图 st.map() 在地图上显示数据点 st.pyplot() matplotlib.pyplot 图表 st.altair_chart() 使用 Altair 库显示图表 st.vega_lite_chart() 使用 vega_lite_chart 库显示图表 st.pydeck_chart() 使用 PyDeck 库绘制图表 2.2.5 显示多媒体 动动鼠标即可将图像、视频和音频文件直接嵌入 Streamlit 应用程序。 命令 效果 st.image() 图片 st.audio() 音频 st.video() 视频 2.2.6 交互式小部件 盯👀:漂亮的按钮、滑块、输入框等小部件。每次用户与小部件交互时,Python 脚本都会重新执行,并且该小部件的输出值会在运行期间设置为新值。 1、按钮 button。 if st.button('HelloGitHub'): st.write('Subscribe our channels~') 2、复选框 checkbox。 ret = st.checkbox('I love HelloGitHub!') if ret: st.write('Me too~') 3、滑块 slider,可以选择 int / float / data / time / datetime 等类型。 age = st.slider('HelloGitHub 几岁了?', 0, 10, 1) st.write("HelloGitHub ", age, ' 岁了~') 4、常用的命令列举 命令 效果 st.radio() 单选按钮 st.select() 单选框 st.multiselect() 多选框 st.text_input() 单行文本输入框 st.text_area() 多行文本输入框 st.number_input() 数字输入框 st.date_input() 日期输入框 st.time_input() 时间输入框 st.file_uploader() 文件上传 st.color_picker() 取色器 2.2.7 显示进程和状态 1、进度条 progress。 import time my_bar = st.progress(0) for percent_complete in range(100): time.sleep(0.1) my_bar.progress(percent_complete + 1) 2、spinner:在执行代码块时临时显示一条消息。 import time with st.spinner('Wait for it...'): time.sleep(5) st.success('Done!') st.balloons() 3、其他 命令 效果 st.balloons() 庆祝气球 st.error() / st.warning() / st.info() / st.success() / st.exception() 错误、警告、提示、成功、报错信息提示 2.2.8 性能优化 Streamlit 使用 @st.cache 装饰器使得页面能够快速“无痕”刷新。当我们给函数打上 cache 标记时,Streamlit 在碰到该函数的时候会检查三个值:函数名称、函数体、输入参数。如果发现这三个值的组合第一次出现,则会运行函数,并且将结果存储在本地缓存中。当下次调用该函数时,如果这三个值没有改变,则 Streamlit 会跳过函数执行,直接读取本地缓存返回结果。 @st.cache def HelloGitHub(url): # 返回相应数据 return data # 第一次遇到,执行该函数 d1 = HelloGitHub(DATA_URL_1) # 传入参数一致,第二次遇到不会执行该函数 # 而会直接返回前一次计算的结果,d1 = d2 d2 = HelloGitHub(DATA_URL_1) # 传入参数不同,重新执行该函数 d3 = HelloGitHub(DATA_URL_2) 2.2.9 布局设置 1、将交互小部件放入侧边栏。 add_selectbox = st.sidebar.selectbox( "Which one?", ("C++", "Java", "Python") ) 2、表单 st.form():将元素与“提交”按钮一起处理。 # 向表单插入元素 with st.form("my_form1"): st.write("我在 1 框框里~") slider_val = st.slider("框框滑块") checkbox_val = st.checkbox("pick me") # Every form must have a submit button. submitted = st.form_submit_button("1-Submit") # 乱序插入元素 form = st.form("my_form2") form.slider("我在 2 框框里~") st.slider("我在外面") # Now add a submit button to the form: form.form_submit_button("2-Submit") 3、插入列并排的容器 # 官方示例 col1, col2, col3 = st.beta_columns(3) with col1: st.header("A cat") st.image("https://static.streamlit.io/examples/cat.jpg") with col2: st.header("A dog") st.image("https://static.streamlit.io/examples/dog.jpg") with col3: st.header("An owl") st.image("https://static.streamlit.io/examples/owl.jpg") 2.3 修改配置 1、查看所有的配置选项:streamlit config show。 2、Windows 系统可以在 %userprofile%/.streamlit/config.toml 全局文件下或者在当前运行 Streamlit 的文件夹下建立 .streamlit/config.toml 文件进行设置。 3、某些配置例如外观、主题等点击网页上的 Settings 也可轻松选择。 2.4 在 Streamlit sharing 上部署、管理和共享 1、将自己的项目代码上传到 GitHub 的共有仓库,添加需求文件以管理任何外部依赖项,例如 requirements.txt 等。 2、在 https://streamlit.io/sharing 上注册账号并且申请邀请「Request an invite!」。收到邀请电子邮件后,即可使用该平台部署管理。 3、选择 New app 在 Deploy an app 中填入相应信息即可。 4、若应用程序有很多依赖项,则第一次部署可能需要一些时间,最终应用程序可以使用如下链接访问: https://share.streamlit.io/[user name]/[repo name]/[branch name]/[app path] 三、精益求精 到此,Streamlit 框架的基本接口和用法都已经讲完啦!更多详情还需要友友们在实践中探索,并将指令成功“嵌入”到自己的项目中。 很多命令在文档的「API cheat sheet」中都可以快速搜索到,希望很快就能够在 Streamlit Gallery 上看到大家分享的应用,可以留言给我地址我会去把玩的~。 最后,您的关注和宝贵三连「收藏、点赞、在看」,是对我们 HelloGitHub 莫大的支持,我们将会为您源源不断推送新鲜、有趣的开源项目。 关注 HelloGitHub 公众号 第一时间收到更新。 还有更多开源项目的介绍和宝藏项目等待你的发现。

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

早上起床后不想,让 Python 来帮你朗读网页吧

是不是有的时候懒得自己看新闻?那么不妨试试用 Python 来朗读给你听吧。 网页转换成语音,步骤无外乎: 网页正文识别,获取到正文的文本内容; 文本转语音,通过接口将文本转换成语音文件; 语音文件的发声,即将语音文件读出; 1 网页正文识别 之所以用 Python,就是因为 Python 有着丰富的库,网页正文识别也不在话下。这里我尝试了 readability、goose3。 1.1 readability readability 支持 Python3,使用 pip install readability-lxml 安装即可。 readability 使用起来也很方便: import requestsfrom readability import Document response = requests.get('http://news.china.com/socialgd/10000169/20180616/32537640_all.html') doc = Document(response.text) print(doc.title()) 但是 readability 提取到的正文内容不是文本,里面仍包含 HTML 标签。 当然也可以结合其他组件再对 HTML 进行处理,如 html2text,我们这里就不再延伸,有兴趣的可以自行尝试。 1.2 goose3 Goose 本来是一个用 Java 编写的文章提取器,后来就有了 Python 实现版: goose3 。 使用起来也很方便,同时对中文支持也不错。使用 pip install goose3 即可安装。 >>> from goose3 import Goose >>> from goose3.text import StopWordsChinese >>> url = 'http://news.china.com/socialgd/10000169/20180616/32537640_all.html' >>> g = Goose({'stopwords_class': StopWordsChinese}) >>> article = g.extract(url=url) >>> print(article.cleaned_text[:150]) 北京时间6月15日23:00(圣彼得堡当地时间18:00),2018年世界杯B组一场比赛在圣彼得堡球场展开角逐,伊朗1比0险胜摩洛哥,伊朗前锋阿兹蒙半场结束前错过单刀机会,鲍哈杜兹第95分钟自摆乌 龙。这是伊朗20年来首度在世界杯决赛圈取胜。 本届世界杯,既相继出现替补便进球,贴补梅开二度以及东道主 可以看出网页正文提取效果还不错,基本满足我们的要求,可以使用! 注意:goose 还有另外一个 Python2 的版本:Python-Goose,使用方法和 goose3 基本一样。 2 文本转语音 文本转语音,百度、阿里、腾讯、讯飞等都有提供 REST API 接口,阿里和腾讯的申请相对时间较长,阿里的貌似还要收费,百度和讯飞的在线申请后即可使用。 没办法,好的东西得来总是要曲折一些。其中百度的没有调用量的限制(其实默认是 200000 次/天),讯飞有每天 500 次的限制。 这里我们使用百度的 REST API 接口中的语言合成接口,一方面原因是百度的调用次数没有限制,另一方面,我大致看了下讯飞的接口文档,接口限制还是比较多的。还有就是百度提供了 REST API 的 Python 封装,使用也更方便。 2.1 baidu-aip 的使用 百度提供了 Python SDK,使用 pip install baidu-aip 可以直接安装。接口的使用可以参考接口文档:http://ai.baidu.com/docs#/TTS-Online-Python-SDK/top。 使用示例如下: from aip import AipSpeech""" 你的 APPID AK SK 均可在服务控制台中的应用列表中查看。 """ APP_ID = '你的 App ID' API_KEY = '你的 Api Key' SECRET_KEY = '你的 Secret Key' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) result = client.synthesis('你好,你在做什么', 'zh', 3, {'vol': 5, })# 识别正确返回语音二进制 错误则返回dict 参照下面错误码if not isinstance(result, dict):with open('auido.mp3', 'wb') as f: f.write(result) 接口参数: 参数 类型 描述 必传 tex String 合成的文本,使用UTF-8编码,请注意文本长度必须小于1024字节 是 lang String 语言选择,填写zh 是 ctp String 客户端类型选择,web端填写1 是 cuid String 用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内 否 spd String 语速,取值0-9,默认为5中语速 否 pit String 音调,取值0-9,默认为5中语调 否 vol String 音量,取值0-15,默认为5中音量 否 per String 发音人选择,0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女 否 接口对单次传入的文本进行了限制,合成文本长度必须小于 1024 字节,如果文本长度过长,就需要进行切割处理,采用多次请求的方式,分别转换成语音文件,最后再将多个语音文件合并成一个。 2.2 文本切割 可以使用如下代码将文本分割成多个长度为 500 的文本列表 # 将文本按 500 的长度分割成多个文本 text_list = [text[i:i+500] for i in range(0, len(text), 500)] 我们使用 pydub 来处理生成的音频文件。使用 pip install pydub 即可安装。 另外还 Ubuntu 环境需要安装依赖的,使用 sudo apt-get install libav-tools 安装即可,而在 Windows 环境需要到 https://ffmpeg.zeranoe.com/builds/ 下载 FFmpeg,并将其配置到环境变量中。 若还有问题,可以参考官网配置:https://github.com/jiaaro/pydub。 # 合并音频文件def merge_voice(file_list): voice_dict = {} song = Nonefor i,f in enumerate(file_list):if i == 0: song = AudioSegment.from_file(f,"mp3")else:# 拼接音频文件 song += AudioSegment.from_file(f,"mp3")# 删除临时音频 os.unlink(f)# 导出合并后的音频文件,格式为MP3格式 file_name = str(uuid.uuid1()) + ".mp3" song.export(file_name, format="mp3")return file_name 这里有一个测试时生成的文件,大家可以试听一下: Python 朗读世界杯新闻来自AI派00:0003:11 通过百度的接口,我们可以将文字转化成音频文件,下面的问题就是如何播放音频文件。 3 音频文件播放 网上获取到 Python 播放 wav 文件的方式由好几种,包括 pyaudio、pygame、winsound、playsound。不过测试下来,只有 playsound 成功。其他方式有兴趣的可以试下,有问题可以留言交流。 使用 pip install playsound 安装后即可使用。 使用也很简单: >>> from playsound import playsound >>> playsound('/path/to/a/sound/file/you/want/to/play.mp3') 说明:音频的播放需要在图形化页面下运行,因为命令行模式下,没有播放声音的出口。 python page2voice.py -u "https://so.gushiwen.org/shiwenv_c244fc77f6fb.aspx" 运行后,代码就会自动解析网页并进行朗读啦。 4 总结 至此,网页到音频的转换就结束了,当然程序没有这么完美,比如中英文混合的网页解析和转换的结果就不怎么理想,但是纯中文的新闻页面效果还是不错的。 Python借助AI已经火的不能再火了,如果你想学习Python或者AI,你可以加入我的知识星球。 【AI派】知识星球是我主打的一个 实战的付费社区,在这里,你能获得 带着大家使用Python做AI相关(如数据分析、机器学习、推荐系统等)的项目 不定期布置相关作业,监督大家学习 学习、工作中的任何疑问随时可以向我提问 更好氛围的微信技术交流群 免费的学习资料 结识更多的朋友 原文发布时间为:2018-09-12 本文作者: AI派 本文来自云栖社区合作伙伴“ ”,了解相关信息可以关注“ AI派”。

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

Centos0S7手安装OpenStack Pike版--(glance)

#Configure Glance mysql -uroot -ppasswd123 -e "CREATE DATABASE glance" mysql -uroot -ppasswd123 -e "GRANT ALL PRIVILEGES ON glance.TO 'glance'@'localhost' IDENTIFIED BY 'passwd123'" mysql -uroot -ppasswd123 -e "GRANT ALL PRIVILEGES ON glance.TO 'glance'@'%' IDENTIFIED BY 'passwd123'" openstack user create --domain default --password passwd123 glance openstack role add --project service --user glance admin openstack service create --name glance --description "OpenStack Image" image openstack endpoint create --region RegionOne image publichttp://controller:9292 openstack endpoint create --region RegionOne image internalhttp://controller:9292 openstack endpoint create --region RegionOne image adminhttp://controller:9292 openstack-config --set /etc/glance/glance-api.conf database connection mysql+pymysql://glance:passwd123@controller/glance openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_urihttp://controller:5000 openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_urlhttp://controller:35357 openstack-config --set /etc/glance/glance-api.conf keystone_authtoken memcached_servers controller:11211 openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_type password openstack-config --set /etc/glance/glance-api.conf keystone_authtoken project_domain_name Default openstack-config --set /etc/glance/glance-api.conf keystone_authtoken user_domain_name Default openstack-config --set /etc/glance/glance-api.conf keystone_authtoken project_name service openstack-config --set /etc/glance/glance-api.conf keystone_authtoken username glance openstack-config --set /etc/glance/glance-api.conf keystone_authtoken password passwd123 openstack-config --set /etc/glance/glance-api.conf paste_deploy flavor keystone openstack-config --set /etc/glance/glance-api.conf glance_store stores file,http openstack-config --set /etc/glance/glance-api.conf glance_store default_store file openstack-config --set /etc/glance/glance-api.conf glance_store filesystem_store_datadir /var/lib/glance/images/ /etc/glance/glance-registry.conf openstack-config --set /etc/glance/glance-registry.conf database connection mysql+pymysql://glance:passwd123@controller/glance openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_urihttp://controller:5000 openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_urlhttp://controller:35357 openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken memcached_servers controller:11211 openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_type password openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken project_domain_name Default openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken user_domain_name Default openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken project_name service openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken username glance openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken password passwd123 openstack-config --set /etc/glance/glance-registry.conf paste_deploy flavor keystone su -s /bin/sh -c "glance-manage db_sync" glance systemctl enable openstack-glance-api.service openstack-glance-registry.service systemctl start openstack-glance-api.service openstack-glance-registry.service systemctl status openstack-glance-api.service openstack-glance-registry.service source admin-openrc openstack image create "centos7" --file CentOS-7-x86_64-GenericCloud.qcow2 --disk-format qcow2 --container-format bare --public openstack image list 本文转自 OpenStack2015 博客,原文链接: http://blog.51cto.com/andyliu/2069164 如需转载请自行联系原作者

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

Centos0S7手安装OpenStack Pike版--(keystone)

OpenStack安装指南_Mitakahttp://down.51cto.com/data/2331199 Openstack管理手册-Newton版-CentOS7.2http://down.51cto.com/data/2331201 #Configure Keystone mysql -uroot -ppasswd123 -e "CREATE DATABASE keystone" mysql -uroot -ppasswd123 -e "GRANT ALL PRIVILEGES ON keystone.TO 'keystone'@'localhost' IDENTIFIED BY 'passwd123'" mysql -uroot -ppasswd123 -e "GRANT ALL PRIVILEGES ON keystone.TO 'keystone'@'%' IDENTIFIED BY 'passwd123'" vim /etc/keystone/keystone.conf [database] connection = mysql+pymysql://keystone:passwd123@controller/keystone [token] provider = fernet su -s /bin/sh -c "keystone-manage db_sync" keystone keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone keystone-manage credential_setup --keystone-user keystone --keystone-group keystone keystone-manage bootstrap --bootstrap-password ADMIN_PASS \ --bootstrap-admin-urlhttp://controller:35357/v3/\ --bootstrap-internal-urlhttp://controller:5000/v3/\ --bootstrap-public-urlhttp://controller:5000/v3/\ --bootstrap-region-id RegionOne Configure the Apache HTTP server vim /etc/httpd/conf/httpd.conf ServerName controller ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/ systemctl start httpd.service systemctl enable httpd.service systemctl status httpd.service export OS_USERNAME=admin export OS_PASSWORD=passwd123 export OS_PROJECT_NAME=admin export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_AUTH_URL=http://controller:35357/v3 export OS_IDENTITY_API_VERSION=3 openstack project create --domain default --description "Service Project" service openstack project create --domain default --description "Demo Project" demo openstack user create --domain default --password passwd123 demo openstack role create user openstack role add --project demo --user demo user unset OS_AUTH_URL OS_PASSWORD openstack --os-auth-urlhttp://controller:35357/v3\ --os-project-domain-name Default --os-user-domain-name Default \ --os-project-name admin --os-username admin token issue openstack --os-auth-urlhttp://controller:5000/v3\ --os-project-domain-name Default --os-user-domain-name Default \ --os-project-name demo --os-username demo token issue vim admin-openrc export OS_PROJECT_DOMAIN_NAME=Default export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_NAME=admin export OS_USERNAME=admin export OS_PASSWORD=passwd123 export OS_AUTH_URL=http://controller:35357/v3 export OS_IDENTITY_API_VERSION=3 export OS_IMAGE_API_VERSION=2 source admin-openrc openstack token issue 本文转自 OpenStack2015 博客,原文链接: http://blog.51cto.com/andyliu/2069163 如需转载请自行联系原作者

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

Centos0S7手安装OpenStack Pike版--(Evironment)

OpenStack安装指南_Mitakahttp://down.51cto.com/data/2331199 Openstack管理手册-Newton版-CentOS7.2http://down.51cto.com/data/2331201 [root@controller ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 192.168.137.145 controller 192.168.137.146 compute 192.168.137.149 storage #Install ALL Packages and Configure Evironment yum install centos-release-openstack-pike -y yum install python-openstackclient -y yum install openstack-selinux -y yum install mariadb mariadb-server python2-PyMySQL -y yum install rabbitmq-server -y yum install memcached python-memcached -y yum install etcd -y yum install openstack-keystone httpd mod_wsgi -y yum install openstack-glance -y yum install -y openstack-nova-api openstack-nova-conductor \ openstack-nova-console openstack-nova-novncproxy \ openstack-nova-scheduler openstack-nova-placement-api yum install -y openstack-neutron openstack-neutron-ml2 \ openstack-neutron-linuxbridge ebtables #Configure RabbitMQ systemctl enable rabbitmq-server.service systemctl start rabbitmq-server.service systemctl status rabbitmq-server.service rabbitmqctl add_user openstack passwd123 rabbitmqctl set_permissions openstack "." "." ".*" #Configure Memcached vim /etc/sysconfig/memcached OPTIONS="-l 127.0.0.1,::1,controller" systemctl enable memcached.service systemctl start memcached.service OpenStack服务可以使用户可靠,分布式键值存储的分布式密钥锁定,存储配置,跟踪服务活性等情况。 #Configure Etcd vim /etc/etcd/etcd.conf [root@controller ~]# vim /etc/etcd/etcd.conf #[Member] ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="http://192.168.137.145:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.137.145:2379" ETCD_NAME="controller" #[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.137.145:2380" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.137.145:2379" ETCD_INITIAL_CLUSTER="controller=http://192.168.137.145:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01" ETCD_INITIAL_CLUSTER_STATE="new" systemctl enable etcd systemctl start etcd systemctl status etcd 本文转自 OpenStack2015 博客,原文链接:http://blog.51cto.com/andyliu/2069162 如需转载请自行联系原作者

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

Centos0S7手安装OpenStack Pike版--(nova)

OpenStack安装指南_Mitakahttp://down.51cto.com/data/2331199 Openstack管理手册-Newton版-CentOS7.2http://down.51cto.com/data/2331201 #Configure Nova mysql -uroot -ppasswd123 -e "CREATE DATABASE nova_api" mysql -uroot -ppasswd123 -e "CREATE DATABASE nova" mysql -uroot -ppasswd123 -e "CREATE DATABASE nova_cell0" mysql -uroot -ppasswd123 -e "GRANT ALL PRIVILEGES ON nova_api.TO 'nova'@'localhost' IDENTIFIED BY 'passwd123'" mysql -uroot -ppasswd123 -e "GRANT ALL PRIVILEGES ON nova_api.TO 'nova'@'%' IDENTIFIED BY 'passwd123'" mysql -uroot -ppasswd123 -e "GRANT ALL PRIVILEGES ON nova.TO 'nova'@'localhost' IDENTIFIED BY 'passwd123'" mysql -uroot -ppasswd123 -e "GRANT ALL PRIVILEGES ON nova.TO 'nova'@'%' IDENTIFIED BY 'passwd123'" mysql -uroot -ppasswd123 -e "GRANT ALL PRIVILEGES ON nova_cell0.TO 'nova'@'localhost' IDENTIFIED BY 'passwd123'" mysql -uroot -ppasswd123 -e "GRANT ALL PRIVILEGES ON nova_cell0.TO 'nova'@'%' IDENTIFIED BY 'passwd123'" source admin-openrc openstack user create --domain default --password passwd123 nova openstack role add --project service --user nova admin openstack service create --name nova --description "OpenStack Compute" compute openstack endpoint create --region RegionOne compute publichttp://controller:8774/v2.1 openstack endpoint create --region RegionOne compute internalhttp://controller:8774/v2.1 openstack endpoint create --region RegionOne compute adminhttp://controller:8774/v2.1 openstack user create --domain default --password paswd123 placement openstack role add --project service --user placement admin openstack service create --name placement --description "Placement API" placement openstack endpoint create --region RegionOne placement publichttp://controller:8778 openstack endpoint create --region RegionOne placement internalhttp://controller:8778 openstack endpoint create --region RegionOne placement adminhttp://controller:8778 Edit the /etc/nova/nova.conf openstack-config --set /etc/nova/nova.conf DEFAULT enabled_apis osapi_compute,metadata openstack-config --set /etc/nova/nova.conf api_database connection mysql+pymysql://nova:passwd123@controller/nova_api openstack-config --set /etc/nova/nova.conf database connection mysql+pymysql://nova:passwd123@controller/nova openstack-config --set /etc/nova/nova.conf DEFAULT transport_url rabbit://openstack:passwd123@controller openstack-config --set /etc/nova/nova.conf api auth_strategy keystone openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_urihttp://controller:5000 openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_urlhttp://controller:35357 openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers controller:11211 openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name default openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name default openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova openstack-config --set /etc/nova/nova.conf keystone_authtoken password passwd123 openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 192.168.137.145 openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron True openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver openstack-config --set /etc/nova/nova.conf vnc enabled true openstack-config --set /etc/nova/nova.conf vnc vncserver_listen 192.168.137.145 openstack-config --set /etc/nova/nova.conf vnc vncserver_proxyclient_address 192.168.137.145 openstack-config --set /etc/nova/nova.conf glance api_servershttp://controller:9292 openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp openstack-config --set /etc/nova/nova.conf placement os_region_name RegionOne openstack-config --set /etc/nova/nova.conf placement project_domain_name Default openstack-config --set /etc/nova/nova.conf placement project_name service openstack-config --set /etc/nova/nova.conf placement auth_type password openstack-config --set /etc/nova/nova.conf placement user_domain_name Default openstack-config --set /etc/nova/nova.conf placement auth_urlhttp://controller:35357/v3 openstack-config --set /etc/nova/nova.conf placement username placement openstack-config --set /etc/nova/nova.conf placement password passwd123 vim /etc/httpd/conf.d/00-nova-placement-api.conf <Directory /usr/bin> <IfVersion >= 2.4> Require all granted </IfVersion> <IfVersion < 2.4> Order allow,deny Allow from all </IfVersion> </Directory> systemctl restart httpd systemctl status httpd su -s /bin/sh -c "nova-manage api_db sync" nova su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova su -s /bin/sh -c "nova-manage db sync" nova nova-manage cell_v2 list_cells systemctl enable openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service \ openstack-nova-conductor.service openstack-nova-novncproxy.service systemctl start openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service \ openstack-nova-conductor.service openstack-nova-novncproxy.service systemctl status openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service \ openstack-nova-conductor.service openstack-nova-novncproxy.service openstack service list 本文转自 OpenStack2015 博客,原文链接: http://blog.51cto.com/andyliu/2069165 如需转载请自行联系原作者

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

两全:媒体服务的创新“顶设”

做媒体服务,一定要有刻入骨髓的抽象思维。 视频化浪潮汹涌、生成式人工智能AIGC极速迭代、体验需求和应用场景愈发多样......面对“视频生产力”的变革,我们能否透过纷繁复杂的表象,洞察音视频行业的“真正需求”? 是否存在一套优雅的媒体服务设计,满足多方需求?如何“落地”实现价值?保持“持续生命力”的关键又是什么? 随着AIGC和大模型的能力加持,媒体服务的“全智能”又将如何演进? 本文由IMMENSE、「阿里云视频云」媒体服务负责人邹娟和LiveVideoStack策划、采访而成。 再探“真正需求” 大视频行业的真正“需求”是什么? 在视频化领域,关键无外乎是视频的生产与视频的消费。那么,关于大视频行业的真正“需求”,我们也可以从视频生产端和视频消费端两个维度来讨论。 对于视频生产端而言,快速、高效地生产视频可以抢占发布先机、吸引观众;而提供更优质、创新、综合体验好的视频内容可以留住观众。 对于视频消费端而言,最重要的是“体验”:题材新颖、有趣,内容丰富且有“获得感”;视频的画面和声音感官效果好;获取的信息是“第一手”、最新鲜的...... 看似需求多样,实则无论是生产还是消费的需求,可以归结为两个关键词:“高时效” 和“高质量”。 规模化下,“高时效”和“高质量”可以两全吗? “高时效”需要生产力和生产效率的提升,意味着相同时间内生产更多视频内容,这也会带来规模(数量、时长、行业、场景)的扩大。 在规模化之下,“高时效”与“高质量”看似难两全,但随着“云计算”与“人工智能”时代的到来,局面便大不相同了。 云计算既能提供海量、高并发、弹性的视频处理能力,还能将多种视频业务、多个视频场景,用最优的组织和调度方式,错峰亦或是混跑,这便实现了两个维度的“规模化”。在此之上,云可以将单个视频的高质量特性完美复刻,从而快速实现“高质量”视频的规模化。 在此基础上,随着AI的不断发展和深入,智能能力在某些场景上比传统人力更精准、更高效,这也同样促成了规模化下的“高时效”与“高质量”。 新数智时代,云和AI走向深度融合,而随着AIGC的大爆发,AI不再仅仅作为单点能力应用在某个环节,一切皆向着“全智能”演进。 “顶层设计”与“发动机” 云厂商面对“内容生产革命”,下一步“剑指何方”? 云厂商,天然的To B角色。由于不同行业、不同业务场景、不同需求的客户,所需的功能、性能、时效性、实现效果大相径庭。 因此,对云厂商来讲,开放、灵活、多场景的问题是必然需要解决的。 展开来说,视频的全链路从采集开始,历经制作、处理、管理、分发、消费,每一个环节包含了非常多所需的媒体原子能力。在面对不同场景以及不同行业的客户需求时,对这些原子能力的使用深度和组合方式,是十分不同的。 因此,经总结提炼和抽象后形成的统一“顶层设计”,便是云厂商的“制胜法宝”。 求本溯源,我们如何在“顶层”寻求解决之道? 首先,是将媒体原子服务“打散”,再“重组”。 这里,一是需要将视频全链路的媒体原子服务作细粒度拆分,并把每个服务做深做透;二是以一套灵活的编排机制,将这些原子服务依照客户的设想、场景、业务流,实现自由搭建和组装。 再者,是底层媒体技术的统一设计。 视频处理流程由解封装、解码、前处理、编码、封装这几个主要环节构成,我们需要一个下接算法、上联调度的“媒体引擎”,构建统一的媒体处理框架,将这些环节组织起来、支持多种算法、灵活集成插件、处理各类格式。 媒体原子服务的“打散”和“重组”,构建了媒体服务“最上层”可灵活编排的业务流,而统一“媒体引擎”是媒体任务在底层“执行层”实现高时效、高性能及丰富功能的基石。 最后,在二者之间,还需要统一的“媒体分布式服务框架和媒体元数据体系”做一层连接,其中包括了:跨产品跨场景的统一媒资OneMediaID、统一工作流、统一的媒体业务流消息处理机制、统一的媒体任务管道调度机制等。 由此,形成了一套统一顶设的“媒体服务”。 其中,媒体引擎是当之无愧的“发动机”? 我们讲到了“媒体引擎”,它是整个媒体服务的底层核心,是所有媒体处理和媒体生产制作任务的执行器,既需要处理传统的媒体处理类的任务,也需要处理各式各样AI任务,从而真正实现下接算法,上联调度。 “媒体引擎”同时涉及“编排层”技术,以及“内核层”技术。这里的“编排”并不是指业务流的“编排”,而是单任务处理各环节的“编排”和算子的“编排”。 通过统一的编排Pipeline及策略,“媒体引擎”能灵活支持不同任务的多种参数组合,并使得这些参数组合的执行效果达到画质、性能、码率、时效性等多维权重的综合最佳。 此外,“媒体引擎”还负责对任务进行最优的执行策略。 比如:是整段执行还是并行执行?是切片级别并行还是帧级别并行?是否需要调用特殊的组件甚至使用特殊的机型?以及算子是否存在依赖关系?.....我们把媒体引擎的这类决策能力称为“media worker brain”。 在这样的大脑调配之下,对任务最优执行策略的追求,亦是对“高质量”和“高时效”追求的一脉相承。 持续的生命力:灵活、开放、多业务 一个平台的持续生命力,源于什么? 反复强调“顶层设计”,因为作为ToB的云厂商,阿里云视频云一定要解决多业务、灵活、开放的问题。 我们既需要考虑不同客户业务的个性与特色,又不能全部case-by-case地贴身定制,因此我们一定要有“刻入骨髓”的抽象思维,需要时时刻刻总结、提炼、抽象,对产品、模块、服务、API的设计皆是如此。 于是,“顶层设计”可以避免每个业务板块或模块在各自“舒适”的体系里“野蛮发展”,一切皆从全局来规划权衡。 仔细看来,媒体服务的“顶设”先基于已有需求及客户场景,按照媒体服务的5大模块(媒体汇聚、媒体处理、媒体生产与制作、媒体管理、媒体消费),将媒体能力进行梳理、总结,并以“可复用”为依据,将其进一步打碎成细粒度的原子媒体能力,经过一层或多层的共性抽象,实现不同范围的Service。 比如:在媒体生产制作模块,媒体服务既提供了偏原子的VideoDetext去字幕服务,也提供了更综合的剪辑合成服务。 同时,需要将相对固定的和经过变化的部分进行分离,提供一些系统内置的媒体流程,降低客户的开发难度,而针对客户希望有更高灵活度的场景,还设计了类似可编程的脚本或策略进行自定义。 开放性也是媒体服务顶层设计的另一个关注点。 智能媒体服务的开放性体现在:除了支持阿里云产品的相关协议和能力之外,还支持国际或国内的标准协议及部分第三方厂商的协议和能力。 比如,在低延时传输这个领域,智能媒体服务除了支持自家的RTS之外,还支持LL-HLS、LHLS、Dash/CMAF等; 再比如,我们除了支持阿里云OSS作为媒体处理服务的输入输出之外,还支持AWS的S3、以及HTTP URL等; 还有,我们除了可以支持自研音视频及AI算法之外,也支持接入经过安全校验的三方AI算子等。 我们相信,只有开放与合作,才能让技术持续焕发生命力。 “顶设”落地,能让“高时效”再高一节吗? 当“顶设”帮我们突围了多业务、灵活、开放的壁垒,自然而然,就带来了更高的“高时效”。 深入其中,这包含4个维度的技术: 一是在工程架构层面,设计并实现“并行”处理框架,将整段视频或时间线Timeline先分片Split,做“并行”处理后再进行“合并”,这项技术适合“中长视频”或输入为“多个素材”的场景; 二是针对“单片”任务进行“性能优化”,包括算法优化、指令集优化、算法在引擎层的工程优化、pipeline优化以及算法和调度的联合优化等,使得任务在考虑源文件适配、任务参数特性、机型及配置、资源水位等多维度情况下实现最优执行; 三是在“分布式服务层”优化媒体业务流的编排,让流程的Activities在更广的范围内自由连接,如:边录边转、边播边转等,这可以让不同的产品和服务通过同一流程串联起来,从而实现跨场景甚至跨产品的流程提速; 四是“AI能力”的加持,无论是在算法层、引擎层还是在分布式的服务层,在处理规模化视频时,可以将AI带来的优势极致发挥,实现“高时效”的进一步提升。 如果一切都在无限解决媒体服务的“高时效”,那“高质量”的完美实现,在当下可以更多的利用AI能力。 AI:日新月异的“加速力” 还追得上AI的迭代和AIGC的演进吗? 大模型和AIGC技术的发展,可以用“日新月异”来形容,其迭代速度史无前例,涌现出的各类垂直应用模型,也使得音视频行业的应用场景更加广泛和多样化。 更重要的是,大模型以及AIGC可以运用更大量的数据、更复杂的算法、以及更强力的算力支撑,大大提高音视频处理的精度和效果,带来无限想象。 在这场AIGC风暴之前,我们的媒体服务已先行布局,让AI能力可以灵活参与视频的各种智能化场景,将AI的迭代和AIGC的演进,纳入智能化的“顶层设计”。 针对AIGC的演进(以内容创作领域为例),从序曲开始,我们设定了五个阶段: ➤ 第一阶段(序曲):AI负责素材的预处理,并按预设模版进行编排,实现视频全智能生产的第一个阶段。 ➤ 第二阶段:在素材预处理之上,还能完成本属于视频创意环节的编排工作(脚本设计/Timeline设计),从而实现智能批量混剪。 ➤ 第三阶段:面向特定场景和特定要求的成品,由AI根据已有成片反向解构分镜头,负责素材的搜索、筛选(以及部分素材生成)、处理、编排,并最终制作合成。 ➤ 第四阶段:面向特定场景,AI负责理解场景的要求,包括素材的搜索、筛选(以及部分素材生成)、处理、编排,并最终制作合成。 ➤ 第五阶段:针对多种场景,依据海量丰富的数据,AI能够自行发掘创意点,真正拥有“创作力”。 简扼来说,AI逐步渗透业务,从能力到场景,先单例后普适、先局面再整体、先执行再创意,完成AI从辅助业务到对业务全智能变革的演进。 可以看出,从前的AI只是辅助创作,而今天的AI已然可以成为创作的主角。 再往前看,无论元宇宙还是Web3.0,下一代互联网的繁荣需要海量的数字内容,对内容的数量、形式和交互性都提出了更高的要求。 举例来说,很多基于大模型的图像增强、实景抠图等技术,在效果上已优于传统AI算法;再比如,运用Text to Video(文本转化为视频)生成几秒空镜头、Image to Video(图像转化为视频)生成一段连续动作的视频,不仅能解决高质量的问题,还能实现“无中生有”的突破之作。 未来,运用AIGC的能力,智能媒体服务在生产制作领域,可以极大提升“一键成片”的效果,在智能生成、时间线的智能编排,以及智能剪辑和包装等各环节,都将逐一击破生产制作的效率、质量痛点;在媒资领域,也能运用AIGC生成视频摘要等,为媒资管理提供更多新能量。当然,全方位的探索都在进行中。 大模型时代的AIGC,期待不止。 7月28日下午 LiveVideoStackCon2023上海站 阿里云视频云专场 阿里云智能资深技术专家 《从规模化到全智能:媒体服务的重组与进化》 一起探索媒体服务的创新“顶设”!

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

vivo 游戏中心低代码平台的提秘诀

作者:vivo 互联网服务器团队- Chen Wenyang 本文根据陈文洋老师在“2022 vivo开发者大会"现场演讲内容整理而成。公众号回复【2022 VDC】获取互联网技术分会场议题相关资料。 在互联网流量见顶和用户需求分层的背景下,如何快速迭代产品功能,满足用户需求成为了开发首要面对的问题。游戏中心低代码平台从产品定位入手,以组件化方式搭建用户端页面,快速支撑产品需求,提升了研发效率,缩短了项目周期。本文首先介绍背景与痛点,然后阐述了游戏中心是如何搭建低代码平台,最后展示了低代码平台带来的收益和未来建设方向。 一、背景介绍与痛点分析 vivo游戏是vivo用户玩游戏的平台,其主要产品形态是vivo游戏中心以及vivo游戏内置悬浮球,它为用户提供了找游戏,玩好游戏,找人一起玩游戏的价值。vivo游戏中心是vivo游戏的核心流量入口,因此游戏中心首页就承担了非常重要的角色。首页的风格延续了好几年,基础样式几乎没有什么变化,强调分发。随着时间的发展,各种问题就慢慢突显出来了。 1.从2020年开始,互联网流量见顶,分发提升困难,需要探索新方向,而应对新需求的时候研发周期过长。从需求评审到功能上线,灰度到全量,需要耗时一个月以上,运营效果往往低于预期。 2.核心用户的关注点不同。MOBA玩家看画面和平衡,传奇玩家看游戏人数,消消乐玩家看玩法,且用户对游戏福利活动的需求也是非常强烈。首页列表中,重点信息无法突出,也无法给用户带来强烈的下载冲动。 3.任何一个游戏都是有生命周期的。在不同的阶段,突出的重点是不一样的。预约的时候可能突出这个游戏的画风和画质,重点更新的时候可能突出的是新玩法。游戏中心首页没有相关的位置或者手段来突出这些信息。 4.无法快速响应运营或者开发者诉求。如果运营需要更换首页跳转的二级落地页,或者响应开发者诉求搭建一个特殊专区的时候,都是需要开发的,现有功能无法快速支撑。 这几个问题是表层的问题,透过现象看本质,我们可以归纳出,游戏中心缺少了两项基础能力。一方面,游戏中心缺少灵活多样,且能动态调整的组件化能力;另一方面,游戏中心缺少可视化,快速搭建页面的能力。基于以上痛点,结合行业前沿知识,笔者所在团队商量决定,利用低代码思想,打破原有秩序,重新搭建新平台。 二、如何建设游戏中心低代码平台 大家可能会好奇,低代码平台一般都是通用性比较强的平台,怎么能和业务属性如此鲜明的游戏中心结合呢?那接下来笔者为大家一一道来。 低代码平台离不开组件化设计,那什么是组件化设计呢?组件化设计是指针对相同或者不同功能,性能,规格的产品,进行功能分析,设计出一系列的功能组件。通过组件的多样选择将产品客制化,以满足不同的市场需求。由此可以推出,游戏中心组件化设计就是针对游戏中心进行功能分析,设计出一系列功能组件,通过组件的多样化选择,快速搭建出不同的页面,以满足不同用户的需求。 那么,我们是怎么来定义游戏中心的组件呢? 在原有系统的基础上,结合游戏中心app各个位置的形态以及未来定位,把游戏中心首页按照横向划分,每一行细化为一个组件。虽然大家可能不太了解游戏中心,但是对于市面上大部分分发类的产品来说,它们每个页面里面的UI样式是系列化的,比如视频样式,图片样式等,变化比较多的是内容,所以我们可以以行来定义组件。另一方面,组件粒度的粗细,和组件的灵活性成反向关系,但是和运营的配置能力成正向关系,即组件粒度越细,越基础,那么组件的灵活度就越高,运营的配置配置成本也越高。所以,选择什么粒度的基础组件,是需要结合实际业务需求,综合分析后确定的。不是粒度越细越好,也不是粒度越粗越好。 确定好组件的粒度后,我们通过一个例子来详解拆分一下组件的构成。大家请看图1,这是一个专题组件。其形式为左上是标题,右上是跳转二级页的按钮,多个游戏横向并列成一行,最下面是安装按钮。将这种组合形式抽象为一个多游戏并列(1*4)展示的基础模板,基础模板同时也叫元组件,那么就可以把这类基础模板命名为专题元组件。运营希望该元组件可以配置标题,跳转链接,行数和展示游戏个数。这些是静态的基础配置。同时,专题组件需要配置一个数据源,这个数据源决定专题里面游戏的内容和展示顺序,这个数据可以是运营配置的或者实时推荐的。例如,在推荐场景下,用户发起请求的时候,可以由推荐实时返回,那么这就是动态数据。Banner同理。因此可以认为:组件是由元组件和数据构成的。 图1 那么元组件是怎么定义的呢?在后台,我们可以新增一个元组件,填写完卡片编号名称描述等信息后,再上传图片保存。这里的元组件卡片编号作为该组件的唯一标识,是有相应的业务含义,由该编号确定当前组件展示数据的格式,即通过编号确定处理数据的流程类。上传图片主要方面运营配置页面。因为在页面搭建过程中,运营配置多个组件的时候,后台会实时显现客户端的效果。展示的组件图片就是在此处上传的。 图2 配置完元组件的基础信息后,在元组件配置管理的左边,如图3,通过编辑schema,右边就会出现当前元组件能够配置的标题,跳转链接,行数以及单行游戏的个数。这些配置是运营在配置组件的时候可以动态配置的;配置完这些数据后,在页面管理后台,添加该类组件的时候,红框中出现的就是我们能够配置的基础属性了,如图4。到这一步,元组件的配置就完成了。 图3 图4 接下来就是数据源的配置。在运营点击数据选择的时候(图5),弹出的就是动态数据的配置,那这些数据是怎么来的呢? 我们需要从两个维度来看数据:第一个,数据有哪些;第二个,数据怎么交互。我们从两个角度来看数据有哪些。从数据类型角度划分,有运营配置数据和系统自动数据。运营配置数据为运营人员为了达到某一个目的而手动配置或者干预的数据,而系统自动数据为从系统某一个源自动获取的数据,不需要人工介入。从数据来源划分,有内部数据和外部数据。通过不同的数据类型和来源,我们切分为不同的调用方式,这样能最大限度地保证系统的扩展性和维护性。 随着业务的发展,平台会不断吸取其他业务数据,来丰富当前业务的形态,但是获取外部数据的方式只有两种:http和dubbo协议。通过这两个协议的配合,能够标准化获取外部数据。我们说完了元组件和数据,那么他们是怎么绑定的呢?在后台数据管理中,我们会按照某个运营目的,来确定一个组件的应用场景,比如专题组件的应用场景就是为用户推荐某一类型的游戏集合。通过定义组件的应用场景,我们把元组件和数据绑定在一起。 整体过程如下: 确定组件的应用场景名和编号; 选择一个或者多个元组件; 确定数据源类型,调用类型和数据业务方; 确定调用的http和dubbo接口。通过http接口,可以生成运营能够配置的数据,即点击选择后弹出的列表,点击选择后,即可将数据绑定到组件上,如图5;在用户调用流程中,通过dubbo接口,利用后台配置的数据,可以请求获取到更加详细的数据。 此时一个组件就配置完成了。 图5 在前台数据的调用方式中,使用了阿里的QLExpress。QLExpress由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。它的特性优势和运行原理可以在GitHub上找到,在此不赘述,感兴趣的同学可以自行搜索。利用其弱类型脚本的特性,将运营配置的数据转换成调用外部接口的参数,通过dubbo泛化调用技术,获取到具体的数据。同时,还是利用弱类型脚本的特性,转换返回结果,控制业务逻辑和数据范围。采用QLExpress和dubbo泛化调用的方式,可以减少代码开发,增加数据灵活性。 最后,来了解一下整个页面的配置过程。前面讲述到,元组件是最基础的组件,通过元组件,我们配置一些基础信息,并关联一些动态数据,构成了一个组件。通过把多个组件拖拽到页面上,就可以实现运营配置生成页面的效果。同时,页面也可以直接拖拽已经配置好的组件,这就是一个组件被多个页面引用的情况,实现了组件级的复用。在页面之上,我们还引入了方案的概念。方案,即多个页面的集合。通过页面的组合,首页可以实现多个页面的展示,既能展示游戏中心的门户,又能个性化运营。 如图6,从下到上,通过数据和元组件,可以构成一个组件,通过多个组件的选择,可以构成一个页面,多个页面构成一个方案。如图7,从上到下,通过多层实验框架,确定需要展示给用户的方案。接下来,通过dmp用户画像,确定展示个性化的页面。每一个页面都是由若干个组件构成的。每个组件是由元组件和数据构成。 图6 图7 三、成果展示 罗马不是一天建成的,游戏中心低代码平台也不是一蹴而就的。平台20年就上线了,由于缺少运营场景,功能也不是很完善,能够带来的效益微乎其微,甚至内部也产生过质疑,是不是不值得花这么多的时间精力建设平台,但经过时间的沉淀,游戏中心低代码平台的效果愈发明显。 首先,研发流程和原先不一样了。当我们在新增/修改组件的时候,客户端同学通过flutter等动态化技术,完成新组件的开发修改,并且在后台上传flutter的更新包或者差分包。 服务器同学需要在后台配置元组件的信息,配置组件应用场景,绑定元组件和数据关系,就可以生成运营可以配置的组件。运营配置完组件,页面,方案,点检完毕审核通过后就可以上线了,如图8。 图8 其次,研发效率提升了。大家注意到,最大的一个变化是,客户端不需要发版了。在一些特殊场景下,服务器也不需要开发。对比原先的研发流程,效率发生了质的飞越。针对不同的角色,提升的效率是不一样的;对于客户端来说功能全量上线周期可缩短15天以上,有较高的容错性,对于服务器来说,开发效率提升4倍以上,对于测试来说,无需回归老版本,测试效率提升30%-50%;对于运营来说,可视化的操作降低30%的学习成本,提升10%的配置效率。 最后,项目周期缩短了。原先如果运营做一个功能,首先得把需求提给产品(其实在提需求之前,还有一个需求讨论的过程,非需求评审),再进行需求评审,评审完毕后需要根据各个需求的优先级进行排序。而此类需求由于效果不明显,且论证数据不好收集,往往其优先等级就比较低。需求评审完毕后,还需要策划评审,概要设计评审等等诸多流程,上线完毕还需要灰度一周,有了上线报告之后才可以全量。但是,有了低代码平台后,流程就没有这么复杂了。最简单的流程,无需更改组件,运营自己就能操作。还有一些简单的场景,服务器修改配置就能完成组件的修改。最复杂的就是全新场景,但由于之前的基础在,开发效率也是非常的高。整体流程至少可以缩短为原来的1/4。接下来用一个例子来说明一下。 图9 图10 四、未来展望 游戏中心低代码平台的建设标准,和通常意义上低代码平台的建设存在差异。游戏中心低代码平台由“游戏中心业务”衍生,慢慢演变到可以适配vivo生态内分发类app的终端解决方案。这符合我们的业务发展,也为低代码的演变提供了养分。通过不断的适配和演变,我们希望能够将低代码的解决方案普惠安卓生态。因此,在未来的建设思路上,我们的目标是能够解放生产力,提升用户体验,做最好用的安卓低代码平台。 五、总结 低代码的概念最近很火,争议也很大。有人认为以后“人人都是程序员”,也有人认为是新瓶装旧酒。但作为技术人,最重要的还是通过技术解决业务问题,驱动业务发展。游戏中心低代码平台旨在提高开发效率,帮助业务取得更好的结果。未来,我们也会投入更多的精力优化系统,不断为用户创造惊喜,为行业带来革新。 END 猜你喜欢 异构混排在vivo互联网的技术实践 云原生时代数据库运维体系演进 vivo 云原生容器探索和落地实践 分支路径图调度框架在 vivo 效果广告业务的落地实践 本文分享自微信公众号 - vivo互联网技术(vivoVMIC)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

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

用户登录
用户注册