如何使用 OpenSSL 创建自签名证书

在本指南中,我们提供了有关如何使用 OpenSSL 实用程序创建自签名证书的分步指南。您可以按照本指南使用命令创建自签名证书或使用 shell 脚本自动创建自签名证书。

Openssl 是一个创建自签名证书的便捷实用程序。您可以在所有操作系统上使用 OpenSSL,例如 Windows、MAC 和 Linux 版本。…

    

什么是自签名证书?以及如何创建它

自签名 SSL 证书是一种数字证书,未经公开信任的证书颁发机构 (CA) 签名。自签名证书被认为不同于传统的 CA 签名证书,因为它们是由负责与证书关联的网站或软件的公司或开发人员创建、颁发和签名的,而不是 CA。

在高层次上,这些自签名证书基于与 X.509 证书中使用的相同的加密私钥和公钥对体系结构。但是,这些数字证书没有受信任的第三方 CA 的验证,例如 WoTrus(wosign.com)。发行过程中缺乏独立验证会产生额外的风险,这就是自签名证书的问题。对于面向公众的网站和应用程序,它们被认为是不安全的。…

    

pip安装

在 Windows 上安装 pip 通常有两种方法:

(一)使用 Python 自带的 get-pip.py 脚本进行安装:

首先,下载 get-pip.py 脚本:https://bootstrap.pypa.io/get-pip.py

将下载好的 get-pip.py 脚本保存到本地某个目录下(如 C:\Python\get-pip.py)

打开命令提示符,进入到 get-pip.py 所在目录,执行以下命令:

python get-pip.py

如果安装成功,pip 就已经安装好了。

在iframe中使bootstrap的模态框在父页面弹出问题

这几天在写项目的中,页面使用了iframe,然而在子页面中使用bootstrap的模态框时发现:弹出的模态框位置是以子页面为标准居中的,并且遮罩层也只有子页面那一部分,整个页面简直无法直视,所以思考可以可以让模态框以父页面为标准弹出,经过在网上查找资料,总结了一种解决方法。

效果展示

修改前页面

查看图片

修改后页面

查看图片

实现思路

要想使模态框在顶级页面打开,我想到的方法是使bootstrap的模态框弹在父页面弹出即可。

首先我们将需要弹出的div单独写一个页面,当子页面需要弹出时,在父页面弹出div即可。

将模态框单独写为一个页面

主页面

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
  </head>
  <body>
    <div class="modal 

app里未读消息已读、未读是怎么设计的?

也不知道大家目前都用的java编程软件有哪些,毕竟在应用程序中,未读和已读消息的设计取决于应用程序的需求和目标。下面是一些常见的设计模式:

app里未读消息已读、未读是怎么设计的?

一、简单的未读/已读标记

简单的未读/已读标记:这是最常见的设计,用户打开应用程序后,未读消息会用一个特殊的标记(通常是未读计数器)标识出来。当用户查看这些消息时,它们会被标记为已读,未读计数器会减少。这种设计对于大多数应用程序来说是最直观的,并且易于使用。它被广泛应用于各种应用程序和用户界面中,以显示用户已读和未读的内容。该模式通常包括以下元素:…

如何在数字时代更好地学习

在提高生产力和绩效之前,我常常花费大量时间在线获取大量数字内容。我的信息饮食范围从鼓舞人心的 TED 演讲到专门的播客,从 Hacker News 上找到的博客文章到 Twitter 上分享的电子书。

我非常好奇,并尽可能地接受新内容。会有什么危害呢?——我想。我喜欢这样度过我的时间。它感觉很有用,很有趣,而且它培养了我作为一个“聪明人”的自我形象——同时。确实,一个学习黑客。…

容器编排器的自我介绍

哈喽大家好,我是咸鱼

咸鱼在《一文带你了解容器技术的前世今生》有介绍过容器技术的由来以及Docker项目的发展

我们知道,Docker 及其他容器技术能够极大地简化应用程序的部署,做到了”开箱即用“

俗话说:”凡是具有两面性“。容器技术给我们带来便利的同时,一些问题也随之出现了

随着企业规模或者说业务规模的不断扩大,应用程序越来越多、而每个应用程序往往又由多个容器组成

例如想要实现一个简单的数据库 web 界面也可能需要为数据库服务器和应用程序运行单独的容器

于是容器的管理便成为了一个棘手的难题。工程师们为了解决这个问题,开发了一系列的容器编排器(container orchestrator),其中最有名的当属 kubernetes

容器编排器可以将一组容器作为一个基本单元去进行管理(例如 K8s 里的 pod),而且容器编排器可以在集群之间自动分配容器工作负载

