当前位置: 首页 > news >正文

OTG配置为USB盘之二

   在前面一节中,描述了otg配置U盘时涉及到的知识点,本篇用统一的脚本完成。

  目标

   将3588开发板子配置为一个U盘。

  配置文件和脚本

   配置文件

  说明:

  1)USB_FUNCS是将开发板配置为什么类型的设备,例如u盘,配置ums等等。

   2)UMS_FILE 即对应的具体存储设备,本文就着重讲解此处的应用。

      存储设备可以是

      a. 一个文件,里面在内存或者磁盘上创建一个img文件。

      b. 一个分区

#!/bin/sh# The env variables below can be overridden# option: adb acm hid mtp ntb rndis uac1 uac2 ums uvc
#export USB_FUNCS="adb"
export USB_FUNCS="ums"#export UMS_FILE=/userdata/ums_shared.img
#export UMS_FILE=/dev/mmcblk0p7
export UMS_FILE=/dev/sda5
#export UMS_SIZE=1024M
export UMS_SIZE=7G
export UMS_FSTYPE=ntfs
export UMS_MOUNT=0
export UMS_MOUNTPOINT=/mnt/ums
export UMS_RO=0

设置u盘脚本

脚本运行 usbdevice start等参数

#!/bin/sh # Uncomment below to see more logs
# set -x# Load default env variables from profiles
. /etc/profileLOG_FILE=/tmp/usbdevice.log
USB_FUNCS_FILE=/tmp/.usbdevicealias usb_enable='touch $USB_FUNCS_FILE'
alias usb_disable='rm -f $USB_FUNCS_FILE'
alias usb_is_enabled='[ -f $USB_FUNCS_FILE ]'
alias usb_set_started='echo $USB_FUNCS > $USB_FUNCS_FILE'
usb_get_started()
{usb_is_enabled || return 0cat $USB_FUNCS_FILE
}CONFIGFS_DIR=/sys/kernel/config
USB_GROUP=rockchip
USB_STRINGS_ATTR=strings/0x409
USB_GADGET_DIR=$CONFIGFS_DIR/usb_gadget/$USB_GROUP
USB_GADGET_STRINGS_DIR=$USB_GADGET_DIR/$USB_STRINGS_ATTR
USB_FUNCTIONS_DIR=$USB_GADGET_DIR/functions
USB_CONFIGS_DIR=$USB_GADGET_DIR/configs/b.1
USB_CONFIGS_STRINGS_DIR=$USB_CONFIGS_DIR/$USB_STRINGS_ATTR# Make sure that we own this session (pid equals sid)
if ! ps x -o cmd,pid,sid | grep -wq "$$$"; thensetsid $0 $@exit $?
fi# ---- helper functions
usb_msg()
{logger -t $(basename $0) "[$$]: $@"echo "[$(date +"%F %T")] $@"
}usb_pid()
{case $1 inums)		echo 0x0000;;mtp)		echo 0x0001;;uvc)		echo 0x0005;;adb)		echo 0x0006;;adb_mtp)	echo 0x0011;;adb_ums)	echo 0x0018;;adb_uvc)	echo 0x0015;;ntb_uvc)	echo 0x0017;;acm)		echo 0x1005;;*)		echo 0x0019;;esac
}usb_instances()
{for func in $@; doVAR=$(echo $func | tr 'a-z' 'A-Z')_INSTANCESeval echo "\${$VAR:-$func.gs0}"done
}usb_run_stage()
{for f in $1_pre_$2_hook $1_$2 $1_post_$2_hook; dotype $f >/dev/null 2>/dev/null || continueusb_msg "Run stage: $f"eval $f || breakdone
}usb_wait_files()
{for i in `seq 200`;dofuser -s $@ 2>/dev/null && breaksleep .01done
}usb_release_files()
{for i in `seq 200`;dofuser -s -k $@ 2>/dev/null || breaksleep .01done
}# usage: usb_mount <src> <mountpoint> <options>
usb_mount()
{mkdir -p $2mountpoint -q $2 || mount $@
}usb_umount()
{mountpoint -q $1 || return 0usb_release_files -m $1umount $1
}usb_symlink()
{mkdir -p $1[ -e $2 ] || ln -s $1 $2
}usb_try_symlink()
{usb_symlink $@ &>/dev/null || true
}usb_write()
{if echo "x$1" | grep -q "^x-"; thenOPTS=$1shiftfiFILE=$1shiftif [ -r $FILE ] && [ "$(cat $FILE)" = "$@" ]; thenreturn 0fiecho $OPTS "$@" > $FILE
}usb_try_write()
{usb_write $@ &>/dev/null || true
}usb_start_daemon()
{NAME=$(echo $1 | sed "s#^[^ ]*/\([^ ]*\).*#\1#")TAG_FILE=/tmp/.usb_$NAME# Enable spawntouch $TAG_FILE# Already started[ -z "$(usb_get_started)" ] || return 0# Start and spawn background daemon{exec 3<&-cd /while usb_is_enabled; do# Don't spawn after stopped[ ! -f $TAG_FILE ] ||start-stop-daemon -Sqx $@ || truesleep .5done}&
}usb_stop_daemon()
{NAME=$(echo $1 | sed "s#^[^ ]*/\([^ ]*\).*#\1#")TAG_FILE=/tmp/.usb_$NAME# Stop and disable spawnrm -f $TAG_FILEstart-stop-daemon -Kqox $@
}usb_load_config()
{USB_CONFIG_FILE=$(find /etc/ -name .usb_config | head -n 1)[ -n "$USB_CONFIG_FILE" -a -r $USB_CONFIG_FILE ] || return 0ums_parse(){grep "\<$1=" $USB_CONFIG_FILE | cut -d'=' -f2}UMS_FILE=$(ums_parse ums_block)UMS_SIZE=$(ums_parse ums_block_size || echo 0)MUMS_FSTYPE=$(ums_parse ums_block_type)UMS_MOUNT=$([ "$(ums_parse ums_block_auto_mount)" != on ]; echo $?)UMS_RO=$([ "$(ums_parse ums_block_ro)" != on ]; echo $?)USB_FUNCS=$(grep "usb_.*_en" $USB_CONFIG_FILE | cut -d'_' -f2 | xargs)
}# ---- adb
ADB_INSTANCES=${ADB_INSTANCES:-ffs.adb}adb_prepare()
{usb_mount adb /dev/usb-ffs/adb -o uid=2000,gid=2000 -t functionfsusb_start_daemon /usr/bin/adbdusb_wait_files -m /dev/usb-ffs/adb
}adb_stop()
{usb_stop_daemon /usr/bin/adbd
}# ---- ntb
NTB_INSTANCES=${NTB_INSTANCES:-ffs.ntb}ntb_prepare()
{usb_mount ntb /dev/usb-ffs/ntb -o uid=2000,gid=2000 -t functionfs
}# ---- uac1
uac1_prepare()
{for f in $(find . -name "*_feature_unit"); doecho 1 >$fdone
}# ---- uac2
uac2_prepare()
{uac1_prepare
}# ---- mtp
mtp_prepare()
{echo "MTP" > os_desc/interface.MTP/compatible_idecho 1 > $USB_GADGET_DIR/os_desc/use
}mtp_start()
{usb_start_daemon /usr/bin/mtp-serverusb_wait_files /dev/mtp_usb
}mtp_stop()
{usb_stop_daemon /usr/bin/mtp-serverusb_release_files /dev/mtp_usbecho 0 > $USB_GADGET_DIR/os_desc/use
}# ---- acm
ACM_INSTANCES=${ACM_INSTANCES:-acm.gs6}# ---- rndis
# Nothing special# ---- uvc
UVC_INSTANCES=${UVC_INSTANCES:-uvc.gs6}uvc_add_yuyv()
{WIDTH=$(echo $1 | cut -d'x' -f1)HEIGHT=$(echo $1 | cut -d'x' -f2)DIR=${HEIGHT}p[ ! -d $DIR ] || return 0mkdir -p $DIRecho $WIDTH > $DIR/wWidthecho $HEIGHT > $DIR/wHeightecho 333333 > $DIR/dwDefaultFrameIntervalecho $((WIDTH * HEIGHT * 20)) > $DIR/dwMinBitRateecho $((WIDTH * HEIGHT * 20)) > $DIR/dwMaxBitRateecho $((WIDTH * HEIGHT * 2)) > $DIR/dwMaxVideoFrameBufferSizeecho -e "333333\n666666\n1000000\n2000000" > $DIR/dwFrameInterval
}uvc_add_mjpeg()
{WIDTH=$(echo $1 | cut -d'x' -f1)HEIGHT=$(echo $1 | cut -d'x' -f2)DIR=${HEIGHT}p[ ! -d $DIR ] || return 0mkdir -p $DIRecho $WIDTH > $DIR/wWidthecho $HEIGHT > $DIR/wHeightecho 333333 > $DIR/dwDefaultFrameIntervalecho $((WIDTH * HEIGHT * 20)) > $DIR/dwMinBitRateecho $((WIDTH * HEIGHT * 20)) > $DIR/dwMaxBitRateecho $((WIDTH * HEIGHT * 2)) > $DIR/dwMaxVideoFrameBufferSizeecho -e "333333\n666666\n1000000\n2000000" > $DIR/dwFrameInterval
}uvc_add_h264()
{WIDTH=$(echo $1 | cut -d'x' -f1)HEIGHT=$(echo $1 | cut -d'x' -f2)DIR=${HEIGHT}p[ ! -d $DIR ] || return 0mkdir -p $DIRecho $WIDTH > $DIR/wWidthecho $HEIGHT > $DIR/wHeightecho 333333 > $DIR/dwDefaultFrameIntervalecho $((WIDTH * HEIGHT * 10)) > $DIR/dwMinBitRateecho $((WIDTH * HEIGHT * 10)) > $DIR/dwMaxBitRateecho -e "333333\n666666\n1000000\n2000000" > $DIR/dwFrameInterval
}uvc_support_resolutions()
{case ${1:-yuyv} inyuyv)	echo "640x480 1280x720";;mjpeg)	echo "640x480 1280x720 1920x1080 2560x1440 2592x1944";;h264)	echo "640x480 1280x720 1920x1080";;esac
}uvc_prepare()
{UVC_DIR=$(pwd)usb_symlink $UVC_DIR/control/header/h $UVC_DIR/control/class/fs/husb_symlink $UVC_DIR/control/header/h $UVC_DIR/control/class/ss/husb_symlink $UVC_DIR/streaming/header/h $UVC_DIR/streaming/class/fs/husb_symlink $UVC_DIR/streaming/header/h $UVC_DIR/streaming/class/hs/husb_symlink $UVC_DIR/streaming/header/h $UVC_DIR/streaming/class/ss/hUVC_YUYV_RES=$(uvc_support_resolutions yuyv)if [ -n "$UVC_YUYV_RES" ]; thenusb_try_symlink $UVC_DIR/streaming/uncompressed/u \$UVC_DIR/streaming/header/h/ucd $UVC_DIR/streaming/uncompressed/ufor res in $UVC_YUYV_RES; douvc_add_yuyv $resdonefiUVC_MJPEG_RES=$(uvc_support_resolutions mjpeg)if [ -n "$UVC_MJPEG_RES" ]; thenusb_try_symlink $UVC_DIR/streaming/mjpeg/m \$UVC_DIR/streaming/header/h/mcd $UVC_DIR/streaming/mjpeg/mfor res in $UVC_MJPEG_RES; douvc_add_mjpeg $resdonefiUVC_H264_RES=$(uvc_support_resolutions h264)if [ -n "$UVC_H264_RES" ]; thenusb_try_symlink $UVC_DIR/streaming/framebased/f \$UVC_DIR/streaming/header/h/fcd $UVC_DIR/streaming/framebased/ffor res in $UVC_H264_RES; douvc_add_h264 $resdoneusb_try_write -ne guidFormat "\\x48\\x32\\x36\\x34\\x00\\x00\\x10\\x00\\x80\\x00\\x00\\xaa\\x00\\x38\\x9b\\x71"fi
}# TODO: Start UVC daemon in uvc_start
# TODO: Stop UVC daemon in uvc_stop# ---- hid
HID_INSTANCES=${HID_INSTANCES:-hid.usb0}hid_prepare()
{echo 1 > protocolecho 1 > subclassecho 8 > report_lengthecho -ne "\\x05\\x01\\x09\\x06\\xa1\\x01\\x05\\x07\\x19\\xe0\\x29\\xe7\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x08\\x81\\x02\\x95\\x01\\x75\\x08\\x81\\x03\\x95\\x05\\x75\\x01\\x05\\x08\\x19\\x01\\x29\\x05\\x91\\x02\\x95\\x01\\x75\\x03\\x91\\x03\\x95\\x06\\x75\\x08\\x15\\x00\\x25\\x65\\x05\\x07\\x19\\x00\\x29\\x65\\x81\\x00\\xc0" \> report_desc
}# ---- ums
UMS_INSTANCES=${UMS_INSTANCES:-mass_storage.0}ums_prepare()
{if [ ! -f $UMS_FILE ]; thenusb_msg "Formating $UMS_FILE($UMS_SIZE) to $UMS_FSTYPE"#truncate -s $UMS_SIZE $UMS_FILE#mkfs.$UMS_FSTYPE -s 4096 -L "mbca19" $UMS_FILE || \#	usb_msg "Failed to format $UMS_FILE to $UMS_FSTYPE"fi
}ums_stop()
{echo > lun.0/fileusb_umount $UMS_MOUNTPOINT[ "$UMS_MOUNT" -eq 1 ] || return 0# Try auto fstype firstlyusb_mount $UMS_FILE $UMS_MOUNTPOINT -o async 2>/dev/null || \usb_mount $UMS_FILE $UMS_MOUNTPOINT -o async -t $UMS_FSTYPE
}ums_start()
{echo "current : $(pwd)"case "$USB_STATE" inCONFIGURED)if [ "$(cat lun.0/ro)" != "$UMS_RO" ]; thenecho > lun.0/fileecho $UMS_RO > lun.0/rofiif ! grep -wq $UMS_FILE lun.0/file; thenusb_umount $UMS_MOUNTPOINTecho $UMS_FILE > lun.0/filefi;;DISCONNECTED)ums_stop;;esac
}# ---- global
usb_init()
{usb_msg "Initializing"echo 0x2207 > idVendorecho 0x0310 > bcdDeviceecho 0x0200 > bcdUSBmkdir -p $USB_GADGET_STRINGS_DIRSERIAL=$(grep Serial /proc/cpuinfo | cut -d':' -f2)echo ${SERIAL:-0123456789ABCDEF} > $USB_GADGET_STRINGS_DIR/serialnumberecho $USB_GROUP  > $USB_GADGET_STRINGS_DIR/manufacturerecho "rk3xxhjx"  > $USB_GADGET_STRINGS_DIR/productmkdir -p $USB_CONFIGS_DIRecho 500 > $USB_CONFIGS_DIR/MaxPowerecho 0x1 > os_desc/b_vendor_codeecho MSFT100 > os_desc/qw_signln -s $USB_CONFIGS_DIR os_desc/mkdir -p $USB_CONFIGS_STRINGS_DIR
}usb_funcs_grep()
{echo $USB_FUNCS | xargs -n 1 | sort | uniq | grep $@ || true
}usb_funcs_sort()
{{for func in $@; dousb_funcs_grep -E $funcdoneusb_funcs_grep -vE $(echo $@ | tr ' ' '|')} | uniq | xargs
}usb_prepare()
{usb_load_config# Allow function/variable overriding[ -d /etc/usbdevice.d ] && . /etc/usbdevice.d/*UMS_FILE=${UMS_FILE:-/userdata/ums_shared.img}UMS_SIZE=${UMS_SIZE:-256M}UMS_FSTYPE=${UMS_FSTYPE:-vfat}UMS_MOUNT=${UMS_MOUNT:-0}UMS_MOUNTPOINT=${UMS_MOUNTPOINT:-/mnt/ums}UMS_RO=${UMS_RO:-0}# Put RNDIS & UAC & UVC at first (required by kernel)USB_FUNCS=$(usb_funcs_sort rndis uac uvc)if [ ! -d $USB_GADGET_DIR ]; thenmountpoint -q $CONFIGFS_DIR || \mount -t configfs none $CONFIGFS_DIRmkdir -p $USB_GADGET_DIRcd $USB_GADGET_DIR# Global initializeusb_run_stage usb initfiUSB_STATE=$(cat /sys/class/android_usb/android0/state)USB_UDC=$(ls /sys/class/udc/ | head -n 1)# Parse started USB functionsOLD_FUNCS=$(usb_get_started)# Stop old USB functions when USB functions changedif [ -n "$OLD_FUNCS" ] && [ "$OLD_FUNCS" != "$USB_FUNCS" ]; thenusb_msg "Functions changed $OLD_FUNCS -> $USB_FUNCS"usb_stopfi
}usb_start()
{usb_msg "Starting functions: $USB_FUNCS"echo $USB_FUNCS | tr ' ' '_' > $USB_CONFIGS_STRINGS_DIR/configurationfor func in $USB_FUNCS; dofor instance in $(usb_instances $func); dousb_msg "Preparing instance: $instance"if ! mkdir -p $USB_FUNCTIONS_DIR/$instance 2>/dev/null; thenusb_msg "Failed to create instance: $instance"continuefiecho "except dir: $USB_FUNCTIONS_DIR/$instance"cd $USB_FUNCTIONS_DIR/$instance &>/dev/null || continuecd $USB_FUNCTIONS_DIR/$instanceecho "start dir : $(pwd)"usb_run_stage $func prepare# Make symlink after prepared (required by UVC)usb_symlink $USB_FUNCTIONS_DIR/$instance \$USB_CONFIGS_DIR/f-$instancedonedoneusb_write $USB_GADGET_DIR/UDC $USB_UDCfor func in $USB_FUNCS; dofor instance in $(usb_instances $func); docd $USB_FUNCTIONS_DIR/$instance &>/dev/null || continueusb_msg "Starting instance: $instance"usb_run_stage $func startdonedone# Store started functionsusb_set_started
}usb_stop()
{if [ -n "$OLD_FUNCS" ]; thenusb_msg "Stopping functions: $OLD_FUNCS"fiusb_write $USB_GADGET_DIR/UDC ""for func in $USB_FUNCS; dofor instance in $(usb_instances $func); docd $USB_FUNCTIONS_DIR/$instance &>/dev/null || continueusb_msg "Stopping instance: $instance"usb_run_stage $func stopdonedonerm -f $USB_CONFIGS_DIR/f-*# Clear functions to avoid stopping them againunset OLD_FUNCS
}usb_restart()
{usb_run_stage usb stopusb_run_stage usb start
}ACTION=${1:-update}
if [ "$ACTION" = update ]; thenusb_is_enabled || exit 0
fi# Lock it
exec 3<$0
flock -x 3echo "Starting $0 ${ACTION}, log saved to $LOG_FILE"# Redirect outputs to log file
exec >>$LOG_FILE 2>&1usb_msg "Handling ${ACTION} request"usb_run_stage usb preparecase "$ACTION" instart|update)usb_enableusb_run_stage usb start;;stop)usb_disableusb_run_stage usb stop;;restart)usb_enableusb_run_stage usb restart;;*)echo "Usage: usbdevice [start|stop|restart|update]" >&2;;
esacusb_msg "Done $ACTION request"
echo# Unlock it
flock -u 3

   步骤

     以内存为存储介质

      创建文件

      

