September https://www.177ow.com/ zh-CN 我见青山多妩媚 Mon, 22 Aug 2022 22:56:48 +0800 Mon, 22 Aug 2022 22:56:48 +0800 提高 nvm-windows 下载速度,提高 npm 下载速度 https://www.177ow.com/archives/188/ https://www.177ow.com/archives/188/ Mon, 22 Aug 2022 22:56:48 +0800 九月 1. 提高 nvm-windows 下载 node.js 及 npm 的速度

1.1 在控制台修改镜像,使用淘宝镜像

nvm node_mirror http://npm.taobao.org/mirrors/node/ // 注意结尾有斜杠
nvm npm_mirror https://npm.taobao.org/mirrors/npm/

1.2. 手动修改 nvm 根目录下的 setting.txt 文件

添加两行:

node_mirror: http://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/

2. 提高 npm 下载 node.js 模块的速度

$ npm install -g cnpm --registry=https://registry.npm.taobao.org
// 有时候这样仍然会失败,镜像并没有改变,可使用下面这条命令修改
$ npm config set registry https://registry.npm.taobao.org

然后即可使用 cnpm 替代 npm 来安装模块。

]]>
0 https://www.177ow.com/archives/188/#comments https://www.177ow.com/feed/archives/188/
口语练习 https://www.177ow.com/archives/187/ https://www.177ow.com/archives/187/ Tue, 12 Jul 2022 14:12:02 +0800 九月 https://www.appinn.com/youglish/

]]>
0 https://www.177ow.com/archives/187/#comments https://www.177ow.com/feed/archives/187/
windows禁用音量自动调整,待验证 https://www.177ow.com/archives/186/ https://www.177ow.com/archives/186/ Wed, 22 Jun 2022 10:24:11 +0800 九月 https://docs.microsoft.com/en-US/SkypeForBusiness/troubleshoot/server-configuration/disable-automatic-gain-control

https://github.com/TomyCesaille/UnfuckMicrophone

]]>
0 https://www.177ow.com/archives/186/#comments https://www.177ow.com/feed/archives/186/
在 WSL2 Debian 10上安装原生 Docker https://www.177ow.com/archives/184/ https://www.177ow.com/archives/184/ Thu, 07 Apr 2022 14:24:46 +0800 九月 以下内容结合docker官网文档及网上错误解决方案,在wsl2 Debian 10 上测试通过。

删除旧版本的docker

旧版本的docker名称可能叫docker, docker.io, 或者docker-engine, 如果你之前安装过旧的版本,需要首先卸载:

sudo apt remove docker docker-engine docker.io containerd runc
[sudo] password for david:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package 'docker-engine' is not installed, so not removed
E: Unable to locate package containerd

我们现在安装的Docker是社区版的,被称为docker-ce. 有很多种方法可以在 Debian 上安装 Docker-ce, 这里我们直接用Docker仓库(Docker repository)进行安装。

首先需要更新源,并安装依赖包:

sudo apt update
sudo apt install \

apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release

添加 Docker 的官方 GPG 密钥:

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
指定docker仓库性质为稳定版:

echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装docker:

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
运行测试出错

sudo docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
排查过程:

sudo service docker start
grep: /etc/fstab: No such file or directory
[ ok ] Starting Docker: docker.
sudo service docker status [FAIL]
Docker is not running ... failed!
网上找到解决方案,方法如下:

sudo touch /etc/fstab
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
问题解决,运行hello world状况正常:

sudo service docker start
[ ok ] Starting Docker: docker.
sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:

  1. The Docker client contacted the Docker daemon.
  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
  3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
  4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

转载链接

]]>
0 https://www.177ow.com/archives/184/#comments https://www.177ow.com/feed/archives/184/
strotime 注意事项 https://www.177ow.com/archives/176/ https://www.177ow.com/archives/176/ Fri, 01 Apr 2022 14:56:00 +0800 九月 背景:

