2015年5月

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月再去。