Linux通过Docker安装Microsoft Office+RDP远程控制

news2024/9/20 18:46:57

之前写过一篇使用KVM虚拟机安装Microsoft Office+RDP远程控制的文章,根据B站的教程安装后,发现有远程控制延迟的问题,比如拖动Office窗口时会延迟,搜狗输入法扫一下就闪退,插入形状后无法调整大小,无法调整图片大小等问题。而且最大的问题是,如果你不提前关闭KVM虚拟机,就得等待Linux关机时杀掉KVM虚拟机的'libvirt' 进程,导致关机需要很长时间。已知Linux开机时会同步开启KVM虚拟机的'libvirt' 进程,这个'libvirt' 进程经常导致Linux系统崩溃,开机时黑屏。停留在只有一条白色下杠的页面。

因此,Winapps最新版本提供了解决方案,推荐用户使用Docker或者Podman安装Microsoft Office + RDP远程控制。降低了系统崩溃的概率。接下来我将带大家如何进行安装和设置。

系统:Ubuntu24.04

前提:已经安装了Docker

(不会安装Docker的,请查看《Ubuntu24.04安装Docker》的文章)

一、从github下载winapps

在必应搜索“winapps github”

复制HTTPS的下载链接:https://github.com/Fmstrat/winapps.git

进入/opt目录,通过git clone把winapps下载到/opt目录下

yammie@my-pc >/opt 
$ git clone https://github.com/Fmstrat/winapps.git

为了后续执行不受权限的干扰,给winapps中的所有文件授予777权限。

yammie@my-pc >/opt 
$ sudo chmod 777 -r ./winapps

 
此时winapps的所有者和权限如图:

进入winapps/docs,阅读docker.md的安装步骤。里面提示可以通过docker或者podman进行安装,此处我们选择docker。

二、阅读并修改compose.yaml

1. compose.yaml的内容

打开compose.yaml,阅读里面的设置要点。修改为以下内容,复制粘贴即可

name: "winapps"
volumes:   # Linux系统中通过建立'_data'目录来作为Docker镜像的数据卷
  # 此处默认注释,执行compose.yaml时,它也会默认安装到下面的目录
  # Located @ '/var/lib/docker/volumes/winapps_data/_data' (Docker).
  # Located @ '/var/lib/containers/storage/volumes/winapps_data/_data' or '~/.local/share/containers/storage/volumes/winapps_data/_data' (Podman).
  data:
