网络编程

目录
  • 网络编程
    • 一、OSI七层协议
      • 1.OSI七层协议之物理链接层
      • 2.OSI七层协议之数据链路层
      • 3.OSI七层协议之网络层
      • 4.OSI七层协议之传输层
      • 5.OSI七层协议之会话层
      • 6.OSI七层协议之表示层
      • 7.OSI七层协议之应用层
    • 二、socket模块
    • 三、并发编程理论
      • 1.操作系统发展史(可以说CPU的利用率发展史)
      • 2.多道技术
      • 3.进程理论
      • 4.进程的并行与并发
      • 5.进程的三个状态、同步异步、阻塞与非阻塞、综合使用
      • 6.创建进程的两种方式
      • 7.进程对象的多种方法
      • 8.多进程数据错乱问题 模拟抢票软件
      • 9.进程池与线程池
      • 10.协成

网络编程

引言 本篇文件研究的网络编程是指基于网络编写代码 能够实现数据的远程交互。实现数据的远程交互必备的基础条件是物理连接介质 比如网卡、网线、电话线。

一、OSI七层协议

OSI (Open System Interconnect ,开放式系统互连)七层协议:规定了所有的计算机在远程数据交互的时候必须经过相同的处理流程、在制造过程中必须拥有相同的功能硬件。接受网络消息 数据由下往上传递、发送网络消息 数据由上往下传递。OSI七层协议口诀为:应、表、会、传、网、数、物,常见的是整合之后的五层或四层。

应用层、表示层、会话层、传输层、网络层、数据链路层、物理链接层(七层)

应用层、传输层、网络层、数据链路层、物理链接层(五层) (核心)

应用层、传输层、网络层、网络接口层(四层)

# 网络相关专业名词(基础储备知识)
'交换机':能够将所有接入交换机的计算机彼此互联起来
'广播':首次查找接入同一个交换机的其他计算机需要朝交换机里面吼一嗓子
'单播':首次被查找的计算机回应查找它的计算机并附带自己的mac地址
'广播风暴':接入同一台交换机的多态计算机同时发广播
'局域网':有单个交换机组成的网络 在局域网内可以直接使用mac地址通信
'广域网':可以理解为范围更大的局域网
'互联网':由局域网、广域网连接到一起形成的网络
'路由器':用来链接不同的局域网计算机的介质

1.OSI七层协议之物理链接层

建立物理链接介质

2.OSI七层协议之数据链路层

# 规定了电信号的分组方式
# 以太网协议
规定了计算机在出厂的时候都必须有一块网卡 网卡上有一串数字
该数字相当于是计算机的身份证号码是独一无二的
该数字的特征:12位16进制数据(前6位产商编号 后6位流水线号)
该数字也称为:以太网地址/MAC地址

3.OSI七层协议之网络层

IP协议:规定了所有接入互联网的计算机都必须有一个IP地址 类似于身份证号
mac地址是物理地址可以看成永远无法修改
IP地址是动态分配的不同的场所IP是不同的、可以用来标识全世界独一无二的一台计算机、可以跨局域网传输
IP地址特征:
IPV4:点分十进制
0.0.0.0
255.255.255.255
IPV6:能够给地球上每一粒沙分一个IP地址

4.OSI七层协议之传输层

TCP与UDP都是用来规定通信方式的
通信的时候可以随心所欲的聊 也可以遵循一些协议符合要求的聊
随性所欲的聊:文字 图片 视频 小油腻话 你侬我侬
遵循一些协议:开头带尊称 首行空两格 只准用官话 不能打情骂俏

1.TCP协议(重要)
三次握手建链接
TCP协议也称为可靠协议(数据不容易丢失)
造成数据不容易丢失的原因不是因为有双向通道 而是因为有反馈机制
给对方发消息之后会保留一个副本 直到对方回应消息收到了才会删除
否则会在一定的时间内反复发送
洪水攻击同一时间有大量的客户端请求建立链接 会导致服务端一致处于SYN_RCVD状态
服务端如何区分客户端建立链接的请求 可以对请求做唯一标识
四次挥手断链接
四次不能合并为三次 因为中间需要确认消息是否发完(TIME_WAIT)

2.UDP协议
也称之为数据报协议、不可靠协议	
早期的QQ使用的是纯生的(没有加任何额外功能)UDP协议
现在的QQ自己添加了很多技术和功能
使用UDP的原因就是因为很简单 快捷 粗暴 只要指定对方的地址就可以发消息了

