Github Pages示例网站

pytorch.org

http://pytorch.org 搭建在github pages上。对应 pytorch.github.io

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig pytorch.org

; <<>> DiG 9.10.6 <<>> pytorch.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32725
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;pytorch.org. IN A

;; ANSWER SECTION:
pytorch.org. 3323 IN A 185.199.108.153

;; Query time: 82 msec
;; SERVER: 192.168.16.101#53(192.168.16.101)
;; WHEN: Tue Oct 23 13:34:25 CST 2018
;; MSG SIZE rcvd: 56

http://pytorch.org/tutorials 站点对应 https://github.com/pytorch/tutorials

https://discuss.pytorch.org/ 则需要必须要借助后台服务器,因此是独立的主机名

国内测速,,都超时。
百度收录2个网页

http://tool.chinaz.com/dns/ dns测速,都不通 测速有毛病吧,我手机都能连上

hexo.io

hexo.io 采用的美国 CloudFlare公司CDN节点,外加CloudFlare的SSL证书

Issued by: Let’s Encrypt Authority X3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig hexo.io

; <<>> DiG 9.10.6 <<>> hexo.io
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12407
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;hexo.io. IN A

;; ANSWER SECTION:
hexo.io. 16 IN A 206.189.89.118

;; Query time: 108 msec
;; SERVER: 192.168.16.101#53(192.168.16.101)
;; WHEN: Tue Oct 23 13:36:21 CST 2018
;; MSG SIZE rcvd: 52

百度仅收录了 https://hexo.io/zh-cn/ 目录。如何做到的

scikit-image.org

信息

采用的rst (ReStructuredText)格式

疑问

  • 采用jekyll模板吗?
  • DNS解析为什么没有CNAME记录?

DNS分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ dig scikit-image.org

; <<>> DiG 9.10.6 <<>> scikit-image.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44723
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;scikit-image.org. IN A

;; ANSWER SECTION:
scikit-image.org. 1678 IN A 185.199.108.153
scikit-image.org. 1678 IN A 185.199.109.153
scikit-image.org. 1678 IN A 185.199.110.153
scikit-image.org. 1678 IN A 185.199.111.153

;; Query time: 50 msec
;; SERVER: 192.168.16.101#53(192.168.16.101)
;; WHEN: Tue Oct 23 13:26:48 CST 2018
;; MSG SIZE rcvd: 109

scrapy.org

采用jekyll模板

网站源码: https://github.com/scrapy/scrapy.org

为静态网站提供动态服务之 统计模块

汇总 对比

site_uv 是指访问的用户个数,一个IP记一次,多次访问不累加
site_pv 是网站访问次数,多次访问累加
page_pv 是文章点击次数,多次访问累加

google统计 百度统计 Leancloud.cn 不蒜子
特点 功能繁杂 轻量级,无需注册,两行代码
要注册
功能 pv uv

速度 对比

不蒜子的js放在七牛,速度应该不慢,如果说速度慢,可能是七牛的原因,

初始化首次数据

初始化首次数据无非就两种方式

  1. 修改服务器的数据库数据 (多数不提供该服务,因为随意篡改数据就失去了数据权威性)
  2. 仅更改本网站的显示 (so easy,也可以理解成自己欺骗自己)

首先看方式二:以不蒜子为例

在html中引入以下js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 修正不蒜子计数初始值 -->
<script >
$(document).ready(function() {
var int = setInterval(fixCount, 50); // 50ms周期检测函数
var countOffset = 20000; // 初始化首次数据
function fixCount() {
if ($("#busuanzi_container_site_pv").css("display") != "none")
{
$("#busuanzi_value_site_pv").html(parseInt($("#busuanzi_value_site_pv").html()) + countOffset); // 加上初始数据
clearInterval(int); // 停止检测
}
}
});
</script>

这里的方法是改给自己看,并未改动busuanzi的数据库。

方式一,看各家提供的接口咯

不蒜子的方式

“不蒜子”与百度统计谷歌分析等有区别:“不蒜子”可直接将访问次数显示在您在网页上(也可不显示);对于已经上线一段时间的网站,“不蒜子”允许您初始化首次数据。
请先注册登录,自行修改阅读次数。
— 来自不蒜子官网

然而,至今不蒜子尚未提供注册服务(2018年3月),也就是不蒜子暂时也不提供 修改统计数据的接口

