Astart算法之迷宫最短路径

1491204654

A-star算法描述:
A算法,启发式算法,A(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。

公式表示为: f(n)=g(n)+h(n),

其中 f(n) 是从初始状态经由状态n到目标状态的代价估计,

g(n) 是在状态空间中从初始状态到状态n的实际代价,

h(n) 是从状态n到目标状态的最佳路径的估计代价。

(对于路径搜索问题,状态就是图中的节点,代价就是距离)

这几篇博客对A启发式算法介绍的很详细 堪称最好的A*算法 启发式搜索技术A

之前就有了解过A算法解决八数码问题,也用过BFS广度优先搜索走迷宫,说说我对A算法的理解吧,A算法类似BFS,但是A算法的重点在于设计权重判断函数,选择最佳的走法,而且是有目标性的走,不像BFS是盲目的走法,例如在 9 * 9方格中,可以上下左右跟斜线行走,当然9 * 9的方格是正方形,所以横着走跟竖着走权重设为1,那么斜着走就是根号2,大概的比例是 1 : 1.414 ,约等于 10 :14,那么 我们就可以选择这个权重来进行估值,每次选择权重最小的一个方向走。

Java代码实现
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class A {

class Node {
    int x, y;
    int g, h, f;
    Node parentNode;

    public Node() {
    }

    public int compareTo(Node node) {
        return this.f - node.f;
    }

    public Node(int x, int y, Node parentNode) {
        super();
        this.x = x;
        this.y = y;
        this.parentNode = parentNode;
    }

}

static List<Node> openList = new ArrayList<Node>();
static List<Node> closeList = new ArrayList<Node>();
static int COST_ROW, COST_COL, COST_X;
// 1为可通行,0为障碍物,不可通行
static int[][] map = new int[][] { 
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
    { 1, 0, 0, 0, 0, 0, 1, 0, 0, 1 }, 
    { 1, 1, 1, 1, 0, 0, 0, 1, 1, 1 }, 
    { 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 }, 
    { 1, 1, 1, 1, 0, 0, 0, 1, 1, 1 }, 
    { 1, 1, 1, 1, 0, 0, 0, 1, 1, 1 },
    { 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 0, 1, 1, 1 },
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } };

public static void main(String[] args) {

    int row = map.length;
    int col = map[0].length;

    // 权重
    COST_ROW = 10;
    COST_COL = 10;
    COST_X = 14;

    boolean flag = astar(map, new A().new Node(4, 2, null), new A().new Node(4, col - 2, null), row, col);
    if(flag)
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.print("\n");
        }
    else
        System.out.println("Not Found");

}

static boolean astar(int[][] map, Node startNode, Node endNode, int row,
        int col) {
    Node curNode = startNode;
    // 将开始节点添加到搜索list
    openList.add(startNode);
    while (!openList.isEmpty() && !openList.contains(endNode)) {
        // 找到当前权值最小的节点
        curNode = findMinWeight(openList);
        // 找到最短路径
        if (curNode.x == endNode.x && curNode.y == endNode.y
                || openList.contains(endNode)) {
            while (!(curNode.x == startNode.x && curNode.y == startNode.y)) {
                map[curNode.x][curNode.y] = 2;
                if (curNode.parentNode != null) {
                    curNode = curNode.parentNode;
                }
            }
            map[startNode.x][startNode.y] = 2;
            return true;
        }


        // 上下左右
        if (curNode.y - 1 >= 0)
            check(curNode.x, curNode.y - 1, curNode, endNode, COST_COL);
        if (curNode.y + 1 < col)
            check(curNode.x, curNode.y + 1, curNode, endNode, COST_COL);
        if (curNode.x - 1 >= 0)
            check(curNode.x - 1, curNode.y, curNode, endNode, COST_ROW);
        if (curNode.x + 1 < row)
            check(curNode.x + 1, curNode.y, curNode, endNode, COST_ROW);

        // 斜
        if (curNode.x - 1 >= 0 && curNode.y - 1 >= 0)
            check(curNode.x - 1, curNode.y - 1, curNode, endNode, COST_X);
        if (curNode.x - 1 >= 0 && curNode.y + 1 < col)
            check(curNode.x - 1, curNode.y + 1, curNode, endNode, COST_X);
        if (curNode.x + 1 < row && curNode.y - 1 >= 0)
            check(curNode.x + 1, curNode.y - 1, curNode, endNode, COST_X);
        if (curNode.x + 1 < row && curNode.y + 1 < col)
            check(curNode.x + 1, curNode.y + 1, curNode, endNode, COST_X);

        openList.remove(curNode);
        closeList.add(curNode);
    }
    return false;
}

