Linux CentOS 8 编译安装Apache Subversion
前言
距离上一篇发表已经过去了5年零2个多月,这次重新开始写技术博客,理由和原来一样,也就是想把自己学习和工作中遇到的问题和知识记录下来,今天记录一下Linux CentOS 8通过编译安装svn
的过程。
下载SVN
下载地址:链接: https://subversion.apache.org/download.cgi
进入下载页面后,我们可以看到当前source code的推荐版本是1.14.2,直接点击下载源码即可:
下载好之后将源码上传至指定目录:
输入命令tar -zxvf subversion-1.14.2.tar.gz
进行解压之后,即可看到svn的源码目录,如下图所示:
最后我们输入命令mv ./subversion-1.14.2 /usr/local/svn/source
将源码移动到指定目录,计划将svn安装在/usr/local/svn的根目录下。
编译安装SVN
下载完毕后,开始编译源码安装,进入源码所在的source目录后,执行配置(configure)命令同时指定安装路径:
./configure --prefix=/usr/local/svn
如果控制台没有报错那么直接运行命令make && make install
即可完成编译和安装,但是这里报错了,需要根据提示信息去补充安装svn所依赖的部分组件,首先看一下我们的报错信息:
如上图所示,提示缺少Apache可移植运行库(APR)这个支持库,它是ApacheHTTP服务器的支持库,提供了一组映射到下层操作系统的API。完整的APR包含3个开发包,分别是:APR
,APR-util
和APR-iconv
,每一个开发包分别独立开发并且拥有自己的版本。APR-util
包含了一些常用的开发组件,结合上图的提示信息,我们在安装svn之前必须安装APR
和APR-util
。
安装APR和APR-util
首先打开APR的官方网站:https://apr.apache.org/:
如上图所示,打开主页后我们可以清晰的看到官方推荐的APR
和APR-util
的版本分别是APR 1.7.4
和APR-util 1.6.3
,所以我们直接点击左侧的Download!去下载这两个版本的源码即可:
下载成功后将源码上传至指定目录,这里我将安装svn依赖的各种组件库统一放到/usr/local/svn/dependPackage
目录中:
如上图所示,接下来分别解压之后编译安装即可。APR-util
安装依赖于APR
,因此需要首先安装APR
,进入APR
源码目录,依次进行配置、编译、安装即可:
./configure --prefix=/usr/local/apr && make && make install
之后再执行命令make && make install
进行编译安装即可。
如上图所示,我们已经成功编译安装了APR
支持库。接下来安装APR-util
。同样的进入APR-util
目录,依次进行配置、编译、安装即可,注意此处需要通过--with-apr
配置项来指定APR
的目录:
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install
但是安装时候报错了,提示信息如下:
如上图所示,报错原因是缺少另一个库——Expat,所以接下来我们需要先安装Expat。
安装Expat
Expat的官网地址是:https://libexpat.github.io/
我们在Expat的首页可以清晰的看到关于Expat的解释:
What is Expat?
Welcome to Expat, a stream-oriented XML parser library written in C.
Expat excels with files too large to fit RAM, and where performance and flexibility are crucial.
如上所示,Expat是一个用C语言编写的面向流的XML解析库。Expat擅长处理太大而无法放入内存的文件,以及性能和灵活性至关重要的情况。简单了解一下,接下来从github
上下载安装即可,当前的最新版本是2.5.0
。下面是Expat的目录结构:
如上图所示,进入Expat目录后,依次进行配置、编译、安装即可:
./configure --prefix=/usr/local/expat && make && make install
安装好了Expat之后,我们回到上一步再次安装APR-util
即可,注意此处需要通过--with-expat
配置项来指定Expat
的目录:
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-expat=/usr/local/expat && make && make install
检查一下APR-util
安装目录,安装成功即可(如下图所示):
至此我们已经成功安装了APR
和APR-util
,解决了初始阶段的报错问题,那么我们回到svn的源码目录,再次通过配置命令检查一下是否可以正常安装,注意此处需要通过--with-apr
和--with-apr-util
配置项来指定APR
和APR-util
的目录:
./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
运行配置命令之后又发现了新的报错信息:
如上图所示,提示我们没有合适版本的SQLite
,所以接下来我们需要先安装SQLite
。
安装SQLite
SQLite的官网地址是:https://www.sqlite.org/
SQLite是一个用C语言编写的库,实现了一个小型、快速、自包含、高可靠性、功能齐全的SQL数据库引擎,做Android
开发的朋友应该都接触过这个数据库,我们在官方首页直接下载即可,目前最新版本是3.42.0
:
直接下载即可,根据报错信息提示,我们需要下载sqlite-amalgamation-xxx.zip
这个压缩文件,然后通过unzip
命令解压并重命名目录为sqlite-amalgamation
,注意这个目录需要放在svn源码目录当中。接下来我们按上述步骤操作,首先进入安装包目录解压缩包,然后再将其移动到指定目录:
unzip sqlite-amalgamation-3420000.zip
mv ./sqlite-amalgamation-3420000 ../source/sqlite-amalgamation
接下来回到svn源码目录检查一下SQLite
目录是否存在:
如上所示,没有问题,接下来我们回到svn源码目录,再次通过配置命令检查一下是否可以正常安装,注意不要忘记通过--with-apr
和--with-apr-util
配置项来指定APR
和APR-util
的目录:
./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
运行之后发现又有报错信息:
添加配置项–with-lz4=internal
如上图所示,根据提示,我们加上配置项--with-lz4=internal
之后再次运行配置命令:
./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-lz4=internal
又发现了新的报错信息:
如上图所示,提示svn
需要utf8proc
,请安装它,所以我们接下来先安装utf8proc
。
安装utf8proc
utf8proc
的github
项目地址是:https://github.com/JuliaStrings/utf8proc
utf8proc
是一个小巧、干净的C语言库,提供了对UTF-8
编码的Unicode数据进行规范化、大小写折叠和其他操作的功能。简单了解一下,目前utf8proc
的最新版本是2.8.0
,我们直接下载源码上传至指定目录解压:
如上图所示,然后运行make && make install
即可完成utf8proc
编译安装。安装完成之后我们再次重复之前的操作,进入svn源码目录运行配置命令检查是否已经可以正常编译安装:
./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-lz4=internal
这次终于没有了任何报错信息,最后我们在svn源码目录运行命令make && make install
完成安装即可,看一下安装好之后的svn
目录:
加入PATH环境变量
安装结束之后,首先我们需要把svn
的bin目录加入到PATH
环境变量中,方便我们全局使用svn
命令。首先进入配置文件vi /etc/profile
,Linux
中的系统环境变量PATH
的添加方式是通过冒号:
拼接路径的方式来添加,如下图所示:
然后运行svn
命令检查一下版本:
svn --version
这里报错了,看一下提示信息:
如上图所示,这里提示加载共享库错误,应该是在上面安装utf8proc时出了一些问题。解决方法很简单,依次按以下步骤操作即可:
- 编辑/etc/ld.so.conf文件,执行
vi /etc/ld.so.conf
,添加下面一行代码/usr/local/lib
。 - 执行
ldconfig
命令更新缓存。
接下来我们再次运行svn --version
命令检查一下svn
版本:
如上图所示,已经可以成功看到svn的版本相关信息,至此环境变量添加结束。
创建SVN版本库
svn
安装完成之后,下一步首先要做的就是创建我们的版本库,这里我们选择/home/svn
作为svn版本库的根目录,首先创建该目录:
mkdir -p /home/svn
根目录创建完成后,接下来我们创建需要交给svn
管理的项目目录,因为svn
是以项目为单位去进行版本控制的。例如这里我们有一个项目名叫vue_basic
,那么我们接下来在根目录下创建该项目目录:
mkdir -p /home/svn/vue_basic
接下来通过svnadmin create
命令进行版本库初始化:
svnadmin create /home/svn/vue_basic
命令执行成功之后我们可以在该目录下看到svn
版本库的初始结构:
如上图所示,这样我们的版本库就已经初始化完毕,db目录是数据文件存放目录,我们上传至svn的代码文件都是以特定格式压缩后存放在这里,而conf目录就是配置文件目录,下面我们要做的就是配置用户权限。
配置SVN服务器
关于SVN服务器配置的相关信息,我们可以在SVN社区的用户手册(the Subversion book)中获取相关信息,在文档中的第6章节(Chapter 6. Server Configuration)可以看到服务器配置的相关说明。下面是关于SVN服务器配置的概述:
Subversion was designed with an abstract repository access layer. This means that a repository can be programmatically accessed by any sort of server process, and the client “repository access” API allows programmers to write plug-ins that speak relevant network protocols. In theory,Subversion can use an infinite number of network implementations. In practice, there are only two Subversion servers in widespread use today.
如上介绍,SVN的设计包括一个抽象的网络层,这意味着版本库可以通过各种服务器进程访问,目前的实践中存在2种SVN服务器。继续看文档中对于这2种SVN服务器的解释说明:
Apache is an extremely popular web server; using the mod_dav_svn module, Apache can access a repository and make it available to clients via the WebDAV/DeltaV protocol, which is an extension of HTTP.In the other corner is svnserve: a small, lightweight server program that speaks a custom protocol with clients.
如上介绍,可以看出这两种服务器方案分别是:
- Apache+mod_dav_svn:通过使用mod_dav_svn模块,Apache可以访问版本库,并且可以使客户端使用HTTP的扩展协议WebDAV/DeltaV进行访问
- svnserve:一个小的,独立服务器,使用自己定义的协议和客户端
这两种方式各有优缺点,我们根据实际需求选择即可。通常情况下中小型团队建议使用svnserve,因为这种方式简单快速且能满足绝大多数情况下的版本控制需求。这里我们也选择使用svnserve,需要分别对3个文件进行配置,它们分别是conf目录下的passwd、authz和svnserve.conf,下面依次进行介绍:
配置用户密码(passwd)
首先第一步我们先打开passwd文件新增svn用户和密码:
如上图所示,passwd
是svnserve的示例密码文件,用于定义访问SVN服务器的用户帐号密码信息。在[users]
配置项下面新增用户,格式很简单直接写【用户名=口令】即可,这里我们新增了一个用户名为wangliang
且密码为123456
的用户。
配置用户权限(authz)
第一步配置了用户之后,接下来我们需要做的就是为已添加的用户配置操作SVN版本库
的权限,首先打开/conf/authz
文件:
如上所示,authz
是svnserve的示例授权文件,可以看到defines authorizations for the path字样,即是“基于路径的授权策略”,简单来讲,就是配置某个用户(a single user)或者某一组用户(a group of users)对某个目录的访问权限(read/read and write/no access)。我们可以在文档中的Chapter 6.Server Configuration中的Path-Based Authorization章节中我们可以找到相关信息:
Both Apache and svnserve are capable of granting (or denying) permissions to users. Typically this is done over the entire repository:a user can read the repository (or not), and she can write to the repository (or not). It’s also possible, however, to define finer-grained access rules. One set of users may have permission to write to a certain directory in the repository, but not others; another directory might not even be readable by all but a few special people. As files are paths, too, it’s even possible to restrict access on a per file basis.
如上所示,和我们上面总结的结论基本一致,Apache和svnserve都能向用户授权,通常是针对整个仓库进行,对仓库进行读写。也可以更细化的控制到仓库的某个目录的读写,接下来我们依次开始进行配置:
配置用户组(groups)
svnserve允许我们配置一组用户并为他们授权,在授权示例文件中我们可以看到配置示例代码:
如上图所示,在[group]
配置项下,我们通过[用户组名]=[用户组列表]的格式进行用户组配置。用户组列表的每个成员之间通过逗号分隔。例如我们配置两组用户,分别是开发组(dev_group)3名成员和测试组(test_group)3名成员:
[groups]
dev_group=wangliang,libo,fanyuanli
test_group=hubin,liumei,zhangchao
如上图所示,我们定义好了两个用户组之后,接下来我们就为用户或用户组配置权限。
授权
权限分为三种,我们在文档中可以看到相关说明:
grant read (‘r’) access, read-write (‘rw’) access, or no access (‘’).
- 只读(r)
- 读写(rw)
- 禁止访问(’ ')
而授权对象存在6种方式,在上面的svnserve
的授权示例文件中我们也可以看到,我们最常用的是以下3种方式,它们分别是:
- 单用户(a single user)
- 用户组(a group of users)
- 所有用户(anyone)
例如:我们要给wangliang用户设置读写权限,给上面创建的test_group
测试组用户都设置只读权限,那么授权代码这样写即可:
wangliang = rw
@test_group = r
这里注意引用用户组时需要在前面加上@符号。
只有上面这两行还不够,之前说了svnserve
是基于路径的授权策略,也就是说我们必须再指定一个目录,当上面的用户或用户组来访问,文档中有以下说明:
To be more specific: the value of the section names is either of the form [repos-name:path] or of the form [path].
如上所示,可以看到通常我们的路径格式是[版本库名:路径],例如,如果我们希望wangliang
用户可以操作vue_basic
这个版本库的所有内容,按如下配置即可:
[vue_basic:/]
wangliang = rw
如果不指定仓库名称的话,那么你的权限将作用于所有版本库中的同名路径配置中,文档中也有相关说明:
If you’re using the SVNParentPath directive, it’s important to specify the repository names in your sections. If you omit them,a section such as [/some/dir] will match the path /some/dir in every repository. If you’re using the SVNPath directive,however, it’s fine to only define paths in your sections—after all, there’s only one repository.
最后再给出几个简单示例,加深理解:
[groups]
xnzz_test = songming,liqiang,zhoufang[xnzz:/]
@xnzz_test = r
* =[xnzz_dev:/home/wangliang]
wangliang = rw
* = r
上面的代码定义了1个用户组xnzz_test
,有3名成员。定义了2个版本库xnzz
和xnzz_dev
,xnzz
版本库下的所有目录只有xnzz_test
用户组的成员可以进行读操作,其余所有用户禁止访问。xnzz_dev
版本库的/home/wangliang
目录只有wangliang
用户可以进行读写操作,其余用户禁止访问。
配置svnserve.conf
最后还需要配置一下/conf/svnserve.conf
这个文件,它是svnserve
服务器的一个全局配置文件。我们打开之后可以看到它的说明简介:
通常我们只需要配置[general]这个section中的以下属性:
- anon-access:控制非授权用户访问版本库的权限。取值范围为
write
、read
和none
。默认值为read
只读。 - auth-access:控制授权用户访问版本库的权限。取值范围为
write
、read
和none
。默认值为write
可修改。 - password-db:指定用户名口令文件名。除非指定绝对路径,否则文件位置为相对conf 目录的相对路径。 默认值为
passwd
,也就是我们刚才配置的密码文件。 - authz-db:指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。除非指定绝对路径,否则文件位置为相对conf目录的相对路径。 默认值为
authz-db
,同样的这也是我们刚才配置过的授权文件。 - realm:指定版本库的认证域,即在登录时提示的认证域名称,不用配置也没关系。
保存之后,至此我们svn服务器的配置内容就全部结束了。
启动SVN服务器
输入命令:
svnserve -d -r /home/svn/
即可启动SVN服务器,注意启动路径必须是版本库的根目录,而不是某个子目录。
停止SVN服务器
输入命令:
killall svnserve
即可停止SVN服务器。
Windows客户端测试连接
成功启动SVN服务器之后,我们通过Windows客户端工具TortoiseSVN
来连接测试一下是否可以正常进行版本控制。直接搜索安装TortoiseSVN
即可,安装好之后鼠标右键点击TortoiseSVN-->Repo browser
进入版本库浏览器界面:
如上图所示,输入svn://ip/仓库名
即可,注意一下Linux系统需要放开SVN的6379端口。点击确定之后如果没有什么问题会弹出输入框:
如上图所示,输入我们之前在passwd
文件中配置的用户名和密码,直接登录即可,登录成功后可以看到下面的版本库浏览器界面:
至此我们就可以使用SVN
开始进行版本控制了,简单的文件管理直接使用TortoiseSVN
,代码管理则需要在相关的IDE
中集成SVN插件并进行相关配置即可。
总结
本篇blog简单记录一下Linux下搭建SVN
服务器的过程,尽管目前分布式版本控制工具Git
已成为主流,但SVN
依然是集中式版本控制工具的代表。希望对遇到类似问题的朋友有所帮助,The End。(ps:时隔5年多的第一篇csdn博客,后面会继续坚持记录技术路程的点点滴滴,加油!)
相关文章:

Linux CentOS 8 编译安装Apache Subversion
前言 距离上一篇发表已经过去了5年零2个多月,这次重新开始写技术博客,理由和原来一样,也就是想把自己学习和工作中遇到的问题和知识记录下来,今天记录一下Linux CentOS 8通过编译安装svn的过程。 下载SVN 下载地址:…...

谈一谈缓存穿透,击穿,雪崩
缓存穿透 缓存穿透是指在使用缓存系统时,频繁查询一个不存在于缓存中的数据,导致这个查询每次都要通过缓存层去查询数据源,无法从缓存中获得结果。这种情况下,大量的请求会直接穿透缓存层,直接访问数据源,…...

如何对反编译的安卓应用进行调试并修改
安卓修改大师可以在没有源代码的情况下,直接反编译已经打包的APK安装包,通过修改SMALI代码实现添加和去除部分功能,并在应用的任何地方添加任意代码,增加任意任何您想实现的功能。通过这种方式,把该应用变为您自己的应…...

C#实现数据库数据变化监测(sqlservermysql)
监测数据库表数据变化,可实现数据库同步(一主一从(双机备份),一主多从(总部数据库,工厂1,工厂2,工厂数据合并到总部数据)) sqlserver 启用数据库…...
MFC第二十三天 HBrush对闭合图形的填充、CPen、CFont类常用功能与LOGFONT和LOGPEN结构体
文章目录 HBrush对闭合图形的填充HBITMAP位图资源的加载和平铺填充CFont类常用功能与LOGFONT结构体CPen类简介 HBrush对闭合图形的填充 HBRUSH创建: a)实色填充: HBRUSH CreateSolidBrush( COLORREF color);b)栅格线填充: HBRUSH CreateHa…...

