前言

  在此前,我为自己的一些站点加上 HTTPS ,但总是提示 ERR_TOO_MANY_REDIRECTS (重定向次数过多)。起初,我以为是自己 Nginx 的配置除了问题,但是在查阅了很多资料,并对配置文件进行修改后还是没有效果,遂放弃了折腾。一段时间后,重新想起此事,然后再使用 Google 并且用关键词 ERR_TOO_MANY_REDIRECTS 查询了一些资料(百度和 CSDN 全是复读机),终于找到一篇很详细的文章讲解了各种可能的情况。在浏览文章的过程中,我发现了由 Cloudflare 引起的重定向次数过多,这时我才恍然大悟,我 TM 确实设置的是他那样的。阅读这部分文章后,发现原来是 Cloudflare 的 SSL/TLS(Crypto) 设置导致的。

原因

  因为在 Cloudflare 的 SSL/TLS 设置选项中,如果你选择了 Flexible ,那么所有对你的服务器的请求都是通过 HTTP 发送的,而如果服务器上已经设置了将 HTTP 重定向到 HTTPS 的话,就会发生重定向循环。

解决方法

  由此,想要解决这个问题,只需要将 SSL/TLS 设置中的选项,从 Flexible 更换到 Full 或者 Full(strict) 即可。

将 SSL/TLS 加密模式修改为 FULL

将 SSL/TLS 加密模式修改为 FULL

  当然,你也可以选择创建 Always Use HTTPS 页面规则,来解决这个问题,而不会导致循环。

参考链接

背景

  前不久旧手机接近报废,由于贫穷更换了OPPO手机。总体来说还行(可能是新机吧),然而前不久发现在使用Chrome的时候,点击Chrome中的一些链接,比如知乎的,总是会跳转到系统的自带浏览器。而我早已经将默认浏览器设置为了Chrome,居然还会发生这样的事。
  在经过一番资料的查找以及群友的帮助后,决定使用ADB来禁用系统自带的浏览,以便解决这个问题。

解决方法

  首先前往官网下载ADB,或者点击这里platform-tools_r29.0.6-windows.zip下载旧版。下载完成后解压。
  然后用数据线将手机连接到电脑。注意,如果是第一次连接电脑,请暂时不要开启USB调试模式,这样可能会导致驱动安装失败。然后选择使用文件传输等模式,让电脑自动将驱动安装完成。
  接下来打开手机“设置-关于手机”,并点击版本号多次,系统就会提示你已经开启开发者模式。再到“设置-其他设置”中进入开发者选项,打开它并开启USB调试。在下载好的adb目录打开命令提示符即cmd,输入.\adb shell进入shell,然后输入pm list packages | grep browser,在列出的包名中找到系统浏览器的。再将浏览器的包名<package>选中复制,最后输入pm disable-user <package>即可。

问题

  由于不是使用的root权限,可能随着系统的更新浏览器会自己出现,需要再次禁用。

介绍

ikoula其独立服务器支持IPv6,但是需要用户自己手动设置。

配置IPv6

ikoula给定的IPv6地址格式为
2a00:c70:1:XXX:XXX:XXX:XXX:YYYY/96
其中
XXX:XXX:XXX:XXX为你当前服务器的IPv4地址
YYYY为任意的合法十六进制数,范围从0000到FFFF

例如:
服务器IP213.246.56.94
那么可以设置你的IPv6地址为2a00:c70:1:213:246:56:94:2333
而其对应的网关地址为2a00:c70:213:246:56:94::1

编辑文件/etc/network/interfaces

iface eth0 inet6 static
        address 2a00:c70:1:213:246:56:94:2333/96
        gateway 2a00:c70:1:213:246:56::1
        dns-nameservers 213.246.33.228 213.246.33.229 80.93.83.25
        dns-search ikoula.com

然后重启网络即可生效。

Ubuntu 18.04

因为Ubuntu 18.04开始使用netplan进行网络设置,所以设置方法有所不同。

nano /etc/netplan/01-netcfg.yaml

配置如下:

network:
        version: 2
        renderer: networkd
        ethernets:
                eth0:
                        dhcp4: no
                        dhcp6: no
                        addresses: [213.246.56.94/24, '2a00:c70:1:213:246:56:94:2333/96']
                        gateway4: 213.246.15.1
                        gateway6: 2a00:c70:1:213:246:56::1
                        nameservers:
                                addresses: [213.246.36.14,213.246.33.144,80.93.83.11]

