Go笔记二:流程控制

这是我的go语言学习笔记的第二篇,go语言的流程控制。流程控制是计算机语言的基本组成部分。一般的流程控制有顺序,分支,循环。这次来学习一下go语言的流程控制都有哪些,语法是什么样的。

我将会通过以下步骤来入门go语言

1. 变量和数据类型
2. 流程控制方法
3. 函数声明和调用
4. 面向对象
5. 语言特性
6. 标准库

条件分支

go语言的条件分支有: if语句,if…else…语句,switch…case…语句。和大多数语言差别不大!

if 语句语法

// 纯if
if 条件语句 {
    表达式
}

// 带有else 的 if
if 条件语句1 {
    表达式1
} else 条件语句2 {
    表达式2
}

// 带有if else 的if
if 条件语句1 {
    表达式1
} else if 条件语句2 {
    表达式2
} else {
    表达式3
}

Go语言的 if 语句没有括号(for,switch也没有)!习惯了括号的需要反这个习惯!

(更多…)

linux 创建虚拟内存

场景

vps内存不大,编译软件不太够用,因此需要增加虚拟内存。

步骤

使用dd命令创建一个swap文件,大小为1G

dd if=/dev/zero of=/home/swap bs=1024 count=1024000

将文件格式转换为swap格式的

mkswap /home/swap

再用swapon命令把这个文件分区挂载swap分区

swapon /home/swap

为防止重启后swap分区变成0,要修改/etc/fstab文件

vi /etc/fstab

在文件末尾(最后一行)加上

/home/swap swap swap default 0 0

如果要删除交换分区和交换文件,逆着上面的顺序操作:

  1. 先删除/etc/fstab文件中添加的交换文件行
  2. 停用交换文件swapoff /root/swapfile
  3. 删除交换文件rm -fr /root/swapfile

mysql varchar类型探秘

mysql中varchar能够存储可变长度的字符串。过去我做的诸多业务中,一般存储短字符串的需求,都会使用varchar类型,并且定义长度为255,也就是varchar(255)。

不过为了探究varchar这种类型到底是怎么存储的,它的最大长度能达到多少,我决定区翻一下mysql文档学习一下。

varchar怎么存储

经过一番了解,varchar最大能存储的长度为65535字节。存储字符串的时候,会将字符串的长度存在首部,接着才是内容。

当varchar存储的字符个数小于或等于255的时候,首部需要一个字节来记录字符的个数。当内容大于255的字符的时候,首部需要2个自己来保存长度。

varchar能存的最大字符长度

理论上,varchar能够存储65535个字节,但是由于首部会占用两个字节,因此这会让varchar可用的存储空间变成了65533字节。如果定义的列是非空话,那最大是65533,如果定义的列允许NULL,那么null会占用一个额外的字节,因此最大只能存储65532个字节。

字节并不等于字符长度,varchar括号里面跟着的是字符长度,如果字符集是utf8的话,每一个字符统一会占用3个字节的长度,不管是汉子还是英文字符,因此最大能够存储的长度是65533/3 = 21844。如果字符集是utf8mb4那最大存储长度就更小了,为65533/4=16383。

(更多…)

python学习笔记:三、函数

这是第三篇python学习笔记,我们即将要学习python的函数。内容主要包括两个部分,函数的声明和函数的调用。

函数声明和调用

比如我们要声明一个“吃”的函数,语法如下:

def eat():
    return "eat something"
print(eat())

上面是一个没有参数的函数,做的事情很简单,声明一个函数,然后返回一个字符串。接下来要增加一个参数了。

def ead(food):
    return "eat %s" % food
print(eat('fruit'))

可以看到,上面声明了一个带有一个参数的函数,当然可以声明带两个,三个等。这些都是固定的,那么如果要声明一个不固定参数的函数呢?看代码

# 比如下面就是吃一份主食和一些小吃
# 小吃可以是一个,也可以是多个
def eat(food, *snack):
     result = []
     result.append("eat %s\n" % food)
     for i in snack:
         result.append("also eat some %s\n" % i)
     return ''.join(result)
print(eat('rice', 'banana', 'apple'))

参数传递的注意事项

函数的使用很简单,不过在传递参数的时候需要注意一些事情,比如传值和传引用。这中区别在大部分语言中都会存在,python也不例外。由于在python中,一切皆为对象,因此我们称呼这个为传不可变对象和传可变对象。

先用一个例子来说名这个问题

def change(a):
    a = 1
b = 2
change(b)
print(b)
# 结果是2

上面的就是传递不可变对象,不可变对象传入之后会新建一份拷贝,返回新的对象。不可变对象有:整型、字符串、元组。

再看看传可变对象

def change(a):
    a.append(4)
b = [1,2,3]
change(b)
print(b)
# 结果是 [1,2,3,4]

很显然,b被改变了,这相当于传了一个引用,直接修改了原值。常见的可变对象有列表,字典。

默认参数

声明函数的时候可以预定义一些默认参数,比如查询分页的时候,可以默认每一页20条数据,默认根据时间字段,默认倒序。这样既节省函数的记忆成本又不失灵活性。

