{"id":29484067,"url":"https://github.com/joyofcodingpdx/katassummer2025","last_synced_at":"2026-01-20T16:47:57.170Z","repository":{"id":302548205,"uuid":"1012830349","full_name":"JoyOfCodingPDX/KatasSummer2025","owner":"JoyOfCodingPDX","description":"In-class kata exercises that we do in pairs and mobs","archived":false,"fork":false,"pushed_at":"2025-07-19T14:38:46.000Z","size":352,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-19T18:34:39.178Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JoyOfCodingPDX.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-03T00:33:39.000Z","updated_at":"2025-07-19T14:35:10.000Z","dependencies_parsed_at":"2025-07-19T16:28:04.237Z","dependency_job_id":"459f11f3-a548-4774-8169-d73105d28310","html_url":"https://github.com/JoyOfCodingPDX/KatasSummer2025","commit_stats":null,"previous_names":["joyofcodingpdx/katassummer2025"],"tags_count":0,"template":false,"template_full_name":"JoyOfCodingPDX/GettingStarted","purl":"pkg:github/JoyOfCodingPDX/KatasSummer2025","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoyOfCodingPDX%2FKatasSummer2025","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoyOfCodingPDX%2FKatasSummer2025/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoyOfCodingPDX%2FKatasSummer2025/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoyOfCodingPDX%2FKatasSummer2025/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JoyOfCodingPDX","download_url":"https://codeload.github.com/JoyOfCodingPDX/KatasSummer2025/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoyOfCodingPDX%2FKatasSummer2025/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267329886,"owners_count":24069935,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-27T02:00:11.917Z","response_time":82,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-15T04:21:40.855Z","updated_at":"2026-01-20T16:47:57.141Z","avatar_url":"https://github.com/JoyOfCodingPDX.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Java CI with Maven](https://github.com/JoyOfCodingPDX/KatasSummer2025/actions/workflows/maven.yml/badge.svg)](https://github.com/JoyOfCodingPDX/KatasSummer2025/actions/workflows/maven.yml)\n\n# Getting Started with The Joy of Coding with Java and Android\n\nThis repository helps students in [The Joy of Coding](http://web.cecs.pdx.edu/~whitlock/) get started with the\nprogramming assignments.  Most notably, it gives students experience working with Git repositories and removed\nthe need to install [Apache Maven](https://maven.apache.org/install.html)\non their local machines (or the PSU machines) in order to create and\nbuild the programming projects.  It makes liberal use of the [Maven\nWrapper](https://github.com/takari/maven-wrapper) script which\nautomatically downloads and installs the version of Maven needed for\nthe programming projects.  **You do not need to install Maven on your\nlocal development machine.**\n\nPrior to following these instructions, you may want to review the\n\"Getting Started with Java\"\n[slides](http://web.cecs.pdx.edu/~whitlock/pdf/Getting%20started%20with%20Java.pdf)\nand\n[screencast](https://www.youtube.com/watch?v=VZXEwcgigaw\u0026list=SPyM7S4CZk9WPrtC8AclCNxOBA8buEJdib)\nfrom the [course's website](http://web.cecs.pdx.edu/~whitlock/).\n\n# Contents\n1. [How do I use this repository?](#how-do-i-use-this-repository)\n    1. [What do I need to do before I can use this repository?](#what-do-i-need-to-do-before-i-can-use-this-repository)\n    2. [How do I use the Java Development Kit?](#how-do-i-use-the-java-development-kit)\n        1. [How do I configure the JDK on the PSU Linux machines?](#how-do-i-configure-the-jdk-on-the-psu-linux-machines)\n        2. [How do I install the JDK on my personal machine?](#how-do-i-install-the-jdk-on-my-personal-machine)\n    3. [How do I configure information about myself?](#how-do-i-configure-information-about-myself)\n    4. [How do I create and run my own Java projects?](#how-do-i-create-and-run-my-own-java-projects)\n    5. [How can I commit my code to this repository?](#how-can-i-commit-my-code-to-this-repository)\n    6. [How do I work with code from this repository using IntelliJ?](#how-do-i-work-with-code-from-this-repository-using-intellij)\n    7. [How can I get a copy of this code on the CS Department's Linux machines?](#how-can-i-get-a-copy-of-this-code-on-the-cs-departments-linux-machines)\n    8. [How can I get changes that other people make into my clone?](#how-can-i-get-changes-that-other-people-make-into-my-clone)\n2. [How do I submit my projects?](#how-do-i-submit-my-projects)\n    1. [About how long do the projects take to complete?](#about-how-long-do-the-projects-take-to-complete)\n3. [How do I use the \"parent POM\"?](#how-do-i-use-the-parent-pom)\n    1. [What's the deal with warnings about an incorrect parent POM?](#whats-the-deal-with-warnings-about-an-incorrect-parent-pom)\n4. [How can I use a debugger to uncover the source of problems with my projects?](#how-can-i-use-a-debugger-to-uncover-the-source-of-problems-with-my-projects)\n5. [How can I create a website for the projects in this repository?](#how-can-i-create-a-website-for-the-projects-in-this-repository)\n6. [How can I improve this repository?](#how-can-i-improve-this-repository)\n\n## How do I use this repository?\n\nIn order to use this repository, you must have a Git environment available on your development machine.\nI recommend [installing\ngit](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) on\nyour development machine to gain experience with the `git` command line tools (or the [GitHub \nDesktop](https://desktop.github.com/) tools).  If you are not able to get Git working on your development\nmachine, [IntelliJ has really great support for Git](https://www.jetbrains.com/help/idea/using-git-integration.html)\nand makes it easy to perform fundamental clone/commit/push/pull Git operations.\n\nAfter you have configured Git on your development machine, you need to create a repository of your own in which\nyou can do your work.\nIf you simply make a `git clone` of this GitHub repository on your\nlocal machine, you can commit changes to your local repository, but\nyou can't \"push\" your changes to the repository hosted on GitHub.\nThis is because I own this GitHub repository, and you do not have\npermission to push changes from your local repository into my\nrepository.  Even if I did give you permission to push to my\nrepository, we don't want the source code that you wrote for your\nprojects to be available publicly for everyone to see.\n\nHowever, it is very useful to leverage git (and GitHub) to\neasily move that code between multiple machines.  It enables you\nto develop your code on your local machine and test it on the PSU CS\nDepartment's machines before you submit it.  This is possible to do\nwith GitHub, but it requires some extra steps.\n\nFirst, create a [GitHub \"student\ndeveloper\"](https://education.github.com/pack) account that gives you\nfree private repositories.  Then [create a private GitHub\nrepository from this \"template\" repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template)\nfor your source code for this course.  (In this example, the\nrepository is named \"JoyOfCodingSummer2025\".)\n\nAgain, please ensure that all of your code for the assignments is in a \n**private** GitHub repository.  GitHub makes it very easy for people to\nfind your code, and you do **not** want to have your work plagiarized.  After\nthe course is over, if you want to make your repository public to\nhelp contribute to your coding portfolio, that's fine.  I do ask that \ncurrent students not leverage former students' code to inform their \nprojects.  If you have questions about your code that you'd like me to\nanswer, please feel free to [make me a collaborator](https://docs.github.com/en/github/setting-up-and-managing-your-github-user-account/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository)\non your private repository.  I will try my best to engage you in a \ndiscussion about your code.\n\nThe below `git` command line examples are expressed using UNIX syntax.  They\nare known to work on the CS Department's Linux machines and on macOS.  Students\nwho run on Windows may need to use \"Git CMD\" instead of \"Git Bash\" to get \nauthentication with GitHub to work with HTTPS.  (Note that GitHub will no longer authenticate HTTPS with \nusername/password credentials.  Authenticating with [ssh keys](https://docs.github.com/en/authentication/connecting-to-github-with-ssh)\nor with [personal access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)\nis recommended.)\n\n\n### What do I need to do before I can use this repository?\n\nThe following command lines assume that you are running in the\ndirectory created by cloning the repository.\n\n```sh\n$ cd JoyOfCodingSummer2025\n```\n\n### How do I use the Java Development Kit?\n\nThe Java Development Kit (JDK) provides tools for compiling, packaging, and\nrunning Java applications.  \n\nThis course requires at least Java 17.  You can determine which version of Java is configured in your environment\nby issuing the `java -version` command:\n\n```sh\n$ java -version\nopenjdk version \"21.0.5\" 2024-10-15\nOpenJDK Runtime Environment (build 21.0.5+11-Ubuntu-1ubuntu124.04)\nOpenJDK 64-Bit Server VM (build 21.0.5+11-Ubuntu-1ubuntu124.04, mixed mode, sharing)\n```\n\n#### How do I configure the JDK on the PSU Linux machines?\n\nRegardless of where your code is developed, it will be tested on the [MCECS Linux machines](https://cat.pdx.edu/platforms/linux/) \n(the machines in the `linux.cecs.pdx.edu` cluster).  Furthermore, projects can only be submitted\nfrom the PSU Linux machines, so you'll need to make sure that your environment on these machines\nis configured to run the right version of Java.\n\nThe PSU Linux machines are regularly patched and have a fairly recent version of Java installed.  Log into the PSU Linux\ncluster and run the `java -version` as mentioned above to determine which version of Java will be used. \n\n#### How do I install the JDK on my personal machine?\n\nFor most of the projects in this course, it is possible (although, not optimal) to develop your code using the\ntools on the MCECS Linux machines.  However, it is highly recommended using your personal desktop or laptop to\nleverage tools like IntelliJ to author your projects. \n\nYou'll need to install the [latest version of the Java Development\nKit](https://adoptium.net) in order to run the Maven Wrapper and work\nwith the projects.  (The \"HotSpot\" JVM should be fine for this course.)  \nWindows users should download the \"msi\" (Microsoft Installer)\nbinary for an easy installation and configuration process.  During the \ninstallation process, select \"set the JAVA_HOME\" environment variable in order\nfor Maven to work correctly on the command line.\n\n### How do I configure information about myself?\n\nAn important initial step in this course it to run the `survey.sh` script.  This script executes a Java program that\nasks you some questions about yourself (such as your name, email address, and MCECS login id) and saves that\ninformation to a `me.xml` in the directory in which the script is run.  (It also emails the XML file to the Grader\nso that the Grader knows who you are, can contact you, and can record your grades.)  The information in this XML file\nis used by other scripts in this repository to create the initial files for your projects and for submitting your\nprojects to the Grader.\n\nNote that the `survey.sh` script **must be executed on one of the PSU MCECS Linux machines**.  It cannot be run on your\nlaptop or local development machine.\n\nFrom the top-level directory of your local repository, run the `survey.sh` script.  It will ask you to enter some information about\nyourself.  This information is used to submit your projects and record your grades.\n\n```sh\n$ ./survey.sh\n```\n\nAfter filling out the survey, commit the `me.xml` file to your git repository, so it can be used by the `submit.sh` script.\n\n```sh\n$ git add me.xml\n$ git commit -m \"Added information about myself from the survey program\"\n$ git push\n```\n\nSending the Grader information about yourself by running the `survey.sh` script counts as your\n[\"Initiation of Attendance\"](https://www.pdx.edu/registration/faculty-guide-initiation-attendance) for the course.\n\n### How do I create and run my own Java projects?\n\nThe primary purpose of this repository is to make it easy to create\nthe skeleton Java projects that are used to start your assignment.\nScripts such as `createStudentProject.sh` will run the appropriate Maven\ncommands to get you started.\n\n```sh\n$ ./createStudentProject.sh\n```\n\n(Note that in this document, I always prefix executables with `./` to\nensure that the executable can be found even if you don't have `.` on\nyour `PATH`.  The survey and project creation scripts must be run on a UNIX machine such as the MCECS Linux machines.  However,\nthe projects may be _developed_ on any machine that runs the supported version of Java.  For instance, it\nis okay to create the project on Linux and then develop it on Windows,\nusing GitHub to share code across machines.)\n\nThis script will generate a new Maven project in a directory named\n`student` for [Project\n0](http://web.cecs.pdx.edu/~whitlock/pdf/Student.pdf), the example\n\"Student\" project.  You can then build this project using the Maven\nWrapper (`mvnw` script) included in the project.  (Students running on \nWindows should invoke the `mvnw.cmd` script to build the Maven project.\nThe UNIX `mvnw` script has been problematic on Windows, even in Git Bash.)\n\n```sh\n$ cd student\n$ ./mvnw verify\n```\n\nNote that the first time that you run Maven, it will download a whole\nton of libraries.  You'll see lots of text fly by.\n\nIf the build completes successful, you can use your favorite editor (I\nhighly recommend [IntelliJ](https://www.jetbrains.com/idea/)) to work \non the project.\n\n#### mvnw doesn't work with Git Bash on Windows\n\nThe Git Bash tool provides a UNIX command line environment on Windows that has support for `git`.  However, attempting\nto run the UNIX `mvnw` script under Git Bash will likely result in this cryptic error:\n\n```shell\ncurl: (3) URL using bad/illegal format or missing URL\nError: Could not find or load main class org.apache.maven.wrapper.MavenWrapperMain\nCaused by: java.lang.ClassNotFoundException: org.apache.maven.wrapper.MavenWrapperMain\n```\n\nIf you encounter this error, run `mvnw.cmd` on Git Bash instead of `mvnw`.\n\n### How can I commit my code to this repository?\n\nAfter creating a Maven project, you can add the code it to your local\nclone by adding the directory to git.\n\n```sh\n$ ./mvnw clean     # Remove files that shouldn't be committed to version control\n$ cd ..            # to JoyOfCodingSummer2025 directory\n$ git add student\n$ git commit -m \"Added source files for student project\"\n```\n\nBy maintaining your project files in version control, you can easily\nrevert to a known good version if something goes screwy.  You can\nalso use [git's branching\nfeatures](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging)\nto easily revisit (and revise) your source code for Project 1 even\nthough you've started working on Project 2.\n\n### How do I work with code from this repository using IntelliJ?\n\n[IntelliJ Idea](https://www.jetbrains.com/idea) is the recommended IDE\nfor this course.  Opening up the `pom.xml` as a Project in IntelliJ\nwill create a new IntelliJ workspace for that Maven project.  IntelliJ\nhas excellent integration with GitHub and I recommend that you use\nIntelliJ's \"Version Control\" tools for committing changes to your code\nand pushing them to GitHub.\n\nNote that you must build the Maven project with `mvnw verify` **before\nyou open the project in IntelliJ**.  If you do not build the Maven\nproject first, none of the project's dependent libraries will be\navailable to IntelliJ and your IDE will be very unhappy.  If you find\nyourself in this situation, close the IntelliJ project, and delete all\n`.iml` files and the `.idea` directory associated with Maven project.\n\nNote also that the first time you open up IntelliJ, you must [configure the Java Development Kit\n(JDK)](https://www.jetbrains.com/help/idea/sdk.html#jdk).  Otherwise, IntelliJ will complain that it cannot find classes\nlike `java.lang.String`.  There will be a lot of red in the IDE.\n\nSome students have used [IntelliJ to run Maven commands](https://www.jetbrains.com/help/idea/work-with-maven-goals.html)\nwhich alleviated the need for them to install a JDK and Git in their local development environment. \n\nIntelliJ alerts the developer to code that requires attention, but not everything labelled as an \"error\" actually causes\nproblems.  In general, if you are able to run unit tests in IntelliJ and successfully build `mvnw clean verify`, your\ncode is likely in good shape.  There are a couple of \"errors\" that IntelliJ identifies that are safe to ignore:\n   * `Plugin ‘org.apache.maven.plugins:maven-surefire-report-plugin:3.0.0-M7’ not found` can be remediated by running `mvnw verify` and `mvnw site`\n   * `Cannot resolve symbol ‘grader’` in a `pom.xml` file can be safely ignored\n\n### How can I get a copy of this code on the CS Department's Linux machines?\n\nWhile your projects can be developed on any machine, they must be\nsubmitted on one of the CS Department's Linux machines.  This not only\nencourages you to build and test your code on the machines on which I\nwill test your code, it is necessary because the `submit.sh` script\nsends an email through a PSU-managed SMTP server.\n\nGitHub makes it very easy to get a copy of your code on any machine.\nBy making a clone of your repository on the CS Department's machine,\nyou can be confident that you have all of your code and, as long as\nyou have pushed all of your changes to GitHub, it will be the same\ncode as you use on your development machine.\n\nAfter `ssh`ing to one of the CS Department's Linux machines, you can\nmake a clone of your GitHub repository using with:\n\n```\n$ git clone https://github.com/YourGitHubId/JoyOfCodingSummer2025.git\n```\n\n### How can I get changes that other people make into my clone?\n\nYou can expect that the scripts and information in this repository\nwill change and evolve over time.  You may want these changes in your\nrepository.  Here's what you need to do to incorporate changes made in\nthis \"upstream\" repository into your own repository.\n\nFirst, configure your repository to have this repository to be a\n\"remote\" named \"upstream\".\n\n```sh\n$ cd JoyOfCodingSummer2025\n$ git remote add upstream https://github.com/JoyOfCodingPDX/GettingStarted.git\n```\n\nThen, you can \"pull\" and \"merge\" changes from the upstream repository\nin to your own local clone.\n\n```sh\n$ git pull upstream main\n```\n\nAfter you've resolved any conflicts caused by changes to your\nrepository and changes to the upstream repository.  You can push those\nchanges back to GitHub (\"origin\") with:\n\n```sh\n$ git push\n```\n\n## How do I submit my projects?\n\nThe reason that this course can scale to support so many students is that many of the time-consuming \"overhead\"\nactivities have been automated.  For instance, extracting project submissions, running projects through the grading\nscripts, and recording grades are automated.  This automation frees up the instructor and the Graders to focus on more valuable\nactivities like answering student questions and providing feedback.  The automation is enabled by conventions and\ntools that standardize the structure of projects (using Maven) and the process for submitting the projects.\n\nProjects are submitted using the `submit.sh` script.  Project code is not submitted through Canvas or by emailing the\ninstructor.  This script invokes a Java program that zips up the source code and emails it to the Grader.  Like the\n`survey.sh` script, it can only be run on the PSU MCECS Linux machines.  This script also builds the project using\n`mvn -Dgrader clean verify` to validate that the code that you are about to submit compiles, the tests succeed, and\nthat the tests provide sufficient code coverage.  Make sure that all of your code compiles before you submit it.\nThe Grader will not to attempt to debug your code.  Your grade will be reduced significantly if your code does not\ncompile and the Grader has to read it.\n\nAdditionally, please remove any debugging or \"println\" output from your program \nbefore you submit it.  Such output can be very helpful during development, but can complicate the job of the Grader who\nhas to wade through extra text to identify the intended output of your program.  The Grader reserves the right to deduct\npoints from projects whose output is difficult to interpret.  You are encouraged to write unit tests to reproduce and \nvalidate defects discovered during development.  If you choose to include debugging statements, they should be enbled \nby a Java system property. \n\nThe `submit.sh` script takes one argument, the name of the Project to submit.  The Project name (number) will determine\nthe directory that contains the project's code.  For instance, you can submit Project 1 by running the following command\nfrom the top-level directory of your git repository clone:\n\n```shell\n$ ./submit.sh Project1\n```\n\nYou will be prompted to confirm the files that you want to submit.\n\nYou will also be asked to provide a rough estimate of the number of hours you spent working on the project.  This \noptional information will be recorded and reported to future students in aggregate to give them an idea of how much\ntime they should plan to spend on projects.  The estimated hours you report will have no bearing on your grade.      \n\nThe script may take a moment or two to zip the source files and email them to the Grader.   You will receive a\nreceipt email telling you which files were sent.\n\nSome additional notes:\n\n  * Only source files can be submitted.  You can submit `.java`, `.xml`, and `.txt` files beneath the `src` directory of your Maven project.\n    * Yes, your README can be loaded from a text file in `src/main/resources`.\n    * No, you can't submit a modified `pom.xml`.  So, you can't add dependencies (like third-party libraries that do command line parsing).\n  * Multiple submissions before the due date are allowed, but only your most recent submission will be graded. Remember that there are a lot of you and the Grader has to un-jar each of your submissions. You don't want to waste the grader's time with superfluous submissions.  The active word in \"grader\" is \"GRADE\".\n  * No late work will be accepted.  Each submission has a time stamp on it, so we know if you're late.\n\nIf your project has missing functionality or if there is anything you'd like the Grader to know about your project, the\n`submit.sh` script supports an addition second argument that records a comment for your submission. \n\n```shell\n$ ./submit.sh Project1 \"I did not have time to get one-digit hours working\"\n```\n\nAfter your code has been successfully submitted, the `submit.sh` script will\n[tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging) the current revision of \nyour git repository. The name of the tag indicates which project was submitted and\nthe date/time it was submitted.  For example, submitting Project1 at 9 AM on May 1st\nwould tag the current revision of the repository with `submit-Project1-20250117T09:00:58`.\nThis tag allows you to create a [branch](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging)\nfrom the specific revision of your code that was submitted, which makes debugging problems\nin submitted code much easier.  Note that the `submit.sh` will issue an error if there are\nuncommitted changes in your local clone of the repository.  So, be sure to commit all of\nyour changes before submitting.  Additionally, the `submit.sh` script will check to see if there are any changes\nin the remote `origin` repository that you have not pulled into your local clone.  If there are, the script will issue\nan error message and request that you perform a `git pull` to get the latest changes from the remote repository.  This\nensures that you are submitting the most recent version of your code.\n\nOnce the `submit.sh` has completed, and the tag for the repository has been created, the tag will need to be pushed to the remote repository (your Github repository). \n\nPush all tags:\n```shell\n$ git push --tags\n```\n\nOr push an individual tag:\n```shell\n$ git push origin submit-Project1-20250117T09:00:58\n```\n\nTo fix a bug in submitted code, create a new branch of your repository from the `submit` tag on your development system:\n```shell\n$ git fetch    # Fetch the tag(s) from GitHub (\"origin\") into your local clone \n$ git checkout -b fix-Project1 submit-Project1-20250117T09:00:58   # Create a branch to make fixes\n$ git push --set-upstream origin fix-Project1    # Push the branch to GitHub\n# Make code changes, commit them to git, and push them to the fix-Project1 branch\n```\n\nWhen you're ready to resubmit, check out the bugfix branch on the PSU machine:\n```shell\n$ git fetch   # Fetch the branch from GitHub (\"origin\")\n$ git checkout -b fix-Project1 origin/fix-Project1   # Create a new branch on PSU machine\n```\n\nAfter submitting, check out the `main` branch to resume work on the next project:\n```shell\n$ git checkout main\n```\n\n### About how long do the projects take to complete?\n\nStarting in the Winter of 2022, we started gathering data from students\nregarding the approximate number of hours they spend working on each project.\nNote that there are not as many submissions for the XML project because it only\napplies to the 11-week version of the course, which is not offered in the Summer.\nThe following is a summary of the data gathered to date.  \n\n|            | App Classes | Text File | Pretty Print |     Koans |      XML |      REST |  Android |\n|:-----------|------------:|----------:|-------------:|----------:|---------:|----------:|---------:|\n| Count      |         142 |       142 |          138 |       122 |       80 |       129 |      130 |\n| Average    |    21 hours |  20 hours |     23 hours |  19 hours | 24 hours |  30 hours | 26 hours |\n| Maximum    |    60 hours | 120 hours |     76 hours | 100 hours | 60 hours | 129 hours | 90 hours |\n| Top 25%    |    25 hours |  25 hours |     30 hours |  23 hours | 30 hours |  40 hours | 30 hours |\n| Median     |    20 hours |  20 hours |     20 hours |  16 hours | 20 hours |  25 hours | 24 hours |\n| Bottom 25% |    12 hours |  12 hours |     12 hours |  10 hours | 15 hours |  16 hours | 17 hours |\n| Minimum    |     3 hours |   0 hours |      2 hours |   4 hours |  6 hours |   7 hours |  5 hours |\n\nYou may want to consider it as you plan your projects.  Recall, though, that\nthis data is self-reported.  Your experience might be different from that\nof previous students.\n\n## How do I use the \"parent POM\"?\n\nThis repository includes a \"parent\" [pom.xml](pom.xml) file.  You'll\nneed to edit the `pom.xml` file to include your user id and GitHub\nusername.  As you create projects (such as Project 1), they will be\nadded as sub-modules to the parent POM.\n\nHaving a parent project (POM) for all of your projects is convenient\nbecause it lets you build all of your code in one invocation of Maven.\nWhile this is not strictly necessary, it does enable easy integration\nwith continuous integration tools.  This repository is configured to use\na [GitHub workflow to automatically build the project](.github/workflows/maven.yml)\n(including running tests) whenever a change is pushed to the `main` branch.\n\nThe parent project also allows you to create a multi-module [Maven\nsite](https://maven.apache.org/guides/mini/guide-site.html) for all of\nyour projects.\n\n### What's the deal with warnings about an incorrect parent POM?\n\nAs you create Maven projects in this repository, you may encounter warnings like this when running `mvnw`:\n\n```\n[WARNING] \n[WARNING] Some problems were encountered while building the effective model for edu.pdx.cs.joy.whitlock:apptbook:jar:1.0.0\n[WARNING] 'parent.relativePath' of POM edu.pdx.cs.joy.whitlock:apptbook:1.0.0 (JoyOfCodingSummer2025/apptbook/pom.xml) points at edu.pdx.cs.joy.whitlock:JoyOfCodingSummer2025 instead of io.github.davidwhitlock.joy:joy, please verify your project structure @ line 3, column 11\n[WARNING] \n[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.\n[WARNING] \n[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.\n[WARNING] \n```\n\nThis is a side effect of the Maven projects that are created by the scripts and the archetypes they are created from.\n\nThese warning are not problematic, and you do **not** need to do anything about them.  However, they are annoying.\n\nIn order to remove them, you'll need to adjust the `\u003cparent\u003e` section of the `pom.xml` file in your projects.  \nWhen created, the `pom.xml` files for the projects specify a parent of _my_ top-level POM, something like\n\n```xml\n  \u003cparent\u003e\n    \u003cartifactId\u003ejoy\u003c/artifactId\u003e\n    \u003cgroupId\u003eio.github.davidwhitlock.joy\u003c/groupId\u003e\n    \u003cversion\u003e1.2.2\u003c/version\u003e\n  \u003c/parent\u003e\n```\n\nTo remove this warning, you'll want to change the parent of the assignment's POM to _your_ top-level POM (whose *parent*\nis my top-level POM) to something like:\n\n```xml\n  \u003cparent\u003e\n    \u003cartifactId\u003eJoyOfCoding\u003c/artifactId\u003e\n    \u003cgroupId\u003eedu.pdx.cs.joy.your-mcecs-user-id\u003c/groupId\u003e\n    \u003cversion\u003e1.0.0\u003c/version\u003e\n  \u003c/parent\u003e\n```\n\nNote that you should only make this change to the `pom.xml` files for the projects that you create (like `koans`).  \nThe `\u003cparent\u003e` of the top-level `pom.xml` should still refer to my `joy` POM.  This allows you to inherit Maven\nplugin settings that are necessary for the course assignments.\n\n## How can I use a debugger to uncover the source of problems with my projects?\n\nTest-driven development encourages you to write code in small increments and provides you with a suite of tests that\nvalidate that your code still works as expected as you make changes.  However, sometimes a test will fail or the\ncommand line program will not behave as expected for reasons that aren't clear.  In these situations, a debugger\nmay provide insight that allows you to resolve issues with your code.  Running the Java Virtual Machine\n(the `java` command line tool) with the appropriate options enables a debugger client (such as IntelliJ) to connect\nto the Virtual Machine.  In turn, this enables the developer to set breakpoints to pause program execution and\ninspect data/objects of running programs.  While using a debugger may take some getting used to, it is far faster\nand more powerful than sprinkling `println`s all over your code!\n\nIntelliJ offers some [very powerful features](https://www.jetbrains.com/help/idea/debugging-your-first-java-application.html)\nfor debugging Java programs and has great support for running tests and `main` programs under a debugger.\n\nHowever, if you are executing Java programs from the command line (either running your `main` program directly or\nrunning automated tests using maven), you must configure the JVM to allow [IntelliJ to\nattach](https://www.jetbrains.com/help/idea/tutorial-remote-debug.html) to the \"remote\" Java process.\n\nIn order to debug code running as an executable jar, you must specify the `-agentlib` option to the JVM in addition\nto the `-jar` option:\n\n```\njava \"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005\" -jar target/student-1.0.0.jar \n```\n\nThe above `-agentlib` option causes the JVM to output a (rather cryptic) informational message indicating that the JVM\nis listening on port `5005` for a debugger (such as IntelliJ) to attach.\n\n```\nListening for transport dt_socket at address: 5005\n```\n\nFor command line programs, it is important that the `suspend` configuration property have a value of `y`.  This\ninstructs the JVM to not execute the `main` method _until_ a debugger has attached.  When the value of `suspend` is\n`n`, the program will begin execution and will likely complete before a debugger has attached. \n\nMaven is a program written in Java that builds Java projects.  When the `mvnw` script is run, it runs Maven using a\nJava Virtual Machine.  If you want to attach a debugger to a Maven build that, say, has failing unit tests, you\ndon't add the `-agentlib` option to the `mvnw` command line.  Instead, you specify the `-agentlib` option in the\n`MAVEN_OPTS` environment variable.  \n\n```shell\n# On UNIX\nexport MAVEN_OPTS=\"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005\"\n```\n\n```shell\n# In a Windows PowerShell environment \n$Env:MAVEN_OPTS = '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005'\n```\n\n```shell\nREM In a Windows command environment \nset MAVEN_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005\n```\n\nThe `mvnw` script includes the value of `MAVEN_OPTS` when it assembles the `java` command line that ultimately runs\nMaven.\n\nWhen enabling Maven to be debugged, you may want to consider using `suspend=n`.  You'll likely have time to connect a\ndebugger to the Maven process before the code you want to debug (unit/integration tests) is invoked by the Maven build.\nIn particular, you'll probably want to use `suspend=n` when Maven is used to run the Jetty web server in the REST\nproject. \n\n## How can I create a website for the projects in this repository?\n\nRunning `mvn site` from the root directory of this repository will\ngenerate a website that provides lots of information (reports, etc.) \nabout the Maven projects.  Note that in order for your multi-project\nMaven site to generate correctly, the subprojects must specify that\ntheir parent project is the `JoyOfCodingSummer2025` project in\nyour group:\n\n```xml\n  \u003cparent\u003e\n    \u003cartifactId\u003eJoyOfCoding\u003c/artifactId\u003e\n    \u003cgroupId\u003eedu.pdx.cs.joy.your-mcecs-user-id\u003c/groupId\u003e\n    \u003cversion\u003e1.0.0\u003c/version\u003e\n  \u003c/parent\u003e\n```\n\n[GitHub Pages](https://guides.github.com/features/pages/) are web\npages that are hosted by GitHub and can easily be published via\nGitHub.  You can post the website for your Maven projects by first\ncreating a `gh-pages` branch (from the initial revision of the \nrepository), removing the `README.md` file on that branch (because\nit will take precedence over the generated `index.html` file) and\npushing it to GitHub:\n\n```\n$ git branch gh-pages\n$ git checkout gh-pages\n$ git rm README.md\n$ git commit -m \"Remove README.md on gh-pages branch\" README.md\n$ git push --set-upstream origin gh-pages\n$ git checkout main\n```\n\nThen, you can generate and publish your website using the below\ncommands.  Note that before you can do this, you must replace\ninstances of `YourGitHubUser` with your GitHub username in the\ntop-level (parent) `pom.xml` file.\n\n```\n$ ./mvnw site\n$ ./mvnw site:stage                  # Gathers site files across multiple projects\n$ ./mvnw scm-publish:publish-scm     # Uploads to GitHub\n```\n\nYou can open `target/staging/index.html` in your web browse to see\nwhat your site will look like.\n\nVerify that your website is available at a URL like:\nhttps://yourgithubuser.github.io/JoyOfCodingSummer2025\n\n## How can I improve this repository?\n\nThis repository is kind of thrown together, and it ought to evolve to\nmeet the needs of the students who take The Joy of Coding.  \n\nFeel free to [create issues](../../issues) for this repository if you find\nsomething missing or confusing.\n\nIt's even better, though, when someone contributes their own changes\n(add new scripts, augment documentation, fix type-os, etc.), to this\nrepository.  Please make a (public)\n[fork](https://help.github.com/en/articles/fork-a-repo) of this\nrepository in GitHub, make your changes in a branch of that\nrepository, and [create a pull\nrequest](https://help.github.com/en/articles/creating-a-pull-request-from-a-fork)\nagainst this repository.  We can then have a discussion about your\nchanges via GitHub.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoyofcodingpdx%2Fkatassummer2025","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoyofcodingpdx%2Fkatassummer2025","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoyofcodingpdx%2Fkatassummer2025/lists"}