git bash 样式设置和调整

󰃭 2018-11-09

场景 在 windows 上使用 git bash 作为临时的 linux 操作终端, 是习惯了linux开发人员的一个不错的选择, 不过在使用的时候, 默认的git bash 终端样式实在是用不下去, 以下是我在调试样式时的一些记录 字体和主题 git bash 现在已经提供了一些设置, 方便终端主题和字体的颜色设置, 具体如下 主题设置 打开 git bash , 点击左上角, 在菜单里选择 Options, 如图 在选项设置里选择选择主题下拉框, 选择某个主题, 如图 点击 Apply 应用按钮, 可以看到预览效果, 如果没有问题, 点击Save 保存配置即可 如果不喜欢, 可以再试试其他的主题, 目前来看, 主题选项不多 字体设置 git bash 默认的字体并不喜欢, 字体设置修改一下, 如图 这个 Consolas 字体我一直都觉得还不错, 推荐大家 终端颜色修改 改好了主题和字体, 默认的git bash 终端换行的体验实在是太差了, 在这里, git bash 提供了和Linux 里类似的 profile 修改终端样式的方法 比如在我这, vim ~/.bash_profile 编辑profile文件, 修改PS1

Continue reading 


福尔摩斯演绎法 - 第二季

󰃭 2018-05-24

剧情 莫里亚蒂被警方逮捕后,福尔摩斯的生活恢复平静。一转眼,夏天过去了。得知苏格兰场探长雷斯垂德有难,福尔摩斯决定亲自前往伦敦帮助老朋友调查一起旧案。并非每个人都愿意看到歇洛克归来,福尔摩斯的兄弟迈克罗夫特尤其不愿意见他。事实上,他们已经有好几年没有说过话了。夏洛克从来没有对任何人提起迈克罗夫特,华生甚至不知道他还有个兄弟!而歇洛克怀疑华生想通过亲近迈克罗夫特来套取自己小时候的秘密 剧照 电驴下载 第2季 第1集 第2季 第2集 第2季 第3集 第2季 第4集 第2季 第5集 第2季 第6集 第2季 第7集 第2季 第8集 第2季 第9集 第2季 第10集 第2季 第11集 第2季 第12集 第2季 第13集 第2季 第14集 第2季 第15集 第2季 第16集 第2季 第17集 第2季 第18集 第2季 第19集 第2季 第20集 第2季 第21集 第2季 第22集 第2季 第23集 第2季 第24集

Continue reading 


福尔摩斯演绎法 - 第一季

󰃭 2018-05-21

剧情 主人公夏洛克·福尔摩斯(Sherlock Holmes,约翰·李·米勒饰)曾担任英国伦敦警察厅的顾问,性格怪癖的他因为药物上瘾问题,被他父亲送到纽约进行强制戒毒。康复后,福尔摩斯在布鲁克林安顿下来,他的父亲雇佣了因医疗事故放弃职业的琼恩·华生医生(Joan Watson,刘玉玲饰)来帮助福尔摩斯戒断后的康复。 曾在苏格兰场任职的警监托马斯·格雷森(Capt. Thomas Gregson,艾丹·奎因饰),在纽约警察局任警督,福尔摩斯曾和他一同工作,格雷森便邀请他担任纽约警察局的刑事案件顾问。福尔摩斯和华生参与了许多疑难怪案的侦破工作,破解许多令警察感到困惑的案件。 剧照 电驴下载 第1季 第1集 第1季 第2集 第1季 第3集 第1季 第4集 第1季 第5集 第1季 第6集 第1季 第7集 第1季 第8集 第1季 第9集 第1季 第10集 第1季 第11集 第1季 第12集 第1季 第13集 第1季 第14集 第1季 第15集 第1季 第16集 第1季 第17集 第1季 第18集 第1季 第19集 第1季 第20集 第1季 第21集 第1季 第22集 第1季 第23,24集

Continue reading 


苍穹浩瀚 - 第二季

󰃭 2018-05-18

