0%

刚刚写了个爬虫,抓取了infoq上的电子书:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
minibooks/
|-- AI前线特刊:AI领域2017进展总结/
| |-- AI前线特刊:AI领域2017进展总结.pdf
| |-- cover.jpg
| |-- metadata.json
| |-- metadata.opf
|-- AI商业化下的技术演进/
| |-- AI商业化下的技术演进.pdf
| |-- cover.jpg
| |-- metadata.json
| |-- metadata.opf
|-- CNUTCon特刊:智能时代运维最佳实践/
| |-- CNUTCon特刊:智能时代运维最佳实践.pdf
| |-- cover.jpg
| |-- metadata.json
| |-- metadata.opf
|-- Cloud 2.0时代,华为云的技术探秘与实践/
| |-- Cloud 2.0时代,华为云的技术探秘与实践.pdf
| |-- cover.jpg
| |-- metadata.json
| |-- metadata.opf
Read more »

Greenplum数据库,一个用于分析、机器学习和人工智能的开源大规模并行数据平台。

  • 一次打包到处运行的平台:不管是裸机、私有云还是公有云。不受限于硬件环境和平台,用户可以灵活的选择最适合自己的方案,迁移代价低。 硬件环境的普适性,提供了极大的灵活性,解放了硬件平台的制约和绑定,为客户解决了后顾之忧。 使用 Greenplum 可以在其间无缝迁移,开发、运维人员不需要学习新的数据库处理技术。
  • 处理和分析各种数据源的数据的平台:支持各种数据源,包括 Hadoop、HIVE、HBase、S3、Gemfire、各种数据库和文件等,不需要移动数据, 避免了数据加载的复杂性,和其带来的数据不一致的问题。
  • 支持各种数据格式的平台:不管是结构化、半结构化(XML、JSON、KV)还是非结构化,譬如文本数据、GIS数据、图数据等。
  • 具有强大内核的平台:Greenplum 具有强大的内核技术,包括数据水平分布、并行查询执行、专业优化器、线性扩展能力、多态存储、资源管理、高可用、高速数据加载等。
  • 具备强大灵活性和可扩展性的平台: 支持扩展(Extension)、自定义类型和函数、PXF和外部表技术。 可以使用多种语言实现用户自定义函数和聚集,包括 PL/Python、PL/R、PL/Java、PL/Perl、PL/PGSQL 和 C 等。
  • 支持标准的平台:支持SQL、JDBC和ODBC等行业标准。经过半个多世纪的发展,SQL 成为了数据平台的万向头, 向上可以连接各种 BI工具、可视化工具和数据分析工具,向下可以连接各种ETL工具、各种数据源和各种格式的数据等。
  • 集成数据分析平台:支持商业智能(BI)、文本、GIS、图、图像、流式数据处理等。 通过Pivotal开源的 Apache 顶级项目 MADlib,Greenplum 可以在数据内部运行 50 多种数据分析和机器学习算法。 MADlib 提供 SQL 接口进行数据分析,大大降低了数据分析的门槛;MADlib 内建于数据库内,使用 MPP 的优势,提高了分析的效率; MADlib可以在全量数据而不是抽样数据上进行分析,提高了精度。
  • 开放源代码且持续大力投入的平台: 2017年 Pivotal 在 github 的开源贡献列表中全球排名第四左右。采用开源方案,不担心后门问题和被锁定问题。开源还可以构建更好的生态。
  • 采用敏捷软件开发方法开发的平台:Greenplum 采用敏捷方法开发,实现了快速迭代、持续发布和质量内建。 2017年 Greenplum 发布了10个版本,以前发布一个版本需要1个月左右,现在只需要十几个小时。
  • 具备企业级稳定性的平台:Greenplum 经过十多年发展,有大量活跃客户,大量数百节点集群为全球2000强企业生产系统提供服务,稳定性非常高。
  • 具备成熟生态系统的平台:Greenplum 生态非常完善,有大量的合作伙伴。
Read more »

xmllint是一个命令行xml工具。

格式化

使用--format参数格式化文件。

假设有文件books.xml

1
2
<?xml version="1.0" encoding="UTF-8"?>
<books><book id="1"><book-name>习惯的力量</book-name><authors><author>查尔斯·都希格</author></authors></book><book id="2"><book-name>从0到1</book-name><authors><author>彼得·蒂尔</author><author>布莱克·马斯特斯</author></authors></book></books>

执行命令xmllint --format books.xml,得到如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1">
<book-name>习惯的力量</book-name>
<authors>
<author>查尔斯·都希格</author>
</authors>
</book>
<book id="2">
<book-name>从0到1</book-name>
<authors>
<author>彼得·蒂尔</author>
<author>布莱克·马斯特斯</author>
</authors>
</book>
</books>
Read more »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

git-stats(){
local since=1970-01-01
local until=3000-01-01
if [[ -n "$1" ]]; then
since=$1
fi
if [[ -n "$2" ]]; then
until=$2
fi

git log --format='%aN' --since=${since} --until=${until} | sort -u | while read author; do
echo -n "${author},"
git log --author="${author}" --pretty=tformat: --numstat --since=${since} --until=${until} \
| awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "%s,%s,%s\n", add, subs, loc }' -
done
}

