2017年8月

老坑,现在来填掉:)

之前做一个需求,是需要解析Flask里的URL Rule里的参数名字和类型,用来自动生成命令行内的Rest Client的参数。

Rule:  /disks/<int:disk_id>

需要得到参数: disk (type int)

解铃还须系铃人,直接看Flask源码吧:),看看它是如何管理/解析用户在 route 内添加的URL Parttern的.

首先,一路跟踪下去找到源码里的函数吧~~

from flask import Flask
 
app.route()

从 app.py中,可以看到

url_rule_class = Rule()

搜索parse 关键字,可以找到 parse_rule 函数,让我们一起来看看parse_rule函数吧:)

为了将parse_rule和 flask解耦,我拆出了以下代码。

import re

_rule_re = re.compile(r'''
    (?P<static>[^<]*)                           # static rule data
    <
    (?:
        (?P<converter>[a-zA-Z_][a-zA-Z0-9_]*)   # converter name
        (?:\((?P<args>.*?)\))?                  # converter arguments
        \:                                      # variable delimiter
    )?
    (?P<variable>[a-zA-Z_][a-zA-Z0-9_]*)        # variable name
    >
''', re.VERBOSE)


def parse_rule(rule):
    """Parse a rule and return it as generator. Each iteration yields tuples
    in the form ``(converter, arguments, variable)``. If the converter is
    `None` it's a static url part, otherwise it's a dynamic one.

    :internal:
    """
    pos = 0
    end = len(rule)
    do_match = _rule_re.match
    used_names = set()
    while pos < end:
        m = do_match(rule, pos)
        if m is None:
            break
        data = m.groupdict()
        if data['static']:
            yield None, None, data['static']
        variable = data['variable']
        converter = data['converter'] or 'default'
        if variable in used_names:
            raise ValueError('variable name %r used twice.' % variable)
        used_names.add(variable)
        yield converter, data['args'] or None, variable
        pos = m.end()
    if pos < end:
        remaining = rule[pos:]
        if '>' in remaining or '<' in remaining:
            raise ValueError('malformed url rule: %r' % rule)
        yield None, None, remaining

可以看到,flask讲一个URL Rule,首先拆解为 “/” 分隔的一个个单元。

之后,每个单元被解析为 converter(转换器), arguments(参数),variable(变量)。

以 /api/<int:id>/create 为例,可以知道得到三个单元

(None, None, "/api/"),
("int", None, "id"),
(None, None, "/create"),

第一个单元里,converter是None,则这个参数是一个URL中的静态字符串;

第二个单元内,converter是int,意即参数“id”是一个整型的变量;

第三个单元同第一个单元相同,不做多解释了。

通过以上分析,我们就拿到了Flask的Url Rule中变量的类型和名字,就可以做CLI自动生成中的参数解析了:)

PS:最近越来越赞同GongZi提的,“你会多少其实不重要要,重要的是你解决新问题的能力”,这种“Meta Learning”的能力,才是核心竞争力啊。

About:

以前自己单打独斗的时候,使用git主要是记录版本,很少用git来协作,协作也不过是两个人的小打小闹,一直在pull, 或者fetch merge,大家也都在修改master分支,没有明确的管理,进了新公司,需要比较严格的code review,主分支的管理都是确定的,这时候用rebase,reset,revert代替pull, fetch , merge之类的就好的多啦。

- 阅读剩余部分 -

About:SQL数据库中,Index,字段类型等等直接影响整个SQL数据库的运行效率,有时候又必须考虑灵活性,所以才有这个话题:SQL数据库中的字段设计。

How:这里主要谈三个问题:

1.什么时候应该将一个属性作为单独的字段,什么时候可以打包。

2.index什么时候用

3.如何提高字段灵活性

- 阅读剩余部分 -

老的JenkinsCI(CentOS 6.x)在运行docker的时候,忽然提示 “mountpoint for devices not found“.

官方的描述里,这个应该是和Cgroup有关的问题。

官方提供的环境检查的脚本,可以运行看看:

https://github.com/docker/docker/blob/master/contrib/check-config.sh

看看是不是所有的配置都已经ok了。

如果是运行库缺失,参考

http://stackoverflow.com/questions/24396071/docker-error-mountpoint-not-found

进行修复。

如果前面几个步骤都没有发现问题,则可以看看Cgroup 的Mount是否有问题。

使用

mount -a

查看mount列表内是否有

cgroup on /sys/fs/cgroup type tmpfs (rw,uid=0,gid=0,mode=0755)

如果这个没有挂载,则会导致mount point for devices not found.

有两种方式可以挂载这个mountpoint,一个是在fstab死写,一个是用一个脚本动态挂载。

https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount

Why:

在fedora上面配置一台PXE server最大的问题在于如何确认各方面已经工作正常,因为测试是非常困难的,所以很难确认哪一步没有做好。

本文大致按照如下流程前进,具体的配置附上文章参考链接,主要说说遇到的坑。

概述(环境和条件)
配置DHCP server
配置nginx
其他组件
确认和Troubleshooting.





- 阅读剩余部分 -