作者: ethan

  • 央视《给妈妈洗脚》公益广告

    在童年的记忆中,相信很多人都看过一个非常温馨的公益广告,给妈妈洗脚,这部公益广告在当时感动了无数的观众,我还记得,当初学校还专门布置了回家给父母洗脚的作业,不知道你们有没有。

    前几天,一个偶然的机会,提到了这个广告,所以就搜索了下重新看了一遍,重又感动了一次,分享给大家

    https://v.qq.com/x/page/x0381jiz99e.html

  • 泪奔!他从未忘记爱你

    父亲藏饺子给儿子 公益广告令人泪奔

    https://v.qq.com/x/page/c0632ad4i5t.html

    简介:

    爸爸得了老年痴呆,儿子带他去吃饭。盘子里面剩下两个饺子,爸爸直接用手抓起饺子放进了口袋。儿子愣住了。爸爸说,我儿子最爱吃这个了。最后广告出字:他忘记了一切,但从未忘记爱你!

    以前小的时候感触不是很大,但随着年龄的增长,父母的年龄越来越大,偶然再次看到这个广告,心中百感凝噎。

    在父母还健在时,多多陪陪他们吧,不要等到子欲养而亲不待才后悔不已。万一哪一天,你的父母也不再记得你,不再记得很多事,请不要烦他,怪他,也许他忘记了很多事情,但他却从未忘记爱你!

  • mysql大数据量limit问题

    今天遇到一个问题,千万级别的数据表,需要全部进行遍历,如果用limit offset,count的话,无疑在翻到一定页数,也就是offset到达一定的值之后,mysql的查询速度会变得非常的慢。

    $offset=0;
    $count = 5000;
    do {
       $sql = 'select id,uid from test_table limit ' . $offset . ',' . $count;
       $res = $obj->query($sql);
       if (empty($res)) {
           break;
       }
    
       // 处理$res数据start
       // 处理$res数据end
    
       $offset += $count;
    
    } while(true);

    为了解决这个问题,运用了一种技术方案,即,保持count, 加上带索引的有序检索条件,如:

    $count = 5000;
    $id = 0;
    do {
       $sql = 'select id,uid from test_table where id>' . $id . ' limit ' . $count . ' order by id asc';
       $res = $obj->query($sql);
       if (empty($res)) {
           break;
       }
    
       // 处理$res数据start
       // 处理$res数据end
       $id = $last_id; // $last_id中最后一条记录的id
    } while(true);

    通过这种方式,避免了offset过大的问题,且id因为是主键索引,能够运用索引,速度影响不大,当然,你也可以根据实际情况,应用其他字段,只要能够用上索引就可以

  • 在家办公体验

    因为疫情的关系,相信很多人目前都还处于在家办公的状态。

    作为一名程序员,工作性质决定了,在家办公和在公司办公实际差别不大,但效率方面确实千差万别。下面是我在家办公以来的体验。

    第一周

    穿着睡衣,慵慵懒懒的边玩着手机,便留意钉钉信息,工作先堆着,等最后几天再说。。。

    第二周

    肝,上一周遗留下的未完成的工作,加班加点,黑眼圈。。。

    第三周

    还是有部分工作堆积,但影响不大,边看视频,边工作,两不误,但效率。。。

    第四周

    不规律的作息,渐渐感到身体不舒服,看来要注意了,渐渐改变

    第五周

    正常的作息,格外的有精神,工作也都赶上了正常的节奏,和在公司办公基本无差,当然,工作时听听音乐放松放松

    第n周

    感觉这一段时间的在家办公,把自己在家就废的状态改好了,能够自己在意作息时间,工作休息时间划分开,很好

    总结

  • mac加密压缩文件夹

    mac压缩文件并进行加密方法

    zip -er file.zip dir1 dir2
    file.zip: 被压缩后的文件名
    dir1: 被压缩的文件夹 可以同时压缩多个 dir1 dir2 dir3

    示例:

    Ethan@Ethan-mac > ~/Downloads/source> zip -er 3M以上.zip 3M以上
    
    Enter password:
    
    Verify password:
    
      adding: 3M以上/ (stored 0%)
    
      adding: 3M以上/蛇血欲焰.txt (deflated 47%)
    
      adding: 3M以上/都市修仙之武道.txt (deflated 55%)
    
      adding: 3M以上/掌御九天.txt (deflated 53%)
    
      adding: 3M以上/最强游戏分身.txt (deflated 51%)
    
      adding: 3M以上/混混小子修仙记 .txt (deflated 55%)
    
      adding: 3M以上/火影之神之轮回(1-1533)_1.txt (deflated 52%)
    
      adding: 3M以上/网游之大道至尊.txt (deflated 55%)
    
      adding: 3M以上/神魂变.txt (deflated 47%)
    
      adding: 3M以上/天下第一丁.txt (deflated 60%)
    
      adding: 3M以上/都市之玩世高手.txt (deflated 52%)

    ps: 补充:

    以上方法仅限于mac自己使用,若打算将压缩文件共享,则还需要用专门的压缩软件,因为很可能windows解析mac生成的压缩文件会造成乱码等这种问题

  • php多进程编程

    <?php
    //  建议php5.3以上,代码中自行调用pcntl_signal_dispatch();
    if (!function_exists("pcntl_signal_dispatch")) {
        declare(ticks=1);
    }
    pcntl_signal(SIGCHLD, SIG_IGN); // 注册信号处理函数  如果父进程不关心子进程什么时候结束,设为SIG_IGN, 子进程结束后,内核会回收,并不再给父进程发送信号
    
    $child_pids = [];
    for ($i = 0; $i<3; $i++) {
        $child_pid = pcntl_fork();
    
        switch ($child_pid) {
            case -1:
                exit('fork fail!');
                break;
            case 0:
                echo '子进程开始,PID:' . getmypid() . PHP_EOL;
                sleep(rand(1,5));
                echo '子进程结束,PID:' . getmypid() . PHP_EOL;
                exit();
                break;
            default:
                $child_pids[] = $child_pid;
                echo '父进程-runing,PID:' . getmypid() . PHP_EOL;
                break;
        }
    }
    
    while (count($child_pids)) {
        foreach ($child_pids as $key => $child_pid) {
            if (!function_exists("pcntl_signal_dispatch")) {
                pcntl_signal_dispatch();
            }
            //$res = pcntl_wait($status, WNOHANG);
            $res = pcntl_waitpid($child_pid, $status, WNOHANG);
            if ($res == -1 || $res > 0) {
                echo '子进程退出, PID:' . $child_pid . PHP_EOL;
                unset($child_pids[$key]);
            } else {
                usleep(500000);
                echo 'WAIT' . PHP_EOL;
            }
        }
    }
    echo '父进程退出' . PHP_EOL;
  • docker部署php-fpm,nginx,mysql

    mysql

    1. 获取mysql官方最新docker镜像

    docker pull mysql/mysql-server:latest

    2. 查看下载的镜像

    docker images

    3. 创建一个文件夹用户挂载mysql数据库文件

    mkdir -p /data/docker/mysql/data

    4. 生成mysql容器

    docker run --name mysql -d --restart always -p 3306:3306 -v /data/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=q78b6513$de-ert --privileged=true mysql/mysql-server
    --name mysql: 指定容器明后才能-d: 后台运行容器,并返回容器ID
    --restart always: 在容器退出时重启容器
    -p 3306:3306: 将宿主机的3306端口(前者)映射到容器的3306端口(后者)
    -v /data/docker/mysql/data: 将宿主机的目录/data/docker/mysql/data映射到容器的目录/var/lib/mysql
    -e MYSQL_ROOT_PASSWORD: 设置初始密码

    5. 查看容器启动状态

    docker ps -a # 查看已创建的容器
    docker ps -s # 查看已启动的容器

    若容器已创建但未启动,可通过以下命令启动

    docker start mysql

    6. 连接mysql

    docker exec -it mysql bash # 进入容器
    mysql -uroot -p # 以之前设置的密码登入mysql
    alter USER 'root'@'localhost' identified with mysql_native_password by 'q67v5387$-ryhab'; # 设置root密码
    FLUSH PRIVILEGES; # 刷新

    nginx

    1. 获取镜像

    docker pull nginx:latest

    2. 查看下载的镜像

    docker images

    3. 创建一个文件夹用户挂载nginx站点目录以及配置文件

    mkdir -r /data/www/htdocs
    mkdir -p /data/docker/nginx/conf.d

    4. 生成nginx容器

    docker run -d -p 80:80 -v /data/www/htdocs:/usr/share/nginx/html -v /data/docker/nginx/conf.d/:/etc/nginx/conf.d --name nginx --privileged=true nginx

    5. 查看容器启动状态

    docker ps

    php-fpm

    1. 获取镜像

    docker pull bitnami/php-fpm:latest

    2. 查看下载的镜像

    docker images

    3. 生成php-fpm容器

    docker run -d -p 9000:9000 --name php-fpm -v /data/www/htdocs:/var/www/html --privileged=true bitnami/php-fpm

    与nginx共享站点目录/data/www/htdocs

    4. 查看容器启动状态

    docker ps

    优化

    固定ip

    现有设置,每次重启容器,该容器的ip地址就会更换,这就导致每次需要改nginx中配置的php-fpm的ip, 同时连接数据库的ip也有同样问题

    1. docker默认网络

    docker network ls
    bridge:桥接网络默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了
    none:无指定网络使用 --network=none ,docker 容器就不会分配局域网的IP
    host: 主机网络使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。

    2. 创建自定义网络

    docker network create --subnet=172.18.0.0/16 mynetwork

    3. 删除原先创建的容器

    docker stop mysql # 停止容器
    docker stop nginx
    docker stop php-fpm
    docker ps -a # 查看创建的容器
    docker rm {$ID} # 删除创建的容器

    4. 指定ip创建容器

    docker run --net mynetwork --ip 172.18.0.2 --name mysql -d --restart always -p 3306:3306 -v /data/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=#q78b6513$de-ert --privileged=true mysql/mysql-server
    docker run --net mynetwork --ip 172.18.0.3 --name nginx -d -p 443:443 -p 80:80 -v /data/www/htdocs:/usr/share/nginx/html -v /data/docker/nginx/conf.d/:/etc/nginx/conf.d -v /data/docker/nginx/ssl/:/etc/nginx/ssl -v /data/docker/nginx/log/:/var/log/nginx --privileged=true nginx

    # 此处注意,要先按照之前的方式启动php-fpm容器,将其中的php-fpm.conf,www.conf拷贝到宿主机相应位置

    docker run --net mynetwork --ip 172.18.0.4 -d -p 9000:9000 -p 9001:9001 -p 9002:9002 --name php-fpm -v /data/www/htdocs:/var/www/html -v /data/docker/php-fpm/php-fpm.conf:/opt/bitnami/php/etc/php-fpm.conf -v /data/docker/php-fpm/fpm.d/:/opt/bitnami/php/etc/php-fpm.d -v /data/docker/php-fpm/fpm.d/www.conf:/opt/bitnami/php/etc/php-fpm.d/www.conf --privileged=true bitnami/php-fpm

    ps:

    一定要加上–privileged=true,否则挂在的目录会提示无权限

    要挂载的宿主机目录一定要提前创建

    mysql8 添加用户

    create user 'new_user'@'172.18.0.4' identified with mysql_native_password by 'q67v5387$-ryhab';
    grant all privileges on test_db.* to 'new_user'@'172.18.0.4' with grant option;
    flush privileges;

    nginx配置

    nginx一定要配置nginx容器内的路径root /user/share/nginx/html/

    nginx连接php-fpm,一定要配置php容器内的路径

    location ~ \.php$ {
    
        root /var/www/html/;
    
        fastcgi_pass 172.18.0.4:9000;#php容器的IP地址
    
        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;
    
    }

    若配置证书,路径必须是相对路径,不支持绝对路径

    ssl_certificate   ./ssl/server.pem;
    
    ssl_certificate_key   ./ssl/server.key;
    
    ssl_session_timeout   5m;
    
    ssl_protocols   SSLv2 SSLv3 TLSv1;
    
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    
    ssl_prefer_server_ciphers on; 

  • mysql字段int(n),char(n),varchar(n)长度解析

    相信大家无论是在看其他人设计的数据表还是自己设计的数据表,都接触过int(10),tinyint(1),bigint(20)等字段类型后增加括号数字说明的情况,那这些究竟是什么意思呢?

    下面我们最直观的直接试一下,就什么都清楚了

    mysql版本

    8.0.18

    测试数据表

    CREATE TABLE `colum_len_test` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `int_id_short` int(1) NOT NULL DEFAULT '0',
      `int_id_long` int(10) NOT NULL DEFAULT '0',
      `int_id_long_fill` int(10) zerofill NOT NULL DEFAULT '0',
      `tinyint_id_short` tinyint(1) NOT NULL DEFAULT '0',
      `tinyint_id_long` tinyint(3) NOT NULL DEFAULT '0',
      `tinyint_id_long_fill` tinyint(3) zerofill NOT NULL DEFAULT '0',
      `bigint_id_short` bigint(1) NOT NULL DEFAULT '0',
      `bigint_id_long` bigint(10) NOT NULL DEFAULT '0',
      `bigint_id_long_fill` bigint(10) zerofill NOT NULL DEFAULT '0',
      `char_short`  char(1)  NOT NULL DEFAULT '',
      `varchar_short` varchar(1)  NOT NULL DEFAULT '',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    测试

    1. int插入比设置数字长的数,无影响

    insert into colum_len_test(int_id_short) values (123);
    
    mysql> select int_id_short from colum_len_test where int_id_short=123;
    +--------------+
    | int_id_short |
    +--------------+
    |          123 |
    +--------------+

    2. int插入比设置数字短的数,无影响

    insert into colum_len_test(int_id_long) values (1);
    
    mysql> select int_id_long from colum_len_test where int_id_long=1;
    +-------------+
    | int_id_long |
    +-------------+
    |           1 |
    +-------------+

    3. int插入比设置数字短的数,且字段设置了zerofill时,左侧自动补零

    insert into colum_len_test(int_id_long_fill) values (1);
    
    mysql> select int_id_long_fill from colum_len_test where int_id_long_fill=1;
    +------------------+
    | int_id_long_fill |
    +------------------+
    |       0000000001 |
    +------------------+

    4. 经试验,tinyint, bigint同int

    5. char插入比设置数字长的字符串,插入失败

    mysql> insert into colum_len_test(char_short) values ('123');
    ERROR 1406 (22001): Data too long for column 'char_short' at row 1

    6. varchar插入比设置数字长的字符串,插入失败

    mysql> insert into colum_len_test(varchar_short) values ('123');
    ERROR 1406 (22001): Data too long for column 'varchar_short' at row 1

    总结

    1. 定义数据库int,tinyint,bigint字段时,一般不需要设置它的长度
    2. 定义数据库char.varchar字段时,要根据实际需求,预留设置好足够的长度
  • 理解科学世界的四张王牌

    在《漫画相对论》一书中,汪诘提到了理解科学世界的四张王牌,杀手锏,个人感觉还是非常的有道理的。

    王牌1: 波普尔证伪说

    所有的物理规律(或者说科学定律)都是永远无法被“证实”的。

    为了说明这一点,书中介绍了一个很通俗易懂的例子。

    假设,经过30年的不解努力,终于发现了一个很厉害的科学规律“天下乌鸦一般黑”

    怎么证明呢?到全世界抓无数的乌鸦样本,无一例外都是黑的。但是,“你把世界上所有的乌鸦都抓来了吗?””秦汉三国晋唐宋元明清的乌鸦呢?”“明年的乌鸦呢?”“2046年的乌鸦呢?”

    我们无法穷尽古今中外,过去未来的所有乌鸦,但是我们可以大胆语预言,那一天,你找到一只乌鸦,我不用看就知道一定是黑色的。

    但是,如果有一天,你在某个神秘的角落找到一只白色的乌鸦,那我的理论就不攻自破了。

    “波普尔证伪说”认为,只有满足了“预言”和“证伪”两个条件的理论,我们才能冠以科学之名。反之,如果说一个理论作出的预言是永远不会被实验推翻的,那这就是伪科学。

    王牌2: 奥克姆剃刀原理

    如无必要,勿增实体

    “奥克姆剃刀原理”会“剃”掉两样东西

    理论中冗余的部分

    不能被感知和检测的东西

    我们都知道,物体往下坠落,是因为有重力,或者说万有引力。

    这时候,如果我们假设,万有引力是因为神设置的一个规则从而产生,然后导致表现出来的重力,物体坠落。

    这条假设,在万有引力上有加了一个神设规则,并且神与规则是不可感知和检测的,那么,按照“奥克姆剃刀原理”,这个假设就需要被“咔嚓”掉。

    王牌3: 思维实验

    在大脑中运行的试验

    这个大家应该很好理解,众所周知,爱因斯坦就是一个非常擅长思维实验的人,且相对论的诞生也离不开思维实验

    王牌4: 佯谬

    乍一看肯定不对,但没想到却是真的

    这一点,书中举了一个很妙的例子。

    东大和神大两所大学,假设都是只有物理系和外语系两个专业

    物理系男女比例为:

    东大 5:1  神大 2:1

    外语系男女比例:

    东大 0.5:1  神大 0.2:1

    所有专业,东大的男女比例都高于神大,所以,很明显了,东大整体的男女比例大于神大。

    但是,真的吗?事实是,东大的整体男女比例小于神大,不相信?下面是具体的数据,你自己算下吧:

    在物理学或者说不仅仅是物理学里面,经常会出现一些,你认为不可能发生的事情但最后恰恰又被实验证明千真万确会发生,这也许就是科学的魅力所在吧!

  • 《爱情公寓5》有感

    情怀难忘终成正果,

    跌跌撞撞述人生你我。