开源云真机平台Sonic(Windows端)接入iOS设备实践

背景

在前面的文章中,我分享了《开源云真机平台-Sonic应用实践》、《开源云真机平台Sonic跨版本升级实践》。目前sonic版本已经升级到了最新的2.0.5,但我接入的都是些Android设备,iOS设备之前也尝试过接入,但没有成功,因为我用的是CentOS系统。这两天又用Windows系统重新试了一下,终于成功接入了。下面简单分享一下实践过程以及其中的一些注意事项。

一、准备工作&注意事项

  1. Agent必须部署在Mac/Ubuntu/Windows系统,CentOS系统不支持接入iOS设备(这也是我之前一直尝试失败的原因);
  2. 必须得有一台Mac系统的电脑,且Mac电脑中安装了Xcode,因为前期要构建WebDriverAgent包到iOS设备中,后面可以脱离Mac使用;
  3. 必须得有个苹果开发者账号,且当前iOS设备的UDID已添加到此开发者账号下,这样才能构建WDA(WebDriverAgent);
  4. 如果iOS设备准备接入在Windows或Ubuntu系统的Agent上,需要安装:
  • usbmux:这个服务主要用于在USB协议上实现多路TCP连接,将USB通信抽象为TCP通信。苹果的iTunes、Xcode,都直接或间接地用到了这个服务。所以Windows上可以通过直接安装iTunes来解决,Ubuntu需要单独安装;
  • sib:即sonic-ios-bridge,sonic与iOS设备之间的通信桥梁,类似于ADB(Android Debug Bridge)。当然安装淘宝开源的tidevice也就可以,方便查看设备状态以及调试;

二、Mac端工作

有了以上条件,我们就可以执行iOS接入Sonic的相关工作了。接入过程主要分为以下步骤:

  1. 克隆WebDriverAgent项目到Mac电脑;
  2. 在Xcode中打开克隆的WebDriverAgent项目,并修改相关信息(后面会具体提到);
  3. 构建WebDriverAgent包到iOS设备;

1.克隆项目

git clone https://github.com/appium/WebDriverAgent 
或 
git clone https://github.com/SonicCloudOrg/sonic-ios-wda.git

2.修改WebDriverAgent相关信息

在Mac电脑的Xcode中打开克隆的WebDriverAgent项目,按照如下修改:

① 修改WebDriverAgentLib

Team选择你自己的或者公司的开发者账号,Bundle Identifier改成你自己的名字,不要用原来的,名字任意,例如:com.appium8888.WebDriverAgentLib

② 修改WebDriverAgentRunner

Team仍然选择你自己的或者公司的开发者账号,Bundle Identifier改成你自己的名字,与前面一步修改的保持一致,例如:com.appium8888.WebDriverAgentRunner

③ 选择要构建的包以及iOS设备

记住,一定选的是WebDriverAgentRunner,而不是IntegrationAPP或其他!

我一开始就是默认选了IntegrationAPP导致后面能连接上Server,前台也能看到手机,但是使用不了,一直卡在准备图像中。此时Agent控制台能看到一句提示“com.dagangtest.WebDriverAgentRunner.xctrunner is not in your device!”,如果有这句报错提示,就表明你在选择构建包的时候选择错了!接入Mac再重新选择WebDriverAgentRunner打包构建即可。

④ 构建

顶部Product--Build,成功的话Xcode会提示Build Successed!

⑤ 运行测试

顶部Product--Test,首次运行的话可能会失败,需要在手机上弹出的提示框中点击“信任”设备,再次运行即可。运行成功的话,Xcode会自动将WebDriverAgentRunner包打进iOS设备:

手机上会出现WebDriverAgentRunner APP以及“Automation Running”的浮动水印提示。

三、Windows(Agent端)工作

我之前就是用CentOS端的Agent来接入iOS设备,所以屡屡碰壁。如果你也有这个想法,劝你尽早放弃!我现在已转投Windows怀抱来接入iOS。不过也不用那么悲观,一个Server可以连接多个Agent,CentOS端的Agent用来接入Android设备是完全没问题的。