def query(page, per_page=20, order_by = 'date', order = 'desc'):
     return "query page %d, per page %d order by %s order %s" % (page, per_page, order_by, order)
print(query(1))
# query page 1, per page 20 order by date order desc

函数调用指定参数名称

这是一个非常好的特性,调用函数的时候可以直指定参数的名称,比如我只想更改查询的循序,python中可以直接这样写

print(query(page=1, order='asc'))

而在其他的语言,可能要把所有的参数都写一遍,python这点非常棒!

openssl生成rsa公钥私钥

输入opensslj你如openssl交互界面

OpenSSL>

生成rsa私钥

OpenSSL> genrsa -out private_key 1024
Generating RSA private key, 1024 bit long modulus
………………….++++++
…………++++++
e is 65537 (0x10001)

生成公钥

OpenSSL> rsa -in private_key -pubout -out public_key
writing RSA key

python学习笔记:二、 流程控制

根据如何学习一门新的语言这篇文章的指导,现在的步骤就是学习这门语言的流程控制了。

通常来讲,流程控制有顺序,选择,循环这几种。python也不例外,也有这三种流程控制。下面的一一学习。

顺序

顺序语句很简单,从上往下依次顺序执行。如:

a = 1
b = 2
print(a+b)

上面的语句就是顺序执行的语句。

选择

选择通常使用if和switch,但python中只有if这一个选择语句。语法是:

if 满足条件1:
    语句1
elif 不满足条件1满足1条件2
    语句2
else 都不满足
    语句3

比如用一个实际的例子

a = 1
b = 2
if a > b:
    print('a>b')
elif a < b:
    print('a<b')
else:
    print('a==b')
# 输出的结果是
a<b

if后面的条件可以使用 and 或者 or 组合。

a = -1
b = -2
if a<0 and a>b:
    print('b<0')
# 输出结果
b<0

循环

python中的循环有for … in 和while循环。

for … in 循环语法

for 变量 in 可迭代序列

其中可迭代序列有:字符串,列表,元组,集合。比如用python遍历一个列表

li = ["a","b","c"]
for i in li:
    print(i)
# 输出结果
a
b
c

使用range生成列表,然后用for…in遍历。这个在python中非常常见

for i in range(0,10):
    print(i)

while循环语法

while 满足条件:
    一直执行

比如

a = 0
while a<10:
    a += 1
    print(a)

【十字星】判断十字星线函数trader_cdldojistar的应用

在蜡烛图中,十字形线是一个反转信号,用来判断当前的趋势是否终止。trader扩展中的函数trader_cdldojistar就是一个查找十字星线的函数。

使用方法

trader_cdldojistar ( array $open , array $high , array $low , array $close ) : array

返回的结果是一个数组,值有-100,100和0。-100表示这是一个底部十字星,100表示这是一个顶部十字星。0表示这不是一个十字星线。

以沪深300最近2年的数据来举例,使用这个函数得到的十字星线有这么一些。

把这些十字星线放在k线图,我们会发现,十字星线的预示效果要比锤子线好一点。比如在17年11月22日,出现了一个大大的十字星,后面就一路暴跌。2018年2月24日出现了一次顶部十字星线,后面依然是暴跌。

有兴趣的朋友可以根据上面跑的十字星线数据对比一下,会发现十字星这种形态准确率是非常高的。特别是在十字星出现的前一天是涨的形态,出现十字星后面暴跌的概率非常大。反过来,前面暴跌出现十字星,后面暴涨的概率则不大了。

【锤子线】判断锤子线函数trader_cdlhammer的应用

在蜡烛图技术中,锤子线是一个有效的指标,能预测趋势的反转,详情见锤子线。通过肉眼去观察锤子线不仅费力而且容易出现主观因素导致的错误,php中的trader扩展中的trader_cdlhammer就能判断当前是否是锤子线。

使用方法

trader_cdlhammer ( array $open , array $high , array $low , array $close ) : array

$open 指的是开盘价数组

$high 指定是最高价数组

$low 指的是最低价数组

$close 指的是收盘价数组

返回的是一个一维数组,是锤子线值为100,不是锤子线值为0.

使用举例

拿沪深300举例子,跑出最近两年的锤子线如下。

经过对比,发现这个函数是别的锤子线效果并不是那么好,很难区分是锤子还是上吊线,比如9月10号的判断为锤子线,实际上已经是上吊线了。

比如8月29号的锤子线,其实这是一个正在上涨期间出现的形态,并不符合下跌过程中出现的锤子线的定义。

经过实验发现,锤子信号并不是一个很有效的信号。有兴趣的朋友可以根据上面跑出的数据去历史的k线图去验证。

ubuntu apt 更换为国内源

安装软件的时候,默认的源速读太慢,更换为国内的源吧!更换之前首先备份一下。

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

将国内的源粘贴到 /etc/apt/sources.list

vim /etc/apt/sources.list

下面是阿里的源,粘贴即可。

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

另外可选择的还有几个比较好的源。

清华的源

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

替换完毕执行apt-get update更新即可。