Elasticsearch 简介

Elasticsearch 是一款稳定高效的分布式搜索和分析引擎,它的底层基于 Lucene,并提供了友好的 RESTful API 来对数据进行操作,还有比较重要的一点是, Elasticsearch 开箱即可用,上手也比较容易。

目前 Elasticsearch 在搭建企业级搜索(如日志搜索、商品搜索等)平台中很广泛,官网也提供了不少案例,比如:

  • GitHub 使用 Elasticsearch 检索超过 800 万的代码库
  • eBay 使用 Elasticsearch 搜索海量的商品数据
  • Netflix 使用 Elasticsearch 来实现高效的消息传递系统

本文主要介绍 Elasticsearch 的基本概念及入门使用。

阅读全文 »

HTTP 协议简介

HTTP (HyperText Transfer Protocol, 超文本传输协议)是互联网上应用最为广泛的一种网络协议,它是基于 TCP应用层协议,简单地说就是客户端和服务器进行通信的一种规则,它的模式非常简单,就是客户端发起请求,服务器响应请求,如下图所示:

HTTP 最早于 1991 年发布,是 0.9 版,不过目前该版本已不再用。HTTP 目前在使用的版本主要有:

  • HTTP/1.0,于 1996 年 5 月发布,引入了多种功能,至今仍在使用当中。
  • HTTP/1.1,于 1997 年 1 月发布,持久连接被默认采用,是目前最流行的版本。
  • HTTP/2 ,于 2015 年 5 月发布,引入了服务器推送等多种功能,是目前最新的版本。

阅读全文 »

高效的 itertools 模块

我们知道,迭代器的特点是:惰性求值(Lazy evaluation),即只有当迭代至某个值时,它才会被计算,这个特点使得迭代器特别适合于遍历大文件或无限集合等,因为我们不用一次性将它们存储在内存中。

Python 内置的 itertools 模块包含了一系列用来产生不同类型迭代器的函数或类,这些函数的返回都是一个迭代器,我们可以通过 for 循环来遍历取值,也可以使用 next() 来取值。

itertools 模块提供的迭代器函数有以下几种类型:

  • 无限迭代器:生成一个无限序列,比如自然数序列 1, 2, 3, 4, ...
  • 有限迭代器:接收一个或多个序列(sequence)作为参数,进行组合、分组和过滤等;
  • 组合生成器:序列的排列、组合,求序列的笛卡儿积等;

阅读全文 »

Python 中的单例模式

单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

在 Python 中,我们可以用多种方法来实现单例模式:

  • 使用模块
  • 使用 __new__
  • 使用装饰器(decorator)
  • 使用元类(metaclass)

阅读全文 »

Python 之旅

cover

在学习和使用 Python 的过程中,我作了不少笔记,并对一些笔记进行了加工和完善,发表在博客上。随着笔记的增加,我就萌生了写一本书的想法,希望能比较系统地总结相关知识,巩固自己的知识体系,而不是停留在『感觉好像懂了』的状态中。

有了想法之后,接下来就要开始写了。当然,从产生想法到付诸实践还是纠结了一段时间,毕竟,作笔记和写书很不一样啊。思想斗争过后,我下定决心要把它写出来。

首先,我参考一些相关的书籍,作了一个基础的思维导图,如下:

思维导图

接下来,就要开始写作了,这也是最艰难的一关。

我没有按照从头到尾的顺序写,而是从最感兴趣的知识点入手,比如函数式编程、类的使用等等。就这样,一点一点地写,实在不想写了,就先搁置一下,过两天继续写。

我在写作的过程中,给自己提了一个要求:尽量深入浅出,条理清晰。至于是否达到了,希望读者们多多批评指正,并给我提意见和建议。

目前,本书的目录如下(基本对应上面的思维导图):

  • 第 1 章:介绍一些基础知识,包括 Python 中的输入和输出,字符编码。
  • 第 2 章:介绍常用数据类型,比如字符串、列表和字典等。
  • 第 3 章:介绍函数的定义和函数参数魔法。
  • 第 4 章:介绍 Python 中的函数式编程,包括匿名函数、闭包和装饰器等。
  • 第 5 章:介绍 Python 中类的使用,包括类方法、静态方法、super 和元类的使用等。
  • 第 6 章:介绍 Python 中的高级特性,比如生成器,上下文管理器。
  • 第 7 章:介绍文件和目录操作,os 的使用。
  • 第 8 章:介绍使用 Python 处理进程、线程和协程。
  • 第 9 章:异常处理。
  • 第 10 章:单元测试。
  • 第 11 章:正则表达式,re 模块的使用。
  • 第 12 章:HTTP 服务,requests 模块的使用。
  • 第 13 章:一些标准模块的使用,比如 argparse、collections 和 datetime 等。
  • 第 14 章:一些第三方模块的使用。
  • 第 15 章:结束语。