static boolean check(int x, int y, Node curNode, Node endNode, int cost) {
    Node node = new A().new Node(x, y, curNode);
    if (map[x][y] == 0) {
        closeList.add(node);
        return false;
    }

    if (isHave(closeList, x, y) != -1)
        return false;

    // 查找开启列表中是否存在
    int index = -1;
    if ((index = isHave(openList, x, y)) != -1) {// 存在
        // G值是否更小,是则更新
        if ((curNode.g + cost) < openList.get(index).g) {
             countG(node, cost);
             countF(node);
            openList.set(index, node);
        }
    } else {
        // 不存在,添加到开启列表中
        node.parentNode = curNode;
        count(node, endNode, cost);
        openList.add(node);
    }
    return true;
}

static void count(Node curNode, Node endNode, int cost) {
    countG(curNode, cost);
    countH(curNode, endNode);
    countF(curNode);
}

/**
 * 计算G消耗
 * @param curNode
 * @param endNode
 * @param cost
 */
static void countG(Node curNode, int cost) {
    if (curNode.parentNode == null)
        curNode.g = cost;
    else
        curNode.g = curNode.parentNode.g + cost;
}

/**
 * 计算H估值
 * @param curNode
 * @param endNode
 */
static void countH(Node curNode, Node endNode){
    curNode.h = (Math.abs(curNode.x - endNode.x)
            + Math.abs(curNode.y - endNode.y)) * COST_COL;
}

/**
 * 计算F权值
 * @param curNode
 */
static void countF(Node curNode) {
    curNode.f = curNode.g + curNode.h;
}

/**
 * 是否存在某个节点
 * 
 * @param list
 * @param x
 * @param y
 * @return
 */
static int isHave(List<Node> list, int x, int y) {
    int length = list.size();
    for (int i = 0; i < length; i++) {
        Node node = list.get(i);
        if (node.x == x && node.y == y)
            return i;
    }
    return -1;
}

/**
 * 找最小权值的节点
 * 
 * @param list
 * @return
 */
static Node findMinWeight(List<Node> list) {
    Iterator<Node> iterable = list.iterator();
    Node now = iterable.next();
    while (iterable.hasNext()) {
        Node next = iterable.next();
        if (next.compareTo(now) < 0)
            now = next;
    }
    return now;
}

}
运行结果
1 2 2 2 2 2 1 1 1 1
2 0 0 0 0 0 2 0 0 1
1 2 1 1 0 0 0 2 1 1
1 1 2 1 0 0 1 1 2 1
1 1 2 1 0 0 0 1 2 1
1 1 1 1 0 0 0 1 1 1
1 1 1 1 0 0 0 0 0 1
1 0 0 0 0 0 0 1 1 1
1 1 1 1 1 1 1 1 1 1
值为2的一条线路为最短路径

第八届蓝桥杯省赛 之 承压计算

1491672605

题目描述
X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。

每块金属原料的外形、尺寸完全一致,但重量不同。

