批量将MyISAM引擎转换为InnoDB引擎

<?php
header('Content-type: text/html;charset=utf-8');
@error_reporting(E_ALL | E_STRICT);
@ini_set('display_errors', '1');

//填写数据库IP地址, 账号, 密码
$con = mysql_connect('127.0.0.1', 'root', 'root');
//填写需要转换的数据库名字
$dbName = 'minecraft_status';

$sql = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '$dbName' AND ENGINE = 'MyISAM';";
$rs = mysql_query($sql, $con);

$count = 0;
$ok = 0;
while($row = mysql_fetch_array($rs))
{
    $count ++;
    $tbl = $row[0];
    $sql = "ALTER TABLE $dbName.$tbl ENGINE = INNODB;";
    $resultado = mysql_query($sql);
    if ($resultado){
        $ok ++;
        echo $sql."<hr/>";
    }
}
if ($count == $ok)
{
    echo '<div style="color: green"><b>全部表转换成功</b></div>';
}else{
    echo "<div style=\"color: red\"><b>出现错误</b>表的数量: $count, 成功转换的数量: $ok</div>";
}

Centos 编译安装 PureFTPd

安装编译工具

yum -y groupinstall 'Development Tools'

下载PureFTPd源代码并解压

cd /usr/local/src
wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.36.tar.bz2
tar xvjpf pure-ftpd-1.0.36.tar.bz2
cd pure-ftpd-1.0.36

开始生成编译配置文件

./configure --prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/libexec --datadir=/usr/share --sysconfdir=/etc --sharedstatedir=/usr/com --localstatedir=/var --libdir=/usr/lib64 --includedir=/usr/include --infodir=/usr/share/info --mandir=/usr/share/man --with-virtualchroot --with-everything

编译 & 安装

make -j 8
make install

安装完成后 创建服务配置文件

vi /etc/init.d/pure-ftpd

#!/bin/bash
#
# Startup script for the pure-ftpd FTP Server  $Revision: 1.1 $
#
# chkconfig: - 85 15
# description: Pure-FTPd is an FTP server daemon based upon Troll-FTPd
# processname: pure-ftpd
# pidfile: /var/run/pure-ftpd.pid
# config: /etc/pure-ftpd/pure-ftpd.conf

# Source function library.
. /etc/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is configured.
# [ ${NETWORKING} = "no" ] && exit 0

RETVAL=0

prog="pure-ftpd"

# Path to the pure-ftp binaries.
fullpath=/usr/sbin/pure-ftpd
pureftpwho=/usr/sbin/pure-ftpwho
pure_config=/etc/pure-ftpd/pure-ftpd.conf
pure_launch_script=/usr/sbin/pure-config.pl


start() {
        echo -n $"Starting $prog: "
        daemon "$pure_launch_script $pure_config --daemonize > /dev/null"
        RETVAL=$?
        [ $RETVAL = 0 ] && touch /var/lock/subsys/pure-ftpd
        echo
}

stop() {
        echo -n $"Stopping $prog: "
        killproc pure-ftpd
        RETVAL=$?
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/pure-ftpd
        echo
}

# See how we were called.
case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        reload)
        echo -n $"Reloading $prog: "
                killproc pure-ftpd -HUP
                RETVAL=$?
                echo
                ;;
        condrestart)
                if [ -f /var/lock/subsys/pure-ftpd ] ; then
                        stop
                        # avoid race
                        sleep 3
                        start
                fi
                ;;
        status)
                status pure-ftpd
                RETVAL=$?
                if [ -f $pureftpwho ] && [ $RETVAL -eq 0 ] ; then
                        $pureftpwho
                fi
                ;;
        *)
                echo $"Usage: pure-ftpd {start|stop|restart|reload|condrestart|status}"
                RETVAL=1
esac
exit $RETVAL

添加可执行权限

chmod +x /etc/init.d/pure-ftpd

将配置文件放到指定文件夹