mount -t tmpfs -o size=4G tmpfs /mnt/mem
并在/mnt/mem 目录下创建 test.img 文件作为 U 盘存储
dd if=/dev/zero of=test.img bs=1M count=2048

 这里注意一点:img文件并不能被格式化,则上述U盘脚本中的 如下格式化的部分,需要注释掉,否则有问题。

ums_prepare()
{if [ ! -f $UMS_FILE ]; thenusb_msg "Formating $UMS_FILE($UMS_SIZE) to $UMS_FSTYPE"#truncate -s $UMS_SIZE $UMS_FILE#mkfs.$UMS_FSTYPE -s 4096 -L "mbca19" $UMS_FILE || \#	usb_msg "Failed to format $UMS_FILE to $UMS_FSTYPE"fi
}

 创建后,在windows下访问时先要将其格式为NTFS等。

    以U盘SATA盘等为存储介质

      首先格式化为NTFS,然后运行上述脚本进行usb 设备创建。

     将开发板插入到windows下可以直接作为U盘使用,不需要格式化等额外操作。

     可以实现linux 下面写,而windows读的,满足类似移动硬盘的应用场景

   性能测试

    在windows下用 CD 工具压测,环境采用USB3.0的接口(特别要注意线缆的选择,用2.0的线缆是)。

     

