2018年11月22日三峡168赛记

Posted on Sat 01 December 2018 in 越野跑 • Tagged with 越野跑, 生活

把工作安排好后,急冲冲的赶到北京西站,又是在开车几分钟前上的车,和上次去江山跑越野一样, 至此我的三峡168越野跑之旅拉开了序幕。上车后,发现车厢好多人是去三峡比赛的,和他们寒暄了几句,爬到自己的铺位就睡了下来。一觉醒来,就到了宜昌。出了火车站,直接到旁边的汽车站坐上了汽车,等了一会儿,车上就载满了跑友,师傅开动了汽车,向秭归进发!

第一次来三峡,坐在靠窗的位置,目不转睛的望着窗外的景色,三峡的山和门头沟的山很像,都是比较险峻。这期间,老妈打来电话问我到那了,我在来三峡之前就让她和老爸过来玩,从信阳坐高铁到宜昌很方便,但是老爸和老妈死活不过来,怕花钱的想法有时真的是让我哭笑不得。这次她什么都没有说,只是让我吃好,休息好,不要勉强自己,注意安全,得到我的保证后,她就挂电话了,我继续看我的风景。

长江三峡险峻的高山

到秭归县城下了车后,走了一小段路来到了组委会指定的酒店进行装备检查,检查的挺严格的,我的体检报告被看了好一阵子,强制准备是随机抽查的,因为组委会安排的很有序,一会就检查完了,中间有个小插曲,就是GPS押金只能用现金,我只好去旁边的ATM机器取了些钱,真的是好久没有用ATM了,押金是用个信封装起来的,上面有名字和参赛号码,后面完赛的时候直接原封不动地还了回来 …


Continue reading

2018年10月20日江山100 60公里组赛记

Posted on Thu 25 October 2018 in 越野跑 • Tagged with 越野跑, 生活

比赛都结束了一个星期了,才想着要写一篇流水账赛记。

备战

自从报名了江山100越野赛60KM组别之后,就开始了抓紧训练,8,9月份一共进山5次,周一到周五隔天路跑,好在成绩一次比一次好。 从跑一圈三峰要6个多小时到现在可以把时间压缩到5小时10多分钟,能做到爬升的时候把心率稳定到145左右,平路和下坡都能跑动起来, 不枉我这两个月的运动量都上120KM之多了。

前往江山

北京到江山的火车只有一趟高铁,下午的的车次,晚上23左右到江山。20号早上5点就要开跑,没办法,订了九江中转的票,正好也去九江看看,然后19号请了一天的假。 18号上完班,冲冲忙忙的赶到北京西站,好在开车几分钟前上了火车,在火车上一觉睡到天亮。7点左右出了火车站就直奔江边。上午12点的火车到江山,时间很是充裕,打算去江边看看浔阳楼和锁江楼塔看看。 第一次近距离接触长江,叹为观止,江面比较宽,江边风比较大,呼呼作响,空气比较清新和潮湿,江面船只零星,江边的公园有很多晨练的人。 然后,就进了锁江楼塔,20元的门票很便宜,除了几个穿着时髦的阿姨,景区里面也没有几个游客。景区就一座塔楼和一座石塔就没有其他了。 sea_of_bamboo 塔楼每一层都有介绍锁江楼塔的历史,时间不是很宽裕,我匆匆的扫了几眼,找了几个不错的位置自拍了几张。 sea_of_bamboo 石塔被围栏围了起来,不能近距离观看 …


Continue reading

Go语言Context模块源码解析

Posted on Sun 30 September 2018 in 源码解析,Go • Tagged with Go

Go的标准库中的Context在日常的工作编码中的使用率很高。这个库是解决Goroutine之间裙带关系的利器,是channel之外的另一个较好的选择。这篇文章将通过源码来了解其实现。 本篇文章是基于1.10.3版本的Go源码, 源码位于src/context

context库有两个interface, Context和canceler:

type Context interface {
  Deadline()(deadline time.Time, ok bool)
  Done() <-chan struct{}
  Err() error
  Value(key interface{})interface{}
}

type canceler interface {
  cancel(removeFromParent bool, err error)
  Done() <-chan struct{}
}

并且为了方便使用,context库提供了如下几个方法来获取Context实例:

func Background() Context
func TODO …

Continue reading

人生中第一幅水彩画

Posted on Sun 25 March 2018 in 水彩 • Tagged with 水彩, 生活

迷上了水彩,画了幅人生中的第一幅水彩画。 sea_of_bamboo


Continue reading

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

Posted on Thu 06 October 2016 in 读书笔记 • Tagged with c++11, lambda

lambda表达式

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

上面说到c++11的lambda表达式有两种变量的捕获方式:按值(复制)捕获和引用捕获。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::endl;
    }
 private:
        std::string name_;
};

typedef std::function<void()> func …

Continue reading

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

Posted on Wed 03 August 2016 in 读书笔记 • Tagged with 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 …

Continue reading

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

Posted on Thu 21 July 2016 in 读书笔记 • Tagged with c++11, lambda

Item 1: 理解模板类型推导

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

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

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

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

在编译器进行编译的时候,编译器通过expr来进行两部分的推导:ParamType 和 T。 在这里,书中总结了ParamType的三种不同类型: 1. 当ParamType是指针或者引用的类型,但不是universal reference类型(这个会在Item 24讲到)。

  1. 当ParamType是universal reference类型

  2. 当ParamType既不是指针也不是引用类型。

下面依次详解ParamType在不同类型下,参数推导的机制。

Case 1: ParamType是指针或者引用类型, 但不是universal reference …

Continue reading

编辑距离算法

Posted on Mon 18 April 2016 in 文本算法 • Tagged with 编辑距离, 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 …


Continue reading

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

Posted on Fri 25 March 2016 in 自然语言处理 • Tagged with 中文分词, 最大匹配

中文分词算法分两大方向:一是机械分词算法, 一是基于统计的分词算法。本篇文章主要介绍机械分词算法中最基础的算法: 最大匹配算法(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 …

Continue reading

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

Posted on Mon 14 March 2016 in 线性代数 • Tagged with 数学, 线性代数

形如:

$$ 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 …

Continue reading