# PORT协议(端口协议)
用来标识一台计算机上面的某一个应用程序
范围:0-65535
特征:动态分配(洗浴中心号码牌)
建议: 
0-1024 系统默认需要使用
1024-8000 常见软件的端口号  
8000之后的   

URL:统一资源定位符(网址)
网址本质是有IP和PORT组成的!!!

IP+PORT:能够定位全世界独一无二的一台计算机上面的某一个应用程序

域名解析:将网址解析成IP+PORT

我们之所以不直接使用IP+PORT的原因是太难记 所以发明了域名(网址)

IP:PORT  实际使用冒号连接
114.55.205.139:80 

5.OSI七层协议之会话层

会话层提供的服务是应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。会话层,表示层,应用层构成开放系统的高3层,面向应用进程提供分布处理、对话管理、信息表示、检查和恢复与语义上下文有关的传送差错等。为给两个对等会话服务用户建立一个会话连接。

6.OSI七层协议之表示层

表示层的作用之一是为异种机通信提供一种公共语言,以便能进行互操作。这种类型的服务之所以需要,是因为不同的计算机体系结构使用的数据表示法不同。例如,IBM主机使用EBCDIC编码,而大部分PC机使用的是ASCII码。在这种情况下,便需要会话层来完成这种转换。通过前面的介绍,我们可以看出,会话层以下5层完成了端到端的数据传送,并且是可靠的、无差错的传送。但是数据传送只是手段而不是目的,最终是要实现对数据的使用。由于各种系统对数据的定义并不完全相同,最易明白的例子是键盘——其上的某些键的含义在许多系统中都有差异。这自然给利用其它系统的数据造成了障碍。表示层和应用层就担负了消除这种障碍的任务。

7.OSI七层协议之应用层

应用层相当于是程序员自己写的应用程序 里面的协议非常的多
常见的有:HTTP、HTTPS、FTP

二、socket模块

如果我们需要编写基于网络进行数据交互的程序,意味着需要自己通过代码来控制之前所学的OSI七层协议。但是过程很繁琐、操作非常复杂、就相当于自己编写操作系统。所以socket模块也叫套接字出场了,它类似于操作系统,封装了丑陋的复杂接口提供了快捷的接口。
基于文件类型的套接字家族(单机) AF_UNIX;
基于网络类型的套接字家族(联网) AF_INET;

# 服务端
import socket


# 1.首先要产生socket对象并指定采用的通信版本和协议,括号内空默认是TCP协议
server = socket.socket()
# 2.绑定一个固定的地址(服务端必备的条件),第一个参数为本机回环地址只能本机才能访问
server.bind(('127.0.0.1', 8080))
# 3.设立板连接池
server.listen(5)
# 4.等待接客 三次握手 sock是双向通道 addr是客户端地址
sock, addr = server.accept()
print(sock, addr)
# 5.服务客人 一次性接受1024字节 发送的信息必须是bytes类型
data = sock.recv(1024)
print(data.decode('utf8'))
sock.send('Hello,what can do for you?'.encode('utf8'))
# 6.关闭双向通道 就相当于门店打烊了  四次挥手
sock.close()
# 7.关闭服务端 就相当于门店倒闭了
server.close()
# 客户端
import socket


# 1.首先生成socket对象指定类型和协议
client = socket.socket()
# 2.通过服务端的地址链接服务端
client.connect(('127.0.0.1', 8080))
# 3.直接给服务端发送信息
client.send('Hi,I need ur help'.encode('utf8'))
# 4.接受服务端发送的信息
data = client.recv(1024)
print(data.decode('utf8'))
# 5.断开与服务端的链接
client.close()

三、并发编程理论

1.操作系统发展史(可以说CPU的利用率发展史)

一、穿孔卡片;计算机很庞大 使用很麻烦 一次只能给一个人使用 期间很多时候计算机都不工作。这样好处就是程序员独占计算机为所欲为、反而坏处就是计算机利用率降低 浪费资源。
二、联机批处理系统;提前使用磁带一次性录入多个程序员的程序然后交给计算机处理,这样CPU工作效率提升了不用反复等待程序录入。
三、脱机批处理系统;极大的提升了CPU的利用率,总体而言,整个发展过程只做一件事情,那就是不断想办法提升CPU的利用率。所以毫无疑问,计算机中真正工作的部分是CPU。

2.多道技术

研究躲到技术前,我们先说一下单道技术(排队执行);即上面所讨论过,所有的程序排序执行过程中不能重合,然而我们的多道技术利用计算机空闲时间提前准备其他数据最大化提升CPU的利用率。接下来咱们详细讨论一下多道技术(并发效果)。

