- SpringBoot建立SSH通道整合S3Elasticache(Redis),并实现Redis多库切换
IT但丁
JavaWebredisjedisspringbootaws
目录一、背景1、问题2、解决二、建立SSH通道1、pom引入依赖2、创建sshconfig3、SSHConnection程序三、Springboot整合Redis1、引入依赖2、配置信息3、RedisConfig的编写(切库处理配置)4、Redis操作的工具类四、两个大坑1、长时间未操作,连接重置2、长时间未操作,无法获取resource五、总结一、背景使用SpringBoot自带的redis框架
- Hadoop常用端口号
海洋 之心
Hadoop问题解决hadoophbase大数据
Hadoop是一个由多个组件构成的分布式系统,每个组件都会使用一些特定的端口号来进行通信和交互。以下是Hadoop2.x常用的端口号列表:HDFS端口号:NameNode:50070SecondaryNameNode:50090DataNode:50010DataNode(数据传输):50020YARN端口号:ResourceManager:8088NodeManager:8042MapReduc
- cocos creator从零开发简单框架(07)-UI返回
cocos
参考UIMain,创建一个新的UIBag,创建一个名为BtnBack文本为返回的按钮,再创建一个名为BtnMain文本为主页的按钮,然后把UIBag节点拖动到resources目录下并从场景删除。新建scripts/UIBag.ts,内容如下。importUIBasefrom"../framework/scripts/view/UIBase"importUIMgrfrom"../framework
- Spring——Spring开发实战经验(1)
庄小焱
Spring框架后端spring系统实战
摘要文章主要介绍了Swagger作为API文档生成和测试工具的功能,包括自动生成API文档、提供可视化调试界面、促进前后端协作、支持OpenAPI规范等。同时,还提及了SpringBoot与Swagger3的实战应用,以及Spring开发中其他相关技术内容,如@Resource与@Autowired的区别、Druid监控配置、切面日志示例等。1.Swagger-API文档生成和测试工具Swagge
- 以下是一篇关于使用SLURM编写作业脚本的原创技术指南
这题有点难度
人工智能
SLURM作业脚本编写实战指南:从入门到生产级配置一、为什么需要SLURM脚本?在高性能计算(HPC)领域,SLURM(SimpleLinuxUtilityforResourceManagement)作为主流的作业调度系统,承担着集群资源分配的核心职责。通过编写规范的SLURM脚本,研究人员可以:1.精确申请计算资源(CPU/GPU/内存)2.实现任务队列管理3.自动化作业流程4.获得执行日志和性
- SSM框架搭建
皇家大厨
笔记
此文参考书籍为ACCP软件工程师——使用SSM框架开发企业级应用8.0版文章目录遇到的问题:1.错误:couldnotfindresourcesrc/dao/UserMapper.xml和mybatis启动异常:Logginginitializedusing'classorg.apache.ibatis.logging.log4j.Log4jImpl'2.Eclipse中的路径问题:3.log4j
- Disconnected from the target VM, address: ‘127.0.0.1:64555‘, transport: ‘socket‘解决方案
It_BeeCoder
SpringBoot000项目开发问题整理springboot
问题描述今天在启动SpringBoot项目的时候,报以下错误:DisconnectedfromthetargetVM,address:'127.0.0.1:64555',transport:'socket'解决方案经排查,是将@Value("${}")误写为@Resource导致的。
- 角色访问控制(RBAC)
IT源哥
架构设计和软件设计usersessionactorumlaccessclass
角色访问控制(RBAC)引入了Role的概念,目的是为了隔离User(即动作主体,Subject)与Privilege(权限,表示对Resource的一个操作,即Operation+Resource)。Role作为一个用户(User)与权限(Privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予Role而不是直接给User或Group。Privilege是权限颗粒,由Operat
- Kubernetes 使用自定义资源(CRD)扩展API
zhangj1125
Gokubernetes容器go
K8sCRD即KubernetesCustomResourceDefinition,是Kubernetes提供的一种扩展机制,允许用户在Kubernetes集群中定义和使用自定义的资源类型。通过定义CRD,用户可以在Kubernetes集群中创建、读取、更新和删除自定义资源对象,就像使用原生的Pod、Service等资源一样。本文主要介绍如何使用kubebuilder快速创建自定义资源类型。完成g
- Java面试宝典(Spring篇)
y_Haveme
Spring面试题开发语言javaspring
目录1.什么是spring?2.Spring框架的优点。3.什么是IOC(控制反转)?4.依赖注入的方式。5.Autowired和Resource关键字的区别?6.什么是AOP(面向切面编程)?7.什么是通知呢?有哪些类型呢?8.springbean的生命周期。9.Spring支持的几种bean的作用域。10.Spring框架中都用到了哪些设计模式?11.事务三要素是什么?12.Spring事务实
- cocos creator从零开发简单框架(05)-ViewBase基类
cocos
新建framework/scripts/view/ViewBase.ts,内容如下。主要是用作UI和Panel的基类,有一些基本的属性和方法。exportdefaultclassViewBase{/**资源Bundle名,如果为空加载resources资源*/publicbundleName:string/**资源路径*/publicskinPath:string/**资源实例化后的对象*/pub
- android liveData更新UI数据
weixin_44693887
android
1.创建LiveData的javaBean对象publicclassModelBeanextendsLiveData{privateintflag;privateStringtime;privateStringbatteryStr;privateintbattery;//蓝牙连接状态privateintresourceId;privateBooleanisConnected;privateStri
- RDF 规范:理解与运用
lly202406
开发语言
RDF规范:理解与运用引言资源描述框架(ResourceDescriptionFramework,RDF)是一种用于描述网络资源的框架,它允许数据以结构化的形式存储和交换。RDF规范在语义网中扮演着至关重要的角色,它为数据提供了语义描述,使得数据能够在不同的系统和应用程序之间进行有效的交换和互操作。本文将详细介绍RDF规范的基本概念、组成元素、应用场景及其重要性。RDF基本概念什么是RDF?RDF
- cocos creator从零开发简单框架(05)-ViewBase基类
cocos
新建framework/scripts/view/ViewBase.ts,内容如下。主要是用作UI和Panel的基类,有一些基本的属性和方法。exportdefaultclassViewBase{/**资源Bundle名,如果为空加载resources资源*/publicbundleName:string/**资源路径*/publicskinPath:string/**资源实例化后的对象*/pub
- ImageJ:科研与工业图像处理的利器
邱蒙励
ImageJ:科研与工业图像处理的利器imageJ下载链接项目地址:https://gitcode.com/Resource-Bundle-Collection/35869项目介绍ImageJ是一款功能强大的开源图像处理软件,广泛应用于科研和工业领域。无论您是从事生物医学研究、材料科学分析,还是工业质量控制,ImageJ都能为您提供高效、灵活的图像处理解决方案。本仓库提供了适用于不同操作系统和架构
- [转载] awesome big data
weixin_30343157
javascriptjavaruntimeViewUI
原文:https://github.com/onurakpolat/awesome-bigdata#graph-data-model作者把分布式领域相关的大部分开源项目和论文分类整理了一遍,造福人类啊.AwesomeBigDataAcuratedlistofawesomebigdataframeworks,resourcesandotherawesomeness.Inspiredbyawesome
- 2014 6月,比较老了
金金2019
AwesomeBigDataAcuratedlistofawesomebigdataframeworks,resourcesandotherawesomeness.Inspiredbyawesome-php,awesome-python,awesome-ruby,hadoopecosystemtable&big-data.Yourcontributionsarealwayswelcome!Awes
- K8S资源限制之resources
是小V呀
k8sk8s云原生资源限制resources
1资源限制介绍K8S设计资源限制的原因主要是为了确保集群的稳定运行、防止资源争用和过载,同时提高应用程序的可靠性和性能。资源限制通过Cgroups等机制控制Pod使用节点资源(CPU、内存、存储)。假设1个节点上有多个pod,其中一个pod使用了所有的资源,那么肯定会影响到到其他pod的运行。2resources介绍resources作用:resources用于定义容器的计算资源请求和限制。这些资
- 【npm】Install fail! Error: EBUSY: resource busy or locked,symlink ...
find_some_way
前端webpacknodejs
1、参考1Installfail!Error:EBUSY:resourcebusyorlocked原文:1)、如果你的项目里存在package-lock.json文件,删除它。并且删除node_modules。然后再npminstall。2)、第一步不行的话,运行npmcacheclean--force或者npmcacheverify,然后再npminstall/cnpminstall。3)、如果
- $ npx electron-forge import 一直报权限问题 resource busy or locked,
卢可以
electronarcgisjavascript
jack@LAPTOP-7DHDAAL0MINGW64/e/project/celetron-project/my-electron-app(master)$npxelectron-forgeimport>Checkingyoursystem>Checkinggitexists>Checkingnodeversion>CheckingpackageManagerversion√Foundnode@
- 从0到1带大家搭建spring cloud alibaba 微服务大型应用框架(九)文件服务篇(1):minio 单机与集群搭建
峡谷电光马仔
springcloudminioalibaba分布式文件
为什么需分布式文件服务单机时代初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分。例如:resources\static\file、resources\static\image等。优点:这样做比较便利,项目直接引用就行,实现起来也简单,无需任何复杂技术,保存数据库记录和访问
- Spring Boot项目中实现文件的上传、下载和预览功能
战族狼魂
javaSpringbootspringboot后端java
在SpringBoot项目中实现文件的上传、下载和预览功能,可以通过使用SpringMVC的MultipartFile接口来处理文件上传,并使用HttpServletResponse或Resource来实现文件下载和预览。下面是如何实现这些功能的完整示例。1.引入依赖确保在pom.xml中引入了SpringBoot的相关依赖。通常情况下,SpringBootStarterWeb已经包含了必要的依赖
- Addressables
暴走Unity
publicstaticasyncTaskGetAll(stringlabel,IListloadedLocations){varunloadedLocations=awaitAddressables.LoadResourceLocationsAsync(label).Task;foreach(varlocationinunloadedLocations){loadedLocations.Add(
- HarmonyOS应用开发:TextPicker(基础组件)
「已注销」
鸿蒙harmonyos华为鸿蒙系统鸿蒙android算法前端
滑动选择文本内容的组件。说明:该组件从APIVersion8开始支持。子组件无接口TextPicker(options?:{range:string[]|string[][]|Resource|TextPickerRangeContent[]|TextCascadePickerRangeContent[],selected?:number|number[],value?:string|string
- spring项目中读取类路径下文件的方式
初夏の猫
springjavasql
//1.Class.getResourceAsStream()InputStreaminputStream=LoadConfigUtil.class.getResourceAsStream("/mybatis-config.xml");//2.ClassPathResourcefontResource=newClassPathResource("fonts/msyh.ttf");InputStre
- 【ElasticSearch】Es 启动流程 初始化流程 源码分析
九师兄
源码es启动流程
文章目录1.概述1.1核心类2.主要流程2.1主方法2.1.1关闭过程分析2.2execute方法2.3Bootstrap.init2.4INSTANCE.setup方法2.5创建节点2.5.1创建PluginsService2.5.2创建ThreadPool及ThreadContext实例2.5.3初始化ResourceWatcherService2.5.4创建NodeClient2.5.5创建
- 科普:“URL”与“URI”(及URN)
人工干智能
应用架构网络
“URL”与“URI”是两个在Web开发中经常提到的概念,它们之间存在一定的联系和区别。一、定义URL(UniformResourceLocator):统一资源定位符,用于在互联网上完整地描述网页和其他资源的位置。它提供了访问资源所需的全部信息,包括协议、主机名、端口号(可选)、路径、查询字符串(可选)和片段标识符(可选)。URI(UniformResourceIdentifier):统一资源标识
- Kivy转apk——使用打包虚拟机(亲测~)
刘骏宗
Kivy转apk——使用打包虚拟机(亲测~)Kivy转apk使用打包虚拟机亲测项目地址:https://gitcode.com/Resource-Bundle-Collection/e8cd4文档简介本资源提供了详细的指导,帮助开发者使用Kivy框架将Python项目转换为Androidapk文件。该流程基于虚拟机环境,特别适合那些希望避免手动配置复杂开发环境的用户。通过这篇亲测分享,你可以了解到
- webstorm2019 汉化后无法设置 webstorm最新汉化包
Defry
webstrom汉化
这里有2019最新汉化包地址亲测设置有效https://www.7down.com/soft/346510.html把lib下的resource_en.jar重命名或者删除,然后把汉化包中的resource_cn.jar复制到lib目录下即可
- python 摄像头 异常,opencvpython摄像头读取错误
weixin_39580564
python摄像头异常
我有个错误VIDEOIOERROR:V4L2:PixelformatofincomingimageisunsupportedbyOpenCVUnabletostopthestream:DeviceorresourcebusyVIDEOIOERROR:V4L:can'topencamerabyindex0尝试运行代码时importtimeimportdatetimeimportcv2importbo
- 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记录版本库中版本