posts


蓝灯 Lantern 邀请码

June 26, 2020

蓝灯 Lantern 邀请码 使用方法 购买或者激活蓝灯(Lantern)专业版的时候,输入邀请码 YGN5ZYJ 可获赠三个月专业版。 邀请码 YGN5ZYJ

开发配置

June 25, 2020

开发配置 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 神器的详细使用

June 24, 2020

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 抓包具体分析

June 24, 2020

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 入门

June 23, 2020

Docker 入门 Docker 安装 Docker 安装教程 Docker 安装 MySQL Docker 安装 MySQL Docker 安装 Redis Docker 安装 Redis

Centos 7 防火墙常用命令

June 23, 2020

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

October 26, 2019

开始翻译 Spring 官方文档有四个目的。

白话 Https

September 25, 2019

最近需要使用到 HTTPS,在学习 HTTPS 时,我发现网上关于 HTTPS 的文章很多都是从 HTTP 开始,逐步引出问题,最终得出 HTTPS 这个解决方案。我决定反其道而行之,先直接解释 HTTPS,再逐步反推回去。

Vue Router 原理分析

September 27, 2018

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。

Vuex 学习总结

September 16, 2018

近几年前端发展迅猛,Vue、Angular、React 等 MVVM 框架兴起,同时 ES6 引入大量新语言特性,而浏览器对这些新东西的支持又十分有限,这就有了 Webpack、Gulp 等构建工具的崛起。

在 Vue 中引入 Less

September 09, 2018

在 Web 应用开发中,CSS 代码的编写是重要的一部分。CSS 规范从最初的 CSS1 到现在的 CSS3,再到 CSS 规范的下一步版本,规范本身一直在不断的发展演化之中。这给开发人员带来了效率上的提高。不过与其他 Web 领域的规范相似的处境是,CSS 规范在浏览器兼容性方面一直存在各种各样的问题。不同浏览器在 CSS 规范的实现方面的进度也存在很大差异。

Vue.js 使用总结

September 02, 2018

从参与 Vue.js 项目到现在已经过去两周了。开始时我完全不会 vue,而经过两周的学习和实战,我开发和重写了整个项目20%到30%的前端代码、几乎看完了团队里十几个开发提交的所有代码。现在我几乎熟悉了项目的每行前端代码。可见 Vue 的入门是多么简单。

Gitment 搭建 Comment System

September 01, 2018

博客最重要的作用除了记录之外,还有分享和交流。而一个没有评论功能的博客,又谈何分享,谈何交流。

Markdown 使用总结

August 27, 2018

Markdown 可以显著提高写作效率,而这个博客的博文又需要使用 Markdown 来写,所以总结和记录 Markdown 的使用就十分必要了。

在 Mac中搭建 Node.js环境

August 26, 2018

在 Mac 中安装 Node.js 环境非常简单,因为有 Homebrew 这个包管理神器在,一切都是如此简单高效。

一个博客的诞生

August 26, 2018

一直都有一个搭建个人博客的想法,却苦于缺乏执行力。