基本排序算法

一、冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名

算法原理

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1
2
3
4
5
6
7
def bubble_sort(list):
length = len(list)
for i in range(length):
for j in range(1, length-i):
if list[j-1] > list[j]:
list[j-1], list[j] = list[j], list[j-1]
return list

二、冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名

算法原理

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1
2
3
4
5
6
7
def bubble_sort(list):
length = len(list)
for i in range(length):
for j in range(1, length-i):
if list[j-1] > list[j]:
list[j-1], list[j] = list[j], list[j-1]
return list
Comments

升级站点php版本到7.2.1

php7已经问世两年多了,都说性能提升了不少,可开发一直在使用php5.6,最近考虑把自己站点的php版本升级一下,目前站点的php版本是5.6.31

1
2
3
4
5
~$ php -v
PHP 5.6.31 (cli) (built: Sep 14 2017 18:12:46)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

php download目前官网的稳定版本是7.2.1,下面记录下升级过程

Read More

Comments

mysql 分页数据重复

BUG mysql分页数据偶尔有重复

解决:在sql语句中使用了order by field,其中filed字段非id,数据有重复导致分页数据偶尔会重复,再增加order by id可以解决,参考stackoverflow
以及 stackoverflow

Comments

php 502

记录一次bug查找经历

起因

偶然间打开一个以前的项目,浏览器显示 502 Bad Gateway,最开始以为php-fpm没有启动,后来发现不是这个原因

排查过程

  1. nginx、php-fpm都服务正常
  2. 配置无误,访问root目录下的html文件都能正常访问,php文件都是502,定位到php-fpm出问题
  3. 查看nginx错误日志,报错信息(我电脑php-fpm监听的9011端口)

    1
    [error] 16914#16914: *1314340 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: ****, server: ****, request: "GET **** HTTP/1.1", upstream: "fastcgi://127.0.0.1:9011", host: "zhouyanbo.com"
  4. 检查php-fpm.log文件(一般位置在/var/log/php-fpm/error.log),没有错误信息,修改/etc/php-fpm.d/www.conf配置

    1
    catch_workers_output = yes
  5. 重新请求查看php-fpm.log日志,报错

    1
    [pool www] child 31776 said into stderr: "ERROR: Connection disallowed: IP address '127.0.0.1' has been dropped."
  6. 最后修改/etc/php-fpm.d/www.conf配置,原来是any改为127.0.0.1

    1
    listen.allowed_clients = 127.0.0.1
  7. 重启能正常访问

疑问

按道理说listen.allowed_clients = any也是能正常访问的,any包括了所有,但是莫名其妙会出现502的问题,暂时修改为127.0.0.1能正常访问了,以后有时间再研究下,先做下记录

Comments

nginx 反向代理配置

条件

两台能互相通讯的服务器,一台内网地址192.168.1.100,另外一台192.168.1.101,192.168.1.100服务器上设置反向代理,当用户访问地址时,转发到192.168.1.101服务器上

服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;

server_name www.zhouyanbo.com;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://192.168.1.101:8080;
}
}

192.168.1.101服务器上正常配置站点

Comments

ngrok服务器搭建

记录ngrok的安装过程

准备

  1. 一台linode服务器,系统 Centos 7 amd64
  2. 一个公网域名 zhouyanbo.com

一、安装软件

1. 安装gcc
1
yum install gcc
2. 安装go环境

下载最新的go版本

1
wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz

解压

1
tar -C /usr/local/ -zxvf go1.9.2.linux-amd64.tar.gz

Read More

Comments

Qt creater

Qt Creator 包括项目生成向导、高级的 C++ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等

最近空闲时间在看python相关的资料,基础部分大致看了下,自己用python写了几个小程序,都是些文件、字符串的操作,接下来想用Python做一些小的桌面程序,就有了下面的一段故事

查阅一些资料最后决定使用pyqt5来做开发

开发环境

  1. 系统 Mac OS X EI
  2. Qt5.9.2
  3. Qt creater4.4.1

