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