services: # 服务器
  windows:  # Windows的镜像容器
    image: dockur/windows  # 指定从github中下载dockurr/windows的Docker镜像
    container_name: WinApps  # 创建Docker容器名称为WinApps
    environment:                # 要配置的Windows镜像版本环境。要选择Windows版本,请访问:
      VERSION: "core11"  # https://github.com/dockur/windows ; 下拉即可看到各种Windows版本。
      RAM_SIZE: "4G"      # 内存: 4G
      CPU_CORES: "4"    # CPU核心数:4
      DISK_SIZE: "64G"   # 主硬盘存储空间: 64G
      #DISK2_SIZE: "32G"  # 第二块硬盘存储空间:32G。如果你要取消该注释,需要保证提供了该硬盘给虚拟机运行
      LANGUAGE: "Chinese"  # 此处必须要指定安装语言为Chinese,不然默认安装English
      REGION: "zh-CN"         # 此处必须要指定地区为:zh-CN,不然默认安装English
      KEYBOARD: "zh-CN"   # 此处必须要指定键盘为zh-CN,不然默认安装English
      USERNAME: "Docker"  # Windows虚拟机的用户名默认是Docker,你可以取消注释,重命名为其他名字。建议默认
      PASSWORD: "123456me"  # Windows虚拟机登录密码,自定义即可。不能为空。
      HOME: "${HOME}"  # 设置Linux用户主文件夹的路径
    privileged: true  # 授予Windows 虚拟机扩展权限
    ports:
      - 8006:8006  # 将Linux主机上的“8006”映射到Windows 虚拟机上的“8006”→用于VNC Web界面http://127.0.0.1:8006.
      - 3389:3389/tcp  # 将Linux主机上的“3389”映射到Windows 虚拟机上的“3389”→用于远程桌面协议(RDP)
      - 3389:3389/udp # 将Linux主机上的“3389”映射到Windows 虚拟机上的“3389”→用于远程桌面协议(RDP)
    stop_grace_period: 120s     # 停止宽限期 ;当你去关闭Windows虚拟机时,等待120秒后才会发送SIGTERM信号去终止Windows的镜像容器进程。SIGTERM 信号提供了一种优雅的方式来终止程序。
    restart: on-failure     # 如果退出代码指示错误,将重新启动Windows VM
    volumes:       # Windows虚拟机的数据卷
      - data:/storage  # 挂载上面Linux系统中的'_data'数据卷,作为Windows虚拟机的C盘
      - ${HOME}:/shared  # 挂载Linux用户的home目录,作为Windows虚拟机的远程网络共享目录,名称为: \\host.lan\Data'.
      #- /path/to/second/hard/disk:/storage2 # 确保上面指定了第二块硬盘,取消注释,就会为Windows虚拟机加载第二块硬盘
      - ./oem:/oem    # 自动触发“oem/install.bat”的安装,应用含有'oem/RDPApps.reg'的Windows注册表修改。
      - /opt/winapps/iso/tiny11_core11.iso:/custom.iso #取消注释,使用自己下载的Windows.iso文件。一旦使用自己的iso文件,上面environment设定的  VERSION: "core11"  将会被忽略。
    devices:  # 设备
      - /dev/kvm # 启动 KVM.
      #- /dev/sdX:/disk1 # 取消注释,直接在Windows VM中挂载磁盘(注意:“disk1”将作为主驱动器挂载)
      #- /dev/sdY:/disk2 # 取消注释,直接在Windows VM中装载磁盘(注意:“disk2”及更高版本将作为辅助驱动器装载

有关文档、常见问题解答、其他配置选项和技术帮助,请访问:GitHub的dockurr/windows的Docker镜像容器icon-default.png?t=N7T8https://github.com/dockur/windows

(1) 注意:请不要使用Tab来调整注释位置,yaml文件不能识别Tab,不然执行会报错:
yaml: line 19: found character that cannot start any token
 

(2) 原来的compose.yaml中, - ./oem:/oem  - /opt/winapps/iso/tiny11_core11.iso:/custom.iso 默认是注释掉的。意味着我们默认从environment设定的  VERSION: "core11"  来下载Tiny 11 Core版本的Win11,网速不够快的情况下,用时超长。

因此,我们建议取消对- ./oem:/oem  - /opt/winapps/iso/tiny11_core11.iso:/custom.iso的注释。直接从指定的网站下载我们需要的iso文件。iso文件放在/opt/winapps/iso/目录下。iso目录需要我们自行创建。

指定本地的iso文件后,直接忽略了environment设定的  VERSION: "core11"  的下载 ,加快了加载win11的速度。

2、疑难解答

(1) 什么是数据卷(Volumes)

Docker镜像被存储在一系列的只读层中。当我们创建一个容器时,Docker会读取镜像(只读),并在其顶部添加一层读写层。如果正在运行中的容器修改了现有文件,该文件将会被拷贝出底层的只读层,放到最顶层的读写层中。读写层中原来的旧版本文件(未被更改过的文件)仍然存在于镜像中。

所以当Docker容器被删除后,再基于原来的镜像创建容器时,将创建一个没有任何数据更改的容器,在之前那个容器中的数据更改会丢失掉。只读层和读写层的组合被Docker称为联合文件系统(Union File System)。

为了能够持久化这些更改过的数据,并且能够很容易实现容器间共享数据,Docker提出了Volume的概念。Volume是外部默认的联合文件系统或者是存在于宿主文件系统中正常的文件或文件夹。


(2) 为什么需要数据卷

这得从Docker容器的文件系统说起。出于效率等一系列原因,Docker容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:

