Effective Modern C++ 读书笔记之第六章

在 Thu 06 October 2016 发布于 读书笔记 分类 • 标签为 c++11, lambda

lambda表达式

Item 33 避免使用默认的变量捕获方式

上面说到c++11lambda表达式有两种变量的捕获方式:按值(复制)捕获和引用捕获。Item33在采用引用模式(默认[&]会捕获定义lambda表达式作用域下的所有变量, [&params]为显示捕获定义lambda表达式作用域下特定的变量)下,如果不加注意的话,lambda表达式很容易走出引用变量的作用域范围,造成悬空引用,会产生未定义的错误。

#include <iostream>
#include <functional>
#include <string>
class A
{
 public:
    A() : name_("default"){}
    void Print() const {
        std::cout << "A::Print: " << name_ << std …

阅读全文

selenium+PhantomJS使用总结

在 Sun 25 September 2016 发布于 爬虫 分类 • 标签为 selenium, PhantomJS

selenium 是一套web自动化测试工具,其可以模拟真实的浏览器,执行JavaScript等功能。正因为如此,其功能的丰富和强大,让它不单单是个一个web自动化的测试工具。本篇文章主要讲的是其在爬虫抓取上的应用,不会涉及的自动化web测试相关的东西,对于复杂的动态页面,普通的正常抓取只是抓取到其源码页面,真正的内容可能是通过JavaScript,ajax等动态加载,使用selenium来模拟正常的浏览器来帮助进行抓取是一种很有效的方法。selenium支持不同的WebDriver,包括:google chrome ,firefox, IE, PhantomJs等。Python的selenium库提供了一系列简单易用的API, 可以让我们通过代码逻辑模拟点击,拖动,翻页等效果。

对于Pythonselenium模块的安装很简单,直接pip install selenium就可以搞定。对于webDriver,可以根据自己的喜好来进行选着,我目前使用的google chromePhantomJS。在下载完webDriver后可以直接放入到/usr/bin/或者/bin …


阅读全文

Effective Modern C++ 读书笔记之第二章

在 Wed 03 August 2016 发布于 读书笔记 分类 • 标签为 c++11

auto关键字

Item5:auto优先于显示类型声明

首先,在C/C++中声明一个变量,如果不进行初始化,其默认值可能会因为其所在的作用域的不同而不同,在使用的时候可能会出现意想不到的错误。而auto类型的变量类型是从初始化进行推导的,所以需要在定义auto变量的时候进行初始化。使用auto变量可以强制对其进行初始化。

int a; //ok
auto x = 10; //ok
auto a; //error: declaration of ‘auto a’ has no initializer

其次,使用auto可以避免冗长的显示类型声明,特别是在操作STL的各种容器及迭代器等, auto能够敲很多冗余的代码逻辑,如:

std::map<std …

阅读全文

Effective Modern C++ 读书笔记之第一章

在 Thu 21 July 2016 发布于 读书笔记 分类 • 标签为 c++11, lambda

Item 1: 理解模板类型推导

C++98只有一种模板参数类型推导即函数模板参数类型推导,但是在C++11之后,修改了原有的类型推导规则,并加入了autodecltype的推导规则。 函数模板形如如:

template<typename T>
void f(ParamType param);// ParamType可以是T加上各种修饰,如const, reference,指针等

然后在程序逻辑中调用该函数:

f(expr); // expr为传入到函数f中的参数

在编译器进行编译的时候,编译器通过expr太进行两部分的推导:ParamTypeT。 在这里,书中总结了ParamType的三种不同类型: 1. 当ParamType是指针或者引用的类型,但不是universal reference …


阅读全文

编辑距离算法

在 Mon 18 April 2016 发布于 文本算法 分类 • 标签为 编辑距离, Levenshtein Distance

编辑距离, 又叫Levenshtein距离。在wiki上的解释是: 两个不同的字符串, 其中一个字符串转在单字符操作(替换, 插入, 删除)下换成另外一个字符串所需的最少的编辑次数。

例如, 字符串"kitten"转换为字符串"sitting"的编辑次数为3, 且没有比这更少的编辑次数, 过程如下:

  1. kitten --> sitten(k替换成s)

  2. sitten --> sittin(i替换成e)

  3. sittin --> sitting(在字符串末端插入g)

其算法描述的:

现有两个字符串 \(a\)\(b\), 其长度分别为\(m\)\(n\)\(i …


阅读全文

中文分词算法--最大匹配算法

在 Fri 25 March 2016 发布于 自然语言处理 分类 • 标签为 中文分词, 最大匹配

中文分词算法分两大方向:一是机械分词算法, 一是基于统计的分词算法。本篇文章主要介绍机械分词算法中最基础的算法: 最大匹配算法(Maximum Matching, 一下简称MM算法)。 MM算法有三种: 正向最大匹配算法, 逆向最大匹配算法。双向最大匹配算法是取前面两种分词算法切分出来词, 然后根据一定的策略筛出切分效果最好的最为最终的切分结果。下面一一介绍这三种分词方法。

正向最大匹配算法和逆向最大匹配算法

最大匹配算法以字典为例子, 在目标串中取出长度为最大词长(按需任意配置)的连续词在字典中进行扫描匹配。其流程图如下:

forward_max_match_algorithm

依据此逻辑, 给出简单的python实现。对于逆向最大匹配算法, 其和正向最大匹配算法的原理一样, 只是从后向前切词。 这里的字典使用的是搜狗提供的字典, 点击下载

#!/usr/bin/env python
# encoding: utf-8
# -*- coding: UTF-8 -*-

import os
import sys 

def get_trie(filepath):
    trie = {}
    reader = open(filepath, 'r')
    for line in …

阅读全文

<<线性代数>> 第一章笔记

在 Mon 14 March 2016 发布于 线性代数 分类 • 标签为 数学, 线性代数

形如:

$$ a_{1}x_{1} + a_{2}x{2} + ... + a_{n}x_{n} = b$$

的方程称为含有n个未知量的线性方程。 含有m个方程和n个未知量的线性方程组定义为:

$$ a_{11}x_{1} + a_{12}x{2} + ... + a_{1n}x_{n} = b_{1}\\ a_{21}x_{1} + a_{22}x{2} + ... + a_{2n}x_{n} = b_{2}\\ ...\\ a_{m1}x_{1} + a_{m2 …

阅读全文

随机变量

在 Wed 24 February 2016 发布于 概率论 分类 • 标签为 概率论

离散型随机变量

若一个随机变量最多有可数多个可能的值,则称这个随机变量为离散型的。对一个离散型随机变量\(X\),记\(X\)的概率质量函数(probability mass function) \(p(x)\)为:

$$p(a) = P\{X = a\}$$

\(p(a)\)最多在可数的\(a\)上取正值,即如果\(X\)的可能值为\(x_{1}, x_{2},x_{3}, ....\), 那么:

$$p(x_{i}) \geq 0,i = 1, 2, 3...$$
$$p(x) = 0, 所有其他x$$

由于\(X\)必定取值于 …


阅读全文

scrapy 中间件

在 Sun 20 December 2015 发布于 源码分析, scrapy 分类 • 标签为 scrapy, Middlewares

Scrapy框架提供的中间件共有两个:Downloader middlewaresSpider Middlewares。这两个中间件分别作用在不同的数据流向上。

Downloader middlewares

Downloader middlewares顾名思义就是下载中间件,该中间件会在Scrapy的引擎从调度器获取到下一个要爬去的Request,并转发给下载器进行下载这个中间过程进行调用。以及下载器把需要爬取的Request爬取后生成的Response对象返回给Scrapy的引擎的过程中会调用Downloader middlewares

管理Downloader middlewares的类是scrapy.middleware.DownloaderMiddlewares对象。该对象在生成Scrapy的下载器的时候会被调用,该对象通过 读取配置文件中DOWNLOADER_MIDDLEWARES来构建该对象。

class DownloaderMiddlewareManager(MiddlewareManager):

  component_name = 'downloader middleware'

  @classmethod
  def _get_mwlist_from_settings …

阅读全文

使用C/C++扩展Python之二

在 Thu 26 November 2015 发布于 Python 分类 • 标签为 Python, C/C++, Python扩展

Python 引用计数 在上一篇文章中,简单的介绍了使用C/C++开发Python模块的一般步骤。还借用上一篇文中的代码:

static PyObject* py_reverse(PyObject* self, PyObject* args)
{
    char* result;
    char* target = NULL;
    PyObject* retval = NULL;

    int ret = PyArg_parseTuple(args, "s", &target);
    if (!ret) {
        return NULL;
    }   

    result = reverse(target);
    retval = (PyObject*)Py_BuildValue("s", result);
    return retval;
}

上篇文章说道,这只是一个很简陋的封装,还缺少错误处理和引用计数处理的逻辑。 Python …


阅读全文