Python如何实现微信自动回复

教你用Python如何实现微信自动回复功能,机器人自动对话!

托管机器人:用Python写一个机器人,自动回复别人说话

实现过程:

1.首先要申请一个可以说话的机器人.机器人网站http://www.tuling123.com

注册一个账号,然后登陆,创建一个机器人:

 

2.写一段连接机器人的程序.,首先获取机器人的api地址, http://www.tuling123.com/openapi/api,这个地址就是用来登陆机器人时找到秘钥使用的,所以下一步就是找秘钥,

 

这里需要些一段登陆机器人的代码:# coding = utf8 import requests import itchat # 去图灵机器人官网注册后会生成一个apikey,可在个人中心查看 KEY = ‘c220a31ae10d40f19a6cdce74997b3e6’ def get_response(msg):

apiUrl = ‘http://www.tuling123.com/openapi/api’    data = {        ‘key’   : KEY,        ‘info’   : msg,   # 这是要发送出去的信息        ‘userid’  : ‘wechat-rebot’,  #这里随意写点什么都行    }    try:        # 发送一个post请求        r = requests.post(apiUrl, data =data).json()        # 获取文本信息,若没有‘Text’ 值,将返回Nonoe         return r.get(‘text’)    except:        return# 通过定义装饰器加强函数 tuling_reply(msg) 功能,获取注册文本信息

3.获取别人微信发过来的信息,需要一个特殊的加强函数来完成.

# 通过定义装饰器加强函数 tuling_reply(msg) 功能,获取注册文本信息@itchat.msg_register(itchat.content.TEXT)

4.设置一个回复信息的机制,如果机器人出问题了,也就是不能回复信息了,设置一个默认的回复机制.

def tuling_reply(msg):    # 设置一个默认回复,在出现问题仍能正常回复信息    defaultReply = ‘I received: ‘ +msg[‘Text’]    reply = get_response(msg[‘Text’])    # a or b 表示,如有a有内容,那么返回a,否则返回b    return reply or defaultReply

5.以上所有的都准备好了,接下来就是要设置微信登陆了,通过生成二维码,微信扫描的方式登陆,开启程序.

# 使用热启动,不需要多次扫码itchat.auto_login(hotReload=True)itchat.run()

 

*终代码如下:

# coding = utf8

import requests

import itchat

# 去图灵机器人官网注册后会生成一个apikey,可在个人中心查看

KEY = ‘c220a31ae10d40f19a6cdce74997b3e6’

def get_response(msg)

:    # API的地址

apiUrl = ‘http://www.tuling123.com/openapi/api’

data = {

‘key’   : KEY,

‘info’   : msg,   # 这是要发送出去的信息

‘userid’  : ‘wechat-rebot’,  #这里随意写点什么都行

}

# 获取文本信息,若没有‘Text’ 值,将返回Nonoe

try:

# 发送一个post请求

r = requests.post(apiUrl, data =data).json()

return r.get(‘text’)

except:

return

# 通过定义装饰器加强函数 tuling_reply(msg) 功能,获取注册文本信息

@itchat.msg_register(itchat.content.TEXT)

def tuling_reply(msg):

# 设置一个默认回复,在出现问题仍能正常回复信息

defaultReply = ‘I received: ‘ +msg[‘Text’]

reply = get_response(msg[‘Text’])

# a or b 表示,如有a有内容,那么返回a,否则返回b

return reply or defaultReply

# 使用热启动,不需要多次扫码

itchat.auto_login(hotReload=True)

itchat.run()

用 Python 玩转 GitHub 的贡献板

基本原理前面已经讲过,我们只需要控制项目提交的日期和次数,就能在贡献面板中填充出花样来。可能有朋友会问,前面的部分怎么办?拿到我得等一年?No☝️,经过研究发现,GitHub的贡献面板是活得,什么意思呢?GitHub是根据项目的提交记录时时生成的贡献面板,所以只要在本地把时间改成过去,进行提交操作,再push到GitHub,就实现了穿越。了解了这些之后,就可以动手了。*后如果效果不尽人意或者像换个图样换个心情,只需要删了对应的仓库就行了。

坑1:码云不像GitHub,码云的贡献面板是一次性的,推上去之后就不会变,所以谨慎操作

程序设计
目标
1、设计一个模板,可以通过修改模板来改变图样
2、将过去时间的记录自动全部填充
3、每天进行自动COMMIT/PUSH操作
实现
1、模板设计成一个json二维数组,由0和1组成,分别到表有/无提交记录。行数*好固定是7(周一到周日),列数可以自已随意设置。下面是基于python的实现。
model.json

