Leo的技术分享

记录开发的点滴

最近在对开源配置中心进行调研。当前流行的开源配置中心包括 Apollo,Nacos,以及 Disconf。Apollo 应该是当前最流行,所以写篇文章来记录 Apollo 的安装与使用。

Apollo 是携程开源的分布式配置中心,能够集中化管理不同环境,不同集群的配置,配置修改后能够实时推送到应用,并且具备权限治理功能。

本文讲述如何快速搭建开发或者测试使用 Apollo 配置中心。如果需要在生产环境正式使用,可以参考链接 Apollo 分布式部署指南

安装 Apollo

由于使用 Docker 安装 Apollo 相对于普通安装更简单和快捷,因此推荐由于 Docker 来安装 Apollo,以便于快速了解和使用 Apollo。

1. 下载源代码

使用 git clone 下载最新的 Apollo 源代码到本地。

1
git clone https://github.com/ctripcorp/apollo.git

2. 启动配置中心

下载 Apollo 源代码后,可以看到 Script 目录下包含 docker-quick-start 目录, docker-quick-start 目录如下:

其中 docker-compose.yml 文件由 docker-compose 使用,用来定义启动 Apollo 所依赖的镜像。其依赖的 apollo-quick-start 镜像在 dockerhub 可以看到其 Dockerfile,里面定义了如何启动 Apollo。

进入 docker-quick-start 目录,然后使用 docker-compose 启动 Apollo 配置中心。

阅读全文 »

上段时间测试人员对某个服务端程序进行了性能压力测试,发现当使用 JMeter 向程序并发发送 100 个请求后,再发送请求,则会出现程序无法响应的现象。想着这个问题比较棘手,就拖了不少时间。最近其他事情少了点,可以专心下来优化这个程序的性能,就着手开干了。

利用 Wireshark 和 Python 构造请求报文

客户端对向发送的请求报文进行了加密,且密钥存在过期时间。为方便构造请求报文,我们使用了 Wireshark 对请求报文进行抓包,然后直接将抓取的报文由 Python 程序发送。

我们先在 Wireshark 对过滤条件进行配置,服务端程序的监听端口为 5111,故配置tcp.dstport==5111 的过滤条件。
然后使用客户端向服务端程序发送请求,可以看到 Wireshark 显示出相应的请求报文:
在这里插入图片描述

右键报文,选择显示分组字节,显示为C数组

在这里插入图片描述

由于 JMeter 使用不多,并不太熟悉 JMeter 的使用,故这里使用 Python 来模拟客户端向服务端程序发送请求。
将相应的报文数据拷贝到 Python 程序,即可模拟客户端向服务端程序发送请求。为节省篇幅,Python 代码只截取了部分 msg 请求数据。

阅读全文 »

RTO 和 RPO 都是企业灾难恢复(Disaster Recovery, DR)需要考虑的关键指标,这两个指标可以用来指导企业来制定合适的业务系统服务或数据的恢复方案。

本文介绍 RTO 和 RPO 的概念以及区别。

图:RPO(Recovery point objective) 和 RTO(Recovery time objective)是提供业务连续性的关键指标

阅读全文 »

FOR LOOP 介绍

为了对游标进行遍历,可以使用 FOR LOOP 语句实现,语法如下:

1
2
3
4
FOR record IN cursor_name
LOOP
process_record_statements;
END LOOP;

对游标进行 FOR LOOP 遍历时,省去了 %ROWTYPE 的声明,循环每次从查询结果中取出一行结果,当取完后,跳出循环。

1) record

recordFOR LOOP 语句隐式创建的 %ROWTYPE 类型变量,用于表示对游标遍历中的每一行记录。record 变量只可以用于 FOR LOOP 语句内部。

2) cursor_name

cursor_name 是显式创建的游标名称。FOR LOOP 语法除了使用显式创建的游标外,还可以直接使用 SELECT 语句来实现对游标进行遍历。

1
2
3
4
FOR record IN (select_statement)
LOOP
process_record_statements;
END LOOP;

在此用法下,FOR LOOP 将进行隐式的创建游标,打开游标,获取记录,关闭游标等操作。

阅读全文 »

由于工作需要,现在也开始写一些复杂一点的 sql 了。由于之前对于 joinwhere 关键字的使用一直有疑惑,故写一篇文章整理一下,算是对 sql 中各种表联结使用的一个总结。

SQL JOIN 的作用

