2016年11月

shell定期清除文件

#!/bin/bash
# 删除tmp目录下7天未访问的文件
upload_tmp='/root/tmp'
expire_day=7

function ergodic() {
    for file in `ls $1` 
    do  
        if [ -d $1"/"$file ]
        then
            ergodic $1"/"$file  
        else
            newFile=$1"/"$file
            accessTime=`stat -c %X ${newFile}`
            curTime=`date +%s`
            diff=`expr ${curTime} - ${accessTime}`
            diffDay=`awk -v num=${diff} 'BEGIN{printf "%.2f\n",(num/60/60/24)}'`
            # 除以小数
            ret=`awk -v num1=${diffDay} -v num2=${expire_day} 'BEGIN{print(num1>num2)?"0":"1"}'`
            # 小数比较
            if [ $ret -eq 0 ] 
            then
                # echo ${newFile}
                \rm -rf ${newFile}
            fi  
        fi  
    done  
}

ergodic ${upload_tmp}

git拉取远程仓库后, 怎么每次push时不重复输入密码(coding | github | osc)

有两种方法:

1. 使用 SSH 方式进行推送
2. 对于 Https 协议: 首先在全局配置保存你的密码, ~/.git-credentials (没有就创建)内添加 https://{username}:{passwd}@git.coding.net 然后执行配置 Git 命令存储认证命令: $git config --global credential.helper store

执行后在 ~/.gitconfig 文件会多出下面配置项: credential.helper = store

设计模式之外观模式

<?php

// 外观模式 实现文件加密
// 三个子系统, 分别是文件读取 ; 文件加密 ; 文件保存

class FileEncException extends Exception{}

class FileRead
{
    public function read($fileSrc)
    {
        if (!is_file($fileSrc)) {
            throw new FileEncException('file not exists');
        }
        $raw = file_get_contents($fileSrc);
        return $raw;
    }
}

class CipherMachine
{
    public function encrypt($raw)
    {
        $rawArr = explode('',$raw);
        $encStr = '';
        foreach ($rawArr as $li) {
            $tmp = chr(ord($li) % 7);
            $encStr .= $tmp;
        }
        return $encStr;
    }
}

class FileWriter
{
    public function write($string,$fileDes)
    {
        return file_put_contents($fileDes,$string);
    }
}

// 外观类
class EncryptFacade
{
    public function __construct()
    {
        $this->FileRead = new FileRead();
        $this->CipherMachine = new CipherMachine();
        $this->FileWriter = new FileWriter();
    }

    public function encFile($fileSrc,$fileDes)
    {
        try {

            $raw = $this->FileRead->read($fileSrc);
            $encStr = $this->CipherMachine->encrypt($raw);   
            $this->FileWriter->write($encStr,$fileDes);

        } catch (FileEncException $e) {
            return false;
        }

        return true;
    }
}

// 客户端调用
$EncryptFacade = new EncryptFacade();
$EncryptFacade->encFile('a.txt','b.txt');

思维方法与编程思想

  1. 以概念为中心
  2. 组合规则
  3. 最少例外原则(Rule of Least Surprise)
  4. 不要把必要条件(Necessary Condition)当充分条件(Sufficient Condition)
  5. 封装成函数的基本步骤是:把语句放到函数体中,把变量改成函数的参数
  6. 递归
    • 随着函数调用的层层深入,存储空间的一端逐渐增长,然后随着函数的层层退出,存储空间的这一端又逐渐缩短,这是一种具有特定性质的数据结构。它的特性就是只能在某一端增长或缩短,并且每次访问参数和局部变量时只能访问这一末端的单元,而不能访问内部的单元
  7. 函数式编程(Functional Programming),命令式编程(Imperative Programming), 编程语言应该更多是在描述要做什么(Declarative)而不是描述具体一步一步怎么做(Imperative), 例如sql
  8. 迭代和增量式求解
  9. 抽象
    • '抽象'简单来说就是提取公因式
    • 组合使得系统可以任意复杂,而抽象使得系统的复杂性是可以控制的,任何改动都只局限在某一层,而不会波及整个系统
  10. 数据驱动的编程(Data-driven Programming),写代码最重要的是选择正确的数据结构来组织信息,设计控制流程和算法尚在其次,只要数据结构选择得正确,其它代码自然而然就变得容易理解和维护了
  11. 分而治之(归并排序)
  12. 折半求解(折半查找)
  13. 回溯(迷宫问题)

广度优先搜索 - 迷宫问题

#include <stdio.h>
#define MAX_ROW 5
#define MAX_COL 5

struct point {
    int row;
    int col;
    int predecessor; // 保存'前趋点'(出队点)在queue数组中的索引,即head-1
} queue[512];

int head = 0;
int tail = 0;

// 入队
void enqueue (struct point p) {
    queue[tail] = p;
    tail++;
}

// 出队
struct point dequeue (void) {
    head++;
    return queue[head-1];
}

// 判断队列是否为空
int is_empty (void) {
    return head == tail;
}

// 迷宫
int maze[MAX_ROW][MAX_COL] = {
    0, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,
};

// visit
void visit (int row,int col) {
    maze[row][col] = 2;
    struct point p = {row,col,head-1};// head-1出队点所在queue的索引
    enqueue(p);
}

int main (void) {
    struct point p = {0,0,-1};
    maze[p.row][p.col] = 2;
    enqueue(p);

    while (!is_empty()) {
        p = dequeue();
        // 终点
        if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) {
            break;
        }
        // 上
        if (p.row-1 >=0 && maze[p.row-1][p.col] == 0) {
            visit(p.row-1,p.col);
        }
        // 右
        if (p.col+1 < MAX_COL && maze[p.row][p.col+1] == 0) {
            visit(p.row,p.col+1);
        }
        // 下
        if (p.row+1 < MAX_ROW && maze[p.row+1][p.col] == 0) {
            visit(p.row+1,p.col);
        }
        // 左
        if (p.col-1 >= 0 && maze[p.row][p.col-1] == 0) {
            visit(p.row,p.col-1);
        }
    }

    if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) {
        printf("row:%d,col:%d\n",p.row,p.col);
        while (p.predecessor != -1) {
            p = queue[p.predecessor];
            printf("row:%d,col:%d\n",p.row,p.col);
        }
    } else {
        printf("找不到终点");
    }
}