月度归档: 2021 年 3 月

BroadcastReceiver 怎么访问 local 变量?

BroadcastReceiver 怎么访问 local 变量?

尝试用 react native 调用 android 代码,基本功能是发送短信,然后读取短信发送报告,成功或者失败

但我在看代码时,对一点非常困惑,安卓在广播context.registerReceiver(new BroadcastReceiver()时,会告知是那条短信发送成功吗?

假设我非常密集的发送了 10 条短信,sendEvent(mReactContext, "sms_onDelivery", "SMS delivered");能传递 sms 的 id 或者 phoneNumber 出来吗? 我尝试直接sendEvent(mReactContext, "sms_onDelivery", phoneNumber + "SMS delivered");说无法读取本地变量,必须全局变量才行

但是全局变量的话每次调用 autoSend,不是立即将 phoneNumber 改写为*新发送的 phoneNumber 吗?

代码源 :https://github.com/briankabiro/react-native-get-sms-

android/blob/f40a861ce85bb54ee0b4bd7241b302e4114a91b9/android/src/main/java/com/react/SmsModule.java#L232

@ReactMethod
    public void autoSend(String phoneNumber, String message, final Callback errorCallback,
                         final Callback successCallback) {

        cb_autoSend_succ = successCallback;
        cb_autoSend_err = errorCallback;

        try {
           // 无关代码,略过

            //---when the SMS has been delivered---
            context.registerReceiver(new BroadcastReceiver() {
                @Override
                public void onReceive(Context arg0, Intent arg1) {
                    switch (getResultCode()) {
                        case Activity.RESULT_OK:
                            sendEvent(mReactContext, "sms_onDelivery", "SMS delivered"); // 这怎么知道发送成功的是哪个短信?能传递 phoneNumber 出来吗?
                            break;
                        case Activity.RESULT_CANCELED:
                            sendEvent(mReactContext, "sms_onDelivery", "SMS not delivered");
                            break;
                    }
                }
            }, new IntentFilter(DELIVERED));  

4 条回复    2021-03-14 22:18:37 +08:00

1 susunus   16 天前 via iPhone 广播监听到短信变化后,contentprovider 读下?
2 MapHacker   16 天前 PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, new Intent(SENT), 0);
这个 new Intent(SENT)可以调用 putExtra 方法存一些数据,可以试试呢 然后在 onReceive 通过 arg1.getExtra 取到对应的值,不知道是否可行
3 gamesover   15 天前 @MapHacker 服! https://stackoverflow.com/a/4640066/2251303 后面有人评论里提到和你一样的办法
还有一个就是 PendingIntent.getBroadcast(context, `0`, new Intent(SENT), 0),第二个参数可以改为任意数字,那么我直接 pass sms 的数据库 id 就可以了
4 gamesover   15 天前 不好意思,继续更正一下,https://stackoverflow.com/a/36408330/2251303 requstcode 无法在接受广播时提取,但是不同的 requstcode 还是有意义的

【IOS学习之常见问题】 关于IOS证书的那点折腾事1-想要知道的事

█ 证书的种类
通常需要从苹果开发者中心下载两种文件安装在电脑上面才可以进行正式开发:
● 一种是Developer/Distribution Certification(开发/发布证书),这个和电脑系统有关,创建后,只能安装两台电脑,第三台电脑就需要从其他系统把证书导过来,再安装。
该证书的生成需要mac电脑的钥匙串访问工具(Keychain Access.app)生成XXX.certSigningRequest请求证书(包含了mac电脑的信息和用户信息),就是CSR文件。然后在开发者中心去申请iOS App Development/App Store and Ad Hoc Certification。
● 一种是Development/Distribution Provisioning Profiles (开发/发布授权文件),这个主要在真机测试、导出ipa文件、上传到appstore时使用。这个才是真正意义上的签名证书(类似android开发中的android.keystore文件)
该证书的生成需要先在Certificates, Identifiers & Profiles 界面中填写好App IDs(区分不同的app应用的id号,唯一的)和 Devices(区分不同的移动设备的UDID号,唯一的,*多只能绑定100台设备)等资料,还有前面的Certification证书,方可生成。
当然如果生成发布正式版本(App Store Distribution Provisioning Profiles)就不需要Devices,因为所有设备都可以用,而其他证书,需要选择Devices,限制了部分设备可以安装该app。

PS 1:由于Xcode 7取消了真机调试签名的验证,因此开发者可以不用创建调试证书

PS 2:设备的UDID可以通过iTunes查看

█ 证书与电脑的关系
一个苹果开发证书*多只能有2个证书,当你创建第三个证书,就会出现问题,比如前面的app的证书就会失效,此外这里说的2个证书,不包括Apple Push Services推送类型的证书。
● 2个证书如果要开发多个项目怎么办?
和android一样,不同的app是通过bundle id来区分的,因此一个证书可以开发多个app,但是不同app的bundle id要不同。
● 多台电脑同时开发多个项目怎么办?
只能通过两个CSR文件创建两个开发/发布证书(cer文件),也就是说,只能安装在两台电脑上面使用,第三台电脑就没有办法通过安装证书来获取开发的资格了。
那么第三台电脑就需要从前面两台电脑上面把cer证书对应的private key(.p12文件)导出(可以参考【相关资料】中的【 5.iOS证书(.p12)和描述文件(.mobileprovision)申请】),需设置密码。后面操作都一样,都是安装 cer或p12文件,再安装pp( Provisioning Profiles)文件。这样就可以实现一个证书在多台电脑上面开发应用。

PS 1:通过拨打开发者运营中心的客服电话了解到,确实*多只能创建2个发布证书

PS 2:采用provisioning profile+P12真机调试的方式不要求开发者知道appleID以及密码,密码一般放在leader那里

█ 发布证书与推送证书
● 每个开发者账号创建的发布证书的证书都是一样,只不过里面包含的CSR文件(包含了mac信息)内容不同。所以申请后的证书只能在该mac电脑上面安装使用。
● 每个开发者账号可以创建的证书个数是受限的(似乎是2个,目前还没具体测试),但是推送证书不算在这个数字内。
● 推送证书(Apple Push Notification service SSL )主要用来使用推送服务的。创建时,需要绑定App ID号,通常是对建好的App ID号进行编辑时,在里面上传CSR文件生成的。

%title插图%num

● 如果使用*光推送,在苹果开发者中心也不需要配置*光的相关信息,推送证书是需要密码发送推送消息的(把推送证书导出的P12文件时定义的那个密码,P12文件是给服务器使用的)
● *光也不过是对苹果的推送封装了一下而已,不可能脱离苹果的服务的,当然安卓就不是简单的封装了
● 不管是发布证书还是推送证书,过期了,就重新配置下就可以了,不会影响旧的ipa。证书的有效期通常是自创建日起1年有效期。
● 发布证书过期可能会导致app闪退,证书不符,当然也有可能是ios版本升级。正常是不会影响旧的ipa。也不会出现断层等问题,可以直接覆盖安装。
● 推送证书过期可能会导致推送服务不能正常使用。
● 推送证书的一些信息,我们也可以通过*光推送官网了解一些信息:iOS 证书设置指南 – *光文档

█ 查看证书信息的方式
● 普通方式
首先我们登陆 developer.apple.com ->点击右上角的导航Account->点击Certificates, Identifiers & Profiles -> 点击左侧栏 Certificates 下的Development -> iOS Certificates (Development):

● 特殊方式
直接登陆
https://developer.apple.com/account/ios/certificate/,如果未登录,可以登陆后,再直接访问该网址。
%title插图%num
也可以在mac电脑的钥匙串访问(keychain access.app)中查看到是否安装,以及过期时间,双击证书可以看到详情:
%title插图%num

█ 关于iOS证书过期的问题
▼ 常见问题解疑:
● Apple ID账号欠费会导致App被下架。
● 证书过期不会影响已发布的产品。未发布的产品也不会有影响。
● 证书过期导致推送会出问题,更新推送证书也不用下架重新发布,可以重新生成,只要保证 developer.apple.com 中那个 APP ID 的推送证书和推送服务器上的一致即可。
● 证书过期,重新创建证书,可能导致之前上线的没办法覆盖安装,签名不一样就没法覆盖(估计是新建PP文件导致的)
● 证书的有效期不能修改,只能重新下载。
● iOS的推送证书也有过期时间的限制的,过期后就需要开发者在苹果官网上重新生成一个证书。
▼ 解决方法:
● 先revoke你的Certificate,重新生成一个新的。
● Edit一下你的pp证书,选择新的Certificate。
● 下载覆盖之前的证书,就可以了。

PS 1:亲测过,证书过期后,已经上架appstore的app和已经安装在用户设备的app都可以正常使用。但是在mac电脑上面的证书就不能使用,导致开发者不能继续开发。因此重新生成的证书,编辑旧的PP文件(只更新旧的PP文件中的证书信息),再给mac电脑安装cer文件和pp文件,重新导出的ipa文件,安装时,不需要卸载旧的app,可以直接覆盖旧的app。

PS 2:Certificate的有效期为一年,自创建证书开始算起,而PP文件的有效期是同它关联的证书的有效期一致,证书过期了,所有和他绑定的PP文件也一起过期。

█ 安装pp( Provisioning Profiles)文件的建议:
● 进入PP文件的安装路径:
启动Xcode -> 菜单栏Perferences… ->Accounts ->View Details…->iOS Team Provisioning Profile:*->右键 Show in Finder
%title插图%num%title插图%num

安装路径为/Users/用户名/Library/MobileDevice/Provisioning Profiles。
● 命名法则:
其中一大堆序列码命名的PP文件,是通过双击PP文件自动安装的,它是用PP文件中的UUID散列去命名。

%title插图%num

这里我们也可以看到PP文件中包含了 证书、App ID、设备等信息。
● 如何自定义命名:
这个就是我们推荐的,当然也无所谓,因为可能或者你基本都没有用到,想要自定义命名,当然不能直接在这个文件夹中进行重命名,否则会出现问题。
方法一:可以直接将PP文件拷贝或拖曳到该路径(/Users/用户名/Library/MobileDevice/Provisioning Profiles)下,那么也会自动安装并以PP文件原文件名保存在该路径下。
方法二,右键PP文件,选择以iTunes方式打开。
方法三,打开应用程序中的iTunes,将PP文件拖曳到iTunes界面中。
后面两种方法比较方便,不需要找到PP文件的安装路径。因为该路径是隐藏路径,正常方法方法也不好找到。

PS 1:PP文件的真实文件名为UUID,所以双击PP文件来安装会自动用UUID来命名。
PS 2:iOS设备上每个应用程序也对应一个UUID固定值,当应用被卸载重装后UUID会被重新赋值,和之前就不同了。
PS 3:如果要删除PP文件,是可以直接在该文件夹中删除对应的PP文件,也可以在Xcode中删除

█ 关于iTunes的两个用法
● 查看设备的UDID序列号
UDID类似于人类的身份证,用来唯一区分不同的机器设备,所以理论上,每个UDID都是不重复的。UDID正常是是40位固定长度的16进制数组成。
%title插图%num
当然IOS开发者也可以通过代码来获取。还可以通过XCode 7.3.1 的Window -> Devices获取:

%title插图%num

另外也可以通过爱思助手等软件,直接检测到设备标识(UUID):

%title插图%num
● 安装ipa软件
通过iTunes来安装ipa软件,

%title插图%num

当然也可以通过91助手、二维码扫描下载app(先上传到蒲公英上或风起云飞「fir.im」等)等方式来安装ipa文件。

%title插图%num
PS 1:使用iTunes来安装ipa发现一直在同步中,可能和Apple ID账号有关吧,查看网上很多资料,安装方法和我说的是一致的。

PS 2:91助手在IOS7.0和IOS10.0上面安装证书已过期开发的ipa文件会失败,直接在appstore上面下载是可以正常安装。
█ 重要的知识点
● 开发证书可以不用创建。
● 发布证书可以随时删除,随时新建,就是多花点时间,所以证书过期什么的,都不是问题。
● PP文件(授权文件)*好创建后,不要删除,等证书新建后,直接Edit更新下证书即可(或者实际上,都可以直接删除新建也都没事,不过还未测试下,是否会导致app升级时,可否直接覆盖问题)
● 不要让Apple ID账号过期,否则导致app下架之后,等下次上传就可能导致链接不同,如果你的产品使用二维码扫描下载的话,就需要重新制作二维码,如果有纸质包装盒或者说明书,就更麻烦了

█ 相关资料:
为了研究这些证书问题,在网上查找了一些资料,也在这里分享下,作为单独的一篇文章:【IOS学习之常见问题】 关于IOS证书的那点折腾事2-百科证书
如果本文说明的还不够明白,或者想要多了解一些知识,就可以参考这些资料。
后期会陆续增加一些相关内容:
【IOS学习之常见问题】 关于IOS证书的那点折腾事3-账号续费

iOS 3D卡片式轮播

效果:

%title插图%num

参考UITableView的UITableViewDataSource和UITableViewDelegate两个方法实现;支持五险轮播,可以加载本地图片,也可以加载网络图片,可以根据自己的需求自定义
Demo地址

UITableViewDelegate

1 /**
2  *  当前显示cell的Size(中间页显示大小)
3  *
4  *  @param flowView <#flowView description#>
5  *
6  *  @return <#return value description#>
7  */
8 – (CGSize)sizeForPageInFlowView:(HQFlowView *)flowView;
9
10 /**
11  *  滚动到了某一列
12  *
13  *  @param pageNumber <#pageNumber description#>
14  *  @param flowView   <#flowView description#>
15  */
16 – (void)didScrollToPage:(NSInteger)pageNumber inFlowView:(HQFlowView *)flowView;
17
18 /**
19  *  点击了第几个cell
20  *
21  *  @param subView 点击的控件
22  *  @param subIndex    点击控件的index
23  *
24  *  @return <#return value description#>
25  */
26 – (void)didSelectCell:(HQIndexBannerSubview *)subView withSubViewIndex:(NSInteger)subIndex;

 

UITableViewDataSource

1 /**
2  *  返回显示View的个数
3  *
4  *  @param flowView <#flowView description#>
5  *
6  *  @return <#return value description#>
7  */
8 – (NSInteger)numberOfPagesInFlowView:(HQFlowView *)flowView;
9
10 /**
11  *  给某一列设置属性
12  *
13  *  @param flowView <#flowView description#>
14  *  @param index    <#index description#>
15  *
16  *  @return <#return value description#>
17  */
18 – (HQIndexBannerSubview *)flowView:(HQFlowView *)flowView cellForPageAtIndex:(NSInteger)index;

pytorch 自定义初始化权重的方法

pytorch 自定义初始化权重的方法

首选注意:torch.ensor 与 torch.Tensor的区别
常用操作 torch.tensor是一个包含多个同类数据类型数据的多维矩阵。
常用参数
dtype: tessor的数据类型,总共有八种数据类型。其中默认的类型是torch.FloatTensor,而且这种类型的别名也可以写作torch.Tensor。

核心思想就是构造和该层权重同一尺寸的矩阵去对该层权重赋值。但是,值得注意的是,pytorch中各层权重的数据类型是nn.Parameter,而不是Tensor或者Variable**。

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np

*一个卷积层,我们可以看到它的权值是随机初始化的
w=torch.nn.Conv2d(2,2,3,padding=1)
print(w.weight)

*种方法
print(“1.使用另一个Conv层的权值”)
q=torch.nn.Conv2d(2,2,3,padding=1) # 假设q代表一个训练好的卷积层
print(q.weight) # 可以看到q的权重和w是不同的
w.weight=q.weight # 把一个Conv层的权重赋值给另一个Conv层
print(w.weight)

第二种方法
print(“2.使用来自Tensor的权值”)
ones=torch.Tensor(np.ones([2,2,3,3])) # 先创建一个自定义权值的Tensor,这里为了方便将所有权值设为1
w.weight=torch.nn.Parameter(ones) # 把Tensor的值作为权值赋值给Conv层,这里需要先转为torch.nn.Parameter类型,否则将报错
print(w.weight)

完整实现线性权值变化
#===================================================
x = torch.randn(128,20) # N = 128组,特征20
print(x.size())
m = torch.nn.Linear(20,30) # 输入特征数、输出特征30
# m.weight = torch.rand(30,20)
new_Wight = torch.Tensor(np.ones([30,20])) # torch.Tensor = torch.FloatTensor 默认float类型
m.weight = torch.nn.Parameter(new_Wight) # 自定义权值初始化

print(m.weight.size()) # 权值 30*20
print(m.bias.size()) # 偏置 30

out = m(x)
print(out.size())

print(m.weight)
print(m.bias)
# print(list(m.parameters())) # 查看参数

参考:https://www.jb51.net/article/167881.htm

附:Variable和Parameter的区别
Parameter是torch.autograd.Variable的一个子类,常被用于Module的参数。例如权重和偏置。

Parameters和Modules一起使用的时候会有一些特殊的属性。parameters赋值给Module的属性的时候,它会被自动加到Module的参数列表中,即会出现在Parameter()迭代器中。将Varaible赋给Module的时候没有这样的属性。这可以在nn.Module的实现中详细看一下。这样做是为了保存模型的时候只保存权重偏置参数,不保存节点值。所以复写Variable加以区分。

另外一个不同是parameter不能设置volatile,而且require_grad默认设置为true。Varaible默认设置为False.

参数:

parameter.data 得到tensor数据

parameter.requires_grad 默认为True, BP过程中会求导

Parameter一般是在Modules中作为权重和偏置,自动加入参数列表,可以进行保存恢复。和Variable具有相同的运算。

我们可以这样简单区分,在计算图中,数据(包括输入数据和计算过程中产生的feature map等)时variable类型,该类型不会被保存到模型中。 网络的权重是parameter类型,在计算过程中会被更新,将会被保存到模型中。

 

Python中 掌握Data Frame的常用操作

Python中 掌握Data Frame的常用操作

掌握Data Frame的常用操作
一. 查看DataFrame的常用属性
DataFrame基础属性有:values(元素)、index(索引)、columns(列名) 、dtypes(类型)、size(元素个数)、ndim(维度数)和 shape(形状大小尺寸),还有使用T属性 进行转置

import pandas as pd
detail=pd.read_excel(‘E:\data\meal_order_detail.xlsx’) #读取数据,使用read_excel 函数调用
# print(detail)
print(“索引”,detail.index)
print(“所以 值 :”,detail.values)
print(“所以列名:”,detail.columns)
print(“数据类型:”,detail.dtypes)
print(“元素个数:”,detail.size)
print(“维度:”,detail.ndim)
print(“形状大小 尺寸:”,detail.shape)
#使用T属性 进行转置
print(“转置前的形状:”,detail.shape)数据
print(“转置后的形状:”,detail.T.shape)

二. 查改增删DataFrame数据

查看访问DataFramezhon’的数据
(1.1)DataFrame数据的基本查看方式
#使用字典访问方式
order_id=detail[‘order_id’]
print(“订单详情表的order_id的形状:”,order_id.shape)
#使用访问属性的方式
dishes_name=detail.dishes_name
print(“订单详情表中的dishes_name的形状:”,dishes_name.shape)
#DataFrame 单列多行的数据获取
dishes_name5=detail[‘dishes_name’][:5]
print(dishes_name5)
#多列多行数据
orderDish=detail[[‘order_id’,’dishes_name’]][:5]
print(orderDish)
#访问多行数据
order5=detail[:][1:6]
print(“订单详情表中的1~6行元素的数据:\n”,order5)

#使用DataFrame的head和tail方法获取多行数据
print(‘订单详情表中前5行数据:\n’,detail.head())#head()里面没有参数的话,默认为5行
print(‘订单详情表中后5行数据:\n’,detail.tail()) #tail()里面没有参数的话,默认为5行

(1.2) .DataFrame的loc和iloc访问方式;

dishes_name1=detail.loc[:,’dishes_name’] #DataFrame.loc[行索引名称或条件,列索引名称]
print(“使用loc提取dishes_name列的size:”,dishes_name1.size)
dishes_name2=detail.iloc[:,3] #DataFrame.iloc[行索引位置,列索引位置]
print(“使用iloc提取第3列的size:”,dishes_name2.size)

#使用loc、iloc 实现多列切片
orderDish1=detail.loc[:,[‘order_id’,’dishes_name’]]
print(orderDish1.size)
orderDish2=detail.iloc[:,[1,3]]
print(orderDish2.size)
#使用loc、iloc 实现花式切片
print(“列名为order_id和dishes_name 的行名为3的数据:\n”,detail.loc[3,[‘order_id’,’dishes_name’]])
print(‘列名为order_id和dishes_name 行名为2、3、4、5、6的数据为:\n’,detail.loc[2:6,[‘order_id’,’dishes_name’]])
print(‘列名1和3,行位置为3的数据为:\n’,detail.iloc[3,[1,3]]) #这里为什么不可以loc函数,
#因为loc函数传入的是列索引的名称(或行的名称或条件),而iloc传入的是位置
print(‘列位置为1和3,行位置为2,3,4,5,6的数据和:\n’,detail.iloc[2:7,[1,3]])#这里是位置索引,7是取不到的
#使用loc和iloc函数实现条件切片
print(‘detail中order_id为458的dishes_name为:\n’,detail.loc[detail[‘order_id’]==458,[‘order_id’,’dishes_name’]]) #使用了loc
print(“detail中order_id为458 的第1、5列的数据为:\n”,detail.iloc[(detail[‘order_id’]==458).values,[1,5]])#values 获取元素 #使用iloc函数

(1.3).ix切片方法

#使用loc、iloc、ix 实现切片 比较(DataFrame.ix[行的索引或位置或条件,列索引名称和位置])
print(‘列名为dishes_name行名为2,3,4,5,6的数据为:\n’,detail.loc[2:6,[‘dishes_name’]])
print(‘列位置为5行名为2~6的数据为:\n’,detail.iloc[2:6,5])
print(‘列位置为5行名为2~6的数据为:\n’,detail.ix[2:6,5])

2.更改DataFame中的数据

#将order_id为458 的改成 45800
detail.loc[detail[‘order_id’]==458,’order_id’] = 45800 #45800 这里 没有单引号的
print(‘更改后detail中的order_id为 458 的:\n’,detail.loc[detail[‘order_id’]==458,’order_id’])
print(‘更改后detail中的order_id为 45800 的:\n’,detail.loc[detail[‘order_id’]==45800,’order_id’])
detail.loc[detail[‘order_id’]==45800,’order_id’] = 458

3.为DataFrame增添数据

#新增一列非定值
detail[‘payment’]=detail[‘counts’]*detail[‘amounts’]
print(‘detail新增列payment的前5行数据为:\n’,detail[‘payment’].head())
#新增一列定值
detail[‘pay_way’]=’现金支付’
print(‘detail新增列的前5行的数据为:\n’,detail[‘pay_way’].head())
“4.删除某行或某列的数据(drop)
#删除某列
print(‘删除pay_way前 detail中的列索引为:\n’,detail.columns)
detail.drop(labels=’pay_way’,axis=1,inplace=True)
print(‘删除pay_way后 detail中的列索引为:\n’,detail.columns)
#删除某几行
print(‘删除1~10行 前 detail的长度:’,len(detail))
detail.drop(labels=range(1,11),axis=0,inplace=True)
print(‘删除1~10行 后 detail的长度:’,len(detail))

三. 描述分析DataFrame数据
1.数值特征的描述性统计
describe()函数描述性统计
2.类别类特征的描述性统计
object类型,categroy类型

公有云市场, SaaS难逃厄运

云计算寡头的呈现有利有弊,到底是弊大于利仍是利大于弊呢?

亚马逊AWS开端展现其在公有云中的商场分配能力时宣称:“我们不与友商竞赛”,“我们正在瞄准一个特定的范畴,这就是AWS的优势”。

笔者对此不以为然,AWS正在与每个云计算企业竞赛,因为它业务范围太广,就好像它现在没有为商场供给特定的SaaS效劳,却不代表AWS今后不会供给这类效劳一样。

随之而来的是微软Azure,越来越剧烈的竞赛使得商场份额更加死板,池塘中的小鱼更难坚持满足的生机。

证据清楚明了,HPE、Rackspace等等实际上现已退出了公有云商场,他们现在与其他公司协作供给办理效劳或混合产品。

商场为每家企业都留有空间,挑选必定仍是重要的,可是寡头独占开端构成。

依据Forrester的研讨,AWS和微软Azure本年将占公有云商场的四分之三,而桌面应用中,微软、谷歌和Adobe的商场份额简直达到了近90%。

在CRM解决方案中可以看到相同的寡头独占,Salesforce、Microsoft Dynamics和Oracle在出售人员自动化和效劳应用程序中具有约70%的SaaS收入,而Adobe、Oracle和Salesforce则具有接近70% SaaS营销自动化的商场份额。

寡头独占并不是一件坏事,只需云效劳商持续加码竞赛,用户将从较低的价格中获益,但这样也可能导致消*影响。

据Forrester说:“如果这些公司团体赞同(隐含地或明确地)进步价格或为坚持*大化赢利而疏忽改进产品,客户将是终究的受害者。”

分析师以为,公有云渠道和桌面应用程序现已有了寡头独占式的集中。但是,像CRM、电子收购、供应链办理、人力资源办理体系等范畴格式还不稳定,电子商务和FMS范畴也需求很长一段时间才干呈现寡头。

联璧港兼提供商、服务商与渠道商身份为一体,无论你是用户还是开发者,在这里,你可以得到一切你想要的SaaS,也能够轻松上传优质的SaaS产品。SaaS的未来,联璧港将带你一起领略。SaaS平台哪家好?

转载于:https://www.cnblogs.com/viker/p/7608190.html

替换字符串中的括号内容

替换字符串中的括号内容

原题指路

替换字符串中的括号内容

题目描述
给你一个字符串 s ,它包含一些括号对,每个括号中包含一个 非空 的键。

比方说,字符串 “(name)is(age)yearsold” 中,有 两个 括号对,分别包含键 “name” 和 “age” 。
你知道许多键对应的值,这些关系由二维字符串数组 knowledge 表示,其中 knowledge[i] = [keyi, valuei] ,表示键 keyi 对应的值为 valuei 。
你需要替换 所有 的括号对。当你替换一个括号对,且它包含的键为 keyi 时,你需要:

将 keyi 和括号用对应的值 valuei 替换。
如果从 knowledge 中无法得知某个键对应的值,你需要将 keyi 和括号用问号 “?” 替换(不需要引号)。
knowledge 中每个键*多只会出现一次。s 中不会有嵌套的括号。
请你返回替换 所有 括号对后的结果字符串。

解题思路%title插图%num

其实这道题可能本意是自己建个哈希表来加速查找(因为*次暴力没过QAQ),但是……我偷懒直接建了个字典来查找,四舍五入也就是用的哈希……

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

代码
class Solution:
def evaluate(self, s: str, knowledge: list[list[str]]) -> str:
res = []
flag = 0
dict = {}
for k in knowledge:
dict[k[0]] = k[1]
for i, ch in enumerate(s):
if flag:
if ch == ‘)’:
flag = 0
keykey = “”.join(key)
if keykey in dict.keys():
res.append(dict[keykey])
else:
res.append(“?”)
else:
key.append(ch)
elif ch == ‘(‘:
flag = 1
key = []
else:
res.append(ch)
return “”.join(res)

 

Nutanix是超融合厂商?原来我们都误会了……

Nutanix是一家超融合厂商吗?是,也不是。

中国的很多用户在初次接触Nutanix公司时,它已经在全球的超融合市场上声誉鹊起,并且被奉为超融合的鼻祖,所以人们先入为主地认为,Nutanix就是一家超融合厂商。

作为一个新的细分产品市场的领导者,Nutanix当然也乐得以超融合作为一个理想的切入点,在云基础架构领域赚得“*桶金”,所以也就欣欣然接受了超融合这个标签。

随着云计算应用的快速普及,以及企业数字化转型逐渐走向深入,人们越来越多地重复这样一句话——不忘初心。那么,Nutanix的初心又是什么呢?

“在公司创立之初,我们就一直想将软件定义的思路、以AWS为代表的新型的公有云服务模式、苹果公司产品所体现的令人愉悦的体验,全部带入企业级应用市场,而超融合只不过是实现这一愿景的*步而已。”Nutanix中国区董事总经理陈满恒如是说。

说得更简单直白一些,Nutanix意在企业云市场,超融合只不过是在打地基。在中国,超融合市场还在持续升温。Nutanix当然不会放弃这一市场,只不过其重点已经开始向整个企业云市场倾斜,而且要为用户提供更多样化的选择。用现在*流行的一个词来形容,Nutanix在“转型”。从2009年成立至今,Nutanix已经褪去了初创公司的青涩和单纯“技术控”的气质,正在努力搭建自己的企业云商业帝国。

1 由硬变软

在*近一次Nutanix财报电话会议上,Nutanix公司首席执行官Dheeraj Pandey表示,未来公司将更多地采取以软件为中心的策略应对市场的变化。Nutanix公司首席财务官Duston Williams也表达了相同的看法:“今天的Nutanix是一家软件公司,或者更准确地说是一家企业云操作系统公司。”

毫无疑问,Nutanix在转型,从大多数人认为的超融合厂商走向更加广阔的企业云市场,从提供单纯的一体机解决方案演变为一个以软件为核心的多面手。

%title插图%num

Nutanix中国区董事总经理陈满恒

从2017年10月20日Nutanix正式宣布对陈满恒的任命到现在,仅仅几个月的时间,陈满恒已经深刻感受到了公司的变化。“我刚加盟公司时,公司的股票价格是21美元,而昨天股价已经飙升至36美元,增长了近80%。”陈满恒在2018年1月23日举行的媒体会上举例说。作为一家软件公司,Nutanix的“新身份”赢得了更多关注和肯定。

Nutanix的公开数据显示,公司FY18 Q1的收入为2.76亿美元,增长近50%,而中国市场的业绩增长更快。公司中国团队现有六七十人,而公司给陈满恒下达的任务是在一年半内将中国团队的人员规模再扩大一倍。“除了不断增强销售和售后服务能力以外,我们希望在中国拥有一个更加健康、平稳的组织架构。”陈满恒表示。

虽然超融合让人们认识并熟悉了Nutanix,但是对于现在的Nutanix来说,超融合市场已经有些施展不开。“以前,我们提供的超融合解决方案通常与硬件绑定,但是现在,我们要坚定地实现软硬件的分离,为用户提供更多的选择。对于我们销售纯软件解决方案,整个业界都十分看好。”

如果说从超融合到企业云是Nutanix的*次跃升,那么从一体化解决方案到纯软件的销售则是Nutanix的第二次跃升,Nutanix在软件方面的独特性和价值将得到充分释放。

“我们不会放弃超融合市场。”陈满恒再次强调,不过他话锋一转,“其实,广大客户更认可我们在企业云操作系统上的能力。我们也希望给用户更多的选择。适应不同的应用场景,用户既可以选择一体机,也可以采用纯软件。”

以前,Nutanix对硬件的要求确实非常苛刻,尤其是在选择硬件合作伙伴时甚至可以用挑剔两个字来形容。这是从保证产品的高性能和稳定性的角度考虑。现在,随着产品和技术趋于稳定和成熟,Nutanix一方面希望能够更加充分地发挥自己在软件方面的特长,另一方面也是为满足不同用户的需求,所以在销售层面变得更加灵活。陈满恒表示,未来的Nutanix会更加开放。2017年中,Nutanix与IBM达成了一项多年期合作计划,Nutanix的企业云平台软件将与IBM Power Systems相结合,为大型企业提供针对关键工作负载的超融合一站式解决方案。据说在亚太区,双方合作的*单就在中国。

据陈满恒介绍,从2月1日开始,Nutanix将正式在全球销售纯软件产品,而中国市场将从今年下半年开始销售纯软件产品。

2 从超融合到企业云

“从公司诞生之日起,我们的目标只有一个,那就是将云服务的种种益处带到企业级市场。”陈满恒表示,“云基础架构*终会变得透明。用户不必关心基础架构,他们的业务可以即插即用。”

谈到云计算的发展趋势,Nutanix中国区技术总监夏峰表示,未来计算将无处不在,而且云也呈现出分布式的状态。一家企业可能拥有多种业态、多个数据中心、多个分支机构,而不同的企业都拥有自己的一套架构或体系,多云融合会是一种“新常态”。数据在哪里产生,存储、计算和分析就在哪里进行,一个通信基站、一辆汽车或一艘轮船都可能成为一个小的数据中心,拥有自己的计算和分析能力。边缘计算正在兴起。从某个角度说,边缘计算甚至可以和物联网划等号。

%title插图%num

针对这一趋势,Nutanix希望提供一个统一的云平台——企业云操作系统,覆盖从企业的核心云到分布式云,从而简化云的管理和应用。“简洁而优雅,这就是我们的产品特色和优势。”夏峰这样说。

超融合是一个“交钥匙”的解决方案,它更容易让用户接受和掌握。作为开启企业云之旅的*步,超融合为企业云化奠定了基础。不过,超融合毕竟不是云,从超融合到分布式云,中间还有很多台阶要迈。

从*底层的超融合架构,到Acropolis虚拟化框架,再到Prism管理框架,直到多云管理,Nutanix提供的是“一键直达,多云融合”的上云解决方案和平台。“在这个过程中,超融合只是一个工具,而不是目的,企业云才是*终的目标。”夏峰表示。

Nutanix一直在进行快速的产品迭代,不断丰富超融合产品的功能,将人工智能算法融入产品中,提供对不同虚拟化软件的支持,而不是将用户限定在某一个虚拟化软件上,并与多个公有云对接,实现多云管理等。2017年6月,Nutanix宣布与谷歌云(Google Cloud)建立战略联盟,方便双方的企业客户能够用统一的公有云服务来部署和管理云计算应用和传统企业用户程序,Nutanix环境与Google Cloud Platform(GCP)也无缝融合在一起。

Nutanix为企业用户提供了一条上云的捷径:企业用户可以先从传统架构迁移到Nutanix超融合架构,然后再迁移到Nutanix AHV,实现全栈自动化,之后可以尝试用Nutanix Calm进行应用生命周期管理,当用户在核心数据中心里全部采用了Nutanix的产品后,就可以进行下一步,向分布式云过渡,*终实现智能边缘云。

“我们定位在企业云市场,致力于为用户提供单一的云操作系统、一致的应用体验。我们要为用户提供不同的选择,比如对多种虚拟化软件的支持,可以是VMware、微软、思杰或Nutanix AHV,而不是将用户绑定在某一个平台上。”陈满恒表示,“Nutanix从一开始就想把公有云的体验带给企业级用户。我们先用超融合解决存储和信息的问题,然后慢慢向企业云扩展,循序渐进。”

2018年中,Nutanix在全球还将正式推出Xi Cloud灾难恢复服务。

对于超融合能够做什么,大家已经十分清楚。对于Nutanix能够给企业云市场带来什么样的变革,人们更多地是期待,当然也会有疑问,这可能需要一个慢慢认知和转变的过程。Nutanix已经说得很明白,无论用户使用哪种云,它都可以提供一致的体验。现在,Nutanix需要用更多成功的案例证明给中国用户看。

————————————————

原文链接:https://blog.csdn.net/Bmo40mqfG249H/article/details/79157633

怎么创建服务器集群?

一个集群 (cluster)指容器运行所需要的云资源组合,关联了若干云服务器节点、负载均衡等云资源。
通过多种方式创建一个集群:

方法一:
创建一个集群,并同时创建若干个云服务器。
您可以通过容器服务直接创建一个包含若干个新云服务器的集群。

方法二:
创建一个零节点的集群并添加已有的云服务器。
创建一个零节点的集群。
如果您已经在云服务器 ECS 上购买了若干个云服务器,可以在容器服务上创建一个零节点的集群。
操作方式同 方法一,您只需要选择添加已有节点。
添加已有的云服务器。
您可以通过以下两种方法将已有云服务器添加到容器服务中。
重置云服务器的镜像,将其自动加入集群。
此种方式会重置云服务器的镜像和系统盘,需要谨慎。但是这种方式加入的服务器比较干净。
在云服务器上执行脚本,将云服务器手动加入集群。
此种方式适合于不希望重置云服务器的镜像。

Tomcat配置本地文件【图片】服务器

一、简介
一般情况下,我们项目开发时,在本地环境下,把这个tomcat作为项目服务器,就是把项目放在tomcat上面跑。这个是tomcat用的*多的地方,分享一下,但是其实Tomcat还可以作为其他来用,这里要讲的就是用tomcat来配置本地的文件服务器。下面是步骤:

二、配置步骤
【1】下载一个tomcat文件版,放在本地,比如apache-tomcat-8.0.53;

【2】然后找到tomcat的conf文件夹下的server.xml文件:
%title插图%num

【3】在server.xml中加入下面配置 :

%title插图%num

【4】代码如下:

<Service name=”newtest”>
<!–分配8089端口 –>
<Connector port=”8089″
protocol=”HTTP/1.1″
connectionTimeout=”20000″
URIEncoding=”GBK”
redirectPort=”8443″ />

<Engine name=”newtest” defaultHost=”localhost”>
<!–name为项目访问地址 此配置的访问为http://localhost:8089 appBase配置tomcat下wabapps下的路径–>
<Host name=”localhost” appBase=”F://Tomcat6//apache-tomcat-6.0.29//webapps” unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>

<!–资源地址–> <!– 就是访问http://localhost:8089这个地址就是到E://TangRenFileServer//images这个目录下 –>
<Context path=”” docBase=”E://TangRenFileServer//images” debug=”0″ reloadable=”false”/>
</Host>
</Engine>
</Service>
【5】注意了,这个时候,访问http://localhost:8089这个地址就是到E://TangRenFileServer//images这个本地目录下

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速