sql 关键字 unionintersect 属于以行方向为单位的集合运算,进行这些集合运算时,会导致记录行数的增加或减少。
关键字 join 则是属于列方向的运算,将其他表中的列添加过来。我们称这种操作为联结。
sql 联结根据其用途可以分为多种,这里主要讲述内联结与外联结。

INNER JOIN

内联结,inner join,是使用最广泛的联结运算。我们以例子来说明内联结的含义。

student 表结构与记录以下:

student_id student_name
1 Leo
2 Lee
3 Hao

score 表结构与记录以下:

student_id student_score
1 89
2 95

可以看到 student_id 列存在于 student 表和 score 表,其他列则只存在于一张表。可以将 student_id 列作为桥梁,将两表满足同样条件的列汇集到同一结果之中,这就是联结运算。

可以看到,学生 Leo 的 id 为 1,分数在 score 表,Leo 的分数为 89 分。学生 Lee 的 id 为 2,分数为 95。学生 Hao 的 id 为 3,但 score 表中没有 Hao 的分数。

使用 inner joinstudent 表和 score 表进行联结,sql 以下所示:

1
2
3
select st.student_id, st.student_name, sc.student_score
from student st
inner join score sc on st.student_id = sc.student_id;

执行 sql 结果如下所示。

阅读全文 »

贝叶斯公式有着广泛的应用。最近重新拿起上学时的教科书——浙大《概率论与数理统计(第三版)》,复习了一遍全概率公式与贝叶斯公式,算是捡起了一些记忆。
本文从条件概率出发,推导出全概率公式以及贝叶斯公式,并以例子说明贝叶斯公式的应用。

条件概率

条件概率研究如何计算事件 $A$ 已发生的条件下事件 $B$ 发生的概率。
例如,将一枚硬币抛掷两次,观察其出现正反面的情况,设事件 $A$ 为“至少一次为正面”,事件 $B$ 为“两次掷出同一面”。求已知事件 $A$ 已经发生的条件下事件 $B$ 发生的概率。
我们以 $H$ 表示硬币掷出正面, $T$ 表示硬币掷出反面,则上述随机试验的样本空间为 $S={HH, HT, TH, TT}$,$A={HH,HT, TH}$,$B={HH,TT}$。由于已知事件 $A$ 已经发生,即已知试验所有可能结果所组成的集合就是 $A$,$A$ 中共有 3 个元素,其中只有 $HH \in B$。因此,在 $A$ 发生的条件下 $B$ 发生的概率(记为 $P(B|A)$)为

$$
P(B|A) = \frac{1}{3}
$$

另外,我们易知

$$
P(A)=\frac{3}{4}, P(AB)=\frac{1}{4}, P(B|A)=\frac{1}{3}=\frac{1/4}{3/4}
$$

其中,$P(AB)$ 为事件 $A$ 与事件 $B$ 同时发生的概率。

一般地,

$$
P(B|A) = \frac{P(AB)}{P(A)}
$$

乘法定理

由条件概率的计算公式,可以得到

$$
P(AB) = P(A)P(B|A)
$$

上式可以推广到多个事件的积事件,即

$$
P(ABC) = P(AB)P(C|AB)=P(A)P(B|A)P(C|AB)
$$

阅读全文 »

CLion 是 JetBrains IDE 全家桶产品之一,可以用来开发 C/C++ 项目,而 GDB 则可以用来对 C/C++ 程序进行调试。
作为一款调试器,GDB 为程序开发人员提供了强大的调试功能,但却需要使用命令来执行调试操作,操作起来不是很方便。(有关 GDB 的使用,可以参考文章《GDB 调试》。)为此,CLion 为程序开发人员提供了图形化的调试界面以方便调试。另外,CLion 还提供了远程调试的功能。因为在实际项目中,我们常会碰到在本地开发环境编写代码,程序却在远程机器运行的情况。远程调试功能对我们来说是十分必要的。

本文讲述如何使用 CLion 来实现远程调试。

环境准备

假设本地开发环境是 Windows 操作系统,程序远程执行环境是 CentOS 操作系统。为满足远程调试,需要在 CentOS 上安装必要的软件,安装的软件包括:

  • cmake
  • gcc
  • gdb
  • gdbserver

安装命令如下:

1
2
3
4
yum install cmake -y
yum install gcc-c++ -y
yum install gdb -y
yum install gdb-gdbserver -y