strtotime 是常用的一个函数,在计算增减时间的时候很方便, 比如 strotime("+1 day"),就能得到一个一天后的时间戳。 尽管官方手册不建议用来做运算(+1 day), 但是懒是天性, 能用一行代码解决的就不想再用其他办法, 于是就踩坑了。

测试代码:

php -r "var_dump(date('Y-m-d H:i:s', strtotime('+1 month', strtotime('2021-01-30'))));"

在2021-01-30 的基础上加一个月, 初始写代码的结果是期望得到 2021-02-28 号,然后进行后续逻辑。实际结果如下:
2022-04-01T06:51:34.png

变成了3月2号!!, 完全不是预期的结果!。 但是要是基准日期是7月份,结果又特么对了。 这还只是测试代码, 如果业务中是包装了好几层, 比如每月月底计算下月的数据,就有可能有的月份数据正常, 有的月份数据异常。

原因:
查了下相关资料, 这个是正确结果!!!

strtotime 执行增减日期的步骤:

1:先增减日期 ,2021-01-30 先+1 month 变成 2021-02-30, 2021-07-30 先+1 month 变成 2021-08-30

2:然后再日期规范化, 2021-02-30 不是合法日期, 就规范为 2021-03-02 (要是闰年2020 就是 2020-03-01), 2021-08-30 合法日期 不需要规范。

然后就得出结果。

解决方式:

传说中的优雅 (“first day of ”/"last day of")修正短语。
2022-04-01T06:53:00.png

如果想要循环获取接下来的每个月份,可以使用以下方法:

$date = '2021-01-31 12:00:01';
for ($i = 1; $i <= 24; $i ++)
{
    var_dump(getNextDate($date, $i));
}
function getNextDate($start_time, $month)
{
    $timestamp = strtotime($start_time);
    $next_timestamp = strtotime('+' . $month . ' month', $timestamp);

    $current_month = date('n', $timestamp);
    $should_month = bcmod(bcadd($current_month, $month), 12) ?: 12;
    $calculate_month = date('n', $next_timestamp);

    if ($should_month != $calculate_month) {
        $next_timestamp = strtotime($start_time  . 'last day of +' . $month . ' month');
    }

    return date('Y-m-d 00:00:00', $next_timestamp);
}

结果如下:
2022-04-01T06:56:06.png

]]>
0 https://www.177ow.com/archives/176/#comments https://www.177ow.com/feed/archives/176/
traefik学习资料整理 https://www.177ow.com/archives/173/ https://www.177ow.com/archives/173/ Tue, 08 Feb 2022 18:00:08 +0800 九月 从零开始使用开源文档/Wiki软件 Outline

更简单的 Traefik 2 使用方式

Traefik 2 使用指南,愉悦的开发体验

使用服务发现改善开发体验

]]>
0 https://www.177ow.com/archives/173/#comments https://www.177ow.com/feed/archives/173/
面试题整理 https://www.177ow.com/archives/154/ https://www.177ow.com/archives/154/ Thu, 06 May 2021 10:50:00 +0800 九月 1.MYSQL中主键与唯一索引的区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的
主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键
唯一性索引列允许空值,而主键列不允许为空值
主键列在创建时,已经默认为空值 + 唯一索引了
主键可以被其他表引用为外键,而唯一索引不能
一个表最多只能创建一个主键,但可以创建多个唯一索引
主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等
在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度

https://blog.csdn.net/baoqiangwang/article/details/4832814
2.获取当前客户端的IP地址,并判断是否在(1.1.1.1,255.255.255.254)

function getip()
{
    $unknown = 'unknown';
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    /*
    处理多层代理的情况
    或者使用正则方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
    */
    if (false !== strpos($ip, ','))
        $ip = reset(explode(',', $ip));
    return $ip;
}

$client_ip = getip();
$client_ip = sprintf('%u', ip2long($client_ip));   //64位系统无压力

/**
 * plan A
 */
$range_min = sprintf('%u', ip2long('1.1.1.1'));
$range_max = sprintf('%u', ip2long('255.255.255.255'));

/**
 * plan B
 */