剧情 霍尔登等人从爱神星逃走,幸存者逐一接受病毒检测。联合国副秘书长艾娃萨拉公开指责约翰逊,随后她遇到暗杀险些丧命。霍尔登和伙伴研究病毒实验资料,他们将病毒样本藏了起来。联合国为了防范火星,决定派舰队保护地球基地。艾娃萨拉怀疑副部长艾伦怀特暗中策划地球和火星的战争,她要间谍科蒂尔调查此事。 艾伦怀特建议联合国攻打火星卫星,舰队指挥官为抗议此事辞职。霍尔登和伙伴登陆第谷空间站,他们将爱神星上的病毒实验告诉Opa组织的领导人约翰逊。当年小行星带人控制安德森站后投降,地球当权者却隐瞒投降真相,约翰逊被骗屠杀小行星带人后叛逃成为OPa组织一员。霍尔登率领Opa组织成员攻打隐形飞船,他们发现隐形飞船藏有一群疯狂科学家,爱神星病毒实验的秘密也就此曝光 。。。 剧照 电驴下载 第二季 第一、二集 第二季 第三集 第二季 第四集 第二季 第五集 第二季 第六集 第二季 第七集 第二季 第八集 第二季 第九集 第二季 第十集 第二季 第十一集 第二季 第十二集 第二季 第十三集

Continue reading 


苍穹浩瀚 - 第一季

󰃭 2018-05-18

剧情 故事讲述二百年后的未来,人类殖民太阳系。太阳系的人类逐渐分成了火星人、地球人和以小行星带为主的谷神星人。三方势力之间的关系由于资源的争夺而变得紧张。警探Josephus Miller(托马斯·简 饰演)连同船长Jim Holden(史蒂文·斯崔特 饰演)与他的船员一起揭发了一个威胁秩序和平及人类生存的阴谋,有部分人利用外星系生命制造变种人,一场战斗即将开始。。。 评价 精彩的科幻剧佳作,特效在太空科幻剧中属于上乘。多POV线交叉并行,剧情流畅,节奏相当好,强力推荐 剧照 电驴下载 第一季 第一集 第一季 第二集 第一季 第三集 第一季 第四集 第一季 第五集 第一季 第六集 第一季 第七集 第一季 第八集 第一季 第九集 第一季 第十集

Continue reading 


西部世界 - 第二季

󰃭 2018-05-17

剧照 剧情 德洛丽丝枪杀死了乐园的总设计师罗伯特·福特,发动了机器人的反抗,在这一季中她会率领其他机器人,向以往虐待他们的人类展开报复。她不仅要成为西部世界的主人,还要走出去,占领乐园外的世界。 此时的“德洛丽丝”已经彻底变成她的另一种人格“怀亚特”,这是当初乐园的另一位缔造者“阿诺德”写入她程序中的,在上一季结尾,她破解了“迷宫”的谜题,成功解锁了“怀亚特”这个性格。 桑迪·纽顿饰演的“梅芙”就有自己的使命。在上一季结尾,她本有机会离开乐园,但还是留了下来,因为她要寻找自己的“女儿”。为了找到女儿,梅芙挟持了“西部世界”的首席编剧“李”,他们将一起展开本季的冒险 新的故事线继续展开,威廉继续踏上寻找新的游戏剧情之路 电驴下载地址 第二季 第一集 第二季 第二集 第二季 第三集 第二季 第四集 第二季 第五集

Continue reading 


西部世界 - 第一季

󰃭 2018-05-16

乔纳森·诺兰 导演 《西部世界》(英语:Westworld),HBO播出的美国科幻西部电视剧,由乔纳森·诺兰和妻子丽莎·乔伊共同创作,改编自美国小说家迈克尔·克莱顿导演和编剧的1973年科幻电影《钻石宫》,以及较少程度的1976年续集《未来世界》。这是第二次根据两部电影改编的电视剧,第一次是一部短暂的1980年剧集《西部之外》。乔纳森·诺兰、丽莎·乔伊、J·J·艾布拉姆斯与布莱恩·柏克共同担任执行制片人,乔纳森担任第一集与季末最终集的导演。该剧于2016年10月2日首播,由10集组成 剧情 故事设定在未来世界,在一个庞大的高科技成人主题乐园中,有着模拟真人的机器“接待员”能让游客享尽情享受性欲、暴力等欲望的放纵,主要叙述被称为“西部世界”的未来主题公园。它提供给游客杀戮与性欲的满足。 但是在这世界下,各种暗流涌动。部分机器人出现自我觉醒,发现了自己只是作为故事角色的存在,并且想摆脱乐园对其的控制;乐园的管理层害怕乐园的创造者控制着乐园的一切而试图夺其控制权,而乐园创造者则不会善罢甘休并且探寻其伙伴创造者曾经留下的谜团;而买下乐园的一名高管试图重新发现当年的旅程留下的谜团 电驴下载地址 第一季 第一集 第一季 第二集 第一季 第三集 第一季 第四集 第一季 第五集 第一季 第六集 第一季 第七集 第一季 第八集 第一季 第九集 第一季 第十集

