Shell之无法进入某一目录解决问题:shell脚本中通过读取文件中的路径,进入到某一目录,但是提示:path:Nosuchfileordirectory.whilereadlinedocdxxx/path/${line}done
被怼了:acks=all消息也会丢失?
java
消息队列是面试中一定会被问到的技术模块,虽然它在面试题占比不及并发编程和数据库,但也属于面试中的关键性问题。所以今天我们就来看一道,MQ中高频,但可能会打破你以往认知的一道面试题。所谓的关键问题指的是这道面试题会影响你整体面试结果。我们在面试消息队列(MessageQueue,MQ)时,尤其是面试Kafka时,经常会被问到:如何保证消息不丢失?那么,我们的回答会分为以下3部分:保证生产者消息不丢失
c语言蛇形填充数组,蛇形
周杰伦的小粉丝
题目描述蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。例如,当输入5时,应该输出的三角形为:136101525914481371211请注意本题含有多组样例输入。输入描述:输入正整数N(N不大于100)输出描述:输出一个N行的蛇形矩阵。示例1输入4输出136蛇形矩阵2021-05-1020:02:14题目:输入两个整数n和m,输出一个n行m列的矩阵,将数字1到n×m按照回字蛇形填充至矩阵
车联网技术的隐私和数据安全挑战
色宁科技
人工智能人工智能
引言:随着科技的迅猛发展,车联网技术正逐渐改变着我们的出行方式和交通系统。这项技术将汽车、互联网和通信技术相结合,使车辆能够相互通信、共享数据和连接到外部网络。然而,随之而来的是隐私和数据安全的挑战。本文将探讨车联网技术在隐私保护和数据安全方面所面临的挑战,并提出应对这些挑战的措施。第一部分:车联网技术的隐私挑战车联网技术的发展给我们带来了许多便利,但同时也对个人隐私构成了潜在威胁。以下是一些车联
【面试题】简述rabbitmq的组织架构
土掉渣的二傻子
rabbitmq架构分布式python
@[面试题]简述rabbitmq的组织架构RabbitMQ是一种流行的消息中间件,其架构设计围绕消息生产者,消息消费者和消息中转(Broker)展开。以下是RabbitMQ的主要组织架构组件和它们之间的关系:1.核心组件1.1Producer(生产者)生产者是消息的发送方,负责将消息发送到RabbitMQ的交换器(Exchange)。通常是应用程序的一部分,使用RabbitMQ客户端库与消息队列通
【LeetCode】只出现一次的数字
Seal^_^
编程专栏#LeetCodeleetcode算法数据结构C语言
【LeetCode】只出现一次的数字TheBegin点点关注,收藏不迷路给你一个非空整数数组nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。示例1:输入:nums=[2,2,1]输出:1示例2:输入:nums=[4,1,2,1,2]输出:4示例3:输入:nums=[1]输出:1提
[Linux]Docker快速上手操作教程
wingaso
经验总结运维linuxdocker运维
前言以下命令并不是docker的所有,仅涉及日常使用时最最常用的命令。目的之一时给入门的朋友熟悉学习,其二时我自己偶尔使用时备忘。一、概念简单介绍下docker的相关概念:镜像:Docker镜像是一个轻量级、可执行的独立软件包,可以看作是一个构建容器的基础层。容器:Docker容器是镜像的运行实例,容器之间是隔离的。仓库:Docker仓库是用于存储和分发Docker镜像的地方如果你是初次学习以上概
Git 的基本概念和使用方式
九月十九
git
Git是一个版本控制系统,用于跟踪文件的更改并协作开发。它具有以下基本概念和使用方式:1.代码仓库(Repository):Git将项目存储在一个称为代码仓库的文件夹中。代码仓库包含项目的所有文件和历史记录。2.提交(Commit):提交是对项目进行更改的记录。每次提交都有一个唯一的标识符,可以包含更改的文件、提交消息等信息。3.分支(Branch):分支是代码仓库中的不同版本。使用分支可以在开发
ISBN 号码——蓝桥杯
走啦小孩
算法c++蓝桥杯数据结构
1.题目描述每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个
Node.js多线程:性能提升的关键
Node.js扩展:你需要了解的多线程原文链接:https://dev.to/leapcell/scaling-nodejs-multi-threading-you-need-to-know-2nhi作者:Leapcell译者:倔强青铜三前言大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。欢
深度学习-笔记1
深度学习神经网络
刚开始接触深度学习相关内容,在这儿做一个笔记:网址:https://gitee.com/paddlepaddle/PaddleNLPpaddle-nlp是一个自然语言处理NLP方面的工具包(代码库)ERNIEERNIE是百度基于BERT改进的预训练大模型,结合了Transformer架构和知识增强机制。整体上可以分为预训练模型层和任务适配层,预训练模型层负责学习通用的语言知识和语义表示,任务适配层
撤销 | 图形天下思维导图入门操作
前端思维
撤销是指在图形天下思维导图软件中,对之前进行的编辑操作进行反向操作,恢复到操作前的状态。这一功能有助于用户在编辑过程中及时纠正错误,提高编辑效率。以下介绍图形天下思维导图工具撤销功能的几种方法。方法一:通过工具栏的“撤销”功能撤销在图形天下思维导图软件中,可以通过点击工具栏上的“撤销”功能按钮来撤销之前的编辑操作。用户只需点击一次即可撤销上一步的操作。如果需要撤销多步操作,可以连续点击“撤销”功能
Day07:缓存-数据淘汰策略
Charlie__ZS
笔记缓存
Redis的数据淘汰策略有哪些?(key过期导致的)在redis中提供了两种数据过期删除策略第一种是惰性删除,在设置该key过期时间后,我们不去管它,当需要该key时,我们再检查其是否过期,如果过期,我们就删掉它,反之返回该key。优点:对CPU友好,只有使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。缺点:对内存不友好,如果一个key已经过期,但是一直没有使用,那
私有化一键部署整体方案
维搭小刘
架构运维
背景我们的客户主要是国企、央企或者科技公司,绝大多数情况下,都是需要将星云平台进行私有化部署。此前,在星云平台整体架构一文中,我详细介绍了平台是基于微服务架构设计的,这种架构带来了许多灵活性和扩展性优势,但也给私有化部署带来了不小的挑战。尤其是在私有化部署的过程中,如何确保各个服务版本的兼容性、如何确保不同服务之间的配置和代码的一致性,成为了必须解决的核心问题。为了应对这些挑战,我们需要实现清晰的
Element Plus上传图片前,对图片进行压缩
hongkid
vue.jsjavascriptecmascript
在使用ElementPlus(一个基于Vue3的现代组件库)进行文件上传时,你可能希望在上传图片之前对其进行压缩以减少文件大小,从而提高上传速度和节省存储空间。为了实现这一功能,你可以结合使用JavaScript库来处理图片的压缩。下面是一个简单的示例,展示如何在ElementPlus中使用compressorjs进行图片压缩:安装必要的依赖:首先需要安装compressorjs,可以通过npm或
python 判断复杂包含
AI算法网奇
python基础python
目录python判断复杂包含a和b都是拍好序的:python判断复杂包含a=[10,13,15]b=[[9,11],[11,13],[13,16]]b的子项是区间,返回b中子区间包含a其中元素的子项if__name__=='__main__':a=[10,11,15]b=[[9,11],[11,13],[13,16]]#筛选出包含a中任意元素的子区间result=[intervalforinter
深度学习之核函数
fpcc
AI及算法ai
深度学习之核函数在机器学习中,常看到多项式核函数、高斯核函数,那什么叫核函数(KernelFunction,或者KernelTrick)呢?它有什么用呢。支持向量机通过某非线性变换φ(x),将输入空间映射到高维特征空间。特征空间的维数可能非常高。如果支持向量机的求解只用到内积运算,而在低维输入空间又存在某个函数K(x,x′),它恰好等于在高维空间中这个内积,即K(x,x′)=。那么支持向量机就不用
跟我学C++中级篇——64位的处理
fpcc
C++11C++c++开发语言
一、计算机的发展计算机从二进制为基础开始描述整个世界,但正如现实世界一样,十进制为主的世界也会有万千百概念。所以在实际的应用中,会出现32位和64位的计算机系统。当然,前面还有过16位、8位和4位等,以后还可以会出现128位和256位甚至更高也不是没可能。怎么理解它们呢?先举一个不太形象的比喻。现实世界中的GDP的单位一般是万亿元为单位;大公司的利润一般是以亿元为单位,中小公司的利润一般是以万元为
跟我学C++中级篇——容器的连接
fpcc
C++11C++c++开发语言
一、数据的整合在实际的开发场景中,经常可以遇到以下的情况:有几个地方的数据需要整合在一起。解决办法也有很多,在不同的层面有不同的解决方式。比如经过清洗可以把非关系型数据转为关系型数据。但在底层编程的情况中会发现有几情况:1、几个数组之间的合并。当然前提是这些数组存储的数据是兼容的2、几个容器间的合并它们之间的KEY和VALUE也要有兼容的数据类型3、混合合并可能需要做一些简单的数据处理,然后也可以
深度学习模型在汽车自动驾驶领域的应用
eso1983
深度学习汽车自动驾驶
汽车自动驾驶是一个高度复杂的系统,深度学习和计算技术在其中扮演核心角色。今天简单介绍一下自动驾驶领域常用的深度学习模型及其计算原理的解析。1.深度学习模型分类及应用场景1.1视觉感知模型CNN(卷积神经网络)应用:图像分类、物体检测(车辆、行人、交通标志)、语义分割(道路、车道线)。典型模型:YOLO:实时目标检测,低延迟特性适合自动驾驶。MaskR-CNN:结合检测与像素级分割,用于精确场景理解
【java】RuoYi-Vue前后端分离版本-登陆请求流程解析
橙-极纪元JJY.Cheng
javaRuoYi-VueRuoYi
【java】RuoYiBootstrap多模块版本-登陆请求流程解析这里它用到了一个安全管理框架SpringSecurity你可以通过这篇文章《SpringSecurity详解》去了解它,怎么使用登陆请求流程逻辑图CreatedwithRaphaël2.3.0
2045:【例5.13】蛇形填数
Zero_979
模拟c++蓝桥杯算法
【题目描述】在n×nn×n方阵里填入1,2,3,…,n×n1,2,3,…,n×n,要求填成蛇形。例如n=4n=4时方阵为:10111219161328151437654其中,n≤20n≤20。【输入】输入nn。【输出】输出题述方阵。nn行,每行各数之间用一个空格隔开。【输入样例】4【输出样例】10111219161328151437654思路:无非是四种情况,从上到下,从右到左,从下到上,从左到右
「蓝桥杯题解」蜗牛(Java)
Script_7
题解蓝桥杯算法职场和发展
题目链接这道题我感觉状态定义不太好想,需要一定的经验importjava.util.*;/***蜗牛*状态定义:*dp[i][0]:到达(x[i],0)最小时间*dp[i][1]:到达xi上方的传送门最小时间*/publicclassMain{staticScannerin=newScanner(System.in);staticfinalintN=100010,INF=0x3f3f3f3f;st
vue中的el是指什么
是小傲雨呀^_^
vue.js前端javascript
简介:在Vue.js中,el指的是Vue实例的挂载元素。具体来说,el是一个选项,用于指定Vue实例应该挂载到哪个DOM元素上。通过这个选项,Vue可以知道应该从哪个元素开始进行模板编译和渲染。它可以是一个CSS选择器字符串,也可以是一个直接的DOM元素。el的定义:el是Vue实例的一个选项,用于指定Vue实例应该挂载到哪个DOM元素上。用途:指定挂载点:el选项的主要作用是指定Vue实例的挂载
软件测试面试笔试题-选择题(物联网)
测试界媛姐
自动化测试软件测试面试软件测试面试职场和发展软件测试
1.在软件生命周期中,测试人员从那个阶段开始参与更有利于软件项目的成功()a)需求分析阶段b)设计阶段c)编码阶段d)系统测试阶段2.在Bugzilla缺陷跟踪系统中,下列选项中属于缺陷状态的是()(选两项)a)newb)fixedclaterd)verified3.在Bugzilla中,如果一个缺陷的处理状态被开发人员置为Wontfix,则表明()a)这个Bug中描述的不是问题d)这个Bug中描
Hadoop(一)
朱辉辉33
hadooplinux
今天在诺基亚第一天开始培训大数据,因为之前没接触过Linux,所以这次一起学了,任务量还是蛮大的。
首先下载安装了Xshell软件,然后公司给了账号密码连接上了河南郑州那边的服务器,接下来开始按照给的资料学习,全英文的,头也不讲解,说锻炼我们的学习能力,然后就开始跌跌撞撞的自学。这里写部分已经运行成功的代码吧.
在hdfs下,运行hadoop fs -mkdir /u
maven An error occurred while filtering resources
blackproof
maven报错
转:http://stackoverflow.com/questions/18145774/eclipse-an-error-occurred-while-filtering-resources
maven报错:
maven An error occurred while filtering resources
Maven -> Update Proje
jdk常用故障排查命令
daysinsun
jvm
linux下常见定位命令:
1、jps 输出Java进程
-q 只输出进程ID的名称,省略主类的名称;
-m 输出进程启动时传递给main函数的参数;
&nb
java 位移运算与乘法运算
周凡杨
java位移运算乘法
对于 JAVA 编程中,适当的采用位移运算,会减少代码的运行时间,提高项目的运行效率。这个可以从一道面试题说起:
问题:
用最有效率的方法算出2 乘以8 等於几?”
答案:2 << 3
由此就引发了我的思考,为什么位移运算会比乘法运算更快呢?其实简单的想想,计算机的内存是用由 0 和 1 组成的二
java中的枚举(enmu)
g21121
java
从jdk1.5开始,java增加了enum(枚举)这个类型,但是大家在平时运用中还是比较少用到枚举的,而且很多人和我一样对枚举一知半解,下面就跟大家一起学习下enmu枚举。先看一个最简单的枚举类型,一个返回类型的枚举:
public enum ResultType {
/**
* 成功
*/
SUCCESS,
/**
* 失败
*/
FAIL,
MQ初级学习
510888780
activemq
1.下载ActiveMQ
去官方网站下载:http://activemq.apache.org/
2.运行ActiveMQ
解压缩apache-activemq-5.9.0-bin.zip到C盘,然后双击apache-activemq-5.9.0-\bin\activemq-admin.bat运行ActiveMQ程序。
启动ActiveMQ以后,登陆:http://localhos
Spring_Transactional_Propagation
布衣凌宇
springtransactional
//事务传播属性
@Transactional(propagation=Propagation.REQUIRED)//如果有事务,那么加入事务,没有的话新创建一个
@Transactional(propagation=Propagation.NOT_SUPPORTED)//这个方法不开启事务
@Transactional(propagation=Propagation.REQUIREDS_N
我的spring学习笔记12-idref与ref的区别
aijuans
spring
idref用来将容器内其他bean的id传给<constructor-arg>/<property>元素,同时提供错误验证功能。例如:
<bean id ="theTargetBean" class="..." />
<bean id ="theClientBean" class=&quo
Jqplot之折线图
antlove
jsjqueryWebtimeseriesjqplot
timeseriesChart.html
<script type="text/javascript" src="jslib/jquery.min.js"></script>
<script type="text/javascript" src="jslib/excanvas.min.js&
JDBC中事务处理应用
百合不是茶
javaJDBC编程事务控制语句
解释事务的概念; 事务控制是sql语句中的核心之一;事务控制的作用就是保证数据的正常执行与异常之后可以恢复
事务常用命令:
Commit提交
[转]ConcurrentHashMap Collections.synchronizedMap和Hashtable讨论
bijian1013
java多线程线程安全HashMap
在Java类库中出现的第一个关联的集合类是Hashtable,它是JDK1.0的一部分。 Hashtable提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的――Hashtable的所有方法都是同步的。此时,无竞争的同步会导致可观的性能代价。Hashtable的后继者HashMap是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同步的
ng-if与ng-show、ng-hide指令的区别和注意事项
bijian1013
JavaScriptAngularJS
angularJS中的ng-show、ng-hide、ng-if指令都可以用来控制dom元素的显示或隐藏。ng-show和ng-hide根据所给表达式的值来显示或隐藏HTML元素。当赋值给ng-show指令的值为false时元素会被隐藏,值为true时元素会显示。ng-hide功能类似,使用方式相反。元素的显示或
【持久化框架MyBatis3七】MyBatis3定义typeHandler
bit1129
TypeHandler
什么是typeHandler?
typeHandler用于将某个类型的数据映射到表的某一列上,以完成MyBatis列跟某个属性的映射
内置typeHandler
MyBatis内置了很多typeHandler,这写typeHandler通过org.apache.ibatis.type.TypeHandlerRegistry进行注册,比如对于日期型数据的typeHandler,
上传下载文件rz,sz命令
bitcarter
linux命令rz
刚开始使用rz上传和sz下载命令:
因为我们是通过secureCRT终端工具进行使用的所以会有上传下载这样的需求:
我遇到的问题:
sz下载A文件10M左右,没有问题
但是将这个文件A再传到另一天服务器上时就出现传不上去,甚至出现乱码,死掉现象,具体问题
解决方法:
上传命令改为;rz -ybe
下载命令改为:sz -be filename
如果还是有问题:
那就是文
通过ngx-lua来统计nginx上的虚拟主机性能数据
ronin47
ngx-lua 统计 解禁ip
介绍
以前我们为nginx做统计,都是通过对日志的分析来完成.比较麻烦,现在基于ngx_lua插件,开发了实时统计站点状态的脚本,解放生产力.项目主页: https://github.com/skyeydemon/ngx-lua-stats 功能
支持分不同虚拟主机统计, 同一个虚拟主机下可以分不同的location统计.
可以统计与query-times request-time
java-68-把数组排成最小的数。一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的。例如输入数组{32, 321},则输出32132
bylijinnan
java
import java.util.Arrays;
import java.util.Comparator;
public class MinNumFromIntArray {
/**
* Q68输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
* 例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题
Oracle基本操作
ccii
Oracle SQL总结Oracle SQL语法Oracle基本操作Oracle SQL
一、表操作
1. 常用数据类型
NUMBER(p,s):可变长度的数字。p表示整数加小数的最大位数,s为最大小数位数。支持最大精度为38位
NVARCHAR2(size):变长字符串,最大长度为4000字节(以字符数为单位)
VARCHAR2(size):变长字符串,最大长度为4000字节(以字节数为单位)
CHAR(size):定长字符串,最大长度为2000字节,最小为1字节,默认
[强人工智能]实现强人工智能的路线图
comsci
人工智能
1:创建一个用于记录拓扑网络连接的矩阵数据表
2:自动构造或者人工复制一个包含10万个连接(1000*1000)的流程图
3:将这个流程图导入到矩阵数据表中
4:在矩阵的每个有意义的节点中嵌入一段简单的
给Tomcat,Apache配置gzip压缩(HTTP压缩)功能
cwqcwqmax9
apache
背景:
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,
SpringMVC and Struts2
dashuaifu
struts2springMVC
SpringMVC VS Struts2
1:
spring3开发效率高于struts
2:
spring3 mvc可以认为已经100%零配置
3:
struts2是类级别的拦截, 一个类对应一个request上下文,
springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应
所以说从架构本身上 spring3 mvc就容易实现r
windows常用命令行命令
dcj3sjt126com
windowscmdcommand
在windows系统中,点击开始-运行,可以直接输入命令行,快速打开一些原本需要多次点击图标才能打开的界面,如常用的输入cmd打开dos命令行,输入taskmgr打开任务管理器。此处列出了网上搜集到的一些常用命令。winver 检查windows版本 wmimgmt.msc 打开windows管理体系结构(wmi) wupdmgr windows更新程序 wscrip
再看知名应用背后的第三方开源项目
dcj3sjt126com
ios
知名应用程序的设计和技术一直都是开发者需要学习的,同样这些应用所使用的开源框架也是不可忽视的一部分。此前《
iOS第三方开源库的吐槽和备忘》中作者ibireme列举了国内多款知名应用所使用的开源框架,并对其中一些框架进行了分析,同样国外开发者
@iOSCowboy也在博客中给我们列出了国外多款知名应用使用的开源框架。另外txx's blog中详细介绍了
Facebook Paper使用的第三
Objective-c单例模式的正确写法
jsntghf
单例iosiPhone
一般情况下,可能我们写的单例模式是这样的:
#import <Foundation/Foundation.h>
@interface Downloader : NSObject
+ (instancetype)sharedDownloader;
@end
#import "Downloader.h"
@implementation
jquery easyui datagrid 加载成功,选中某一行
hae
jqueryeasyuidatagrid数据加载
1.首先你需要设置datagrid的onLoadSuccess
$(
'#dg'
).datagrid({onLoadSuccess :
function
(data){
$(
'#dg'
).datagrid(
'selectRow'
,3);
}});
2.onL
jQuery用户数字打分评价效果
ini
JavaScripthtmljqueryWebcss
效果体验:http://hovertree.com/texiao/jquery/5.htmHTML文件代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>jQuery用户数字打分评分代码 - HoverTree</
mybatis的paramType
kerryg
DAOsql
MyBatis传多个参数:
1、采用#{0},#{1}获得参数:
Dao层函数方法:
public User selectUser(String name,String area);
对应的Mapper.xml
<select id="selectUser" result
centos 7安装mysql5.5
MrLee23
centos
首先centos7 已经不支持mysql,因为收费了你懂得,所以内部集成了mariadb,而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb,以下为卸载mariadb,安装mysql的步骤。
#列出所有被安装的rpm package rpm -qa | grep mariadb
#卸载
rpm -e mariadb-libs-5.
利用thrift来实现消息群发
qifeifei
thrift
Thrift项目一般用来做内部项目接偶用的,还有能跨不同语言的功能,非常方便,一般前端系统和后台server线上都是3个节点,然后前端通过获取client来访问后台server,那么如果是多太server,就是有一个负载均衡的方法,然后最后访问其中一个节点。那么换个思路,能不能发送给所有节点的server呢,如果能就
实现一个sizeof获取Java对象大小
teasp
javaHotSpot内存对象大小sizeof
由于Java的设计者不想让程序员管理和了解内存的使用,我们想要知道一个对象在内存中的大小变得比较困难了。本文提供了可以获取对象的大小的方法,但是由于各个虚拟机在内存使用上可能存在不同,因此该方法不能在各虚拟机上都适用,而是仅在hotspot 32位虚拟机上,或者其它内存管理方式与hotspot 32位虚拟机相同的虚拟机上 适用。
SVN错误及处理
xiangqian0505
SVN提交文件时服务器强行关闭
在SVN服务控制台打开资源库“SVN无法读取current” ---摘自网络 写道 SVN无法读取current修复方法 Can't read file : End of file found
文件:repository/db/txn_current、repository/db/current
其中current记录当前最新版本号,txn_current记录版本库中版本