dichotomy-recursive

二分法作为比较基础的算法,虽然工作中不常使用,但是作为编程基础,还是很有必要整理下的,下面是二分法递归版本的代码,记录在blog,以备后面查看温习。

Code

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
#include <stdio.h>

// 采用递归方法
int BSearch(int d[], int target, int low, int high)
{
int m;
if (low <=high)
{
m = (low + high)/2;
if (d[m] > target)
{
return BSearch(d, target, low, m-1);
}
else if (d[m] < target)
{
return BSearch(d, target, m+1, high);
}
else
{
return m;
}
}
return -1;

}

int main(int argc, char *argv[])
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int c = BSearch(a, 5, 0, 10);
printf("index:%d\n", c);
}

Compile and Run

1
2
3
gcc main.c -o main
./main
index:4

Dichotomy

二分法作为比较基础的算法,虽然工作中不常使用,但是作为编程基础,还是很有必要整理下的,下面是二分法的一个版本的代码,记录在blog,以备后面查看温习。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

int BSearch(int d[], int target, int low, int high)
{
int m;
while (low <= high)
{
m = (low + high) / 2;
if (target < d[m])
high = m - 1;
else if (target>d[m])
low = m + 1;
else
return m;
}
return -1;
}

int main(int argc, char *argv[])
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int c = BSearch(a, 5, 0, 10);
printf("index:%d\n", c);
}

Compile and Run

1
2
3
gcc main.c -o main
./main
index:4

flask-websocket-bad-Request

最近项目中使用了websocket,后台使用flask,所以就使用了flask_socketio这个库,使用起来也比较方便,在github中找到库的项目,
源码中附带的例子就可以直接使用跑起来。项目中遇到的问题记录如下。

400 bad requests

客服端的网页请求到后台的socket.io,返回信息是400 bad requests。刚开始测试使用的是flask_socketio自带的demo,请求后台的首页,
在页面中进行web socket测试,一切正常。后来查阅资料,才知道是跨域的问题。demo中请求的是后台的页面,不存在跨域。客户端的网页有自己
的地址,然后跨域请求后台,就牵扯到了跨域问题。修改方法如下:

1
socketio = SocketIO(app, async_mode=async_mode,cors_allowed_origins="*")

flask login

最近手上有个项目使用了flask_security这个模块进行用户的登陆注册,后台主要自己使用,放在公网上怕有人随意注册,所以就准备关闭注册接口。关闭注册,有两个地方需要修改。

关闭注册节点

在代码中添加

1
app.config['SECURITY_REGISTERABLE'] = False

在web页面去掉注册按钮

一般登陆页面会存在注册的进入入口,登陆页面一般是模板提供,所以就需要重写模板,重新模板的方法如下:

  1. Create a folder named security within your application’s templates folder
  2. Create a template with the same name for the template you wish to override

mysql优化

之前对于mysql出在一个会用能用的阶段,最近有个项目因为并发的原因,导致cpu使用率很高,系统很卡,这几天通过设计优化和mysql优化初步
解决了卡顿的问题。记录一下初步心得,后续有进步持续增加输出。

设计优化

对于并发数高的系统,查询频繁的表项,设计上可以放到缓存中的,建议就放到缓存中,比如redis。我在项目优化中,起初将一个170万条表项的数据放在了mysql中,大量的查询,就把数据库的使用率拉的很高,优化之后,效果明显。

mysql优化方向

  1. 增加索引
    频繁查询的字段建议增加索引,可以明显提高查询速度

  2. 最小值最大值查询比较
    对于匹配最小值最大值比较,建议通过order by 方式查询,然后在代码之中进行判断比较,对于性能提升有一定的帮助。

mysql优化定位

初步接触mysql优化,我从最开始的一脸懵逼,到现在有了初步了解,先把这几天学习到的技巧记录如下。

  1. 查看运行的线程
1
MariaDB [xxdb]> show processlist;

如果开着web-server,默认就会有tcp的链接.
show processlist 显示的信息都是来自MySQL系统库 information_schema 中的 processlist 表。所以使用下面的查询语句可以获得相同的结果:

1
MariaDB [xxdb]> select * from information_schema.processlist
  1. 查看执行的命令
1
2
MariaDB [xxdb]> select * from information_schema.`PROCESSLIST` where info is not null;
MariaDB [xxdb]> select * from information_schema.processlist where Command != 'Sleep' order by Time desc;

查看当前执行的现场,并排序,可以找到比较耗时的命令,进一步进行优化。

  1. 开启慢查询日志记录
1
2
MariaDB [xxdb]> show variables like "%slow%";
MariaDB [xxdb]> show variables like 'long_query_time';

上述命令是查询慢查询的配置,可以打开慢查询。
打开慢查询

方法一:全局变量设置

将 slow_query_log 全局变量设置为“ON”状态

1
MariaDB [xxdb]> set global slow_query_log='ON';

设置慢查询日志存放的位置

1
MariaDB [xxdb]> set global slow_query_log_file='/var/log/mariadb/mysql-slow.log';

查询超过1秒就记录

1
MariaDB [xxdb]> set global long_query_time=1;

方法二:配置文件设置

修改配置文件my.cnf,在[mysqld]下的下方加入

1
2
3
4
[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1

重启mysql或者mariadb.

1
# systemctl restart mariadb

测试慢查询
1.执行一条慢查询SQL语句

1
MariaDB [xxdb]> select sleep(3);

2.查看是否生成慢查询日志

1
# ls  /var/log/mariadb/mysql-slow.log

如果日志存在,MySQL开启慢查询设置成功!

mysql性能查看工具

这几天上线一个项目,并发数大概有1000,导致mysql性能很差。性能调优这块刚刚接触,很多参数都是懵逼的状态,所以找了两个工具:mytop 和doDBA,两个工具都不错,可以将mysql的状态信息实时显示出来,方便查看。

1. mytop

安装

1
2
3
$ sudo yum install epel-release
$ sudo yum install mytop
$ sudo vi /root/.mytop

添加信息如下:

1
2
3
4
5
6
7
8
host=localhost
db=mysql
delay=3
port=3306
socket=
batchmode=0
color=1
idle=1

最后执行命令:

1
# mytop

2. doDBA

安装

1
2
3
#  wget https://raw.githubusercontent.com/dblucyne/dodba_tools/master/doDBA --no-check-certificate
# wget https://raw.githubusercontent.com/dblucyne/dodba_tools/master/doDBA.conf --no-check-certificate
# chmod +x doDBA

编辑doDBA.conf 文件,填入mysql信息。
执行命令:

1
#  ./doDBA -h '127.0.0.1' -mysql

下一步好好研究一下各个参数的含义。

本地仓库推送到远程仓库

在工作中有个项目仓库是建在公司服务器,远程pull或者push都是通过虚拟局域网进行,偶尔会出现虚拟局域网不太稳定的情况,所以准备将仓库直接推送到github,正好github也推出了个人私有仓库免费项目。

新建仓库

在github中新建仓库,直接在网页操作即可。提醒:千万不要添加说明文件,空的仓库即可。

添加远程地址

在本地添加github远程仓库地址,例如:

1
$ git remote add github https://github.com/shan3275/xxx.git

推送当前分支

直接将当前分支推送到远程空仓库

1
$  git push -u github master

说明如果想要本地分支和远程分支名字不同,可以执行如下命令:

1
$  git push -u github 本地分支名字:远程分支名字

查看本地分支和远程分支的对应关系,可以执行如下命令:

1
$  git branch -vv