一、切换;计算机的CPU在两种情况下会切换,程序有IO操作即输入输出,input、time.sleep、read、write。我们尽可能的让CPU同时运行多个程序。
二、保存状态;CPU每次切换走之前都需要保存当前的操作状态下次切换回来基于上次记录继续执行

3.进程理论

程序:一堆死代码(还没被运行)
进程:正在运行的程序(被运行的代码) 是资源单位表示一块内存空间
线程:是执行单位 表示真正的代码指令

进程的调度算法
一、FCFS(first come first serve,先来先服务);对短作业不友好
二、短作业优先调度;对长作业不友好
三、时间片轮转法加多级反馈队列(目前还在使用);将时间均分然后根据继承时间的长短再分多个等级,等级越靠下表示耗时越长、每次分到的时间越多但是优先级越低。

4.进程的并行与并发

并行;多个进程同时执行必须要多个CPU参与单个CPU无法实现并行
并发;多个进程看上去像同时执行单个CPU可以实现多个CPU也肯定可以

5.进程的三个状态、同步异步、阻塞与非阻塞、综合使用

一、就绪态;所有的进程在被CPU执行之前都必须先进入就绪状态等待
二、运行态;CPU正在运行
三、阻塞态;进程运行过程中出现了IO操作阻塞态无法直接进入运行态需要先进入就绪态

同步;提交完成任务之后原地等待任务的返回结果期间不做任何事情
异步;提交完成任务之后不会原地等待返回结果直接去做其他事情有结果自动通知
阻塞;阻塞态
非阻塞;就绪态、运行态
综合使用;有四种状态,同步阻塞、同步非阻塞、异步阻塞、异步非阻塞(效率最高)

6.创建进程的两种方式

"""
1.鼠标双击软件图标
2.Python代码创建进程
"""

from multiprocessing import Process
import time

class MyProcess(Process):
    def __init__(self, name, age):
        super().__init__()
        self.name = name
        self.age = age
        
    def run(self):
        print('run is running', self.name, self.age)
        time.sleep(3)
        print('run is over', self.name. self.age)
if __name__ == '__main__':
    obj = MyProcess('almira', 123)
    obj.start()
    print('主')

7.进程对象的多种方法

from multiprocessing import Process, current_procsee
import os 
import time


# 1.查看进程号
current_process()
current_process().pid
os.getpid()
os.getppid()
# 2.结束进程
p1.terminate()
# 3.判断进程是否存活
p1.is_alive()

# 4.守护进程
def task(name):
    print('进程名:%s' % name)
    time.sleep(3)
    print('进程名:%s' % name)
    
if __name__ == '__main__':
    p1 = Process(target=task, args=('米热',))
    p1.daemon = True
    p1.start()
    time.sleep(1)
    print('复习使我快乐')

8.多进程数据错乱问题 模拟抢票软件

from multiprocessing import Process
import time
import json
import random


# 查票
def search(name):
    with open(r'data.json', 'r', encoding='utf8') as f:
        data = json.load(f)
    print('%s在查票 当前余票为:%s' % (name, data.get('ticket_num')))


# 买票
def buy(name):
    # 再次确认票
    with open(r'data.json', 'r', encoding='utf8') as f:
        data = json.load(f)
    # 模拟网络延迟
    time.sleep(random.randint(1, 3))
    # 判断是否有票 有就买
    if data.get('ticket_num') > 0:
        data['ticket_num'] -= 1
        with open(r'data.json', 'w', encoding='utf8') as f:
            json.dump(data, f)
        print('%s买票成功' % name)
    else:
        print('%s很倒霉 没有抢到票' % name)


def run(name):
    search(name)
    buy(name)


if __name__ == '__main__':
    for i in range(10):
        p = Process(target=run, args=('用户%s'%i, ))
        p.start()

9.进程池与线程池

进程和线程都不可以无限制的创建 因为硬件的发展速度赶不上软件 有物理极限 如果在编写代码的过程中无限制的创建进程或线程可能会导致计算机崩溃。

一、池;降低程序的执行效率 但是保证了计算机硬件的安全
二、进程池;提前创建好固定数量的进程供后续程序的调用超出则等待
三、线程池;提前创建好固定数量的线程供后续程序的调用超出则等待

from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import os
import time
import random
from threading import current_thread

# 1.产生含有固定数量线程的线程池
# pool = ThreadPoolExecutor(10)
pool = ProcessPoolExecutor(5)


def task(n):
    print('task is running')
    # time.sleep(random.randint(1, 3))
    # print('task is over', n, current_thread().name)
    # print('task is over', os.getpid())
    return '我是task函数的返回值'


def func(*args, **kwargs):
    print('from func')