cmake 用于管理编译过程,生成 Makefile 文件;gcc-c++ 是编译器;gdb 是个调试工具,程序调试功能实际上就是由 gdb 提供的;gdbserver 用于监听某个 TCP 端口,允许远程主机连接,以实现远程调试功能。

至于本地开发环境,Windows 操作系统上安装好最新版本的 CLion ,以笔者为例,当前 CLion 最新版本为 2018.3。

代码同步

使用 CLion 创建一个 C++ 项目 helloworld。然后,打开菜单 Tools - Deployment - Configuration,配置远程主机以及本地目录与远程目录的映射关系:

阅读全文 »

之前一直好奇债券的价格是如何确定的,最近查阅了一些资料,对债券的价格有了初步的了解。这篇文章记录对于债券价格的学习笔记。

一、背景知识

1.1 货币时间价值

货币时间价值是指货币随着时间的推移而发生的增值。衡量货币时间价值大小的指标即是利率。

1.2 终值

终值用来表示货币时间价值的概念。已知期初投入的现值为 $PV$,求将来第 $n$ 期期末的终值 $FV$,也就是求第 $n$ 期期末的本利和,年利率 $i$。资金的时间价值一般都是按复利方式进行计算。
第 $n$ 期期末终值的一般计算公式:

$$
FV = PV \times (1+i)^n
$$

其中,$FV$ 表示终值,即在第 $n$ 年年末的货币终值,$n$ 表示年限,$i$ 表示年利率,$PV$ 表示本金或现值。

1.3 现值

现值即现在值,是指将来货币金额的现在价值。由终值的一般计算公式 $FV=PV \times (1+i)^n$ 转换成求 $PV$,可以得到现值的计算公式:

$$
PV = \frac{FV}{(1+i)^n}
$$

将未来某时点的价值折算为现在时点的价值称为贴现,上式中利率 $i$ 也被称之为贴现率

二、债券估值

债券估值用于计算债券的内在价值,债券的价值或内在价值是指债券未来现金流入量的现值,即债券各期利息收入的现值加上债券到期偿还本金的现值之和。只有债券的内在价值大于购买价格时,才值得购买。
债券估值遵循以下原则:

金融证券的价值 = 预期未来现金流量的现值

阅读全文 »

之前一直好奇大学里老师的那种看起来很专业的幻灯片是怎么制作的,只是知道他们使用 TeX 而一直没有动手实践。本着绝知此事要躬行的精神,决定动手实践一把。
由于在家主要使用 Mac 电脑,故本文讲述如何在 Mac OS 制作 LaTeX 幻灯片。

一、安装 MacTeX

MacTeX 是 TeX Live 的 Mac 版本,可以在 http://tug.org/mactex/ 查看 MacTeX 的最新消息,MacTeX 当前的最新版本是 2018 版。下载 MacTeX.pkg 即可进行安装。
MacTeX 安装好后,会生成以下的软件:

打开 TeXShop,进行 LaTeX 的编辑界面,输入以下代码:

1
2
3
4
5
6
\documentclass{article}
\usepackage{xeCJK}
\begin{document}

你好, \LaTeX!
\end{document}

点击“排版”,便可以输出 pdf 文档:

阅读全文 »

最近需要将原来使用阿里云 OSS 的程序模块改成使用公司内部搭建的文件服务器,由于目前使用的文件不多,且都是一些小文件,经过对比后,决定采用 Samba 来实现文件服务器。

Samba 是一个程序的集合,包括服务器与客户端程序,它允许在 Linux 与 Windows 实现共享文件的功能。本文先讲述如何在 CentOS 7 下安装与配置 Samba,然后讲述如何使用 Java 来实现 Samba 客户端以上传与读取文件。

Samba 安装

CentOS 平台下可以直接使用 yum 来安装 Samba 服务器以及客户端。

1
# yum install samba samba-client 

Samba 安装好后,就可以启动操作。

1
# service smb start

如果需要关闭,则使用命令:

1
# service smb stop

如果需要查看 smb 运行状态,可以使用命令:

1
# service smb status

Samba 配置

安装好 Samba 后,就可以对 Samba 进行配置了。

我们先使用以下命令添加 Linux 组 leehao 和用户 leehao。

1
2
# groupadd leehao
# useradd -g leehao leehao

接下来使用smbpasswd命令来创建 Samba 的用户:

1
# smbpasswd -a leehao

输入 Samba 用户 leehao 的密码。

Samba 的默认配置文件是/etc/samba/smb.conf。打开 smb.conf 文件,添加以下配置:

阅读全文 »
0%