不能在宿主机上很方便地访问容器中的文件。
无法在多个容器之间共享数据。
当容器删除时,容器中产生的数据将会丢失。
为了解决这些问题,Docker引入了数据卷(Volume) 机制。数据卷以独立于Docker文件系统的形式存在于宿主机中。数据卷的最大特点是:其生存周期独立于容器的生存周期。

数据卷的设计目的就是数据的持久化,因为其生存周期独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。所以数据卷可以带来以下好处:

数据卷可在容器之间共享或重用数据。
数据卷的更改可以直接生效。
数据卷的生命周期一直持续到没有容器使用它为止。
对数据卷操作不会影响到镜像本身。
数据卷可以完成容器到宿主机、宿主机到容器以及容器到容器之间的数据共享。

(3) 什么是 SIGTERM(信号 15)

SIGTERM(信号 15)在基于 Unix 的操作系统(如 Linux)中用于终止进程。SIGTERM 信号提供了一种优雅的方式来终止程序,使其有机会准备关闭并执行清理任务,或者在某些情况下拒绝关闭。Unix/Linux 进程可以以多种方式处理 SIGTERM,包括阻塞和忽略。

SIGTERM 是 Unix/Linux kill 命令的默认行为,当用户执行 kill 时,操作系统会在后台向进程发送 SIGTERM。如果过程不在 Docker 容器中,通过 SIGTERM 信号终止的容器在其日志中显示退出码 143。如果您是 Kubernetes 用户,本文将帮助您了解 Kubernetes 终止容器时幕后发生的情况,以及如何在 Kubernetes 中使用 SIGTERM 信号。

(4) KVM是什么

 KVM,是Keyboard Video Mouse的缩写,KVM 通过直接连接键盘、视频或鼠标 (KVM) 端口,能够访问和控制计算机。KVM 技术无需目标服务器修改软件。这就意味着可以在BIOS环境下,随时访问目标计算机。KVM 提供真正的主板级别访问,并支持多平台服务器和串行设备。

三、下载指定的Windows系统的iso

因为上面compose.yaml默认从下面的网站下载iso文件,所以我们就从这里进去,选定要安装的Windows版本。

dockurr/windows指定的Windows系统下载区icon-default.png?t=N7T8https://file.cnxiaobai.com/Windows/%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E5%8C%85/


此处我选择tiny11 core x64 beta 1.iso下载。下载位置为:/opt/winapps/iso/
一定要跟compose.yaml指定的iso文件路径对应上!!

四、通过docker compose启动compose.yaml,安装Windows系统到dockurr/windows的镜像容器

yammie@my-pc >/opt 
$ cd ./winapps


yammie@my-pc >/opt/winapps 
$ docker compose --file ./compose.yaml up

接着终端提示进入http://127.0.0.1:8006的端口,在浏览器中进行Windows系统的安装。

安装过程略。

五、把修改后的compose.yaml复制到~/.config/winapps

安装完毕后,修改 /opt/winapps/compose.yaml,把以下内容注释掉:

     # - ./oem:/oem   
     #- /opt/winapps/iso/tiny11_core11.iso:/custom.iso

接着把修改后的compose.yaml复制到~/.config/winapps

yammie@my-pc >/opt 
$ sudo mkdir ~/.config/winapps


yammie@my-pc >/opt 
$ sudo cp ./compose.yaml ~/.config/winapps

六、停掉并删除 /opt/compose.yaml启动的容器,然后通过~/.config/winapps/compose.yaml启动新的容器

yammie@my-pc >/opt 
$ docker compose --file ./compose.yaml down


yammie@my-pc >/opt 
$ docker compose --file ~/.config/winapps/compose.yaml up


打开http://localhost:8006/,看到Windows系统能够运行即可。记住用户名为:Docker,以及你自定义的密码:123456me。等会用来写WinApps的配置文件。
 

七、进入Windows系统后,进行各种安装和设置

1、设置系统名称为RDPWindows

开始→设置→主页:点击重命名→命名为RDPWindows

