OpenSSL 是一个用于安全通信的开放源代码项目,可以用来检查证书。下面是使用 OpenSSL 检查证书的步骤

1.下载并安装 OpenSSL

在你的计算机上下载并安装 OpenSSL 工具。可从官网https://www.openssl.org/source/下载。下载后按照官网提供的安装方法进行安装。

2.导入证书

将证书导入 OpenSSL,可以通过以下命令将证书导入 OpenSSL 中:

openssl x509 -in cert_file.pem -text

复制

上述命令指出打印 cert_file.pem 证书文件的详细信息,其中包括证书持有人、颁发机构、有效期等。

3.验证证书

可以使用 OpenSSL 验证证书的有效性,可以使用以下命令:

openssl verify cert_file.pem

如果证书是有效的,命令将返回以下信息:

cert_file.pem: OK

如果证书无效,命令将返回以下信息:

cert_file.pem: C = US, O = Example Company, CN = example.com
error 18 at 0 depth lookup:self signed certificate
error cert_file.pem:self signed certificate

4.检查证书链

可以检查整个证书链的有效性,可以使用以下命令:

openssl verify -CAfile ca_file.pem cert_file.pem

上述命令用于检查 cert_file.pem 证书文件是否在 ca_file.pem 证书链中,同时也可以检查证书链的有效性。如果证书链有效,则命令将返回以下信息:

cert_file.pem: OK

如果证书链无效,则命令将返回以下信息:

cert_file.pem: C=US,O=Example Company,CN=example.com
error 20 at 0 depth lookup:unable to get local issuer certificate
error cert_file.pem: verification failed

复制

上述异常错误信息也可能有多种,可以根据具体的错误类型进行诊断。

5.其他操作

OpenSSL 还支持其他证书查询与操作,如通过 OCSP 验证证书状态等。

综上所述,OpenSSL 提供了丰富的功能来检查证书,可以通过简单的命令行操作来实现。同时,需要注意正确安装 OpenSSL 后才能进行上述的检查操作。

SQLite 仅有四个基元数据类型:INTEGER、REAL、TEXT 和 BLOB。 将数据库值返回为 object 的 API 只返回这四种类型之一。 Microsoft.Data.Sqlite 支持其他 .NET 类型,但最终强制这些值在这些类型和四种基元类型中的一种类型之间进行转换。

.NETSQLite备注
BooleanINTEGER0 或 1
ByteINTEGER
Byte[]BLOB
CharTEXTUTF-8
DateOnlyTEXTyyyy-MM-dd
DateTimeTEXTyyyy-MM-dd HH:mm:ss.FFFFFFF
DateTimeOffsetTEXTyyyy-MM-dd HH:mm:ss.FFFFFFFzzz
十进制TEXT0.0########################### 格式。 REAL 将有损。
Doublereal
GUIDTEXT00000000-0000-0000-0000-000000000000
Int16INTEGER
Int32INTEGER
Int64INTEGER
SByteINTEGER
Singlereal
StringTEXTUTF-8
TimeOnlyTEXTHH:mm:ss.fffffff
TimeSpanTEXTd.hh:mm:ss.fffffff
UInt16INTEGER
UInt32INTEGER
UInt64INTEGER大值溢出

替代类型

某些 .NET 类型可以从替代 SQLite 类型中读取。 还可以将参数配置为使用这些替代类型。

.NETSQLite备注
CharINTEGERUTF-16
DateOnlyreal儒略日值
DateTimereal儒略日值
DateTimeOffsetreal儒略日值
GUIDBLOB
TimeOnlyreal以天为单位
TimeSpanreal以天为单位

例如,下面的查询从结果集的 REAL 列中读取 TimeSpan 值。

command.CommandText =
@"
    SELECT name, julianday(finished) - julianday(started) AS length
    FROM task
    WHERE finished IS NOT NULL