数组

定义数组

数组使用小括号括起,元素之间使用空格分隔:

1
$ arr=(1 2 3 4 5 6)

获取数组长度

1
2
3
4
$ echo ${#arr[*]}
6
$ echo ${#arr[@]}
6

读取元素

数组下标从0开始,若数组对应下标无元素,输出位空。下标使用*@输出整个数组:

1
2
3
4
5
6
7
8
9
10
11
12
$ echo ${arr[0]}
1
$ echo ${arr[1]}
2
$ echo ${arr[2]}
3
$ echo ${arr[10]}

$ echo ${arr[*]}
1 2 3 4 5 6
$ echo ${arr[@]}
1 2 3 4 5 6
Read more »

将下列文本另存为bat文件,运行即可:

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
@ECHO OFF

if exist "%ProgramFiles%\Microsoft Office\Office16\ospp.vbs" (
cd /d "%ProgramFiles%\Microsoft Office\Office16"
)
if exist "%ProgramFiles(x86)%\Microsoft Office\Office16\ospp.vbs" (
cd /d "%ProgramFiles(x86)%\Microsoft Office\Office16"
)

:WH
cls
echo ----------------------------------------------
echo 1. 零售版 Office Pro Plus 2016 转化为VOL
echo 2. 零售版 Office Visio Pro 2016 转化为VOL
echo 3. 零售版 Office Project Pro 2016 转化为VOL
echo ----------------------------------------------

set /p tsk="请选择(1-3): "
if not defined tsk goto:err
if %tsk%==1 goto:convert_office
if %tsk%==2 goto:convert_visio
if %tsk%==3 goto:convert_project

:err
goto :WH

:convert_office
cls
echo Convert Office2016
for /f %%x in ('dir /b ..\root\Licenses16\proplusvl_kms*.xrm-ms') do (
cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
)
for /f %%x in ('dir /b ..\root\Licenses16\proplusvl_mak*.xrm-ms') do (
cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
)
cscript ospp.vbs /inpkey:XQNVK-8JYDB-WJ9W3-YJ8YR-WFG99
goto :end

:convert_visio
cls
echo Convert Visio2016
for /f %%x in ('dir /b ..\root\Licenses16\visio???vl_kms*.xrm-ms') do (
cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
)
for /f %%x in ('dir /b ..\root\Licenses16\visio???vl_mak*.xrm-ms') do (
cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
)
cscript ospp.vbs /inpkey:PD3PC-RHNGV-FXJ29-8JK7D-RJRJK
goto :end

:convert_project
cls
echo Convert Project2016
for /f %%x in ('dir /b ..\root\Licenses16\project???vl_kms*.xrm-ms') do (
cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
)
for /f %%x in ('dir /b ..\root\Licenses16\project???vl_mak*.xrm-ms') do (
cscript ospp.vbs /inslic:"..\root\Licenses16\%%x" >nul
)
cscript ospp.vbs /inpkey:YG9NW-3K39V-2T3HJ-93F3Q-G83KT
goto :end

:end
pause >nul
exit

Kafka简介

Kafka是一个高吞吐量、分布式的发布-订阅消息系统。

Kafka是一款开源的、轻量级的、分布式、可分区和具有复制备份的(Replicated)、 基于ZooKeeper协调管理的分布式流平台的功能强大的消息系统。 与传统的消息系统相比,Kafka能够很好地处理活跃的流数据,使得数据在各个子系统中高性能、低延迟地不停流转。

Kafka作为一个分布式流处理平台,具备以下三个特性:

  • 能够允许发布和订阅流数据
  • 存储流数据时提供相应的容错机制
  • 当流数据到达时能够被及时处理
Read more »

如果公司服务器处于外网,而出于安全方面的考虑,访问公司外网服务器时一般会通过跳板机(堡垒机)进行访问。

方式1

使用ssh分别登录:

1
2
3
4
# 先登录到跳板机
$ ssh -A username@192.168.0.3 # -A: 表示转发密钥,它会将本机的密钥转发到跳板机上,从跳板机登录目标机器时会使用该密钥
# 从跳板机上再登录目标机器
$ ssh username@10.0.1.10

方式2

使用ProxyCommand选项,一行命令直接登录到目标机器:

1
$ ssh username@10.0.1.10 -o ProxyCommand='ssh username@192.168.0.3 -W %h:%p'
Read more »

Python内建的type自带3个参数,有两种用法:

  1. type(object) -> the object's type
  2. type(name, bases, dict) -> a new type

第一种用法就不说了,今天主要说一下第二种用法。

type(name, bases, dict)

  • name: 字符串,制定要构造类的名字,赋给新对象的__name__属性
  • bases: 一个tuple,指定新类型的所有基类,赋给新对象的__bases__属性
  • dict: 字典类型,作为新类的名字空间,赋给新对象的__dict__属性
Read more »