深入学习 Redis - 渐进式遍历 scan 命令、数据库管理命令
目录 前言 一、scan 命令 二、数据库管理命令 select dbsize flushdb / flushall 前言 之前我们所了解到的 keys * 是一次性把整个 redis 中所有的 key 都获取到,但是整个操作比较危险,可能会一下子的都太多的 key,阻塞 redis 服务器. …...

python+opencv实现显示摄像头,截取相关图片,录取相关视频
实时显示摄像头图像 按下空格键,截取图片 按下tab键,开始录制摄像内容,再次按下,结束录制 按下Esc键,关闭窗口 import cv2 import numpy#第几章图片 img_count0InitVideoFalse #第几个视频 video_count0 video_flagFa…...

第十章:重新审视扩张卷积:一种用于弱监督和半监督语义分割的简单方法
0.摘要 尽管取得了显著的进展,弱监督分割方法仍然不如完全监督方法。我们观察到性能差距主要来自于它们在从图像级别监督中学习生成高质量的密集目标定位图的能力有限。为了缓解这样的差距,我们重新审视了扩张卷积[1]并揭示了它如何以一种新颖的方式被用…...

指令收集:DOCKER+K8S
docker 1.镜像指令:docker images 1、docker images : 列出本地主机上的镜像OPTION字段说明: -a 列出所有本地镜像, -q 只显示镜像ID2、docker search 某个镜像名字 : 查找某个镜像加上 --limit 5 redisÿ…...

