猫盘onespace x3p系统使用

2023-12-27 13:58

本文主要是介绍猫盘onespace x3p系统使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

猫盘用了大概快一年了,主要的使用的功能以及最长用的功能就是samba服务,当做家庭的影音存储中心,其他的nas相关下载,同步等等功能用的极少。

故最终的需求就是,将猫盘做成一个纯净版的samba服务器,其他不常用的功能全部关闭掉。同时要能够使硬盘进行休眠,一个是减少不必要的噪音,机械硬盘的声音还是挺大的;二个是减少硬盘的消耗,没有数据读取的时候硬盘进入休眠状态。

使用猫盘原版系统发现是系统是无法休眠的,强制将硬盘进入休眠状态后,一段时间硬盘又会自己启动,推测应该是在跟猫盘的服务器同步信息,造成硬盘无法休眠。各种百度之后,都没找到好的解决方案。剩下就一条路,刷机。刷成x3p系统,刷机过程在此不表。

最终效果展示

在这里插入图片描述
在这里插入图片描述
默认只开启samba服务。
为了偶尔非局域网操作,故添加了易有云服务组件,默认也是设置为关闭状态。

设置硬盘休眠

1、使用ssh登录到猫盘,采用root权限登录,默认为root,密码:Etech12。登录之后如果发现修改某些文件没有权限。可在要操作的目录下执行如下命令。该问题也是百度了好久才找到的解决办法。因为后面要调整哪些应用要默认开机启动,故需要修改系统的文件。

mount -o remount,rw /

2、通过浏览器登录到猫盘,在系统管理里将设置硬盘休眠时间。为了测试硬盘休眠效果,可以先将其设置为10分钟。

在这里插入图片描述
3、硬盘休眠相关操作命令
hdparm软件可以实现硬盘状态设置,状态查询
查看是否安装了hdparm,x3p系统是默认安装了

[root@onespace ~]# hdparm -V
hdparm v9.50

查看硬盘当前状态,如果是standby,则硬盘处于休眠状态

[root@onespace ~]# hdparm -C /dev/sda1/dev/sda1:drive state is:  active/idle

让硬盘立刻进入休眠状态命令,此时如果查询硬盘状态,返回的应该是standby。休眠的时候硬盘只是停转,并不会断电,不会造成硬盘磁头频繁抬起放下,损伤硬盘。

[root@onespace ~]# hdparm -Y /dev/sda1/dev/sda1:issuing sleep command

设置硬盘无操作进入休眠的时间

[root@onespace ~]# hdparm -S 60 /dev/sda1/dev/sda1:setting standby to 60 (5 minutes)

这个数值设置为0则关闭这个功能,设置为1至240时,时间将为5秒的倍数,即5秒至20分钟,设置为241至251时,时间将为30分钟的1-11倍,即30分钟到5.5小时,设置为252象征着21分钟,253为?(不懂),255即为21分15秒。

如果不想用x3p自带的设置工具,只需要写一个bash启动脚本,放到/etc/init.d/文件家中,文件名要以大写S开头,然后chmod +x 可执行权限,每次开机运行一次即可。

4、测试休眠
注意事项:关闭掉所有上传下载的任务,关闭掉ssh登录,断开电脑映射的samba文件夹。一定要关闭所有与猫盘有通信的任务。

10分钟后,可以听到硬盘噪音没了,手接触硬盘也没有了微小的震动感,则硬盘休眠成功。

添加易有云服务

1、app启动流程说明

经过分析系统文件夹,发现,系统所有的启动脚本都是放在/etc/init.d/目录下面
在这里插入图片描述系统首先会执行rcS文件,rcS文件会索引当前目录下以大写S开头的文件,然后一个一个执行。
以S88Shell为例

#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbincase "$1" instart)pidof shellinaboxdif [ $? -eq 0 ] ; thenecho "Start Shell Abort, already running"exitfiif [ -f /sata/.storage/appblock/shellinabox ] ; thenecho "Start ShellinAbox Abort, User Disabled"exitfishellinaboxd -b -t -s /:SSH:127.0.0.1echo "done.";;stop)killall shellinaboxdi=0while [ 1 ] ; dopidof shellinaboxdif [ $? -ne 0 -o $i -gt 10 ] ; thenbreakfiecho "sleep 1, wait"sleep 1((i++))doneecho "done.";;restart)$0 stop$0 start;;*)echo "Usage: /etc/init.d/S88shell {start|stop|restart}";;
esac