$range_min = bindec(decbin(ip2long('1.1.1.1')));
$range_max = bindec(decbin(ip2long('255.255.255.255')));


if ($client_ip >= $range_min and $client_ip <= $range_max) {
    echo 'true';
} else {
    echo 'false';
}

3.什么是CSRF攻击?XSS攻击?如何防范?
CSRF:https://baike.baidu.com/item/CSRF/2735433
防范方式: CSRF TOKEN, 即提交表单时同时提交一段由服务端渲染表单时生成的token,通过校验token来防范csrf攻击

XSS:https://baike.baidu.com/item/xss/917356
简单来说,XSS就是正常页面执行了用户或黑客提交的前端代码,比如你用了eval('这里执行了用户提交的代码'),
或者你的页面正常解析了用户提交的html代码,如用户提交的个人信息是:,
而你不加过滤转义就入库,然后页面正常解析html代码,最终用户访问这个页面就会跳转到恶意网站 ,这就是XSS
防范方式: 过滤&&转义用户输入(如htmlentities、htmlspecialchars),永久不要信任客户端

4.http与https的主要区别
个基于OSI模型理解:
http工作在应用层
https是建立在SSL信道上的http,而SSL属于OSI模型中的传输层,所以我觉得HTTPS是属于传输层的协议
但有同学提出了不同看法,相关讨论见:https://github.com/hookover/php-engineer-interview-questions/issues/7

所以如果是基于TCP/IP模型的话:HTTP和SSL都是工作在应用层,那么HTTP和HTTPS同属应用层协议

http是明文传输
https是加密传输

面试官会问到ssl数字证书,对称加密和非对称加密的区别

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为以下四点:
一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

https://baike.baidu.com/item/https

5.http状态码及其含意
基本记住200、201、301、302、400、403、404、500、502、503就差不太多了

6.优化MYSQL的方法
个人理解:
需要从整个项目环境来谈优化,具体可以分为3个方面:
硬件层面:

采用高配sass硬盘、上磁盘阵列

架构层面:

分库、分区、分表、主从(主主)、多服务器集群、vip+keepalive等   (可能会问到具体实现,所以在回答前要把这些实现细节搞得差不多懂)

应用层面(下面只要你提到,面试官都可能会问细节,比如有哪些存储引擎,各有什么区别和应用场景,innodb的主键索引和非主键索引有何区别,数据结构,叶子节点存放什么?)

存储引擎的选择
字段的选择
    越短越快
    定长类型快于变长类型
    整型的处理速度快于字符串类型
索引
   MYSQL支持的索引类型 (讲到这肯定会问你具体定义)
   索引的使用条件
   索引的实现结构
       聚簇索引(聚集索引),非聚集索引,B+Tree
       HASH索引
慢查询日志
    可帮助找到问题语句
通过explain来优化sql语句

7.数据库中的事务是什么?
事务的特征:ACID
原子性Atomicity 一组DML语句要么全部成功要么全部失败
一致性Consistency 事务必须由一个状态到另一个状态
隔离性Isolation 多个事务之间能够根据事务的隔离级别表现不同
持久性Durability 提交后的事务,一旦提交,它对数据库中的数据修改是永久性的

Q:当没有事务的情况会出现什么问题?
A:当在控制台,操作mysql数据库时候,如果没有事务控制,误操作就会造成数据的永久损失。
事务的隔离级别:

隔离级别 脏读 不可重复读 幻读 加锁读?
读未提交(Read uncommitted) o o o 不加锁
读已提交(Read committed) x o o 不加锁
可重复读(Repeatable read) x x o(mysql不会出现 x) 不加锁
可串行读(Serializable) x x x 加锁 (全表锁)
脏读:当某个客户端查询出了另外一个事务还没有提交的修改数据,即为脏读。
不可重复读:[同一查询]在[同一事务]中多次进行,由其它提交事务所做的修改或删除,每次返回不同的的结果集,此时发生非重复读。
幻读:[同一查询]在[同一事务]中多次进行,由于其它提交事务(事务可能没提交)所做的插入操作,每次返回不同的结果集,此时发生幻读
8.Ajax 跨域请求时,会出现什么问题?如何解决
9.设计一个微信红包的功能(从代码、服务器架构、数据库、性能等详细实现细节)
微信红包系统设计分享,如何扛住100亿次请求:http://www.woshipm.com/pd/232838.html
知乎有一些算法:https://www.zhihu.com/question/22625187
QA:https://www.zybuluo.com/yulin718/note/93148