编辑完成后输入netplan apply即可

参考文章:

https://fr-wiki.ikoula.com/fr/Comment_calculer_mon_IPV6
https://npchk.info/ikoula-ipv6/

  FFmpeg是一款著名的开源音视频处理软件,它可以完成记录、转换数字音频、视频,并能将其转化为流等功能。

  我们可以运用其强大的滤镜功能来完成一些对视频、音频的处理。而对于视频而言,如果只截取视频中的一帧图像,那么就可以完成对视频的截图。命令中可以使用-vframes代替-frames:v

ffmpeg -ss HH:MM:SS -i input -frames:v 1 output

  但事实上,FFmpeg并不能截取对应时间准确的一帧。因为对于某些格式的视频而言,使用FFmpeg-ss参数只能只能截取到欲截取帧前的关键帧。

  如果想生成一个简单的缩略图,则需要使用一定数量的图片然后拼接起来。这里以3*3的截图为例,那么我们所需要获取到的就是九张截图。如果想要等时间间隔的生成九张图片,那么我们首先要获取到的便是视频的时长。

ffprobe -i input -show_entries format=duration -v quiet -of csv="p=0"
  • Python实现:
import subprocess

def get_length(video_name: str) -> str:
        cmd = 'ffprobe -i {} -show_entries format=duration -v quiet -of csv="p=0"'.format(video_name)
        result = subprocess.Popen(cmd,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.STDOUT)

        output, error = result.communicate()
        output = output.splitlines()[0]
        length = output.decode()
        return length

  通过以上命令我们可以获得,以秒为单位的视频时长。所以我们可以把视频时长分成十份,然后用这九个间隔所在的点作为截图点。

def get_point(length: str) -> list:
        length = int(float(length))
        interval = length / (10)
        time_list = []
        # 生成截图时间点
        for i in range(9):
            time_list.append(interval * (i + 1))
        return time_list

  既然截图的时间点已经得到,那么我们就可以利用这些时间点来进行截图了。不过如果仅仅是将截图简单地获取并输出,那么我们就无法区分各个截图之间的区别。所以我们可以通过FFmpeg的滤镜,在输出截图的同时将截图在视频中的时间点一并输出在截图上。

ffmpeg -start_at_zero -copyts -ss HH:MM:SS -i input \
    -vf "drawtext=fontfile=./Arial.ttf:fontsize=20:fontcolor=yellow:x=5:y=5:text='Time\\: %{{pts\\:hms}}'" \
    -vframes 1 output

  在这段代码中,使用到的-start_at_zero-copyts两个参数一般使用在视频截取中,保留原有的时间轴。-vf-filter:v,drawtext是视频滤镜的一种,用法可以查看这里。这里用以在图片左上角生成对应帧的时间戳。

import subprocess
import datetime
import shlex

def get_screenshot(video_name: str, time_list: list) -> list:
    # 注意请将对应的字体文件放置于视频目录,避免出错。此处使用的是Arial字体。
    ffmpeg_sh = '''ffmpeg -start_at_zero -copyts -ss {timestamp} -i {input} \
    -vf "drawtext=fontfile=./Arial.ttf:fontsize=20:fontcolor=yellow:x=5:y=5:text='Time\\: %{{pts\\:hms}}'" \
    -vframes 1 "{output}"'''
    thumb_list = []
    for i in time_list:
        time = str(datetime.timedelta(seconds=i))
        # 按现在时间生成截图名
        time_now = str(datetime.datetime.now().strftime("%Y%m%d_%H%M%S.%f"))  
        output_name = video_name + "_" + time_now
        cmd = ffmpeg_sh.format(timestamp=time, input=video_name, output=output_name)
        cmd = shlex.split(cmd)
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        
        thumb_list.append(output_name)
        while True:
            if p.poll() is not None:
                break
    
    return thumb_list

  通过以上代码我们就获取到了九张截图,以及九张截图的名字,接下来我们要做的就是将这九张截图组合成一张3*3的截图。

简介

  为 qBittorrent WebUI 设置 Let's Encrypt 的 HTTPS 证书和简单。而通过这种方法添加的证书,相比于自签证书,因为所有的现代浏览器都会默认信任 Let's Encrypt 的证书,所以在访问网页的时候,你不会得到警告也无需因此添加安全例外。
  在阅读此教程之前,我们假定你已经安装好了qBittorrent-nox,同时

  • 你知道如何并且会在你的路由上转发端口
  • 你已经设置好 DNS 指向你运行 WebUI 的 ip。