脚本里面定义了3个函数,sart,stop,restart。rcS脚本里面就是通过执行各个脚本的start函数来启动程序。

在start文件中会判断/sata/.storage/appblock/shellinabox 是否存在,如果存在,则脚本退出,不启动程序,如果不存在就启动。

说明启动脚本会根据shellinabox文件来启动shell程序。

通过分析文件夹名称也可以知道个大概,所有不需要开启自启的程序都会在appblock文件夹下面生成一个对应文件。那么问题来了,是什么程序来负责生成这些文件呢。

2、设置开机禁止运行服务

通过继续分析系统文件,发现了S23init脚本,init说明是在进行一些系统初始化操作。打开该文件

#!/bin/shif [ X$1 = "Xstop" ]; thenkillall hd_fan.shexit
fi#mount -o remount,rw //opt/bin/hd_fan.sh &mountpoint -q /sata
if [ $? -ne 0 ] ; thentouch /tmp/nosata.flagexit 0
fiecho "------- remunt to rw for S23 --------"
mount -o remount,rw /mkdir -p /sata/.storage
mkdir -p /sata/.storage/etc
if [ ! -d /sata/.storage/appblock ] ; thenmkdir -p /sata/.storage/appblocktouch /sata/.storage/appblock/aria2touch /sata/.storage/appblock/thundertouch /sata/.storage/appblock/transmissiontouch /sata/.storage/appblock/nfstouch /sata/.storage/appblock/rsynctouch /sata/.storage/appblock/minidlnatouch /sata/.storage/appblock/proftptouch /sata/.storage/appblock/phptouch /sata/.storage/appblock/shellinaboxtouch /sata/.storage/appblock/cupstouch /sata/.storage/appblock/linkeasetouch /sata/.storage/appblock/afpd
fimkdir -p /sata/home
chmod 755 /sata/homemkdir -p /sata/public
chmod 777 /sata/publicmkdir -p /sata/public/.recycle
chmod 777 /sata/public/.recycle
chown admin /sata/public/.recyclemkdir -p /sata/public/WWW
chmod 777 /sata/public/WWW
chown admin /sata/public/WWWmkdir -p /sata/.storage/mysql
chmod 777 /sata/.storage/mysqlmkdir -p /sata/.storage/tmp
chmod 777 /sata/.storage/tmp
rm -rf /sata/.storage/tmp/*mkdir -p /sata/public/USBDISK
chmod 755 /sata/public/USBDISK
chown admin /sata/public/USBDISK
rm -rf /sata/public/USBDISK/*if [ ! -e /sata/.storage/etc/passwd ] ; thencp -f /etc/passwd               /sata/.storage/etc/cp -f /etc/group                /sata/.storage/etc/cp -f /etc/shadow               /sata/.storage/etc/cp -f /etc/samba/smbpasswd      /sata/.storage/etc/cp -f /opt/rsync/rsyncd.secrets /sata/.storage/etc/
ficheck_file()
{file=$1grep -q admin ${file}if [ $? -ne 0 ]; then grep -q default ${file}if [ $? -ne 0 ]; thenecho 1  # not passelseecho 0  # passfielseecho 0  # passfi
}if [ -e /sata/one2017.flag ] ; thenresult=`check_file '/sata/.storage/etc/passwd'`diff -q /etc/passwd /sata/.storage/etc/passwdif [[ $? -ne 0 && $result -ne 1 ]] ; thencp -f /sata/.storage/etc/passwd /etc/passwdchmod 644 /etc/passwdfiresult=`check_file '/sata/.storage/etc/group'`diff -q /etc/group /sata/.storage/etc/groupif [[ $? -ne 0 && $result -ne 1 ]] ; thencp -f /sata/.storage/etc/group /etc/groupchmod 644 /etc/groupfiresult=`check_file '/sata/.storage/etc/shadow'`diff -q /sata/.storage/etc/shadow /etc/shadowif [[ $? -ne 0 && $result -ne 1 ]] ; thencp -f /sata/.storage/etc/shadow /etc/shadowchmod 600 /etc/shadowfi
else

确实是会创建appblock文件夹及下面的文件。所以不需要不需要启动只需要在里面添加要创建的文件。

if [ ! -d /sata/.storage/appblock ] ; thenmkdir -p /sata/.storage/appblocktouch /sata/.storage/appblock/aria2touch /sata/.storage/appblock/thundertouch /sata/.storage/appblock/transmissiontouch /sata/.storage/appblock/nfstouch /sata/.storage/appblock/rsynctouch /sata/.storage/appblock/minidlnatouch /sata/.storage/appblock/proftptouch /sata/.storage/appblock/phptouch /sata/.storage/appblock/shellinaboxtouch /sata/.storage/appblock/cupstouch /sata/.storage/appblock/linkeasetouch /sata/.storage/appblock/afpd
fi

笔者已经将其他不需要启动的文件都添加进来了,修改重启系统后,发现没有生效。原因是,脚本会先判断appblock文件夹是否存在,如果文件夹不存在,则创建;如果存在就不会往文件夹里面写文件。

故添加不需要启动的服务后,要将硬盘中的appblock文件夹删除掉。

删除后,重启系统,正常了,在应用管理里面可以看到只有samba服务在运行。
在这里插入图片描述

3、添加易有云服务

3.1下载安装
下载易友云https://www.ddnsto.com/linkease/download/#/disk。下载对应的版本,由于没有对应的onespace版本,故下载linux通用版,linkease.arm文件。

为了方便查找,笔者将其放置到home目录下
在这里插入图片描述
记得chomod +x 添加可执行权限。./linkease.arm

[root@onespace home]# ./linkease.arm 
15:37:34 WARNING: device binding
15:37:34 WARNING: save preconfig failed, err= open /home/preconfig.data: read-only file system
15:37:34 WARNING: branch= other log= /tmp/logs178097771/LinkEase.log serial= ST-other-6DBC0973 rootDir= /sata/share
15:37:34 WARNING: Device 6DBC0973 Port 8897 Version 0.3.60 BuildVersion 660eb113f93f3bacf0a96fe9a88b7c5983a7a888 BuildDate .20210520.022302

访问ip:8897进行访问易有云,具体绑定操作见易有云官网。

3.2创建启动脚本

在/etc/init.d/文件夹中,创建S96linkease文件,名称要以大写S开头。
参照shell脚本写入如下内容,通过判断appblock/linkease文件来启动服务。脚本要加可执行权限。

#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbincase "$1" instart)pidof linkease.armif [ $? -eq 0 ] ; thenecho "Start linkease Abort, already running"exitfiif [ -f /sata/.storage/appblock/linkease ] ; thenecho "Start linkease Abort, User Disabled"exitfi/home/linkease.arm & echo "done.";;stop)killall linkease.armecho "done.";;restart)$0 stop$0 start;;*)echo "Usage: /etc/init.d/S93linkease {start|stop|restart}";;
esac

3.3添加易有云到应用管理。
再次分析系统文件,发现在/opt/www有一个www的文件夹。在www文件夹下面有一个app文件夹。发现其中有如下文件,看到了熟悉samba shell 文件夹
在这里插入图片描述

打开shell文件夹发现里面有如下四个文件
在这里插入图片描述
将该目录下载到本地,发现app.png 就是应用管理里面的shell图标

在这里插入图片描述
依次开打开下其他文件

conf.js

{"pack": "shell","ver": "2.19","verno": 21900,"name": "SHELL","logo": "app.png","url": "/shell/","canstat": true,"canoff": true,"candel": false
}

可以看到里面配置的版本号就是应用管理里面的shell的版本号。

off.sh

#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/bin/etc/init.d/S88shell stopif [ $# -eq 0 ] ; thentouch /sata/.storage/appblock/shellinabox
fi

on.sh

#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/binrm -f /sata/.storage/appblock/shellinabox
/etc/init.d/S88shell start

stat.sh

#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/binpidof shellinaboxd > /dev/nullif [ $? -ne 0 ] ; thenecho -n "off"
elseecho -n "on"
fi

通过分析这个内容,发下这三个脚本就是,启动shell 关闭shell 查询shell运行状态的脚本。再结合app文件夹下的文件目录,与应用管理里面的任务是对应的。

由此可以说明,只需要按照app里面文件夹的格式,新建一个文件夹,该内容将会呈现在应用管理里面。笔者已经通过测试,发现确实如此。

接下来就好说了,只要将shell文件夹下面的文件的内容替换为linkease的,就可以实现在应用管理里面显示。
在app目录下面新建一个linkease文件,放入linkease logopng文件,再在对应的文件写入如下内容。


#conf.js
{"pack": "linkease","ver": "0.3.6","verno": 36000,"name": "linkease","logo": "app.png","url": "","canstat": true,"canoff": true,"candel": false
}#on.sh
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/binrm -rf /sata/.storage/appblock/linkease
/etc/init.d/S96linkease start#off.sh
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/bin/etc/init.d/S96linkease stopif [ $# -eq 0 ] ; thentouch /sata/.storage/appblock/linkeasefi#stat.sh
#!/bin/shexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/binpidof linkease.arm > /dev/nullif [ $? -ne 0 ] ; thenecho -n "off"
elseecho -n "on"
fi

完成后,所有文件要加权限,chmod 755 。完成后,重启系统,即可在应用管理里面发现了linkease服务

在这里插入图片描述
至此,添加linkease服务完成,后续要添加其他的功能也可依据此方法操作。

备注:
1、推荐用FinalShell程序进行ssh操作,非常方便进行文件上传下载
在这里插入图片描述


2021-7-29硬盘休眠设置更新
经过测试发现如下命令是不起作用的,硬盘到了设定的时间后完全没反应,不会进入standby状态。经过多次测试均是如此

hdparm -S 60 /dev/sda1

硬盘休眠之路只能另求他法。于是开始寻找系统自带的休眠脚本,经过一番努力,发现休眠脚本位于

/opt/standby/

目录下,里面有start stop spindown等三个脚本
在这里插入图片描述
其中最主要的是spindown脚本,发现该脚本存在问题。那就是。
当设置的硬盘休眠时间到了,脚本会不管当前硬盘是否在读写,都会强制将硬盘设置为休眠状态。原因是,脚本用于判断判断硬盘状态的命令是错的。

其采用了 如下命令,该命令返回的只有两种状态
1、standby
2、active/idle

[root@onespace standby]# hdparm -C /dev/sda1/dev/sda1:drive state is:  standby无法判断硬盘当前是否在读写。原版的spindown脚本如下```bash
#Logging enable set to true  (/var/log/diskstate.log)
echo 1 > /proc/sys/vm/block_dump
# Where is your Ramdrive? 
# Check it out with  df -h or mount command.
# Possible Values Examples: /dev/shm , /run/shm 
mkdir -p /tmp/shm
ramdrive=/tmp/shm# Cyle time between checks, normally between 60 up to 300 Seconds. Protect the CPU/BUS Load.
time_cyle=60
time_spindown=$1# The Spindwon Time in Seconds for the harddisk drives, less then the time_cyle will only act on time_cyle.
# 300=5min, 600=10min, 900=15min, 1200=20min etc ..
time_disk_a=$time_spindown
time_disk_b=$time_spindown
time_disk_c=$time_spindown
time_disk_d=$time_spindown
time_disk_e=$time_spindown
time_disk_f=$time_spindown
time_disk_g=$time_spindown
time_disk_h=$time_spindown
time_disk_i=$time_spindown
time_disk_j=$time_spindown
time_disk_k=$time_spindown# Wich harddisk drives are handled to spindown
# No changes required, but if you need/like you can change.
#diskvolumes_spindown="a b c d e f g h i j k"
diskvolumes_spindown="a b c d e f g h i j k"# Wich harddisk drives are handled to send the apm = 255 command. (Disble AutoPowerManager in Firmware of the given Drives) 
# No changes required, but if you need/like you can change.
#diskvolumes_apm_off="a b c d e f g h i j k"
diskvolumes_apm_off="a b c d e f g h i j k"# Drives exist?
for disk in $diskvolumes_spindown; do hdparm -B /dev/sd$disk >/dev/null 2>&1; test $? = 0 && drives_spindown=$(printf "$drives_spindown"; printf $disk" "); done#apm off
for disk in $diskvolumes_apm_off; do hdparm -B /dev/sd$disk >/dev/null 2>&1; test $? = 0 && hdparm -B 255 /dev/sd$disk; done # Set ones on start time variable time_noise_$(disk), like noise from harddrive
for disk in $diskvolumes_spindown; do eval time_noise_${disk}=$(date +"%s"); donefor disk in $diskvolumes_spindown; do eval spindown_flag_${disk}=false; done# Build onece the tempfiles 
if [ ! -f $ramdrive/diskstate1 ]; then touch $ramdrive/diskstate1;fi 
if [ ! -f $ramdrive/diskstate2 ]; then touch $ramdrive/diskstate2;fi# Here we go... 
while [ true ] ; do# cycle it to test for activity mv $ramdrive/diskstate1 $ramdrive/diskstate2 cat /proc/diskstats > $ramdrive/diskstate1# Loop through all array disks and spin down idle disks. for disk in $drives_spindown; dodiskstat1=`grep sd$disk $ramdrive/diskstate1`diskstat2=`grep sd$disk $ramdrive/diskstate2`#if [ "$(diff $ramdrive/diskstate1 $ramdrive/diskstate2 | grep sd$disk )" = "" ]; thenif [ X"$diskstat1" = X"$diskstat2" ]; thentime_silent=$(date +"%s")time_noise=$(eval echo \${time_noise_${disk}})time_disk=$(eval echo \${time_disk_${disk}})time_idle=$(($time_silent - $time_noise))if [ $time_idle -ge $time_disk ]; then STATUS0=`hdparm -C /dev/sd$disk | sed -n '3p' | awk '{print $4}'`if [ X"$STATUS0" != "Xstandby" ];thenspindown_flag=$(eval echo \${spindown_flag_${disk}})if [ $spindown_flag = true ];thenecho `date` "/dev/sd$disk was activated" >> /tmp/nginx/error.log/opt/bin/udp_send 127.0.0.1 81 '{"level":"info", "type":"system", "user":"system", "action":"wakeup", "content":{} }'eval spindown_flag_${disk}=falseeval time_noise_${disk}=$(date +"%s")elseecho `date` "set /dev/sd$disk standby" >> /tmp/nginx/error.log
#                        /opt/bin/udp_send 127.0.0.1 81 '{"level":"info", "type":"system", "user":"system", "action":"sleep", "content":{} }'
#                        sleep 2synchdparm -Y /dev/sd$disk >/dev/null 2>&1;eval spindown_flag_${disk}=true	fififielseeval time_noise_${disk}=$(date +"%s")spindown_flag=$(eval echo \${spindown_flag_${disk}})if [ $spindown_flag = true ];thenecho `date` "/dev/sd$disk was activated 1" >> /tmp/nginx/error.log/opt/bin/udp_send 127.0.0.1 81 '{"level":"info", "type":"system", "user":"system", "action":"wakeup", "content":{} }'eval spindown_flag_${disk}=falsefifidone # Cycle Waitsleep $time_cyle
done

而且该脚本写的太复杂了,而且逻辑不清楚,于是修改如下:

#!/bin/shrm -rf /tmp/spindown.log
oldstate=''
n=`expr $1 '*' 6`
n1=$n
echo "n is " $n
while :; do
#!/bin/sh #!/bin/sh rm -rf /tmp/spindown.log
oldstate=''
n=`expr $1 '*' 6`
n1=$n
echo "n is " $n
while :; donewstate=$(grep "sda1" /proc/diskstats) echo date $newstate >> /tmp/spindown.logif [ "$newstate" = "$oldstate" ]; thenn1=$(($n1 - 1))
#       [ "$n" != 0 ] || hdparm -y /dev/"$1"if [ "$n1" == 0 ]; thenhdparm -Y /dev/sda1echo "set hd standby ! sleep param is " $1 "minutes; n:" $n1 >> /tmp/spindown.logfielsen1="$n"oldstate=$newstatefistate=`hdparm -C /dev/sda1 | sed -n '3p' | awk '{print $4}'`if [ "$state" != "standby" ]; thenecho `date` "hd is actived ! sleep param is " $1 "minutes; n:" $n1 >> /tmp/spindown.logelsen1="$n"echo `date` "hd is sleep ! sleep param is " $1 "minutes; n:" $n1 >> /tmp/spindown.logfilogsize=`ls -l /tmp/spindown.log | awk '{print $5}'`if [ $logsize -ge 100000 ]; thenrm -rf /tmp/spindown.logfisleep 10
done 

运行逻辑说明:
1、通过判断硬盘的读取状态来确定硬盘是否处于空闲状态
2、只有硬盘持续空闲时间到了设定睡眠时间,才会将硬盘置为休眠状态、

这篇关于猫盘onespace x3p系统使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/543354

相关文章

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景