noc-book-2/content/00_5_introduction.html
2024-02-26 23:49:32 +00:00

204 lines
No EOL
31 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<section data-type="page">
<h1 id="introduction">Introduction</h1>
<p>Over a decade ago, I self-published <em>The Nature of Code</em>, an online resource and print book exploring the unpredictable evolutionary and emergent properties of nature in software via the creative coding framework Processing. Its the understatement of the century to say that much has changed in the world of technology and creative media since then, and so here I am again, with a new and rebooted version of this book built around JavaScript and the p5.js library. The book has a few new coding tricks this time, but its the same old nature—birds still flap their wings, and apples still fall on our heads.</p>
<h2 id="what-is-this-book">What Is This Book?</h2>
<p>At ITP/IMA (Tisch School of the Arts, New York University), Ive been teaching a course titled Introduction to Computational Media since 2004. The origins of this class date back to 1987 and the work of Mike Mills and John Henry Thompson (inventor of the Lingo programming language). In the course, students learn the basics of programming (variables, conditionals, loops, objects, arrays) as well as concepts related to making interactive media projects (pixels, data, sound, networking, 3D, and more). In 2008, I synthesized my materials for this class into an introductory book, <em>Learning Processing</em>, and in 2015, I created a series of video tutorials that follow the same trajectory in JavaScript with the p5.js library.</p>
<p>Once a student has learned the basics and seen an array of applications, their next step might be to delve deeply into a particular area. Maybe they want to focus on computer vision, data visualization, or generative poetry. My Nature of Code course (also taught at ITP/IMA since 2008) represents another possible next step. The course picks up exactly where my introductory material leaves off, demonstrating a world of programming techniques that focus on algorithms and simulation. The book youre reading has evolved from that course.</p>
<p>My goal for this book is simple: I want to take a look at phenomena that naturally occur in the physical world and figure out how to write code to simulate them.</p>
<p>What, then, is this book exactly? Is it a science book? The answer is a resounding no. True, I might examine topics that come from physics or biology, but I wont investigate these topics with a particularly high level of academic rigor. Instead, the book is “inspired by actual events.” Im grabbing the parts from science and mathematics needed to build a software interpretation of nature, and veering off course or skipping details as I see fit.</p>
<p>Is this an art or design book? I would also say no. Regardless of how informal my approach might be, Im still focusing on algorithms and their related programming techniques. Sure, the resulting demonstrations are visual (manifested as animated p5.js sketches), but theyre literal visualizations of the algorithms and programming techniques themselves, drawn only with basic shapes and grayscale color. Its my hope, however, that you, dear reader, can use your creativity and visual ideas to make new, engaging work out of the examples. (I wont complain if you turn every sketch into a rainbow.)</p>
<p>In the end, if this book is anything, its an old-fashioned programming textbook. While a scientific topic (Newtonian physics, cellular growth, evolution) may seed a chapter and the results might inspire artistic projects, the content itself will always boil down to the code implementation, with a particular focus on object-oriented programming.</p>
<h2 id="a-word-about-p5js">A Word About p5.js</h2>
<p>The p5.js library is a reimagining of the Processing creative coding environment for the modern web. Im using it in this book for a number of reasons. For one, its an environment that Im very familiar with. While the original Processing built on top of Java is my first love and still what I turn to when trying out a new idea, p5.js is what I now use for teaching many of my programming classes. Its free, open source, and well suited to beginners, and because its JavaScript, everything runs right there in the web browser itself—no installation required.</p>
<p>For me, however, Processing and p5.js are first and foremost a community of people, not coding libraries or frameworks. Those people have generously dedicated countless hours to making and sharing the software. Ive written this book for that community and for anyone and everyone who loves to explore their curiosity and play through code.</p>
<p>All that said, nothing ties this books content strictly to p5.js—or Processing, for that matter. This book could have been written with “vanilla” JavaScript or Java, or with any number of other open source creative coding environments like openFrameworks, Cinder, and so on. Its my hope that after Ive completed this book, Ill be able to release versions of the examples that run in other environments. If anyone is interested in helping to port the examples, please feel free to contact me at <em>daniel@natureofcode.com</em>. Go on, you know you want to port <em>The Nature of Code</em> to PHP!</p>
<p>All the examples in this book have been tested with p5.js version 1.9.0, but for the most part they should also work with earlier versions. Ill be keeping them up to date with the latest version. The most <a href="https://natureofcode.com/">recent code can always be found on this books website</a> and <a href="https://github.com/nature-of-code">its associated GitHub repository</a>.</p>
<h2 id="what-do-you-need-to-know">What Do You Need to Know?</h2>
<p>The prerequisites for understanding the material in this book could be stated as “one semester of programming instruction with p5.js, Processing, or any other creative coding environment.” That said, theres no reason you couldnt read this book having learned programming with a different language or development environment.</p>
<p>If youve never written any code before, while you could read the book for the concepts and inspiration, youll likely struggle with the code because Im assuming knowledge of the fundamentals: variables, conditionals, loops, functions, objects, and arrays. If these concepts are new to you, my <a href="https://thecodingtrain.com/p5js">“Code! Programming with p5.js”</a> and <a href="https://thecodingtrain.com/processing">“Learning Processing”</a> video courses provide the fundamentals of what you need to know.</p>
<p>If youre an experienced programmer but havent worked with p5.js, you can probably pick it up by <a href="https://p5js.org/">checking out the p5.js documentation</a>, poking through the examples, and <a href="https://p5js.org/get-started">reading through the librarys “Get Started” page</a>.</p>
<p>I should also point out that experience with object-oriented programming is fairly critical. Ill review some of the basics in Chapter 0, but if classes and objects are unfamiliar to you, I suggest watching <a href="https://thecodingtrain.com/oop">my p5.js and Processing object-oriented video tutorials, both also available at the Coding Train</a>.</p>
<h2 id="how-are-you-reading-this-book">How Are You Reading This Book?</h2>
<p>Are you reading this book on a Kindle? Printed paper? On your laptop in PDF form? On a tablet showing an animated HTML5 version? Are you strapped to a chair, absorbing the content directly into your brain via a series of electrodes, tubes, and cartridges?</p>
<p>My dream has always been to write this book in one single format (in this case, a collection of Notion documents) and then, after pressing a magic button (<code>npm run build</code>), out comes the book in any and all formats you might want—PDF, HTML5, printed hard copy, Kindle, and so on. This was largely made possible by the <a href="https://github.com/magicbookproject">Magic Book project</a>, which is an open source framework for self-publishing originally developed at ITP by Rune Madsen and Steve Klise. Everything has been designed and styled using CSS—no manual typesetting or layout.</p>
<p>The reality of putting this book together isnt quite so clean as that, and the story of how it happened is long. If youre interested in learning more, make sure to read the books acknowledgments, and then go hire the people Ive thanked to help you publish a book! <a href="https://github.com/nature-of-code">Ill also include more details in the associated GitHub repository</a>.</p>
<p>The bottom line is that no matter what format youre reading it in, the material is all the same. The only difference will be in how you experience the code examples—more on that in <a href="#how-to-read-the-code">“How to Read the Code”</a>.</p>
<h3 id="the-coding-train-connection">The Coding Train Connection</h3>
<p>Personally, I still love an assembled amalgamation of cellulose pulp, meticulously bound together with a resilient spine, upon which pigmented compounds have been artfully deployed to convey words and ideas. Yet, ever since 2012, when I impulsively recorded my very first video lesson about programming in my office at ITP, Ive discovered the tremendous value and joy in conveying ideas and lessons through moving pictures.</p>
<p>All this is to say, I have a YouTube channel called <a href="https://www.youtube.com/thecodingtrain">the Coding Train</a>. I mentioned it earlier when discussing options for learning the prerequisite material for this book, and if you continue reading, youll find I continue to reference related videos. I might allude to one I made about a related algorithm or alternative technique for a particular coding example, or suggest a series on a tangential concept that could provide additional context to a topic Im exploring.</p>
<p>If video learning is your style, Im also working on an accompanying set of video tutorials that follow the exact same material as this book. I made a whole bunch 10 years ago with Processing, and more recently I started publishing a series of updated ones with p5.js. At the time of this writing, Im about halfway through Chapter 5.</p>
<h3 id="additional-resources">Additional Resources</h3>
<p>Theres also an abundance of exceptional educational material teaching simulation and generative algorithms that I did not write or record. I always recommend that you explore various perspectives and voices when attempting to learn something new. Its possible that what Ive written might not click with you, and even hearing me repeat the same information in video form, regardless of how much mugging I do for the camera, wont help. Sometimes whats best is someone else you can relate to writing or saying or demonstrating the same concepts in different words with a different style. To this end, Im including an “Additional Resources” section on this books website. If you create your own materials or have any recommendations for inclusion, please get in touch!</p>
<p>Two quick recommendations I have right now are <em>The Computational Beauty of Nature</em> by Gary William Flake (MIT Press, 1998)—its where I originally learned a lot of the ideas for this book—and the superbly organized online resource <a href="https://thatcreativecode.page/">That Creative Code Page by Taru Muhonen and Raphaël de Courville</a>.</p>
<h2 id="the-story-of-this-book">The “Story” of This Book</h2>
<p>If you glance over the books table of contents, youll notice 12 chapters (011!), each one covering a different topic. And in one sense, this book is just that—a survey of a dozen concepts and associated code examples. Nevertheless, in putting together the material, I always imagined something of a linear narrative. Before you begin reading, Id like to walk you through this story.</p>
<h3 id="part-1-inanimate-objects">Part 1: Inanimate Objects</h3>
<p>A soccer ball lies in the grass. A kick launches it into the air. Gravity pulls it back down. A heavy gust of wind keeps it afloat a moment longer until it falls and bounces off the head of a jumping player. The soccer ball isnt alive; it makes no choices as to how it will move through the world. Rather, its an inanimate object waiting to be pushed and pulled by the forces of its environment.</p>
<p>How would you model a soccer ball moving in a digital canvas? If youve ever programmed a circle moving across a screen, youve probably written the following line of code:</p>
<pre class="codesplit" data-code-language="javascript">x = x + 1;</pre>
<p>You draw a shape at position <code>x</code>. With each frame of animation, you increment the value of <code>x</code>, redraw the shape, and voilà—the illusion of motion! Maybe you took it a step or two further and included a <code>y</code> position, as well as variables for speed along the x- and y-axes:</p>
<pre class="codesplit" data-code-language="javascript">x = x + xspeed;
y = y + yspeed;</pre>
<p>Part 1 of this story will take this idea even further. After exploring how to use different flavors of randomness to drive an objects motion (<strong>Chapter 0</strong>), Im going to take these <code>xspeed</code> and <code>yspeed</code> variables and demonstrate how together they form a vector (<strong>Chapter 1</strong>). You wont get any new functionality out of this, but it will build a solid foundation for programming motion in the rest of the book.</p>
<p>Once you know a little something about vectors, youre going to quickly realize that a force (<strong>Chapter 2</strong>) is a vector. Kick a soccer ball and youre applying a force. What does a force cause an object to do? According to Sir Isaac Newton, force equals mass times acceleration, so that force causes an object to accelerate. Modeling forces will allow you to create systems with dynamic motion, in which objects move according to a variety of rules.</p>
<p>Now, that soccer ball to which you applied a force might have also been spinning. If an object moves according to its <em>linear</em> acceleration, it can spin according to its <em>angular</em> acceleration (<strong>Chapter 3</strong>). Understanding the basics of angles and trigonometry will allow you to model rotating objects as well as grasp the principles behind oscillating motion, like a pendulum swinging or a spring bouncing.</p>
<p>Once youve tackled the basics of motion and forces for an individual inanimate object, Ill show you how to make thousands upon thousands of those objects and manage them as a single unit called a <em>particle system</em> (<strong>Chapter 4</strong>). Particle systems are also a good excuse to look at some additional features of object-oriented programming—namely, inheritance and polymorphism.</p>
<h3 id="part-2-its-alive">Part 2: Its Alive!</h3>
<p>What does it mean to model life? Not an easy question to answer, but Ill begin by building objects that have an ability to perceive their environment. Lets think about this for a moment. A block that falls off a table moves according to forces, as does a dolphin swimming through the water. But theres a key difference: the block cant decide to leap off the table, whereas the dolphin can decide to leap out of the water. The dolphin has dreams and desires. It feels hunger and fear, and those feelings inform its movements. By examining techniques behind modeling autonomous agents (<strong>Chapter 5</strong>), youll learn to breathe life into inanimate objects, allowing them to make decisions about their movements according to their understanding of their environment.</p>
<p>In Chapters 1 through 5, all the examples will be written “from scratch”—meaning the code for the algorithms driving the motion of the objects will be written directly in p5.js. Im certainly not the first programmer ever to consider the idea of simulating physics and life in animation, however, so next Ill examine how you can use physics libraries (<strong>Chapter 6</strong>) to model more sophisticated behaviors. Ill look at the features of two libraries: Matter.js and Toxiclibs.js.</p>
<p>The end of Chapter 5 will explore group behaviors that exhibit the properties of complexity. A complex system is typically defined as a system thats more than the sum of its parts. While the individual elements of the system may be incredibly simple and easily understood, the behavior of the system as a whole can be highly complex, intelligent, and difficult to predict. Chasing complexity will lead you away from thinking purely about modeling motion and into the realm of rule-based systems. What can you model with cellular automata (<strong>Chapter 7</strong>), systems of cells living on a grid? What types of patterns can you generate with fractals (<strong>Chapter 8</strong>), the geometry of nature?</p>
<h3 id="part-3-intelligence">Part 3: Intelligence</h3>
<p>You made things move. Then you gave those things hopes and dreams and fears, along with rules to live by. The last step in this book will bring intelligent decision-making into your creations. Can you apply the biological process of evolution to computational systems (<strong>Chapter 9</strong>) in order to evolve the behavior of autonomous agents? Taking inspiration from the human brain, can you program an artificial neural network (<strong>Chapter 10</strong>)? How can agents make decisions, learn from their mistakes, and adapt to their environment (<strong>Chapter 11</strong>)?</p>
<h2 id="using-this-book-as-a-syllabus">Using This Book as a Syllabus</h2>
<p>While the content in this book certainly makes for an intense and highly compressed semester, Ive designed it to fit into a 14-week course. I find that some chapters work better expanded across multiple weeks, while others can be combined and explored together in a single week. Heres one possible syllabus:</p>
<table>
<tbody>
<tr>
<td>Week 1</td>
<td>Randomness and vectors (Chapters 01)</td>
</tr>
<tr>
<td>Week 2</td>
<td>Forces (Chapter 2)</td>
</tr>
<tr>
<td>Week 3</td>
<td>Oscillation (Chapter 3)</td>
</tr>
<tr>
<td>Week 4</td>
<td>Particle systems (Chapter 4)</td>
</tr>
<tr>
<td>Week 5</td>
<td>Autonomous agents (Chapter 5)</td>
</tr>
<tr>
<td>Week 6</td>
<td>Physics libraries (Chapter 6)</td>
</tr>
<tr>
<td>Week 7</td>
<td>Mid-semester project about motion</td>
</tr>
<tr>
<td>Week 8</td>
<td>Complex systems: 2D cellular automata and fractals (Chapters 78)</td>
</tr>
<tr>
<td>Week 9</td>
<td>Genetic algorithms (Chapter 9)</td>
</tr>
<tr>
<td>Week 10</td>
<td>Neural networks and neuroevolution (Chapters 1011)</td>
</tr>
<tr>
<td>Week 11</td>
<td>Final project discussion</td>
</tr>
<tr>
<td>Weeks 1213</td>
<td>Final project workshop</td>
</tr>
<tr>
<td>Week 14</td>
<td>Final project presentation</td>
</tr>
</tbody>
</table>
<p>If youre considering using this text for a course or workshop, please feel free to contact me. I hope to eventually finish the companion set of videos, as well as include helpful slides as supplementary educational materials. If you make your own, Id love to hear about it!</p>
<h2 id="how-to-read-the-code">How to Read the Code</h2>
<p>Code is the main medium of this book, weaving throughout the narrative as its dissected and examined. Sometimes it appears as full, stand-alone examples, other times it drops in as a single line or two, and often its stretched over whole sections in many short snippets, with explanations nestled in between. Whatever form it takes, code will always appear in a <code>monospaced font</code>. Heres a quick guide on how to navigate the types of code sprinkled throughout the book.</p>
<h3 id="full-examples">Full Examples</h3>
<p>Each chapter includes fully functional code examples that are written with the p5.js library. Heres what they look like:</p>
<div data-type="example">
<h3 id="example--example-title">Example #.#: Example Title</h3>
<figure>
<div data-type="embed" data-p5-editor="https://editor.p5js.org/natureofcode/sketches/teVqZKAF7" data-example-path="examples/00_5_introduction/nature_of_code_example_template"><img src="examples/00_5_introduction/nature_of_code_example_template/screenshot.png"></div>
<figcaption></figcaption>
</figure>
</div>
<pre class="codesplit" data-code-language="javascript">function setup() {
//{!1} This canvas size is used to accommodate the books layout but isnt critical for the examples otherwise.
createCanvas(640, 240);
background(255);
}
function draw() {
fill(0, 25);
stroke(0, 50);
//{!1} Draw a random circle each time through <code>draw()</code>.
circle(random(width), random(height), 16);
}</pre>
<p>The examples are numbered sequentially within each chapter to help you find the corresponding code online. In the printed version of the book, youll see a screenshot right below the example title. The online version has the running sketch embedded right there on the page. For animated examples (which are almost all of them), the screenshots will often show a “trail” of motion. This effect was achieved by adding transparency to the <code>background(255, 10)</code> function, though the accompanying code wont include that enhancement.</p>
<p>Below the example, youll find the code, but its not always the <em>complete </em>code. Since many examples are quite long and span multiple files, I make my best effort to include a snippet that highlights the main aspects of the example or whatever new components are being introduced that werent already discussed earlier in the section.</p>
<p>You can find the full version of the code on the books website. There, you can interact with, modify, and experiment with the code in the <a href="https://editor.p5js.org/">p5.js Web Editor</a>. Additionally, everything is included in the books GitHub repository. Here are links for all the materials:</p>
<ul>
<li>The <a href="https://natureofcode.com/">book's website</a> includes the full text of the book, additional reading and references, and all code examples.</li>
<li>The <a href="https://github.com/nature-of-code">GitHub repositories</a> contain the raw source code for the books website, the books build process, and all code examples.</li>
<li>In addition to the website and GitHub repositories, you can also access the code by viewing the list of sketches in the <a href="https://editor.p5js.org/natureofcode/sketches">p5.js web editor</a>.</li>
</ul>
<p>Notice that Ive used comments in the example to address whats happening in the code. These comments float next to the code (the appearance may vary depending on how youre reading the book). The background shading groups the comments with their corresponding lines of code.</p>
<h3 id="complete-snippets"><strong>Complete Snippets</strong></h3>
<p>Though rare, “complete” sections of code are occasionally mixed in with the body text. Sometimes, as with the sample Example #.# in the previous section, I might actually list all the code associated with a complete p5.js sketch. In most cases, however, Im considering a “complete” snippet to be the code for an entire function or a class—a fully finished block of code, complete with opening and closing curly brackets and everything in between. Something like this:</p>
<pre class="codesplit" data-code-language="javascript">// The entire <code>draw()</code> function for an example
function draw() {
background(255);
for (let x = 0; x &#x3C; width; x += spacing) {
fill(255);
circle(x, height / 2, spacing);
}
}</pre>
<p>This snippet shows the entire <code>draw()</code> function, but it still isnt a complete sketch. It assumes the existence of a global variable called <code>spacing</code>, as well as a <code>setup()</code> function that calls <code>createCanvas()</code>.</p>
<h3 id="context-free-code"><strong>Context-Free Code</strong></h3>
<p>Occasionally, youll find lines of code hanging out on the page without a surrounding function or context. These snippets are there to illustrate a point, not necessarily to be run as is. They might represent a concept, a tiny piece of an algorithm, or a coding technique.</p>
<pre class="codesplit" data-code-language="javascript"> // RGB values to make the circles pink
fill(240, 99, 164);</pre>
<p>Notice that this context-free snippet matches the indentation of <code>fill(255)</code> in the previous “complete” snippet. Ill do this when the code has been established to be part of something demonstrated previously. Admittedly, this wont always work out so cleanly or perfectly, but Im doing my best!</p>
<h3 id="snipped-code"><strong>Snipped Code</strong></h3>
<p>Be on the lookout for the scissors! This design element indicates that a code snippet is a continuation of a previous piece or will be continued after some explanatory text. Sometimes its not actually being continued but is just cut off because all the code isnt relevant to the discussion at hand. The scissors are there to say, “Hey, there might be more to this code above or below, or at the very least, this is a part of something bigger!” Heres how this might play out with some surrounding body text.</p>
<p>The first step to building a p5.js sketch is to create a canvas:</p>
<div class="snip-below">
<pre class="codesplit" data-code-language="javascript">function setup() {
createCanvas(640, 240);</pre>
</div>
<p>Then its time to draw the background:</p>
<div class="snip-above snip-below">
<pre class="codesplit" data-code-language="javascript"> background(255);</pre>
</div>
<p>I also like to include a circle in the center of the canvas:</p>
<div class="snip-above">
<pre class="codesplit" data-code-language="javascript"> circle(width / 2, height / 2, 200);
}</pre>
</div>
<p>In <code>draw()</code>, I might want to start placing squares at random locations on top of the background and fixed circle. The rest of the code could be anything you want it to be!</p>
<div class="snip-below">
<pre class="codesplit" data-code-language="javascript">function draw() {
rectMode(CENTER);
square(random(width), random(height), 20);</pre>
</div>
<p>Notice that Im keeping the indentation consistent to try to help establish the context, and again, Im using the scissors icon to help indicate where code is continued or cut off.</p>
<p>A particular side effect of using snipped code is that youll often notice opening curly brackets in one snippet that dont have a corresponding closing bracket until several snippets later (if at all). If youre used to looking at JavaScript code, this may initially send you into a mild panic, but hopefully youll get used to it.</p>
<h2 id="exercises">Exercises</h2>
<p>Each chapter includes numbered exercises that serve as your playground to apply, experiment with, and go beyond the concepts and code provided within the chapters. Heres what an exercise might look like:</p>
<div data-type="exercise">
<h3 id="exercise-">Exercise #.#</h3>
<p>Try tweaking Example #.# so that each circle has a random size:</p>
<pre class="codesplit" data-code-language="javascript">function draw() {
fill(0, 25);
stroke(0, 50);
circle(random(width), random(height), <span class="blank">random(16, 64)</span>);
}</pre>
</div>
<p>To keep you on your toes, the exercises come in a variety of formats. Some pose technical challenges, asking you to write a variation of a specific algorithm or solve a highly specific problem. Others are open-ended inquiries, prompting you to play and experiment, following your own ideas. Some include snippets of code with blank spots, inviting you to fill them in directly. Dont hesitate to write, scribble, or doodle in this very book as you work through them!</p>
<h3 id="solutions">Solutions</h3>
<p>Solutions for the exercises are provided on the books website. Or I should say, I aspire to include solutions for all the exercises on the books website. As of this moment, just a handful are available, but hopefully by the time youre reading this, there will be many more. If youd like to contribute a solution to an exercise, I would love for you to do so via the books GitHub repository!</p>
<h3 id="the-ecosystem-project">The Ecosystem Project</h3>
<p>As much as Id like to pretend you could learn everything by curling up in a comfy chair and reading some prose, to learn programming youre really going to have to do some programming. The exercises scattered throughout each chapter are a start, but you might find it helpful to also keep in mind a more substantial project idea (or two) that you can develop as you go from chapter to chapter. In fact, when teaching my Nature of Code course at ITP, Ive often found that students enjoy building a single project, step by step, week by week, over the course of the semester.</p>
<p>At the end of each chapter, youll find a series of prompts for one such project—exercises that build on each other, one topic at a time. This project is based on the following scenario. Youve been asked by a science museum to develop the software for a new exhibit, the <em>Digital Ecosystem</em>, a world of animated, procedural creatures that live in a computer simulation for visitors to enjoy as they enter the museum. I dont mean to suggest that this is a particularly innovative or creative concept. Rather, Ill use this example Ecosystem Project idea as a literal representation of the content in the book, demonstrating how the elements can fit together in a single program. I encourage you to develop your own idea, one thats perhaps more abstract and nontraditional.</p>
<h2 id="getting-help-and-submitting-feedback">Getting Help and Submitting Feedback</h2>
<p>Coding can be tough and frustrating, and the ideas in this book arent always straightforward. You dont have to go it alone. Theres probably someone else reading right now who would love to co-organize a study group or a book club where you can meet, chat, and share your struggles and successes. If you dont find a local community for traveling this journey together, what about an online one? Two places Id suggest are <a href="https://discourse.processing.org/">the official Processing forums</a> and <a href="https://thecodingtrain.com/discord">the Coding Train Discord server</a>.</p>
<p>I consider the online version of this book a living document and welcome your feedback. For all things book related, <a href="https://natureofcode.com/">please visit the Nature of Code website</a>. The <a href="https://github.com/nature-of-code">raw source text of the book and all the illustrations are on GitHub</a>. Please <a href="https://github.com/nature-of-code/noc-book-2023/issues">leave feedback and submit corrections by using GitHub issues</a>.</p>
<p>More important, I want to see what you make! You can share your ideas by <a href="https://thecodingtrain.com/showcase">submitting to the passenger showcase on the Coding Train website</a>, or in the channels on the aforementioned Discord. A hello in a YouTube comment is always welcome (although to be honest, its often best not to read the comments on YouTube), and feel free to tag me on whatever platform the future of social media has to offer—whichever one is the friendliest and least toxic! I want to enjoy all the bloops that swim in your ecosystem. Whether they leap triumphantly over a wave of creativity or make a tiny splash in a pond of learning, lets bask in the ripples they send through the nature of coding!</p>
</section>