1.linuxlocate
2.PostgreSQL14基于源码安装和入门教程
3.BlueStore源码分析之Cache
4.Redis radix tree 源码解析
5.为什么unreal虚幻引擎源码编译如此慢,有方法改进吗?
6.如何在stm32单片机上移植u8g2图形库?
linuxlocate
linuxæ¥è¯¢å½ä»¤ï¼1.find
findæ¯æ常è§åæ强大çæ¥æ¾å½ä»¤ï¼ä½ å¯ä»¥ç¨å®æ¾å°ä»»ä½ä½ æ³æ¾çæ件ã
2.locate
locateå½ä»¤å ¶å®æ¯find-nameçå¦ä¸ç§åæ³ï¼ä½æ¯è¦æ¯åè å¿«å¾å¤ï¼åå å¨äºå®ä¸æç´¢å ·ä½ç®å½ï¼èæ¯æç´¢ä¸ä¸ªæ°æ®åºã
3.whereis
whereiså½ä»¤åªè½ç¨äºç¨åºåçæç´¢ï¼èä¸åªæç´¢äºè¿å¶æ件ï¼åæ°-bï¼ãman说ææ件ï¼åæ°-mï¼åæºä»£ç æ件ï¼åæ°-sï¼ã
4.which
whichå½ä»¤çä½ç¨æ¯ï¼å¨PATHåéæå®çè·¯å¾ä¸ï¼æç´¢æ个系ç»å½ä»¤çä½ç½®ï¼å¹¶ä¸è¿å第ä¸ä¸ªæç´¢ç»æã
5.type
typeå½ä»¤å ¶å®ä¸è½ç®æ¥æ¾å½ä»¤ï¼å®æ¯ç¨æ¥åºåæ个å½ä»¤å°åºæ¯ç±shellèªå¸¦çï¼è¿æ¯ç±shellå¤é¨çç¬ç«äºè¿å¶æ件æä¾çã
linuxä¸cè¯è¨åºå½æ°ç®å½ï¼
ä¸è¬æ¥è¯´æ¯æ¾å¨/usr/includeç®å½ä¸çï¼
ä½æ¯è¿ä¸ªå¹¶ä¸å±éä¹æ¯å¯æ§çï¼å¦ææ们è¿è¡å¼åè¿ç¨ä¸ï¼å°±ä¼å¨å æ ¸çåºå½æ°æ件ç®å½ï¼
ä¾å¦å¨:/XXX/XXX/linux-X.X/include
æä»¥æ ¹æ®ä¸åçæ åµï¼å¤´æ件åæ¾çç®å½ä¹æ¯ä¸åçï¼å ·ä½éè¦å¯ä»¥æ ¹æ®locateågrepå½ä»¤è¿è¡æ¥è¯¢ã
å¦ä½å¨linuxä¸ç¨å½ä»¤å®ç°ç¨æ·åç»ç管çï¼
Linuxä¸ç¨å½ä»¤å®ç°æ¬å°ç¨æ·åç»ç管ç
æ¬å°ç¨æ·åç»ï¼ç®¡çæ件åè¿ç¨çç
æ¬å°ç¨æ·åç»ï¼
1ï¼root:è¶ çº§ç®¡çåç³»ç»å建ç第ä¸ä¸ªè´¦æ·
ç¹ç¹ï¼
id为:0
家ç®å½ï¼/root
å ·æç³»ç»çå®å ¨æ§å¶æ:å°å¿ä½¿ç¨ã
#id
uid=0(root)gid=0(root)groups=0(root)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c
#
2ï¼æ®éç¨æ·ï¼ä¸å ·æ管çåæé
ç¹ç¹ï¼
idèå´ï¼
=id=
家ç®å½ï¼/home/ç¨æ·å
#idstudent
uid=(student)gid=(student)groups=(student),(wheel)
#
3ï¼æå¡ç¨æ·ï¼ä¸ºæå¡æä¾æé
ç¹ç¹ï¼
idèå´ï¼
0id
家ç®å½ï¼åºç¨ç¨åºæå¡ç®å½
#idapache
uid=(apache)gid=(apache)groups=(apache)
#
å¦ææ¯yumï¼rpmå®è£ ç软件ï¼ç±rpmå ä¸çèæ¬å建æå¡è´¦æ·
Includeconf.modules.d/*.conf
#
#Ifyouwishhttpdtorunasadifferentuserorgroup,youmustrun
#httpdasrootinitiallyanditwillswitch.
#
#User/Group:Thename(or#number)oftheuser/grouptorunhttpdas.
#Itisusuallygoodpracticetocreateadedicateduserandgroupfor
#runninghttpd,aswithmostsystemservices.
#
Userapache
Groupapache
#'Main'serverconfiguration
#
æ¬å°ç»ï¼
1ï¼ä¸»ç»ï¼ä¸ä¸ªç¨æ·ä¸å®è¦å±äºæ个主ç»ä¸ãå½äºç¨æ·å¨å建æ件æ¶ï¼ç»æ件çå½å±ç»
2ï¼ä»å±ç»ï¼ç¨æ·å®¹å¨ï¼ç»ç»å管çç¨æ·æé管æ§
ä½ç¨ï¼
æ件ï¼
è¿ç¨ï¼
$ps-ux
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
student..?Ss::/usr/lib/system
student..?S::(sd-pam)
student..?S::sshd:student@p
student..pts/0Ss::-bash
student..?D::sshd:student@p
student..pts/1Ss::-bash
student..pts/1S::/bin/bash
student..pts/1R+::ps-ux
$
è´¦æ·æ件ï¼
1ï¼/etc/passwd:ä¿åç¨æ·ä¿¡æ¯
#cat/etc/passwd|grepstudent
student:x:::StudentUser:/home/student:/bin/bash
ç¨æ·åå¯ç uid主ç»IDæ述家ç®å½ç»å½shell
#
#cat/etc/passwd|grep-wroot:x
root:x:0:0:root:/root:/bin/bash
#
#cat/etc/passwd|grepapache
apache:x:::Apache:/usr/share/httpd:/sbin/nologin
æå¡è´¦å·æ æ³ç»å½ç³»ç»
#
2./etc/shadowï¼ä¿åç¨æ·å¯ç çHASHï¼å¯ç çæææ§ä¿¡æ¯ï¼å¯ç ä¿®æ¹æ¶é´ï¼è´¦æ·æææã
#
#ls-l/etc/shadow
----------.1rootrootMar:/etc/shadow
#
#
#cat/etc/shadow|grepstudent
student:$6$8oIjLCsc$/n1iQXYh1E6.uOEuJKgioqAtmqm2TQmkJGF2RwyteIr1tIfrPdiRYgWe6Sjen5/eMij2uHM/a1tue/QRlo3X::0::7:::
#
å¯ç çHASH:sha
8oIjLCsc$/n1iQXYh1E6.uOEuJKgioqAtmqm2TQmkJGF2RwyteIr1tIfrPdiRYgWe6Sjen5/eMij2uHM/a1tue/QRlo3X
:天æ°å¯ç æåä¸æ¬¡ä¿®æ¹çæ¶é´ä»--+天ä¹åé£ä¸å¤©
0ï¼å¯ç æå°ä½¿ç¨å¤©æ°0没æéå¶ç¨æ·éæ¶å¯ä»¥æ¹å¯ç
ï¼å¤©æ°ï¼å¯ç æ大修æ¹æ¶é´æ°¸ä¹ å¤å¹´
7ï¼warningè¦åæ¶é´ï¼å½å¯ç å¿«å°æåä¿®æ¹æ¶é´å7天ï¼éç¥ç¨æ·ä¿®æ¹ã
::天æ°å¤±ææ¶é´inactiveç¨æ·å¯ç è¿äºæåä¿®æ¹æ¶é´ï¼æªæ¹åå¯ç ï¼åè¿å¤å°å¤©ï¼è´¦æ·å°è¢«éå®
::è´¦æ·æææ
å建ç¨æ·åç»ï¼
å建æ¶ï¼æ²¡æå¯ç ï¼
#useraddzhangsan
#useraddlisi
#idzhangsan
uid=(zhangsan)gid=(zhangsan)groups=(zhangsan)
#idlisi
uid=(lisi)gid=(lisi)groups=(lisi)
#
æ æ³ç»å½ï¼ä¸PAMæå ³
$
$su-zhangsan
Password:
Password:
su:Authenticationfailure
$
设置å¯ç ï¼
#
#cat/etc/passwd|grepzhangsan
zhangsan:x::::/home/zhangsan:/bin/bash
#cat/etc/shadow|grepzhangsan
zhangsan:!!::0::7:::#!!æªè®¾ç½®å¯ç
#
#passwdzhangsan
Changingpasswordforuserzhangsan.
Newpassword:
BADPASSWORD:Thepasswordisshorterthan8characters
Retypenewpassword:
passwd:allauthenticationtokensupdatedsuccessfully.
#
#
#cat/etc/shadow|grepzhangsan
zhangsan:$6$3wxuXomVbQwQcK$oQW6injgldxa2N/Pt4tCPDVRqWRVGw.UNZdxE4R0nhEt8K/3UDKzxap6ReIReEvDpG.GdwjpMiiDh7.f6DJNQ0::0::7:::
#
chageå¯ä»¥æ¥çç¨æ·å¯ç å±æ§
#chage-lzhangsan
Lastpasswordchange:Mar,
Passwordexpires:never
Passwordinactive:never
Accountexpires:never
Minimumnumberofdaysbetweenpasswordchange:0
Maximumnumberofdaysbetweenpasswordchange:
Numberofdaysofwarningbeforepasswordexpires:7
#
å建ç»ï¼ä»å±ç»
#
#groupaddit
#
#
#groupaddsales
#
#
#
#cat/etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x::student
cdrom:x::
mail:x::postfix
man:x::
dialout:x::
floppy:x::
games:x::
tape:x::
video:x::
ftp:x::
lock:x::
audio:x::
users:x::
nobody:x::
dbus:x::
utmp:x::
utempter:x::
input:x::
kvm:x::
render:x::
systemd-journal:x::
systemd-coredump:x::
systemd-resolve:x::
tss:x::
polkitd:x::
rpc:x::
unbound:x::
ssh_keys:x::
sssd:x::
setroubleshoot:x::
rpcuser:x::
insights:x::
cockpit-ws:x::
sshd:x::
chrony:x::
tcpdump:x::
student:x::
printadmin:x::
libstoragemgmt:x::
slocate:x::
postdrop:x::
postfix:x::
apache:x::
zhangsan:x::
lisi:x::
it:x::ç»æåå表
sales:x::
#
#idstudent
uid=(student)gid=(student)groups=(student),(wheel)
#
å°ç¨æ·æ·»å è¿ç»ï¼zhangsan,å å ¥itç»ï¼lisiï¼salesç»
#idstudent
uid=(student)gid=(student)groups=(student),(wheel)
#usermod-aGitzhangsan
#
#
#usermod-aGsaleslisi
#
#
#idzhangsan
uid=(zhangsan)gid=(zhangsan)groups=(zhangsan),(it)
#idlisi
uid=(lisi)gid=(lisi)groups=(lisi),(sales)
#
å é¤ç¨æ·ï¼
#useraddandy
é»è®¤å é¤ï¼ä¿çç¨æ·çæ件ï¼
#
#userdelandy
#
#
#useraddandy#é建andyä¼ä¸ä¸æ ·ï¼uidä¼ä¸å
useradd:warning:thehomedirectoryalreadyexists.
Notcopyinganyfilefromskeldirectoryintoit.
Creatingmailboxfile:Fileexists
#
#useradduser1
#useradduser2
#idandy
uid=(andy)gid=(andy)groups=(andy)
#userdel-rany
userdel:user'any'doesnotexist
#
#userdel-randy#ä¸ä¿çç¨æ·çæ件ã家ç®ï¼é®ç®±æ件ï¼skelæ件é½ä¼
#
#
#idandy
id:âandyâ:nosuchuser
#useraddandy
#idandy
uid=(andy)gid=(andy)groups=(andy)
#
ä»ç»ä¸ç§»é¤ç¨æ·ï¼
#
#idzhangsan
uid=(zhangsan)gid=(zhangsan)groups=(zhangsan),(it)#zhangsan主ç»ï¼itä»å±ç»
#
å½ä»¤ï¼
#gpasswd-dzhangsanit
Removinguserzhangsanfromgroupit
#
#
#idzhangsan
uid=(zhangsan)gid=(zhangsan)groups=(zhangsan)
#
#
#usermod-aGitzhangsan
#
#
#idzhangsan
uid=(zhangsan)gid=(zhangsan)groups=(zhangsan),(it)
#
#
#
#groupszhangsan
zhangsan:zhangsanit
#
ç´æ¥ä¿®æ¹æ件ï¼
#vim/etc/group
#cat/etc/group|grepit:
it:x::
#
å é¤ç»ï¼
#groupaddtest
#
#
#groupdeltest
å建èªå®ä¹ç¨æ·åç»ï¼
å®éªï¼ç¨æ·åmary,æå®ç¨æ·id,家ç®å½/maryhome,ä¸ç¨ç»å½ç³»ç»æè¿°thisismaryuser
#
#useradd-u-d/maryhome-s/sbin/nologin-c"thisismary"mary
#
#idmary
uid=(mary)gid=(mary)groups=(mary)
#cat/etc/passwd|grepmary
mary:x:::thisismary:/maryhome:/sbin/nologin
#
#su-mary
Lastlogin:SunMar::CSTonpts/0
Thisaccountiscurrentlynotavailable.
#
å建èªå®ä¹ç»ï¼æå®ç»id
#groupadd-ggroup1
#cat/etc/group|grepgroup1
group1:x::
#
ç³»ç»ä¹å®¶Linuxæ示Unabletolocatepackage该å¦ä½å¤ç?æä¹åï¼
åå¼å§æ¥è§¦ubuntuçæåå¯è½ä¼æç §ä¸äºå ¥é¨æç« çæ¥éª¤æ´æ¹è½¯ä»¶æºï¼å¯æ¯æ¤æ¶å®è£ 软件çè¯ä¼åºç°unabletolocatepackageçé误ä¾å¦ï¼ä»£ç å¦ä¸ï¼username@ubuntuï¼~$sudoapt-getinstallmysql-servermysql-clientï¼»sudoï¼½passwordforusernameï¼ReadingpackagelistsDoneBuildingdependencytreeReadingstateinformationDoneEï¼Unabletolocatepackagemysql-serverEï¼Unabletolocatepackagemysql-clientusername@ubuntuï¼~$å ¶å®é®é¢åºå¨æ§è¡sudoapt-getinstallä¹åæ´æ¢äºè½¯ä»¶æºï¼ä½æ¯å´å¿äºupdateä¸äºï¼äºæ¯æ§è¡ä¸é¢çå½ä»¤ï¼ä»£ç å¦ä¸ï¼sudoapt-getupdateè¿æ ·ä¸æ¥é®é¢å°±è§£å³äºã
PostgreSQL基于源码安装和入门教程
PostgreSQL 源码安装入门教程
本文将引导您在openEuler . LTS-SP3系统上基于源码安装并配置PostgreSQL ,包括操作系统环境设置、网络配置、软件包安装、用户和数据盘创建,以及数据库的强势狙击源码初始化、启动和管理。1.1 操作系统环境
安装openEuler后,确保系统安装了bc命令(若缺失,后续会安装)。1.2 网络配置
通过Nmcli配置网络,首先检查并设置网络接口ens的IP地址,无论是自动获取还是静态配置。1.3 更新系统与工具安装
更新软件包并安装bc、vim、tmux和tar等工具,以支持后续操作。1.4 用户与数据盘创建
创建postgres用户和用户组,以及可能的专用数据盘,如NVMe SSD,用于提高性能。2. 安装与配置
2.1 下载与解压
以root权限下载并解压PostgreSQL 的源代码压缩包。2.2 安装与初始化
按照指导进行编译和安装,初始化数据库并设置启动参数。2.3 启动与管理
启动数据库,登录并创建必要用户、数据库和表空间。3. 开机自动启动
3.1 init.d环境
使用start-scripts中的脚本配置init.d,确保PostgreSQL在系统启动时自动运行。ryzom源码分析3.2 systemd环境
为PostgreSQL创建systemd服务文件,确保启动和管理的自动化。4. psql操作示例
展示如何使用psql进行数据库操作,包括创建数据库、模式、表和数据插入等。5. 远程连接
讲解如何配置防火墙以允许远程连接。 通过以上步骤,您将掌握PostgreSQL 的源码安装和基本管理,准备好进行数据管理和应用程序开发。BlueStore源码分析之Cache
BlueStore通过DIO和Libaio直接操作裸设备,放弃了PageCache,为优化读取性能,它自定义了Cache管理。核心内容包括元数据和数据的Cache,以及两种Cache策略,即LRU和2Q,2Q是默认选择。
2Q算法在BlueStore中主要负责缓存元数据(Onode)和数据(Buffer),为提高性能,Cache被进一步划分为多个片,HDD默认5片,SSD则默认8片。
BlueStore的元数据管理复杂,主要分为Collection和Onode两种类型。Collection存储在内存中,Onode则对应对象,便于对PG的对冲软件源码操作。启动时,会初始化Collection,将其信息持久化到RocksDB,并为PG分配Cache。
由于每个BlueStore承载的Collection数量有限(Ceph建议每个OSD为个PG),Collection结构设计为常驻内存,而海量的Onode则仅尽可能地缓存在内存中。
对象的数据通过BufferSpace进行管理,写入和读取完成后,会根据特定标记决定是否缓存。同时,内存池机制监控和管理元数据和数据,一旦内存使用超出限制,会执行trim操作,丢弃部分缓存。
深入了解BlueStore的Cache机制,可以参考以下资源:
Redis radix tree 源码解析
Redis 实现了不定长压缩前缀的 radix tree,用于集群模式下存储 slot 对应的所有 key 信息。本文解析在 Redis 中实现 radix tree 的核心内容。
核心数据结构的定义如下:
每个节点结构体 (raxNode) 包含了指向子节点的指针、当前节点的 key 的长度、以及是否为叶子节点的标记。
以下是插入流程示例:
场景一:仅插入 "abcd"。此节点为叶子节点,使用压缩前缀。
场景二:在 "abcd" 之后插入 "abcdef"。从 "abcd" 的父节点遍历至压缩前缀,找到 "abcd" 空子节点,聚合配送源码插入 "ef" 并标记为叶子节点。
场景三:在 "abcd" 之后插入 "ab"。ab 为 "abcd" 的前缀,插入 "ab" 为子节点,并标记为叶子节点。同时保留 "abcd" 的前缀结构。
场景四:在 "abcd" 之后插入 "abABC"。ab 为前缀,创建 "ab" 和 "ABC" 分别为子节点,保持压缩前缀结构。
删除流程则相对简单,找到指定 key 的叶子节点后,向上遍历并删除非叶子节点。若删除后父节点非压缩且大小大于1,则需处理合并问题,以优化树的高度。
合并的条件涉及:删除节点后,检查父节点是否仍为非压缩节点且包含多个子节点,以此决定是否进行合并操作。
结束语:云数据库 Redis 版提供了稳定可靠、性能卓越、可弹性伸缩的数据库服务,基于飞天分布式系统和全SSD盘高性能存储,支持主备版和集群版高可用架构。提供全面的容灾切换、故障迁移、在线扩容、性能优化的castep优化源码数据库解决方案,欢迎使用。
为什么unreal虚幻引擎源码编译如此慢,有方法改进吗?
为何虚幻引擎源码编译过程缓慢?确实,许多开发者在使用虚幻引擎时,会遇到编译时间过长的问题,这可能对项目进度造成影响。幸运的是,存在多种策略帮助优化编译速度。首先,考虑使用IncrediBuild、FastBuild或Horde等工具,它们能显著提升编译效率。请确保所购买的许可证支持当前处理器的核心数量,否则加速效果受限。
其次,性能卓越的CPU是关键。选择高性能CPU将直接影响编译速度。请注意,CPU的性能直接影响编译加速效果,购买CPU时,务必检查与当前硬件匹配的许可证类型。
将引擎源码与项目放入固态硬盘能显著提升读取和写入速度,加速编译过程。SSD的高速性能可极大地减少编译时间,提高开发效率。
第三,禁用项目中不必要的插件也能有效缩短编译时间。每个插件都会增加编译负担,因此,精简配置能提高编译效率。
在Windows 操作系统下,遇到使用小核而非大核的情况时,可以尝试使用Process Lasso工具。此工具有助于调整CPU使用策略,确保大核得到充分利用。然而,在Windows 系统上,这一问题通常不会出现。
综上所述,通过优化硬件选择、利用编译加速工具、改进项目配置以及合理管理CPU使用策略,开发者可以有效提升虚幻引擎源码的编译速度,从而加速项目开发进程。
如何在stm单片机上移植u8g2图形库?
U8g2是适用于嵌入式设备的单色图形库,支持单色OLED和LCD,涵盖多种OLED驱动,如SSD。在STM单片机上移植U8g2时,首先需下载其源码,关注csrc文件夹下的C源码部分。U8g2兼容多种屏幕显示驱动,源码内包含对应文件,移植时可删减无用文件以减小工程代码体积。
移植过程中的主要修改包括精简u8g2_d_setup.c和u8g2_d_memory.c文件。针对OLED屏幕的IIC接口,需要初始化GPIO。还需编写u8x8_gpio_and_delay和u8g2Init函数。移植详情和示例可参考演示视频评论区的图文教程。
速存,详细罗列香橙派AIpro外设接口样例大全(附源码)
华为云社区分享了关于香橙派AIpro外设接口的详细指南,包括样例源码,旨在帮助开发者充分利用其丰富的功能。AIpro板搭载升腾AI处理器,支持8TOPS INT8计算,适用于多种数据分析和推理计算场景,如教育、机器人和无人机等。 AIpro板提供了众多接口,如两个HDMI输出、GPIO、Type-C电源接口、SATA/NVMe SSD M.2插槽、TF插槽、千兆网口、USB3.0和Type-C接口,以及两个MIPI摄像头、MIPI屏和预留的电池接口。以下是部分接口的使用示例:通过MIPI接口,可以播放音频到耳机。只需插入耳机并进入音频测试程序,通过命令播放*.pcm文件。
USB接口可用于录音和播放音频,准备好录音功能的耳机后,通过arecord命令录制,aplay命令播放。
MIPI摄像头可用于拍摄,通过IMX摄像头连接后,运行样例程序即可拍照。
USB接口的摄像头支持获取图像,通过v4l2-ctl查看设备节点,然后使用内置样例代码拍照并查看结果。
通过HDMI接口,可以显示图像,连接显示器后,执行特定脚本进行图像显示。
MIPI接口也能显示图像,但目前仅限于显示一张,使用LCD屏幕配合特定脚本操作。
想要了解更多样例源码和接口详解,可访问升腾社区文档中心和香橙派AIpro学习资源一站式导航。提升你的AIpro开发经验,探索更多可能!怎样写软件源码?
在软著申请中,关键的软件信息填写不容忽视。针对作品开发和运行环境的描述,你需要详细列出以下几点:
首先,开发环境的描述应明确具体:
处理器:例如,Intel Core i5或AMD Ryzen 5,强调其性能和效率。
内存:确保足够的资源,如8GB或GB RAM,以支持软件流畅运行。
存储:如GB或GB SSD,存储空间不可或缺。
其他硬件:如用于开发的显示器、高效键盘和鼠标,它们可能影响开发效率。
例如,Java开发的网页应用,你可能会写:“在装备有Intel Core i5处理器,8GB RAM,GB SSD的硬件环境中,配备专业显示器、键盘和鼠标进行开发。”
然后,运行平台同样重要:
处理器:如Intel Core i3或AMD Ryzen 3,适应目标用户群体的设备。
内存:至少4GB或8GB RAM,保证基本的用户体验。
存储:GB或GB SSD,确保快速加载。
浏览器插件和操作系统:如Windows、macOS或Linux下的兼容性信息。
对于网页应用,描述可能为:“在Intel Core i3处理器,4GB RAM,GB SSD的硬件上,兼容Windows、macOS或Linux操作系统,运行于浏览器环境中。”
软件开发工具的选择同样重要:
IDE:如Eclipse或IntelliJ IDEA,突出其高效和专业性。
构建工具:如Maven或Gradle,确保代码质量和部署流程的标准化。
示例为:“利用Eclipse作为主要开发环境,Maven或Gradle作为构建工具进行项目构建和管理。”
至于运行支撑环境,需要考虑:
Web服务器:如Apache或Nginx,强调其稳定性和性能。
数据库:MySQL或Oracle,提供数据存储和管理的基础。
比如:“该网页应用在Apache或Nginx服务器上部署,利用MySQL或Oracle数据库进行数据交互和存储。”
最后,每个软著申请可能都有其特定的要求,以上内容仅供参考,确保根据实际项目需求进行详细且准确的填写,才能提升作品的认证通过率。