本书的编码环境:

  • Python 版本以 2.7 为主,同时也会指出在 Python3 中的相应变化
  • 操作系统使用 macOS,代码结果,尤其是内存地址等由于运行环境的不同会存在差异

最后,附上书籍地址:

Python 正则表达式 re 模块

简介

正则表达式(regular expression)是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串,可以匹配其自身。比如,正则表达式 ‘hello’ 可以匹配字符串 ‘hello’。

要注意的是,正则表达式并不是一个程序,而是用于处理字符串的一种模式,如果你想用它来处理字符串,就必须使用支持正则表达式的工具,比如 Linux 中的 awk, sed, grep,或者编程语言 Perl, Python, Java 等等。

正则表达式有多种不同的风格,下表列出了适用于 Python 或 Perl 等编程语言的部分元字符以及说明:

阅读全文 »

命令行神器 Click

Click

Click 是用 Python 写的一个第三方模块,用于快速创建命令行。我们知道,Python 内置了一个 Argparse 的标准库用于创建命令行,但使用起来有些繁琐,Click 相比于 Argparse,就好比 requests 相比于 urllib

快速使用

Click 的使用大致有两个步骤:

  1. 使用 @click.command() 装饰一个函数,使之成为命令行接口;
  2. 使用 @click.option() 等装饰函数,为其添加命令行选项等。

它的一种典型使用形式如下:

1
2
3
4
5
6
import click
@click.command()
@click.option('--param', default=default_value, help='description')
def func(param):
pass

阅读全文 »

异步任务神器 Celery

Celery

在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避免它们阻塞主程序的运行,我们经常会采用多线程或异步任务。比如,在 Web 开发中,对新用户的注册,我们通常会给他发一封激活邮件,而发邮件是个 IO 阻塞式任务,如果直接把它放到应用当中,就需要等邮件发出去之后才能进行下一步操作,此时用户只能等待再等待。更好的方式是在业务逻辑中触发一个发邮件的异步任务,而主程序可以继续往下运行。

Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)。它的架构组成如下图:

Celery_framework

阅读全文 »

实例讲解基于 Flask+React 的全栈开发和部署

简介

我有时在 Web 上浏览信息时,会浏览 Github Trending, Hacker News稀土掘金 等技术社区的资讯或文章,但觉得逐个去看很费时又不灵活。后来我发现国外有一款叫 Panda 的产品,它聚合了互联网大多数领域的信息,使用起来确实很不错,唯一的遗憾就是没有互联网中文领域的信息,于是我就萌生了一个想法:写个爬虫,把经常看的网站的资讯爬下来,并显示出来。

有了想法,接下来就是要怎么实现的问题了。虽然有不少解决方法,但后来为了尝试使用 React,就采用了 Flask + React + Redux 的技术栈。其中:

  • Flask 用于在后台提供 api 服务
  • React 用于构建 UI
  • Redux 用于数据流管理

目前项目已经实现了基本功能,项目源码:Github 地址。目前界面大概如下:

home

阅读全文 »

Python 函数参数魔法

函数参数

在 Python 中,定义函数和调用函数都很简单,但如何定义函数参数和传递函数参数,则涉及到一些套路了。总的来说,Python 的函数参数主要分为以下几种:

  • 必选参数
  • 默认参数
  • 可变参数
  • 关键字参数

必选参数

必选参数可以说是最常见的了,顾名思义,必选参数就是在调用函数的时候要传入数量一致的参数,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> def add(x, y): # x, y 是必选参数
... print x + y
...
>>> add() # 啥都没传,不行
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: add() takes exactly 2 arguments (0 given)
>>> add(1) # 只传了一个,也不行
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: add() takes exactly 2 arguments (1 given)
>>> add(1, 2) # 数量一致,通过
3

阅读全文 »