实际上并未改初始化首次数据的方式。因为

单独介绍

不蒜子

“不蒜子”是通过页面url(或者主机名神马的)来标识一个计数值,而像localhost、index.html这样的名字早已经被像我们一样的广大程序猿在测试时用烂了,自然就累计了好多次

javascript的正则表达式

简介

匹配到的字符串

字符 替换文本
$& 与正则相匹配的字符串
$` 匹配字符串左边的字符
$’ 匹配字符串右边的字符
$1,$2,$3,…,$n 匹配结果中对应的分组匹配结果

回调函数

匹配的正则表达式

字符 含义
\ 匹配将依照下列规则:在非特殊字符之前的反斜杠表示下一个字符是特殊的,不能从字面上解释。例如,没有前面’\’的’b’通常匹配小写’b’,无论它们出现在哪里。如果加了’\’,这个字符变成了一个特殊意义的字符,意思是匹配一个字符边界。反斜杠也可以将其后的特殊字符,转义为字面量。例如,模式 /a/ 代表会匹配 0 个或者多个 a。相反,模式 /a\/ 将 ‘‘ 的特殊性移除,从而可以匹配像 “a“ 这样的字符串。使用 new RegExp(“pattern”) 的时候不要忘记将 \ 进行转义,因为 \ 在字符串里面也是一个转义字符。
^ 匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。例如,/^A/ 并不会匹配 “an A” 中的 ‘A’,但是会匹配 “An E” 中的 ‘A’。当 ‘^’ 作为第一个字符出现在一个字符集合模式时,它将会有不同的含义。补充字符集合 一节有详细介绍和示例。
$ 匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置。例如,/t$/ 并不会匹配 “eater” 中的 ‘t’,但是会匹配 “eat” 中的 ‘t’。
* 匹配前一个表达式0次或多次。等价于 {0,}。例如,/bo*/会匹配 “A ghost boooooed” 中的 ‘booooo’ 和 “A bird warbled” 中的 ‘b’,但是在 “A goat grunted” 中将不会匹配任何东西。
+ 匹配前面一个表达式1次或者多次。等价于 {1,}。例如,/a+/匹配了在 “candy” 中的 ‘a’,和在 “caaaaaaandy” 中所有的 ‘a’。
? 匹配前面一个表达式0次或者1次。等价于 {0,1}。例如,/e?le?/ 匹配 “angel” 中的 ‘el’,和 “angle” 中的 ‘le’ 以及”oslo’ 中的’l’。如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。例如,对 “123abc” 应用 /\d+/ 将会返回 “123”,如果使用 /\d+?/,那么就只会匹配到 “1”。还可以运用于先行断言,如本表的 x(?=y) 和 x(?!y) 条目中所述。
. (小数点)匹配除换行符之外的任何单个字符。例如,/.n/将会匹配 “nay, an apple is on the tree” 中的 ‘an’ 和 ‘on’,但是不会匹配 ‘nay’。
(x) 匹配 ‘x’ 并且记住匹配项,就像下面的例子展示的那样。括号被称为 捕获括号。模式/(foo) (bar) \1 \2/中的 ‘(foo)’ 和 ‘(bar)’ 匹配并记住字符串 “foo bar foo bar” 中前两个单词。模式中的 \1 和 \2 匹配字符串的后两个单词。注意 \1、\2、\n 是用在正则表达式的匹配环节。在正则表达式的替换环节,则要使用像 $1、$2、$n 这样的语法,例如,’bar foo’.replace( /(…) (…)/, ‘$2 $1’ )。
(?:x) 匹配 ‘x’ 但是不记住匹配项。这种叫作非捕获括号,使得你能够定义为与正则表达式运算符一起使用的子表达式。来看示例表达式 /(?:foo){1,2}/。如果表达式是 /foo{1,2}/,{1,2}将只对 ‘foo’ 的最后一个字符 ’o‘ 生效。如果使用非捕获括号,则{1,2}会匹配整个 ‘foo’ 单词。
x(?=y) 匹配’x’仅仅当’x’后面跟着’y’.这种叫做正向肯定查找。例如,/Jack(?=Sprat)/会匹配到’Jack’仅仅当它后面跟着’Sprat’。/Jack(?=Sprat\ Frost)/匹配‘Jack’仅仅当它后面跟着’Sprat’或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。
x(?!y) 匹配’x’仅仅当’x’后面不跟着’y’,这个叫做正向否定查找。例如,/\d+(?!.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/\d+(?!.)/.exec(“3.141”)匹配‘141’但是不是‘3.141’
x y \ 匹配‘x’或者‘y’。例如,/green\ red/匹配“green apple”中的‘green’和“red apple”中的‘red’
{n} n是一个正整数,匹配了前面一个字符刚好发生了n次。比如,/a{2}/不会匹配“candy”中的’a’,但是会匹配“caandy”中所有的a,以及“caaandy”中的前两个’a’。
{n,m} n 和 m 都是整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。例如,/a{1, 3}/ 并不匹配“cndy”中的任意字符,匹配“candy”中得a,匹配“caandy”中的前两个a,也匹配“caaaaaaandy”中的前三个a。注意,当匹配”caaaaaaandy“时,匹配的值是“aaa”,即使原始的字符串中有更多的a。
[xyz] 一个字符集合。匹配方括号的中任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转义,不过转义也是起作用的。例如,[abcd] 和[a-d]是一样的。他们都匹配”brisket”中得‘b’,也都匹配“city”中的‘c’。/[a-z.]+/ 和/[\w.]+/都匹配“test.i.ng”中得所有字符。
[^xyz] 一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符。你可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的。例如,[^abc] 和 [^a-c] 是一样的。他们匹配”brisket”中得‘r’,也匹配“chop”中的‘h’。
[\b] 匹配一个退格(U+0008)。(不要和\b混淆了。)
\b 匹配一个词的边界。一个词的边界就是一个词不被另外一个词跟随的位置或者不是另一个词汇字符前边的位置。注意,一个匹配的词的边界并不包含在匹配的内容中。换句话说,一个匹配的词的边界的内容的长度是0。(不要和[\b]混淆了)例子:/\bm/匹配“moon”中得‘m’;/oo\b/并不匹配”moon”中得’oo’,因为’oo’被一个词汇字符’n’紧跟着。/oon\b/匹配”moon”中得’oon’,因为’oon’是这个字符串的结束部分。这样他没有被一个词汇字符紧跟着。/\w\b\w/将不能匹配任何字符串,因为一个单词中的字符永远也不可能被一个非词汇字符和一个词汇字符同时紧跟着。注意: JavaScript的正则表达式引擎将特定的字符集定义为“字”字符。不在该集合中的任何字符都被认为是一个断词。这组字符相当有限:它只包括大写和小写的罗马字母,小数位数和下划线字符。不幸的是,重要的字符,例如“é”或“ü”,被视为断词。
\B 匹配一个非单词边界。他匹配一个前后字符都是相同类型的位置:都是单词或者都不是单词。一个字符串的开始和结尾都被认为是非单词。例如,/\B../匹配”noonday”中得’oo’, 而/y\B./匹配”possibly yesterday”中得’ye‘
\cX 当X是处于A到Z之间的字符的时候,匹配字符串中的一个控制符。例如,/\cM/ 匹配字符串中的 control-M (U+000D)。
\d 匹配一个数字。等价于[0-9]。例如, /\d/ 或者 /[0-9]/ 匹配”B2 is the suite number.”中的’2’。
\D 匹配一个非数字字符。等价于[^0-9]。例如, /\D/ 或者 /[^0-9]/ 匹配”B2 is the suite number.”中的’B’ 。
\f 匹配一个换页符 (U+000C)。
\n 匹配一个换行符 (U+000A)。
\r 匹配一个回车符 (U+000D)。
\s 匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如, /\s\w*/ 匹配”foo bar.”中的’ bar’。
\S 匹配一个非空白字符。等价于[^ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如, /\S\w*/ 匹配”foo bar.”中的’foo’。
\t 匹配一个水平制表符 (U+0009)。
\v 匹配一个垂直制表符 (U+000B)。
\w 匹配一个单字字符(字母、数字或者下划线)。等价于[A-Za-z0-9_]。例如, /\w/ 匹配 “apple,” 中的 ‘a’,”$5.28,”中的 ‘5’ 和 “3D.” 中的 ‘3’。
\W 匹配一个非单字字符。等价于[^A-Za-z0-9_]。例如, /\W/ 或者 /[^A-Za-z0-9_]/ 匹配 “50%.” 中的 ‘%’。
\n 当 n 是一个正整数,一个返回引用到最后一个与有n插入的正则表达式(counting left parentheses)匹配的副字符串。比如 /apple(,)\sorange\1/ 匹配”apple, orange, cherry, peach.”中的’apple, orange,’ 。
\0 匹配 NULL (U+0000) 字符, 不要在这后面跟其它小数,因为 \0 是一个八进制转义序列。
\xhh 与代码 hh 匹配字符(两个十六进制数字)
\uhhhh 与代码 hhhh 匹配字符(四个十六进制数字)。

参考

开源密码管理工具对比

KeepPass KeepPassX LessPass clipperz Encryptr 备注
简介 keepass的山寨版,很弱
github-fork 代码由sourceforget-svn托管。老顽固拒绝github 535 106 121 121 submoduel的contributor是否算在主仓库中?
github-star 3613 2618 569 1480
github-contributor 29 10 9 7
github近期更新 ☆☆ ☆☆☆ ☆☆ ☆☆
主仓库 主仓库即所有代码,C++ Qt客户端 shell
backend python-django
frontend vuejs + html
cli nodejs
desktop node + js 编译成windos、linux、max客户端
webextension
移动客户端 由第三方提供,并非开源。种类繁多,良莠不齐
同步 借助dropbox等第三方
主推功能 synchronize,多设备同步
模块化/组件化 也有很多plugin 基于nodejs,模块化很好
优点 比keepassx好用 1. C++看着吃力,python看着爽,nodejs也比较火 2. 多设备同步很重要3. 模块化很赞

老顽固拒绝github
https://sourceforge.net/p/keepass/discussion/329221/thread/97110c29/

其他

LastPass(最大的优势是跨浏览器平台

【读图识政治】图解中国官员级别--2013

图来自政见网
貌似被墙了

2005年4月27日通过的《公务员法》第十六条规定:

  • 公务员职务分为领导职务非领导职务
  • 领导职务层次分为:国家级正职、国家级副职、省部级正职、省部级副职、厅局级正职、厅局级副职、县处级正职、县处级副职、乡科级正职、乡科级副职。

国家副主席是国家级正职吧?

No

2013年,中共十二届全国人大第一次会议上,李源潮顺利“当选”国家副主席,这使得李源潮成为中国政府约20年来首位非政治局常委的国家副主席,前一“非常”副主席是王震。令人们十分好奇的内容之一是,他在随后的5年时间里,更准确地说是他在2017年秋季召开中共十九大之前的这段时间里,到底会享受和7名政治局常委一样的“正国级”待遇,还是继续享受十八届中央领导集体内和他党内身份相同的其他政治局委员们共同享受的“副国级”待遇。

中共此前有明文规定,以下职位:中共中央总书记、中央政治局常委、国家主席、国务院总理、全国人大常委会委员长、全国政协主席、中央军委主席、国家副主席为正国家级别。因此,有观点认为,延续原来的惯例,现在在职的正国家领导有八位,7大常委 和国家副主席李源潮。

但也有观点认为,中国的国家主席一般是中央总书记,行政级别是是国家级,在这届李源潮之前近20年间,国家副主席均是政治局常委,属于党和国家领导人,其行政级别是国家级,但从今年开始,国家副主席不是政治局常委,而是政治局委员,因此,他的行政级别是副国级。

参考

参考

“高级检察院” “中级检察院” 笑尿了

利用travis自动构建Gitbook静态页面,并自动部署到Github Page

目的

实现 Gitbook - Github仓库 - Github Pages 三方同步。

  • 修改Gitbook,实现 Github自动同步 + 自动部署静态页面到Github Pages
  • 修改Github仓库,实现Gitbook自动同步 + 自动部署静态页面到Github Pages

Gitbook自身已经实现了与Github仓库的同步,现在的问题是,如何实现自动部署静态页面到Github Pages。

当然有很多实现方式,这里我们介绍利用Travis CI自动部署Github Pages。

Travis CI

Travis CI原理就是当你每次提交commit到在github后,它会自动检测你的提交,同时根据的配置文件,生成一个Linux虚拟机来运行你的命令,通常这些命令用于测试,构建等。在我们的要求下,就可以用它运行一些hexo g d之类的命令来自动生成、部署我静态网页。

  1. 博客提交修改后push到github
  2. github通知travis ci项目需要构建
    • 这里需要配置:
  3. travis ci立马安排构建
    • 这里需要.travis.yml
  4. 构建完成后将结果push到github的gh-pages分支
  5. vps利用git钩子将结果部署到web容器
1
2
3
4
5
6
$ npm install travis-encrypt -g
$ travis-encrypt -r username/repository GH_TOKEN=[the token you created before] -a
$ travis-encrypt -r ESbook/TCP-IP GH_TOKEN=6ad73f4597162bf335caaeef3e1138b77645dd5c -a
# GH_TOKEN
XpJ36JE64TJCwGQ5ZxxWosn64Rhwq3OGOqNJhjKUyeGPlj9B+fNPAqBmP+YTLxB5nRpoLv5UsK62Qw15Of02iZcoO50H8qBrb2cWNEW3z2+Ih12JoeN5qJi4MTShT6ePbwH7Tvid27wosswuYH2+O4hvSQR13WwsHqCPDmzno6Zni+Unt8tya0etSkRqS81hKbHTItL0fOQiDpVIK2GrUioqPAbDV2TNBZfas8EENmSfZMRjHV6BYaOY/ZQg8qx3UuPSnGLU6pmiv9pcaiths4LNBoHb71+Rm87E+FffI6sHtmqrKn9NoW5sEsiiIAUusYQE5woQsn46+uc8lgjlx+1DGBxPstQwvTQNcu8HWzoN0lxlnIYMTWTj/aoUBmc90/Do1GPlpSP9/vONrU2ljfyfKlxxwbUdvHg8pvfU09QsWtTRAqfSjrH305nHOCPKWQgeYv0zbgTqRq/zKh5xTS+iaU6R+VscxFTCnktQaCG1oB6VMSBsU6YjvG5KcY7UZHiyF/fPTRFIH/LtT6iX9DpGlvc3NBb/mA4ERcEvMp/1Bgs7rqHVML+luhwKBwqeivilz0VRajK5JQxBmMeuJ4cDVt/yJuwGjf72chKa8Y909/iwAKm5wJ/FAEKvv7wl1aZJyOFdWEW6n/6u63+6VQy1YF/6aSodbkQcvO/o8qw=
$ git remote add origin 'https://f6884617cab7ada45740e5034604e3e82e4ac722@github.com/ESbook/TCP-IP.git'

疑问

为什么要采用personal access token?为什么不采用ssh验证?

HTTPS URLs和SSH URLs对应的是两套完全独立的权限校验方式,主要的区别就是HTTPS URLs采用账号密码进行校验,SSH URLs采用SSH秘钥对进行校验。

采用personal access token的方式来访问gitub,目的是代替密码输入。

如果要采用ssh,需要把travis主机的ssh key加入到github中。这样确实能够方便部署,免密码验证,但是存在风险。因为travis主机是很多人共用的,同一个主机加很多github的ssh会存在多账户权限风险。(我猜的)。即使每个github账号对应一个虚机或者docker,不方便多主机CDN。

为什么要travis encrypt?

因为公开personal access token,就基本等同于公开github密码。任何人可以通过用户名+token获得github的相应权限,github中的项目有被恶意篡改,删除的风险。

travis encrypt对token进行加密,该密文仅travis能够识别。

##

Gitbook自动化部署到Github Pages的方案汇总

采用shell命令

封装成node module

借鉴 hexo deploy命令

采用web hook

这是 Github 提供的一种机制,使应用能与 Github 通讯。这种机制实际上就是 Pub/Sub,当 Github 监测到资源(如仓库)有变化就往预先设定的 URL 发送一个 POST 请求(Pub),告知变化情况,而后接收变化的服务器(Sub)即可做一些额外的事情。

这个思路需要有一个服务器并启动一个服务来接收 Github 的请求。这里又有种不同的策略,这两种策略都是基于源码放置在 Github 的前提。第一个是源码将最终文档直接部署在这台服务器上(如使用 Nginx),当接收到 Github 通知直接编译更新到服务器指定的文件夹下即可。另一种策略是当服务器接收到通知后编译更新,而后将编译后的版本提交到 Github 仓库的 gh-pages 分支,让 Github 做 Host。

采用git hook

貌似必须要自己搭建git server。

CI工具

持续集成(英语:Continuous integration,缩写CI)是一种软件工程流程,是将所有软件工程师对于软件的工作副本持续集成到共用主线(mainline)的一种举措。
持续集成的提出主要是为解决软件进行系统集成时面临的各项问题,极限编程称这些问题为集成地狱(integration hell)。

常用工具 travis-ci Jenkins

Jenkins是一个持续集成工具,相当于一个构建调度平台,围绕着scm,ssh, ant,maven插件,进行构建操作。
理论上来讲,有合适的插件,大部分自动化行为都可以在jenkins平台上展开。
使用Jenkins 来触发和调度,在Jenkins构建执行shell脚本来进行分发和安装,测试,可以部署成流水线的方式,依次运行

已实现

OCR引擎-Tesseract-OCR简介

Tesseract简介&历史

Tesseract(/‘tesərækt/) 意思是四维超正方体(英语:tesseract)或正八胞体。下图来自维基百科,是一个正八胞体绕着两个四维空间中互相正交的平面进行双旋转时的透视投影。

Tesseract was originally developed at Hewlett-Packard Laboratories Bristol and at Hewlett-Packard Co, Greeley Colorado between 1985 and 1994, with some more changes made in 1996 to port to Windows, and some C++izing in 1998. In 2005 Tesseract was open sourced by HP. Since 2006 it is developed by Google.
来自 github官方

Tesseract-OCR是一个开源的OCR引擎,具有悠久的历史。
惠普公司的布里斯托尔实验室在1985-1994年开发完成。起初作为惠普的平板扫描仪的文字识别引擎。Tesseract在1995年UNLV OCR字符识别准确性测试中拔得头筹,受到广泛关注。后来HP放弃了OCR市场。在1994年以后,Tesseract的开发就停止了。

在2005年,HP将Tesseract贡献给开源社区。美国内华达州信息技术研究所获得该源码,同时,Google开始对Tesseract进行功能扩展及优化。目前,Tesseract作为开源项目发布在Google Project上,重获新生。Tesseract的最新版本是3.02,它支持60种以上的语言,提供一个引擎和一个命令行工具。

安装

sudo apt-get install tesseract-ocr

sudo apt-get install tesseract-ocr-eng tesseract-ocr-chi-sim

Tesseract:安装与命令行使用

使用

1
2
# 查看可用的 "语言"
$ tesseract --list-langs

Tesseract识别图片

1
2
# from a TIFF image with Tesseract OCR
$ tesseract test.png test

Tesseract识别tiff

1
2
3
4
5
# 识别tiff文档,默认是英语
$ tesseract test.tiff test

# 识别非英语文档
tesseract test.tiff -l [lan] test.txt

Tesseract识别pdf

步骤:

1
2
3
# 1. 转换pdf到tiff(或其他格式)

# 2.

1
2
3
4
5
$ tesseract test.pdf test
Tesseract Open Source OCR Engine v3.02 with Leptonica
Error in pixReadStream: Unknown format: no pix returned
Error in pixRead: pix not read
Unsupported image type.

tesseract不能直接识别pdf,一般需要借助工具转化成tiff,然后再识别。

1
2
3
4
5
6
7
8
$ convert test.pdf test.tiff
$ tesseract test.tiff test
Tesseract Open Source OCR Engine v3.02 with Leptonica
Error in pixReadFromTiffStream: can't handle bpp > 32
Error in pixReadStreamTiff: pix not read
Error in pixReadStream: tiff: no pix returned
Error in pixRead: pix not read
Unsupported image type.

tesseract不能够读取bpp > 32的tiff文件。因此我们转为8bit的tiff文件。

1
2
$ convert test.pdf -depth 8 test.tiff
$ tesseract test.tiff output

现在能够正常识别了。

训练

参考 https://www.jianshu.com/p/31afd7fc5813

准备训练集

评价

  • 图像预处理
    Tesseract目的不是作为OCR软件,而仅仅是OCR engine。Tesseract在图像预处理方面很弱,如果想得到比较好的识别效果,需要使用者自己做图片预处理。然而一般多数OCR软件都会集成图片预处理模块,比如Nuance。

估计怕做的太好,让商业软件

#

单播,组播(多播),广播以及任播

路由形式

  • 单播(原文:unicast)是指数据包在计算机网络的传输中,目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议。
  • 任播(英语:anycast)是一种网络定址和路由的策略,使得资料可以根据路由拓扑来决定送到“最近”或“最好”的目的地。

路由形式
Cast.svg

任播
Anycast.svg

广播
Broadcast.svg

多播
Multicast.svg

单播
Unicast.svg

geocast
Geocast.svg

bgp anycast就是
利用一个(多个) as号码在不同的地区广播相同的一个ip段。
利用bgp的寻路原则,短的as path 会选成最优路径(bgp寻路原则之n),从而优化了访问速度。
其实bgp anycast是不同服务器用了相同的ip地址。

阿里的DNS 就是使用了BGP AnyCast
“其实bgp anycast是不同服务器用了相同的ip地址。”

BGP Anycast 和 IP Anycast 有区别吗?

BGP Anycast相较于IP Anycast多了BGP AS,也就是说宣告的这段IP拥有独立的AS号,属于独立的自治域。

不同服务器用相同地址,不会冲突吗?

参考

http://colobu.com/2014/10/21/udp-and-unicast-multicast-broadcast-anycast/

问题

广播,是面向什么范围的广播?局域网?世界所有计算机?

ARP广播,比特币中的广播,

如何托管你的网站 - 托管服务器

Host - 网站托管

web hosting (service)可以被翻译为:网站托管。这里的host,类似于“主持、主办、提供”的含义。

大体分Iaas和PaaS两种

  • IaaS:云主机(或虚拟机) - 权限大,费用贵
    • 阿里云主机、Google云主机(GCE)、腾讯云主机等
  • PaaS:云平台(运行软件的平台) - 权限小,便宜或免费
    • 动态网站托管平台:SAE、GAE等
    • 静态网站托管平台:github pages服务、coding pages服务

注意区分
github的仓库(repo)是版本控制软件,是github提供的SaaS服务。
github的Pages服务用于网站托管,是github提供的PaaS服务。

鉴于免费,很多人采用Pages服务来托管自己的网站(个人博客等)。

关于静态网站 动态网站

纯静态网站

静态网站 + 自己搭建后台应用

例如 wordpress的方式。

需要自己租用服务器,自己搭建应用

免费静态网站 + 免费动态服务平台

福利: 全免费

静态网站建站现在有很多快速的技术和平台。静态网站简单,但是存在很多局限性。

很多网站提供了常用的动态服务,比如评论、流量统计、实时聊天。我们只需要调用其接口,而不用自己租服务器搭建后台应用。

常用的免费动态服务有:

  • 评论: 多说、畅言、disqus、gitment 等,
  • 流量统计: 百度统计、google统计、不蒜子
  • 实时聊天:

云主机 - 贵

GAE - 限额免费

Google App Engine是Google提供的基于Google数据中心的开发、托管网络应用程序的平台,每个 Google App Engine 应用程序都可使用1GB存储空间和每天1G的流量,GAE对于使用资源有各种限制,跑动态网站往往会配置不够用,但如果网站使用纯粹的静态HTML建立,那么这种网站还是可以支持较大的访问量。

GAE网站的免费额度限制主要是:文件总容量小于1G,文件数量少于1万个,每天流量小于1G,由于静态网站对于CPU消耗很少,因此CPU的运算限制可以忽略,通常来说,这样的配额对于普通中小型网站已经足够了。

Pages服务 - 免费 - 适合纯静态网站 - 简单

图片服务器

图片服务器的优势

总得来说,部署图片服务器有以下几点好处:

  • 分担 Web 服务器的 I/O 负载 - 将耗费资源的图片服务分离出来,提高服务器的性能和稳定性
  • 能够专门对图片服务器进行优化 - 为图片服务设置有针对性的缓存方案,减少带宽成本,提高访问速度
  • 提高网站的可扩展性 - 通过增加图片服务器,提高图片吞吐能力

案例

案例:又拍云存储
又拍云是通用的大规模存储服务,主要为用户提供静态文件存储以及 CDN 加速的服务。

又拍云在静态文件存储方面有多年的技术经验,一直专注于静态文件存储处理领域。

又拍云存储在全国各地有 26 个 CDN 节点 , 300 多台服务器以及电信、联通、移动和教育网四线带宽,能够让用户以极低的价格获得可靠、安全和快速的基础存储服务。