相关文章:

OTG配置为USB盘之二

在前面一节中&#xff0c;描述了otg配置U盘时涉及到的知识点&#xff0c;本篇用统一的脚本完成。 目标 将3588开发板子配置为一个U盘。 配置文件和脚本 配置文件 说明&#xff1a; 1&#xff09;USB_FUNCS是将开发板配置为什么类型的设备&#xff0c;例如u盘&#xff0c;配置um…...

如何使用 PHP 函数与其他 Web 服务交互?

在 PHP 中&#xff0c;我们可以使用 cURL 或者 file_get_contents 函数与其他 Web 服务进行交互。 使用 cURL 函数 cURL 是一个库&#xff0c;它允许你使用各种类型的协议来发送数据&#xff0c;并从服务器获取数据。 $curl curl_init(‘http://example.com/api’); curl_s…...

.NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.

实现目标。点击图片上传头像 效果图 前端部分图片上传关键代码 <div class"avatar-wrap"><el-imagestyle"width: 154px; height: 154px":src"form.headPic":fit"fit"/></div><div class"upload-box"…...

机器学习如何用于音频分析?

机器学习如何用于音频分析&#xff1f; 一、说明 近十年来&#xff0c;机器学习越来越受欢迎。事实上&#xff0c;它被用于医疗保健、农业和制造业等众多行业。随着技术和计算能力的进步&#xff0c;机器学习有很多潜在的应用正在被创造出来。由于数据以多种格式大量可用&…...

