在童年的记忆中,相信很多人都看过一个非常温馨的公益广告,给妈妈洗脚,这部公益广告在当时感动了无数的观众,我还记得,当初学校还专门布置了回家给父母洗脚的作业,不知道你们有没有。
前几天,一个偶然的机会,提到了这个广告,所以就搜索了下重新看了一遍,重又感动了一次,分享给大家
在童年的记忆中,相信很多人都看过一个非常温馨的公益广告,给妈妈洗脚,这部公益广告在当时感动了无数的观众,我还记得,当初学校还专门布置了回家给父母洗脚的作业,不知道你们有没有。
前几天,一个偶然的机会,提到了这个广告,所以就搜索了下重新看了一遍,重又感动了一次,分享给大家
父亲藏饺子给儿子 公益广告令人泪奔
简介:
爸爸得了老年痴呆,儿子带他去吃饭。盘子里面剩下两个饺子,爸爸直接用手抓起饺子放进了口袋。儿子愣住了。爸爸说,我儿子最爱吃这个了。最后广告出字:他忘记了一切,但从未忘记爱你!
以前小的时候感触不是很大,但随着年龄的增长,父母的年龄越来越大,偶然再次看到这个广告,心中百感凝噎。
在父母还健在时,多多陪陪他们吧,不要等到子欲养而亲不待才后悔不已。万一哪一天,你的父母也不再记得你,不再记得很多事,请不要烦他,怪他,也许他忘记了很多事情,但他却从未忘记爱你!
今天遇到一个问题,千万级别的数据表,需要全部进行遍历,如果用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压缩文件并进行加密方法
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
// 建议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;
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; # 刷新
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
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地址就会更换,这就导致每次需要改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,否则挂在的目录会提示无权限
要挂载的宿主机目录一定要提前创建
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容器内的路径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;
相信大家无论是在看其他人设计的数据表还是自己设计的数据表,都接触过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
总结
在《漫画相对论》一书中,汪诘提到了理解科学世界的四张王牌,杀手锏,个人感觉还是非常的有道理的。

所有的物理规律(或者说科学定律)都是永远无法被“证实”的。
为了说明这一点,书中介绍了一个很通俗易懂的例子。
假设,经过30年的不解努力,终于发现了一个很厉害的科学规律“天下乌鸦一般黑”
怎么证明呢?到全世界抓无数的乌鸦样本,无一例外都是黑的。但是,“你把世界上所有的乌鸦都抓来了吗?””秦汉三国晋唐宋元明清的乌鸦呢?”“明年的乌鸦呢?”“2046年的乌鸦呢?”
我们无法穷尽古今中外,过去未来的所有乌鸦,但是我们可以大胆语预言,那一天,你找到一只乌鸦,我不用看就知道一定是黑色的。
但是,如果有一天,你在某个神秘的角落找到一只白色的乌鸦,那我的理论就不攻自破了。
“波普尔证伪说”认为,只有满足了“预言”和“证伪”两个条件的理论,我们才能冠以科学之名。反之,如果说一个理论作出的预言是永远不会被实验推翻的,那这就是伪科学。
如无必要,勿增实体
“奥克姆剃刀原理”会“剃”掉两样东西
理论中冗余的部分
不能被感知和检测的东西
我们都知道,物体往下坠落,是因为有重力,或者说万有引力。
这时候,如果我们假设,万有引力是因为神设置的一个规则从而产生,然后导致表现出来的重力,物体坠落。
这条假设,在万有引力上有加了一个神设规则,并且神与规则是不可感知和检测的,那么,按照“奥克姆剃刀原理”,这个假设就需要被“咔嚓”掉。
在大脑中运行的试验
这个大家应该很好理解,众所周知,爱因斯坦就是一个非常擅长思维实验的人,且相对论的诞生也离不开思维实验
乍一看肯定不对,但没想到却是真的
这一点,书中举了一个很妙的例子。
东大和神大两所大学,假设都是只有物理系和外语系两个专业
物理系男女比例为:
东大 5:1 神大 2:1
外语系男女比例:
东大 0.5:1 神大 0.2:1
所有专业,东大的男女比例都高于神大,所以,很明显了,东大整体的男女比例大于神大。
但是,真的吗?事实是,东大的整体男女比例小于神大,不相信?下面是具体的数据,你自己算下吧:

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