if __name__ == '__main__':
    # 2.将任务提交给线程池即可
    for i in range(20):
        # res = pool.submit(task, 123)  # 朝线程池提交任务
        # print(res.result())  # 不能直接获取
        # pool.submit(task, 123).add_done_callback(func)

10.协成

进程;资源单位
线程;执行单位
协成;单线程下实现并发(效率极高)

下面咱细说一下协成吧!在代码层面欺骗CPU 让CPU觉得我们的代码里面没有IO操作、实际上IO操作被我们自己写的代码检测一旦有立刻代码执行别的程序;该技术完全是程序员自己弄出来的名字也是程序自己起的,核心:自己写代码完成切换+保存状态

'协成代码实现'
import time
from gevent import monkey;

monkey.patch_all()  # 固定编写 用于检测所有的IO操作(猴子补丁)
from gevent import spawn


def func1():
    print('func1 running')
    time.sleep(3)
    print('func1 over')


def func2():
    print('func2 running')
    time.sleep(5)
    print('func2 over')


if __name__ == '__main__':
    start_time = time.time()
    # func1()
    # func2()
    s1 = spawn(func1)  # 检测代码 一旦有IO自动切换(执行没有io的操作 变向的等待io结束)
    s2 = spawn(func2)
    s1.join()
    s2.join()
    print(time.time() - start_time)  # 8.01237154006958   协程 5.015487432479858
'协成实现并发'
import socket
from gevent import monkey;monkey.patch_all()  # 固定编写 用于检测所有的IO操作(猴子补丁)
from gevent import spawn


def communication(sock):
    while True:
        data = sock.recv(1024)
        print(data.decode('utf8'))
        sock.send(data.upper())


def get_server():
    server = socket.socket()
    server.bind(('127.0.0.1', 8080))
    server.listen(5)
    while True:
        sock, addr = server.accept()  # IO操作
        spawn(communication, sock)

s1 = spawn(get_server)
s1.join()
本文转载于网络 如有侵权请联系删除