那么今天,咸鱼将以自我介绍的形式来带大家了解三个容器编排器——Docker Compose、Swarm、Kubernetes

Docker Compose
 

大家好,我叫 Docker Compose ,我的爸爸是一个名叫 Docker 的公司

我的前身是一个叫 Fig 的项目,Fig 项目可是大有来头——因为它第一次提出了容器编排的概念

你只需要执行一条命令 fig up 就能够依次创建一系列容器,并且容器之间的关系及依赖性,都会自动帮你解决

GO语言并发编程入门:Goroutine、Channel、Context、并发安全、GMP调度模型

GO语言并发编程入门:Goroutine、Channel、Context、并发安全、GMP调度模型

1.GO并发介绍

并发:多线程程序在一个核的cpu上运行。 并行:多线程程序在多个核的cpu上运行。 由上可知并发不是并行,并行是直接利用多核实现多线程的运行,并发则主要由切换时间片来实现”同时”运行,go可以设置使用核数,以发挥多核计算机的能力。

Go语言之所以被称为现代化的编程语言,就是因为它在语言层面已经内置了调度和上下文切换的机制。Go语言的并发编程特点主要体现在Goroutine协程和Channel通道的使用上。

  • Goroutine协程:Goroutine是Go语言中的并发执行单位。它是一种轻量级的协程,由负责整个Go程序的执行的底层系统组件Go运行时(Go runtime)调度和管理。在调用函数的时候在前面加上go关键字,就可以为一个函数创建一个goroutine。与传统的线程、协程相比,Goroutine的创建和销毁代价非常小,可以高效地创建大量的Goroutine,Goroutine 奉行通过通信来共享内存,而不是共享内存来通信。Goroutine4~5KB的栈内存占用和由于实现机制而大幅减少的创建和销毁开销是go高并发的根本原因。
  • Channel通道:通道是Goroutine之间进行安全通信和数据共享的机制。它提供了同步和互斥的功能,确保数据的有序传输和访问。通过通道,不同的Goroutine可以安全地进行数据交换和共享状态。

Goroutine是一种特殊的协程,这是因为普通的协程和操作系统线程是多对一的关系,而在Go语言中,Goroutine和操作系统线程是多对多的关系。具体来说:

  • 一个操作系统线程(OS Thread)可以对应多个Goroutine。
  • Go程序可以同时使用多个操作系统线程,这使得Go语言能够充分利用多核处理器的计算能力。
  • Go运行时调度器(Go Scheduler)负责将多个Goroutine调度到少量的操作系统线程上执行,并处理它们之间的通信。

2.GO并发编程

2.1 父子协程

在Go语言中,可以通过创建协程(Goroutine)来实现并发执行的任务。当父协程创建一个子协程时,父协程和子协程是相互独立的并发执行单元。父协程可以继续执行其他操作,而不需要等待子协程完成。子协程会在创建后立即开始执行,与父协程并发执行。父协程和子协程之间不存在直接的调用关系,它们是相互独立的执行流程。父协程的结束不会影响子协程的执行。即使父协程结束,子协程仍然可以继续执行,直到完成或被终止。父协程和子协程之间是独立的执行上下文,彼此之间的运行状态不会相互影响。 然而,需要注意的是,如果主协程(即main函数所在的协程)结束了,整个程序会终止,所有的协程也会被强制结束。这意味着如果主协程提前结束,尚未完成的子协程也会被中止。因此,在使用协程进行并发编程时,我们需要确保主协程不会过早地结束,以确保子协程能够完成任务,可以考虑采用以下方法:

  1. 使用time.Sleep使协程睡眠确保并发子协程完成
  2. 使用sync.WaitGroup等待组确保并发子协程完成

2.1.1 使用time.Sleep使协程睡眠确保并发子协程完成

time包提供了时间相关的功能,其中最常用的是time.Sleep函数,它可以让当前的Goroutine休眠一段时间。通过结合Goroutine和time.Sleep,我们可以实现协程的并发执行。

go
复制代码
package main
import (
	"fmt"
	"time"
)
func
    

Go 1.21 新内置函数:min、max 和 clear

前言

Go 1.21 版本已经正式发布,它带来了许多新特性和改进。其中引入了的三个新内置函数:maxminclear,接下来的内容将详细介绍这些函数的用途和特点。

准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。

max 函数

func max[T cmp.Ordered](x T, y ...T) T

这是一个泛型函数,用于从一组值中寻找并返回 最大值,该函数至少要传递一个参数。在上述函数签名中,T 表示类型参数,它必须满足 cmp.Ordered 接口中定义的数据类型要求,该接口的定义如下所示:

go
复制代码
type Ordered interface {
	~int | ~int8 | ~