";
using (var reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        var name = reader.GetString(0);
        var length = reader.GetTimeSpan(1);

        Console.WriteLine($"'{name}' took {length}.");
    }
}

错误信息 “/lib64/libm.so.6: version `GLIBC_2.27′ not found” 表示程序运行需要 GLIBC 2.27 版本的 libc 库,而系统中安装的 libc 库的版本较低,因此无法找到所需的库。

要解决这个问题,一种可行的方法是更新 libc 库的版本。可以按照以下步骤进行操作:

  1. 检查系统中 libc 库的版本。可以使用以下命令查看:
ldd --version

该命令会返回系统中的 libc 库版本以及其他相关信息。

  1. 下载 GLIBC 2.27 版本的源码包。可以从 GLIBC 的官方网站下载(http://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.gz)。
  2. 解压源码包并进入源码目录。
  3. 编译并安装 GLIBC 2.27。可以使用以下命令:
./configure --prefix=/usr/local/glibc-2.27
make
sudo make install

请注意,安装的目录可以根据实际情况进行修改。

  1. 将新的 libc 库路径添加到 LD_LIBRARY_PATH 环境变量中。可以使用以下命令:
export LD_LIBRARY_PATH=/usr/local/glibc-2.27/lib:$LD_LIBRARY_PATH
  1. 重新运行程序,查看是否仍然出现错误。

请注意,更新系统的 libc 库版本可能会影响到其他程序的运行,因此在执行此操作之前,请仔细考虑潜在的影响,并在操作之前备份重要数据。

从 iOS11 开始,iPhone 的默认照片就改为了 HEIC 格式。HEIC 相比 JPG 和 PNG 来说,在画质差不多的情况下,HEIC 的文件体积要更小一些。

目前 Windows 系统对 HEIC 的图片支持的还不太好,如果使用 Win10/11 的照片应用打开 HEIC,需要在应用商店安装一个 HEIF and HEVC Media Extensions 才能打开 HEIC 图片,这个 HEIF and HEVC Media Extensions 还需要花 8 元购买。

下面简单写一下在 Win10/11 打开 HEIC 图片的方式,因为我用的这个软件需要用到 Windows 照片查看器,所以这里也包含启用 Windows 照片查看器。

启用 Windows 照片查看器

Windows 照片查看器是 Windows 上自带的一个图片浏览工具,它相比 Windows 照片应用来说,速度要更快。

从 Win10 开始,默认的照片浏览工具改成了照片应用,在菜单的打开方式里也没有 Windows 照片查看器。

下面通过更改注册表的方式启用 Windows 查看器:

打开记事本或其他文本编辑器,粘贴下面的代码:

Windows Registry Editor Version 5.00
 ; Change Extension's File Type
 [HKEY_CURRENT_USER\Software\Classes\.jpg]
 @="PhotoViewer.FileAssoc.Tiff"
 ; Change Extension's File Type
 [HKEY_CURRENT_USER\Software\Classes\.jpeg]
 @="PhotoViewer.FileAssoc.Tiff"
 ; Change Extension's File Type
 [HKEY_CURRENT_USER\Software\Classes\.gif]
 @="PhotoViewer.FileAssoc.Tiff"
 ; Change Extension's File Type
 [HKEY_CURRENT_USER\Software\Classes\.png]
 @="PhotoViewer.FileAssoc.Tiff"
 ; Change Extension's File Type
 [HKEY_CURRENT_USER\Software\Classes\.bmp]
 @="PhotoViewer.FileAssoc.Tiff"
 ; Change Extension's File Type
 [HKEY_CURRENT_USER\Software\Classes\.tiff]
 @="PhotoViewer.FileAssoc.Tiff"
 ; Change Extension's File Type
 [HKEY_CURRENT_USER\Software\Classes\.ico]
 @="PhotoViewer.FileAssoc.Tiff"

保存的时候后缀名需要使用 .reg ,如果后缀名没有错的话,文件图标应该是:

现在打开图片的时候就可以看到 Windows 照片查看器了。

打开 HEIC 图片

这里会用到一个 CopyTrans HEIC,访问 https://www.copytrans.net/copytransheic/ ,选择 download 下载,软件对于个人和家庭是免费的。

安装软件也是直接一路 next ,也不会有捆绑软件之类的,遇到用户协议就选择 I accept the agreement 同意。

安装完成后就可以打开 HEIC 图片了,打开的时候需要选择使用 Windows 照片查看器打开,照片应用虽然也能打开,但清晰度会有些问题。

把 HEIC 转换为 JPG

上面安装的 CopyTrans HEIC 也能把 HEIC 转换为 JPG,只需要右击图片文件,选择 Convert to JPEG with CopyTrans ,转换完成后会在同一目录生成一个同名的 JPG 图片,转换后的图片也包含完整的 EXIF 信息。

在大部分 Linux 系统中,cat 命令是通过 coreutils 包默认安装的。但是如果您在 Alpine Linux 中找不到 cat 命令,您可以按照以下步骤安装 Coreutils 包:

1. 使用 apk 命令更新索引:

apk update   

2. 安装 Coreutils 包:

apk add coreutils   

安装完成后,您就可以使用 cat 命令了。

注意:在 Alpine Linux 中,cat 命令位于 coreutils 包中,该包提供了其他常见的 Linux 命令,如 chgrp、chmod、chown、cp、date、dd、df等等,因此安装 coreutils 包是非常重要的。

在 Alpine Linux 中,可以使用多种命令来检查 CPU 利用率。以下是其中一些命令:

1. top 命令

   top 命令是一种交互式的进程监视器,它可以实时显示系统中正在运行的进程、CPU 利用率、内存使用情况等信息。启动 top 命令后,按下大写字母 P 键可以按 CPU 占用率排序,在第三行中可以看到 CPU 利用率的统计信息。

top -n 1

2. mpstat 命令

   mpstat 命令用于监视多处理器系统中每个处理器的使用情况。以下命令将显示每个 CPU 的利用率百分比。

mpstat -P ALL 1

   该命令使用 -P 参数指定要监视的处理器,并指定每秒钟进行一次采样。

3. vmstat 命令

   vmstat 命令用于监视系统的虚拟内存、进程、系统CPU、硬盘和CPU的使用情况,其中包括 CPU 利用率。以下命令将显示 CPU 利用率的详细统计信息。

vmstat 1

   该命令使用 1 秒的采样间隔,并在第 4 列和第 13 列中显示 CPU 利用率的详细统计信息。

4. sar 命令

   sar 命令用于收集系统性能信息,包括 CPU 利用率、内存使用情况、磁盘和网络 I/O 等。以下命令将从当前时间开始每秒钟记录 CPU 利用率信息。

sar -u 1   

   该命令使用 -u 参数指定要监视的 CPU 利用率,并指定每秒钟进行一次采样。

以上是一些常见的获取 CPU 利用率的方法和命令,您可以根据需要进行选择和调整。同时,请注意在实际应用中综合使用多种命令,以充分了解系统的整体性能和各项指标。

“nslookup: command not found” 是由于您的系统找不到 nslookup 命令引起的。nslookup 是一个常用的 DNS 查询工具,通常在 Linux 和 Unix 系统上使用。

要解决这个问题,您需要检查您的系统是否安装了 nslookup 工具。您可以尝试通过以下命令检查:

which nslookup

如果输出为空或返回 “command not found”,则说明您的系统未安装 nslookup 工具。

对于基于 Debian 或 Ubuntu 的系统,您可以通过以下命令安装 nslookup 工具:

sudo apt-get update
sudo apt-get install dnsutils

对于基于 Red Hat 或 CentOS 的系统,您可以通过以下命令安装 nslookup 工具:

sudo yum update
sudo yum install bind-utils

如果您使用的是其他 Linux 或 Unix 发行版,请参考其文档或使用适合您的包管理器来安装 nslookup 工具。

如果命令仍然无法找到 nslookup,您可以尝试直接使用 IP 地址查询 DNS 记录,例如:

ping -c1 example.com

这将向 example.com 发送一个 ICMP 回显请求并显示其 IP 地址。

希望以上信息可以帮助您解决问题。

您可以通过以下两种方法释放 System.Threading.Timer 对象:

1. 等待 Timer 处理完当前的工作并释放资源

    在 Timer 对象的回调方法中,您可以调用 Timer.Change 方法来更改定时器的参数,例如将定时器的 dueTime 和 period 设置为 Timeout.Infinite,以强制定时器停止。这样,当定时器的回调方法执行完成后,系统会自动释放相应的资源。以下是一个示例代码:

using System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        // 创建一个新的 Timer 对象,每隔 1 秒执行一次回调方法
        Timer timer = new Timer(
            (state) => Console.WriteLine("定时器执行了一次。"),
            null,
            TimeSpan.FromSeconds(0),
            TimeSpan.FromSeconds(1));

        Console.ReadLine();

        // 在回调方法中更改定时器参数,以强制停止定时器并释放资源
        timer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);
    }
}

2. 手动释放 Timer 对象

    如果您需要在定时器执行之前或之后立即释放其资源,可以调用 Timer.Dispose 方法手动释放 Timer 对象。以下是一个示例代码:

    using System;
    using System.Threading;

    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个新的 Timer 对象,每隔 1 秒执行一次回调方法
            Timer timer = new Timer(
                (state) => Console.WriteLine("定时器执行了一次。"),
                null,
                TimeSpan.FromSeconds(0),
                TimeSpan.FromSeconds(1));

            Console.ReadLine();

            // 手动调用 Dispose 方法释放 Timer 对象
            timer.Dispose();
        }
    }
   

    注意,如果您选择手动释放 Timer 对象,应确保在回调方法已经完成后才释放 Timer 对象,否则会导致回调方法访问已释放的对象并引发异常。

希望这些提示可以帮助您释放 System.Threading.Timer 对象。

在 C# 中,您可以通过将 Task 的 TaskCreationOptions 设置为 TaskCreationOptions.LongRunning 或 TaskCreationOptions.RunContinuationsAsynchronously,以指示将任务分配给新的线程或线程池并在后台运行。

以下是使用 TaskCreationOptions.LongRunning 方式实现后台执行的示例代码:

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        // 使用 TaskCreationOptions.LongRunning 创建一个后台执行的 Task 对象
        Task task = Task.Factory.StartNew(
            () =>
            {
                Console.WriteLine("开始执行任务...");
                Thread.Sleep(5000);
                Console.WriteLine("任务执行完毕。");
            },
            CancellationToken.None,
            TaskCreationOptions.LongRunning,
            TaskScheduler.Default);

        Console.WriteLine("主线程继续执行...");
        Console.ReadLine();
    }
}

在上述代码中,我们使用 Task.Factory.StartNew 方法创建了一个后台执行的 Task 对象,并通过 TaskCreationOptions.LongRunning 选项指示分配给新的线程执行。任务执行时将休眠 5 秒,以模拟执行长时间任务的情况。

另外,使用 TaskCreationOptions.RunContinuationsAsynchronously 选项也可以实现后台执行,例如:

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 使用 TaskCreationOptions.RunContinuationsAsynchronously 创建一个后台执行的 Task 对象
        Task task = Task.Run(async () =>
        {
            Console.WriteLine("开始执行任务...");
            await Task.Delay(5000);
            Console.WriteLine("任务执行完毕。");
        }, TaskCreationOptions.RunContinuationsAsynchronously);

        Console.WriteLine("主线程继续执行...");
        Console.ReadLine();
    }
}

希望这些示例代码可以帮助您实现 C# Task 后台执行。