金属材料被严格地堆放成金字塔形。

                        7

                       5 8

                      7 8 8

                     9 2 7 2

                    8 1 4 9 1

                   8 1 8 8 4 1

                  7 9 6 1 4 5 4

                 5 6 5 5 6 9 5 6

                5 5 4 7 9 3 5 5 1

               7 5 7 9 7 4 7 3 3 1

              4 6 4 5 5 8 8 3 2 4 3

             1 1 3 3 1 6 6 5 5 4 4 2

            9 9 9 2 1 9 1 9 2 9 5 7 9

           4 3 3 7 7 9 3 6 1 3 8 8 3 7

          3 6 8 1 5 3 9 5 8 3 8 1 8 3 3

         8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9

        8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4

       2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9

      7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6

     9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3

    5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9

   6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4

  2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4

 7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6

1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3

2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8

7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9

7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6

5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1

X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

其中的数字代表金属块的重量(计量单位较大)。

最下一层的X代表30台极高精度的电子秤。

假设每块原料的重量都十分精确地平均落在下方的两个金属块上,

最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上。

电子秤的计量单位很小,所以显示的数字很大。

工作人员发现,其中读数最小的电子秤的示数为:2086458231

请你推算出:读数最大的电子秤的示数为多少?

注意:需要提交的是一个整数,不要填写任何多余的内容。

解题思路
当时想都不想是直接用了dp,把这30行的数据存到一个二维数组中去,然后数据就成了这样

7

5 8

7 8 8

……

然后呢,根据题目所求,在第1列的数据规律是这样的,是上一行的 1/2 加上本身 即 map[i - 1][j] / 2,其他的则为 map[i - 1][j] / 2 + map[i - 1][j - 1] / 2 + 本身

代码实现
import java.util.Scanner;

public class A4 {

public static void main(String[] agrs) {
    Scanner scanner = new Scanner(System.in);

    double[][] map = new double[30][30];
    for (int i = 0; i < 30; i++)
        for (int j = 0; j <= i; j++) {
            map[i][j] = scanner.nextInt();
        }

    for (int i = 1; i < 30; i++)
        for (int j = 0; j <= i; j++) {
            if(j == 0)
                map[i][j] += map[i - 1][j] / 2;
            else
                map[i][j] += map[i - 1][j] / 2 + map[i - 1][j - 1] / 2;
        }

    double min = Integer.MAX_VALUE;
    double max = Integer.MIN_VALUE;
    for(int i = 0; i < 30; i++){
        if(map[29][i] > max)
            max = map[29][i];
        if(map[29][i] < min)
            min = map[29][i];
    }

    long minX = 2086458231;

    System.out.println(max * minX / min);

    scanner.close();
}

}
运行结果
map中最小值为3.8863313030451536,最大值为135.34946863353252

电子秤最大估值 72665192664

第八届蓝桥杯省赛 之 最大公共子串

1491673692

标题:最大公共子串
最大公共子串长度问题就是:

求两个串的所有子串中能够匹配上的最大长度是多少。

比如:”abcdkkk” 和 “baabcdadabc”,

可以找到的最长的公共子串是”abcd”,所以最大公共子串长度为4。

下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。

请分析该解法的思路,并补全划线部分缺失的代码。

public class Main
{
static int f(String s1, String s2)
{
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();

    int[][] a = new int[c1.length+1][c2.length+1];

    int max = 0;
    for(int i=1; i<a.length; i++){
        for(int j=1; j<a[i].length; j++){
            if(c1[i-1]==c2[j-1]) {
                a[i][j] = __________________;  //填空 
                if(a[i][j] > max) max = a[i][j];
            }
        }
    }

    return max;
}

public static void main(String[] args){
    int n = f("abcdkkk", "baabcdadabc");
    System.out.println(n);
}

}
本题考查的是动态规划

答案:
a[i-1][j-1]+1

第八届蓝桥杯省赛 之 Excel

1491675432

题目描述
具体题目忘记了,大概的意思是说一个Excel表格的列数问题

A 表示 第1列

B 表示 第2列

C 表示 第3列

AB 表示 第28列

BA 表示 第53列

要求程序输入一个数字,需要输出当前列的表示

