CHAPTER 10 Web服务与应用(二)

news2024/12/23 17:30:52

Web服务与应用

    • 10.1 Tomcat
      • 10.1.1 准备工作
      • 10.1.2 编写dockerfile
      • 10.1.3 创建tomcat用户和密码脚本文件
      • 10.1.4 编写启动脚本
      • 10.1.5 创建和测试镜像
      • 10.1.6 相关资源
    • 10.2 Jetty
      • 10.2.1 使用官方镜像
      • 10.2.2 相关资料
    • 10.3 LAMP
      • 10.3.1 使用官方镜像
    • 10.4 持续开发与管理
      • 10.4.1 Jenkins及官方镜像
      • 10.4.2 Gitlab及其官方镜像
      • 10.4.3 相关资料

10.1 Tomcat

Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器, 按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServerPage (JSP)的支持。同时, 它提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 由于Tomcat本身也内含了一个HTTP服务器,也可以当作单独的Web服务器来使用。

下面将以sunjdk1.6、tomcat7.0、ubuntu18.04环境为例介绍如何定制Tomcat镜像。

10.1.1 准备工作

下载tomcat和jdk,并解压压缩包

[root@dbc-server-554 tomcat]# mkdir tomcat;cd tomcat
[root@dbc-server-554 tomcat]# wget https://mirror.bjtu.edu.cn/apache/tomcat/tomcat-8/v8.5.84/bin/apache-tomcat-8.5.84.zip
[root@dbc-server-554 tomcat]# unzip apache-tomcat-8.5.84.zip
[root@dbc-server-554 tomcat]# wget https://download.oracle.com/java/19/latest/jdk-19_linux-x64_bin.tar.gz
[root@dbc-server-554 tomcat]# tar -zxvf jdk-19_linux-x64_bin.tar.gz
[root@dbc-server-554 tomcat]# ll
total 196352
drwxr-xr-x 9 root root       220 Nov 16 13:34 apache-tomcat-8.5.84
-rw-r--r-- 1 root root  11141280 Nov 16 23:51 apache-tomcat-8.5.84.zip
-rw-r--r-- 1 root root      1339 Jan 17 15:24 create_tomcat_admin_user.sh
-rw-r--r-- 1 root root      1155 Jan 17 15:38 dockerfile
drwxr-xr-x 9 root root       136 Jan 17 11:50 jdk-19.0.1
-rw-r--r-- 1 root root 189905998 Oct 13 00:24 jdk-19_linux-x64_bin.tar.gz
-rw-r--r-- 1 root root       159 Jan 17 15:33 run.sh

10.1.2 编写dockerfile

[root@dbc-server-554 tomcat]# cat dockerfile
FROM sshd:dockerfile
#设置继承自用户创建的sshd镜像

MAINTAINER docker user (user@docker.com)
#下面是一些创建者的嘉本信息

#设置环境变屉,所有操作都是非交互式的
ENV DEBIAN FRONTEND noninteractive

RUN apt-get update && apt-get -y install tzdata
RUN echo "Asia/Shanghai">  /etc/timezone &&  \
 dpkg-reconfigure -f  noninteractive tzdata
#注意这里要更改系统的时区设置,因为在Web应用中经常会用到时区这个系统变量,默认ubuntu的设置会让你的应用程序发生不可思议的效果哦

