- 国外技术网站推荐
zcwfeng
http://blog.adam-bien.com/AdamBien的个人博客,主要是Java&JavaEE相关。http://techblog.bozho.net/Java,Android,WEB相关http://www.captaindebug.com/Java,Spring,Weblogic,Oracle,MySQL等。http://www.devx.com/综合类的技术门户网站http:/
- 国外优秀JAVA技术网站推荐
Turn X7
Java技术网站推荐Java技术网站推荐
1.http://blog.adam-bien.com/AdamBien的个人博客,主要是Java&JavaEE相关。2.http://techblog.bozho.net/Java,Android,WEB相关3.http://www.captaindebug.com/Java,Spring,Weblogic,Oracle,MySQL等。4.http://www.devx.com/综合类的技术门户
- DB sharding and ID design
screaming
DBSharding
Instagram的分片与ID设计|系统设计学习必看!本文原载于Instagram官方TechBlog,由九章techblog读书会小组成员-金秋翻译。想加入九章techblog读书小组的,私信主页君哦~~也欢迎热爱知识分享的小伙伴投稿哦~~Instagram上有大量的数据,每分钟就有超过25张的图片和90个点赞。为了确保所有重要的数据都能被合理存储并且及时得被提取应用,我们对数据进行了分片(sh
- Java程序员最常光顾的国内外优秀的Java技术网站
编程小李飞刀
1.http://www.javathinker.net/国内的专业Java技术文章,里面有许多优质干货2.http://techblog.bozho.net/Java,Android,WEB相关3.http://www.captaindebug.com/Java,Spring,Weblogic,Oracle,MySQL等。4.http://blog.adam-bien.com/AdamBien的
- pytorch i2i 图像分割测试集_水平集_图像分割
weixin_39561168
pytorchi2i图像分割测试集
外文原址:https://wiseodd.github.io/techblog/2016/11/05/levelset-method/Part1:Introduction各位看官,当你关注最近计算机视觉发展趋势时有没有发现一个现象:大家都逐渐放弃了传统的方法,都是将数据一股脑地丢给深度卷积神经网络,当真是‘遇事不决,深度网络来学‘。不管各位看官是否决定要投入深度学习的怀抱,研究经典的计算机视觉算法
- 【推荐系统】Netflix 推荐系统:第二部分
攻城狮凌风
深度学习与数据挖掘Netflix推荐系统
原文链接:http://techblog.netflix.com/2012/06/netflix-recommendations-beyond-5-stars.htm在blog的第一部分,我们详细介绍了Netflix个性化推荐系统的各个组成部分。我们也解释了自从我们宣布NetflixPrize后,Netflix推荐系统是如何变化的。100万美金的奖金让我们不论在算法创新,还是在品牌宣传和吸引人才加
- Netflix如何通过重构视频Gatekeeper提升内容运营效率?
LiveVideoStack_
Gatekeeper是Netflix的视频内容评估管理平台,可以展示视频剧集的metadata,如合同信息、字幕、标题、内容分级等。但此前,运营人员无法通过Gatekeeper实时更新剧集信息,本文将介绍新的gatekeeper架构,以及因此获得的收益。文/DrewKoszewnik译/John原文https://medium.com/netflix-techblog/re-architectin
- 如何精确统计页面停留时长
grain先森
作者:今日头条技术techblog.toutiao.com/2018/06/05/ru-he-jing-que-tong-ji-ye-mian-ting-liu-shi-chang/1.背景页面停留时间(TimeonPage)简称Tp,是网站分析中很常见的一个指标,用于反映用户在某些页面上停留时间的长短,传统的Tp统计方法会存在一定的统计盲区,比如无法监控单页应用,没有考虑用户切换Tab、最小化窗
- python word2vector计算相似度_word2vector 使用方法 计算语义相似度
weixin_39590472
python
参考:http://techblog.youdao.com/?p=915#LinkTarget_699word2vector是一个把词转换成词向量的一个程序,能够把词映射到K维向量空间,甚至词与词之间的向量操作还能和语义相对应。如果换个思路,把词当做feature,那么word2vec就可以把feature映射到K维向量空间,一、什么是word2vec?采用的模型有CBOW(ContinuousB
- Netflix 推荐系统 (Part One)-排序算法
weixin_33964094
数据结构与算法人工智能
这一系列的文章是关于netflixtechblog的推荐系统相关文章的总结。大部分内容来自netflix-techblog:recommendations按照时间顺序,最早的关于推荐系统的文章发表于2012年.NetflixRecommendations:Beyondthe5stars(Part1)NetflixRecommendations:Beyondthe5stars(Part1)最早在20
- linux中断实例
lucien
linux内核
原文:http://edsionte.com/techblog/%E5%86%85%E6%A0%B8%E6%96%B0%E6%89%8B%E5%8C%BA你的第一个中断程序:本文通过一个简单的中断程序来描述一般中断程序的基本框架。完整代码在这里。中断程序一般会包含在某个设备的驱动程序中,因此,接下来的程序本质上还是一个内核模块。说到内核模块,你应该知道首先去看什么了吧?对了,就是内核模块加载函数。
- QTableWidget之右键菜单的实现!
hitxiaya
QTactionqt设计模式数据库signalui
原文地址:http://edsionte.com/techblog/archives/3014QTableWidget类提供了一种基于条目(item)的表格视图模型,在该部件中数据以item为基本单位,每条数据(item)对应一个QTableWidgetItem类的对象,所有数据形成的item组成整个表格。接下来我们创建一个用来显示学生信息的表格,以此为例说明TableWidget的一些常用功能。
- Gradle:一个更好的构建工具
YapingXin
ALMApplicationLifecycleManagement
----------------------------------------------------------------------------------------------------------------------原文标题:Gradle–Abetterwaytobuild原文网址:http://techblog.chegg.com/2011/04/29/gradle-a-be
- Android Handler Memory Leak
ruinworld
转载自https://techblog.badoo.com/blog/2014/08/28/android-handler-memory-leaksAndroidHandlerMemoryLeaksByDmytroVoronkevychon28Aug2014-androidAndroidusesJavaasaplatformfordevelopment.Thishelpsuswithmanylow
- Spring cloud Loadbalance
zhaohong_bo
学习笔记
feign原理介绍:https://segmentfault.com/a/1190000016776471?utm_source=tag-newesthttp://techblog.ppdai.com/2018/05/28/20180528/https://blog.csdn.net/xiaofeng10330111/article/details/85682513负载均衡策略:随机(Random
- [Tutorial] Create a Web Service with Apache CXF and JBoss 6
iteye_16154
J2EE
转自:http://www.celinio.net/techblog/?p=531IhaverecentlystartedstudyingApacheCXF,theopensourcewebserviceframework.IamfamiliarwithdevelopingWebServicesusingEJB3,AxisorGlue.ButnotwithCXF.Untilnow.CXFisami
- selenium:你必须知道的七件事
ThinWall
seleniumwebdriver
selenium:你必须知道的七件事原文链接:https://www.lucidchart.com/techblog/2015/07/21/selenium-7-things-you-need-to-know-2/译者的话:本文的作者就职于Lucid,如文中所述他们有着一套比较成熟的基于selenium的自动化测试工具。这得益于他们对于自动化测试的重视,因为只有自动化测试才能很好地保证敏捷开发的软
- Techblog:博客初始化问题
RachelJiang
Techblog
MacOS通过Hexo+GitHub搭建个人网站问题:更改了_config.yml的设置,之后本地网页无法打开,同时无法部署到GitHub。过程:在本地blog关联github时,修改了deploy设置,之后本地页面无法打开。#Deployment##Docs:https://hexo.io/docs/deployment.htmldeploy:type:gitrepository:git@git
- [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache
半吊子全栈工匠
架构
阅读国外的技术博客和技术网站是跟随时代脚步的重要方式,Netflex有自己的开源门户OSS,更是微服务架构的推崇者,拥有自己的微服务架构技术站,其技术博客中有不少干货,于是在地铁阅读时光里便有了这篇译文。原文自:http://techblog.netflix.com/2016/05/application-data-caching-using-ssds.html随着Netflix的全球化扩张,也带
- SCeneKit 学习(0)
acon
SceneKit简介参考文章:https://techblog.toutiao.com/2017/07/05/session604/背景SceneKit是苹果2012年引入的一个处理3D场景的高层框架,底层技术从开始的OpenGL,迁移到后来的Metal。一开始只支持macOS平台,在2014年的开发者大会上正式通过iOS8引入移动平台,后来随着watchOS和tvOS的陆续问世,SceneKit
- 今日头条iOS客户端启动速度优化
Eric博客
iOS开发
本文转载:https://techblog.toutiao.com/2017/01/17/iosspeed/应用启动时间,直接影响用户对一款应用的判断和使用体验。头条主app本身就包含非常多并且复杂度高的业务模块(如新闻、视频等),也接入了很多第三方的插件,这势必会拖慢应用的启动时间,本着精益求精的态度和对用户体验的追求,我们希望在业务扩张的同时最大程度的优化启动时间。技术调研先说结论,t(App
- 一文总结 Unity移动平台应该选择的照明设置
u010019717
学unity涨知识
翻译自:https://techblog.kayac.com/unity-basic-rendering-configurations之前看到过的文章,总结的很好!最近有时间翻译收藏一下单击图像以跳转到WebGL构建。本文是思考和尝试在为智能手机创建3D游戏时“暂时”做的渲染设置的记录。主要设定Item是光照贴图阴影光探头如果你考虑这些设置,无论你做什么,你都需要知道照明计算,所以我也会谈到它。动
- Spinnaker-Netflix 的持续交付平台
JFrog杰蛙中国
Netflix是业界公认的DevOps最佳实践者。他们的技术博客(techblog.netflix.com)会经常更新他们内部DevOps的最佳实践。硅谷的公司通常会把内部使用比较成功的项目共享出来成为开源项目,Netflix也开源了他们的DevOps平台–Spinnaker(www.spinnaker.io).最近Netflix的架构师Glover在JFrog总部的Meetup活动中做了Spin
- 程序员总被坑?这是GitHub上的一篇防骗指南
CSDN资讯
点击上方“CSDN”,选择“置顶公众号”关键时刻,第一时间送达!作为一名技术人,我们擅长处理系统漏洞,对于媒体信息来源的真伪我们毫无辨别能力。本文源自于GitHub上创建的一个repo,其中收集了许多如HackerNews、Reddit、techblog等新闻频道上有关软件开发者遭受虚假信息之害的故事。以下为正文:2015年我结识了一位很聪明的企业家,从谈话中得知他刚刚从一家知名风险投资公司筹集了
- Netflix Conductor:微服务编排器
蔚1
翻译自https://medium.com/netflix-techblog/netflix-conductor-a-microservices-orchestrator-2e8d4771bf40Netflix内容平台工程团队支撑了许多业务,这些业务流程由微服务任务异步驱动的。其中一些任务是持续数天的长流程。这些流程在为全球观众提供字幕方面发挥着至关重要的作用。这些流程包括:Studio合作伙伴内
- VMAF:未毕之旅
LiveVideoStack_
本文来自Netflix的科技博客,阐述了VMAF的最新应用进展,以及VMAF正在做的改进工作。感谢邓斌的翻译,及快手相关同学的技术审校。文/ZhiLi,ChristosBampis,JulieNovak,AnneAaron,KyleSwanson,AnushMoorthy和JanDeCock译/邓斌审校/快手的相关同学原文https://medium.com/netflix-techblog/vm
- React native 通用即时通讯UI之Aurora-imui
大灰狼的小绵羊哥哥
】
Reactnative通用即时通讯UI之Aurora-imui转载http://techblog.sishuxuefu.com/atricle.html?5b42b8adfe88c20035f12765简介AuroraIMUI是个通用的即时通讯(IM)UI库,不特定于任何IMSDK。本UI库提供了消息列表、输入视图等常用组件,支持常见的消息类型:文字、图片、语音、视频等。默认包含多套界面风格,也能
- 从宝丽来到数字电影——图像与视频色彩的科学
LiveVideoStack_
本文来自Netflix技术博客,讲述了相机和电影行业如何通过技术手段还原图像与视频的原始色彩的。在现代电影制作过程中,这些技术被数字化了。感谢快手视频和图像算法团队的翻译与技术审校。文/KyleePeña,ChrisClark,andMikeWhipple译/章佳杰技术审校/张元尊原文https://medium.com/netflix-techblog/protecting-a-storys-f
- 深入了解docker native overlay network 原理
qq_37672009
link:http://techblog.d2-si.eu/2017/04/25/deep-dive-into-docker-overlay-networks-part-1.htmlIntroductionAtD2SI,wehavebeenusingDockersinceitsverybeginningandhavebeenhelpingmanyprojectsgointoproduction.W
- 通用的使用Frida旁路Android SSL Pinning
小龙在山东
android
/*AndroidSSLRe-pinningfridascriptv0.2030417-pier$adbpushburpca-cert-der.crt/data/local/tmp/cert-der.crt$frida-U-fit.app.mobile-lfrida-android-repinning.js--no-pausehttps://techblog.mediaservice.net/20
- 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记录版本库中版本