2、在微软商店下载浏览器

我下载的是火狐浏览器

3、在浏览器中下载搜狗输入法并安装

4、下载Microsoft Office安装器

office-toolsicon-default.png?t=N7T8https://otp.landian.vip/zh-cn/

安装步骤:

注意!注意!以前安装过office要先卸载旧的才能安装 ,若是没有安装过的 跳过这一步 直接看下面。
安装过的 点击 工具箱---office工具---移除office后即可
 
① 打开tool plus 按照以下步骤依次执行
 
② 点击 设置---部署---启用显示内部产品和通道
 
③ 点击 部署---更新通道---选择最后一个 beta channel 同时安装模块选择office tool plus
 
④ 点击 添加产品---搜索框中输入 2024 ---选择office LTSC 专业增强版 2024 批量许可 即可( 其他2024 还有专业版同理)同时语言设置中文
 
⑤ 点击部署即可
 

5、激活系统和Microsoft Office


6、重点:注销Docker用户,等会进行WinApps的安装时必须要先注销,不然报错。
 

八、安装WinApps的依赖,并书写配置文件

1、安装WinApps的依赖

yammie@my-pc >/opt 
$ sudo apt-get install dialog   


yammie@my-pc >/opt 
$ sudo apt-get install freerdp3-x11 

2、书写配置文件

(1) 创建设置文件夹

yammie@my-pc >/opt 
$ sudo mkdir ~/.config/winapps

(2) 编辑设置文件

yammie@my-pc >/opt 
$ sudo touch ~/.config/winapps/winapps.conf   

(3) 授予777权限,方便日后我们修改里面的用户名和密码

yammie@my-pc >/opt 
$ sudo chmod 777 ~/.config/winapps/winapps.conf

(4) 写入我们在Win11设置好的用户名和密码

yammie@my-pc >/opt 
$ sudo gedit ~/.config/winapps/winapps.conf 

九、在用户层级安装WinApps

1、修改/opt/installer.sh

定位到/opt/installer.sh的第76、77行,MyWindowsUser修改为Docker,MyWindowsPassword修改为123456me

2、进入/opt目录,执行./installer.sh,安装WinApps

如果是sudo ./installer.sh安装,安装界面会识别成root用户。
如果是./installer.sh安装,安装界面会识别成当前用户。

我们在执行./installer.sh时,建议不要使用sudo ./installer.sh,在root层级安装WinApps,会涉及权限问题。最好是直接执行./installer.sh,在用户层级安装WinApps。方便日后无需权限去修改WinApps相关的内容。

执行以下命令:

yammie@my-pc >/opt 
$ ./installer  

按图选择:

安装成功!!此时双击Word可以成功开启。

请注意,Windows虚拟机请保持Docker用户在注销状态,Linux用户才能通过WinApps远程遥控Windows虚拟机的Microsoft Office。


十、如果~/.config/winapps/compose.yaml发生了修改,需要执行以下命令

如果~/.config/winapps/compose.yaml发生了修改,Windows镜像容器需要被移除和重新创建,这并不会影响磁盘里面的数据。注意,通过查看~/.config文件夹的属性,这是用户层级下创建的文件夹,无需sudo去操作。


1、停止并删除存在的Windows镜像容器

yammie@my-pc >/opt/winapps
$ docker compose --file ~/.config/winapps/compose.yaml down

2、删除存在的FreeRDP证书,移除证书后,WinApps不再起作用

yammie@my-pc >/opt/winapps
$ rm ~/.config/freerdp/server/127.0.0.1_3389.pem 

3、删除WinApps的远程控制以及图标,但是不删除/home/yammie/.config/winapps,因为里面的配置文件我们等会还要用

yammie@my-pc >/opt/winapps 
$ ./installer.sh --user --uninstall

4、重建并启动Windows的镜像容器,此时WinApps并无对该系统进行远程控制

yammie@my-pc >/home/yammie 
$ docker compose --file ~/.config/winapps/compose.yaml up  