[
[0, 1, 1, 0, 0, 0, 1, 1, 0, 0],
[1, 1, 1, 1, 0, 1, 1, 1, 1, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
]

下面的代码是根据当前日期和模板对应的值来进行提交,用于定时任务每天执行。可以直接部署到服务器,通过后面的命令设置定时任务。
main.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import os
import time
import datetime

def calculate_date(start, end):
# 计算日期相差天数
start_sec = time.mktime(time.strptime(start, ‘%Y-%m-%d’))
end_sec = time.mktime(time.strptime(end, ‘%Y-%m-%d’))

days = int((end_sec – start_sec) / (24 * 60 * 60))

return days

def commit(flag):
if flag:
for n in range(49):  # 设置commit次数
with open(‘./record.txt’, ‘a’) as record:
record.write(‘.’)
record.close()
os.system(‘git commit -a -m \”HeartBeat\”‘)

else:  # 每天推一条
with open(‘./record.txt’, ‘a’) as record:
record.write(‘.’)
record.close()
os.system(‘git commit -a -m \”HeartBeat\”‘)

os.system(‘git pull && git push origin master’)

with open(‘./model.json’) as f:  # 加载模型
PATTEN = json.loads(f.read())
f.close()

PERIOD = len(PATTEN[0])  # 周期(图案列数)

START_DATE = ‘2017-7-16’  # 开始日期,很重要,左上角提一格的日期,自己手动修改
now = datetime.datetime.now().strftime(‘%Y-%m-%d’)

row = calculate_date(START_DATE, now) % 7
col = int(calculate_date(START_DATE, now) / 7) % PERIOD

commit(PATTEN[row][col])

开启定时任务

crontab -e
#  输入以下代码,前两个参数分别是分钟和小时,该任务为每天12:00定时执行
# 00 12 * * * cd /home/git_heart && git pull && /usr/bin/python main.py

2、定时任务只能帮我完成今天及以后的事情,之前的也需要写个脚本跑一下。
loop.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import os
import time
import datetime

def calculate_date(start, end):
# 计算日期相差天数
start_sec = time.mktime(time.strptime(start, ‘%Y-%m-%d’))
end_sec = time.mktime(time.strptime(end, ‘%Y-%m-%d’))

days = int((end_sec – start_sec) / (24 * 60 * 60))

return days

def add_days(d, num):
# 日期递增
sec = num * 24 * 60 * 60
now_sec = time.mktime(time.strptime(d, ‘%Y-%m-%d’)) + sec
return time.strftime(“%Y-%m-%d”, time.localtime(now_sec))

def commit(flag):
if flag:
for n in range(49):
with open(‘./record.txt’, ‘a’) as record:
record.write(‘.’)
record.close()
os.system(‘git commit -a -m \”HeartBeat\”‘)

with open(‘./record.txt’, ‘a’) as record:
record.write(‘\n’)
record.close()
os.system(‘git commit -a -m \”HeartBeat\”‘)

else:
with open(‘./record.txt’, ‘a’) as record:
record.write(now + ‘\n’)
record.close()
os.system(‘git commit -a -m \”HeartBeat\”‘)

with open(‘./model.json’) as f:  # 加载模型
PATTEN = json.loads(f.read())
f.close()

PERIOD = len(PATTEN[0])  # 周期(图案列数)

START_DATE = ‘2017-7-16’  # 开始日期, 码云和git显示不一样, 建议从*左上角开始
now = datetime.datetime.now().strftime(‘%Y-%m-%d’)

os.system(‘timedatectl set-ntp false’) # 关闭时间自动同步

while calculate_date(START_DATE, now) >= 0:
row = calculate_date(START_DATE, now) % 7
col = int(calculate_date(START_DATE, now) / 7) % PERIOD
commit(PATTEN[row][col])

now = add_days(now, -1)
os.system(‘timedatectl set-time ‘ + now)

#  复原时间
os.system(‘timedatectl set-ntp 1 && timedatectl set-local-rtc 1’)

到这里基本就结束了,第三个目标实际上在*步就已经完成了,下面上一下测试结果。

效果展示
1、小心心

[
[0, 1, 1, 0, 0, 0, 1, 1, 0, 0],
[1, 1, 1, 1, 0, 1, 1, 1, 1, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
]\%title插图%num

2、X

[
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 0]
]

%title插图%num

财报上新不久的Mobvista,还内藏何种“惊艳”?

就在不久前,Mobvista刚刚发布了2019年的财报数据。我们观察到其程序化广告收入已高达22.3亿元,同比增长40.8%;经调整后EBITDA达3.6亿元,同比增长高达19.5%……试想仅仅上市一年,Mobvista在增长放缓的大环境下依然能够取得如此“高光时刻”,可见其发展势头不容小觑。

在收入方面大举“开源”的同时,Mobvista还运用技术手段有效“节流”。财报中提到,过去一年汇量科技的程序化业务收入显著增長的同時,程序化业务的服务器成本下降了10.8%,服务器成本占程序化广告业务收入的比例,从2018年的6.6%降至2019年的4.2%。

这归功于汇量科技独立研发的技术中台——尤其是其中的弹性集群管理平台SpotMax,在过去一年中的深度应用。在程序化广告业务的长期实践中,Mobvista已经将大数据计算引擎(EnginePlus)、大规模机器学习算法平台(MindAlpha)、数据管理平台(Datatory)和云服务器弹性集群管理平台(SpotMax)沉淀为可复用、共享和迭代的技术中台。技术中台提供的大数据实时计算的能力,为支持广告精准定向和展示向安装的转化率持续提升,推动程序化业务的规模化增长提供了技术基础。而技术中台更为直观的作用是实现云服务器成本的集约。

SpotMax背后的云服务成本之观
记得初识SpotMax还是在去年云栖大会与阿里云联合发布之时,据悉在联手打磨此款服务的过程中,阿里云弹性计算团队会根据Mobvista的反馈对自身弹性集群作相应的改进提升;而Mobvista方面则是将自身的产品与解决方案更好融入阿里云的解决方案库中,并定期向阿里云方面的架构师与销售团队同步,便于一同将价值传递给用户。

————————————————
%title插图%num

盘点服务始末,我们发现,SpotMax始于Mobvista在利用Spot Instance优化云端成本上积累的一定经验,为的就是帮助其他云的使用者找到成本可控的大规模云端系统实践的可行之路。“我们更适合将SpotMax定义为一种体系,即利用弹性计算资源进行云端系统成本优化的工具,它包含产品和解决方案等诸多层面,甚至可以被理解为一种生态,可做到因需求不同来选择具体的组成部分并完成既定目标。”Mobvista技术副总裁兼首席架构师蔡超对此总结道。

如今SpotMax解决方案和服务主要包含MaxArch、MaxChaos和MaxGroup三部分。其中MaxArch是一种基于架构的咨询服务,主要是Mobvista为用户提供针对现有架构的评估以及向云上迁移的实践建议与有关云原生的架构设计等;而MaxChaos则是基于开源软件与Mobvista自研的诸多服务框架之上,提供可以帮助用户持续提升自身系统高可用性的混沌工程服务;*后MaxGroup则可被简单定义为Spot Instance集群管理服务,主要通过集群防退化、集群推荐以及基于强化学习的混合机群负载均衡等助力用户进一步降低云上系统的成本。总结一句,SpotMax寄希望于云计算平台得天独厚的弹性计算基础能力,以此搭建一套实时竞价和调度管理系统,达成按需购买与抢占实例低价的双重优势。

读到此处,想必各位看官对刚才提出的“双重优势”一头雾水,所以在细聊之前,晶少还是先针对性介绍下目前用户购买使用云服务的几种方式以及与之产生的成本关联吧!如今用户购买使用云服务会有这样几种形式,*常使用的当属按需实例,即随买随用、按需获取模式,这种方式虽然省去了提前规划的复杂性,但也是*昂贵的使用方式之一,如果不是财大气粗的企业用起来恐怕还是吃不消的。

另外一种则是预留实例,即用户通过预定用量和时长来享受一定折扣的服务,但缺陷比较明显,那就是不够灵活弹性,在这个“天下武功为快不破“的时代显然也是使用起来寸步难行。而以SpotMax服务为代表的则是第三种方式,也是目前Mobvista业务中在线系统正在大规模使用的,一度被阿里云称之为抢占实例,顾名思义就是“想用就要抢”的理念,这也是目前提出的一种*大化购买碎片计算力资源来优化云上系统成本的做法。

如果从技术角度考量这几种形式,可以这样被理解:常用的按需获取其实主要利用了云计算的弹性拓展特性,因为此过程中云服务提供商需要具备让用户可以随时随地获取被释放计算资源的能力,所以就不得不预留大量的计算资源,竞价实例可以被认为是云服务提供商利用闲置计算资源推出的实例,其价格会根据供需情况实时变化,但与按量实例相比较其价格优势就非常明显了。

可尽管竞价实例的价格通常是按需实例的10-20%,但遇到出价低于市场价或是资源紧张的情况就会出现被回收,也就是关于竞价实例中存在的中断机制。基于此为了保持系统服务的可持续性和服务水平,用户就需要在竞价实例被回收时及时作出应对系统集群容量变化的有效举措 ,通常情况下此过程中需要结合一些Spot集群管理软件,帮助维持集群容量的动态稳定,这样就可做到在不影响可用性的前提下实现系统成本的大幅度节省。

基于此蔡超表示,SpotMax就是源于该理念所达成的设计实践,目前已经在Mobvista内部同时支持了三条主要业务线的运维工作,主要侧重大量抢占实例支撑的在线系统,辅以其他优化措施实现了单位请求成本节约70%。

关于未来的技术创新迭代,他表示其实*初设计SpotMax时就已经考虑到要积*有效应对用户不同场景中千差万别的需要以及以后层出不穷的刚性需求,所以在架构上着力采用了插件的模式,即可根据用户场景不同来选择相应的插件使用。“目前Mobvista针对容器化场景的插件已经被提供,另外某些定制化创新性质的插件正在被研发中。尽管目前SpotMax依然处于早期的推广使用阶段,但从反馈的数据中我们发现针对目前试用用户的系统计算资源成本至少可降低一半左右。”

云原生架构实践促Mobvista“云端俭省之道”
如此说来,SpotMax是云上系统成本降低的刚需产物不假,但我们目前所经历的云上系统成本居高不下又根源于何呢?其实很重要的一方面是计算资源的成本使然。所谓计算资源成本,简单来说就是我们熟悉的云端虚拟机、数据存储、流量使用以及云端资源所涉及的诸如消息队列服务、机器学习等功能性服务之类;如今随着企业上云的规模化与产业化差异性越发鲜明,需求的碎片化趋势也逐渐加剧,如何有效降低运成本就顺理成章变成用户关注的大问题,所以也就不难理解SpotMax的应运而生了。

对此晶少觉得,其实降低成本*直观有效的办法就是系统可以做到对需求量完成自动伸缩以及合理使用服务平台的收费模式,在此过程中无论是*基本的CPU利用率还是数据存储选择的范围等都会被纳入考察范围之内,进一步来说如果想要达成此种弹性的系统要求,架构的合理性*对是关键所在。“在利用云特点的基础之上采用更加细腻有效的伸缩方式,比方说微服务架构让系统伸缩力度更颗粒性。毕竟复杂单体系统伸缩会需要更大而昂贵的计算资源,繁杂的人力支持更是不可缺少。”蔡超补充道。

具体来说,通过架构调整来完成系统伸缩力度更细化,其实本质上是促成架构更高效适用云平台的契机之一,即利用云平台特性让服务集群更好地应对竞价实例,减少中断对服务集群自身容量的影响并稳定容量,例如采取*基本的机器保障支持利用率、根据数据属性选择合适的存储方式以及线上集群自动伸缩等。

说到此处不得不提及一点,其实Mobvista在投身SpotMax研发之前自身也经历过促成云成本降低的艰难探索,无论是尝试低CPU利用率机器的合并淘汰,还是对数据存储的优化以及购买Reserved Instance预留实例等,同时也是蔡超在加入Mobvista之后秉承all in cloud的前提不断跟进的重要任务之一。

众所周知,Mobvista旗下拥有程序化广告平台,移动程序化广告的具有请求量巨大的特性,峰值达到单日近千亿次,同时对于响应时间也有着非常苛刻的要求。晶少了解到通常程序化一般对于响应时间的要求是50-100ms,在这种苛刻的条件下要采用竞价实例的话势必要充分提高系统的弹性,一来二去,展开Mobvista架构向微服务为代表的云原生构架迁移就被提上了蔡超的日程。

通过介绍,晶少知晓早年间Mobvista的几大业务系统都是部署在云端较为庞大的单体系统,其中*大的瓶颈则是需要横向扩展时不免要整体复制,过程中必然需要更多的计算资源。基于此Mobvista方面首先开始了从云单体系统向云原生架构的改造,构建微服务成为*步,该实践需要考量的是面向容错、恢复和混沌工程,以此建立一个高可用的微服务架构使云上系统更具弹性,以便更好利用资源。

深入提及架构改造,蔡超明确,云原生实质是帮助企业高效运用云平台,以便更快速开发和发布应用的一些技术方法及理念。但在此尝试中由于基础设施的改变需要相应架构调整去适配,所以本地系统直接向云上迁移是完全不可行的,不但使用艰难还会造成巨大的成本浪费。“另外更容易被忽视的一点,企业尝试云原生时往往停留在系统建设层面,而忽视了与其配套的开发团队甚至是工作方式的相关调整,这方面确实需要很长一段时间来解决,不能一蹴而就,这也算是Mobvista的一些宝贵的实践心得。”

如今Mobvista已经在架构方面完成了微服务的改造,未来还将紧跟技术趋势加大对容器化、服务网格等技术的引入。“我们希望能够提升基础设施的抽象层次,做到从虚拟网络到容器网络,再到服务网络,如此就可以大大提升大规模与复杂系统的可维护性。更深入来讲,无论是目前的推广、变现还是数据洞察业务,抑或是云端架构改造所带来的成本优化,本质上为企业创造价值并构建工具生态的想法是需要持续被坚持的,也是Mobvista的大事儿。”蔡超说。
————————————————

iOS开发笔记–keyboard相关

*近一个项目有键盘相关的需求:自定义键盘与系统键盘切换。就将键盘相关的知识点顺了一遍。

一、UITextInputTraits 协议

该协议定义了一些与键盘输入相关的属性。所有支持键盘输入的对象都必须接受这个协议,目的是为了与文本输入管理系统正确地交互。

UITextField 和 UITextView ,UISearchBar都支持该协议。

@protocol UITextInputTraits <NSObject>

@optional

@property(nonatomic) UITextAutocapitalizationType autocapitalizationType;
// 定义输入文本的自动大写类型 default is UITextAutocapitalizationTypeSentences
@property(nonatomic) UITextAutocorrectionType autocorrectionType;
// 定义输入文本的自动更正类型 default is UITextAutocorrectionTypeDefault
@property(nonatomic) UITextSpellCheckingType spellCheckingType NS_AVAILABLE_IOS(5_0);
// 定义输入文本的拼写检查类型 default is UITextSpellCheckingTypeDefault;
@property(nonatomic) UIKeyboardType keyboardType;
// 定义键盘类型 default is UIKeyboardTypeDefault
@property(nonatomic) UIKeyboardAppearance keyboardAppearance;
// 定义键盘外貌类型 default is UIKeyboardAppearanceDefault
@property(nonatomic) UIReturnKeyType returnKeyType;

// 定义键盘returnKey的类型 default is UIReturnKeyDefault (See note under UIReturnKeyType enum)
@property(nonatomic) BOOL enablesReturnKeyAutomatically;
// default is NO (when YES, will automatically disable return key when text widget has zero-length contents, and will automatically enable when text widget has non-zero-length contents)
@property(nonatomic,getter=isSecureTextEntry) BOOL secureTextEntry;
// 输入文本是否加密 default is NO

@end

typedef NS_ENUM(NSInteger, UIKeyboardType) {
UIKeyboardTypeDefault, // Default type for the current input method.
UIKeyboardTypeASCIICapable,
// 字母键盘 Displays a keyboard which can enter ASCII characters, non-ASCII keyboards remain active
UIKeyboardTypeNumbersAndPunctuation, // Numbers and assorted punctuation.
UIKeyboardTypeURL, // A type optimized for URL entry (shows . / .com prominently).
UIKeyboardTypeNumberPad, // A number pad (0-9). Suitable for PIN entry.
UIKeyboardTypePhonePad, // A phone pad (1-9, *, 0, #, with letters under the numbers).
UIKeyboardTypeNamePhonePad, // A type optimized for entering a person’s name or phone number.
UIKeyboardTypeEmailAddress, // A type optimized for multiple email address entry (shows space @ . prominently).
#if __IPHONE_4_1 <= __IPHONE_OS_VERSION_MAX_ALLOWED
UIKeyboardTypeDecimalPad, // A number pad with a decimal point.
#endif
#if __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
UIKeyboardTypeTwitter, // A type optimized for twitter text entry (easy access to @ #)
#endif

UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, // Deprecated

};

这个属性决定了在输入文本中,是否支持拼写检查。

二、定制键盘

@interface UIResponder (UIResponderInputViewAdditions)

// Called and presented when object becomes first responder. Goes up the responder chain.
@property (readonly, retain) UIView *inputView NS_AVAILABLE_IOS(3_2);
//键盘视图,定制的键盘视图要赋值给该属性
@property (readonly, retain) UIView *inputAccessoryView NS_AVAILABLE_IOS(3_2);
//键盘辅助视图,即位于键盘视图上面一些额外的辅助性视图,可在上添加辅助功能键

// If called while object is first responder, reloads inputView and inputAccessoryView. Otherwise ignored.
– (void)reloadInputViews NS_AVAILABLE_IOS(3_2);

@end

UITextField 和 UITextView 都提供了以上方法。

%title插图%num
如上图所示,绿色视图为 inputAccessoryView。下面的是定制的键盘视图

示例代码如下

– (void)viewDidLoad
{
[super viewDidLoad];

self.numberTextField = [[UITextField alloc] initWithFrame:CGRectMake(20, 120, 280, 80)];
self.numberTextField.backgroundColor = [UIColor darkGrayColor];
self.numberTextField.delegate = self;
self.numberTextField.keyboardType = UIKeyboardTypeNamePhonePad;

self.numberTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
self.numberTextField.autocorrectionType = UITextAutocorrectionTypeNo;
self.numberTextField.spellCheckingType = UITextSpellCheckingTypeNo;
self.numberTextField.returnKeyType = UIReturnKeySearch;

_inputView = [[AZStockKeyboardView alloc] initWithFrame:CGRectMake(0, 0, rect.size.width, 216)];
_inputView.delegate = self;
self.numberTextField.inputView = _inputView;
UIView *accessoryView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
accessoryView.backgroundColor = [UIColor greenColor];
self.numberTextField.inputAccessoryView = accessoryView;
[self.view addSubview:self.numberTextField];
}

切换系统键盘

– (void)customedKeyboardDidChange
{
self.numberTextField.inputView = nil;
[self.numberTextField reloadInputViews];
}

系统键盘切换定制键盘

– (void)systemKeyboardDidChange
{
self.numberTextField.inputView = _inputView;
[self.numberTextField reloadInputViews];
}

给定制的键盘添加系统键盘按键声音

1.定制键盘视图要继承UIView,接受 UIInputViewAudioFeedback 协议,并实现协议方法

@interface AZStockKeyboardView : UIView<UIInputViewAudioFeedback>
{

}

#pragma mark UIInputViewAudioFeedback protocol methods

– (BOOL)enableInputClicksWhenVisible
{
return YES;
}

2.在定制的键盘的按键响应的方法中,调用 [[UIDevice currentDevice] playInputClick]

– (void)numberButtonClicked:(id)sender
{
[[UIDevice currentDevice] playInputClick];
}

三、改造系统键盘

由于需要定制键盘和系统键盘互相切换,就需要将系统键盘的切换键盘的按键响应我们自己的切换键盘方法。

Apple官方并没有提供这种方法,目前可行的做法是将该按键用我们自己的创建的按键将其覆盖。

UITextEffectsWindow       //键盘所在window

UIPeripheralHostView      //键盘视图所在的父视图  定制的键盘视图,辅助视图都放在这个视图上面

UIKeyboardAutomatic      //键盘视图

UIKeyboardImpl               //自己按英文的意思理解的,键盘的实现视图

UIKeyboardLayoutStar     //自己按英文的意思理解的,键盘的布局视图

UIKBKeyplaneView          //

UIKBKeyView                   //根据description判断,是键盘的功能性按键的视图(除字母,数字之外,类似删除键,空格键等)

以上视图都有层级关系,从上到下,上面的视图是下面视图的父视图

完成覆盖按键的任务,需要获取 UIKeyboardAutomatic 视图,然后把定制的切换按键添加到该视图上

获取系统键盘视图
– (UIView *)getSystemKeyboardView
{
UIView *returnView = nil;

UIWindow *keyboardWindow = nil;
for (UIWindow *window in [[UIApplication sharedApplication] windows])
{
if (![NSStringFromClass([window class]) isEqualToString:NSStringFromClass([UIWindow class])])
{
keyboardWindow = window;
break;
}
}
if (keyboardWindow == nil)
return nil;

for (UIView *firstView in [keyboardWindow subviews])
{
if ([[firstView description] hasPrefix:@”<UIPeripheralHostView”])
{
for (UIView *secondView in [firstView subviews])
{
if ([[secondView description] hasPrefix:@”<UIKeyboardAutomatic”])
{
returnView = secondView;
}
}
}
}

return returnView;
}

监听键盘事件

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];

