posts
蓝灯 Lantern 邀请码
蓝灯 Lantern 邀请码
使用方法
购买或者激活蓝灯(Lantern)专业版的时候,输入邀请码 YGN5ZYJ 可获赠三个月专业版。
邀请码 YGN5ZYJ
开发配置
开发配置
fiddler
配置代理
tools-options-script 语言改成 C#
ctrl + r
OnBeforeRequest(Session oSession) 方法里面加上如下代理配置
oSession.url = oSession.url.Replace("assettest.zte.com.cn/zte-erp-iasset-api", "10.4.213.48:8082/zte-erp-iasset-api");
数据库配置
设置连接数、天兔监控和buffer pool(177天兔监控)
show databases;
SELECT @@GLOBAL.sql_mode;
show variables like "max_connections";
set GLOBAL max_connections=5000; # 设置最大连接数
flush privileges; # 使设置立即生效
create database lepus default charater set utf8; # 创建天兔监控数据库
grant select, insert, update, delete, create on lepus.* to 'lepus_user'@'localhost' identified by '123456'; # 天兔本地账号授权
grant select, insert, update, delete, create on lepus.* to 'lepus_user'@'%' identified by '123456'; # 天兔外部账号授权
flush privileges;
show databases;
select @@hostname;
set global innodb_buffer_pool_size=1073741824; # 设置buffer pool 大小
set global key_buffer_size=419430400; # 设置 key buffer 大小
select @@hostname;
设置组复制(181)
install plugin group_replication soname 'group_replication.so'; # 安装组复制插件
START GROUP_REPLICATION; # 开启组复制
select * from performance_schema.replication_group_members; # 查看组复制成员
show variables like '%group_replication_ip_whitelist%'; # 查看组复制ip白名单
START GROUP_REPLICATION; # 开启组复制
stop GROUP_REPLICATION; # 停止组复制
Redis 配置
设置 Redis Exporter
./redis_exporter -redis.addr=10.89.232.11:6389,10.89.232.12:6389,10.89.232.85:6389 -redis-only-metrics -redis.alias=redis-11,redis-12,redis-85 -redis.password=654321
./bin/redis-server 0.0.0.0:6379 [cluster] # 查看到的进程信息,非命令
设置 Redis Cluster
配置信息:
dbfilename "dump.rdb" # rdb文件,默认
appendonly yes # 开启aop
appendfilename "appendonly.aof" # aop文件,默认
appendfsync everysec # aop fsync,每秒一次,默认
port 7480 # 端口
pidfile "/var/run/redis_7480.pid" # pid文件,自动生成
dir "/usr/local/redis-cluster/7480" # 目录
cluster-config-file "nodes-7480.conf" # 集群配置文件,自动生成
masterauth "xxxxxx" # 集群master密码
requirepass "xxxxxx" # 节点密码
常用命令:
auth passwordxxx # 认证
CLUSTER NODES # 查看集群节点
CLUSTER INFO # 查看集群信息
创建 Redis Cluster
/usr/local/redis-4.0.9/src/redis-trib.rb create --replicas 1 10.89.232.9:7480 10.89.232.10:7480 10.89.232.8:7480 10.89.232.12:7480
日志信息:
>>> Creating cluster
>>> Performing bash slots allocation on 6 nodes...
Using 3 masters:
10.89.232.9:7480
10.89.232.10:7480
10.89.232.8:7480
Adding replica 10.89.232.11:7480 to 10.89.232.9:7480
Adding replica 10.89.232.12:7480 to 10.89.232.10:7480
Adding replica 10.89.232.85:7480 to 10.89.232.8:7480
M: hashxxxxxxxxxxxxxxxxxxx 10.89.232.9:7480
slots:0-5460 (5461 slots) master
M: hashxxxxxxxxxxxxxxxxxxx 10.89.232.10:7480
slots:5461-10922 (5462 slots) master
M: hashxxxxxxxxxxxxxxxxxxx 10.89.232.8:7480
slots:10923-10383 (5461 slots) master
s: hashxxxxxxxxxxxxxxxxxxx 10.89.232.85:7480
replicates masterhashxxxxxxxxxxxxxxx
s: hashxxxxxxxxxxxxxxxxxxx 10.89.232.11:7480
replicates masterhashxxxxxxxxxxxxxxx
s: hashxxxxxxxxxxxxxxxxxxx 10.89.232.12:7480
replicates masterhashxxxxxxxxxxxxxxx
[OK] All 16384 slots coverd.
常见问题:
[ERR] Sorry, can't connect to node 10.89.232.9:7480
该问题是由于 redis-trib.rb 创建集群时,默认没有 auth,如果节点需要密码,则需要在 redis-trib.rb 的 connect 方法内做如下修改:
@r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60, :password => "xxxxxx")
常用命令
连接 redis
/usr/local/rdis-cluster/6379/bin/redis/cli -c -h 10.89.232.9 -p 7480
启动 redis
/usr/local/rdis-cluster/6379/bin/redis-server /usr/local/rdis-cluster/6379/redis.conf
天兔配置
监控机 MySql 数据库连接地址
[monitor_server]
host="127.0.0.1"
port=3306
user="lepus_user"
passwd="123456"
dbname="lepus"
重置监控账号密码
SET PASSWORD FOR 'lepus_monitor'@'%' = PASSWORD('xxxxxx');
部署配置
dockerfile
FROM base-img-name:v1.x.x
MAINTAINER Yeehom yeehom147@gmail.com
COPY run.sh /root/run.sh
COPY app.jar /usr/local/tomcat/logs/
RUN chmod 755 /root/run.sh && chmod +x /usr/local/checkRouter.sh && cat /usr/local/mysqlrouter_cron >> /usr/local/tomcat/tomcat_cron && cat /usr/local/tomcat/tomcat_cron
ENTRYPOINT ["sh", "-c", "/root/run.sh"]
dockerfile 引用的 run.sh
#!/bin/bash
# set -e
# 设置时区
export TZ=Asia/Shanghai
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 设置host
cat /root/hosts >> /etc/hosts
# 设置和启动mysqlrouter
expect -c "
spawn mysqlrouter --bootstrap root@10.30.14.174:3306 --user=mysqlrouter
expect {
\"*password*:\" {send \"${db_password}\n\"; exp_continue}
}
"
service mysqlrouter start
sleep 15
# 设置和启动cron
crontab /usr/local/tomcat/tomcat_cron
crontab -l
service crond start
# 设置pinpoint
cd /root/pp
sed -i 's#^profiler.collector.ip=.*#profiler.collector.ip='${pinpoint_ip}'#g' pinpoint.config
sed -i 's#^profiler.tomcat.excludeurl=.*#profiler.tomcat.excludeurl=\/zte-erp-iasset-api\/info#g' pinpoint.config
sed -i 's#^profiler.tomcat.hidepinpointheader=false#g' pinpoint.config
cd /usr/local/apm-agent-v2.0
sed -i 's#^profiler.collector.ip=.*#profiler.collector.ip='${apm_pinpoint_ip}'#g' pinpoint.config
# 添加 agent 3.0 版本及相关配置文件
cp /usr/local/apm_agent_prod.config /usr/local/apm-agent-v3.0/pinpoint.config
# 设置和启动微服务
cd /usr/local/tomcat/logs
# 微服务名,项目组自行修改
AGENT_ID="iasset-${HOSTNAME}"
# 微服务分类_微服务名,项目组自行修改
APPLICATION_NAME="zte-erp-iasset-api"
APM_APPLICATION_NAME="ICENTER_zte-erp-iasset-api"
# 启动时设置的profile
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=${spring_profiles_active}"
JAVA_OPTS="$JAVA_OPTS -Dspring.cloud.config.uri=${spring_cloud_config_url}"
JAVA_OPTS="$JAVA_OPTS -Dspring.cloud.config.lable=zte-erp-iasset"
JAVA_OPTS="$JAVA_OPTS -Dspring.cloud.config.username=${spring_cloud_config_username}"
JAVA_OPTS="$JAVA_OPTS -Dspring.cloud.config.password=${spring_cloud_config_password}"
# 设置堆栈内存大小
JAVA_OPTS="$JAVA_OPTS -server -Xms3g -Xmx3g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/oom.dump"
# JAVA_OPTS="$JAVA_OPTS -javaagent:/root/pp/pinpoint-bootstrap-1.7.3.jar"
JAVA_OPTS="$JAVA_OPTS -Dpinpoint.agentId=${AGENT_ID} -Dpinpoint.applicationName=${APPLICATION_NAME}"
JAVA_OPTS="$JAVA_OPTS -javaagent:/user/local/apm-agent-v3.0/pinpoint-bootstrap-1.8.1.jar"
JAVA_OPTS="$JAVA_OPTS -Dsun.net.inetaddr.ttl=300 -Dsun.net.inetaddr.negative.ttl=5"
java -jar $JAVA_OPTS app.jar
cron配置
tomcat_cron
00 00 * * * /usr/sbin/logrotate -f /usr/local/tomcat/logrotate/tomcat
* * * * * sh /usr/local/checkRouter.sh
logrotate/tomcat
/usr/local/tomcat/logs/catalina.out
/usr/local/tomcat/logs/*.log{
copytruncate
daily
rotate 2
dateext
nocompress
missingok
}
checkRouter.sh
#!/bin/bash
PATH=/usr/sbin:/sbin:$PATH
router_instance=$(service mysqlrouter status |egrep 'is\s+running|stopped'|wc -l)
#echo step1:${router_instance} >> check.log
if [ ${router_instance} -eq 0 ]; then
service mysqlrouter restart
echo "mysqlrouter starting...the time is"$(date)>>/usr/local/check.log
sleep 5
router_instance=$(service mysqlrouter status |egrep 'is\s+running' |wc -l)
if [ ${router_instance} -eq 0 ]; then
service mysqlrouter stop
fi
fi
sleep 5
router_instance=$(netstat -ntlp|grep -w 6446|wc -l)
#echo step1:${router_instance} >> check.log
if [ ${router_instance} -ne 1 ]; then
service mysqlrouter restart
echo "mysqlrouter starting...the time is"$(date)>>/usr/local/check.log
fi
其他启动命令
nohup java -Xms1g -Xmx2g -jar -Djava.security.egd=file:/dev/urandom -Dspring.profiles.active=prod xxxxxx.jar &
Vim 神器的详细使用
Vim 神器的详细使用
Vim 是一个上古神器,关于 Vim 的简介,主题的选择,以及为何使用 vim-plug 来管理插件等内容,有兴趣的同学下来可以自己了解下。
基本操作
安装
sudo apt-getinstall vim// Ubuntu
其他平台,可以自行谷歌/百度
移动光标
# hjkl
# 2w 向前移动两个单词
# 3e 向前移动到第 3 个单词的末尾
# 0 移动到行首
# $ 当前行的末尾
# gg 文件第一行
# G 文件最后一行
# 行号+G 指定行
# <ctrl>+o 跳转回之前的位置
# <ctrl>+i 返回跳转之前的位置
退出
# <esc> 进入正常模式
# :q! 不保存退出
# :wq 保存后退出
删除
# x 删除当前字符
# dw 删除至当前单词末尾
# de 删除至当前单词末尾,包括当前字符
# d$ 删除至当前行尾
# dd 删除整行
# 2dd 删除两行
修改
# i 插入文本
# A 当前行末尾添加
# r 替换当前字符
# o 打开新的一行并进入插入模式
撤销
# u 撤销
# <ctrl>+r 取消撤销
复制粘贴剪切
# v 进入可视模式
# y 复制
# p 粘贴
# yy 复制当前行
# dd 剪切当前行
状态
#<ctrl>+g 显示当前行以及文件信息
查找
# / 正向查找(n:继续查找,N:相反方向继续查找)
# ? 逆向查找
# % 查找配对的 {,[,(
# :set ic 忽略大小写
# :set noic 取消忽略大小写
# :set hls 匹配项高亮显示
# :set is 显示部分匹配
替换
# :s/old/new 替换该行第一个匹配串
# :s/old/new/g 替换全行的匹配串
# :%s/old/new/g 替换整个文件的匹配串
折叠
# zc 折叠
# zC 折叠所有嵌套
# zo 展开折叠
# zO 展开所有折叠嵌套
执行外部命令
# :!shell 执行外部命令
.vimrc
.vimrc 是 Vim 的配置文件,需要我们自己创建:
cd Home // 进入 Home 目录
touch .vimrc // 配置文件
# Unix
# vim-plug
# Vim
curl -fLo ~/.vim/autoload/plug.vim --create-dirs
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
# Neovim
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
其他平台,可以查看 vim-plug。
基本配置
取消备份
set nobackup
set noswapfile
文件编码
setencoding=utf-8
显示行号
setnumber
取消换行
setnowrap
显示光标当前位置
setruler
设置缩进
set cindent
set tabstop=2
set shiftwidth=2
突出显示当前行
setcursorline
查找
set ic
set hls
set is
左下角显示当前vim模式
setshowmode
代码折叠
#启动 vim 时关闭折叠代码
set nofoldenable
主题
syntax enable
set background=dark
colorscheme solarized
◈ altercation/vim-colors-solarized
◈ Anthony25/gnome-terminal-colors-solarized
插件配置
树形目录
Plug 'scrooloose/nerdtree'
Plug 'jistr/vim-nerdtree-tabs'
Plug 'Xuyuanp/nerdtree-git-plugin'
autocmd vimenter * NERDTree
map <C-n> :NERDTreeToggle<CR>
let NERDTreeShowHidden=1
let g:NERDTreeShowIgnoredStatus = 1
let g:nerdtree_tabs_open_on_console_startup=1
let g:NERDTreeIndicatorMapCustom = {
"Modified" : "✹",
"Staged" : "✚",
"Untracked" : "✭",
"Renamed" : "➜",
"Unmerged" : "═",
"Deleted" : "✖",
"Dirty" : "✗",
"Clean" : "✔︎",
'Ignored' : '☒',
"Unknown" : "?"
}
# o 打开关闭文件或目录
# e 以文件管理的方式打开选中的目录
# t 在标签页中打开
# T 在标签页中打开,但光标仍然留在 NERDTree
# r 刷新光标所在的目录
# R 刷新当前根路径
# X 收起所有目录
# p 小写,跳转到光标所在的上一级路径
# P 大写,跳转到当前根路径
# J 到第一个节点
# K 到最后一个节点
# I 显示隐藏文件
# m 显示文件操作菜单
# C 将根路径设置为光标所在的目录
# u 设置上级目录为根路径
# ctrl + w + w 光标自动在左右侧窗口切换
# ctrl + w + r 移动当前窗口的布局位置
# :tabc 关闭当前的 tab
# :tabo 关闭所有其他的 tab
# :tabp 前一个 tab
# :tabn 后一个 tab
# gT 前一个 tab
# gt 后一个 tab
◈ scrooloose/nerdtree
◈ vim-nerdtree-tabs
◈ nerdtree-git-plugin
代码,引号,路径补全
Plug 'Valloric/YouCompleteMe'
Plug 'Raimondi/delimitMate'
Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
◈ Valloric/YouCompleteMe
◈ Raimondi/delimitMate
◈ Shougo/deoplete.nvim
语法高亮,检查
Plug 'sheerun/vim-polyglot'
Plug 'w0rp/ale'
let g:ale_linters = {
'javascript': ['eslint'],
'css': ['stylelint'],
}
let g:ale_fixers = {
'javascript': ['eslint'],
'css': ['stylelint'],
}
let g:ale_fix_on_save = 1
let g:ale_sign_column_always = 1
let g:ale_sign_error = '●'
let g:ale_sign_warning = '▶'
nmap <silent> <C-k> <Plug>(ale_previous_wrap)
nmap <silent> <C-j> <Plug>(ale_next_wrap)
◈ w0rp/ale
◈ sheerun/vim-polyglot
文件,代码搜索
Plug 'rking/ag.vim'
Plug 'kien/ctrlp.vim'
◈ kien/ctrlp.vim
◈ ggreer/the_silver_searcher
◈ rking/ag.vim
加强版状态栏
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
let g:airline_theme='papercolor'
◈ vim-airline/vim-airline
◈ vim-airline/vim-airline-themes
代码注释
Plug 'scrooloose/nerdcommenter'
# <leader>cc // 注释
# <leader>cm 只用一组符号注释
# <leader>cA 在行尾添加注释
# <leader>c$ /* 注释 */
# <leader>cs /* 块注释 */
# <leader>cy 注释并复制
# <leader>c<space> 注释/取消注释
# <leader>ca 切换 // 和 /* */
# <leader>cu 取消注释
let g:NERDSpaceDelims = 1
let g:NERDDefaultAlign = 'left'
let g:NERDCustomDelimiters = {
'javascript': { 'left': '//', 'leftAlt': '/**', 'rightAlt': '*/' },
'less': { 'left': '/**', 'right': '*/' }
}
◈ scrooloose/nerdcommenter
git
Plug 'airblade/vim-gitgutter'
Plug 'tpope/vim-fugitive'
◈ airblade/vim-gitgutter
◈ tpope/vim-fugitive
Markdown
Plug 'suan/vim-instant-markdown'
let g:instant_markdown_slow = 1
let g:instant_markdown_autostart = 0
# :InstantMarkdownPreview
◈ suan/vim-instant-markdown
Emmet
Plug 'mattn/emmet-vim'
let g:user_emmet_leader_key='<Tab>'
let g:user_emmet_settings = {
'javascript.jsx' : {
'extends' : 'jsx',
},
}
◈ mattn/emmet-vim
html 5
Plug'othree/html5.vim'
◈ othree/html5.vim
css 3
Plug 'hail2u/vim-css3-syntax'
Plug 'ap/vim-css-color'
augroup VimCSS3Syntax
autocmd!
autocmd FileType css setlocal iskeyword+=-
augroup END
◈ hail2u/vim-css3-syntax
◈ ap/vim-css-color
JavaScipt
Plug 'pangloss/vim-javascript'
let g:javascript_plugin_jsdoc = 1
let g:javascript_plugin_ngdoc = 1
let g:javascript_plugin_flow = 1
set foldmethod=syntax
let g:javascript_conceal_function = "ƒ"
let g:javascript_conceal_null = "ø"
let g:javascript_conceal_this = "@"
let g:javascript_conceal_return = "⇚"
let g:javascript_conceal_undefined = "¿"
let g:javascript_conceal_NaN = "ℕ"
let g:javascript_conceal_prototype = "¶"
let g:javascript_conceal_static = "•"
let g:javascript_conceal_super = "Ω"
let g:javascript_conceal_arrow_function = "⇒"
let g:javascript_conceal_noarg_arrow_function = " "
let g:javascript_conceal_underscore_arrow_function = " "
set conceallevel=1
◈ pangloss/vim-javascript
(注:上述脚本中存在特殊字符,有的情况下显示不正确,请直接用上述链接的内容。)
React
Plug 'mxw/vim-jsx'
let g:jsx_ext_required = 0
◈ mxw/vim-jsx
Prettier
Plug 'prettier/vim-prettier', {
'do': 'yarn install',
'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql'] }
let g:prettier#config#bracket_spacing = 'true'
let g:prettier#config#jsx_bracket_same_line = 'false'
let g:prettier#autoformat = 0
autocmd BufWritePre *.js,*.jsx,*.mjs,*.ts,*.tsx,*.css,*.less,*.scss,*.json,*.graphql PrettierAsync
# :Prettier
◈ prettier/vim-prettier
总结
最后,呈上参考配置 .vimrc
Tcpdump 抓包具体分析
Tcpdump抓包分析过程
一、TCP连接建立(三次握手)
过程
客户端A,服务器B,初始序号seq,确认号ack
初始状态:B处于监听状态,A处于打开状态
A -> B : seq = x (A向B发送连接请求报文段,A进入同步发送状态SYN-SENT)
B -> A : ack = x + 1,seq = y (B收到报文段,向A发送确认,B进入同步收到状态SYN-RCVD)
A -> B : ack = y+1 (A收到B的确认后,再次确认,A进入连接状态ESTABLISHED)
连接后的状态:B收到A的确认后,进入连接状态ESTABLISHED
为什么要握手要三次
防止失效的连接请求突然传到服务器端,让服务器端误认为要建立连接。
二、TCP连接释放(四次挥手)
过程
A -> B : seq = u (A发出连接释放报文段,进入终止等待1状态FIN-WAIT-1)
B -> A : ack = u + 1,seq = v (B收到报文段,发出确认,TCP处于半关闭,B还可向A发数据,B进入关闭等待状态WAIT)
B -> A : ack = u + 1,seq = w (B重复发送确认号,进入最后确认状态LAST-ACK)
A -> B : ack = w + 1,seq = u + 1 (A发出确认,进入时间等待状态TIME-WAIT)
经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态
为什么A进入TIME-WAIT后必须等待2MSL
保证A发送的最后一个ACK报文段能达到B
防止失效的报文段出现在连接中
三、Tcpdump使用
tcpdump是对网络上的数据包进行截获的包分析工具,它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来去掉无用的信息。
监视指定主机的数据包
tcpdump host <IP地址>:截获该IP的主机收到的和发出的所有的数据包
tcpdump host <IP地址> and <IP地址>:截获两个IP对应主机之间的通信
监视指定端口的数据包
tcpdump port <端口号>:截获本机80端口的数据包
四、抓包分析握手过程
抓包方法:首先使用tcpdump命令截获本机与某远程主机的数据包,然后打开某远程主机对应的网站,这里用我的域名www.fonxian.cn来做试验。
ping www.baidu.com
得到域名对应的ip:61.135.169.125
ifconfg
得到本机内网ip:10.128.10.24
# -S 参数的目的是获得ack的绝对值,不加该参数,第三次握手的ack为相对值1
sudo tcpdump -S host 192.168.0.108 and 151.101.100.133
得到下图
其中
S 表示是SYN 标记 客户端正准备发起一个请求
客户端发送的seq=3481431827
表示服务器接收到客户端的请求 发给客户端 ack=34814318278 同时发送SYN=421177755
表示客户端接受到服务器的同意连接的请求 发送确认信息 ack=421177756
P 表示数据传输状态
F 表示连接开始断开的状态
表示客户端主动发起断开连接的请求 seq=3481432002, ack=421180537
服务端发起确认请求 ack=3481432003
表示服务端发起断开连接的请求 seq=421180537, ack=3481432003
表示客户端收到服务端发送的断开连接的请求 发送确认信息 ack=421180538
Docker 入门
Docker 入门
Docker 安装
Docker 安装教程
Docker 安装 MySQL
Docker 安装 MySQL
Docker 安装 Redis
Docker 安装 Redis
Centos 7 防火墙常用命令
Centos 7 防火墙常用命令
简介
Centos 7 使用 firewalld 代替了 iptables。firewalld 服务有两份规则策略配置记录,配置永久生效的策略记录时,需要执行 reload 参数后才能立即生效:
permanent: 永久生效的
runtime: 现在正在生效的
查看当前区域
chkconfig iptables off # public
查看防火墙状态
systemctl status firewalld # active/inactive
启动防火墙
systemctl start firewalld
关闭防火墙
systemctl stop firewalld.service # 停止firewalld
systemctl disable firewalld.service # 禁用firewall开机启动
开启端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
重新载入配置
firewall-cmd --reload
查看端口是否生效
firewall-cmd --zone=public --query-port=80/tcp
删除端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
参数及常用命令含义
--zone # 作用域,区域
--add-port=80/tcp # 添加端口,格式为端口/通讯协议
--permanent # 永久生效,没有此参数重启后失效
firewall-cmd --version # 查看版本
firewall-cmd --list-port # 查看所有开放的端口
firewall-cmd --state # 查看防火墙状态
firewall-cmd --reload # 重新载入配置,使新配置的端口规则生效
firewall-cmd --get-zones # 列出支持的zone
firewall-cmd --get-active-zones # 查看所在zone
firewall-cmd --get-services # 列出支持的服务,在列表中的服务时方形的
firewall-cmd --query-service ftp # 查看ftp服务是否支持,返回yes/no
firewall-cmd --add-service=ftp --permanent # 永久开放ftp服务
Spring 官方文档翻译1
开始翻译 Spring 官方文档有四个目的。
白话 Https
最近需要使用到 HTTPS,在学习 HTTPS 时,我发现网上关于 HTTPS 的文章很多都是从 HTTP 开始,逐步引出问题,最终得出 HTTPS 这个解决方案。我决定反其道而行之,先直接解释 HTTPS,再逐步反推回去。
Vue Router 原理分析
Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。
Vuex 学习总结
近几年前端发展迅猛,Vue、Angular、React 等 MVVM 框架兴起,同时 ES6 引入大量新语言特性,而浏览器对这些新东西的支持又十分有限,这就有了 Webpack、Gulp 等构建工具的崛起。
在 Vue 中引入 Less
在 Web 应用开发中,CSS 代码的编写是重要的一部分。CSS 规范从最初的 CSS1 到现在的 CSS3,再到 CSS 规范的下一步版本,规范本身一直在不断的发展演化之中。这给开发人员带来了效率上的提高。不过与其他 Web 领域的规范相似的处境是,CSS 规范在浏览器兼容性方面一直存在各种各样的问题。不同浏览器在 CSS 规范的实现方面的进度也存在很大差异。
Vue.js 使用总结
从参与 Vue.js 项目到现在已经过去两周了。开始时我完全不会 vue,而经过两周的学习和实战,我开发和重写了整个项目20%到30%的前端代码、几乎看完了团队里十几个开发提交的所有代码。现在我几乎熟悉了项目的每行前端代码。可见 Vue 的入门是多么简单。
Gitment 搭建 Comment System
博客最重要的作用除了记录之外,还有分享和交流。而一个没有评论功能的博客,又谈何分享,谈何交流。
Markdown 使用总结
Markdown 可以显著提高写作效率,而这个博客的博文又需要使用 Markdown 来写,所以总结和记录 Markdown 的使用就十分必要了。
在 Mac中搭建 Node.js环境
在 Mac 中安装 Node.js 环境非常简单,因为有 Homebrew 这个包管理神器在,一切都是如此简单高效。
一个博客的诞生
一直都有一个搭建个人博客的想法,却苦于缺乏执行力。