1
hexo s --debug

运行hexo s,先后调用的模块有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
hexo-generator-archive/index.js
hexo-generator-category/index.js
hexo-abbrlink/index.js
hexo-auto-category/index.js
hexo-generator-index/index.js
hexo-deployer-git/index.js
hexo-generator-tag/index.js
hexo-renderer-ejs/index.js
hexo-generator-search/index.js
hexo-server/index.js
hexo-related-popular-posts/index.js
hexo-tag-chat/index.js
hexo-renderer-kramed/index.js
hexo-renderer-stylus/index.js
hexo-tag-instagram/index.js
hexo-tag-soundcloud/index.js
hexo-tag-twitter/index.js
hexo-wordcount/index.js
themes/next/scripts/tags/button.js
themes/next/scripts/helpers.js
themes/next/scripts/merge-configs.js
themes/next/scripts/tags/center-quote.js
themes/next/scripts/tags/exturl.js
themes/next/scripts/tags/include-raw.js
themes/next/scripts/tags/full-image.js
themes/next/scripts/tags/label.js
themes/next/scripts/tags/note.js
themes/next/scripts/tags/group-pictures.js
themes/next/scripts/tags/tabs.js
themes/next/scripts/merge.js

【hexo源码系列】hexo g

首先会加载插件的index.js脚本,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$ hexo g --debug
04:48:16.759 DEBUG Hexo version: 3.7.1
04:48:16.761 DEBUG Working directory: ~/workspace/web/blog-dev/
04:48:16.846 DEBUG Config loaded: ~/workspace/web/blog-dev/_config.yml
04:48:16.864 DEBUG Plugin loaded: hexo-abbrlink # 打印日志 Generate link 767c2456 for post
04:48:16.865 DEBUG Plugin loaded: hexo-auto-category # 打印日志 Generated: categories .. for post
04:48:16.877 DEBUG Plugin loaded: hexo-deployer-git
04:48:16.879 DEBUG Plugin loaded: hexo-generator-archive # Generator: page、post、archive、category
04:48:16.880 DEBUG Plugin loaded: hexo-generator-category #
04:48:16.882 DEBUG Plugin loaded: hexo-generator-index
04:48:16.884 DEBUG Plugin loaded: hexo-generator-search
04:48:16.885 DEBUG Plugin loaded: hexo-generator-tag
04:48:16.894 DEBUG Plugin loaded: hexo-related-popular-posts
04:48:16.896 DEBUG Plugin loaded: hexo-renderer-ejs
04:48:16.905 DEBUG Plugin loaded: hexo-renderer-kramed
04:48:16.906 DEBUG Plugin loaded: hexo-renderer-stylus
04:48:16.949 DEBUG Plugin loaded: hexo-server
04:48:16.949 DEBUG Plugin loaded: hexo-tag-chat
04:48:16.950 DEBUG Plugin loaded: hexo-tag-soundcloud
04:48:16.950 DEBUG Plugin loaded: hexo-tag-instagram
04:48:16.951 DEBUG Plugin loaded: hexo-tag-twitter
04:48:16.983 DEBUG Plugin loaded: hexo-wordcount
04:48:16.990 DEBUG Script loaded: themes/next/scripts/merge-configs.js
04:48:16.991 DEBUG Script loaded: themes/next/scripts/helpers.js
04:48:16.991 DEBUG Script loaded: themes/next/scripts/tags/button.js
04:48:16.992 DEBUG Script loaded: themes/next/scripts/tags/exturl.js
04:48:16.992 DEBUG Script loaded: themes/next/scripts/tags/center-quote.js
04:48:16.992 DEBUG Script loaded: themes/next/scripts/tags/full-image.js
04:48:16.993 DEBUG Script loaded: themes/next/scripts/tags/include-raw.js
04:48:16.993 DEBUG Script loaded: themes/next/scripts/tags/label.js
04:48:16.994 DEBUG Script loaded: themes/next/scripts/tags/note.js
04:48:16.995 DEBUG Script loaded: themes/next/scripts/tags/tabs.js
04:48:16.996 DEBUG Script loaded: themes/next/scripts/tags/group-pictures.js
04:48:16.999 DEBUG Script loaded: themes/next/scripts/merge.js
04:48:17.164 DEBUG Loading database.
04:48:17.171 INFO Start processing
04:48:17.191 DEBUG Processed: 404.html
04:48:17.251 DEBUG Processed: CNAME
04:48:17.252 DEBUG Processed: README.md
04:48:17.252 DEBUG Processed: robots.txt
04:48:17.312 DEBUG Processed: _posts/README.md
04:48:17.314 DEBUG Processed: asset/flare.json
04:48:17.314 DEBUG Processed: asset/index.html
04:48:17.315 DEBUG Processed: asset/math.json
04:48:17.316 DEBUG Processed: images/avatar.png
04:48:17.318 DEBUG Processed: images/blueprint.png
04:48:17.447 DEBUG Processed: images/carbon.png
04:48:17.447 DEBUG Processed: images/error-pin.png
04:48:17.451 DEBUG Processed: images/error-hanger.png
04:48:17.553 DEBUG Processed: images/bg4.png
04:48:17.630 DEBUG Processed: _posts/-block-chain/README.md

非对称加密 - RSA

公开密钥密码学

加密需要双方共享一个私密的随机数。从未谋面的两人,如何就此共享密钥达成一致,而又不让第三方监听者知道呢?

离散对数问题

我们需要一种运算,正常容易,反向很难。于是我们找到了模运算,也称时钟运算。