mkdir /etc/pure-ftpd/
cp configuration-file/pure-ftpd.conf /etc/pure-ftpd/pure-ftpd.conf 
cp configuration-file/pure-config.pl /usr/sbin/pure-config.pl
chmod 744 /etc/pure-ftpd/pure-ftpd.conf
chmod 755 /usr/sbin/pure-config.pl

添加自启动 & 启动服务

chkconfig --levels 235 pure-ftpd on
systemctl start pure-ftpd.service

使用虚拟用户登录FTP

groupadd ftpgroup
useradd -g ftpgroup -d /dev/null -s /sbin/nologin ftpuser
vi /etc/pure-ftpd/pure-ftpd.conf # /PureDB 将前面的#号去掉
pure-pw useradd admin -u ftpuser -d /home/ftptest/

MWC飞控通讯

前几个星期入手了一款基于MWC飞控的WIFI小四轴,缺点就是只有手机APP。操作起来没有手感。寻思着用Ardiuno+C#做一个实体遥控器。首先是封装MWC通讯格式,下面就是封装的代码。最后结局就是手滑没调好撞废一个硬盘

/// <summary>
/// 获取发送Byte
/// </summary>
/// <param name="command">操作</param>
/// <param name="data">数据</param>
/// <returns></returns>
public byte[] GetFlyByte(int command, int[] data)
{
    byte[] FlyByte = new byte[data.Length + 6];
    // $
    FlyByte[0] = (byte)Convert.ToInt32("24", 16);
    // M
    FlyByte[1] = (byte)Convert.ToInt32("4D", 16);
    // <
    FlyByte[2] = (byte)Convert.ToInt32("3C", 16);
    //数据长度
    FlyByte[3] = (byte)Convert.ToInt32(data.Length.ToString("X"), 16);
    //操作
    FlyByte[4] = (byte)Convert.ToInt32(command.ToString("X"), 16);
    
    byte[] ConvertData = new byte[data.Length];
    //发送数据赋值 与 校验数据赋值
    for (int i = 5, j = 0; i < data.Length + 5; i++, j++ )
    { 
        FlyByte[i] = (byte)data[j];
        ConvertData[j] = (byte)data[j];
    }

    FlyByte[FlyByte.Length-1] = CheckNumber((byte)command, ConvertData);
    return FlyByte;
}

/// <summary>
/// 获取校验码
/// </summary>
/// <param name="command">操作</param>
/// <param name="data">数据</param>
/// <returns>校验码</returns>
private byte CheckNumber(byte command, byte[] data)
{
    byte rdata = 0;

    rdata ^= (byte)(data.Length & 0xFF);
    rdata ^= (byte)(command & 0xFF);

    for (int i = 0; i < data.Length; i++)
        rdata ^= (byte)(data[i] & 0xFF);

    return rdata;
}

flyc.jpg
MWC通讯格式官方文档:http://www.multiwii.com/wiki/index.php?title=Multiwii_Serial_Protocol

第一次PHP面试小记

上来先问了 第一次 浏览器 访问 输出结果 和 第二次 浏览器访问 输出结果

setcookie('a', '123');
echo $_COOKIE['a'];

第一次浏览器 发送了请求但是 在请求的HTTP头内 Cookie 是空所以 输出的是空

第二次浏览器 已经在第一次的上面收到了服务端要设置 Cookie 的消息 所以浏览器里已经有 Cookie 了 这下浏览器发送HTTP请求头里已经包含 Cookie 了 所以可以输出了123


然后问了 Session 和 Cookie 的区别这个也是基础,但是我回答到最后补充了一句 "也可以学习CI保存'Session'的方法 把 Session 当 Cookie 用" 面试官吐槽说这样不安全 讨论了较长的一段时间。


接着问 Session 保存在哪 存储方式 以及和那个存储方式比较好

答完 Session 问题后面试官画了一个很简单的表类似:
test table
a b c
1 2 3
4 5 6
7 8 9

