Author: admin

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

在提高生产力和绩效之前,我常常花费大量时间在线获取大量数字内容。我的信息饮食范围从鼓舞人心的 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 | ~

shell中获取时间

1.shell获取时间

复制代码
time1=$(date)
echo $time1

time2=$(date "+%Y%m%d%H%M%S")
echo $time2

time3=$(date "+%Y-%m-%d %H:%M:%S")
echo $time3

time4=$(date "+%Y.%m.%d")
echo $time4

# 1. 取今天时间
now=`date -d "now" +%Y-%m-%d`
echo $now

# 2.取昨天时间
yesterday=`date -d "yesterday" +%Y-%m-%d`
echo $yesterday

# 3.获取前n天

daysago=`date -d "2 days 

开源浏览器有哪些?

火狐

  • 开源:由Mozilla基金会开发和维护,开源代码让任何人都可以查看、修改和改进其代码。
  • 性能优秀:优化的渲染和JavaScript引擎提供了出色的页面加载和运行速度。
  • 安全性:强大的安全特性,如跟踪保护、恶意软件阻止和自动更新等,以保护用户免受网络威胁。
  • 自定义能力:提供了高度的自定义选项,包括外观、功能和行为等。
  • 尊重用户隐私:内置了一系列隐私保护功能,如"隐私浏览"模式和强大的第三方跟踪阻止。
  • 扩展系统:具有丰富的扩展库,使用户可以根据自己的需要添加各种功能。

Chromium

  • 开源:Chromium是开源的,这意味着任何人都可以查看其代码,检查其安全性,或者对其进行修改和改进。
  • 基础框架:Chromium是许多其他浏览器(包括Google Chrome和Microsoft Edge)的基础框架。
  • 速度和性能:Chromium提供了快速的页面加载速度和出色的JavaScript处理性能。
  • 安全性:Chromium包含了许多安全特性,如沙盒化技术、预防恶意软件和钓鱼攻击等。
  • 扩展性:Chromium支持Chrome网上应用店的扩展,用户可以根据需要添加各种功能。
  • 开发者工具:Chromium提供了一套完整的开发者工具,对网页开发和调试非常有帮助。

Otter Browser

  • 高度自定义性:Otter Browser提供了丰富的配置选项,用户可以根据自己的需求定制浏览器的外观和行为。
  • 基于Qt5:Otter Browser使用了Qt5框架,具有良好的跨平台兼容性。
  • 模块化:Otter Browser的设计强调模块化,每个功能都是一个单独的模块,用户可以选择启用或禁用。
  • 开源

socket 到底是个啥

(本篇文章文字较多,耐心看完,你会有不小的收获)

哈喽大家好,我是咸鱼

我相信大家在面试过程中或多或少都会被问到这样一个问题:你能解释一下什么是 socket 吗?

我记得我当初的回答很是浅显:socket 也叫套接字,用来负责不同主机程序之间的网络通信连接,socket 的表现方式由四元组(ip地址:端口)组成

那么今天,咸鱼将跟大家打开 socket 的神秘大门,不但要搞清楚 socket 的概念,最好还能够了解它的底层实现

socket 到底是个啥

我们首先查看一下 socket 的翻译

socket 到底是个啥

我们看到,socket 可以翻译成插座、插头

 

那现在请想象这么一个场景:给手机充电时,你将充电插头插入电源插座里面,是不是意味着插座与充电插头连接起来了

在计算机世界中,socket 翻译成套接字,通过 socket 我们可以与某台服务器进行连接,而建立连接的过程,你可以脑补成将充电插头插进插座的过程

socket 到底是个啥

socket 到底是个啥

 

socket 使用场景

 

假设我们想要将数据从 A 电脑的某个进程传送到 B 电脑的某个进程(比如咸鱼用微信发信息给冰冰)

socket 到底是个啥

 

那么在与对方聊天的过程中,其实就是这两台电脑中的微信进程相互传输数据的过程

在这个过程中,两台电脑各自调用 socket 方法,然后会得到一个

媒体查询、响应式设计?帮我!

媒体查询、响应式设计?帮我!

您想了解的有关媒体查询和响应式设计的一切

卡片图像

什么是媒体查询?

媒体查询是一种 CSS 语言功能,它允许作者根据正在查看应用程序的设备或窗口的特征有条件地应用 CSS 规则。最常见的是,这些可能是根据视口宽度,允许 CSS 作者创建响应于正在查看的窗口或设备的大小的组件和布局。但这也可能扩展到用户是否喜欢浅色或深色模式,甚至用户的可访问性首选项,以及更多属性。

什么是响应式设计?

随着如此多不同的设备类型和屏幕尺寸的兴起,Web 应用程序向用户提供更加定制的视觉呈现并针对其首选交互方法的屏幕尺寸进行优化变得越来越重要。

响应式设计可以通过多种技术的组合来完成,包括有条件地应用 CSS 规则与媒体查询、容器查询,以及根据其所容纳的内容选择灵活的布局(例如 Flexbox 或网格)。在本文中,我们将重点关注媒体查询和响应式布局,但随着浏览器支持长尾的增加,容器查询也需要牢记。截至撰写本文时,它们尚未准备好进入黄金时段,但可用于渐进增强

什么是移动优先设计?

移动优先设计是设计和构建响应式 Web 应用程序时可以采用的原则。理想情况下,这种方法应该作为整个过程的所有阶段(从开始到结束)的指导原则。对于设计而言,这意味着线框或 UI 设计的第一次迭代应重点关注移动体验,然后再转向更宽的视口尺寸。

虽然您可以从另一个方向(宽优先)处理 Web 应用程序,但与尝试将组件塞进较小的屏幕空间相比,随着更多的屏幕空间变得可用,以可视方式重新组织组件是一个更容易的过程。

类似的规则也适用于开发过程。一般来说,您应该为基本情况(最窄的屏幕)编写标记和样式,并在必要时逐步为更宽的屏幕应用条件样式。

虽然您可以从另一个方向实现这一点,或者混合使用窄优先和宽优先的方法,但这可能会使您的样式更难以理解,并增加其他人在审查或维护时的精神负担。当然,也有例外,编写少量的宽优先规则会更简单,因此请酌情考虑。

CSS 像素与设备像素

Midjourney中国版本使用指南

今天Midjourney中国开放了测试的申请,很多朋友也加入了,也有很多问题需要解答,所以就想着写一个使用指南帮助大家了解和国际版的不同。

首先是如何加入测试只需要打开QQ扫描下面二维码就行,会在每周一和周五晚上六点开启,人数达到上限以后就会关闭申请。今天的已经达到上限了,可以等这周五的六点。…