Continue reading 


(转)Socket通信原理

󰃭 2018-03-16

转自 Socket通信原理 作者: wzhvictor 什么是Socket? Socket的中文翻译过来就是“套接字”。套接字是什么,我们先来看看它的英文含义:插座。 Socket就像一个电话插座,负责连通两端的电话,进行点对点通信,让电话可以进行通信,端口就像插座上的孔,端口不能同时被其他进程占用。而我们建立连接就像把插头插在这个插座上,创建一个Socket实例开始监听后,这个电话插座就时刻监听着消息的传入,谁拨通我这个“IP地址和端口”,我就接通谁。 实际上,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。Socket起源于UNIX,在Unix一切皆文件的思想下,进程间通信就被冠名为文件描述符(file desciptor),Socket是一种“打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。 另外我们经常说到的Socket所在位置如下图 Socket通信过程 Socket保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是服务器与客户端之间的通信。两端都建立了一个Socket对象,然后通过Socket对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接。 一图胜千言,下面是面向连接的TCP时序图: 客户端过程: 客户端的过程比较简单,创建Socket,连接服务器,将Socket与远程主机连接(注意:只有TCP才有“连接”的概念,一些Socket比如UDP、ICMP和ARP没有“连接”的概念),发送数据,读取响应数据,直到数据交换完毕,关闭连接,结束TCP对话。 import socket import sys if __name__ == '__main__': sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建Socket连接 sock.connect(('127.0.0.1', 8001)) # 连接服务器 while True: data = input('Please input data:') if not data: break try: sock.sendall(data) except socket.error as e: print('Send Failed...', e) sys.exit(0) print('Send Successfully') res = sock.recv(4096) # 获取服务器返回的数据,还可以用recvfrom()、recv_into()等 print(res) sock.close() sock.sendall(data) 这里也可用send()方法:不同在于sendall()在返回前会尝试发送所有数据,并且成功时返回None,而send()则返回发送的字节数量,失败时都抛出异常。 服务端过程: 咱再来聊聊服务端的过程,服务端先初始化Socket,建立流式套接字,与本机地址及端口进行绑定,然后通知TCP,准备好接收连接,调用accept()阻塞,等待来自客户端的连接。如果这时客户端与服务器建立了连接,客户端发送数据请求,服务器接收请求并处理请求,然后把响应数据发送给客户端,客户端读取数据,直到数据交换完毕。最后关闭连接,交互结束。 import socket import sys if __name__ == '__main__': sock = socket.

Continue reading 


Ansible api 常见问题总结

󰃭 2018-03-11