select * from `test` where a = 1 and b = 2
select * from `test` where b = 2 and a = 1

问这两个语句有性能上的区别吗 想了下应该没有性能上的区别。

然后就是问数据库咋搞性能比较高啊 回答 能分表尽量分 选择合适的Mysql数据库引擎 添加索引 有条件做主写从读库。

唯一说错了 客户端IP 不是放在HTTP头里的

搞定技术后 人事部的来谈薪资 我写的3000~4000 人事部说就3500吧 接着就完事了。就是刚出公司10分钟 人事打电话过来说年龄太小了 可以等到11月再去。

Docker 命令笔记

搜索镜像
docker search image

下载镜像
docker pull image

交互式终端 -t标示在心容器内指定一个伪终端或终端,-i标示允许我们对容器内的STDIN进行交互。
docker run -t -i ubuntu:14.04 /bin/bash

守护进程 -d标识告诉docker运行容器在后台模式运行
docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

docker logs命令看起来想运行在容器内并且返回标准输出
docker logs insane_babbage

查看所有容器
docker ps -a

从该镜像上创建一个容器
docker run --rm -ti ubuntu /bin/bash

容器内执行程序
docker exec -ti name /bin/bash

命名容器
docker run -d -P --name web training/webapp python app.py

基于基础镜像创建新镜像
docker commit -m="Added json gem" -a="Kate Smith" 0b2616b0e5a8 minecraft/java:170
-m标示是允许我们指定提交的信息,就像你提交一个版本控制。-a标示允许对我们的更新指定一个用户。

使用-p标识来指定容器端口绑定到主机端口
docker run -d -p 5000:5000 training/webapp python app.py

添加一个数据卷 -v 标识来给容器内添加一个数据卷
docker run -d -P --name web -v /webapp training/webapp python app.py

-v 还可以挂载本地主机目录到容器中 挂载本地目录/src/webapp到容器的/ot/webapp目录
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
注意:如果挂载好后在容器内无法访问挂载的目录,可能是SELinux没有关闭导致的原因。

查看容器中运行着哪些进程
docker top nginx_dist

查看容器IP和主机等信息
docker inspect nginx_dist |grep 172.17

连接到容器上,--sig-proxy可以保证 Ctrl+D、Ctrl+C 不会退出
docker attach --sig-proxy=false name
当然也可以使用 Ctrl + Q + P 多按几次也能达到同样的效果

修改容器配置
docker stop test01
docker commit test01 test02
docker run -p 8080:8080 -td test02

####自动构建####
创建构建文件
vi Dockerfile

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
FROM centos:latest
MAINTAINER Srarservice@chinasrar.com

WORKDIR /opt/

RUN yum install -y wget java-1.7.0-openjdk
RUN wget http://cdn.x-speed.cc/docker.minecraft/craftbukkit-172.jar

EXPOSE 25565

ENTRYPOINT /usr/bin/java -Xms256M -Xmx1G -jar /opt/craftbukkit-172.jar
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

开始构建
sudo docker build --tag minecraft:1.7.2 .

保存镜像到一个tar包; -o, --output="" Write to an file
docker save image_name -o file_path
加载一个tar包格式的镜像; -i, --input="" Read from a tar archive file
docker load -i file_path

机器a
docker save image_name > /home/save.tar
使用scp将save.tar拷到机器b上,然后:
docker load < /home/save.tar

开启 Docker Remote API
编辑 /etc/sysconfig/docker other_args="" 修改为 other_args="-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock"

安装Ping
apt-get install -yqq inetutils-ping

提示错误 无法启动容器 Error response from daemon: Cannot start container
修改Docker配置文件 /etc/sysconfig/docker other-args 改为 other_args="--exec-driver=lxc --selinux-enabled"

容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
容器操作运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
容器rootfs命令 — docker [commit|cp|diff]
镜像仓库 — docker [login|pull|push|search]
本地镜像管理 — docker [images|rmi|tag|build|history|save|import]
其他命令 — docker [info|version]