csensix 发布的文章

Python实现二分查找

前提:一个有序的列表
原理:假如我们心里默念一个1-100的数字,让别人猜,那么怎么猜会比较快呢?(1)从1开始往后猜,那么最坏的情况可能要猜100次;(2)每次都猜剩下数字列表的中间那个数,这样每次都可以排除一半,平均情况下,这种方法比第一种要快。
第二种方法也就是下面的二分查找算法(Python实现)。
时间复杂度:O(log2n)。

# -*- coding: UTF-8 -*-
# 二分查找 binary_search.py

def binary_search(list, item):
  low = 0
  high = len(list)-1  

  while low <= high:
    mid = (low + high) // 2
    guess = list[mid]
    if guess == item:
      return mid
    if guess > item:
      high = mid - 1
    else:
      low = mid + 1
  return None

my_list = [1, 3, 5, 7, 9]

print binary_search(my_list, 9) #结果:4
print binary_search(my_list, -1) #结果:None

以上代码只适用于没有重复数据的列表,如果列表中有重复的数据,我们要查找左边界或右边界,又该如何呢?在参考了 详解二分查找算法 之后,得出了一下代码供大家参考:

#  寻找左侧边界
def left_bound(list, item):
    left = 0
    right = len(list)

    while (left < right):
        mid = (left + right) // 2
        if item == list[mid]:
            right = mid
        elif item > list[mid]:
            left = mid + 1
        elif item < list[mid]:
            right = mid
    
    # 考虑越界问题
    if left == len(list):
        return -1

    if list[left] == item:
        return left
    else:
        return -1


#  寻找右侧边界
def right_bound(list, item):
    left = 0
    right = len(list)

    while (left < right):
        mid = (left + right) // 2
        if item == list[mid]:
            left = mid + 1
        elif item > list[mid]:
            left = mid + 1
        elif item < list[mid]:
            right = mid
    
    # 考虑越界问题
    if left == 0:
        return -1
    if list[left - 1] == item:
        return left - 1
    else:
        return -1

nginx 配置图片文件等过期时间,禁止日志记录

查看nginx日志文件,发现有大量图片请求的日志,其实这种日志我们并不需要,所以考虑禁止此类文件的日志文件生成,方法如下:

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log off;
    }
    
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log off; 
    }

Apache禁止非法域名(未绑定域名) 访问服务器

针对Apache2.4.1 以前的版本


NameVirtualHost *:80 # 非常重要的虚拟主机设置,如果忽略此处,则特定主机设置无法生效。

# 直接拒绝所有非法域名
<VirtualHost *:80>
  ServerName *
  ServerAlias *
  <Location />
    Order Allow,Deny
    Deny from all
  </Location>
  ErrorLog "logs/error.log"
  CustomLog "logs/error.log" common
</VirtualHost>

针对Apache2.4.1 以后的版本

http2.4.1 以后不再需要NameVirtualHost以及不再支持ServerName * 这种写法。
使用ServerName 会报Invalid ServerName “” use ServerAlias to set multiple server names。
<VirtualHost *:80>
  ServerName 服务器ip
  ServerAlias *
  <Location />
    Order Allow,Deny
    Deny from all
  </Location>
</VirtualHost>

百度编辑器 ueditor 增加缩略图及水印功能

Ueditor默认是不带水印功能的,但有时候网站运营需要编辑器自带水印来提高工作效率,于是我也试着摸索出了一套方法。在实现我自己的方法之前,也看了其他人的实现方法:修改 Uploader.class.php,新增水印方法,网上能找到的基本都是这类方法(参考链接),其实也挺好,只是过程稍显复杂,我希望能更简单些。

在仔细研究了ueditor关于图片上传部分的代码后,我发现,只需要在php文件返回json数据之前对原图片进行处理即可实现水印功能,代码如下:

在此要特别感谢 PicThumb.class.php 作者,这是一个开源图片处理库,包括缩放、裁剪、水印等,使用起来方便简单,我的方法里就引用了该文件
// 文件路径 ueditor/php/action_upload.php
// ...
require /path/to/PicThumb.class.php;
// ...

$fileinfo = $up->getFileInfo();

/*
 * 水印处理
 */
// 判断是图片上传(包括单图和多图),不是视频、文件
if (htmlspecialchars($_GET['action']) == 'uploadimage') {
    $abPath = $_SERVER['DOCUMENT_ROOT'];
    $abPath = rtrim($abPath, '/') . '/';
    
    // 根据后台的相关设置,配置PicThumb相关参数 
    if (class_exists('PicThumb')) {
        $params = array(
            'type' => $_COOKIE['thumbtype'],                // fit/crop 缩放、裁剪
            'width' => $_COOKIE['thumb_w'],                 // 目标图宽度
            'height' => $_COOKIE['thumb_h'],                // 目标图高度
            'watermark' => $abPath . $_COOKIE['watermark'], // 水印图片
            'gravity' => $_COOKIE['imgposition']            // 水印位置
        );
        $thumbobj = new PicThumb();
        $thumbobj->set_config($params);
    } //. end
    
    $filename_arr = explode('/', $fileinfo['url']);
    $ym = date('Ymd');
    $filename = end($filename_arr);
    
    // 判断后台设置判断是否需要生成缩略图和水印
    if ($_COOKIE['imgscale'] || $_COOKIE['imgwater']) {
        $flag = $thumbobj->create_thumb($abPath . 'uploadfile/' . $ym . '/' . $filename, $abPath . 'uploadfile/' . $ym . '/thumb' . $filename);
        if ($flag) {
            $fileinfo['url'] = '/uploadfile/' . $ym . '/thumb' . $filename;
        }
    }
}

/*
 * 水印处理完成
 */

/* 返回数据 */
return json_encode($fileinfo);

通过ueditor的配置文件可以限制上传图片大小,但由于配置文件是.json格式,不便于动态设置,所以一并通过PicThumb 库实现图片缩放也是很好的办法。