5、进入http://localhost:8006,确保你已经注销Docker用户,接着 缩小或者关闭浏览器都行

6、重新执行WinApps的安装程序,才能生成新的pem证书和远程软件图标快捷方式

yammie@my-pc >/opt/winapps 
$ ./installer.sh 

按《八、在用户层级安装WinApps》的教程即可

十一、当Windows镜像容器卡死,如何解决

注意:有时候RDP Windows 相关的进程会卡死,通过
docker compose --file ~/.config/winapps/compose.yaml kill
也无法kill掉docker容器的情况下。

需要通过搜索:ps -aux|grep RDP
找到RDP的PID,第二个16677就是了

yammie@my-pc >/home/yammie 
$ ps -aux|grep RDP
                                         
yammie  16677  0.0  0.0   9304  2304 pts/0    S+   02:27   0:00 grep --color=auto RDP
 

 然后kill -9 <PID>即可。一定要添加-9选项,不然不能强制kill掉RDP进程

yammie@my-pc >/home/yammie 
$ kill -9 16677

然后通过容器重启:

yammie@my-pc >/home/yammie 
$ docker compose --file ~/.config/winapps/compose.yaml start

十二、docker的其它命令

docker compose --file ~/.config/winapps/compose.yaml start # 启动Windows镜像容器
docker compose --file ~/.config/winapps/compose.yaml pause # 暂停Windows镜像容器
docker compose --file ~/.config/winapps/compose.yaml unpause # 唤醒Windows镜像容器
docker compose --file ~/.config/winapps/compose.yaml restart # 重启Windows镜像容器
docker compose --file ~/.config/winapps/compose.yaml stop #优雅关闭Windows镜像容器,用时很长
docker compose --file ~/.config/winapps/compose.yaml kill #暴力关闭Windows镜像容器,用时很短
docker compose --file ~/.config/winapps/compose.yaml down #停止并删除Windows镜像容器

十三、创建启动和暴力关闭Windows镜像容器的桌面快捷方式

1、创建图标

(1) 进入 /opt/winapps/icons,复制windows.svg 2次,创建两个副本,分别命名为:close_Winapps.svg 和 open_Winapps.svg


(2) 分别编辑close_Winapps.svg 和 open_Winapps.svg的颜色代码,设置如下:

  ① close_Winapps.svg

      <stop offset="0" stop-color="orange"/>
      <stop offset=".4" stop-color="orange"/>
      <stop offset="1" stop-color="orange"/>

  ② open_Winapps.svg

      <stop offset="0" stop-color="#CCFF66"/>
      <stop offset=".4" stop-color="#CCFF66"/>
      <stop offset="1" stop-color="#CCFF66"/>

(3) 在~/桌面创建两个desktop文件

yammie@my-pc >/home/yammie/桌面 
$ touch close_Winapps.desktop


yammie@my-pc >/home/yammie/桌面 
$ touch open_Winapps.desktop

close_Winapps.desktop