例如输入 26

输出 Z

再输入 2054

输出 BZZ

解题思路
观察可以发现规律,这是一个26进制的表示,

A = 1 * 26^0 = 1

AB = 1 * 26^1 + 2 * 26^0 = 28

BA = 2 * 26^1 + 1 * 26^0 = 53

BZZ = 2 * 26^2 + 26 * 26^1 + 26 * 26^0 = 2054

到这里问题已经解决了一半了,然后你第一时间是会联想到2进制的转换吧,没错就是他了

PS:当时在做这题花了差不多半个小时才调出来,今天考试没状态

代码实现
import java.util.Scanner;

public class A7 {

static void f(int n){
    if(n == 0) return ;
    if(n % 26 == 0){
        f(n / 26 - 1);
        System.out.print((char)('A' + 26 - 1));
    }else{
        f(n / 26);
        System.out.print((char)('A' + (n % 26) - 1));
    }
}

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    int n = scanner.nextInt();
    f(n);

    scanner.close();
}

}

PHP实现SSO单点登录

1492692055

前言:单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。

单点登录处处可见,例如在weibo.com登录过微博账号,然后你进入另一个系统blog.sina.com.cn是不需要再登录的,这就是SSO,一处登录处处可用。

长话短说,先来一个demo压压惊(这里只演示了三个系统),例如

system1 http://1.sso.xiaocp.com

system2 http://2.sso.xiaocp.com

system3 http://3.sso.xiaocp.com

这是三个系统,只要任意登录其中一个系统,其他另外两个则不需要再次登陆(账号密码随意填)

如何实现SSO
当然,大家没做过也听说过,实现sso单点登录一般都是使用统一登录接口,没错了,我这里也是采用统一登录接口http://login.sso.xiaocp.com/

我做的这个sso单点登录采用的是页面重定向的方式以及观察者模式(广播机制)

首先实现统一的登陆接口跟统一的退出接口,然后每个单点登陆系统都有回调监听登陆或者退出接口

SSO流程大概如下
用户请求,附带要重定向的url -> 统一登录接口 -> 通过验证,登陆成功 -> 广播通知每个系统的回调接口 -> 页面重定向 -> 重定向到指定url页面

设计缺陷:随着系统的增多效率会有所下降。

JavaWeb的那些坑坑窝窝

1492882219

新手攀登JavaWeb这座高峰的时候难免会遇到这些那些的Exception,甚至有时候还会烦扰你一天半天。

我只想说:Exception,我没你这个朋友。

spring jndi NamingException: Name [spring.liveBeansView.mbeanDomain] is not bound in this Context
异常分析:JNDI,那很明显异常来自JNDI的数据源配置,当时我的项目是spring4+springMVC+druid+mybatis3.2.1,查了资http://stackoverflow.com/questions/23750619/spring-jndi-namingexception-name-spring-livebeansview-mbeandomain-is-not-boun,解决办法是在web.xml文件加上

spring.profiles.activedevspring.profiles.defaultdevspring.liveBeansView.mbeanDomaindev
附上链接http://blog.csdn.net/superdog007/article/details/48022983
Invocation of destroy method ‘close’ failed on bean with name ‘sqlSession’: java.lang.UnsupportedOperationException: Manual close is not allowed over a Spring managed SqlSession
1.重启项目,2.spring配置文件的org.mybatis.spring.SqlSessionTemplate的问题,在配置加上scope=”prototype”,3.是

destory-methods属性问题,要去掉!

盘点第八届蓝桥杯决赛

1496065964

第八届蓝桥杯决赛 之 合根植物
问题描述:大概题意 在 n 行 m 列的矩阵里,格子编号为 1 - n * m(1 <= n,m <= 100),接下来是 k 行的两个数a b(分别表示两个格子之间可以合根),需要计算有多少种生长方法

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
例如输入

5 4 15
1 5
2 3
3 7
7 11
11 12
4 8
5 9
9 10
9 13
13 17
17 18
18 19
10 14
14 15
15 19
结果输出 6