安装 certbot

  certbot 是 ACME 推荐的用于申请和管理 Let's Encrypt 证书的客户端。虽然你可以从 Ubuntu 官方的 repositories 安装它,但从 PPA 安装的则是最新的稳定版,所以我们安装这个。

sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install certbot

获得证书

  在此过程中,你需要确保 80 或是 443 端口不被占用。如果你的主机上还有其他的软件占用了 443 端口,就使用 80 端口,反之亦然。在此例中我们将使用 80 端口来进行证书签发。如果你想使用 443 端口,除了端口号要改变,你还需要在以下命令中将 --preferred-challenges 的参数从 http 替换为 tls-sni 。关于这点可以查看 certbot 的相关文档获取更多信息。
  这里我们将用 standalone 的方法来获取证书。在此之前你还需要:

  • 暂时将占用 80 端口的程序或服务停止。
  • 在你的路由器里转发 80 端口。
  • 如果你还没有打开在防火墙(很有可能是 ufw )中打开 80 端口,请把它打开。

现在运行以下命令来获得你的证书(注意用你的实际域名替换yourwebuidomain):

sudo ufw allow 80
sudo ufw reload
sudo certbot certonly --standalone --preferred-challenges http --must-staple --redirect --hsts --uir --staple-ocsp --rsa-key-size 4096 --domain yourwebuidomain

  当证书生成成功后你就可以重启你的监听 80 端口的任何程序或者是重新屏蔽 80 端口(sudo ufw deny 80 && sudo ufw reload)。
注意:下面的在上面使用过的六个选项是可选的,但是有利于更强的安全:

  • --rsa-key-size 4096
  • --must-staple
  • --redirect
  • --hsts
  • --uir
  • --staple-ocsp
    查阅文档获取更多信息。

在 Web UI 上安装证书

  1. 打开你的 Web UI。
  2. 在 Tools -> Options... 菜单中,进入 Web UI 标签。
  3. 在 “Sever domain:” 空格中填入你的域名。
  4. 勾选 “Use HTTPS instead of HTTP”。
    • 如果你使用的是 4.2.0 或者更新的版本:

      • 在 ”Key:“ 文本框中粘贴上密钥文件路径。
      • 在 ”Certificate:“ 文本框中粘贴上证书文件路径。
      • 注意事项:因为往往这些文件所处的位置,例如,路径 /etc/letsencrypt/live/yourwebuidomain/,对root 而言是只读的。这就意味着,你也许需要先将这些文件(即密钥和证书)复制到某些目录,某些你运行 qBittorrent 所在的用户账号可读的目录。请不要修改 cerbot 原始目录的权限。
    • 如果你使用旧一些的版本:

      • 在 ”Key:“ 文本框中粘贴上密钥文件的内容。密钥可能存储在 /etc/letsencrypt/live/yourwebuidomain/privkey.pem,你也许需要 root 权限来访问次文件。
      • 在 ”Certificate:“ 文本框中粘贴上证书文件的内容。证书可能存储在 /etc/letsencrypt/live/yourwebuidomain/fullchain.pem,你也许需要 root 权限来访问次文件。
  5. 点击保存,关闭标签然后你现在只能通过 HTTPS 来访问你的 Web UI。

自动续期证书

  你的证书会在 90 天后到期,你可以手动续期他们或是为你的证书设置自动续期。
  对于不经常使用 80 端口的用户,这儿给出一种可能的的命令:

  sudo certbot renew --pre-hook "ufw allow 80 && ufw reload" --post-hook "ufw deny 80 && ufw reload

  如果你有程序在监听 80 端口,确保使用 --pre-hook--post-hook 参数来重启他。例如,--pre-hook "stop_my_program.sh"--post-hook "restart_my_program.sh"

  另外,也可以使用 cerbot 的钩子来复制证书文件或是关闭和重启 qBittorrent ,甚至可以修改其配置。

  每次命令运行时,certbot 都会检查是否有证书已经超过 60 天,并且并更新过期的证书。
  你可以将你续期命令写入 crontab 或是 systemd unit 并设置成 Let's Encrypt 推荐的一天运行一次或两次。

参考