初始想法是做一个计算器桌面程序,软件安装完毕之后,打开Qt creater配置qt version,构建套件就用默认的桌面就行,按照教程创建项目,最后进入主界面,
发现项目下只有一个demo.pro文件,打开demo.pro文件所在的文件夹,发现.ui、
.cpp、.h文件都没显示出来,也不能正常运行,小白第一次接触不知道啥原因,遂Google,各种方式搜索,大概找了大半天时间的资料,没有发现有相同问题的同学,未果,搁置

第二天到公司做完工作上的任务继续搜资料,偶然看到一句话

编译器建议选择mac的clang编译器,使用苹果自带的编译器,程序运行会相对稳定些,避免平台带来的差异。

于是去偏好设置中改了下编译器,改成了自带的clang编译器(原来用的gcc),保存,神奇了,项目文件都显示出来了,并且也能正常运行了,对于刚接触Qt的我来说还不知道为啥,等有时间深入了解下吧,目前只想用来布局一个界面

Comments

处理TIF、EPS图片

工作中需要处理图片,格式包括png、jpg、svg、gif、tif、eps,等等。。。 前面几种还知道
第一次听说还有tif、eps格式的图片,看来还是见识少啊

在网上找资料发现很少有处理这两种格式的图片的,尤其是eps,最后找到imagemagick,看了介绍之后觉得真是功能强大啊,无所不能

具体安装及使用方法见官网

使用过程中发现用convert命令对tif图片处理时,会在目录下生成不止一个图片

1
convert -resize 200 image.tif target_path

查资料发现tif是有图层的,一个tif图片可能会有多个layer,如果只要想生成一个图片的话,修改命令如下

1
convert -resize 200 image.tif[0] target_path
Comments

记录一次找bug经历(一)

起因

A:发现一个bug
B:什么bug
A:我们项目中(测试环境)有个接口时间会自动跟着更新时间变动,但是在本地测试是好的
B:详细描述下呢
A:有个发布动态的功能,其中有发布时、更新时间、新闻时间三个字段,当在后台通过审核后,新闻时间会跟着更新时间一起变
B:有没有检查代码有什么不同呢
A:检查过了,本地跟线上的代码版本一致
B:有没有考虑过哪里出了问题
A:看一下线上的数据表吧,感觉数据表有问题
B:当时更新数据表是跟本地同步的啊,不能出问题啊,等我有时间看下吧

解决过程

由于当时忙,想了下,没想到啥原因,简单看了下代码,确实没问题,暂时放一放了,晚上找到运维看了下线上数据库

1
时间字段 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

what??? 不知道怎么这个字段加了在更新的时候修改为当前时间,今后要注意这种小细节,好在这次找bug的时间没有很长

总结

当把数据表字段设置成 dafault CURRENT_TIMESTAMP 会在数据插入的时候,自动设置成当前时间

数据表中时间字段更新的方法
  1. 在代码中更新字段

  2. 设置字段的Extra列on update CURRENT_TIMESTAMP

  3. 设置mysql定时任务

Comments

install centos 7 failed

起因

最近公司新购几台服务器,需要先装好系统再拿到机房,前面两台430服务器安装系统都很顺利,在安装第三台730XD的时候报错failed to start switch root

解决

经过检查,是由于找不到U盘加载不到镜像导致这个错误,730服务器上三个USB插孔(前面一个后面两个),不知道前后有什么区别

方案

  • 在启动界面,按e进入编辑模式,
  • 修改启动参数 vmlinuz initrd=initrd.img linux dd quiet
  • 重启会列出所有磁盘,包括U盘盘符,一般U盘会是/dev/sdb,或者/dev/sda,但是我发现这次U盘是/dev/sdc4
  • 接着重启,重新进入编辑模式,修改启动参数 vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdc4 quiet 根据实际情况修改盘符
  • ctrl + x 执行就能顺利看到安装界面
Comments