适合程序员在周末阅读的历史书籍:理解人性和世界

一、《人类简史&#xff1a;从动物到上帝》 这本书提供了对人类历史和社会发展的深刻洞察&#xff0c;帮助读者理解人类过去、现在和可能的未来。 《人类简史&#xff1a;从动物到上帝》是以色列历史学家尤瓦尔赫拉利&#xff08;Yuval Noah Harari&#xff09;创作的一部极具影…...

探索Mem0:下一代人工智能与机器学习内存管理基础设施(二)Mem0+Ollama 部署运行

探索Mem0:下一代人工智能与机器学习内存管理基础设施(二) Mem 0(发音为“mem-zero”)通过智能记忆层增强AI助手和代理,实现个性化的AI交互。Mem 0会记住用户偏好,适应个人需求,并随着时间的推移不断改进,使其成为客户支持聊天机器人,AI助手和自治系统的理想选择。 …...

C++入门10——stack与queue的使用

目录 1.什么是stack&#xff1f; stack的使用 2.什么是queue&#xff1f; queue的使用 3.priority_queue 3.1 什么是priority_queue? 3.2 priority_queue的使用 1.什么是stack&#xff1f; 在官网中&#xff0c;对stack有这样的介绍&#xff1a; Stacks are a type o…...

詳細解析軟路由與代理爬蟲池-okeyproxy

