{music id="38574742" color="#7c0e4e" autoplay="autoplay"/}

Howdy 是 Linux 上一个类似 Windows Hello,用电脑传感器人脸识别以解锁电脑的程序。

一、安装前的准备

1.开启系统全局代理

如果使用图形代理软件,比如clash等,直接手动点击开启全局即可。如果用的是命令行代理可以使用Polipo设置本地全局代理(proxychains无效)。

{alert type="info"}
polipo是类似clash作用的本地流量转发工具,并不提供代理服务器功能。所以你得先在本地开启ssr、trojan等代理,之后再使用polipo。 polipo具体使用(本地已经使用trojan开启了1080端口的socket5代理)
{/alert}

# 开启当前终端全局
export http_proxy=http://127.0.0.1:8123 https_proxy=http://127.0.0.1:8123

二、Howdy安装与配置

{alert type="info"}
对应linux发行版的howdy安装都可以在官方github上找到: https://github.com/boltgolt/howdy
这里主要介绍一下在shafish当前使用的manjaro i3wm系统下安装和使用howdy的流程 :@(得意) 。
{/alert}

1. Arch/Manjaro

# 会有资源下载和编译的步骤,如果没开全局代理,在下载资源时你会后悔得 :@(呲牙) 
yay -S howdy

2. Configuration

{alert type="success"}
howdy安装完成后会在/etc/pam.d目录中生成多个配置文件,每个配置文件都能绑定人脸识别来解锁对应的命令或操作。

  • 比如shafish电脑熄屏解锁用的i3clock,只要配置好i3lock文件,就可以使用人脸代替解锁密码;
  • 比如sudo,当第一次输入sudo命令时也同样需要输入密码,只要配置好sudo文件,就可以使用人脸代替密码;
    i3clock&sudo
    {/alert}

2.0 更改howdy文件夹权限

sudo chmod -R 755 /lib/security/howdy

2.1 设置扫描摄像头

# 展示本机的video设备,笔记本的话一般使用第一个就好:也就是/dev/video0
v4l2-ctl --list-devices

2.2 配置howdy扫描设备

/dev/video0配置到howdy中,表示要使用该设备做人脸扫描。

# 或者 直接运行 sudo howdy config ,默认使用nano编辑,使用ctrl+x保存退出
sudo vim /lib/security/howdy/config.ini 
# 修改device_path为/dev/video0
device_path = /dev/video0
# :wq保存退出

device_path

2.3 设置人脸数据

# sudo howdy -U username add 
sudo howdy -U shafish add # 提示label可以随便填

强烈建议输入多条数据,设置填入的label不同即可
face

2.4 设置i3lock人脸解锁

配置也很简单,只要在目录/etc/pam.d下对应的文件中加入auth sufficient pam_python.so /lib/security/howdy/pam.py即可。

[~]$ cat /etc/pam.d/i3lock                    
#
# PAM configuration file for the i3lock-color screen locker. By default, it includes
# the 'system-local-login' configuration file (see /etc/pam.d/system-local-login)
# for Arch and Gentoo and 'login' for Debian. Note that upstream uses only 'login',
# which doesn't work on Arch and Gentoo.
#
auth sufficient pam_python.so /lib/security/howdy/pam.py
auth include system-local-login # For Arch/Gentoo
#auth include login # For Debian

2.5 设置sudo使用人脸数据

[~]$ cat /etc/pam.d/sudo  
#%PAM-1.0
auth sufficient pam_python.so /lib/security/howdy/pam.py
auth        include        system-auth
account        include        system-auth
session        include        system-auth

ok,搞定。下次再使用i3clock和sudo命令时就不用输入密码咧, ::(狗头)

三、Howdy more

使用过程中出现warning 597、1034、2056可以设置环境变量 OPENCV_LOG_LEVEL=ERROR解决
  • 启用 Howdy 功能:sudo howdy disable 0
  • 禁用 Howdy 功能:sudo howdy disable 1
  • 添加人脸模型:sudo howdy -U username add
  • 清除所有面部模型记录:sudo howdy clear
  • 面部模型记录:sudo howdy list
  • 删除指定 ID 的面部记录:sudo howdy remove face_ID
  • 面部扫描测试:sudo howdy test
  • 更多:sudo howdy -h

ref:
https://wiki.archlinux.org/title/Howdy_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
https://github.com/boltgolt/howdy

{music id="1344897943" color="#a9289f" autoplay="autoplay"/}