​[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=关闭WinApps
#图标路径
Icon=/opt/winapps/icons/close_Winapps.svg
Terminal=true
Exec=bash /opt/winapps/Winapps_close_open/close_Winapps.sh

open_Winapps.desktop

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=打开WinApps
#图标路径
Icon=/opt/winapps/icons/open_Winapps.svg
Terminal=true
Exec=/opt/winapps/Winapps_close_open/open_Winapps.sh

此处设置Terminal=true,弹出终端框,是为了让用户看到该程序执行状态。

2、创建脚本

(1) 在/opt/winapps下创建Winapps_close_open目录

yammie@my-pc >/opt/winapps 
$ mkdir Winapps_close_open

(2) 创建脚本

yammie@my-pc >/opt/winapps/Winapps_close_open 
$ touch close_Winapps.sh


yammie@my-pc >/opt/winapps/Winapps_close_open 
$ touch open_Winapps.sh

close_Winapps.desktop

#!/bin/bash
docker compose --file ~/.config/winapps/compose.yaml kill # 暴力关闭WinApps

open_Winapps.desktop

#!/bin/bash
docker compose --file ~/.config/winapps/compose.yaml start # 开启WinApps

3、右键图标→允许运行

双击黄色图标,关闭WinApps。
双击绿色图标,开启WinApps。

建议关闭Linux前,先关闭WinApps。不然杀后台进程需要挺长时间,导致关机时间也会延长。

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

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

相关文章

十七、【人工智能】【机器学习】【非监督学习】- K-均值 (K-Means)

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

热门超声波清洗机有哪些?值得入手的超声波清洗机品牌推荐

相信大家对超声波清洗机并不陌生&#xff0c;每次眼镜脏了&#xff0c;去眼镜店清洗时&#xff0c;店员使用的就是超声波清洗机。这种机器通过超声波的原理&#xff0c;能深入清洁物品内部&#xff0c;清洁效果非常好。相比于手动清洗&#xff0c;超声波清洗机可以在清洁过程中…

PHP健身微信小程序系统源码

&#x1f3cb;️‍♀️健身新潮流&#xff01;解锁“健身微信小程序”的全方位塑形秘籍 &#x1f4f1;开篇&#xff1a;掌中健身房&#xff0c;随时随地动起来 你还在为找不到合适的健身场地或教练而烦恼吗&#xff1f;是时候告别这些束缚&#xff0c;拥抱“健身微信小程序”…

身在职场,要认清的3个真理,让你把同事远远甩在身后

总有人被一些表面的现象所以蒙蔽&#xff0c;还沾沾自喜以为自己掌握了“真理”。职场上从来不缺“好心人”&#xff0c;总是用所谓的经验来告诫别人&#xff0c;应该如何做事。 大家都在说的事情&#xff0c;就一定是对的&#xff1f;那么为什么大多数人还活不成自己想成为的…

基于“日志审计应用”的 DNS 日志洞察实践

作者&#xff1a;羿莉 (萧羿) 基础背景 DNS(Domain Name System) [ 1] 是任何网络活动的基础。它将易于记忆的域名转换为机器能够理解的 IP 地址。监控 DNS 服务可以帮助用户识别网络活动并保持系统安全。出于合规和安全性的考虑&#xff0c;公司通常要求对网络日志进行存储和…

手撕算法题3 (附源码和思路)

算法 1.有效的括号2.用队列实现栈3.用栈实现队列3.设计循环队列 1.有效的括号 有效的括号 思路 借助栈这样的数据结构&#xff0c;将所有左括号进行入栈&#xff0c;所有右括号与出栈的括号比较&#xff0c;相同循环继续&#xff0c;不同直接返回false。循环结束后检查栈是否为…

模拟队列--C++

用数组来表示队列&#xff0c;怎么表示呢&#xff1f;我们先假设hh为头&#xff0c;tt为尾,当弹出队头的时候我们只需要把hh加一下就连可以了&#xff0c;相反tt一样也可以 #include<iostream> using namespace std; const int N1e510; int a[N],tt-1,hh0;//hh头 tt尾 i…

2.Linux_vi编辑器

打开/创建文件 1、打开/创建文件 指令&#xff1a;vi 文件名 若文件不存在&#xff0c;则新建一个文件&#xff1b;若文件存在&#xff0c;则打开这个文件。 2、打开文件时&#xff0c;指定光标的位置 指令&#xff1a;vi 文件名 行号 注意&#xff1a;""和行号…

吴恩达机器学习-C1W3L1-逻辑回归分类

在本实验中&#xff0c;您将对比回归和分类。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_common import dlc, plot_data from plt_one_addpt_onclick import plt_one_addpt_onclick plt.style.use(./deeplearning.mplstyle)分类…

JDK 8 升级 17 及 springboot 2.x 升级 3.x 指南

JDK 8 升级 17 简介 从 JDK 8 升级到 JDK 17 的过程中&#xff0c;有几个主要的变化&#xff0c;特别是 Java Platform Module System (JPMS) 的引入&#xff0c;以及一些包路径的调整。以下是与 JDK 17 相关的一些重要变化&#xff1a; Java Platform Module System (JPMS) …

The First项目报告:解读Trading Bot黑马,交易狙击手Banana Gun

Meme币市场的特点是高度投机性和波动性&#xff0c;一个项目可能在短时间内实现巨大涨幅&#xff0c;为投资者带来巨额回报。然而&#xff0c;这种市场也充满了不确定性&#xff0c;许多项目可能只是短暂的炒作&#xff0c;缺乏实际价值或长期发展的潜力。因此&#xff0c;对于…

实验2-4-3 求奇数分之一序列前N项和

//实验2-4-3 求奇数分之一序列前N项和#include<stdio.h> #include<math.h> int main(){int n;scanf("%d",&n);//输入正整数N&#xff1b;double sum0;for (int i 1; i < n * 2; i 2)/* 在表达式 for (int i 1; i < n * 2; i 2) 中&#x…

设计模式-策略模式的完整代码示例及测试验证

策略模式 什么是策略模式&#xff1f; 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换。 策略模式使得算法可以在不影响客户端的情况下发生变化。策略模式主…

研0 冲刺算法竞赛 day26 P1803 凌乱的yyy / 线段覆盖

P1803 凌乱的yyy / 线段覆盖 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 考点&#xff1a;线段覆盖 思路&#xff1a;将整体结束时间进行排序&#xff0c;在从头开始遍历计数 代码&#xff1a; #include<iostream> #include <algorithm> using namespace …

从零开始学习机器学习,掌握AI未来的关键!

从零开始学习机器学习 1. 介绍1.1 人工智能&#xff08;AI&#xff09;概述1.2 机器学习在人工智能中的应用1.3 机器学习基础概念 2. 监督学习2.1 什么是监督学习2.2 回归分析2.3 分类问题2.4 模型评估和选择 3. 无监督学习3.1 什么是无监督学习3.2 聚类算法3.3 降维技术 4. 深…

Spring源码解析(27)之AOP的核心对象创建过程2

一、前言 我们在上一节中已经介绍了Advisor的创建过程&#xff0c;当时我们创建的logUtil这bean&#xff0c;他在 resolveBeforeInstantiation返回的是null&#xff0c;那么就会继续往下执行doCreateBean方法。 二、源码分析 protected Object doCreateBean(String beanName,…

永结无间Ⅸ--你不需要LLM Agent

人们将目光锁定在下一个闪亮的事物上。FOMO 是人性的一部分。这也适用于企业。就像数据科学成为每个企业分析功能的热潮一样&#xff0c;Agentic Architecture 是大多数 AI 雷达上的热门目标。 但您是否考虑过您是否真的需要它&#xff1f; 实际情况是&#xff0c;您不需要 A…

解答|一年期HTTPS证书如何获取?

自2023年年底以来&#xff0c;各大平台陆续下架了一年期免费HTTPS证书&#xff0c;目前市面上已经不再提供一年期的免费证书。付费正式版证书成为首选&#xff01;而DV证书由于其低廉的价格广受个人或者中小企业的青睐。 下面是DV类型证书&#xff08;13个月时长&#xff09;的…

防火墙Firewalld(iptables)

目录 一、Linux防火墙基础 1.什么是防火墙 2.防火墙的功能 3.防火墙的类型 二、Linux防火墙工具 1.iptables 2. netfilter 3.四表五链结构 3.1四表 3.2五链 3.3总结 4.数据包过滤的匹配流程 4.1规则表之间的顺序 4.2规则链之间的顺序 4.3规则链内的匹配顺序 …

人数管控系统助力图书馆实现精准客流统计分析

一、客流统计痛点在图书馆的日常运营中&#xff0c;客流统计面临着诸多难题。传统的人工计数方法不仅耗费人力&#xff0c;而且数据准确性难以保证。无法精确掌握不同时间段的读者流量&#xff0c;导致图书馆在资源配置和服务安排上缺乏科学依据。难以了解各个区域的受欢迎程度…