什麼是軟路由&#xff1f; 軟路由&#xff0c;顧名思義&#xff0c;就是通過軟體實現的路由器功能。與傳統的硬體路由器不同&#xff0c;軟路由通常是基於PC或單板電腦&#xff08;如樹莓派&#xff09;運行的路由器軟體。 靈活性高&#xff1a;可以根據需求安裝各種插件和服…...

视频监控管理平台LntonAIServer视频智能分析噪声检测应用场景

在视频监控系统中&#xff0c;噪声问题常常影响到视频画面的清晰度和可用性。噪声可能由多种因素引起&#xff0c;包括但不限于低光环境、摄像机传感器灵敏度过高、编码压缩失真等。LntonAIServer通过引入噪声检测功能&#xff0c;旨在帮助用户及时发现并解决视频流中的噪声问题…...

技术分享-商城篇-用户中心-注销修改(二十三)

前言 上一篇文章技术分享-商城篇-用户中心&#xff08;二十二&#xff09;在构建高效、安全的商城用户中心时&#xff0c;确保用户账户的安全性与便捷性至关重要。本文将重点阐述三大核心功能——修改密码、协议授权及注销账户的业务逻辑、设计思路及注意事项&#xff0c;旨在…...

Linux-实用指令

目录 前言 指定运行级别 基本介绍 切换运行级别 指令类 帮助指令 man 获得帮助信息 help指令 文件目录类 pwd指令 ls指令 cd指令 mkdir命令 rmdir指令删除空目录 touch指令 cp指令 rm指令 mv指令 cat指令 more指令 less指令 echo指令 head指令 tail指令…...

