分类 其他 下的文章

一、安装cfssl

在github上拉取最新版本代码:https://github.com/cloudflare/cfssl.git,然后进入代码目录执行make all编译二进制。编译成功后会在当前目录下的bin/目录下生成几个二进制:

bin
├── cfssl
├── cfssl-bundle
├── cfssl-certinfo
├── cfssl-newkey
├── cfssl-scan
├── cfssljson
├── mkbundle
└── multirootca

二、生成CA

// todo

三、生成中间CA

// todo

四、生成服务器证书

填写需要生成的证书的信息:

{
  "CN": "example.com",
  "hosts": [
    "example.com",
    "www.example.com"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "ST": "California",
      "L": "Mountain View",
      "O": "Your Org Name",
      "OU": "Your Org Unit"
    }
  ]
}

生成csr:

./cfssl genkey certs/server.json | ./cfssljson  -bare server

签发证书:

./cfssl sign -ca certs/intermediate.crt -ca-key certs/intermediate-key.pem -config certs/rootca-config.json -profile server server.csr | ./cfssljson -bare server

参数说明:

  • -ca/-ca-key: CA证书和私钥
  • -config: 证书的配置文件,包含了一系列的证书参数,如过期时间、加密方式等等
  • -profile: 定义于config中的配置,一个config可以包含多个profile

opencore在开机控制台显示的分辨率和实际系统起来后设置的并不是同步的,这会导致登陆时看到的界面和登录后看到的界面有个差距,每次都要跳一下。

但好在opencore有配置可以调整这个分辨率,在UEFI设置 => 显示输出 => 控制台分辨率中可以调整。

因为家里宽带申请到了公网IP,希望可以直接通过公网IP访问回家。但是公网IP并不是固定的,每隔一段时间就会变化一下,导致需要频繁变化访问回家的公网IP,着实不爽。于是就想着使用ddns来解决这个问题。本想着是自己写个程序,通过dnspod的api接口来动态更新ip,但是程序写到一半后发现群晖已经就有这个功能了,于是干脆就直接用群晖的功能来做dns了。

群晖的ddns配置在控制面板-外部访问中,默认支持了多家云厂商的ddns,国内常见的如:

  • dnspod
  • 花生壳

因为我的域名都托管在了腾讯云,腾讯云的dns解析就是dnspod,因此可以直接使用dnspod.cn来配置ddns。

首先,进入到dnspod控制台页面,点击右上角个人头像,选择“API密钥“:

进入到API密钥页面,将tab栏切换到DNSPod Token(注意,不是腾讯云API密钥),然后点击下面的创建密钥来生成token:

创建完成token后,会分配一个ID和Token:

这里要注意的是需要将token保存下载,因为系统不会保存token信息,以后在控制台也无法查到,所以务必要妥善保存。

将id和token分别填入到群晖中的用户名和密码栏目,主机名称填写对应的域名,如www.xxxx.com,服务供应商选择DNSPod.cn(不要选DNSPod.com了)。提交即可完成ddns配置:

如果配置成功,在控制面板中就能看到ddns的状态是正常,此时说明ddns就生效了:

使用Dockerfile构建完镜像后,发现镜像特别大:

[cherry@k8s-yasuo:~]$ docker image ls 
REPOSITORY                                TAG                  IMAGE ID       CREATED             SIZE
php-fpm                                   7.4.0-alpine-ext     d9c182c6c1ae   18 minutes ago      447MB

这是一个基于alpine构建的php-fpm镜像,构建前镜像大小是90M,被我魔改后竟然达到了450M,简直不可思议。不觉明厉之下,决定研究一下为什么镜像达到了这么大。

使用docker history image可以查看镜像的每一层的构建大小:

最上面的三条就是我新增的三个RUN指令生成出来的层,可以看到,2b5947710812这个层是占用了350M,因此可以断定这个指令执行有问题。这个指令执行的是更新alpine的源然后安装上一些php的库:

RUN set -eux; \
    echo "https://mirrors.tencent.com/alpine/v3.14/community/" >>/etc/apk/repositories; \
    apk add --no-cache ghostscript imagemagick; \
    apk add --no-cache --virtual .build-deps $PHPIZE_DEPS \
        freetype-dev imagemagick-dev libjpeg-turbo-dev libpng-dev libzip-dev;

本来我期望是在这个RUN执行完成之后再执行一条apk del的命令来删除新增的库:

RUN apk del --no-network .build-deps

但是我忽略了一个问题,docker构建镜像时,每个RUN指令都会生成一个层,后面的指令生成的层是基于上个层来的。也就是说,即使第二个RUN指令删除上个RUN指令添加的文件,此时依旧还是包含了上一个层生成的数据。

解决办法:把两个RUN指令合成为一个。

关闭服务:

systemctl stop docker.service
systemctl stop docker.socket

修改/usr/lib/systemd/system/docker.socket文件:

[Socket]
ListenStream=/var/run/dockershim.sock

重新加载配置:

systemctl daemon-reload

启动服务:

systemctl start docker.socket
systemctl start docker.service

修改环境变量,在/etc/profile中添加:

export DOCKER_HOST="unix:///var/run/dockershim.sock"