Linux系统的逻辑卷支持类似window的多盘动态合并(LVM: :@(长草) ),也提供了灵活的硬盘挂载功能,使用mount可以把整个硬盘或者硬盘内某个分区挂载在指定linux目录下,扩大该目录的容量。
但是shafish之前安装时没有使用lvm,当时还不知道这东西(LVM: :@(小怒) ),所以本文介绍的挂载点扩容操作是指:把系统中磁盘使用率高的挂载点进行扩容,而不是在挂载点下再挂一个新的分区。这方面接触少的童鞋可能不是很清楚啥意思,那就先全文浏览一遍?走起 :@(鼓掌)

一、分区进行ext4格式化

对新分区进行格式化

# 定位需要格式化的分区,这里是上一篇文章新分配的nvme0n1p4(50G)
>lsblk
nvme0n1     259:0    0 476.9G  0 disk 
├─nvme0n1p1 259:1    0   260M  0 part /boot/efi
├─nvme0n1p2 259:2    0    16M  0 part 
├─nvme0n1p3 259:3    0 370.4G  0 part 
├─nvme0n1p4 259:4    0    50G  0 part 
├─nvme0n1p5 259:5    0  55.3G  0 part /
└─nvme0n1p6 259:6    0  1000M  0 part
# ext4格式化
>mkfs.ext4 /dev/nvme0n1p4

二、查找磁盘占用高的挂载点