【MySQL00】【 杂七杂八】

文章目录 一、前言二、MySQL 文件1. 参数文件2. 日志文件3. 套接字文件4. pid 文件5. 表结构定义文件6. InnoDB 存储引擎文件 二、BTree 索引排序三、InnoDB 关键特性1. 插入缓冲1.1 Insert Buffer 和 Change Buffer1.1 缓冲合并 2. 两次写2. 自适应哈希索引3. 异步IO4. 刷新邻…...

计算机网络 第2章 物理层

文章目录 通信基础基本概念信道的极限容量编码与调制常用的编码方法常用的调制方法 传输介质双绞线同轴电缆光纤以太网对有限传输介质的命名规则无线传输介质物理层接口的特性 物理层设备中继器集线器一些特性 物理层任务&#xff1a;实现相邻节点之间比特&#xff08;0或1&…...

解决:Module build failed (from ./node_modules/sass-loader/dist/cjs.js)问题

一、问题 Module build failed (from ./node_modules/sass-loader/dist/cjs.js): Error: Cannot find module sass 二、解决方法 1.清除缓存 npm cache clean --force2.重构项目 npm install 3.更新&#xff08;获取最新的&#xff09;node-sass和sass-loader依赖包 npm …...

【 html+css 绚丽Loading 】 000041 三才移形三角

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…...