如果不修改环境变量,执行docker命令时会报错无法连接上docker,因为socket路径不对:

Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  scan: Docker Scan (Docker Inc., v0.8.0)

Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info

使用emby导入媒体库的时候,发现所有导入视频的缩略图全是某公众号的广告页面:

实际上的视频并没有这个页面,对于有强迫症的我来说实在无法忍受这个东西,于是就想想办法去掉。然而展示出来的缩略图是没办法直接修改的,用PR捉摸了好久也是没有找到修改的办法。最后准备放弃的时候,在播放器中意外发现了原因竟然是视频中多了一个视频轨道导致的:

image96862b5f249e715e.png

可以看到,视频中是有2个轨道的,第一个轨道是实际的视频内容。而第二个轨道就是一张PNG类型的图片,点开来看刚好是上面的视频缩略图。因此就可以判断缩略图肯定是取决于这个轨道了,只要去掉它就好了。

想去掉这个轨道,最开始想的办法是使用PR来删掉,但是鼓捣了半天也没有让PR把这个轨道分离出来,最后不得不另想它法。最后想到的方法是使用ffmpeg来完成这个操作,ffmpeg是一个开源的视频编辑工具,可以对视频进行剪辑和转码等操作。

首先先使用ffmpeg -i 01.mp4命令来查看当前视频的信息,命令输出显示当前视频确实是有3个流的:

第一个流是视频流,第二个是声音流,而第三个也是视频流,它是一个PNG图片,也就是我不希望看到的缩略图图片。

我的目标就是要干掉它,操作命令:

ffmpeg -i 01.mp4 -map 0:0 -map 0:1 -vcodec copy -acodec copy P01.mp4

参数的意思:

  • -i: 输入文件
  • -map 0:0: 第1个输入文件的第一个流,也就是主要的视频流。
  • -map 0:1: 第1个输入文件的第二个流,是视频的声音。
  • -vcodec copy: 拷贝选择的视频流。
  • -acodec copy: 拷贝选择的声音流。

整个命令的作用就是:将第一个视频流和第一个声音流拷贝到新的文件中去,相当于就去掉了当前视频中的最后一个流了。

执行后,就会生成一个新的视频文件P01.mp4到当前目录。将新生成的视频文件重新导入到媒体库后,缩略图就正常显示了:

点击左上角Iterm2任务栏,依次选择Preferences - Profile

点击左下角的+新增一个配置项,在右边的command处输入ssh登录的命令:

ssh root@x.x.x.x -p xxxxx

然后把tab页面切换到Advanced,点击Edit进入触发器编辑页面:

新弹框中新增一个触发器,触发器的作用是匹配终端输出的字符串然后执行相应动作。触发字符串是password:,Action选择Send Text,Parameters填入登录密码,密码最后以\n结束表示输完密码后换行:

配置好后退出,在任务栏的Profile中选择创建好的配置就可以自动登录到设备了:

一、问题描述

画二叉树的时候,总是无法对齐圆点得到对称的节点。例如:

graph test {
    graph [dpi=80]
    node [shape=circle];

    1 -- 2, 3;
    2 -- 4, 5 [color=red,penwidth=3.0];

    3 -- 6, 7 [color=red,penwidth=3.0];
    4 -- 8;
}

画出来的效果:

红色标出来的4个线条,长度不一样,子节点看起来不对称,就导致整个二叉树看起来也不够美观。

二、解决方案

可以在子节点中加一个中间节点,把线条的weight设置成10,然后隐藏中间的节点和连线:

graph bin_tree {
    node [shape=circle];

    1 -- 2, 3;
    2 -- 4;
    // 隐藏中间节点的连线
    2 -- m2 [weight=10 style="dashed"];
    2 -- 5;

    3 -- 6;
    // 隐藏中间节点的连线
    3 -- m3 [weight=10 style="dashed"];
    3 -- 7;
    4 -- 8;
        
        // 隐藏中间节点
    m2, m3 [label="" style="dashed"]
}

效果:

weight属性的作用是设置线条的权重,权重越大,线条越垂直。

如果希望完全隐藏中间节点,只要把对应节点和线条的属性设置为invis即可:

style="dashed" -> style="invis"

三、参考

Enforcing horizontal node ordering in a .dot tree

How to get balanced diagrams from graphviz?

使用clion的过程中,发现每创建一个文件,系统就会自动在头部生成注释信息:

//
// Created by <username> on 2020/2/7.
//

这个是因为开启了代码模板导致的,配置在:

Settings → Editor → File and Code Templates → Includes → C File Header

直接把这个配置删掉就可以了,注意是删掉里面的内容,不要把这一栏删掉了

参考

File and Code Templates

Turning off “created by” header when generating files in CLion

默认情况下的,通过dot命令导出的图片分辨率很低。在高分辨率的显示器下看,图片很小,放大了也很模糊。修改分辨率的办法:

digrapvh G {
    graph [dpi=300]
}

修改后的效果:

修改前的效果:

也可以在导出的时候使用-G参数来控制:

dot -T png -Gdpi=300 -o demo.png demo.dot

参考

how-do-i-set-the-resolution-when-converting-dot-files-graphviz-to-images