SlideShare a Scribd company logo
1 of 36
Download to read offline
EUROPE'S LEADING AEM DEVELOPER CONFERENCE
25TH – 27TH SEPTEMBER 2023
Sling Applications - a DevOps perspective
Robert Munteanu, Adobe
About me
2
Outline
Define
Deploy
Monitor
Maintain
3
[Define] OSGi Feature Model
{
"bundles":[
{
"id":"org.owasp.encoder:encoder:1.2.3",
"start-order":"5"
},
{
"id":"commons-codec:commons-codec:1.16.0",
"start-order":"5"
}
]
}
4
[Define] Maven tooling
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for pospai 1.0-SNAPSHOT:
[INFO]
[INFO] pospai ............................................. SUCCESS [ 0.157 s]
[INFO] pospai - Core ...................................... SUCCESS [ 2.074 s]
[INFO] pospai - UI Users .................................. SUCCESS [ 0.446 s]
[INFO] pospai - UI Apps ................................... SUCCESS [ 0.088 s]
[INFO] pospai - Launcher .................................. SUCCESS [ 1.819 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
5
[Define] Reference blueprints
<aggregate>
<filesInclude>*.json</filesInclude>
<includeArtifact>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.starter</artifactId>
<version>12</version>
</includeArtifact>
</aggregate>
Compact
Low-effort start of upgrade
Lifecycle tied to upstream release
Opaque
All or-nothing for certain features
6
[Define] Replicate blueprints
src/main/features/
├── app
│ ├── pospai.json
│ └── pospai-repoinit.txt
└── platform
├── base.json
├── base-repoinit.txt
├── boot.json
├── caconfig.json
└── caconfig-repoinit.txt
(snip)
Fine-grained control, incremental updates possible
More effort in keeping up-to-date
7
[Define] Secrets management
"org.apache.sling.extensions.oidc_rp.impl.OidcConnectionImpl~google": {
"name": "google",
"baseUrl": "https://accounts.google.com",
"clientId": "$[secret:google/clientId]",
"clientSecret": "$[secret:google/clientSecret]",
"scopes": ["openid"]
}
8
[Build] Application assembly
<plugin>
<groupId>org.apache.sling</groupId>
<artifactId>slingfeature-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<aggregates>
<aggregate>
<classifier>app</classifier>
<filesInclude>platform/**/*.json</filesInclude>
<filesInclude>app/*.json</filesInclude>
</aggregate>
</aggregates>
<!-- snip -->
</configuration>
</plugin>
9
[Build] Application analysis
<plugin>
<groupId>org.apache.sling</groupId>
<artifactId>slingfeature-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<scans>
<scan>
<includeClassifier>app</includeClassifier>
</scan>
</scans>
<!-- snip -->
</configuration>
</plugin>
10
[Build] Smoke ITs
<plugin>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<!-- snip -->
<run>
<ports>http.port:8080</ports>
<wait>
<http>
<url>http://localhost:${http.port}↳
/system/health.txt?tags=startup</url>
<status>200</status>
</http>
</wait>
</run>
</configuration>
</plugin>
11
[Build] Health checks
"configurations": {
"org.apache.felix.hc.generalchecks.BundlesStartedCheck": {
"hc.tags": ["startup"], "useCriticalForInactive": true
},
"org.apache.sling.jcr.contentloader.hc.BundleContentLoadedCheck": {
"hc.tags": ["startup"],
},
"org.apache.felix.hc.generalchecks.FrameworkStartCheck": {
"hc.tags": ["startup"], "targetStartLevel:Integer":"30"
},
"org.apache.felix.hc.generalchecks.ServicesCheck": {
"hc.tags": ["startup"],
"services.list": [
"org.apache.sling.jcr.api.SlingRepository"
]
}
}
12
[Build] Security checks (Maven)
$ mvn org.sonatype.ossindex.maven:ossindex-maven-plugin:audit
[ERROR] Failed to execute goal ossindex-maven-plugin:audit (default-cli)
on project org.apache.sling.starter: Detected 1 vulnerable components:
[ERROR] xerces:xercesImpl:jar:2.6.2:test;
https://ossindex.sonatype.org/(...)
[ERROR] * [CVE-2009-2625] CWE-400: ('Resource Exhaustion') (5.0);
https://ossindex.sonatype.org/(...)
[ERROR] * [CVE-2012-0881] CWE-399 (7.5);
https://ossindex.sonatype.org/(...)
[ERROR] * [CVE-2013-4002] CWE-400: ('Resource Exhaustion') (7.1);
https://ossindex.sonatype.org/(...)
[ERROR] * [CVE-2022-23437] CWE-835: ('Infinite Loop') (6.5);
https://ossindex.sonatype.org/(...)
[ERROR] * [CVE-2017-10355] CWE-833: Deadlock (5.9);
https://ossindex.sonatype.org/(...)
13
[Build ] Security checks (Container)
$ trivy image --severity HIGH,CRITICAL sample/app:snapshot
sample/app:snapshot (debian 11.3)
Total: 46 (HIGH: 36, CRITICAL: 10)
┌──────────────┬────────────────┬──────────┬─────────────────────┬───────────────────┬──────────────────────────────────────────────────────────────┐
│ Library │ Vulnerability │ Status │ Installed Version │ Fixed Version │ Title │
├──────────────┼────────────────┼──────────┼─────────────────────┼───────────────────┼──────────────────────────────────────────────────────────────┤
│ bash │ CVE-2022-3715 │ affected │ 5.1-2+b3 │ │ a heap-buffer-overflow in valid_parameter_transform │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-3715 │
├──────────────┼────────────────┼──────────┼─────────────────────┼───────────────────┼──────────────────────────────────────────────────────────────┤
│ dpkg │ CVE-2022-1664 │ fixed │ 1.20.9 │ 1.20.10 │ Dpkg::Source::Archive in dpkg, the Debian package management │
│ │ │ │ │ │ system, b ... │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-1664 │
└──────────────┴────────────────┴──────────┴─────────────────────┴───────────────────┴──────────────────────────────────────────────────────────────┘
# (snip)
Java (jar)
Total: 1 (HIGH: 1, CRITICAL: 0)
┌─────────────────────────────────────────┬───────────────┬────────┬───────────────────┬───────────────┬───────────────────────────────────────────┐
│ Library │ Vulnerability │ Status │ Installed Version │ Fixed Version │ Title │
├─────────────────────────────────────────┼───────────────┼────────┼───────────────────┼───────────────┼───────────────────────────────────────────┤
│ com.google.guava:guava (guava-15.0.jar) │ CVE-2023-2976 │ fixed │ 15.0 │ 32.0.0 │ insecure temporary directory creation │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-2976 │
└─────────────────────────────────────────┴───────────────┴────────┴───────────────────┴───────────────┴───────────────────────────────────────────┘
14
[Deploy] RPM packaging
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>rpm-maven-plugin</artifactId>
<configuration>
<name>pospai</name>
<mappings>
<mapping>
<directory>/usr/share/pospai/lib</directory>
<dependency/>
</mapping>
<mapping>
<directory>/usr/share/pospai/repo</directory>
<sources>
<source>
<location>../launcher/target/repository</location>
</source>
</sources>
</mapping>
</mappings>
</configuration>
</plugin> 15
[Deploy] Container image
FROM docker.io/apache/sling:snapshot AS starter
FROM docker.io/eclipse-temurin:17
ENV EXTRA_JAVA_OPTS="-Dorg.apache.felix.configadmin.plugin.interpolation.secretsdir=/etc/pospai/secrets"
EXPOSE 8080
RUN groupadd --system sling && 
useradd --no-log-init --system --gid sling sling && 
mkdir /opt/sling && 
mkdir /opt/sling/bin && 
mkdir /opt/sling/org.apache.sling.feature.launcher && 
mkdir /opt/sling/launcher && 
mkdir /opt/sling/artifacts && 
mkdir /opt/sling/agents && 
chown -R sling:sling /opt/sling/launcher
VOLUME /opt/sling/launcher
# continued on the next slide
16
[Deploy] Container image (2)
# continued from the next slide
COPY --from=starter /opt/sling/bin /opt/sling/bin
COPY target/dependency/org.apache.sling.feature.launcher /opt/sling/org.apache.sling.feature.launcher
COPY target/artifacts/ /opt/sling/artifacts/
# ensure all files are readable by the sling user
# for some reason some jar files are 0600 while most are 0644
RUN find /opt/sling/artifacts -type f -perm 0600 | xargs --no-run-if-empty chmod 0644
USER sling:sling
WORKDIR /opt/sling
ENTRYPOINT [ "/opt/sling/bin/launch.sh" ]
CMD ["oak_tar"]
17
[Deploy] Kubernetes
$ flux tree ks app-pospai
Kustomization/flux-system/app-pospai
├── Namespace/app-pospai
├── Secret/app-pospai/docker.io
├── Service/app-pospai/pospai
├── Deployment/app-pospai/pospai
├── PersistentVolumeClaim/app-pospai/pospai-data
└── Ingress/app-pospai/ingress
18
[Deploy] Kubernetes scaling
$ kubectl get pvc
NAME STATUS CAPACITY ACCESS MODES
pospai-data Bound 1Gi RWO
$ kubectl get deploy pospai -o json | jq '.spec.replicas'
1
$ kubectl get deploy pospai -o json | jq ' .spec.strategy.type'
"Recreate"
19
[Monitor] Logging
{
"configurations":{
"org.apache.sling.commons.log.LogManager":{
"org.apache.sling.commons.log.file":""
}
}
}
20
[Monitor] Logging
21
[Monitor] Metrics
{
"bundles": [
{
"id": "org.apache.sling/org.apache.sling.commons.metrics.prometheus/1.0",
"start-order": 20
}
]
}
$ curl --silent http://localhost:8080/metrics | grep -E '^(sling|oak|jvm)' | wc -l
486
22
[Monitor] Oak performance metrics
oak_QUERY_DURATION / oak_QUERY_DURATION_index...
oak_COMMIT_QUEUE_SIZE
oak_INDEX_SIZE(...)
oak_SESSION_COUNT
23
[Monitor] Oak availability metrics
oak_LOGIN_ERRORS_total
oak_LOCAL_INDEX_DIR_SIZE
oak_SEGMENT_REPO_SIZE
24
[Monitor] Sling performance metrics
sling_commons_scheduler_running_jobs
sling_org_apache_sling_resourceresolver_numberOfVanityPaths
sling_org_apache_sling_resourceresolver_numberOfAliases
25
[Monitor] Sling availability metrics
sling_discovery_oak_local_cluster_instances
sling_event_jobs_failed_count
sling_org_apache_sling_resourceresolver_unclosedResourceResolvers
26
[Monitor] Metrics
27
[Monitor] Metrics
28
[Monitor] Alerting
29
[Monitor] Tracing
30
[Maintain ] Renovate PR - message
31
[Maintain ] Renovate PR - message
32
[Maintain ] Renovate Config - apps
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [ "config:base", "regexManagers:mavenPropertyVersions" ],
"packageRules": [
{
"matchPackagePrefixes": [ "org.apache.jackrabbit:" ],
"groupName": "Apache Jackrabbit and Jackrabbit Oak",
"allowedVersions": "/^[0-9]+.[0-9]*[02468]+.[0-9]+$/"
},
{
"matchPackagePatterns": [ "guava" ],
"enabled": false
}
]
}
33
[Maintain ] Renovate Config - bundles
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [ "config:base" ],
"packageRules": [
{
"matchManagers": [
"maven"
],
"matchDepTypes": [
"provided"
],
"enabled": false
}
]
}
34
Demo
Demo
Demo
Demo
Demo
35
Resources
https://github.com/apache/sling-org-apache-sling-commons-metrics-prometheus/
https://github.com/renovatebot/renovate/
https://github.com/apache/sling-project-archetype/pull/12
https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/9469
https://github.com/rombert/pospai
36

More Related Content

Similar to Sling Applications - A DevOps perspective

containerit at useR!2017 conference, Brussels
containerit at useR!2017 conference, Brusselscontainerit at useR!2017 conference, Brussels
containerit at useR!2017 conference, Brussels
Daniel Nüst
 
Android Boot Time Optimization
Android Boot Time OptimizationAndroid Boot Time Optimization
Android Boot Time Optimization
Kan-Ru Chen
 
Virtualization and automation of library software/machines + Puppet
Virtualization and automation of library software/machines + PuppetVirtualization and automation of library software/machines + Puppet
Virtualization and automation of library software/machines + Puppet
Omar Reygaert
 

Similar to Sling Applications - A DevOps perspective (20)

containerit at useR!2017 conference, Brussels
containerit at useR!2017 conference, Brusselscontainerit at useR!2017 conference, Brussels
containerit at useR!2017 conference, Brussels
 
[Hands-on 필수 준비 사항] 쇼핑몰 예제를 통한 Microservice 개발/배포 실습 - 황주필 부장 / 강인호 부장, 한국오라클
[Hands-on 필수 준비 사항] 쇼핑몰 예제를 통한 Microservice 개발/배포 실습 - 황주필 부장 / 강인호 부장, 한국오라클[Hands-on 필수 준비 사항] 쇼핑몰 예제를 통한 Microservice 개발/배포 실습 - 황주필 부장 / 강인호 부장, 한국오라클
[Hands-on 필수 준비 사항] 쇼핑몰 예제를 통한 Microservice 개발/배포 실습 - 황주필 부장 / 강인호 부장, 한국오라클
 
Docker, c'est bonheur !
Docker, c'est bonheur !Docker, c'est bonheur !
Docker, c'est bonheur !
 
Scaling Docker Containers using Kubernetes and Azure Container Service
Scaling Docker Containers using Kubernetes and Azure Container ServiceScaling Docker Containers using Kubernetes and Azure Container Service
Scaling Docker Containers using Kubernetes and Azure Container Service
 
Kubernetes laravel and kubernetes
Kubernetes   laravel and kubernetesKubernetes   laravel and kubernetes
Kubernetes laravel and kubernetes
 
OpenSCAP Overview(security scanning for docker image and container)
OpenSCAP Overview(security scanning for docker image and container)OpenSCAP Overview(security scanning for docker image and container)
OpenSCAP Overview(security scanning for docker image and container)
 
Start tracking your ruby infrastructure
Start tracking your ruby infrastructureStart tracking your ruby infrastructure
Start tracking your ruby infrastructure
 
Real World Experience of Running Docker in Development and Production
Real World Experience of Running Docker in Development and ProductionReal World Experience of Running Docker in Development and Production
Real World Experience of Running Docker in Development and Production
 
kubernetes practice
kubernetes practicekubernetes practice
kubernetes practice
 
k8s practice 2023.pptx
k8s practice 2023.pptxk8s practice 2023.pptx
k8s practice 2023.pptx
 
DCEU 18: Tips and Tricks of the Docker Captains
DCEU 18: Tips and Tricks of the Docker CaptainsDCEU 18: Tips and Tricks of the Docker Captains
DCEU 18: Tips and Tricks of the Docker Captains
 
Android Boot Time Optimization
Android Boot Time OptimizationAndroid Boot Time Optimization
Android Boot Time Optimization
 
Introduction to docker
Introduction to dockerIntroduction to docker
Introduction to docker
 
How to create your own hack environment
How to create your own hack environmentHow to create your own hack environment
How to create your own hack environment
 
Containers with systemd-nspawn
Containers with systemd-nspawnContainers with systemd-nspawn
Containers with systemd-nspawn
 
Docker practice
Docker practiceDocker practice
Docker practice
 
Attacking IoT Devices from a Web Perspective - Linux Day
Attacking IoT Devices from a Web Perspective - Linux Day Attacking IoT Devices from a Web Perspective - Linux Day
Attacking IoT Devices from a Web Perspective - Linux Day
 
9 creating cent_os 7_mages_for_dpdk_training
9 creating cent_os 7_mages_for_dpdk_training9 creating cent_os 7_mages_for_dpdk_training
9 creating cent_os 7_mages_for_dpdk_training
 
Upgrade Ubuntu 18.04 Security with Secureboot
Upgrade Ubuntu 18.04 Security with SecurebootUpgrade Ubuntu 18.04 Security with Secureboot
Upgrade Ubuntu 18.04 Security with Secureboot
 
Virtualization and automation of library software/machines + Puppet
Virtualization and automation of library software/machines + PuppetVirtualization and automation of library software/machines + Puppet
Virtualization and automation of library software/machines + Puppet
 

More from Robert Munteanu

More from Robert Munteanu (20)

Secure by Default Web Applications
Secure by Default Web ApplicationsSecure by Default Web Applications
Secure by Default Web Applications
 
Will it blend? Java agents and OSGi
Will it blend? Java agents and OSGiWill it blend? Java agents and OSGi
Will it blend? Java agents and OSGi
 
Escape the defaults - Configure Sling like AEM as a Cloud Service
Escape the defaults - Configure Sling like AEM as a Cloud ServiceEscape the defaults - Configure Sling like AEM as a Cloud Service
Escape the defaults - Configure Sling like AEM as a Cloud Service
 
Crash course in Kubernetes monitoring
Crash course in Kubernetes monitoringCrash course in Kubernetes monitoring
Crash course in Kubernetes monitoring
 
Java agents for fun and (not so much) profit
Java agents for fun and (not so much) profitJava agents for fun and (not so much) profit
Java agents for fun and (not so much) profit
 
Will it blend? Java agents and OSGi
Will it blend? Java agents and OSGiWill it blend? Java agents and OSGi
Will it blend? Java agents and OSGi
 
Cloud-native legacy applications
Cloud-native legacy applicationsCloud-native legacy applications
Cloud-native legacy applications
 
Cloud-Native Sling
Cloud-Native SlingCloud-Native Sling
Cloud-Native Sling
 
From Monolith to Modules - breaking apart a one size fits all product into mo...
From Monolith to Modules - breaking apart a one size fits all product into mo...From Monolith to Modules - breaking apart a one size fits all product into mo...
From Monolith to Modules - breaking apart a one size fits all product into mo...
 
What's new in the Sling developer tooling?
What's new in the Sling developer tooling?What's new in the Sling developer tooling?
What's new in the Sling developer tooling?
 
Scaling up development of a modular code base
Scaling up development of a modular code baseScaling up development of a modular code base
Scaling up development of a modular code base
 
Scaling up development of a modular code base
Scaling up development of a modular code baseScaling up development of a modular code base
Scaling up development of a modular code base
 
Scaling up development of a modular code base
Scaling up development of a modular code baseScaling up development of a modular code base
Scaling up development of a modular code base
 
Zero downtime deployments for Sling application using Docker
Zero downtime deployments for Sling application using DockerZero downtime deployments for Sling application using Docker
Zero downtime deployments for Sling application using Docker
 
Scaling up development of a modular code base
Scaling up development of a modular code baseScaling up development of a modular code base
Scaling up development of a modular code base
 
Do you really want to go fully micro?
Do you really want to go fully micro?Do you really want to go fully micro?
Do you really want to go fully micro?
 
Effective web application development with Apache Sling
Effective web application development with Apache SlingEffective web application development with Apache Sling
Effective web application development with Apache Sling
 
Of microservices and microservices
Of microservices and microservicesOf microservices and microservices
Of microservices and microservices
 
Slide IDE Tooling (adaptTo 2016)
Slide IDE Tooling (adaptTo 2016)Slide IDE Tooling (adaptTo 2016)
Slide IDE Tooling (adaptTo 2016)
 
Secure by Default Web Applications with Apache Sling
Secure by Default Web Applications with Apache SlingSecure by Default Web Applications with Apache Sling
Secure by Default Web Applications with Apache Sling
 

Recently uploaded

Recently uploaded (20)

Abortion Clinic In Polokwane ](+27832195400*)[ 🏥 Safe Abortion Pills in Polok...
Abortion Clinic In Polokwane ](+27832195400*)[ 🏥 Safe Abortion Pills in Polok...Abortion Clinic In Polokwane ](+27832195400*)[ 🏥 Safe Abortion Pills in Polok...
Abortion Clinic In Polokwane ](+27832195400*)[ 🏥 Safe Abortion Pills in Polok...
 
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
 
Sinoville Clinic ](+27832195400*)[🏥Abortion Pill Prices Sinoville ● Women's A...
Sinoville Clinic ](+27832195400*)[🏥Abortion Pill Prices Sinoville ● Women's A...Sinoville Clinic ](+27832195400*)[🏥Abortion Pill Prices Sinoville ● Women's A...
Sinoville Clinic ](+27832195400*)[🏥Abortion Pill Prices Sinoville ● Women's A...
 
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-CloudAlluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
 
OpenChain @ LF Japan Executive Briefing - May 2024
OpenChain @ LF Japan Executive Briefing - May 2024OpenChain @ LF Japan Executive Briefing - May 2024
OpenChain @ LF Japan Executive Briefing - May 2024
 
Secure Software Ecosystem Teqnation 2024
Secure Software Ecosystem Teqnation 2024Secure Software Ecosystem Teqnation 2024
Secure Software Ecosystem Teqnation 2024
 
How to install and activate eGrabber JobGrabber
How to install and activate eGrabber JobGrabberHow to install and activate eGrabber JobGrabber
How to install and activate eGrabber JobGrabber
 
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit MilanWorkshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
 
Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...
Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...
Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...
 
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCAOpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
 
Abortion Clinic In Springs ](+27832195400*)[ 🏥 Safe Abortion Pills in Springs...
Abortion Clinic In Springs ](+27832195400*)[ 🏥 Safe Abortion Pills in Springs...Abortion Clinic In Springs ](+27832195400*)[ 🏥 Safe Abortion Pills in Springs...
Abortion Clinic In Springs ](+27832195400*)[ 🏥 Safe Abortion Pills in Springs...
 
^Clinic ^%[+27788225528*Abortion Pills For Sale In birch acres
^Clinic ^%[+27788225528*Abortion Pills For Sale In birch acres^Clinic ^%[+27788225528*Abortion Pills For Sale In birch acres
^Clinic ^%[+27788225528*Abortion Pills For Sale In birch acres
 
Weeding your micro service landscape.pdf
Weeding your micro service landscape.pdfWeeding your micro service landscape.pdf
Weeding your micro service landscape.pdf
 
Abortion Clinic Pretoria ](+27832195400*)[ Abortion Clinic Near Me ● Abortion...
Abortion Clinic Pretoria ](+27832195400*)[ Abortion Clinic Near Me ● Abortion...Abortion Clinic Pretoria ](+27832195400*)[ Abortion Clinic Near Me ● Abortion...
Abortion Clinic Pretoria ](+27832195400*)[ Abortion Clinic Near Me ● Abortion...
 
Prompt Engineering - an Art, a Science, or your next Job Title?
Prompt Engineering - an Art, a Science, or your next Job Title?Prompt Engineering - an Art, a Science, or your next Job Title?
Prompt Engineering - an Art, a Science, or your next Job Title?
 
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
 
What is a Recruitment Management Software?
What is a Recruitment Management Software?What is a Recruitment Management Software?
What is a Recruitment Management Software?
 
Optimizing Operations by Aligning Resources with Strategic Objectives Using O...
Optimizing Operations by Aligning Resources with Strategic Objectives Using O...Optimizing Operations by Aligning Resources with Strategic Objectives Using O...
Optimizing Operations by Aligning Resources with Strategic Objectives Using O...
 
Transformer Neural Network Use Cases with Links
Transformer Neural Network Use Cases with LinksTransformer Neural Network Use Cases with Links
Transformer Neural Network Use Cases with Links
 
Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024
 

Sling Applications - A DevOps perspective