相关文章

  • 企业网站制作有什么技巧?

    在这个飞速发展的时代,有很多的创业的机会来自各种类型的企业,但是公司要想要做出行业知名度,肯定是要建设一个高大上的企业网站树立公司形象,但是网站制作的过程中会存在很多技术问题,必须你需要组建一支技术团队,这可能需要花费你很大一笔雨伞,那么究竟如何建设企业网站呢?是否可以通过比较低的成本来快速创建网站呢?一、明确网站结构企业网站制作时工作量是比较大的,并不仅仅是首页的设计,他应该还包括各种和网站里程运营的相关功能比如,编辑页面,发布文章,以及搜索引擎优化等,由于企业创建网站是给客户浏览的,明确建立的网站的目的和确定网站的访客的目标群体是制作企业网站的第一步,一方面需要分析公司品牌的特性,另一方面要加强与客户之间的联系与交流,共同寻求比较完善的合作方案。如果预算比较宽裕,你可以选择配置一台性能比较出色的服务器,不但可以迅速提升网站的访问速度还可以加强他运行的稳定性,更有利于企业提升品牌知名度。二、升级网站展示的界面设计企业网站是完全代表一个企业的形象,所以设计的网页界面应该尽量能符合公司的品牌文化和企业品牌形象。并且要定位好网站的主题颜色以及页面风格,确立产品的页面布局和排版,重点展示整个

  • 学妹你要的计算机内存管理基础知识

    一、前言学妹刚上大学,问我计算机内存知识需要了解么?我当场就是傻瓜警告,于是就有了这篇文章。为什么要去了解内存知识?因为它是计算机操作系统中的核心功能之一,各高级语言在进行内存的使用和管理上,无一不依托于此底层实现,比如我们熟悉的Java内存模型。最近几篇文章学习操作系统的内存管理后,喜欢底层的同学可以去学习CPU结构、机器语言指令和程序执行相关的知识,而看重实用性的同学后续学习多进程多线程和数据一致性时,可以有更深刻的理解。二、冯·诺伊曼结构1、早期计算机结构在冯·诺依曼结构提出之前的计算机,是一种计算机只能完成一种功能,编辑好的程序是直接集成在计算机电路中,例如一个计算器仅有固定的数学计算程序,它不能拿来当作文字处理软件,更不能拿来玩游戏。若想要改变此机器的程序,你必须更改线路、更改结构甚至重新设计此计算机。简单来说,早期的计算机是来执行一个事先集成在电路板上的某一特定的程序,一旦需要修改程序功能,就要重新组装电路板,所以早期的计算机程序是硬件化的。2、理论提出1945年,冯·诺依曼由于在曼哈顿工程中需要大量的运算,从而使用了当时最先进的两台计算机MarkI和ENIAC,在使用Ma

  • 还不会搭简单线性模型?看这里,手把手教你实现简单线性模型

    本章我们通过简单线性回归模型预测黄金的价格,我们将会从数据读入、数据预处理、数据集划分、模型建立、模型效果验证等方面展开。数据读入及预处理fromsklearn.linear_modelimportLinearRegression #LinearRegressionisamachinelearninglibraryforlinearregression fromsklearn.linear_modelimportLinearRegression #pandasandnumpyareusedfordatamanipulation importpandasaspd importnumpyasnp #matplotlibandseabornareusedforplottinggraphs importmatplotlib.pyplotasplt %matplotlibinline plt.style.use('seaborn-darkgrid') #yahoofinanceisusedtofetchdata importyfinanceasyf #Readdata

  • Device视图下能看到什么

    无论在设计的哪个阶段,RTLAnalysis、Synthesis还是Implementation,打开DesignRun的结果,都可以看到Device视图。如果没有显示Device视图,可在Vivado菜单下找到Window,点击Device即可显示出来。那么在Device视图下我们能看到什么呢?FPGA内部结构RTLAnalysis阶段(ElaboratedDesign)或者综合阶段,Device视图似乎是空的,因为此时还没有将设计放置到FPGA内,也就是还没有完成布局操作。但此时Device视图是有丰富的内容的。比如FPGA内部结构,如下图所示。这是一个SSI器件,这里显示的是SLR1(也称为Die1)。同时,还可以看到类似XmYn的坐标。这些坐标其实就是ClockRegion的坐标。显而易见,ClockRegion的大小是不一样的,但是包含的内容基本一致。把ClockRegion放大,可以看到FPGA内部资源是以列形式排列的,也就是同列的资源类型是相同的,可能都是SLICE、BRAM或者DSP等。进一步放大,可以看到SLICE内部结构,如下图所示。SLICE中包含的LUT、F7M

  • Spring cloud zuul的SendResponseFilter做了什么

    源码调试web容器:tomcat Springcloudzull的SendResponseFilter主要工作是将代理请求获取的reponse写入当前response,发送回客户端。以下是源代码: publicclassSendResponseFilterextendsZuulFilter{ privatestaticfinalLoglog=LogFactory.getLog(SendResponseFilter.class); privatestaticDynamicBooleanPropertyINCLUDE_DEBUG_HEADER=DynamicPropertyFactory .getInstance() .getBooleanProperty(ZuulConstants.ZUUL_INCLUDE_DEBUG_HEADER,false); privatestaticDynamicIntPropertyINITIAL_STREAM_BUFFER_SIZE=DynamicPropertyFactory .getInstance() .getIntProperty(ZuulCo

  • 云服务十年,BAT与亚马逊、谷歌的快意恩仇

    云计算的AI化竞争才刚刚开始。策划&撰写:巫盼微博热搜一爆,正在结婚路上的程序员也得停下来处理后台服务器的bug。其中,关键一环就是因为微博既有的服务器无法承载突然暴涨的访问量,需要快速扩容云服务。图|微博技术专家胡忠想微博截图云服务看似离我们很远,其实已经润物细无声的进入了日常生活,我们在手机上的每一个操作背后,都是数以万计的云服务器支撑着。没有它们,那就是随时随地在网上准备暴走的用户。然而,十年河东,十年河西,在云服务快速发展的这十年间,市场早已硝烟弥漫。2008,云服务方兴未艾从2002年到2006年,是全球云服务市场百废待兴之时。亚马逊是典型的创始人对公司影响极深的案例,以在线书店起家的亚马逊,云服务是贝索斯在公司内部以一己之力向前推进的。同样的故事发生在两年后,马云在阿里巴巴内部排除众议,力挺王坚做阿里云。这两家发展轨迹颇为相似的互联网公司,也是国外和国内最早做云服务的。当然,亚马逊也是无心插柳柳成荫,最开始的EC2本来是为了更好地优化自己的电子商城,顺带服务好用户,后来觉得这门生意真是不错,衍生产品越来越多,AWS也越做越大。就在亚马逊推出EC2的前几天,谷歌当时的

  • 解读华为的AI战略:覆盖“云、管、端”

    年来,大数据、机器学习、计算能力、存储能力以及云计算等相关领域的发展推动着AI技术取得重大进展,不断发展的AI技术又融合渗透到了各行各业,帮助人们改善卫生保健、教育、金融、农业、交通等领域存在的问题。 亚马逊、谷歌、百度等互联网厂商,高通、寒武纪、地平线等芯片厂商,均在加大投入,推动AI技术的使用。那么,通信行业创新企业有何行动?我们看到,华为正在积极实践。 “华为聚焦ICT基础设施和智能终端,立志做智能世界的开拓者,全面引入人工智能技术,从云、管、端各个层面提升产品解决方案的竞争力,为客户提供更好的体验。在今年的HuaweiConnect大会上,华为将正式发布全栈、全场景的人工智能解决方案。”华为轮值董事长徐直军近期在华为分析师大会上介绍了华为的AI战略。云管端各层面发力AI 华为把人工智能定位为一个使能技术,希望把人工智能技术和华为公司的产品和解决方案融合起来。 在运营商业务领域,华为发布SoftCOMAI解决方案架构,在原有全云化网络构架基础上,引入已经成熟的以机器学习为核心的AI技术,使网络拥有了智能。据记者了解,华为已经在无线领域的SingleRANPro、网络领域

  • 【实战】MS14-068域权限提升漏洞总结

    此漏洞目前不一定很实用。转载这篇文章的原因,主要是理解问题和解决问题的思路,另外一点是写作思路------------------------------------------------------------------------------------------0x01漏洞起源 说到ms14-068,不得不说silverticket,也就是银票。银票是一张tgs,也就是一张服务票据。服务票据是客户端直接发送给服务器,并请求服务资源的。如果服务器没有向域控dc验证pac的话,那么客户端可以伪造域管的权限来访问服务器。所以ms14-068的来源和银票是息息相关的。在mimikatz作者的ppt里面是这样描述的:所以说这真的是一个大漏洞,允许域内任何一个普通用户,将自己提升至域管权限。微软给出的补丁是kb3011780。在server2000以上的域控中,只要没有打这个补丁,那么情况将是非常糟糕的。 https://technet.microsoft.com/library/security/ms14-068.aspx0x02漏洞利用2.1windows环境下测试在windows

  • 小巧快速的ZooKeeper可视化管理+实时监控工具

    Zookeeper:是一个分布式的、开源的程序协调服务,是hadoop项目下的一个子项目。他提供的主要功能包括:配置管理、名字服务、分布式锁、集群管理。 平时用zkCli.sh进行管理不免有点不方便,在此给大家推荐一个漂亮的可视化工具。下载地址:http://www.redisant.cn/za 主要特点:   可以保存多个连接,服务器信息在右侧快速查看 仪表盘功能,提供服务器实时状态数据 对节点数据的增删改查,支持多种搜索,正则、大小写、整词匹配 支持多种数据格式,包括JSON,MessagePack、XML、HEX 新建节点,可以设置ACL 命令行

  • tableau图表挑战2020/w14 劳动时间的差异分析

    劳动时间的性别差异分析 原文(数据和说明):https://data.world/makeovermonday/2020w14/discuss/2020w14/lvi5mbg7   这份数据关注一天当中无偿劳动时间和有偿劳动时间在不同性别/不同年龄/不同国家的群体差异。 性别分组。男性有偿劳动时间明显多余女性有偿劳动时间,而女性的无偿劳动时间(比如家务)多余男性。 年龄分组。 不同国家/地区分组,由于经济/习俗的原因各有区别。 ⚠️: 数据来源于多个不同的调查机构,所以调查对象和目的不同。 大多数调查关注在同一国家/同年的不同年龄组的差异。     列:年龄组 列:城市/农村,⚠️不同机构的分类这里不同,大多数调查没有分类,即这里是null值。 列:国家 列:调查机构进行的调查时间。 列:有偿/无偿劳动 列:调查的目标年份 列:劳动时间 列:性别   原始的可视化:     这是一个充分利用数据的可视化的动态表格。 上部分是地图,用颜色区分了4个不同时期, 下部分是2行条图,显示每个国家(区分农村/城市)-&g

  • 混合 Data Warehouse 和 Big Data 倉庫的新架構

    (讀書筆記)許多公司,儘管想導入BigData,仍必須繼續用DataWarehouse來管理結構化的營運數據、系統記錄。而BigData的出現,為DataWarehouse提供了一個互補的機會,而不是取代後者。高度結構化的營運資料(data,數據),仍然可保留在DataWarehouse中;而分散式(distributed)的資料,以及會即時改變的資料,則可交由基於Hadoop的架構來控制。 圖1 傳統的DataWarehouse和DataMart架構 圖2 混合DataWarehouse和BigData倉庫的新架構 一間公司的客戶、潛在使用者,在網路上和實體上的互動,這些大量產生的數據,傳統的DataWarehouse僅能跟蹤交易及營運數據,但卻不能跟蹤網路流量及相關資訊。為了儘可能多保留這些數據,與其建立一個DataWarehouse來儲存所有數據,不如用Hadoop分散式計算的方式,將數據存放在公司的伺服器上。這樣,公司就能將所有來自「網頁互動」的數據保存下來了。這些數據儲存在運行著Hadoop和MapReduce的伺服器叢集(cluster)中,配合使用Flume和Sqoop之

  • 记一次Oracle session数过多引起进程数超过processes限制最终导致客户端无法连接的问题

    RAC突然告警,客户端尝试连接时会报:ORA-12520:TNS:listenercouldnotfindavailablehandlerforrequestedtypeofserver错误。 现整理解决过程,以便于后续遇到此问题时快速处理。 1.登入服务器,使用sqlplus/assysdba发现可以进入数据库。 2.查看alert日志,发现日志中有个错误信息:ORA-00020:maximumnumberofprocesses(2000)exceeded,由此判断是process数超了。 alert日志的路径可以通过如下sql找到: select*fromgv$diag_infowherenamelike'%Alert%' 3.确定出问题的Oracle用户, selectt1.inst_id,t1.username,count(*)fromgv$sessiont1 joingv$processt2ont2.addr=t1.paddrandt2.inst_id=t1.inst_id groupbyt1.inst_id,t1.usernameorderby3desc

  • 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集

      近来复习编译原理,语法分析中的自上而下LL(1)分析法,需要构造求出一个文法的FIRST和FOLLOW集,然后构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),可是这个FIRST集合FOLLOW集看得我头大。。。   教课书上的规则如下,用我理解的语言描述的: 任意符号α的FIRST集求法: 1.α为终结符,则把它自身加入FIRSRT(α) 2.α为非终结符,则: (1)若存在产生式α->a...,则把a加入FIRST(α),其中a可以为ε (2)若存在一串非终结符Y1,Y2,...,Yk-1,且它们的FIRST集都含空串,且有产生式α->Y1Y2...Yk...,那么把FIRST(Yk)-{ε}加入FIRST(α)。如果k-1抵达产生式末尾,那么把ε加入FIRST(α)  注意(2)要连续进行,通俗地描述就是:沿途的Yi都能推出空串,则把这一路遇到的Yi的FIRST集都加进来,直到遇到第一个不能推出空串的Yk为止。重复1,2步骤直至每个FIRST集都不再增大为止。复制 任意非终结符A的FOLLOW集求法: 1.A为开始符号,则把#加入F

  • java nio 网络框架

    https://github.com/solq360/common 主要运行在android平台 解决自动化编/解码,等等。。 模块 解决问题/实现处理 备注 负责人 进度 录音播放 AudioRecord 和 AudioTrack 熟悉录音处理接口 solq 进行中 声音编码 第三方库 处理燥音,回音,压缩等     通信 jdk nio 实现 移动网socket编程是否稳定   进行中 ioc java 反射技术   solq 进行中 event     solq 进行中 资源管理 程序配置,美术资源管理           模块 解决问题/实现处理 备注 负责人 进度 好友管理         通话交互         android UI框架   用到再查  

  • MySQL丨删除一张表小常识

    在MySQL里面,对于删除一张表里面的所有内容有两种语句: 1、deletefromtable_name; 2、truncate table table_name; 解析:以上两种方式都可以删除一张表里面的所有内容但是: DELETE:是一行一行的删除; TRUNCATE:是一张表删除; DELETE与TRUNCATE两者相比,TRUNCATE删除一张表的速度肯定是会比DELETE来删除一张表要快。  

  • BZOJ1010 [HNOI2008]玩具装箱

    Description   P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过 压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容 器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一 个容器中,那么容器的长度将为x=j-i+Sigma(Ck)i<=K<=j制作容器的费用与容器的长度有关,根据教授研究, 如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。P教授不关心容器的数目,他可以制作出任意长度的容 器,甚至超过L。但他希望费用最小. Input   第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7 Output   输出最小费用 SampleInput 54 3 4 2 1 4 Sampl

  • Simple Vertex Displacement

    写在前面: 本文章为个人学习笔记,方便以后自己复习,也希望能帮助到他人。 由于本人水平有限难免出现错误,还请评论区指出,多多指教。 部分图元和素材来源于网络,如有侵权请联系本人删除。 参考资料与链接会在文章末尾贴出。 ======================================================================= 之前我们一直在fragmentshader里玩花样,而在vertexshader里面只做了坐标位置的变换,这次我们尝试在vertexshader里搞点小花样。 先简单写个halfLambert+blinPhong的shader,当然也可以用unity自带的surfaceshader,个人习惯是自己写光照模型存起来以后复制粘贴就好了。 1.先尝试点简单的操作: 我们在vertexshader里面将所有顶点乘2,相当于所有顶点外扩了: 让顶点的y坐标随着x不同而不同: 我们可以为这个sin函数加上振幅和频率: 2.法线问题 虽然在上文我们改变了顶点的位置,但实际上我们改变后的模型的法线是错的,因为我们只改变过顶点位置却没

  • 欧拉公式

    欧拉公式(英语:Euler’sformula,又称尤拉公式)是在复分析领域的公式,将三角函数与复数指数函数相关联,因其提出者莱昂哈德·欧拉而得名。尤拉公式提出,对任意实数 xx,都存在:    ejx=cosx+jsinxejx=cos⁡x+jsin⁡x 其中jj是虚数单位。   由上式,我们可以推导出:    sinϕ=12j(ejϕ−e−jϕ)sin⁡ϕ=12j(ejϕ−e−jϕ)   cosϕ=12(ejϕ+e−jϕ)cos⁡ϕ=12(ejϕ+e−jϕ)   证明: 有许多方式可以证明欧拉公式,这里仅用泰勒级数进行证明,其他方式可以参考Wiki欧拉公式  在知乎上看到了Heinrich写的一篇关于傅里叶变换的文章,让我茅塞顿开,惊叹数学的美丽和神奇,文章中介绍了复数的意义,我觉得讲的很好,故记录下来: 虚数i这个概念大家在高中就接触过,但那时我们只知道它是-1的平方根,可是它真正的意义是什么呢?  这里有一条数轴,在数轴上有一个红色的线段,它的长度是1。当它乘以3

  • 终点无期——获领骑黄衫感言

    感谢 首先感谢邹欣老师周筠老师背后的构建之法团队,正是在邹欣老师的《构建之法》的核心思想指导下,才让我在这节课中有了发展和学习的方向; 然后想感谢汪老师和两位助教的辛苦帮助,“老师和学生的关系更像是健身教练和普通人的关系”,这是汪老师在前几届课的比喻,在一次次的作业中是老师和助教的要求在推着我们前进,比如要求爬虫、架构、单元测试,正是这些标准在促使着我一次次踮脚跳,够一够之前未曾想过的上限。 最后感谢我的组员们,一开始找到他们组队的时候颇有种“复仇者联盟”集结的感觉,一个一个去问能不能来团队,当上组长也是默认的(我把大家组织起来,自然就需要担任其这个责任),是大家的帮助使得我在团队作业中的分数不落下风。 惊 选中这门课是一个很胆战心惊的过程,之前实践课选的是单老师的课,后来经历一段波折才加入到汪老师的班里。之前就听说汪老师的课很注重实践,可能需要花费很多的时间,而我自认为编程基础是比较差的(苦笑),对于变成更像是面向百度编程,简单的觉得太简单直接百度,难的自己不会也直接百度,面对这么一门高要求的课我确实有点受到惊吓,得知有暑假作业的时候甚至吓得晚上没睡着。 危 人常说成功之人必有一颗敬

  • 每天一个linux命令目录

    http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html 开始详细系统的学习linux常用命令,坚持每天一个命令,所以这个系列为每天一个linux命令。学习的主要参考资料为:   1.《鸟哥的linux私房菜》   2.http://codingstandards.iteye.com/blog/786653   3.linux命令五分钟系列    4.其他互联网资料,google,baidu等搜索引擎 一.文件目录操作命令:    1.每天一个linux命令(1):ls命令    2.每天一个linux命令(2):cd命令   3.每天一个linux命令(3):pwd命令    4.每天一个linux命令(4):mkdir命令   5.每天一个linux命令(5):rm命令    6.每天一个linux命令(6):rmdir命令    7.每天一

  • 【基础算法】- 打印所有子集合

    importjava.util.ArrayList; importjava.util.List; publicclassSubSetCount{ publicstaticvoidmain(String[]args){ Stringtest=newString("ABCD"); char[]a=test.toCharArray(); doublesize=Math.pow(a.length,2); List<String>result=newArrayList<String>(); intindex=(1<<1)-1; finalchar[]array={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; for(inti=0;i<size;i++){ if(i==0){result.add("{}");continue;} intvalue=i; char[]temp=newchar[32]; intt=temp.length; do{ temp[--t]=

相关推荐

推荐阅读