注意:比如让你写两个接口,一个抢红包接口,一个发红包接口,让你设计整套的存储系统、代码实现,你怎么来做?

10.网页/应用访问慢突然变慢,如何定位问题?
top、iostat查看cpu、内存及io占用情况
内核、程序参数设置不合理 查看有没有报内核错误,连接数用户打开文件数这些有没有达到上限等等
链路本身慢 是否跨运营商、用户上下行带宽不够、dns解析慢、服务器内网广播风暴什么的
程序设计不合理 是否程序本身算法设计太差,数据库语句太过复杂或者刚上线了什么功能引起的
其它关联的程序引起的 如果要访问数据库,检查一下是否数据库访问慢
是否被攻击了 查看服务器是否被DDos了等等
硬件故障 这个一般直接服务器就挂了,而不是访问慢

11.Linux 硬链接和软链接有什么区别?
硬链接不可以跨分区,软件链可以跨分区
硬链接指向一个 i 节点,而软链接则是创建一个新的 i 节点
删除硬链接、软链接文件,对原文件都没有什么影响,但是如果删除原文件,会导致软连接失效,硬链接无影响。
12.TCP 三次握手的流程
客户端发送一个 SYN 标志位置 1 的包,指明客户端要连接服务器端的接口,发送完毕后,客户端进入 SYN_SEND 状态

服务器发回确认包 (ACK) 应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。
客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1
发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。
13.Redis、Memecached 这两者有什么区别?
Redis 支持更加丰富的数据存储类型,String、Hash、List、Set 和 Sorted Set。Memcached 仅支持简单的 key-value 结构。
Memcached key-value存储比 Redis 采用 hash 结构来做 key-value 存储的内存利用率更高。
Redis 提供了事务的功能,可以保证一系列命令的原子性
Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中
Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis 在存储小数据时比 Memcached 性能更高。
14.冒泡排序或者快速排序算法
15.git Push 代码时发生突破如何处理?
1、使用 git stash 将本地文件暂存

2、更新代码 git pull

3、还原暂存的内容 git stash pop

]]>
0 https://www.177ow.com/archives/154/#comments https://www.177ow.com/feed/archives/154/
Linux使用鼠标侧键 https://www.177ow.com/archives/153/ https://www.177ow.com/archives/153/ Fri, 02 Apr 2021 09:08:53 +0800 九月 https://wiki.archlinux.org/index.php/Logitech_MX_Master https://github.com/PixlOne/logiops ]]> 0 https://www.177ow.com/archives/153/#comments https://www.177ow.com/feed/archives/153/ ubuntu tp网卡 https://www.177ow.com/archives/144/ https://www.177ow.com/archives/144/ Wed, 10 Mar 2021 09:07:00 +0800 九月 https://github.com/whitebatman2/rtl8821CU.git
https://gitea.eventnet.cn/dev/rtl8821CU.git
https://gitea.eventnet.cn/dev/test.git
https://blog.meathill.com/device/config-tp-wdn5200h-in-ubuntu-20-04.html
我是下载内容
rtl8821CU-master.zip

]]>
0 https://www.177ow.com/archives/144/#comments https://www.177ow.com/feed/archives/144/
记录常用命令 https://www.177ow.com/archives/142/ https://www.177ow.com/archives/142/ Mon, 25 Jan 2021 10:00:46 +0800 九月 php think crud -t sign_up -u 1 ]]> 0 https://www.177ow.com/archives/142/#comments https://www.177ow.com/feed/archives/142/