王某某的笔记

记录我的编程之路

麦克风

使用 arecord 录一段声音

1
sudo arecord -D "plughw:1,0" -d 5 f1.wav
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
      arecord [flags] [filename]
aplay [flags] [filename [filename]] ...
选项:
-h, --help帮助.
--version打印版本信息.
-l, --list-devices列出全部声卡和数字音频设备.
-L, --list-pcms列出全部PCM定义.
-D, --device=NAME指定PCM设备名称.
-q --quiet安静模式.
-t, --file-type TYPE文件类型(voc,wav,raw或au).
-c, --channels=#设置通道号.
-f --format=FORMAT设置格式.格式包括:S8 U8 S16_LE S16_BE U16_LE
U16_BE S24_LE S24_BE U24_LE U24_BE S32_LE S32_BE U32_LE U32_BE
FLOAT_LE FLOAT_BE FLOAT64_LE FLOAT64_BE IEC958_SUBFRAME_LE
IEC958_SUBFRAME_BE MU_LAW A_LAW IMA_ADPCM MPEG GSM
-r, --rate=#<Hz>设置频率.
-d, --duration=#设置持续时间,单位为秒.
-s, --sleep-min=#设置最小休眠时间.
-M, --mmap mmap流.
-N, --nonblock设置为非块模式.
-B, --buffer-time=#缓冲持续时长.单位为微妙.
-v, --verbose显示PCM结构和设置.
-I, --separate-channels设置为每个通道一个单独文件.

demo

1
2
3
4
5
    aplay -c 1 -t raw -r 22050 -f mu_law foobar
播放raw文件foobar.以22050Hz,单声道,8位,mu_law格式.

arecord -d 10 -f cd -t wav -D copy foobar.wav
以CD质量录制foobar.wav文件10秒钟.使用PCM的"copy".

装播放器

1
sudo apt-get install omxplayer

播放录的声音

1
2
omxplayer f1.wav 

摄像头

1
raspistill -o keychain.jpg -t 2000 

https://www.elastic.co/products/elasticsearch

验证环境:

Elasticsearch 2.4.1
CentOS Linux release 7.2.1511 (Core)

安装

YUM安装

下载并安装公钥
rpm –import https://packages.elastic.co/GPG-KEY-elasticsearch

在目录 /etc/yum.repos.d/ 下添加一个文件 elasticsearch.repo 内容如下:

