From 06c88203b59ce11a2a93c405f2a9adff43349298 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 14:34:17 -0400 Subject: [PATCH 001/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index bcba4cf6..1d97d500 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -1,5 +1,5 @@ .. sectnum:: -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202022-purple +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-green ======================= Unix: Getting Started From d1ef810433eb84f8216d9e814dd5e07a3edd361d Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 14:36:04 -0400 Subject: [PATCH 002/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index 1d97d500..00862a15 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -1,5 +1,5 @@ .. sectnum:: -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-green +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen ======================= Unix: Getting Started From 577da89e24dd0d2ff27430cf938ddbe5f09c65e9 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 14:40:06 -0400 Subject: [PATCH 003/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index 00862a15..8855f490 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -47,7 +47,10 @@ emulator (or a "terminal window," for short) is displayed containing the output of the commands ``ls`` and ``tree`` (discussed later). On the right, the graphical Finder app is displayed containing some of the same information. Take a moment to convince yourself that both images are displaying roughly the same information -in two different ways. +in two different ways. On the left, the output of the ``tree`` command looks very +similar to the output on the right. The only difference is that the user typed +the command with the keyboard instead of double-clicking a folder icon as they would +on the right. Prompt and Circumstance ======================= From 248b0a7c1b8600447d9b30b04f7244e0afa4e8dd Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 14:46:53 -0400 Subject: [PATCH 004/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index 8855f490..57a0e4f6 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -32,8 +32,10 @@ Here are some examples of what such a prompt might look like: zsh% -The shell is just another way to interact with computer. These days, all -students are familiar with the point-and-click graphical windowing systems +The shell is just another way to interact with computer. Think of it as an interface +that allows you to type your commands on the keyboard instead of clicking icons on the +screen. Both interfaces allow you to do the same things, just in a different way. +These days, all students are familiar with the point-and-click graphical windowing systems provided in operating systems like Windows, macOS, and even phones. However, only some realize that the windowing system they're used to is only one way to interact with a computer. Consider the figure below. From 48b8e1e6c9b55585a71fbeb4cb1fba737b772590 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 14:52:17 -0400 Subject: [PATCH 005/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index 57a0e4f6..8ce6dab9 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -114,9 +114,12 @@ system's documentation. Local Terminal ============== -When you run a terminal emulator, the usual default is for it -to connect to the same computer it is running on. This *local terminal* -provides a shell with a command-line interface to that computer. Consider the +When you run a terminal emulator on your local (personal) computer (laptop or desktop), +the default is for it to connect to the same computer it is running on. In other +words, any commands you type will execute on your local computer. For example, +executing the ``ls`` command will list all of the files in the directory the shell +is working from on your local computer. This *local terminal* +provides a shell with a command-line interface to your computer. Consider the figure below. .. figure:: img/local-terminals.png @@ -136,11 +139,14 @@ operating system. Remote Terminal =============== -To make sure that readers all have roughly the same experience with the tutorial, -we will instruct them to use a local terminal to launch a program that will +In this course, you will rarely be working from your local computer. Instead, +we will instruct you to use a local terminal to launch a program that will connect their terminal emulator to a remote computer (often referred to as a server). Once connected, that *remote terminal* provides a shell with a command-line -interface to that remote computer. Consider the figure below. +interface to that remote computer. Once connected, any commands you type will execute +on the remote computer instead of on your local machine. So, typing ``ls`` will list +the contents of the remote directory instead of a directory found on your computer. +Consider the figure below. .. figure:: img/remote-terminals.png :alt: iTerm 2 on macOS Big Sur (left) and MobaXterm 21.2 on Windows 10 (right) From 14514de6a6dc3af3ae6140c4cedaf8350a750d76 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 15:25:19 -0400 Subject: [PATCH 006/212] Moved windows/mac setup tutorials to this directory from the exercises directory --- setup/MacOS.md | 123 +++++++++++++++++++++++++++++++++++++++++++++++ setup/Windows.md | 88 +++++++++++++++++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 setup/MacOS.md create mode 100644 setup/Windows.md diff --git a/setup/MacOS.md b/setup/MacOS.md new file mode 100644 index 00000000..17bc51fb --- /dev/null +++ b/setup/MacOS.md @@ -0,0 +1,123 @@ +# Setup on macOS + +![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) + +The following instructions are designed to help get you up and running with macOS for development +in CSCI 1302. The majority of the time, you will not be developing directly on your Mac. Instead, +you will use your Mac to connect to a remote server via a terminal emulator. Once connected, the +commands that you type and the programs that you run will be executed on the remote server instead +of on your local machine. + +## Setup `Ctrl-` + +If typing `Ctrl-` (i.e., `⌃Space`) changes your keyboard layout, then you will need to +adjust some settings as that keyboard shortcut is used heavily in one of the programs we'll +be using this semester. **If it doesn't, then you can skip to the next section.** + +To fix `Ctrl-`, go to the "Keyboard Settings" for your Mac, then select the +"Shortcuts" tab. Find the shortcut that is mapped to `⌃Space` and either change it +or disable it. Once you've made the change, you should be all set as far as +`Ctrl-` is concerned. + +## Open Terminal + +The macOS operating system comes with a [terminal emulator](https://en.wikipedia.org/wiki/Terminal_emulator) +called [Terminal](https://support.apple.com/guide/terminal/welcome/mac). + +1. **Open Terminal.** On your Mac, do one of the following: + * Click the Launchpad icon + + in the Dock, type `Terminal` in the search field, then click **Terminal**. + * Click the Spotlight icon + + in the upper-right corner of the menu bar (or press Command-Space), type `Terminal` in the search field, + then click **Terminal**. + * In the Finder + , + open the `/Applications/Utilities` folder, then double-click **Terminal**. + +2. **Explore.** At its core, macOS is powered by a powerful Unix-like kernel called + [Darwin](https://en.wikipedia.org/wiki/Darwin_(operating_system)). + Using Terminal, you can interact with your system using most Unix commands. + +## Use Option as Meta + +Some of the programs that you will use this semester will require the use of the META key. +On some systems, this is the same as the ESC or ALT key. On a Mac, you can set Terminal to +use the OPTION key as META. + +1. **Open Terminal.** +2. In the menu bar, click **Terminal**, then click **Preferences**. +3. In the window that appears, select the **Keyboard** tab in the pane that appears to the right. +4. Near the bottom of the pane, check the box for **Use Option as Meta key.** + - **The setting does not take effect immediately!** + It will take effect the next time you open **Terminal**. +6. Quit the **Terminal** app by selecting **Quit Terminal** from the **File** menu (or by + pressing ⌘Q). + +## Install Homebrew + +[Homebrew](https://brew.sh) is a package manager for MacOS. It makes it really easy to install programs +on your Mac via [Terminal](https://support.apple.com/guide/terminal/welcome/mac). + +1. **Open Terminal.** + +2. **Install Homebrew.** + To do this, you will need to type a command at the prompt. + + 1. When presenting commands, we often prepend the start of a command line with a `$` + to denote the shell prompt. The `$` lets you know that the line that follows is + something that you should type into your terminal emulator at the shell prompt, + which usually ends with `$` pr `%` followed by a white-space. + **Do not type or copy the `$` before the command name as it is not part of the command.** + + 2. When installing Homebrew, the installer may ask you for a password. If it does, then + it is referring to the password for your Mac. + + 3. To run the Homebrew installer, type the following command: + + ``` + $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + ``` + + 4. Homebrew must be installed to continue. If installation fails, inspect the messages emitted + by the installer -- in most cases, it will tell you what you need to do in order to fix + the issues that are preventing installation. + +3. **Install Utilities via Homebrew.** Type the following command to install [git](https://git-scm.com/) + and [wget](https://www.gnu.org/software/wget/): + + ``` + $ brew install git wget + ``` + + **If you run into issues with `brew install`**, then please try running `brew doctor` first to see + if it has a suggested fix. If it does, then try the fix. If it doesn't or if it does but that doesn't + resolve your issue, then you may need to ask Piazza or see instructor during office hours. + +## Install XQuartz + +[XQuartz](https://www.xquartz.org) is an open-source version of the +[X.Org X Window System](http://www.x.org/) that runs on MacOS. +Installing XQuartz will enable you to forward the graphical user interface +for remote programs that you write later in the semester to your local machine. + +1. **Open Terminal.** + +2. **Install XQuartz.** Type the following command: +3. + ``` + $ brew install --cask xquartz + ``` + +3. **Restart your Mac.** The best way to restart your Mac is to choose Restart from the Apple () menu. + +
+ +[![License: CC BY-NC-ND 4.0](https://img.shields.io/badge/License-CC%20BY--NC--ND%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-nc-nd/4.0/) + + +Copyright © Michael E. Cotterell, Bradley J. Barnes, and the University of Georgia. +This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License to students and the public. +The content and opinions expressed on this Web page do not necessarily reflect the views of nor are they endorsed by the University of Georgia or the University System of Georgia. + diff --git a/setup/Windows.md b/setup/Windows.md new file mode 100644 index 00000000..a3155de2 --- /dev/null +++ b/setup/Windows.md @@ -0,0 +1,88 @@ +# Setup on Windows 10 & 11 + +![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) + +The following instructions are designed to help get you up and running with a Windows 10 or 11 +PC for development in CSCI 1302. The majority of the time, you will not be developing directly on +your PC. Instead, you will use your PC to connect to a remote server via a terminal emulator. Once +connected, the commands that you type and the programs that you run will be executed on the remote +server instead of on your local machine. + +## Install MobaXterm + +For Windows 10, we recommend the use of a [terminal emulator](https://en.wikipedia.org/wiki/Terminal_emulator) +called [MobaXterm](https://mobaxterm.mobatek.net). + +1. Download and install the free Home version of MobaXterm (Installer edition) at the link presented below: + + **WARNING:** If you download a `.zip` file for one of the MobaXterm installers, then you need to fully + extract the `.zip` file into a folder before attempting to install. Do not attempt to run the installer + from within the `.zip` file. Instead, run the installer program from within the folder that you extract to. + + ![WARNING](img/in-zip-file.png) + + MobaXterm Website: https://mobaxterm.mobatek.net/download-home-edition.html + +## Setup Backspace (Required) + +MobaXterm often modifies the backspace key to send `C-h` (`^H`) instead of the +proper backspace key code. This can cause problems if you regularly use the +backspace key to perform backward deletions (very common). To fix this issue, +follow these steps: + +1. Open **MobaXterm**. +2. In the menu bar, click **Settings**, then click **Configuration**. +3. In the window that appears, select the **Terminal** tab if not selected already. +4. Near the bottom of the window, make sure the checkbox for **Backspace sends ^H** is + *unchecked*, then click the **OK** button to close the window. + - **The setting does not take effect immediately!** + It will take effect the next time you open **MobaXterm**. +6. Quit **MobaXterm** app by selecting **Quit** from the **Terminal** menu. + +If this is the first time you are reading these instructions, then make a note +to yourself to return to this section if you encounter backspace issues with +MobaXterm in the future. The steps below should only be taken if you +are returning here to resolve a backspace issue: + +1. First, try repeating the steps above to *uncheck* the **Backspace sends ^H** + setting -- remember to quit and relaunch **MobaXterm** before attempting to + verify that your issue is fixed. + +2. If you still encounter backspace issues, then **MobaXterm** may not be honoring + the *unchecked* state of the **Backspace sends ^H** setting. To remedy that, + open **MobaXterm**, launch a local terminal, but **do NOT connect to Odin**. + Instead, enter the commands below to deploy a configuration file that should + fix the issue: + + ``` + $ wget http://cobweb.cs.uga.edu/~mec/cs1302/mobaxterm.bashrc + $ mv mobaxterm.bashrc .bashrc + $ source .bashrc + ``` + + Now, you should be able to `ssh` into Odin with MobaXterm and have your + beautiful backspace key work as intended! + +## Setup `Ctrl-` and `Ctrl-X` (Required) + +In newer versions of MobaXterm, `Ctrl-` (`Ctrl + SPACE`) and `Ctrl-X` (`Ctrl + Shift + X`) +may be mapped to MobaXterm-specific shortcuts. This will cause problems when it comes time to +work in Emacs as those key combinations are used quite often. Please update +your MobaXterm settings by doing the following steps: + + 1. Select "Settings" from the menu bar, then "Keyboard shortcuts". + 1. In the window that appears, find and select the shortcut for "Ctrl-SPACE" or "Ctrl + SPACE". + 1. Once selected, find the "Edit keyboard shortcut" dropdown list and + change it to "" or `` (which should be at the top of the list). + 1. Repeat the previous step on the shortcut for "Ctrl-X" or "Ctrl + Shift + X". + 1. Select "OK". The issue should now be resolved. + +
+ +[![License: CC BY-NC-ND 4.0](https://img.shields.io/badge/License-CC%20BY--NC--ND%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-nc-nd/4.0/) + + +Copyright © Michael E. Cotterell, Bradley J. Barnes, and the University of Georgia. +This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License to students and the public. +The content and opinions expressed on this Web page do not necessarily reflect the views of nor are they endorsed by the University of Georgia or the University System of Georgia. + From f9a8da5aecea6a55c4597b3be67d2810b7446fc9 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 15:27:09 -0400 Subject: [PATCH 007/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index 8ce6dab9..245ac676 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -101,8 +101,8 @@ that you can follow along with the tutorial. If you are using a Windows computer or a Mac, then please follow the instructions below that best match your computer's operating system. -* `Setup on macOS `__ -* `Setup on Windows 10 `__ +* `Setup on macOS `__ +* `Setup on Windows 10 `__ (should also work for Windows 11) If you are using a Linux computer or a computer running a Unix-like operating From 85bc929c88a1f6cd74ba998a96a499229eb356b7 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 15:32:17 -0400 Subject: [PATCH 008/212] Update MacOS.md --- setup/MacOS.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/setup/MacOS.md b/setup/MacOS.md index 17bc51fb..9335b033 100644 --- a/setup/MacOS.md +++ b/setup/MacOS.md @@ -1,6 +1,6 @@ # Setup on macOS -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Spring 2022]([https://img.shields.io/badge/Approved%20for-Spring%202022-purple](https://img.shields.io/badge/Approved%20for-Fall%202022-lightgreen)) The following instructions are designed to help get you up and running with macOS for development in CSCI 1302. The majority of the time, you will not be developing directly on your Mac. Instead, @@ -14,7 +14,8 @@ If typing `Ctrl-` (i.e., `⌃Space`) changes your keyboard layout, then y adjust some settings as that keyboard shortcut is used heavily in one of the programs we'll be using this semester. **If it doesn't, then you can skip to the next section.** -To fix `Ctrl-`, go to the "Keyboard Settings" for your Mac, then select the +To fix `Ctrl-`, click the apple icon in the top-left of your screen then select "System Preferences". +From there, go to the "Keyboard Settings" which may be just called "Keyboard", then select the "Shortcuts" tab. Find the shortcut that is mapped to `⌃Space` and either change it or disable it. Once you've made the change, you should be all set as far as `Ctrl-` is concerned. From c60d66d017b0e5d1dc3f452c9fa551aef7759730 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 15:32:52 -0400 Subject: [PATCH 009/212] Update MacOS.md --- setup/MacOS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/MacOS.md b/setup/MacOS.md index 9335b033..0288b796 100644 --- a/setup/MacOS.md +++ b/setup/MacOS.md @@ -1,6 +1,6 @@ # Setup on macOS -![Approved for: Spring 2022]([https://img.shields.io/badge/Approved%20for-Spring%202022-purple](https://img.shields.io/badge/Approved%20for-Fall%202022-lightgreen)) +![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-lightgreen) The following instructions are designed to help get you up and running with macOS for development in CSCI 1302. The majority of the time, you will not be developing directly on your Mac. Instead, From b8499a8f84b392ffe1a5620096b26222052a82b0 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 15:33:39 -0400 Subject: [PATCH 010/212] Update MacOS.md --- setup/MacOS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/MacOS.md b/setup/MacOS.md index 0288b796..e459235d 100644 --- a/setup/MacOS.md +++ b/setup/MacOS.md @@ -1,6 +1,6 @@ # Setup on macOS -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-lightgreen) +![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) The following instructions are designed to help get you up and running with macOS for development in CSCI 1302. The majority of the time, you will not be developing directly on your Mac. Instead, From a033603bf46bed7d2849e70a0c559fa8bb896eb0 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 15:38:06 -0400 Subject: [PATCH 011/212] Update Windows.md --- setup/Windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/Windows.md b/setup/Windows.md index a3155de2..53dbe419 100644 --- a/setup/Windows.md +++ b/setup/Windows.md @@ -1,6 +1,6 @@ # Setup on Windows 10 & 11 -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) The following instructions are designed to help get you up and running with a Windows 10 or 11 PC for development in CSCI 1302. The majority of the time, you will not be developing directly on From 353ff27c472d727877208d15a72570082760999c Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 15:39:41 -0400 Subject: [PATCH 012/212] added image for windows setup tutorial --- setup/in-zip-file.png | Bin 0 -> 267579 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 setup/in-zip-file.png diff --git a/setup/in-zip-file.png b/setup/in-zip-file.png new file mode 100644 index 0000000000000000000000000000000000000000..19af666a77edcdb50f5b899cde3a10dbeb3fd452 GIT binary patch literal 267579 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

@3tcuSF*=A*;c&Hlh>dd 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

  • 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 +~+|+j0#z|HjwuB18Qcg1uaQ(SAO*CkS zkKgoR)*MlB8DoAq{zydOkdH4#hM9e2Fjgg(8;_0T=OrRc6S1F1V zecQO4`jzZ$Xz?y;{oP{F|EF8a>`qQd_yVCozAMB%AjrpFE~)2whQ~T<%>hO7@@fCJN9TV zrsnB}!*|)bA)_I_@44|QIZh5GeQ~CQ6fM4SVWM5Y9H0tPPt{H2R6{pZj@ff*E_WZ< z+*7EVsJ(veHoGq}T5zgOR5O!S8vR{I=gU;RV=tD;!qrXru_4W~*;SOa;h{DO2DG#dNR$HPM5BA0yx3mw|7 zc+Lpmaa0)jO}cUfasq^bnE6hVlm&<%B^3l;ZR zi9U@`^M8P~@R{(;Lp}8BO=M7!?JW*uu9P<2^LSnYk|=Z#{#~<4Tv<$cYbbKG!8((g zi%x{>AuRj}@AN`$uF~(1hK{M>IZAd#NjjM(we`gBQ$*8)L5T+)`ey0zhl zbOAS=rUIM`tR-(P-@UMLR*wJ9x19Dz50u|Y=$|DP|Nck`wO z9QHxPnP1AlPsP-%_m!>@I>nOnJst6W)a*EY>9Zk*7;8`NKVKv?O{89^(**a8C;{*5 z`)E6dAV&!YYot*%^k~vbi)1t$;u#SB#(yf@W`=E!Bmql?f?H)K_t%mQ+(st#vEBW0 zl5T#dW}H>CG{c_6)ZHGMl5}e;fjAvlsOy#@IJy2Ik(#)okcz~Akp$myPJm#pkA`ji zD!!AL#t%KBxTSXQyoAfw74RbPQ5%ZC59gScIE&2IOPG7IqX#hxiCtws6mT0Wsv3Srp>l>AIWx_bVJwrBDgg~>I+z_&@)(j8ao zI-*!f2&^Z(9JlG^k|x7Vl&{Z>kDkvAQ4C++850&b*Dx`DY2Ide+$kT^xTf1ayEBlL zN|YUhuK6-WRr0T!;@8&AiMTMS*Z|?SBZ=SXyOYEo_0!Ax`TOu2bjx#<_6a)S%CnQR z3Ic*vpq0zJ-lZ&kuu*bTe@<($G*)gN7#tkULW$Yz3F=b~FkMjb4CQ*5EI8Kj0A0DgeF}vC3O;PmCyIgPU&ud4L>4mD}r#n z+ivO!zOm;n7yTnG9Co>ncZjrK5np6K6Da!_Lc4})Ggm4_$liaVLrqD1nI`|(Z_q_h zF=LCIm!@W@K>_`9;RcG~em|*~0zQ7+!DU15+oG3zP1u4z1}0*Lu+a}}2kDh8tY0uL zj8X9(Z4kLUdr0;2#`c<~hGRA6cc;}C-YAsf!|yWjp|sX4%hy3~6(SA73VAoPc90&K z^V9sQ3TK1p2O4p#TC6v5WF}^1Bnj#C_p5RQW~G!G{^QM9UG8AG!lUaKS9RrV;1j!% z)HJ?KQX;1-tx7I~=56B+eEHx!F8CSYNIK!>l($#&#o{!c2!@bwR^;}s9f5E9syQ;d zR+&vgyRAKBxq|?hmlJ|@-U8sG& z9vgbcHqalM7E^Un+&2l?2rtGw6P5LttxuV+XnV-k^Zo+`GxFyuB}WtwbtnS?lfH z|G46)k;`~2zvjQbbv2P2#2wc_qrngABa9K-%2RlF)@HqHrm>1Nkrnun?%|u-3Bh7q zzHgG2LN04TlXC#>Y=g_rlm ztP>j6EW#)&T_SAz+RHMH`!~YQLG#}Nf)i^TiEHzS7y?Hc@J7CgI0q(D7?SXRm^!O~ zs-m`AE1`6!ba!`4m!x!xfYRNmu<7oQ?(XgeX^?K%z^1$NEWY!f|9rRJ7`Wz~?|8>} z1~H8y9P}qy;8BP8V=Ohm^R!*F1~gpopBv39staIwo&%Y?WDUJM8T5ab*&eD!m?fGT z5%Rz>2}cd%7kVaQxA6{mx*!htj${b6Mq=tGso>#`2459Yvj{<*L3;rf63~w?0Yob z3h14q4q>dQxvjo2iaYPx&6;?X0u5;qDA&}8(d-ZEC9(;l%M+L^;Q!&X2i{gSiWB7l>sGFGAET*r3-{o?0q{?#0|f zyBjHLlLA-9GicpJPEe`In@%xd~N=O-@^s<7w@`&sOeL^0X9r zp|E&sD4z#NsUHXx(>whvt93A3jI^U=-5iFJL_Ru5Na`HIQ?7kp3CO*>9p$228Hyyw zMj-oHfTUI)9nY)RZifP4*6*9eoBC*gJGDH@=RjurqBj)tx2(Xj$>*L>F|8A{plh0o zmcm7Fu|4v8MLSpZM&yNjJZzy5l55-#g|m!+8%n7i!}pULi!mBgrG*>*9}z~>LRgM( zA@hcu7`a>HXR`#Uo#C*y=1bDT*3PRth9;*A&T+$*K)l3k4LLRH?Qv~9cSjQ`lNyJR zU;$Ss$hhIa4nfGIHB5kuk4ZxsZFDQCgbUSw9Z4{3P<16>sDH*$LIt)!9##L?MfvkRc^8~if1t-2GSK#=H@z^Cu{8l>LqGyW72+JK-j&& zy-YFoED2q^5_%2oMK71vS<@q#>BRjtyYMdI2U$IN&b7 zvwrHh0QbA!BIeVStkh^B-Ua8-seQgcA`%8-{#i^wbIbp^O3WM0;7Jl> zN>_22Z<2S9Od^GnoF}A0Ez05|tNE|NPy}rl0d2c%eEcBqb02oH4>nKwCEwzP z!lbNi#UCr&qwNmZf3WD^8x}BxoozxZs5IM?2tF=vzD~y-6Ac_hJ>-aAADB&^e6_-Y zI92FPT%zuxoP;i0a*8d}{QRa_;~@L-)A&YDN9NhTzKW(?Q*5(a1M~qyN-=VkUhU5`215XQ^vmZnkoqX@4|r>->h96PJK3;qlbT+hGs2_Guc) z`4jI_N$79_KlsE4v-;tRin7tDIW(+L1Kf!EG0QT4SoRJr_k;74*(AZ8iN8SkT^Mhj z1AW1jSzxQprVgySt*u|7ut5mXV7dTK(4l67@ge~#`0vuJ@<>dl2lmY2rC^64Ma7{n z?p$-$(%UTYKeG*~4El!OGslD=#j3!3bCZ)Oa1aA$n+MF^oS~En+zk*@{C(cujy^|* zNuXCCaumb^5()7z1OjT(S7@M)B8F&Zn18K)YlKH_jZh(9NtX};&;Nl@+Z~7Dkll+| z#a$n-*36~xT7Fx4D+!*1oY+1=r}H^V@pldv{nyy=pEnL16-?~nX~9jGS&WjrkK)n2 z%JCg(R^X{0EMk|IPukHxY&@pNebqDI-85f+%wZ~5gIvh<{xJK-4zS*d9$$Ty(aNR? zfOT;(d;Exi`t&ny{yFGlc_;AU6$_EA@|Iv zog-!{bln;5AiDPOJ8a)~HFI`qKOYFZH?blK1z9eVBqrt*uB)I6VAB)>)r$g4>OW;q zP8_1$o*EINLF7Uro=4H>>?W{6!qu!;v2+Tg5qA7&jd(Le=e_S(bn$vPF1}E!NP;lg zBMD!>-AJ>*HG20P_R4PZlF9$zblVbD!x_E!ecIViLg3rmlW#qlXYM@1Gj%x0Y%^dh zf+8LjGAPmCem<6ZYiHPhG_-3raK%IXG07+L_Mz=p$YVbq!HoEAhI%x`vI=2F<9pqC z-|*~-qrNhT$iUM3ibQ7VstZUA-u-lvmWvE0dFcGfEaGhcv-cBZU+etVR*SQfOvlMA zG*RUU=J-O>cm<65eR?#P*8_iuiBnuxWb#vhBH^G*_Fc_&k_4mIfxQ}CG-5!1`MYdo zJ39zg+fx_XQ(bza6qD0|8ghSVdUq@p!P)H$Dx1f($B~<*a7X7l-@xg6#!vSMYi{13 zG=7dpgeyF5OkLOyHQkbUHU2=>uwD%$O4rF>uowSbj}LbY#nuVexW4=C6pi4JxP) z&2@Q#x56fwDV=)>X%14{q{HHD3OvdM2F(8*KK-!Yx6A{fAEkV~?{R09nw1&z;)|`W zl{Qpf7u&Ml#7e4Bp`B^Hj-||4lF;ao2Y{-=3-ou?L>M65JxB97{_qB95z)ltW#9Wl zhmu$_=Z$$vyU-ic@<^+V3>|hyi;cTa0f8eG=4g4KEYp04P`@aSQ`qf{bT9i2!u*ZU zQKuG{LF3C{-27rD2IFnZD4y&cppPacYRgsu5Dsv`eVa36VwlJm70B6eTFVEXK`!%v z5M#l0lfYlkpfzZ3DnODF1*9l%b^Wdb*$CHw)@~;48VOYB`z~nIrV)(k{bD{JdO}vp z=_g`a!Q({e)!<_vYUI5mEa7pC+8EW0Hq*b zP@g3vk;i@SI;>Wj*c>3^)*356Ax%=llV8(55&@gS^*#Ln%N_t5J`V}@%9sa2MWh4z z!UV~v407_92qY-Wh3c@qPm{~QXd2{lcO(k0>=jzkf(KC#}nXnce?y0z8HL*8}#-OuVJ>~6x-QlfiG}H zYUZV1LH`)IwaLTS*&K??5{W@22gEHtJhbn#FqR#tPbdJF)V;DeDXUcz@=VjhJP;2y z>L)H3Y|5<{<`L!uaEq`V$$ajeq$}y2fbiLJQ_)LBjEmTece5R*^dbJp6^Vt>7S||* z1@6q-J77n+J`{GW5u*6tfPgi4lhS>?UF{e2&anz5C$HxubQY`dTe5! zbfEPAhVhe2mSu)={9>Gq4b^`66C4In+&c5=9+RFG!#?lG{s?7`PJ|prdQK2_r|`N5 z^0l|mTNmUJcwNUsvcRTMm>|G1(mfn#2Zewk-)l8U(hUeAjGkd*(#hm(dCntL7G4KA z3CGiM@nP5^1p^b_;c6Q122o5JZ}XdkdqI80i5m32hFP50lnJrhAxT8MPZbViDU9qP zGVPJ1eTOdg*-by#?NM;f>*CWuZ{S5bHSDZ6HBg*I^)~9R#4uM{w##r5)lIl)F>Hcuqj;vVi4&7WfQE5i8|z#f-ZifYxL1K;od$sibPOMl!- z_nAHR83m*o_lManp0LO@zzSjja7Y2nrlMwOEEA^Oy{hGtm!cz?p;RC$$qDx2shR)j zIuK|esQocEjqFRff8rx+P?!hG3uU)<<^pSr0%=aoVmC0)up& zfVwL7=rx8Boy;0e)kOpxFXtj~1Qtz1l&094pZITx@MN>_5oYkdLI>#DxvYFEn zD}F@{qdh04gD((%;TZYu##}DMgZwcYc+374`)qb}g|o!(=Xz5K4DTA4h=w|V$)58( zs5}HW?q#_^fuP*=bZrR;qUD50!YeT1?L+#+)edJ%lc?)Xxw4&)*2hz3iG3yI1@H3{ ztEm4ZR?+Lp>k$-CRp8z{5cHoG*ePHV+;S1yns|T~aQ6k*NF!4;pDeaCbu&ff^=PKG z2Q8}0OOXq!mM-<)XGvloWGnEOncIhaSX`kdnt6F@Yn;Q2(P@AZ zuMZ$!N8XLdD2}jF5fiWWtb6Qyo>$m^UfP<{uj3!e#;)Mg(4}&Cp1(pl9vngBi0RoLm>l&XuX9Men#e=^`9Ke^XdkHT+HPCJmhi>?e6caZ zt?Z|ihrfmvh7RaY1|aSQSqt1YD@E{Qt_qB-Ykmf_(&l3Da_fCCR~ju#D*t&Ji~9dc zUJgl;pKh?yo^)cs<0lu?*+13q@EmIZfcPA;IL6kEG-Vf@)kXOsunNW8 zgw}jM{bIFq0KGk8{li*tRmWtXm_Id6yWl}kuE-Piw*MS}5mAV~Tyv7eL|jQ#Caqc} zi4^U7Kfiu{$oNF8| z%cs-%VLxVkLQzsEVMf|*rX@$d_N4y95CGVT9~@}}X&jMHI$wQ88t&R{sR5O})|99X z7o=-fYq636Ce+dL(rzFtOXl3%(t9|)2ZUhP<$`of^K1Qc012-1o&J(%6jBuqm(yD# zR3Y>?Sh=mHEX;kBk}0YaV5}#CA@!I>cyZo;Qa8yw6=|2LEOpT)JOsQNqkud-5M+*_ zF6%Wdy)^Hb$uJIP{qVQS{`Qsvi~Gvn7YOF0lGf%8^UkXSSy=@%J>lLH;Ov_PvHw2y z;k_;X*6p_hg2&`EYG#dLHiwr{V`a4toP?ECik$_K~NI40@`5B*du4=C~sL6x=9CBN8~AS_DU`?Fb}`F zI0l8Nw4B-HyopbA1LL+li>E&z9sv&R)L5}!XK4OJFP-Ae`yj~slmmUDiSym~&?lGe zW42nG=$|Vu03%?1S?~Fp!?AxWxb9)aiHA6$0xeps%iS8=%w}+0_sRN$qFJ}tA^v&R zd_C8`OF(K=-BzK-GSDOHG^XkSmE}SWZutt1|76MjDb|NTRzd@`a~N8MkqcV)HX@%YG#=RQ71RqJ>XE+9L#ODI3zECjagK*o)JfU>_$|HX!$-F zxi5uca!cC!Un54r%Tn)g(>Db+SyoRTM@aZC3b~ABI(Yn@UuZgo>N%_vU%qiA?~EbW zQ!`Mm%RIczqEQ|PmtM){pjEQC=I1zK_eI3;L&396*q(}5-IzMSe9VUX41 z%FG+!YTILY)Ll?#7!QP_8`O?6l|`JrwOTvjzB;|0h5%pYiR^m%$dK0k<;!}NsF#0J z43Lk~GVn(rx58(VEC-R{-#woynzSKTl@;Q=coYt>P_n-Rp0cD^RYFV|yCbk3Pj!rX03jaB1`vVHnyGku-TORs%GweC<@jv%xdyt zfdu*2U8^B7u_hWl{>ZSNudUQMP?YAlGHTc)VTW7B2W?p?6rtPiDY^;lrZBMo{s`$F zxL!u{Cd1U3E%j@`rW)C2!;n}rZmr%Qf{z~P>p1}!PZ zA|?ybz?!-|+t0xtR;xAGfcru6+%kkWi3JCjIivgD_!GH2V&fx>WTio`p>891hAm4m z?30yu;4dj)O zQFXZ4lj9&4hK{Z$lJ&miyJsz5X)d)g{g22c>Y~N3FNARkUqAl0GAaVK+-N%pX!{Ja zDgq#pRi;>&IPI%=^E4Z%{gwnomNHF^y`GpIuUS-x3x44l!0ej}`PkB$h~4trqzKA3 z0hQZ!t&C;iZv#Qez06STqd{HQ41V(wy0}X&D&UQL@s&7=6KCPk)5r8%ym&0KI-u?Vk6 zS!2|eTF-wMFW}?*S}VHozqAMvl9HlsMG7i&F=%p^2!qM0V4iwN&{|}QF9Xs}KksD+ zPV6S-a}two;;tCd-*2KvMWilIclIeqf$n!5xriS0SdJ)t&BO@>g4mny<$2Uh@q}DA zq4W+>8eB&KA>tb18g6sGx1@V-On-d-m^NW$7~)~`fFP@`L`#ZxWhhDcd|%xqt395^ z7pML4d~@WEUT~s6C5!Zt$W^lGo2WdJxYkK441Ah6&53NiMd~j-noCKk6H7lb9F6V9 z8`+aEg}e579-W&Y$!&41-v)3D$#u~iWlu@GA{4>|@;Vs7{bGO@9?FVV0wZ@Qi*sY z!hVA7sX9VsB7?iXlZ&Z55gc2U)_HxH2& zyd5|3y6zm~b=XWjNfsMqa1@O{V8uIazrt$a8V}Q7kLo{LLj`w>_Ok8%30SDR<^6so zXPsM$@V|m9U{48!i)KW#xz6)Y2DVE3T7SuBekp<;Q%z{@rA@yLRK%luz_cD#w0<#0 z7@jds3_={xLyE=TjGdw}>C6?v2-??|f%BBV5n$cE&Z{pf11=fnWy4Z0cAS^8-f*+R zTLcEOO%^@k!#PC_cYv&DlN_L7!9KSd{wQ1d%O${m*ffI+=yGVm){P&4_mcWMwEZ{E zv<6m^*tea*i;b806UPTDkA%;WnUn$HXQu-4iQ7^z>^svs8NltKWweJ_vpzKdu*Tkb zq*PH*-UA~M#1Z(VkK+RSR4zcpT4Wwprx(f4=yKEAmkDJTkR!V5DI>&VZ?P*q$E;|K zA#IRo?|CMT#6v)Xp8sp{0wZ%vqcz;^RZEh|C)L1IIL&i|m}eBhyV1NFe0Lh#As=aP zTxPv4M3%M?-!W6F%TP-7i!946Q z?!WR(-ra>BC)0Q5@;lW-IiJ-+@*Id?{%{x?#nZDCJut8(b9i!(>&4B>wbq$Z%)M5l zYu4gQOr`Fqbk(EkeP+{^FoN^{lk38?zpDij_?FP*cQ_BWTUDsQ`pd(2+n35Ud6oUC zNS_x+;D>kEddDIRe@y*+P~K8yMP|r;9Q9TqbieXWiY=>gKmAj)1(opYk)zk0m|@#W zE|Eq2H~^f|-=Rssc*eEIl&FI5TW$JqSd8g8z|QCm&sM$UYvQRI@Zl9f2{(oO>I^BS zpFVe_Y6?%-3NNtPsyC=JP%{W+;8IECcgL-!)Xfmwvj$j1yQE&a61C8HRw?dWFDR0h z;yXp!(;2MbT05%2!*{M1;lmXxGBqy?!h(rcbW8(x_%Yal`?+U7I`7u4hM#NwWt|li zC)6+F`7<5=E5~9%b%(su-vnaZ1hxHb%2FkoxY_xXAj*{BLIzVT>aypXKT`IsY8f^v%X4GsYxzQ9wzpp)JG&Q+1hlOem* znvLP@8ny=+ixG_$Mf;3kt$*(BKek1HWdR_v&M9M8#HiH;ej!2C}*Wi%1qM(bE zQ?rZ-OAkCWwi6;*fX(M|0Bn;H1C#7&qJ$rc)M&NvExjS!d-}hQbwdOK{FT!*wTxmC z$4ACdz1gS(S;@K&Y{`nPZiR1MGyTea9F#kNV-}qAovl4YTb8xm`0jWZ(pWju zSDEq0Wm47sA0m{w-x;Kzw0R;3u|9BfC=6UVec+NEISqVEjhZsa@PZMFRNJlT7en@dAv(2OHo6>C;dr9YsH z2t%W6?45J)+KeTym!0qS@i*YL__Uy%qL>Bg(BN*QN3C`JO4+r+j%dXS6KZYve!298 zRs(|n<@t_zW-MJ0a!&DRxBaawSP4Q%M4?A0O->QHb+riQb)#~}&&{o3-Sjb3Ll4wn zxU?-hL-`gz!pB5`fb}=BP3)0ex}(+JaJ?Ik+lx1lz?wqpdtWIFxc*~mj+oRGN~vs1 zeV?L~N$E2D=~zmHFKQ?&ThN?SaCJ)3fxfW`kS>d&+pmjd8gJz7iuein1=}}i>qH~x|8Jo_|3b@>{D7;h&*KvwmzRww;{)>#!3(glX5Bmje$Fec zMyH<-!1yP7dj-JDV}|9aptM!HRLBxMi)R=ZD9`r?7Qe{6u+HU_O|mxvy$&sZG``k0IgOjY#L&BhuzN<9sT(kQwb9wQEAhff)v4SUY|u*PY=>3fBVSI zv9U2Obypn7k86h)bL_A+l?;t?4FsdewzZdO{!Gh3q;?ZZr+>D)H|r{ap{6cks6%Ll zzyRY!5J`sx!A4>9-=AN<6t^9e8wUepd_qa!X(&MXlH+;#9vt!J!~lRaNN)gH^^BCa zJg%s0Uev6f&(|2ki-aoSz{nZ~jdlF)o5)R}o--(yfR*%gR&$rbpFY5G4#TBRJ%cX8 z0TN+>!G#uZKFDKHMZshJY#2WDIgvA167V}#5hQ`;I)6RjbSsVc*ngQeqRp){L>xZ3qK|}zT53~sBS7* z*ptj<$2>eo-y{1E$EJcU%vLYy)7?66wMm>Ek}c_=#LA<0>v53rxz-=x+HC!^JzI=X&l(h>!F_Rv-BoH; zUKA^NEvEhX3RN0LhFWhw)sxaij%?Tit>z1TL)jBaN2>Q-=hr~b&7s70@)IjVNv$K> z?vIAd{V%z5^VGh-YiRW-F@7pl_CM`tB3m{jX%Su)M!7dI4=yJTZ?1p#giP^wuGXQ4MktC9m# zqE?*4Fs%AJk>vR2cv_52l*T@L-Xh?9VsqU6QtW}>8jXWe2S@!|DU7A16|j4^s<|_R zRDO4-10`0n!?76^rjXH;T+C1>h$2SZFa{;3?BodZmKKxWr0PN>qOFehKXqnoF1*Va z0^AJuIe>-ut z?*Zq}m)Z~i+HICpP!&DEbB2Lut_=skXVH-_{ay!qim9@62<_!bVC&gbv&f{&tz1LQ zVckqce{MJv)X7pluyW0_u!eo|u%8O7@4nIPz$bzqLDj+HvVha8hRj6fb3hBsGGXu6 zw&sdq2m=JqOH;KN3}g@HAmKI6HG<;u$?%Xs7cpDAjNYnp@j#^a<-2^hn@?3hneUG= zN`XOl=7_!(cv)5a7_xKi2_RsFguSV^yg}G6BW7+8lK}~mnxC`zq@S)!r-jX=qxOoD zqwDix-40j}AD$Iqj{(>o9#Xd$i%qkm0LvD^Ey&SS8x|V;$xoynm~9u@+-qOj|Nev? z{Nj3%;UJebQen`pQyH}$es#qSRGgWUmSOe#?-TW+=>R2pF;@$B5lXpG-@kyNI}Gn4 zM1YNFrf+ZHwBy%L-+(p$1}Y3dxnI_09EA_4ok2erErVxLRWK_qRQ!0<&{F-ofC>HS zg~TYeLC&hQm&-bTx83=F87eHx9 zlh`6uKR?&{gEybayRKbBDeYsZMZRU^tVRf9NMp_Mq>oow2zAbgB^SSUwsmvDc)I&i zaH?dzRgTq*XP{Z8m6D69Nbu{e@6zeAix~sU8LN&!t8MHJ+;YitBKNDElj?6wf_g*Z z!yMb5Iy(J>b@`=C5}|^6bc3^6b+g=v<)k*{t7+G|pPz6sjr|i#zYtkR zt-t)Y3XBn_~^_n6Hgf!#t&oL9-%N!2BP{e6K67H8C zF6l<}mY#BNo<*jXjGj}EXK>mUwM!X?O)A&E5VRgU3`2e4tCiHf-^H^&Fj8o(a6QXw z@P<$Wk~gA`S15+BW#+ny+(?L=PHXlhmr;FXzrj*&`O;ldVvWFjU9P;e#ck+KFS~H* zGfrlfzLJWe8TA=HtzL@7cXDE^Kgru>V$f=ssYi|PTm>2K+pv~e8mDI?|F6m76HF=( zZpruWk$u*SHCg)_tWMiNspBLBH_bTjh8pW5XLT?cY*?^9)9m{0*3zF@Ivn`Ap&^-( z7LdF~uMfO~KIWWm;ts5KA-p7XFF#?3Sn+4flNP2!3_0{j^1x2N&kbe0_T{A-P^pnC zgPA00DfC}6-8=MtumdtF;APVzL3D#b7I^zjJ$)5^@ze)jdkpvPwN%A=Asw+7sEC^4V(s;ZfO^uY z%R0Rq&IuL_F~S{@M8C-zk{Hm8AH!6i;*gI=fMDC4(t*~us^u29oVR3>vpq_mXSa-- zKCB9hKJMUfJqE?*Cs`n7!*mGTi^?_5IJqs!)WKdOExe68_3W|A8Jc;8_hgmjaMD)p zEN|sdd)$-%fD#u|Z3EhzCZYk*)LCGYnaPI{p{qAlQxMoIsIQ zqKPQ#ES5n(DOVAFxX;>Kj8C>icyqtknh3aP(TOkf1|+=htgUa-X|T5QcTZ8u?k%~M zP<9{%%LEeX%5ZpO8*L2;oTxUJZs$qI^iCXRgFA(m_rHh-iP0)fD&cUSbJUIMSAEnhfF)y4u059bZ>tmFuMfcIiUd_)I60;tlD>L{3e%_>X?2z zq_A(TyyAeP)IHIh*W<`Zj8{y>Z*ug{ZsvVAH*zzLz@ADuk2xA@1mKOWT{USo(;eBx;=!cyIpoSXel?nFIm;c!M-%`+vURsCk3FtUHGy!*ZhGq%mqSi?o3TB7&+jX>?DF`$?NoQcfJ-KQVNyYViN1 z|K+K};3Yi(usg}ko&csGyQ2lRRr*nS3Z`B2eN!Bov}$$O%?P03FIj^|#tN=S!PWgV zE#{N-N6E&^2@R0N+a>1)PN5C`?oL~9J(y(#dtwTJ_QF!Eu43HM9 z1QfFgKh{nnrV%^?Ie`{kuNNJ7h%vx`ZQiVhq)Aa5a4ql6mg1T%4&TMY^c{e`QOOuxT+dw$}UrgjkJgKgs zbhn}j2Ba)FGu5o!ppH*i5MJP~91!e$#y8Z-FwRAbWJDcr;dCnf6lrG_sVwhNfc6k{ z`JTg;7>KAqXBwvU4#SBDOscM?3j(HAfI^JQD8xB=u$m6DEFd*E0x#4w<@o-T%~h;Y zw{G~SL8fsSs)m2@!c-Wl^?a@0IvdKSA?=9Iv&ii#D-0mC9NF%|rQl=P~zW*y)ixIMC_WUJ2y3jcV zd2XUlQScC`tUdMVy)4%J+qPk;prM22A_GS3OOsJLrn%35q!+gM+&lYIF zJzha`C&W;Ba9Oz>w$lstBoZ%V?x&e>7GJr)J(Gi^(x#6H0g?*<4K>xK9Y3%KNE`u zdB{eX4C}q43f1pPEJm!p@wJ3mB%w0c_-ViY9qS^gB#1`%AcPn-K|<7#HjcmSMg6~= zsS2cB{cEQkkBX>;RR4@Hbl(Q#xAHi;#Z%e|*iS9$JQVmcqtAdrnIC_fcF=GDal3~j zfQ@cnHJVL}s9LKS#t!gAI+F?3eWn&oo z%x>)wN3*bt=Q7yCTKx9M7RK13kP4r~-YKg{e&=cyEp1sAHWqY5*{zPKQrwG+0Gx^rZ~Nd`x-zI!q_VB*EQmB)_T3@*&^PZKMmHa7bM0Yxsb*L-b)==)&fkc> z@9f1Kbuj0)9!7MwbAG<789Ltr-?Z?4G&G}=&aoOSWGe#09$Bvv{=v2FGyKTBA>o!& z^*j!$3ddGy7K2ed(f@V7&eT_dfBJoUiX-^sAMUMFdDuZCQno}VdxAvmV}{guP5>-j zClUcl0OFP~`njoGuF9jZTbYf99#U9$fU&8atX3>8HpND8EF}qj<6%f4#yDAtDKeZe ze~KAx@GudH*p3{w{iB~@wcDXRA=UysWLt(&^TYL$V6cE?qBMHD8nwx|I>B+K8|`P; zu>Z#bz-X4^5=$XWf!WEROjRZx(knsE@D`x>&i)iG#0H7sBS)VHOTMOiIC4Dtil_|_ z(Jk#i2@YU0hL>d8_Py9;=b^bmOAe8QnZJB%J%M^N|_PG@IL$+uyyIIX0YMHPd zdf@_U^;u%E2QsJaD_m;Q-`__(BWA&3b2ZkJkmK(~(`|Iz&(*lC#x|sZ859_Z6q+Ha zMXs*Kb>$ z2%~ryDsk+y0HS8omP@$O=NGS?$?frmrdn}mHr4-L+=CFH!b`^_HJOqAA{Zy>gxEQj z>3-GT0lUY_)D3NrC!|Ef?>gzjj4-uPLY_Bu z76)_gIw^M55{bdh>Z~xXqh+poL6%sKt6ZoFnngw3kAv!d*9NY~g*=0lyXA1c16L+# zi$JT%fx_SDWj!@#Y-ZuOBknNGkp?`5+0AazALlW{?=!US_~Qfg9``-0ZdQy8bQ};G z7ZZn}$&qknf@8GgEw}!*_QbKp77+-zl+8T)CpNrwzo|`MA|f=(5I#T@T=y9e zskt(8B%7P8m?#sP?NOWoZw?qJft)^N^ReYaJUj%H9Y@uc1)yIeH$K)KfI8=&WnmP< z5t*cDf)J`ldw)_ud^IN8W_$+E2yV6{Eq%uTYm^i~if0@=9_s3p7rvBi(vyxo29`5* z$SL&Ekw7TBbDg&T&NaJBU9yauhAcwk=W8XhEG5;Gqr%+o2eIej(a{^@9-^Dx;IJE7CZE`gJ%vhEm3 zW5~e8)M^zGtM+#ukw%5yIvLXejYOMm%7JG*sfWsRUk8lkfTwMK+ZFHap9w8`mZsWN z*YT12H1y30LCTCWIN$M)d(ZtvO!TFH-I_Mns{|O1u2?JWI*5O-puXK-;2eiwqD`S8 zcNm^EV@gB5DDXfPYXAav%~$=Q?Q;Frh8eAk?HI)L(dcjNi zHy4jiwv~XO-T(S{d0w@8UEjT+6jFfCf1u|f{TcnmrwzL2`zy}CLv>4chfOgF*_N^? zb5K=|())gy2!RE!>OZmz#YrC8wC{qWrgKT43w^O|o?!Pg@p1|7!hRj~g-qePYwOFFdNnpzcJ;_;1JCkn-Xh3$|c7F2s z-hD(%K;J1DidDUXlCCk&E>?+L0rJ)9m^U3b8WOKb>#LYu|LyNaQ*6A`@0S>Vf@5e3 z?|T#F%}$<3=DD48E1WwbUCIp-mJE`CyP=xlml96moql+Bg{#8mal6Y`n0at4|)|JVI;8 zo~a_Z3&2$_;`0~IZMO9m-(1TwJpetuV^P5W6hY^BI(GKU-rRcd+0Q!$4;Xe#`b?pR zz1%?U>5;Y`yE7j}B;Y?vl6ZE$FgBtoW2ydfzH}I1`Q9g3Pr;&pHwpbtD4ok@Wubg4 z#8Th0)ofszOjE#KR-6R^&Wd#KQT4G9kT&;jQ~l(LScePCesfwOVzd4 z3hxAah%fN)?@D*gzGAOr?VU4(K=FxO?ckX`e}Rp8YkZ=ay+|2->y?|wHUa+4%|Ns|Pdr+-J{S_RotdlLySua;VbD_=~4V@&#gW3_J)$uR&E0xc15z zpaHX-HpzHLbqmA)pIUgsmXKbdZAc%HZT{W|LIo|eM1N0#fxs^@LXR;PU1vx5ybtp& z+m8&dn8H7vDZ&yrX6tSu`~VbfguhjXY9g5}*5sd5cmYXfVX{X)Rt}y(sjv;HZ*Dbc zEQj3FMeWM6aS=?%c$Fy*ffP}#>veXOt%t3vPO-BZVk1u4t^+44_qE7tgOnU&AR`Vu z3x5ONGEi9gmFhR?qNl!}#o+*Z9|0f_RTL(z=w4%&hi8E=&GR|i|s24klApCrtF=UDnyZkjE-xT)mt25&E zR2vZ`n}SncjIsd=lwMU8#+1G|L$(41QQ1D~#z_K5f5!_h{D&M96lq(!Au$i2}`bzrK& z!-hXv8K4Uo1D~gDco?dxB+{*psgRo|<@E=cV7e3-duC$^ML*+Gf{W*d!%8 z>o=mEYS{m!a=qDjvV-5@Hke7u#~MS%(_6w+7wvt3wnmROV|>^43g=<8lL}KWcS1}G zv2V>WK=)q`U?Tpu^44XnwA9}5=U|2U(eKRFndG#Atq`;3WIsI=v|>Yw>*RlLaC;q) zK=!mqUH)h)OyfUlXyC9Igagu(taXj^ zbS}tB=KUi7>W+Ll5FC41kcB|K0G%%Rq0t-0;aV-cDA=-N=OY*|KTiIM@9^^upd&dV zNgJB@l0vlc)814zs@E#;hcNEJ)XWyyU3|92koyyb*IxDg|NLaSu-`*aE$1B% zwEpLdQYHUvSqzj`W?87S1;u0OG_iN&9zm7o>L|s-5Sn_QA4Z-P3S0mkVsFw|huJ_K z3P-7ZN&w|iJ5a4BPt6MoP$EDfdMC}qd)o)1A=dz&XD4R)+XdiOb5L|>RpMEx3rD1q zEk6g67kfg3ios+aBUuS`qrko+BC9#Rn|-hfI=HZ+fWvgyWHDT2^CRm=1+XAIb8+D1>98>O78Q|w2U*(lX7JVsB;;LU6Iicqf zV>X=^B2qGcm{33j9Y&un> zS<4x$#{+D$z$E^{w{*ETOp&z`M&{gc4aqEk_Zghb7H6|r;Wd9}qE9HNX~vN|<#z#; zuR4jz%ta7rC_YBXM)wKCZ>Du}Wz$FG=wAntbzP~)9C z8%9m3kTBWOYm@~8?-|}$Bwy1Nd;mx@Tvg^sF6%M=Z#4d+N!g=zA#g7dD+<SolfU(u5KyGGt$T%AiRGB$yAL2Qzd6i?%yEZsl)x5*Yv2b&X+$j^{84c|)+9 z-heM*1z7t2!2bZ!n2#Xf8HlBl|F)x%TG5WrKJw-5EJOO}n}!ISWhBo((~%0h?W8z< zj?eVQ+*6n!Ks0)TQ0JLmp1C4tijo}V3`4`W;wqOA6J5U)tLEng_Sxzn z`_9nmQ)$MZakC=tfX{L;Sj#aOmZJkE9$X@qHrun!hZlHWzcP*d=%OM7l}B z$PN%~eqp{4dIAWrj=m%*M1-x}BfX$=89o$o*=+5!+Gp5VX!Ka9Nv zP+Z%(EgT5J2^K6saJS$t!7V|9ySuwJ?hXkWB)Ge~dvJGmcWL++d+&SRdG()r->vHE zqKfXW)xGBYWXx}j0icXo03+<@N}|V1Mq&R4A05}eeza#rmDg5cKT$)*P3R725onTu zC=`tcA#z92Cxrj^j|*ti5DV0OC4D3~xz6w7U8?ZJZGAqlU#HT6$c0u`6OfQVCr*&|T9!a)iJDkG&*?|)D}7^{ai}C%1||;Rg0K4l=|+bknWT!?F+4yf zYN5{hlx?Rj++2@2p|bLBEZL6;_DEcf^l8#A@zcCHPQLr{pOy^?t!K}<5KHSRXbE`g ziGEm&x6Ncv=F^4m)DVZ@OS+K(o79x$(|eP387V5XMjuR28;u8V+HRWrd%)@v>26pi zD)!@M-l1_43LGL83&7G_{_c>knWB@TKi4rEXN+Gm7r{f-P-}kW6<>2kVJZ{A(1eDC zMUk^aRU{4A!N@cN8c4aDhT8Y+pWSaPhE8twC;OP9P_0A*1P!%xS=hwX)Y1sJde=@@ z52lL_wdVFhB2Mmr!ZaUrX>;PRJ%|yNLUH3jWR2l9unDdB#T3eSA0Ma*-33?Nvt*0Y zQYPx+1{1%b!ph`rDs}y%K;y#__-2`mf}DJ>CAUer2^T@$lu-K_(qwi0Q?W(`qPuXj zI1VvI#Fw1LS5*v3D0xDGA~1jf=ZZTg*gRaB0vdF)%liiVity1yb50@Uv_8>*U8w}? zCEx~gxTOc!oh`?Li^a*mWh6am9+Ie&fdHtv5 zCg+6S$0Xyl7-D^19Cx#yaJ8I)__X=51_>YH$qe_%y1yI1fntBA^>6fq<#bkzF$aW4 z3vcjRk)`sh^%T1h8YWHGW<+ zr~$0dA+!C!2|y2U2>rH-X(q^F_2s1LRMIiX3RsWfHhStzg685`XHX}DmD>DIXMRnS z5Hjpt?G4OMy@1I&_Kn}M)-5|Zsf~dqQ`2D>J{sV|^q>_4E*H9sE6-G4(g8va9Grw? zsn1CYAc*#ijZos7?r|XjQv5}JfOvH$p*N_er(JLJ1)0JCV^;&yM6K!>F#f5W2mfSv zh1;P4ef{stm%hK40HK%YK`WNozZ}b(FCS0a`jk+eMk8(L8G)&r0%D*pjv4Heb~v;q zV@fkgbJ>6^sK^U)6>&=>P+MkRNz1!nq-z8G?kJWES8Mosi*~DA$1=VE)`aBw^(}yt zDu189 zr4Nx+Gn*a(CFrg}M}WC|UG8yjH)*yHeGPDj-!6*|!D5*JomL=^>&0H_2{6e4zdNGY zJPUN%YD%lkuJ)!hBJ_y>*n_?VS3&{^()a_$zl}q`^8lgk<*-%9S?)tL}0oBGwnvkVSy-Kh*r(zc%U|!2iH)G>i>i7W5_ImCWdqN!YC> z{1F4_xE_Mynooi9m0W>T4n z3TLsH`z%u18Gvv|q{&goh)%r?)Hv7x6PRh}=Mi3)Yd>}D;Gd$oH+^z|(VmNt7t`=0 zKwC;HZZm?(Lx&ksZd18sHEGaTanD?XK(2d z`ysOm$UE|TYJ*ta{@QBMR;U?DChNo^;}4~5DphVjP8QlkinvjUCjP0?WJSCYb{xR< z_PgH-i0saT!pb!W+2VjS=Utjn;$KR!zrkX^Gn}j15G+-hE_m1u*e>j+*k=OTzP<*( znQajjtK*?_ycV{EVe~yzo{lE zN#)$o)Q^v@zS~;JQ*$juPYu|XLEgKG`8r!v>oNg^d{_n|GmftuyKtcI7N}LLyT7B& z3NtU-eMghX<7!uk`fRZZklSXC%`>lwd27$Oa>U@S?iw;y0nfN-n;)pL%7B`2JD@hx z;hai)-{<^p_tPuyM){{VlV|)0da*s?{4?_^;H`btb_#f`t6*;03-m6E`#`>P5FF1J zT%l3&=N}s9!wUWyHT|g?YfJRf&ur(<}>A6{%_Xm(s7vyc=u7ORP zMBwJu#*wh;JQ0q=oEj&8WKaKv#w+OzomL}P8b>n(@a3hWI%H zsQgdE;`<Vj}Dr+%(GYSeCR zWY2EOcji1mi9SUa0{#vvpT*rf2Lb02wVj@0Eid+?ym{`2MCYR-pe&a*QV4NO9zf%c zOZVZGeN3MUbFlz*h}T6A4It25fKNGZT@OcF#`iP8es7m8>M{gyyBWU!Jnsdx-yO0< zOr7r8fHG*k$9?7Ek+$dc532wf1Y?}c317{1FvX&AR^xFX&ObNy<1&KNq`2N7?28fr zQW3^|e{tt>I!ZLua=Vp_ZG?r|2bLXxC#%W~ny%xlG7fby z0j;OExS#cf8mcroIm%vh68@41wL^){RU`r4C~!a`faT&aKtrPuPXS@QQ=2xZSa~AV zpfc3+rgzg3qp>EhXAn@D)Rf8L*wH(RCK8g*28s`Ekz{j7tk$_z0G)40n}|{_R`CIp zn%@FueLW+9ne~GOME`0%)Fe>1R8)GYjSTgI9FLFW>1O{7*he!u+8%vfHqEpk?2|d*Wm8OywveS#Q7Z21+U`Ds5TR z*mYrSHIW&=w=Fxbh`c2h2fGWPb-k44%*zN6#61B{9ArtN>!?j@yQ>f&qI2DVyO}fu zTSCc8#Av_OuUj_^3OWm`z7<^hugH>h?&vR zN&rv6ma(yIcIravKOF zWd00{BTDoPk}j$ZzGa+5=XF3fVCFf`GV*PkZ1k3tZf*Y`Ik_ zkX34j%HLqT%l-Dttf`oGT}FAG^oK#W@(eh#mZKI3L{h4!%v*2LWvcHa>CXF_I<@r+ zR4RU#4)27Bl(jv4=y!VyfWify4_6(4|NPGQXH&2kQ)mi9z$mS%?|7WkD|2ChLnY82 z-%7R8U>u{#gw=Y>wWHX}jf@&ls#V2&_5V_)jjlP$uFI-haT}`sRuo5i+yd7lD55MA zua+-;Fu=?mzl*VN>Sf}nt@eweVXz#NDRlnHX#J_UL3S)NRw4wA%pr%$O>*5Cj@RtG zDRh-WNpPEnZ!tcb53=Jfa{bcgYHz&WVLz5d08ysheJUMoaP%u^BlqCFClC+_9%fY{ zWdDioP>|KqzdLO%$vsyi^@i(j#s1G^ z=oH^r@)=#xR$*SplfQj?nCN77rFp?Wp9cft%D$4H)8JRNn`aRDiD*1phumy!OPK#& zID2lIyqr6?oq&Tktxy!_fmW*rXT2*4VqGpN2MTPjGvaCqFf?cXc>GJPKj6Zix#sit z<3MQ0UUJGzMmARXe~Fio3VC%}zjePlBWzyi(r zw%9tEg?B~J*nh74f6{h#?s@{AFV{;Y9EL=IZtmuB9Dj+D2$87gCj$P@EoxwYEpaBko3=8 z5Nz9~_x%`dDTrs(d{#lhWW6Nxq8cehv$k|;p)``d_z-F{ZGa=d#B%ndI}L&(HPje< zdwML95cKjvD8h)S9pF5$PwyM?=bm}QtRe!TgOs@b3_nz`h&0gbOmPBjeUuTptL21h z#%XBTDaCVCteWGpdoafHvYXkv*pdG*p=QBA1zBzQUJd(H&8d|W7`4=9w{GGCHPcu) z3swp!Dt_2o;A?rU`iIV51rEYhhnxk>;FnuYmm1KkId1b_3x{-lCuMdaWB{4$er?`K zD}WlJ#lZBLD*WM6HtL7 zu6iTE^FZ~~;L83y&oC-Yq1ECKRv_1L3xwTUvfL3D7In$;M?oCh`Le&Te15VkfnWo( zk`n&%iwB{rKb1IltDr2sZ;q_bruNU}-tw;P6{Vv+qVG}PbI#rRkI22V8$H^2hRDep zSo7y#>Hb)Z{%BSNVxZHXKKWp~Y-7P{)H05tDf+c9YSGfPA^Wf>alsFCTr(>RG%)*C zPp6=lE})DuPEI%YO9JB3#Vs~05U5$ZfYY$kT6k)x@~Ei?Ea*K;&8cHlN3CkKzxB>=lI4%zKU(tyr91=Y%SkHz`QbVM z%^8J4Gi{fb&t}1yG-}l*x(?JL3xJfP&E47hhkc)KXMe?g6Trr+@4OB?ohLAp0>DcM z2f(S9r2G6C*(V3AZ{}8RL{v(}i3~+-#Wab#*n#-1N#Y`~XcDbxYVOG+J>d(08HTaL z1iu2g>nfnyT`!dtI}hl`c(5_J0p&q7ue+1;NRD`(VQn2+A&~Of_^)pGG9c;N8lFl> zm$D_$KYK*Su6-d)TxA4$Sm<5s75D)!H_sSUoOkoGo>qfvSwM#!{yMjUN=^OsU-y|$ zaBXh3P49k?j)P8h^%^(mtS=R*9+Rewlu*_2z-UMd^Bq@sFV-&~SdS=~yq5@&=9lqO z2(i44oOPP=M-RU0)>HbW>FTo*FLPUE+cnUs-kmay?U^(placu8WFln#gb7rxB^S}s z11PF>n>d=YhHxCs#_S#{{NVs}cc{a{)DSgmbLdw1YfZo#>S4CCrVW3Hr&rt9L)=+V z%4ueRBe(TKl-*6LVHGl1Mwyn83y^&RZ47TlNZz_UYBONM4$p=Ohs$U4*;q4Q@Ton zr3+!VS~8KESIotKZefO!1Z1}jE2XwG?Q$(tu&4_ikLKhGwW_2uxyr zP4DJT*G~g_xZF@YkB1J*DgTEuC(tNHIPk+&Pmi^_wF=%&n69swOsafO8%}5A8xH|xYNg~}!RMTUn%Tt(viEJ&$B$X;n6&Wixj z>hL#DK%o;PUKN*}B`;Za0*G^!hDajv?q_Qqxm{bGOcK;yW6A~cJuGFz13+I3Xj)?I zO%=pRJMqc@^4p)yXK16bZ-wjUm;fBM8DP{s5SRXNzqq?|0XW7&g;cS5)lB5~ry*k_ zN5H!U5MFf9dR<73D#JMbcp5ifR8w}?l)*rF+vrU2k*;}V4c=IMtyji?{}5pCEW(b)xsCU&Db@TwaDExiUfEP>MGb|<-7s|0k{ zfvi7e-h+oGOB(m`{AdkcIm^`+H8d=_**{4B+0YsdFtW4z?lT!q-l+**u6*M2-~fa_ zcf+W!jdy^wT@I+`f1s3Yr*JHk^oSBDZ`Hp`-K=A5d6<)f-r)iF5rDb@4r>;O!p>4g z)SzV}V8dPkn&5{Rk&eGN@zY;e=-+-L87ODa5RA@Wg`K8MXW?tY#5T?bOH`UpG7KXs z@|<+XjVEn+ZrFG{R`K(r)$6mqiTf`p&Q-eA;S{^rr`Hg~yyL`u-+9(INMioP)O>qL zUHn9$btQF0_>5L+nd)oI&mB40pqBMw|7)y}9BbjloR`PmYU|HWIN}8e;@_1deJ}Ie z$nE)sB?x6n1KC*eCJ>NNf`WUR!Uds}gfhYco+=&mp_(1Ob0F87(7705B`*1#TWY#1 zEkW-qrtQ_oZ{(yz7+Fx2kt+?iXso{z;`4 z?+rMcQ)0Nmq*IGeEPt*@OH5R;@LcY5e>HQzD|Y4=>_mlVmJ^Wn^~wM-U(SCd8Z$jhHTA1~IC@bR?@+dt-Y-Z#O_f)H3W z93)~tb{(y>Jf;?6ZR}>zdMQ7tU$z3X>KVE*Qn8X;d9gDzX2X?xS^3Y)hA-U@%br-y zN+68yMWx2M5gGdMghHc7~!0?*QX%5>zRhgBDhZLvr^Q;XBA^q0}uj7qsIQPC@A zu=M#b^JoT#&<+zwNGiy%Be(b^muetY^3wT>!~+f0;>87bZpQt=?iB!k;XqTFHBSQ$ zU0wa!5v|v^_7NXh$67tz^BLoxj~fB~M?^f1&v`Vgopch^Bd2V~r-Cm{sy|2DNIg`7 zpx}vRmzezIp^N*DqX`@O|-D4C2-6U zWHNh}eu6A}04F!Wu=FzE`n=o<0&i0QP{qf(Ra^GT%0aJFCk*+SVyys9&~WGEXxgb) z|9jF;$zd|3r;*09wVlDLr$i=CvK}n9+`gwSFzK!AP?p63(KdJ;H>)e6FN@DX5soW8 zk>ga@TwC9V5u32eny)_uI@8=qg%97+sZ?1}DV@#*ZHhU{I3ueRU&~gxBGR`tW9Ws$ z+ECM`C@LjnLq78GXtyw|*sS>P_O(Q!E*EZ01>&gGJ21}RS4a{VshG_OI6NMX@si_p z=zYpxuzp5HDiCASs|jzh>Lcn-XBmQVXHfAZ9&dca*c+?NP2~BIn##@B5uFmGdz99= z_wp3vVy(ii$lZWem3|Ur-fNU`&y3D^(m;cXyM}i4E6-Vfv9jRKY5fanS$Z%d=qN}z z4EH?!eMK;QWrrdwW<=AqSUR@MtoMA}2u}^t;SPOAVT8LaVkLPP#!UZ$iH8V*hB7N!!7U`#m=eSZ!;J5tA-c&sa`(Xdlx3mJh9)$ zpi-fPendP~)^}~-W(=_{QnHVk%5wU?s@1xHMF-|8-A%JP04xo!R z#<2PA7nfnNcH7hpXFb2fj8@!Z>H)KwZ#vS_>4*oF}XX+V(PeN_xHPxZ3L3t6Fw#Ob!?Z z-ldkPYwTt6cbO>`FTT~V010hrF_-CLFC^@?=}SF^Z)|L2^q%&Rd1@azL+z%}=YZHp z6Cf79zk$3^MMA)=$65$DQMUTP6Zf~Fr9cvz4dF-=t5rh|?uG&X(CKqxply}4P)eHC zyC^#o=Gs5csJL+?<5$l`D26zGBsYjcj&vM&qjDCi)hPB}VAMFHk>0^y66J}WYt@`F zG23vb(D-9@rpbJ?~hJN*4V6&WWLnjR;4EaKF2i zb#3|)bROg5{w|a`G0ofDTOc^!bVfg${(V2!%#ZX_7}-SpnO2N4nZD(nXCP7!`1mlh z(b+_IqKA2}j=gl`H#H|6m&h6+`4$!0Vl}^3qP{Zo zb>R}6c((;1B@y!&7pME!rWm)U#)M{I@-k-ZI1=9l)sve__GIESGwOG`c-)Q?s5m_# z(zd3d(GsDn&b*mA#tOP~Kk4~eVn#S->Afy3w9|p(vfH3szEfysqRRVzamUL?OdI?b zR1o368fT&d`^^1W9~dfRZQu`7x)5s5Jia@)X1sH}(dO7+7Z44+;y1>v<#l2|*~bf) ze8gNIs?gpnNzYrCZHAG?>74oKllVpK>`CaYjZoOw_u+sDmJ4kTsB7v=G3oorW(lKHLZfNL4$nWQa6UgRE$XbT#}o(=X1Z_LG=q96!y7^$fzpLJvh(0c{hnIfjD<4S7fwSmord~ix63!(YQTQ_P82EYN*38H zH}uPzAUIM^=n80SiHV6J&HPJ6Nv*`H+JsuOQS1H~r_?W9HpV|M54X^3#R_O$|~(WOwIrj)|=I#z&{F%*602 zyFSN<=Y6qniKqC(<-oWQ>OHs`{>Q!w@Mu_Gp?MF@;W);$XJxKrZW_z*%cZ4}QlWh)_zDLaP}&$88A-*g|#2=x0ZY7(2v=#!s!Etd#lpv9Kx zpIR@Fi<6%i1N#gKC2saUPFI;Z!5qYRAu?-uz1RPlw`Su&p#gHYcR;)qnkX2VJD-Ff zPQ8E-#fKMei6ZDdK3+Pui?aT5MdxSR<9j?;Zh-3b(55ebmL4#lcR+m6@Mu#4#cXqU zwlIjJhQac1W*SQS?vzRF1KGT z!nu8gYV^nZsnhbW4@jo+_aRQ#P@q&SIGXop!jo)2RBe~<=ZItArB%hc`Ub*YsI$P^y2bG)PHC|_4Owc`tXwKpq_=IH7ePuC4atcyL8!A+$ zO}X6qlTmaqv{L#TD5-t9zW20udsrTPR0zupyx}lbg}!4fAv@&`d|qmI=+EpMGDjsd zxU2840<oBNecPp+R8g+fPYGQxPf47*;6c<}9hzL~L(il$!l_M3rKj~k(>CYNXt0)i(gn|$r{B^`Ur7y8XNOW#dmnQ;@|1x{|f zTfIwXbaf*@{CLlIv*KLa%Zx1D{TBaIPkmeO+OeFsOp5w>f7$B#HO+F&`?QX+dE|}2 zApYK|0EEw`lE_yrG+f32Cpel8F`9CH)vGTr<=M~qCpef04QYg|jUN#&F{DVV1*^`> z>7xSQGv1<=3+#xeffQ_#@B_d!uGfLCoi&MCT+#Nnen|DCjuKCALYEpy9oaT|Tr_K#P?x6w}Moe=cjhV1bg_$Jkn#(1jhONV|#Z@uQj=Xn_lo_7Ez z^F*v_FGcvsctom78T~#^=N-@2*D_Z}+F!YAZ8~420A41FwbF9dy$R9*#HY?TD_yaf z8;~Cmm9{kk4%ObB*$P ztEOPBhaU}1KL<3)Davw*<@#^caU-&P3&K}TYRqbuYGre)9SGeC6K~@|%`3$VsStwM zL4DNB3d)>q@k6=ZT~uMQ#Pn+VjbFO=W5`SZ(G4%9Hfsi!hvR+p9l`v!bZZBnmPnJ!;UAqy76RY5YFiU$d zQJ?fjowRe68*zP~{w znnV0w4%+{?X8+6RT!51Z3PZ7OMpJ4QkP+^ z9pb8xpmUL%oWH!!hu9!}&@=?E60A0LvRna4m2~}CXUx$A{}7%#nXKZ_k!0y`d3?xoA`p=O7Gee_zDcRH;qihq ziUbj)^RggD-8Mka-j+uGlws&38eeJQ85W`K39L!?ilkD&T+hBT=PrLcq=oMTC+0Iu zJd4Arq$j3d<{*941 z7~2b&gl#9JFeuEtAq`Zw?8a~6WnkOU0( zdvvB!{G8iSdiIny5sf4dz!)fdJcT)*#Ew3Am+LGu63N@CeZ z?(s68r^4{(sUhwO!KJi93{_@vdFHy+mT>(Fo-~zX>(5Tof8O)r8L242k@T)Cg8-@N zH^2o^Dc6Bu+HT@>o;dw{d%7A0z&~#Qe6VA0JZo7*B#qlKmZ2~aaJHBH>iy|CN3<9E zwP<>+o8Tb>gFkvdjMI(hlu+c-CPis0k^X*hBz}8nz21hY-=kd=J+bz236M&Zt4l1k ztbIGzFb$n@=g%GnCn^r%YyS;P_gbz_p0d!ufRL3=b74zzgUI^Uobu6Hf)cDT?@BL3 zEXPfX$cir^x>s79+W7%5`R=`FM0zA=iZju=31qR8%#;O6$X2qP33ly=^Nsm*DgHmE zN%j>dmL5FkSke^^J=^T;-Pa+j>q(}Q=S$9uHkH z7xU_K3k$;X=vG~&B5N4(peG1^S+R#~LiP$wZ*zfUF9Co0vB)A=r=H${t~?_W%~;{< zMr+o)&vA1Y+rDMk@BV>BLh2caJIGb=Napk8 zx*Gd{hNhP)BQZBRVI{H%9LP8vFHD<^VxbZGOrU10X>(~6fBoyO3P9$NM3?-2U^5M= zWxo*w&$sEXr||3Bmo1J<-w0~6d42l%M5T9sjXwrH*l7G2y&uVv9a_|?@YLJlDZLBz zb#&2>!J}B|E|{T>9EmMDPO%8-DscLMDAq=IU|FkqjO^+sn-4ZTX_*@g$qG(HnQ~y3 z*Dd$i+1qPWoCBX|GuAh75U0$SL`xStZg6eZ)%~*#TZUHMbL?$hqeFfuu6>~MVO-^` zdw7~$Ixnm+KHSiXWn%%7ZTAGp%eo-~R4Varu^HEY6tm}LHl!urG*@;F@22@rntsud zd@=3(FD-zsKoi+4B4YCg>`%{pC-7W`jJ~ixEx9lJ+nf^)RaK$x+Nt%tzSy-+QjJPH zF#d5ZL8^2=_i^^d{*aiR?u)Yh>Cjp$Wvjpx(WhAy$(VbZvv9nFb3h&@!kyQ5)(wkRIpF#2P@O%c$SepSIyPPy>K|#TS#d=(xn>qaxsWiZdTvEc@ z7ewV#!S&D5NX3GP!tT}@C#Vw}>AsZW@2#V;ZV#&=*S{bLEAMf@d2l{}h}hBgK)auj zwU!~|oKK?L#+o@mMC++~skSC0_Jc%8ElZv>z_fPZyx2}}`T9lP4f>n=17Wp1$`s$M zZdl)fZMtqJyteQvCn8CDBl=st3&~A)CGK^ik2W28wQv&l+Ff&|>NeD8PKd|L7%fFJ z{#nZcJkyWvv=7h7&G#FpCReU98ge~V{_>T7=7`gdGGU8|V-Qk*jP2LvjhAV%m~l+R ze2>njN3rypmSyJRDeLf?K|&JshJ6+xmmBy+yn{967;_vhh&tbcEqEUp!0$`Xe=C&R$zXx9J&M z2KJx@AFMwUPgr*@eTT6Xs!E29i#~dn`xZn*|BUkOdxY?`+JBY17d> znfqMIvg?AX6ITNSfhP+b4fE6ZNmA>cm!V}=JKo2LKYl@(J*n#|w~JEP{2Z8$?jl*a zO`5G$syo)PB+iv8g&A57gsBRo{+`|6>mM4ig||v&W6h5zN*CYkB~#lBMzE27Waps_ z>V^~Fn?dm*5#1=#26fksm)IN|F3WKekbBa*vcrz;A=s+$IP=So;oq)0(OFr@hkp@i z<#Uz#Ckp+OWd2Sy!1LKD>e=;m4=|``=06t|74;$pQ>xj-1~|JDuDb6yQa^~n819nV zgrHI`6`Z1}Qzi)g^Fdgt0jw>}X`>j;DMHXB^ zEKSGTi`*+ej=N=M7pr8LqY_b_Id2-9hQc1|Qg=n)QA1??;b>X^WH!C0xdxRQPC!y2 ztB~f|Lo%1{6!V?D(M@@VRZ)@b@+IL8m(LKyv0bQfA~R2uV7 z)j^K}0f(`w^X60QGU5xq0;6%<+X7`Lfvg?J2%CGdr1*g$n00pK9?fYQ5`(TFmwms} z^KrBond2n!p?-ltJX48*IdGrNm8T=MQhGfeAdS$8M0cUyuV(OaO-f7fLeKYP!!z>< z!s6tHs$h=&l#_>#?|sU|!o~uPdnU*n+^-WbKk+7l+eM1Sw@2k{SIJ_5X8wlOU_Lgw z{8r}a=B~=cy~^J`!2;v}W0F za}55}XU7k%sf|!YHCad5X`7fu6g-C1aJJkwYiDv)6-1glzmmw7UED}K)?^VQQ8xWe zM>nr!R(t#{^VZ{S-f~(@#ESG|T3@nj_0FaL)Co`{|GZ6NgSN=_9CA;iq+={f&NQKM zO5vg#3rfrECiDu=|I=J_#-clE7f`1jB?tAemnUiD7U zK3cJB6T`_%2@Nn=3iEO`qQdJ+&z1+ZhUr`QbR@$!Brsz1HL>&`;jb61@uUlV=ADiTBCEyh)g>}}zS$#x4GGgeFR?1@$g z=ZGhYVjj6!jmM|am27Az{PQJW#H1E;BP<_JaXG%>0tVltpcs;aM$(sjGMW1_ zyapk<(b)f+8!XU3zP7&~LXqx)_R4AlMuq%<`u=0zGx$-8$J%i#BqW5fRje84?#F@Q zQM5Wk5uo(jfRjCANJBOMr;HRBfa4&=bF1WF2)p%Y9HDaW*flqM@6Gza$8(jAnh3H$ zajOpb;#ryy$^I~~7*<~|hS=#Ix41cTUbeZ&K(W3{=YIb9^GNObAaip1 zR`2Y%WxT=FQ}OoC;=);|jI^M9B|p9UvF4J>rpyz|1+VlS_~kQeli82=b?Y5XL3*;I zJHZ(EE5D?b2!xmJnRBPz;28MNsJy~bf;8=1pcK0>Zkv5MN0&kmCav3PI@hEdkq(w3 zwrW(^&qWZEvs;#e$E~%3`faqG6I@3trv*yf34~YKe{PPnY@SV8SC}jkVZJ5KPM(L! zb-UG@z*4t;P+sRHR&&N-Zh7#QVFJzUQW{t zZ_Ib=`R=k-N`&oTiO^k0<`c8^Wu7_OA}%FfdhU;_&HOaWZvlB?CIfEotKui3(<=8t zNg>Ht3-9RENJLlU)Ra`TuS6m%L=xrMMj-@G_vA2ms(Q^CX;;P*hDHr>LcQVu86ze! zUN=0G8PIb0a`MXwm&tJ#%5?zc5pmYS6Lq-(p>&Q52El7CVt-O>*Fl5qiiwBq!D@-= z%#8(Ubl_)X0BEG?^Gz1V9q%1c>s%E|+)ePlfC1vkL1s%b>hr3^T~05J%kergqv3?alu832qwU}Syay$qxP&&qIYt~z=gnV7b z8t_oz(fb!2A|+@;Qg)Ii7X1ADDkb#S6M(3(LT94+#l;1+vOTZ1QQPxHoQDlh#Nuha zI!_;&mpcxHVV%)6_3*tuW}25%x9hFdsCat^l6eIUBT9`Li;!?IRx`Xy5$SPqRE_Gm z37#BAX6t>|ahQOc8p504GQjeTt{Df7#V(U-o=U*j(WfX_}4eF&_Hqa6kT{E zkr8S~xjdtC|KrhgMGxM9kwyaGfjTPi^@Q3M|&_+7WA><`0d0Eu~ioYo@Bh|&Neda z>X=#naz2&WT<2^t!cwq`Hij+XGEuA;e2 z>{RjnT%YAE3Mgz@tmtYf{4>2$jPm!b1LYlz$k*n^m*+ewAqMDOM4_G~zpMub7lfJp zc!Kxx!hxwcE%UrMl8@f0?&2nds!6UDZt=Dl3LWm6t8!&{pDHf8nU^Nq-y2a%B>~IM zc>IT-cjcdx%m3I0zk%DL7|TI0kU?~|O6Y7ecUB&7&Rt7KhP4K29BMqEK*!pN(Wdo% zxgV2*YpvJrFWgQb!Hturouty*v_ft4ANd1e_sKKfCjWQgFXjke>V%95&hLK)%0u$N zrlbUt81|3??1Gd}U_x3vh_gbxU_$;VNJK7;INJHg?bHy1vhwn$qYdJ3Ic7AL-Ut zzXgOf85`T#hJv|XW=gEq1nZBTb6^31DQuoBpi_t&7%Zo0pRaK&fDgK)l z^zXiuGW5;6m*0Ek;eUN4-~i*S+-+@YAL?kX6$xj45hH$ki$~;WwayuthsTc1kzwd$ z9t-Znmv*Qi>}ou2n>R33?_N3s>~ZDM&53wf@t;tXq2w`R{+k>5nwinCfBfkN(>Ba9ElEiCGl;pFZ;c`X>K+0q~X9d2dIHar_MZPA99W3`srA3Q(qidT63PYg?q8`Sv|2zpnKvz za*LrmF?Yv!+_u3cZadUMg2lV|-TTI8W4(=?>g{po)7tu%4()kHO*beFXeRF@QM!bc zuIAWZjkF>>E6N@!E9ac`Jqii5qkLp$|K zI7{CgNT)k6Pg42}c`21Po?boe#j=`>(d{BowRHP!|FU|?iZ2GTNsf?R`nApOA0F%s zt--aum@=)lo<{sm6Qrp}vt{@HzAhm8!UNHFdriVP_%2P?Ik^A*RGr%zsD_$E2+En@ zoX=~g9j;jBTTsHsxA`0lL2kQE0bbXG?1DE^1cAG)OXf)j_d6Du+Cw!Z@DHVYm7{^< z0#1fmygCWZAG#_t@VwVQh_4Y4mfMed9dWzB=Ap%{sT>Og&CpRkyu3}F|2wq)YoY$f zKic_a+HKyv>;|pFilBb>cf(lSK0^cZE}4DNltEUEtE!tsOc8!yZ$8UeGPTElpCZ*B zgbmL@Duax1Rg-q3FZ^bViIp_kosRuMR#*GbTwC5qW2j|j+|>j>FWeX#`UC5JSSc;i z0L61VOv~figBXSG^!W#pxek#!#BX=j=p0VOpYr~Yegxz3eu~O5pV?G-8faT);Qsg3 z_TT>P14?w*5%9d(Ip*z3eV#ULM>Vda^+ANO~2;D)ma3F=8i9JjWb z8I~C#pAE^A5>ys8nx(!@feF z-RvyyI34CxSg^o!Z$+?~1DReIk52P=^1hzO?`!VU$tkkcMyS=Dtp4+{d-&YdzLMte=8WQfaYJ%;opmx*oE1boZJ^z9!a zMulIf6{%8M9?$Wl(3mdZ{5YGhD1HngS%iw4N9W^;Z^J6yA;wB_7L24dAUo>&v)okC z_rj!saf}RTd@Sr9M>t~z1GOhKo5eEy3fOpUU6;{FS4rsOz4fS%pQu(5c?IGr$R`as zi0ps!-FboilVhy3L#KGAoVjeqxG8J)@noSK-RL@{j#IY83E$=6A*{WOx<#s({mK*L zB?5s{B8KRp$R&L_0shV{|F%^ZD&yX+zI2+eos#9ioLv-r#P$Aqf`LUMX#ld!TN1XN zDnp;a!2&Y?Ta3K2T2l$L+!TFgQ6c(68$QUR{zF?-QHXgUV&7yJ^xB14M<9_<=5j)x z@0QTqV_%TVc9`ni99WsQSb>13RfLf`DlC7_UUIa*edpMA?rfGVJ1n6sNI27mBCgrG z8lXjend+ZA)wM)2+x7!xVq7=)%cS;;IO(rjIJ4;cW*L5#%fnK%{H zI%Msy9{4X6X$lP*#&es_I@77A=UvT+8eT0pI}^e%l(RHN*l|*${oOzDo67CLTxO<2pt}u;;S_G;a_ZW@*rdhaK8~B!8hAT zGQ*WmLIl4-Me=^-v-r)jopXd{i;hL+PC`G?CrHk?EI}fV)|mFXi)TOKNl_X?R3dIM+wB3%g-%u}g_Wq+ z%l*dTj6~u1B&vniSq00rHcabq^nTvf@0gvBE^Y4nyQPcXwzrkEWm$n;M3)f~!!pX_W2s=;yC0BnabU!ZSV@2@1t6OSJ=qff_ z+h;kh_j6vYLzI+!|6h68$fe%LxZ zrh)R?45yt1#1AFKl-$D5pXtkF~S4-pi2_jZRb=l-4tpf^4mwTP`)IFM_f?uRPuv&YytQ?W8Iz*;JU!RB>dlWim9{NwpghDDy0I&G-Scvbz`vx1Hf zm#K~(+jZES=~y*RF96@yC-?`ad1c}o`zUj6Tej2n_}hTjuyNm~T(fIn1cKo5-U{R8 zi~E4dcAJOeeZ=nt$7X(euQu8rnwQ~T;jjc3KoB)Do=Y)T17$xkOkFstc{rGOjp8{3 z`S2$Jwr_l(6ijV8;g+lAV}Vw$P?sLn>E^4m5aqG|3Y^WbFdlV~W4oA5b@V~zWbir& zQ5kn3;!s658QgPQFjVL(>jxPxEc^y^o^Xx4bw{vKZzok+RD>3-w_78}i9GU4-BiXO z`BzKp)t~=z4TvmZ`ih5EF_H7#*z+bs!FW&&ijF4|DwpCVqfa8wNgn#)QDvvIZ=FGx z^q(&ZUFW~@@^EPeu{Q6sjGfMDZN(P=XzQot!&WyLhIL5E2}ussS~NK*?_GUEQ`$Fi zCF4d6jG)cS@n`hAELw#gkK^4m$h6-VjeKy^v(WTwatahI?Brp*#!-RAj1|bmqSd% zz=?rcx#)dXo1P|g=jYq_J8sFNEoxGDIZyjrji5i&u{%p|^^d%ZTiF!lm)P2?P5@^O zS$E1I*;XFry7BEMPxI~MJo{C@eJMUUmj9`Jvy~-h{W%wO1x+Uq-&_ZCa-Y6!iWBCO z24-}{jQFeLm&3WBn}^+p)6MK?aPmo+FIOn^%AScQ9js~3Lc=**VMt!?LP~SnlTx01e#2heih!sNZ zKF2z3h>LnC&mxk7&>3_y@w~Eevnuqir+914hlwc7v_mlTe6}GeSlL~52)%o!eh@NlH*Gl-=A$akIK6(v-DXDxmMrtN81KPHh2y$Aj~8C z9V40tn76D)b@?Y_RY{uLw>G#2IQz*&xQ8>L!yCm=Q7WrgGuLCBaO*gSanZx%xedgo z()Sjsle+z`|4c^efS*18`=!|bpec`Ck<16K^YxK%fH~sRjNK_la!8MvnUTN^{GNAP zj033;T$B3{CzAIX4(zo-)AsDH!B+2jD`mOAfosJN8&cexspVnhQKJ5jk}spn9+Z+| zPx#bNHh=(80|N=kIVl%*oC%wMSAsVK5O;=R@wazalld!X9PnBFa5ogN%vaLWVOxpO z_-A4buI(sQmUb$G+X&&C#}+BucPiKe=Qzc#x!i~+zyI)mg<>=#=M5U#$OJ$T$X5Hjv;jZ&AmJGO5{ zl35J}bsB`4YUdR1?7)~7L1$~z%ZQ#oF4V+HTbE>=HjMK z4}<7Cu(O!Cr#u$^x*l}ETb02r)mth9^YDy&xap93Z?vkzJyHId>Ou7cbl^Z#o%7F^ z5{va;xo`KjD#gmh7H_C8?xrL$e$_nnLbOaa^GpSuLn_<*x0-jLBPh6CZRSo&0s{A` zLAPzGA$D#a0m53|aGqnfvY{O5T;+^|+%dLl01Aj1bXVrLgP-xvLTeK1eqauZhaOM- ziO0Sd%XZlrYSZn9(Z{c%nLNeUTl zUU&ol3nX*f&jY_XOA?Z(qv;sT%z7HP1%>>c>DoH!FztYC!SkJ72qfdyFOm%+B~0{> zFn8y2!TtNrZI05MT2}&lIaTK)p$^ZamdE?C^|&^*w;L28;T6F?V@aUC|`yxdYhuALmC0prLgrKvtlAx>X5aQ zh)O%9w##Z+##ifv+Oy(&pEgEFNKST3u@gblZe*f*3Fxq0`&UR{m!vcpq2%{81%`AW zoR)798Qn^*XgK(wc7y&jZuYZYyCUB*ELAjvjB6WbZNy(vZR(J=of`?@AgX;db96MH zU1UkD=x%MLzMl5EIRH?G8uV}iG|#^qNYU>uKvq6pqo;pkrL>vHbk#g-=m&{Q#}i{~1Z?U@gH}&3zF*O((782qYFT}spXg@~n*4vT6z1dyDI8@J4`=njh z5Qj9cW4_bc=RZ2t_`?bSeb8?D3k9r$6Xvg(j#+C!H2l7Ia=BtBk9D_Rm~KW%J?zO~ zU*gdJly0z*cj&xoN(blB(6g@E4NqSALl+)Go$ASCNRD-z5F~-h;b=eAk|C*dk0z1k z`Pk~_Ru@h?GD}p@J34!*9!}&WWQ48Jc85ipBS;z_TZ%M&jJ}b_(%^h#Gx#$^@G0Pp zs`}}HzD@Lus_iO)OlezTW&LKwD0*CZ04tVan5FIhk2?&_qJM6UM$hez(FykXb*0WM zCLRC+EKx1&Gx?LWLXr=6A#CQeKpb?swhTxaHLpA9f}uvge^?%G{OwUrW8b1+1yH!QzWm?IkP!i%82TBVI5s>6@t&A3*OnLVtf6zQNb~ROGMW4j zbZbBE@bqtMd$z+g*$O{T_WDE&dajvDT59QWS#5@mJThL4#kV?ML*MpU_e`W*Bi?H) zXpHwB-Jqn|%u3AW=GN&EkRDuNG_v$ICf?`9vRzJwe=mVYM*HGVHmpe7yHZb6u8AbF z+yP~fg{d5Hc;v?C_&~?e51`~>z+xukl}N6^2n~agd+--bsnUx_VTY+%KK)J>l?zeJ zVf3#6^PuR=z-8qpN`rxZVL$N`{3f57zssMRb_SCEZXO;{2q66(o$+e7m0hXy zwbnl|{xQG4mz)-T8RbMfm94h(2Ejo)&-ur&?~3f}TsO4Ae0Hx0FDXHPSvm6S;GsX> zGg|cNz3f5GF}x!X)#W_F6q+ru&VD^)Y&ea<8#Uf&x}=r&JlDglyLQ{^P!JAnzs5Jb zB}lJJNTpj_33r-8(A=mlw1@;u9B^>mqKdJB4K34xcUJlb8lVp&-5=D?!dtUR!r%*f z6F45#V|;J9YhD++w}r6MA4esh0cEOijzL_PPrqry9%&Trc;Jj)8k7txDB{oQ@w zZDzt{zmZYl*WV`3=Lc6Y=g>1I{Jh(4C+*rUU^)3=4&ymFLj5i-BC#_az;;cwj?7^DPi)+=>A(`jDfdv#0RG61Vsds}I0NBJGv<&|cT zzVL&dnTp|zatK7b`)Y+p$8z+#Wo8y=UgwKLY@KdtjP2CrhjCotuG!Ad!-Wn64KOgX za_=baXIemhWafybLQ2)Wav{Xjfs2U@a{5P zG1;%@T?TdGCL{a37pA4?q}G@r)?0@Lzo(-rXQ=p+o5@<=bmN($v6YUa$1F+dzG9|f z)wdD@Fe z$buQ838NUNZpKp_^Mf`S33q&mVzE@AMZo)twABRaE#DC>4F6}I%fGKPBgm>aP(3)SdAWbb=n7K zk=HAYLBLndS>D!;1r$I}XZEei^Ca@^j^??)T|v-Y!#YzWO|BFKVWIx>EDys2(K57U zYtMJrqi<}7cpr>Ln-dnexDhr9wLkVu*~r|2r4#_nRiBbEogX1qo+ea13k|TjM%HuW zR}ljw?g&E%J7xNVTGx8>=g)gbON0KL7EIK9C;N`ZJeZ zZZ+QwZ`wC;lZ7xg5zN!5`alpsyEiV1B#OA~Kb?WTJx8j{$M`OQ;tthgc49a(2%YS6 z({Hl=fxLR1PX6(YVrBEDNAt_AWc&a{%@I|Z4tngbJMr}|ye3C&ypHPza>^ik;+JKS zXo?Wv#(~)?qd^i(7tt`PDvzqN6s!tfG$qPMYfeD}{<$I37NZ zV~V!L(E~S!fR*KUS*|~a!|2Qo?by&KpJg)J2z>6Cx;p%f+YB!ynyT-&-`;&7gun6x zHnFq%VTQofAzVWyV*s|`S)+dlH>(254ZKAC)6AsS6+uRi5|?uz71(6b(?~|D8RC2f zYdvkka#%{R;|AU)U;FMS^Rcu*wnOJ{ZnK{$`mFs2cu z&u`6+T}7dVXGj!+1)UKBBv}EXvW$d?G->~S{8fvs<$aN!zDLg5^Bt!6^N zQv967U}Z^a+ivTAOwX6=%LmgxLMEL~;%RuRnr?n|43Cr(!xh9wkDvhvEFOb?-``w^ z(U+YamMzCl*21?tsl@{c^iTouXrq@03iIS=UCJmv9+`YCf){ra8Iz^maln(~9;($*v;3n4)lt}nGU=25Gq0+Y6x`I*)Z497v`)d*#q~8d6={XC zLeutqVaGhww$5=gsBZjMwHhw% zv}7nAiqwkv$L^I4rUjv=Z>(;+= z2L{U$ZhI#Rq#^KFbR)oGu$#YWb0k{bPw5_ziT)A03%dHNJb(0|$y5%bG6c@HA|1^* zL>#1*Bh=`SKT&~0RF@aVgwl(@|C)@#p1PN@NiE^GHY~7uOr%E6g{&R&B6deYU92>p+*(v)!4_`!MIO=RH3B7?9 zfVj?Dr8(pjPfWEFfmJK2mVftUu@=6SBN2krZUYASA8&>(Nr}Lt0m+*hKJ~x%G{4g?M|1(v=8^WV9Wf3di_U}-+0zazgu z@Cp6hRr$F1*ThX&Q&Z}}y<)-iGPt&Nrk;Gs>%5pVhai9tLU20B@o^O0QY>HZ{D5BO zkaF=Z#jJ^E@XrS!w+$OiO0mp1-h&)m37iaL*)9sQ??f zJ;Hx&oc|WjH@0ZOCvhtPs0;bmqpHzCp@l;Wx}S7q3;Q_Fot~b?K3?x{ryBTwiY1&i zrv6!wF%xjTif)WCcpxsbgS@7qKmmR~^j;dXjuEh#(U z@;ar56vVF{BvlhPE%+6Ia?QN&9k5u{ktw3D_)j3@STr~tV-HskjRu;W%@$d+U$NQ)6t)m6R~Ug% z`q@$~vwN{{f(4idY(}7xDtQTqaAsVKIASp|AfkIXErU8JY6F5b!s`=aV$|}X%z__` zg)NWi6EI)ak{ae&OLn27+1kCV1}aBy9@{|>e&aBb)kN(at|-mG=@nniURvYGig+DA zp6d&`XP6|pP#044FiSxooMK@XUm$i#qR~Al>RXKxOfs<{@l`oeUZ0{=apWq?)~)P12KAOU0l=1B=e??8!_Wzw?fNf9Ao@Qb1qi0@+M(7L(UO?%R^nL(!?iP$9f z52!@We(>iVd6n91Xp-8P`?Xl-Dqz@T)@}Z?hXD_I52?zYY;Z2w!FVC?o=tRP; zhBT(J>wMj_5VqawW^uu;Mv!?TXSfGd0Lik=(FihqSAd9 za;5hNo1=)IXtFCOmXwqjK{&n(-y7batuEAf)g_#BNf=_@+H{7~(jR*@ zR+ul>z*Ll*t3QZiwX~w6%vg_T648n=AkB_E1^LH$y;nt-Q>bGob+uv9p!6Qsd2Aad zKC^GdEssULqAg|^y&KCv-Jtp&z5}v}7jRdPQy0GH2PUutF?l&0FMsXP(_QF4c#zgG zJOYb-4v0WNKdnW48f}*qDM{65@Y4GSg2@n=ZYv58%le-U_Xiphby(E@#S;bwhMbCu ziqJua}&^0DRVmhCQCu#U-KE@x4(}2CAPcp>!Hhfn!)A%?x>TQnoDRiJj+&Q zf*XXK|8u}yH8fk)_DP58dHX#JB$gQYqz^ZVNf(?4El=aN{?y@Q9j``zi<7_WiXIwDs+!jYe{ zsW1y-*802Ldjo37d=+RrWVQ8jCk}K0Qn)uc>16>_L(3Ay4v22{r=pXW_24CffkNg) zKW`STDod&Ex6bX|fb%fpeh`I;K=}LVR&Wh_=U~7V*{A3~NQxprw)YnDypX7u3;2iY z&L+x$DfyMj-K6VIzktGuRE%%`Vl`hP$iTf5#n-yRAwvGWf*3z`{r-)pS}foF*SH#a z?4!B4`N6?KAY^Q7&qhv0Ml@I}6x-+iv=?;NNya`oNx0pqQZyy;f(-5T`7?WEWi=C% z{sUBf6K_F{5~QG@pq7@FrIekSSuu#c45!q1N6eL0FD89 zvLM{{#^bk)#^FitBcC?Bb+mXZPD8H~3>8>O@AroHnE>zgMT4o2HG z9vh8(Ff4j31SF>nroPWUw!`INi-q$S$FSS%`q5Ay6$*al>&HzIcEynrzF*(@1A1mw z2=w2^M4#)(Gc9mXos-m|k%|aI{@~P_qq4a%U=aC4URLB21^Zs?u8zt>OB&=a@#Zkz%a6@u6azF9LW zQ9FpWrbFwtpLUPPze5+{x)tG;R;zapbz`zr^Z1=FzT+dEGFz6@OFHSn%agQiS~&ZemsQ^oFkLEF^P&m6e_tpyObM;N5XC}5kpv1`9dEv&Gy6x4&@t#a}o(Hd!_~rxbP+MaZSfQB$i?P@EzF zX#(HuxzM}h3K0YTdRVzq0ar*>0k*E4D;IP~xIsBR1vy3FTnZkbxFmfUJ@1HS?ReNKFSzM%>B})B{L40nLJOwPgT43@e)anhXCON=Wgf#L z++bX`uD0sTWFG&DtveqAS;vFpaNGyzR2!npqNmQ8+Mq#~B58>qF=Mz* zBV7o0b9-#NI`xY)P$@hi80;mAr(6%nz3+iV1Xb#yn|i6O7m?mrYYzwKTEc6fXyyXE zS^SQk9IEUdkF@ABNISs_P1$NYH(R8e?9S7YqH@*yw$y$~ld@uC}RYJ1YK zTJy+e1;9b%yXZ5iph?Dt=df>Ovkg-lC_lBrA>U21ikfcm61^>;5H}lHzo)K_*e!-w zhZ}U^I!h;9OGNaZ9_XC&x%s|fnJrY~-e<|FDM z)1_LwjA(KqFyT>{2O83wHZce;x;g9NuFjMzY^3Wbb+0?e4NlPI*v%u%V3%&82{*%k zRau(kFU3E*wC`Uz-vKhK@SA&^zv#_2T?2UnY67OAD*xa*^8?d;FiH)a$W=H z^bu~kkv3nzPykQFlW4#a@0f&6u$45UQ#2IWS~MoD2}Q01CPW0zy9kvUKAIJBoJevo-^IVq3|tikcN^if{78N(y)?GakYUlFIsMGiq18H$>ppN^T? z?=P`sX;4wldvW6vVc>glt(-~n|D+QSuvBbdTRPw8)27nu>N$z~XgO{k9w~i&(ksC3 z`yG)(ZduvqZ4C0t@*X;naZ+cgfxdoqSq18sCJKWZSUMb}Q*pmWNj(b-i;)~rGIZe^ zjNstl>X8l5p)%z4<}ka%2qKQ{Qf%TN*rVpB54-QjQGM8}@v{K~cN|EHFPm$I)c!VN zAq?+iHHhQW`iZeg^>xkPzDAYH5}5U~R=16B>JA*6m2eYJc7 z4fDl>_SMNG5@9=dN45Uy618Taftf(guo->3ab&)dA8k=}89pqtg@6{v2Bd?P1bXOV zh>wuuP|=p&9bqjC|3Cq39<^1?_8!{ZrngL zyM3lVdJ@~AAsP5W8?7ui7|CN~AyNmq?wb}SA&onO7KA_`h(8VOia!CiZ<2|n=?5;vCTh{E-#nUeA=bJf@{YS zEq*Lgy6(mEyN${oB23Pqm5o)j$FLB-8eVv3fh+()Glk`dt2~Jj@^&?Bg=}_IFZ?}u zQSi12SJ4PRLNBdCA04`j@eC)FT`pV$b0T+v059U@*YC>Kyu@{91kesn=L<_LkR=f6;-z3|xyuLO-@wC(L`%@v8ft@tl1Cx#-qJYukBdi3MUQQwa= zI*9n`F9TdkC;$Q@cyKd@26wo#%3sWr#cn# zUpFf$Me}4p#4TgnKglaI@c&G7QJ%8>J>)_L!y&6PR0T3P4){tlGaTqE7QaHMIK_k+BOl1<1m zi22jwJ~YF?Wkx1mna9k8DoE~f5gs3p-e%XDpqyWuA2=?~Uw*ul&LcNOJHXc98k&)V z-$o*6Ho@4jBFBAT87P#q&r~i|;5deT1>!F_5`x}1KPtu5UYPyt!~c_ICr@G*V%^Z- zL8l>~k_ww(HfAoI3d#g(Q_NuilDu_B<|a_TY%-ol>*&j2$5RgT8ifTqjPYw2k zwzR{wArx5$YB=8A2F1@80hkuVzan0FeUaTARjR*i9YKJT;;C_Vl5m7Da|#)b%^a6j zrH?{#PS7p~riU?#4Z>LwGjdZx4wl%KNoYG^21L7AT48Qe9mfYz6Swn;a0F;6-<@>U z=hs#uwDc#J+N)uFY2^GF5}Uyag!@r&w&msc2*nr>@POJilV{5y{aK$~mN7EcGbv2y z3&GeVEeZvi`LE9IH+YKE|AgyiE+}`Si0qw685@JXP@mqpQc{IWY1YN!kWU28gb9Rd z0~biwd8!`wnV{7Xz+ErYCLkx|X3F_z&KB!i zBZJbpeW7(HoH(HQTb%1vX^t9?DgZFkQ&aMKaRf|YY3z;@d$*Qx*`1voilP}9MJk}t zh#TkKy)XzvTEgnja{Q}kKV|O%yf_VOcjbZM5w1YI-eqUoS>v8mn$qJ|-%Sp$S)S08 zks(sUvJzP7fEf3xZb&#K5QkT~8QnvyX?!3#uDzfk>ZkYo%gV~4j=3SK3p~81r%(5& zH^$Xfa<*DID>yxNoTkccA80>>XGB#J`}p_T2!Mw)O1m$CvYaVZCe#V|RK|Mn3f3o& z-X4rs^;)iKKkX|F;}WKlj_WgczvG>moyl*mL6Dv5KsGC4+h~do`$$x<$TZ3g=R4W? zFwMF;^BNQs#OHeOZGit{4VtbO#cSHG1d{b`m~ z(whvXlLJ~DbuK?Gd)v6ExO3u|SdRND5!=yoSirZ*4cVA==Hn+S`x3!UnFrQogya>!p#MP04vw z7Uy$0V87Krjq`DCt3C+q_R`<2dtQCXa4e5(>V9fkC}MvoF`PC*-?#;ud2VrHYoU&J zdpLB2H;B^YB>^gC(GW7OiL-sr6e|hGEwA%c7cO#GFZNkGw<&)_xrn$hTpLOVzreS> zOjK!Mm{-ZI`b(ngFkgLP>v=s4*n}bNFK(6U&61rTgDoH~`?}s64YHNaUY1+n3tQXG zd4cxvf5P;c&QMyVoEdQqjL?q6Cu@W5)aS+*St2Fmz&*TXp>*oi)Vl8uf7la4K6)Vk z!{<*8;@nw7zZ{E>H|lVqpK9ueq+OS%*d<@&S*Uti(Wq2d3T|lQ#p_T`yI)cxd|CAr zp+0g3lRLA=N6+jc9frlisYo4tw*OP)%ynACYqdBjoT&T zonV(hQmGC;e2_S`zZ&L?pU4B&TeB}3P{8W-Pm(s@HMFX1TL$#>{+vmz0-DJ4YtF?> zHWUxiKu@Y@pO2>P#W}$g1X0V-o?k+5sw;4=X1byXO*d*C-ukp~JGkp~!;q?8Lm+B{w)mUCzT5j}&I{L_!%|Q| zm`IxMv$1D$_>ln5pYe?@ATyZdHv)Fu5q29RA#p1mk{@W%TXs4z=7fnaj6nk`kT7U* zkPI_llMb{Yyj~iN-eYAhKS8@^)%8rY+IJ^8;nA%JU_{bu(^=*duV{qpaEgXXxo(jX zY{9vZT;N!i=2B^&==af@lGkO!D@gnzfIXr|S8U$(&=To~byp{l5o*R4Waa9fO5#9$ zuTbERIHhNBrPDFw_rQ$XZ%Puqcn$;$DC^XxWfP;CODJTqU@j~`Za z@2F|@73nAX_*jZt3t>1rYznYCvGj5bGRwB`>z5{&!X{V)PyEvmMFCqHYNu)th#V8IZb?-mos^Ig^J{YxJO4|R^>2a=ji zw+hrW!akP|c-07!%N=Ajf@?7T!IfLQcWP24!6$BcERA)}{`ozj(7K3&;eqT39!r6$wK5p7MF1 zD5d{`r!@haobuYZDsL&Q9>alFfdXXJEig9O^5*46qhLn}HA}k3Y>NfBqg{FUvMUqX ztQ2Ql)lZF_lKJxHXq-=EC{L>kYA{|c#LhOnD9Gq}D+}`Bzl{|bpkm+p77&W%HMfWA zQ#GQLXaZ-z+q$B_qzEJ`)fdxi2?qhoF%+5~uJ#vd_ZE&Z;iLYB zuGivP_E%Z{*Wwk1qQnZA%$KZbI_KGes;;i~44Hg=k_6oJ*OsXkTjsxXK3WN%lqIUr zFKZ|BFIXQdjko2dqyzy({e=o*l2#gbeu-;7;f_HDfBpz~3p44S#pgg{%hB4%d}jAM zrni0J!W5jd>%!(t?XAmEjIR6cM8`r@?2o=V?hy;Y!S~SdhM>os9`bzBd3m$Ky`a;* z^2?n)jm;a!eEilpZVb+}`WcTlif40r{d91xj%+(tw5sn9+iT*VG_opG*jAA)_($nW z$)AG2QD11#Q$sG*H6>3rUuY8Rdf#-}ZK>}mcbibfGigMT7JcLE9cG)GOx#MBrMw2BjB};ISG%8O}=is3yeowhKG+)uH!` zv((J%A+Od6T2@;dAiC>!?L|8!gkiKcz4| z^+JqKO3rgFf~Mr;-6$hlGW0qo(!%bmHLn^3F35lAct&_rTSeIRAnOmdx4dBIub}6C0Z`d@aCAG$!oCe~YAge}T?^f2H}*8rpLnr|!uYI#~egwcu^a`iH=t_R7fd4En_cJts9+GL18AvVdh&>8p?7!MC%bR^nCzFDwVUVX0pZTm$O@NG^ca z#TiFP0?~_>#TU(&>MjhPbCF1C8btUY8|I=Rfk({jU$3Yq^d5m(!@et>rhLI6L{57% z1ShM`D1zDAK_gMU3-@9;1!unoejo6eNNw`7kLL#0M`q+aa_bB3qw%tO&=FB$o_Mui z)2Lb{x}zPAoGuG^!vfhP2ZH?9!G;B4iHx~^YZh*|BOUoY1Cl5z710k!3WYID=BFQ zVJQ~qXF>~`(e5&ghbs!SO@OVhE0nhc`UA9aC+0 z-_hKI;JeBw=8-7!^n)>H`DaNfe^}>n`))ib{`vIP*vF+Y`Fv1$9bb(Z`dtolNKB=W z_<%F1lWT69lyu{cEAg5xqK9fR4Lc=O!dOddhg!~H0%~h*bj-(@{GLT4lpd-~F0|a) z!$Z0%da;2#-yKsNlb)Z+T0Hf2S&|PjFarAp-{x1lM7_z6ZuHZCL|QW}#tQtHT+{l} z1aG8&%G{8YwR0nm03e9@29fvZ@KH~hc&_smo1^Ta35h5kfG)>3`Jk_x7VZm8E&H|4 z>&Aut=8pe?S)6c^*-$|{xBcLQ;u(vybuqUX^q%1_Id~LC)o&>VkuQlvwJl*lwK}u3 z-HKHo0W|+R=q=}T>3I)2C`vy}+t1pGKS#oTVyQK97&r=|zTI_Skio7P=X@!NapBVz zgGYM51RR^lKjx9_Rd*mvcvhB8>g2>XgF5;zHQ)iiP(R712@*4t!!VdNyhNl zz2hr|-^8glHn&lcMOw|utmw)Z#Po}hg4)y)gIGRRg$kL_`o{>z7pfS(RnaR&;98#(SYH zfC|Q6dWUolzJ4MQB$;N?%yHe1Pr?zxen=&mx){xLV!f4|&5#%T48oD824~&B+u#5K z6O&UW2x8$2*ac{6#kwD@RCyE~M#ap>d`Gs3g{K`Hh2QUG!gJ@`CQjm9!|GczhDL?OmaB#i?eP$Bs60M9wDGh7Vwu_i4(p!2R zwcGqPfMO~oun$`BBF9veud|JiQMU!FS!N03uNkVlQF^!4e+V+R&?Ay+zo1z2K4X`k zo~vuW#j{p?N31)46jTHSARoV0u^%zFXKnzCYZ%_Ja^4u>nnZ5+ots93a#GZ4iv6Me z1<$?OJZzbHK&VnT&9v-IwEO}EH$57LqrK?HM>k-spb_qk8QWltD3aDa0LV;h{+(l$ zptt_%w433=|K+VCtCV#)kc^j1lGsW$t4(veRde6~@GR-4Ds2#>|H39UUL`%&sklY< z9N*1pE<);MPEh=Kb2Ef$bTi(q=^+#mFumYVbK;=Yx~IKDwDxsBmRI&-`;Vp2U2ldK z5oTy^UNl>=^cOn3M75JW-!23<)sfd;bK>W1F^T(15y32^8B?j6$_LVQ+syc6*3S6v zsFT9cFPdcUNS!}!pysIk0yPsYQ2-54=&v{2Yw5Fo-!(5s8p9ozIo}7)dc!YX@A$PG zn>rc_Jlf_PsZkmlT-_HVJh05SL5O8qBr_!H7hlPv6CNCdVxBu~2L|Fr`W^N~LlNo} zw_~?p@N?mts22UWH2iAF)>)2Gzj|UO%T!Png#Jv?F|`O?zp{BNQ-0ee@Fi(QF25*i ze!pDbxFZ!0xL5y1Lhgv@|2&H%pDu``zw{%a3F%_hj_UHExM9J|7H%NUO+4w&Wp=ec zS9Dp~)0R_2OVT7D9d)4Hjrc1WA}lnbkF430=EHN;^TnLam+c&6kImnhT#g=${iyPW z3q28ioH?7*$efpd4oS2~K1qdV&&}I}(9;XBYz^-l^j5cN#OM;oIvI&tn2Iq@-8=M^ zIM_+nszQ)v@B^(xtLGbJUu6(v5LP^4m@tWt5W{c8OeZ!BlyX0UC+-$ia+RhLGF760 zdl)F!b>WN!Lrd}}hUXJ8CsR0u8Y6*3%ziY+V~peTN}=Y0f<_M*0)BdvU58v|Y2ne- zbCymyp@Ih5!3U%zA^pwNW>g*PP5}6;C;)$E=;xpW9VVDXzWOtaf{|-OZgV7aX1%a7 z`}V~Cd`VwvyH{etcpR#t|3%X~Mpgd3|HD&Fwr$(iWZSmwnyi!Egb9;v+jb}0wq19h z|Mz#Vz1I7|d3ddToeTSgDf~}gJ}MU{Qx&@1U1vjNeh}7_jnH%gZAL$ygfbchVi-6G2DU^+?<>gma%~y$yJ&CBl1f&V3wzHi z(-|xv0Q zLz^nlOtS^!gmE780ii(R`f@JB-utv#Q-kZ!U=GRggYdUwhvmOMcv7uKvZzLDnmVQ=;dYFthL_pPEA{W*Ah=EsMTrK}u2pPk`40#|hew*@G_jpjTmDEN=$ZnW=?;?O!b?wxHe!$UC}51?a0+Pn{)w{@+TN7>cUZuUuFSyb)1# z`M$jFgqu;Ni8)79T_=iyh0*CDI=i&BIChySrH*}%c#+Jg&~Z*EQ0(xN$79CWkcU`GU2 zzpC`E{{8l>$`!>LQn2em=e0s$$2OfZV~b&&2a&q?1JrmbR*hvQ;KBg!m$Eu|=C>?B z#|tddUP(MmmCG;bOk}D_4*F^Zwe&Xa* z%kVN(&1SR5jdBqdn$BuNXQ~ zd?JyTIT+b|Y;LVquoz5EZ(7gG3Sle~jj6uYEF`B!*Ai1g+!LH6Q#w3b_~4fODyArp zSH0tzvLcPJ(B^yz@2+>99Ch1N1rU_yjHB}VcUM~s4NcBdRlkH-6I0g}uB|tf;_xyf zkK1ibFF)cm8T^P;#moK=n)K@CVk~PEot}~$q+G%Co?x~#t2Kzy+ARtdgzL{Xg3MRnkZx+)WJ>c^#N&Td1Vnyiu4evqPsM5XUiS1Fl6 zm&~=PELOSQ`PKOnn=>B3^SP(I2}&()E>c09707M4deKa}uC}zy7^}VJMeNf;y7otefs)^eb8&ZjAsGdy zvi{C-lLP`8_3#Aejr}8?h{_lW09eb-;lgzqj&hwQu>_3E7}4DJF?Mm7bW;ecv_GY& zs}2E2%|7gHrC5S9Ot>hXJaLyzCV~pF_}3+tmaDCk z!_u9xPeoGpveEaL#MhP?%Wl$L@L0e_HYN>chpiMwZs;DIG~fEMbtjZfp8HnPIzom% z1>EeA*lmc1Vi4xObD5_`%(Dd(A22fCy9IWk`8Ut}wIOmDjH}vK#O}B<4I8`E3ggi%qk1Q4w1h@p+HoP>!~EZiNA%nM05rohy*71N((SPn^@LT zIpP0dK3dX|x7(X#JlJQb?A||^L)gw2*%zob-@q1&N7MHu%NsC=VvsLzm1B6@QCzB1 zrX(v_%$i79DB2Jt2CjFo1lG~BHzAnps>HAl$}7KKp}su*!BGA-zV4gb!E5=H=#=Hs z#mj!gEL3*)<2ncgwySRh7MA-5ryBU6J;~+N`&r?XO(o<~Yczixbk8F9) z%Yx5LtXmfq74WjM28V?~UUt3N`#kT2wS0T7R}qNi4&G+ONZsu+*$hi?eI9hzz62uH z#5XBVl2r(ViLAvL`{u#&X?)-yM!Y*|!*YJ0(x>F|s4L!3ffISuhWUu;Muc>~buFvTt3&vMsAb_r{JwMWJh7Q6cg-md|G@S^in3kOlC!x z>>M8r2u6?ejcczpHX(GsKH-L_Y>I^vQuH1Wm7*fRbR#enZ{HOjY*%!N=t381Vo4L@HzMHC5tB7IyQ@!_uCI|m_u?Y^u2kwlmPSYk=P!!W;kFjq z&|T~3_%9BB$l};P%nnRQlZ4{U24O|FYVRtkZV;5Qc!9a&7oK-dush4F?v+#L03yp1 z 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 Date: Sat, 9 Jul 2022 15:40:36 -0400 Subject: [PATCH 013/212] Update Windows.md --- setup/Windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/Windows.md b/setup/Windows.md index 53dbe419..a911c6bb 100644 --- a/setup/Windows.md +++ b/setup/Windows.md @@ -19,7 +19,7 @@ called [MobaXterm](https://mobaxterm.mobatek.net). extract the `.zip` file into a folder before attempting to install. Do not attempt to run the installer from within the `.zip` file. Instead, run the installer program from within the folder that you extract to. - ![WARNING](img/in-zip-file.png) + ![WARNING](in-zip-file.png) MobaXterm Website: https://mobaxterm.mobatek.net/download-home-edition.html From e96bec253d3f7238335cae01ba87e1f2344c28cd Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 15:56:24 -0400 Subject: [PATCH 014/212] Update octal-mode.md --- octal-mode.md | 47 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/octal-mode.md b/octal-mode.md index 270d72b4..75063cc1 100644 --- a/octal-mode.md +++ b/octal-mode.md @@ -1,6 +1,6 @@ # Octal Mode -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ## Prerequisites @@ -37,12 +37,49 @@ On Odin, try the following: $ stat newfile ``` -## Octal Mode +## Mode One very important part of a file's status information is its _mode_, which contains information -about the file's type (e.g., regular file or directory file) and its associated permissions. In -the output to `ls -l`, you see the symbolic mode. However, another way to express the permission -portion of the mode is using octal notation. +about the file's type (e.g., regular file or directory file) and its associated permissions. + +The first character of the mode denotes the file type. In Unix, file type refers to how the file +behaves from the file system's perspective. Common file types include: + + ========= ============== =================== + Character File Type Description + ========= ============== =================== + ``-`` regular file text or binary data + ``d`` directory file collection of files + ``l`` symbolic link shortcut to a file + ========= ============== =================== + +The next nine (9) characters denote the read (``r``), write (``w``), and execute (``x``) permissions +for the file's user (``u``), group (``g``), and others (``o``). We will go into more detail regarding +file permissions later in this tutorial, but here is a quick breakdown for ``rw-r--r--``: + + ===== ===== ===== ===== ===== ===== ===== ===== ===== + User Group Others + ------------------- ------------------- ------------------- + R W X R W X R W X + ===== ===== ===== ===== ===== ===== ===== ===== ===== + ``r`` ``w`` ``-`` ``r`` ``-`` ``-`` ``r`` ``-`` ``-`` + ✓ ✓ ✗ ✓ ✗ ✗ ✓ ✗ ✗ + ===== ===== ===== ===== ===== ===== ===== ===== ===== + +File type cannot usually be changed after a file has been created; however, a file's permissions +can always be changed by its owner, a superuser (administrator), or a program acting on behalf +of either the owner or a superuser. It is also worth noting that superusers are usually not +subject to permission restrictions. + +The eleventh (11) character specifies whether an alternate access method such as an access control list +applies to the file in addition to the displayed permissions. This topic is beyond the scope of this +reading, but for those who are curious, the ``.`` indicates that a file has an SELinux security context +and no other alternate access method. + +## Octal Mode + +In the output to `ls -l` and in the examples above, you see the symbolic mode. However, another way to +express the permission portion of the mode is using octal notation. **NOTE:** Although the symoblic mode may be more readable in many cases, octal notation is vastly more prevalent in literature and examples that you may find online. From 777642641187763fa29bc4abf84d7bcbfdec36c0 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 16:11:07 -0400 Subject: [PATCH 015/212] Update octal-mode.md --- octal-mode.md | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/octal-mode.md b/octal-mode.md index 75063cc1..6a01079d 100644 --- a/octal-mode.md +++ b/octal-mode.md @@ -45,26 +45,21 @@ about the file's type (e.g., regular file or directory file) and its associated The first character of the mode denotes the file type. In Unix, file type refers to how the file behaves from the file system's perspective. Common file types include: - ========= ============== =================== - Character File Type Description - ========= ============== =================== - ``-`` regular file text or binary data - ``d`` directory file collection of files - ``l`` symbolic link shortcut to a file - ========= ============== =================== + |Character |File Type |Description | + |----------- |---------------- |---------------------| + |`-` |regular file |text or binary data | + |`d` |directory file |collection of files. | + |`l` |symbolic link |shortcut to a file | The next nine (9) characters denote the read (``r``), write (``w``), and execute (``x``) permissions for the file's user (``u``), group (``g``), and others (``o``). We will go into more detail regarding file permissions later in this tutorial, but here is a quick breakdown for ``rw-r--r--``: - ===== ===== ===== ===== ===== ===== ===== ===== ===== - User Group Others - ------------------- ------------------- ------------------- - R W X R W X R W X - ===== ===== ===== ===== ===== ===== ===== ===== ===== - ``r`` ``w`` ``-`` ``r`` ``-`` ``-`` ``r`` ``-`` ``-`` - ✓ ✓ ✗ ✓ ✗ ✗ ✓ ✗ ✗ - ===== ===== ===== ===== ===== ===== ===== ===== ===== + |User |Group |Others | + |--------------------- |------------------- |-------------------| + |R W X |R W X |R W X | + |`r` `w` `-` |`r` `-` `-` |`r` `-` `-` | + |✓ ✓ ✗ |✓ ✗ ✗ |✓ ✗ ✗ | File type cannot usually be changed after a file has been created; however, a file's permissions can always be changed by its owner, a superuser (administrator), or a program acting on behalf From 8da6312f095aab4c61023ec9ad98579d83e042d8 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 16:16:46 -0400 Subject: [PATCH 016/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 42 ++++++------------------------------------ 1 file changed, 6 insertions(+), 36 deletions(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 2876685e..48e30dd7 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -297,42 +297,12 @@ is included in the "long" output format, as described below the next few example .. [1] .. rubric:: **Mode** - The file type and permissions. The first character denotes the file type. - In Unix, file type refers to how the file behaves from the file system's perspective. - File type and content format are different concepts. File suffixes like ``.txt``, - ``.mp3``, ``.pdf``, etc. are all naming conventions for the content formats of certain - regular files. Common file types include: - - ========= ============== =================== - Character File Type Description - ========= ============== =================== - ``-`` regular file text or binary data - ``d`` directory file collection of files - ``l`` symbolic link shortcut to a file - ========= ============== =================== - - The next nine (9) characters denote the read (``r``), write (``w``), and execute (``x``) permissions - for the file's user (``u``), group (``g``), and others (``o``). We will go into more detail regarding - file permissions later, but here is a quick breakdown for ``rw-r--r--``: - - ===== ===== ===== ===== ===== ===== ===== ===== ===== - User Group Others - ------------------- ------------------- ------------------- - R W X R W X R W X - ===== ===== ===== ===== ===== ===== ===== ===== ===== - ``r`` ``w`` ``-`` ``r`` ``-`` ``-`` ``r`` ``-`` ``-`` - ✓ ✓ ✗ ✓ ✗ ✗ ✓ ✗ ✗ - ===== ===== ===== ===== ===== ===== ===== ===== ===== - - File type cannot usually be changed after a file has been created; however, a file's permissions - can always be changed by its owner, a superuser (administrator), or a program acting on behalf - of either the owner or a superuser. It is also worth noting that superusers are usually not - subject to permission restrictions. - - The eleventh (11) character specifies whether an alternate access method such as an access control list - applies to the file in addition to the displayed permissions. This topic is beyond the scope of this - reading, but for those who are curious, the ``.`` indicates that a file has an SELinux security context - and no other alternate access method. + The mode specifies the file type and permissions. The first character tells you what type of file is listed. + In most cases, this character will be either ``-`` for regular files and ``d`` for directories. + The rest of the bits represent the permissions of the file. In other words, which users on the system are + allowed to read, modify, and execute the file. We will talk about permissions in more detail in a few weeks. + If you are interested in reading ahead, please see the + `1302 Octal Mode Tutorial `_. .. [2] .. rubric:: **Hard Links** From e19af85357353aec2315e4a5a08a3eca325985df Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 9 Jul 2022 16:24:04 -0400 Subject: [PATCH 017/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 48e30dd7..022de713 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -15,14 +15,14 @@ This tutorial assumes that the reader is a Computer Science student at the University of Georgia with access to the department's instructional server called Odin. If you were assigned this reading in a -CSCI class at UGA, then you probably have access. We recommend writing the +CSCI class at UGA, then you should already have access. We recommend writing the answers to any questions asked in this tutorial in your notes along with some context. These notes will be helpful for studying. Logging into a Unix Machine --------------------------- -Access to Odin is restricted behind a firewall. In order to access Odin off-campus, you +Access to Odin is restricted behind a firewall. In order to access Odin from off-campus, you will need to connect to UGA's remote access VPN using the instructions found `here `_. From 53441fd227b4a8aecd6dce31e16c0772db6949fd Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 10 Jul 2022 12:55:02 -0400 Subject: [PATCH 018/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 022de713..1122d810 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -19,6 +19,14 @@ CSCI class at UGA, then you should already have access. We recommend writing the answers to any questions asked in this tutorial in your notes along with some context. These notes will be helpful for studying. +How to engage with this tutorial +-------------------------------- + +When working through any tutorial in 1302, it is expected that you will fully engage with the material. In +other words, it is not sufficient to skim read the content. You should carefully read and process +and then follow along by typing the commands into your terminal emulator, taking notes as you go. +Doing so will improve your understanding of the content and help you retain it long term. + Logging into a Unix Machine --------------------------- From dd79cbd1ffeb0714b5cf7604e7b9bc5fd07a512d Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 10 Jul 2022 12:56:31 -0400 Subject: [PATCH 019/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 1122d810..51e108a2 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -15,9 +15,7 @@ This tutorial assumes that the reader is a Computer Science student at the University of Georgia with access to the department's instructional server called Odin. If you were assigned this reading in a -CSCI class at UGA, then you should already have access. We recommend writing the -answers to any questions asked in this tutorial in your notes along with some -context. These notes will be helpful for studying. +CSCI class at UGA, then you should already have access. How to engage with this tutorial -------------------------------- @@ -25,7 +23,11 @@ How to engage with this tutorial When working through any tutorial in 1302, it is expected that you will fully engage with the material. In other words, it is not sufficient to skim read the content. You should carefully read and process and then follow along by typing the commands into your terminal emulator, taking notes as you go. -Doing so will improve your understanding of the content and help you retain it long term. +We recommend writing the answers to any questions asked in this tutorial in your notes along with some +context. These notes will be helpful for studying. + +Fully engaging with the content will improve your understanding of the content and help you retain +the information long term. Logging into a Unix Machine --------------------------- From 644512a7337f94ae9102e9914b799400f1f40997 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 10 Jul 2022 13:11:50 -0400 Subject: [PATCH 020/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 43 ++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 51e108a2..25f9cb56 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -24,7 +24,9 @@ When working through any tutorial in 1302, it is expected that you will fully en other words, it is not sufficient to skim read the content. You should carefully read and process and then follow along by typing the commands into your terminal emulator, taking notes as you go. We recommend writing the answers to any questions asked in this tutorial in your notes along with some -context. These notes will be helpful for studying. +context. These notes will be helpful for studying. If you have any questions as you are working through +the tutorial, you are encouraged to post on the course Piazza page. Your questions will not only help +you fill gaps in your knowledge but also give us insight on potential updates to the tutorials. Fully engaging with the content will improve your understanding of the content and help you retain the information long term. @@ -56,10 +58,8 @@ Simply type in your password, then press the return key to continue. If you have trouble logging into Odin, then please contact support@cs.uga.edu as soon as possible. -When typing into a remote terminal, the commands that you enter -are executed on the remote computer. It might look like you are -running programs locally, but they are simply being displayed -locally. +Remember, when typing into a remote terminal, the commands that you enter +are executed on the remote computer - not on your personal computer. .. table:: @@ -90,6 +90,9 @@ without permission violates sections 4.2 and 4.3 of the +++++++ When you login to Odin, you are placed in your *home directory* (home folder). +You can think of this as your own personal folder where your files will be stored +on Odin. Any code you write in 1302 will be in a subfolder of your home directory. + You can see where your home directory is on the system with the help of the ``pwd`` (print working directory) command. It always displays the absolute "path" of the directory that you are presently in. It is called an absolute @@ -138,26 +141,23 @@ of which you may have seen in earlier examples. ``whoami`` Print the user name associated with the current user. ========== ====================================================================================== -``.bash_profile`` -+++++++++++++++++ +``.bash_profile`` (Required Command) +++++++++++++++++++++++++++++++++++++ To continue with this tutorial, the **CSCI 1302 shell profile** needs to be enabled on your Odin account. Enabling this profile is also required to complete coursework in CSCI 1302. A *shell profile* includes commands and setting customizations that take effect when the profile is *sourced* (loaded). -When ``bash`` is launched as a login shell, it sources a default system profile, -then it looks in the user's home directory for ``.bash_profile``, ``.bash_login``, -and ``.profile`` files, in that order, and sources the first one that is available. - -You may already have the CSCI 1302 shell profile enabled. If you do, then -you will see ``Setting up environment for CSCI 1302...`` -followed by lines prefixed with ``[cs1302]`` when you login to Odin. +This step will set up your programming environment for 1302. It will tell the system +where to find the java compiler and other tools that we will use throughout the +semester. +If you see something similar to what is presented below when you login, +then the CSCI 1302 shell profile is enabled on your account, and you should +proceed immediately to the next section of this tutorial. + .. figure:: img/cs1302-profile-check-demo.svg?1 -* If you see something similar to what is presented above when you login, - then the CSCI 1302 shell profile is enabled on your account, and you should - proceed immediately to the next section of this tutorial. * If you do not see any of that when you login, then the CSCI 1302 shell profile is not enabled on your account. To enable it, execute the command below. The @@ -182,7 +182,14 @@ followed by lines prefixed with ``[cs1302]`` when you login to Odin. .. figure:: img/cs1302-profile-enable-demo.svg - * **Make sure that you logout, then login again before continuing.** + +**Make sure that you logout, then login again before continuing.** +When you log back in, you should see output similar to what is shown in the video +at the start of this section. + +Congratulations! If you see the output above when you log into Odin, you have set up your +Odin account. You're now ready to log into a remote computer and develop software! + Navigating the File System ------------------------- From b3f7d328c481519a788c9d20b246941c9106b855 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 10 Jul 2022 13:45:09 -0400 Subject: [PATCH 021/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 166 +++++++++++++++++++++++++++++++++- 1 file changed, 163 insertions(+), 3 deletions(-) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index 245ac676..71276d16 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -10,6 +10,20 @@ .. contents:: **Table of Contents** :depth: 3 +How to engage with this tutorial +================================ + +When working through any tutorial in 1302, it is expected that you will fully engage with the material. In +other words, it is not sufficient to skim read the content. You should carefully read and process +and then follow along by typing the commands into your terminal emulator, taking notes as you go. +We recommend writing the answers to any questions asked in this tutorial in your notes along with some +context. These notes will be helpful for studying. If you have any questions as you are working through +the tutorial, you are encouraged to post on the course Piazza page. Your questions will not only help +you fill gaps in your knowledge but also give us insight on potential updates to the tutorials. + +Fully engaging with the content will improve your understanding of the content and help you retain +the information long term. + Introduction ============ @@ -167,9 +181,155 @@ as illustrated in the figure below. all connected to a remote computer (center). Most Unix-like operating systems support multiple users and multiple sessions -per user. The tutorial will show you how to establish a remote terminal -session. After that, you are encouraged to try logging in more than once to -see what it's like. +per user. Next, we will show you how to establish a remote terminal +session with our departmental server. After that, you are encouraged to try logging +in more than once to see what it's like. + +Logging into a Remote Unix Machine +================================== + +In this section, you will log into your account on the computer science departmental server called +Odin. We will do all of our programming this semester on this Unix server so you become comfortable +working in a command-line Unix environment. + +Access to Odin is restricted behind a firewall. In order to access Odin from off-campus, you +will need to connect to UGA's remote access VPN using the instructions found +`here `_. + +``ssh`` ++++++++ + +Your username on Odin is your UGA MyID and the password is the same one that +is associated with your MyID. Once you are successfully logged into the VPN, +open up a local terminal in your terminal emulator and execute the ``ssh`` +(secure shell) command shown below to establish a secure connection -- be +sure to replace ``username`` with your MyID. When you type in your password, +it will not display anything to the screen -- this is the expected behavior. +Simply type in your password, then press the return key to continue. + +.. code-block:: shell + + $ ssh username@odin.cs.uga.edu + +.. figure:: img/login-demo.svg + +If you have trouble logging into Odin, then please +contact support@cs.uga.edu as soon as possible. + +Remember, when typing into a remote terminal, the commands that you enter +are executed on the remote computer - not on your personal computer. + +.. table:: + + ===================== ====================================================================== + Command Description + ===================== ====================================================================== + ``ssh user@hostname`` Start a secure shell connection to ``hostname`` and login as ``user``. + ===================== ====================================================================== + +``pwd`` ++++++++ + +When you login to Odin, you are placed in your *home directory* (home folder). +You can think of this as your own personal folder where your files will be stored +on Odin. Any code you write in 1302 will be in a subfolder of your home directory. + +You can see where your home directory is on the system with the help of the +``pwd`` (print working directory) command. It always displays the absolute +"path" of the directory that you are presently in. It is called an absolute +path, because it describes the path of directories that you would need to +traverse to get from the root of the file system (i.e., the ``/`` directory) +to the current working directory one directory at a time. + +.. code-block:: shell + + $ pwd + +.. figure:: img/pwd-demo.svg?1 + +.. code-block:: plain + + / + └── home + └── myid + └── mepcott + +* What is the absolute path of your home directory? +* What character does an absolute path always start with, and + what does it represent? + +.. table:: + + ======== ====================================================================== + Command Description + ======== ====================================================================== + ``pwd`` Print absolute path of current working directory. + ======== ====================================================================== + +``date``, ``exit``, ``whoami`` +++++++++++++++++++++++++++++++ + +Listed below are some easy commands that you can try out immediately, some +of which you may have seen in earlier examples. + +.. table:: + + ========== ====================================================================================== + Command Description + ========== ====================================================================================== + ``date`` Print the system date and time. + ``exit`` Exit the current shell. + ``whoami`` Print the user name associated with the current user. + ========== ====================================================================================== + +``.bash_profile`` (Required Command) +++++++++++++++++++++++++++++++++++++ + +To continue with this tutorial, the **CSCI 1302 shell profile** needs +to be enabled on your Odin account. Enabling this profile is also required +to complete coursework in CSCI 1302. A *shell profile* includes commands +and setting customizations that take effect when the profile is *sourced* (loaded). +This step will set up your programming environment for 1302. It will tell the system +where to find the java compiler and other tools that we will use throughout the +semester. + +If you see something similar to what is presented below when you login, +then the CSCI 1302 shell profile is enabled on your account, and you should +proceed immediately to the next section of this tutorial. + +.. figure:: img/cs1302-profile-check-demo.svg?1 + + +* If you do not see any of that when you login, then the CSCI 1302 shell profile + is not enabled on your account. To enable it, execute the command below. The + command adds a line to the ``.bash_profile`` file in your home directory so + that the profile is sourced each time you login. You won't have to run this command + again this semester. + + **NOTE:** Unlike some of the examples you've seen with ``mepcott`` (i.e., Dr. Cotterell's + username), the ``mepcott`` in the following command should NOT be replaced with + your username. The command is provided by Dr. Cotterell to enable the + CSCI 1302 shell profile on your account. + + .. code-block:: shell + + $ /usr/local/mepcott/cs1302.enable + + .. code-block:: shell + + # |-------| + # | + # MUST USE "mepcott" HERE + + .. figure:: img/cs1302-profile-enable-demo.svg + + +**Make sure that you logout, then login again before continuing.** +When you log back in, you should see output similar to what is shown in the video +at the start of this section. + +Congratulations! If you see the output above when you log into Odin, you have set up your +Odin account. You're now ready to log into a remote computer and develop software! .. copyright and license information .. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN From ea07d436d0e652e9da222192d23c646bc25b5b2f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 10 Jul 2022 13:45:19 -0400 Subject: [PATCH 022/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 179 ----------------------------------------- 1 file changed, 179 deletions(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 25f9cb56..6ca26e14 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -12,185 +12,6 @@ ---- -This tutorial assumes that the reader is a Computer Science student -at the University of Georgia with access to the department's -instructional server called Odin. If you were assigned this reading in a -CSCI class at UGA, then you should already have access. - -How to engage with this tutorial --------------------------------- - -When working through any tutorial in 1302, it is expected that you will fully engage with the material. In -other words, it is not sufficient to skim read the content. You should carefully read and process -and then follow along by typing the commands into your terminal emulator, taking notes as you go. -We recommend writing the answers to any questions asked in this tutorial in your notes along with some -context. These notes will be helpful for studying. If you have any questions as you are working through -the tutorial, you are encouraged to post on the course Piazza page. Your questions will not only help -you fill gaps in your knowledge but also give us insight on potential updates to the tutorials. - -Fully engaging with the content will improve your understanding of the content and help you retain -the information long term. - -Logging into a Unix Machine ---------------------------- - -Access to Odin is restricted behind a firewall. In order to access Odin from off-campus, you -will need to connect to UGA's remote access VPN using the instructions found -`here `_. - -``ssh`` -+++++++ - -Your username on Odin is your UGA MyID and the password is the same one that -is associated with your MyID. Once you are successfully logged into the VPN, -open up a local terminal in your terminal emulator and execute the ``ssh`` -(secure shell) command shown below to establish a secure connection -- be -sure to replace ``username`` with your MyID. When you type in your password, -it will not display anything to the screen -- this is the expected behavior. -Simply type in your password, then press the return key to continue. - -.. code-block:: shell - - $ ssh username@odin.cs.uga.edu - -.. figure:: img/login-demo.svg - -If you have trouble logging into Odin, then please -contact support@cs.uga.edu as soon as possible. - -Remember, when typing into a remote terminal, the commands that you enter -are executed on the remote computer - not on your personal computer. - -.. table:: - - ===================== ====================================================================== - Command Description - ===================== ====================================================================== - ``ssh user@hostname`` Start a secure shell connection to ``hostname`` and login as ``user``. - ===================== ====================================================================== - -Important Note -++++++++++++++ - -For CSCI 1302, you are expected to connect to Odin using SSH and the programs -desribed in the instructions provided by your instructor. While other programs may exist -that also allow you to establish an SSH connection to Odin, use of certain programs -is explicitly forbidden in CSCI 1302 since they consume large amounts of remote system -resources, disrupting other students' use of the system. -You should NOT use any of the following programs to connect to Odin: - -* `Video Studio Code Remote Development Extension `_ -* `code-server `_ - -Using the programs mentioned above or programs like the ones mentioned above -without permission violates sections 4.2 and 4.3 of the -`UGA Policies on the Use of Computers `_. - -``pwd`` -+++++++ - -When you login to Odin, you are placed in your *home directory* (home folder). -You can think of this as your own personal folder where your files will be stored -on Odin. Any code you write in 1302 will be in a subfolder of your home directory. - -You can see where your home directory is on the system with the help of the -``pwd`` (print working directory) command. It always displays the absolute -"path" of the directory that you are presently in. It is called an absolute -path, because it describes the path of directories that you would need to -traverse to get from the root of the file system (i.e., the ``/`` directory) -to the current working directory one directory at a time. - -.. code-block:: shell - - $ pwd - -.. figure:: img/pwd-demo.svg?1 - -.. code-block:: plain - - / - └── home - └── myid - └── mepcott - -* What is the absolute path of your home directory? -* What character does an absolute path always start with, and - what does it represent? - -.. table:: - - ======== ====================================================================== - Command Description - ======== ====================================================================== - ``pwd`` Print absolute path of current working directory. - ======== ====================================================================== - -``date``, ``exit``, ``whoami`` -++++++++++++++++++++++++++++++ - -Listed below are some easy commands that you can try out immediately, some -of which you may have seen in earlier examples. - -.. table:: - - ========== ====================================================================================== - Command Description - ========== ====================================================================================== - ``date`` Print the system date and time. - ``exit`` Exit the current shell. - ``whoami`` Print the user name associated with the current user. - ========== ====================================================================================== - -``.bash_profile`` (Required Command) -++++++++++++++++++++++++++++++++++++ - -To continue with this tutorial, the **CSCI 1302 shell profile** needs -to be enabled on your Odin account. Enabling this profile is also required -to complete coursework in CSCI 1302. A *shell profile* includes commands -and setting customizations that take effect when the profile is *sourced* (loaded). -This step will set up your programming environment for 1302. It will tell the system -where to find the java compiler and other tools that we will use throughout the -semester. - -If you see something similar to what is presented below when you login, -then the CSCI 1302 shell profile is enabled on your account, and you should -proceed immediately to the next section of this tutorial. - -.. figure:: img/cs1302-profile-check-demo.svg?1 - - -* If you do not see any of that when you login, then the CSCI 1302 shell profile - is not enabled on your account. To enable it, execute the command below. The - command adds a line to the ``.bash_profile`` file in your home directory so - that the profile is sourced each time you login. You won't have to run this command - again this semester. - - **NOTE:** Unlike some of the examples you've seen with ``mepcott`` (i.e., Dr. Cotterell's - username), the ``mepcott`` in the following command should NOT be replaced with - your username. The command is provided by Dr. Cotterell to enable the - CSCI 1302 shell profile on your account. - - .. code-block:: shell - - $ /usr/local/mepcott/cs1302.enable - - .. code-block:: shell - - # |-------| - # | - # MUST USE "mepcott" HERE - - .. figure:: img/cs1302-profile-enable-demo.svg - - -**Make sure that you logout, then login again before continuing.** -When you log back in, you should see output similar to what is shown in the video -at the start of this section. - -Congratulations! If you see the output above when you log into Odin, you have set up your -Odin account. You're now ready to log into a remote computer and develop software! - - Navigating the File System ------------------------- From 284cb19ea10dc14ac5e249e3552a1481fa0179ec Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 10 Jul 2022 13:49:28 -0400 Subject: [PATCH 023/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 6ca26e14..69c3c8a2 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -1,5 +1,5 @@ .. sectnum:: -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202022-purple +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen ================ Unix: Tutorial @@ -12,6 +12,25 @@ ---- + +How to engage with this tutorial +--------------------------------- + +**Important:** If you have not completed the +`Unix: Getting Started `_ +tutorial, please complete that before beginning this tutorial. + +When working through any tutorial in 1302, it is expected that you will fully engage with the material. In +other words, it is not sufficient to skim read the content. You should carefully read and process +and then follow along by typing the commands into your terminal emulator, taking notes as you go. +We recommend writing the answers to any questions asked in this tutorial in your notes along with some +context. These notes will be helpful for studying. If you have any questions as you are working through +the tutorial, you are encouraged to post on the course Piazza page. Your questions will not only help +you fill gaps in your knowledge but also give us insight on potential updates to the tutorials. + +Fully engaging with the content will improve your understanding of the content and help you retain +the information long term. + Navigating the File System ------------------------- From 80f016b71f8064114d60c5e1e2a1c9533534bd9f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 10 Jul 2022 13:52:42 -0400 Subject: [PATCH 024/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 69c3c8a2..b108f76c 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -24,7 +24,8 @@ When working through any tutorial in 1302, it is expected that you will fully en other words, it is not sufficient to skim read the content. You should carefully read and process and then follow along by typing the commands into your terminal emulator, taking notes as you go. We recommend writing the answers to any questions asked in this tutorial in your notes along with some -context. These notes will be helpful for studying. If you have any questions as you are working through +context. For this tutorial, **we recommend logging into Odin and typing the commands as you work through +the examples**. If you have any questions as you are working through the tutorial, you are encouraged to post on the course Piazza page. Your questions will not only help you fill gaps in your knowledge but also give us insight on potential updates to the tutorials. @@ -34,7 +35,7 @@ the information long term. Navigating the File System ------------------------- -Earlier in this tutorial, you experienced the ``pwd`` (print working directory) +In the previous tutorial, you experienced the ``pwd`` (print working directory) command and were provided a brief introduction to absolute paths. In Unix, a *directory file* or *directory* is the same concept as a folder in other operating systems; that is, in most cases the words "directory" and "folder" From 7b1a8975155a9198f3b27906e016bb242b4e0732 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 11 Jul 2022 14:57:14 -0400 Subject: [PATCH 025/212] Update emacs.md --- emacs/emacs.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/emacs/emacs.md b/emacs/emacs.md index 63f65a7e..b44e85ff 100644 --- a/emacs/emacs.md +++ b/emacs/emacs.md @@ -40,6 +40,12 @@ If you're interested in learning more about Emacs, check out the [Wikipedia Page In this tutorial, we will teach you the basics of the Emacs text editor. +Since you will be writing and editing Java code in Emacs, it's important to know the basic shortcuts. We don't +expect you to memorize all of these shortcuts at this time. Instead, just try to get a basic understanding of +how Emacs works. You will be practicing with Emacs all semester. We also recommend keeping the +[Emacs Reference Card](https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf) next to you while coding - +especially for the first month or two of the course. + ## Control and Meta Throughout this tutorial we will use `C` to refer to the control key (`CTRL`) From e0d67990a13a6fadd27def19ba2d605426a2b74b Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 19 Jul 2022 14:51:06 -0400 Subject: [PATCH 026/212] Update MacOS.md --- setup/MacOS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/MacOS.md b/setup/MacOS.md index e459235d..0d32c201 100644 --- a/setup/MacOS.md +++ b/setup/MacOS.md @@ -1,6 +1,6 @@ # Setup on macOS -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) The following instructions are designed to help get you up and running with macOS for development in CSCI 1302. The majority of the time, you will not be developing directly on your Mac. Instead, From c1d4360f90dbba1af47c771e0d6af58a95c46fdf Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 19 Jul 2022 15:22:59 -0400 Subject: [PATCH 027/212] Update variables.md --- refresher/variables.md | 73 ++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/refresher/variables.md b/refresher/variables.md index 45d388f7..8937005e 100644 --- a/refresher/variables.md +++ b/refresher/variables.md @@ -1,18 +1,22 @@ # Refresher: Reference Variables -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen)
    +## Prerequisites + +Before starting this tutorial, please make sure to watch the 1301 review videos on eLC under +"Content" -> "1301 Videos". Specifically, videos 14-22 will help you understand these concepts. + ## Introduction In computer programming, a **variable** is just an alias for a location in memory. Instead of requiring programmers to remember explicit memory -addresses, we let them use variables as a matter of convenience. Some -languages (e.g., C and C++) also allow programmers to deal directly with -memory addresses. Every declared variable has the following: +addresses, we let them use variables as a matter of convenience. Every +declared variable has the following: - a **value**, the actual data stored in some memory location; - a **type**, an attribute that tells the computer how to interpret @@ -20,38 +24,59 @@ memory addresses. Every declared variable has the following: - a **name**, an attribute that tells the computer the word that we want to use to refer to the associated data. -According to [Chapter 4 of the Java Language -Specification](https://docs.oracle.com/javase/specs/jls/se17/html/jls-4.html#jls-4.10.1), - -> There are two kinds of types in the Java programming language: -> primitive types -> ([§4.2](https://docs.oracle.com/javase/specs/jls/se17/html/jls-4.html#jls-4.2)) -> and reference types -> ([§4.3](https://docs.oracle.com/javase/specs/jls/se17/html/jls-4.html#jls-4.3)). -> There are, correspondingly, two kinds of data values that can be -> stored in variables, passed as arguments, returned by methods, and -> operated on: primitive values -> ([§4.2](https://docs.oracle.com/javase/specs/jls/se17/html/jls-4.html#jls-4.2)) -> and reference values -> ([§4.3](https://docs.oracle.com/javase/specs/jls/se17/html/jls-4.html#jls-4.3)). +Take a moment to identify the value, type, and name of the variables declared +and initialized below. Before looking ahead, write your answers in your notes. + +```java +int x = 17; +String s = "Hello!"; +``` + +Did you come up with the answers below? + + +| Declaration | Value | Type | Name | +|---------------------|--------|-------|------| +|`int x = 17` | 17 | int | x | +|`String s = "Hello"` | "Hello"| String| s | + + +Notice the type of the two variables above. The first, `int`, is a primitive type and the second, +`String`, is a reference type. You can immediately tell that `String` is a reference type by the +fact that it start with a capital letter. These two variables both contain values but they work +very differently under the hood. In this tutorial, we will demonstrate the important +differences between these two types of variables. ## Reference Types Overview In Java, the **reference types** ([§4.3](https://docs.oracle.com/javase/specs/jls/se17/html/jls-4.html#jls-4.3)) -are class types, interface types, and array types. +are class types, interface types, and array types. Of these three, you are likely familiar +with creating variables of both class and array types. Below are two examples: + +```java +Person ada; // A class type variable (valid only if we have a class called Person on the classpath) +double[] array; // An array type variable +``` + +Both of the above types are reference types which means that the variables +contain the memory address (location) of the object that they refer to - not +the object itself. -An **object** is really just a collection of variables that are defined -by a class. It is not uncommon to describe Java objects as dynamically -constructed instances of a class. When an object is constructed, its -collection of variables is stored contiguously in some location in +An **object** is really just a collection +of variables that are defined by a class. It is not uncommon to describe Java +objects as dynamically constructed instances of a class. When an object is +constructed, its collection of variables is stored contiguously in some location in memory, which we usually call the object’s **reference**. This is important because, in Java, the possible values of a reference type are references to compatible objects (or `null`). +Below we describe various scenarios in which you may encounter/use reference variables +in your code. + ### Example 1: Refer to No Object -Consider the following initialization: +Consider the following declaration and initialization: ``` java Scanner s = null; From 66ee1c87b9cc73b0ec28d097b66e9b6b0b71cccb Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 19 Jul 2022 15:30:15 -0400 Subject: [PATCH 028/212] Update variables.md --- refresher/variables.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/refresher/variables.md b/refresher/variables.md index 8937005e..66c2a648 100644 --- a/refresher/variables.md +++ b/refresher/variables.md @@ -6,7 +6,9 @@ -## Prerequisites +## Prerequisite Information + +This tutorial requires a basic understanding of variables, classes, and objects in the Java programming language. Before starting this tutorial, please make sure to watch the 1301 review videos on eLC under "Content" -> "1301 Videos". Specifically, videos 14-22 will help you understand these concepts. From 8b7d253f34c19276f3ab3dd5e5bcf6a9e2e6170c Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 20 Jul 2022 23:55:15 -0400 Subject: [PATCH 029/212] Update emacs.md --- emacs/emacs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emacs/emacs.md b/emacs/emacs.md index b44e85ff..29c12185 100644 --- a/emacs/emacs.md +++ b/emacs/emacs.md @@ -1,6 +1,6 @@ # Emacs Tutorial -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ![Emacs Welcome Screen](welcome.PNG) From 208b0a6db0812fd55f24927e01d62f77f2169f0f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 21 Jul 2022 00:15:38 -0400 Subject: [PATCH 030/212] Update emacs.md --- emacs/emacs.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/emacs/emacs.md b/emacs/emacs.md index 29c12185..d05ebebb 100644 --- a/emacs/emacs.md +++ b/emacs/emacs.md @@ -65,6 +65,9 @@ to understand how to read their associated key bindings so that you can successfully make the appropriate keystrokes. In the table below, we'll use `KEY(key)` to denote that you should press `key` while holding `KEY` and `(key)` to denote that `key` should be pressed without any kind of modifier key. +For example, `CTRL(x, f)` means to hold `CTRL`, hit `x`, then hit `f`, then release +`CTRL`. An allternative would be `CTRL(h), (t)` which means to hold `CTRL`, +hit `h`, release `CTRL`, then hit `t`. | Command | Binding | Alternative | Keystrokes | |----------------|-----------|-------------|----------------| From b648f4a3a36349a0bd75b832f0ed8217f5b7997a Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 21 Jul 2022 00:16:36 -0400 Subject: [PATCH 031/212] Update emacs.md --- emacs/emacs.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/emacs/emacs.md b/emacs/emacs.md index d05ebebb..f2530c75 100644 --- a/emacs/emacs.md +++ b/emacs/emacs.md @@ -75,7 +75,7 @@ hit `h`, release `CTRL`, then hit `t`. | Emacs tutorial | `C-h t` | | `CTRL(h), (t)` | If a binding has consecutive occurences of either the `C` or `M` modifier keys, -then there is no need to release the modifer key between those occurances. This +then there is no need to release the modifer key between those occurences. This can be seen in the first example, where both of the following keystroke sequences result in `C-x C-f`: * `CTRL(x), CTRL(f)` @@ -230,8 +230,8 @@ navigate to where you want to paste, then yank the text from the kill buffer. To search for text, you can use the incremental search commands `C-s` and `C-r`, which differ only in their search direction. After pressing `C-s`, Emacs will display an `I-search:` prompt at the bottom of the screen. When prompted, type -the text you want to find, then press `RET`. If multiple occurances are found, -then repeated calls to `C-s` will cycle through the occurances (`C-g` can be used +the text you want to find, then press `RET`. If multiple occurences are found, +then repeated calls to `C-s` will cycle through the occurences (`C-g` can be used to stop). | Binding | Action | From 894b8d109993b349bf441c0efbec536210610c8d Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 23 Jul 2022 12:52:11 -0400 Subject: [PATCH 032/212] Update interfaces.md --- interfaces/interfaces.md | 56 ++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index fdaa8c0c..1f8652be 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -1,6 +1,6 @@ # Interfaces Tutorial -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) This tutorial introduces the reader to Java interfaces and polymorphism. @@ -46,12 +46,17 @@ The steps in this tutorial assume that you are logged into the Odin server. reference type in Java, including classes, interfaces, and class-based enumerations. A **reference type** in Java is any type that can serve as the type for a variable that refers to an object. Such a variable is known as a **reference variable**. We will elaborate on this - terminology a little more later in this tutorial. + terminology in the context of interfaces a little more later in this tutorial. If you are + unfamiliar with these terms in general, please review the + [Reference Variable Refresher](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/refresher/variables.md) + from last week. You are encouraged to ask questions about any parts that you find confusing. ### What is an Interface? -In its simplest form, a Java **interface** is a reference type composed of abstract methods and -constants. An **abstract method** is a non-static method without an implementation (body). Constants +In its simplest form, a Java **interface** is a reference type composed of **abstract methods** and +**constants**. An **abstract method** is a non-static method without an implementation (body). Think of +creating a class, adding the method signatures, but not putting any code in the methods. This will seem +strange at first but the benefit will become clear as you work through the example. **Constants** are variables (static or not) that are declared using the `final` keyword. As of Java 8, the technical definition for an *interface* allows it to contain only the following: abstract methods, constants, static methods, nested types, and default implementation @@ -60,20 +65,55 @@ Nested types and default methods will not be covered in this tutorial. Java 9 ad for private methods within an interface. Interfaces are used to specify that a type *can do* a set of things specified by its -abstract methods and constants. An interface serves as a contract for the classes that +abstract methods and constants. An interface serves as a *contract* for the classes that claim to implement the interface. Multiple classes can implement the same interface, each providing their own implementation of the contracted functionality. For this reason, it is important that the documentation for an interface describe *what* a method does and not necessarily *how* it should do it. Such documentation is usually written using Javadoc comments in the interface. +### Real World Example + +Remember, we said an interface is a *contract* for the classes that claim to implement it. Take a +moment to think about how contracts are used in the real world (forget Java for a second). + +Hopefully, you came up with a definition of the word contract and maybe a few situations where +contracts are used. A contract is a formal and binding agreement between two or more parties. + +Let's use the professional athlete as an example. Athletes sign a contract which is a +binding agreement between the athlete and the organization that ensures the athlete will compete +in his/her sport. The contract states that the athlete must "compete" (yes, this is oversimplified) +but it doesn't say specifically *how* they will compete or how they will respond to certain +situations while competing. These details are not relevant to the contract. The contract simply +binds the athlete to compete. The specific details and decisions that occur while the competition +is ongoing is up to the athlete. Once the contract is written, it could be signed by athletes +in a wide variety of sports. The signer could be a track athlete, a baseball player, a football +player, a racecar driver, etc. Note that the signer determines the details of how they will compete +- the contract only binds them to action of competing. + +Terminology +contract == interface +requirements in the contract == abstract methods +contract signer == implementing class + +Now, let's tie this back to programming. In the example above, "compete" is the abstract method +that would be placed in the "athlete" interface (contract). The method is what the signer is obligated +to do when they agree to implement the interface (a.k.a. sign the contract). The implementation details +of the `compete` method area not given in the interface itself but instead they are written in the +implementing class (signer). Again, the implementing class (contract signer) can be any type of athlete +as they are all required to compete. + +This may all still seem a bit strange and why we do this in programming may not yet be clear. +Hang in there! Let's work through an example in Java and then revisit this high level description. + ### Declaring an Interface 1. Interfaces, just like classes, have a fully qualified name. Their source code should be positioned and named within your project the same as with classes. That is, an interface called `cs1302.interfaces.contract.Styleable` has an implied position within the package - directories of your source code and should be placed in a `Styleable.java` file. - The first big syntax difference between a class and an interface is illustrated in + directories of your source code (`cs1302/interfaces/contract`) and should be placed + in a `Styleable.java` file within the implied directory. The first big syntax difference + between a class and an interface is illustrated in [`Styleable.java`](src/cs1302/interfaces/contract/Styleable.java): ```java @@ -91,7 +131,7 @@ Javadoc comments in the interface. ``` Notice that the `style()` method does not contain an implementation. The signature of the method - ends with a semicolon. An abstract method may not have an implementation. The following is **NOT** an + ends with a semicolon. An abstract method must not have an implementation. The following is **NOT** an abstract method: ```java From e46f60f6de1ad1e1a90acd283773b029ee5c3fcc Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 23 Jul 2022 21:17:40 -0400 Subject: [PATCH 033/212] Update interfaces.md --- interfaces/interfaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index 1f8652be..fdc82518 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -215,7 +215,7 @@ Hang in there! Let's work through an example in Java and then revisit this high ``` 1. Reference variables are called as such because they refer to objects. However, you can only create - objects from classes! Therefore, what can an `Styleable` variable refer to? The answer is that + objects from classes (not interfaces)! Therefore, what can a `Styleable` variable refer to? The answer is that a variable with an interface as its type can refer to an object of any class that implements that interface. The code snippet below illustrates this: From 91aaf2f1ecaf57370d0cce7d1e473b085f55cd9f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 23 Jul 2022 21:37:47 -0400 Subject: [PATCH 034/212] Update exceptions.md --- exceptions/exceptions.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/exceptions/exceptions.md b/exceptions/exceptions.md index 5b732674..251892b6 100644 --- a/exceptions/exceptions.md +++ b/exceptions/exceptions.md @@ -1,7 +1,7 @@ # Exceptions -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ## Prerequisites @@ -90,7 +90,7 @@ are thrown in more complicated exceptional situations. Here, we take complicated to mean that there are a lot of conditions to check, including some that are potentially tricky to identify. Such exceptions are generally handled instead of avoided, although there is no reason a combination of both -handling and avoiding can be employed. +handling and avoiding can't be employed. ## Handling Exceptions @@ -157,7 +157,8 @@ Let's look at an example. } // Test ``` -1. Compile and run `exceptions.Unchecked`. You should get an error message similar to the following +1. Do you see where the exception object will be created and thrown? Go ahead and + compile and run `exceptions.Unchecked`. You should get an error message similar to the following when you run the program: ``` @@ -167,7 +168,8 @@ Let's look at an example. An [`ArithmeticException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/ArithmeticException.html) (specifically, a divide by zero) caused our program to crash. Since `ArithmeticException` is an **unchecked exception**, the Java compiler did not force us (the programmer) to catch or propagate this exception. It is completely up to the programmer to decide - whether or not to handle exceptions of this type. You've probably experienced other, unchecked exceptions such as: + whether or not to handle exceptions of this type. Since we didn't handle it, our program crashed. You've probably experienced other, + unchecked exceptions such as: [`StringIndexOutOfBoundsException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/StringIndexOutOfBoundsException.html), [`NullPointerException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/NullPointerException.html), [`NumberFormatException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/NumberFormatException.html), etc. From 2871645e1a93a5d520d51d4d9b3ff30eb4d2709b Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 23 Jul 2022 21:43:27 -0400 Subject: [PATCH 035/212] Update javadoc.md --- javadoc/javadoc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javadoc/javadoc.md b/javadoc/javadoc.md index 9aa04e14..42f4ef08 100644 --- a/javadoc/javadoc.md +++ b/javadoc/javadoc.md @@ -1,6 +1,6 @@ # Javadoc and API Documentation -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ## Prerequisites From ac8ba55305a5fd33d111fb2a71e6a13defbf48cb Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 24 Jul 2022 12:51:23 -0400 Subject: [PATCH 036/212] Split exceptions tutorial into 2 parts --- exceptions/{exceptions.md => exceptions1.md} | 0 exceptions/exceptions2.md | 455 +++++++++++++++++++ 2 files changed, 455 insertions(+) rename exceptions/{exceptions.md => exceptions1.md} (100%) create mode 100644 exceptions/exceptions2.md diff --git a/exceptions/exceptions.md b/exceptions/exceptions1.md similarity index 100% rename from exceptions/exceptions.md rename to exceptions/exceptions1.md diff --git a/exceptions/exceptions2.md b/exceptions/exceptions2.md new file mode 100644 index 00000000..251892b6 --- /dev/null +++ b/exceptions/exceptions2.md @@ -0,0 +1,455 @@ + +# Exceptions + +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) + +## Prerequisites + +This tutorial assumes that the reader has a knowledge of basic Unix commands and experience working +with a command-line text editor (e.g. emacs, vi, etc.). To get the most out of this tutorial, +you should follow along and take notes. + +## Course-Specific Learning Outcomes + +* **LO2.b:** Define, throw, and propagate exceptions appropriately in a software solution. + +## Table of Contents + +* [Definition](#definition) +* [Avoiding Exceptions](#avoiding-exceptions) +* [Handling Exceptions](#handling-exceptions) +* [Checked vs. Unchecked Exceptions](#checked-vs-unchecked-exceptions) +* [Identifying Checked vs. Unchecked Exceptions](#identifying-checked-vs-unchecked-exceptions) +* [Multiple Catch Blocks](#multiple-catch-blocks) +* [Explicitly Throwing Exceptions & Exception Propagation](#explicitly-throwing-exceptions--exception-propagation) +* [Regarding Scope](#regarding-scope) + +## Definition + +In Java, an **exception** is an event that occurs during the execution of a program that +encounters an error or some kind of exceptional situation. When an exception occurs, +two things happen: + +1. an **exception object** is said to be _thrown_; and +1. the normal flow of control is disrupted. + +You have likely encountered the dreaded +[`NullPointerException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/NullPointerException.html) +before reading this tutorial. If not, it's easy to create a program that will +throw a `NullPointerException` object: + +```java +String s = null; +if (s.length() > 1) { // <------------------ throws NullPointerException object + System.out.println("string length > 1"); +} // if +``` + +If you run this code, then the JVM: +i) throws a `NullPointerException` object on the second line; and +ii) disrupts the normal flow of control to report to the +user that the exception was thrown and abruptly terminates the program. +Go ahead and test it out. + +In general, there are two ways to deal with exceptions: + +1. avoid them; and +2. handle them. + +## Avoiding Exceptions + +To *avoid the exception* in the example above, you need only ensure that you +do not invoke members (i.e., call methods or access instance variables) +using `s` when `s` is `null`. +Here are some examples: + +```java +// use an if-statement to check +if (s != null) { + if (s.length() > 1)) { + System.out.println("string length > 1"); + } // if +} // if +``` + +```java +// avoid NPE via short circuiting +if ((s != null) && (s.length() > 1)) { + System.out.println("string length > 1"); +} // if +``` + +In general, in order to avoid an exception object, you need to understand the +conditions in which that exception object is thrown, then write code that +correctly identifies if those conditions are met prior to the line of code +that throws the exception object. Although it is relatively easy to amend code +to avoid `NullPointerException` objects as they arise when attempting to +invoke members of an object using a reference variable that contains the +value `null`, the same statement cannot be said about exception objects that +are thrown in more complicated exceptional situations. Here, we take complicated +to mean that there are a lot of conditions to check, including some that are +potentially tricky to identify. Such exceptions are generally handled +instead of avoided, although there is no reason a combination of both +handling and avoiding can't be employed. + +## Handling Exceptions + +To *handle the exception* in the example above, you need to make use of a +special control flow snytax known as a **try block** or **try-catch block**. +With this syntax, you place code that can throw an exception into the +`try` block, then place code for how you want to deal with the exception +in the `catch` block. These two go together, which is why we often +refer to it as a try-catch block. During execution, each line in a `try` block +is executed until an exception object is thrown. When the exception is thrown, +the JVM redirects the flow of control into an appropriate associated +`catch` block. After the `catch` block is executed, flow of control is +redirected to immediately after the entire try-catch construct. +Here is an example: + +```java +try { + if (s.length() > 1)) { + System.out.println("string length > 1"); + } // if +} catch (NullPointerException npe) { + System.out.println("a NullPointerException was thrown!"); +} // try +System.out.println("I will print regardless of the value of s."); +``` + +This try-catch block differentiates itself from the previous examples in +two ways: + +1. we did not perform any condition checking for the exceptional + situation--in this case, we did not compare the value of `s` + to `null`; and + +2. the exception is still reported, however, it's done so using code + that we wrote (and, therefore, can customize) and using code + that does not necessarily cause the program to abruptly terminate. + +Here is a video with a more complicated example demonstrating the benefits of handling +exceptions instead of trying to avoid them: + +https://www.youtube.com/watch?v=TETdh48t4YM + +
    +IMAGE ALT TEXT + + +## Checked vs. Unchecked Exceptions + +In Java, exceptions are either _checked_ or _unchecked_. +Checked exceptions must be explicitly caught or propagated by the programmer, +whereas unchecked exceptions may or may not be handled by the programmer. +Let's look at an example. + +1. On Odin, create the class `exceptions.Unchecked` containing the following code: + + ```java + package exceptions; + + public class Unchecked { + public static void main(String [] args) { + int result = 4/0; + System.out.println(result); + } // main + } // Test + ``` + +1. Do you see where the exception object will be created and thrown? Go ahead and + compile and run `exceptions.Unchecked`. You should get an error message similar to the following + when you run the program: + + ``` + Exception in thread "main" java.lang.ArithmeticException: / by zero + at exceptions.Unchecked.main(Unchecked.java:5) + ``` + An [`ArithmeticException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/ArithmeticException.html) + (specifically, a divide by zero) caused our program to crash. Since `ArithmeticException` is an **unchecked exception**, the + Java compiler did not force us (the programmer) to catch or propagate this exception. It is completely up to the programmer to decide + whether or not to handle exceptions of this type. Since we didn't handle it, our program crashed. You've probably experienced other, + unchecked exceptions such as: + [`StringIndexOutOfBoundsException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/StringIndexOutOfBoundsException.html), + [`NullPointerException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/NullPointerException.html), + [`NumberFormatException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/NumberFormatException.html), etc. + +1. On Odin, create the class `exceptions.Checked` containing the following code: + + ```java + package exceptions; + + import java.util.Scanner; + import java.io.File; + + public class Checked { + public static void main (String[] args) { + File notesFile = new File("notes.txt"); + Scanner input = new Scanner(notesFile); + System.out.println(input.nextLine()); + } // main + } // Checked + ``` + + In this program, we are reading the first line of the file `notes.txt`. The first line of the `main` method creates a `File` object + which is referred to by `notesFile`. Then, it passes this object reference to the `Scanner` constructor. As you may have guessed, the + `input` object will read its input from the file (not the keyboard). We will create the `notes.txt` file in a later step. + +1. Compile `Checked.java`. You should get an error similar to the following: + + ``` + src/exceptions/Checked.java:9: error: unreported exception FileNotFoundException; must be caught or declared to be thrown + Scanner input = new Scanner(notesFile); + ^ + ``` + This error indicates that the `Scanner` constructor throws a `FileNotFoundException`. `FileNotFoundException` is a + **checked exception**. When a method or constructor call throws a checked exception, the programmer must either: + * surround the relevant call with a try-catch or + * add a throws clause to the enclosing method (i.e., the method containing the call) to propogate this exception if it occurs. + + In `Checked.java`, the enclosing method is `main`. We never want to add a `throws` clause to the `main` method as there is no code in + our program above the `main` method to handle the exception. To fix `Checked.java`, we will use the first approach. + +1. Now, let's modify `Checked.java` to include an appropriate try-catch: + + ```java + import java.util.Scanner; + import java.io.File; + import java.io.FileNotFoundException; + + public class Checked { + public static void main (String[] args) { + File notesFile = new File("notes.txt"); + Scanner input = null; + try { + input = new Scanner(notesFile); + } catch(FileNotFoundException e) { + System.out.println(e.getMessage()); + } + System.out.println(input.nextLine()); + } // main + } // Checked + ``` + +1. Create a `notes.txt` file in the directory where you will execute the program. Add a single line of text to the file. + +1. Execute `exceptions.Checked`. It should print the first line of `notes.txt`. + +## Identifying Checked vs. Unchecked Exceptions + +For now, we will use a simple method for checking if an exception is checked or unchecked. + +1. Visit the Java API page for [`ArithmeticException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/ArithmeticException.html). + +1. At the top of the page, there is a hierarchy of Java classes which looks like this: + + ArithmeticException Unchecked Example + + You can tell that `ArithmeticException` is an unchecked exception because `java.lang.RuntimeException` is listed in the hierarchy. If + you cannot find `java.lang.RuntimeException` in the hierarchy for a given exception, then that tells you it is a checked exception. + +1. For an example of a checked exception, see +[`FileNotFoundException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/FileNotFoundException.html) + +## Multiple Catch Blocks + +Here is a video that demonstrates how to handle multiple exceptions at the same +time using multiple catch blocks: + +https://www.youtube.com/watch?v=j-GNWvLNLjs + + +IMAGE ALT TEXT + + +## Explicitly Throwing Exceptions & Exception Propagation + +Now that you have seen how to handle exceptions in code written by others +that can throw exceptions, it's important understand how and why you can +throw exceptions yourself. In Java, the `throw` keyword is used to explicitly +throw an exception. Here is an example where we create an +[`IllegalArgumentException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/IllegalArgumentException.html) +and explicitly throw it: + +```java +throw new IllegalArgumentException("nums array cannot be empty"); +``` + +Since this line of code is known to throw an exception, we would +usually want to handle the exception by placing the line in a try block. +That may not always be ideal. Instead of handling the exception immediately, +let's make it someone else's responsibility using the `throws` keyword +in the signature of the method containing the line: + +```java +int computeAverage(double[] nums) throws IllegalArgumentException { + if (nums.length == 0) { + throw new IllegalArgumentException("nums array cannot be empty"); + } // if + double sum = 0; + for (double num : nums) { + sum += num; + } // for + return sum / nums.length; +} // computeAverage +``` + +Using the `throws` keyword, we told Java that the `IllegalArgumentException` +will not be handled directly in this method. Intead it will be _propagated_ +up to the calling method, i.e., the method or methods, somewhere else, that are +actually calling `computeAverage`. In that other method, the programmer +can either handle the exception (using a try-catch) or choose to propagate it again +by repeating the `throws` in the calling method's signature. + +In Java, checked exceptions must either be handled directly using a try-catch +or progated up using `throws`. Note, while it is possible to place a `throws` +in the signature of a program's `main` method, doing so is _strongly_ discouraged +as exceptions propagated past `main` will always cause the program to crash. + +## Regarding Scope + +The same basic scoping rules (i.e., what can be seen within a method when curly +braces are involved) that you are used to for if-statements and loops also apply +to try-blocks and catch-blocks. If you declare a variable inside a try-block or +catch-block, then its scope only extends to what is inside that block. + +To illustrate this, we have included an *unfinished* +[`cs1302.scope.Example`](src/cs1302/scope/Example.java) +program with this tutorial that does not compile due to a scoping issue. Here is +the ``main`` method for that program: + +```java +public static void main(String[] args) { + + try { + String filename = args[0]; + File file = new File(filename); + } catch (ArrayIndexOutOfBoundsException boundsException) { + System.err.println("first command-line argument is missing"); + } // try + + try { + PrintWriter output = new PrintWriter(file); + } catch (FileNotFoundException notFoundException) { + System.err.print("unable to open file for writing: "); + System.err.println(notFoundException.getMessage()); + } // try + +} // main +``` + +When you attempt to compile this example program, the compiler will emit +a `cannot find symbol` error similar to the following: + +``` +src/cs1302/scope/Example.java:22: error: cannot find symbol + PrintWriter output = new PrintWriter(file); + ^ + symbol: variable file + location: class Example +1 error +``` + +Issues like simple typos, missing import statements, and even an incorrect +classpath often cause the Java compiler to emit the `cannot find symbol`; however, +the cause of this particular `cannot find symbol` error is related to the +scope of the symbol (the variable `file`), which does not extend to a specific +line of code that attempts to use that symbol, as indicated by error message. + +Since the variable `file` is declared inside the try-block, its scope only +extends to subsequent lines within the try-block, as illustrated below. + +```java +try { + String filename = args[0]; + File file = new File(filename); + // <---- ✓ scope of `file` extends to this line + // <---- ✓ and this line +} catch (ArrayIndexOutOfBoundsException boundsException) { + System.err.println("first command-line argument is missing"); + // <---- ✗ but NOT this line +} // try +// <---- ✗ NOR this line +// <---- ✗ nor any of the lines below +``` + +There are two high-level strategies for dealing with this kind of scoping issue: + +1. Increase the symbol's scope by declaring and initializing it on a line + that precedes the enclosing try-block and changing original declaration to a + simple assignment -- this strategy is also sometimes used to fix similar scoping + issues with variables declared in if-statements and loops. If you are able to + extend the variable's scope to line that uses the symbol, then the compiler will + be able to find it. This strategy does come at a cost: + + * The code that uses the variable after the try-catch cannot and should not + assume the code in the try-block is ever executed as a thrown exception may + cause it to get skipped. For example, if you initialize a reference variable to + `null` prior to a try-catch and reassign it to something that's not `null` within + the try-block, then the code after the try-catch needs to account for the + possibility that the variable was never reassigned and is still `null`. If it + does not, then it runs the risk of throwing an unchecked `NullPointerException` + during runtime. + + ```java + public static void main(String[] args) { + + File file = null; + + try { + String filename = args[0]; + file = new File(filename); + } catch (ArrayIndexOutOfBoundsException boundsException) { + System.err.println("first command-line argument is missing"); + } // try + + try { + PrintWriter output = new PrintWriter(file); // <--- risk NullPointerException + } catch (FileNotFoundException notFoundException) { + System.err.print("unable to open file for writing: "); + System.err.println(notFoundException.getMessage()); + } // try + + } // main + ``` + +2. Place code that depends on the symbol within the try-block with the understanding + that it will be skipped should an exception occur within the try-block before that + line (as execution flows to a corresponding catch-block). + + * This strategy often requires changes to multiple lines of code; however, it also often + leads to a more elegent solution, as illustrated below: + + ```java + public static void main(String[] args) { + + try { + String filename = args[0]; + File file = new File(filename); + PrintWriter output = new PrintWriter(file); + } catch (ArrayIndexOutOfBoundsException boundsException) { + System.err.println("first command-line argument is missing"); + } catch (FileNotFoundException notFoundException) { + System.err.print("unable to open file for writing: "); + System.err.println(notFoundException.getMessage()); + } // try + + } // main + ``` + +Here is a short video demonstrating these concepts: + +https://www.youtube.com/watch?v=DlmrBF7pP1k + + +IMAGE ALT TEXT + +
    + +[![License: CC BY-NC-ND 4.0](https://img.shields.io/badge/License-CC%20BY--NC--ND%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-nc-nd/4.0/) + + +Copyright © Michael E. Cotterell, Brad Barnes, and the University of Georgia. +This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License to students and the public. +The content and opinions expressed on this Web page do not necessarily reflect the views of nor are they endorsed by the University of Georgia or the University System of Georgia. + From 3638f2169e6de59aed074240657c4f90ffe2d011 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 24 Jul 2022 12:52:00 -0400 Subject: [PATCH 037/212] Update exceptions1.md --- exceptions/exceptions1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index 251892b6..ff5ac356 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -1,5 +1,5 @@ -# Exceptions +# Exceptions Part 1 ![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) From 922854731ea343350b2d18f0114c65e3deeb73ec Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 24 Jul 2022 12:58:27 -0400 Subject: [PATCH 038/212] Update exceptions1.md --- exceptions/exceptions1.md | 173 -------------------------------------- 1 file changed, 173 deletions(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index ff5ac356..3f55d9de 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -18,10 +18,6 @@ you should follow along and take notes. * [Definition](#definition) * [Avoiding Exceptions](#avoiding-exceptions) * [Handling Exceptions](#handling-exceptions) -* [Checked vs. Unchecked Exceptions](#checked-vs-unchecked-exceptions) -* [Identifying Checked vs. Unchecked Exceptions](#identifying-checked-vs-unchecked-exceptions) -* [Multiple Catch Blocks](#multiple-catch-blocks) -* [Explicitly Throwing Exceptions & Exception Propagation](#explicitly-throwing-exceptions--exception-propagation) * [Regarding Scope](#regarding-scope) ## Definition @@ -137,175 +133,6 @@ https://www.youtube.com/watch?v=TETdh48t4YM IMAGE ALT TEXT -## Checked vs. Unchecked Exceptions - -In Java, exceptions are either _checked_ or _unchecked_. -Checked exceptions must be explicitly caught or propagated by the programmer, -whereas unchecked exceptions may or may not be handled by the programmer. -Let's look at an example. - -1. On Odin, create the class `exceptions.Unchecked` containing the following code: - - ```java - package exceptions; - - public class Unchecked { - public static void main(String [] args) { - int result = 4/0; - System.out.println(result); - } // main - } // Test - ``` - -1. Do you see where the exception object will be created and thrown? Go ahead and - compile and run `exceptions.Unchecked`. You should get an error message similar to the following - when you run the program: - - ``` - Exception in thread "main" java.lang.ArithmeticException: / by zero - at exceptions.Unchecked.main(Unchecked.java:5) - ``` - An [`ArithmeticException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/ArithmeticException.html) - (specifically, a divide by zero) caused our program to crash. Since `ArithmeticException` is an **unchecked exception**, the - Java compiler did not force us (the programmer) to catch or propagate this exception. It is completely up to the programmer to decide - whether or not to handle exceptions of this type. Since we didn't handle it, our program crashed. You've probably experienced other, - unchecked exceptions such as: - [`StringIndexOutOfBoundsException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/StringIndexOutOfBoundsException.html), - [`NullPointerException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/NullPointerException.html), - [`NumberFormatException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/NumberFormatException.html), etc. - -1. On Odin, create the class `exceptions.Checked` containing the following code: - - ```java - package exceptions; - - import java.util.Scanner; - import java.io.File; - - public class Checked { - public static void main (String[] args) { - File notesFile = new File("notes.txt"); - Scanner input = new Scanner(notesFile); - System.out.println(input.nextLine()); - } // main - } // Checked - ``` - - In this program, we are reading the first line of the file `notes.txt`. The first line of the `main` method creates a `File` object - which is referred to by `notesFile`. Then, it passes this object reference to the `Scanner` constructor. As you may have guessed, the - `input` object will read its input from the file (not the keyboard). We will create the `notes.txt` file in a later step. - -1. Compile `Checked.java`. You should get an error similar to the following: - - ``` - src/exceptions/Checked.java:9: error: unreported exception FileNotFoundException; must be caught or declared to be thrown - Scanner input = new Scanner(notesFile); - ^ - ``` - This error indicates that the `Scanner` constructor throws a `FileNotFoundException`. `FileNotFoundException` is a - **checked exception**. When a method or constructor call throws a checked exception, the programmer must either: - * surround the relevant call with a try-catch or - * add a throws clause to the enclosing method (i.e., the method containing the call) to propogate this exception if it occurs. - - In `Checked.java`, the enclosing method is `main`. We never want to add a `throws` clause to the `main` method as there is no code in - our program above the `main` method to handle the exception. To fix `Checked.java`, we will use the first approach. - -1. Now, let's modify `Checked.java` to include an appropriate try-catch: - - ```java - import java.util.Scanner; - import java.io.File; - import java.io.FileNotFoundException; - - public class Checked { - public static void main (String[] args) { - File notesFile = new File("notes.txt"); - Scanner input = null; - try { - input = new Scanner(notesFile); - } catch(FileNotFoundException e) { - System.out.println(e.getMessage()); - } - System.out.println(input.nextLine()); - } // main - } // Checked - ``` - -1. Create a `notes.txt` file in the directory where you will execute the program. Add a single line of text to the file. - -1. Execute `exceptions.Checked`. It should print the first line of `notes.txt`. - -## Identifying Checked vs. Unchecked Exceptions - -For now, we will use a simple method for checking if an exception is checked or unchecked. - -1. Visit the Java API page for [`ArithmeticException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/ArithmeticException.html). - -1. At the top of the page, there is a hierarchy of Java classes which looks like this: - - ArithmeticException Unchecked Example - - You can tell that `ArithmeticException` is an unchecked exception because `java.lang.RuntimeException` is listed in the hierarchy. If - you cannot find `java.lang.RuntimeException` in the hierarchy for a given exception, then that tells you it is a checked exception. - -1. For an example of a checked exception, see -[`FileNotFoundException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/FileNotFoundException.html) - -## Multiple Catch Blocks - -Here is a video that demonstrates how to handle multiple exceptions at the same -time using multiple catch blocks: - -https://www.youtube.com/watch?v=j-GNWvLNLjs - - -IMAGE ALT TEXT - - -## Explicitly Throwing Exceptions & Exception Propagation - -Now that you have seen how to handle exceptions in code written by others -that can throw exceptions, it's important understand how and why you can -throw exceptions yourself. In Java, the `throw` keyword is used to explicitly -throw an exception. Here is an example where we create an -[`IllegalArgumentException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/IllegalArgumentException.html) -and explicitly throw it: - -```java -throw new IllegalArgumentException("nums array cannot be empty"); -``` - -Since this line of code is known to throw an exception, we would -usually want to handle the exception by placing the line in a try block. -That may not always be ideal. Instead of handling the exception immediately, -let's make it someone else's responsibility using the `throws` keyword -in the signature of the method containing the line: - -```java -int computeAverage(double[] nums) throws IllegalArgumentException { - if (nums.length == 0) { - throw new IllegalArgumentException("nums array cannot be empty"); - } // if - double sum = 0; - for (double num : nums) { - sum += num; - } // for - return sum / nums.length; -} // computeAverage -``` - -Using the `throws` keyword, we told Java that the `IllegalArgumentException` -will not be handled directly in this method. Intead it will be _propagated_ -up to the calling method, i.e., the method or methods, somewhere else, that are -actually calling `computeAverage`. In that other method, the programmer -can either handle the exception (using a try-catch) or choose to propagate it again -by repeating the `throws` in the calling method's signature. - -In Java, checked exceptions must either be handled directly using a try-catch -or progated up using `throws`. Note, while it is possible to place a `throws` -in the signature of a program's `main` method, doing so is _strongly_ discouraged -as exceptions propagated past `main` will always cause the program to crash. - ## Regarding Scope The same basic scoping rules (i.e., what can be seen within a method when curly From 87a6994d5bb99d4acf9bdfac84857db1791cf54a Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 24 Jul 2022 12:59:34 -0400 Subject: [PATCH 039/212] Update exceptions2.md --- exceptions/exceptions2.md | 255 -------------------------------------- 1 file changed, 255 deletions(-) diff --git a/exceptions/exceptions2.md b/exceptions/exceptions2.md index 251892b6..01b60c45 100644 --- a/exceptions/exceptions2.md +++ b/exceptions/exceptions2.md @@ -15,127 +15,10 @@ you should follow along and take notes. ## Table of Contents -* [Definition](#definition) -* [Avoiding Exceptions](#avoiding-exceptions) -* [Handling Exceptions](#handling-exceptions) * [Checked vs. Unchecked Exceptions](#checked-vs-unchecked-exceptions) * [Identifying Checked vs. Unchecked Exceptions](#identifying-checked-vs-unchecked-exceptions) * [Multiple Catch Blocks](#multiple-catch-blocks) * [Explicitly Throwing Exceptions & Exception Propagation](#explicitly-throwing-exceptions--exception-propagation) -* [Regarding Scope](#regarding-scope) - -## Definition - -In Java, an **exception** is an event that occurs during the execution of a program that -encounters an error or some kind of exceptional situation. When an exception occurs, -two things happen: - -1. an **exception object** is said to be _thrown_; and -1. the normal flow of control is disrupted. - -You have likely encountered the dreaded -[`NullPointerException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/NullPointerException.html) -before reading this tutorial. If not, it's easy to create a program that will -throw a `NullPointerException` object: - -```java -String s = null; -if (s.length() > 1) { // <------------------ throws NullPointerException object - System.out.println("string length > 1"); -} // if -``` - -If you run this code, then the JVM: -i) throws a `NullPointerException` object on the second line; and -ii) disrupts the normal flow of control to report to the -user that the exception was thrown and abruptly terminates the program. -Go ahead and test it out. - -In general, there are two ways to deal with exceptions: - -1. avoid them; and -2. handle them. - -## Avoiding Exceptions - -To *avoid the exception* in the example above, you need only ensure that you -do not invoke members (i.e., call methods or access instance variables) -using `s` when `s` is `null`. -Here are some examples: - -```java -// use an if-statement to check -if (s != null) { - if (s.length() > 1)) { - System.out.println("string length > 1"); - } // if -} // if -``` - -```java -// avoid NPE via short circuiting -if ((s != null) && (s.length() > 1)) { - System.out.println("string length > 1"); -} // if -``` - -In general, in order to avoid an exception object, you need to understand the -conditions in which that exception object is thrown, then write code that -correctly identifies if those conditions are met prior to the line of code -that throws the exception object. Although it is relatively easy to amend code -to avoid `NullPointerException` objects as they arise when attempting to -invoke members of an object using a reference variable that contains the -value `null`, the same statement cannot be said about exception objects that -are thrown in more complicated exceptional situations. Here, we take complicated -to mean that there are a lot of conditions to check, including some that are -potentially tricky to identify. Such exceptions are generally handled -instead of avoided, although there is no reason a combination of both -handling and avoiding can't be employed. - -## Handling Exceptions - -To *handle the exception* in the example above, you need to make use of a -special control flow snytax known as a **try block** or **try-catch block**. -With this syntax, you place code that can throw an exception into the -`try` block, then place code for how you want to deal with the exception -in the `catch` block. These two go together, which is why we often -refer to it as a try-catch block. During execution, each line in a `try` block -is executed until an exception object is thrown. When the exception is thrown, -the JVM redirects the flow of control into an appropriate associated -`catch` block. After the `catch` block is executed, flow of control is -redirected to immediately after the entire try-catch construct. -Here is an example: - -```java -try { - if (s.length() > 1)) { - System.out.println("string length > 1"); - } // if -} catch (NullPointerException npe) { - System.out.println("a NullPointerException was thrown!"); -} // try -System.out.println("I will print regardless of the value of s."); -``` - -This try-catch block differentiates itself from the previous examples in -two ways: - -1. we did not perform any condition checking for the exceptional - situation--in this case, we did not compare the value of `s` - to `null`; and - -2. the exception is still reported, however, it's done so using code - that we wrote (and, therefore, can customize) and using code - that does not necessarily cause the program to abruptly terminate. - -Here is a video with a more complicated example demonstrating the benefits of handling -exceptions instead of trying to avoid them: - -https://www.youtube.com/watch?v=TETdh48t4YM - - -IMAGE ALT TEXT - ## Checked vs. Unchecked Exceptions @@ -306,144 +189,6 @@ or progated up using `throws`. Note, while it is possible to place a `throws` in the signature of a program's `main` method, doing so is _strongly_ discouraged as exceptions propagated past `main` will always cause the program to crash. -## Regarding Scope - -The same basic scoping rules (i.e., what can be seen within a method when curly -braces are involved) that you are used to for if-statements and loops also apply -to try-blocks and catch-blocks. If you declare a variable inside a try-block or -catch-block, then its scope only extends to what is inside that block. - -To illustrate this, we have included an *unfinished* -[`cs1302.scope.Example`](src/cs1302/scope/Example.java) -program with this tutorial that does not compile due to a scoping issue. Here is -the ``main`` method for that program: - -```java -public static void main(String[] args) { - - try { - String filename = args[0]; - File file = new File(filename); - } catch (ArrayIndexOutOfBoundsException boundsException) { - System.err.println("first command-line argument is missing"); - } // try - - try { - PrintWriter output = new PrintWriter(file); - } catch (FileNotFoundException notFoundException) { - System.err.print("unable to open file for writing: "); - System.err.println(notFoundException.getMessage()); - } // try - -} // main -``` - -When you attempt to compile this example program, the compiler will emit -a `cannot find symbol` error similar to the following: - -``` -src/cs1302/scope/Example.java:22: error: cannot find symbol - PrintWriter output = new PrintWriter(file); - ^ - symbol: variable file - location: class Example -1 error -``` - -Issues like simple typos, missing import statements, and even an incorrect -classpath often cause the Java compiler to emit the `cannot find symbol`; however, -the cause of this particular `cannot find symbol` error is related to the -scope of the symbol (the variable `file`), which does not extend to a specific -line of code that attempts to use that symbol, as indicated by error message. - -Since the variable `file` is declared inside the try-block, its scope only -extends to subsequent lines within the try-block, as illustrated below. - -```java -try { - String filename = args[0]; - File file = new File(filename); - // <---- ✓ scope of `file` extends to this line - // <---- ✓ and this line -} catch (ArrayIndexOutOfBoundsException boundsException) { - System.err.println("first command-line argument is missing"); - // <---- ✗ but NOT this line -} // try -// <---- ✗ NOR this line -// <---- ✗ nor any of the lines below -``` - -There are two high-level strategies for dealing with this kind of scoping issue: - -1. Increase the symbol's scope by declaring and initializing it on a line - that precedes the enclosing try-block and changing original declaration to a - simple assignment -- this strategy is also sometimes used to fix similar scoping - issues with variables declared in if-statements and loops. If you are able to - extend the variable's scope to line that uses the symbol, then the compiler will - be able to find it. This strategy does come at a cost: - - * The code that uses the variable after the try-catch cannot and should not - assume the code in the try-block is ever executed as a thrown exception may - cause it to get skipped. For example, if you initialize a reference variable to - `null` prior to a try-catch and reassign it to something that's not `null` within - the try-block, then the code after the try-catch needs to account for the - possibility that the variable was never reassigned and is still `null`. If it - does not, then it runs the risk of throwing an unchecked `NullPointerException` - during runtime. - - ```java - public static void main(String[] args) { - - File file = null; - - try { - String filename = args[0]; - file = new File(filename); - } catch (ArrayIndexOutOfBoundsException boundsException) { - System.err.println("first command-line argument is missing"); - } // try - - try { - PrintWriter output = new PrintWriter(file); // <--- risk NullPointerException - } catch (FileNotFoundException notFoundException) { - System.err.print("unable to open file for writing: "); - System.err.println(notFoundException.getMessage()); - } // try - - } // main - ``` - -2. Place code that depends on the symbol within the try-block with the understanding - that it will be skipped should an exception occur within the try-block before that - line (as execution flows to a corresponding catch-block). - - * This strategy often requires changes to multiple lines of code; however, it also often - leads to a more elegent solution, as illustrated below: - - ```java - public static void main(String[] args) { - - try { - String filename = args[0]; - File file = new File(filename); - PrintWriter output = new PrintWriter(file); - } catch (ArrayIndexOutOfBoundsException boundsException) { - System.err.println("first command-line argument is missing"); - } catch (FileNotFoundException notFoundException) { - System.err.print("unable to open file for writing: "); - System.err.println(notFoundException.getMessage()); - } // try - - } // main - ``` - -Here is a short video demonstrating these concepts: - -https://www.youtube.com/watch?v=DlmrBF7pP1k - - -IMAGE ALT TEXT -
    [![License: CC BY-NC-ND 4.0](https://img.shields.io/badge/License-CC%20BY--NC--ND%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-nc-nd/4.0/) From b44b5182cc04aef6e595452e68aae8614c6339c6 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 24 Jul 2022 13:00:53 -0400 Subject: [PATCH 040/212] Update exceptions2.md --- exceptions/exceptions2.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exceptions/exceptions2.md b/exceptions/exceptions2.md index 01b60c45..cdef58e5 100644 --- a/exceptions/exceptions2.md +++ b/exceptions/exceptions2.md @@ -1,13 +1,13 @@ -# Exceptions +# Exceptions Part 2 ![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ## Prerequisites -This tutorial assumes that the reader has a knowledge of basic Unix commands and experience working -with a command-line text editor (e.g. emacs, vi, etc.). To get the most out of this tutorial, -you should follow along and take notes. +Before engaging with this tutorial, readers should first complete +[Exceptions Part 1](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/exceptions/exceptions1.md). +To get the most out of this tutorial, you should follow along and take notes. ## Course-Specific Learning Outcomes From feeb1c0b7c0db01dec8ef0e74a4f8de1b9d1038f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 30 Jul 2022 14:12:32 -0400 Subject: [PATCH 041/212] Update interfaces.md --- interfaces/interfaces.md | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index fdc82518..1f2efb27 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -78,14 +78,14 @@ Remember, we said an interface is a *contract* for the classes that claim to imp moment to think about how contracts are used in the real world (forget Java for a second). Hopefully, you came up with a definition of the word contract and maybe a few situations where -contracts are used. A contract is a formal and binding agreement between two or more parties. - -Let's use the professional athlete as an example. Athletes sign a contract which is a -binding agreement between the athlete and the organization that ensures the athlete will compete -in his/her sport. The contract states that the athlete must "compete" (yes, this is oversimplified) -but it doesn't say specifically *how* they will compete or how they will respond to certain -situations while competing. These details are not relevant to the contract. The contract simply -binds the athlete to compete. The specific details and decisions that occur while the competition +contracts are used. + +In the real world, we think of a contract as a formal and binding agreement +between two or more parties. Let's use the professional athlete as an example. Athletes sign a contract which is a +binding agreement between the athlete and the team/organizaation that ensures the athlete will compete +in his/her sport. The contract states that the athlete must "compete" but it doesn't say specifically +*how* they will compete. The details of exactly how an athlete should compete are not relevant to the contract. +The contract simply binds the athlete to compete. The specific details and decisions that occur while the competition is ongoing is up to the athlete. Once the contract is written, it could be signed by athletes in a wide variety of sports. The signer could be a track athlete, a baseball player, a football player, a racecar driver, etc. Note that the signer determines the details of how they will compete @@ -97,14 +97,16 @@ requirements in the contract == abstract methods contract signer == implementing class Now, let's tie this back to programming. In the example above, "compete" is the abstract method -that would be placed in the "athlete" interface (contract). The method is what the signer is obligated +that would be placed in the "athlete" interface (contract). The abstract method represents the action that +is required of the signer of the contract. In other words, the method is what the signer is obligated to do when they agree to implement the interface (a.k.a. sign the contract). The implementation details of the `compete` method area not given in the interface itself but instead they are written in the implementing class (signer). Again, the implementing class (contract signer) can be any type of athlete as they are all required to compete. This may all still seem a bit strange and why we do this in programming may not yet be clear. -Hang in there! Let's work through an example in Java and then revisit this high level description. +Hang in there! Let's work through an example in Java. Try to keep this terminology in mind as you work +through this tutorial. ### Declaring an Interface @@ -120,7 +122,8 @@ Hang in there! Let's work through an example in Java and then revisit this high public interface Styleable { ``` - Note the use of the `interface` keyword instead of `class` in the type header. + Note the use of the `interface` keyword instead of `class` in the type header. In this example, + `Styleable` is the contract that can be signed by implementing classes. 1. The second big syntax difference involves the inclusion of abstract methods, illustrated @@ -129,6 +132,11 @@ Hang in there! Let's work through an example in Java and then revisit this high ```java public void style(); ``` + + Remember, that the abstract method represents what the signer of the contract must do. If a class + implements the `Styleable` interface, it is obligated to have a `style` method. This is required + because it signed the contract. The only thing we don't state at this point is how the `style` method + should be implemented. Notice that the `style()` method does not contain an implementation. The signature of the method ends with a semicolon. An abstract method must not have an implementation. The following is **NOT** an @@ -163,12 +171,17 @@ Hang in there! Let's work through an example in Java and then revisit this high public class Fancy implements Styleable { ``` - If the interface is not in the same package as the implementing class, then you will need to add + In this example, `Fancy` is the implementing class that has signed the `Styleable` contract. It signs + the contract as soon as you add `implements Styleable` to the class declaration as seen above. Now, `Fancy` + will not compile unless it has a syntactically correct implementation of the `style` method. + + **Note:** If the interface is not in the same package as the implementing class, then you will need to add an `import` statement or use the fully qualified name of the interface. If more than one interface is being implemented, then they can be written in a comma separated list following the `implements` keyword. -1. When a class properly implements an interface in Java, it is required to provide implementations +1. As we mentioned before, when a class properly implements an interface in Java, it is required to + provide implementations for each of the abstract methods defined in the interface. If you inspect the source code for the `cs1302.interfaces.impl.Fancy` class, you will see the abstract methods from `Styleable` implemented. Notice that the implementatons contain method bodies (instead of their signatures From 95cd214a44b87387800d807df1a1a365e898b324 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 30 Jul 2022 14:18:19 -0400 Subject: [PATCH 042/212] Update interfaces.md --- interfaces/interfaces.md | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index 1f2efb27..d2626fba 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -91,11 +91,6 @@ in a wide variety of sports. The signer could be a track athlete, a baseball pla player, a racecar driver, etc. Note that the signer determines the details of how they will compete - the contract only binds them to action of competing. -Terminology -contract == interface -requirements in the contract == abstract methods -contract signer == implementing class - Now, let's tie this back to programming. In the example above, "compete" is the abstract method that would be placed in the "athlete" interface (contract). The abstract method represents the action that is required of the signer of the contract. In other words, the method is what the signer is obligated @@ -123,7 +118,7 @@ through this tutorial. ``` Note the use of the `interface` keyword instead of `class` in the type header. In this example, - `Styleable` is the contract that can be signed by implementing classes. + `Styleable` is the contract that can be signed by other classes. 1. The second big syntax difference involves the inclusion of abstract methods, illustrated @@ -132,11 +127,6 @@ through this tutorial. ```java public void style(); ``` - - Remember, that the abstract method represents what the signer of the contract must do. If a class - implements the `Styleable` interface, it is obligated to have a `style` method. This is required - because it signed the contract. The only thing we don't state at this point is how the `style` method - should be implemented. Notice that the `style()` method does not contain an implementation. The signature of the method ends with a semicolon. An abstract method must not have an implementation. The following is **NOT** an @@ -150,6 +140,11 @@ through this tutorial. to the actual abstract method signature presented above that ends with a semicolon, thus lacking an implementation. + Remember, that the abstract method represents what the signer of the contract must be able to do. If a class + implements the `Styleable` interface, it is obligated to have a concrete (non-abstract) `style` method and + an `unstyle` method as those are the two abstract methods in the interface. This is required + because for any class that signs the contract. + **NOTE:** In Java, the declaration of an abstract method in the source code for an interface may omit the `public` visibility modifier. If `public` is omitted in this context, the abstract method is still assumed to have `public` visibility. This behavior is different for classes, a topic that will @@ -173,7 +168,7 @@ through this tutorial. In this example, `Fancy` is the implementing class that has signed the `Styleable` contract. It signs the contract as soon as you add `implements Styleable` to the class declaration as seen above. Now, `Fancy` - will not compile unless it has a syntactically correct implementation of the `style` method. + will not compile unless it has a concrete (non-abstract) implementation of both the `style` and `unstyle` methods. **Note:** If the interface is not in the same package as the implementing class, then you will need to add an `import` statement or use the fully qualified name of the interface. If more than one interface From de5f8fe8aea56314f23a2c5a9ef05886b6683717 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 1 Aug 2022 14:23:50 -0400 Subject: [PATCH 043/212] Update packages.md --- packages.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages.md b/packages.md index cd716d44..365ecd4f 100644 --- a/packages.md +++ b/packages.md @@ -244,13 +244,13 @@ Let's try it by placing the `HelloWorld` class into the `cs1302.hello` package! $ java -cp bin cs1302.hello.HelloWorld ``` - In this example, `cs1302.hello.HelloWorld` is known as the **fully qualified name** of the + In this example, `cs1302.hello.HelloWorld` is known as the **fully qualified name (or FQN)** of the `HelloWorld` class in the `cs1302.hello` package. You have seen fully qualified names before--they are often used with `import` statements (remember `java.util.Scanner`?). When you import a class, you can use the simple class name in that file instead of having to type the fully qualified name each time. In this case, `HelloWorld` is known as the **name** or **simple name** of the class. - **PROTIP:** Although packages correspond to directories, a fully qualified name uses `.` (dot) + **PROTIP:** Although packages correspond to directories, a fully qualified name (FQN) uses `.` (dot) for the name separator and not a slash. ## Code Dependencies @@ -262,7 +262,7 @@ on code that's not included with Java (e.g., code that you or someone else has w to let `javac` know where the _compiled_ version of that depedency is. 1. Let's extend the code we just finished. Create a `cs1302.util.HelloUtility` class under `src`. - **Remember,** the fully qualified name implies a specific directory structure and package statement + **Remember,** the fully qualified name (FQN) implies a specific directory structure and package statement requirement with respect to `HelloUtility.java`. You will need to add the `util` directory in the proper place in your current directory hierarchy. From 9a28233ba55fa3c1e69ca36379ce594dfa6fd641 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 1 Aug 2022 14:24:36 -0400 Subject: [PATCH 044/212] Update packages.md --- packages.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages.md b/packages.md index 365ecd4f..cb91cbda 100644 --- a/packages.md +++ b/packages.md @@ -1,6 +1,6 @@ # Java Packages Tutorial -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ## Prerequisites From 2353426225abab5463ebf60023a2c27747612801 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 3 Aug 2022 23:49:51 -0400 Subject: [PATCH 045/212] Update inheritance.md --- inheritance/inheritance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inheritance/inheritance.md b/inheritance/inheritance.md index 8c35c93f..b5d72bbb 100644 --- a/inheritance/inheritance.md +++ b/inheritance/inheritance.md @@ -1,6 +1,6 @@ # Inheritance -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) This tutorial introduces the reader to Java inheritance and polymorphism via inheritance. From b99462ecb6daafd8bd3d7cece668199a415692e2 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 14 Aug 2022 12:49:08 -0400 Subject: [PATCH 046/212] Update cla.md --- cla/cla.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cla/cla.md b/cla/cla.md index 723447c0..f4617b0f 100644 --- a/cla/cla.md +++ b/cla/cla.md @@ -1,6 +1,6 @@ # Command-Line Arguments -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) When working in a Unix-like environment, programs are launched when the user enters the program's name into the shell (i.e., they type it in, then press From f6cdd7afbdba136c94ef3f1b9d2e44f44306eb53 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 14 Aug 2022 20:34:05 -0400 Subject: [PATCH 047/212] Update packages.md --- packages.md | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/packages.md b/packages.md index cb91cbda..7c433cc2 100644 --- a/packages.md +++ b/packages.md @@ -18,12 +18,18 @@ run any code examples, repeat as necessary**. Simply reading (or skimming) is no ## Java Packages In Java, a **package** is a grouping of related types providing access protection and name space management. -Note that types refers to classes, interfaces, enumerations, and annotation types [[1]](https://docs.oracle.com/javase/tutorial/java/package/packages.html). +Note that types refers to classes, interfaces, enumerations, and annotation types [[1]](https://docs.oracle.com/javase/tutorial/java/package/packages.html). In other words, a package allows you to +organize your source code. Proper code organizatioin becomes increasingly important as the size of the project +increases. + The two primary benefits of packages are: * **Name Space Management:** Packages allow you to give a common name to a group of related types. For example, `java.util.Scanner` and `java.util.Random` are two utility classes provided in the `java.util` package. - You and other programmers can easily determine that these types are related. + You and other programmers can easily determine that these types are related. They are both utilities that you have + probably used in your code. It is important to note that you could have two types with the same simple name that + are located in different packages. For example, you could have a `java.util.Random` class and a `edu.cs.uga.Random` + class. Both classes have the same name (`Random`) but they can be differentiated by their package names. * **Access Protection:** Visibility in Java is not limited to `public` and `private`. Packages and additional visibility modifiers enable programmers to declare things as visible only within a package. @@ -60,16 +66,17 @@ You should ask questions on Piazza if you are unable to proceed or if some aspec ## Default Package Here, the `src` directory is the location of the **default package** (proper noun) -for source code. The default package contains classes (and other types) that are -not in a named package. When developing small or temporary applications, it is a -convenient place for package-less `.java` files +for source code. The default package for source code serves as the base directory +for named packages that you will create. You can think of it as the top-level directory +for your package directories (more soon). The default package can also contain classes +(and other types) that are not in a named package. When developing small or temporary +applications, it is a convenient place for package-less `.java` files [[2]](https://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html). -The default package location for source code also serves as the base directory -for named packages that you will create. -Let's dive in! The steps below show you how to create, compile, and execute a class -in the default package (i.e., a class in a package-less `.java` file). Once you -are comfortable with that, move on to the next section to learn about +Let's dive in! Before we get into creating named packages, we will start by compiling +directly into the default package as a warmup. The steps below show you how to create, +compile, and execute a class in the default package (i.e., a class in a package-less +`.java` file). Once you are comfortable with that, move on to the next section to learn about named packages. 1. Using Emacs, create a basic "Hello, World!" program in a driver class @@ -84,7 +91,7 @@ named packages. } // HelloWorld ``` -2. Change directly into the default package directory (`src`) and compile the program using `javac`: +2. Change directories into the default package directory (`src`) and compile the program using `javac`: ``` $ javac HelloWorld.java @@ -201,6 +208,7 @@ named packages. ## Named Package Now let's create a named package. To place a class (or interface) in named package, you must do two things: + 1. Place the `.java` file in the appropriate package directory; and 2. Include a `package` statement at the top of the `.java` file. @@ -209,6 +217,8 @@ Let's try it by placing the `HelloWorld` class into the `cs1302.hello` package! 1. Change directly into `cs1302-packages` directory. 2. Move the `HelloWorld.java` file into the `cs1302.hello` package directory. + You may need to create both the `cs1302` and `hello` directories before + executing the following command. ``` $ mv src/HelloWorld.java src/cs1302/hello/ From e0059dd1231d81824f7424d63a3da758494b1b7b Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 14 Aug 2022 21:04:19 -0400 Subject: [PATCH 048/212] Copied packages tutorial to prepare to split the reading into two parts --- packages.md => packages1.md | 0 packages2.md | 432 ++++++++++++++++++++++++++++++++++++ 2 files changed, 432 insertions(+) rename packages.md => packages1.md (100%) create mode 100644 packages2.md diff --git a/packages.md b/packages1.md similarity index 100% rename from packages.md rename to packages1.md diff --git a/packages2.md b/packages2.md new file mode 100644 index 00000000..7c433cc2 --- /dev/null +++ b/packages2.md @@ -0,0 +1,432 @@ +# Java Packages Tutorial + +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) + +## Prerequisites + +This tutorial assumes that the reader has a knowledge of basic Unix commands and experience working with a command-line +text editor (e.g. emacs, vi, etc.). To get the most out of this tutorial, you should **follow along, take notes, execute any given commands, +run any code examples, repeat as necessary**. Simply reading (or skimming) is not sufficient for learning this material. + +## Course-Specific Learning Outcomes + +* **LO1.a:** Navigate and modify files, directories, and permissions in a multi-user Unix-like environment. +* **LO1.c:** Create and modify textfiles and source code using a powerful terminal-based text editor such as Emacs or Vi. +* **LO1.d:** Use shell commands to compile new and existing software solutions that are organized into multi-level packages + and have external dependencies. + +## Java Packages + +In Java, a **package** is a grouping of related types providing access protection and name space management. +Note that types refers to classes, interfaces, enumerations, and annotation types [[1]](https://docs.oracle.com/javase/tutorial/java/package/packages.html). In other words, a package allows you to +organize your source code. Proper code organizatioin becomes increasingly important as the size of the project +increases. + +The two primary benefits of packages are: + +* **Name Space Management:** Packages allow you to give a common name to a group of related types. + For example, `java.util.Scanner` and `java.util.Random` are two utility classes provided in the `java.util` package. + You and other programmers can easily determine that these types are related. They are both utilities that you have + probably used in your code. It is important to note that you could have two types with the same simple name that + are located in different packages. For example, you could have a `java.util.Random` class and a `edu.cs.uga.Random` + class. Both classes have the same name (`Random`) but they can be differentiated by their package names. + +* **Access Protection:** Visibility in Java is not limited to `public` and `private`. + Packages and additional visibility modifiers enable programmers to declare things as visible only within a package. + +In this tutorial, you will create multiple classes, group them into a package, then compile and run them. +The expectation is that you will follow along with this tutorial in a terminal emulator on Odin or some Unix machine. +You should ask questions on Piazza if you are unable to proceed or if some aspect of the tutorial is particularly confusing. + +## Setting up for a Package + +1. Create a directory for this tutorial called `cs1302-packages` and change into it: + + ``` + $ mkdir cs1302-packages + $ cd cs1302-packages + ``` + +2. Setup the following subdirectory structure for the `cs1302.hello` package under a new subdirectory called `src`: + + ``` + cs1302-packages + |--- bin + |--- src + |--- cs1302 + |--- hello + ``` + + Here is a breakdown of the different subdirectories and the roles that they play: + * `bin` is the default (no-name) package directory for our compiled code; + * `src` is the default (no-name) package directory for our source code; + * `cs1302` is the `cs1302` package directory; and + * `hello` is the `cs1302.hello` package directory. + +## Default Package + +Here, the `src` directory is the location of the **default package** (proper noun) +for source code. The default package for source code serves as the base directory +for named packages that you will create. You can think of it as the top-level directory +for your package directories (more soon). The default package can also contain classes +(and other types) that are not in a named package. When developing small or temporary +applications, it is a convenient place for package-less `.java` files +[[2]](https://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html). + +Let's dive in! Before we get into creating named packages, we will start by compiling +directly into the default package as a warmup. The steps below show you how to create, +compile, and execute a class in the default package (i.e., a class in a package-less +`.java` file). Once you are comfortable with that, move on to the next section to learn about +named packages. + +1. Using Emacs, create a basic "Hello, World!" program in a driver class + called `HelloWorld` in the default package directory for source code (the `src` directory). + For example, the contents of the `HelloWorld.java` file might be: + + ```java + public class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } // main + } // HelloWorld + ``` + +2. Change directories into the default package directory (`src`) and compile the program using `javac`: + + ``` + $ javac HelloWorld.java + ``` + +3. List the contents of the directory with `ls` to verify that `HelloWorld.class` was created. + +4. Run the program using `java`: + + ``` + $ java HelloWorld + ``` + + Note that the `java` command takes the name of the class itself and not the name of the + `.class` file. + +5. When executing the `java` command, Java assumes that the current working directory is the + location of the default package. If that is not the case, then you must specify it using a + command line option called `-cp` for _class path_. As its name suggests, the **class path** is + the path to the default package for classes. + + Change back into the `cs1302-packages` directory and try to execute your program with the + following command: + + ``` + $ java HelloWorld + ``` + + You should get the following error: + + ``` + Error: Could not find or load main class HelloWorld + Caused by: java.lang.ClassNotFoundException: HelloWorld + ``` + + The error message clearly states that the `HelloWorld` class containing the `main` method + could not be found or loaded. + + Now try running the program again, specifying the location of the default package where our compiled code resides. + Since we compiled the class into the `src` directory, `src` is the default package for our compiled code (for now). + Execute the following command to specify the class path: + + ``` + $ java -cp src HelloWorld + ``` + + This time it worked! + + **PROTIP:** You can execute a Java program anywhere on the system as long as you know + the fully qualified name of the class containing the `main` method and the location of that + compiled class's associated default package, assuming proper file permissions. + +6. You may have noticed in the previous step that the `.java` file and `.class` file + for the `HelloWorld` class are in the same directory. Let's keep our directories clean and + separate our source code (`.java` files) from the compiled code (`.class` files). + + First, delete the `HelloWorld.class` file from the `src` directory: + + ``` + $ rm src/HelloWorld.class + ``` + + Verify that your present working directory is still `cs1302-packages` then compile your + program using `javac` with the `-d` option to specify a destination for the compiled code: + + ``` + $ javac -d bin src/HelloWorld.java + ``` + + When you're first starting out in a Unix environment, you might feel lost at times. Remember, + it's always important to know your present working directory (pwd) as that is the location where + the commands you enter will be run. In the command above, our pwd is `cs1302-packages`. Since the + `HelloWorld.java` file is not in that directory, we had to specify the relative path `src/HelloWorld.java` + to tell the compiler how to find that file relative to the pwd. We're telling the compiler "first, go into the + `src` directory and then you'll see the file `HelloWorld.java`". + + Now, if you list the contents of the `bin` directory, you will see that it contains + `HelloWorld.class`. Listing the `src` directory contents will show only `HelloWorld.java`. + Now our project is more organized! + + Try running the program again, specifying the new class path (`bin`) using `-cp`: + + ``` + $ java -cp bin HelloWorld + ``` + +7. We will use the Unix `find` command often in this course to see all files in a directory and its + subdirectories. Go ahead and execute `find` from within the `cs1302-packages` directory. If you've + followed the steps correctly up until now, you will see the following output: + + ``` + . + ./bin + ./bin/HelloWorld.class + ./src + ./src/cs1302 + ./src/cs1302/hello + ./src/HelloWorld.java + ``` + + The output of the `find` command shows that we sucessfully separated the source code (`src`) from + the compiled code (`bin`). If you see any tilde (~) files, those are just backup copies of older versions + of your files. You can ignore those. + + **PROTIP:** Remember, source code should really only be placed directly in the default + package directory (`src`) for convenience when developing small or temporary applications or when + just beginning development [[2]](https://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html). + While types in the default package can access types in other packages, the reverse is not true. + That is, types in named packages cannot access types in the default package. + +8. Let's clean up! Delete the `HelloWorld.class` file that you created in the `bin` folder. Remember to + use [tab completion](https://en.wikipedia.org/wiki/Command-line_completion) so you don't have to type long filenames! + +## Named Package + +Now let's create a named package. To place a class (or interface) in named package, you must do two things: + +1. Place the `.java` file in the appropriate package directory; and +2. Include a `package` statement at the top of the `.java` file. + +Let's try it by placing the `HelloWorld` class into the `cs1302.hello` package! + +1. Change directly into `cs1302-packages` directory. + +2. Move the `HelloWorld.java` file into the `cs1302.hello` package directory. + You may need to create both the `cs1302` and `hello` directories before + executing the following command. + + ``` + $ mv src/HelloWorld.java src/cs1302/hello/ + ``` + + This satisfies the first requirement for placing a class in a named package. + +3. Using Emacs, edit the `HelloWorld.java` file and add the following package + statement at the top: + + ```java + package cs1302.hello; + ``` + + This satisfies the second requirement for placing a class in a named package. + + In Java, a package statement, if included, must be the first line of code in + the file (i.e., excluding comments and white space). + +4. Compile the program (don't forget tab completion - you don't want to type the whole command): + + ``` + $ javac -d bin src/cs1302/hello/HelloWorld.java + ``` + +5. Execute the `find` command. Note that the `HelloWorld.class` file was created under `bin/cs1302/hello`. + The compiler automatically created the necessary package directories for our compiled code under `bin`! + +5. Try to run the program using `javac` specify the classpath using `-cp` and include the + fully qualified name (explained below) of the class containing the `main` method: + + ``` + $ java -cp bin cs1302.hello.HelloWorld + ``` + + In this example, `cs1302.hello.HelloWorld` is known as the **fully qualified name (or FQN)** of the + `HelloWorld` class in the `cs1302.hello` package. You have seen fully qualified names before--they + are often used with `import` statements (remember `java.util.Scanner`?). When you import a class, you + can use the simple class name in that file instead of having to type the fully qualified name each time. + In this case, `HelloWorld` is known as the **name** or **simple name** of the class. + + **PROTIP:** Although packages correspond to directories, a fully qualified name (FQN) uses `.` (dot) + for the name separator and not a slash. + +## Code Dependencies + +When Java code uses other Java code, that creates a dependency. Most of the programs that you've +written have used code provided by Oracle under the various `java` subpackages. When you compile, +those dependencies are automatically included on the class path. However, when your code depends +on code that's not included with Java (e.g., code that you or someone else has written), you need +to let `javac` know where the _compiled_ version of that depedency is. + +1. Let's extend the code we just finished. Create a `cs1302.util.HelloUtility` class under `src`. + **Remember,** the fully qualified name (FQN) implies a specific directory structure and package statement + requirement with respect to `HelloUtility.java`. You will need to add the `util` directory in the proper + place in your current directory hierarchy. + +1. Write the code to declare the `cs1302.util.HelloUtility` class making sure to include the proper + class declaration and package statement at the top. Then, within the class declaration, add the + following method: + + ```java + public static void excitingHello() { + System.out.println("HELLO!!!!"); + } // excitingHello + ``` + +1. Save, then compile the `.java` file for the `cs1302.util.HelloUtility` class as usual, + using `bin` as the destination for the compiled code. Once it compiles, make sure that the + output from `find` matches the output below: + + **Note:** If you see any tilde (~) files, those are just backup copies of older versions + of your files. You can ignore those. + + ``` + . + ./bin + ./bin/cs1302 + ./bin/cs1302/hello + ./bin/cs1302/hello/HelloWorld.class + ./bin/cs1302/util + ./bin/cs1302/util/HelloUtility.class + ./src + ./src/cs1302 + ./src/cs1302/hello + ./src/cs1302/hello/HelloWorld.java + ./src/cs1302/util + ./src/cs1302/util/HelloUtility.java + ``` + +1. Now, modify the source code for your `cs1302.hello.HelloWorld` class to call the static method in + `cs1302.util.HelloUtility`. To do this, you may: + + 1. Add an import statement between the `package` statement and class declation: + + ```java + import cs1302.util.HelloUtility; + ``` + + 1. Call the method in `main` using the simple class name: + + ```java + HelloUtility.excitingHello(); + ``` + + Completing these two steps create a **dependency**. Now, the `cs1302.hello.HelloWorld` class + **depends** on the `cs1302.util.HelloUtility` class because it uses a method defined within that + class. + +1. If you try to compile the source code for your `cs1302.hello.HelloWorld` class exactly as you + did before, then it will not work because the compiler cannot find `cs1302.util.HelloUtility` + class on which `cs1302.hello.HelloWorld` depends. Try it! The error message should look like: + + ``` + src/cs1302/hello/HelloWorld.java:3: error: package cs1302.util does not exist + import cs1302.util.HelloUtility; + ^ + src/cs1302/hello/HelloWorld.java:8: error: cannot find symbol + HelloUtility.excitingHello(); + ^ + symbol: variable HelloUtility + location: class HelloWorld + ``` + + The error output is just `javac` saying that it cannot find something. In this case, it cannot + find `cs1302.util.HelloUtility` as it is not in the same package as `cs1302.hello.HelloWorld`. + Since we know it actually exists, we can just tell `javac` where to find it using `-cp`. + + Remember that when your code depends on other code that you have written, you need to let + `javac` know where the _compiled_ version of that depedency is. Since you compiled under `bin`, + that's where you should tell `javac` to look. Try to compile it again, but this time, be sure + to include the `-cp bin` option in addition to `-d bin` option. The program should now run as expected. + +## Further Important Notes + +### Setting the Class Path + +Both `javac` and `java` allow you specify the class path using the `-cp` or `-classpath` command-line +option. The usual syntax is as follows: + +``` +-cp some/path +``` + +If more than one default package is needed, then a colon `:` can be used to separate each path in a +list of multiple paths: + +``` +-cp path1:path2 +``` + +Each path can be a path to a directory or a `.jar` file (usually used for third party libraries). + +**VERY IMPORTANT NOTE:** The class path should always point to a default package for _compiled_ code. +If you are compiling a `.java` file that depends on an already compiled class, then you will need to +specifiy the class path to the corresponding default package for that dependency when +invoking `javac`. + +### Import Statements + +In Java, you do not have to import classes that are in the same package. However, it's interesting to +note that `import` statements are actually never required in Java. We just use them for convenience. +Assuming the corresponding default package for class's package is on the class path when compiling +and/or running, you can always refer to a class by its fully qualified name. Consider two uses of +[`java.util.Random`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Random.html) below: + +```java +// assuming the class was imported +Random rng = new Random(); +``` + +```java +// assuming the class was NOT imported +java.util.Random rng = new java.util.Random(); +``` + +As you can imagine, the latter (without an import statement) might get annoying and repetetive. +Therefore, we usually prefer to use an `import` statement for the convenience it provides. +Why would anyone prefer to use the fully qualified name instead of the simple name for a class? +It enables you to use two classes from different packages with the same simple name at the +same time! + +### The `java.lang` Package + +Java automatically performs a wildcard import of the `java.lang` package (i.e., `import java.lang.*;`) in +every Java file, without requiring the programmer to explicitly write it. That is why you can use classes +such as `java.lang.String` and `java.lang.System` by their simple names without importing! + +## References + +* [[1] Creating and Using Packages](https://docs.oracle.com/javase/tutorial/java/package/packages.html) +* [[2] Packages](https://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html) + +
    + +**Feedback?** +Please help us make this better! +If you have any feedback or suggestions for this reading or tutorial, then use +the link below to reach the feedback form. + +[![Submit Feedback](https://img.shields.io/badge/-Submit Feedback-red.svg?style=for-the-badge)](https://docs.google.com/forms/d/e/1FAIpQLSfBgZM_-G-9nKmX7F83k0Tgp1OlqBnrkt6vsxlIqLypc_keUQ/viewform?usp=pp_url&entry.1081181680=cs1302-packages&entry.1901270436=https://github.com/cs1302uga/cs1302-tutorials/blob/master/packages.md) + +
    + +[![License: CC BY-NC-ND 4.0](https://img.shields.io/badge/License-CC%20BY--NC--ND%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-nc-nd/4.0/) + + +Copyright © Michael E. Cotterell, Brad Barnes, and the University of Georgia. +This work is licensed under a
    Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License to students and the public. +The content and opinions expressed on this Web page do not necessarily reflect the views of nor are they endorsed by the University of Georgia or the University System of Georgia. + From 7d04f580427de717e58ac2d8c1ad3abbfea85a09 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 14 Aug 2022 21:13:37 -0400 Subject: [PATCH 049/212] Update packages1.md --- packages1.md | 167 +++++++-------------------------------------------- 1 file changed, 23 insertions(+), 144 deletions(-) diff --git a/packages1.md b/packages1.md index 7c433cc2..37ee0cfb 100644 --- a/packages1.md +++ b/packages1.md @@ -1,4 +1,4 @@ -# Java Packages Tutorial +# Java Packages Tutorial - Part 1 ![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) @@ -245,53 +245,14 @@ Let's try it by placing the `HelloWorld` class into the `cs1302.hello` package! ``` 5. Execute the `find` command. Note that the `HelloWorld.class` file was created under `bin/cs1302/hello`. - The compiler automatically created the necessary package directories for our compiled code under `bin`! - -5. Try to run the program using `javac` specify the classpath using `-cp` and include the - fully qualified name (explained below) of the class containing the `main` method: - - ``` - $ java -cp bin cs1302.hello.HelloWorld - ``` - - In this example, `cs1302.hello.HelloWorld` is known as the **fully qualified name (or FQN)** of the - `HelloWorld` class in the `cs1302.hello` package. You have seen fully qualified names before--they - are often used with `import` statements (remember `java.util.Scanner`?). When you import a class, you - can use the simple class name in that file instead of having to type the fully qualified name each time. - In this case, `HelloWorld` is known as the **name** or **simple name** of the class. - - **PROTIP:** Although packages correspond to directories, a fully qualified name (FQN) uses `.` (dot) - for the name separator and not a slash. - -## Code Dependencies - -When Java code uses other Java code, that creates a dependency. Most of the programs that you've -written have used code provided by Oracle under the various `java` subpackages. When you compile, -those dependencies are automatically included on the class path. However, when your code depends -on code that's not included with Java (e.g., code that you or someone else has written), you need -to let `javac` know where the _compiled_ version of that depedency is. - -1. Let's extend the code we just finished. Create a `cs1302.util.HelloUtility` class under `src`. - **Remember,** the fully qualified name (FQN) implies a specific directory structure and package statement - requirement with respect to `HelloUtility.java`. You will need to add the `util` directory in the proper - place in your current directory hierarchy. - -1. Write the code to declare the `cs1302.util.HelloUtility` class making sure to include the proper - class declaration and package statement at the top. Then, within the class declaration, add the - following method: - - ```java - public static void excitingHello() { - System.out.println("HELLO!!!!"); - } // excitingHello - ``` - -1. Save, then compile the `.java` file for the `cs1302.util.HelloUtility` class as usual, - using `bin` as the destination for the compiled code. Once it compiles, make sure that the - output from `find` matches the output below: + The output of `find` should look the same as the output below. Notice that The compiler automatically + created the necessary package directories for our compiled code under `bin`! **Note:** If you see any tilde (~) files, those are just backup copies of older versions - of your files. You can ignore those. + of your files. You can ignore those. If you see any other differences between your + output and the output below, you likely had a small error in a command or in your package statement in + the `HelloWorld.java` file. Double check that you did everything correctly and, if you need assistance, + post a screenshot of your `find` output to Piazza. ``` . @@ -299,115 +260,33 @@ to let `javac` know where the _compiled_ version of that depedency is. ./bin/cs1302 ./bin/cs1302/hello ./bin/cs1302/hello/HelloWorld.class - ./bin/cs1302/util - ./bin/cs1302/util/HelloUtility.class ./src ./src/cs1302 ./src/cs1302/hello ./src/cs1302/hello/HelloWorld.java - ./src/cs1302/util - ./src/cs1302/util/HelloUtility.java ``` + -1. Now, modify the source code for your `cs1302.hello.HelloWorld` class to call the static method in - `cs1302.util.HelloUtility`. To do this, you may: - - 1. Add an import statement between the `package` statement and class declation: - - ```java - import cs1302.util.HelloUtility; - ``` - - 1. Call the method in `main` using the simple class name: - - ```java - HelloUtility.excitingHello(); - ``` - - Completing these two steps create a **dependency**. Now, the `cs1302.hello.HelloWorld` class - **depends** on the `cs1302.util.HelloUtility` class because it uses a method defined within that - class. - -1. If you try to compile the source code for your `cs1302.hello.HelloWorld` class exactly as you - did before, then it will not work because the compiler cannot find `cs1302.util.HelloUtility` - class on which `cs1302.hello.HelloWorld` depends. Try it! The error message should look like: +6. Run the program using `javac` specify the classpath using `-cp` and include the + fully qualified name (explained below) of the class containing the `main` method: ``` - src/cs1302/hello/HelloWorld.java:3: error: package cs1302.util does not exist - import cs1302.util.HelloUtility; - ^ - src/cs1302/hello/HelloWorld.java:8: error: cannot find symbol - HelloUtility.excitingHello(); - ^ - symbol: variable HelloUtility - location: class HelloWorld + $ java -cp bin cs1302.hello.HelloWorld ``` + + In this example, `cs1302.hello.HelloWorld` is known as the **fully qualified name (or FQN)** of the + `HelloWorld` class in the `cs1302.hello` package. You have seen fully qualified names before--they + are often used with `import` statements (remember `java.util.Scanner`?). When you import a class, you + can use the simple class name in that file instead of having to type the fully qualified name each time. + In this case, `HelloWorld` is known as the **name** or **simple name** of the class. - The error output is just `javac` saying that it cannot find something. In this case, it cannot - find `cs1302.util.HelloUtility` as it is not in the same package as `cs1302.hello.HelloWorld`. - Since we know it actually exists, we can just tell `javac` where to find it using `-cp`. - - Remember that when your code depends on other code that you have written, you need to let - `javac` know where the _compiled_ version of that depedency is. Since you compiled under `bin`, - that's where you should tell `javac` to look. Try to compile it again, but this time, be sure - to include the `-cp bin` option in addition to `-d bin` option. The program should now run as expected. - -## Further Important Notes - -### Setting the Class Path - -Both `javac` and `java` allow you specify the class path using the `-cp` or `-classpath` command-line -option. The usual syntax is as follows: - -``` --cp some/path -``` - -If more than one default package is needed, then a colon `:` can be used to separate each path in a -list of multiple paths: - -``` --cp path1:path2 -``` - -Each path can be a path to a directory or a `.jar` file (usually used for third party libraries). - -**VERY IMPORTANT NOTE:** The class path should always point to a default package for _compiled_ code. -If you are compiling a `.java` file that depends on an already compiled class, then you will need to -specifiy the class path to the corresponding default package for that dependency when -invoking `javac`. - -### Import Statements - -In Java, you do not have to import classes that are in the same package. However, it's interesting to -note that `import` statements are actually never required in Java. We just use them for convenience. -Assuming the corresponding default package for class's package is on the class path when compiling -and/or running, you can always refer to a class by its fully qualified name. Consider two uses of -[`java.util.Random`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Random.html) below: - -```java -// assuming the class was imported -Random rng = new Random(); -``` - -```java -// assuming the class was NOT imported -java.util.Random rng = new java.util.Random(); -``` - -As you can imagine, the latter (without an import statement) might get annoying and repetetive. -Therefore, we usually prefer to use an `import` statement for the convenience it provides. -Why would anyone prefer to use the fully qualified name instead of the simple name for a class? -It enables you to use two classes from different packages with the same simple name at the -same time! - -### The `java.lang` Package - -Java automatically performs a wildcard import of the `java.lang` package (i.e., `import java.lang.*;`) in -every Java file, without requiring the programmer to explicitly write it. That is why you can use classes -such as `java.lang.String` and `java.lang.System` by their simple names without importing! + **PROTIP:** Although packages correspond to directories, a fully qualified name (FQN) uses `.` (dot) + for the name separator and not a slash. -## References +7. Congratulations on compiling your code to a named package! **Don't delete your work** unless you want to work + through the tutorial again for extra practice. The next tutorial will continue where this one left off. + + ## References * [[1] Creating and Using Packages](https://docs.oracle.com/javase/tutorial/java/package/packages.html) * [[2] Packages](https://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html) From 03a698f39e87470acd34c89422411f1ea39ffb28 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 14 Aug 2022 21:22:59 -0400 Subject: [PATCH 050/212] Update packages2.md --- packages2.md | 264 ++++----------------------------------------------- 1 file changed, 16 insertions(+), 248 deletions(-) diff --git a/packages2.md b/packages2.md index 7c433cc2..07811b0f 100644 --- a/packages2.md +++ b/packages2.md @@ -1,10 +1,14 @@ -# Java Packages Tutorial +# Java Packages Tutorial - Part 1 ![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ## Prerequisites -This tutorial assumes that the reader has a knowledge of basic Unix commands and experience working with a command-line +This tutorial assumes that the reader has completed +[Java Packages Tutorial - Part 1](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/packages1.md). +If you haven't completed that tutorial, please do so before moving on. + +This tutorial also, assumes that the reader has a knowledge of basic Unix commands and experience working with a command-line text editor (e.g. emacs, vi, etc.). To get the most out of this tutorial, you should **follow along, take notes, execute any given commands, run any code examples, repeat as necessary**. Simply reading (or skimming) is not sufficient for learning this material. @@ -15,253 +19,17 @@ run any code examples, repeat as necessary**. Simply reading (or skimming) is no * **LO1.d:** Use shell commands to compile new and existing software solutions that are organized into multi-level packages and have external dependencies. -## Java Packages - -In Java, a **package** is a grouping of related types providing access protection and name space management. -Note that types refers to classes, interfaces, enumerations, and annotation types [[1]](https://docs.oracle.com/javase/tutorial/java/package/packages.html). In other words, a package allows you to -organize your source code. Proper code organizatioin becomes increasingly important as the size of the project -increases. - -The two primary benefits of packages are: - -* **Name Space Management:** Packages allow you to give a common name to a group of related types. - For example, `java.util.Scanner` and `java.util.Random` are two utility classes provided in the `java.util` package. - You and other programmers can easily determine that these types are related. They are both utilities that you have - probably used in your code. It is important to note that you could have two types with the same simple name that - are located in different packages. For example, you could have a `java.util.Random` class and a `edu.cs.uga.Random` - class. Both classes have the same name (`Random`) but they can be differentiated by their package names. - -* **Access Protection:** Visibility in Java is not limited to `public` and `private`. - Packages and additional visibility modifiers enable programmers to declare things as visible only within a package. - -In this tutorial, you will create multiple classes, group them into a package, then compile and run them. -The expectation is that you will follow along with this tutorial in a terminal emulator on Odin or some Unix machine. -You should ask questions on Piazza if you are unable to proceed or if some aspect of the tutorial is particularly confusing. - -## Setting up for a Package - -1. Create a directory for this tutorial called `cs1302-packages` and change into it: - - ``` - $ mkdir cs1302-packages - $ cd cs1302-packages - ``` - -2. Setup the following subdirectory structure for the `cs1302.hello` package under a new subdirectory called `src`: - - ``` - cs1302-packages - |--- bin - |--- src - |--- cs1302 - |--- hello - ``` - - Here is a breakdown of the different subdirectories and the roles that they play: - * `bin` is the default (no-name) package directory for our compiled code; - * `src` is the default (no-name) package directory for our source code; - * `cs1302` is the `cs1302` package directory; and - * `hello` is the `cs1302.hello` package directory. - -## Default Package - -Here, the `src` directory is the location of the **default package** (proper noun) -for source code. The default package for source code serves as the base directory -for named packages that you will create. You can think of it as the top-level directory -for your package directories (more soon). The default package can also contain classes -(and other types) that are not in a named package. When developing small or temporary -applications, it is a convenient place for package-less `.java` files -[[2]](https://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html). - -Let's dive in! Before we get into creating named packages, we will start by compiling -directly into the default package as a warmup. The steps below show you how to create, -compile, and execute a class in the default package (i.e., a class in a package-less -`.java` file). Once you are comfortable with that, move on to the next section to learn about -named packages. - -1. Using Emacs, create a basic "Hello, World!" program in a driver class - called `HelloWorld` in the default package directory for source code (the `src` directory). - For example, the contents of the `HelloWorld.java` file might be: - - ```java - public class HelloWorld { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } // main - } // HelloWorld - ``` - -2. Change directories into the default package directory (`src`) and compile the program using `javac`: - - ``` - $ javac HelloWorld.java - ``` - -3. List the contents of the directory with `ls` to verify that `HelloWorld.class` was created. - -4. Run the program using `java`: - - ``` - $ java HelloWorld - ``` - - Note that the `java` command takes the name of the class itself and not the name of the - `.class` file. - -5. When executing the `java` command, Java assumes that the current working directory is the - location of the default package. If that is not the case, then you must specify it using a - command line option called `-cp` for _class path_. As its name suggests, the **class path** is - the path to the default package for classes. - - Change back into the `cs1302-packages` directory and try to execute your program with the - following command: - - ``` - $ java HelloWorld - ``` - - You should get the following error: - - ``` - Error: Could not find or load main class HelloWorld - Caused by: java.lang.ClassNotFoundException: HelloWorld - ``` - - The error message clearly states that the `HelloWorld` class containing the `main` method - could not be found or loaded. - - Now try running the program again, specifying the location of the default package where our compiled code resides. - Since we compiled the class into the `src` directory, `src` is the default package for our compiled code (for now). - Execute the following command to specify the class path: - - ``` - $ java -cp src HelloWorld - ``` - - This time it worked! - - **PROTIP:** You can execute a Java program anywhere on the system as long as you know - the fully qualified name of the class containing the `main` method and the location of that - compiled class's associated default package, assuming proper file permissions. - -6. You may have noticed in the previous step that the `.java` file and `.class` file - for the `HelloWorld` class are in the same directory. Let's keep our directories clean and - separate our source code (`.java` files) from the compiled code (`.class` files). - - First, delete the `HelloWorld.class` file from the `src` directory: - - ``` - $ rm src/HelloWorld.class - ``` - - Verify that your present working directory is still `cs1302-packages` then compile your - program using `javac` with the `-d` option to specify a destination for the compiled code: - - ``` - $ javac -d bin src/HelloWorld.java - ``` - - When you're first starting out in a Unix environment, you might feel lost at times. Remember, - it's always important to know your present working directory (pwd) as that is the location where - the commands you enter will be run. In the command above, our pwd is `cs1302-packages`. Since the - `HelloWorld.java` file is not in that directory, we had to specify the relative path `src/HelloWorld.java` - to tell the compiler how to find that file relative to the pwd. We're telling the compiler "first, go into the - `src` directory and then you'll see the file `HelloWorld.java`". - - Now, if you list the contents of the `bin` directory, you will see that it contains - `HelloWorld.class`. Listing the `src` directory contents will show only `HelloWorld.java`. - Now our project is more organized! - - Try running the program again, specifying the new class path (`bin`) using `-cp`: - - ``` - $ java -cp bin HelloWorld - ``` - -7. We will use the Unix `find` command often in this course to see all files in a directory and its - subdirectories. Go ahead and execute `find` from within the `cs1302-packages` directory. If you've - followed the steps correctly up until now, you will see the following output: - - ``` - . - ./bin - ./bin/HelloWorld.class - ./src - ./src/cs1302 - ./src/cs1302/hello - ./src/HelloWorld.java - ``` - - The output of the `find` command shows that we sucessfully separated the source code (`src`) from - the compiled code (`bin`). If you see any tilde (~) files, those are just backup copies of older versions - of your files. You can ignore those. - - **PROTIP:** Remember, source code should really only be placed directly in the default - package directory (`src`) for convenience when developing small or temporary applications or when - just beginning development [[2]](https://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html). - While types in the default package can access types in other packages, the reverse is not true. - That is, types in named packages cannot access types in the default package. - -8. Let's clean up! Delete the `HelloWorld.class` file that you created in the `bin` folder. Remember to - use [tab completion](https://en.wikipedia.org/wiki/Command-line_completion) so you don't have to type long filenames! - -## Named Package +## Introduction -Now let's create a named package. To place a class (or interface) in named package, you must do two things: +In the previous tutorial, [Java Packages Tutorial - Part 1](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/packages1.md), +you compmiled and ran code that you placed into a named package. In that tutorial, you were working with a single Java +file. In this tutorial, we will compile and run an application that depends on code located in multiple Java files. +When one Java file requires access to another file in order to run, it is called a **code dependency**. When there are +dependencies in our projects, we need to make sure to consider these dependencies when compiling and running our code. +This tutorial will walk you through this process. -1. Place the `.java` file in the appropriate package directory; and -2. Include a `package` statement at the top of the `.java` file. - -Let's try it by placing the `HelloWorld` class into the `cs1302.hello` package! - -1. Change directly into `cs1302-packages` directory. - -2. Move the `HelloWorld.java` file into the `cs1302.hello` package directory. - You may need to create both the `cs1302` and `hello` directories before - executing the following command. - - ``` - $ mv src/HelloWorld.java src/cs1302/hello/ - ``` - - This satisfies the first requirement for placing a class in a named package. - -3. Using Emacs, edit the `HelloWorld.java` file and add the following package - statement at the top: - - ```java - package cs1302.hello; - ``` - - This satisfies the second requirement for placing a class in a named package. - - In Java, a package statement, if included, must be the first line of code in - the file (i.e., excluding comments and white space). - -4. Compile the program (don't forget tab completion - you don't want to type the whole command): - - ``` - $ javac -d bin src/cs1302/hello/HelloWorld.java - ``` - -5. Execute the `find` command. Note that the `HelloWorld.class` file was created under `bin/cs1302/hello`. - The compiler automatically created the necessary package directories for our compiled code under `bin`! - -5. Try to run the program using `javac` specify the classpath using `-cp` and include the - fully qualified name (explained below) of the class containing the `main` method: - - ``` - $ java -cp bin cs1302.hello.HelloWorld - ``` - - In this example, `cs1302.hello.HelloWorld` is known as the **fully qualified name (or FQN)** of the - `HelloWorld` class in the `cs1302.hello` package. You have seen fully qualified names before--they - are often used with `import` statements (remember `java.util.Scanner`?). When you import a class, you - can use the simple class name in that file instead of having to type the fully qualified name each time. - In this case, `HelloWorld` is known as the **name** or **simple name** of the class. - - **PROTIP:** Although packages correspond to directories, a fully qualified name (FQN) uses `.` (dot) - for the name separator and not a slash. +**Note:** This tutorial picks up where the last tutorial left off. You should start by logging into Odin and changing +directories into the `cs1302-packages` directory you created while working through that tutorial. ## Code Dependencies @@ -271,7 +39,7 @@ those dependencies are automatically included on the class path. However, when y on code that's not included with Java (e.g., code that you or someone else has written), you need to let `javac` know where the _compiled_ version of that depedency is. -1. Let's extend the code we just finished. Create a `cs1302.util.HelloUtility` class under `src`. +1. Let's extend the code we wrote in the previous tutorial. Create a `cs1302.util.HelloUtility` class under `src`. **Remember,** the fully qualified name (FQN) implies a specific directory structure and package statement requirement with respect to `HelloUtility.java`. You will need to add the `util` directory in the proper place in your current directory hierarchy. From 0f867fee826ed8cef80baddbad8c3d45c2337179 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 14 Aug 2022 21:23:11 -0400 Subject: [PATCH 051/212] Update packages2.md --- packages2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages2.md b/packages2.md index 07811b0f..0553f8d9 100644 --- a/packages2.md +++ b/packages2.md @@ -1,4 +1,4 @@ -# Java Packages Tutorial - Part 1 +# Java Packages Tutorial - Part 2 ![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) From 1c22e926ad8a9d07939a9388dc2441ef1d50424b Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 14 Aug 2022 21:25:45 -0400 Subject: [PATCH 052/212] Update packages2.md --- packages2.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages2.md b/packages2.md index 0553f8d9..94504970 100644 --- a/packages2.md +++ b/packages2.md @@ -175,11 +175,6 @@ Java automatically performs a wildcard import of the `java.lang` package (i.e., every Java file, without requiring the programmer to explicitly write it. That is why you can use classes such as `java.lang.String` and `java.lang.System` by their simple names without importing! -## References - -* [[1] Creating and Using Packages](https://docs.oracle.com/javase/tutorial/java/package/packages.html) -* [[2] Packages](https://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html) -
    **Feedback?** From de81995eb411d8045be9d9c12525c3fef7cb4710 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 15 Aug 2022 13:48:41 -0400 Subject: [PATCH 053/212] Update packages2.md --- packages2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages2.md b/packages2.md index 94504970..30278d6b 100644 --- a/packages2.md +++ b/packages2.md @@ -22,7 +22,7 @@ run any code examples, repeat as necessary**. Simply reading (or skimming) is no ## Introduction In the previous tutorial, [Java Packages Tutorial - Part 1](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/packages1.md), -you compmiled and ran code that you placed into a named package. In that tutorial, you were working with a single Java +you compiled and ran code that you placed into a named package. In that tutorial, you were working with a single Java file. In this tutorial, we will compile and run an application that depends on code located in multiple Java files. When one Java file requires access to another file in order to run, it is called a **code dependency**. When there are dependencies in our projects, we need to make sure to consider these dependencies when compiling and running our code. From 9a087fa5f4659171d713f76feb1e9a4a935dca56 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 16 Aug 2022 00:45:34 -0400 Subject: [PATCH 054/212] Update exceptions1.md --- exceptions/exceptions1.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index 3f55d9de..a5455711 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -200,7 +200,9 @@ try { // <---- ✗ nor any of the lines below ``` -There are two high-level strategies for dealing with this kind of scoping issue: +There are two high-level strategies for dealing with this kind of scoping issue. You should be aware of the first +strategy but you should always try to use the second strategy as it leads to more elegant solutions that are +easier to program. These two strategies are outlined below: 1. Increase the symbol's scope by declaring and initializing it on a line that precedes the enclosing try-block and changing original declaration to a From 34c319c2174687feebe2912ec70bb7e18ca6192f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 16 Aug 2022 00:46:52 -0400 Subject: [PATCH 055/212] Update exceptions2.md --- exceptions/exceptions2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exceptions/exceptions2.md b/exceptions/exceptions2.md index cdef58e5..8df79fd0 100644 --- a/exceptions/exceptions2.md +++ b/exceptions/exceptions2.md @@ -165,7 +165,7 @@ let's make it someone else's responsibility using the `throws` keyword in the signature of the method containing the line: ```java -int computeAverage(double[] nums) throws IllegalArgumentException { +public int computeAverage(double[] nums) throws IllegalArgumentException { if (nums.length == 0) { throw new IllegalArgumentException("nums array cannot be empty"); } // if From 82be2c4cedb1cb182e718b0beabad6593ce5b3f4 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 16 Aug 2022 12:16:07 -0400 Subject: [PATCH 056/212] Update packages1.md --- packages1.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages1.md b/packages1.md index 37ee0cfb..949b131a 100644 --- a/packages1.md +++ b/packages1.md @@ -167,6 +167,12 @@ named packages. `HelloWorld.java` file is not in that directory, we had to specify the relative path `src/HelloWorld.java` to tell the compiler how to find that file relative to the pwd. We're telling the compiler "first, go into the `src` directory and then you'll see the file `HelloWorld.java`". + + **Important Note:** `bin` is just the relative path to the directory where the compiled `.class` files will + be placed. In this example, `bin` is a directory located inside of the present working directory. You can + replace `bin` with any relative or absolute path to any directory that you have permission to write to. For + example, if we had a direcory called `class_files` in our present working directory, we could compile + the code with `-d class_files` and our `.class` files would be placed in that directory. Now, if you list the contents of the `bin` directory, you will see that it contains `HelloWorld.class`. Listing the `src` directory contents will show only `HelloWorld.java`. From a4208fcef96952e082c0f8ce8a85b8106f5d22b9 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 16 Aug 2022 13:43:21 -0400 Subject: [PATCH 057/212] Update exceptions1.md --- exceptions/exceptions1.md | 65 +++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index a5455711..39a2ca82 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -23,35 +23,82 @@ you should follow along and take notes. ## Definition In Java, an **exception** is an event that occurs during the execution of a program that -encounters an error or some kind of exceptional situation. When an exception occurs, -two things happen: +encounters an error or some kind of exceptional situation. Often times, students get the +impression that, when an exception occurs, the program is going to crash and give an +obscure error message. For this reason, students often try to avoid exceptions at all costs. + +In this tutorial, we will demonstrate that exceptions, when used properly, can lead to cleaner +code that has fewer bugs. You will see that exceptions are actually a way of passing a message +from one method to another indicating that something unexpected happened. They can actually be +informative and useful and should be handled (properly) instead of avoided. + +When an exception occurs, two things happen: 1. an **exception object** is said to be _thrown_; and 1. the normal flow of control is disrupted. +The exception object that is created contains information about the location and cause of the exception. + You have likely encountered the dreaded [`NullPointerException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/NullPointerException.html) before reading this tutorial. If not, it's easy to create a program that will throw a `NullPointerException` object: ```java -String s = null; -if (s.length() > 1) { // <------------------ throws NullPointerException object - System.out.println("string length > 1"); -} // if +public class Exception { + public static void main(String[] args) { + exception(); + } // main + + public static void exception() { + String s = null; + + if (s.length() > 1) { // causes a NullPointerException + System.out.println("string length > 1"); + } // if + } // exception +} // Exception ``` If you run this code, then the JVM: -i) throws a `NullPointerException` object on the second line; and +i) creates a `NullPointerException` object on the second line of the `exception` method; and ii) disrupts the normal flow of control to report to the user that the exception was thrown and abruptly terminates the program. -Go ahead and test it out. -In general, there are two ways to deal with exceptions: +In this example, the `exception` method is not completed and the program crashes. Please note that +the program doesn't crash because an exception occurred. Instead, it crashes because the exception +was not *handled* properly. + +Go ahead and test it out. Copy/paste this code into a `.java` file on Odin and try to run it. Did it +do what you expected? + +The example code above, when executed, produces the following output: + +```java +Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "" is null + at Exception.exception(Exception.java:9) + at Exception.main(Exception.java:3) +``` + +When you see an error message like this, please take time to read through the message to understand what it is +saying. The first line tells you that a `NullPointerException` occurred when the `length` method was invoked on +a `null` reference. That's very informative. With this information, we can figure out that `s` must have been `null`. +From there, we can see the exact method(s) that were called before the exception occurred. To understand this, start +from the last line of output in the error. The last line corresponds to the first method that was called. In our example, +this is the `main` method. That should make sense since all programs start in `main`. On line 3 of the `main` method, +the `exception` method was called. Then, on line 9 of the `exception` method, the program generated an exception +that was never handled. This caused the program to crash. + +Now, you may be tempted to go into the code and add `if` statements to avoid this exception altogether. However, a +much better way to deal with this is to let the exception happen and then handle it afterwards. + +So, in general, there are two ways to deal with exceptions: 1. avoid them; and 2. handle them. +We will talk about each of these in detail in the next two sections. + ## Avoiding Exceptions To *avoid the exception* in the example above, you need only ensure that you From cf97a9056dc3bc36a5e34530fc86ed6c84e8d0c9 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 16 Aug 2022 13:52:20 -0400 Subject: [PATCH 058/212] Update exceptions1.md --- exceptions/exceptions1.md | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index 39a2ca82..aa08085d 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -20,17 +20,19 @@ you should follow along and take notes. * [Handling Exceptions](#handling-exceptions) * [Regarding Scope](#regarding-scope) -## Definition +## Introduction In Java, an **exception** is an event that occurs during the execution of a program that encounters an error or some kind of exceptional situation. Often times, students get the -impression that, when an exception occurs, the program is going to crash and give an -obscure error message. For this reason, students often try to avoid exceptions at all costs. +impression that, when an exception occurs, the only outcome is that the program will crash +and produce an obscure error message. For this reason, students often try to avoid exceptions +at all costs. In this tutorial, you will see that it is almost always better to let exceptions +occur and then properly handle them instead of trying to avoid them. -In this tutorial, we will demonstrate that exceptions, when used properly, can lead to cleaner -code that has fewer bugs. You will see that exceptions are actually a way of passing a message -from one method to another indicating that something unexpected happened. They can actually be -informative and useful and should be handled (properly) instead of avoided. +We will demonstrate that exceptions, when used properly, can lead to cleaner code that has +fewer bugs. You will see that exceptions are a way of passing a message from one method to +another to indicate that something unexpected happened. Exceptions can be both informative and +useful and should be handled (properly) instead of avoided. When an exception occurs, two things happen: @@ -41,8 +43,10 @@ The exception object that is created contains information about the location and You have likely encountered the dreaded [`NullPointerException`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/NullPointerException.html) -before reading this tutorial. If not, it's easy to create a program that will -throw a `NullPointerException` object: +before reading this tutorial. If you click on the link, you will see that `NullPointerException` is a Java class +that has constructors and methods that can be called from your programs. + +If you haven't see a `NullPointerException` before, it's easy to create a program that will generate one: ```java public class Exception { @@ -65,9 +69,9 @@ i) creates a `NullPointerException` object on the second line of the `exception` ii) disrupts the normal flow of control to report to the user that the exception was thrown and abruptly terminates the program. -In this example, the `exception` method is not completed and the program crashes. Please note that -the program doesn't crash because an exception occurred. Instead, it crashes because the exception -was not *handled* properly. +In this example, the `exception` method does not finish executing as it normally would (because of the +exception) and the program crashes. Please note that the program doesn't crash because an exception occurred. +Instead, it crashes because the exception was not *handled* properly. Go ahead and test it out. Copy/paste this code into a `.java` file on Odin and try to run it. Did it do what you expected? @@ -89,10 +93,8 @@ this is the `main` method. That should make sense since all programs start in `m the `exception` method was called. Then, on line 9 of the `exception` method, the program generated an exception that was never handled. This caused the program to crash. -Now, you may be tempted to go into the code and add `if` statements to avoid this exception altogether. However, a -much better way to deal with this is to let the exception happen and then handle it afterwards. - -So, in general, there are two ways to deal with exceptions: +The error message above is informative to us as programmers but we don't want our users to see it! To protect them +from these messages, we have to deal with exceptions in one of two ways: 1. avoid them; and 2. handle them. From 250309dcec7c346cea38c5045a7317ed952cc93f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 16 Aug 2022 20:37:44 -0400 Subject: [PATCH 059/212] Update exceptions1.md --- exceptions/exceptions1.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index aa08085d..b27977cf 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -84,7 +84,7 @@ Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String at Exception.main(Exception.java:3) ``` -When you see an error message like this, please take time to read through the message to understand what it is +When you see an error message like this, take a few seconds to read through the message to understand what it is saying. The first line tells you that a `NullPointerException` occurred when the `length` method was invoked on a `null` reference. That's very informative. With this information, we can figure out that `s` must have been `null`. From there, we can see the exact method(s) that were called before the exception occurred. To understand this, start @@ -93,6 +93,10 @@ this is the `main` method. That should make sense since all programs start in `m the `exception` method was called. Then, on line 9 of the `exception` method, the program generated an exception that was never handled. This caused the program to crash. +**Definition:** The last two lines of output above are called a **stack trace**. The stack trace tells the user which +methods were active when the program crashed in the order that they were called (from bottom up). This facilitates +faster debugging by allowing you to better understand what was happening in the application when it crashed. + The error message above is informative to us as programmers but we don't want our users to see it! To protect them from these messages, we have to deal with exceptions in one of two ways: From 725691a86bad6673c5e17d0c2c0dd9aafd424fdf Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 17 Aug 2022 13:31:03 -0400 Subject: [PATCH 060/212] Update exceptions1.md --- exceptions/exceptions1.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index b27977cf..550dd0af 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -91,7 +91,11 @@ From there, we can see the exact method(s) that were called before the exception from the last line of output in the error. The last line corresponds to the first method that was called. In our example, this is the `main` method. That should make sense since all programs start in `main`. On line 3 of the `main` method, the `exception` method was called. Then, on line 9 of the `exception` method, the program generated an exception -that was never handled. This caused the program to crash. +that was never handled. In this example, the `NullPointerException` originated in the `exception` method. Since the +`exception` method did not handle the exception, the exception was **propagated** (passed) to the calling method. In this +example, that is `main`. Since `main` also did not handle the exception, the exception propagated out of `main` +which led to the crash. Any time an exception is generated and is allowed to propagate out of `main`, the program +will crash. **Definition:** The last two lines of output above are called a **stack trace**. The stack trace tells the user which methods were active when the program crashed in the order that they were called (from bottom up). This facilitates From 816b28197ac0b889b759c73680e096a834646e51 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 20 Aug 2022 13:16:18 -0400 Subject: [PATCH 061/212] Update interfaces.md --- interfaces/interfaces.md | 65 ++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index d2626fba..4c1c325b 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -56,13 +56,13 @@ The steps in this tutorial assume that you are logged into the Odin server. In its simplest form, a Java **interface** is a reference type composed of **abstract methods** and **constants**. An **abstract method** is a non-static method without an implementation (body). Think of creating a class, adding the method signatures, but not putting any code in the methods. This will seem -strange at first but the benefit will become clear as you work through the example. **Constants** +strange at first but the benefit should become clear as you work through the example. **Constants** are variables (static or not) that are declared using the `final` keyword. As of Java 8, the technical definition for an *interface* allows it to contain only the following: -abstract methods, constants, static methods, nested types, and default implementation -methods [[2]](https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html). -Nested types and default methods will not be covered in this tutorial. Java 9 added support -for private methods within an interface. +abstract methods, constants, private methods, static methods, nested types, and default implementation +methods [[2]](https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html). In 1302, our interfaces +will mostly contain only abstract methods and constants. Nested types and default methods will not +be covered in this tutorial. Interfaces are used to specify that a type *can do* a set of things specified by its abstract methods and constants. An interface serves as a *contract* for the classes that @@ -75,7 +75,7 @@ Javadoc comments in the interface. ### Real World Example Remember, we said an interface is a *contract* for the classes that claim to implement it. Take a -moment to think about how contracts are used in the real world (forget Java for a second). +moment to think about how contracts are used in the real world (forget Java for a minute). Hopefully, you came up with a definition of the word contract and maybe a few situations where contracts are used. @@ -84,20 +84,20 @@ In the real world, we think of a contract as a formal and binding agreement between two or more parties. Let's use the professional athlete as an example. Athletes sign a contract which is a binding agreement between the athlete and the team/organizaation that ensures the athlete will compete in his/her sport. The contract states that the athlete must "compete" but it doesn't say specifically -*how* they will compete. The details of exactly how an athlete should compete are not relevant to the contract. +*how* they will compete. The details of exactly how an athlete should compete are usually not mentioned in the contract. The contract simply binds the athlete to compete. The specific details and decisions that occur while the competition is ongoing is up to the athlete. Once the contract is written, it could be signed by athletes in a wide variety of sports. The signer could be a track athlete, a baseball player, a football -player, a racecar driver, etc. Note that the signer determines the details of how they will compete -- the contract only binds them to action of competing. +player, a racecar driver, etc. Again, the signer determines the details of how they will compete. The contract only +binds them to action of competing. -Now, let's tie this back to programming. In the example above, "compete" is the abstract method -that would be placed in the "athlete" interface (contract). The abstract method represents the action that -is required of the signer of the contract. In other words, the method is what the signer is obligated -to do when they agree to implement the interface (a.k.a. sign the contract). The implementation details -of the `compete` method area not given in the interface itself but instead they are written in the -implementing class (signer). Again, the implementing class (contract signer) can be any type of athlete -as they are all required to compete. +Now, let's tie this back to programming. In the example above, `compete` is the abstract method +that would be placed in the `Athlete` interface (contract) since all athletes must be able to compete. +The abstract method represents the action that is required of the signer of the contract. In other words, +the method is what the signer is obligated to do when they agree to implement the interface (a.k.a. +sign the contract). The implementation details of the `compete` method area not given in the interface +itself but instead they are written in the implementing class (signer). Again, the implementing class +(contract signer) can be any type of athlete as they are all required to compete. This may all still seem a bit strange and why we do this in programming may not yet be clear. Hang in there! Let's work through an example in Java. Try to keep this terminology in mind as you work @@ -119,7 +119,6 @@ through this tutorial. Note the use of the `interface` keyword instead of `class` in the type header. In this example, `Styleable` is the contract that can be signed by other classes. - 1. The second big syntax difference involves the inclusion of abstract methods, illustrated by the `style()` method in [`Styleable.java`](src/cs1302/interfaces/contract/Styleable.java). @@ -140,10 +139,11 @@ through this tutorial. to the actual abstract method signature presented above that ends with a semicolon, thus lacking an implementation. - Remember, that the abstract method represents what the signer of the contract must be able to do. If a class - implements the `Styleable` interface, it is obligated to have a concrete (non-abstract) `style` method and - an `unstyle` method as those are the two abstract methods in the interface. This is required - because for any class that signs the contract. + If you open the `Styleable.java` file, you will see that it also contains an abstract `unstyle` method. + Remember, that the abstract method(s) represent what the signer of the contract must be able to do. If a class + implements the `Styleable` interface, it is obligated to have a concrete (non-abstract) `style` and a concreate + `unstyle` method. If an implementing class does not have implementations for one or both of these methods, + it will not compile. **NOTE:** In Java, the declaration of an abstract method in the source code for an interface may omit the `public` visibility modifier. If `public` is omitted in this context, the abstract method is @@ -159,6 +159,11 @@ through this tutorial. ### Implementing an Interface +Remember, the `Styleable` interface is just the contract. We also need to have at least one class +that implements (signs) the contract. We will use two different implementing classes to demonstrate +that the implementation specifics are up to the implementing class (not the interface) just as the +specific details regarding how an athlete will compete are up to the athlete (not the contract). + 1. In Java, a class can implement an interface using the `implements` keyword, e.g., as seen in [`Fancy.java`](src/cs1302/interfaces/impl/Fancy.java): @@ -167,7 +172,7 @@ through this tutorial. ``` In this example, `Fancy` is the implementing class that has signed the `Styleable` contract. It signs - the contract as soon as you add `implements Styleable` to the class declaration as seen above. Now, `Fancy` + the contract as soon as you add `implements Styleable` to the class declaration as seen above. Again, `Fancy` will not compile unless it has a concrete (non-abstract) implementation of both the `style` and `unstyle` methods. **Note:** If the interface is not in the same package as the implementing class, then you will need to add @@ -188,12 +193,12 @@ through this tutorial. ``` Again, this differs from the abstract method defined in the interface only in so far as it has an - implementation. The other aspects of the method signature are the same. + implementation. The other aspects of the method signature (return type, visibility, name) are the same. **NOTE:** As mentioned earlier, it is syntactically correct for an abstract method in an interface to omit the `public` keyword. Remember, in this context, the method is still assumed to have - public visibility. Therefore, the implementation of such a method in an implementing class will - need to include the `public` visibility modifier. + public visibility. Therefore, the implementation of such a method in **an implementing class will + need to include the `public` visibility modifier**. 1. Compare the Javadoc comments in the source code for the `Styleable` interface with the comments written in the source code for the implementing `Fancy` class. In some cases, new comments are @@ -213,7 +218,15 @@ through this tutorial. ### Using an Interface -1. As mentioned earlier, interfaces are reference types in Java. This means that they can be serve as +In this section, we will motivate **why** we set up the interface/implementing class relationship. The main +benefit is type compatibility between the interface type and the implementing class type(s). Leveraging this +compatibility will lead to more elegant code that works with objects of any class that implement the interface. +Connecting this to our real world example, we could write code that works with all athletes instead of having +to write separate (but similar) code for each type of athlete. Would you rather write one method that works +for all athletes or write individual methods for basketball players, football players, track athletes, golfers, +etc.? With that in mind, let's go back to our code example: + +1. Interfaces are reference types in Java. This means that they can be serve as the type for a reference variable. You should be familiar with the use of class names for reference variable types. The code snippet below illustrates both scenarios: From a9363cac5cf92cf65b2d882ecb5dee77d92c825d Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 22 Aug 2022 17:27:24 -0400 Subject: [PATCH 062/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index b108f76c..99cb0640 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -91,7 +91,7 @@ path to that directory as a command-line argument. absolute path? While ``ls`` is nice and probably one of the most used Unix commands of all time, -it doesn't really let us see the whole picture without us issuing repetetive +it doesn't really let us see the whole picture without us issuing repetitive ``ls`` commands. To see the bigger picture, use the ``tree`` command, which lists the contents of a directory in a tree-like format. @@ -110,7 +110,7 @@ lists the contents of a directory in a tree-like format. =============== ====================================================================================================== ``ls`` List contents of current working directory. ``ls PATH`` List contents of the last directory in the provided ``PATH`` (e.g., ``c`` in ``a/b/c`` or ``/a/b/c``). - ``tree PATH`` List contents of the last directory in the provided ``PATH`` and its subdirecoties, in a tree format. + ``tree PATH`` List contents of the last directory in the provided ``PATH`` and its subdirectories, in a tree format. =============== ====================================================================================================== ``ls -l``, ``ls -lh`` @@ -157,7 +157,7 @@ is included in the "long" output format, as described below the next few example The mode specifies the file type and permissions. The first character tells you what type of file is listed. In most cases, this character will be either ``-`` for regular files and ``d`` for directories. - The rest of the bits represent the permissions of the file. In other words, which users on the system are + The rest of the bits represent the permissions of the file; in other words, which users on the system are allowed to read, modify, and execute the file. We will talk about permissions in more detail in a few weeks. If you are interested in reading ahead, please see the `1302 Octal Mode Tutorial `_. @@ -166,7 +166,7 @@ is included in the "long" output format, as described below the next few example This topic is outside the scope of this reading. If you are interested in hard links, then you are encouraged to read about them `here `_. - Symbolic links are more common, and will discussed in a future reading. + Symbolic links are more common, and will be discussed in a future reading. .. [3] .. rubric:: **User / Owner** @@ -187,7 +187,7 @@ is included in the "long" output format, as described below the next few example Normally the size is printed as a byte count or block count without punctuation. These days, byte counts are not very readable, especially for larger file sizes. You can make the output more human-readable by supplying the ``-h`` (human-readable) option as a command-line - argument to ``ls -l``. The human-readable output uses unites like ``K`` (kilobyte), ``M`` (megabyte), + argument to ``ls -l``. The human-readable output uses units like ``K`` (kilobyte), ``M`` (megabyte), ``G`` (gigabyte), etc. whenever they apply. Block counts are usually shown for directories, but that topic is outside the scope of this reading. @@ -271,7 +271,7 @@ then supply ``-`` (minus sign) as a command-line argument to ``cd``. .. figure:: img/cd-minus-demo.svg -On most Unix systems, ``~`` (tilde) is an alias for the absolute path of your home directoy. +On most Unix systems, ``~`` (tilde) is an alias for the absolute path of your home directory. While you can use it with ``cd`` to change directly to your home directory, it's more commonly used to change to directories nested under your home directory. @@ -315,7 +315,7 @@ as a command-line argument. .. figure:: img/ls-all-demo.svg -Every directy on a Unix system has two special hidden files +Every directory on a Unix system has two special hidden files named ``.`` and ``..``. .. table:: @@ -393,7 +393,7 @@ Keyboard Shortcuts ======== ==================================================== Key Description ======== ==================================================== - ``C`` ``CRTL`` (control) + ``C`` ``CTRL`` (control) ``M`` ``META`` (meta): usually ``ALT``, ``OPT`` or ``ESC`` ======== ==================================================== @@ -590,8 +590,7 @@ supplying the relative path as a command-line argument. .. figure:: img/realpath-demo.svg To move or rename a file in Unix, use the ``mv`` (move) command. -Here is some of usage information adapted from the -manual: +Here is some usage information adapted from the manual: .. table:: @@ -647,7 +646,7 @@ using ``man mv``. +++++++++++++++++ To copy a file in Unix, use the ``cp`` (copy) command. -Here is some of usage information adapted from the +Here is some usage information adapted from the manual: .. table:: From 1ddb48ca2d5bc19f376edcf658ddf1c6788c51de Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 22 Aug 2022 17:30:19 -0400 Subject: [PATCH 063/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 99cb0640..ca6b7b3b 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -298,7 +298,7 @@ to your home directory. How convenient! ``cd`` home directory ``cd -`` last previous working directory ``cd a/b/dest`` ``dest``, assuming ``a`` is in the current directory and ``a/b/dest`` is a valid *relative* path - ``cd /a/b/dest`` ``dest``, assuming ``/path/to/dest`` is a valid *absolute* path + ``cd /a/b/dest`` ``dest``, assuming ``/a/b/dest`` is a valid *absolute* path ``cd ~/a/b/dest`` ``dest``, assuming ``a`` is in your home directory and ``~/a/b/dest`` is a valid path ================= ================================================================================================ From 1864b6d563ae7c6309a738f51b5d1a3ea1841472 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 24 Aug 2022 00:24:14 -0400 Subject: [PATCH 064/212] Update cla.md --- cla/cla.md | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/cla/cla.md b/cla/cla.md index f4617b0f..d9a91d42 100644 --- a/cla/cla.md +++ b/cla/cla.md @@ -9,34 +9,35 @@ pieces of information, called **command-line arguments**, after the program's name in order to adjust the program's settings and supply values that the program needs to execute. For example, consider using `ls` to list all of the entries in `~/public_html` using the long listing format (`-l`), including -files that being with a dor (`-a`): +hidden files that begin with a dot `.` (`-a`): ``` $ ls -l -a ~/public_html ``` +In the example above, the base command (program) is `ls` and the command-line +arguments used are `-l`, `-a`, and `~/public_html`. Each of the command-line +arguments provides information to the program about how it should run. + When the program is launched, the command-line arguments are passed into -to the program through its `main` method. Like many Unix programs, `ls` is +to the program through its `main` method. The program reads these values as +input and determines how to respond. Like many Unix programs, `ls` is written in C, but support for command-line arguments extends to other languges as well, including Java. Let's try it! 1. Create a directory for this tutorial called `cs1302-cla`, then change into it. 1. Create a `src` and `bin` directory, then create the `.java` file for a class - called `ArgTester` in a package called `cs1302.cla` such that the `src` directory - is the _default package for source code_. + called `ArgTester` and place `ArgTester.java` in the `src` directory. ``` cs1302-cla ├── bin └── src - └── cs1302 - └── cla - └── ArgTester.java + └── ArgTester.java ``` -1. In `ArgTester.java`, add the appropriate package statement, then - add the declaration for the `ArgTester` class. +1. In `ArgTester.java`, add the declaration for the `ArgTester` class. 1. In your `ArgTester` class, add the following `main` method: @@ -52,16 +53,20 @@ languges as well, including Java. Let's try it! 1. Take a few minutes to carefully read through the code above. Try and understand what it's doing. Note: Up until this point, you've always typed `String[] args` as a parameter to `main` but you've - never used it. That parameter is a reference to an array of command-line arguments. + probably never used it. That parameter is a reference to an array containing the command-line arguments. 1. Compile the `ArgTester` class, specifying `bin` as the destination directory. -1. Run `cs1302.cla.ArgTester` as usual using the `java` command. Here is what the command looks + ``` + javac -d bin ArgTester.java + ``` + +1. Run `ArgTester` as usual using the `java` command. Here is what the command looks like with the expected program output, assuming you are running it from the `cs1302-cla` directory: ``` - $ java -cp bin cs1302.cla.ArgTester + $ java -cp bin ArgTester arguments: ``` @@ -71,10 +76,10 @@ languges as well, including Java. Let's try it! 1. Now try the following command: ``` - $ java -cp bin cs1302.cla.ArgTester one two three + $ java -cp bin ArgTester one two three ``` - What happened? It looks like the for-loop iterated. The array referred to by `args` is not + What happened when you ran it? It looks like the for-loop iterated. The array referred to by `args` is not empty. That's right, we've actually used the `args` array for something! Here's the expected output: @@ -92,15 +97,15 @@ languges as well, including Java. Let's try it! different command-line arguments are parsed. Try the following commands: ``` - $ java -cp bin cs1302.cla.ArgTester "one two" three + $ java -cp bin ArgTester "one two" three ``` ``` - $ java -cp bin cs1302.cla.ArgTester --help "some topic" + $ java -cp bin ArgTester --help "some topic" ``` ``` - $ java -cp bin cs1302.cla.ArgTester --string "my \"awesome\" day" + $ java -cp bin ArgTester --string "my \"awesome\" day" ``` 2. That's it! The rest is purely in the realm of code. We've shown you how command-line From 273abe4b5b1a7edebb7456c5b1016e94f876bbe5 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 24 Aug 2022 00:37:40 -0400 Subject: [PATCH 065/212] Update interfaces.md --- interfaces/interfaces.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index 4c1c325b..a764d412 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -154,7 +154,7 @@ through this tutorial. Find the `Styleable` interface on the website and compare the documentation provided there with what you see in the Javadoc comments included in `Styleable.java`. If you don't remember how to do this, then please refer back to your notes for the - [Javadoc and API Documentation](https://github.com/cs1302uga/cs1302-tutorials/blob/master/javadoc/javadoc.md) + [Javadoc and API Documentation](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/javadoc/javadoc.md) tutorial. ### Implementing an Interface @@ -320,7 +320,8 @@ etc.? With that in mind, let's go back to our code example: Remember, you may need to specify the class path in addition to the destination when using `javac` to compile Java code that depends on other Java code. If you need a refresher on this subject, then refer to the - [Java Packages Tutorial](https://github.com/cs1302uga/cs1302-tutorials/blob/master/packages.md). + [Java Packages Tutorial Part 1](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/packages1.md) and + [Java Packages Tutorial Part 2](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/packages2.md). ### Common Functionality among Disparate Classes From d51f5edc5936d5a4bd935207e7047769d8b3607b Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 25 Aug 2022 13:15:56 -0400 Subject: [PATCH 066/212] Update emacs.md --- emacs/emacs.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/emacs/emacs.md b/emacs/emacs.md index f2530c75..4d9985d3 100644 --- a/emacs/emacs.md +++ b/emacs/emacs.md @@ -278,7 +278,8 @@ Some Unix programs recognize that they do not need to reinvent the wheel when a case is encountered where multi-line text entry is required. Instead of handling the text entry themselves, they invoke your default text editor. On most systems, the default text editor is `vi` or `vim`. You can change this by setting the -`EDITOR` environmental variable in your `~/.bash_profile` file. +`EDITOR` environmental variable in your `~/.bash_profile` file. We recommend adding +the line below at the end of your current `~/.bash_profile` file: ``` export EDITOR=emacs From 4b0852474fea38d007c94d0a34bf02ce8c0c29ff Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 25 Aug 2022 23:51:41 -0400 Subject: [PATCH 067/212] Update javadoc.md --- javadoc/javadoc.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/javadoc/javadoc.md b/javadoc/javadoc.md index 42f4ef08..f6c1a8df 100644 --- a/javadoc/javadoc.md +++ b/javadoc/javadoc.md @@ -196,14 +196,14 @@ this tutorial. 1. __What is the difference between `throw`, `throws`, and `@throws`?__ * The `throw` keyword is used in a block of code to - [explicitly throw an exception](https://github.com/cs1302uga/cs1302-tutorials/blob/master/exceptions/exceptions.md#explicitly-throwing-exceptions--exception-propagation). + [explicitly throw an exception](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/exceptions/exceptions2.md#explicitly-throwing-exceptions--exception-propagation). This is desirable when you want your method to throw an exception under some predefined conditions. If the exception object being thrown using `throw` - is a [checked exception](https://github.com/cs1302uga/cs1302-tutorials/blob/master/exceptions/exceptions.md#checked-vs-unchecked-exceptions), + is a [checked exception](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/exceptions/exceptions2.md#checked-vs-unchecked-exceptions), then you might also need to include `throws` in the method signature. * The `throws` keyword is used in a method or constructor signature to list the checked exceptions - that the method is allowed to [propagate](https://github.com/cs1302uga/cs1302-tutorials/blob/master/exceptions/exceptions.md#explicitly-throwing-exceptions--exception-propagation). + that the method is allowed to [propagate](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/exceptions/exceptions2.md#explicitly-throwing-exceptions--exception-propagation). * The `@throws` tag is a Javadoc tag that is used in the Javadoc comment associated with a method (or constructor) to document that it can throw an exception under certain circumstances. From 5b064c42caccd2dff3e859f7b9a39a0bfd194926 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 25 Aug 2022 23:56:20 -0400 Subject: [PATCH 068/212] Update interfaces.md --- interfaces/interfaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index a764d412..04dbfb51 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -333,7 +333,7 @@ functionality. https://www.youtube.com/watch?v=kcBV6tlg44I -The source code for the video can be accessed [here](https://github.com/cs1302uga/cs1302-tutorials/tree/master/interfaces/donator/src/cs1302/interfaces). +The source code for the video can be accessed [here](https://github.com/cs1302uga/cs1302-tutorials/tree/alsi/interfaces/donator/src/cs1302/interfaces).
    IMAGE ALT TEXT From fbee9bcb10a1a734f9adb7fcd2c35b2327c2cf31 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Fri, 26 Aug 2022 00:27:09 -0400 Subject: [PATCH 069/212] Update inheritance.md --- inheritance/inheritance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inheritance/inheritance.md b/inheritance/inheritance.md index b5d72bbb..f53b0383 100644 --- a/inheritance/inheritance.md +++ b/inheritance/inheritance.md @@ -246,7 +246,7 @@ Try the following scenarios: 1. Omit the `@Override` and mispell the `toString` method name, then recompile. 1. Include the `@Override` and mispell the `toString` method name, then recompile. -Notice the error that occurs in the thirs situation that did not occur in the +Notice the error that occurs in the third situation that did not occur in the second. This is the primary purpose of the annotation. Although optional, it allowed you to tell the compiler that your intent is to override. If the compiler sees the `@Override` annotation, then it checks to make sure it's an override - and From 0d3fd49b06a14fd1ee2fc38fc3c4449581ce8aec Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 27 Aug 2022 13:06:54 -0400 Subject: [PATCH 070/212] Update uml.md --- uml/uml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uml/uml.md b/uml/uml.md index 463aec53..8cbb4ae2 100644 --- a/uml/uml.md +++ b/uml/uml.md @@ -1,6 +1,6 @@ # UML Class Diagrams -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ## Introduction From cf4b40d80f244f6e50fdcd811915940abcc89e02 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 27 Aug 2022 13:08:37 -0400 Subject: [PATCH 071/212] Update uml.md --- uml/uml.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/uml/uml.md b/uml/uml.md index 8cbb4ae2..952993ed 100644 --- a/uml/uml.md +++ b/uml/uml.md @@ -73,7 +73,8 @@ UML supports the standard four visibilities: | protected | `protected` | `#` | | public | `public` | `+` | -For an in-depth discussion on visibilities, see the [Visibility Reading](/visibility/). +You should be familiar with at least two of these visibilities (`public` and `private`). If you would like to read ahead to +learn about the other two, see the [Visibility Reading](/visibility/) which we will cover soon. ### Atributes and Parameters (Variables) From acc8e4d31a332464daef92317cda9aebcd80c072 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 27 Aug 2022 13:13:09 -0400 Subject: [PATCH 072/212] Update inheritance.md --- inheritance/inheritance.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/inheritance/inheritance.md b/inheritance/inheritance.md index f53b0383..626121d6 100644 --- a/inheritance/inheritance.md +++ b/inheritance/inheritance.md @@ -57,6 +57,12 @@ To follow along with the video you'll need to first: IMAGE ALT TEXT +Below is a UML diagram for the starter code. If you haven't been introduced to UML, it is just +a way to visualize classes and their relationships. We will use a few simple UML diagrams in +this reading and we will formally introduce the topic later in the semester. If you would like +to read more about it now, see the [UML Class Diagrams](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/uml/uml.md) +reading. + Here is a UML diagram for the starter code: ![Starter Code](res/Inheritance1.png) From d65cd2d3f7f2f6adfad0fa6f4489ef8eb8da67ae Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Fri, 2 Sep 2022 00:52:54 -0400 Subject: [PATCH 073/212] Update packages2.md --- packages2.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages2.md b/packages2.md index 30278d6b..6f454e22 100644 --- a/packages2.md +++ b/packages2.md @@ -120,6 +120,11 @@ to let `javac` know where the _compiled_ version of that depedency is. that's where you should tell `javac` to look. Try to compile it again, but this time, be sure to include the `-cp bin` option in addition to `-d bin` option. The program should now run as expected. +1. Run the code to make sure it works. Since we're running the `HelloWorld` class (it has the `main` method), + the command to run will not change from part 1 of this tutorial. Remember, the basic idea is to use the + `java` command along with the FQN of the class you want to run. You will also need `-cp` to tell Java + where to find the class to run. + ## Further Important Notes ### Setting the Class Path From 81a13bd0446aecc6d6026b818f8a107bbcf7c9e7 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 7 Sep 2022 00:04:07 -0400 Subject: [PATCH 074/212] Update scripts.md --- scripts/scripts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/scripts.md b/scripts/scripts.md index c25e6689..7fdd6f9f 100644 --- a/scripts/scripts.md +++ b/scripts/scripts.md @@ -1,6 +1,6 @@ # Interpreter Scripts -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ## What is an Interpreter Script? From ff44f89bdeb152fa8f0923463eb2921251aa19ce Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 7 Sep 2022 00:05:41 -0400 Subject: [PATCH 075/212] Update varargs.md --- varargs/varargs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/varargs/varargs.md b/varargs/varargs.md index 61dd4f78..3265c843 100644 --- a/varargs/varargs.md +++ b/varargs/varargs.md @@ -1,6 +1,6 @@ # Variable Arguments (Varargs) Reading -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ## Introduction From 15d84c45eef2c785b0899af8ce99476d1f84d8a8 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 8 Sep 2022 17:11:13 -0400 Subject: [PATCH 076/212] Update interfaces.md --- interfaces/interfaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index 04dbfb51..dc04cfbc 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -82,7 +82,7 @@ contracts are used. In the real world, we think of a contract as a formal and binding agreement between two or more parties. Let's use the professional athlete as an example. Athletes sign a contract which is a -binding agreement between the athlete and the team/organizaation that ensures the athlete will compete +binding agreement between the athlete and the team/organization that ensures the athlete will compete in his/her sport. The contract states that the athlete must "compete" but it doesn't say specifically *how* they will compete. The details of exactly how an athlete should compete are usually not mentioned in the contract. The contract simply binds the athlete to compete. The specific details and decisions that occur while the competition From 553ea578486917974dd939ba8f96b1b7eb047d9f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 12 Sep 2022 22:35:37 -0400 Subject: [PATCH 077/212] Update packages2.md --- packages2.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages2.md b/packages2.md index 6f454e22..cd7a34f8 100644 --- a/packages2.md +++ b/packages2.md @@ -119,6 +119,14 @@ to let `javac` know where the _compiled_ version of that depedency is. `javac` know where the _compiled_ version of that depedency is. Since you compiled under `bin`, that's where you should tell `javac` to look. Try to compile it again, but this time, be sure to include the `-cp bin` option in addition to `-d bin` option. The program should now run as expected. + + The correct compilation command for `HelloWorld.java` is: + + ``` + javac -d bin -cp bin src/cs1302/hello/HelloWorld.java + ``` + + With the addition of `-cp bin`, it will be able to find the `HelloUtility` class that it is dependent on. 1. Run the code to make sure it works. Since we're running the `HelloWorld` class (it has the `main` method), the command to run will not change from part 1 of this tutorial. Remember, the basic idea is to use the From 08800c06b1dbaed704c975fa1e26f3996cd0482d Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 17 Sep 2022 00:29:38 -0400 Subject: [PATCH 078/212] combined public and private visibility readings --- .../{private.rst => public-and-private.rst} | 0 visibility/public.rst | 55 ------------------- 2 files changed, 55 deletions(-) rename visibility/{private.rst => public-and-private.rst} (100%) delete mode 100644 visibility/public.rst diff --git a/visibility/private.rst b/visibility/public-and-private.rst similarity index 100% rename from visibility/private.rst rename to visibility/public-and-private.rst diff --git a/visibility/public.rst b/visibility/public.rst deleted file mode 100644 index 493f2892..00000000 --- a/visibility/public.rst +++ /dev/null @@ -1,55 +0,0 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202022-purple - :alt: Approved for: Spring 2022 - -Visibility Reading -################## - -|approval_notice| - -Public Visibility -***************** - -Instead of saying that something has **public** visibility, we usually -just say that it's public. In Java, only top-level and member-level declarations -are allowed to be public. Things that are public are considered -to be the most visible; they are **always visible**. - -=============== ========== ============ =========== ========= -Visibility Visible From ---------------- ------------------------------------------------ -Name Same Class Same Package Child Class Elsewhere -=============== ========== ============ =========== ========= -public |Y| |Y| |Y| |Y| -=============== ========== ============ =========== ========= - -* In Java, the ``public`` modifier must be included in a declararion for - it to be considered public by the compiler. -* In UML, the ``+`` symbol is used just before a member's identifier to - illustrate that it's public. It is also common practice to assume - that a class in a UML class diagram is public if no visibility - symbol is included. -* The ``javadoc`` program includes public declarations in a - documentation website by default. If you want ``javadoc`` - to only include public declarations, then the ``-public`` - command-line argument can be used. - -.. ############################################################################# - -.. util -.. |Y| unicode:: U+2713 -.. |N| unicode:: U+2717 - -.. copyright and license information -.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN -.. |copyright| replace:: Copyright |copy| Michael E. Cotterell, Bradley J. Barnes, and the University of Georgia. -.. |license| replace:: CC BY-NC-ND 4.0 -.. _license: http://creativecommons.org/licenses/by-nc-nd/4.0/ -.. |license_image| image:: https://img.shields.io/badge/License-CC%20BY--NC--ND%204.0-lightgrey.svg - :target: http://creativecommons.org/licenses/by-nc-nd/4.0/ -.. standard footer -.. footer:: |license_image| - - |copyright| This work is licensed under a |license|_ license to students - and the public. The content and opinions expressed on this Web page do not necessarily - reflect the views of nor are they endorsed by the University of Georgia or the University - System of Georgia. From abcd78578aff5de8d5d3a74dd76cd76c60dc0902 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 17 Sep 2022 00:31:25 -0400 Subject: [PATCH 079/212] combined public and private visibility readings --- visibility/public-and-private.rst | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/visibility/public-and-private.rst b/visibility/public-and-private.rst index 20cf583a..3b0b49ed 100644 --- a/visibility/public-and-private.rst +++ b/visibility/public-and-private.rst @@ -12,6 +12,33 @@ Visibility Reading |approval_notice| +Public Visibility +***************** + +Instead of saying that something has **public** visibility, we usually +just say that it's public. In Java, only top-level and member-level declarations +are allowed to be public. Things that are public are considered +to be the most visible; they are **always visible**. + +=============== ========== ============ =========== ========= +Visibility Visible From +--------------- ------------------------------------------------ +Name Same Class Same Package Child Class Elsewhere +=============== ========== ============ =========== ========= +public |Y| |Y| |Y| |Y| +=============== ========== ============ =========== ========= + +* In Java, the ``public`` modifier must be included in a declararion for + it to be considered public by the compiler. +* In UML, the ``+`` symbol is used just before a member's identifier to + illustrate that it's public. It is also common practice to assume + that a class in a UML class diagram is public if no visibility + symbol is included. +* The ``javadoc`` program includes public declarations in a + documentation website by default. If you want ``javadoc`` + to only include public declarations, then the ``-public`` + command-line argument can be used. + Private Visibility ****************** From 3c059b0bfce66b2832081e0cb2c60ae64b56f364 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 17 Sep 2022 00:34:31 -0400 Subject: [PATCH 080/212] Update public-and-private.rst --- visibility/public-and-private.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/public-and-private.rst b/visibility/public-and-private.rst index 3b0b49ed..292879b5 100644 --- a/visibility/public-and-private.rst +++ b/visibility/public-and-private.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202022-purple - :alt: Approved for: Spring 2022 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen + :alt: Approved for: Fall 2022 .. external links .. |jls11_access_control| replace:: The Java Language Specification (JLS) 11 Section 6.6 From 936311a3ad36eb7ea254acfd88d113c8524180b8 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 17 Sep 2022 00:34:49 -0400 Subject: [PATCH 081/212] Update visibility.rst --- visibility/visibility.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/visibility.rst b/visibility/visibility.rst index 9ff0b888..2257072c 100644 --- a/visibility/visibility.rst +++ b/visibility/visibility.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202022-purple - :alt: Approved for: Spring 2022 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen + :alt: Approved for: Fall 2022 .. external links .. |uml_tutorial| replace:: UML Class Diagrams From 16a4c9bf162b25e61171c40df06392276d77d780 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 17 Sep 2022 00:35:05 -0400 Subject: [PATCH 082/212] Update package-private.rst --- visibility/package-private.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/package-private.rst b/visibility/package-private.rst index ebdfc0f5..74904be0 100644 --- a/visibility/package-private.rst +++ b/visibility/package-private.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202022-purple - :alt: Approved for: Spring 2022 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen + :alt: Approved for: Fall 2022 Visibility Reading ################## From 715f15562e05c74e7ff1b7c791cf884f5a1cde8e Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 17 Sep 2022 00:35:17 -0400 Subject: [PATCH 083/212] Update protected.rst --- visibility/protected.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/protected.rst b/visibility/protected.rst index ccc2b7ca..e4fe2148 100644 --- a/visibility/protected.rst +++ b/visibility/protected.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202022-purple - :alt: Approved for: Spring 2022 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen + :alt: Approved for: Fall 2022 Visibility Reading ################## From 7bde465dc3e397461a87a97bb6a7d037f824a823 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 17 Sep 2022 00:41:47 -0400 Subject: [PATCH 084/212] Update visibility.rst --- visibility/visibility.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visibility/visibility.rst b/visibility/visibility.rst index 2257072c..011457c9 100644 --- a/visibility/visibility.rst +++ b/visibility/visibility.rst @@ -3,7 +3,7 @@ .. external links .. |uml_tutorial| replace:: UML Class Diagrams -.. _uml_tutorial: https://github.com/cs1302uga/cs1302-tutorials/blob/master/uml/uml.md +.. _uml_tutorial: https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/uml/uml.md .. internal links .. |reading_private| replace:: Private Visibility From 59548f6201e69e4557a62a028ba3451b93584adb Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 17 Sep 2022 00:44:03 -0400 Subject: [PATCH 085/212] Update visibility.rst --- visibility/visibility.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visibility/visibility.rst b/visibility/visibility.rst index 011457c9..79d81820 100644 --- a/visibility/visibility.rst +++ b/visibility/visibility.rst @@ -89,7 +89,7 @@ public ``public`` ``+`` |Y| |Y| } // Person In this tutorial, we cover each available visibility option with a few examples, -often illustrated using a combination of `UML diagrams `__ and code +often illustrated using a combination of `UML diagrams `__ and code snippets. We will take some liberties when discussing examples involving multiple From 670efcd5426ce3c3599ff65d85225c1823023517 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 20 Sep 2022 23:44:04 -0400 Subject: [PATCH 086/212] Update scripts.md --- scripts/scripts.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/scripts.md b/scripts/scripts.md index 7fdd6f9f..34a7eaea 100644 --- a/scripts/scripts.md +++ b/scripts/scripts.md @@ -81,8 +81,13 @@ terminal shell. Let's create one! ``` 1. From the terminal shell itself, use the `chmod` command to enable - user execute permission for `cs1302-script.sh`. Verify that change - using `ls -l` or `stat`. + user execute permission for `cs1302-script.sh`: + + ``` + chmod u+x cs1302-script.sh + ``` + +1. Verify that the permissions are changed using `ls -l` or `stat`. 1. Execute the script. To do this simple provide an absolute path to the script name or an abbreviated absolute path using the `.` From 7c0ccbe32881346cef71489fa1c5f8ec10f35f31 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 26 Sep 2022 21:44:20 -0400 Subject: [PATCH 087/212] Update adt-and-links.md --- adt-and-links/adt-and-links.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adt-and-links/adt-and-links.md b/adt-and-links/adt-and-links.md index 7915bbd1..6c61bab9 100644 --- a/adt-and-links/adt-and-links.md +++ b/adt-and-links/adt-and-links.md @@ -1,6 +1,6 @@ # ADTs and Lists Tutorial -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) ## Introduction From 76a27487298bf551252821761ca640972a390af9 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 27 Sep 2022 21:36:34 -0400 Subject: [PATCH 088/212] Update package-private.rst --- visibility/package-private.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visibility/package-private.rst b/visibility/package-private.rst index 74904be0..4879de55 100644 --- a/visibility/package-private.rst +++ b/visibility/package-private.rst @@ -122,7 +122,7 @@ Example 2 In this example, we'll see how package private visibility can be used at the member-level for access control. Suppose a factory has a contract with a store to -produce some product. Throughout the year, the store mfay need to request +produce some product. Throughout the year, the store may need to request changes to its contract based on sales, buyer interest, etc. The driver program on the factory's side should be able to access methods to request, approve, and deny contract-related changes; however, the overall class design From b58d9451094f0c3bd928e48a686599ad361bd6e4 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 4 Oct 2022 00:43:38 -0400 Subject: [PATCH 089/212] Update generic-classes.md --- generics/generic-classes/generic-classes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generics/generic-classes/generic-classes.md b/generics/generic-classes/generic-classes.md index e4ff6e1c..ed8391d8 100644 --- a/generics/generic-classes/generic-classes.md +++ b/generics/generic-classes/generic-classes.md @@ -1,6 +1,6 @@ # Generic Classes Tutorial -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) This tutorial introduces the reader to generic classes in Java by creating a new generic class and emphasizing some of the benefits of using generics. From 4e31651c19b636dc6e7cb2200ebe296fa15c485e Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 4 Oct 2022 00:54:11 -0400 Subject: [PATCH 090/212] Update generic-methods.md --- generics/generic-methods/generic-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generics/generic-methods/generic-methods.md b/generics/generic-methods/generic-methods.md index f2407319..01b0ea8b 100644 --- a/generics/generic-methods/generic-methods.md +++ b/generics/generic-methods/generic-methods.md @@ -1,6 +1,6 @@ # Generic Methods Reading -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) This reading introduces the reader to generic methods in Java. From fe3d6d1a71709ebff12ecb70e22bed3d56dfb99b Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 5 Oct 2022 11:56:54 -0400 Subject: [PATCH 091/212] Update generic-classes.md --- generics/generic-classes/generic-classes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generics/generic-classes/generic-classes.md b/generics/generic-classes/generic-classes.md index ed8391d8..03711236 100644 --- a/generics/generic-classes/generic-classes.md +++ b/generics/generic-classes/generic-classes.md @@ -50,7 +50,7 @@ https://youtu.be/m539u1hGP7E Generic Method Example -## Required Additional Reading +## Recommended Additional Reading with More Examples Now that you're familiar with some of the basic concepts relate to generic methods in Java, you need to read the official Oracle reading: From 6ff9993b186de83333a08d2a7ea403a788aa89b1 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 5 Oct 2022 11:57:25 -0400 Subject: [PATCH 092/212] Update generic-methods.md --- generics/generic-methods/generic-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generics/generic-methods/generic-methods.md b/generics/generic-methods/generic-methods.md index 01b0ea8b..32c133e7 100644 --- a/generics/generic-methods/generic-methods.md +++ b/generics/generic-methods/generic-methods.md @@ -99,7 +99,7 @@ Here are some examples: Integer int2 = sc.foo(12, "help"); // R = String ``` -## Required Additional Reading +## Recommended Additional Reading with More Examples Now that you're familiar with some of the basic concepts relate to generic methods in Java, you need to read the official Oracle reading: From 8e77b7870d59bc9ae65994797f88365c52806760 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 11 Oct 2022 21:29:53 -0400 Subject: [PATCH 093/212] Update lambda.rst --- lambda/lambda.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda/lambda.rst b/lambda/lambda.rst index 746a500a..c6dd2150 100644 --- a/lambda/lambda.rst +++ b/lambda/lambda.rst @@ -1,6 +1,6 @@ .. rst setup .. sectnum:: -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202022-purple +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen .. copyright and license information .. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN .. |copyright| replace:: Copyright |copy| Michael E. Cotterell, Bradley J. Barnes, and the University of Georgia. From ba9df62e85ab3dc43941bf62576b3e8de9433c8e Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 11 Oct 2022 21:30:23 -0400 Subject: [PATCH 094/212] Update lambda.rst --- lambda/lambda.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda/lambda.rst b/lambda/lambda.rst index c6dd2150..210566d9 100644 --- a/lambda/lambda.rst +++ b/lambda/lambda.rst @@ -366,4 +366,4 @@ four (unnamed) classes are created and instantiated using a single Video Examples ============== -**Coming Soon** +**Coming Soon** Attend class for live examples. From dcaef77e30b6be72f402bc0e3145d521b0471014 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Thu, 13 Oct 2022 07:00:52 -0400 Subject: [PATCH 095/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index 71276d16..4ebfec37 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -196,6 +196,24 @@ Access to Odin is restricted behind a firewall. In order to access Odin from off will need to connect to UGA's remote access VPN using the instructions found `here `_. +Important Note +++++++++++++++ + +For CSCI 1302, you are expected to connect to Odin using SSH and the programs +desribed in the instructions provided by your instructor. While other programs may exist +that also allow you to establish an SSH connection to Odin, use of certain programs +is explicitly forbidden in CSCI 1302 since they consume large amounts of remote system +resources, disrupting other students' use of the system. +You should NOT use any of the following programs to connect to Odin: + +* `Video Studio Code Remote Development Extension `_ +* `code-server `_ + +Using the programs mentioned above or programs like the ones mentioned above +without permission violates sections 4.2 and 4.3 of the +`UGA Policies on the Use of Computers `_. + + ``ssh`` +++++++ From 9f725771aabf12605ea101ef9902517b83843e9c Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 19 Oct 2022 00:26:36 -0400 Subject: [PATCH 096/212] Update javafx.md --- javafx/javafx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javafx/javafx.md b/javafx/javafx.md index 1c059381..b7b05b8b 100644 --- a/javafx/javafx.md +++ b/javafx/javafx.md @@ -1,6 +1,6 @@ # JavaFX Starter Tutorial -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) JavaFX is a library for creating and delivering applications with graphical user interfaces (GUIs) in Java. In this tutorial, we will use JavaFX 17 along with Java 17. The API documentation for From 901cb506fc43570972f95c8041c017075f02a8de Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 20 Oct 2022 17:25:55 -0400 Subject: [PATCH 097/212] Update lambda.rst --- lambda/lambda.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lambda/lambda.rst b/lambda/lambda.rst index 210566d9..a6e51682 100644 --- a/lambda/lambda.rst +++ b/lambda/lambda.rst @@ -222,7 +222,7 @@ Let's break it down: 2. A lambda expression is used to **create an object** that has one method by defining what that method should do. In this case, we want the - method's type layout o match the abstract method ``accept`` in + method's type layout to match the abstract method ``accept`` in ``Consumer``, and it does. 3. Assign the object's reference to the variable. @@ -291,7 +291,7 @@ however, there's still room for improvement. If we don't include the parameter types in our lambda expression, then Java will try to determine what they are based on context. For example, if we're assigning the created object to a ``Consumer`` variable, - then Java knows that the parameter list for ``aceppt`` is ``(String t)`` + then Java knows that the parameter list for ``accept`` is ``(String t)`` and will automatically convert ``(t)`` to ``(String t)``. 3. If there is exactly one method parameter, then the parentheses for the From 5c5545870228441bb7af03baf5149b5893270615 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 23 Oct 2022 00:44:41 -0400 Subject: [PATCH 098/212] Update javafx.md --- javafx/javafx.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/javafx/javafx.md b/javafx/javafx.md index b7b05b8b..753c5f22 100644 --- a/javafx/javafx.md +++ b/javafx/javafx.md @@ -23,8 +23,8 @@ page for direct links to commonly used classes. If you encounter problems in this step, then please ensure that you have followed the instructions provided at the beginning of the semester for - [MacOS users](https://github.com/cs1302uga/cs1302-exercises/blob/master/misc/MacOS.md) or - [Windows 10 users](https://github.com/cs1302uga/cs1302-exercises/blob/master/misc/Windows10.md). + [MacOS users](https://github.com/cs1302uga/cs1302-exercises/blob/alsi/misc/MacOS.md) or + [Windows 10 users](https://github.com/cs1302uga/cs1302-exercises/blob/alsi/misc/Windows10.md). Also, the `-X` and `-Y` options can be used individually with or without each other. See the manual page for `ssh` for more information about the differences between @@ -115,7 +115,7 @@ page for direct links to commonly used classes. or second time that you attempt to run the program, then please ensure that you have followed the instructions provided at the beginning of the semester for - [MacOS users](https://github.com/cs1302uga/cs1302-exercises/blob/master/misc/MacOS.md). + [MacOS users](https://github.com/cs1302uga/cs1302-exercises/blob/alsi/misc/MacOS.md). In particular, you really do need to restart your Mac after installing XQuartz via Homebrew. From af02d0516ce550d52dc8e2842934920097346f2c Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 23 Oct 2022 00:46:16 -0400 Subject: [PATCH 099/212] Update javafx.md --- javafx/javafx.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/javafx/javafx.md b/javafx/javafx.md index 753c5f22..c7810f48 100644 --- a/javafx/javafx.md +++ b/javafx/javafx.md @@ -23,8 +23,8 @@ page for direct links to commonly used classes. If you encounter problems in this step, then please ensure that you have followed the instructions provided at the beginning of the semester for - [MacOS users](https://github.com/cs1302uga/cs1302-exercises/blob/alsi/misc/MacOS.md) or - [Windows 10 users](https://github.com/cs1302uga/cs1302-exercises/blob/alsi/misc/Windows10.md). + [MacOS users](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/setup/MacOS.md) or + [Windows 10 users](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/setup/Windows.md). Also, the `-X` and `-Y` options can be used individually with or without each other. See the manual page for `ssh` for more information about the differences between @@ -115,7 +115,7 @@ page for direct links to commonly used classes. or second time that you attempt to run the program, then please ensure that you have followed the instructions provided at the beginning of the semester for - [MacOS users](https://github.com/cs1302uga/cs1302-exercises/blob/alsi/misc/MacOS.md). + [MacOS users](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/setup/MacOS.md). In particular, you really do need to restart your Mac after installing XQuartz via Homebrew. From 5d447a09fa8344bb61144854c5d797da921dbea7 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Fri, 28 Oct 2022 18:15:02 -0400 Subject: [PATCH 100/212] Update components.md --- components/components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/components.md b/components/components.md index 223ca1df..ee9eef93 100644 --- a/components/components.md +++ b/components/components.md @@ -1,6 +1,6 @@ # JavaFX Custom Component Tutorial -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) JavaFX is a library for creating and delivering applications with graphical user interfaces (GUIs) in Java. In this tutorial, we will use JavaFX 17. The API documentation for From c69e6b30530645f0195d6422c6203c3c785708d1 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Fri, 28 Oct 2022 18:23:34 -0400 Subject: [PATCH 101/212] Update ImageApp.java --- components/src/cs1302/gui/ImageApp.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/components/src/cs1302/gui/ImageApp.java b/components/src/cs1302/gui/ImageApp.java index 508c52ce..972e2fe5 100644 --- a/components/src/cs1302/gui/ImageApp.java +++ b/components/src/cs1302/gui/ImageApp.java @@ -14,7 +14,7 @@ import javafx.scene.layout.Priority; /** - * A basic JavaFX 8 program which takes a user specified URL and loads it + * A basic JavaFX 17 program which takes a user specified URL and loads it * into an {@code ImageView}. * */ @@ -69,9 +69,10 @@ public void start(Stage stage) { imgView = new ImageView(img); imgView.setPreserveRatio(true); - // EventHandler for our button using a fancy method reference. - //EventHandler loadImgHandler = this::loadImage; - loadImage.setOnAction(this::loadImage); + // EventHandler for our button + EventHandler handler = (ActionEvent e) -> loadImage(e); + // Connect the handler to the button + loadImage.setOnAction(handler); // Add the hbox and imageview to the containing vbox and set the vbox // to be the root of the scene From d588c22a5bfd6f358fc3ded875dac55a54138c25 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Fri, 28 Oct 2022 18:26:48 -0400 Subject: [PATCH 102/212] Update components.md --- components/components.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/components.md b/components/components.md index ee9eef93..e7177c0c 100644 --- a/components/components.md +++ b/components/components.md @@ -26,8 +26,8 @@ using inheritance and polymorphism to emphasize code reuse. If you encounter problems in this step, then please ensure that you have followed the instructions provided at the beginning of the semester for - [MacOS users](https://github.com/cs1302uga/cs1302-exercises/blob/master/misc/MacOS.md) or - [Windows 10 users](https://github.com/cs1302uga/cs1302-exercises/blob/master/misc/Windows10.md). + [MacOS users](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/setup/MacOS.md) or + [Windows 10 users](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/setup/Windows.md). Also, the `-X` and `-Y` options can be used individually with or without each other. See the manual page for `ssh` for more information about the differences between @@ -50,14 +50,14 @@ using inheritance and polymorphism to emphasize code reuse. ``` 1. Compile and run the provided code without any errors or warnings. If you need a reminder of the compile commands, review - the relevant parts of the [JavaFX Tutorial](https://github.com/cs1302uga/cs1302-tutorials/blob/master/javafx/javafx.md). + the relevant parts of the [JavaFX Tutorial](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/javafx/javafx.md). We recommend creating a compile script so you don't have to retype these commands. If you completed the previous steps correctly, your app should look similar to the screenshot below. You may also find it helpful to review the scene graph for this app (also seen below). -
    +
                                         --|
                              Stage            |
                                |              |
    
    From ca8fb7fcf894a5361bcbd0c624d139a457d07ac0 Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Fri, 28 Oct 2022 18:27:31 -0400
    Subject: [PATCH 103/212] Update components.md
    
    ---
     components/components.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/components/components.md b/components/components.md
    index e7177c0c..2c2f667f 100644
    --- a/components/components.md
    +++ b/components/components.md
    @@ -221,7 +221,7 @@ using inheritance and polymorphism to emphasize code reuse.
        1. Compile and run your new app and load up a few 500x500 images.  You 
           should see something like the image below:
           
    -      
    +      
           
        1. Imagine all the ways you could use your new, custom component! Also, think
           of other custom components you could build by extending existing JavaFX
    
    From f9a70c0093f12551b595ff028bd9d6bf17115ad2 Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Fri, 28 Oct 2022 18:42:24 -0400
    Subject: [PATCH 104/212] Update components.md
    
    ---
     components/components.md | 2 --
     1 file changed, 2 deletions(-)
    
    diff --git a/components/components.md b/components/components.md
    index 2c2f667f..55628a75 100644
    --- a/components/components.md
    +++ b/components/components.md
    @@ -77,8 +77,6 @@ using inheritance and polymorphism to emphasize code reuse.
     1. The default size for the image in the ImageView container is 500x500 (Even though the image says 300x300). 
        Do a quick google search for "500x500 images" and load one or two of the images to make sure the app is 
        functioning properly. **Note:** the `Image` class only supports the BMP, GIF, JPEG, and PNG filetypes.
    -
    -1. Congratulations on compiling and running a good looking app!
        
     ## Creating a Custom Component
     
    
    From 4eb92548be8310b54ff7c6d6051aa84e09a2fbe0 Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Fri, 28 Oct 2022 18:57:58 -0400
    Subject: [PATCH 105/212] Update components.md
    
    ---
     components/components.md | 46 +++++++++++++++++++++++-----------------
     1 file changed, 27 insertions(+), 19 deletions(-)
    
    diff --git a/components/components.md b/components/components.md
    index 55628a75..416f629c 100644
    --- a/components/components.md
    +++ b/components/components.md
    @@ -86,7 +86,7 @@ using inheritance and polymorphism to emphasize code reuse.
        reusable component based on the set of existing components contained 
        in the application.
        
    -   Consider the following containment hieararchy:
    +   Consider the following containment hierarchy:
        
        ```
                                                                  --|
    @@ -161,14 +161,14 @@ using inheritance and polymorphism to emphasize code reuse.
        1. The class should contain the `static` constants from
           the `ImageApp` class. They can be cut and paste directly
           from that class, perhaps changing them to `protected`
    -      visibility if you wish to do so.
    -
    -   1. Your class should have instance variables for the other
    -      nodes in the sub-graph (make sure to import all required classes). 
    -      For example, you will need
    -      an instance variable called `urlLayer` of type `HBox`
    -      as well as instance variables for the remaining nodes.
    -      For the most part, these can be cut and paste from the
    +      visibility if you wish to do so. That way they can be accessed
    +      by the other classes in the package.
    +
    +   1. Your `ImageLoader` class should contain instance variables for the
    +      nodes in the sub-graph above (`HBox`, `TextField`, `Button`, and `ImageView`).
    +      You do not need an instance variable for `VBox` because the `ImageLoader` itself
    +      is a `VBox`!
    +      For the most part, the required instance variables can be cut and paste from the
           `ImageApp` class. Any instance variables that you move
           into the `ImageLoader` class can be removed from `ImageApp`. You can
           also remove any imports that are no longer needed in `ImageApp`.
    @@ -182,7 +182,9 @@ using inheritance and polymorphism to emphasize code reuse.
           Use this knowledge to add your newly created nodes to the
           sub-graph rooted at `this` similar to how they are 
           added to the `VBox` node in the `ImageApp` class. 
    -      Your code will likely look something like this:
    +      Your code will likely look something like the code below with 
    +      additional statements to instantiate the components and connect
    +      them:
     	  
           ```java
           public ImageLoader() {
    @@ -193,23 +195,29 @@ using inheritance and polymorphism to emphasize code reuse.
           } // ImageLoader
     	  ```
     	  
    -   1. If you haven't done so already, remove the code to create the subgraph
    -      (`HBox`, `ImageView`, `TextField`, and `Button`) from the `start` method 
    -      of `ImageApp`. All of that code will be run when we create a new `ImageLoader`
    +   1. Remove the code to create the subgraph
    +      (`HBox`, `ImageView`, `TextField`, and `Button`) from the constructor and `init` methods
    +      of `ImageApp`. All of that code will now be run when we create a new `ImageLoader`
           object.
           
    -   1. Move the `loadImage` method from `ImageApp` to `ImageLoader`.
    -      Don't forget to set the handler on your `ImageLoader`'s button.
    +   1. Take a moment to think about what you are doing. You have created your own, custom class that extends
    +      the JavaFX `VBox` class. This class is essentially a `VBox` with some of the components
    +      built into it. Once we complete this class, we will be able to add objects of this class to a
    +      scene graph and all the messy details of creating that object will be hidden inside of `ImageLoader`!
    +      
    +   1. Now, move the `loadImage` method from `ImageApp` to `ImageLoader`. This is the method that is
    +      called when the button is clicked. Don't forget to set the handler on your `ImageLoader`'s button.
           
        1. You've probably noticed that `ImageApp` has significantly decreased
           in size.  We moved a lot of that code over into our custom component!
    -      Now, instantiate two objects of type `ImageLoader` within the `start`
    -      method of `ImageApp`.
    +      Now, instantiate two objects of type `ImageLoader` within the constructor
    +      of `ImageApp`.
           
    -   1. Instantiate an `HBox` object within the `start` method of `ImageApp`. This
    +   1. Instantiate an `HBox` object within the constructor of `ImageApp`. This
           will serve as the container for our `ImageLoader` objects. Set
           the `spacing` property of the `HBox` to 10 by passing 10 into the `HBox`
    -      constructor. Now, Add the two `ImgLoader` objects to the `HBox` object of `ImageApp`.
    +      constructor. Now, in the `init` method, add the two `ImgLoader` objects to 
    +      the `HBox` object of `ImageApp`.
           
        1. Make sure you pass the reference to your newly created `HBox` object into the
           `Scene` constructor within the `start` method of `ImageApp`. Previously, the 
    
    From a154a42c519d014cec511077b05859eaa4473418 Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Fri, 28 Oct 2022 19:08:34 -0400
    Subject: [PATCH 106/212] Update components.md
    
    ---
     components/components.md | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/components/components.md b/components/components.md
    index 416f629c..508019ee 100644
    --- a/components/components.md
    +++ b/components/components.md
    @@ -198,7 +198,7 @@ using inheritance and polymorphism to emphasize code reuse.
        1. Remove the code to create the subgraph
           (`HBox`, `ImageView`, `TextField`, and `Button`) from the constructor and `init` methods
           of `ImageApp`. All of that code will now be run when we create a new `ImageLoader`
    -      object.
    +      object. This includes the code to initialize the `ImageView` and set up the button handler.
           
        1. Take a moment to think about what you are doing. You have created your own, custom class that extends
           the JavaFX `VBox` class. This class is essentially a `VBox` with some of the components
    @@ -213,7 +213,8 @@ using inheritance and polymorphism to emphasize code reuse.
           Now, instantiate two objects of type `ImageLoader` within the constructor
           of `ImageApp`.
           
    -   1. Instantiate an `HBox` object within the constructor of `ImageApp`. This
    +   1. Create an `HBox` instance variable in the `ImageApp` class and instantiate 
    +      it within the constructor. This
           will serve as the container for our `ImageLoader` objects. Set
           the `spacing` property of the `HBox` to 10 by passing 10 into the `HBox`
           constructor. Now, in the `init` method, add the two `ImgLoader` objects to 
    
    From d62561616d913c46181167b6f9390655bdbc2390 Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Fri, 28 Oct 2022 19:09:35 -0400
    Subject: [PATCH 107/212] Update ImageDriver.java
    
    ---
     components/src/cs1302/gui/ImageDriver.java | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/components/src/cs1302/gui/ImageDriver.java b/components/src/cs1302/gui/ImageDriver.java
    index f84e5ae8..853e1970 100644
    --- a/components/src/cs1302/gui/ImageDriver.java
    +++ b/components/src/cs1302/gui/ImageDriver.java
    @@ -9,6 +9,7 @@ public static void main(String[] args) {
                 Application.launch(ImageApp.class, args);
             } catch (Exception e) {
                 System.err.println(e);
    +            e.printStackTrace();
                 System.err.println("Likely due to X11 timeout. Logout and log back in...");
                 System.exit(1);
             } // try
    
    From f90ecf0847e4a567f8bd63e4a3fe5e3bab496465 Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Fri, 28 Oct 2022 19:12:02 -0400
    Subject: [PATCH 108/212] Updated ImageApp to use methods from JavaFX
     lifecycle.
    
    ---
     components/src/cs1302/gui/ImageApp.java | 108 ++++++++++++++----------
     1 file changed, 64 insertions(+), 44 deletions(-)
    
    diff --git a/components/src/cs1302/gui/ImageApp.java b/components/src/cs1302/gui/ImageApp.java
    index 972e2fe5..4bc67d1d 100644
    --- a/components/src/cs1302/gui/ImageApp.java
    +++ b/components/src/cs1302/gui/ImageApp.java
    @@ -14,22 +14,19 @@
     import javafx.scene.layout.Priority;
     
     /**
    - * A basic JavaFX 17 program which takes a user specified URL and loads it
    + * A basic JavaFX 8 program which takes a user specified URL and loads it
      * into an {@code ImageView}.
      *
      */
     public class ImageApp extends Application {
     
    -    Stage stage;
    -    Scene scene;
    -
         /** The root container for the application scene graph */
         VBox vbox;
     
         /** The container for the url textfield and the load image button */
         HBox urlLayer;
    -    TextField urlField;
    -    Button loadImage;
    +    TextField url;
    +    Button loadButton;
     
         /** The container for the loaded image */
         ImageView imgView;
    @@ -42,67 +39,90 @@ public class ImageApp extends Application {
         private static final int DEF_HEIGHT = 500;
         private static final int DEF_WIDTH = 500;
     
    +    public ImageApp() {
    +        System.out.println("2) Creating an instance of the ImageApp Application");
    +
    +        // Initialize the instance variables
    +        vbox = new VBox();
    +        urlLayer = new HBox(8);
    +        imgView = new ImageView();
    +        loadButton = new Button("Load");
    +        url = new TextField("https://");
    +    } // ImageApp
    +
    +        @Override
    +    public void init() {
    +        System.out.println("3) Executing the init method");
    +
    +        // Connect the components in the scene graph
    +        vbox.getChildren().addAll(urlLayer, imgView);
    +        urlLayer.getChildren().addAll(url, loadButton);
    +        HBox.setHgrow(url, Priority.ALWAYS);
    +        // load the default image
    +        Image defaultImage = new Image(DEFAULT_IMG);
    +
    +        // add the image to the imageview
    +        imgView.setImage(defaultImage);
    +
    +        // Create the handler for our button using an anonymous class.
    +        // This approach isn't used but it is left in so students can
    +        // compare with the lambda below.
    +        /*
    +        EventHandler mouseClickHandler = new EventHandler() {
    +                @Override
    +                public void handle(ActionEvent e) {
    +                    this.loadImage(e);
    +                } // handle
    +            };
    +        */
    +
    +        // Create the handler for our button using a lambda expression.
    +        // This is a more concise than using an anonymous class but it
    +        // accomplishes the same goal.
    +        EventHandler mouseClickHandler = (ActionEvent e) -> {
    +            this.loadImage(e);
    +        };
    +
    +        loadButton.setOnAction(mouseClickHandler);
    +    } // init
    +
         /**
          * The entry point for our image viewer application.
          *
          * @param stage A reference to the stage object (window) created by the system.
    -     */ 
    +     */
         public void start(Stage stage) {
    -        this.stage = stage;
    -        
    -        // Initializing the nodes for the scene graph
    -        vbox = new VBox();
    -        urlLayer = new HBox(10);
    -        urlField = new TextField("https://");
    -        loadImage = new Button("Load");
    -
    -        // Adding the textfield and load image button the the containing hbox
    -        urlLayer.getChildren().addAll(urlField, loadImage);
    -
    -        // Sets the textfield to grow, as necessary, to fill the hbox
    -        HBox.setHgrow(urlField, Priority.ALWAYS);
    +        System.out.println("4) Executing the start method");
     
    -        // Load the default image with the default dimensions
    -        Image img = new Image(DEFAULT_IMG, DEF_HEIGHT, DEF_WIDTH, false, false);
    -
    -        // Add the image to its container and preserve the aspect ratio if resized
    -        imgView = new ImageView(img);
    -        imgView.setPreserveRatio(true);
    -
    -        // EventHandler for our button                                                                    
    -        EventHandler handler = (ActionEvent e) -> loadImage(e);
    -        // Connect the handler to the button                                                              
    -        loadImage.setOnAction(handler);
    -
    -        // Add the hbox and imageview to the containing vbox and set the vbox
    -        // to be the root of the scene
    -        vbox.getChildren().addAll(urlLayer, imgView);
    -        scene = new Scene(vbox);
    +        // Add the root of the scene graph to the stage.
    +        Scene scene = new Scene(vbox);
     
             // Set up the stage and set it to be visible
    -        // stage.setResizable(false);
             stage.setScene(scene);
             stage.setTitle("1302 Image Viewer!");
             stage.sizeToScene();
             stage.show();
    -        
         } // start
     
         /**
          * Students will provide javadoc comments here.
          *
          * @param e source event
    -     */ 
    +     */
         private void loadImage(ActionEvent e) {
    -
             try {
    -            Image newImg = new Image(urlField.getText(), DEF_HEIGHT, DEF_WIDTH, false, false);
    +            Image newImg = new Image(url.getText(), DEF_HEIGHT, DEF_WIDTH, false, false);
                 imgView.setImage(newImg);
             } catch(IllegalArgumentException iae) {
                 System.out.println("The supplied URL is invalid");
             } // try
    -        
         } // loadImage
    -    
    -} // ImageApp
     
    +    @Override
    +    public void stop() {
    +        // Won't be used by us. Typically used for application cleanup.
    +
    +        System.out.println("6) Executing the stop method");
    +    } // stop
    +
    +} // ImageApp
    
    From cee3897e449d93cea8452eaaa22cd7d9d119a892 Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Fri, 28 Oct 2022 19:17:34 -0400
    Subject: [PATCH 109/212] Updated setup script to pull code from alsi branch
    
    ---
     components/setup.sh | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/components/setup.sh b/components/setup.sh
    index ab83aa9f..ff46ca72 100644
    --- a/components/setup.sh
    +++ b/components/setup.sh
    @@ -1,11 +1,11 @@
     #!/bin/bash
    -
    +1;95;0c
     TUTNAME="components"
     DIR="cs1302-$TUTNAME"
     if [ ! -d $DIR ]; then
       git clone --depth 1 --no-checkout https://github.com/cs1302uga/cs1302-tutorials.git $DIR
       cd $DIR
    -  git checkout master -- $TUTNAME
    +  git checkout alsi -- $TUTNAME
       rm -f $TUTNAME/setup.sh
       mv $TUTNAME/* ./
       mv $TUTNAME/.gitignore ./
    @@ -20,4 +20,4 @@ if [ ! -d $DIR ]; then
       echo "subdirectory $DIR successfully created"
     else
       >&2 echo "subdirectory $DIR already exists"
    -fi  
    +fi
    
    From deebb7a156dfe04d206c208f242d11f661edb220 Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Fri, 28 Oct 2022 19:19:04 -0400
    Subject: [PATCH 110/212] Changed branch back to master in setup script
    
    ---
     components/setup.sh | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/components/setup.sh b/components/setup.sh
    index ff46ca72..e44ae697 100644
    --- a/components/setup.sh
    +++ b/components/setup.sh
    @@ -5,7 +5,7 @@ DIR="cs1302-$TUTNAME"
     if [ ! -d $DIR ]; then
       git clone --depth 1 --no-checkout https://github.com/cs1302uga/cs1302-tutorials.git $DIR
       cd $DIR
    -  git checkout alsi -- $TUTNAME
    +  git checkout master -- $TUTNAME
       rm -f $TUTNAME/setup.sh
       mv $TUTNAME/* ./
       mv $TUTNAME/.gitignore ./
    
    From 88714bb9bf05633938477adb730f09a4ef89e81d Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Tue, 1 Nov 2022 23:57:04 -0400
    Subject: [PATCH 111/212] Update maven.md
    
    ---
     maven.md | 28 ++++++++++++++--------------
     1 file changed, 14 insertions(+), 14 deletions(-)
    
    diff --git a/maven.md b/maven.md
    index 7c8f74c1..233fed7a 100644
    --- a/maven.md
    +++ b/maven.md
    @@ -1,6 +1,6 @@
     # Maven Tutorial
     
    -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) 
    +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen)
     
     ## Maven
     
    @@ -27,16 +27,16 @@ $ mvn --version
     It should print out your installed version of Maven, for example:
      
     ```
    -Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
    +Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
     Maven home: /usr/local/mepcott/cs1302/apache-maven
    -Java version: 11.0.10, vendor: Oracle Corporation, runtime: /usr/local/mepcott/jdk/jdk-11.0.10
    +Java version: 17.0.4.1, vendor: Oracle Corporation, runtime: /usr/local/mepcott/jdk/jdk-17.0.4.1
     Default locale: en_US, platform encoding: UTF-8
    -OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
    +OS name: "linux", version: "3.10.0-1160.42.2.el7.x86_64", arch: "amd64", family: "unix"
     ```
     
     If you are on Odin and the `mvn` command is not recognized, then please
     ensure that you have setup the CSCI 1302 shell profile according to the
    -instructions provided [here](https://github.com/cs1302uga/cs1302-tutorials/blob/master/unix/unix-tutorial.rst#bash-profile).
    +instructions provided [here](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/unix/unix-getting-started.rst#75bash_profile-required-command).
        
     ## Creating a Project
     
    @@ -124,21 +124,21 @@ mode later in this tutorial once you are more familiar with the tool.
     ## Updating the POM
     
     By default, the `maven-archetype-quickstart` archetype (version `1.4`) is configured
    -to use Java 7 (`1.7`)! We can remedy this by updating the project's `pom.xml` file.
    +to use Java 7 (`1.7`)! We can remedy this by updating the project's `pom.xml` file using Emacs.
     
     1. Change into the `cs1302-mvn` directory, then change the values of the
    -   `maven.compiler.source` and `maven.compiler.target` to `11` for Java 11. It should look
    +   `maven.compiler.source` and `maven.compiler.target` to `17` for Java 17. It should look
        similar to the following:
        
        ```xml
        
          UTF-8
    -     11
    -     11
    +     17
    +     17
        
        ```
        
    -   That's it! After making that change, your project is now setup to use Java 11.
    +   That's it! After making that change, your project is now setup to use Java 17.
     
     1. You can also add / update project dependencies. In the past, you may have done this
        by manually including a JAR file on your class path. With Maven, we can add the 
    @@ -162,7 +162,7 @@ to use Java 7 (`1.7`)! We can remedy this by updating the project's `pom.xml` fi
        with appropriate values before the closing `` tag. Many libraries are packages
        for Maven. You can try searching for some on [Maven Central](https://search.maven.org/).
        
    -1. When using Maven with your JavaFX projects, you would need to add the JavaFX 11 dependency to your
    +1. When using Maven with your JavaFX projects, you would need to add the JavaFX 17 dependency to your
        `pom.xml` file. Adding this dependency to the existing `junit` dependency would look like this:
        
        ```xml
    @@ -174,9 +174,9 @@ to use Java 7 (`1.7`)! We can remedy this by updating the project's `pom.xml` fi
              test
           
           
    -         org.openjfx
    -         javafx-controls
    -         11
    +        org.openjfx
    +        javafx-controls
    +        17.0.2
           
        
        ```
    
    From 38b465dc3acf36ef8953b09bc347e381d8ee9be7 Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Tue, 1 Nov 2022 23:58:35 -0400
    Subject: [PATCH 112/212] Update brief-intro-threads.md
    
    ---
     threads/brief-intro-threads.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/threads/brief-intro-threads.md b/threads/brief-intro-threads.md
    index e7b03a7f..e3f0bee4 100644
    --- a/threads/brief-intro-threads.md
    +++ b/threads/brief-intro-threads.md
    @@ -1,6 +1,6 @@
     # Brief Introduction to Java Threads
     
    -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Spring%202022-purple) 
    +![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen)
     
     ## Prerequisites
     
    
    From 59e4663e5cb8b8bd660680663037bfd4dccd093a Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Wed, 4 Jan 2023 12:41:15 -0500
    Subject: [PATCH 113/212] Update MacOS.md
    
    ---
     setup/MacOS.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/setup/MacOS.md b/setup/MacOS.md
    index 0d32c201..3d4f6bfc 100644
    --- a/setup/MacOS.md
    +++ b/setup/MacOS.md
    @@ -1,6 +1,6 @@
     # Setup on macOS
     
    -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen)
    +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta)
     
     The following instructions are designed to help get you up and running with macOS for development
     in CSCI 1302. The majority of the time, you will not be developing directly on your Mac. Instead,
    
    From 13b7b3f57676db2eee4b6580b1b910413e51a792 Mon Sep 17 00:00:00 2001
    From: Brad Barnes 
    Date: Wed, 4 Jan 2023 12:41:34 -0500
    Subject: [PATCH 114/212] Update variables.md
    
    ---
     refresher/variables.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/refresher/variables.md b/refresher/variables.md
    index 66c2a648..cdbbd3b7 100644
    --- a/refresher/variables.md
    +++ b/refresher/variables.md
    @@ -1,6 +1,6 @@
     # Refresher: Reference Variables
     
    -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen)
    +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta)
     
     
    From 2b5162586e4be9099d4292291ae07cff99ea4ab0 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 4 Jan 2023 12:42:08 -0500 Subject: [PATCH 115/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index 4ebfec37..09c32acb 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -1,5 +1,5 @@ .. sectnum:: -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta ======================= Unix: Getting Started From 67a91b798771a515890f1a9a71f181889b89aae4 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 4 Jan 2023 12:42:48 -0500 Subject: [PATCH 116/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index ca6b7b3b..039a0fec 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -1,5 +1,5 @@ .. sectnum:: -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta ================ Unix: Tutorial From a8c880c90cec89ba09e97f701223dc320fbdfadf Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 9 Jan 2023 14:03:42 -0500 Subject: [PATCH 117/212] Update Windows.md --- setup/Windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/Windows.md b/setup/Windows.md index a911c6bb..13569b2d 100644 --- a/setup/Windows.md +++ b/setup/Windows.md @@ -1,6 +1,6 @@ # Setup on Windows 10 & 11 -![Approved for: Spring 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) The following instructions are designed to help get you up and running with a Windows 10 or 11 PC for development in CSCI 1302. The majority of the time, you will not be developing directly on From f495b9d919f089ab63b8818adb7291446fb5b86e Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 9 Jan 2023 14:06:29 -0500 Subject: [PATCH 118/212] Update Windows.md --- setup/Windows.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/setup/Windows.md b/setup/Windows.md index 13569b2d..8f6cc482 100644 --- a/setup/Windows.md +++ b/setup/Windows.md @@ -19,6 +19,11 @@ called [MobaXterm](https://mobaxterm.mobatek.net). extract the `.zip` file into a folder before attempting to install. Do not attempt to run the installer from within the `.zip` file. Instead, run the installer program from within the folder that you extract to. + **Note:** Your window may look slightly different than below. If you see "Extract All" instead of "Extract", go + ahead and click that button. You can choose the default location as the place to extract. It will likely use + your `Downloads` folder for the extracted files. Once it's extracted, you can double-click the installer to begin + the installation process. + ![WARNING](in-zip-file.png) MobaXterm Website: https://mobaxterm.mobatek.net/download-home-edition.html From edfc61afacef4bfb5674ebd945596a77250bf89f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 11 Jan 2023 22:22:02 -0500 Subject: [PATCH 119/212] Update emacs.md --- emacs/emacs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emacs/emacs.md b/emacs/emacs.md index 4d9985d3..4343442c 100644 --- a/emacs/emacs.md +++ b/emacs/emacs.md @@ -1,6 +1,6 @@ # Emacs Tutorial -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ![Emacs Welcome Screen](welcome.PNG) From 6bb54c52b002c2b57f9b9075cd75f05dc3dffce2 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 11 Jan 2023 22:24:06 -0500 Subject: [PATCH 120/212] Update packages1.md --- packages1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages1.md b/packages1.md index 949b131a..40a8c02e 100644 --- a/packages1.md +++ b/packages1.md @@ -1,6 +1,6 @@ # Java Packages Tutorial - Part 1 -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Prerequisites From 33a3488fd4ee0902b8f62a034aeada3380f378cd Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 11 Jan 2023 22:24:31 -0500 Subject: [PATCH 121/212] Update packages2.md --- packages2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages2.md b/packages2.md index cd7a34f8..63294265 100644 --- a/packages2.md +++ b/packages2.md @@ -1,6 +1,6 @@ # Java Packages Tutorial - Part 2 -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Prerequisites From 5e116974e2146714770fc6115dcabc246d3fd1b0 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 11 Jan 2023 22:25:19 -0500 Subject: [PATCH 122/212] Update octal-mode.md --- octal-mode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/octal-mode.md b/octal-mode.md index 6a01079d..87f6c9db 100644 --- a/octal-mode.md +++ b/octal-mode.md @@ -1,6 +1,6 @@ # Octal Mode -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Prerequisites From d654606c437932bb161f58ccd10395444cd0af57 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 11 Jan 2023 22:25:33 -0500 Subject: [PATCH 123/212] Update cla.md --- cla/cla.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cla/cla.md b/cla/cla.md index d9a91d42..0583cdaf 100644 --- a/cla/cla.md +++ b/cla/cla.md @@ -1,6 +1,6 @@ # Command-Line Arguments -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) When working in a Unix-like environment, programs are launched when the user enters the program's name into the shell (i.e., they type it in, then press From 3c7ddd6dca366bc93e13db697b63bfdf596641fb Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 14 Jan 2023 13:30:19 -0500 Subject: [PATCH 124/212] Update packages1.md --- packages1.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages1.md b/packages1.md index 40a8c02e..31643c97 100644 --- a/packages1.md +++ b/packages1.md @@ -292,6 +292,15 @@ Let's try it by placing the `HelloWorld` class into the `cs1302.hello` package! 7. Congratulations on compiling your code to a named package! **Don't delete your work** unless you want to work through the tutorial again for extra practice. The next tutorial will continue where this one left off. + ## Video Demo + + 1. Follow along with Dr. Barnes as he works through another example of creating a named package in Java: + + https://youtu.be/vuenX567T6c + + + IMAGE ALT TEXT + ## References * [[1] Creating and Using Packages](https://docs.oracle.com/javase/tutorial/java/package/packages.html) From 123c3484a7e70751177b5f8b47d3d7efedb3cb6f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 14 Jan 2023 13:33:32 -0500 Subject: [PATCH 125/212] Update packages1.md --- packages1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages1.md b/packages1.md index 31643c97..45ae4864 100644 --- a/packages1.md +++ b/packages1.md @@ -296,7 +296,7 @@ Let's try it by placing the `HelloWorld` class into the `cs1302.hello` package! 1. Follow along with Dr. Barnes as he works through another example of creating a named package in Java: - https://youtu.be/vuenX567T6c + https://www.youtube.com/watch?v=vuenX567T6c IMAGE ALT TEXT From 31cf24d6adf91664dee66cc8d0a164566dec1d77 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 14 Jan 2023 13:34:05 -0500 Subject: [PATCH 126/212] Update packages1.md --- packages1.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages1.md b/packages1.md index 45ae4864..4dd0af81 100644 --- a/packages1.md +++ b/packages1.md @@ -301,6 +301,7 @@ Let's try it by placing the `HelloWorld` class into the `cs1302.hello` package! IMAGE ALT TEXT + ## References * [[1] Creating and Using Packages](https://docs.oracle.com/javase/tutorial/java/package/packages.html) From 39201d1e33e21e1fbcb82eb7bd963e28c6390514 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 18 Jan 2023 18:55:12 -0500 Subject: [PATCH 127/212] Update packages1.md --- packages1.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages1.md b/packages1.md index 4dd0af81..bbfd7675 100644 --- a/packages1.md +++ b/packages1.md @@ -74,7 +74,9 @@ applications, it is a convenient place for package-less `.java` files [[2]](https://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html). Let's dive in! Before we get into creating named packages, we will start by compiling -directly into the default package as a warmup. The steps below show you how to create, +directly into the default package as a warmup. To be clear, you won't need to use the +`cs1302` or `hello` directories in this step. You will use them in the next part of the tutorial. +The steps below show you how to create, compile, and execute a class in the default package (i.e., a class in a package-less `.java` file). Once you are comfortable with that, move on to the next section to learn about named packages. From 2161585d964ea5f979e3ae2fd40d50a090ffc762 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 18 Jan 2023 22:05:42 -0500 Subject: [PATCH 128/212] Update exceptions1.md --- exceptions/exceptions1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index 550dd0af..c42b8df4 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -1,7 +1,7 @@ # Exceptions Part 1 -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Prerequisites From 8ec1029577fbf1ff1fdaa6f799b4610b29083499 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 18 Jan 2023 22:06:20 -0500 Subject: [PATCH 129/212] Update exceptions2.md --- exceptions/exceptions2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exceptions/exceptions2.md b/exceptions/exceptions2.md index 8df79fd0..94c9852c 100644 --- a/exceptions/exceptions2.md +++ b/exceptions/exceptions2.md @@ -1,7 +1,7 @@ # Exceptions Part 2 -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Prerequisites From 5729ca99199c401f97decb29b2bb63cdb4b1f47b Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 25 Jan 2023 17:35:43 -0500 Subject: [PATCH 130/212] Update exceptions1.md --- exceptions/exceptions1.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index c42b8df4..ee13fb41 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -222,8 +222,9 @@ public static void main(String[] args) { } // main ``` -When you attempt to compile this example program, the compiler will emit -a `cannot find symbol` error similar to the following: +We recommend trying to compile this code. To do so, you will need to create proper package directories, add your +class declaration, and any necessary imports to the top. Once everything is in place and you attempt to compile +this example program, the compiler will emit a `cannot find symbol` error similar to the following: ``` src/cs1302/scope/Example.java:22: error: cannot find symbol From 0cd3b1c5f5b50a8d949775ef3715421793b334b3 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 25 Jan 2023 17:38:02 -0500 Subject: [PATCH 131/212] Update exceptions2.md --- exceptions/exceptions2.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/exceptions/exceptions2.md b/exceptions/exceptions2.md index 94c9852c..ec51220c 100644 --- a/exceptions/exceptions2.md +++ b/exceptions/exceptions2.md @@ -96,6 +96,8 @@ Let's look at an example. 1. Now, let's modify `Checked.java` to include an appropriate try-catch: ```java + package exceptions; + import java.util.Scanner; import java.io.File; import java.io.FileNotFoundException; @@ -114,7 +116,9 @@ Let's look at an example. } // Checked ``` -1. Create a `notes.txt` file in the directory where you will execute the program. Add a single line of text to the file. +1. Create a `notes.txt` file in the directory where you will execute the program and add a single line of text to the file. + **Important Note:** The `notes.txt` file should be in the directory where you run the `java` command to run the program. If you + run the program from the parent directory of `bin` and `src`, that's where the file should be. 1. Execute `exceptions.Checked`. It should print the first line of `notes.txt`. From 8674f0ef26493f0c0d81217d410583aa5c4f087f Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Thu, 26 Jan 2023 07:20:28 -0500 Subject: [PATCH 132/212] Update emacs.md --- emacs/emacs.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/emacs/emacs.md b/emacs/emacs.md index 4343442c..16aaf3da 100644 --- a/emacs/emacs.md +++ b/emacs/emacs.md @@ -224,6 +224,11 @@ navigate to where you want to paste, then yank the text from the kill buffer. | `C-w` | Cut selection (goes into kill buffer) | | `M-w` | Copy selection (goes into kill buffer) | | `C-y` | Paste / Yank (from kill buffer) | +| `C-x h` | Select all | + +When you edit source code using Emacs, you can usually use `` to fix the +indentation for a selected region of code -- this assumes that things like parentheses +and curly braces, if applicable, are properly closed. ### Search and Replace From f00e0abfda238b69ad72040fb63b324b8fd076b2 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 26 Jan 2023 11:53:52 -0500 Subject: [PATCH 133/212] Update interfaces.md --- interfaces/interfaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index dc04cfbc..11e730fa 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -1,6 +1,6 @@ # Interfaces Tutorial -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) This tutorial introduces the reader to Java interfaces and polymorphism. From 2ddfe3df1f8bc9086dcbd0f665586c8a3483192a Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 26 Jan 2023 11:55:06 -0500 Subject: [PATCH 134/212] Update interfaces.md --- interfaces/interfaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index 11e730fa..b5edb56e 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -89,7 +89,7 @@ The contract simply binds the athlete to compete. The specific details and decis is ongoing is up to the athlete. Once the contract is written, it could be signed by athletes in a wide variety of sports. The signer could be a track athlete, a baseball player, a football player, a racecar driver, etc. Again, the signer determines the details of how they will compete. The contract only -binds them to action of competing. +binds them to the action of competing. Now, let's tie this back to programming. In the example above, `compete` is the abstract method that would be placed in the `Athlete` interface (contract) since all athletes must be able to compete. From 25e56b06d5a3c51769dcbca3ac2dd84d0c6ff6ad Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 26 Jan 2023 11:59:45 -0500 Subject: [PATCH 135/212] Update javadoc.md --- javadoc/javadoc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javadoc/javadoc.md b/javadoc/javadoc.md index f6c1a8df..eabe7c6f 100644 --- a/javadoc/javadoc.md +++ b/javadoc/javadoc.md @@ -1,6 +1,6 @@ # Javadoc and API Documentation -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Prerequisites From 45d59c1fb8e815f153875fa8091312d7b478c2b0 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 26 Jan 2023 12:00:08 -0500 Subject: [PATCH 136/212] Update uml.md --- uml/uml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uml/uml.md b/uml/uml.md index 952993ed..9c59b542 100644 --- a/uml/uml.md +++ b/uml/uml.md @@ -1,6 +1,6 @@ # UML Class Diagrams -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Introduction From 9d3ff262e46e8a4d78265cc9e2646003d61271ee Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 26 Jan 2023 12:00:54 -0500 Subject: [PATCH 137/212] Update scripts.md --- scripts/scripts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/scripts.md b/scripts/scripts.md index 34a7eaea..530bfbd9 100644 --- a/scripts/scripts.md +++ b/scripts/scripts.md @@ -1,6 +1,6 @@ # Interpreter Scripts -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## What is an Interpreter Script? From 634f1c8b7dfd019ced5124f801aedbacb4cc97d5 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 26 Jan 2023 12:01:11 -0500 Subject: [PATCH 138/212] Update varargs.md --- varargs/varargs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/varargs/varargs.md b/varargs/varargs.md index 3265c843..9f7ff5e0 100644 --- a/varargs/varargs.md +++ b/varargs/varargs.md @@ -1,6 +1,6 @@ # Variable Arguments (Varargs) Reading -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Introduction From 6ce374cbcdf730391d769d4ce999630e8c971c85 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Fri, 27 Jan 2023 14:28:16 -0500 Subject: [PATCH 139/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 039a0fec..b57ffb8c 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -560,8 +560,8 @@ using ASCII characters:: dirname basename Understanding this split is important when it comes to -moving and renaming file as both concepts deal -with the modification of a file's absolute path. +moving and renaming a file as both of those tasks modify +a file's absolute path when performed successfully. .. |Y| replace:: ✓ .. |N| replace:: ✗ From d2d802a7ea31464295503405104a043f5d20b696 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Fri, 27 Jan 2023 14:29:25 -0500 Subject: [PATCH 140/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index b57ffb8c..4d629cec 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -570,7 +570,7 @@ a file's absolute path when performed successfully. ======= ======== ====================== If you modify Related ----------------- ---------------------- - dirname basename Concept + dirname basename Task ======= ======== ====================== |Y| |N| move a file |N| |Y| rename a file @@ -580,7 +580,7 @@ a file's absolute path when performed successfully. If you are unsure what the absolute path for a file is, but you do know some relative path for it, then you can print its absolute path using the ``realpath`` command, -supplying the relative path as a command-line argument. +supplying the relative path as a command-line argument: .. code-block:: shell From ce66a16218e5c30c99c30badd32653cd6e8d9aca Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 6 Feb 2023 00:29:50 -0500 Subject: [PATCH 141/212] Update inheritance.md --- inheritance/inheritance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inheritance/inheritance.md b/inheritance/inheritance.md index 626121d6..41a9b668 100644 --- a/inheritance/inheritance.md +++ b/inheritance/inheritance.md @@ -1,6 +1,6 @@ # Inheritance -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) This tutorial introduces the reader to Java inheritance and polymorphism via inheritance. From 5c4f29100b0f72388267e5889d96365de4c7a540 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 6 Feb 2023 22:06:01 -0500 Subject: [PATCH 142/212] Update inheritance.md --- inheritance/inheritance.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/inheritance/inheritance.md b/inheritance/inheritance.md index 41a9b668..e8547753 100644 --- a/inheritance/inheritance.md +++ b/inheritance/inheritance.md @@ -163,7 +163,11 @@ To work through this example, perform the following steps: Even if the visibility allowed you to write the lines above, you should avoid doing so! There is already code that sets up these variables. It's in the parent constructor. - Instead of duplicating code, just call the parent constructor. + Instead of duplicating code, just call the parent constructor using: + + ```java + super("Canis", "Familiaris"); + ``` 1. Compile the `cs1302.animal.Animal` and `cs1302.animal.Dog` classes, specifying `bin` as the default package for compiled code. Since there is a dependency between those From b295d5517fd18818017a618cba96ddb5c2ebaaf1 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 7 Feb 2023 00:44:16 -0500 Subject: [PATCH 143/212] Update visibility.rst --- visibility/visibility.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/visibility.rst b/visibility/visibility.rst index 79d81820..8c0816b0 100644 --- a/visibility/visibility.rst +++ b/visibility/visibility.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen - :alt: Approved for: Fall 2022 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta + :alt: Approved for: Spring 2023 .. external links .. |uml_tutorial| replace:: UML Class Diagrams From c5f56773278aa1930987f014ed266dc0308f8f91 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 7 Feb 2023 00:44:34 -0500 Subject: [PATCH 144/212] Update public-and-private.rst --- visibility/public-and-private.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/public-and-private.rst b/visibility/public-and-private.rst index 292879b5..44debcc1 100644 --- a/visibility/public-and-private.rst +++ b/visibility/public-and-private.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen - :alt: Approved for: Fall 2022 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta + :alt: Approved for: Spring 2023 .. external links .. |jls11_access_control| replace:: The Java Language Specification (JLS) 11 Section 6.6 From 5cec954344fe10497ac6a40ce93257159c8aecfc Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 12 Feb 2023 13:41:50 -0500 Subject: [PATCH 145/212] Update protected.rst --- visibility/protected.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/protected.rst b/visibility/protected.rst index e4fe2148..d67c1215 100644 --- a/visibility/protected.rst +++ b/visibility/protected.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen - :alt: Approved for: Fall 2022 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta + :alt: Approved for: Spring 2023 Visibility Reading ################## From 2b9fd79d1fbd51f8f68f715a194a268c828255a9 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 12 Feb 2023 13:42:17 -0500 Subject: [PATCH 146/212] Update package-private.rst --- visibility/package-private.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/package-private.rst b/visibility/package-private.rst index 4879de55..e23847aa 100644 --- a/visibility/package-private.rst +++ b/visibility/package-private.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen - :alt: Approved for: Fall 2022 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta + :alt: Approved for: Spring 2023 Visibility Reading ################## From 597221fc7dd3cb591f9428ffb0df71ed4a0a3e48 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 12 Feb 2023 13:46:10 -0500 Subject: [PATCH 147/212] Update adt-and-links.md --- adt-and-links/adt-and-links.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adt-and-links/adt-and-links.md b/adt-and-links/adt-and-links.md index 6c61bab9..af876707 100644 --- a/adt-and-links/adt-and-links.md +++ b/adt-and-links/adt-and-links.md @@ -1,6 +1,6 @@ # ADTs and Lists Tutorial -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Introduction From 508d2a66bb7b13cf7ae56372e5679268311af0cb Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 15 Feb 2023 15:19:39 -0500 Subject: [PATCH 148/212] Update visibility.rst --- visibility/visibility.rst | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/visibility/visibility.rst b/visibility/visibility.rst index 8c0816b0..17375553 100644 --- a/visibility/visibility.rst +++ b/visibility/visibility.rst @@ -6,14 +6,12 @@ .. _uml_tutorial: https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/uml/uml.md .. internal links -.. |reading_private| replace:: Private Visibility -.. _reading_private: private.rst +.. |reading_public_and_private| replace:: Private Visibility +.. _reading_public_and_private: public-and-private.rst .. |reading_package| replace:: Package Private Visibility .. _reading_package: package-private.rst .. |reading_protected| replace:: Protected Visibility .. _reading_protected: protected.rst -.. |reading_public| replace:: Public Visibility -.. _reading_public: public.rst .. image:: img/in-progress.svg @@ -117,10 +115,10 @@ and help others to understand the important details of visibility. Individual Readings ******************* -* |reading_private|_ +* |reading_public_and_private|_ * |reading_package|_ * |reading_protected|_ -* |reading_public|_ + Summary of Visibilities *********************** From 952f8e166fc9c687ae5aec502ed16da89f1fcdba Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 15 Feb 2023 15:20:08 -0500 Subject: [PATCH 149/212] Update visibility.rst --- visibility/visibility.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visibility/visibility.rst b/visibility/visibility.rst index 17375553..1202a282 100644 --- a/visibility/visibility.rst +++ b/visibility/visibility.rst @@ -6,7 +6,7 @@ .. _uml_tutorial: https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/uml/uml.md .. internal links -.. |reading_public_and_private| replace:: Private Visibility +.. |reading_public_and_private| replace:: Public and Private Visibility .. _reading_public_and_private: public-and-private.rst .. |reading_package| replace:: Package Private Visibility .. _reading_package: package-private.rst From a4b8de82c8110f6695955dba78f4e70d2f690fcf Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 19 Feb 2023 18:33:21 -0500 Subject: [PATCH 150/212] Update generic-classes.md --- generics/generic-classes/generic-classes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generics/generic-classes/generic-classes.md b/generics/generic-classes/generic-classes.md index 03711236..f73e3dbc 100644 --- a/generics/generic-classes/generic-classes.md +++ b/generics/generic-classes/generic-classes.md @@ -1,6 +1,6 @@ # Generic Classes Tutorial -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) This tutorial introduces the reader to generic classes in Java by creating a new generic class and emphasizing some of the benefits of using generics. From d67b1c8cd51ff1957b832ef1f553f72a8737c92c Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 19 Feb 2023 18:34:03 -0500 Subject: [PATCH 151/212] Update generic-methods.md --- generics/generic-methods/generic-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generics/generic-methods/generic-methods.md b/generics/generic-methods/generic-methods.md index 32c133e7..dd2f5545 100644 --- a/generics/generic-methods/generic-methods.md +++ b/generics/generic-methods/generic-methods.md @@ -1,6 +1,6 @@ # Generic Methods Reading -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) This reading introduces the reader to generic methods in Java. From 5a3d9e460d37a0da40dee789ab22e4d2a87fa6ab Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 19 Feb 2023 18:34:23 -0500 Subject: [PATCH 152/212] Update generic-methods.md --- generics/generic-methods/generic-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generics/generic-methods/generic-methods.md b/generics/generic-methods/generic-methods.md index dd2f5545..f0fbd130 100644 --- a/generics/generic-methods/generic-methods.md +++ b/generics/generic-methods/generic-methods.md @@ -99,7 +99,7 @@ Here are some examples: Integer int2 = sc.foo(12, "help"); // R = String ``` -## Recommended Additional Reading with More Examples +## Additional Reading with More Examples Now that you're familiar with some of the basic concepts relate to generic methods in Java, you need to read the official Oracle reading: From ec532dc70d81d8c73aa8a1403578010ea2f618ae Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 19 Feb 2023 18:34:58 -0500 Subject: [PATCH 153/212] Update generic-classes.md --- generics/generic-classes/generic-classes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generics/generic-classes/generic-classes.md b/generics/generic-classes/generic-classes.md index f73e3dbc..92712117 100644 --- a/generics/generic-classes/generic-classes.md +++ b/generics/generic-classes/generic-classes.md @@ -50,7 +50,7 @@ https://youtu.be/m539u1hGP7E Generic Method Example -## Recommended Additional Reading with More Examples +## Additional Reading with More Examples Now that you're familiar with some of the basic concepts relate to generic methods in Java, you need to read the official Oracle reading: From 18bc7afb7b94012da5636045579a5023bc191db1 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Fri, 24 Feb 2023 05:57:54 -0500 Subject: [PATCH 154/212] Update scripts.md --- scripts/scripts.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/scripts.md b/scripts/scripts.md index 530bfbd9..39144ea0 100644 --- a/scripts/scripts.md +++ b/scripts/scripts.md @@ -52,7 +52,8 @@ terminal shell. Let's create one! $ stat /path/to/bash ``` -1. Create a regular text file called `cs1302-script.sh` and setup the first +1. By convention, the `.sh` file extension is used for shell scripts. + Create a regular text file called `cs1302-script.sh` and setup the first line so that it conforms to the beforementioned requirements for an interpreter script. Replace `interpreter` with the output of `which`, and exclude an optional arguments for now. It should look this: From a69be860b50f3a2a1d67adc37134c56ff88a6e26 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 9 Mar 2023 13:17:50 -0500 Subject: [PATCH 155/212] Update lambda.rst --- lambda/lambda.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda/lambda.rst b/lambda/lambda.rst index a6e51682..7f85c99a 100644 --- a/lambda/lambda.rst +++ b/lambda/lambda.rst @@ -1,6 +1,6 @@ .. rst setup .. sectnum:: -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta .. copyright and license information .. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN .. |copyright| replace:: Copyright |copy| Michael E. Cotterell, Bradley J. Barnes, and the University of Georgia. From 341fdb85e0a51a0c0f975e8847a702bb23fe9917 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 15 Mar 2023 22:57:09 -0400 Subject: [PATCH 156/212] Update javafx.md --- javafx/javafx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javafx/javafx.md b/javafx/javafx.md index c7810f48..a10c57c6 100644 --- a/javafx/javafx.md +++ b/javafx/javafx.md @@ -1,6 +1,6 @@ # JavaFX Starter Tutorial -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) JavaFX is a library for creating and delivering applications with graphical user interfaces (GUIs) in Java. In this tutorial, we will use JavaFX 17 along with Java 17. The API documentation for From 11077b7293a3ee1da5006ad238bc4891ccb292a1 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 28 Mar 2023 15:11:53 -0400 Subject: [PATCH 157/212] Update javafx.md --- javafx/javafx.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/javafx/javafx.md b/javafx/javafx.md index a10c57c6..09012d3d 100644 --- a/javafx/javafx.md +++ b/javafx/javafx.md @@ -64,7 +64,7 @@ page for direct links to commonly used classes. 1. Run the compiled code using the command below: ``` - java -cp bin -p $JAVAFX_HOME/lib --add-modules javafx.controls cs1302.gui.ExampleDriver + java -cp bin -Dprism.order=sw -p $JAVAFX_HOME/lib --add-modules javafx.controls cs1302.gui.ExampleDriver ``` Notice the use of the `-p` and `add-modules` command line arguments as in the previous step. @@ -98,14 +98,9 @@ page for direct links to commonly used classes. Current serial number in output stream: 24 ``` - **If you receive an error message in the terminal,** then this error message is related to the - JavaFX graphics renderer. By default, it attempts to perform hardware-accelerated rendering. - However, we need to enable to software-based rendering in order for it to work nicely with X-forwarding. - Close out of the small GUI app. - -1. Regardless of whether you got an error, **rerun the driver but add `-Dprism.order=sw` in addition to - the usual options when executing the related `java` command** to enable the software-based renderer. You may - still receive a slightly shorter error message but your application will run smoother (less lag) with this +1. **If you receive an error message in the terminal,** then this error message is related to the + JavaFX graphics renderer. **rerun the driver and make sure you correctly typed the `-Dprism.order=sw` option properly.**. + You may still receive a slightly shorter error message but your application will run smoother (less lag) with this option set. 1. If the small GUI app containing a nice message appears with or without a small error message, then you are okay to proceed! From cff648a08e6a5a0e55a588b1ec5ef59fd6e7fca8 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 29 Mar 2023 22:33:05 -0400 Subject: [PATCH 158/212] Update components.md --- components/components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/components.md b/components/components.md index 508019ee..79a76900 100644 --- a/components/components.md +++ b/components/components.md @@ -1,6 +1,6 @@ # JavaFX Custom Component Tutorial -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) JavaFX is a library for creating and delivering applications with graphical user interfaces (GUIs) in Java. In this tutorial, we will use JavaFX 17. The API documentation for From bc3ece333c5649f96ae4b9fb59dbb802042bd4e0 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 30 Mar 2023 00:11:08 -0400 Subject: [PATCH 159/212] Update brief-intro-threads.md --- threads/brief-intro-threads.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/threads/brief-intro-threads.md b/threads/brief-intro-threads.md index e3f0bee4..4b64f21c 100644 --- a/threads/brief-intro-threads.md +++ b/threads/brief-intro-threads.md @@ -1,6 +1,6 @@ # Brief Introduction to Java Threads -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Prerequisites From a79d94d1ffedf14b0dc6e801ffed0c7cb856d239 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Thu, 30 Mar 2023 00:11:36 -0400 Subject: [PATCH 160/212] Update maven.md --- maven.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven.md b/maven.md index 233fed7a..723e3cb0 100644 --- a/maven.md +++ b/maven.md @@ -1,6 +1,6 @@ # Maven Tutorial -![Approved for: Fall 2022](https://img.shields.io/badge/Approved%20for-Fall%202022-darkgreen) +![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) ## Maven From 53d6a9d35e3a8f2fafd4b6a1731a97281d38160f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 12 Aug 2023 16:41:32 -0400 Subject: [PATCH 161/212] Update variables.md --- refresher/variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/refresher/variables.md b/refresher/variables.md index cdbbd3b7..9f5b1a73 100644 --- a/refresher/variables.md +++ b/refresher/variables.md @@ -1,6 +1,6 @@ # Refresher: Reference Variables -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green)
    From ee37205abb3898b89182d7e1633d3894d11996e7 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 12 Aug 2023 16:48:37 -0400 Subject: [PATCH 162/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index 09c32acb..2e977519 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -1,5 +1,5 @@ .. sectnum:: -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202023-green ======================= Unix: Getting Started From f1c55778993924de4f2c0c11a82e64804e95a4fe Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 12 Aug 2023 16:49:02 -0400 Subject: [PATCH 163/212] Update MacOS.md --- setup/MacOS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/MacOS.md b/setup/MacOS.md index 3d4f6bfc..89de4658 100644 --- a/setup/MacOS.md +++ b/setup/MacOS.md @@ -1,6 +1,6 @@ # Setup on macOS -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) The following instructions are designed to help get you up and running with macOS for development in CSCI 1302. The majority of the time, you will not be developing directly on your Mac. Instead, From 9b403499a03308d7f6603383f99d4ff4ce4d0513 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 12 Aug 2023 16:49:23 -0400 Subject: [PATCH 164/212] Update Windows.md --- setup/Windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/Windows.md b/setup/Windows.md index 8f6cc482..017823ca 100644 --- a/setup/Windows.md +++ b/setup/Windows.md @@ -1,6 +1,6 @@ # Setup on Windows 10 & 11 -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) The following instructions are designed to help get you up and running with a Windows 10 or 11 PC for development in CSCI 1302. The majority of the time, you will not be developing directly on From 1b3691a3b2b36b8f0080247ecae65be3d326ff44 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 12 Aug 2023 16:49:54 -0400 Subject: [PATCH 165/212] Update unix-tutorial.rst --- unix/unix-tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 4d629cec..80d536f7 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -1,5 +1,5 @@ .. sectnum:: -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202023-green ================ Unix: Tutorial From 08ce7feb513edf9cff61856790383e513b200713 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 12 Aug 2023 16:50:23 -0400 Subject: [PATCH 166/212] Update emacs.md --- emacs/emacs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emacs/emacs.md b/emacs/emacs.md index 16aaf3da..8ebb1696 100644 --- a/emacs/emacs.md +++ b/emacs/emacs.md @@ -1,6 +1,6 @@ # Emacs Tutorial -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ![Emacs Welcome Screen](welcome.PNG) From 8e923df74746242c80403a72ff9f545aad141a9c Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 21 Aug 2023 18:09:06 -0400 Subject: [PATCH 167/212] Update cla.md --- cla/cla.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cla/cla.md b/cla/cla.md index 0583cdaf..2b50c592 100644 --- a/cla/cla.md +++ b/cla/cla.md @@ -1,6 +1,6 @@ # Command-Line Arguments -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) When working in a Unix-like environment, programs are launched when the user enters the program's name into the shell (i.e., they type it in, then press From 915aef704ce5babe94461874fb1eab48787fc688 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 21 Aug 2023 18:09:33 -0400 Subject: [PATCH 168/212] Update octal-mode.md --- octal-mode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/octal-mode.md b/octal-mode.md index 87f6c9db..875ceeb6 100644 --- a/octal-mode.md +++ b/octal-mode.md @@ -1,6 +1,6 @@ # Octal Mode -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ## Prerequisites From 13a8c7e2f685f3c5ac0c4b45bf6a197d3baec942 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 21 Aug 2023 18:10:15 -0400 Subject: [PATCH 169/212] Update packages1.md --- packages1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages1.md b/packages1.md index bbfd7675..8c70c8b4 100644 --- a/packages1.md +++ b/packages1.md @@ -1,6 +1,6 @@ # Java Packages Tutorial - Part 1 -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ## Prerequisites From 37ab5c6b87e2b4ac94ab5d14572041ef36c65963 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 21 Aug 2023 18:10:56 -0400 Subject: [PATCH 170/212] Update packages2.md --- packages2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages2.md b/packages2.md index 63294265..717cc124 100644 --- a/packages2.md +++ b/packages2.md @@ -1,6 +1,6 @@ # Java Packages Tutorial - Part 2 -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ## Prerequisites From 4a3be7ed88d47412b803b364f546e955ed27b43c Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Mon, 21 Aug 2023 18:19:18 -0400 Subject: [PATCH 171/212] Update exceptions1.md --- exceptions/exceptions1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index ee13fb41..5b85b2d0 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -1,7 +1,7 @@ # Exceptions Part 1 -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ## Prerequisites From b775a2e361465a3673999de1d61018baf2aafb2d Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 22 Aug 2023 00:44:37 -0400 Subject: [PATCH 172/212] Update MacOS.md --- setup/MacOS.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/setup/MacOS.md b/setup/MacOS.md index 89de4658..8497682c 100644 --- a/setup/MacOS.md +++ b/setup/MacOS.md @@ -48,9 +48,10 @@ On some systems, this is the same as the ESC or ALT key. On a Mac, you can set T use the OPTION key as META. 1. **Open Terminal.** -2. In the menu bar, click **Terminal**, then click **Preferences**. -3. In the window that appears, select the **Keyboard** tab in the pane that appears to the right. -4. Near the bottom of the pane, check the box for **Use Option as Meta key.** +2. In the menu bar, click **Terminal**, then click **Settings...**. +3. In the window that appears, select the **Profiles** option at the top. +4. In the tabs that appear below **Profiles**, select the **Keyboard** tab. +5. Near the bottom of the pane, check the box for **Use Option as Meta key.** - **The setting does not take effect immediately!** It will take effect the next time you open **Terminal**. 6. Quit the **Terminal** app by selecting **Quit Terminal** from the **File** menu (or by From 847d96c5dbe1536cbd2dbf942e3787296d6e0976 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 27 Aug 2023 14:25:32 -0400 Subject: [PATCH 173/212] Update exceptions2.md --- exceptions/exceptions2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exceptions/exceptions2.md b/exceptions/exceptions2.md index ec51220c..15828d77 100644 --- a/exceptions/exceptions2.md +++ b/exceptions/exceptions2.md @@ -1,7 +1,7 @@ # Exceptions Part 2 -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ## Prerequisites From 82f6667bb6599f74186d3f0300a3e4f5bcf3112a Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 27 Aug 2023 14:26:08 -0400 Subject: [PATCH 174/212] Update javadoc.md --- javadoc/javadoc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javadoc/javadoc.md b/javadoc/javadoc.md index eabe7c6f..4f34a4c9 100644 --- a/javadoc/javadoc.md +++ b/javadoc/javadoc.md @@ -1,6 +1,6 @@ # Javadoc and API Documentation -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ## Prerequisites From b0ffd2fab96263bd19e35090489070c4f2cba774 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 27 Aug 2023 14:26:42 -0400 Subject: [PATCH 175/212] Update interfaces.md --- interfaces/interfaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/interfaces.md b/interfaces/interfaces.md index b5edb56e..396c8366 100644 --- a/interfaces/interfaces.md +++ b/interfaces/interfaces.md @@ -1,6 +1,6 @@ # Interfaces Tutorial -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) This tutorial introduces the reader to Java interfaces and polymorphism. From 96d27c6395f08b9423953112f2a7edbe9da7130d Mon Sep 17 00:00:00 2001 From: charles k <52868068+charleskimbac@users.noreply.github.com> Date: Tue, 29 Aug 2023 22:08:59 -0400 Subject: [PATCH 176/212] [typo] desirabe > desirable --- unix/unix-tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unix/unix-tutorial.rst b/unix/unix-tutorial.rst index 80d536f7..e1f96f9c 100644 --- a/unix/unix-tutorial.rst +++ b/unix/unix-tutorial.rst @@ -462,7 +462,7 @@ a path to the file you want to view as a command-line argument. ++++++++ The ``cat`` command displays the entire contents of a file all at once, -which may not be desirabe for large files. To display the contents of +which may not be desirable for large files. To display the contents of a regular file one page (or screen) at a time, use the ``less`` command and supply a path to the file you want to view as a command-line argument. To quit out of ``less``, press the ``q`` key. To move up and down one From 83bda171881bd9e31e1aac60f3e5af8b27a9cc97 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Tue, 29 Aug 2023 22:25:37 -0400 Subject: [PATCH 177/212] Update exceptions1.md --- exceptions/exceptions1.md | 40 ++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index 5b85b2d0..4269b2ed 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -57,7 +57,7 @@ public class Exception { public static void exception() { String s = null; - if (s.length() > 1) { // causes a NullPointerException + if (s.length() > 1) { // causes a NullPointerException because you can't call a method on a null reference. System.out.println("string length > 1"); } // if } // exception @@ -85,20 +85,26 @@ Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String ``` When you see an error message like this, take a few seconds to read through the message to understand what it is -saying. The first line tells you that a `NullPointerException` occurred when the `length` method was invoked on -a `null` reference. That's very informative. With this information, we can figure out that `s` must have been `null`. +saying. The top line tells you that a `NullPointerException` occurred when the `length` method was invoked on +a `null` reference. That's very informative. With this information, we can figure out that `s` must have been `null` +since `s` is the only reference variable on line 9. + From there, we can see the exact method(s) that were called before the exception occurred. To understand this, start from the last line of output in the error. The last line corresponds to the first method that was called. In our example, -this is the `main` method. That should make sense since all programs start in `main`. On line 3 of the `main` method, -the `exception` method was called. Then, on line 9 of the `exception` method, the program generated an exception +this is the `main` method in the `Exception` class (or `Exception.main`) which makes sense since all programs start in +`main`. The `main` method executed until it got to line 3 and then it called the `exception` method (`Exception.exception`). +We can tell that `main` called `exception` because the last line of output corresponds to the first method that was called +and each subsequent method call is printed above it (think of this as a stack of method calls). + +On line 9 of the `exception` method, the program generated an exception that was never handled. In this example, the `NullPointerException` originated in the `exception` method. Since the `exception` method did not handle the exception, the exception was **propagated** (passed) to the calling method. In this -example, that is `main`. Since `main` also did not handle the exception, the exception propagated out of `main` +example, it was propagated to `main`. Since `main` also did not handle the exception, the exception propagated out of `main` which led to the crash. Any time an exception is generated and is allowed to propagate out of `main`, the program -will crash. +will crash. It's our job to make sure we catch the exceptions before they cause a crash. **Definition:** The last two lines of output above are called a **stack trace**. The stack trace tells the user which -methods were active when the program crashed in the order that they were called (from bottom up). This facilitates +methods were active when the program crashed in the order that they were called (from the bottom up). This facilitates faster debugging by allowing you to better understand what was happening in the application when it crashed. The error message above is informative to us as programmers but we don't want our users to see it! To protect them @@ -109,7 +115,7 @@ from these messages, we have to deal with exceptions in one of two ways: We will talk about each of these in detail in the next two sections. -## Avoiding Exceptions +## Approach 1: Avoiding Exceptions To *avoid the exception* in the example above, you need only ensure that you do not invoke members (i.e., call methods or access instance variables) @@ -126,13 +132,13 @@ if (s != null) { ``` ```java -// avoid NPE via short circuiting +// avoid NullPointerException via short circuiting if ((s != null) && (s.length() > 1)) { System.out.println("string length > 1"); } // if ``` -In general, in order to avoid an exception object, you need to understand the +In general, in order to avoid an exception, you need to understand the conditions in which that exception object is thrown, then write code that correctly identifies if those conditions are met prior to the line of code that throws the exception object. Although it is relatively easy to amend code @@ -145,10 +151,10 @@ potentially tricky to identify. Such exceptions are generally handled instead of avoided, although there is no reason a combination of both handling and avoiding can't be employed. -## Handling Exceptions +## Approach 2: Handling Exceptions To *handle the exception* in the example above, you need to make use of a -special control flow snytax known as a **try block** or **try-catch block**. +special control flow syntax known as a **try block** or **try-catch block**. With this syntax, you place code that can throw an exception into the `try` block, then place code for how you want to deal with the exception in the `catch` block. These two go together, which is why we often @@ -235,11 +241,11 @@ src/cs1302/scope/Example.java:22: error: cannot find symbol 1 error ``` -Issues like simple typos, missing import statements, and even an incorrect +Issues like simple typos, missing import statements and even an incorrect classpath often cause the Java compiler to emit the `cannot find symbol`; however, the cause of this particular `cannot find symbol` error is related to the scope of the symbol (the variable `file`), which does not extend to a specific -line of code that attempts to use that symbol, as indicated by error message. +line of code that attempts to use that symbol, as indicated by the error message. Since the variable `file` is declared inside the try-block, its scope only extends to subsequent lines within the try-block, as illustrated below. @@ -302,10 +308,10 @@ easier to program. These two strategies are outlined below: 2. Place code that depends on the symbol within the try-block with the understanding that it will be skipped should an exception occur within the try-block before that - line (as execution flows to a corresponding catch-block). + line (as execution flows to a corresponding catch block). * This strategy often requires changes to multiple lines of code; however, it also often - leads to a more elegent solution, as illustrated below: + leads to a more elegant solution, as illustrated below: ```java public static void main(String[] args) { From 1fe6b9327a5257ecc1a709a7c14ebd1a140a195e Mon Sep 17 00:00:00 2001 From: charles k <52868068+charleskimbac@users.noreply.github.com> Date: Tue, 29 Aug 2023 23:01:02 -0400 Subject: [PATCH 178/212] [typos] 3 --- packages1.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages1.md b/packages1.md index 8c70c8b4..3e90b00c 100644 --- a/packages1.md +++ b/packages1.md @@ -19,7 +19,7 @@ run any code examples, repeat as necessary**. Simply reading (or skimming) is no In Java, a **package** is a grouping of related types providing access protection and name space management. Note that types refers to classes, interfaces, enumerations, and annotation types [[1]](https://docs.oracle.com/javase/tutorial/java/package/packages.html). In other words, a package allows you to -organize your source code. Proper code organizatioin becomes increasingly important as the size of the project +organize your source code. Proper code organization becomes increasingly important as the size of the project increases. The two primary benefits of packages are: @@ -253,7 +253,7 @@ Let's try it by placing the `HelloWorld` class into the `cs1302.hello` package! ``` 5. Execute the `find` command. Note that the `HelloWorld.class` file was created under `bin/cs1302/hello`. - The output of `find` should look the same as the output below. Notice that The compiler automatically + The output of `find` should look the same as the output below. Notice that the compiler automatically created the necessary package directories for our compiled code under `bin`! **Note:** If you see any tilde (~) files, those are just backup copies of older versions @@ -275,7 +275,7 @@ Let's try it by placing the `HelloWorld` class into the `cs1302.hello` package! ``` -6. Run the program using `javac` specify the classpath using `-cp` and include the +6. Run the program using `javac` with the classpath using `-cp` and include the fully qualified name (explained below) of the class containing the `main` method: ``` From e2328919c6998e1920ca5e60b5cdb95ef103dc7f Mon Sep 17 00:00:00 2001 From: charles k <52868068+charleskimbac@users.noreply.github.com> Date: Tue, 29 Aug 2023 23:03:15 -0400 Subject: [PATCH 179/212] [typos] 3 --- packages2.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages2.md b/packages2.md index 717cc124..3aa4398e 100644 --- a/packages2.md +++ b/packages2.md @@ -137,7 +137,7 @@ to let `javac` know where the _compiled_ version of that depedency is. ### Setting the Class Path -Both `javac` and `java` allow you specify the class path using the `-cp` or `-classpath` command-line +Both `javac` and `java` allow you to specify the class path using the `-cp` or `-classpath` command-line option. The usual syntax is as follows: ``` @@ -155,7 +155,7 @@ Each path can be a path to a directory or a `.jar` file (usually used for third **VERY IMPORTANT NOTE:** The class path should always point to a default package for _compiled_ code. If you are compiling a `.java` file that depends on an already compiled class, then you will need to -specifiy the class path to the corresponding default package for that dependency when +specify the class path to the corresponding default package for that dependency when invoking `javac`. ### Import Statements @@ -176,7 +176,7 @@ Random rng = new Random(); java.util.Random rng = new java.util.Random(); ``` -As you can imagine, the latter (without an import statement) might get annoying and repetetive. +As you can imagine, the latter (without an import statement) might get annoying and repetitive. Therefore, we usually prefer to use an `import` statement for the convenience it provides. Why would anyone prefer to use the fully qualified name instead of the simple name for a class? It enables you to use two classes from different packages with the same simple name at the From ae845aa1fb5ff792864ee9269540c70069115894 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 30 Aug 2023 13:45:47 -0400 Subject: [PATCH 180/212] Update javadoc.md --- javadoc/javadoc.md | 62 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/javadoc/javadoc.md b/javadoc/javadoc.md index 4f34a4c9..ac736756 100644 --- a/javadoc/javadoc.md +++ b/javadoc/javadoc.md @@ -110,31 +110,57 @@ to the explicit instructions provided below are explored in the FAQ section towa this tutorial. 1. Ensure that you have a `public_html` directory in your home directory. If the `~/public_html` - directory does not exist, then you should create it. The purpose of this directory on Odin (and + directory does not exist, you should create it. The purpose of this directory on Odin (and on many systems) is to support user websites, which will be illustrated in the following steps. - You are fully responsible for anything that you host through your Odin website. + Please note that you are fully responsible for anything that you host through your Odin website. -1. Use `ln`, as described below, to **create a symbolic link** (shortcut) in your `public_html` - directory to the `doc` subdirectory containing the API documentation website that you - created in a previous step. The exact command is presented below--it assumes you are currently - in the `cs1302-javadoc` directory. +1. To make our documentation publicly available on the web, we will set up a **symbolic link** to + the `doc` directory you created in the previous steps. You can think of a symbolic link as a + shortcut to those files. The symbolic link will need to be placed in the `~/public_html` folder + but the `doc` directory you created will not move. + + The syntax for the command to create a symbolic link is: + + ``` + ln -s + ``` + + Notice that the first path must be an absolute path and that the second path can be a relative + path. For example, if I were running the `ln` command from within the `cs1302-javadoc` directory + that contains my `doc` folder, my command might look something like this: ``` - $ ln -s $(pwd)/doc ~/public_html/cs1302-javadoc-doc + ln -s /absolute/path/to/cs1302-javadoc/doc ~/public_html/cs1302-javadoc-doc ``` + + where `/absolute/path/to/cs1302-javadoc/doc` is replaced with the real absolute path to `doc` and + `cs1302-javadoc-doc` is the name of the symbolic link being created. The absolute path required will + depend on your username and the name of the link can be anything you like (although we generally + recommend using the same names we use in the tutorial). + + * Optional Shortcut (avoids typing the full absolute path) + + If you want to avoid typing the absolute path every time, you can try the command below. However, + for this command to work properly, it must be executed from the directory that contains the `doc` + directory. In this example, **the command must be run from the `cs1302-javadoc` directory**. + + ``` + $ ln -s $(pwd)/doc ~/public_html/cs1302-javadoc-doc + ``` - **Note:** The `ln` command requires the **absolute path** to our link's target (in this case, `doc`). - Since our intended target is in the current directory, we know that its absolute path - is the same as the absolute path of the current directory followed by `/` followed by - the name of our target. We could manually figure out the desired path with the help of `pwd` - or we can use `$(pwd)`, as seen above, to fill in the output of `pwd` instead. You could also - type out the entire absolute path but that would be tedious and error-prone. + **Explanation:** As previously stated, the `ln` command requires the absolute path to our link's + target (in this case, `doc`). + Since our intended target is in the current directory, we know that its absolute path + is the same as the absolute path of the current directory followed by `/` followed by + the name of our target. We could manually figure out the desired path with the help of `pwd` + or we can use `$(pwd)`, as seen above, to fill in the output of `pwd` instead. You could also + type out the entire absolute path but that would be tedious and error-prone. - In this scenario, the symbolic link is called `cs1302-javadoc-doc`. You can see it if you - change into your `public_html` directory and perform an `ls -l`. The entry for - `cs1302-javadoc-doc` in the long listing indicates that the file is a symbolic link in - two different ways: i) an `l` is prefixed in the mode instead of `-` or `d`; and ii) the - filename lists an arrow pointing to the link target. + In this scenario, the symbolic link is called `cs1302-javadoc-doc`. You can see it if you + change into your `public_html` directory and perform an `ls -l`. The entry for + `cs1302-javadoc-doc` in the long listing indicates that the file is a symbolic link in + two different ways: i) an `l` is prefixed in the mode instead of `-` or `d`; and ii) the + filename lists an arrow pointing to the link target. 1. Navigate to the following URL in your web browser, replacing `user` with your Odin username: From fd493953232f2cc0d7fbc48f59f32789e69d55ea Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Wed, 30 Aug 2023 21:05:28 -0400 Subject: [PATCH 181/212] Update exceptions1.md Fixed parentheses typos in code examples. --- exceptions/exceptions1.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index 4269b2ed..ceb56720 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -125,7 +125,7 @@ Here are some examples: ```java // use an if-statement to check if (s != null) { - if (s.length() > 1)) { + if (s.length() > 1) { System.out.println("string length > 1"); } // if } // if @@ -167,7 +167,7 @@ Here is an example: ```java try { - if (s.length() > 1)) { + if (s.length() > 1) { System.out.println("string length > 1"); } // if } catch (NullPointerException npe) { From afa221fa42edec2a33e067740333b0c58ee0f009 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Wed, 30 Aug 2023 22:40:56 -0400 Subject: [PATCH 182/212] Update exceptions1.md Updated exposition related to stack traces and error messages. --- exceptions/exceptions1.md | 96 ++++++++++++++++++++++++++------------- 1 file changed, 65 insertions(+), 31 deletions(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index ceb56720..f3402c04 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -76,41 +76,75 @@ Instead, it crashes because the exception was not *handled* properly. Go ahead and test it out. Copy/paste this code into a `.java` file on Odin and try to run it. Did it do what you expected? -The example code above, when executed, produces the following output: +Here is an annotated version of the output produced by the example code: -```java -Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "" is null - at Exception.exception(Exception.java:9) - at Exception.main(Exception.java:3) +``` +A. | Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "" is null +B. | at Exception.exception(Exception.java:9) +C. | at Exception.main(Exception.java:3) ``` When you see an error message like this, take a few seconds to read through the message to understand what it is -saying. The top line tells you that a `NullPointerException` occurred when the `length` method was invoked on -a `null` reference. That's very informative. With this information, we can figure out that `s` must have been `null` -since `s` is the only reference variable on line 9. - -From there, we can see the exact method(s) that were called before the exception occurred. To understand this, start -from the last line of output in the error. The last line corresponds to the first method that was called. In our example, -this is the `main` method in the `Exception` class (or `Exception.main`) which makes sense since all programs start in -`main`. The `main` method executed until it got to line 3 and then it called the `exception` method (`Exception.exception`). -We can tell that `main` called `exception` because the last line of output corresponds to the first method that was called -and each subsequent method call is printed above it (think of this as a stack of method calls). - -On line 9 of the `exception` method, the program generated an exception -that was never handled. In this example, the `NullPointerException` originated in the `exception` method. Since the -`exception` method did not handle the exception, the exception was **propagated** (passed) to the calling method. In this -example, it was propagated to `main`. Since `main` also did not handle the exception, the exception propagated out of `main` -which led to the crash. Any time an exception is generated and is allowed to propagate out of `main`, the program -will crash. It's our job to make sure we catch the exceptions before they cause a crash. - -**Definition:** The last two lines of output above are called a **stack trace**. The stack trace tells the user which -methods were active when the program crashed in the order that they were called (from the bottom up). This facilitates -faster debugging by allowing you to better understand what was happening in the application when it crashed. - -The error message above is informative to us as programmers but we don't want our users to see it! To protect them -from these messages, we have to deal with exceptions in one of two ways: - -1. avoid them; and +saying. + +A. The top line tells you that a `NullPointerException` occurred when the `length` method was invoked on + a `null` reference. That's very informative. With this information, we can figure out that `s` must have been `null` + since `s` is the only reference variable on line 9. + +The indented lines starting with `at` in the output are collectively referred to a **stack trace**. The stack trace tells +the user which methods were active when the program crashed in the order that they were called (from the bottom up). +This facilitates faster debugging by allowing you to better understand what was happening in the application when it crashed. + +B. The *first* line in the stack trace indicates the **origin** of the exception; that is, it provides the class name, + method name, filename, and line number where the exception object was *first* thrown during program execution. Here + is a breakdown: + + ``` + class name file name + ┌───┴───┐ ┌──────┴─────┐ + at Exception.exception(Exception.java:9) + └───┬───┘ │ + method name line number + ``` + +C. The *last* line in the stack trace indicates the *last executed line* of the *first method executed* by our program; + in most cases, this is implictly the `main` method since most Java programs start in `main`. Here is a breakdown: + + ``` + class name file name + ┌───┴───┐ ┌──────┴─────┐ + at Exception.main(Exception.java:3) + └─┬┘ │ + method name line number + ``` + +The stack trace, when read in reverse order (i.e., from bottom to top), tells us a story about what happened +when we ran the program. In our example, the stack trace tells us that the `main` method was executed until +the program got to line 3, then the `exception` method (`Exception.exception`) was called and executed +until the program got to line 9, the origin of the exception. + +Since the `exception` method does not handle the exception, the exception object **propagated** (i.e., *thrown/passed back*) +to its calling method. In general, exception objects will continue to propagation back through the calling methods in the +call stack (i.e., the methods we see in the stack trace) until the program either: +i) handles the exception object; or +ii) lets the exception propagates out of `main`. +In our example, the exception propagated from `exception` to `main`, and since the `main` method does not +handle the exception, the exception continued to oropagate out of `main` and crash the program. +Any time an exception is allowed to propagate out of `main`, the program will crash. It's our job to +make sure that we catch exceptions before they cause a crash. + +``` +Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "" is null + at Exception.exception(Exception.java:9) + at Exception.main(Exception.java:3) +``` + +Error messages produced when a program crashes from an exception, like the one shown above, are *very* informative +for us as programmers; however, they are often confusing, startling, or even scary when encountered by end +users who just witnessed the program crash and have no way to use the information in the error message. +To prevent our users from seeing these error messages, we need to handle exceptions in one of two ways: + +1. avoid them; or 2. handle them. We will talk about each of these in detail in the next two sections. From bff1bea7a8780815552d68c53a56e241544d5d0f Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Wed, 30 Aug 2023 22:42:53 -0400 Subject: [PATCH 183/212] Update exceptions1.md --- exceptions/exceptions1.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/exceptions/exceptions1.md b/exceptions/exceptions1.md index f3402c04..0634f371 100644 --- a/exceptions/exceptions1.md +++ b/exceptions/exceptions1.md @@ -119,7 +119,15 @@ C. The *last* line in the stack trace indicates the *last executed line* of the ``` The stack trace, when read in reverse order (i.e., from bottom to top), tells us a story about what happened -when we ran the program. In our example, the stack trace tells us that the `main` method was executed until +when we ran the program. + +``` +Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "" is null + at Exception.exception(Exception.java:9) + at Exception.main(Exception.java:3) +``` + +In our example, the stack trace tells us that the `main` method was executed until the program got to line 3, then the `exception` method (`Exception.exception`) was called and executed until the program got to line 9, the origin of the exception. @@ -128,6 +136,7 @@ to its calling method. In general, exception objects will continue to propagatio call stack (i.e., the methods we see in the stack trace) until the program either: i) handles the exception object; or ii) lets the exception propagates out of `main`. + In our example, the exception propagated from `exception` to `main`, and since the `main` method does not handle the exception, the exception continued to oropagate out of `main` and crash the program. Any time an exception is allowed to propagate out of `main`, the program will crash. It's our job to From ffc333af5b955e9f169cda6677294813eb4feaf5 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 12:45:19 -0400 Subject: [PATCH 184/212] Update setup.sh --- javadoc/setup.sh | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/javadoc/setup.sh b/javadoc/setup.sh index e8fb529d..cfa9b0e0 100644 --- a/javadoc/setup.sh +++ b/javadoc/setup.sh @@ -1,15 +1,21 @@ #!/bin/bash -if [ ! -d "cs1302-javadoc" ]; then - git clone --depth 1 --no-checkout https://github.com/cs1302uga/cs1302-tutorials.git cs1302-javadoc - cd cs1302-javadoc - git checkout master -- javadoc - rm -f javadoc/setup.sh - mv javadoc/* ./ - rm -rf javadoc +REPO=https://github.com/cs1302uga/cs1302-tutorials.git +BRANCH=alsi +FROMDIR=javadoc +TODIR=cs1302-javadoc + +if [ ! -d "${TODIR}" ]; then + git clone --depth 1 --no-checkout ${REPO} ${TODIR} + cd ${TODIR} + git checkout ${BRANCH} -- ${FROMDIR} + rm -f ${FROMDIR}/setup.sh + mv ${FROMDIR}/* ./ + rm -rf ${FROMDIR} rm -rf .git mkdir bin doc - echo "subdirectory cs1302-javadoc successfully created" + echo "subdirectory ${TODIR} successfully created" else >&2 echo "subdirectory cs1302-javadoc already exists" + >&2 echo "if you want to start over, delete or rename the existing directory" fi From 4c17116db14e9bf570a519b7662d5da234821b47 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 12:45:51 -0400 Subject: [PATCH 185/212] Update javadoc.md --- javadoc/javadoc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javadoc/javadoc.md b/javadoc/javadoc.md index ac736756..aecf1220 100644 --- a/javadoc/javadoc.md +++ b/javadoc/javadoc.md @@ -58,7 +58,7 @@ The steps in this tutorial assume that you are logged into the Odin server. called `cs1302-javadoc`: ``` - $ curl -s -L https://git.io/fh0nG | bash + $ curl -s -L https://raw.githubusercontent.com/cs1302uga/cs1302-tutorials/alsi/javadoc/setup.sh | bash ``` 1. Change into the `cs1302-javadoc` directory that was just created and look around. There should be From f73779c7a24d6e41dac4f66d54a992fe50ff66ad Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 12:48:21 -0400 Subject: [PATCH 186/212] Update setup.sh --- javadoc/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javadoc/setup.sh b/javadoc/setup.sh index cfa9b0e0..686f14cf 100644 --- a/javadoc/setup.sh +++ b/javadoc/setup.sh @@ -6,7 +6,7 @@ FROMDIR=javadoc TODIR=cs1302-javadoc if [ ! -d "${TODIR}" ]; then - git clone --depth 1 --no-checkout ${REPO} ${TODIR} + git clone --depth 1 --no-checkout --branch ${BRANCH} ${REPO} ${TODIR} cd ${TODIR} git checkout ${BRANCH} -- ${FROMDIR} rm -f ${FROMDIR}/setup.sh From 5e0af2cf50dc3f8da62915ba0a2e9a037520ba4d Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 12:50:31 -0400 Subject: [PATCH 187/212] Update setup.sh --- javadoc/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javadoc/setup.sh b/javadoc/setup.sh index 686f14cf..0ae59631 100644 --- a/javadoc/setup.sh +++ b/javadoc/setup.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash -x REPO=https://github.com/cs1302uga/cs1302-tutorials.git BRANCH=alsi From e7cfd10cc794186f5d7fd88ee65a00d7e97ca707 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 12:52:01 -0400 Subject: [PATCH 188/212] Update setup.sh --- javadoc/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javadoc/setup.sh b/javadoc/setup.sh index 0ae59631..686f14cf 100644 --- a/javadoc/setup.sh +++ b/javadoc/setup.sh @@ -1,4 +1,4 @@ -#!/bin/bash -x +#!/bin/bash REPO=https://github.com/cs1302uga/cs1302-tutorials.git BRANCH=alsi From 0ebcf2dc3d470577d75c1a764d492781c81ec7b2 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 12:58:24 -0400 Subject: [PATCH 189/212] Update setup.sh --- javadoc/setup.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/javadoc/setup.sh b/javadoc/setup.sh index 686f14cf..bf9edc83 100644 --- a/javadoc/setup.sh +++ b/javadoc/setup.sh @@ -14,8 +14,11 @@ if [ ! -d "${TODIR}" ]; then rm -rf ${FROMDIR} rm -rf .git mkdir bin doc + if command -v tree; then + tree ${TODIR} + fi echo "subdirectory ${TODIR} successfully created" else - >&2 echo "subdirectory cs1302-javadoc already exists" + >&2 echo "subdirectory ${TODIR} already exists" >&2 echo "if you want to start over, delete or rename the existing directory" fi From 3bf984046c4ca435de0ff49ed4f627e0b02141f1 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 12:59:19 -0400 Subject: [PATCH 190/212] Update setup.sh --- javadoc/setup.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/javadoc/setup.sh b/javadoc/setup.sh index bf9edc83..8e9fc4d6 100644 --- a/javadoc/setup.sh +++ b/javadoc/setup.sh @@ -7,13 +7,14 @@ TODIR=cs1302-javadoc if [ ! -d "${TODIR}" ]; then git clone --depth 1 --no-checkout --branch ${BRANCH} ${REPO} ${TODIR} - cd ${TODIR} + pushd ${TODIR} git checkout ${BRANCH} -- ${FROMDIR} rm -f ${FROMDIR}/setup.sh mv ${FROMDIR}/* ./ rm -rf ${FROMDIR} rm -rf .git mkdir bin doc + popd if command -v tree; then tree ${TODIR} fi From 503b4d4aafbc3298d7315b875f983e2d7cded6d3 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 13:00:22 -0400 Subject: [PATCH 191/212] Update setup.sh --- javadoc/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javadoc/setup.sh b/javadoc/setup.sh index 8e9fc4d6..e8937c79 100644 --- a/javadoc/setup.sh +++ b/javadoc/setup.sh @@ -15,7 +15,7 @@ if [ ! -d "${TODIR}" ]; then rm -rf .git mkdir bin doc popd - if command -v tree; then + if command -v tree &>/dev/null; then tree ${TODIR} fi echo "subdirectory ${TODIR} successfully created" From 26061daa937aefa150407a6d788ad288dd5532ff Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 13:04:57 -0400 Subject: [PATCH 192/212] Update setup.sh --- javadoc/setup.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/javadoc/setup.sh b/javadoc/setup.sh index e8937c79..ddeb59a4 100644 --- a/javadoc/setup.sh +++ b/javadoc/setup.sh @@ -1,20 +1,25 @@ #!/bin/bash +# setup info REPO=https://github.com/cs1302uga/cs1302-tutorials.git BRANCH=alsi FROMDIR=javadoc TODIR=cs1302-javadoc if [ ! -d "${TODIR}" ]; then + # get tutorial starter code git clone --depth 1 --no-checkout --branch ${BRANCH} ${REPO} ${TODIR} pushd ${TODIR} git checkout ${BRANCH} -- ${FROMDIR} + # clean up what we got rm -f ${FROMDIR}/setup.sh mv ${FROMDIR}/* ./ rm -rf ${FROMDIR} rm -rf .git + # create bin and doc mkdir bin doc popd + # if tree is available, show the directory if command -v tree &>/dev/null; then tree ${TODIR} fi From 38a2dee668fd1f7446c9183c2509ed01891c3de2 Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 13:09:53 -0400 Subject: [PATCH 193/212] Update setup.sh --- javadoc/setup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javadoc/setup.sh b/javadoc/setup.sh index ddeb59a4..c38fbc39 100644 --- a/javadoc/setup.sh +++ b/javadoc/setup.sh @@ -9,7 +9,7 @@ TODIR=cs1302-javadoc if [ ! -d "${TODIR}" ]; then # get tutorial starter code git clone --depth 1 --no-checkout --branch ${BRANCH} ${REPO} ${TODIR} - pushd ${TODIR} + pushd ${TODIR} &>/dev/null git checkout ${BRANCH} -- ${FROMDIR} # clean up what we got rm -f ${FROMDIR}/setup.sh @@ -18,7 +18,7 @@ if [ ! -d "${TODIR}" ]; then rm -rf .git # create bin and doc mkdir bin doc - popd + popd &>/dev/null # if tree is available, show the directory if command -v tree &>/dev/null; then tree ${TODIR} From 604fd2066dcb02a1733847d0393af929bed193ee Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Tue, 5 Sep 2023 13:15:04 -0400 Subject: [PATCH 194/212] Update setup.sh --- javadoc/setup.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/javadoc/setup.sh b/javadoc/setup.sh index c38fbc39..ea8dee5d 100644 --- a/javadoc/setup.sh +++ b/javadoc/setup.sh @@ -6,6 +6,9 @@ BRANCH=alsi FROMDIR=javadoc TODIR=cs1302-javadoc +FILESTOREMOVE=".git javadoc-figure.png javadoc-figure.pptx javadoc.md" # do not leave empty +DIRSTOMAKE="bin doc" # do not leave empty + if [ ! -d "${TODIR}" ]; then # get tutorial starter code git clone --depth 1 --no-checkout --branch ${BRANCH} ${REPO} ${TODIR} @@ -15,9 +18,9 @@ if [ ! -d "${TODIR}" ]; then rm -f ${FROMDIR}/setup.sh mv ${FROMDIR}/* ./ rm -rf ${FROMDIR} - rm -rf .git + rm -rf ${FILESTOREMOVE} # create bin and doc - mkdir bin doc + mkdir -p ${DIRSTOMAKE} popd &>/dev/null # if tree is available, show the directory if command -v tree &>/dev/null; then From 63e4415e93e320c69a04767566711332ce7d5309 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 6 Sep 2023 14:33:37 -0400 Subject: [PATCH 195/212] Update uml.md --- uml/uml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uml/uml.md b/uml/uml.md index 9c59b542..d07294ef 100644 --- a/uml/uml.md +++ b/uml/uml.md @@ -1,6 +1,6 @@ # UML Class Diagrams -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ## Introduction From bad873395d930cdb4fbd027bb760c0a6d32249ec Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 6 Sep 2023 14:34:11 -0400 Subject: [PATCH 196/212] Update scripts.md --- scripts/scripts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/scripts.md b/scripts/scripts.md index 39144ea0..640ea97d 100644 --- a/scripts/scripts.md +++ b/scripts/scripts.md @@ -1,6 +1,6 @@ # Interpreter Scripts -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ## What is an Interpreter Script? From 4f2b072addf99b7d47be60d9456808fca18a0b1e Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 6 Sep 2023 14:34:42 -0400 Subject: [PATCH 197/212] Update varargs.md --- varargs/varargs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/varargs/varargs.md b/varargs/varargs.md index 9f7ff5e0..3364c021 100644 --- a/varargs/varargs.md +++ b/varargs/varargs.md @@ -1,6 +1,6 @@ # Variable Arguments (Varargs) Reading -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ## Introduction From f7cf4b90c0572c00452e16c4afed09b549fad71f Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Wed, 6 Sep 2023 14:35:14 -0400 Subject: [PATCH 198/212] Update inheritance.md --- inheritance/inheritance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inheritance/inheritance.md b/inheritance/inheritance.md index e8547753..f5797039 100644 --- a/inheritance/inheritance.md +++ b/inheritance/inheritance.md @@ -1,6 +1,6 @@ # Inheritance -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) This tutorial introduces the reader to Java inheritance and polymorphism via inheritance. From 72fca8ae0adbc3d1fa98af1a78a4845c9e3cd0b9 Mon Sep 17 00:00:00 2001 From: charles k <52868068+charleskimbac@users.noreply.github.com> Date: Sat, 9 Sep 2023 18:44:20 -0400 Subject: [PATCH 199/212] Update exceptions2.md --- exceptions/exceptions2.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exceptions/exceptions2.md b/exceptions/exceptions2.md index 15828d77..f0b9300b 100644 --- a/exceptions/exceptions2.md +++ b/exceptions/exceptions2.md @@ -87,7 +87,7 @@ Let's look at an example. ``` This error indicates that the `Scanner` constructor throws a `FileNotFoundException`. `FileNotFoundException` is a **checked exception**. When a method or constructor call throws a checked exception, the programmer must either: - * surround the relevant call with a try-catch or + * surround the relevant call with a try-catch; or * add a throws clause to the enclosing method (i.e., the method containing the call) to propogate this exception if it occurs. In `Checked.java`, the enclosing method is `main`. We never want to add a `throws` clause to the `main` method as there is no code in @@ -182,14 +182,14 @@ public int computeAverage(double[] nums) throws IllegalArgumentException { ``` Using the `throws` keyword, we told Java that the `IllegalArgumentException` -will not be handled directly in this method. Intead it will be _propagated_ +will not be handled directly in this method. Instead it will be _propagated_ up to the calling method, i.e., the method or methods, somewhere else, that are actually calling `computeAverage`. In that other method, the programmer can either handle the exception (using a try-catch) or choose to propagate it again by repeating the `throws` in the calling method's signature. In Java, checked exceptions must either be handled directly using a try-catch -or progated up using `throws`. Note, while it is possible to place a `throws` +or progated up using `throws`. Note that while it is possible to place a `throws` in the signature of a program's `main` method, doing so is _strongly_ discouraged as exceptions propagated past `main` will always cause the program to crash. From bf9cce36b707340a9fc01118a53b4c3b6ffaae7b Mon Sep 17 00:00:00 2001 From: charles k <52868068+charleskimbac@users.noreply.github.com> Date: Sun, 10 Sep 2023 23:53:07 -0400 Subject: [PATCH 200/212] Update uml.md focuses > focusses in american english --- uml/uml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uml/uml.md b/uml/uml.md index d07294ef..f74c549e 100644 --- a/uml/uml.md +++ b/uml/uml.md @@ -6,7 +6,7 @@ In object-oriented programming, it's not uncommon to visualize classes and their relationships using the Unified Modeling Language (UML). -While UML has many different types of diagrams, this reading focusses only +While UML has many different types of diagrams, this reading focuses only on UML class diagrams. ### Basic Class Diagram From fc1dfc954d95975cf1ca6251e2b2e03f5deec5c2 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 17 Sep 2023 17:16:13 -0400 Subject: [PATCH 201/212] Update visibility.rst --- visibility/visibility.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/visibility.rst b/visibility/visibility.rst index 1202a282..24c2b2e1 100644 --- a/visibility/visibility.rst +++ b/visibility/visibility.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta - :alt: Approved for: Spring 2023 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202023-green + :alt: Approved for: Fall 2023 .. external links .. |uml_tutorial| replace:: UML Class Diagrams From 9db7405c94a9bb758cba9b57a6d27e748e21a01d Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 17 Sep 2023 17:16:49 -0400 Subject: [PATCH 202/212] Update public-and-private.rst --- visibility/public-and-private.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/public-and-private.rst b/visibility/public-and-private.rst index 44debcc1..044c97a3 100644 --- a/visibility/public-and-private.rst +++ b/visibility/public-and-private.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta - :alt: Approved for: Spring 2023 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202023-green + :alt: Approved for: Fall 2023 .. external links .. |jls11_access_control| replace:: The Java Language Specification (JLS) 11 Section 6.6 From ed43cbd657c41711f315262769b892d40d1c6c17 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 17 Sep 2023 17:18:41 -0400 Subject: [PATCH 203/212] Update package-private.rst --- visibility/package-private.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/package-private.rst b/visibility/package-private.rst index e23847aa..0e3bf10e 100644 --- a/visibility/package-private.rst +++ b/visibility/package-private.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta - :alt: Approved for: Spring 2023 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202023-green + :alt: Approved for: Fall 2023 Visibility Reading ################## From cea5638e362b6a5cfd946f1093f9b550ec7ced82 Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sun, 17 Sep 2023 17:19:06 -0400 Subject: [PATCH 204/212] Update protected.rst --- visibility/protected.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/protected.rst b/visibility/protected.rst index d67c1215..b3fc5a17 100644 --- a/visibility/protected.rst +++ b/visibility/protected.rst @@ -1,5 +1,5 @@ -.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Spring%202023-magenta - :alt: Approved for: Spring 2023 +.. |approval_notice| image:: https://img.shields.io/badge/Approved%20for-Fall%202023-green + :alt: Approved for: Fall 2023 Visibility Reading ################## From c95c5dae319534145b594d902aa4eddb1013a04a Mon Sep 17 00:00:00 2001 From: Michael Cotterell Date: Mon, 18 Sep 2023 07:58:40 -0400 Subject: [PATCH 205/212] Update unix-getting-started.rst --- unix/unix-getting-started.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/unix/unix-getting-started.rst b/unix/unix-getting-started.rst index 2e977519..c47c2ea8 100644 --- a/unix/unix-getting-started.rst +++ b/unix/unix-getting-started.rst @@ -208,6 +208,7 @@ You should NOT use any of the following programs to connect to Odin: * `Video Studio Code Remote Development Extension `_ * `code-server `_ +* `JetBrains Remote Development Toolset `_ Using the programs mentioned above or programs like the ones mentioned above without permission violates sections 4.2 and 4.3 of the From 84ff590e0c7927f6f922e3422a15738d4dec87c5 Mon Sep 17 00:00:00 2001 From: charles k <52868068+charleskimbac@users.noreply.github.com> Date: Mon, 18 Sep 2023 22:47:19 -0400 Subject: [PATCH 206/212] Update scripts.md --- scripts/scripts.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/scripts.md b/scripts/scripts.md index 640ea97d..5bd12f68 100644 --- a/scripts/scripts.md +++ b/scripts/scripts.md @@ -17,7 +17,7 @@ An interpreter script needs to satisfy the following requirements: #! interpreter [optional-arg] ``` - Historically, his first line is known as a _shebang_ since it starts with + Historically, this first line is known as a _shebang_ since it starts with the number sign followed by an exclamation mark. The interpreter must be a valid pathname for an executable program which is not @@ -90,7 +90,7 @@ terminal shell. Let's create one! 1. Verify that the permissions are changed using `ls -l` or `stat`. -1. Execute the script. To do this simple provide an absolute path to +1. Execute the script. To do this, simply provide an absolute path to the script name or an abbreviated absolute path using the `.` directory. For example, you might try one of the following, the first of which will need to be modified slightly based on the @@ -112,7 +112,7 @@ terminal shell. Let's create one! 1. Notice the output. It executed both commands! - 1. That's it! You now know know the basics of Bash scripts. There is a lot + 1. That's it! You now know the basics of Bash scripts. There is a lot more than can be done, but we recommend that you look those things up when you need them. For further reading, the nicely written and free _BASH Programming_ book by Mike G can be found From 708f2cff98cd37f186a73a289b2505ee7f639564 Mon Sep 17 00:00:00 2001 From: charles k <52868068+charleskimbac@users.noreply.github.com> Date: Mon, 18 Sep 2023 22:52:17 -0400 Subject: [PATCH 207/212] Update varargs.md --- varargs/varargs.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/varargs/varargs.md b/varargs/varargs.md index 3364c021..ae7eafd5 100644 --- a/varargs/varargs.md +++ b/varargs/varargs.md @@ -26,7 +26,7 @@ public static void printlns(PrintStream out, String[] args) { Then, [elsewhere](src/cs1302/util/Driver.java), you might call the `printlns` method like this: -``` +```java // elsewhere Helper.printlns(System.out, new String[] { "a", "b", "c" }); Helper.printlns(System.out, new String[] { "d", "e" }); @@ -47,10 +47,10 @@ Helper.printlns(System.out, new String[] { "g", "h", "i", "j", "k" }); ``` To facilitate this, your first instinct might be to create a set -of method _overloads_ for the `printlns` method. That's a good thought, +of method _overloads_ for the `printlns` method. That's a good thought; however, it would also be tedious. How many parameters will the method need? Is it three? Two? One? We don't really know ahead of time. -This is where a **varags declaration** comes into play: +This is where a **varargs declaration** comes into play: ```java /** From 8c48a93206739c789f75f8d2ad3279e493ba6b80 Mon Sep 17 00:00:00 2001 From: charles k <52868068+charleskimbac@users.noreply.github.com> Date: Mon, 18 Sep 2023 23:10:14 -0400 Subject: [PATCH 208/212] Update inheritance.md --- inheritance/inheritance.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/inheritance/inheritance.md b/inheritance/inheritance.md index f5797039..2ee4eb59 100644 --- a/inheritance/inheritance.md +++ b/inheritance/inheritance.md @@ -98,7 +98,7 @@ in which they are declared. According the Java Language Specification, the [`java.lang.Object`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html) -class is the superclass for all other classes [1]. Take a few moments to look through +class is the superclass for all other classes [[1]](https://github.com/cs1302uga/cs1302-tutorials/blob/alsi/inheritance/inheritance.md#references). Take a few moments to look through the `Object` class documentation. Write down any methods you recognize and may have used in the past in your notes. Remember, all classes that you create automatically inherit those methods. That is, if a class does not explicitly extend another class, then it implicitly extends `Object`. Therefore, @@ -117,7 +117,7 @@ When we say that a parent constructor is called, we don't mean something like `n no object of the parent class is made in what we're describing. Instead, "using `super` to call a parent constructor" just means that we're telling Java to execute the code that's in a parent constructor. Java does this in order to facilitate a separation of concerns; that is, it lets -each class setup/initialize their own stuff so that the child class doesn't have to duplicate the +each class setup/initialize their own variables so that the child class doesn't have to duplicate the work that's written in the parent. We'll illustrate this with a small example in just a moment, but first take care to read the following note: @@ -151,14 +151,14 @@ To work through this example, perform the following steps: Go ahead and call the `Animal` constructor from within the `Dog` constructor using `"Canis"` and `"Lupus Familiaris"` as the genus and species, respectively. This will setup the `genus` and `species` - variable within any `Dog` objects that are created - similar to what was done in the first example video. + variable within any `Dog` objects that are created — similar to what was done in the first example video. **Note: Since `genus` and `species` are declared with `private` visibility, you cannot do the following in the `Dog` constructor since you do not have direct access to those variables:** ```java super.genus = "Canis"; - super.species = "Lupus Familiaris" + super.species = "Lupus Familiaris"; ``` Even if the visibility allowed you to write the lines above, you should avoid doing so! @@ -253,14 +253,14 @@ an **optional** annotation that lets the compiler know your intent is to overrid Try the following scenarios: 1. Omit the `@Override`, then recompile. -1. Omit the `@Override` and mispell the `toString` method name, then recompile. -1. Include the `@Override` and mispell the `toString` method name, then recompile. +1. Omit the `@Override` and misspell the `toString` method name, then recompile. +1. Include the `@Override` and misspell the `toString` method name, then recompile. Notice the error that occurs in the third situation that did not occur in the second. This is the primary purpose of the annotation. Although optional, it allowed you to tell the compiler that your intent is to override. If the compiler -sees the `@Override` annotation, then it checks to make sure it's an override - and -it can let you know if you made a mistake! +sees the `@Override` annotation, then it checks to make sure it's an override and +will let you know if you made a mistake! ### References From 7c4fe6e6580f140c60a385c70c6e10bae3be64fe Mon Sep 17 00:00:00 2001 From: Brad Barnes Date: Sat, 23 Sep 2023 16:38:15 -0400 Subject: [PATCH 209/212] Update adt-and-links.md --- adt-and-links/adt-and-links.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adt-and-links/adt-and-links.md b/adt-and-links/adt-and-links.md index af876707..5af1953f 100644 --- a/adt-and-links/adt-and-links.md +++ b/adt-and-links/adt-and-links.md @@ -1,6 +1,6 @@ # ADTs and Lists Tutorial -![Approved for: Spring 2023](https://img.shields.io/badge/Approved%20for-Spring%202023-magenta) +![Approved for: Fall 2023](https://img.shields.io/badge/Approved%20for-Fall%202023-green) ## Introduction From 225c55c8cd40424cc030dac84d01a5f656390975 Mon Sep 17 00:00:00 2001 From: charles k <52868068+charleskimbac@users.noreply.github.com> Date: Thu, 28 Sep 2023 02:12:41 -0400 Subject: [PATCH 210/212] Update visibility.rst --- visibility/visibility.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/visibility/visibility.rst b/visibility/visibility.rst index 24c2b2e1..6148840b 100644 --- a/visibility/visibility.rst +++ b/visibility/visibility.rst @@ -65,11 +65,11 @@ public ``public`` ``+`` |Y| |Y| interfaces. .. [2] A **member-level declaration** is any declaration of a class or interface member. - Members can include, where applicable, the constructors, methods, variables, constants, - etc. (both static or non-static/instance) of the class or interface; however, they - never includes Local-level declarations. + Members can include, where applicable, the constructors, methods, variables, and constants + (both static or non-static/instance) of a class or interface. However, they + never include local-level declarations. -.. [3] A **local-level declaration** is any variable declaration that is local, in +.. [3] A **local-level declaration** is any variable declaration that is local, or in scope, to a particular method. The local variables of a method include its parameter and any variables declared within the body of the method. From 39644304ba30888d1fb4b6e23820fce541ac0e12 Mon Sep 17 00:00:00 2001 From: charles k <52868068+charleskimbac@users.noreply.github.com> Date: Thu, 28 Sep 2023 02:28:52 -0400 Subject: [PATCH 211/212] Update public-and-private.rst --- visibility/public-and-private.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/visibility/public-and-private.rst b/visibility/public-and-private.rst index 044c97a3..41e0f514 100644 --- a/visibility/public-and-private.rst +++ b/visibility/public-and-private.rst @@ -28,7 +28,7 @@ Name Same Class Same Package Child Class Elsewhere public |Y| |Y| |Y| |Y| =============== ========== ============ =========== ========= -* In Java, the ``public`` modifier must be included in a declararion for +* In Java, the ``public`` modifier must be included in a declaration for it to be considered public by the compiler. * In UML, the ``+`` symbol is used just before a member's identifier to illustrate that it's public. It is also common practice to assume @@ -56,14 +56,14 @@ Name Same Class Same Package Child Class Elsewhere private |Y| |N| |N| |N| =============== ========== ============ =========== ========= -* In Java, the ``private`` modifier must be included in a member's declararion for +* In Java, the ``private`` modifier must be included in a member's declaration for it to be considered private by the compiler. * In UML, the ``-`` symbol is used just before a member's identifier to illustrate that it's private. * The ``javadoc`` program does not include private declarations in a documentation website by default; however, they can be included by adding the ``-private`` command-line argument (that option will - also include anything that is more visible than private -- so + also include anything that is more visible than private — so everything). Example 1 @@ -92,7 +92,7 @@ the same as ``this.checkAge``) declared within the same class. Although that method is private, it's visible from ``LINE1`` because private members are always visible from within the same class. A similar argument can be made for the code on ``LINE2``, -which attempts to access the private intance variable ``age``. +which attempts to access the private instance variable ``age``. Example 2 ========= @@ -136,7 +136,7 @@ to ``setAge`` on the next line (see the previous example for the inside of ``set We're not sure how the author of ``OtherClass`` knew about the ``checkAge`` method, but the error message lets them know that it's not for them to use. Had they referred to the Javadoc/API documentation for the ``Person`` class, it's unlikely that the private method -would have been included (private members are not included in the `javadoc` output by default). +would have been included (private members are not included in the ``javadoc`` output by default). If it's private, then it's not for others, and if it's not even listed in the documentation, then that's less stuff that other programmers need to understand before they're able to use your code. From ba016ae2876d8a91665162f27123919ad4c9c6a6 Mon Sep 17 00:00:00 2001 From: nivedhanatarajan7 <129971342+nivedhanatarajan7@users.noreply.github.com> Date: Thu, 28 Sep 2023 22:17:12 -0400 Subject: [PATCH 212/212] Fixed typos "it's" to "its" and "access access" to "access" --- visibility/protected.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/visibility/protected.rst b/visibility/protected.rst index b3fc5a17..9b695037 100644 --- a/visibility/protected.rst +++ b/visibility/protected.rst @@ -204,7 +204,7 @@ Perhaps that's a little dense. You may find it easier to remember this: Non-Visible Inherited Members ============================= -It's often possible to access access non-visible inherited members indirectly +It's often possible to access non-visible inherited members indirectly via a member that is visible. * For inherited variables, the child class might utilize a visible getter or setter. @@ -216,7 +216,7 @@ via a member that is visible. If we apply the second idea to constructors, then a child class constructor may be able to access non-visible inherited variables (e.g., to initialize them) using a call to a visible ``super()`` (or some overload of ``super``); this works really well when -the parent constructor initializes it's own declared instance variables. +the parent constructor initializes its own declared instance variables. This is considered **a common pattern** that exemplifies *separation of concerns* and *encapsulation* as each class is responsible for its own variables.