>sudo du --max-depth=1 -h /
16K    /mnt
1.9M    /run
26M    /root
0    /proc
16K    /lost+found
31G    /home
2.3G    /opt
77M    /tmp
8.9G    /usr
14M    /etc
0    /dev
0    /sys
136M    /boot
2.4M    /data
12G    /var
16K    /srv
54G    /
```
毫无疑问,要扩容的挂载点是`/home`(还是建议系统安装前分配个大点的分区 :@(吐血倒地) )

## 三、替换大法进行扩容
linux系统下一切都是文件,我们只需要把挂载点`/home`下的所有文件复制到新分区,然后释放挂载点容量,最后把新分区重新挂到`/home`下就ok了。 :@(献花) 

- 1.把新分区挂载到临时挂载点
```shell
sudo mkdir /mnt/home
sudo mount /dev/nvme0n1p4 /mnt/home
```

- 2.切换用户(只保留root)
```shell
init 1
```

- 3.文件复制
```shell
# 把系统/home下的所有文件都复制到新分区中
cp -av /home/* /mnt/home
```

- 4.删除原挂载点
```shell
sudo rm -rf /home
```

- 5.挂载新分区
```shell
sudo mkdir /home
sudo umount /mnt/home
sudo mount /dev/nvme0n1p4 /home
```

- 6.设置开机固定挂载
```shell
# 查看新分区uuid
>sudo blkid /dev/nvme0n1p4
/dev/nvme0n1p4: UUID="0b5b7f34-521a-ae44-a02b-9e234f5c0129" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Basic data partition" PARTUUID="32de16c7-01b3-11ec-8713-5c3a45739ea4"
>sudo vim /etc/fstab
# 添加下面一行内容,uuid是blkid命令得到的UUID值,表示该分区在系统启动时自动挂载到/home下
UUID=0b5b7f34-521a-ae44-a02b-9e234f5c0129  /home           ext4    defaults,noatime 0 2
```

- 7.重启:`reboot`等待系统重启

- 8.检查
 ![check](https://cdn.shafish.cn/blog_photo/resize.png) 
 可以看到`/home`已经挂载上新分区使用了,`/dev/nvme0n1p5`根目录也多出了原本`/home`占用的31G容量,nice。 :@(鼓掌) 

- 9.修改i3bar显示
`sudo vim /etc/i3status.conf`
```shell
...
order += "disk /"
order += "disk /home"
...
disk "/" {
        # format = " hdd %avail "
        #format = " ⛁ %avail "
        format = "/ %avail"
}

disk "/home" {
    format = "/home %avail"
}
...
```
 ![show](https://cdn.shafish.cn/blog_photo/echo.png) 

 完美收工。 :@(赞一个) 
 

{music id="1448421768" color="#6a267d" autoplay="autoplay"/}

电脑上安装了window和manjaro系统,当初想着linux系统不用分配太多存储,就随手分配了55G安装了manjaro i3wm :@(内伤) ,我想,当初应该是脑子不正常勒,idea、vscode等各种软件还有git项目,现在50G用剩2.7G :@(抠鼻) 。想着从window C盘再分点出来,嗯,就有现在你看到的这篇随笔 :@(无奈)
图示

一、window系统中分配50G空闲分区

直接进入window存储管理右键创建空闲分区,或者下载个分区助手操作。(略过)

二、产生grub引导错误原因

创建分区后进行ext4格式化,导致新建分区对应挂载点(或者叫盘符?)替换了原来manjaro系统的挂载点。下图示:
lsblk

原本挂载点nvme0n1p4是指向manjaro系统得,现在指向了新创建的分区(50G那个);nvme0n1p5指向原来的manjaro系统(55.3G那个)。(从C盘切下来的空闲分区是紧挨C盘后面得er,想了想,盘符错乱好像也挺正常 :@(看不见) )

盘符错乱就导致了使用manjaro做开机引导的grub程序在原来的挂载点中找不到系统引导入口,所以开机后直接进入grub rescue救援模式,需要宁手动选择系统所在分区。来吧 ヾ(´・ ・`。)ノ

三、grub引导修复

1.确定系统启动挂载点/分区

进入grub模式后输入ls显示所有分区,ls 分区显示指定分区内容:

grub rescue>ls
...(hd0,nvme0n1p4) (hd0,nvme0n1p5)...
grub rescue>ls (hd0,nvme0n1p4)/
...unknown filesystem...
grub rescue>ls (hd0,nvme0n1p5)/
home etc usr ...

如果显示系统根目录内容,就说这个分区就是你原来的系统分区。这里的系统分区是(hd0,nvme0n1p5)

2.normal启动

grub rescue>set root=(hd0,nvme0n1p5)
grub rescue>set prefix=(hd0,nvme0n1p5)/boot/grub
grub rescue>insmod normal
grub rescue>normal

ok,此时你就进入原系统的开机引导界面了,选择manjaro进入系统,进行grub的引导修复

3.修复

# 打开终端
sudo update-grub
sudo grub-install /dev/nvme0n1p5

ok,搞定

{music id="1860567964" color="#6e1c67" autoplay="autoplay"/}

最近在网上找到目前使用的这个主题,弄完之后发现已经有段时间没更文章咧 :@(狂汗) (难道个人博客拖更的诅咒已经降临到shafish面前了嘛,damie :@(深思) )。

为了打破这个诅咒nie,shafish从最近的6、7月份开始,已经在慢慢整理随笔和平时笔记这类比较杂乱的记录(在gitee上),并选了一个静态的文档系统在搞事情。 :@(鼓掌)

来都来了,这里就水一下给这个文档系统加评论功能的过程吧。 ::(狗头) :@(献花)

{collapse}
{collapse-item label="看不到我看不到我"}
从未看过如此厚颜无耻之人
{/collapse-item}
{/collapse}

{lamp/}

{card-default label="选中" width="80%"}
waline是一款从 Valine 衍生的带后端评论系统。其比valine添加了登录、多部署、多数据存储、评论内容校验、防灌水、保护敏感数据等功能。其实纯粹是为mkdocs选一个评论系统,Valine简洁好用但不想用个人帐号注册leancloud,so,就是你了--waline。
{/card-default}

一、安装mysql数据库

创建个数据库,记录好用户名、密码、数据库名这三个信息,导入 https://github.com/walinejs/waline/blob/main/assets/waline.sql (创建对应表)

二、设置系统环境变量

  • 1.添加变量:vim /etc/profile.d/waline.sh

    MYSQL_DB=数据库名
    MYSQL_USER=用户名
    MYSQL_PASSWORD=密码
    SECURE_DOMAINS=shafish.cn
  • 2.变量生效:resource /etc/profile
  • 3.检查变量

    echo $MYSQL_DB
    echo $MYSQL_USER
    echo $MYSQL_PASSWORD

三、安装Waline

  • 安装后台运行node工具-pm2:npm install -g pm2
  • 安装waline:npm install @waline/vercel
  • pm2运行waline:pm2 start node_modules/@waline/vercel/vanilla.js
  • 查看状态:pm2 list
  • 删除应用:pm2 delete all 或者 pm2 delete xxxappName

{message type="success" content="如果修改了应用配置行为,需要先删除应用,重新启动后方才会生效yo"/}

四、更多waline服务端配置

服务端配置

五、域名访问

  • 1.域名dns解析添加A记录:xxx.shafish.cn

{message type="warning" content="下面2~4点如果安装了宝塔面板可以直接在面板图形操作。"/}

  • 2.free.org配置ssl

    # 填入生成的pem信息
    vim /etc/letsencrypt/live/xxx.shafish.cn/fullchain.pem
    vim /etc/letsencrypt/live/xxx.shafish.cn/privkey.pem
  • 3.配置站点

    mkdir -p /www/wwwroot/xxx.shafish.cn
    vim /www/server/panel/vhost/nginx/xxx.shafish.cn.conf
    server
    {
      listen 80;
      listen 443 ssl http2;
      server_name xxx.shafish.cn;
      index index.php index.html index.htm default.php default.htm default.html;
      root /www/wwwroot/xxx.shafish.cn;
      
      #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
      #error_page 404/404.html;
      #HTTP_TO_HTTPS_START
      if ($server_port !~ 443){
          rewrite ^(/.*)$ https://$host$1 permanent;
      }
      #HTTP_TO_HTTPS_END   自行配置ssl证书 这里使用了free.org配置
      ssl_certificate    /etc/letsencrypt/live/xxx.shafish.cn/fullchain.pem;
      ssl_certificate_key    /etc/letsencrypt/live/xxx.shafish.cn/privkey.pem;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
      ssl_prefer_server_ciphers on;
      ssl_session_cache shared:SSL:10m;
      ssl_session_timeout 10m;
      error_page 497  https://$host$request_uri;
    
      #SSL-END
      
      #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
      error_page 404 /404.html;
      error_page 502 /502.html;
      #ERROR-PAGE-END
      
      #PHP-INFO-START  PHP引用配置,可以注释或修改
      #PROXY-START
      location ~ /purge(/.*) { 
          proxy_cache_purge cache_one $host$request_uri$is_args$args;
          #access_log  /www/wwwlogs/xxx.shafish.cn_purge_cache.log;
      }
      location / 
      {
          proxy_pass http://127.0.0.1:8360; # 反代本地8360端口
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header REMOTE-HOST $remote_addr;
                  
          #持久化连接相关配置
          #proxy_connect_timeout 30s;
          #proxy_read_timeout 86400s;
          #proxy_send_timeout 30s;
          #proxy_http_version 1.1;
          #proxy_set_header Upgrade $http_upgrade;
          #proxy_set_header Connection "upgrade";
          
          add_header X-Cache $upstream_cache_status;
          
          expires 12h;
      }
      
      location ~ .*\.(php|jsp|cgi|asp|aspx|flv|swf|xml)?$
      {
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header REMOTE-HOST $remote_addr;
          proxy_pass http://127.0.0.1:8360;
          
      }
      
      location ~ .*\.(html|htm|png|gif|jpeg|jpg|bmp|js|css)?$
      {
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header REMOTE-HOST $remote_addr;
          proxy_pass http://127.0.0.1:8360;
          
          #缓存相关配置
          #proxy_cache cache_one;
          #proxy_cache_key $host$request_uri$is_args$args;
          #proxy_cache_valid 200 304 301 302 1h;
          
          expires 24h;
      }
      #PROXY-END
    
      include enable-php-70.conf;
      #PHP-INFO-END
      
      #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
      include /www/server/panel/vhost/rewrite/xxx.shafish.cn.conf;
      #REWRITE-END
      
      #禁止访问的文件或目录
      location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
      {
          return 404;
      }
      
      #一键申请SSL证书验证目录相关设置
      location ~ \.well-known{
          allow all;
      }
      
      access_log  /www/wwwlogs/xxx.shafish.cn.log;
      error_log  /www/wwwlogs/xxx.shafish.cn.error.log;
    }
  • 4.检查nginx配置,reload配置

    nginx -t
    nginx -s reload

六、客户端接入-mkdocs

mkdocs.yml

theme:
  custom_dir: overrides # 使用扩展主题

overrides/main.html

overrides目录与mkdocs.yml同级

{% extends "base.html" %}

{% block disqus %}
  <!-- Add custom comment system integration here -->
  <script src="//cdn.jsdelivr.net/npm/@waline/client"></script>
  <div id="waline"></div>
  <script>
    Waline({
      el: '#waline',
      dark: 'html[data-md-color-scheme="slate"]', // 无效,再说
      avatar: 'robohash', // 头像
      //login: 'force',  //强制登录
      requiredMeta: ['nick', 'mail'], // 必填项
      serverURL: 'https://xxx.shafish.cn/', // waline系统后端地址
    });
  </script>
{% endblock %}

ok

七、更多waline前端配置

客户端配置

simple-show

rocketmq相关的文档参考官方文档:https://github.com/apache/rocketmq/blob/master/docs/cn就可以全面掌握。
特性、框架、部署、demo等等都有详细介绍。不必要在网上找乱七八糟的使用教程来弄,越弄越乱。

下面是本人学习rocketmq中的一些想法和实践:先简单介绍一下rocketmq、搭建起一个本地单机的rocketmq、运行相关测试代码、最后再来讲rocketmq具体的框架结构。因为rocketmq是用java实现得,可以找相关书籍或源码视频来引导深入学习。

- 阅读剩余部分 -