[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

安装:

yum install elasticsearch

开机启动:

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service

解压安装

去官网下载合适的tar包
https://www.elastic.co/downloads/elasticsearch

# crul 下载
curl -O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.1/elasticsearch-2.4.1.tar.gz
# ---------------------------------------------------
# wget 下载
# 如果没有wget需要先安装
yum install wget

## 下载
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.1/elasticsearch-2.4.1.tar.gz

## 解压
tar -xvf elasticsearch-2.4.1.tar.gz 

配置

修改配置文件config/elasticsearch.yml

# ---------------------------------- Cluster -----------------------------------
#配置集群名称
cluster.name: wwh_es_cluster

# ------------------------------------ Node ------------------------------------
#配置节点名称,不同节点名字需要不同
node.name: node-213

# ----------------------------------- Paths ------------------------------------
# Path to directory where to store the data (separate multiple locations by comma):
#
# path.data: /path/to/data
#
# Path to log files:
#
# path.logs: /path/to/logs

# ---------------------------------- Network -----------------------------------
# Set the bind address to a specific IP (IPv4 or IPv6):

network.host: 192.168.1.213

# Set a custom port for HTTP:
#
# http.port: 9200
#

# --------------------------------- Discovery ----------------------------------
#集群中可以作为master节点的初始列表,通过这些节点来自动发现新加入集群的节点
discovery.zen.ping.unicast.hosts: ["wwh213", "wwh214"]

#其他的根据需要来配置

复制到其他机器(可以安装完其他的再一起复制)

1
2
3
scp -r elasticsearch-2.4.1 wwh214:/data/es/
scp -r elasticsearch-2.4.1 wwh215:/data/es/

然后修改为不同的节点名称

插件

elasticsearch-head

ElasticSearch-Head 是一个与Elastic集群(Cluster)相交互的Web前台。
ES-Head的主要作用

  • 它展现ES集群的拓扑结构,并且可以通过它来进行索引(Index)和节点(Node)级别的操作
  • 它提供一组针对集群的查询API,并将结果以json和表格形式返回
  • 它提供一些快捷菜单,用以展现集群的各种状态

官网地址:
https://github.com/mobz/elasticsearch-head
http://mobz.github.io/elasticsearch-head/

安装:

bin/plugin -install mobz/elasticsearch-head

or

bin/plugin install mobz/elasticsearch-head

访问地址:
http://192.168.1.213:9200/_plugin/head/

Kibana 4.6.1

Kibana是一个开源的数据可视化平台,使您可以通过惊艳、强大的图形结合定制的仪表板,帮助您对数据进行分析与数据进行交互。
Kibana 4.6.1 与Elasticsearch 2.4.x.兼容
Kibana也可以使用apt或yum安装
https://www.elastic.co/guide/en/kibana/4.6/setup.html#setup-repositories

安装:

1
2
3
4
5
6
# 下载
wget https://download.elastic.co/kibana/kibana/kibana-4.6.1-linux-x86_64.tar.gz

# 解压
tar -xvf kibana-4.6.1-linux-x86_64.tar.gz

编辑 config/kibana.yml 文件

#设置elasticsearch.url 指向 Elasticsearch 实例  

elasticsearch.url: "http://192.168.1.213:9200"

运行 ./bin/kibana 启动
在浏览器中打开:
http://192.168.1.213:5601

Marvel 2.0+

Marvel是Elasticsearch的图形化监控客户端,可以用来查看当前的各项状态。优化您的Elasticsearch性能和快速诊断问题的工具。

现在的elasticsearch 更改了插件安装方式,marvel是在kibana里安装的,而不是在elasticsearch里安装的,elasticsearch里安装的只是marvel-agent.

Marvel 2.0+ 兼容最新版本的Elasticsearch 和 Kibana
Marvel 1.3 兼容 Elasticsearch 1.0 - 1.7

官网地址:
https://www.elastic.co/products/marvel
https://www.elastic.co/downloads/marvel

安装:

1
2
3
4
5
6
7
8
9
10
#安装 Marvel 到 Elasticsearch 中
# 这个license只有30天的有效期,之后需要升级

./plugin install license
./plugin install marvel-agent

#安装 Marvel 到 Kibana 中

bin/kibana plugin --install elasticsearch/marvel/latest

启动 Elasticsearch 和 Kibana
访问: http://192.168.1.213:5601/app/marvel


需要在每台机器上都安装

启动

不能直接以root用户进行启动
修改用户之后需要注意权限问题
添加用户并修改权限

#添加用户
adduser es  

#修改权限
chown -R es:es elasticsearch-2.4.1

su es

或者指定 -Des.insecure.allow.root=true

1
2
3
# -d参数表示在后台启动
bin/elasticsearch -d

查看端口是否启动

netstat -an | grep 9200
tcp6       0      0 ::1:9200                :::*                    LISTEN     
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN    

netstat -an | grep 9300
tcp6       0      0 ::1:9300                :::*                    LISTEN     
tcp6       0      0 127.0.0.1:9300          :::*                    LISTEN  

测试

通过命令

curl -X GET http://192.168.1.213:9200/

如果安装了 elasticsearch-head 直接在浏览器中打开:
http://192.168.1.213:9200/_plugin/head/


配置ElasticSearch使用内存

编辑文件:
$ES_HOME/bin/elasticsearch.in.sh

if [ "x$ES_MIN_MEM" = "x" ]; then
    ES_MIN_MEM=10g  //最小内存,根据机器内存来定
fi
if [ "x$ES_MAX_MEM" = "x" ]; then
    ES_MAX_MEM=36g  //最大内存,根据机器内存来定,最好不要超过机器物理内存的50%
fi

设置分辨率为 1920*1080 60Hz

1
sudo vi /boot/config.txt

修改如下:

1
2
3
4
hdmi_drive=2
hdmi_group=2

hdmi_mode=82

之后重启树莓派

1
sudo reboot

参考


CEA分辨率

以下是CEA规定的电视规格分辨率。这些分辨率的hdmi_group=1。

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
hdmi_mode=1    VGA
hdmi_mode=2 480p 60Hz
hdmi_mode=3 480p 60Hz H
hdmi_mode=4 720p 60Hz
hdmi_mode=5 1080i 60Hz
hdmi_mode=6 480i 60Hz
hdmi_mode=7 480i 60Hz H
hdmi_mode=8 240p 60Hz
hdmi_mode=9 240p 60Hz H
hdmi_mode=10 480i 60Hz 4x
hdmi_mode=11 480i 60Hz 4x H
hdmi_mode=12 240p 60Hz 4x
hdmi_mode=13 240p 60Hz 4x H
hdmi_mode=14 480p 60Hz 2x
hdmi_mode=15 480p 60Hz 2x H
hdmi_mode=16 1080p 60Hz
hdmi_mode=17 576p 50Hz
hdmi_mode=18 576p 50Hz H
hdmi_mode=19 720p 50Hz
hdmi_mode=20 1080i 50Hz
hdmi_mode=21 576i 50Hz
hdmi_mode=22 576i 50Hz H
hdmi_mode=23 288p 50Hz
hdmi_mode=24 288p 50Hz H
hdmi_mode=25 576i 50Hz 4x
hdmi_mode=26 576i 50Hz 4x H
hdmi_mode=27 288p 50Hz 4x
hdmi_mode=28 288p 50Hz 4x H
hdmi_mode=29 576p 50Hz 2x
hdmi_mode=30 576p 50Hz 2x H
hdmi_mode=31 1080p 50Hz
hdmi_mode=32 1080p 24Hz
hdmi_mode=33 1080p 25Hz
hdmi_mode=34 1080p 30Hz
hdmi_mode=35 480p 60Hz 4x
hdmi_mode=36 480p 60Hz 4xH
hdmi_mode=37 576p 50Hz 4x
hdmi_mode=38 576p 50Hz 4x H
hdmi_mode=39 1080i 50Hz reduced blanking
hdmi_mode=40 1080i 100Hz
hdmi_mode=41 720p 100Hz
hdmi_mode=42 576p 100Hz
hdmi_mode=43 576p 100Hz H
hdmi_mode=44 576i 100Hz
hdmi_mode=45 576i 100Hz H
hdmi_mode=46 1080i 120Hz
hdmi_mode=47 720p 120Hz
hdmi_mode=48 480p 120Hz
hdmi_mode=49 480p 120Hz H
hdmi_mode=50 480i 120Hz
hdmi_mode=51 480i 120Hz H
hdmi_mode=52 576p 200Hz
hdmi_mode=53 576p 200Hz H
hdmi_mode=54 576i 200Hz
hdmi_mode=55 576i 200Hz H
hdmi_mode=56 480p 240Hz
hdmi_mode=57 480p 240Hz H
hdmi_mode=58 480i 240Hz
hdmi_mode=59 480i 240Hz H

H means 16:9 variant (of a normally 4:3 mode).
2x means pixel doubled (i.e. higher clock rate, with each pixel repeated twice)
4x means pixel quadrupled (i.e. higher clock rate, with each pixel repeated four times)

DMT分辨率

以下是计算机显示器使用的分辨率。这些分辨率的hdmi_group=2。

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
hdmi_mode=1    640x350   85Hz
hdmi_mode=2 640x400 85Hz
hdmi_mode=3 720x400 85Hz
hdmi_mode=4 640x480 60Hz
hdmi_mode=5 640x480 72Hz
hdmi_mode=6 640x480 75Hz
hdmi_mode=7 640x480 85Hz
hdmi_mode=8 800x600 56Hz
hdmi_mode=9 800x600 60Hz
hdmi_mode=10 800x600 72Hz
hdmi_mode=11 800x600 75Hz
hdmi_mode=12 800x600 85Hz
hdmi_mode=13 800x600 120Hz
hdmi_mode=14 848x480 60Hz
hdmi_mode=15 1024x768 43Hz DO NOT USE
hdmi_mode=16 1024x768 60Hz
hdmi_mode=17 1024x768 70Hz
hdmi_mode=18 1024x768 75Hz
hdmi_mode=19 1024x768 85Hz
hdmi_mode=20 1024x768 120Hz
hdmi_mode=21 1152x864 75Hz
hdmi_mode=22 1280x768 reduced blanking
hdmi_mode=23 1280x768 60Hz
hdmi_mode=24 1280x768 75Hz
hdmi_mode=25 1280x768 85Hz
hdmi_mode=26 1280x768 120Hz reduced blanking
hdmi_mode=27 1280x800 reduced blanking
hdmi_mode=28 1280x800 60Hz
hdmi_mode=29 1280x800 75Hz
hdmi_mode=30 1280x800 85Hz
hdmi_mode=31 1280x800 120Hz reduced blanking
hdmi_mode=32 1280x960 60Hz
hdmi_mode=33 1280x960 85Hz
hdmi_mode=34 1280x960 120Hz reduced blanking
hdmi_mode=35 1280x1024 60Hz
hdmi_mode=36 1280x1024 75Hz
hdmi_mode=37 1280x1024 85Hz
hdmi_mode=38 1280x1024 120Hz reduced blanking
hdmi_mode=39 1360x768 60Hz
hdmi_mode=40 1360x768 120Hz reduced blanking
hdmi_mode=41 1400x1050 reduced blanking
hdmi_mode=42 1400x1050 60Hz
hdmi_mode=43 1400x1050 75Hz
hdmi_mode=44 1400x1050 85Hz
hdmi_mode=45 1400x1050 120Hz reduced blanking
hdmi_mode=46 1440x900 reduced blanking
hdmi_mode=47 1440x900 60Hz
hdmi_mode=48 1440x900 75Hz
hdmi_mode=49 1440x900 85Hz
hdmi_mode=50 1440x900 120Hz reduced blanking
hdmi_mode=51 1600x1200 60Hz
hdmi_mode=52 1600x1200 65Hz
hdmi_mode=53 1600x1200 70Hz
hdmi_mode=54 1600x1200 75Hz
hdmi_mode=55 1600x1200 85Hz
hdmi_mode=56 1600x1200 120Hz reduced blanking
hdmi_mode=57 1680x1050 reduced blanking
hdmi_mode=58 1680x1050 60Hz
hdmi_mode=59 1680x1050 75Hz
hdmi_mode=60 1680x1050 85Hz
hdmi_mode=61 1680x1050 120Hz reduced blanking
hdmi_mode=62 1792x1344 60Hz
hdmi_mode=63 1792x1344 75Hz
hdmi_mode=64 1792x1344 120Hz reduced blanking
hdmi_mode=65 1856x1392 60Hz
hdmi_mode=66 1856x1392 75Hz
hdmi_mode=67 1856x1392 120Hz reduced blanking
hdmi_mode=68 1920x1200 reduced blanking
hdmi_mode=69 1920x1200 60Hz
hdmi_mode=70 1920x1200 75Hz
hdmi_mode=71 1920x1200 85Hz
hdmi_mode=72 1920x1200 120Hz reduced blanking
hdmi_mode=73 1920x1440 60Hz
hdmi_mode=74 1920x1440 75Hz
hdmi_mode=75 1920x1440 120Hz reduced blanking
hdmi_mode=76 2560x1600 reduced blanking
hdmi_mode=77 2560x1600 60Hz
hdmi_mode=78 2560x1600 75Hz
hdmi_mode=79 2560x1600 85Hz
hdmi_mode=80 2560x1600 120Hz reduced blanking
hdmi_mode=81 1366x768 60Hz
hdmi_mode=82 1080p 60Hz
hdmi_mode=83 1600x900 reduced blanking
hdmi_mode=84 2048x1152 reduced blanking
hdmi_mode=85 720p 60Hz
hdmi_mode=86 1366x768 reduced blanking

通过元素用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用${属性名}的方式引用该属性,这种做法的最大意义在于消除重复和统一管理。

  Maven总共有6类属性,内置属性、POM属性、自定义属性、Settings属性、java系统属性和环境变量属性;

  1. 内置属性
    两个常用内置属性 ${basedir} 表示项目跟目录,即包含pom.xml文件的目录;${version} 表示项目版本

  2. POM属性
    用户可以使用该类属性引用POM文件中对应元素的值。如${project.artifactId}就对应了 元素的值,常用的POM属性包括:

  • ${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/
  • ${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/
  • ${project.build.directory} : 项目构建输出目录,默认为target/
  • ${project.outputDirectory} : 项目主代码编译输出目录,默认为target/classes/
  • ${project.testOutputDirectory}:项目测试主代码输出目录,默认为target/testclasses/
  • ${project.groupId}:项目的groupId
  • ${project.artifactId}:项目的artifactId
  • ${project.version}:项目的version,与${version} 等价
  • ${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}
  1. 自定义属性
    随便写

  2. Settings属性
    与POM属性同理,用户使用以settings. 开头的属性引用settings.xml文件中的XML元素的值。

  3. Java系统属性
    所有java系统属性都可以用Maven属性引用,如${user.home}指向了用户目录。

  4. 环境变量属性
    所有环境变量属性都可以使用以env. 开头的Maven属性引用,如${env.JAVA_HOME}指代了JAVA_HOME环境变量的的值。

1. 安装配置DNSmasq

DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。它服务那些只在本地适用的域名,这些域名是不会在全球的DNS服务器中出现的。DHCP服务器和DNS服务器结合,并且允许DHCP分配的地址能在DNS中正常解析,而这些DHCP分配的地址和相关命令可以配置到每台主机中,也可以配置到一台核心设备中(比如路由器),DNSmasq支持静态和动态两种DHCP配置方式。

安装

1
sudo apt-get install dnsmasq

配置
修改/etc/dnsmasq.conf文件

1
sudo vi /etc/dnsmasq.conf

这个文件配置比较大,但是都注释了
这里指定一下接口,配置一下dhcp分配的ip范围,在末尾加上:

1
2
3
interface=wlan0
dhcp-range=192.168.0.100,192.168.0.120,255.255.255.0,12h

如需要指定DNS解析,再加上:

1
addn-hosts=/etc/dnsmasq.hosts  

然后创建/etc/dnsmasq.hosts 文件,这里复制hosts文件

1
2
cp /etc/hosts /etc/dnsmasq.hosts

然后按照需要改内容,如:

1
192.168.0.1 raspberrypi

默认开机启动
可以查看一下:

1
systemctl status dnsmasq

2. 安装hostapd

hostapd 是一个用户态用于AP和认证服务器的守护进程。
它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。Linux下支持的驱动有:Host AP,madwifi,基于mac80211的驱动。

安装

1
sudo apt-get install hostapd 

配置
创建 /etc/hostapd/hostapd.conf

1
#sudo vi /etc/hostapd/hostapd.conf

填入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
interface=wlan0
hw_mode=g
channel=10
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP

ssid=rp3
wpa_passphrase=123456789

3. 配置接口

将无线接口wlan0的IP配置成静态地址

  1. dhcpcd不再管理wlan0,避免设置冲突

    1
    # sudo vi /etc/dhcpcd.conf

    禁用wlan0接口

    1
    denyinterfaces wlan0
  2. 给wlan0配置固定IP
    修改 /etc/network/interfaces 文件成如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    allow-hotplug wlan0
    #iface wlan0 inet dhcp
    # wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    iface wlan0 inet static
    address 192.168.0.1
    netmask 255.255.255.0
    network 192.168.0.0
    broadcast 192.168.0.255

  3. 重启相关服务

    1
    2
    3
    4
    5
    6
    sudo service dhcpcd restart

    sudo ifdown wlan0

    sudo ifup wlan0

4 启动hostapd

1
sudo hostapd -B /etc/hostapd/hostapd.conf & > /dev/null 2>&1

如果没有问题,并且手机等设备可以连接

修改配置文件

1
sudo vi /etc/default/hostapd
1
2
3
4
5
##将##
#DAEMON_CONF=""

##修改为##
DAEMON_CONF="/etc/hostapd/hostapd.conf"

设置为开机启动

1
2
3
4
sudo systemctl enable hostapd

#查看状态
sudo systemctl status hostapd


重新使用wifi连接网络

停掉两个服务的自启动

1
2
3
4
sudo systemctl disable dnsmasq

sudo systemctl disable hostapd

关闭两个服务

1
2
3
sudo systemctl stop dnsmasq

sudo systemctl stop hostapd

启动wlan0接口的dhcpcd服务

1
2
3
4
5
sudo vi /etc/dhcpcd.conf

#注释掉如下:
#denyinterfaces wlan0

修改为获取动态IP
修改 /etc/network/interfaces 文件成如下:

1
2
3
4
5
6
7
8
9
10
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

#iface wlan0 inet static
# address 192.168.0.1
# netmask 255.255.255.0
# network 192.168.0.0
# broadcast 192.168.0.255

重启相关服务和网卡

1
2
3
4
5
6
sudo service dhcpcd restart

sudo ifdown wlan0

sudo ifup wlan0



(下面的没有测试)

配置NAT
– 这先不弄,觉得没有必要转发

修改/etc/sysctl.conf,更改(如果有这一行,把#号去掉就行)

1
2
3
4
5
6
net.ipv4.ip_forward=1


#替换命令
sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf

通过iptables做NAT转发:

1
2
3
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

关于

Apache HTTP Server是一个为包括UNIX和Windows在内的现代操作系统努力开发和维护的开源HTTP服务器项目。这个项目的目标是提供一个安全,高效和可扩展的服务器,提供与当前HTTP标准同步的HTTP服务。
Apache HTTP服务器(“httpd”)于1995年推出,它自1996年4月以来一直是互联网上最受欢迎的Web服务器。它于2015年2月庆祝了其20岁生日。
Apache HTTP Server是Apache Software Foundation的一个项目。

安装

这里是在CentOS7 下的安装

1
2
3
4
yum -install httpd

# 会自动的安装一些依赖

配置

简单的说明一下,主要是修改:
/etc/httpd/conf/httpd.conf

1
2
3
4
5
6
7
8
ServerRoot "/etc/httpd"  #apache软件安装的位置。其它指定的目录如果没有指定绝对路径,则目录是相对于该目录

Listen 80 #服务器监听的端口号

DocumentRoot "/var/www/html" #主站点的网页存储位置

<Directory "/data/statsvn/report"> #权限,用的时候再去查

启动

1
2
3
4
5
6
systemctl start httpd

#检查
ps -ef | grep httpd

netstat -an | grep 80

配置开机启动

1
2
3
systemctl enable httpd

Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

常见CSV格式

DEFAULT 界定符( , ) 引号字符( “ ) 行结束符( \r\n ) 忽略空行

EXCEL 界定符( ; ) 引号字符( “ ) 行结束符( \r\n ) 不忽略空行

MYSQL 界定符( \t ) 引号字符( 无 ) 行结束符( \n ) 转义字符( \ ) 空字符串( \N ) 不忽略空行

RFC4180 界定符( , ) 引号字符( “ ) 行结束符( \r\n ) 不忽略空行

TDF 界定符( \t ) 引号字符( “ ) 行结束符( \r\n ) 忽略周围的空格

INFORMIX_UNLOAD 界定符( , ) 引号字符( “ ) 行结束符( \n ) 转义字符( \ )

INFORMIX_UNLOAD_CSV 界定符( , ) 引号字符( “ ) 行结束符( \n )

ES 增加字段 映射 解析器

字段与映射

获取索引

1
get http://192.168.1.91:9200/mmx2/_mapping/p1

为已经存在的索引添加一个新的字段

1
2
3
4
5
6
7
8
9
put http://192.168.1.91:9200/dnd-类型1/_mapping/dndata

{
"properties": {
"user_name": {
"type": "String"
}
}
}

对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"properties": {
"state": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}

字段索引两次使用不的解析器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUT /my_index
{
"settings": { "number_of_shards": 1 },
"mappings": {
"my_type": {
"properties": {
"title": {
"type": "string",
"analyzer": "english",
"fields": {
"std": {
"type": "string",
"analyzer": "standard"
}
}
}
}
}
}
}

为字段配置一个特定的解析器

1
2
3
4
5
6
7
8
9
10
11
12
PUT /my_index/_mapping/my_type

{
"my_type": {
"properties": {
"english_title": {
"type": "string",
"analyzer": "english"
}
}
}
}

自定义_all字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUT /my_index
{
"mappings": {
"person": {
"properties": {
"first_name": {
"type": "string",
"copy_to": "full_name"
},
"last_name": {
"type": "string",
"copy_to": "full_name"
},
"full_name": {
"type": "string"
}
}
}
}
}

ES通过字段映射中的copy_to参数将值复制到其他字段,在first_name和last_name字段中的值会被拷贝到full_name字段中。first_name和last_name字段的映射和full_name字段的索引方式的无关。full_name字段会从其它两个字段中拷贝字符串的值,然后仅根据full_name字段自身的映射进行索引。

1

解析器

解析器可以在几个级别被指定。ES会依次检查每个级别直到它找到了一个可用的解析器。在索引期间,检查的顺序是这样的:

  • 定义在字段映射中的analyzer
  • 文档的_analyzer字段中定义的解析器
  • type默认的analyzer,它的默认值是
  • 在索引设置(Index Settings)中名为default的解析器,它的默认值是
  • 节点上名为default的解析器,它的默认值是
  • standard解析器

在搜索期间,顺序稍微有所不同:

  • 直接定义在查询中的analyzer
  • 定义在字段映射中的analyzer
  • type默认的analyzer,它的默认值是
  • 在索引设置(Index Settings)中名为default的解析器,它的默认值是
  • 节点上名为default的解析器,它的默认值是
  • standard解析器

以上两个点表示的项目突出显示了索引期间和搜索期间顺序的不同之处。_analyzer字段允许你能够为每份文档指定一个默认的解析器(比如,english,french,spanish),而查询中的analyzer参数则让你能够指定查询字符串使用的解析器。然而,这并不是在一个索引中处理多语言的最佳方案,因为在处理自然语言中提到的一些陷阱。

JAX-RS

JAX-RS: Java API for RESTful Web Services是一个Java编程语言的应用程序接口,支持按照 表象化状态转变 (REST)架构风格创建Web服务。JAX-RS使用了 ++Java SE 5++ 引入的Java 标注来简化Web服务客户端和服务端的开发和部署。

规范内容

JAX-RS提供了一些标注将一个资源类,一个POJOJava类,封装为Web资源。标注包括:

  • @Path,标注资源类或方法的相对路径
  • @GET,@PUT,@POST,@DELETE,标注方法是用的HTTP请求的类型
  • @Produces,标注返回的MIME媒体类型
  • @Consumes,标注可接受请求的MIME媒体类型
  • @PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。

JAX-RS的实现

  • Apache CXF,开源的Web服务框架。
  • Jersey, 由Sun提供的JAX-RS的参考实现。
  • RESTEasy,JBoss的实现。
  • Restlet,由Jerome Louvel和Dave Pawson开发,是最早的REST框架,先于JAX-RS出现。
  • Apache Wink,一个Apache软件基金会孵化器中的项目,其服务模块实现JAX-RS规范

说明

Java EE 6 引入了对 JSR-311 的支持。JSR-311(JAX-RS:Java API for RESTful Web Services)旨在定义一个统一的规范,使得 Java 程序员可以使用一套固定的接口来开发 REST 应用,避免了依赖于第三方框架。同时,JAX-RS 使用 POJO 编程模型和基于标注的配置,并集成了 JAXB,从而可以有效缩短 REST 应用的开发周期。

JAX-RS 定义的 API 位于 javax.ws.rs 包中。

JAX-RS 的具体实现由第三方提供,例如 Sun 的参考实现 Jersey、Apache 的 CXF 以及 JBoss 的 RESTEasy。

https://docs.spring.io/spring-hadoop/docs/current/reference/html/springandhadoop-hbase.html

通过hbase-configuration命名空间元素(或其支持HbaseConfigurationFactoryBean)为HBase提供基本配置。

1
2
<!-- default bean id is 'hbaseConfiguration' that uses the existing 'hadoopCconfiguration' object -->
<hdp:hbase-configuration configuration-ref="hadoopCconfiguration" />

配置连接

1
2
3
4
5
<!-- delete associated connections but do not stop the proxies -->
<hdp:hbase-configuration stop-proxy="false" delete-connection="true">
foo=bar
property=value
</hdp:hbase-configuration>
1
2
<!-- specify ZooKeeper host/port -->
<hdp:hbase-configuration zk-quorum="${hbase.host}" zk-port="${hbase.port}">

属性和配置文件

1
2
<hdp:hbase-configuration properties-ref="some-props-bean" properties-location="classpath:/conf/testing/hbase.properties"/>

核心HbaseTemplate–一个与HBase交互的高层次抽象。该模板需要HBase配置,一旦设置,该模板就是线程安全的,并且可以同时在多个实例中重用:

1
2
3
4
5
// default HBase configuration
<hdp:hbase-configuration/>

// wire hbase configuration (using default name 'hbaseConfiguration') into the template
<bean id="htemplate" class="org.springframework.data.hadoop.hbase.HbaseTemplate" p:configuration-ref="hbaseConfiguration"/>

使用例子

1
2
3
4
5
6
7
8
9
10
// writing to 'MyTable'
template.execute("MyTable", new TableCallback<Object>() {
@Override
public Object doInTable(HTable table) throws Throwable {
Put p = new Put(Bytes.toBytes("SomeRow"));
p.add(Bytes.toBytes("SomeColumn"), Bytes.toBytes("SomeQualifier"), Bytes.toBytes("AValue"));
table.put(p);
return null;
}
});
1
2
3
4
5
6
7
// read each row from 'MyTable'
List<String> rows = template.find("MyTable", "SomeColumn", new RowMapper<String>() {
@Override
public String mapRow(Result result, int rowNum) throws Exception {
return result.toString();
}
}));

配置文件例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<hdp:configuration id="hadoopConfiguration">
fs.defaultFS=${spring.hadoop.fsUri}
<!-- hadoop.tmp.dir=/tmp/hadoop -->
</hdp:configuration>

<hdp:file-system id="hadoopFs" configuration-ref="hadoopConfiguration" />

<hdp:hbase-configuration id="hbaseConfiguration" configuration-ref="hadoopConfiguration" zk-quorum="${hbase.zk.host}" zk-port="${hbase.zk.port}" />

<bean id="hbaseTemplate" class="org.springframework.data.hadoop.hbase.HbaseTemplate">
<property name="configuration" ref="hbaseConfiguration" />
</bean>

<!-- 配置一个connectionfactory使用原生的API -->
<bean id='hbaseConnection' class='org.apache.hadoop.hbase.client.ConnectionFactory' factory-method="createConnection" destroy-method="close">
<constructor-arg index="0" ref="hbaseConfiguration" />
</bean>

Connection 说明:
创建连接是一个重量级操作。连接实现是线程安全的,因此客户端可以创建一个连接,并与不同的线程共享它。Table和Admin实例是轻量级的,并且不是线程安全的。通常,每个客户端应用程序都实例化一个连接,每个线程都将获得自己的Table实例。不推荐使用Table和Admin的缓存或池。

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
@Component
public class IconTableInit implements InitializingBean {

private static Logger logger = LoggerFactory.getLogger(IconTableInit.class);

@Autowired
private Connection connection;

@Override
public void afterPropertiesSet() throws Exception {
// 如果表不存在则创建表
Admin admin = null;
try {
admin = connection.getAdmin();
if (!admin.tableExists(TableName.valueOf(TABLE_NAME))) {

logger.info("HBase中不存在{}表!", TABLE_NAME);

HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf(TABLE_NAME));
HColumnDescriptor columnDescriptor = new HColumnDescriptor(CF_INFO_B);
tableDescriptor.addFamily(columnDescriptor);
admin.createTable(tableDescriptor);

logger.info("{}表创建成功!", TABLE_NAME);
}
} catch (Exception e) {
logger.error("系统启动时检查icon表是否创建异常!", e);
throw new GeneralException("##### 系统启动时连接HBase出现异常! #####");
} finally {
if (admin != null) {
admin.close();
}
}
}
}
0%