所以特此声明:以下演示均以Windows为案例,Ubuntu系统未具体尝试,仅提供部分参考思路。

上面打包好WebDriverAgentRunner到iOS手机后,iOS就可以脱离Mac运行,在Windows以及Ubuntu系统上也可以丝滑地开展自动化测试了!Windows/Ubuntu端工作主要分为以下步骤:

  1. 安装iTunes;
  2. 安装sib工具;
  3. Agent配置:修改Agent配置文件,填写WebDriverAgent的bundle-id(包名),插上iOS设备,重启Agent容器;
  4. 检查前台页面是否成功显示以及能否正常使用;

1.安装iTunes

安装iTunes的目的主要是为了安装usbmux以及相关的依赖环境,前面已经提到usbmux这个服务主要用于在USB协议上实现多路TCP连接,将USB通信抽象为TCP通信。苹果的iTunes、Xcode,都直接或间接地用到了这个服务。所以Windows上可以通过直接安装iTunes来解决(通过爱思助手之类的应该也可以),Ubuntu需要单独安装usbmux;

连接手机打开iTunes

首次连接,在手机的提示框中选择信任设备,随后即可连接成功:

2.安装Sib

sib和tidevice两个安装任意一个即可。sib安装比较简单,直接从官网下载下来解压即可,如果想要全局运行就配置个环境变量。

项目地址:https://github.com/SonicCloudOrg/sonic-ios-bridge

下载下来,解压后得到如下文件:

cmd命令行,进入sib.exe所在文件夹,执行以下命令,即可查看当前电脑连接的iOS设备,设备若在线,显示为online。

c:\sonic-ios-bridge>sib devices
00008020-000E74E622BA002E online

3.Agent配置

修改Agent配置文件

主要是修改iOS模块的wda-bundle-id,改为前面在Xcode中修改后的名称,例如:com.appium8888.WebDriverAgentRunner

sonic:
  agent:
    # 替换为部署Agent机器的ipv4
    host: 192.168.1.188
    # 替换为Agent服务的端口,可以自行更改
    port: 7777
    # 替换为前端新增Agent生成的key
    key: 774ed0c0-b8d6-4bcb-8a68-36bb67d51691
  server:
    # 改成server的SONIC_SERVER_HOST
    host: 192.168.1.20
    # 改成server的SONIC_SERVER_PORT
    port: 3000

modules:
  android:
    # 是否开启安卓模块
    enable: true
    # 是否开启sonic-android-supply远程adb调试功能
    use-sas: true
  ios:
    # 如果不需要连接iOS设备,请将true改为false。开启的windows用户请确保本机已安装iTunes
    enable: true
    # 替换为你自己使用的wda的bundleId,如果没有.xctrunner后缀会自动补全,建议使用公司的开发者证书
    wda-bundle-id: com.dagangtest.WebDriverAgentRunner
  sgm:
    # 是否开启sonic-go-mitmproxy网络抓包功能
    enable: true

重启Agent

windows用户,要先在控制台输入 chcp 65001 并回车,再输入以下指令:

java -Dfile.encoding=utf-8 -jar sonic-agent-windows-x86_64.jar

4.前台访问使用

可以看到,两台iOS设备:iPhone XR和iPhone 7已经接入成功:

分别使用两台设备,操作正常

四、iOS使用过程中的一些问题

尽管sonic已经成功接入了iOS设备,但在使用过程中,还是存在诸多问题,远没有Android设备体验流畅。

1.连接超时、拖拽反应过慢

有时候点击事件正常,但拖拽事件会卡半天,然后突然反应过来、把之前积压的事件全部执行了一遍。不知道是不是连接超时的问题。

2.设备连接异常

忘记当时是怎么操作的了

3.无法进入使用页面,设备被占用

