{ "cells": [ { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "# Guide for Authors" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:43.425116Z", "iopub.status.busy": "2024-01-18T17:31:43.424789Z", "iopub.status.idle": "2024-01-18T17:31:43.442343Z", "shell.execute_reply": "2024-01-18T17:31:43.436672Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Welcome to \"The Fuzzing Book\"!\n" ] } ], "source": [ "print('Welcome to \"The Fuzzing Book\"!')" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "This notebook compiles the most important conventions for all chapters (notebooks) of \"The Fuzzing Book\"." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Blooper Video" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:43.483092Z", "iopub.status.busy": "2024-01-18T17:31:43.482706Z", "iopub.status.idle": "2024-01-18T17:31:43.518619Z", "shell.execute_reply": "2024-01-18T17:31:43.518284Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from bookutils import YouTubeVideo\n", "YouTubeVideo('-HFN32Aeisk')" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Organization of this Book" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Chapters as Notebooks\n", "\n", "Each chapter comes in its own _Jupyter notebook_. A single notebook (= a chapter) should cover the material (text and code, possibly slides) for a 90-minute lecture.\n", "\n", "A chapter notebook should be named `Topic.ipynb`, where `Topic` is the topic. `Topic` must be usable as a Python module and should characterize the main contribution. If the main contribution of your chapter is a class `FooFuzzer`, for instance, then your topic (and notebook name) should be `FooFuzzer`, such that users can state\n", "\n", "```python\n", "from FooFuzzer import FooFuzzer\n", "```\n", "\n", "Since class and module names should start with uppercase letters, all non-notebook files and folders start with lowercase letters. this may make it easier to differentiate them. The special notebook `index.ipynb` gets converted into the home pages `index.html` (on fuzzingbook.org) and `README.md` (on GitHub).\n", "\n", "Notebooks are stored in the `notebooks` folder." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### DebuggingBook and FuzzingBook\n", "\n", "This project shares some infrastructure (and even chapters) with \"The Fuzzing Book\". Everything in `shared/` is maintained in \"The Debugging Book\" and only copied over to \"The Fuzzing Book\". If you want to edit or change any of the files in `shared/`, do so in \"The Debugging Book\"." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Output Formats\n", "\n", "The notebooks by themselves can be used by instructors and students to toy around with. They can edit code (and text) as they like and even run them as a slide show.\n", "\n", "The notebook can be _exported_ to multiple (non-interactive) formats:\n", "\n", "* HTML – for placing this material online.\n", "* PDF – for printing\n", "* Python – for coding\n", "* Slides – for presenting\n", "\n", "The included Makefile can generate all of these automatically (and a few more).\n", "\n", "At this point, we mostly focus on HTML and Python, as we want to get these out quickly; but you should also occasionally ensure that your notebooks can (still) be exported into PDF. Other formats (Word, Markdown) are experimental." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Sites\n", "\n", "All sources for the book end up on the [GitHub project page](https://github.com/uds-se/fuzzingbook). This holds the sources (notebooks), utilities (Makefiles), as well as an issue tracker.\n", "\n", "The derived material for the book ends up in the `docs/` folder, from where it is eventually pushed to the [fuzzingbook website](http://www.fuzzingbook.org/). This site allows\n", "* reading the chapters online,\n", "* launching interactive Jupyter notebooks using the binder service, and\n", "* accesssing code and slide formats.\n", "\n", "Use `make publish` to create and update the site." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### The Book PDF\n", "\n", "The book PDF is compiled automatically from the individual notebooks. Each notebook becomes a chapter; references are compiled in the final chapter. Use `make book` to create the book." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Creating and Building" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Tools you will need\n", "\n", "To work on the notebook files, you need the following:\n", "\n", "1. Jupyter notebook. The easiest way to install this is via the [Anaconda distribution](https://www.anaconda.com/download/).\n", "\n", "2. Once you have the Jupyter notebook installed, you can start editing and coding right away by starting `jupyter notebook` (or `jupyter lab`) in the topmost project folder.\n", "\n", "3. If (like me) you don't like the Jupyter Notebook interface, I recommend [Jupyter Lab](https://jupyterlab.readthedocs.io/en/stable/), the designated successor to Jupyter Notebook. Invoke it as `jupyter lab`. It comes with a much more modern interface, but misses autocompletion and a couple of extensions. I am running it [as a Desktop application](http://christopherroach.com/articles/jupyterlab-desktop-app/) which gets rid of all the browser toolbars.\n", "\n", "4. To create the entire book (with citations, references, and all), you also need the [ipypublish](https://github.com/chrisjsewell/ipypublish) package. This allows you to create the HTML files, merge multiple chapters into a single PDF or HTML file, create slides, and more. The Makefile provides the essential tools for creation." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Version Control\n", "\n", "We use git in a single strand of revisions. Feel free branch for features, but eventually merge back into the main \"master\" branch. Sync early; sync often. Only push if everything (\"make all\") builds and passes.\n", "\n", "The GitHub repo thus will typically reflect work in progress. If you reach a stable milestone, you can push things on the fuzzingbook.org website, using `make publish`." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### nbdime\n", "\n", "The [nbdime](https://github.com/jupyter/nbdime) package gives you tools such as `nbdiff` (and even better, `nbdiff-web`) to compare notebooks against each other; this ensures that cell _contents_ are compared rather than the binary format.\n", "\n", "`nbdime config-git --enable` integrates nbdime with git such that `git diff` runs the above tools; merging should also be notebook-specific." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### nbstripout\n", "\n", "Notebooks in version control _should not contain output cells,_ as these tend to change a lot. (Hey, we're talking random output generation here!) To have output cells automatically stripped during commit, install the [nbstripout](https://github.com/kynan/nbstripout) package and use\n", "\n", "```\n", "nbstripout --install\n", "```\n", "\n", "to set it up as a git filter. The `notebooks/` folder comes with a `.gitattributes` file already set up for `nbstripout`, so you should be all set.\n", "\n", "Note that _published_ notebooks (in short, anything under the `docs/` tree) _should_ have their output cells included, such that users can download and edit notebooks with pre-rendered output. This folder contains a `.gitattributes` file that should explicitly disable `nbstripout`, but it can't hurt to check.\n", "\n", "As an example, the following cell \n", "\n", "1. _should_ have its output included in the [HTML version of this guide](https://www.fuzzingbook.org/beta/html/Guide_for_Authors.html);\n", "2. _should not_ have its output included in [the git repo](https://github.com/uds-se/fuzzingbook/blob/master/notebooks/Guide_for_Authors.ipynb) (`notebooks/`);\n", "3. _should_ have its output included in [downloadable and editable notebooks](https://github.com/uds-se/fuzzingbook/blob/master/docs/beta/notebooks/Guide_for_Authors.ipynb) (`docs/notebooks/` and `docs/beta/notebooks/`)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:43.520609Z", "iopub.status.busy": "2024-01-18T17:31:43.520451Z", "iopub.status.idle": "2024-01-18T17:31:43.522138Z", "shell.execute_reply": "2024-01-18T17:31:43.521875Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import random" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:43.523625Z", "iopub.status.busy": "2024-01-18T17:31:43.523523Z", "iopub.status.idle": "2024-01-18T17:31:43.525518Z", "shell.execute_reply": "2024-01-18T17:31:43.525280Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "0.16811066084356918" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random.random()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Inkscape and GraphViz\n", "\n", "Creating derived files uses [Inkscape](https://inkscape.org/en/) and [Graphviz](https://www.graphviz.org/) – through its [Python wrapper](https://pypi.org/project/graphviz/) – to process SVG images. These tools are not automatically installed, but are available on pip, _brew_ and _apt-get_ for all major distributions." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### LaTeX Fonts\n", "\n", "By default, creating PDF uses XeLaTeX with a couple of special fonts, which you can find in the `fonts/` folder; install these fonts system-wide to make them accessible to XeLaTeX.\n", "\n", "You can also run `make LATEX=pdflatex` to use `pdflatex` and standard LaTeX fonts instead." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Creating Derived Formats (HTML, PDF, code, ...)\n", "\n", "The [Makefile](../Makefile) provides rules for all targets. Type `make help` for instructions.\n", "\n", "The Makefile should work with GNU make and a standard Jupyter Notebook installation. To create the multi-chapter book and BibTeX citation support, you need to install the [iPyPublish](https://github.com/chrisjsewell/ipypublish) package (which includes the `nbpublish` command)." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Creating a New Chapter\n", "\n", "To create a new chapter for the book,\n", "\n", "1. Set up a new `.ipynb` notebook file as copy of [Template.ipynb](Template.ipynb).\n", "2. Include it in the `CHAPTERS` list in the `Makefile`.\n", "3. Add it to the git repository." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Teaching a Topic\n", "\n", "Each chapter should be devoted to a central concept and a small set of lessons to be learned. I recommend the following structure:\n", "\n", "* Introduce the problem (\"We want to parse inputs\")\n", "* Illustrate it with some code examples (\"Here's some input I'd like to parse\")\n", "* Develop a first (possibly quick and dirty) solution (\"A PEG parser is short and often does the job\")\n", "* Show that it works and how it works (\"Here's a neat derivation tree. Look how we can use this to mutate and combine expressions!\")\n", "* Develop a second, more elaborated solution, which should then become the main contribution. (\"Here's a general LR(1) parser that does not require a special grammar format. (You can skip it if you're not interested)\")\n", "* Offload non-essential extensions to later sections or to exercises. (\"Implement a universal parser, using the Dragon Book\")\n", "\n", "The key idea is that readers should be able to grasp the essentials of the problem and the solution in the beginning of the chapter, and get further into details as they progress through it. Make it easy for readers to be drawn in, providing insights of value quickly. If they are interested to understand how things work, they will get deeper into the topic. If they just want to use the technique (because they may be more interested in later chapters), having them read only the first few examples should be fine for them, too.\n", "\n", "Whatever you introduce should be motivated first, and illustrated after. Motivate the code you'll be writing, and use plenty of examples to show what the code just introduced is doing. Remember that readers should have fun interacting with your code and your examples. Show and tell again and again and again." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Special Sections" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Quizzes" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "You can have _quizzes_ as part of the notebook. These are created using the `quiz()` function. Its arguments are\n", "\n", "* The question\n", "* A list of options\n", "* The correct answer(s) - either\n", " * the single number of the one single correct answer (starting with 1)\n", " * a list of numbers of correct answers (multiple choices)\n", " \n", "To make the answer less obvious, you can specify it as a string containing an arithmetic expression evaluating to the desired number(s). The expression will remain in the code (and possibly be shown as hint in the quiz)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:43.527195Z", "iopub.status.busy": "2024-01-18T17:31:43.527088Z", "iopub.status.idle": "2024-01-18T17:31:43.528617Z", "shell.execute_reply": "2024-01-18T17:31:43.528389Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from bookutils import quiz" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:43.530112Z", "iopub.status.busy": "2024-01-18T17:31:43.530029Z", "iopub.status.idle": "2024-01-18T17:31:43.534050Z", "shell.execute_reply": "2024-01-18T17:31:43.533761Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", "
\n", "

Quiz

\n", "

\n", "

The color of the sky is
\n", "

\n", "

\n", "

\n", " \n", " \n", "
\n", " \n", " \n", "
\n", " \n", " \n", "
\n", " \n", "
\n", "

\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A single-choice quiz\n", "quiz(\"The color of the sky is\", ['blue', 'red', 'black'],\n", " '5 - 4')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:43.535427Z", "iopub.status.busy": "2024-01-18T17:31:43.535348Z", "iopub.status.idle": "2024-01-18T17:31:43.538615Z", "shell.execute_reply": "2024-01-18T17:31:43.538337Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", "
\n", "

Quiz

\n", "

\n", "

What is this book?
\n", "

\n", "

\n", "

\n", " \n", " \n", "
\n", " \n", " \n", "
\n", " \n", " \n", "
\n", " \n", "
\n", "

\n", " \n", " \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A multiple-choice quiz\n", "quiz(\"What is this book?\", ['Novel', 'Friendly', 'Useful'],\n", " ['5 - 4', '1 + 1', '27 / 9'])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Cells that contain only the `quiz()` call will not be rendered (but the quiz will)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Synopsis" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Each chapter should have a section named \"Synopsis\" at the very end:\n", "\n", "```markdown\n", "## Synopsis\n", "\n", "This is the text of the synopsis.\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "This section is evaluated at the very end of the notebook. It should summarize the most important functionality (classes, methods, etc.) together with examples. In the derived HTML and PDF files, it is rendered at the beginning, such that it can serve as a quick reference" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Excursions" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "There may be longer stretches of text (and code!) that are too special, too boring, or too repetitive to read. You can mark such stretches as \"Excursions\" by enclosing them in Markdown cells that state:\n", "\n", "```markdown\n", "#### Excursion: TITLE\n", "```\n", "\n", "and\n", "\n", "```markdown\n", "#### End of Excursion\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Stretches between these two markers get special treatment when rendering:\n", "\n", "* In the resulting HTML output, these blocks are set up such that they are shown on demand only.\n", "* In printed (PDF) versions, they will be replaced by a pointer to the online version.\n", "* In the resulting slides, they will be omitted right away." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Here is an example of an excursion:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Excursion: Fine points on Excursion Cells" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Note that the `Excursion` and `End of Excursion` cells must be separate cells; they cannot be merged with others." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### End of Excursion" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Ignored Code\n", "\n", "If a code cell starts with\n", "```python\n", "# ignore\n", "```\n", "then the code will not show up in rendered input. Its _output_ will, however. \n", "This is useful for cells that create drawings, for instance - the focus should be on the result, not the code.\n", "\n", "This also applies to cells that start with a call to `display()` or `quiz()`." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Ignored Cells\n", "\n", "You can have _any_ cell not show up at all (including its output) in any rendered input by adding the following meta-data to the cell:\n", "```json\n", "{\n", " \"ipub\": {\n", " \"ignore\": true\n", "}\n", "```\n" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "ignore": true }, "slideshow": { "slide_type": "fragment" } }, "source": [ "*This* text, for instance, does not show up in the rendered version." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Documentation Assertions\n", "\n", "If a code cell starts with\n", "```python\n", "# docassert\n", "```\n", "then the code will not show up in rendered input (like `# ignore`), but also not in exported code.\n", "This is useful for inserting _assertions_ that encode assumptions made in the (following) documentation. Having this assertion fail means that the documentation no longer applies.\n", "\n", "Since the documentation is not part of exported code, and since code may behave differently in standalone Python, these assertions are not exported." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Coding" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "### Set up\n", "\n", "The first code block in each notebook should be" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "button": false, "execution": { "iopub.execute_input": "2024-01-18T17:31:43.540747Z", "iopub.status.busy": "2024-01-18T17:31:43.540614Z", "iopub.status.idle": "2024-01-18T17:31:43.542561Z", "shell.execute_reply": "2024-01-18T17:31:43.542316Z" }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "import bookutils.setup" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "source": [ "This sets up stuff such that notebooks can import each other's code (see below). This import statement is removed in the exported Python code, as the .py files would import each other directly." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Importing `bookutils.setup` also sets a fixed _seed_ for random number generation. This way, whenever you execute a notebook from scratch (restarting the kernel), you get the exact same results; these results will also end up in the derived HTML and PDF files. (If you run a notebook or a cell for the second time, you will get more random results.)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Coding Style and Consistency\n", "\n", "Here's a few rules regarding coding style." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Use Python 3\n", "\n", "We use Python 3.10 and later for all code. There is no need to include compatibility hacks for Python versions earlier than 3.9." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Follow Python Coding Conventions\n", "\n", "We use _standard Python coding conventions_ according to [PEP 8](https://www.python.org/dev/peps/pep-0008/).\n", "\n", "Your code must pass the `pycodestyle` style checks which you get by invoking `make style`. A very easy way to meet this goal is to invoke `make reformat`, which reformats all code accordingly. The `code prettify` notebook extension also allows you to automatically make your code (mostly) adhere to PEP 8." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### One Cell per Definition\n", "\n", "Use one cell for each definition or example. During importing, this makes it easier to decide which cells to import (see below)." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Identifiers\n", "\n", "In the book, this is how we denote `variables`, `functions()` and `methods()`, `Classes`, `Notebooks`, `variables_and_constants`, `EXPORTED_CONSTANTS`, `files`, `folders/`, and ``." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Quotes\n", "\n", "If you have the choice between quoting styles, prefer \n", "* double quotes (`\"strings\"`) around strings that are used for interpolation or that are natural language messages, and \n", "* single quotes (`'characters'`) for single characters and formal language symbols that an end user would not see." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Read More\n", "\n", "Beyond simple syntactical things, here's a [very nice guide](https://docs.python-guide.org/writing/style/) to get you started writing \"pythonic\" code." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "### Importing Code from Notebooks\n", "\n", "To import the code of individual notebooks, you can import directly from `.ipynb` notebook files." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "button": false, "execution": { "iopub.execute_input": "2024-01-18T17:31:43.544357Z", "iopub.status.busy": "2024-01-18T17:31:43.544238Z", "iopub.status.idle": "2024-01-18T17:31:43.621993Z", "shell.execute_reply": "2024-01-18T17:31:43.621620Z" }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "from Fuzzer import fuzzer" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "button": false, "execution": { "iopub.execute_input": "2024-01-18T17:31:43.623854Z", "iopub.status.busy": "2024-01-18T17:31:43.623730Z", "iopub.status.idle": "2024-01-18T17:31:43.625897Z", "shell.execute_reply": "2024-01-18T17:31:43.625648Z" }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'050199092904721615267546627640773972382632848750065259698551700448752187153'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fuzzer(100, ord('0'), 10)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "**Important**: When importing a notebook, the module loader will **only** load cells that start with\n", "\n", "* a function definition (`def`)\n", "* a class definition (`class`)\n", "* a variable definition if all uppercase (`ABC = 123`)\n", "* `import` and `from` statements\n", "\n", "All other cells are _ignored_ to avoid recomputation of notebooks and clutter of `print()` output." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Exported Python code will import from the respective .py file instead. The exported Python code is set up such that only the above items will be imported." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "If importing a module prints out something (or has other side effects), that is an error. Use `make check-imports` to check whether your modules import without output." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Import modules only as you need them, such that you can motivate them well in the text." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Imports and Dependencies\n", "\n", "Try to depend on as few other notebooks as possible. This will not only ease construction and reconstruction of the code, but also reduce requirements for readers, giving then more flexibility in navigating through the book.\n", "\n", "When you import a notebook, this will show up as a dependency in the [Sitemap](00_Table_of_Contents.ipynb). If the imported module is not critical for understanding, and thus should not appear as a dependency in the sitemap, mark the import as \"minor dependency\" as follows:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:43.627461Z", "iopub.status.busy": "2024-01-18T17:31:43.627357Z", "iopub.status.idle": "2024-01-18T17:31:44.103216Z", "shell.execute_reply": "2024-01-18T17:31:44.102888Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from Reducer import DeltaDebuggingReducer # minor dependency" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Design and Architecture\n", "\n", "Stick to simple functions and data types. We want our readers to focus on functionality, not Python. You are encouraged to write in a \"pythonic\" style, making use of elegant Python features such as list comprehensions, sets, and more; however, if you do so, be sure to explain the code such that readers familiar with, say, C or Java can still understand things." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Incomplete Examples\n", "\n", "When introducing examples for students to complete, use the ellipsis `...` to indicate where students should add code, as in here:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:44.105257Z", "iopub.status.busy": "2024-01-18T17:31:44.105124Z", "iopub.status.idle": "2024-01-18T17:31:44.107144Z", "shell.execute_reply": "2024-01-18T17:31:44.106736Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "def student_example():\n", " x = some_value()\n", " # Now, do something with x\n", " ..." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The ellipsis is legal code in Python 3. (Actually, it is an `Ellipsis` object.)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Introducing Classes\n", "\n", "Defining _classes_ can be a bit tricky, since all of a class must fit into a single cell. This defeats the incremental style preferred for notebooks. By defining a class _as a subclass of itself_, though, you can avoid this problem." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Here's an example. We introduce a class `Foo`:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:44.108859Z", "iopub.status.busy": "2024-01-18T17:31:44.108741Z", "iopub.status.idle": "2024-01-18T17:31:44.110592Z", "shell.execute_reply": "2024-01-18T17:31:44.110319Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "class Foo:\n", " def __init__(self):\n", " pass\n", "\n", " def bar(self):\n", " pass" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Now we could discuss what `__init__()` and `bar()` do, or give an example of how to use them:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:44.112131Z", "iopub.status.busy": "2024-01-18T17:31:44.112016Z", "iopub.status.idle": "2024-01-18T17:31:44.113774Z", "shell.execute_reply": "2024-01-18T17:31:44.113346Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "f = Foo()\n", "f.bar()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "We now can introduce a new `Foo` method by subclassing from `Foo` into a class which is _also_ called `Foo`:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:44.115361Z", "iopub.status.busy": "2024-01-18T17:31:44.115236Z", "iopub.status.idle": "2024-01-18T17:31:44.116889Z", "shell.execute_reply": "2024-01-18T17:31:44.116652Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "class Foo(Foo):\n", " def baz(self):\n", " pass" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "This is the same as if we had subclassed `Foo` into `Foo_1` with `Foo` then becoming an alias for `Foo_1`. The original `Foo` class is overshadowed by the new one:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:44.118483Z", "iopub.status.busy": "2024-01-18T17:31:44.118361Z", "iopub.status.idle": "2024-01-18T17:31:44.119994Z", "shell.execute_reply": "2024-01-18T17:31:44.119726Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "new_f = Foo()\n", "new_f.baz()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Note, though, that _existing_ objects keep their original class:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:44.121579Z", "iopub.status.busy": "2024-01-18T17:31:44.121463Z", "iopub.status.idle": "2024-01-18T17:31:44.123031Z", "shell.execute_reply": "2024-01-18T17:31:44.122795Z" }, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from ExpectError import ExpectError" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:44.124601Z", "iopub.status.busy": "2024-01-18T17:31:44.124493Z", "iopub.status.idle": "2024-01-18T17:31:44.126205Z", "shell.execute_reply": "2024-01-18T17:31:44.125939Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Traceback (most recent call last):\n", " File \"/var/folders/n2/xd9445p97rb3xh7m1dfx8_4h0006ts/T/ipykernel_84307/526006573.py\", line 2, in \n", " f.baz() # type: ignore\n", "AttributeError: 'Foo' object has no attribute 'baz' (expected)\n" ] } ], "source": [ "with ExpectError(AttributeError):\n", " f.baz() # type: ignore" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Helpers\n", "\n", "There's a couple of notebooks with helpful functions, including [Timer](Timer.ipynb), [ExpectError and ExpectTimeout](ExpectError.ipynb). Also check out the [Coverage](Coverage.ipynb) class." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Quality Assurance\n", "\n", "In your code, make use of plenty of assertions that allow catching errors quickly. These assertions also help your readers understand the code." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Issue Tracker\n", "\n", "The [GitHub project page](https://github.com/uds-se/fuzzingbook) allows entering and track issues." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" }, "toc-hr-collapsed": false }, "source": [ "## Writing Text\n", "\n", "Text blocks use Markdown syntax. [Here is a handy guide](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet).\n" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Sections\n", "\n", "Any chapter notebook must begin with `# TITLE`, and sections and subsections should then follow by `## SECTION` and `### SUBSECTION`.\n", "\n", "Sections should start with their own block, to facilitate cross-referencing.\n" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Highlighting\n", "\n", "Use\n", "\n", "* _emphasis_ (`_emphasis_`) for highlighting,\n", "* *emphasis* (`*emphasis*`) for highlighting terms that will go into the index,\n", "* `backticks` for code and other verbatim elements." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Hyphens and Dashes\n", "\n", "Use \"–\" for em-dashes, \"-\" for hyphens, and \"$-$\" for minus." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Quotes\n", "\n", "Use standard typewriter quotes (`\"quoted string\"`) for quoted text. The PDF version will automatically convert these to \"smart\" (e.g. left and right) quotes." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Lists and Enumerations\n", "\n", "You can use bulleted lists:\n", "\n", "* Item A\n", "* Item B\n", "\n", "and enumerations:\n", "\n", "1. item 1\n", "1. item 2\n", "\n", "For description lists, use a combination of bulleted lists and highlights:\n", "\n", "* **PDF** is great for reading offline\n", "* **HTML** is great for reading online\n" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "### Math\n", "\n", "LaTeX math formatting works, too.\n", "\n", "`$x = \\sum_{n = 1}^{\\infty}\\frac{1}{n}$` gets you\n", "$x = \\sum_{n = 1}^{\\infty}\\frac{1}{n}$.\n" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Inline Code\n", "\n", "Python code normally goes into its own cells, but you can also have it in the text:\n", "\n", "```python\n", "s = \"Python syntax highlighting\"\n", "print(s)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "button": false, "ipub": { "figure": { "caption": "Figure caption.", "height": 0.4, "label": "fig:flabel", "placement": "H", "widefigure": false } }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Images\n", "\n", "To insert images, use Markdown syntax `![Word cloud](PICS/wordcloud.png){width=100%}` inserts a picture from the `PICS` folder." ] }, { "cell_type": "markdown", "metadata": { "button": false, "ipub": { "figure": { "caption": "This is Andreas Zeller", "label": "fig:zeller", "placement": "H", "widefigure": false, "width": 1 } }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "source": [ "![Word cloud](PICS/wordcloud.png){width=100%}" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "source": [ "All pictures go to `PICS/`, both in source and derived formats; both are stored in git, too. (Not all of us have all tools to recreate diagrams, etc.)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Footnotes\n", "\n", "Markdown supports footnotes, as in [^footnote]. These are rendered as footnotes in HTML and PDF, _but not within Jupyter_; hence, readers may find them confusing. So far, the book makes no use of footnotes, and uses parenthesized text instead.\n", "\n", "[^footnote]: Test, [Link](https://www.fuzzingbook.org)." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Floating Elements and References\n", "\n", "\\todo[inline]{I haven't gotten this to work yet -- AZ}\n", "\n", "To produce floating elements in LaTeX and PDF, edit the metadata of the cell which contains it. (In the Jupyter Notebook Toolbar go to View -> Cell Toolbar -> Edit Metadata and a button will appear above each cell.) This allows you to control placement and create labels." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Floating Figures\n", "\n", "Edit metadata as follows:\n", "\n", "```json\n", "{\n", "\"ipub\": {\n", " \"figure\": {\n", " \"caption\": \"Figure caption.\",\n", " \"label\": \"fig:flabel\",\n", " \"placement\": \"H\",\n", "\t\"height\":0.4,\n", " \"widefigure\": false,\n", " }\n", " }\n", "}\n", "```\n", "\n", "- all tags are optional\n", "- height/width correspond to the fraction of the page height/width, only one should be used (aspect ratio will be maintained automatically)\n", "- `placement` is optional and constitutes using a placement argument for the figure (e.g. \\begin{figure}[H]). See [Positioning_images_and_tables](https://www.sharelatex.com/learn/Positioning_images_and_tables).\n", "- `widefigure` is optional and constitutes expanding the figure to the page width (i.e. \\begin{figure*}) (placement arguments will then be ignored)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Floating Tables\n", "\n", "For **tables** (e.g. those output by `pandas`), enter in cell metadata:\n", "\n", "```json\n", "{\n", "\"ipub\": {\n", " \"table\": {\n", "\t \"caption\": \"Table caption.\",\n", "\t \"label\": \"tbl:tlabel\",\n", "\t \"placement\": \"H\",\n", " \"alternate\": \"gray!20\"\n", "\t }\n", " }\n", "}\n", "```\n", "\n", "- `caption` and `label` are optional\n", "- `placement` is optional and constitutes using a placement arguments for the table (e.g. \\begin{table}[H]). See [Positioning_images_and_tables](https://www.sharelatex.com/learn/Positioning_images_and_tables).\n", "- `alternate` is optional and constitutes using alternating colors for the table rows (e.g. \\rowcolors{2}{gray!25}{white}). See (https://tex.stackexchange.com/a/5365/107738)[https://tex.stackexchange.com/a/5365/107738].\n", "- if tables exceed the text width, in latex, they will be shrunk to fit \n", "\n", "\n", "#### Floating Equations\n", "\n", "For **equations** (e.g. those output by `sympy`), enter in cell metadata:\n", "\n", "```json\n", "{\n", " \"ipub\": {\n", "\t \"equation\": {\n", " \"environment\": \"equation\",\n", "\t \"label\": \"eqn:elabel\"\n", "\t }\n", " }\n", "}\n", "```\n", "\n", "- environment is optional and can be 'none' or any of those available in [amsmath](https://www.sharelatex.com/learn/Aligning_equations_with_amsmath); 'equation', 'align','multline','gather', or their \\* variants. Additionally, 'breqn' or 'breqn\\*' will select the experimental [breqn](https://ctan.org/pkg/breqn) environment to *smart* wrap long equations. \n", "- label is optional and will only be used if the equation is in an environment\n", "\n", "\n", "#### References\n", "\n", "To reference a floating object, use `\\cref`, e.g. \\cref{eq:texdemo}" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Cross-Referencing\n", "\n", "#### Section References\n", "\n", "* To refer to sections in the same notebook, use the header name as anchor, e.g. \n", "`[Code](#Code)` gives you [Code](#Code). For multi-word titles, replace spaces by hyphens (`-`), as in [Using Notebooks as Modules](#Using-Notebooks-as-Modules).\n", "\n", "* To refer to cells (e.g. equations or figures), you can define a label as cell metadata. See [Floating Elements and References](#Floating-Elements-and-References) for details.\n", "\n", "* To refer to other notebooks, use a Markdown cross-reference to the notebook file, e.g. [the \"Fuzzing\" chapter](Fuzzer.ipynb). A special script will be run to take care of these links. Reference chapters by name, not by number." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Citations\n", "\n", "To cite papers, cite in LaTeX style. The text" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2024-01-18T17:31:44.128487Z", "iopub.status.busy": "2024-01-18T17:31:44.128385Z", "iopub.status.idle": "2024-01-18T17:31:44.130139Z", "shell.execute_reply": "2024-01-18T17:31:44.129860Z" }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\\cite{Purdom1972}\n" ] } ], "source": [ "print(r\"\\cite{Purdom1972}\")" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "is expanded to \\cite{Purdom1972}, which in HTML and PDF should be a nice reference.\n", "The keys refer to BibTeX entries in [fuzzingbook.bib](fuzzingbook.bib). \n", "* LaTeX/PDF output will have a \"References\" section appended.\n", "* HTML output will link to the URL field from the BibTeX entry. Be sure it points to the DOI." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Todo's\n", "\n", "* To mark todo's, use `\\todo{Thing to be done}.` \\todo{Expand this}" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "### Tables\n", "\n", "Tables with fixed contents can be produced using Markdown syntax:\n", "\n", "| Tables | Are | Cool |\n", "| ------ | ---:| ----:|\n", "| Zebra | 2 | 30 |\n", "| Gnu | 20 | 400 |\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "source": [ "If you want to produce tables from Python data, the `PrettyTable` package (included in the book) allows [producing tables with LaTeX-style formatting](http://blog.juliusschulz.de/blog/ultimate-ipython-notebook)." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "button": false, "execution": { "iopub.execute_input": "2024-01-18T17:31:44.132044Z", "iopub.status.busy": "2024-01-18T17:31:44.131836Z", "iopub.status.idle": "2024-01-18T17:31:44.134598Z", "shell.execute_reply": "2024-01-18T17:31:44.134352Z" }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from bookutils import PrettyTable as pt" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "button": false, "execution": { "iopub.execute_input": "2024-01-18T17:31:44.136046Z", "iopub.status.busy": "2024-01-18T17:31:44.135936Z", "iopub.status.idle": "2024-01-18T17:31:44.137494Z", "shell.execute_reply": "2024-01-18T17:31:44.137230Z" }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "button": false, "execution": { "iopub.execute_input": "2024-01-18T17:31:44.139325Z", "iopub.status.busy": "2024-01-18T17:31:44.139197Z", "iopub.status.idle": "2024-01-18T17:31:44.141836Z", "shell.execute_reply": "2024-01-18T17:31:44.141558Z" }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "
$\\frac{a}{b}$$b$$c$
1230
23400
" ], "text/latex": [ "\\begin{tabular}{l|l|l}\n", "$\\frac{a}{b}$ & $b$ & $c$\\\\ \n", "1 & 2 & 30\\\\ \n", "2 & 3 & 400\\\\ \n", "\\end{tabular}" ], "text/plain": [ "[['$\\\\frac{a}{b}$', '$b$', '$c$'], array([ 1, 2, 30]), array([ 2, 3, 400])]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = np.array([[1, 2, 30], [2, 3, 400]])\n", "pt.PrettyTable(data, [r\"$\\frac{a}{b}$\", r\"$b$\",\n", " r\"$c$\"], print_latex_longtable=False)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "### Plots and Data\n", "\n", "It is possible to include plots in notebooks. Here is an example of plotting a function:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "button": false, "execution": { "iopub.execute_input": "2024-01-18T17:31:44.143519Z", "iopub.status.busy": "2024-01-18T17:31:44.143414Z", "iopub.status.idle": "2024-01-18T17:31:44.253175Z", "shell.execute_reply": "2024-01-18T17:31:44.252880Z" }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "x = np.linspace(0, 3 * np.pi, 500)\n", "plt.plot(x, np.sin(x ** 2))\n", "plt.title('A simple chirp');" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "source": [ "And here's an example of plotting data:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "button": false, "execution": { "iopub.execute_input": "2024-01-18T17:31:44.255004Z", "iopub.status.busy": "2024-01-18T17:31:44.254872Z", "iopub.status.idle": "2024-01-18T17:31:44.341620Z", "shell.execute_reply": "2024-01-18T17:31:44.341244Z" }, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt\n", "data = [25, 36, 57]\n", "plt.plot(data)\n", "plt.title('Increase in data');" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Plots are available in all derived versions (HTML, PDF, etc.) Plots with `plotly` are even nicer (and interactive, even in HTML), However, at this point, we cannot export them to PDF, so `matplotlib` it is." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Slides\n", "\n", "You can set up the notebooks such that they also can be presented as slides. In the browser, select View -> Cell Toolbar -> Slideshow. You can then select a slide type for each cell:\n", "\n", "* `New slide` starts a new slide with the cell (typically, every `## SECTION` in the chapter)\n", "* `Sub-slide` starts a new sub-slide which you navigate \"down\" to (anything in the section)\n", "* `Fragment` is a cell that gets revealed after a click (on the same slide)\n", "* `Skip` is skipped during the slide show (e.g. `import` statements; navigation guides)\n", "* `Notes` goes into presenter notes\n", "\n", "To create slides, do `make slides`; to view them, change into the `slides/` folder and open the created HTML files. (The `reveal.js` package has to be in the same folder as the slide to be presented.)\n", "\n", "The ability to use slide shows is a compelling argument for teachers and instructors in our audience." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "notes" } }, "source": [ "(Hint: In a slide presentation, type `s` to see presenter notes.)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Writing Tools\n", "\n", "When you're editing in the browser, you may find these extensions helpful:\n", "\n", "### Jupyter Notebook\n", "\n", "[Jupyter Notebook Extensions](https://github.com/ipython-contrib/jupyter_contrib_nbextensions) is a collection of productivity-enhancing tools (including spellcheckers).\n", "\n", "I found these extensions to be particularly useful:\n", "\n", " * Spell Checker (while you're editing)\n", " * Table of contents (for quick navigation)\n", " * Code prettify (to produce \"nice\" syntax)\n", " * Codefolding\n", " * Live Markdown Preview (while you're editing)\n", "\n", "### Jupyter Lab\n", "\n", "Extensions for _Jupyter Lab_ are much less varied and less supported, but things get better. I am running\n", "\n", " * [Spell Checker](https://github.com/ijmbarr/jupyterlab_spellchecker)\n", " \n", " * [Table of Contents](https://github.com/jupyterlab/jupyterlab-toc)\n", " \n", " * [JupyterLab-LSP](https://towardsdatascience.com/jupyterlab-2-0-edd4155ab897) providing code completion, signatures, style checkers, and more.\n", " " ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Interaction\n", "\n", "It is possible to include interactive elements in a notebook, as in the following example:" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "source": [ "```python\n", "try:\n", " from ipywidgets import interact, interactive, fixed, interact_manual\n", "\n", " x = interact(fuzzer, char_start=(32, 128), char_range=(0, 96))\n", "except ImportError:\n", " pass\n", "```" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "fragment" } }, "source": [ "Note that such elements will be present in the notebook versions only, but not in the HTML and PDF versions, so use them sparingly (if at all). To avoid errors during production of derived files, protect against `ImportError` exceptions as in the above example." ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "## Read More\n", "\n", "Here is some documentation on the tools we use:\n", "\n", "1. [Markdown Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) - general introduction to Markdown\n", "\n", "1. [iPyPublish](https://github.com/chrisjsewell/ipypublish) - rich set of tools to create documents with citations and references\n" ] }, { "cell_type": "markdown", "metadata": { "button": false, "new_sheet": false, "run_control": { "read_only": false }, "slideshow": { "slide_type": "slide" } }, "source": [ "\n", "\n", "## Alternative Tool Sets\n", "\n", "We don't currently use these, but they are worth learning:\n", "\n", "1. [Making Publication-Ready Python Notebooks](http://blog.juliusschulz.de/blog/ultimate-ipython-notebook) - Another tool set on how to produce book chapters from notebooks\n", "\n", "1. [Writing academic papers in plain text with Markdown and Jupyter notebook](https://sylvaindeville.net/2015/07/17/writing-academic-papers-in-plain-text-with-markdown-and-jupyter-notebook/) - Alternate ways on how to generate citations\n", "\n", "1. [A Jupyter LaTeX template](https://gist.github.com/goerz/d5019bedacf5956bcf03ca8683dc5217#file-revtex-tplx) - How to define a LaTeX template\n", "\n", "1. [Boost Your Jupyter Notebook Productivity](https://towardsdatascience.com/jupyter-notebook-hints-1f26b08429ad) - a collection of hints for debugging and profiling Jupyter notebooks\n", "\n" ] } ], "metadata": { "ipub": { "bibliography": "fuzzingbook.bib", "toc": true }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.2" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": true, "title_cell": "", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true }, "toc-autonumbering": false }, "nbformat": 4, "nbformat_minor": 4 }