ASP.NET Core 入门教学十六 防止常见的Web攻击

在ASP.NET Core中&#xff0c;防止常见的Web攻击是非常重要的&#xff0c;以确保应用程序的安全性。以下是一些常见的Web攻击类型及其防范措施&#xff1a; 1. 跨站脚本攻击&#xff08;XSS&#xff09; 跨站脚本攻击&#xff08;XSS&#xff09;是一种通过在网页中注入恶意脚…...

单刀直入@ComponentScan之 资源加载

欢迎大家入坑&#xff0c;所谓师傅领进坑爬出去靠个人&#xff0c;首先我要说的是这个是上一篇《单刀直入ComponentScan》的姊妹篇哈&#xff0c;接着把没聊透的事说明白&#xff0c;咱不是虎头蛇尾的人。 资源加载是啥意思 scan &#xff0c;都认识吧&#xff0c;小学词汇连…...

SAPUI5基础知识25 - 聚合绑定(Aggregation Binding)

1. 背景 Aggregation Binding 是 SAPUI5 中的一种数据绑定方式&#xff0c;用于将数据模型中的集合&#xff08;如数组&#xff09;绑定到 UI 控件的聚合&#xff08;如列表项、表格行等&#xff09;。 常见的场景包括将一个数组绑定到 sap.m.List 的 items 聚合&#xff0c;…...

【Python 千题 —— 算法篇】寻找两个正序数组的中位数

Python 千题持续更新中 …… 脑图地址 &#x1f449;&#xff1a;⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在处理大规模数据时&#xff0c;我们经常需要对数据进行排序和分析。一个常见问题是如何高效地从两个正序数组中找出它们的中位数。…...

Autoware 定位之初始姿态输入(九)

0. 简介 这一讲按照《Autoware 技术代码解读&#xff08;三&#xff09;》梳理的顺序&#xff0c;我们来说一说Autoware中的初始化操作&#xff0c;这个软件包当中完成了ekf_localizer发送初始姿态的包。它接收来自GNSS/用户的粗略估计的初始姿态。将姿态传递给ndt_scan_match…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...