点击“马上使用”,打开了一个新标签页,随后该标签页立马消失,但列表中该设备处于被占用状态,导致无法再进入使用页。只能重启Agent或是重新插拔设备。在Android设备上也遇到过,退出使用界面,刷新后,设备仍处于被占用,能不能加一个“强制关闭”按钮操作呢?

4.初始化时间略长

每次退出再进入设备,都要初始化一遍,初始化时间略长,不知道这个能不能优化一下。

附:

1.Ubuntu(Agent端)解决方法

Ubuntu系统因资源限制,未具体尝试,仅提供部分参考思路。

Ubuntu也是属于Linux系统的一种,我当时是用CentOS试的,出现过下列问题,试了很多种方法,始终没有连成功,最终放弃了。但我看过一些帖子,据说Ubuntu按照以下方法解决后是可以连接成功的

宿主机安装sib

Ubuntu系统的Agent一般是用docker方式部署的,docker容器中是有sib工具的,但在宿主机上也要安装sonic-ios-bridge

下载后解压,进入sib所在目录,执行sib,即可查看相关帮助命令:

宿主机安装usbmuxd、挂载iOS设备

若Agent容器所在的宿主机连接iOS设备后,没有挂载上,执行sib devices命令,可能会出现如下提示:

2.tidevice安装方法

tidevice相比sib安装起来确实麻烦一些,首先要确保当前系统已安装Python3环境,然后才能安装tidevice。目前 tidevice 库仅支持安装在 python3.7及以上版本中

pip3 install -U "tidevice[openssl]"

安装过程中可能会出现如下报错:

通过上图可以看出,是因为tidevice在安装过程中,安装一个名为cryptography的包时,报错了,cryptography编译失败,因为系统中缺少pep517。

安装pep517

pip install pep517

再次安装cryptography

pip install cryptography

但是还是报错上述同样错误,系统提示pip版本过低。于是升级pip。

升级pip

pip3 install -U pip

pip升级到22.3.1

安装cryptography

再次安装cryptography,安装成功

安装tidevice

再次执行pip3 install -U "tidevice[openssl]" 安装tidevice,安装成功

查看tidevice版本:

[root@sonic bin]# tidevice version
tidevice version 0.9.12

tidevice查看设备列表

tidevice list

总结

以上就是Windows端Agent接入iOS设备的全过程,提供了Ubuntu系统接入过程中出现问题的参考解决方案,以及tidevice的安装方法。下面作个简单总结:

连接iOS设备的前提

关键步骤

  1. 克隆WebDriverAgent项目到Mac电脑;
  2. 在Xcode中打开克隆的WebDriverAgent项目,并修改相关信息;
  3. 构建WebDriverAgent包到iOS设备;
  4. Windows安装iTunes;
  5. Windows安装sib工具;
  6. Windows端Agent配置:修改Agent配置文件,填写WebDriverAgent的bundle-id(包名),插上iOS设备,重启Agent容器;
  7. 前台访问使用;
本文转载于网络 如有侵权请联系删除

