基于时间序列预测的推理服务弹性扩缩容实战指南:(行业案例+数学推导+源码解析)
燃灯工作室
Ai计算机视觉语音识别目标检测机器学习人工智能
技术原理(数学公式)整体架构请求量预测→扩缩容决策→资源配置动态调整三阶段闭环,周期为5-30分钟核心预测模型(时间序列预测)LSTM预测公式(CSDN兼容格式):$$h_t=\text{LSTM}(x_t,h_{t-1})\\\hat{y}_{t+1}=W_h\cdoth_t+b_h$$其中Wh∈Rd×1W_h\in\mathbb{R}^{d\times1}Wh∈Rd×1为权重矩阵,ddd为隐藏
karyoploteR: 基因组数据可视化 R 包
BioIT爱好者
pythonjava机器学习人工智能大数据
karyoploteR,是一个适用于所有基因组数据(anydataonanygenome)非圆环布局(non-circularlayouts)的可视化R/Bioconductor包。开发该包的团队的目标是致力于打造一款能够像Circos那样灵活多变,但又可以满足用户更方便地使用直线(straightlines)而不是圆环(circles)展示基因组数据的工具。karyoploteR相关链接:Bio
Kotlin 标准函数 with、run、apply 的定义和使用
阿华-vitor
Kotlin基础微信前端javascript
Kotlin标准函数with、run、apply的定义和使用1.with函数定义:with函数允许你在一个对象的上下文中执行一个lambda表达式,而不需要在lambda表达式中重复引用该对象。@kotlin.internal.InlineOnlypublicinlinefunwith(receiver:T,block:T.()->R):R=receiver.block()使用场景:当你需要在多个
《今日AI-人工智能-编程日报》-源于2025年3月11日
小亦编辑部
每日AI-人工智能-编程日报人工智能
1.AI行业动态1.1Manus通用智能体初成型,开启AIAgent新时代中泰证券发布研报称,首款通用型AI智能体Manus已问世,能够将复杂任务拆解为可执行的步骤链,并在虚拟环境中灵活调用工具,标志着AI从“Reasoner”走向“Agent”阶段。Manus的成功引发了开源复现潮,DeepSeek模型已被整合到OWL项目中,并在GAIA基准测试中表现接近Manus。1.2DeepSeek-R2
centos7 yum更换阿里云镜像
java小吕布
服务器运维之道阿里云云计算
在CentOS7系统中,更换YUM源为阿里云的镜像源可以带来诸多好处,如提高下载速度、提升稳定性、同步更新等。以下是详细的步骤:一、备份原有YUM源配置文件首先,需要备份原有的CentOS基础YUM仓库配置文件(CentOS-Base.repo),以防更换过程中出现问题,需要恢复到原始配置。可以使用以下命令:mv/etc/yum.repos.d/CentOS-Base.repo/etc/yum.r
Java:AI 浪潮中的隐形支柱 —— 探秘 Java 在人工智能领域的独特地位
琢磨先生David
人工智能
引言在人工智能技术席卷全球的今天,当人们谈论AI开发时,Python、R语言、C++等工具总是最先被提及。然而在这个充满创新的领域,有一个"老兵"正悄然发挥着不可替代的作用——自1995年诞生至今的Java语言,凭借其独特的工程化基因,正在构建起AI世界的底层基础设施。本文将揭示Java如何在大数据、机器学习、企业级AI系统等领域持续创造价值。一、Java的AI基因解码跨平台优势的现代意义"一次编
python笔记1
lu_32
python
1.计算面积与周长:r=8s=r*rprint("面积是")print(s)z=r+r+r+rprint("周长是")print(z)#面积是#64#周长是#322.输入圆的半径,计算出圆的面积和周长:r=input("请输入半径:")r=float(r)s=3.14*r*rprint("圆的面积:",s)r=input("请输入圆的半径")r=int(r)s=3.14*r*rprint("圆的半
linux清空文件夹的命令
getapi
linuxgithubgit
在Linux系统中,清空文件夹(即删除文件夹中的所有内容,但保留文件夹本身)可以通过多种方法实现。以下是几种常见的命令和操作方式:方法1:使用rm命令rm是一个强大的命令,用于删除文件和目录。要清空文件夹的内容,可以使用以下命令:rm-rf/path/to/folder/*解释:rm:删除命令。-r:递归删除,用于处理目录及其子目录。-f:强制删除,无需确认。/path/to/folder/*:指
强化学习-Chapter2-贝尔曼方程
Rsbs
算法机器学习概率论
强化学习-Chapter2-贝尔曼方程贝尔曼方程推导继续展开贝尔曼方程的矩阵形式状态值的求解动作价值函数与状态价值函数的关系贝尔曼方程推导Vπ(s)=E[Gt∣St=s]=E[rt+1+(γrt+2+…)∣St=s]=E[rt+1+γGt+1∣St=s]=∑a∈Aπ(s,a)∑s′∈SPs→s′a⋅(Rs→s′a+γE[Gt+1∣St+1=s′])=∑a∈Aπ(s,a)∑s′∈SPs→s′a⋅(R
HuggingFace下载模型并导入Ollama指南
Repetion_Maxumim
embedding语言模型人工智能自然语言处理ai
此处以moka-ai/m3e-base模型下载为例。众所周知,HuggingFace仓库托管了诸多训练模型。DeepSeek官方也将完整满血版DeepSeek-R1:671B模型镜像托管在此仓库,但是目前国内无法直接从HugingFace下载。并且,一般为了快速部署,会选择Ollama这类管模型管理工具,类似Docker引擎一样,但是Ollama支持的模型镜像格式(如GGUF)HuggingFac
RISC-V汇编学习(二)—— 汇编语法
禾仔仔
RISC-Vrisc-v汇编
在具体汇编指令和汇编实战之前,还是有必要对RISC-V汇编进行下介绍,我一般称之为RISC-V汇编的“语法”,可能“语法”较少,也相对比较简单的原因,大部分的博主都是一笔带过,但本着循序渐进的原则,还是简单概述下,以便加深认识。RISCV汇编学习系列:RISC-V汇编学习(一)——基础认识RISC-V汇编学习(二)——汇编语法RISC-V汇编学习(三)——RV指令集RISC-V汇编学习(四)——R
C/C++ R-Tree原理及源代码
猿来如此yyy
C/C++算法详解及源码r-treec语言c++开发语言算法数据结构
R树是一种用于高维空间数据的索引结构,它是由AntoninGuttman于1984年提出的。R树旨在提高对多维数据进行范围查询的性能。它被广泛应用于空间数据库中。R树的核心思想是将数据划分为不相交的矩形区域,并逐层构建一个树结构。每个非叶子节点都是一个矩形,它覆盖了它的所有子节点。每个叶子节点都是一个数据对象与其坐标范围的组合。通过这种方式,R树能够将相邻的数据对象聚集在一起,从而减少对数据的搜索
【开源代码解读】AI检索系统R1-Searcher通过强化学习RL激励大模型LLM的搜索能力
accurater
人工智能深度学习R1-Searcher
关于R1-Searcher的报告:第一章:引言-AI检索系统的技术演进与R1-Searcher的创新定位1.1信息检索技术的范式转移在数字化时代爆发式增长的数据洪流中,信息检索系统正经历从传统关键词匹配到语义理解驱动的根本性变革。根据IDC的统计,2023年全球数据总量已突破120ZB,其中非结构化数据占比超过80%。这种数据形态的转变对检索系统提出了三个核心的挑战:语义歧义消除:如何准确理解"A
阿里巴巴发布 R1-Omni:首个基于 RLVR 的全模态大语言模型,用于情感识别
新加坡内哥谈技术
语言模型人工智能自然语言处理
每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://rengongzhineng.io/情感识别一直是AI领域的难题,尤其是视觉与音频信号的融合。单独依赖视觉或音频的模型,往往
“杀疯了”,头部玩家纷纷下场,冲榜高阶智驾第一梯队!
高工智能汽车
自动驾驶人工智能
2025年的中国乘用车市场份额战与销量突破口,高阶智驾无疑是关键赛点。日前,吉利也高调入场,再次掀起高阶智驾市场普及战的新高潮。类似于比亚迪的天神之眼分成ABC三挡,对应不同级别车型,吉利的千里浩瀚智驾方案更加多元化,分为H1、H3、H5、H7和H9共5个不同层级的智驾方案。其中H1采用10V5R传感器方案,功能方面可实现高速NOA和记忆泊车HPA,主打极致性价比。根据资料来看,H1采用的是双黑芝
R+VIC模型融合实践技术应用及未来气候变化模型预测
科研的力量
水文地质土壤水文模型VIC模型
在气候变化问题日益严重的今天,水文模型在防洪规划,未来预测等方面发挥着不可替代的重要作用。目前,无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然,这些软件有各自的优点;但是,由于适用的尺度主要的是中小流域,所以在预测气候变化对水文过程影响等方面都有所不足。VIC模型是一个大尺度的半分布式水文模型,其设计之初就是为了模拟大流域的水文过程;它能够计算陆地
python提示unmatched_Python自动化学习--异常提示
weixin_39933356
举例:打开一个不存在的文件时:>>open("abc.txt","r")会提示错误Traceback(mostrecentcalllast):File"D:/project1/test.py",line11,inopen("abc.txt","r")FileNotFoundError:[Errno2]Nosuchfileordirectory:'abc.txt'这时可以用try....except
golang字符串常用的系统函数
平谷一勺
Golang基础篇golangjava开发语言go字符串基本函数字符串常用方法
1.说明字符串在开发中,使用频率非常高,所以我们需要掌握字符串的常用方法。2.统计字符串的长度按字节len(str)go的编码统一为utf-8(ascii的字符字母和数字占一个字节,汉字占三个字节)str:="hello"fmt.Println(len(str))//5str="hello杭"fmt.Println(len(str))//83.字符串遍历处理带有中文的字符串r:=[]rune(st
pipenv install -r requirements.txt
总是幸福的老豌豆
日常工作总结python
前言最近部署python项目时本地通过虚拟环境进行运行项目报错:错误如下PSC:\Users\Administrator\Desktop\desktop_health_sdk\desktop_health_sdk>pipenvinstall-rrequirements.txtWarning:Python2.7wasnotfoundonyoursystem..
DeepSeek R1有什么不同
新加坡内哥谈技术
人工智能深度学习机器人科技
每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://rengongzhineng.io/深度思考实验室(DeepSeek)最近发布了全新的推理模型R1,声称该模型不仅性能超越目
R 语言科研绘图第 31 期 --- 韦恩图-基础
TigerZ 生信宝库
r语言贴图程序人生开发语言
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。为了便于使用,本系列文章介绍的所有绘图都已收录到了sciRplot项目中,获取方式:R语言科研绘图模板---sciRplothttps://mp.weixin.qq.com/s/QA_8LVqjkdg4A16zLonw4w?payreadticket=HElUE5WWmBflodEFw10g0l2NrRotj8kbU
Spring Boot启动流程及源码实现深度解析
黑猫Teng
springboot后端java
SpringBoot启动流程及源码实现深度解析一、启动流程概述SpringBoot的启动流程围绕SpringApplication类展开,核心流程可分为以下几个阶段:初始化阶段:推断应用类型,加载ApplicationContextInitializer和ApplicationListener环境准备:加载配置文件和命令行参数上下文创建:实例化ApplicationContext上下文刷新:执行r
RAG技术的PDF智能问答系统
AI Echoes
深度学习
关键要点系统基于RAG(检索增强生成)技术,允许用户上传PDF并进行智能问答。使用Ollama的deepseek-r1模型和FAISS向量数据库,支持普通对话和基于PDF的问答模式。提供简洁的Web界面,支持文件拖拽上传和多轮对话。研究表明,系统适合处理PDF内容查询,但性能可能因PDF复杂性而异。系统概述这个PDF智能问答系统是一个基于RAG技术的工具,旨在帮助用户通过上传PDF文件进行智能交互
带隙基准电路设计仿真/自己备忘
Rinze!
电路结构如图所示,放大器采用二级米勒补偿运算放大器https://blog.csdn.net/Czy1377004611/article/details/118551567?spm=1001.2014.3001.5501所用工艺为1830工艺基本原理是PTAT电流产生电路的PTAT电流在电阻R2上的压降与三极管Q3的BE结电压叠加形成VREF。1.确定工作电流和R1搭建如图仿真电路图,设置idc=
SAX解析xml文件
小猪猪08
xml
1.创建SAXParserFactory实例
2.通过SAXParserFactory对象获取SAXParser实例
3.创建一个类SAXParserHander继续DefaultHandler,并且实例化这个类
4.SAXParser实例的parse来获取文件
public static void main(String[] args) {
//
为什么mysql里的ibdata1文件不断的增长?
brotherlamp
linuxlinux运维linux资料linux视频linux运维自学
我们在 Percona 支持栏目经常收到关于 MySQL 的 ibdata1 文件的这个问题。
当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌就开始了 —— 就是说磁盘快要满了。
一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 innodbfileper_table,所以问题是:
ibdata1存了什么?
当你启用了 i
Quartz-quartz.properties配置
eksliang
quartz
其实Quartz JAR文件的org.quartz包下就包含了一个quartz.properties属性配置文件并提供了默认设置。如果需要调整默认配置,可以在类路径下建立一个新的quartz.properties,它将自动被Quartz加载并覆盖默认的设置。
下面是这些默认值的解释
#-----集群的配置
org.quartz.scheduler.instanceName =
informatica session的使用
18289753290
workflowsessionlogInformatica
如果希望workflow存储最近20次的log,在session里的Config Object设置,log options做配置,save session log :sessions run ;savesessio log for these runs:20
session下面的source 里面有个tracing 
Scrapy抓取网页时出现CRC check failed 0x471e6e9a != 0x7c07b839L的错误
酷的飞上天空
scrapy
Scrapy版本0.14.4
出现问题现象:
ERROR: Error downloading <GET http://xxxxx CRC check failed
解决方法
1.设置网络请求时的header中的属性'Accept-Encoding': '*;q=0'
明确表示不支持任何形式的压缩格式,避免程序的解压
java Swing小集锦
永夜-极光
java swing
1.关闭窗体弹出确认对话框
1.1 this.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE);
1.2
this.addWindowListener (
new WindowAdapter () {
public void windo
强制删除.svn文件夹
随便小屋
java
在windows上,从别处复制的项目中可能带有.svn文件夹,手动删除太麻烦,并且每个文件夹下都有。所以写了个程序进行删除。因为.svn文件夹在windows上是只读的,所以用File中的delete()和deleteOnExist()方法都不能将其删除,所以只能采用windows命令方式进行删除
GET和POST有什么区别?及为什么网上的多数答案都是错的。
aijuans
get post
如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历
前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。
这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把G
谈谈新浪微博背后的那些算法
aoyouzi
谈谈新浪微博背后的那些算法
本文对微博中常见的问题的对应算法进行了简单的介绍,在实际应用中的算法比介绍的要复杂的多。当然,本文覆盖的主题并不全,比如好友推荐、热点跟踪等就没有涉及到。但古人云“窥一斑而见全豹”,希望本文的介绍能帮助大家更好的理解微博这样的社交网络应用。
微博是一个很多人都在用的社交应用。天天刷微博的人每天都会进行着这样几个操作:原创、转发、回复、阅读、关注、@等。其中,前四个是针对短博文,最后的关注和@则针
Connection reset 连接被重置的解决方法
百合不是茶
java字符流连接被重置
流是java的核心部分,,昨天在做android服务器连接服务器的时候出了问题,就将代码放到java中执行,结果还是一样连接被重置
被重置的代码如下;
客户端代码;
package 通信软件服务器;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.O
web.xml配置详解之filter
bijian1013
javaweb.xmlfilter
一.定义
<filter>
<filter-name>encodingfilter</filter-name>
<filter-class>com.my.app.EncodingFilter</filter-class>
<init-param>
<param-name>encoding<
Heritrix
Bill_chen
多线程xml算法制造配置管理
作为纯Java语言开发的、功能强大的网络爬虫Heritrix,其功能极其强大,且扩展性良好,深受热爱搜索技术的盆友们的喜爱,但它配置较为复杂,且源码不好理解,最近又使劲看了下,结合自己的学习和理解,跟大家分享Heritrix的点点滴滴。
Heritrix的下载(http://sourceforge.net/projects/archive-crawler/)安装、配置,就不罗嗦了,可以自己找找资
【Zookeeper】FAQ
bit1129
zookeeper
1.脱离IDE,运行简单的Java客户端程序
#ZkClient是简单的Zookeeper~$ java -cp "./:zookeeper-3.4.6.jar:./lib/*" ZKClient
1. Zookeeper是的Watcher回调是同步操作,需要添加异步处理的代码
2. 如果Zookeeper集群跨越多个机房,那么Leader/
The user specified as a definer ('aaa'@'localhost') does not exist
白糖_
localhost
今天遇到一个客户BUG,当前的jdbc连接用户是root,然后部分删除操作都会报下面这个错误:The user specified as a definer ('aaa'@'localhost') does not exist
最后找原因发现删除操作做了触发器,而触发器里面有这样一句
/*!50017 DEFINER = ''aaa@'localhost' */
原来最初
javascript中showModelDialog刷新父页面
bozch
JavaScript刷新父页面showModalDialog
在页面中使用showModalDialog打开模式子页面窗口的时候,如果想在子页面中操作父页面中的某个节点,可以通过如下的进行:
window.showModalDialog('url',self,‘status...’); // 首先中间参数使用self
在子页面使用w
编程之美-买书折扣
bylijinnan
编程之美
import java.util.Arrays;
public class BookDiscount {
/**编程之美 买书折扣
书上的贪心算法的分析很有意思,我看了半天看不懂,结果作者说,贪心算法在这个问题上是不适用的。。
下面用动态规划实现。
哈利波特这本书一共有五卷,每卷都是8欧元,如果读者一次购买不同的两卷可扣除5%的折扣,三卷10%,四卷20%,五卷
关于struts2.3.4项目跨站执行脚本以及远程执行漏洞修复概要
chenbowen00
strutsWEB安全
因为近期负责的几个银行系统软件,需要交付客户,因此客户专门请了安全公司对系统进行了安全评测,结果发现了诸如跨站执行脚本,远程执行漏洞以及弱口令等问题。
下面记录下本次解决的过程以便后续
1、首先从最简单的开始处理,服务器的弱口令问题,首先根据安全工具提供的测试描述中发现应用服务器中存在一个匿名用户,默认是不需要密码的,经过分析发现服务器使用了FTP协议,
而使用ftp协议默认会产生一个匿名用
[电力与暖气]煤炭燃烧与电力加温
comsci
在宇宙中,用贝塔射线观测地球某个部分,看上去,好像一个个马蜂窝,又像珊瑚礁一样,原来是某个国家的采煤区.....
不过,这个采煤区的煤炭看来是要用完了.....那么依赖将起燃烧并取暖的城市,在极度严寒的季节中...该怎么办呢?
&nbs
oracle O7_DICTIONARY_ACCESSIBILITY参数
daizj
oracle
O7_DICTIONARY_ACCESSIBILITY参数控制对数据字典的访问.设置为true,如果用户被授予了如select any table等any table权限,用户即使不是dba或sysdba用户也可以访问数据字典.在9i及以上版本默认为false,8i及以前版本默认为true.如果设置为true就可能会带来安全上的一些问题.这也就为什么O7_DICTIONARY_ACCESSIBIL
比较全面的MySQL优化参考
dengkane
mysql
本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体分析了,可以参考本站的一些优化案例或者联系我,下方有我的联系方式。这是上篇。
1、硬件层相关优化
1.1、CPU相关
在服务器的BIOS设置中,可
C语言homework2,有一个逆序打印数字的小算法
dcj3sjt126com
c
#h1#
0、完成课堂例子
1、将一个四位数逆序打印
1234 ==> 4321
实现方法一:
# include <stdio.h>
int main(void)
{
int i = 1234;
int one = i%10;
int two = i / 10 % 10;
int three = i / 100 % 10;
apacheBench对网站进行压力测试
dcj3sjt126com
apachebench
ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求。前段时间看到公司的开发人员也在用它作一些测试,看起来也不错,很简单,也很容易使用,所以今天花一点时间看了一下。
通过下面的一个简单的例子和注释,相信大家可以更容易理解这个工具的使用。
2种办法让HashMap线程安全
flyfoxs
javajdkjni
多线程之--2种办法让HashMap线程安全
多线程之--synchronized 和reentrantlock的优缺点
多线程之--2种JAVA乐观锁的比较( NonfairSync VS. FairSync)
HashMap不是线程安全的,往往在写程序时需要通过一些方法来回避.其实JDK原生的提供了2种方法让HashMap支持线程安全.
Spring Security(04)——认证简介
234390216
Spring Security认证过程
认证简介
目录
1.1 认证过程
1.2 Web应用的认证过程
1.2.1 ExceptionTranslationFilter
1.2.2 在request之间共享SecurityContext
1
Java 位运算
Javahuhui
java位运算
// 左移( << ) 低位补0
// 0000 0000 0000 0000 0000 0000 0000 0110 然后左移2位后,低位补0:
// 0000 0000 0000 0000 0000 0000 0001 1000
System.out.println(6 << 2);// 运行结果是24
// 右移( >> ) 高位补"
mysql免安装版配置
ldzyz007
mysql
1、my-small.ini是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。
2、my-medium.ini是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。
3、my-large.ini是为专用于一个SQL数据
MFC和ado数据库使用时遇到的问题
你不认识的休道人
sqlC++mfc
===================================================================
第一个
===================================================================
try{
CString sql;
sql.Format("select * from p
表单重复提交Double Submits
rensanning
double
可能发生的场景:
*多次点击提交按钮
*刷新页面
*点击浏览器回退按钮
*直接访问收藏夹中的地址
*重复发送HTTP请求(Ajax)
(1)点击按钮后disable该按钮一会儿,这样能避免急躁的用户频繁点击按钮。
这种方法确实有些粗暴,友好一点的可以把按钮的文字变一下做个提示,比如Bootstrap的做法:
http://getbootstrap.co
Java String 十大常见问题
tomcat_oracle
java正则表达式
1.字符串比较,使用“==”还是equals()? "=="判断两个引用的是不是同一个内存地址(同一个物理对象)。 equals()判断两个字符串的值是否相等。 除非你想判断两个string引用是否同一个对象,否则应该总是使用equals()方法。 如果你了解字符串的驻留(String Interning)则会更好地理解这个问题。
SpringMVC 登陆拦截器实现登陆控制
xp9802
springMVC
思路,先登陆后,将登陆信息存储在session中,然后通过拦截器,对系统中的页面和资源进行访问拦截,同时对于登陆本身相关的页面和资源不拦截。
实现方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23