比如 $46 \ \mathrm {mod} \ 12 = 10$,正向计算很容易。

下面采用质数,

对于不同的取值$e$,结果是[0,16]之间均匀分布的。

反向是很困难的

$$3^{\color{red}{29}} \mathrm {mod} \ 17 \xrightarrow[encrypt]{\color{green}{EASY}} {\color{blue}12}$$
正向加密很容易。

求以上过程的反向,这就很难了。
这被称为离散对数问题(discrete logarithm problem)

$$3^{\color{red}?} \mathrm {mod} \ 17 \xleftarrow[decrypt]{\color{red}{HARD}} {\color{blue}{12}}$$
反向解密却很难。已知12,我们只能采用试错法求出匹配的指数。

反向有多难
如果模数很小,比较容易。模数若是长达百位的质数,即便借助地球上最强大的计算机,要遍历所有可能情况也需要上千年时间。

单向函数的强度取决于反向过程所需要的时间。

  • 反向的难度,具体计算一下

迪菲·赫尔曼密钥交换

Alice如何向Bob发送信息,而不怕Eve截获信息呢?

首先Alice和Bob公开地就质模数(prime modulus)和生成元(generator)达成一致,也就是这个例子中的p=17,g=3。

然后Alice选择一个私有数,${\color{red}{15}}$,加密后是${\color{blue} 6}$
$$3^{\color{red}{15}} \mathrm {mod} \ 17 \equiv {\color{blue} 6}$$
然后公开将此结果发送给Bob。

Bob选择一个私有数13,计算
$$3^{\color{red}{13}} \mathrm {mod} \ 17 \equiv {\color{blue} {12}}$$
然后公开将此结果发送给Alice。

下面就是关键

Alice经过以下计算,得到共享密钥 (shared secret) ${\color{Apricot}{10} }$

$${\color{blue}{12} }^{\color{red}{15} } \mathrm {mod} \ 17 \equiv {\color{Apricot}{10} }$$

Bob也计算得到共享密钥,两者计算结果是相同的。

这是因为
$$3^{\color{red}{13 ^{15}} } \mathrm {mod} \ 17 \equiv 3^{\color{red}{15 ^{13}} } \mathrm {mod} \ 17 $$

两种计算实质是相同的,只是指数的顺序不同而已。
没有私有数字 ${\color{red}{15}}$、${\color{red}{13}}$,Eve将无法求出结果。Eve会被困在离散对数问题之中,数字足够大时,实践中,她在合理时限内几乎不可能破解。这就解决了交换密钥的问题。这可以同伪随机数生成器结合使用为未曾谋面的人提供通信加密。

Eve将无法求出结果,没太看懂。

  • 这两个私有数字,只要有一个就能解密吗?
  • 17,3 是怎么达成一致的?传输过程被截获呢?是public的吗?

RSA加密第一步

对称加密中,要求通信双方共享密钥。但如果Alice和Bob不能实际见面,则需要额外的通信开销,比如使用迪菲-赫尔曼密钥交换。

另外,如果Alice希望同很多人通信,那么她将需要同每个人交换不同密钥。她必须管理好所有这些密钥,发送数以千计的信息,仅仅为了建立它们。

是否有更简单的额方式?

1970年,英国数学家James Ellis试图实现公开密钥加密(non-secret encryption)。

加密和解密是互逆操作,Alice可以买一把锁,把钥匙留在手里,然后把打开的锁发给Bob。Bob可以将自己的信息上锁,然后发回给Alice。这里无需交换密钥。

这意味着锁是可以公开的,可以让世界上任何人使用它来发信息。而现在Alice只需要留一把钥匙。

Ellis并未找到相关的数学方法,但他提出了应该怎样做的思路。关键在于将密钥分为两个部分,一部分是加密密钥,一部分是解密密钥。解密密钥用于解密这一逆操作,而加密是通过加密密钥进行的。

RSA加密第二步

需要构建一种特殊的单向函数,也叫陷门单向函数(trap door one-way functioin)

这种函数,正向很容易,反向很难,除非你有关于trap door的特殊信息。为此,考虑了模幂运算。

扩展阅读

【深度学习-RNN系列】SRU

背景

RNN、LSTM、GRU都存在一个严重的问题,在 GPU 上实现时,效率不高,主要是由于前后两个时刻 t-1 和 t 的计算存在依赖性。

the sequential dependencies that are central to recurrent architectures limit parallelization potential

SRU

SRU(Simple Recurrent Unit)则提出更激进的架构,去掉了前后时刻计算的依赖。

  • input gate和forget gate的合并 (借鉴自GRU)
  • c和h的合并,(并未采用)

对比其他模型

在 GRU 中,大幅简化了 LSTM 结构

SRU进一步

实现细节(trick)

SRU实现:增加highway连接和变分dropout

首先,他们在循环层之间增加了highway连接,因为此前的研究已经证明,像highway连接这样的skip connections,在训练深度网络时非常有效;
其次,在将RNN正则化时,他们在标准的dropout外,增加了变分dropout,变分dropout在时间步长t与dropout使用相同的mask。

CUDA级的优化

源码

https://github.com/taolei87/sru/blob/master/sru/sru_functional.py#L128

好复杂,看着头疼

扩展阅读

  • Training RNNs as Fast as CNNs, pdf
  • spaceX,绕月飞行,一个舱容纳7人。被日本亿万富翁买下了整个舱,
    • 猎鹰9号火箭
    • 大型猎鹰火箭