解题思路
题目一览而过,相信有底气的人都能直接给套上bfs,没错就是他,而且数据量不是很大,可行!

一个map标记两个格子互通,一个全局的vis数组进行标记,然后就是广度进行上下左右搜索,卧槽,决赛题目竟然这么简单啊,我。。。

代码实现
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/**

  • 合根植物

  • @author Ape

  • /
    public class J6 {

    static final int MAX = 101;
    static int N, M, ans = 0;
    static int[] r;
    static int[][] map = new int[MAX][MAX];
    static int[] vis = new int[MAX];

    static void bfs(int n){

    if(vis[n] == 1)
        return;
    Queue<Integer> queue = new LinkedList<Integer>();
    queue.add(n);
    vis[n] = 1;
    while(!queue.isEmpty()){
        int now = queue.poll();
        for(int i = 0; i < 4; i++){
            int next = now + r[i];
            if(next > 0 && next <= N * M && vis[next] == 0 && map[now][next] == 1){
                vis[next] = 1;
                queue.add(next);
            }
        }
    }
    ans++;

    }

    public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);
    
    N = scanner.nextInt();
    M = scanner.nextInt();
    r = new int[]{ 1, -1, M, -M };
    int n = scanner.nextInt();
    for(int i = 0; i < n; i++){
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        map[a][b] = 1;
        map[b][a] = 1;
    }
    for(int i = 1; i <= N * M; i++)
        bfs(i);
    System.out.println(ans);
    scanner.close();

    }

}

首个开源作品 apephp框架

1497726000

简述
第一个开源作品,想法很简单,为什么不能有一个属于自己的框架呢,一个自己随心所欲的框架,所以有了ApePHP。

虽说是第一个开源作品但可能也是最后一个PHP开源作品,放弃它只是为寻找我所追求的,但还是会继续深究学习PHP的哈哈哈
学开发有一段时间了,其实接触接触一个框架底层还是比较有意思的,这样会让你更加深刻更加理解一个框架是怎么来的, 在写这个框架的同时也吸收了一些免费开源框架的优秀设计思想,本人技术浅薄,望各位大牛们刀下留情,放小的一马,有建议可以多提提哈哈哈。
ApePHP是一个免费开源的,简单的面向对象的轻量级PHP开发框架,源码只有几百KB,遵循Apache2开源许可协议发布。

github:https://github.com/xiaocp/apephp/

码云:http://git.oschina.net/xiaocp/apephp

详情查看框架网站 http://apephp.xiaocp.com/

写文档也是一门技术活,正在努力编写中。。。

mysql主从同步配置(windows环境)

1466662822

想知道为什么要实现数据库主从同步请自行百度看优势何在,友情连接http://wenku.baidu.com/link?url=FW-Qe1fIU2IM_AiQKWjpfOLOGONaRVs9c6ZIevfs6OxzkmbS56Q2BBtbyjNDwLTaiRE8wwmP0sg52D8qJz6kaa8HZENviL6Dbvti7h0pcte
mysql主从同步配置准备

两台主机,主机A,主机B,都需要安装mysql数据库。

例如主机A(作为主库)IP:119.29.249.211

主机B(作为从库)IP:119.29.249.222

题外话:
Windows下安装多个Mysql

首先我们需要做的是copy数据库文件,如果使用的是phpstudy集成环境,复制MYSQL目录下的文件到另一个文件夹,例如复制到D:\Ape_MySql\mysql3307这个文件夹

第二步是修改my.ini配置文件(修改端口和数据路径即可)

[client]
port = 3307

[mysqld]
port = 3307
basedir = “D:/Ape_MySql/mysql3307/“
datadir = “D:/Ape_MySql/mysql3307/data/“

另一个数据库我用的是3307端口

接下来安装一个新的MYSQL数据库,服务命名为mysql3307(当然这个命名随意)

在cmd命令行模式下

D:\Ape_MySql\mysql3307>mysqld install mysql3307 –defaults-file=”D:\Ape_MySql\mysql3307\my.ini”

注:如果安装报错,那用管理员身份运行cmd

小技巧->如要修改mysql3307服务路径运行regedit,进入注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mysql3307修改ImagePath的数据D:\Ape_MySql\mysql3307\bin\mysqld –defaults-file=D:\Ape_MySql\mysql3307\my.ini mysql3307

安装成功我们就可以启动服务啦了,同样的cmd命令行输入net start mysql3307

如果提示1067错误,请检查一下my.ini文件,basedir=”D:/Ape_MySql/mysql3307/“,datadir=”D:/Ape_MySql/mysql3307/data/“里面的路径是否写错了。

或检查一下注册表mysql3307的ImagePath数据,–defaults-file=”D:\Ape_MySql\mysql3307\my.ini”里面的路径是否写对了.
以上是解决没有两台主机进行mysql主从的题外话。。。
主库Master(A主机)的配置

打开配置文件my.ini在[mysqld]下增加两行

server-id = 2
log-bin = mysql-bin
binlog-do-db = ape

说明

server-id:为主服务器A的ID值

log-bin:二进制变更日值

binlog-do-db :同步的数据库
配置完同时重启或运行数据库并创建一个REPLICATION SLAVE权限的用户,命令输入如下

GRANT REPLICATION SLAVE ON . TO “xcp”@”119.29.249.222” IDENTIFIED BY ‘ape’;

119.29.249.222为Slave从库指定IP的用户,若设为”xcp”@”%”,则该用户xcp可以在任意主机使用

接下来是查看主库的mysql-bin二进制日志,可以输入命令 show master status \g,结果如下

那么到现在为止,主库已配置完毕
从库Slave(B主机)的配置

同样的打开配置文件my.ini在[mysqld]下面添加如下内容

server-id = 2
log-bin = mysql-bin
relay-log = relay-bin
relay-log-index = relay-bin-index

百度网上说的配置方法

[mysqld]
server-id = 2
master-host = 119.29.249.211
master-user = xcp
master-password = ape

配置完之后mysql启动失败,可能是mysql5.5版本不支持吧。。。

注:每次配置完都需要重启mysql服务

接下来运行数据库命令行输入一下命令

change master to master_host = ‘119.29.249.211’,
master_user = ‘xcp’,
master_password=’ape’,
master_log_file=’mysql-bin.000004’,
master_log_pos=2552;

然后查看一下是否配置成功,输入命令

show slave status \g

结果看到下面两项是否为YES

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

如图:

说明已经配置成功了。可以试着在主库新建一个数据库,然后从库也跟着显示主库新建的数据库有没有有没有!

配置过程遇到的问题

怎么说呢,其实步骤都很简单,问题就出在从库连接主库,昨晚纠结到2点都没睡觉的一个问题,如图

英语四级没去考的我在纠结Connecting这个单词是什么意思,是正在连接中还是已经连接,百度翻译结果是连接。

我以为我成功了,结果还是无法实现同步,查了资料http://blog.csdn.net/i_bruce/article/details/17055135才知道是密码错误,原来在新建账户的时候无意间的敲多了个空格,后来新建了个用户就成功了,太失败了竟是这样的原因。
Master-Slave同步机制

初探Nginx 之 8080端口监听 及 SSL实现 及 Thinkphp支持

1493493328

瞎扯一下生活日常,难得放假,今天睡醒便是12点整,下午撸过两个小时10倍边境的飞车之后便又找了mobike踩,也许是太久没踩了,踩完回来异常的累, 然后晚上无聊到炸,心血来潮学了下Ngnix。

本人使用的是phpStudy集成的Nginx,懒人必备。

不得不说Nginx反向代理巨好用,Nginx使用广泛,什么负载均衡啊,反向代理噼里啪啦的一大堆,之前没有去了解Nginx以为很难,当时也有朋友问过我在自己服务器装了Tomcat不想在域名加8080而又不想用apache映射到8080端口当时我就说用Nginx可以实现,其实很简单哈哈,值得深入研究。

长话短说直接进入正题,如果你使用的是phpstudy集成的,你之前在Apache配置好的域名切换到Nginx之后也会自动的帮你生成,这就是使用集成的好处哈哈哈,省事。

这是Ngnix学习的几个pdf 第1章 Nginx简介.pdf 第2章 Nginx服务器的安装与配置.pdf 第3章 Nginx的基本配置与优化.pdf

关于Ngnix配置的一些信息意思的了解pdf或者百度都有比较详细的说明,在此略过。

  1. 8080端口的映射
    首先要明白一个server就是一个虚拟主机的配置,在localhost加上一下配置信息

#所有jsp的页面均交由tomcat处理
location ~ .(jsp|jspx|do)?${ proxy_set_header Host$host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
我服务器的tomcat服务器端口没改,如果是其他的则修改为相对应的端口
然后我使用jsp.xiaocp.com域名指向,并配置一个虚拟主机

server {
listen 80;
server_name jsp.xiaocp.com:8080;

    location / {  
        root   "C:\Tomcat 7.0\webapps"; 
        index  index.jsp index.htm index.html index.do default.jsp default.do;
    } 

}

root为Tomcat应用程序根目录
server_name 是主机名称,还可以简写为 server_name jsp.xiaocp.com:;

这样,就成功配置好了,是不是很简单哈哈哈,8080端口会保留,访问 http://jsp.xiaocp.comhttp://www.xiaocp.com:8080/ 是一样的

下面是我的一个servlet servlet课题 一个springmvc springmvc课题

  1. Thinkphp的路由支持
    使用了Ngnix,对应使用的thinkphp框架路由会出现一些问题,我的挺多个项目都是基于TP开发的,我博客使用的路由模式为2,并且是自定义路由,所以默认Ngnix访问的url全都404 Not Found 了,这个可以很简单的解决,写一下rewrite规则就可以解决,配置如下

server {
listen 80;
server_name www.xiaocp.com xiaocp.com;

root   "C:/phpStudy/WWW/home";
location / {
    index  index.html index.htm index.php;

    #兼容tp路由
    if (!-e $request_filename){ 
      rewrite ^/(.*)$ /index.php/$1 last;
    }
}
location ~ \.php(.*)$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO  $fastcgi_path_info;
    fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
    include        fastcgi_params;
}

}
如果是其他的,可以根据url规则进行配置比如tp兼容模式配置如下
if (!-d $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last;
}

  1. SSL的配置
    切换到了Ngnix,SSL需要重新配置,也是挺简单的,监听443端口,配置如下

server {
listen 443 ssl;
server_name www.xiaocp.com;

    ssl_certificate      C:/Ape/ssl/www_ssl/2_xiaocp.com.crt;
    ssl_certificate_key  C:/Ape/ssl/www_ssl/3_xiaocp.com.key;

    #ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    ssl on;

    location / {
        root   C:/phpStudy/WWW/home;
        index  index.html index.htm index.php;
        if (!-e $request_filename){
          rewrite ^/(.*)$ /index.php/$1 last;
        }
    }

    location ~ \.php(.*)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
        include        fastcgi_params;
    }

    root           "C:/phpStudy/WWW/home";
}

这里有个坑,一开始是查资料加的一些配置,然后一启动Ngnix就报错,报错信息 shared zone “SSL” has no equal addresses: 02C00000 vs 02650000还是pdf资料有用哈哈哈,把这一行注掉即可ssl_session_cache shared:SSL:1m;

然后就是http 重定向到 https 了

在原来的虚拟主机配置加上

return 301 https://$server_name$request_uri;
perfect,完美解决。
好吧,为了写这篇鬼东西,比我去学Ngnix还花时间,可以安心去睡觉了