Minecraft 1.20.x Forge模组开发 05.矿石生成
我们本次尝试在主世界生成模组中自定义的矿石 效果演示 效果演示 效果演示 1.由于1.20的版本出现了深板岩层的矿石,我们要在BlockInit类中声明一个矿石的两种岩层形态: BlockInit.java package com.joy187.re8joymod.init;import java.util.function.Function;import java…...
运维面试大全
文章目录 第一阶段你是用过哪些Linux命令Linux 系统安全优化与内核优化经常使用shell脚本做什么软连接与硬链接的区别怎么查看文件IOS七层模型三次握手与四次挥手lvm 逻辑卷创建过程磁盘配额raid 磁盘阵列文本三剑客防火墙iptables与firewardLinux系统资源查询命令日志的八大等…...

【线程安全的讨论(一)】CPU多核缓存架构和JMM
CPU多核缓存架构 一、CPU多核缓存架构可见性问题乱序执行(指令重排) 二、JMM——Java内存模型 一、CPU多核缓存架构 计算机的基本组成图 CPU 缓存为了提高程序运行的性能,现代 CPU 在很多方面会对程序进行优化。CPU 的处理速度很快…...

以太网交换机的生成树协议STP
概述 网络环路带来的问题 广播风暴 广播帧在各个交换机之间反复转发,分别按顺时针和逆时针方向不停的同时兜圈。广播风暴会大量消耗网络资源,使得网络无法正常转发其他数据帧。 主机收到反复的广播帧,会大量消耗主机的资源。交换机的帧交换…...