#安装跟tomcat用户认证相关的软件
RUN apt-get install -yq --no-install-recommends wget pwgen ca-certificates && \
        apt-get clean && \
        rm  -rf /var/lib/apt/lists/*

#设置tomcat的环境变值,若读者有其他的环境变量需要设置,也可以在这里添加
ENV CATALINA_HOME /tomcat
ENV JAVA_HOME /jdk

#复制tomcat和jdk文件到镜像中
ADD apache-tomcat-8.5.84 /tomcat
ADD jdk-19.0.1 /jdk
ADD create_tomcat_admin_user.sh /create_tomcat_admin_user.sh
ADD run.sh /run.sh
RUN chmod +x  /*.sh
RUN chmod +x  /tomcat/bin/*.sh

EXPOSE 8080
CMD ["/run.sh"]

10.1.3 创建tomcat用户和密码脚本文件

创建tomcat用户和密码脚本文件create_tomcat_admin_user.sh文件,内容为:

[root@dbc-server-554 tomcat]# cat create_tomcat_admin_user.sh
#!/bin/bash
if [  -f  /.tomcat_admin_created]; then
        echo "Tomcat 'admin' user already created"
        exit 0
fi
#generate password
PASS=${TOMCAT_PASS:-$(pwgen -s  12  1)}
_word=$( [ ${TOMCAT_PASS} ]  &&  echo "preset" || echo "random")
echo"=>  Creating and  admin user with a  ${_word} password in  Tomcat"
sed -i  -r 's/<\/tomcat-users>//' ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-gui"/>'>> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-script"/>'>> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-jmx"/>'>>  ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="admin-gui"/>'>>  ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="admin-script"/>'>> ${CATALINA_HOME}/conf/tomcat-users.xml
echo "<user username=\"admin\" password=\"${PASS}\" roles=\"manager-gui,manager-script,manager-jmx,admin-gui,admin-script\"/>" >>${CATALINA_HOME}/conf/tomcat-users.xml
echo '</tomcat-users>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo"=>  Done!"
touch /.tomcat_admin_created
echo "================================================================================"
echo "You can  now  configureto this Tomcat server using:"
echo ""
echo "  admin:${PASS}"
echo ""
echo "================================================================================"

10.1.4 编写启动脚本

[root@dbc-server-554 tomcat]# cat run.sh
#!/bin/bash
if  [  !  -f  /.tomcat_admin_created ]; then
        /create_tomcat_admin_user.sh
fi
/usr/sbin/sshd -D  &
exec ${CATALINA_HOME}/bin/catalina.sh run

10.1.5 创建和测试镜像

[root@dbc-server-554 tomcat]# docker build -t tomcat8.5:jdk1.9 .
Sending build context to Docker daemon  550.1MB
Step 1/16 : FROM sshd:dockerfile
 ---> cae337d9b3f7
 ...
Successfully built 898f2593a0a9
Successfully tagged tomcat8.5:jdk1.9
[root@dbc-server-554 tomcat]# docker run -d -P tomcat8.5:jdk1.9
aaf7b89cf5c36ac2be1d708012459ed021aafff5420d241d38223a9993f5fb08
[root@dbc-server-554 tomcat]# docker ps
CONTAINER ID   IMAGE              COMMAND     CREATED         STATUS         PORTS                                                                                  NAMES
aaf7b89cf5c3   tomcat8.5:jdk1.9   "/run.sh"   4 seconds ago   Up 3 seconds   0.0.0.0:32833->22/tcp, :::32833->22/tcp, 0.0.0.0:32832->8080/tcp, :::32832->8080/tcp   pensive_agnesi
[root@dbc-server-554 tomcat]# docker logs aaf
/create_tomcat_admin_user.sh: line 2: [: missing `]'
/create_tomcat_admin_user.sh: line 9: echo=>  Creating and  admin user with a  random password in  Tomcat: command not found
/create_tomcat_admin_user.sh: line 18: echo=>  Done!: command not found
================================================================================
You can  now  configureto this Tomcat server using:

        admin:sLxgdZ11fa0I

================================================================================
...

docker logs我们获取到密码,进行登录即可
在这里插入图片描述

10.1.6 相关资源

Tomcat官网:http://tomcat.apache.org/
Tomcat官方仓库:https://github.com/apache/tomcat
Tomcat官方镜像:https://hub.docker.com/_/tomcat/
Tomcat官方镜像仓库:https://github.com/docker-library/tomcat

10.2 Jetty

Jetty是一个优秀的开源servlet容器,以其高效、小巧、可嵌入式等优点深得人心,它为基于Java的Web内容(如JSP和servlet)提供运行环境。Jetty基于Java语言编写,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供Web服务。与相对老牌的Tomcat比,Jetty架构更合理,性能更优。尤其在启动速度上,让Tomcat望尘莫及。Jetty目前在国内外互联网企业中应用广泛。

10.2.1 使用官方镜像

Docker Hub官方提供了Jetty镜像,直接运行docker [container] run指令即可:

[root@dbc-server-554 tomcat]# docker run -d jetty
Unable to find image 'jetty:latest' locally
latest: Pulling from library/jetty
...
a1012a570933: Pull complete
Digest: sha256:78d17c64b0b395fa86fdb1af5e070b98b7240fdb440beb17b7b1b083516d6881
Status: Downloaded newer image for jetty:latest
94db745896e9534b3a359f6f1da4d1abcab44369bfd5010e62b6ca967346f842
[root@dbc-server-554 tomcat]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS      NAMES
94db745896e9   jetty     "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   8080/tcp   amazing_albattani
[root@dbc-server-554 tomcat]# docker stop 94
94
[root@dbc-server-554 tomcat]# docker run -d -P jetty
ab34c4077724d2d413b3d9af1d79261a972b93c32e45b2a257dcd742f723869e
[root@dbc-server-554 tomcat]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                         NAMES
ab34c4077724   jetty     "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:32834->8080/tcp, :::32834->8080/tcp   tender_dhawan

访问网页:
在这里插入图片描述
使用宿主机的浏览器访问32834端口,即可获得Jetty运行页面,由于当前没有内容,会提示错误信息

10.2.2 相关资料

Jetty官网:http://www.eclipse.org/jetty/
Jetty官方仓库:https://github.com/eclipse/jetty.project
Jetty官方镜像:https://hub.docker.com/_/jetty/
Jetty官方镜像仓库:https://github.com/appropriate/docker-jetty

10.3 LAMP

LAMP (Linux-Apache-MySQL-PHP)是目前流行的Web工具栈,其中包括:Linux操作系统,Apache网络服务器,MySQL数据库,Perl、PHP或者Python编程语言。其组成工具均是成熟的开源软件,被大量网站所采用。和Java/J2EE架构相比,LAMP具有Web资源丰富、轻量、快速开发等特点;和微软的.NET架构相比,LAMP更具有通用、跨平台、高性能、低价格的优势。因此LAMP技术找得到了广泛的应用
注意:也有人用Nginx替换Apache,称为LNMP或LEMP,是十分类似的技术栈,并?不影响整个技术框架的选型原则

10.3.1 使用官方镜像

用户可以使用自定义Dockerfile或者Compose方式运行LAMP,同时社区也提供了十分成熟的镜像。
原书推荐的Iinode/lamptutum/lamp已7年未更新,所以此处使用较新的mattrayner/lamp
mattrayner/lamp docker hub链接

[root@dbc-server-554 tomcat]# docker search mattrayner/lamp
NAME              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mattrayner/lamp   A simple LAMP docker image running the prere…   328                  [OK]
[root@dbc-server-554 tomcat]# docker pull mattrayner/lamp:latest
[root@dbc-server-554 tomcat]# docker run -d -p 80:80 -p 33006:3306 mattrayner/lamp:latest
9ba77d1e0b8336fb2193281ae808157898b4190b3d13bea55f8f659ce75ed794
[root@dbc-server-554 tomcat]# docker ps
CONTAINER ID   IMAGE                    COMMAND     CREATED         STATUS         PORTS                                                                            NAMES
9ba77d1e0b83   mattrayner/lamp:latest   "/run.sh"   3 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:33006->3306/tcp, :::33006->3306/tcp   strange_galileo

在这里插入图片描述
后续可以部署自己的项目

10.4 持续开发与管理

信息行业日新月异,如何响应不断变化的需求,快速适应和保证软件的质量?持续集成( Continuous Integration , CI)正是针对解决这类问题的一种开发实践,它倡导开发团队定期进行集成验证。集成通过自动化的构建来完成,包括自动编译、发布和测试,从而尽快地发现错误。
持续集成的特点包括:

  • 鼓励自动化的周期性的过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,减少人工干预;
  • 需要有持续集成系统的支持,包括代码托管机制支持,以及集成服务器等

持续交付(Continuous Delivery, CD)则是经典的敏捷软件开发方法的自然延伸,它强调产品在修改后到部署上线的流程要敏捷化、自动化。甚至一些较小的改变也要尽早地部署上线,这与传统软件在较大版本更新后才上线的思路不同

10.4.1 Jenkins及官方镜像

Jenkins是一个得到广泛应用的持续集成和持续交付的工具。作为开源软件项目,它旨在提供一个开放易用的持续集成平台。Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,并用图表的形式形象地展示项目构建的趋势和稳定性。Jenkins特点包括安装配置简单、支持详细的测试报表、分布式构建等。

Jenkis自2.0版本推出了“Pipelineas Code”,帮助Jenkins实现对CI和CD更好的支持。通过Pipeline,将原本独立运行的多个任务连接起来,可以实现十分复杂的发布流程

Jenkins官方在Docker Hub上提供了全功能的基于官方发布版的Docker镜像。可以方便地使用docker [container] run指令一键部署Jenkins服务:

$docker run -p 8080:8080 -p 50000:50000 jenkins 
Running from: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get(”JENKINS_ HOME") Jun 07, 2016 8  :14:26 AM winstone Logger loginternal INFO: Begi口ningextraction from war file 

Jenkins容器启动成功后,可以打开浏览器访问8080端口,查看Jenkins管理界面
在这里插入图片描述
目前运行的容器中,数据会存储在工作目录/var/jenkins_home中,这包括Jenkins中所有的数据,如插件和配置信息等。如果需要数据持久化,读者可以使用数据卷机制

docker run -p 8080:8080 -p 50000:50000 -v /your/home:/var/jenkins_home jenkins

以上指令会将Jenkins数据存储于宿主机的/your/home目录(需要确保/your/home目录对于容器内的Jenkins用户是可访问的)下。当然也可以使用数据卷容器:

docker run --name myjenkins - p 8080:8080 -p 50000:50000 -v /var/jenkins_home jenkins 

关于更多的jenkins配置及使用,笔者会在后续推出的专栏中详细介绍

10.4.2 Gitlab及其官方镜像

GitLab是一款非常强大的开源源码管理系统。它支持基于Git的源码管理、代码评审、issue跟踪、活动管理、wiki页面、持续集成和测试等功能。基于GitLab,用户可以自己搭建一套类似于Github的开发协同平台。
GitLab官方提供了社区版本(GitLab CE)的DockerHub镜像,可以直接使用docker run指令运行:

docker run --detach \
	--hostname gitlab.example com \ 
	--publish443:443 publish 80:80 --publish 23:23 \
	--name gitlab \
	--restart always \
	--volume /srv/gitlab/config:/etc/gitlab \
	--volume /srv/gitlab/logs:/var/log/gi t lab \
	--volume /srv/gitlab/data:/var/opt/gitlab\ 
	gitlab/gitlab-ce:latest 

成功运行镜像后,可以打开浏览器访问GitLab服务管理界面

10.4.3 相关资料

Jenkins官网:https://jenkins.io/
Jenkins官方仓库:https://github.com/jenkinsci/jenkins/
Jenkins官方镜像:https://hub.docker.com/jenkinsci/jenkins/
Jenkins官方镜像仓库:https://github.com/jenkinsci/docker
GitLab官网:https://github.com/gitlabhq/gitlabhq
GitLab官方镜像:https://hub.docker.com/r/gitlab/gitlab-ce/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[前端笔记——HTML介绍] 5.文档与网站架构

[前端笔记——HTML介绍] 5.文档与网站架构1.文档的基本组成部分&#xff08;1&#xff09;页眉&#xff08;2&#xff09;导航栏&#xff08;3&#xff09;主内容&#xff08;4&#xff09;侧边栏&#xff08;5&#xff09;页脚2.用于构建内容的HTML3.HTML布局元素细节3.1无语义…

205:vue+openlayer: 点击某feature,列表滑动,定位到相应的点的列表位置

第205个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers做一个互动,点击某个feature,在左侧的列表中显示出来,滚动条滑动,能显示在视觉区内。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其…

HTB打靶(Active Directory 101 Resolute)

nmap扫描 nmap -A -T4 10.10.10.169 Starting Nmap 7.93 ( https://nmap.org ) at 2023-01-16 01:30 EST Stats: 0:00:04 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan SYN Stealth Scan Timing: About 74.65% done; ETC: 01:30 (0:00:01 remaining) St…

Maven学习(一):Maven简介及安装配置

Maven简介及安装配置一、Maven简介1.1、Maven是什么1.2、Maven的作用二、Maven安装配置2.1、大前提2.2、Maven下载2.3、windows版1、安装2、配置环境3、配置本地仓库2.4、mac版1、安装2、配置环境3、需要注意的点4、配置本地仓库一、Maven简介 1.1、Maven是什么 先对Maven做一…

从 Spectral Clustring 推导到 Regularized Diffusion Process

Spectral Clustring 参考&#xff1a;bilibili 机器学习-白板推导系列(二十二)-谱聚类&#xff08;Spectral Clustering&#xff09; Background 首先看一种数据分布&#xff1a; 对于以上分布的数据&#xff0c;可以直接利用K−meansK-meansK−means或者GMM&#xff08;高…

2、linux_CentOS_6_64位常用命令远程操作--yum云用不了_建议学习Ubuntu

Linux的概述 学习Linux之前先了解Unix Unix是一个强大的多用户、多任务操作系统。于1969年在AT&T的贝尔实验室开发。UNIX的商标权由国际开放标准组织&#xff08;The Open Group&#xff09;所拥有。UNIX操作系统是商业版&#xff0c;需要收费&#xff0c;价格比Microsof…

洞悉获客之道,林肯汽车开展高端社区精准营销俘获消费者芳心

一、出场即焦点 全新领航员诠释顶级美式豪华“强大的外部气场&#xff0c;肌肉与优雅完美结合”&#xff0c;一直以来&#xff0c;美式豪华汽车以沉稳、古典的高端奢华气质演绎“出场即焦点”的恢弘气场&#xff0c;吸引着无数精英人士为之着迷、追捧。2022 年&#xff0c;林肯…

C/C++宏定义注意事项

宏定义后不能加“&#xff1b;”&#xff0c;如果想查找宏可能带来的bug,可以增加编译选项&#xff1a;/P&#xff0c;然后选择仅编译&#xff0c; 这时会生成*.i的文件&#xff0c;打开后可以看到编译器替换宏以后的实际内容&#xff0c;然后再去查看相关的替换有没有错误。带…

夏普MX-M2658N复印机显示请放入载体组件

故障描述: 一台夏普MX-M2658N复印机一开机就显示请放入载体组件,重新再次开机有可能不显示但是复印或打印的时候一定会卡纸,卡纸有时候卡在硒鼓附近或者加热组件的位置; 故障处理: 1、碳粉质量差; 2

fiddler的自动响应器_小实验

目录 一、小实验介绍 二、fiddler的自动响应器的应用 1.找对自动响应器的位置&#xff0c;添加规则 2.编辑规则&#xff0c;将这个请求用fiddler的内置响应&#xff1b; 3.编辑规则&#xff0c;将这个请求重定向到本地资源&#xff1b; 4.编辑响应 一、小实验介绍 承接上…

【自学Docker 】Docker ps命令

Docker ps命令 大纲 Docker ps命令概述 docker ps 命令可以用来列出 Docker容器 相关信息。 Docker ps命令语法 haicoder(www.haicoder.net)# docker ps [OPTIONS]Docker ps命令参数 选项说明无参默认显示正在运行的容器。-a显示所有的容器&#xff0c;包括未运行的。-f根…

[HCTF 2018]admin (三种解法详细详解)

目录 信息收集 思路一&#xff1a;弱口令爆破 思路2&#xff1a;垂直越权 代码审计 Unicode欺骗 Unicode 简介 伪造flask session 信息收集 注册登录 然后查看源码 <!-- you are not admin --> 看来需要伪造admin的身份 在changepassword页面查看源代码 <!-…

C++ 语法基础课8 —— STL/位运算和常用库函数

文章目录STL1. #include\<vector>(尾部增删)(1) 声明(2) size/empty(3) clear(4) 迭代器(iterator)(5) begin/end(遍历)(6) front/back(7) push_back()/pop_back()2. #include\<queue>(队列先进先出)(1) 声明(2) 循环队列 queue(队列结构)(3) 优先队列 priority_qu…

基于Python分析气象数据教程-1

前言本笔记介绍了如何使用 Python、pandas 和 SciPy 对天气数据进行基本分析。 它不包含对气象科学的贡献&#xff0c;但说明了如何生成简单的图和基本模型来拟合一些真实的物理观测。一、相关库引入import numpy import scipy.stats import pandas import matplotlib.pyplot a…

【零基础】学python数据结构与算法笔记13-贪心算法

文章目录前言80.贪心算法&#xff08;新一章&#xff1a;算法进阶&#xff09;81.分数背包82.分数背包实现83.数字拼接问题84.数字拼接问题实现85.活动选择问题86.活动选择问题实现87.贪心算法总结总结前言 学习python数据结构与算法&#xff0c;学习常用的算法&#xff0c; b…

LeetCode(Array)1656. Design an Ordered Stream

1. 问题 There is a stream of n (idKey, value) pairs arriving in an arbitrary order, where idKey is an integer between 1 and n and value is a string. No two pairs have the same id. Design a stream that returns the values in increasing order of their IDs b…

2023年网络安全比赛--网页渗透测试中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.访问服务器网站目录1,根据页面信息完成条件,将页面中的flag提交; 2.访问服务器网站目录2,根据页面信息完成条件,将页面中的flag提交; 3.访问服务器网站目录3,根据页面信息完成条件,将页面中的flag提交; 4.访问服务器网…

【Java】流式编程学习笔记

文章目录一、流简介二、创建流2.1 由值创建流&#xff1a;of2.2 由列表创建流&#xff1a;stream2.3 由 Builder 创建流&#xff1a;build2.4 由文件生成流&#xff1a;lines2.5 由函数生成流2.5.1 迭代&#xff08;如果不做限制&#xff0c;就是创建无限流&#xff09;&#x…

线性结构之单链表详解

文章目录前言一.单链表的结构体二、单链表的基本接口1.SListMalloc&#xff08;申请节点&#xff09;2.SListPushBack&#xff08;尾插&#xff09;3.SListPushFront&#xff08;头插&#xff09;4.SListPopBack&#xff08;尾删&#xff09;5.SListPopFront&#xff08;头删&a…

0115 作用域,对象

作用域意义&#xff1a;一段代码中所用到的名字不总是有效可用的&#xff0c;限定这个名字的可用性代码范围全局作用域全局有效&#xff0c;作用所有代码局部作用域局部有效&#xff0c;作用于函数内的代码环境&#xff0c;和函数有关也称函数作用域块级作用域在大括号{}有效&a…