Ansible API ansible api 2.0 的版本之后, 其调用的接口参数和旧的已经不一样, 且官方文档仅有一个实例, 其他什么都没有, 以下是在实践中总结的一点点文档 api 调用实例 loader = DataLoader() inventory = InventoryManager(loader=loader) variable_manager = VariableManager(loader=loader, inventory=inventory) "tasks": [{"action": {"module": "shell", "args": cmd}}]} Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'become_ask_pass', 'check', 'timeout', 'diff', 'remote_user', ]) options = self.Options(connection='smart', module_path='/path/to/mymodules', forks=forks, become=False, become_method=None, become_user=None, become_ask_pass=False, check=False, diff=False, timeout=1, remote_user='root', # webid用户必须制定远程用户 ) variable_manager.extra_vars = {} executor = PlaybookExecutor(playbooks, inventory, variable_manager, loader, options, passwords) result = executor.

Continue reading 


VIM 快速光标跳转

󰃭 2018-01-30

vim 快速光标跳转 vim 被誉为编辑器之神, 通过让程序员完全脱离鼠标, 将双手保留在键盘的主键盘区, 甚至不用移动到键盘的数字区, 提高编程效率 可能很多人已经会使用vim最基本的操作了, 如基本的hljk的移动, ia 插入, 但更多的时候, 还是最基本的移动和插入编辑, 效率甚至不如普通的文本编辑器, 糟蹋了vim的很多特性 以下, 是在平常使用中, 能够提高vim效率的一些常用快速跳转和定位光标的实践技巧, 希望能提升各位在使用vim时的信心和兴趣 基本的光标移动使用jljk 这几个键, 但这种方式在大范围定位光标时还是太慢了, 甚至还有仍然使用方向键的, 从问价第一行, 移动到最后一行, 按住一个键, 等半天, 岂可忍? 以下的操作均在正常模式下 文件内光标跳转 文件首行定位 不论我们在文件的什么位置, 快速双击g 键(即gg), 即可直接定位到文件首行, 如下 文件结尾定位 不论我们在文件的什么位置, shift+g 键(即G), 即可直接定位到文件结尾, 如下 指定文件行号的定位 如果想跳到文件指定的行, 有两种方式 <line>gg, <line> 位置填充行号, 即可跳转到文件第line行 <line>G, 即可跳转到文件第line行 如下 还有一种在命令行模式下的文件行号定位, 上面两种足够用了, 后续再补充 当前文件行后指定行数的定位 比如我当前处在文件第56行, 我想定位到当前行后的第4行 4j 即可将光标向后定位4行 同理, 如果要往前定位4行 4k 即可 屏幕内行跳转 屏幕首行定位 如果我们想定位光标到屏幕的首行, 注意, 不是文件, 是可视的屏幕的首行, 该怎么做呢

Continue reading 


https协议简介

󰃭 2018-01-02

https简介 一、作用 我们都知道http协议是明文传输的,在网络安全日益重要的今天,明文传输会带来风险。 主要体现在以下三方面: 窃听风险:第三方可以获知通信内容 篡改风险:第三方可以修改通信内容 冒充风险:第三方可以冒充他人身份参与通信 SSL/TLS协议便是为了解决这三大风险而设计的,而HTTPS的安全基础是SSL/TLS协议。简单来讲是 在HTTP下加入SSL/TLS层来保证通讯的安全的。 接下来会简要介绍SSL/TLS协议的历史和运行机制,希望这篇文章能让你对SSL/TLS到底做了哪些事 有个基本的概念。 二、历史 互联网加密通信协议的历史,几乎与互联网一样长。 1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。 1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。 1996年,SSL 3.0版问世,得到大规模应用。 1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。 2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年 TLS 1.2的修订版。 目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS 1.2的支 持。TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。通常没有特别说 明时,SSL 和 TLS 指的是同一个协议,本文也不做严格区分。 三、SSL/TLS如何加密? 这一节我们将了解SSL/TLS是如何加密的,因此会忽略其它方面,现在我们只关心和加密有关的过 程。为了了解加密过程,我们需要先了解公开密钥加密和对称密钥加密 3.1 什么是公开密钥加密 这里引用一下维基百科的解释: 公开密钥加密(英语:Public-key cryptography),也称为非对称加密(英语:asymmetric cryptography),是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥; 一个用作加密的时候,另一个则用作解密。使用其中一个密钥把明文加密后所得的密文,只能用相对 应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密。 对上面的解释,我们可以做一个简单的类比来方便理解。把公钥和私钥分别比作锁和钥匙, 公钥只用 来加密数据,而私钥只用来解密数据。在明白了公开密钥加密的工作模式后,我们可以联想一下, 如何用其进行加密。下面是我简单设想的加密过程: 我们简单了解一下过程 客户端生成一对临时的公钥和私钥,并把公钥传给服务器 服务器收到客户端传过来的公钥,在响应客户端的同时(表示自己已经收到公钥了),发送服 务器自己的公钥 客户端发送应答,表示已经收到服务器的公钥了 接下来,双方便可以开始通信了。客户端会在发送数据前,用服务器的公钥加密,服务器收到数 据后用服务器的私钥解密,服务器如果需要发送数据也是一样的过程 表面来看,这个加密过程是没有问题的。但是公开密钥加密有个缺点便是需要非常庞大的计算量才能 加密解密数据,即使是多核心cpu也是负担不了这么庞大的计算量的。所以上面的流程是没法投 入实际使用的。那该怎么办呢?接下来就让我们看看https是如何解决这个问题的吧 3.2 什么是对称密钥加密 简单来说,对称密钥加密是一类算法。这类算法在加密和解密时使用相同的密钥,并且加密和解密的 速度比公开密钥加密快很多。从上面设想的流程中,我们可以发现,公开密钥加密只能够保证一个方 向数据的安全。那么只需要客户端生成一个对称密钥,然后通过公钥加密对称密钥发送给服务器,双 方接下来便可以通过对称密钥来加密数据了。这样既保证了安全性,又保证了性能。总结为一段话便是:

Continue reading 


django 基于角色的权限控制

󰃭 2017-12-25

ENV: Python3.6 + django1.11 应用场景 有一种场景, 要求为用户赋予一个角色, 基于角色(比如后管理员,总编, 编辑), 用户拥有相应的权限(比如管理员拥有所有权限, 总编可以增删改查, 编辑只能增改, 有些页面的按钮也只有某些角色才能查看), 角色可以任意添加, 每个角色的权限也可以任意设置 django 的权限系统 django 默认的权限是基于Model的add, change, delete来做权限判断的, 这种设计方式有一个明显的缺陷, 比如怎么控制对Model的某个字段的修改的权限的控制呢 设计权限 大多数的系统, 都会给用户赋予某个角色, 假如能针对用户的角色, 做权限控制,这个权限控制并不局限于对Model的修改, 可以是任意位置的权限控制, 只要有一个权限名, 即可根据用户角色名下是否拥有权限名判断是否拥有权限 User, Role => UserRole => RolePermissions User 是用户对象 Role: 角色表 UserRole 是用户角色关系对象 RolePermissions 是角色权限关系对象 因此, 需要创建三个Model: User,Role, UserRole, RolePermission User 可以使用django 默认的User 对象 其他Model 如下 class Role(models.Model): """角色表""" # e.g add_user role_code = models.CharField('role code', max_length=64, unique=True, help_text = '用户角色标识') # e.

Continue reading 


consul 部署与使用

󰃭 2017-11-21

1. 介绍 1.1 什么是 consul Consul 是一个支持多数据中心、分布式、高可用的服务发现和配置系统,由 HashiCorp 公司用 Go 语言开发, Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对 1.2 consul 能解决什么问题 服务发现:consul 客户端能提供服务发现功能,使用 DNS 或者 http 请求 健康检查:consul 可以提供健康检查,可以检查 web 服务是否返回200,可以监控集群的健康情况 kv 存储:提供 kv 存储,可以保存动态配置、分布式选举等。提供方便的 http api 来访问 kv 数据 多数据中心:支持多个数据中心,便于系统的跨中心扩展 1.3 基本架构 consul 是一个分布式、高可用系统。它通过在每个服务节点(node)上运行 consul agent 进行服务的健康检查。agent 与一个或多个 consul server 交换信息。这些 consul server 保存数据和副本,server 之间自主选举出一个 leader。推荐用 3 到 5 个 server 构成集群,避免数据丢失。建议每个数据中心使用一个 consul 集群 1.4 与现有系统的比较(zookeeper,etcd) Zookeeper 与 etcd 在功能和架构上是类似的,他们通过 nodes 间的投票选举主服务器,它们采用强一致算法,应用程序需要使用客户端库来构建复杂的分布式系统 consul 在同一个数据中心内也使用 server nodes 投票方式提供强一致。它提供多数据中心的支持,多个数据中心的 server nodes 和 client 之间可以相互连接 Zookeeper 没有直接提供服务发现功能,需要应用程序使用 kv 存储机制来构建服务发现功能,在 consul 中consul agent 客户端只需要简单的注册服务,就可以通过 DNS 查询 或者 HTTP 接口使用服务发现功能 consul agent client 安装在服务节点上,可以完成丰富的检查功能,例如:服务状态 200 ok、内存、磁盘是否使用超量,并且 client 提供了简单的 HTTP 接口访问服务 2.

Continue reading 


javascript模版字符串与传统字符串拼接的差异

󰃭 2017-10-18

一次开发过程中,发现moment转换字符串的方式根据使用的差异,出现不同的返回值。 示例如下: const moment = require('moment') const now = moment() const str1 = `${now}` // "1508317065981" const str2 = `${encodeURIComponent(now)}` // "Wed%20Oct%2018%202017%2016%3A57%3A45%20GMT%2B0800" 根据上述代码发现两者的差异在于str1中now直接使用模版字符串进行类型转换,而str2中now则转为字符串后传入函数,所以取得完全不同的格式。 由于项目代码会经过babel转为es5语法,观察得通过babel模版字符串会转换为传统’+‘号拼接的方式: // babel转化前 const str1 = `${now}` // babel转化后 var str1 = '' + now; 基于转化前后的代码,分别尝试ES5字符串拼接,和模版字符串的差异 var now = moment(); console.log(`${now}`); // "Wed Oct 18 2017 17:38:01 GMT+0800" console.log('' + now); // "1508319481681" console.log(now.toString()) // "Wed Oct 18 2017 17:39:00 GMT+0800" console.log(now.valueOf()) // 1508319540124 上述代码证实,模版字符串经过babel转换之后,其实改变了解析的方式,模版字符会首先去调用 toSting()方法,而转换过后的传统字符串拼接方法,则是优先调用了valueOf()。在实际使用的时候将moment对象传入encodeURIComponent,经过类型隐式转换,moment调用了toString()方法,使得看似差不多的代码得到了完全不同的结果。

Continue reading 


毕设找一起做的

󰃭 2017-10-10

私聊或加我qq2897994820,主题想好了几个,不过还完全没动手,最好能懂wxpython,pyqt,数据库的操作和网站的设计,前后端都可以,但是后端的话最好是django,虽然flask我会一点,但是没有在服务器上操作过。前端要求不高,会设计就可以,jquery部分我会处理

Continue reading 


Flask 路由解析流程

󰃭 2017-09-25

Flask 作为wsgi app 启动流程 在wsgi server 每次处理请求时, 需要调用一个方法处理请求, 返回响应, 最简单的处理如下 def request_response(envrion, start_response): # do stuff status = '200 OK' response_headers = [('Content-type', 'text/plain')] start_response(status, response_headers) return ['hello, world'] environ 作为请求参数传递, 是个字典, 包含了 http 请求所必须的环境变量, 比如: REQUEST_METHOD: 请求方法,是个字符串,'GET', 'POST'等 PATH_INFO: HTTP请求的path中剩余的部分,也就是application要处理的部分 QUERY_STRING: HTTP请求中的查询字符串,URL中?后面的内容 CONTENT_TYPE: HTTP headers中的content-type内容 CONTENT_LENGTH: HTTP headers中的content-length内容 SERVER_NAME和SERVER_PORT: 服务器名和端口,这两个值和前面的SCRIPT_NAME, PATH_INFO拼起来可以得到完整的URL路径 SERVER_PROTOCOL: HTTP协议版本,HTTP/1.0或者HTTP/1.1 HTTP_: 和HTTP请求中的headers对应 以及一下请求信息和服务参数 wsgi.version: (1, 0) 元组,代表 WSGI 1.0 版 wsgi.url_scheme: 字符串,表示应用请求的 URL 所属的协议,通常为「http」或「https」 。 wsgi.input: 类文件对象的输入流,用于读取 HTTP 请求包体的内容。(服务端在应用端请求时开始读取,或者预读客户端请求包体内容缓存在内存或磁盘中,或者视情况而定采用任何其他技术提供此输入流。) wsgi.

Continue reading 


使用Docker配置Flask开发环境

󰃭 2017-09-17

工具 Docker 一种开源容器应用,供开发者打包自己的开发环境,可以任意移植 docker-compose 一种管理多个Docker容器的工具,可以简化我们启动容器的各种命令 配置文件 首先我们需要一个python基础景象,Docker各种基础镜像都可以从官方找到 https://hub.docker.com/_/python/ 。找到基础镜像之后就可以基于它做相应的配置,这些操作都记录在Dockerfile中。 Dockerfile: FROM python:3.6-slim # 官网中挑选的python基础镜像 ADD requirements.txt requirements.txt # requirements.txt罗列了需要安装的python模块,将文件复制到容器中 RUN pip install -r ./requirements.txt # 执行模块安装 EXPOSE 5000 # 对外暴露5000端口 requirements.txt Flask # 需要安装的python模块,如有其他需要安装的模块,如下依次写入。 # redis # pymongo 配置完Dockerfile之后,开始配置docker-compose文件。 docker-compose.yml web: build: ../../dockerfile/python/3 # DockerFile所在目录 ports: - "5000:5000" # 对外暴露端口,与Dockerfile中端口号一致 volumes: - ~/workspace/python/redis:/code # 本地工作目录与容器中目录映射 command: - /code/app.py # 处理请求的python脚本 app.py #!/usr/bin/env python from flask import Flask app = Flask(__name__) @app.

Continue reading 


python 中的随机数

󰃭 2017-09-12

python 下随机数相关的处理, 使用random模块 从列表中随机获取一个 如果我们有一个列表, 想随机的获取一个, In [99]: import random In [100]: x = [832, 238, 12, 4, 93, 923] In [101]: random.choice(x) Out[101]: 832 In [102]: random.choice(x) Out[102]: 4 In [103]: random.choice(x) Out[103]: 93 从列表中随机获取若干个 如果我们想从列表中随机获取若干个, 而不是一个呢 In [108]: random.sample(x, 2) Out[108]: [923, 238] In [109]: random.sample(x, 2) Out[109]: [4, 238] In [110]: random.sample(x, 2) Out[110]: [238, 832] In [112]: random.sample(x, 3) Out[112]: [4, 238, 832] 如果想从某个范围里获取若干个随机数, 使用range作为第一个参数, 生成范围列表, 这种方式既快, 又节省空间

Continue reading 


pandas 数据处理基础入门(1)

󰃭 2017-09-12

1. 什么是 pandas pandas 是基于 numpy 构建的,它是一套用来进行数据分析的数据结构和操作工具, 它具有处理数据缺失值,便捷的数据分组过滤,进行数据汇总和统计分析的功能 2. pandas 能做什么 处理缺失的数据 数据过滤分组,排序 数学计算 数据排序,统计分析 从多个数据源(文件,数据库)导入,导出数据 3. 主要数据结构 Series 和 DataFrame 3.1 Series 数据结构 类似一维数组的数据结构,它由一组数据及其相关的索引组成 可以使用列表创建一个简单的 Series,默认创建整数索引 import pandas as pd obj = pd.Series([2, 8, -5, 9]) print(obj) # 打印数组形式的值 print(obj.values) # 打印 Series 索引 print(obj.index) 输出 0 2 1 8 2 -5 3 9 dtype: int64 # 数组形式 [ 2 8 -5 9] # 索引 RangeIndex(start=0, stop=4, step=1) Series 可以使用有意义的标记索引,如下使用 a, b, c, d 作为索引

Continue reading 


【Python从零开始】第十三回_Python基础之"+= 和 xx = xx + xx 的区别"

󰃭 2017-09-11

简单回顾 输出 127 <br /> __实例2__: <br /> ```py num = 123 num += 4 print num # 输出 127 [1, 2, 3, 4] v = [1, 2] v += [3, 4] # 列表的+被重载了, 左右操作数必须都是iterable对象, 否则会报错 print(v) [1, 2, 3, 4] 看起来结果都一样, 然后我们改下代码再看下: <br /> __实例4__: <br /> ```py u = [1, 2] print('id:',id(u)) u = u + [3, 4] print('id:',id(u)) id: 139968928935112 id: 139968928935240 --------------------------------- v = [1, 2] print('id:', id(v)) v += [3, 4] # 列表的+被重载了, 左右操作数必须都是iterable对象, 否则会报错 print('id:', id(v)) id: 139825923734728 id: 139825923734728

Continue reading 


python 的format 用法

󰃭 2017-09-10

格式化输出 我们需要把字符或数字按照某种格式输出的过程, 就是格式化输出, 在python中, 一般有几种方式 直接的字符串拼接, 如 'My Name is '+ name 使用% 占位符, 如 'My Name is %s' %(name,) 使用format方法, 如'My Name is {}'.format(name) 以上几种方式, 官方推荐的是第三种, 使用format 函数, 相较于1,2 两种方式, format 格式化输出时, 功能更强大, 输出更方便 一下介绍下其常用使用方式 通过位置格式化填充字符 比如上面的例子中, 我们在字符串中保留了{} 作为占位符, format的第一个参数会填充该占位符内容 name = 'Tony' print('My Name is {}'.format(name)) # My Name is Tony 如果是有多个变量呢 当有多个{} 作为占位符时, 在format中会依次使用相同位置的变量替换该占位符的内容, 如下 name = 'Tony' age = 18 print('My Name is {}, Age is {}'.

Continue reading 


【Python从零开始】第十二回_Python基础之"if语句的使用"

󰃭 2017-09-06

if控制流语句执行条件原理 if cars > people: print(“We should take the cars.”) elif cars < people: print(“We should not take the cars.”) else: print(“We can’t dicide.”) if buses > cars: print “That’s too many buses.” elif buses < cars: print(“Maybe we could take the buses.”) else: print(“We still can’t decide.”) if people > buses: print(“Alright, let’s just take the buses.”) else: print(“Fine, let’s stay home then.”) <br /> 实例3 ```py num = int(input("enter number")) if num%2 == 0: if num%3 == 0: print ("Divisible by 3 and 2") else: print ("divisible by 2 not divisible by 3") else: if num%3 == 0: print ("divisible by 3 not divisible by 2") else: print ("not Divisible by 2 not divisible by 3")

Continue reading 


【Python从零开始】第十回_Python基础之"关于list"

󰃭 2017-08-30

关于list(转换为列表类型) # append,追加一个元素 list1.append(100) print(list1) # count, 统计1出现的次数 count = list1.count(1) print(count) # extend, 将list2追加到list1中 list1.extend(list2) print(list1) # index, 返回第一个2的索引 index = list1.index(2) print(index) # insert, 在列表第一个位置插入200 list1.insert(0, 200) print(list1) # pop, 删除最后一个元素 list1.pop() print(list1) # reverse, 把列表反向一下 list1.reverse() print(list1) # sort,对列表进行排序 list1.sort() print(list1) # copy,列表拷贝 list3 = list1.copy() print(list1) print(list3) # clear 清空列表 list1.clear() print(list1) print(list3)

Continue reading 


【Python从零开始】第九回_Python基础之"Python对象"

󰃭 2017-08-29

关于Python对象的定义 请看以下例子: 一般is用来比较两个对象的id是不是相同的,测试身份的: <br /> ## 总结 <br /> 在python中一切都是对象,每个对象都有三个属性分别是,(id)身份,就是在内存中的地址,类型(type),是int、字符、字典(dic)、列表(list)等值,例如: a = 12 就是用12这个类型为整数的,值为12,在内存空间中创建了一个空间(这个空间会用一个地址来表示,就是id),当对象被创建后,如果该对象的值可以被更改,那么就称之为可变对象(mutable),如果值不可更改,就称之为不可变对象(inmutable),如果某个对象包含对其他的对象的引用的话,就称之为容器或者集合。 <br /> ## 如何理解类与对象 <br /> 例如智能手机就是一个类(class),它就是某类对象的统称,而你手上的这部iPhone8就是属于智能手机这个类(class)的一个具体实例或者对象对象(object)。 <br /> 事实上,先定义一个类(class),并初始化它的域和方法,然后从属于它的具体对象(object)通过调用这个类的域和方法,即可得到目标值。这其实是模块化设计的体现。<br /> 在具体对象较多时,先自定义一个类(或超类加子类的继承类)封装,然后各对象自行调用,可以高效地完成不同对象的目标实现(避免多个对象的重复代码)。

Continue reading 


【Python从零开始】第九回_Python基础之"for循环"

󰃭 2017-08-25

关于循环For **上次我们已经讲过while1。 介绍For循环 简介 Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。 for语句用于遍历序列的元素(如一个字符串,元组或列表)或其他可以迭代的对象 一般格式 for <variable> in <sequence>: <statements> else: <statements> 实例 实例1 >>>languages = ["u", "3", "v", "3"] >>> for x in languages: ... print (x) ... u 3 v 3 >>> 实例2 sites = ["u", "3","v","3"] for site in sites: if site == "v": print("U3V3!") break print("循环数据 " + site) else: print("没有循环数据!") print("完成循环!") 实例3 list = [1,2,3,4,5] # for 迭代器 in 列表: for x in list: print(x, end=',') 大家可以把以上实例都执行下看看结果。

Continue reading 