手机照片转换成pdf怎么做?了解这几种方法就可以了
手机照片转换成pdf怎么做?转换照片为PDF的需求在日常生活中很常见。无论是收集有关旅行、家庭或工作的照片,将它们组织成一个PDF文件可以更方便地分享给朋友或同事。那么下面就给大家分享几个手机照片转换成pdf的方法。 虽然有多种软件和工具可以将照片转…...

跨境电商还有人在做吗,这十大选品技巧建议收藏!
随着电商的快速发展,无论国内或者国外电商,竞争都比较激烈,很多人觉得现在入行太晚了,玩不过那些老卖家。 不过我想说的是:做电商很重要的一点就是选品,那些很早一批老卖家可能也是借着红利期走过来的&…...

HTML快速学习
目录 一、网页元素属性 1.全局属性 2.标签 2.1其他标签 2.2表单标签 2.3图像标签 2.4列表标签 2.5表格标签 2.6文本标签 二、编码 1.字符的数字表示法 2.字符的实体表示法 三、实践一下 一、网页元素属性 1.全局属性 id属性是元素在网页内的唯一标识符。 class…...

centos7搭建k8s环境并部署springboot项目
之前看了很多文章,都是部署后一直报错,百度解决后下次又忘了,这次决定把从头到尾的过程记录下来方便下次再看,部署参考文章尚硅谷Kubernetes(k8s)视频学习笔记_尚硅谷k8s笔记_溯光旅者的博客-CSDN博客 1、…...
nuitka打包软件程序
将python代码打包成exe桌面程序 1、打包参数含义 """-–mingw64 默认为已经安装的visio stdio去编译-–standalone 独立环境,这是必须的(否则拷给别人无法使用)-–windows-disable-console 没有CMD控制窗口-–output-dirout 生成exe到out文件夹下面…...

12-3_Qt 5.9 C++开发指南_创建和使用静态链接库
第12章中的静态链接库和动态链接库介绍,都是以UI操作的方式进行,真正在实践中,可以参考UI操作产生的代码来实现同样的功能。 文章目录 1. 创建静态链接库1.1 创建静态链接库过程1.2 静态链接库代码1.2.1 静态链接库可视化UI设计框架1.2.2 qw…...
conda模式安装paddlepaddle2.4.2版本
conda模式安装paddlepaddle2.4.2版本 一、下载anaconda 2022.10 window-x86-x64.exe 清华镜像源Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror,进去后根据自己的需要选择对应的版本下载 下载安装到磁盘空闲空间要大的D:\Pr…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
【题解-洛谷】P10480 可达性统计
题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...