相关文章

  • grpc client 源码分析

    grpcclient代码非常简洁,分三步1,获取连接 2,初始化客户端3,发送请求conn,err:=grpc.Dial(address,grpc.WithInsecure(),grpc.WithBlock()) deferconn.Close()复制c:=pb.NewGreeterClient(conn)复制r,err:=c.SayHello(ctx,&pb.HelloRequest{Name:name})复制首先看下发送请求 typeGreeterClientinterface{ //Sendsagreeting SayHello(ctxcontext.Context,in*HelloRequest,opts...grpc.CallOption)(*HelloReply,error) }复制func(c*greeterClient)SayHello(ctxcontext.Context,in*HelloRequest,opts...grpc.CallOption)(*HelloReply,error){ out:=new(HelloReply) err:=c.cc.Invo

  • 使用 Chrome 开发者工具研究一个基于 Angular 开发的网站源代码

    Chrome开发者工具是前端开发工程师工具箱里使用频率最高的工具之一。本文通过一个具体的例子,给大家分享笔者工作中,是如何通过Chrome开发者工具,分析一个网站的实现明细。下图是SAPCommerceCloud(电商云)UI加载默认的SampleData数据集后打开的主页,这是一个电子设备的在线购物店面,基于SAPSpartacus开源项目构建而成。下图这个网站,是乐高成功使用SAPSpartacus开发并上线的在线购物店面(阿联酋地区):大家仅凭视觉效果,能分辨出这两个网站,实际上都是基于同一个UI框架开发出来的吗?这也再次体现了SAPCommerceCloudUI无头电商,即HeadlessCommerce的架构。前端电商店面,同SAPCommerceCloud后台核心功能完全解耦,二者通过API交互。这样,购买了SAPCommerceCloud的客户,使用CommerceCloud提供的OCCAPI和开源的SAPSpartacus框架,可以通过二次开发的方式,构建出外观能够体现企业品牌魅力的独一无二的电商店面。笔者是前端开发人员而不是用户体验工程师,因此没有能力从乐高这个店面外

  • 计算机视觉学术速递[8.23]

    Update!H5支持摘要折叠,体验更佳!点击阅读原文访问arxivdaily.com,涵盖CS|物理|数学|经济|统计|金融|生物|电气领域,更有搜索、收藏等功能!cs.CV方向,今日共计64篇Transformer(3篇)【1】Trans4Trans:EfficientTransformerforTransparentObjectandSemanticSceneSegmentationinReal-WorldNavigationAssistance 标题:Trans4Trans:真实导航辅助中透明对象和语义场景分割的高效转换器 链接:https://arxiv.org/abs/2108.09174 作者:JiamingZhang,KailunYang,AngelaConstantinescu,KunyuPeng,KarinMüller,RainerStiefelhagen 机构:"Obstacle",Trans,Trans 备注:ExtendedversionofarXiv:2107.03172 摘要:透明物体,如玻璃墙和门,构成阻碍视力低下或失明者行动的建筑障

  • NFL(没有免费的午餐)定理

    NLF讲的是在不考虑具体问题的情况下,没有任何一个算法比另一个算法更优,甚至没有胡乱猜测更好。不存在一个与具体应用无关的,普遍适用的“最优分类器”学习算法必须要作出一个与问题领域有关的“假设”,分类器必须与问题域相适应。但是,NFL定理的前提是,所有问题出现的机会相等、或所有问题都是同等重要。但是现实中,我们往往会得到特定的数据,特定的分布,解决特定的问题,所以我们只需要解决自己关注的问题,而不需要考虑这个模型是否很好的解决其他的问题。只有对于特定的问题,我们比较不同模型的才有意义。不仅是机器学习,我们在做其他算法的时候也是这样,如果不考虑实际解决的问题,很难说算法的优劣。比如:d =训练集合;m =训练集合中的元素个数;f =目标的输入输出关系;h =假设算法f的输入参数为d,结果为hC =针对f,h的离线训练损失函数如果以下面的参数来衡量,所有的算法都是相同的:E(C|d),E(C|m),E(C|f,d),orE(C|f,m).结论:我们比较两种算法A与B:1.对于所有的问题,A并不总是优于B2.对于所有的问题,特定算法并不总是比随机算法好。如下图:NFL定理最重要的寓意,是让我们

  • 线性回归中的L1与L2正则化

    在这篇文章中,我将介绍一个与回归相关的常见技术面试问题,我自己也经常会提到这个问题:描述回归建模中的L1和L2正则化方法。在处理复杂数据时,我们往往会创建复杂的模型。太复杂并不总是好的。过于复杂的模型就是我们所说的“过拟合”,它们在训练数据上表现很好,但在看不见的测试数据上却表现不佳。有一种方法可以对损失函数的过拟合进行调整,那就是惩罚。通过惩罚或“正则化”损失函数中的大系数,我们使一些(或所有)系数变小,从而使模型对数据中的噪声不敏感。在回归中使用的两种流行的正则化形式是L1又名Lasso回归,和L2又名Ridge回归。在线性回归中我们使用普通最小二乘(OLS)是用于拟合数据的:我们对残差(实际值与预测值之间的差异)进行平方,以得到均方误差(MSE)。最小的平方误差,或最小的平方,是最适合的模型。让我们来看看简单线性回归的成本函数:对于多元线性回归,成本函数应该是这样的,其中?是预测因子或变量的数量。 因此,随着预测器(?)数量的增加,模型的复杂性也会增加。为了缓解这种情况,我们在这个成本函数中添加了一些惩罚形式。这将降低模型的复杂性,有助于防止过拟合,可能消除变量,甚至减少数据中

  • C++中atan()与atan2()的区别和用法

    参考链接:C++atan2()区别 atan(x)函数接收一个参数。参数类型可参考下列函数声明。 doubleatan(doublex);floatatan(floatx);longdoubleatan(longdoublex);doubleatan(Tx);      //additionaloverloadsforintegraltypes若有一个坐标A(a,b),则函数参数x=b/a。atan(x)函数返回以弧度为单位的角度,范围为[-pi/2,+pi/2],注意是包含-pi/2和+pi/2的。该角度为A点和原点的连线与X轴正方向之间的夹角。上方夹角为正,下方夹角为负。由此可以看出,atan()函数只能区分一象限和四象限的点。取一象限和三象限任意一点Ai(ai,bi)计算x=bi/ai,x均为正值。对于二象限和四象限则均为负值。atan参考atan2(y,x)函数接收两个参数,即一个坐标值。参数类型可参考下列函数声明。 doubleatan2(doubley   ,doublex);floatatan2(floaty   ,floatx);longdoubleatan2(long

  • OpenGL ES 之uniform和varying

    老孟一个有态度的程序员uniformuniform是GLSL中变量类型的限定符,使用uniform限定的变量是只读值,在Shader中无法更改,只能通过应用程序传递给uniform。uniform变量为全局共享变量,可以在所有的Shader中可以获取,uniform定义如下:uniformfloatuTexPos;复制uniform变量通常是存储在GPU的”常量区”,这一区域的内存是有限的,因此uniform有个数限制,但比attribute要多很多,OpenGL标准化组织规定OpenGLES2.0规定至少支持128个顶点uniform和16个片段(Fragment)uniform。获取支持的顶点uniform最大个数代码如下:fungetMaxVertexUniformNum():Int{ varcount=IntArray(1) GLES20.glGetIntegerv(GLES20.GL_MAX_VERTEX_UNIFORM_VECTORS,count,0) returncount[0] }复制获取支持的片段uniform最大个数代码如下:fungetMaxFragmentUni

  • TensorFlow第一 && PyTorch第二,就问你服不服!

    仅仅一年时间,PyTorch在学术圈中地位飙升,论文提及数量猛增194%,从第2018年第4位升至2019年第2位!而Keras则排名第三。Caffe不增反降,排名第四。不过在企业当中,Keras仍力压PyTorch。一年不算短,但也不算长。一年时间,可以让Swift从11位跌倒13位,也可以让PyTorch从第4位飙升194%至第2位!PyTorch狂涨194%,逼近TensorFlow份额UC伯克利RISELab的在读博士CarolineLemieux,分享了他们团队收集的深度学习框架和数据科学库使用情况的统计数据。OReillyMedia的首席数据科学家BenLorica根据RISELab团队的数据,做了一张图:图中可以看到,TOP3框架在过去一年中均有增长。表现最为亮眼的PyTorch在过去的一年里增速高达194%,成功超越Keras和Caffe,直逼第一名TensorFlow。当了多年老大的TensorFlow只有23%的增长,低于第三名Keras的26%。而第四名Caffe不增反降,跌了29%。除了份额外,从上图中的增长曲线还可以看出,PyTorch从去年开始发力,在今年

  • ​GAN的五大有趣应用

    编译|小韩来源|analyticsvidhya.com引言你能看出这张照片中面部的共同点吗?这些人都不是真实存在的!这些面部图像都是由GAN技术生成的。“GAN”这个词是由IanGoodfellow在2014年提出的,但相关概念早在1990年就存在了(JürgenSchmidhuber开创),在Goodfellow发出这个方向的论文之后才开始普及。从那以后,GAN就一直不断发展!实际上,GAN无处不在。数据科学家和深度学习研究者使用这项技术来生成逼真的图像,改变面部表情,创建游戏场景,可视化设计,甚至生成令人惊叹的艺术作品!最近有关AI生成艺术作品的新闻就是GAN的成果:在本文中,我们将介绍五个流行且有趣的GAN应用。你可能遇到过其中一些但没有注意到它们是如何工作的。另外提供了每个GAN应用的链接,可以查看研究一下。GAN介绍GAN的应用图像编辑安全相关生成数据注意力预测3D对象生成总结GAN介绍我们了解了GAN可以做些什么。但它们是怎样运行的?这个强大的算法下面发生了什么?用一个流行的例子来理解这一点。有一个伪造者(创造假艺术品)和一个负责检测这些假艺术品的检查者。这个伪造者的任务模

  • 10 个不可不知的 Python 图像处理工具 !

    源/Python宝典&小象这些Python库提供了一种简单直观的方法来转换图像并理解底层数据。今天的世界充满了数据,图像是这些数据的重要组成部分。但是,在使用它们之前,必须对这些数字图像进行处理-分析和操作,以提高其质量或提取一些可以使用的信息。常见的图像处理任务包括显示;基本操作如裁剪,翻转,旋转等;;图像分割,分类和特征提取;图像恢复;图像识别。Python是这些图像处理任务的绝佳选择,因为它作为一种科学编程语言日益普及,并且在其生态系统中免费提供许多最先进的图像处理工具。本文着眼于10个最常用的Python库,用于图像处理任务。这些库提供了一种简单直观的方法来转换图像并理解底层数据。1.scikit-imagescikit-image是一个与NumPy数组一起使用的开源Python包。它实现了用于研究,教育和行业应用的算法和实用程序。它是一个相当简单直接的库,即使对那些不熟悉Python生态系统的人也是如此。代码质量高,经过同行评审,由一个活跃的志愿者社区编写。资源scikit-image文档丰富,有很多示例和实际使用方法。用法该包通过skimage导入,大多数功能可以在

  • 四大组件的启动过程

    1.Activity启动过程 http://blog.csdn.net/lxj1137800599/article/details/536442592.Service启动过程 http://blog.csdn.net/lxj1137800599/article/details/536963093.BroadcastReceiver启动过程 http://blog.csdn.net/lxj1137800599/article/details/537037534.ContentProvider的工作过程 http://blog.csdn.net/mockingbirds/article/details/53239265#t6四大组件启动过程中一直提到的H,现在我把部分代码贴出来privateclassHextendsHandler{ publicstaticfinalintLAUNCH_ACTIVITY=100; publicstaticfinalintPAUSE_ACTIVITY=101; publicstaticfinalintPAUSE_ACTIVITY_FINISHING=102;

  • SpingMvc复杂参数传收总结

    点击上方“java从心”,设为星标每天进步一丢丢,连接梦与想上一篇文章[javaWeb传收参数方式总结]总结了简单传收参数,这一篇讲如何传收复杂参数,比如Long[]、User(bean里面包含List)、User[]、List<User>、List<Map<String,Object>等几种复杂参数。一.简单数组集合类比如Long[],String[],List<User>等前端:1.重复单个参数//(1)普通URLGET http://localhost:8080/ajaxGet?id=1&id=2&id=3复制//(2)Ajaxget方式发送请求时等于(1)方式 $.ajax({ type:"GET", url:"http://localhost:8080/ajaxGet?id=1&id=2&id=3" });复制//(3)Form表单GET方式发送请求时等于(1)方式 <formid="fromGet"action="fromGe

  • 一个有用的PHP片段的集合

    一个有用的PHP片段的集合,你可以在30秒或更短的时间内理解。TableofContentsArrayViewcontents*[`all`](#all)*[`any`](#any)*[`chunk`](#chunk)*[`deepFlatten`](#deepflatten)*[`drop`](#drop)*[`findLast`](#findlast)*[`findLastIndex`](#findlastindex)*[`flatten`](#flatten)*[`groupBy`](#groupby)*[`hasDuplicates`](#hasduplicates)*[`head`](#head)*[`last`](#last)*[`pluck`](#pluck)*[`pull`](#pull)*[`reject`](#reject)*[`remove`](#remove)*[`tail`](#tail)*[`take`](#take)*[`without`](#without)MathViewcontents*[`average`](#average)*[`factoria

  • python pandas.read_csv参数整理,读取txt,csv文件

    pandas.read_csv参数整理读取CSV(逗号分割)文件到DataFrame也支持文件的部分导入和选择迭代更多帮助参见:http://pandas.pydata.org/pandas-docs/stable/io.html参数:filepath_or_buffer :str,pathlib。str,pathlib.Path,py._path.local.LocalPathoranyobjectwitharead()method(suchasafilehandleorStringIO)可以是URL,可用URL类型包括:http,ftp,s3和文件。对于多文件正在准备中本地文件读取实例:://localhost/path/to/table.csvsep :str,default‘,’指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:'\r\t'delimiter :str,default None定界符,备选分隔符(如果指定该参数,则sep参数失效)del

  • 腾讯云腾讯云企业网盘常见问题

    如何购买企业网盘?您可访问企业网盘购买页直接选购企业网盘。详情请参见购买方式。企业网盘如何收费?企业网盘计费项均为预付费,计费项说明和定价如下。计费项说明售卖单价用户license费用指使用企业网盘的用户数量,用户license费用按照用户数量和使用时长进行计算。12元/人/月存储容量费用指云盘的存储空间,存储容量费用按照存储容量和存储时长进行计算。0.25元/GB/月流量费用指外网下行流量,用于抵扣超出免费额度部分的流量,以资源包的形式售卖。0.8元/GB流量如何收费?企业网盘针对超出免费额度外的外网下行流量进行收费,您可提前购买流量资源包进行抵扣。资源包定价和购买请参见购买指南>资源包说明文档。免费流量额度是多少?免费流量额度=10GB/人/月×license数量×云盘有效期具体说明请参见购买指南>免费额度说明文档。资源包如何退费?在满足退费要求的情况下,您可申请资源包退款,具体请参见购买指南>资源包>资源包退费说明文档。如何登录企业网盘?当您购买企业网盘后,需登录企业网盘控制台网盘管理页面绑定超级管理员手机号,随后可使用该手机号登录企业网盘。企业网盘历史版

  • linux_常用日志过滤命令

    归档2015年在br做运维时常用的命令,主要梳理出日志的过滤操作。 对于日志文本的处理,常用的还是sed、awk,具体如下: 统计ip访问量: catnginx.log|awk'{print$2,$11}'|awk'{++S[$1];V[$1]+=$2}END{for(ainS)printa,S[a],V[a]}'|sort-nrk2|head 222.93.28.2813217115367772663 115.168.84.18613074629782262441 114.221.180.6112660422408007956 61.187.159.1361080394166438896 复制 通过sed正则匹配需要的域 head-n20nginx.log|sed's/\([^]*\).*\(imei\=[^&]*\).*/\1,\2/' 过虑前: 125.126.250.49--[09/Jul/2015:00:00:01+0800]"GET/client/spiritscreen/recommend?version=12.150417&imei=51B5ECC4A7

  • 打开order by的大门,一探究竟《死磕MySQL系列 十二》

    在日常开发工作中,你一定会经常遇到要根据指定字段进行排序的需求。 这时,你的SQL语句类似这样。 select id,phone,code from evt_sms where phone like '13020%' order by id desc limit 10复制 这个SQL的逻辑是十分清晰明了,但其内部的执行原理你知多少。 接下来,本期文章将带你打开orderby的大门一探究竟。 本期所有结论都基于MySQL8.0.26版本 最新文章 字符串可以这样加索引,你知吗?《死磕MySQL系列七》 无法复现的“慢”SQL《死磕MySQL系列八》 什么?还在用delete删除数据《死磕MySQL系列九》 MySQL统计总数就用count(*),别花里胡哨的《死磕MySQL系列十》 文章总目录 一、常见的Extra几个信息 在MySQL中想看一条SQL的性能不仅仅看是否用上了索引,还要看Extra中的内容,以下内容来自官方文档,给你最准确的学习资料。 usi

  • 前端gitLab ci/cd搭建

    目录 一.概念介绍 1.1gitlab-ci&&自动化部署工具的运行机制 1.2自动化部署给我们带来的好处 二.知识预备 2.1gitlab-ci涉及的抽象概念(Runner/PipeLine/Executor/Job) 2.2YML文件的基本语法规则 2.3.gitlab-ci.yml配置的特定关键字 三.CI实战 3.1编写一个gitlab-ci的“helloworld” 四.坑点总结 五.gitlab-ci进阶 5.1YML的片段复用和模块化 5.2gitlab-ci提供的其他配置关键字复制 一.概念介绍 1.1gitlab-ci&&自动化部署工具的运行机制 以gitlab-ci为例: (1)通过在项目根目录下配置.gitlab-ci.yml文件,可以控制ci流程的不同阶段,例如install/检查/编译/部署服务器。gitlab平台会扫描.gitlab-ci.yml文件,并据此处理ci流程 (2)ci流程在每次团队成员push/merge后之后触发。每当你push/merge一次,gitlab-ci都会检查项目下有没有.gitlab

  • Talk about my most-recent job application, Got acknowledgement of Native American programmers of two rounds of Video interviews for over 2 months&#39; time, Chinese f2f interview is a deep question.

    Totoday,Iwannaspeakofmymost-recentjobinterview,theinterviewwaswithaleadingcompanyintheforexinvestmentdomain. Monthsago,Ireceivedaninterviewinvitationfromafamousconsultancycompany,providingJDofaWeChatdeveloperpositioninasoundAmericancompanyintheforexexchangedomain.Iwasonbench(benchmeasnocustomerjobinconsultancycompanies)then,soIjoinedthat,the1stroundwasaTeamsvideocallinterviewwithseveralpeopleasaudience,anAmericandeveloperaskedmequitealotaboutsoftwaredevelopment,includingOOP,OOAD,principles,front

  • 透彻分析和解决一切javaWeb项目乱码问题

    前言 乱码是我们在程序开发中经常碰到且让人头疼的一件事,尤其是我们在做javaweb开发,如果我们没有清楚乱码产生的原理,碰到乱码问题了就容易摸不着头脑,无从下手。 乱码主要出现在两部分,如下: 第一,浏览器通过表单提交到后台,如果表单内容有中文,那么后台收到的数据可能会出现乱码。 第二,后端服务器需要返回给浏览器数据,如果数据中带有中文,那么浏览器上可能会显示乱码。 接下来我们逐一分析乱码产生的原因,以及如何解决乱码问题。 一、后端收到浏览器提交的中文乱码 这里又分为get请求和post请求。 get请求 get请求,请求参数中带有中文,后台接收会出现乱码,原因是tomcat默认编码是“ISO-8859-1”,所以tomcat会使用“ISO-8859-1”对中文进行编码,该编码不支持中文,所以后台接收到就乱码了。解决方式有两种。 param=newString(param.getBytes("ISO-8859-1"),"utf-8"); 复制 修改tomcat编码为"utf-8",不建议使用这种方式。 post请求 post请求,出现乱码的原因同get请求,解决方

  • titlebar 不要有默认内容

    titlebar 不要有默认内容

相关推荐

推荐阅读