#184 Werkzeug WSGI 框架

2017-01-30

示例

from werkzeug.wrappers import Request, Response
from werkzeug.routing import Map, Rule

class Application:
    def __init__(self):
        self.url_map = Map([
            Rule('/', endpoint='hello')
        ])

    def hello(self, request):
        text = 'Hello, World!'
        response = Response(text, content_type='text/plain')
        return response

    @Request.application
    def __call__(self, request):
        adapter = self.url_map.bind_to_environ(request.environ)
        endpoint, values = adapter.match()

        handler = getattr(self, endpoint)
        return handler(request, **values)

if __name__ == '__main__':
    from werkzeug.serving import run_simple
    app = Application()
    run_simple('localhost', 5000, app)

Werkzeug 与协程(async/await

Werkzeug 1.x 开始已经提供了对协程的支持。
PS:WSGI 规范是基于同步的设计,没有较好的适配异步编程,所以后面一些更年轻的框架选择了 ASGI(Async Server Gateway Interface)。
PS:2014/03/01, WSGI
PS:2021/11/06, 体验 ASGI

import asyncio
from werkzeug.wrappers import Request, Response
from werkzeug.routing import Map, Rule

class Application:
    def __init__(self):
        self.url_map = Map([
            Rule('/', endpoint='hello')
        ])

    async def hello(self, request):
        text = 'Hello, World!'
        response = Response(text, content_type='text/plain')
        return response

    @Request.application
    async def __call__(self, request):
        adapter = self.url_map.bind_to_environ(request.environ)
        endpoint, values = adapter.match()

        handler = getattr(self, endpoint)
        response = await handler(request, **values)
        return response

if __name__ == '__main__':
    from werkzeug.serving import run_simple
    app = Application()
    run_simple('localhost', 5000, app)

附:版本历史

版本 时间
2.3.4 May 9, 2023
2.3.3 May 1, 2023
2.3.2 Apr 29, 2023
2.3.1 Apr 27, 2023
2.3.0 Apr 26, 2023
2.2.3 Feb 15, 2023
2.2.2 Aug 9, 2022
2.2.1 Jul 28, 2022
2.2.0 Jul 24, 2022
2.1.2 Apr 29, 2022
2.1.1 Apr 2, 2022
2.1.0 Mar 29, 2022
2.0.3 Feb 8, 2022
2.0.2 Oct 6, 2021
2.0.1 May 18, 2021
2.0.0 May 12, 2021
1.0.1 Apr 1, 2020
1.0.0 Feb 7, 2020
0.16.1 Jan 27, 2020
0.16.0 Sep 19, 2019
0.15.6 Sep 5, 2019
0.15.5 Jul 17, 2019
0.15.4 May 15, 2019
0.15.3 May 15, 2019
0.15.2 Apr 3, 2019
0.15.1 Mar 22, 2019
0.15.0 Mar 20, 2019
0.14.1 Jan 1, 2018
0.14 Dec 31, 2017
0.13 Dec 8, 2017
0.12.2 May 16, 2017
0.12.1 Mar 16, 2017
0.12 Mar 10, 2017
0.11.15 Dec 31, 2016
0.11.14 Dec 31, 2016
0.11.13 Dec 27, 2016
0.11.12 Dec 26, 2016
0.11.11 Aug 31, 2016
0.11.10 May 24, 2016
0.11.9 Apr 25, 2016
0.11.8 Apr 15, 2016
0.11.7 Apr 15, 2016
0.11.6 Apr 14, 2016
0.11.5 Mar 23, 2016
0.11.4 Feb 15, 2016
0.11.3 Dec 20, 2015
0.11.2 Nov 12, 2015
0.11.1 Nov 10, 2015
0.11 Nov 8, 2015
0.10.4 Mar 26, 2015
0.10.3 Mar 26, 2015
0.10.2 Mar 26, 2015
0.10.1 Feb 4, 2015
0.10 Jan 30, 2015
0.9.6 Jun 7, 2014
0.9.5 Jun 7, 2014
0.9.4 Aug 26, 2013
0.9.3 Jul 25, 2013
0.9.2 Jul 18, 2013
0.9.1 Jun 14, 2013
0.9 Jun 13, 2013
0.8.3 Feb 5, 2012
0.8.2 Dec 16, 2011
0.8.1 Sep 30, 2011
0.8 Sep 30, 2011
0.7.2 Sep 30, 2011
0.7.1 Jul 26, 2011
0.7 Jul 24, 2011
0.6.2 Apr 24, 2010
0.6.1 Apr 13, 2010
0.6 Feb 19, 2010
0.5.1 Jul 10, 2009
0.5 Apr 25, 2009
0.4.1 Jan 11, 2009
0.4 Nov 23, 2008
0.3.1 Jun 24, 2008
0.3 Jun 15, 2008
0.2 Feb 14, 2008
0.1 Dec 10, 2007

#183 The Pallets Projects

2017-01-30

这个组织下的每个项目单拿出来都是响当当的存在:

  • Click — Beautiful, composable command line interface creation kit.
  • Flask — a flexible and popular web development framework
  • ItsDangerous — Safely pass trusted data to untrusted environments and back.
  • Jinja — a full featured template engine for Python
  • MarkupSafe — Safely add untrusted strings to HTML/XML markup.
  • Quart — an async reimplementation of flask
  • Werkzeug — The comprehensive WSGI web application library.
  • Click 命令行工具
  • Flask 轻量级 Web 框架
  • ItsDangerous
  • Jinja 知名模板库
  • MackupSafe
  • Quart
  • Werkzeug Web 工具箱(WSGI),Flask 的底层

#182 不加 sudo 执行 Docker 命令

2017-01-13

因为公司组织培训 Docker,为了更好参与课程,我提前一周开始预习 Docker 技术。

安装 Docker 之后,首次执行 docker info 时接到错误信息:“Cannot connect to the Docker daemon. Is the docker daemon running on this host?”。
当时,我再三确认了 Docker 服务运行状态,确实没有任何问题,傻眼了。
之后,加上 sudo 试试才运行正确。

#181 计量单位

2017-01-12

国际单位制

基本单位

类型 名称 符号 定义
时间 t s 铯-133 原子 在基态下的两个超精细能级之间跃迁
所对应辐射的 9192631770 个周期的时间
长度 L m 真空中,光一秒行程的 $\frac{1}{299792458}$
质量 m g
电流 I 毫安 A
热力学温度 T 开尔文 K
物质的量 n(v) 摩尔 mol
发光强度 l(lv) 坎德拉 cd

国际单位制词头

词头 符号 中文 系数
yotta Y 尧(它) $10^{24}$
zetta Z 泽(它) $10^{21}$
exa E 艾(可萨) $10^{18}$
peta P 拍(它) $10^{15}$
tera T 太(拉) $10^{12}$
giga G 吉(咖) $10^{9}$
mega M $10^{6}$
kilo k $10^{3}$
hecto h $10^{2}$
daca da $10^{1}$
deci d $10^{-1}$
centi c $10^{-2}$
milli m $10^{-3}$
micro μ, u $10^{-6}$
nano n 纳(诺) $10^{-9}$
pico p 皮(可) $10^{-12}$
femto f 飞(母托) $10^{-15}$
atto a 阿(托) $10^{-18}$
zepto z 仄(普托) ze4 $10^{-21}$
yocto y 幺(科托) $10^{-24}$

时间单位

  • 天 d day
  • 小时 h hour
  • 分 m minute
  • 秒 s second
  • 毫秒 ms millisecond
  • 微妙 us microsecond
  • 纳秒 ns nanosecond

长度单位

长度的基本单位是米,标准是光在真空中 $1 / 299792458$ 秒内运动的距离。

市制

毫厘分寸尺丈

依据民国 18 年(1929 年)《度量衡法》。
1959 年《统一公制计量单位中文名称方案》基本沿用《度量衡法》,只是单位前面加一个 字,另外没有列出引、毫。

 1 米   = 3 尺
10 米   = 3 丈
 1 公里 = 2 里

1 里 =  15 引 = 150       丈 = 500 米
1 引 =  10 丈 =  33.333   米
1 丈 =  10 尺 =   3.333   米
1 尺 =  10 寸 =   0.333   米
1 寸 =  10 分 =   0.333 分米
1 分 =  10 厘 =   0.333 厘米
1 厘 =  10 毫 =   0.333 毫米
         1 毫 =   0.033 微米 = 33.333 微米

天文单位

我知道的四个不属于国际单位制的天文学常用单位:

  1. 光秒, Light Second, ls, 299792458 m, 约等于 30 万公里
    PS: 换算成公制单位,1 ls ≈ 0.3 Gm (吉米)
  2. 光年, Light Year, ly, 大约等于 $9.46 × 10^{18}$ km (9.46 千亿公里)
    $$
    365.25 × 86400 = 31557600 \
    × 299792458 = 9460730472580800
    $$
  3. 天文单位, Astronomical Unit, au, 日地平均距离(地球和太阳之间距离的平均值)
    2012 年国际天文学大会 IAU 将其固定为 149,597,870,700 m, 也就是 1 AU ≈ 1.5 亿公里 ($10^{9}$)。
    PS: 换算成公制单位,1 au ≈ 149.6 Gm (吉米)
    PS: 1 au ≈ 499 ls,也就说光从太阳到地球大概需要 499 秒左右(8 分多钟)。
    PS: 作为参考: 月地距离 $3.844 × 10^{5}$ km 约等于 2.57 ‰ au; 太阳半径 $6.955 × 10^{5}$ km 约等于 4.65 ‰ au (太阳半径 = 1.81 月地距离)

  4. 秒差距, Parsec, pc, 通过时差来表示天文距离
    如果地球和太阳的连线,地球和另一个天体的连线,成 89 度角,那么太阳和这个天体之间的距离为 1 pc
    PS: 视察越大距离越近,视察越小距离越远

示例图(非等比例绘制):
img

根据三角函数的计算,

$$
1 pc = \frac {1 au} {tan 1}
= \frac {1 au} {\frac {1} {360} × \frac {π} {180}}
= \frac {648000} {π} au
$$

约等于 206265 au, 或者 3.26 ly,或者 $3 × 10^{13}$ km (三万亿公里)。

英制

暂无更多信息。

面积单位

平方十米 $dam^{2}$, 平方百米 $hm^{2}$, 平方千米 $km^{2}$ ...
平方米 $m^{2}$,平方分米 $dm^{2}$,平方厘米 $cm^{2}$ ...

市制

毫厘分亩顷

1 顷 = 100 亩 = 600000 平方尺 = 66666.666 平方米
1 亩 =  10 分 =   6000 平方尺 =   666.666 平方米
1 分 =  10 厘 =    600 平方尺 =    66.666 平方米
1 厘 =  10 毫 =     60 平方尺 =     6.666 平方米
         1 毫 =      6 平方尺 =     0.666 平方米

公顷

1 平方米 =     9 平方尺
1 公顷   =    15 亩
         = 90000 平方尺
         = 10000 平方米
1 平方尺 =   100 平方寸
         =   1/9 平方米

英制

暂无更多信息。

体积单位

立方厘米,立方米...

不属于国际单位制的体积单位是:

  1. 升, liter, L, $\frac {1} {1000} m^3$

市制

重量单位

物理学上,叫做质量。

  1. 吨 = 1000 kg
  2. 千克,公斤,kilogram
  3. 克,gram

市制

1 担 = 100 斤 = 50   公斤
1 斤 =  10 两 =  0.5 公斤
1 两 =  10 钱
1 钱 =  10 分
1 分 =  10 厘

PS: 29 年的《度量衡法》中 1 斤 = 16 两,而 59 年的《统一公制计量单位中文名称方案》则是 1 斤 = 10 两。

英制

暂无更多信息。

信息计量单位

这里需要特别说明的是国际单位制是十进制的,而 IT 界一般遵循二进制的计量方式(IEC 60027-2)。

单位 符号 说明 近似 IEC 单位 符号 说明
byte B $10^{0}$bytes byte B $2^{0}$bytes
kilobyte KB $10^{3}$bytes kibibyte KiB $2^{10}$bytes
megabyte MB $10^{6}$bytes mebibyte MiB $2^{20}$bytes
gigabyte GB $10^{9}$bytes gibibyte GiB $2^{30}$bytes
terabyte TB $10^{12}$bytes tebibyte TiB $2^{40}$bytes
petabyte PB $10^{15}$bytes pebibyte PiB $2^{50}$bytes

#180 Shell 重定向

2017-01-10
command >output.txt         # 把标准输出重定向到一个文件中
command >> output.txt           # 把标准输出重定向到一个文件中(追加)

command 1>output.txt        # 把标准输出重定向到一个文件中
command 1>>output.txt        # 把标准输出重定向到一个文件中(追加)

command 2>output.txt        # 把标准错误重定向到一个文件中
command 2>>output.txt           # 把标准错误重定向到一个文件中(追加)

command >output.txt 2>&1    # 把标准输出和标准错误一起重定向到一个文件中
command >>output.txt 2>&1       # 把标准输出和标准错误一起重定向到一个文件中(追加)
command <input.txt              # command命令以output.txt文件作为标准输入
command <input.txt >output.txt  # command命令以output.txt文件作为标准输入, 以 output.txt 文件作为标准输出

# 从标准输出中读入,直至遇到delimiter分界符(不能与已存在的文件重名)
command << delimiter
command <&m  把文件描述符m作为标准输出
command >&m  把标准输出重定向到文件描述符m中
command <&-  关闭标准输入

#179 Linux date 命令

2017-01-02

示例

# %c 表示当前 locale 的日期和时间
$ date +%c
2017年01月02日 星期一 12时00分00秒

# 获取当前时间戳
$ date +%s
1483329600
# -d 表示使用指定时间,而非默认的当前时间
# 获取指定时间的时间戳 (时间字符串 -> 时间戳)
$ date +%s -d "2017/01/01 00:00:00"
1483200000
# @ 表示时间戳
# 时间戳 -> 时间字符串
$ date -d @1483200000  # 等于: date --date="@1483200000"
2017年 01月 01日 星期日 00:00:00 CST
$ date -d @1483200000 +%c
2017年01月01日 星期日 00时00分00秒

# -u 表示使用 UTC 时间
$ date -u
2017年01月02日 星期一 14时00分00秒 UTC
$ date -d @1483200000 -u
2016年 12月 31日 星期六 16:00:00 UTC

$ date +%Y%m%d%H%M%S
20170102120000

# -R, --rfc-email, RFC 5322 格式
$ date -R
Mon, 02 Jan 2017 12:00:00 +0800

$ date --rfc-3339=date     # 可以缩写成 d
2017-01-02
$ date --rfc-3339=seconds  # 可以缩写成 s
2017-01-02 12:00:00+08:00
$ date --rfc-3339=ns       # 可以缩写成 n
2017-01-02 12:00:00.000000000+08:00

常见日期格式占位符

  • Y 年,4 位数字
  • m 月,2 位数字
  • d 日,2 位数字
  • H 时,2 位数字
  • M 分,2 位数字
  • S 秒,2 位数字
  • F 完整日期, 等于 %Y-%m-%d
  • T 完整时间, 等于 %H:%M:%S
  • R 等于 %H:%M

#177 Visual C++

2016-11-07

VC6

Microsoft Visual C(简称Visual C、MSVC、VC或VC)是微软公司的C开发工具,具有集成开发环境,可提供编辑C语言,C以及C/CLI等编程语言。

MS 的 C/C++ 开发工具,继承了他们家的 Win32API,MFC,.NET 等编程框架。

最早是 MSC (Microsoft C);
后来添加 C 支持,改名叫 MS C/C;
再后来,GUI 编程兴起,改名 Visual C,简称 MSVC;
再后来,.NET 框架出来了,改名 Visual C
.NET (Visual C .NET 2002);
再后来,05 年,又给改回去了 (Visual C
2005);
现在最新版本已经到了 Visual C++ 2015。

版本历史

Version Time Notes
MSC 1.0 1983
MSC 7.0 1989
MS C/C++ 7.0 1992 c++, mfc
VC++ 1.0 1993 16bit 版本
VC++ 1.52C 1993 16bit 最后版本
VC++ 1.0 1993 32bit 版本, 重置了版本号
VC++ 2.0 Win95 发布
VC++ 4.0 1995
VC++ 5.0 1997
VC++ 6.0 1998
Visual C++ .NET 2002 2002 7.0
Visual C++ .NET 2003 2003 7.1
Visual C++ 2005 2005 8.0, 开始支持 64bit
Visual C++ 2008 2007 9.0
Visual C++ 2010 2010 10.0
Visual C++ 2012 2012 11.0
Visual C++ 2013 2013 12.0
Visual C++ 2015 2015 14.0
Visual C++ 2017 2017 14.10
Visual C++ 2019 2019 14.20

PS: 大学学 C++ 的时候就是用的 VC6。

VC2015

  • C99
    2013 才开始支持,到 2015,基本上实现了 C99。
    PS: C11 就不要想了。
  • C14
    微软在 C
    领域还是很有发言权的。

.NET

Managed C++

Managed Extensions for C, C托管扩展

微软对 C 做了一个语法拓展(属性和关键字),便于将 C 编译成 .NET 平台中间代码。

非托管代码(没有改写)可以与托管代码进行很好的互操作。

但是由于引入了大量新的代码,代码整体可读性降低了。

C++/CLI

经过多年工程实践,微软为 Managed C 进行了大量改进。然后可能是标准化(ECMA-372)的缘故,新版本改名叫 C/CLI。
VC2005 开始使用 C/CLI 代替 Managed C

根据文档(如何将 C++/CLI 项目移植到 .NET Core)来看,C++/CLI 项目就算移植到 .NET Core 也只能运行于 Windows。原因不明。

参考资料与拓展阅读

#176 PHP 中 foreach 循环赋值给引用的一个特性(坑)

2016-10-17

复现方法

创建一个存文本文件,命名为:test.php,内容如下:

<?php

$menu = [
    1 => ['id' => 1, 'name' => 'a', 'child' => []],
    2 => ['id' => 2, 'name' => 'b', 'child' => []],
];

foreach ($menu as &$submenu) {
    $submenu['class'] = empty($submenu['child']) ? '' : 'hasChild';
}

print_r($menu);

print str_repeat('-', 80) . "\n";

foreach ($menu as $submenu) {
    print_r($submenu);
}
?>

命令行中运行:

php -f test.php

得到以下输出:

Array
(
    [1] => Array
        (
            [id] => 1
            [name] => a
            [child] => Array
                (
                )

            [class] =>
        )

    [2] => Array
        (
            [id] => 2
            [name] => b
            [child] => Array
                (
                )

            [class] =>
        )

)
--------------------------------------------------------------------------------
Array
(
    [id] => 1
    [name] => a
    [child] => Array
        (
        )

    [class] =>
)
Array
(
    [id] => 1
    [name] => a
    [child] => Array
        (
        )

    [class] =>
)

可以发现,第二个 foreach 中的输出是错误的。

来自官网的说明

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)

