This is an automated email from the ASF dual-hosted git repository.

davekj pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git


The following commit(s) were added to refs/heads/main by this push:
     new 74aa38de89d Add Books page (#586)
74aa38de89d is described below

commit 74aa38de89d7ae29b312accf8de97d91aec93be8
Author: Kiryl Valkovich <visorte...@gmail.com>
AuthorDate: Fri May 26 01:35:25 2023 +0300

    Add Books page (#586)
    
    * Implement /books page
    
    * Only books page for today
    
    * Minor fixes
    
    * Minor fixes
    
    * Minor fixes
    
    * Add one more book
---
 data/books.tsx                                     |  95 +++++++++++++++++++++
 docusaurus.config.js                               |   6 +-
 .../pages/BooksPage/BooksPage.module.css           |   9 ++
 src/components/pages/BooksPage/BooksPage.tsx       |  36 ++++++++
 .../pages/BooksPage/Cards/Cards.module.css         |  31 +++++++
 src/components/pages/BooksPage/Cards/Cards.tsx     |  34 ++++++++
 src/pages/books.tsx                                |   4 +
 .../books/building-event-driven-microservices.jpg  | Bin 0 -> 82952 bytes
 .../designing-data-intensive-applications.jpg      | Bin 0 -> 217490 bytes
 static/img/books/mastering-apache-pulsar.jpg       | Bin 0 -> 105297 bytes
 .../books/practical-event-driven-microservices.jpg | Bin 0 -> 152478 bytes
 static/img/books/pulsar-in-action.jpg              | Bin 0 -> 560863 bytes
 12 files changed, 214 insertions(+), 1 deletion(-)

diff --git a/data/books.tsx b/data/books.tsx
new file mode 100644
index 00000000000..b02591a0bc0
--- /dev/null
+++ b/data/books.tsx
@@ -0,0 +1,95 @@
+import React from "react";
+
+export const categories = [
+  'pulsar',
+  'related_topics'
+] as const;
+export type Category = typeof categories[number];
+
+export const categoryLabels: Record<Category, string> = {
+  pulsar: 'About Pulsar',
+  related_topics: 'About related subjects'
+};
+
+export type Resource = {
+  name: string;
+  author: string;
+  publisher: string;
+  link: string;
+  cover_image: string;
+  released_at: string;
+  description: React.ReactNode;
+};
+
+export const resources: Record<Category, Resource[]> =
+{
+  pulsar: [
+    {
+      name: 'Apache Pulsar in Action ',
+      author: 'David Kjerrumgaard',
+      cover_image: '/img/books/pulsar-in-action.jpg',
+      description: (
+        <span>
+          Apache Pulsar in Action is a comprehensive and practical guide to 
building high-traffic applications with Pulsar.You’ll learn to use this mature 
and battle- tested platform to deliver extreme levels of speed and durability 
to your messaging.Apache Pulsar committer David Kjerrumgaard teaches you to 
apply Pulsar’s seamless scalability through hands-on case studies, including 
IOT analytics applications and a microservices app based on Pulsar functions.
+        </span>
+      ),
+      link: 'https://www.manning.com/books/apache-pulsar-in-action',
+      publisher: 'Manning Publications',
+      released_at: 'October 2021'
+    },
+    {
+      name: 'Mastering Apache Pulsar',
+      author: 'Jowanza Joseph',
+      cover_image: '/img/books/mastering-apache-pulsar.jpg',
+      description: (
+        <span>
+          Jowanza Joseph, staff software engineer at Finicity, explains how to 
deploy production Pulsar clusters, write reliable event streaming applications, 
and build scalable real-time data pipelines with this platform. Through 
detailed examples, you'll learn Pulsar's design principles, reliability 
guarantees, key APIs, and architecture details, including the replication 
protocol, the load manager, and the storage layer.
+        </span>
+      ),
+      link: 
'https://www.oreilly.com/library/view/mastering-apache-pulsar/9781492084891/',
+      publisher: 'O’Reilly Media',
+      released_at: 'December 2021'
+    }
+  ],
+  related_topics: [
+    {
+      name: 'Designing Data-Intensive Applications',
+      link: 'https://dataintensive.net/',
+      author: 'Martin Kleppmann',
+      cover_image: '/img/books/designing-data-intensive-applications.jpg',
+      description: (
+        <span>
+          In this practical and comprehensive guide, author Martin Kleppmann 
helps you navigate this diverse landscape by examining the pros and cons of 
various technologies for processing and storing data. Software keeps changing, 
but the fundamental principles remain the same. With this book, software 
engineers and architects will learn how to apply those ideas in practice, and 
how to make full use of data in modern applications.
+        </span>
+      ),
+      publisher: 'O’Reilly Media',
+      released_at: 'March 2017'
+    },
+    {
+      name: 'Practical Event-Driven Microservices',
+      link: 
'https://www.oreilly.com/library/view/practical-event-driven-microservices/9781484274682/',
+      author: 'Hugo Filipe Oliveira Rocha',
+      cover_image: '/img/books/practical-event-driven-microservices.jpg',
+      description: (
+        <span>
+          This prescriptive guide takes you through the steps of moving a 
platform with millions of users from a monolith to a microservices event-driven 
architecture. You will learn about the challenges and complexities that arise 
in high-throughput environments that often contain upwards of hundreds of 
microservices. This book is designed to be your single best resource for 
learning how to apply event-driven architectures in real-world scenarios and 
offers hundreds of patterns to overc [...]
+        </span>
+      ),
+      publisher: 'Apress',
+      released_at: 'November 2021'
+    },
+    {
+      name: 'Building Event-Driven Microservices',
+      link: 
'https://www.oreilly.com/library/view/building-event-driven-microservices/9781492057888/',
+      author: 'Adam Bellemare',
+      cover_image: '/img/books/building-event-driven-microservices.jpg',
+      description: (
+        <span>
+          Author Adam Bellemare takes you through the process of building an 
event-driven microservice-powered organization. You’ll reconsider how data is 
produced, accessed, and propagated across your organization. Learn powerful yet 
simple patterns for unlocking the value of this data. Incorporate event-driven 
design and architectural principles into your own systems. And completely 
rethink how your organization delivers value by unlocking near-real-time access 
to data at scale.
+        </span>
+      ),
+      publisher: 'O’Reilly Media',
+      released_at: 'July 2020'
+    }
+  ]
+}
diff --git a/docusaurus.config.js b/docusaurus.config.js
index bb15ba16c42..d6484c7c78a 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -175,13 +175,17 @@ module.exports = {
             {
               to: "/docs/next/concepts-overview/",
               activeBaseRegex: "docs/next/concepts-overview/$",
-              label: "Pulsar Concepts",
+              label: "Concepts",
             },
             {
               to: "/docs/next/",
               activeBaseRegex: "docs/next/$",
               label: "Quickstart",
             },
+            {
+              to: "/books",
+              label: "Books",
+            },
             {
               to: "/ecosystem/",
               label: "Ecosystem",
diff --git a/src/components/pages/BooksPage/BooksPage.module.css 
b/src/components/pages/BooksPage/BooksPage.module.css
new file mode 100644
index 00000000000..acc2c901eda
--- /dev/null
+++ b/src/components/pages/BooksPage/BooksPage.module.css
@@ -0,0 +1,9 @@
+.Header {
+  max-width: var(--max-readable-content-width);
+}
+
+.Categories {
+  display: flex;
+  flex-direction: column;
+  gap: 4rem;
+}
diff --git a/src/components/pages/BooksPage/BooksPage.tsx 
b/src/components/pages/BooksPage/BooksPage.tsx
new file mode 100644
index 00000000000..334af859f02
--- /dev/null
+++ b/src/components/pages/BooksPage/BooksPage.tsx
@@ -0,0 +1,36 @@
+import React from "react";
+import Layout from "@theme/Layout";
+import Cards from "./Cards/Cards";
+import * as data from '@site/data/books';
+import Page from "@site/src/components/ui/Page/Page";
+import s from './BooksPage.module.css';
+
+const CaseStudiesPage: React.FC = () => {
+  return (
+    <Layout
+      title={`Books`}
+      description="Learn about the basics of using Apache Pulsar"
+    >
+      <Page>
+        <section className={s.Header}>
+          <h1>Books</h1>
+          <p>The next collection of books offers a guided learning experience 
into Apache Pulsar and related subjects.</p>
+        </section>
+
+        <div className={s.Categories}>
+          {data.categories.map(category => {
+            return (
+              <div>
+                <h2>{data.categoryLabels[category]}</h2>
+                <Cards resources={data.resources[category]} />
+              </div>
+            );
+          })}
+        </div>
+
+      </Page>
+    </Layout>
+  );
+}
+
+export default CaseStudiesPage;
diff --git a/src/components/pages/BooksPage/Cards/Cards.module.css 
b/src/components/pages/BooksPage/Cards/Cards.module.css
new file mode 100644
index 00000000000..968265d94e3
--- /dev/null
+++ b/src/components/pages/BooksPage/Cards/Cards.module.css
@@ -0,0 +1,31 @@
+.Cards {
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr;
+  grid-gap: 4rem;
+}
+
+.Card {
+  padding: 0;
+  color: var(--text-color);
+}
+
+.Card:hover {
+  text-decoration: none;
+  color: initial;
+  opacity: 0.75;
+}
+
+.CardImage {
+  height: 20rem;
+  background-size: contain;
+  background-repeat: no-repeat;
+  background-position: center center;
+  overflow: hidden;
+  margin-bottom: 1rem;
+}
+
+@media (max-width: 800px) {
+  .Cards {
+    grid-template-columns: 1fr;
+  }
+}
diff --git a/src/components/pages/BooksPage/Cards/Cards.tsx 
b/src/components/pages/BooksPage/Cards/Cards.tsx
new file mode 100644
index 00000000000..b85a4507b77
--- /dev/null
+++ b/src/components/pages/BooksPage/Cards/Cards.tsx
@@ -0,0 +1,34 @@
+import React from "react";
+import s from './Cards.module.css';
+import * as data from '@site/data/books';
+
+const Card: React.FC<data.Resource> = (props) => {
+  return (
+    <a className={s.Card} href={props.link} target="_blank">
+      <div className={s.CardImage} style={{ backgroundImage: 
`url(${props.cover_image})` }} />
+      <h3>{props.name}</h3>
+      <p>
+        <em>{props.author}</em><br />
+        <em>{props.publisher}</em><br />
+        <em>{props.released_at}</em>
+      </p>
+      <p>{props.description}</p>
+    </a>
+  );
+};
+
+export type CardsProps = {
+  resources: data.Resource[]
+};
+
+const Cards: React.FC<CardsProps> = (props) => {
+  return (
+    <section className={s.Cards}>
+      {props.resources.map((props, idx) => (
+        <Card key={idx} {...props} />
+      ))}
+    </section>
+  );
+}
+
+export default Cards;
diff --git a/src/pages/books.tsx b/src/pages/books.tsx
new file mode 100644
index 00000000000..dd5b3b6ffc2
--- /dev/null
+++ b/src/pages/books.tsx
@@ -0,0 +1,4 @@
+import BooksPage from '@site/src/components/pages/BooksPage/BooksPage';
+
+export default BooksPage;
+
diff --git a/static/img/books/building-event-driven-microservices.jpg 
b/static/img/books/building-event-driven-microservices.jpg
new file mode 100644
index 00000000000..1e03c7bd599
Binary files /dev/null and 
b/static/img/books/building-event-driven-microservices.jpg differ
diff --git a/static/img/books/designing-data-intensive-applications.jpg 
b/static/img/books/designing-data-intensive-applications.jpg
new file mode 100644
index 00000000000..3e227c209b8
Binary files /dev/null and 
b/static/img/books/designing-data-intensive-applications.jpg differ
diff --git a/static/img/books/mastering-apache-pulsar.jpg 
b/static/img/books/mastering-apache-pulsar.jpg
new file mode 100644
index 00000000000..9a5ff5976bc
Binary files /dev/null and b/static/img/books/mastering-apache-pulsar.jpg differ
diff --git a/static/img/books/practical-event-driven-microservices.jpg 
b/static/img/books/practical-event-driven-microservices.jpg
new file mode 100644
index 00000000000..5c0470b9faf
Binary files /dev/null and 
b/static/img/books/practical-event-driven-microservices.jpg differ
diff --git a/static/img/books/pulsar-in-action.jpg 
b/static/img/books/pulsar-in-action.jpg
new file mode 100644
index 00000000000..b6bd8852df0
Binary files /dev/null and b/static/img/books/pulsar-in-action.jpg differ

Reply via email to