第四周-云计算运维作业

news/2024/10/11 2:28:44

1. 使用while read line和/etc/passwd,计算用户id总和。

	  sum=0while read linedoecho " $line" &>/dev/null((sum++))done </etc/passwdecho "$sum"

2. 总结索引数组和关联数组,字符串处理,高级变量使用及示例。

数组定义:
emp[0]=zz
emp[1]=zz1
emp[2]=zz2
title=("e" e1 e2)
num=({1..10})

关联数组(自定义数组)
declare -A 数组 使用关联数组需要先定义
emp[frist]=l1
emp[second]=l2

基于偏移量取字符串

返回字符串变量var的字符的长度,一个汉字算一个字符
${#var} 
返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,
offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset} 
返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
${var:offset:number}
取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
${var: -length}
从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
${var:offset:-length}
先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length
前空格,并且length必须大于offset
${var: -length:-offset}

基于模式取子串

 其中word可以是指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字
符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右
${var#*word}
从var变量的值中删除以word开头的部分
${var#word}
同上,贪婪模式,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容,即贪婪模
式,以最后一个word为界删左留右
${var##*word}
${var##word}
##################################################################################
其中word可以是指定的任意字符,功能:自右而左,查找var变量所存储的字符串中,第一次出现的word, 
删除字符串最后一个字符向左至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以从右向左的第一
个word为界删右留左
${var%word*}
${var%word}
同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符,即贪婪模式,以从右向
左的最后一个word为界删右留左
${var%%word*}
${var%%word}

高级变量
高级变量赋值:
image

高级变量用法-有类型变量

  • Shell变量一般是无类型的,但是bash Shell提供了declare和typeset两个命令用于指定变量的类型,两个命令是等价的

  • declare [选项] 变量名
    -r 声明或显示只读变量
    -i 将变量定义为整型数
    -a 将变量定义为数组
    -A 将变量定义为关联数组
    -f 显示已定义的所有函数名及其内容
    -F 仅显示已定义的所有函数名
    -x 声明或显示环境变量和函数
    -l 声明变量为小写字母 declare –l var=UPPER
    -u 声明变量为大写字母 declare –u var=lower

    返回字符串变量var的字符的长度,一个汉字算一个字符
    ${#var}
    返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,
    offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
    ${var:offset}
    返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
    ${var:offset:number}
    取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
    ${var: -length}
    从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
    ${var:offset:-length}
    先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length
    前空格,并且length必须大于offset
    $

3. 求10个随机数的最大值与最小值。

1awk 'BEGIN{srand();for (i=1;i<=10;i++)print int(rand()*100)}'> ./1.txtcat ./1.txt|sort|head -1cat ./1.txt|sort|tail -n 1 
2num=($(awk 'BEGIN{srand();for (i=1;i<=10;i++)print int(rand()*100)}'))echo ${num[0]}echo ${num[-1]}

4. 使用递归调用,完成阶乘算法实现。

	fact(){if [ $1 -eq 1 ]; thenecho 1elseecho $[$1*$(fat $[$1-1])]fi}

5. 解析进程和线程的区别?

进程是程序执行时的一个实例,每个进程都有独立内存空间、代码和数据以及其他系统资源,进程通信需要通过管道和套接字等。
线程是进程内部中执行单元,进程中的线程共享相同的内存空间和其他资源,线程可以通过共享内存进行通信。

6. 解析进程的结构。

1.文本段
包含了进程运行的程序机器语言指令。文本段具有只读属性,以防止进程通过错误指针意外修改自身指令。因为多个进程可同时运行同一程序,所以又将文本段设为可共享,这样,一份程序代码的拷贝可以映射到所有这些进程的虚拟地址空间中。

2.初始化数据段
包含显示初始化的全局变量和静态变量。当程序加载到内存时,从可执行文件中读取这些变量的值。

3.未初始化数据段
包含了未进行显示初始化的全局变量和静态变量。将经过初始化的全局变量和静态变量与未初始化的全局变量和静态变量分开存放,其主要原因在于程序在磁盘上存储时,没有必要为未经初始化的变量分配存储空间。

4.栈
是一个动态增长和收缩的段,有栈帧(stack frames)组成。系统会为每个当前调用的函数分配一个栈帧。栈帧中存储了函数的局部变量(所谓自动变量)、实参和返回值。

5.堆(heap):是可在运行时(为变量)动态进行内存分配的一块区域。堆顶端称为program break。

7. 结合进程管理命令,说明进程各种状态。

       D (TASK_UNINTERRUPTIBLE) 	不可中断的深度睡眠,一般由IO引起,同步IO在做读或写操作时,cpu不能做其它事情,只能等待,这时进程处于这种状态,如果程序采用异步IO,这种状态应该就很少见到了R (TASK_RUNNING)				正在运行,或在队列中的进程S (TASK_INTERRUPTIBLE)		可中断的睡眠状态T (TASK_STOPPED)				停止状态t (TASK_TRACED)				被跟踪状态Z (TASK_DEAD - EXIT_ZOMBIE)  退出状态,但没被父进程收尸,成为僵尸状态W    						进入内存交换(从内核2.6开始无效)X (TASK_DEAD - EXIT_DEAD)    退出状态,进程即将被销毁I:空闲状态(idle)B:进程正在等待更多的内存页<    高优先级N    低优先级L    有些页被锁进内存s    包含子进程+    位于前台的进程组;l    多线程,克隆线程  multi-threaded (using CLONE_THREAD, like NPTL pthreads do).

pstree 查看进程,大部分情况下都为R运行进程

8. 说明IPC通信和RPC通信实现的方式。

IPC 是指进程之间的通信方式,用于在同一台计算机上的不同进程之间进行数据交换和通信。
常见的 IPC 通信方式包括管道、命名管道、消息队列、信号量、共享内存和套接字等。
例如父进程创建了一个管道,并创建了一个子进程。父进程向管道中写入一条消息,而子进程从管道中读取消息并打印出来。

RPC 是指远程过程调用,用于在网络上实现分布式系统中的远程程序之间的通信。
RPC 允许一个程序调用另一个程序中的函数或过程,就像调用本地函数一样,而不需要程序员显式地处理网络通信细节。
比如我在外部主机有一个调用资源计算的程序,当我内部主机需要计算时通过调用外部主机的程序去实现

10. 总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换。

前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失。

后台进程:也叫守护进程,是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互。

& 用在一个命令的最后,可以把这个命令放到后台执行
<Ctrl>+z 将一个正在前台执行的命令放到后台,并暂停

11. 总结内核设计流派及特点。

单内核(Monolithic Kernel):
特点:单内核将所有核心功能和驱动程序放在一个大的内核空间中运行。内核负责管理硬件、内存、进程和文件系统等。典型的单内核包括 Linux 内核和 Windows NT 内核。
微内核(Microkernel):
特点:微内核将最小的功能放在内核中,其他功能通过用户空间的服务或服务器来实现。例如,设备驱动程序和文件系统可以作为用户空间服务运行。
混合内核(Hybrid Kernel):
特点:混合内核综合了单内核和微内核的特点,将一些核心功能放在内核中,而将其他功能作为可选模块或用户空间服务。

12. 总结rocky 启动流程,grub工作流程

启动流程:
1.BIOS/UEFI 初始化:系统开始启动时,首先进行硬件初始化和自检,然后加载引导程序。
2.在查找(0号磁头0号磁道1扇区磁盘的前446字节,后面的是硬盘分区表)MBR后,将MBR装载到RAM中,bios将控制权交给MBR
3.MBR通过bootloader找到gurb.cfg,找到并加载模块和内核。
4.内核加载initranmfs.img(liunx精简版,用于驱动挂载根)到内存去挂载根。
Init 进程替换:Linux 内核启动后,Systemd 作为第一个用户空间进程启动,并替换掉 init 进程。
Systemd 启动:Systemd 开始启动系统中的各种单元(units),包括系统服务单元、挂载点、设备单元等。它会按照单元之间的依赖关系和优先级顺序逐个启动。
Target 单元:Systemd 使用 target 单元来组织系统启动过程。CentOS 7 默认的 target 单元是 multi-user.target,它类似于传统的运行级别3,表示多用户文本模式。
服务单元启动:Systemd 会启动在启动过程中所需的各种服务单元,如网络服务、日志服务、文件系统挂载等。这些服务单元的启动顺序可能会根据它们的依赖关系而有所调整。
用户登录:一旦系统启动完成并且所有服务都正常启动,用户可以登录到系统中进行操作。

gurb工作流程:
阶段 1:
Stage 1 是GRUB的初始阶段,也称为引导加载程序。
它位于MBR(Master Boot Record)中的前446个字节。
主要任务是加载阶段 1.5或阶段 2。
Stage 1 通常不足以直接加载内核,因此它会跳转到其他阶段。
阶段 1.5:
Stage 1.5 是GRUB1中的一个特殊阶段,已经在GRUB2中被完全移除。
它位于MBR之后的一小段空间中。
主要用于读取文件系统的内容,例如加载GRUB配置文件和内核映像。
如果存在Stage 1.5,它会被加载并进一步加载阶段 2。
阶段 2:
Stage 2 是GRUB的最终阶段,也称为核心引导加载程序。
它位于磁盘上的文件系统中,通常在/boot/grub目录下。
主要任务包括:
显示GRUB菜单,允许用户选择操作系统或内核。
加载内核(通常是vmlinuz)和initramdisk(如果需要)到内存。
将控制权传递给内核,从而启动操作系统。

13. 手写chkconfig服务脚本,可以实现服务的开始,停止,重启。-

	#!/bin/bash## chkconfig: 345 95 20# description: Example service script# Source function library.. /etc/init.d/functions# Define variablesSERVICE_NAME="test"SERVICE_BIN="/usr/local/test/bin/test"PID_FILE="/var/run/test.pid"start() {echo "Starting $SERVICE_NAME..."$SERVICE_BIN}stop() {echo "Stopping $SERVICE_NAME..."killproc -p $PID_FILE $SERVICE_NAME}status() {if [ -f $PIDF ];thenecho "Nginx is running."elseecho "Nginx is stopped."fi}restart() {stopstart}case "$1" instart)start;;stop)stop;;status)status;;restart)restart;;*)echo "Usage: $0 {start|stop|restart|status}"exit 1;;esacexit 0

14. 总结systemd服务配置文件

例子:

	[Unit]Description=The nginx HTTP and reverse proxy serverAfter=network.target remote-fs.target nss-lookup.target[Service]Type=forkingPIDFile=/run/nginx.pid# Nginx will fail to start if /run/nginx.pid already exists but has the wrong# SELinux context. This might happen when running `nginx -t` from the cmdline.# https://bugzilla.redhat.com/show_bug.cgi?id=1268621ExecStartPre=/usr/bin/rm -f /run/nginx.pidExecStartPre=/usr/sbin/nginx -tExecStart=/usr/sbin/nginxExecReload=/bin/kill -s HUP $MAINPIDKillSignal=SIGQUITTimeoutStopSec=5KillMode=mixedPrivateTmp=true[Install]WantedBy=multi-user.target

Unit:该部分包含关于服务单元的基本信息。(不一定需要)
Description:描述服务的信息。
After:指定服务应该在哪些其他单元之后启动。在本例中,指定在网络服务启动之后启动该服务。

Service:该部分包含有关服务如何运行的详细信息。(最简单只需要ExecStart和type)
Type:指定服务的类型,可以是 simple、forking、oneshot、dbus 等。在本例中,指定为 simple,表示服务以简单方式启动。
PIDFile:指定主进程的PID文件路径
ExecStartPre :启动nginx服务前做的命令
ExecStart:指定服务启动时要执行的命令或程序。
ExecReload:当需要重新加载Nginx的配置执行命令
KillSignal:指定停止服务时的信号
TimeoutStopSec:指定服务停止的超时时间
KillMode:指定服务的杀死模式
PrivateTmp:是否启用私有临时目录,使得服务在运行过程中拥有独立的临时目录,提高安全性。
Restart:指定当服务发生故障时是否自动重启。

Install:该部分指定了如何安装服务。
WantedBy:指定服务应该在哪些目标之中启用。在本例中,指定为 multi-user.target,表示在多用户环境中启用该服务。

总结system启动流程15. 总结system启动流程

Systemd使用“target”来处理引导和服务管理过程。这些systemd里的“target”文件被用于分组不同的引导单元以及启动同步进程。

在启动过程中,systemd有几个大目标,每个目标以.target表示。systemd的target主要作用是对多个任务进行分组,比如basic.target中,可能包含了很多任务。

第一个大目标:sysinit.target
      sysinit.target主要目的是读系统运行环境做初始化,初始化完成后进入下一个大目标
第二个大目标:basic.target
      basic.target的作用主要是在环境初始化完成后执行一些基本任务,算是做一些早期的开机自启动任务,basic.target完成后进入第三个大目标
第三个大目标:『default.target运行级别』
      default.target是一个软链接,链接到不同的target表示进入不同的『运行级别』,运行级别阶段的目的是为最终的登录做准备:

       如果是内核启动过程中(内核启动时调用了集成在initramfs中的systemd就处于这个过程),那么大目标是initrd.target,该target的目标是为后续虚根切换到实根做初始化准备,比如检查并挂载根文件系统,最终虚根切换实根,并进入真正的用户空间,也即完成了内核启动或内核已经成功登录

        如果不是内核启动过程中,可能会选择不同的『运行级别』,通常是图形终端的graphical.target,或者多用户的运行级别multi-user.target,它们的目标都是完成系统启动,并准备让用户登录系统

简要过程
1.systemd执行的第一个目标是default.target。(但实际上default.target是指向graphical.target的软链接。)
2.在这个阶段,会启动multi-user.target而这个target将自己的子单元放在目录“/etc/systemd/system/multi-user.target.wants”里。(这个target为多用户支持设定系统环境。非root用户会在这个阶段的引导过程中启用。防火墙相关的服务也会在这个阶段启动。)
接着"multi-user.target"会将控制权交给另一层“basic.target”。
3."basic.target"单元用于启动普通服务特别是图形管理服务。它通过/etc/systemd/system/basic.target.wants目录来决定哪些服务会被启动,basic.target之后将控制权交给sysinit.target.
4."sysinit.target"会启动重要的系统服务例如系统挂载,内存交换空间和设备,内核补充选项等等。
5.ysinit.target在启动过程中会传递给local-fs.target
  local-fs.target,这个target单元不会启动用户相关的服务,它只处理底层核心服务。这个target会根据/etc/fstab和/etc/inittab来执行相关操作。

16. 总结awk工作原理,awk命令,选项,示例。

AWK 原理:
文本处理: AWK 是一种编程语言,用于在文本文件中搜索和处理模式。
模式匹配: 它通过定义模式来匹配文本行,并对匹配的行执行指定的操作。
数据字段: AWK 自动将每行分割成字段,可以单独处理每个字段。
编程结构: 支持条件语句、循环和数组,适合复杂文本处理任务。

选项:

-F <分隔符> 或 --field-separator=<分隔符>: 指定输入字段的分隔符,默认是空格。使用这个选项可以指定不同于默认分隔符的字段分隔符。
例子:awk -F ":" '{print $1 ":" $3 }' exe.txt 以:为分隔符

-v <变量名>=<值>: 设置 awk 内部的变量值。可以使用该选项将外部值传递给 awk 脚本中的变量。变量只按变量为分隔符分割,跟行列没关系
例子:awk -v FS=":" '{print $FS$3}' /etc/passwd 变量调用

-f <脚本文件>: 指定一个包含 awk 脚本的文件。这样可以在文件中编写较大的 awk 脚本,然后通过 -f 选项将其加载。
例子:awk -F'[ .]' '{print $2}' exe.log

17. 总结awk的数组,函数。

数组
awk支持索引数组和关联数组两种类型的数组。
索引数组以数字作为索引,从0开始递增,用于按顺序存储数据。
关联数组以字符串作为索引,也称为键,用于根据特定键检索数据。
数组元素可以通过索引或键来访问,也可以通过循环遍历数组中的所有元素。

awk 'BEGIN{ fruits[0]="apple"; fruits[1]="banana"; for(i=0;i<2;i++) print fruits[i] }'

函数
awk支持自定义函数,可以用于封装常用的操作和逻辑。
函数可以接受参数并返回值。
在awk中,函数可以像内置函数一样使用,并且可以在脚本中任何地方调用。

# 定义函数
function add(x, y) {return x + y
}# 调用函数
awk 'BEGIN{ result = add(2, 3); print result }'

18. 总结ca管理相关的工具,根据使用场景总结示例。

OpenSSL:
使用场景:自签名证书、证书签发、证书签名请求生成等。
示例:
生成自签名证书:openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
生成证书签发请求:openssl req -new -key key.pem -out req.pem
签发证书:openssl x509 -req -in req.pem -CA cert.pem -CAkey key.pem -CAcreateserial -out cert_signed.pem -days 365
EasyRSA:
使用场景:快速搭建PKI(Public Key Infrastructure)环境,管理CA证书和用户证书。
示例:
初始化PKI环境:easyrsa init-pki
生成CA证书和私钥:easyrsa build-ca
签发用户证书:easyrsa build-client-full user1 nopass
生成服务器证书:easyrsa build-server-full server1 nopass
cfssl(CloudFlare SSL):
使用场景:基于JSON配置文件进行CA证书管理,支持自签名证书、证书签发和撤销等操作。
示例:
生成自签名证书:cfssl selfsign domain-csr.json | cfssljson -bare domain
生成证书签发请求:cfssl gencert -initca csr.json | cfssljson -bare cert
签发证书:cfssl sign -ca cert.pem -ca-key key.pem csr.json | cfssljson -bare cert

19. 总结对称加密和非对称加密算法和用openssl签发证书步骤

对称加密:
对称加密使用相同的密钥(称为对称密钥)进行加密和解密。
加密和解密过程使用相同的密钥,因此速度较快。
常见的对称加密算法包括DES(Data Encryption Standard)、AES(Advanced Encryption Standard)、3DES等。
由于密钥是相同的,因此对称加密算法的密钥管理相对简单。
主要缺点是密钥分发和管理的安全性问题,需要确保密钥在传输和存储过程中不被泄露。
非对称加密:
非对称加密使用一对密钥进行加密和解密,分别称为公钥和私钥。
公钥用于加密数据,私钥用于解密数据,或者用于数字签名和身份验证。
加密过程使用公钥进行,解密过程使用私钥进行。
常见的非对称加密算法包括RSA(Rivest-Shamir-Adleman)、DSA(Digital Signature Algorithm)、ECC(Elliptic Curve Cryptography)等。
非对称加密算法的主要优点是密钥分发相对简单,公钥可以公开传输,私钥只有持有者知晓。
但是由于非对称加密算法的计算复杂度较高,速度较慢,因此一般用于密钥交换、数字签名等场景。

openssl签发证书步骤
1、创建CA所需要的文件
1.1生成证书索引数据库文件
touch /etc/pki/CA/index.txt
1.2指定第一个颁发证书的序列号
echo 01 > /etc/pki/CA/serial
2.生成CA私钥
cd /etc/pki/CA/
(umask 066; openssl genrsa -out private/cakey.pem 2048)
3、生成CA自签名证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out
/etc/pki/CA/cacert.pem
选项说明:
-new:生成新证书签署请求
-x509:专用于CA生成自签证书
-key:生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径

自签名证书需要填写的资料
国家、省份、城市、公司、部门、域名、邮箱
自签名证书需要与后面发的证书中的3点一致(如果没有更改策略 更改总策略:policy =policy_anything 或者更改单一策略)
国家、省份、公司

申请证书并颁发证书
1、为需要使用证书的主机生成生成私钥
(umask 066; openssl genrsa -out /data/test.key 2048)
2、为需要使用证书的主机生成证书申请文件(需要与前边CA的3点一致)
openssl req -new -key /data/test.key -out /data/test.csr
3、CA签署证书
openssl ca -in /data/test.csr -out /etc/pki/CA/certs/test.crt -days 100
4、发送证书
直接复制文件、邮件发送、使用安全传输协议、存储到网络共享目录、使用配置管理工具等等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/27430.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[openbve站]oldhelps openbve站v0.0.2推出上线公测

[openbve站]oldhelps openbve站v0.0.2推出上线公测 目录[openbve站]oldhelps openbve站v0.0.2推出上线公测1.归档页面增加图片显示 今天(5.4)起,openbve站上线第二个版本。此次更新的主要内容: 1.归档页面增加图片显示

开发Android应用程序,在Android10的系统上提示网络出错?

今天维护以前开发的一个Android客户端程序,发版后,有用户说自己手机安装,无法登录,首屏打开后(有网络通过接口加载服务器数据并显示的行为),提示网络出错。 但是我在我自己手上的PDA设备(Android 4.4)正常,然后又去找了一台Android设备,是Android8.0的,也正常。初步…

矢量金字塔技术研究

前言 在图像切片时代,多层次模型依靠的是影响金字塔。得益于影像栅格数据分辨率的特点,基于影像金字塔可以较好的实现多分辨率模型。但是在矢量切片时代中,就无法直接从影像金字塔技术获利了,因为矢量数据不具有分辨率这个特性,而是采用矢量金字塔技术来实现多层次、多尺度…

2022, 迟到的年终总结

前言 拖延症真的存在!!! 今天是2023年2月13日晚,我在此时写下本文的第二行内容。其实从年前就开始计划写一篇关于2022年的年终总结,无奈受到拖延病毒的威胁,一直拖到现在才暂时摆脱控制。 如题,本文将对2022年进行简要总结,同时对2023年做一个初步的展望(仅作记录)。…

GeoServer开发环境搭建

前言 本文用于记录GeoServer开发环境的搭建过程通过GeoServer发布计划可以看到,在2.23.x版本开始,会移除对jdk1.8的支持。那么当前我们会选择2.22.x版本进行研究 环境JAVA:1.8或11 Maven GitAction 获取源码git clone git://github.com/geoserver/geoserver.git geoserver# …

拂衣天气(微天气)Github Action镜像自动构建与推送

前言 这里暂不作过多的操作,还是保持与此前一致。即通过Github Action完成Docker Image的build与push,目标仓库为阿里云容器镜像服务实例(个人版)registry.cn-hangzhou.aliyuncs.com 那么一共分为三个部分:Dockerfile编写 阿里云容器镜像服务配置 Github ActionDockerfile…

拂衣天气(微天气)终篇

起源 天气小程序产生于2022年年初,目的是用于验证自己是否有进入全栈开发(仅前后端)的能力。 受新冠疫情影响,2022年的春节是在杭州过的。还记得当时附近好几个地方都被划为了高风险,对整个区进行了管控。如果选择回家的话,得到将是14天的隔离,还不确定能否回来上班。因…

拂衣天气(微天气)-技术预研

前言 俗话说:磨刀不误砍柴工。 我想做一个天气类别的小程序,以此进行全栈开发能力的试炼。我想这会是一个微信小程序、是一个可以正常使用的小程序,以Java进行服务端开发,以Mapbox实现天气数据可视化。 但是我是一个后端开发工程师,我不怎么会写页面,我特别的讨厌写CSS。…