// without an unset($value), $value is still a reference to the last item: $arr[3]

foreach ($arr as $key => $value) {
    // $arr[3] will be updated with each value from $arr...
    echo "{$key} => {$value} ";
    print_r($arr);
}
// ...until ultimately the second-to-last value is copied onto the last value

// output:
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>

参考

#175 技术博客字体选型

2016-10-17

HTML 字体

font: 300 1em/1.8 sans;

参考

阮一峰          Georgia, serif
开源中国        微软雅黑, Verdana, sans-serif, 宋体
typo.sofi.sh    PingFang SC, Lantinghei SC, Microsoft Yahei, Hiragino Sans GB, Microsoft Sans Serif, WenQuanYi Micro Hei, sans
作业部落        PingFang SC, Hiragino Sans GB, Helvetica Neue, Microsoft Yahei, WenQuanYi Micro Hei, sans-serif
MDN             'Open Sans',Arial,sans-serif
小众软件        Lucida, Verdana, 'Hiragino Sans GB', 'WenQuanYi Micro Hei', sans-serif
码弄周刊        'Helvetica Neue', Helvetica, Arial, 'WenQuanYi Micro Hei', 'Microsoft Yahei', SimSun, sans-serif
Django Book     'Microsoft YaHei', 'Lucida Grande', Verdana;

设计

各平台常用字体

OS X      : PingFang SC, Hiragino Sans GB, Helvetica Neue, Helvetica, Heiti SC, Monaco
Linux     : Ubuntu Mono, WenQuanYi Micro Hei, Source Code Pro
Windows   : Microsoft Yahei, SimSun, Courier New, Georgia, Tahoma, Arial

设计思路

  1. 不用很多,如果没有所选的字体,就是用浏览器默认设置
  2. 优先级:Mac OS > Ubuntu > Windows