向键盘视图上覆盖按键

– (void)keyboardDidShow:(id)notification
{
_keyboardDefaultView = [self getSystemKeyboardView];
if (_keyboardDefaultView)
{
_switchNumButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_switchNumButton setTitle:@”123″ forState:UIControlStateNormal];
[_switchNumButton setBackgroundImage:[UIImage imageNamed:@”num.png”] forState:UIControlStateNormal];
_switchNumButton.frame = CGRectMake(1, 173, 78, 42);
[_switchNumButton addTarget:self action:@selector(changeCutomeButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
[_keyboardDefaultView addSubview:_switchNumButton];
}
}

效果如下:

%title插图%num

注意:由于所有系统键盘都是所有程序共享的,所以在当前界面消失前,或者其他类型的输入视图调用键盘前,要将我们自己定制的按键移除。

否则,从其他应用调用该类型键盘,都可以看到我们定制的按键。

同时也应该在调用键盘前,即键盘弹出时,在用我们定制的按键覆盖之前加限定条件

– (void)keyboardDidShow:(id)notification
{
_keyboardDefaultView = [self getSystemKeyboardView];
if (_keyboardDefaultView && [_numberTextField isFirstResponder])
{
_switchNumButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_switchNumButton setTitle:@”123″ forState:UIControlStateNormal];
[_switchNumButton setBackgroundImage:[UIImage imageNamed:@”num.png”] forState:UIControlStateNormal];
_switchNumButton.frame = CGRectMake(1, 173, 78, 42);
[_switchNumButton addTarget:self action:@selector(changeCutomeButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
[_keyboardDefaultView addSubview:_switchNumButton];
}
else
{
if (_switchNumButton) {
[_switchNumButton removeFromSuperview];
}
}
}

使用Python来做物联网

使用Python来做物联网,就是这么easy!

%title插图%num

搭建整套物联网系统的方法有很多,*近四处捣鼓,使用python + 阿里云搭建一套*简单的物联系统,可以将单片机上的数据通过阿里云传输到PC端。 一、基本结构 先看架构图 框架.png 二、设备端接入 物联网终端是用的ESP32,是一款自带蓝牙和Wifi的单片机。利用它可以直接接入互联网,无需其他模块。当然你可以将现在流行的NB-Iot模块来联网,不过需要自己写一下驱动程序。我买的模块是支持micropython开发的,在淘宝上可以搜索到,用起来很方便。有时间我会补上这一块的初步教程。 ESP32模块.jpg Micropython是可以在低端硬件上运行的python,可以使用python语言直接操作IO 和MCU的外设比如UART、I2C等,用起来非常方便,不要搭建复杂的开发环境,也不需要学习寄存器配置。作为一个对传统MCU开发非常熟悉的硬件工程师来说,感觉操作起来非常简单。目前Micropython已经支持很多硬件了,应该用比较广泛的STM32部分系列也被支持。Micropython也已经支持很多常用的库,比如蓝牙,telnet,mqtt等。下面这个链接是micropython的中文论坛。 www.micropython.org.cn/bbs/forum.p… ESP32 通过wifi 接入互联网,使用mqtt协议接入阿里云,将温度数据上传至阿里云。在云端通过消息订阅可以直接查看温度信息。在PC端使用python调用MQTT协议,接入到阿里云。但是PC端和ESP32在阿里云上是两个不同的设备,需要通过阿里云来转发信息,这样PC就可以拿到ESP32上传的数据了。 ESP32 上的代码如下: from umqtt.simple import MQTTClient import usocket as socket import time import wifi

wifi.connect()

#Demo_01 ProductKey = “”#使用你自己的 ClientId = “1234|securemode=3,signmethod=hmacsha1|” DeviceName = “Demo_01” DeviceSecret = “**********************”#使用你自己的

strBroker = ProductKey + “.iot-as-mqtt.cn-shanghai.aliyuncs.com” Brokerport = 1883

user_name = “Demo_01&”#使用你自己的 user_password = “*************************************”#使用你自己的

print(“clientid:”,ClientId,” “,”Broker:”,strBroker,” “,”User Name:”,user_name,” “,”Password:”,user_password,” “)

def connect(): client = MQTTClient(client_id = ClientId,server= strBroker,port=Brokerport,user=user_name, password=user_password,keepalive=60) #please make sure keepalive value is not 0

有几点需要说明: 1.代码中的wifi.connect()函数需要自己编写,网上能搜到类似的,也可以打赏私信我所要源码。 2.阿里云物联网平台的接入需要进行三元组认证,会根据一定的规则生成登录名和密码,这个网上信息还是比较全面的。 3.向阿里云物联网平台发布消息的格式一定要按照代码中所写,网上很多代码,但是对这一块的描述都不清楚。 Micropython使用的umqtt.simple库,一定要设置keepalive时间,否则无法连接。这一点我是摸索了好久,*终通过查看库的源码才发现的问题。 三、云端设置 在云端建立一个高级产品,并创建两个设备,以供ESP32 和PC连接。 device.JPG 需要在产品中定义一下功能。 device_define.JPG 云端和设备端都建立好了之后,可以查看设备运行状态看到数据上传 云端数据查看.JPG 这是查看数据记录得到的结果 云端数据记录.JPG 当你看到正确的数据之后,就说明你的成功接入物联网并上传了数据。 接下来就是*重要的部分——设置是使用规则引擎来进行数据转发,将设备demo_01的数据转发到demo_02。这一步的语法很重要,虽然有官网有详细教程,但是当时还是搞了好久才完全正确。 规则查询语句: SELECT items.IndoorTemperature.value as IndoorTemperature FROM “/sys/use-your-productkey-here/Demo_01/thing/event/property/post” WHERE items.IndoorTemperature.value > 0 四、PC端接入 PC 端使用python模拟MQTT设备登陆阿里云订阅消息就行了,只要装好python很快就可以实现,网上也有很多代码。代码的很大一部分就是在做三元组认证,可以将这部分稍微修改一下来计算ESP32 登陆时所需的 PC端python代码如下: # coding=utf-8 import datetime import time import hmac import hashlib import math

try: import paho.mqtt.client as mqtt except ImportError: print(“MQTT client not find. Please install as follow:”) print(“pip install paho-mqtt”)

#Demo_02 ProductKey = “*********”#使用你自己的 ClientId = “2234” # 自定义clientId DeviceName = “Demo_02” DeviceSecret =”**********************************8″#使用你自己的

us = math.modf(time.time())[0] ms = int(round(us * 1000)) timestamp = str(ms)

def calculation_sign(signmethod): data = “”.join((“clientId”, ClientId, “deviceName”, DeviceName, “productKey”, ProductKey, “timestamp”, timestamp))

strBroker = ProductKey + “.iot-as-mqtt.cn-shanghai.aliyuncs.com” port = 1883

client_id = “”.join((ClientId, “|securemode=3”, “,signmethod=”, “hmacsha1”, “,timestamp=”, timestamp, “|”)) username = “”.join((DeviceName, “&”, ProductKey)) password = calculation_sign(“hmacsha1”)

print(“=”*60) print(strBroker) print(“client_id:”, client_id) print(“username:”, username) print(“password:”, password) print(“=”*60)

def on_connect(client, userdata, flags, rc): print(“OnConnetc, rc: ” + str(rc))

def on_publish(client, msg, rc): if rc == 0: print(“publish success, msg = ” + msg)

def on_subscribe(mqttc, obj, mid, granted_qos): print(“Subscribed: ” + str(mid) + ” ” + str(granted_qos))

def on_log(mqttc, obj, level, string): print(“Log:” + string)

def on_message(mqttc, obj, msg): curtime = datetime.datetime.now() strcurtime = curtime.strftime(“%Y-%m-%d %H:%M:%S”) print(strcurtime + “: ” + msg.topic + ” ” + str(msg.qos) + ” ” + str(msg.payload)) on_exec(str(msg.payload))

def on_exec(strcmd): print(“Exec:”, strcmd) strExec = strcmd

if name == ‘main’: mqttc = mqtt.Client(client_id) mqttc.username_pw_set(username, password) mqttc.on_message = on_message mqttc.on_connect = on_connect mqttc.on_publish = on_publish mqttc.on_subscribe = on_subscribe mqttc.on_log = on_log mqttc.connect(strBroker, port, 120) # mqttc.loop_start() time.sleep(1) temperature =27.55 mqttc.subscribe(“/sys/************/Demo_02/thing/service/property/set”, qos=1) # 换成自己的 #send_mseg = ‘{“pm_25″: %s,”area”:”%s”,”time”:”%s”}’ % (0, 0, datetime.datetime.now()) #send_mseg = ‘{“id”: “1234”, “version”: “1.0”,”params”: {“IndoorTemperature”: %s},”method”: “thing.event.property.post”}’%(temperature) send_mseg = ‘{“params”: {“IndoorTemperature”: %s},”method”: “thing.event.property.post”}’ % (temperature)

五、总结 工作之余了解了一下物联网的发展,看到有意思的东西打算学一下,刚好看到了microPython,震惊之余,决心做点小东西玩玩。 这套框架全部使用python实现,比我了解到的*大多数物联网方案要简单太多,虽然有些开发首先,但是用来实现一些简单设计应该是不成问题的,只要你会python,这套系统可以很快构建。当然python也是非常好学的,长期使用C语言的人根本不需要什么学习就可以上手。

探索网络虚拟世界的“藏宝图”!网络空间地图技术与市场分析

随着全球信息化的发展,网络已经覆盖人类生产和生活的诸多领域。特别是近年来,5G网络、大数据、人工智能(AI)、物联网等新兴信息技术迅速普及和推广,进一步推动物理空间的信息化和网络化。网络空间(Cyberspace)逐渐成为物理空间的全息映射,成为继“陆海空天”后的第五大疆域。2016年12月发布的《国家网络空间安全战略》指出,网络空间由互联网、通信网、计算机系统、自动化控制系统、数字设备及其承载的应用、服务和数据等组成。网络空间所承载的分布广阔、数量庞大的信息资产,蕴藏着无数“瑰宝”,正不断激发人类的探索欲望。

没有网络安全就没有国家安全。2016年4月19日,*总书记在“网络安全和信息化工作座谈会上的讲话”中强调,“感知网络安全态势是*基本、*基础的工作。要全面加强网络安全检查,摸清家底,认清风险,找出漏洞,通报结果,督促整改”。由于网络空间包含的信息量巨大,结构复杂,探索网络空间迫切需要一个与百度地图、高德地图类似的工具,将网络世界中的“一草一木”有效标识出来。基于网络空间地图提供的方向标,人们便可按图索骥,快速寻觅到“宝藏”。

%title插图%num

网络空间地图的概念和特点

网络空间地图是一种基于系列测绘技术, 反映网络空间中各种信息实体的地理位置、逻辑关系、通联结构及变化状态的可视化地图。狭义的网络空间地图主要基于IP地址或物理节点展示网络对象与地理坐标的对应关系,强调其物理空间的归属性;而广义上的网络空间地图则更加立体,具有多层次、多维度特点,可以将传输网、IP网、设备组成、系统服务、业务通联、安全动态乃至社交热点等跨越物理域、逻辑域、认知域的信息进行有机组织、分层叠加投射至地图之上。

那么,对于用户来说,什么是网络空间地图应该具备的优秀特质呢?类似物理空间地图效果,网络空间地图也应具备准确、高清的特点,能够准确标识出信息资产的地理属性、网络属性、应用属性乃至社会属性,拥有良好的人机接口,面向不同用户呈现信息资产的多维画像。此外,由于网络空间瞬息万变,信息资产*易受到外部条件的触发而发生改变。静态信息无法反映出信息资产的多变状态,有时甚至会造成对信息资产客观情况的扭曲,所以优秀的网络空间地图还应具物理空间地图所不具备的时效性和动态性,及时、客观地反映出信息资产的*新特征。

%title插图%num

网络空间地图依托的实现技术

人们主要通过网络空间测绘手段来得到网络空间地图。网络空间测绘的概念*初源自物理空间的地理测绘学,专门指对地理环境中实体对象的空间结构特征进行概括和抽象,并对其空间位置进行测量和绘制。网络空间测绘是地理测绘在网络空间的拓展,主要指的是对网络空间中各种信息资产的地理位置信息和网络信息进行主动或被动方式的探测、采集与分析,并以此来建立设备的相互关系索引,描绘网络逻辑连接关系,从而帮助用户掌握网络空间中各种信息资产的实时动态。

网络空间测绘使用到的技术通常包括网络探测扫描技术、协议分析技术、IP定位技术、拓扑测量技术、大数据分析与存储技术、网络可视化技术和漏洞扫描验证技术等。

(一)网络测量和协议分析技术

网络空间有约40亿IPv4地址空间和几乎无限多的IPv6地址空间,这些地址分布于全球各地,是网络通联和信息服务的基础,与IPv4/IPv6地址相对应的是域名地址,全球已注册域名超过3亿,并以每年超1千万的数量增长。如此庞大的IP地址空间和域名空间是网络空间组成节点的“门牌号”,需要大量探针基于这些“门牌号”去访问、识别和记录海量节点的信息要素。

网络探测和协议分析是探针的关键技术,其工作过程通常分为三个阶段:

一是利用已知地址集或通过地址推测算法,基于TCP/IP协议快速探测目标IP和端口服务的存活性;

二是基于协议特征或应用服务特征(指纹库),与目标端口服务进行尝试交互,识别服务类型和基本属性(例如,设备型号、操作系统类型、应用软件版本等);

三是基于协议深度交互,获取目标深层信息(例如,组件结构、漏洞信息、归属信息等)。

因此,网络探测和协议分析是获取网络空间信息资产的主要手段,其能力直接影响网络空间地图的全面性和准确性。

(二)漏洞扫描和验证技术

漏洞扫描和验证是基于漏洞特征或机理,主动开展信息采集和协议交互的漏洞识别技术,是发现威胁进而及时处置威胁的重要技术。对于新爆发的漏洞,传统漏洞扫描主要在更新规则策略后对指定资产开展一次全新的漏洞检查,这对于局域网或小范围的网络较为有效,但对国家范围或互联网范围的节点进行漏洞排查则过于缓慢。

网络空间地图对漏洞的检查充分利用了大数据能力,通过提前获取系统特征,在新漏洞爆发时先对历史数据进行快速比对,然后利用大量分布式节点对筛选出的可疑目标进行快速漏洞验证,可以确保在1-Day内大范围摸清漏洞的分布与影响。

(三)拓扑测量技术

网络拓扑即网络互联结构,如同地球上四通八达的交通图,需全面监测和有效掌握。全球互联网由一个个自治系统(Autonomous System,简称AS)连接而成,每个自治系统在全球有一个唯一编号(ASN),对应某个管理机构控制下的路由器和网络群组,即分支众多的路由节点和数量庞大的IP地址。这些AS自治域、路由节点、IP地址组成了全球互联Internet网络拓扑。

全球目前共分配17.6万多个AS自治系统号,遍布240个国家和地区。其中,中国所分配的AS自治系统号码数超过2800个。

网络空间拓扑测量主要基于Ping、Traceroute、SNMP、ARP、DNS和NETCONF等探测技术,以及公开信息采集和开源情报辅助等手段,对全球及指定国家、区域、网段进行拓扑探测和绘制,构建包括AS级、POP级、路由器级、IP接口级的网络拓扑,支撑实现对网络拓扑的分层、分区域显示。拓扑测量需要一定规模的分布式节点群对全球互联网开展持续监测,其中算法复杂,数据存储与运算量大,还有不少技术需不断深化。

(四)IP定位技术

世界各国的IP地址空间由全球互联网名称与数字地址分配机构(ICANN)进行分配,目前IPv4空间已于2011年分配完毕,而IPv6地址空间足够各国长期使用。受制于路由器部署位置、路由表的信息量和更新频率,*大多数情况下,各国的IP地址分配会与地理区域相关。

因此,采集IP地址与地理位置对应关系后,可基于IP地址查询其所对应位置,或基于地理区域查询包含的IP地址集合。IP定位库将网络空间地址与地理空间地址建立了关联,对统计、监管甚至网络犯罪侦查等应用领域非常重要,也是网络空间地图所依赖的重要资源库。

国内外有专门的厂商基于路由探测、情报分析等手段采集IP定位信息,并以数据服务方式提供用户使用。出于隐私考虑,这些IP定位信息精度相对较粗,很难达到街道级别,但可以适应大部分应用情况,例如,网络客户地理位置统计、城市内IP资产统计等。

更高精度的IP定位,需要基于主被动采集、WiFi热点采集、GPS关联、多点定位等多手段融合获得精准数据,应在法律允许范围内开展相关业务。

(五)知识图谱分析

多源网络空间资产数据的语义模型构建、语义数据采集和存储,在此基础上建立网络空间核心资产的知识图谱,形成基于知识图谱的网络空间资产指纹库;同时构建异构多源的网络空间资产数据上下文的标准化描述、语义建模及上下文语义查询和推理引擎,实现基于上下文语义的精确资产数据源搜索,定位和网络资产数据源的动态绑定机制。

核心在于对多模、多源异构数据和多维复杂关系的高效处理与可视化展示,将测绘数据和社会数据进行深度挖掘,通过数据融合分析,用数学模型直接表示的关联属性,融合成一张以关系为纽带的数据网络。通过对关系的挖掘与分析,能够找到隐藏在行为之下的关联,并进行直观的展示。

(六)大数据存储与分析技术

网络空间由海量节点组成,其信息量和处理模式是典型的大数据特点,网络空间地图对网络与节点的深层挖掘、关联分析、漏洞发现等都需要大数据加持。在存储方面,由于每日需存储数千万条探测数据,同时开展内容检索、深度挖掘与综合分析等复杂任务,这对数据的存储和管理构成较大挑战,为满足大容量、准实时、高吞吐等性能要求,需要在分布式存储、分布式检索等方面持续优化。

在大数据分析方面,为了找寻数据间的关联,需要对不同类型的数据内容进行检索、深度挖掘和综合分析。建模是大数据分析技术的核心工作,主要是选择和应用各种数学模型,同时对模型参数和输入变量进行校准调优,在生成*终的数据集后,用构建好的模型进行聚类分析。在对数据作进一步归类和统计的基础上,*终建立资源画像和资源间的关联关系,形成指纹信息库、地理信息库、威胁情报库和漏洞库等知识库。

(七)网络可视化技术

网络可视化技术可基于网络探测和大数据分析的结果,综合运用信息处理与图形图像展示手段,将网络空间中抽象化的信息资产和逻辑关系映射为网络空间的全息地图,在归类、统计、分层等基础上通过丰富的图形化手段直观展示网络空间的物理链路、逻辑拓扑、资产画像、流量内容、安全态势等多维度信息,为摸清资产分布、掌握漏洞信息、感知趋势变化、支撑指挥决策等提供重要手段。

%title插图%num

网络空间地图的应用场景

网络空间地图的使用比较广泛,大可以覆盖整个互联网,作为网络空间的“地形图”,服务于国家安全和相关监管部门,为互联网资产监测提供支撑;小可以深入企业内网,充当“建筑结构图”,以SaaS方式服务于广大有资产管理需求的企业组织,为IT资产的有效管理提供支持。具体来说,网络空间地图的应用场景包括以下多方面:

(一)网络战中的沙盘推演

在传统军事作战中,作战地图是分析地形地貌、判断敌我态势、实施兵力部署和辅助指挥作战的重要工具。当下,网络空间已成为新的军事竞技场,地图在网络空间作战中赋予了新的使命和意义。网络跨越国界联接世界各地,信息光速可达,网络攻击转瞬完成。

而要在网络空间形成一招制胜的攻击能力或构筑坚如铜墙铁壁的防御能力,则需要有全局的洞察能力和深层信息的刺探能力。网络空间地图是国家之间、组织之间开展网络攻防的态势底图,是构建陆海空天联合的立体作战视图的基础。网络中的信息中枢、关键设施、防御要隘、可用资源等都可通过网络空间地图系统深度感知和有效标识,为沙盘推演、排兵布阵、态势掌控、指挥作战提供重要支撑。

(二)互联网安全监管中的“挂图作战”

“挂图作战”是通过直观的图表形式来将计划的实施方案、工作流程和执行进度等内容呈现出来,用于指导计划具体实施过程的工作方式,是一种类似作战的快速响应行动方式。由于其具备直观性和客观性,方便任务进展跟踪,一些重大项目(例如,灾害防治、环保监测等)纷纷借鉴了这种工作方式,在趋势研判和指挥调度中成效显著。

近年来,随着信息化、网络化全面推广,网络监管和安全保障越来越重要,各地相关部门纷纷开始筹建用于互联网安全监管的“挂图作战”指挥平台。网络空间地图对全局资产的信息采集及对网络安全态势的展现效果与“挂图作战”思路不谋而合,这为其在互联网安全监管业务中的应用提供了广阔的舞台。

通过网络空间地图,资产标识、漏洞分布、安全影响一目了然,一旦爆发安全漏洞或攻击,监管方便能及时收到预警,看到相关目标和坐标,并据此迅速开展应急响应办法。

(三)关键基础设施保护与IT资产管理

IT资产是指计算设备、信息系统、网络、软件、虚拟计算平台以及相关硬件等。IT资产管理的核心是要跟踪、审计和监控IT资产全生命周期状态。不同于静态的物理资产,信息资产在整个生命周期中的状态通常在不断变化,仅依靠人工统计,显然跟不上信息资产的变化速度。

对于IT资产规模庞大且部署分散的组织,IT资产管理难度很大,特别是对国家关键基础设施的监管更是一个大的工程挑战。*优化利用和分配现有IT资产,方可*大限度地保护信息技术上的投资,而这种决策离不开高价值的战略情报。基于网络空间地图勾勒出的信息资产“全息”样貌,决策者就可以从全局视角把握资产属性、运行状态和发展趋势,减少资产管理决策活动的不确定性。

同时,网络空间地图还可以与相关安全系统做深度整合,在典型的IT资产生命周期中,充分发挥其对动态信息资产的跟踪效能,及时捕捉信息资产在全生命周期任一阶段出现的异常情况,辅助开展IT资产的脆弱性管理和风险控制,并*终实现IT资产的安全运营。

(四)物联网资产监控管理

物联网技术爆发已让万物互联成为现实。智能摄像头、车联网、充电桩、智能电表/水表开始遍布世界的各个角落。物联网资产监控管理首先要解决的是安全问题。物联网的部署特点和低功耗要求,使其安全较为薄弱,例如,连接内网的室外摄像头、地处偏僻位置的ATM机、客源稀少的自动贩卖机等,都可能成为黑客入侵整个系统的着力点,增大了信息被窃取的机会,甚至有业务瘫痪的风险。为此,运营者需要通过网络空间地图探测并持续更新所有物联网资产的准确清单,在此基础上,识别和解决与资产的安全漏洞。

此外,网络空间地图展现的物联网资产全网分布情况,也能给厂商制定市场竞争策略提供高价值的战略情报,从而有重点地选择市场投放区域。

(五)数字孪生及智慧城市感知与运营

作为一种实现信息化与城镇化深度融合的城市信息化高级形态,智慧城市基于城市的精细化和动态管理,*大提升了城市运营效率,改善了市民生活质量。智慧城市是由数据驱动的,其建设与运营依托通信网、IPv6网、物联网、云计算、大数据等新一代IT技术实现的泛在互联和全面感知。

网络空间地图可以成为智慧城市感知和运营的基础,其作用主要体现如下:

*,保证信息资产的能见度。智慧城市中不断增加的托管资产和物联网设备是管理难题,网络空间地图可以帮助识别环境中的所有资产,深入感知信息资产所处的IT环境状况,了解它们当前所处的生命周期阶段以及如何影响业务,管控风险,提升安全。

第二,有助于制定资产管理计划。网络空间地图可以提高智慧城市的运营效率,便于跟踪和展示IT资产,并为漏洞发现、威胁感知、事件响应、故障排除等问题提供解决方案支撑,管理者可以基于网络空间地图获取相关状态信息来推进资产管理计划。

第三,有助于保证合规性。网络空间地图可以监视网络中的硬件和软件组件,检查是否安装了未经授权的软件或硬件,帮助管理者为审核做好准备,从而有效降低法律风险。

第四,有助于控制IT成本。网络空间地图提供的资产数据有助于资产利用率分析和预算规划,帮助智慧城市*大限度地提高现有资产利用率,优化资产使用并控制IT资产采购支出。

%title插图%num

网络空间地图的市场应用前景

网络空间地图是构建数字世界的必备的基础技术能力,随着其被广泛应用到多种领域,未来将继续探索更多的可能性。那么,网络空间地图的市场空间究竟是怎样的?其成长潜力有多大?这实际上取决于智慧城市、IT管理、物联网以及网络安全等相关产业的投资规模和发展前景。

由于国内政策红利已得到释放,市场资金大量涌入智慧城市、IT运维管理、物联网和网络安全等新兴产业。有数据显示,2019年我国智慧城市市场规模估计已突破10万亿元,我国网络安全市场规模同期约为478亿元;2020年IT运维管理市场规模将达到2690亿元左右,物联网市场规模同期也将突破2万亿元。考虑到市场重叠因素,保守估计,目前新兴市场总体规模已超过10万亿元。

这些产业蕴含着巨大的IT资产管理和网络空间地图的市场机会,当前保守估计,网络空间地图至少已经存在3到5亿元的市场需求量。未来几年随着相关产业的全面崛起,网络空间地图市场将快速走向成熟,有望进一步被放大到数十亿元的规模。作为连接网络虚拟空间和物理空间的桥梁,网络空间地图的未来可期,潜力无限!

国行三星系统的推送和 hms mipush ov 比较如何

国行三星系统的推送和 hms mipush ov 比较如何?

三星针对国产应用的推送做的如何:

   2021-02-23 23:26:13 
 1 PMR   30 天前 。。。。。。 OS 要针对 APP 做推送? 反向操作 三星支持国内 UPA 常用应用基本上都接入 UPA oppo vivo mi oneplus 等基本都用 UPA 自主知识产权的 UI 还在走自己的路
2 JensenQian   30 天前 去年底好像三星支持了统一推送 https://www.bilibili.com/read/cv9161450/,不过现在的推送个人觉得走推送的推送的也基本上广告,而且 QQ 微信这种东西不走推送
3 Lin0936   30 天前 等 于 没 有
4 liuxey   30 天前 三星四年用户,除了微信开了自启动可以收到通知,其他 app 没一个能正常推送的 可能我使用的 app 都没接入这些推送平台吧。。
5 JensenQian   30 天前 @JensenQian #2 三星国内真的太小众了,国内比起华米 OV 的销量来说真的是 others,软件适配上慢着也真的没办法了, 关于三星国行推送通知的问题,你可以去看下三星自己的盖乐世社区的讨论
6 sue0917   30 天前 via Android 没推送等于没广告,还不满足吗
7 keymao   30 天前 @PMR 自主知识产权 UI 恰恰是*批接入 upa 的…. ov 紧随其后,之后才是 mi,lenovo 是*后一批 。 其实战狼软实力相当不错的 ,要明晰敌人的缺点,也要学习敌人的优点 ,不能片面的看待事物
8 james504   30 天前 三星没有推送,但有促销时会弹广告是真的。相比起国产各类 UI 来说那是没有广告很干净,但不好的地方是比如我常用的豆瓣或其他类 App 都不能通过禁止后台而收到通知,而像 outlook 等从 play 市场下载的又需要挂了科学上网才能有通知。个人喜好纯净的系统,索尼、pixel 、三星这些,宁愿不要广告而选择干净。
9 hantsy   30 天前 我用三星 10 年了。三星本来就有自己的推送服务。 三星*大的好处,可以杀掉进程,关闭所有的推送,让手机清静一下。 @sue0917 大部分可能特别喜欢支付宝,天猫,JD 的广告吧。 现在我除了 三星助手(日常任务,行程,快递都可以通过助理收到通知)等少数几个 APP,其它通知全部关闭,大部分程序加入深度睡眠。
10 Cheons   30 天前 via Android 营销广告,在使用前能不勾选的
11 S179276SP   30 天前 华为支持 QQ,算是大杀器,坐等支持微信。
12 alfchin   30 天前 via iPhone @liuxey 有接 FCM 的也能推。。。但是有时候不给自启动推不了
13 maplerecall   30 天前 via Android QQ 微信都没问题,应该是走的 APP 推送所以很及时,其他少数加了白名单也的正常推送,没加白名单的就和没装一样,只要不打开就永远不会有消息,挺舒服的。
14 ggmood   30 天前 幸好取消了三星的订单
15 skyyws   29 天前 手持 s10,QQ 和微信都没啥问题,其他 APP 只要没有后台运行,就收不到消息。。。感觉应该大部分都是走 APP 推送吧,用了快 2 年了,准备考虑再换回苹果了。。。
16 Cielsky   29 天前 via Android 就 hms 和 mipush 可以看看吧。

如何快速入门Python

如何快速入门Python

学习任何一门语言都是从入门(1年左右),通过不间断练习达到熟练水准(3到5年),少数人*终能精通语言,成为执牛耳者,他们是金字塔的*顶层。虽然万事开头难,但好的开始是成功的一半,今天这篇文章就来谈谈如何开始入门 Python。只要方向对了,就不怕路远。

设定目标

当你决定入门 Python 时,需要一个清晰且短期内可实现的目标,比如通过学习找一份初级程序员工作,目标明确后,你需要了解企业对初级程序员有哪些技能要求,下面是我从拉勾网找的一个初级 Python 工程师的任职要求:

做 Python 开发除了熟悉语言本身之外,还需要掌握很多相关联的技能,好比打NBA,你不光要学如何投篮,还要练习力量、技战术等一整套东西。所以,一个普通 Python Web 开发工程师需要掌握的技能包括至少一个Web框架,比如:Django、Flask、Tornado,做业务系统离不开数据库的支撑,另外,还需要对Linux系统的基本操作和常用命令有所了解,因为以后你写到程序基本上都会运行在Linux平台上。

接下来我从这几个方面逐一介绍

Python3?

不少新手总是纠结是学 Python2 还是 Python3,就像手里同时有包子和馒头,不知道先吃哪个,这种纠结完全就是徒增烦恼,因为它们是同一种语言,只有少部分地方语法不兼容,尽管目前大部分公司还在用 Python2,但是 Python3 逐渐成为主流已是不争事实,毕竟后者性能方面更占有优势,官方也在力推Python3。所以毫不犹豫地选择 Python3 吧,*多花一天的时间能把 Python2 中特有的内容搞懂。

开发工具

工欲善其事必先利其器,做 Python 开发的 IDE(编辑器)层出不穷,我只推荐 Pycharm 和 Sublime,两个工具都可以免费使用,而且它们的学习成本非常低,网上找一篇教程看了基本就能上手,Vim、Emacs 这样的远古神器还是放以后再去了解吧。另外,今后你所遇到的 90% 的问题都有可能通过Google和StackOverflow来解决。

学习资源

网上入门资源琳琅满目,一本好书能为你指点迷津。快速了解 Python 可以看一下 Learn Python in Y minutes 这篇文章。但千万不要被标题所迷惑,一门语言不可能几分钟就能学会,看完之后应该会对Python 有个初步的印象,照着示例操作完之后,你就要选择一本合适入门的教程,《A Byte of Python》是一本值得推荐的书籍,来说说我推荐这本书的理由。

《A Byte of Python》的中文名叫《简明 Python 教程》,这本书的*新版已经是第10版,基于 Python3.5,所以不担心是否知识落后的问题,其次,这本书的厚度152页非常适合入门,涵盖了 Python 入门所有内容,相对那些五六百页的大部头书来说非常精简了,2个星期能啃完。

这本书看完之后,你应该能设计出简单程序出来。再推荐一本书《Python学习手册》作为进阶学习,内容相对要更深入,适合有一定编程基础的人阅读。

做Web开发,HTML、JS、CSS 是必须有所了解的,作为前端技能,不一定要深入了解,做到能写基本的HTML代码就够了,此外,你还需要了解 HTTP 协议(推荐《图解HTTP协议》)。目前比较主流的Web框架有 Django、Flask、Tornado,各自都有各自的特点,Django 文档丰富、Flask 短小精悍、Tornado 异步并发。这里推荐使用 Flask,推荐书目《Flask Web开发:基于Python的Web应用开发实战》

Linux 推荐《快乐的 Linux 命令行》,同样是一本非常经典的入门迷你书,没有太多理论,范围也不太宽

MySQL只推荐一本《MySQL必知必会》,不到250页的小册子,实践性很强,没有什么艰深晦涩的理论堆砌,看完这本书基本入门数据库了。

*后

只看书不会进步,思考和实践才有成长,自学编程是一个比较枯燥的过程,如果没有正向反馈,学习的积*性很容易被打压下来,所以你应该积*参与到相关的技术圈子中去,尝试去解答力所能及的新手问题,向圈子中的大牛们寻求帮助,善于总结自己所学到的东西,分享给更多的人

MCBE 服务器

开了个 MCBE 服务器,之前用的飞儿云(阿里云)的机子,一个月 62,小服务器都没什么人玩,不划算,吃不消。 有无推荐的,靠谱点的服务器供应商,穷学生就和朋友一起玩玩,配置要求不高。

CEBBCAT 159 天前 via Android
怎么把标题当 tag 用啊?
locoz 2
locoz 159 天前 via Android
给你开个虚拟机…?
DevHuaJi 3
DevHuaJi 159 天前
@locoz 啥意思
locoz 4
locoz 159 天前
@DevHuaJi #3 我家服务器闲置着,可以给你开个虚拟机跑服务端,出点电费就行了
DevHuaJi 5
DevHuaJi 158 天前
@locoz 可以啊
DevHuaJi 6
DevHuaJi 158 天前
@locoz 企鹅 2981144675 来 py 吗
goyiyi 7
goyiyi 158 天前 via Android
info2s 上看看,很多闲置的云服务器
DevHuaJi 8
DevHuaJi 158 天前 via Android
@goyiyi 看了下,对我来说还是有点贵了。不过谢谢哈
stranger75 9
stranger75 157 天前
可以看看套路云的香港轻量,24 一个月,1h1g30M 带宽,每月 1TB 流量
locoz 10
locoz 156 天前 via Android

@DevHuaJi #6 加你了

Stictonotus 156 天前
Minecraft 类服务器, 可以考虑试试国内 Minecraft 生态的特色,通过 QQ 售卖的 NAT VPS 。
这类 oneman idc 在 MC 圈里非常多,而且名字参差不齐,随便加一个 MC 开服之类的 QQ 群就能看到。
如果想要被坑或者想对服务器有更深刻的经验的话,可以试试购买这种服务器。

或者,你可以试试 MCBE 的面板服务器,本质上是 docker 的容器,外加一个类似于 cPanel 的管理面板。位置在国内的价格大概也就在 10-20rmb/mo 左右,共享 CPU,2GB~容器内存。非常适合基友服。
m2idk 12
m2idk 135 天前
你要用 Falixnodes 也可以,只是經常停機
登入方面應該要翻牆(Discord 登入法)

iOS开发 — 获取网络状态

之前用的根据状态栏获取的,iOS 13貌似不行了。。。

#import <Foundation/Foundation.h>
typedef enum {
NETWORK_TYPE_NONE = 0,
NETWORK_TYPE_WIFI,
NETWORK_TYPE_2G,
NETWORK_TYPE_3G,
NETWORK_TYPE_4G,
NETWORK_TYPE_5G, // 5G目前为猜测结果

} NETWORK_TYPE;

@interface BaseTooles : NSObject

+ (NETWORK_TYPE)SDKgetNetworkTypeFromStatusBar;
/*!
* 获取当前网络类型
* 通过statusBar的网络subview获取具体类型
*/
+ (NETWORK_TYPE)SDKgetNetworkTypeFromStatusBar{

NSArray *subviews;

if([[[UIApplication sharedApplication] valueForKeyPath:@”_statusBar”] isKindOfClass:NSClassFromString(@”UIStatusBar_Modern”)]) {
// iPhone X
subviews = [[[[[UIApplication sharedApplication] valueForKeyPath:@”_statusBar”] valueForKeyPath:@”_statusBar”] valueForKeyPath:@”foregroundView”] subviews];
} else{
subviews = [[[[UIApplication sharedApplication] valueForKeyPath:@”_statusBar”] valueForKeyPath:@”foregroundView”] subviews];
}

// NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@”statusBar”]valueForKey:@”foregroundView”] subviews];
NSNumber *dataNetworkItemView = nil;
for (id subview in subviews) {
if ([subview isKindOfClass:[NSClassFromString(@”UIStatusBarDataNetworkItemView”) class]]) {
dataNetworkItemView = subview;
break;
}
}
NETWORK_TYPE nettype = NETWORK_TYPE_NONE;
NSNumber *num = [dataNetworkItemView valueForKey:@”dataNetworkType”];
switch ([num intValue]) {
case 0:
nettype = NETWORK_TYPE_NONE;

break;
case 1:
nettype = NETWORK_TYPE_2G;

break;
case 2:
nettype = NETWORK_TYPE_3G;

break;
case 3:
nettype = NETWORK_TYPE_4G;

break;

default:
nettype = NETWORK_TYPE_WIFI;
break;
}

return nettype;
}

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