[{"data":1,"prerenderedAt":4265},["ShallowReactive",2],{"content-page:\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox":3,"content-page-quiz:none":2776,"content-navigation-index":2791},{"id":4,"title":5,"audience":6,"body":7,"contentType":2762,"course":2763,"description":2764,"estimateBasis":2765,"estimatedDiscussionMinutes":2766,"estimatedLiveMinutes":2767,"estimatedTotalMinutes":2768,"extension":871,"meta":2769,"module":569,"navigation":2771,"order":2772,"path":2773,"presentationRole":2774,"promptAssist":2770,"revision":2775,"semester":2776,"seo":2777,"status":2778,"stem":2779,"syllabus":2776,"tags":2780,"updated":2785,"videoDuration":2786,"videoId":2787,"videoLink":2788,"videoTitle":2789,"week":569,"__hash__":2790},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox.md","Local Ubuntu Web Server With VirtualBox","student",{"type":8,"value":9,"toc":2693},"minimark",[10,46,92,130,203,235,262,304,330,359,388,415,446,475,513,580,615,662,705,749,798,862,901,936,973,1006,1043,1076,1106,1136,1166,1196,1226,1261,1293,1326,1359,1408,1411,1455,1481,1522,1579,1661,1712,1745,1775,1805,1858,1885,1936,1984,2042,2102,2143,2173,2210,2245,2281,2333,2386,2405,2433,2481,2554,2662],[11,12,15,19],"slide",{"id":13,"level":14},"virtualbox-title","2",[16,17,5],"h2",{"id":18},"local-ubuntu-web-server-with-virtualbox",[20,21,22,26,29,32,35,43],"ul",{},[23,24,25],"li",{},"Primary course path for the local Ubuntu VM",[23,27,28],{},"Create an Ubuntu Server VM in VirtualBox",[23,30,31],{},"Connect from your host terminal with SSH",[23,33,34],{},"Share the course repo into Ubuntu",[23,36,37,38,42],{},"Serve ",[39,40,41],"code",{},"public_html"," through Apache and PHP",[23,44,45],{},"Create a local MySQL database for testing",[11,47,49,52,56,67,70],{"id":48,"level":14},"main-goal",[16,50,51],{"id":48},"Main Goal",[53,54,55],"p",{},"Your host computer and Ubuntu VM have different jobs:",[20,57,58,61,64],{},[23,59,60],{},"Host computer: edit files with VS Code and open the browser",[23,62,63],{},"Ubuntu VM: run Apache, PHP, MySQL, and server commands",[23,65,66],{},"Shared folder: lets both use the same course repo files",[53,68,69],{},"Target result:",[20,71,72,78,83,86,89],{},[23,73,74,75],{},"Host browser opens ",[39,76,77],{},"http:\u002F\u002Flocalhost:3000",[23,79,80,81],{},"Apache serves the repo's ",[39,82,41],{},[23,84,85],{},"PHP executes inside Ubuntu",[23,87,88],{},"Local MySQL has a database and user named after your UCID",[23,90,91],{},"Edits made on the host appear after browser refresh",[11,93,95,98,101,120,123],{"id":94,"level":14},"virtualbox-caveat",[16,96,97],{"id":94},"VirtualBox Caveat",[53,99,100],{},"VirtualBox is the primary local VM path for this course:",[20,102,103,106,109,117],{},[23,104,105],{},"Works well on modern Windows, Linux, and Intel Mac hosts",[23,107,108],{},"Apple Silicon Mac requires an ARM64 Ubuntu Server ISO",[23,110,111,112],{},"Windows on Arm support is experimental in VirtualBox\n",[20,113,114],{},[23,115,116],{},"Avoid unless your instructor confirms it for your machine",[23,118,119],{},"Arm hosts cannot run x86\u002FAMD64 guest images",[53,121,122],{},"VMware is the fallback path if VirtualBox is not a good fit for your machine",[124,125,127],"admonition",{"type":126},"tip",[53,128,129],{},"Most students do not need BIOS changes. If VirtualBox cannot start the VM or does not offer a 64-bit Ubuntu option, check that Intel VT-x, AMD-V, or SVM is enabled in BIOS\u002FUEFI. On Windows, Hyper-V-related features can also interfere on some systems.",[11,131,133,136],{"id":132,"level":14},"before-you-start",[16,134,135],{"id":132},"Before You Start",[20,137,138,158,176,179,182,185,200],{},[23,139,140,141],{},"VirtualBox downloaded\n",[20,142,143,152,155],{},[23,144,145],{},[146,147,151],"a",{"href":148,"rel":149},"https:\u002F\u002Fwww.virtualbox.org\u002Fwiki\u002FDownloads",[150],"nofollow","VirtualBox downloads",[23,153,154],{},"Windows\u002FLinux\u002FIntel Mac: use the standard host installer",[23,156,157],{},"Apple Silicon Mac: use the macOS Arm64 host installer",[23,159,160,161],{},"Ubuntu Server ISO downloaded\n",[20,162,163,170,173],{},[23,164,165],{},[146,166,169],{"href":167,"rel":168},"https:\u002F\u002Fubuntu.com\u002Fdownload\u002Fserver#how-to-install-tab-lts",[150],"Ubuntu Server installer",[23,171,172],{},"Apple Silicon Mac: use the ARM64 server ISO",[23,174,175],{},"Windows, Linux, and Intel Mac: use the AMD64 server ISO",[23,177,178],{},"Internet Applications course repo cloned on host computer",[23,180,181],{},"Git\u002FGitHub setup already working",[23,183,184],{},"Administrator access on your computer",[23,186,187,188,191,192],{},"At least ",[39,189,190],{},"10 GB"," free disk space for the VM\n",[20,193,194],{},[23,195,196,199],{},[39,197,198],{},"20-25 GB"," is safer if your computer has room",[23,201,202],{},"Stable internet for package installs",[11,204,206,209],{"id":205,"level":14},"setup-parts",[16,207,208],{"id":205},"Setup Parts",[20,210,211,214,217,220,226,229,232],{},[23,212,213],{},"VM: Ubuntu Server running inside VirtualBox",[23,215,216],{},"NAT adapter: gives the VM internet access",[23,218,219],{},"Port forwarding: lets the host reach SSH and Apache",[23,221,222,223],{},"SSH: lets the host terminal control Ubuntu through ",[39,224,225],{},"localhost",[23,227,228],{},"Shared folder: exposes the host repo inside Ubuntu",[23,230,231],{},"Apache\u002FPHP: serves and executes the web app",[23,233,234],{},"MySQL: local database server for local testing",[11,236,238,242],{"id":237,"level":14},"install-virtualbox-windows",[16,239,241],{"id":240},"install-virtualbox-on-windows","Install VirtualBox On Windows",[20,243,244,247,250,253,256,259],{},[23,245,246],{},"Download VirtualBox for Windows hosts",[23,248,249],{},"Run the installer as an administrator if prompted",[23,251,252],{},"Keep the default install path and features",[23,254,255],{},"Accept the network reset warning",[23,257,258],{},"Open VirtualBox after installation",[23,260,261],{},"See the slides below for the Windows installer screens",[11,263,266,269],{"id":264,"level":265},"windows-installer-start","3",[16,267,268],{"id":264},"Windows Installer: Start",[270,271,276,288],"two-col",{"gap":272,"left-width":273,"right-width":274,"stack":275},"lg","1.4fr","0.9fr","never",[277,278,280],"template",{"v-slot:left":279},"",[53,281,282],{},[283,284],"img",{"alt":285,"src":286,"variant":287},"VirtualBox Windows installer start screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step1.png","sidecar-screenshot",[277,289,290],{"v-slot:right":279},[20,291,292,298,301],{},[23,293,294,295],{},"Launch the downloaded ",[39,296,297],{},".exe",[23,299,300],{},"Approve the Windows security prompt if shown",[23,302,303],{},"Start the setup wizard",[11,305,307,310],{"id":306,"level":265},"windows-installer-features",[16,308,309],{"id":306},"Windows Installer: Features",[270,311,312,320],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,313,314],{"v-slot:left":279},[53,315,316],{},[283,317],{"alt":318,"src":319,"variant":287},"VirtualBox Windows installer feature selection screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step2.png",[277,321,322],{"v-slot:right":279},[20,323,324,327],{},[23,325,326],{},"Keep the default install location",[23,328,329],{},"Keep the default features selected",[11,331,333,336],{"id":332,"level":265},"windows-installer-network-warning",[16,334,335],{"id":332},"Windows Installer: Network Warning",[270,337,338,346],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,339,340],{"v-slot:left":279},[53,341,342],{},[283,343],{"alt":344,"src":345,"variant":287},"VirtualBox Windows installer network warning","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step3.png",[277,347,348],{"v-slot:right":279},[20,349,350,353,356],{},[23,351,352],{},"VirtualBox may reset network adapters briefly",[23,354,355],{},"This is expected during install",[23,357,358],{},"Save web work before continuing if needed",[11,360,362,365],{"id":361,"level":265},"windows-installer-ready",[16,363,364],{"id":361},"Windows Installer: Ready",[270,366,367,375],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,368,369],{"v-slot:left":279},[53,370,371],{},[283,372],{"alt":373,"src":374,"variant":287},"VirtualBox Windows installer ready screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step4.png",[277,376,377],{"v-slot:right":279},[20,378,379,382,385],{},[23,380,381],{},"Start the installation",[23,383,384],{},"Keep the default choices",[23,386,387],{},"Wait for the installer to request permissions if needed",[11,389,391,395],{"id":390,"level":265},"windows-installer-progress",[16,392,394],{"id":393},"windows-installer-start-options","Windows Installer: Start Options",[270,396,397,405],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,398,399],{"v-slot:left":279},[53,400,401],{},[283,402],{"alt":403,"src":404,"variant":287},"VirtualBox Windows installer progress screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step5.png",[277,406,407],{"v-slot:right":279},[20,408,409,412],{},[23,410,411],{},"No need to create a Start Menu item or desktop shortcut unless desired",[23,413,414],{},"Third option is likely optional too since we'll be using the VirtualBox Manager",[11,416,418,421],{"id":417,"level":265},"windows-installer-permission",[16,419,420],{"id":417},"Windows Installer: Permission",[270,422,423,431],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,424,425],{"v-slot:left":279},[53,426,427],{},[283,428],{"alt":429,"src":430,"variant":287},"VirtualBox Windows installer permission prompt","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step6.png",[277,432,433],{"v-slot:right":279},[20,434,435,438],{},[23,436,437],{},"Proceed with install",[23,439,440,441],{},"Approve VirtualBox driver prompts\n",[20,442,443],{},[23,444,445],{},"These let VirtualBox create virtual hardware",[11,447,449,452],{"id":448,"level":265},"windows-installer-complete",[16,450,451],{"id":448},"Windows Installer: Complete",[270,453,454,462],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,455,456],{"v-slot:left":279},[53,457,458],{},[283,459],{"alt":460,"src":461,"variant":287},"VirtualBox Windows installer completion screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step7.png",[277,463,464],{"v-slot:right":279},[20,465,466,469,472],{},[23,467,468],{},"Finish the installer",[23,470,471],{},"Open VirtualBox",[23,473,474],{},"Continue to VM creation",[11,476,478,482],{"id":477,"level":14},"install-virtualbox-macos",[16,479,481],{"id":480},"install-virtualbox-on-macos","Install VirtualBox On macOS",[270,483,486,505],{"gap":272,"left-width":484,"right-width":485,"stack":275},"0.95fr","1.05fr",[277,487,488],{"v-slot:left":279},[20,489,490,493,496,499,502],{},[23,491,492],{},"Install the VirtualBox host package for your Mac CPU type",[23,494,495],{},"Intel Mac: standard macOS host installer",[23,497,498],{},"Apple Silicon Mac: Arm64 host installer and Arm64 Ubuntu Server ISO",[23,500,501],{},"Approve macOS security prompts if needed",[23,503,504],{},"If VirtualBox is not a good fit, use the VMware fallback lesson",[277,506,507],{"v-slot:right":279},[53,508,509],{},[283,510],{"alt":511,"src":512,"variant":287},"Summary of macOS VirtualBox setup notes","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvm_summary_mac.png",[11,514,516,520,523],{"id":515,"level":14},"step-1-create-vm",[16,517,519],{"id":518},"step-1-create-the-vm","Step 1: Create The VM",[53,521,522],{},"Create a lightweight Ubuntu Server VM:",[20,524,525,528,536,552,564,571,574,577],{},[23,526,527],{},"Type: Linux",[23,529,530,531],{},"Version: Ubuntu 64-bit or Ubuntu Arm64\n",[20,532,533],{},[23,534,535],{},"Match the version to the ISO you downloaded",[23,537,538,539,542,543],{},"Memory: ",[39,540,541],{},"1 GB"," course target\n",[20,544,545],{},[23,546,547,548,551],{},"Use ",[39,549,550],{},"1.5-2 GB"," if the installer is too slow or refuses to continue (you shouldn't need to do this)",[23,553,554,555,557,558],{},"Disk: ",[39,556,190],{}," course minimum\n",[20,559,560],{},[23,561,562,199],{},[39,563,198],{},[23,565,566,567,570],{},"CPU: ",[39,568,569],{},"1"," core is enough for this course VM",[23,572,573],{},"Enable OpenSSH during install if prompted",[23,575,576],{},"Username: use your UCID",[23,578,579],{},"See the slides below for VM settings and Ubuntu install screens",[11,581,583,586],{"id":582,"level":265},"vm-setup-name-and-iso",[16,584,585],{"id":582},"VM Setup: Name And ISO",[270,587,588,596],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,589,590],{"v-slot:left":279},[53,591,592],{},[283,593],{"alt":594,"src":595,"variant":287},"VirtualBox VM name and ISO setup","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_1.png",[277,597,598],{"v-slot:right":279},[20,599,600,603,609,612],{},[23,601,602],{},"Start a new virtual machine",[23,604,605,606],{},"Name it clearly, such as ",[39,607,608],{},"it202-vm",[23,610,611],{},"Choose the Ubuntu Server ISO file next",[23,613,614],{},"OS fields may look wrong until the ISO is selected",[11,616,618,621],{"id":617,"level":265},"vm-setup-confirm-ubuntu-iso",[16,619,620],{"id":617},"VM Setup: Confirm Ubuntu ISO",[270,622,623,631],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,624,625],{"v-slot:left":279},[53,626,627],{},[283,628],{"alt":629,"src":630,"variant":287},"VirtualBox VM name and Ubuntu ISO selected","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_2.png",[277,632,633],{"v-slot:right":279},[20,634,635,641,647,650],{},[23,636,637,638],{},"Confirm OS is ",[39,639,640],{},"Linux",[23,642,643,644],{},"Confirm distribution is ",[39,645,646],{},"Ubuntu",[23,648,649],{},"Confirm version matches your ISO",[23,651,652,653,656,657],{},"Keep ",[39,654,655],{},"Unattended Installation"," off\n",[20,658,659],{},[23,660,661],{},"The Ubuntu installer screens are easier to teach manually",[11,663,665,668],{"id":664,"level":265},"vm-setup-memory-and-cpu",[16,666,667],{"id":664},"VM Setup: Memory And CPU",[270,669,670,678],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,671,672],{"v-slot:left":279},[53,673,674],{},[283,675],{"alt":676,"src":677,"variant":287},"VirtualBox VM memory and CPU settings","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_4.png",[277,679,680],{"v-slot:right":279},[20,681,682,695,699,702],{},[23,683,538,684,542,687],{},[39,685,686],{},"1024 MB",[20,688,689,692],{},[23,690,691],{},"The goal is to match free-tier cloud services",[23,693,694],{},"Demonstrates that small apps can run with limited resources",[23,696,566,697],{},[39,698,569],{},[23,700,701],{},"Keep EFI off unless your machine requires it",[23,703,704],{},"This VM is for Apache, PHP, MySQL, and local development\u002Ftesting",[11,706,708,711],{"id":707,"level":265},"vm-setup-virtual-disk",[16,709,710],{"id":707},"VM Setup: Virtual Disk",[270,712,713,721],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,714,715],{"v-slot:left":279},[53,716,717],{},[283,718],{"alt":719,"src":720,"variant":287},"VirtualBox virtual hard disk settings","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_5.png",[277,722,723],{"v-slot:right":279},[20,724,725,731,734,746],{},[23,726,727,728],{},"Disk type: ",[39,729,730],{},"VDI",[23,732,733],{},"Storage: dynamically allocated",[23,735,736,737,739],{},"Minimum: ",[39,738,190],{},[20,740,741],{},[23,742,743,745],{},[39,744,198],{}," is safer if you have room",[23,747,748],{},"Dynamic disk uses space as needed, not all at once",[11,750,752,755],{"id":751,"level":265},"vm-setup-start-with-gui",[16,753,754],{"id":751},"VM Setup: Start With GUI",[270,756,757,765],{"gap":272,"left-width":273,"right-width":274,"stack":275},[277,758,759],{"v-slot:left":279},[53,760,761],{},[283,762],{"alt":763,"src":764,"variant":287},"VirtualBox VM selected with the Start button visible","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_6.png",[277,766,767],{"v-slot:right":279},[20,768,769,772,783,786],{},[23,770,771],{},"Select the newly created VM",[23,773,774,775,778],{},"Click ",[39,776,777],{},"Start",[20,779,780],{},[23,781,782],{},"Choose the normal GUI start for the first boot",[23,784,785],{},"Complete the Ubuntu installer in the VM window",[23,787,788,789],{},"After install and SSH setup, future starts can be headless\n",[20,790,791],{},[23,792,793,794,797],{},"You will connect with ",[39,795,796],{},"ssh"," when you need the VM",[11,799,801,805,808],{"id":800,"level":14},"ubuntu-installer",[16,802,804],{"id":803},"step-2-ubuntu-installer","Step 2: Ubuntu Installer",[53,806,807],{},"Use the Ubuntu Server installer after the VM starts:",[20,809,810,813,816,819,822,825,859],{},[23,811,812],{},"Choose the default course options unless noted",[23,814,815],{},"Continue without updating the installer if instructed",[23,817,818],{},"Use your UCID for the Ubuntu username",[23,820,821],{},"Install OpenSSH server during setup",[23,823,824],{},"Skip optional server snaps",[23,826,827,828],{},"Keyboard navigation:\n",[20,829,830,837,847,853],{},[23,831,832,836],{},[833,834,835],"kbd",{},"Tab"," moves between fields and buttons",[23,838,839,842,843,846],{},[833,840,841],{},"Up"," \u002F ",[833,844,845],{},"Down"," moves through lists",[23,848,849,852],{},[833,850,851],{},"Space"," toggles checkboxes",[23,854,855,858],{},[833,856,857],{},"Enter"," confirms the selected option",[23,860,861],{},"See the slides below for the installer screens",[11,863,865,869],{"id":864,"level":265},"ubuntu-installer-boot-menu",[16,866,868],{"id":867},"step-21-boot-menu","Step 2.1: Boot Menu",[270,870,874,883],{"gap":871,"left-width":872,"right-width":873,"stack":275},"md","1.75fr","0.65fr",[277,875,876],{"v-slot:left":279},[53,877,878],{},[283,879],{"alt":880,"src":881,"variant":882},"Ubuntu Server boot menu in VirtualBox","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_1.png","slide-screenshot",[277,884,885],{"v-slot:right":279},[20,886,887,893,898],{},[23,888,889,890],{},"Choose ",[39,891,892],{},"Try or Install Ubuntu Server",[23,894,895,896],{},"Press ",[833,897,857],{},[23,899,900],{},"This starts the Ubuntu Server installer",[11,902,904,908],{"id":903,"level":265},"ubuntu-installer-language",[16,905,907],{"id":906},"step-22-language","Step 2.2: Language",[270,909,910,918],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,911,912],{"v-slot:left":279},[53,913,914],{},[283,915],{"alt":916,"src":917,"variant":882},"Ubuntu Server installer language screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_2.0.png",[277,919,920],{"v-slot:right":279},[20,921,922,925,931],{},[23,923,924],{},"Choose your preferred language",[23,926,927,930],{},[39,928,929],{},"English"," is the expected course screenshot path",[23,932,895,933,935],{},[833,934,857],{}," to continue",[11,937,939,943],{"id":938,"level":265},"ubuntu-installer-update",[16,940,942],{"id":941},"step-23-update-prompt","Step 2.3: Update Prompt",[270,944,945,953],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,946,947],{"v-slot:left":279},[53,948,949],{},[283,950],{"alt":951,"src":952,"variant":882},"Ubuntu Server installer update prompt","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_2.5.png",[277,954,955],{"v-slot:right":279},[20,956,957,967,970],{},[23,958,889,959,962],{},[39,960,961],{},"Continue without updating",[20,963,964],{},[23,965,966],{},"If I forget to update the image, it's the second option",[23,968,969],{},"Keeps the install path consistent",[23,971,972],{},"Package updates happen after Ubuntu is installed",[11,974,976,980],{"id":975,"level":265},"ubuntu-installer-keyboard",[16,977,979],{"id":978},"step-24-keyboard","Step 2.4: Keyboard",[270,981,982,990],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,983,984],{"v-slot:left":279},[53,985,986],{},[283,987],{"alt":988,"src":989,"variant":882},"Ubuntu Server installer keyboard screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_3.png",[277,991,992],{"v-slot:right":279},[20,993,994,997,1003],{},[23,995,996],{},"Keep the detected keyboard layout if it matches",[23,998,999,1000],{},"Common setting: ",[39,1001,1002],{},"English (US)",[23,1004,1005],{},"Use Identify keyboard only if typing is wrong",[11,1007,1009,1013],{"id":1008,"level":265},"ubuntu-installer-install-type",[16,1010,1012],{"id":1011},"step-25-install-type","Step 2.5: Install Type",[270,1014,1015,1023],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1016,1017],{"v-slot:left":279},[53,1018,1019],{},[283,1020],{"alt":1021,"src":1022,"variant":882},"Ubuntu Server installer installation type screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_4.png",[277,1024,1025],{"v-slot:right":279},[20,1026,1027,1037,1040],{},[23,1028,1029,1030,1033,1034],{},"Select ",[39,1031,1032],{},"Ubuntu Server (minimized)","; don't choose full ",[39,1035,1036],{},"Ubuntu Server",[23,1038,1039],{},"Keep third-party drivers unchecked",[23,1041,1042],{},"Minimized keeps the VM lighter and aids future lessons",[11,1044,1046,1050],{"id":1045,"level":265},"ubuntu-installer-network",[16,1047,1049],{"id":1048},"step-26-network","Step 2.6: Network",[270,1051,1052,1060],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1053,1054],{"v-slot:left":279},[53,1055,1056],{},[283,1057],{"alt":1058,"src":1059,"variant":882},"Ubuntu Server installer network configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_5.png",[277,1061,1062],{"v-slot:right":279},[20,1063,1064,1067,1073],{},[23,1065,1066],{},"DHCP address is expected",[23,1068,1069,1072],{},[39,1070,1071],{},"10.0.2.15"," is normal for VirtualBox NAT",[23,1074,1075],{},"Leave the network settings alone",[11,1077,1079,1083],{"id":1078,"level":265},"ubuntu-installer-proxy",[16,1080,1082],{"id":1081},"step-27-proxy","Step 2.7: Proxy",[270,1084,1085,1093],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1086,1087],{"v-slot:left":279},[53,1088,1089],{},[283,1090],{"alt":1091,"src":1092,"variant":882},"Ubuntu Server installer proxy screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_6.png",[277,1094,1095],{"v-slot:right":279},[20,1096,1097,1100,1103],{},[23,1098,1099],{},"Leave proxy blank",[23,1101,1102],{},"Only fill this in if your network requires a proxy",[23,1104,1105],{},"Most student home networks do not need one",[11,1107,1109,1113],{"id":1108,"level":265},"ubuntu-installer-mirror",[16,1110,1112],{"id":1111},"step-28-mirror","Step 2.8: Mirror",[270,1114,1115,1123],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1116,1117],{"v-slot:left":279},[53,1118,1119],{},[283,1120],{"alt":1121,"src":1122,"variant":882},"Ubuntu Server installer archive mirror screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_7.png",[277,1124,1125],{"v-slot:right":279},[20,1126,1127,1130,1133],{},[23,1128,1129],{},"Keep the default Ubuntu archive mirror",[23,1131,1132],{},"Wait for the mirror check to finish",[23,1134,1135],{},"Continue when the installer allows it",[11,1137,1139,1143],{"id":1138,"level":265},"ubuntu-installer-storage-guided",[16,1140,1142],{"id":1141},"step-29-guided-storage","Step 2.9: Guided Storage",[270,1144,1145,1153],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1146,1147],{"v-slot:left":279},[53,1148,1149],{},[283,1150],{"alt":1151,"src":1152,"variant":882},"Ubuntu Server installer guided storage screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_8.png",[277,1154,1155],{"v-slot:right":279},[20,1156,1157,1160,1163],{},[23,1158,1159],{},"Use the entire virtual disk",[23,1161,1162],{},"LVM is optional, not needed for this course VM",[23,1164,1165],{},"Leave encryption off",[11,1167,1169,1173],{"id":1168,"level":265},"ubuntu-installer-storage-summary",[16,1170,1172],{"id":1171},"step-210-storage-summary","Step 2.10: Storage Summary",[270,1174,1175,1183],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1176,1177],{"v-slot:left":279},[53,1178,1179],{},[283,1180],{"alt":1181,"src":1182,"variant":882},"Ubuntu Server installer storage summary screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_9.png",[277,1184,1185],{"v-slot:right":279},[20,1186,1187,1190,1193],{},[23,1188,1189],{},"Confirm the virtual disk is selected",[23,1191,1192],{},"This only affects the VM disk file",[23,1194,1195],{},"Continue when the layout looks correct",[11,1197,1199,1203],{"id":1198,"level":265},"ubuntu-installer-confirm-storage",[16,1200,1202],{"id":1201},"step-211-confirm-storage","Step 2.11: Confirm Storage",[270,1204,1205,1213],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1206,1207],{"v-slot:left":279},[53,1208,1209],{},[283,1210],{"alt":1211,"src":1212,"variant":882},"Ubuntu Server installer destructive action confirmation","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_10.png",[277,1214,1215],{"v-slot:right":279},[20,1216,1217,1220,1223],{},[23,1218,1219],{},"Confirm the virtual disk format",[23,1221,1222],{},"This does not erase your host computer files",[23,1224,1225],{},"It formats the VM's virtual disk",[11,1227,1229,1233],{"id":1228,"level":265},"ubuntu-installer-profile",[16,1230,1232],{"id":1231},"step-212-profile","Step 2.12: Profile",[270,1234,1235,1243],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1236,1237],{"v-slot:left":279},[53,1238,1239],{},[283,1240],{"alt":1241,"src":1242,"variant":882},"Ubuntu Server installer profile configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_11.png",[277,1244,1245],{"v-slot:right":279},[20,1246,1247,1250,1255,1258],{},[23,1248,1249],{},"Your name: your UCID or name is fine",[23,1251,1252,1253],{},"Server name: ",[39,1254,608],{},[23,1256,1257],{},"Username: your UCID",[23,1259,1260],{},"Choose a password you can type reliably (it can be simple since it's only for local work)",[11,1262,1264,1268],{"id":1263,"level":265},"ubuntu-installer-pro",[16,1265,1267],{"id":1266},"step-213-ubuntu-pro","Step 2.13: Ubuntu Pro",[270,1269,1270,1278],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1271,1272],{"v-slot:left":279},[53,1273,1274],{},[283,1275],{"alt":1276,"src":1277,"variant":882},"Ubuntu Server installer Ubuntu Pro screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_12.png",[277,1279,1280],{"v-slot:right":279},[20,1281,1282,1287,1290],{},[23,1283,889,1284],{},[39,1285,1286],{},"Skip for now",[23,1288,1289],{},"Ubuntu Pro is not needed for the course VM",[23,1291,1292],{},"You can continue without an Ubuntu account",[11,1294,1296,1300],{"id":1295,"level":265},"ubuntu-installer-ssh",[16,1297,1299],{"id":1298},"step-214-ssh","Step 2.14: SSH",[270,1301,1302,1310],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1303,1304],{"v-slot:left":279},[53,1305,1306],{},[283,1307],{"alt":1308,"src":1309,"variant":882},"Ubuntu Server installer SSH configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_13.png",[277,1311,1312],{"v-slot:right":279},[20,1313,1314,1320,1323],{},[23,1315,1316,1317],{},"Check ",[39,1318,1319],{},"Install OpenSSH server",[23,1321,1322],{},"Password authentication is fine for this local VM",[23,1324,1325],{},"No need to import SSH keys for this course setup",[11,1327,1329,1333],{"id":1328,"level":265},"ubuntu-installer-snaps",[16,1330,1332],{"id":1331},"step-215-featured-snaps","Step 2.15: Featured Snaps",[270,1334,1335,1343],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1336,1337],{"v-slot:left":279},[53,1338,1339],{},[283,1340],{"alt":1341,"src":1342,"variant":882},"Ubuntu Server installer featured server snaps screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_14.png",[277,1344,1345],{"v-slot:right":279},[20,1346,1347,1350,1356],{},[23,1348,1349],{},"Leave all featured snaps unchecked",[23,1351,1352,1353],{},"Apache, PHP, and MySQL are installed later with ",[39,1354,1355],{},"apt",[23,1357,1358],{},"Continue without selecting extra packages",[11,1360,1362,1366],{"id":1361,"level":265},"ubuntu-installer-installing",[16,1363,1365],{"id":1364},"step-216-installing","Step 2.16: Installing",[270,1367,1368,1376],{"gap":871,"left-width":872,"right-width":873,"stack":275},[277,1369,1370],{"v-slot:left":279},[53,1371,1372],{},[283,1373],{"alt":1374,"src":1375,"variant":882},"Ubuntu Server installer installing system screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_15.png",[277,1377,1378,1403],{"v-slot:right":279},[20,1379,1380,1383,1386,1394,1400],{},[23,1381,1382],{},"Installation can take a while",[23,1384,1385],{},"High CPU during install is normal",[23,1387,1388,1389,1391,1392],{},"If install struggles at ",[39,1390,541],{},", recreate the VM with ",[39,1393,550],{},[23,1395,1396,1397,1399],{},"Keep the course target at ",[39,1398,541],{}," after setup if possible",[23,1401,1402],{},"Reboot once complete",[124,1404,1405],{"type":126},[53,1406,1407],{},"These target resources stay close to common cloud free-tier VMs",[53,1409,1410],{},"::\n::",[11,1412,1414,1418,1421],{"id":1413,"level":14},"step-2-networking",[16,1415,1417],{"id":1416},"virtualbox-configure-networking","VirtualBox: Configure Networking",[53,1419,1420],{},"Use one NAT adapter with port forwarding:",[20,1422,1423,1429,1438,1447,1452],{},[23,1424,1425,1426],{},"VM internet: ",[39,1427,1428],{},"NAT",[23,1430,1431,1432,1435,1436],{},"Host SSH: host ",[39,1433,1434],{},"22"," -> guest ",[39,1437,1434],{},[23,1439,1440,1441,1435,1444],{},"Host browser: host ",[39,1442,1443],{},"3000",[39,1445,1446],{},"80",[23,1448,547,1449,1451],{},[39,1450,225],{}," from the host computer",[23,1453,1454],{},"See the slides below for adapter and port-forwarding screens",[11,1456,1458,1462,1475],{"id":1457,"level":265},"adapter-settings-screen",[16,1459,1461],{"id":1460},"adapter-settings","Adapter Settings",[20,1463,1464,1467,1472],{},[23,1465,1466],{},"Adapter 1 enabled",[23,1468,1469,1470],{},"Attached to ",[39,1471,1428],{},[23,1473,1474],{},"No second adapter needed for the baseline path",[53,1476,1477],{},[283,1478],{"alt":1479,"src":1480,"variant":882},"VirtualBox Adapter 1 configured as NAT","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_adapter_1.png",[11,1482,1484,1488,1516],{"id":1483,"level":265},"port-forwarding-screen",[16,1485,1487],{"id":1486},"port-forwarding","Port Forwarding",[20,1489,1490,1498,1505],{},[23,1491,1492,1493,1495,1496],{},"SSH: host ",[39,1494,1434],{}," to guest ",[39,1497,1434],{},[23,1499,1500,1501,1495,1503],{},"Apache HTTP: host ",[39,1502,1443],{},[39,1504,1446],{},[23,1506,1507,1508,1510,1511,1495,1514],{},"If host ",[39,1509,1434],{}," is already busy, use host ",[39,1512,1513],{},"2222",[39,1515,1434],{},[53,1517,1518],{},[283,1519],{"alt":1520,"src":1521,"variant":882},"VirtualBox NAT port forwarding rules","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_adapter_1_ports.png",[11,1523,1525,1529,1532,1537,1540,1544],{"id":1524,"level":14},"step-3-connect-ssh",[16,1526,1528],{"id":1527},"step-3-connect-with-ssh","Step 3: Connect With SSH",[53,1530,1531],{},"Run from your host terminal:",[1533,1534],"code-snippet",{"language":1535,"src":1536},"bash","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-3-connect-with-ssh-01.sh",[53,1538,1539],{},"First connection prompt:",[1533,1541],{"language":1542,"src":1543},"text","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-3-connect-with-ssh-02.txt",[20,1545,1546,1553,1563,1566,1569],{},[23,1547,1548,1549,1552],{},"Replace ",[39,1550,1551],{},"your_ucid"," with your UCID",[23,1554,1555,1556,1559,1560,1562],{},"Type ",[39,1557,1558],{},"yes"," once for this course VM on ",[39,1561,225],{}," (if prompted like the example above)",[23,1564,1565],{},"Enter your Ubuntu password",[23,1567,1568],{},"After login, commands run inside Ubuntu",[23,1570,1571,1574,1575,1578],{},[39,1572,1573],{},"exit"," or ",[39,1576,1577],{},"logout"," disconnects from the VM",[11,1580,1582,1586,1589],{"id":1581,"level":14},"step-4-confirm-network",[16,1583,1585],{"id":1584},"step-4-confirm-vm-network","Step 4: Confirm VM Network",[53,1587,1588],{},"Run inside Ubuntu through SSH:",[270,1590,1593,1636],{"gap":272,"left-width":1591,"right-width":1592,"stack":275},"1.1fr","1fr",[277,1594,1595,1598,1601],{"v-slot:left":279},[53,1596,1597],{},"Network check:",[1533,1599],{"language":1535,"src":1600},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-4-confirm-vm-networ-03.sh",[20,1602,1603,1609,1615,1621,1627],{},[23,1604,1605,1608],{},[39,1606,1607],{},"ping",": confirms basic network access",[23,1610,1611,1614],{},[39,1612,1613],{},"-c 4",": stop after four replies",[23,1616,1617,1620],{},[39,1618,1619],{},"apt update",": refreshes package indexes",[23,1622,1623,1626],{},[39,1624,1625],{},"apt upgrade",": applies available package updates",[23,1628,1629,1630,1632,1633],{},"If ",[39,1631,1607],{}," is not found, run ",[39,1634,1635],{},"sudo apt install iputils-ping",[277,1637,1638,1641,1644],{"v-slot:right":279},[53,1639,1640],{},"Port-forwarding check:",[1533,1642],{"language":1535,"src":1643},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fslide-id-summary-level-2-04.sh",[20,1645,1646,1651,1654,1658],{},[23,1647,1648,1649],{},"The VM may show ",[39,1650,1071],{},[23,1652,1653],{},"That is normal for VirtualBox NAT",[23,1655,547,1656,1451],{},[39,1657,225],{},[23,1659,1660],{},"Port forwarding routes host traffic into the VM",[11,1662,1664,1668],{"id":1663,"level":14},"step-5-shared-folder",[16,1665,1667],{"id":1666},"step-5-enable-shared-folder","Step 5: Enable Shared Folder",[270,1669,1670,1704],{"gap":272,"left-width":274,"right-width":1591,"stack":275},[277,1671,1672,1675],{"v-slot:left":279},[53,1673,1674],{},"In VirtualBox:",[20,1676,1677,1680,1683,1686,1689,1692,1695,1698,1701],{},[23,1678,1679],{},"Open VM settings",[23,1681,1682],{},"Choose Shared Folders",[23,1684,1685],{},"Folder Path: your cloned course repository folder",[23,1687,1688],{},"Folder Name: a simple repo name with no spaces",[23,1690,1691],{},"Mount Point: leave blank",[23,1693,1694],{},"Read-only: off",[23,1696,1697],{},"Auto-mount: on",[23,1699,1700],{},"Make Machine-permanent: on",[23,1702,1703],{},"Make Global: off",[277,1705,1706],{"v-slot:right":279},[53,1707,1708],{},[283,1709],{"alt":1710,"src":1711,"variant":287},"VirtualBox shared folder settings with the course repo selected","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_shared_folder.png",[11,1713,1715,1719,1722,1725],{"id":1714,"level":14},"step-6-guest-additions",[16,1716,1718],{"id":1717},"step-6-install-shared-folder-support","Step 6: Install Shared Folder Support",[53,1720,1721],{},"Run inside Ubuntu:",[1533,1723],{"language":1535,"src":1724},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-6-install-shared-fo-05.sh",[20,1726,1727,1736,1742],{},[23,1728,1729,1730,1732,1733,1735],{},"Run ",[39,1731,1619],{}," and ",[39,1734,1625],{}," first only if you skipped the Step 4 updates",[23,1737,1738,1741],{},[39,1739,1740],{},"virtualbox-guest-utils",": VirtualBox shared-folder support",[23,1743,1744],{},"Reboot after the group step on the next slide",[11,1746,1748,1752,1755,1758],{"id":1747,"level":265},"step-6b-confirm-vboxsf",[16,1749,1751],{"id":1750},"step-61-check-the-shared-folder","Step 6.1: Check The Shared Folder",[53,1753,1754],{},"Reconnect with SSH, then run inside Ubuntu:",[1533,1756],{"language":1535,"src":1757},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-6-1-check-the-share-06.sh",[20,1759,1760,1766,1772],{},[23,1761,1762,1765],{},[39,1763,1764],{},"ls \u002Fmedia",": shows available mounted folders",[23,1767,1768,1771],{},[39,1769,1770],{},"ls \u002Fmedia\u002F\u003Cshared-folder>",": checks your course repo share",[23,1773,1774],{},"Permission denied is common the first time",[11,1776,1778,1782,1785,1788],{"id":1777,"level":14},"step-7-locate-share",[16,1779,1781],{"id":1780},"step-7-allow-shared-folder-access","Step 7: Allow Shared Folder Access",[53,1783,1784],{},"If the shared folder exists but says permission denied:",[1533,1786],{"language":1535,"src":1787},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-7-allow-shared-fold-07.sh",[20,1789,1790,1796,1802],{},[23,1791,1792,1795],{},[39,1793,1794],{},"vboxsf",": group allowed to read VirtualBox shared folders",[23,1797,1798,1801],{},[39,1799,1800],{},"$USER",": your Ubuntu login user for terminal access",[23,1803,1804],{},"Reboot applies the shared-folder support and new group membership",[11,1806,1808,1812,1814,1817,1834,1837],{"id":1807,"level":265},"step-7b-locate-share",[16,1809,1811],{"id":1810},"step-71-locate-the-shared-repo","Step 7.1: Locate The Shared Repo",[53,1813,1754],{},[1533,1815],{"language":1535,"src":1816},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-7-1-locate-the-shar-08.sh",[20,1818,1819,1825,1831],{},[23,1820,1821,1824],{},[39,1822,1823],{},"\u002Fmedia",": VirtualBox auto-mounted shared folders",[23,1826,1827,1830],{},[39,1828,1829],{},"\u003Cshared-folder>",": your shared course repo folder name",[23,1832,1833],{},"Use the folder that points to your repository",[53,1835,1836],{},"Expected repo folders:",[20,1838,1839,1843,1848,1853],{},[23,1840,1841],{},[39,1842,41],{},[23,1844,1845],{},[39,1846,1847],{},"lib",[23,1849,1850],{},[39,1851,1852],{},"partials",[23,1854,1855],{},[39,1856,1857],{},"sql",[11,1859,1861,1865,1882],{"id":1860,"level":265},"step-7-2-shared-folder-check",[16,1862,1864],{"id":1863},"step-72-shared-folder-check","Step 7.2: Shared Folder Check",[20,1866,1867,1870,1879],{},[23,1868,1869],{},"Edit a small file from VS Code on host",[23,1871,1729,1872,1574,1875,1878],{},[39,1873,1874],{},"ls",[39,1876,1877],{},"cat"," inside Ubuntu",[23,1880,1881],{},"Confirm Ubuntu sees the same file content",[53,1883,1884],{},"If the file does not match, stop and fix the share before Apache setup",[11,1886,1888,1892,1894,1897],{"id":1887,"level":14},"step-8-install-apache-php-mysql",[16,1889,1891],{"id":1890},"step-8-install-apache-php-and-mysql","Step 8: Install Apache, PHP, And MySQL",[53,1893,1721],{},[1533,1895],{"language":1535,"src":1896},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-8-install-apache-ph-09.sh",[20,1898,1899,1905,1911,1917,1923,1929],{},[23,1900,1901,1904],{},[39,1902,1903],{},"apache2",": web server",[23,1906,1907,1910],{},[39,1908,1909],{},"php",": PHP runtime",[23,1912,1913,1916],{},[39,1914,1915],{},"libapache2-mod-php",": lets Apache execute PHP files",[23,1918,1919,1922],{},[39,1920,1921],{},"mysql-server",": local MySQL database server",[23,1924,1925,1928],{},[39,1926,1927],{},"php-mysql",": lets PHP connect to MySQL",[23,1930,1729,1931,1732,1933,1935],{},[39,1932,1619],{},[39,1934,1625],{}," first only if they have not been run recently",[11,1937,1939,1943,1950],{"id":1938,"level":265},"optional-swap-check",[16,1940,1942],{"id":1941},"optional-add-swap-if-swap-is-off","Optional: Add Swap If Swap Is Off",[53,1944,1945,1946,1949],{},"Ubuntu usually has swap already. Only add this if ",[39,1947,1948],{},"swapon --show"," prints nothing.",[270,1951,1952,1966],{"gap":272,"left-width":1592,"right-width":1592},[277,1953,1954,1957,1960,1963],{"v-slot:left":279},[53,1955,1956],{},"Check first:",[1533,1958],{"language":1535,"src":1959},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-add-swap-if-swa-10.sh",[53,1961,1962],{},"Add a small swap file only if swap is off:",[1533,1964],{"language":1535,"src":1965},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-add-swap-if-swa-11.sh",[277,1967,1968],{"v-slot:right":279},[20,1969,1970,1973,1978,1981],{},[23,1971,1972],{},"Swap gives Ubuntu emergency disk-backed memory",[23,1974,1975,1976],{},"It helps when installs or MySQL briefly need more than ",[39,1977,541],{},[23,1979,1980],{},"It is slower than RAM, so it is not a performance upgrade",[23,1982,1983],{},"Do not run the setup again if swap already exists",[11,1985,1987,1991,1997],{"id":1986,"level":265},"optional-apache-low-memory",[16,1988,1990],{"id":1989},"optional-limit-apache-memory-use","Optional: Limit Apache Memory Use",[53,1992,1993,1994,1996],{},"Use this if the ",[39,1995,541],{}," VM feels unstable or Apache starts too many PHP workers.",[270,1998,1999,2012],{"gap":272,"left-width":1592,"right-width":1592},[277,2000,2001,2004,2009],{"v-slot:left":279},[53,2002,2003],{},"Edit Apache prefork settings in:",[53,2005,2006],{},[39,2007,2008],{},"\u002Fetc\u002Fapache2\u002Fmods-available\u002Fmpm_prefork.conf",[1533,2010],{"language":1535,"src":2011},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-apache-me-12.sh",[277,2013,2014,2017,2021],{"v-slot:right":279},[53,2015,2016],{},"Change the existing values to:",[1533,2018],{"language":2019,"src":2020},"apache","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-apache-me-13.txt",[20,2022,2023,2029,2032,2039],{},[23,2024,2025,2026],{},"Edit the existing lines inside ",[39,2027,2028],{},"\u003CIfModule mpm_prefork_module>",[23,2030,2031],{},"If a line is missing, add it inside that same block",[23,2033,2034,2035,2038],{},"Do not paste a second ",[39,2036,2037],{},"\u003CIfModule>"," block",[23,2040,2041],{},"Restart Apache after config changes",[11,2043,2045,2049,2055],{"id":2044,"level":265},"optional-mysql-low-memory",[16,2046,2048],{"id":2047},"optional-limit-mysql-memory-use","Optional: Limit MySQL Memory Use",[53,2050,2051,2052,2054],{},"Use this only if MySQL struggles on the ",[39,2053,541],{}," VM.",[270,2056,2057,2070],{"gap":272,"left-width":1592,"right-width":1592},[277,2058,2059,2062,2067],{"v-slot:left":279},[53,2060,2061],{},"Edit MySQL server settings in:",[53,2063,2064],{},[39,2065,2066],{},"\u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf",[1533,2068],{"language":1535,"src":2069},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-mysql-mem-14.sh",[277,2071,2072,2079,2083],{"v-slot:right":279},[53,2073,2074,2075,2078],{},"Add or edit these under ",[39,2076,2077],{},"[mysqld]",":",[1533,2080],{"language":2081,"src":2082},"ini","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-mysql-mem-15.txt",[20,2084,2085,2091,2096,2099],{},[23,2086,2087,2088,2090],{},"Keep these under the existing ",[39,2089,2077],{}," heading",[23,2092,2093,2094,2090],{},"Do not create a second ",[39,2095,2077],{},[23,2097,2098],{},"If either setting already exists, edit it instead of adding a duplicate",[23,2100,2101],{},"Restart MySQL after config changes",[11,2103,2105,2108,2111,2114],{"id":2104,"level":265},"low-memory-diagnostics",[16,2106,2107],{"id":2104},"Low Memory Diagnostics",[53,2109,2110],{},"Run these after the minor tuning checks:",[1533,2112],{"language":1535,"src":2113},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Flow-memory-diagnostics-10.sh",[20,2115,2116,2122,2127,2133,2140],{},[23,2117,2118,2121],{},[39,2119,2120],{},"free -h",": shows RAM and swap",[23,2123,2124,2126],{},[39,2125,1948],{},": confirms whether swap is active",[23,2128,2129,2132],{},[39,2130,2131],{},"systemctl status",": checks whether Apache and MySQL are running",[23,2134,2135,2136,2139],{},"No output from the ",[39,2137,2138],{},"grep"," line is usually good",[23,2141,2142],{},"Do not tune randomly; change one setting, restart, then retest",[11,2144,2146,2150,2152,2155,2158,2161],{"id":2145,"level":14},"step-9-create-local-mysql-db",[16,2147,2149],{"id":2148},"step-9-create-a-local-mysql-database","Step 9: Create A Local MySQL Database",[53,2151,1721],{},[1533,2153],{"language":1535,"src":2154},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-9-create-a-local-my-11.sh",[53,2156,2157],{},"Then run in the MySQL prompt:",[1533,2159],{"language":1857,"src":2160},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-9-create-a-local-my-12.sql",[20,2162,2163,2167,2170],{},[23,2164,1548,2165,1552],{},[39,2166,1551],{},[23,2168,2169],{},"Database name and username should match your UCID",[23,2171,2172],{},"Password is local-only unless your instructor says otherwise",[11,2174,2176,2179,2182,2197,2200,2207],{"id":2175,"level":14},"local-vs-remote-database",[16,2177,2178],{"id":2175},"Local Vs Remote Database",[53,2180,2181],{},"This MySQL database is only for local testing:",[20,2183,2184,2189,2192,2194],{},[23,2185,2186,2187],{},"Host: ",[39,2188,225],{},[23,2190,2191],{},"Database: your UCID",[23,2193,1257],{},[23,2195,2196],{},"Password: your local password",[53,2198,2199],{},"Render uses the instructor-provided remote database connection string",[53,2201,2202,2203],{},"Get that string from ",[146,2204,2205],{"href":2205,"rel":2206},"https:\u002F\u002Fcourses.ethereallab.app\u002Fdatabase",[150],[53,2208,2209],{},"After this lesson, you may optionally point local code at that remote database for extra testing",[11,2211,2213,2217,2219,2222,2225,2228,2231],{"id":2212,"level":14},"step-10-confirm-local-mysql",[16,2214,2216],{"id":2215},"step-10-confirm-local-mysql-login","Step 10: Confirm Local MySQL Login",[53,2218,1721],{},[1533,2220],{"language":1535,"src":2221},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-10-confirm-local-my-13.sh",[53,2223,2224],{},"Then run:",[1533,2226],{"language":1857,"src":2227},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-10-confirm-local-my-14.sql",[53,2229,2230],{},"Expected:",[20,2232,2233,2239],{},[23,2234,2235,2238],{},[39,2236,2237],{},"SELECT DATABASE()"," returns your UCID",[23,2240,2241,2244],{},[39,2242,2243],{},"SHOW TABLES"," is empty or shows starter tables later",[11,2246,2248,2254,2257,2260,2263],{"id":2247,"level":14},"step-11-documentroot",[16,2249,2251,2252],{"id":2250},"step-11-point-apache-at-public_html","Step 11: Point Apache At ",[39,2253,41],{},[53,2255,2256],{},"Apache should serve:",[1533,2258],{"language":1542,"src":2259},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-11-point-apache-at--15.txt",[53,2261,2262],{},"Do not serve the whole repo",[20,2264,2265,2276],{},[23,2266,2267,2269,2270,2272,2273,2275],{},[39,2268,1847],{},", ",[39,2271,1852],{},", and ",[39,2274,1857],{}," stay outside the web root",[23,2277,2278,2280],{},[39,2279,41],{}," is the browser-facing folder",[11,2282,2284,2288,2291,2296,2299,2304,2307,2310],{"id":2283,"level":265},"apache-site-config",[16,2285,2287],{"id":2286},"step-111-apache-site-config","Step 11.1: Apache Site Config",[53,2289,2290],{},"Create or edit this Apache site config file inside Ubuntu:",[53,2292,2293],{},[39,2294,2295],{},"\u002Fetc\u002Fapache2\u002Fsites-available\u002Fit202.conf",[53,2297,2298],{},"Run:",[53,2300,2301],{},[39,2302,2303],{},"sudo nano \u002Fetc\u002Fapache2\u002Fsites-available\u002Fit202.conf",[53,2305,2306],{},"Add this content to that file:",[1533,2308],{"language":2019,"src":2309},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-11-1-apache-site-co-16.txt",[20,2311,2312,2317,2323,2328],{},[23,2313,1548,2314,2316],{},[39,2315,1829],{}," with the actual shared folder name",[23,2318,2319,2320],{},"Save the file as ",[39,2321,2322],{},"it202.conf",[23,2324,2325,2326],{},"Apache listens on guest port ",[39,2327,1446],{},[23,2329,2330,2331],{},"Host browser reaches it through ",[39,2332,77],{},[11,2334,2336,2340,2342,2345],{"id":2335,"level":265},"enable-site",[16,2337,2339],{"id":2338},"step-112-enable-the-site","Step 11.2: Enable The Site",[53,2341,1721],{},[1533,2343],{"language":1535,"src":2344},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-11-2-enable-the-sit-17.sh",[20,2346,2347,2353,2359,2365,2374,2380],{},[23,2348,2349,2352],{},[39,2350,2351],{},"a2ensite",": enable a site config",[23,2354,2355,2358],{},[39,2356,2357],{},"a2dissite",": disable a site config",[23,2360,2361,2364],{},[39,2362,2363],{},"www-data",": Apache's user for browser requests",[23,2366,2367,2368,2370,2371,2373],{},"Adding ",[39,2369,2363],{}," to ",[39,2372,1794],{}," lets Apache read the shared folder",[23,2375,2376,2379],{},[39,2377,2378],{},"configtest",": check syntax before reload",[23,2381,2382,2385],{},[39,2383,2384],{},"restart",": applies the Apache user group change",[11,2387,2389,2393,2396,2399,2402],{"id":2388,"level":14},"step-12-php-check-page",[16,2390,2392],{"id":2391},"step-12-create-a-php-check-page","Step 12: Create A PHP Check Page",[53,2394,2395],{},"Create this file on the host:",[1533,2397],{"language":1542,"src":2398},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-12-create-a-php-che-18.txt",[53,2400,2401],{},"Example content:",[1533,2403],{"language":1909,"src":2404},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-12-create-a-php-che-19.php",[11,2406,2408,2411,2414,2417,2419],{"id":2407,"level":14},"final-browser-check",[16,2409,2410],{"id":2407},"Final Browser Check",[53,2412,2413],{},"Open from host browser:",[1533,2415],{"language":1542,"src":2416},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Ffinal-browser-check-20.txt",[53,2418,2230],{},[20,2420,2421,2424,2427,2430],{},[23,2422,2423],{},"Message appears",[23,2425,2426],{},"Time appears",[23,2428,2429],{},"PHP code is not shown as raw text",[23,2431,2432],{},"Editing the file on host changes output after refresh",[11,2434,2436,2439],{"id":2435,"level":14},"common-problems",[16,2437,2438],{"id":2435},"Common Problems",[20,2440,2441,2444,2447,2452,2455,2468,2478],{},[23,2442,2443],{},"Browser timeout: missing or wrong port-forwarding rule",[23,2445,2446],{},"Connection refused: Apache not running",[23,2448,2449,2450],{},"No internet in VM: check Adapter 1 is still ",[39,2451,1428],{},[23,2453,2454],{},"Shared folder missing: check Auto-mount and guest utilities",[23,2456,2457,2458,2461,2462,2464,2465,2467],{},"Browser shows ",[39,2459,2460],{},"403 Forbidden",": confirm ",[39,2463,2363],{}," is in ",[39,2466,1794],{},", then restart Apache or reboot",[23,2469,2470,2471,2474,2475,2477],{},"Permission denied on ",[39,2472,2473],{},"\u002Fmedia\u002Fsf_...",": confirm your Ubuntu user is in ",[39,2476,1794],{}," and reboot",[23,2479,2480],{},"Raw PHP code: PHP module not running through Apache",[11,2482,2484,2487,2490],{"id":2483,"level":14},"recovery-routine",[16,2485,2486],{"id":2483},"Recovery Routine",[53,2488,2489],{},"Check in this order:",[2491,2492,2493,2496,2502,2508,2513,2521,2528,2534,2539,2548],"ol",{},[23,2494,2495],{},"VM is running",[23,2497,2498,2501],{},[39,2499,2500],{},"ping github.com"," works inside Ubuntu",[23,2503,2504,2507],{},[39,2505,2506],{},"ssh username@localhost"," works from host",[23,2509,2510,2512],{},[39,2511,1770],{}," shows the shared repo",[23,2514,2515,2518,2519],{},[39,2516,2517],{},"groups"," includes ",[39,2520,1794],{},[23,2522,2523,2518,2526],{},[39,2524,2525],{},"id www-data",[39,2527,1794],{},[23,2529,2530,2533],{},[39,2531,2532],{},"sudo systemctl status apache2"," is active",[23,2535,2536,2533],{},[39,2537,2538],{},"sudo systemctl status mysql",[23,2540,2541,2544,2545],{},[39,2542,2543],{},"sudo apache2ctl configtest"," says ",[39,2546,2547],{},"Syntax OK",[23,2549,2550,2553],{},[39,2551,2552],{},"http:\u002F\u002Flocalhost:3000\u002Fsystem\u002Fvm-check.php"," loads from the host browser",[11,2555,2557,2560],{"id":2556,"level":14},"key-terms-and-further-learning",[16,2558,2559],{"id":2556},"Key Terms And Further Learning",[270,2561,2562,2607],{"gap":272,"left-width":1592,"right-width":1592},[277,2563,2564,2569,2576,2585,2590,2596,2602],{"v-slot:left":279},[2565,2566,2568],"h3",{"id":2567},"key-terms","Key Terms",[53,2570,2571,2575],{},[2572,2573,2574],"strong",{},"VM"," - separate computer running inside your host computer",[53,2577,2578,2581,2582,2584],{},[2572,2579,2580],{},"Port forwarding"," - host ",[39,2583,225],{}," traffic routed into the VM",[53,2586,2587,2589],{},[2572,2588,1794],{}," - VirtualBox shared-folder permission group",[53,2591,2592,2595],{},[2572,2593,2594],{},"Guest utilities"," - VirtualBox tools that help shared folders work inside Ubuntu",[53,2597,2598,2601],{},[2572,2599,2600],{},"DocumentRoot"," - folder Apache serves to browsers",[53,2603,2604,2606],{},[2572,2605,1428],{}," - VM network mode that gives the VM outbound internet access",[277,2608,2609,2613],{"v-slot:right":279},[2565,2610,2612],{"id":2611},"further-learning","Further Learning",[20,2614,2615,2621,2628,2635,2642,2649,2655],{},[23,2616,2617],{},[146,2618,2620],{"href":148,"rel":2619},[150],"VirtualBox Downloads",[23,2622,2623],{},[146,2624,2627],{"href":2625,"rel":2626},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002FIntroduction.html",[150],"VirtualBox Manual: Host And Guest Combinations",[23,2629,2630],{},[146,2631,2634],{"href":2632,"rel":2633},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Finstallation.html",[150],"VirtualBox Manual: Installation",[23,2636,2637],{},[146,2638,2641],{"href":2639,"rel":2640},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Fsharedfolders.html",[150],"VirtualBox Manual: Shared Folders",[23,2643,2644],{},[146,2645,2648],{"href":2646,"rel":2647},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Fnetworkingdetails.html#network_nat_service",[150],"VirtualBox Manual: NAT Port Forwarding",[23,2650,2651],{},[146,2652,2654],{"href":167,"rel":2653},[150],"Ubuntu Server: Installer",[23,2656,2657],{},[146,2658,2661],{"href":2659,"rel":2660},"https:\u002F\u002Fdocumentation.ubuntu.com\u002Fserver\u002Fhow-to\u002Fsecurity\u002Fopenssh-server\u002F",[150],"Ubuntu Server: OpenSSH Server",[11,2663,2665,2668,2671],{"id":2664,"level":14},"summary",[16,2666,2667],{"id":2664},"Summary",[53,2669,2670],{},"Before leaving this presentation, confirm you can:",[20,2672,2673,2676,2679,2682,2685,2690],{},[23,2674,2675],{},"Pick the correct Ubuntu ISO for your host CPU",[23,2677,2678],{},"Configure NAT port forwarding",[23,2680,2681],{},"Connect to Ubuntu with SSH",[23,2683,2684],{},"Find the VirtualBox shared repo",[23,2686,2687,2688],{},"Configure Apache to serve ",[39,2689,41],{},[23,2691,2692],{},"Create a local MySQL database and user named after your UCID",{"title":279,"searchDepth":2694,"depth":2694,"links":2695},2,[2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2754,2755,2756,2757,2758,2759,2760,2761],{"id":18,"depth":2694,"text":5},{"id":48,"depth":2694,"text":51},{"id":94,"depth":2694,"text":97},{"id":132,"depth":2694,"text":135},{"id":205,"depth":2694,"text":208},{"id":240,"depth":2694,"text":241},{"id":264,"depth":2694,"text":268},{"id":306,"depth":2694,"text":309},{"id":332,"depth":2694,"text":335},{"id":361,"depth":2694,"text":364},{"id":393,"depth":2694,"text":394},{"id":417,"depth":2694,"text":420},{"id":448,"depth":2694,"text":451},{"id":480,"depth":2694,"text":481},{"id":518,"depth":2694,"text":519},{"id":582,"depth":2694,"text":585},{"id":617,"depth":2694,"text":620},{"id":664,"depth":2694,"text":667},{"id":707,"depth":2694,"text":710},{"id":751,"depth":2694,"text":754},{"id":803,"depth":2694,"text":804},{"id":867,"depth":2694,"text":868},{"id":906,"depth":2694,"text":907},{"id":941,"depth":2694,"text":942},{"id":978,"depth":2694,"text":979},{"id":1011,"depth":2694,"text":1012},{"id":1048,"depth":2694,"text":1049},{"id":1081,"depth":2694,"text":1082},{"id":1111,"depth":2694,"text":1112},{"id":1141,"depth":2694,"text":1142},{"id":1171,"depth":2694,"text":1172},{"id":1201,"depth":2694,"text":1202},{"id":1231,"depth":2694,"text":1232},{"id":1266,"depth":2694,"text":1267},{"id":1298,"depth":2694,"text":1299},{"id":1331,"depth":2694,"text":1332},{"id":1364,"depth":2694,"text":1365},{"id":1416,"depth":2694,"text":1417},{"id":1460,"depth":2694,"text":1461},{"id":1486,"depth":2694,"text":1487},{"id":1527,"depth":2694,"text":1528},{"id":1584,"depth":2694,"text":1585},{"id":1666,"depth":2694,"text":1667},{"id":1717,"depth":2694,"text":1718},{"id":1750,"depth":2694,"text":1751},{"id":1780,"depth":2694,"text":1781},{"id":1810,"depth":2694,"text":1811},{"id":1863,"depth":2694,"text":1864},{"id":1890,"depth":2694,"text":1891},{"id":1941,"depth":2694,"text":1942},{"id":1989,"depth":2694,"text":1990},{"id":2047,"depth":2694,"text":2048},{"id":2104,"depth":2694,"text":2107},{"id":2148,"depth":2694,"text":2149},{"id":2175,"depth":2694,"text":2178},{"id":2215,"depth":2694,"text":2216},{"id":2250,"depth":2694,"text":2753},"Step 11: Point Apache At public_html",{"id":2286,"depth":2694,"text":2287},{"id":2338,"depth":2694,"text":2339},{"id":2391,"depth":2694,"text":2392},{"id":2407,"depth":2694,"text":2410},{"id":2435,"depth":2694,"text":2438},{"id":2483,"depth":2694,"text":2486},{"id":2556,"depth":2694,"text":2559},{"id":2664,"depth":2694,"text":2667},"presentation","Internet Applications","Build the local Ubuntu VM path with VirtualBox, Apache, PHP, MySQL, SSH, and shared folders.","Face-to-face class of about 40 students; includes VirtualBox install differences, CPU\u002FISO selection, networking, SSH, shared folders, Apache\u002FPHP\u002FMySQL, browser checks, and beginner troubleshooting.","25","95","120",{"requiresLessonBranchCheckpoint":2770},false,true,"90","\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox","Core","14",null,{"title":5,"description":2764},"published","internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox",[2781,2782,2019,2783,2784],"virtualbox","ubuntu","mysql","vm","2026-06-11T00:34:46-04:00","1:06:16","ArTDIgihfd4","https:\u002F\u002Fyoutu.be\u002FArTDIgihfd4","IT202 VirtualBox and VM Setup","qlVA5S8rq9flgtoL_LcCHuWYg27deJiQm1H8dsF2O14",[2792,2795,2800,2804,2808,2811,2814,2817,2821,2824,2827,2831,2835,2838,2842,2845,2848,2852,2855,2858,2861,2863,2865,2867,2869,2871,2873,2875,2878,2881,2884,2887,2890,2892,2895,2898,2902,2906,2910,2913,2916,2919,2922,2926,2930,2933,2936,2939,2942,2946,2950,2953,2955,2958,2961,2964,2967,2970,2973,2976,2979,2983,2986,2988,2992,2995,2998,3001,3004,3007,3010,3013,3016,3019,3022,3025,3028,3031,3034,3037,3040,3044,3047,3050,3053,3056,3059,3062,3065,3068,3071,3074,3078,3081,3084,3087,3090,3093,3096,3099,3102,3105,3108,3111,3114,3117,3120,3123,3126,3129,3132,3135,3138,3141,3144,3147,3150,3153,3156,3159,3162,3165,3168,3171,3174,3177,3180,3183,3186,3189,3192,3195,3198,3201,3204,3207,3210,3213,3216,3219,3222,3225,3228,3231,3234,3237,3240,3243,3246,3249,3252,3255,3258,3261,3264,3267,3270,3273,3276,3279,3282,3285,3288,3291,3294,3297,3300,3303,3306,3309,3312,3315,3318,3321,3324,3327,3330,3333,3336,3339,3342,3345,3348,3351,3354,3357,3360,3363,3366,3369,3372,3375,3378,3381,3384,3387,3390,3393,3396,3399,3402,3405,3408,3411,3414,3417,3420,3423,3426,3429,3432,3436,3439,3442,3445,3448,3451,3454,3457,3460,3463,3466,3469,3472,3475,3478,3481,3484,3487,3490,3493,3496,3499,3502,3505,3508,3511,3514,3517,3520,3523,3526,3529,3532,3535,3538,3541,3544,3547,3550,3553,3556,3559,3562,3565,3568,3571,3574,3577,3580,3583,3586,3589,3592,3595,3598,3601,3604,3607,3610,3613,3616,3619,3622,3625,3628,3631,3634,3637,3640,3643,3646,3649,3652,3655,3658,3661,3664,3667,3670,3673,3676,3679,3682,3685,3688,3691,3694,3697,3700,3703,3706,3709,3712,3715,3718,3721,3724,3727,3730,3733,3736,3739,3742,3745,3748,3751,3754,3757,3760,3763,3766,3769,3772,3775,3778,3781,3784,3787,3790,3793,3796,3799,3802,3805,3808,3811,3814,3817,3821,3824,3827,3830,3833,3836,3839,3841,3843,3845,3847,3849,3851,3853,3855,3857,3858,3860,3862,3864,3866,3868,3870,3872,3874,3876,3878,3880,3882,3885,3887,3889,3891,3893,3895,3897,3899,3901,3903,3905,3907,3909,3911,3913,3915,3919,3923,3927,3930,3933,3937,3940,3943,3946,3949,3952,3955,3959,3962,3965,3968,3971,3973,3975,3977,3979,3982,3985,3988,3991,3994,3997,4000,4003,4006,4009,4012,4015,4018,4021,4024,4027,4030,4033,4036,4039,4042,4045,4048,4051,4054,4057,4060,4063,4066,4069,4072,4075,4078,4081,4084,4087,4090,4093,4096,4099,4102,4105,4108,4111,4114,4117,4120,4123,4126,4129,4132,4135,4138,4141,4144,4146,4148,4150,4152,4154,4156,4158,4160,4162,4164,4166,4168,4170,4172,4174,4176,4178,4180,4183,4185,4187,4189,4191,4193,4195,4197,4199,4201,4203,4205,4207,4209,4211,4213,4215,4217,4219,4221,4223,4225,4228,4231,4234,4237,4240,4242,4244,4247,4250,4253,4256,4259,4262],{"path":2793,"title":2794,"order":2776,"module":2776,"status":2776},"\u002Fabout","About Content Version 3",{"path":2796,"title":2797,"order":2798,"module":569,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F01-introduction\u002F01-first-concept","First Concept","5","draft",{"path":2801,"title":2802,"order":2803,"module":569,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F01-introduction\u002F01-what-is-a-game","What is a Game?","10",{"path":2805,"title":2806,"order":2807,"module":569,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F01-introduction\u002F02-what-is-gameplay","What is Gameplay?","20",{"path":2809,"title":2810,"order":2803,"module":14,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F02-game-balance\u002F01-game-balance","Game Balance",{"path":2812,"title":2813,"order":2803,"module":265,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F03-look-and-feel\u002F01-color-theory","Game Design: Color Theory",{"path":2815,"title":2816,"order":2807,"module":265,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F03-look-and-feel\u002F02-look-and-feel","Game Design - Look and Feel",{"path":2818,"title":2819,"order":2803,"module":2820,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F04-game-mechanics\u002F01-game-mechanics","Game Mechanics","4",{"path":2822,"title":2823,"order":2807,"module":2820,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F04-game-mechanics\u002F02-decks","Technical: Decks and Cards",{"path":2825,"title":2826,"order":2803,"module":2798,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F05-depth-complexity-and-randomness\u002F01-depth-vs-complexity-and-randomness","Depth, Complexity, And Randomness",{"path":2828,"title":2829,"order":2807,"module":2830,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F06-first-game-planning\u002F02-planning-and-management","Planning From Concept To Prototype","6",{"path":2832,"title":2833,"order":2803,"module":2834,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F08-game-architecture\u002F01-concepts-and-design","Game Architecture: Concepts And Design","8",{"path":2836,"title":2837,"order":2807,"module":2834,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F08-game-architecture\u002F02-features-of-a-game-engine","Game Engine Features And Browser Feasibility",{"path":2839,"title":2840,"order":2803,"module":2841,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F09-entity-based-systems\u002F01-ecs","Entity-Based Systems","9",{"path":2843,"title":2844,"order":2803,"module":2803,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F10-player-facing-feature-systems\u002F01-spatial-rules-levels-and-interface","Spatial Rules, Levels, And Interface",{"path":2846,"title":2847,"order":2807,"module":2803,"status":2799},"\u002Fgame-architecture-and-design\u002F2e\u002Fpresentations\u002F10-player-facing-feature-systems\u002F02-actors-behavior-and-effects","Actors, Behavior, And Effects",{"path":2849,"title":2850,"order":569,"module":2851,"status":2778},"\u002Fgame-architecture-and-design\u002F2e\u002Fsyllabus\u002Ffall-2026","Course Syllabus: IT265 - Game Architecture and Design","0",{"path":2853,"title":2854,"order":569,"module":2851,"status":2799},"\u002Fgame-architecture-and-design","Game Architecture and Design",{"path":2856,"title":2857,"order":2776,"module":2776,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations-revised\u002F00-revision-plan","Game Architecture And Design Presentation Revision Plan",{"path":2859,"title":2860,"order":2776,"module":2776,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations-revised\u002F01-20-minute-recording-plan","Game Architecture And Design Twenty-Minute Recording Plan",{"path":2862,"title":2802,"order":2803,"module":569,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F01-introduction\u002F01-what-is-a-game",{"path":2864,"title":2806,"order":2807,"module":569,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F01-introduction\u002F02-what-is-gameplay",{"path":2866,"title":2810,"order":2803,"module":14,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F02-game-balance\u002F01-game-balance",{"path":2868,"title":2813,"order":2803,"module":265,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F03-look-and-feel\u002F01-color-theory",{"path":2870,"title":2816,"order":2807,"module":265,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F03-look-and-feel\u002F02-look-and-feel",{"path":2872,"title":2819,"order":2803,"module":2820,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F04-game-mechanics\u002F01-game-mechanics",{"path":2874,"title":2823,"order":2807,"module":2820,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F04-game-mechanics\u002F02-decks",{"path":2876,"title":2877,"order":2803,"module":2798,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F05-depth-complexity-and-randomness\u002F01-depth-vs-complexity-and-randomness","Depth vs Complexity and Randomness",{"path":2879,"title":2880,"order":2803,"module":2830,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F06-first-game-planning\u002F01-first-concept","First Concept: Updated Lesson",{"path":2882,"title":2883,"order":2807,"module":2830,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F06-first-game-planning\u002F02-planning-and-management","Planning and Management",{"path":2885,"title":2886,"order":2803,"module":2834,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F08-game-architecture\u002F01-concepts-and-design","Game Architecture: Concepts and Design",{"path":2888,"title":2889,"order":2807,"module":2834,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F08-game-architecture\u002F02-features-of-a-game-engine","Game Architecture: Features of a Game Engine",{"path":2891,"title":2840,"order":2803,"module":2841,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F09-entity-based-systems\u002F01-ecs",{"path":2893,"title":2894,"order":2803,"module":2803,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F10-level-mechanics\u002F01-level-mechanics","Game Design: Introduction to Level Mechanics",{"path":2896,"title":2897,"order":2807,"module":2803,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F10-level-mechanics\u002F02-grids","Technical: Square vs Hex Grids in Board Games",{"path":2899,"title":2900,"order":2803,"module":2901,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F11-user-interfaces\u002F01-user-interfaces","Game Design: User Interfaces","11",{"path":2903,"title":2904,"order":2803,"module":2905,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F12-actor-representations\u002F01-actors","Game Design: Actor Representations","12",{"path":2907,"title":2908,"order":2803,"module":2909,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F13-artificial-intelligence\u002F01-ai","Game Design: AI","13",{"path":2911,"title":2912,"order":2803,"module":2775,"status":2799},"\u002Fgame-architecture-and-design\u002Fpresentations\u002F14-particles-and-physics\u002F01-particles-and-physics","IT265: Particle Systems and Physics Engine",{"path":2914,"title":2915,"order":569,"module":2851,"status":2799},"\u002Fgame-architecture-and-design\u002Fsyllabus\u002Fspring-2026","Course Syllabus: IT265 - Game Architecture",{"path":2917,"title":2918,"order":2803,"module":2851,"status":2799},"\u002Fgame-architecture-and-design\u002Fworksheets\u002Fcase-study-1-atari-worksheet","Case Study 1 - Atari",{"path":2920,"title":2921,"order":2807,"module":2851,"status":2799},"\u002Fgame-architecture-and-design\u002Fworksheets\u002Fit265-case-study-color-theory-worksheet","IT265 Case Study - Color Theory",{"path":2923,"title":2924,"order":2925,"module":2851,"status":2799},"\u002Fgame-architecture-and-design\u002Fworksheets\u002Fit265-case-study-personal-choice-worksheet","IT265 Case Study - Personal Choice","40",{"path":2927,"title":2928,"order":2929,"module":2851,"status":2799},"\u002Fgame-architecture-and-design\u002Fworksheets\u002Fit265-design-treatment-checkpoint-worksheet","IT265 Design Treatment Checkpoint","30",{"path":2931,"title":2932,"order":2803,"module":569,"status":2799},"\u002Fgeneral\u002F2e\u002Fpresentations\u002F01-git-and-terminal-setup","Git And Terminal Setup",{"path":2934,"title":2935,"order":2807,"module":569,"status":2799},"\u002Fgeneral\u002F2e\u002Fpresentations\u002F02-cli-foundations","CLI Foundations",{"path":2937,"title":2938,"order":2929,"module":569,"status":2799},"\u002Fgeneral\u002F2e\u002Fpresentations\u002F03-github-setup-and-ssh","GitHub Setup And SSH",{"path":2940,"title":2941,"order":2925,"module":569,"status":2799},"\u002Fgeneral\u002F2e\u002Fpresentations\u002F04-local-git-workflow-and-course-repositories","Local Git Workflow And Course Repositories",{"path":2943,"title":2944,"order":2945,"module":569,"status":2799},"\u002Fgeneral\u002F2e\u002Fpresentations\u002F05-vscode-setup-and-course-extensions","VS Code Setup And Course Extensions","50",{"path":2947,"title":2948,"order":2949,"module":569,"status":2799},"\u002Fgeneral\u002F2e\u002Fpresentations\u002F06-trace-learning-journal","TRACE Learning Journal Foundations","60",{"path":2951,"title":2952,"order":2776,"module":2776,"status":2776},"\u002Fgeneral\u002Fbasic-cli","Basic Command Line",{"path":2954,"title":2952,"order":2803,"module":569,"status":2776},"\u002Fgeneral\u002Fbasic-command-line",{"path":2956,"title":2957,"order":2776,"module":2776,"status":2778},"\u002F","Ethereal Lab Course Materials",{"path":2959,"title":2960,"order":2851,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord","Learn Courses Platform And Discord",{"path":2962,"title":2963,"order":2803,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands","Basic CLI Commands",{"path":2965,"title":2966,"order":2807,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools","Git Tools",{"path":2968,"title":2969,"order":2929,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh","Set Up GitHub SSH",{"path":2971,"title":2972,"order":2925,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs","Git Commands And Pull Requests",{"path":2974,"title":2975,"order":2945,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment","Local Development Environment Setup",{"path":2977,"title":2978,"order":2949,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository","Add Instructor Template To Your Repository",{"path":2980,"title":2981,"order":2982,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches","QA And Prod Branches","70",{"path":2984,"title":2985,"order":1446,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup","Render Setup",{"path":2987,"title":5,"order":2772,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox",{"path":2989,"title":2990,"order":2991,"module":569,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F10-local-ubuntu-web-server-vmware","Local Ubuntu Web Server With VMware","100",{"path":2993,"title":2994,"order":2803,"module":14,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F02-php-and-javascript-basics\u002F01-compare-php-and-javascript","Compare PHP And JavaScript",{"path":2996,"title":2997,"order":2807,"module":14,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F02-php-and-javascript-basics\u002F02-conditions-loops-functions","Use Conditions Loops And Functions",{"path":2999,"title":3000,"order":2803,"module":265,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F03-html-forms-css-and-dom\u002F01-intro-to-html","Intro To HTML",{"path":3002,"title":3003,"order":2807,"module":265,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F03-html-forms-css-and-dom\u002F02-intro-to-forms-and-get-post","Intro To Forms And GET\u002FPOST",{"path":3005,"title":3006,"order":2929,"module":265,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F03-html-forms-css-and-dom\u002F03-understanding-css-js-selectors-and-dom-updates","Understanding CSS\u002FJS Selectors And DOM Updates",{"path":3008,"title":3009,"order":2803,"module":2820,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F04-databases-and-user-accounts\u002F01-intro-to-sql","Intro To SQL",{"path":3011,"title":3012,"order":2807,"module":2820,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F04-databases-and-user-accounts\u002F02-project-database-setup","Project Database Setup",{"path":3014,"title":3015,"order":2929,"module":2820,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F04-databases-and-user-accounts\u002F03-user-registration","User Registration",{"path":3017,"title":3018,"order":2925,"module":2820,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F04-databases-and-user-accounts\u002F04-user-login","User Login",{"path":3020,"title":3021,"order":2803,"module":2798,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F05-validation-and-user-profiles\u002F01-intro-to-regex","Intro To Regex",{"path":3023,"title":3024,"order":2807,"module":2798,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F05-validation-and-user-profiles\u002F02-project-shared-helpers","Project Shared Helpers",{"path":3026,"title":3027,"order":2929,"module":2798,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F05-validation-and-user-profiles\u002F03-flash-messages-and-redirect-feedback","User Feedback After Redirects",{"path":3029,"title":3030,"order":2925,"module":2798,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F05-validation-and-user-profiles\u002F04-user-profile","User Profile",{"path":3032,"title":3033,"order":2803,"module":2830,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F06-roles-and-crud-pages\u002F01-user-roles-authorization","User Roles Authorization",{"path":3035,"title":3036,"order":2807,"module":2830,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F06-roles-and-crud-pages\u002F02-user-login-enhancement","User Login Enhancement",{"path":3038,"title":3039,"order":2929,"module":2830,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F06-roles-and-crud-pages\u002F03-dynamic-content","Dynamic Content",{"path":3041,"title":3042,"order":2803,"module":3043,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F07-api-data-and-database-helpers\u002F01-working-with-api-data","Working With API Data","7",{"path":3045,"title":3046,"order":2807,"module":3043,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F07-api-data-and-database-helpers\u002F02-api-integration","API Integration",{"path":3048,"title":3049,"order":2929,"module":3043,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F07-api-data-and-database-helpers\u002F03-database-utility-functions","Database Utility Functions",{"path":3051,"title":3052,"order":2803,"module":2834,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F08-reusable-components-jquery-and-ajax\u002F01-milestone-2-bootstrap-and-reusability","Milestone 2 Bootstrap And Reusability",{"path":3054,"title":3055,"order":2807,"module":2834,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F08-reusable-components-jquery-and-ajax\u002F02-jquery-brief-intro","jQuery Brief Intro",{"path":3057,"title":3058,"order":2929,"module":2834,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F08-reusable-components-jquery-and-ajax\u002F03-intro-to-ajax","Intro To AJAX",{"path":3060,"title":3061,"order":2803,"module":2841,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F09-relational-data-search-and-pagination\u002F01-user-associations","Add User Associations",{"path":3063,"title":3064,"order":2807,"module":2841,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F09-relational-data-search-and-pagination\u002F02-association-views-and-pagination","Add Association Views And Pagination",{"path":3066,"title":3067,"order":2803,"module":2803,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F10-association-assignment-and-security\u002F01-association-assignment-and-public-profiles","Association Management And Public Profiles",{"path":3069,"title":3070,"order":2807,"module":2803,"status":2799},"\u002Finternet-applications\u002F2e\u002Fpresentations\u002F10-association-assignment-and-security\u002F02-reusable-csrf-protection","Reusable CSRF Protection",{"path":3072,"title":3073,"order":569,"module":2851,"status":2778},"\u002Finternet-applications\u002F2e\u002Fsyllabus\u002Ffall-2026","IT202 - Internet Applications Syllabus",{"path":3075,"title":3076,"order":2925,"module":2803,"status":3077},"\u002Finternet-applications\u002Fassignments\u002Ffinal-project-submission","Final Project Submission","review",{"path":3079,"title":3080,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fassignments\u002Fmilestones\u002F01-account-access-and-profile-system","Milestone 1: Account, Access, And Profile System",{"path":3082,"title":3083,"order":2807,"module":2834,"status":3077},"\u002Finternet-applications\u002Fassignments\u002Fmilestones\u002F02-api-data-and-project-crud","Milestone 2: API Data And Project CRUD",{"path":3085,"title":3086,"order":2929,"module":2841,"status":3077},"\u002Finternet-applications\u002Fassignments\u002Fmilestones\u002F03-user-associations-search-and-summary","Milestone 3: User Associations, Search, And Summary Views",{"path":3088,"title":3089,"order":2798,"module":2820,"status":2778},"\u002Finternet-applications\u002Fassignments\u002Fproject-proposal","IT 202 Project Proposal",{"path":3091,"title":3092,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F01-what-this-course-is-building","What Internet Applications Build",{"path":3094,"title":3095,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F02-files-folders-and-project-structure","Files, Folders, And Project Structure",{"path":3097,"title":3098,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F02a-basic-cli-commands-for-course-work","Basic CLI Commands For Web Development",{"path":3100,"title":3101,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F02b-install-git-and-terminal-tools","Install Git And Terminal Tools",{"path":3103,"title":3104,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F03-version-control-with-git-and-github","Version Control With Git And GitHub",{"path":3106,"title":3107,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F03a-local-development-environment","Set Up A Local Development Environment",{"path":3109,"title":3110,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F04-adding-the-instructor-template-to-your-repository","Starting From A Starter Template",{"path":3112,"title":3113,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F05-editing-locally-and-seeing-changes-run","Editing Locally And Seeing Changes Run",{"path":3115,"title":3116,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F06-building-a-local-ubuntu-web-server","Building A Local Ubuntu Web Server",{"path":3118,"title":3119,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F07-git-recovery-and-common-mistakes","Git Recovery And Common Mistakes",{"path":3121,"title":3122,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F08-installing-apache-and-php","Installing Apache, PHP, And MySQL",{"path":3124,"title":3125,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F09-your-first-php-page-through-apache","Your First PHP Page Through Apache",{"path":3127,"title":3128,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F10-how-http-works-requests-and-responses","How HTTP Works: Requests And Responses",{"path":3130,"title":3131,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F11-http-methods-get-post-and-status-codes","HTTP Methods: GET, POST, And Status Codes",{"path":3133,"title":3134,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F12-local-qa-and-production-environments","Local, QA, And Production Environments",{"path":3136,"title":3137,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F01-how-php-runs-on-the-server","How PHP Runs On The Server",{"path":3139,"title":3140,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F02-displaying-output-with-php","Displaying Output With PHP",{"path":3142,"title":3143,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F03-displaying-output-with-javascript","Displaying Output With JavaScript",{"path":3145,"title":3146,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F04-variables-storing-and-naming-values","Variables: Storing And Naming Values",{"path":3148,"title":3149,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F05-data-types-strings-numbers-booleans-and-null","Data Types: Strings, Numbers, Booleans, And Null",{"path":3151,"title":3152,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F06-arrays-storing-lists-of-values","Arrays: Storing Lists Of Values",{"path":3154,"title":3155,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F07-conditional-statements-making-decisions","Conditional Statements: Making Decisions",{"path":3157,"title":3158,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F08-loops-repeating-actions","Loops: Repeating Actions",{"path":3160,"title":3161,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F09-functions-reusable-blocks-of-logic","Functions: Reusable Blocks Of Logic",{"path":3163,"title":3164,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F10-reading-and-debugging-error-messages","Reading And Debugging Error Messages",{"path":3166,"title":3167,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F01-html-structure-and-meaning","HTML: Structure And Meaning",{"path":3169,"title":3170,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F02-writing-a-valid-html-document","Writing A Valid HTML Document",{"path":3172,"title":3173,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F03-common-html-elements-and-semantic-tags","Common HTML Elements And Semantic Tags",{"path":3175,"title":3176,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F04-building-forms-inputs-labels-and-buttons","Building Forms: Inputs, Labels, And Buttons",{"path":3178,"title":3179,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F05-get-requests-and-query-string-data","GET Requests And Query String Data",{"path":3181,"title":3182,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F06-post-requests-and-form-body-data","POST Requests And Form Body Data",{"path":3184,"title":3185,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F07-css-fundamentals-selectors-properties-and-values","CSS Fundamentals: Selectors, Properties, And Values",{"path":3187,"title":3188,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F08-the-box-model-margin-border-padding-and-content","The Box Model: Margin, Border, Padding, And Content",{"path":3190,"title":3191,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F09-page-layout-with-flexbox","Page Layout With Flexbox",{"path":3193,"title":3194,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F09a-css-positioning-fixed-headers-and-body-offsets","CSS Positioning: Fixed Headers And Body Offsets",{"path":3196,"title":3197,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F10-selecting-and-changing-elements-with-javascript","Selecting And Changing Elements With JavaScript",{"path":3199,"title":3200,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F11-inline-validation-and-client-side-feedback","Inline Validation And Client-Side Feedback",{"path":3202,"title":3203,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F12-basic-web-accessibility-habits","Basic Web Accessibility Habits",{"path":3205,"title":3206,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F01-why-web-applications-need-a-database","Why Web Applications Need A Database",{"path":3208,"title":3209,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F02-relational-concepts-tables-rows-columns-and-primary-keys","Relational Concepts: Tables, Rows, Columns, And Primary Keys",{"path":3211,"title":3212,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F03-writing-sql-create-insert-select-update-delete","Writing SQL: CREATE, INSERT, SELECT, UPDATE, DELETE",{"path":3214,"title":3215,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F04-creating-tables-with-sql-scripts","Creating Tables With SQL Scripts",{"path":3217,"title":3218,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F05-connecting-php-to-mysql-with-pdo","Connecting PHP To MySQL With PDO",{"path":3220,"title":3221,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F06-parameterized-queries-and-sql-injection-prevention","Parameterized Queries And SQL Injection Prevention",{"path":3223,"title":3224,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F07-building-a-registration-page","Building A Registration Page",{"path":3226,"title":3227,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F08-hashing-passwords-with-password-hash","Hashing Passwords With password_hash()",{"path":3229,"title":3230,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F09-building-a-login-page","Building A Login Page",{"path":3232,"title":3233,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F10-sessions-remembering-the-logged-in-user","Sessions: Remembering The Logged-In User",{"path":3235,"title":3236,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F11-cookies-persistent-client-side-state","Cookies: Persistent Client-Side State",{"path":3238,"title":3239,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F04-databases-and-user-accounts\u002F12-navigation-that-responds-to-login-state","Navigation That Responds To Login State",{"path":3241,"title":3242,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F01-why-client-side-validation-is-not-enough","Why Client-Side Validation Is Not Enough",{"path":3244,"title":3245,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F02-sanitizing-and-escaping-user-input","Sanitizing And Escaping User Input",{"path":3247,"title":3248,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F03-required-fields-and-length-rules","Required Fields And Length Rules",{"path":3250,"title":3251,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F04-regular-expressions-for-pattern-matching","Regular Expressions For Pattern Matching",{"path":3253,"title":3254,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F05-server-side-validation-in-php","Server-Side Validation In PHP",{"path":3256,"title":3257,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F06-cross-site-scripting-xss-prevention","Cross-Site Scripting (XSS) Prevention",{"path":3259,"title":3260,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F07-flash-messages-and-persistent-feedback","Flash Messages And Persistent Feedback",{"path":3262,"title":3263,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F08-allowing-login-by-username-or-email","Allowing Login By Username Or Email",{"path":3265,"title":3266,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F09-building-a-profile-edit-page","Building A Profile Edit Page",{"path":3268,"title":3269,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F10-debugging-account-and-authentication-problems","Debugging Account And Authentication Problems",{"path":3271,"title":3272,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F11-review-the-full-account-system-so-far","Review: The Full Account System So Far",{"path":3274,"title":3275,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F01-role-based-access-control","Role-Based Access Control",{"path":3277,"title":3278,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F02-storing-roles-in-the-database","Storing Roles In The Database",{"path":3280,"title":3281,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F03-protecting-a-page-with-an-access-check","Protecting A Page With An Access Check",{"path":3283,"title":3284,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F04-safe-redirects-after-login-and-logout","Safe Redirects After Login And Logout",{"path":3286,"title":3287,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F05-listing-records-from-the-database","Listing Records From The Database",{"path":3289,"title":3290,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F06-creating-new-records-with-a-form","Creating New Records With A Form",{"path":3292,"title":3293,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F07-editing-existing-records","Editing Existing Records",{"path":3295,"title":3296,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F08-deleting-records-safely","Deleting Records Safely",{"path":3298,"title":3299,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F09-ownership-linking-records-to-users","Ownership: Linking Records To Users",{"path":3301,"title":3302,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F10-first-project-milestone-checklist","First Project Milestone Checklist",{"path":3304,"title":3305,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F11-organizing-growing-php-applications","Organizing Growing PHP Applications",{"path":3307,"title":3308,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F12-reading-a-growing-php-application","Reading A Growing PHP Application",{"path":3310,"title":3311,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F01-what-asynchronous-requests-ajax-solve","What Asynchronous Requests (AJAX) Solve",{"path":3313,"title":3314,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F02-json-a-common-data-format-for-the-web","JSON: A Common Data Format For The Web",{"path":3316,"title":3317,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F03-building-a-php-endpoint-that-returns-json","Building A PHP Endpoint That Returns JSON",{"path":3319,"title":3320,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F04-sending-requests-from-javascript-with-fetch","Sending Requests From JavaScript With Fetch",{"path":3322,"title":3323,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F05-handling-fetch-responses-and-errors","Handling Fetch Responses And Errors",{"path":3325,"title":3326,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F06-updating-the-page-with-returned-data","Updating The Page With Returned Data",{"path":3328,"title":3329,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F07-introduction-to-rest-apis","Introduction To REST APIs",{"path":3331,"title":3332,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F08-reading-api-documentation","Reading API Documentation",{"path":3334,"title":3335,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F09-making-authenticated-api-calls-from-php","Making Authenticated API Calls From PHP",{"path":3337,"title":3338,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F10-storing-and-caching-api-responses","Storing And Caching API Responses",{"path":3340,"title":3341,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F11-cors-and-cross-origin-request-basics","CORS And Cross-Origin Request Basics",{"path":3343,"title":3344,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F12-browser-devtools-for-web-application-debugging","Browser DevTools For Web Application Debugging",{"path":3346,"title":3347,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F01-jquery-simplified-dom-and-event-work","jQuery: Simplified DOM And Event Work",{"path":3349,"title":3350,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F02-selecting-elements-with-jquery","Selecting Elements With jQuery",{"path":3352,"title":3353,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F03-responding-to-events-clicks-inputs-and-submissions","Responding To Events: Clicks, Inputs, And Submissions",{"path":3355,"title":3356,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F04-updating-the-dom-after-a-user-action","Updating The DOM After A User Action",{"path":3358,"title":3359,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F05-sending-ajax-requests-with-jquery","Sending AJAX Requests With jQuery",{"path":3361,"title":3362,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F06-saving-external-api-data-through-php","Saving External API Data Through PHP",{"path":3364,"title":3365,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F07-saving-user-created-records","Saving User-Created Records",{"path":3367,"title":3368,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F08-building-a-project-listing-page","Building A Project Listing Page",{"path":3370,"title":3371,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F09-inline-editing-and-detail-views","Inline Editing And Detail Views",{"path":3373,"title":3374,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F10-second-project-milestone-checklist","Second Project Milestone Checklist",{"path":3376,"title":3377,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F01-foreign-keys-and-referential-integrity","Foreign Keys And Referential Integrity",{"path":3379,"title":3380,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F02-joining-tables-inner-join-left-join","Joining Tables: INNER JOIN, LEFT JOIN",{"path":3382,"title":3383,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F03-user-owned-records-and-access-enforcement","User-Owned Records And Access Enforcement",{"path":3385,"title":3386,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F04-connecting-api-data-to-user-records","Connecting API Data To User Records",{"path":3388,"title":3389,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F05-searching-and-filtering-with-sql","Searching And Filtering With SQL",{"path":3391,"title":3392,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F06-pagination-displaying-records-in-pages","Pagination: Displaying Records In Pages",{"path":3394,"title":3395,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F07-aggregate-functions-count-sum-avg","Aggregate Functions: COUNT, SUM, AVG",{"path":3397,"title":3398,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F08-simple-analytics-and-summary-views","Simple Analytics And Summary Views",{"path":3400,"title":3401,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F09-third-project-milestone-checklist","Third Project Milestone Checklist",{"path":3403,"title":3404,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F01-public-pages-and-unauthenticated-views","Public Pages And Unauthenticated Views",{"path":3406,"title":3407,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F02-user-profile-and-activity-pages","User Profile And Activity Pages",{"path":3409,"title":3410,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F03-refreshing-and-expiring-external-api-data","Refreshing And Expiring External API Data",{"path":3412,"title":3413,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F04-application-wide-security-audit","Application-Wide Security Audit",{"path":3415,"title":3416,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F05-cross-site-request-forgery-csrf-protection","Cross-Site Request Forgery (CSRF) Protection",{"path":3418,"title":3419,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F06-qa-testing-and-collecting-evidence","QA Testing And Collecting Evidence",{"path":3421,"title":3422,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F07-production-environment-checklist","Production Environment Checklist",{"path":3424,"title":3425,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F08-writing-a-project-readme","Writing A Project README",{"path":3427,"title":3428,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F09-final-presentation-and-code-walkthrough","Final Presentation And Code Walkthrough",{"path":3430,"title":3431,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F10-configuration-drift-and-secrets-checks","Configuration Drift And Secrets Checks",{"path":3433,"title":3434,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F01-what-this-course-is-building","Quiz - What Internet Applications Build","ready",{"path":3437,"title":3438,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F02-files-folders-and-project-structure","Quiz - Files, Folders, And Project Structure",{"path":3440,"title":3441,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F02a-basic-cli-commands-for-course-work","Quiz - Basic CLI Commands For Web Development",{"path":3443,"title":3444,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F02b-install-git-and-terminal-tools","Quiz - Install Git And Terminal Tools",{"path":3446,"title":3447,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F03-version-control-with-git-and-github","Quiz - Version Control With Git And GitHub",{"path":3449,"title":3450,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F03a-local-development-environment","Quiz - Set Up A Local Development Environment",{"path":3452,"title":3453,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F04-adding-the-instructor-template-to-your-repository","Quiz - Starting From A Starter Template",{"path":3455,"title":3456,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F05-editing-locally-and-seeing-changes-run","Quiz - Editing Locally And Seeing Changes Run",{"path":3458,"title":3459,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F06-building-a-local-ubuntu-web-server","Quiz - Building A Local Ubuntu Web Server",{"path":3461,"title":3462,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F07-git-recovery-and-common-mistakes","Quiz - Git Recovery And Common Mistakes",{"path":3464,"title":3465,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F08-installing-apache-and-php","Quiz - Installing Apache, PHP, And MySQL",{"path":3467,"title":3468,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F09-your-first-php-page-through-apache","Quiz - Your First PHP Page Through Apache",{"path":3470,"title":3471,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F10-how-http-works-requests-and-responses","Quiz - How HTTP Works: Requests And Responses",{"path":3473,"title":3474,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F11-http-methods-get-post-and-status-codes","Quiz - HTTP Methods: GET, POST, And Status Codes",{"path":3476,"title":3477,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F01-course-workflow-files-and-web-server\u002F12-local-qa-and-production-environments","Quiz - Local, QA, And Production Environments",{"path":3479,"title":3480,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F01-how-php-runs-on-the-server","Quiz - How PHP Runs On The Server",{"path":3482,"title":3483,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F02-displaying-output-with-php","Quiz - Displaying Output With PHP",{"path":3485,"title":3486,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F03-displaying-output-with-javascript","Quiz - Displaying Output With JavaScript",{"path":3488,"title":3489,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F04-variables-storing-and-naming-values","Quiz - Variables: Storing And Naming Values",{"path":3491,"title":3492,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F05-data-types-strings-numbers-booleans-and-null","Quiz - Data Types: Strings, Numbers, Booleans, And Null",{"path":3494,"title":3495,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F06-arrays-storing-lists-of-values","Quiz - Arrays: Storing Lists Of Values",{"path":3497,"title":3498,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F07-conditional-statements-making-decisions","Quiz - Conditional Statements: Making Decisions",{"path":3500,"title":3501,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F08-loops-repeating-actions","Quiz - Loops: Repeating Actions",{"path":3503,"title":3504,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F09-functions-reusable-blocks-of-logic","Quiz - Functions: Reusable Blocks Of Logic",{"path":3506,"title":3507,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F02-programming-fundamentals-in-php-and-javascript\u002F10-reading-and-debugging-error-messages","Quiz - Reading And Debugging Error Messages",{"path":3509,"title":3510,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F01-html-structure-and-meaning","Quiz - HTML: Structure And Meaning",{"path":3512,"title":3513,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F02-writing-a-valid-html-document","Quiz - Writing A Valid HTML Document",{"path":3515,"title":3516,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F03-common-html-elements-and-semantic-tags","Quiz - Common HTML Elements And Semantic Tags",{"path":3518,"title":3519,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F04-building-forms-inputs-labels-and-buttons","Quiz - Building Forms: Inputs, Labels, And Buttons",{"path":3521,"title":3522,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F05-get-requests-and-query-string-data","Quiz - GET Requests And Query String Data",{"path":3524,"title":3525,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F06-post-requests-and-form-body-data","Quiz - POST Requests And Form Body Data",{"path":3527,"title":3528,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F07-css-fundamentals-selectors-properties-and-values","Quiz - CSS Fundamentals: Selectors, Properties, And Values",{"path":3530,"title":3531,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F08-the-box-model-margin-border-padding-and-content","Quiz - The Box Model: Margin, Border, Padding, And Content",{"path":3533,"title":3534,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F09-page-layout-with-flexbox","Quiz - Page Layout With Flexbox",{"path":3536,"title":3537,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F09a-css-positioning-fixed-headers-and-body-offsets","Quiz - CSS Positioning: Fixed Headers And Body Offsets",{"path":3539,"title":3540,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F10-selecting-and-changing-elements-with-javascript","Quiz - Selecting And Changing Elements With JavaScript",{"path":3542,"title":3543,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F11-inline-validation-and-client-side-feedback","Quiz - Inline Validation And Client-Side Feedback",{"path":3545,"title":3546,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F03-html-forms-css-and-the-dom\u002F12-basic-web-accessibility-habits","Quiz - Basic Web Accessibility Habits",{"path":3548,"title":3549,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F01-why-web-applications-need-a-database","Quiz - Why Web Applications Need A Database",{"path":3551,"title":3552,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F02-relational-concepts-tables-rows-columns-and-primary-keys","Quiz - Relational Concepts: Tables, Rows, Columns, And Primary Keys",{"path":3554,"title":3555,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F03-writing-sql-create-insert-select-update-delete","Quiz - Writing SQL: CREATE, INSERT, SELECT, UPDATE, DELETE",{"path":3557,"title":3558,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F04-creating-tables-with-sql-scripts","Quiz - Creating Tables With SQL Scripts",{"path":3560,"title":3561,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F05-connecting-php-to-mysql-with-pdo","Quiz - Connecting PHP To MySQL With PDO",{"path":3563,"title":3564,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F06-parameterized-queries-and-sql-injection-prevention","Quiz - Parameterized Queries And SQL Injection Prevention",{"path":3566,"title":3567,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F07-building-a-registration-page","Quiz - Building A Registration Page",{"path":3569,"title":3570,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F08-hashing-passwords-with-password-hash","Quiz - Hashing Passwords With password_hash()",{"path":3572,"title":3573,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F09-building-a-login-page","Quiz - Building A Login Page",{"path":3575,"title":3576,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F10-sessions-remembering-the-logged-in-user","Quiz - Sessions: Remembering The Logged-In User",{"path":3578,"title":3579,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F11-cookies-persistent-client-side-state","Quiz - Cookies: Persistent Client-Side State",{"path":3581,"title":3582,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F04-databases-and-user-accounts\u002F12-navigation-that-responds-to-login-state","Quiz - Navigation That Responds To Login State",{"path":3584,"title":3585,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F01-why-client-side-validation-is-not-enough","Quiz - Why Client-Side Validation Is Not Enough",{"path":3587,"title":3588,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F02-sanitizing-and-escaping-user-input","Quiz - Sanitizing And Escaping User Input",{"path":3590,"title":3591,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F03-required-fields-and-length-rules","Quiz - Required Fields And Length Rules",{"path":3593,"title":3594,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F04-regular-expressions-for-pattern-matching","Quiz - Regular Expressions For Pattern Matching",{"path":3596,"title":3597,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F05-server-side-validation-in-php","Quiz - Server-Side Validation In PHP",{"path":3599,"title":3600,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F06-cross-site-scripting-xss-prevention","Quiz - Cross-Site Scripting (XSS) Prevention",{"path":3602,"title":3603,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F07-flash-messages-and-persistent-feedback","Quiz - Flash Messages And Persistent Feedback",{"path":3605,"title":3606,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F08-allowing-login-by-username-or-email","Quiz - Allowing Login By Username Or Email",{"path":3608,"title":3609,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F09-building-a-profile-edit-page","Quiz - Building A Profile Edit Page",{"path":3611,"title":3612,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F10-debugging-account-and-authentication-problems","Quiz - Debugging Account And Authentication Problems",{"path":3614,"title":3615,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F05-input-validation-security-and-user-profiles\u002F11-review-the-full-account-system-so-far","Quiz - Review: The Full Account System So Far",{"path":3617,"title":3618,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F01-role-based-access-control","Quiz - Role-Based Access Control",{"path":3620,"title":3621,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F02-storing-roles-in-the-database","Quiz - Storing Roles In The Database",{"path":3623,"title":3624,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F03-protecting-a-page-with-an-access-check","Quiz - Protecting A Page With An Access Check",{"path":3626,"title":3627,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F04-safe-redirects-after-login-and-logout","Quiz - Safe Redirects After Login And Logout",{"path":3629,"title":3630,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F05-listing-records-from-the-database","Quiz - Listing Records From The Database",{"path":3632,"title":3633,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F06-creating-new-records-with-a-form","Quiz - Creating New Records With A Form",{"path":3635,"title":3636,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F07-editing-existing-records","Quiz - Editing Existing Records",{"path":3638,"title":3639,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F08-deleting-records-safely","Quiz - Deleting Records Safely",{"path":3641,"title":3642,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F09-ownership-linking-records-to-users","Quiz - Ownership: Linking Records To Users",{"path":3644,"title":3645,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F10-first-project-milestone-checklist","Quiz - First Project Milestone Checklist",{"path":3647,"title":3648,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F11-organizing-growing-php-applications","Quiz - Organizing Growing PHP Applications",{"path":3650,"title":3651,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F06-roles-permissions-and-crud-pages\u002F12-reading-a-growing-php-application","Quiz - Reading A Growing PHP Application",{"path":3653,"title":3654,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F01-what-asynchronous-requests-ajax-solve","Quiz - What Asynchronous Requests (AJAX) Solve",{"path":3656,"title":3657,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F02-json-a-common-data-format-for-the-web","Quiz - JSON: A Common Data Format For The Web",{"path":3659,"title":3660,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F03-building-a-php-endpoint-that-returns-json","Quiz - Building A PHP Endpoint That Returns JSON",{"path":3662,"title":3663,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F04-sending-requests-from-javascript-with-fetch","Quiz - Sending Requests From JavaScript With Fetch",{"path":3665,"title":3666,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F05-handling-fetch-responses-and-errors","Quiz - Handling Fetch Responses And Errors",{"path":3668,"title":3669,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F06-updating-the-page-with-returned-data","Quiz - Updating The Page With Returned Data",{"path":3671,"title":3672,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F07-introduction-to-rest-apis","Quiz - Introduction To REST APIs",{"path":3674,"title":3675,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F08-reading-api-documentation","Quiz - Reading API Documentation",{"path":3677,"title":3678,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F09-making-authenticated-api-calls-from-php","Quiz - Making Authenticated API Calls From PHP",{"path":3680,"title":3681,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F10-storing-and-caching-api-responses","Quiz - Storing And Caching API Responses",{"path":3683,"title":3684,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F11-cors-and-cross-origin-request-basics","Quiz - CORS And Cross-Origin Request Basics",{"path":3686,"title":3687,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F07-asynchronous-requests-json-and-external-apis\u002F12-browser-devtools-for-web-application-debugging","Quiz - Browser DevTools For Web Application Debugging",{"path":3689,"title":3690,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F01-jquery-simplified-dom-and-event-work","Quiz - jQuery: Simplified DOM And Event Work",{"path":3692,"title":3693,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F02-selecting-elements-with-jquery","Quiz - Selecting Elements With jQuery",{"path":3695,"title":3696,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F03-responding-to-events-clicks-inputs-and-submissions","Quiz - Responding To Events: Clicks, Inputs, And Submissions",{"path":3698,"title":3699,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F04-updating-the-dom-after-a-user-action","Quiz - Updating The DOM After A User Action",{"path":3701,"title":3702,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F05-sending-ajax-requests-with-jquery","Quiz - Sending AJAX Requests With jQuery",{"path":3704,"title":3705,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F06-saving-external-api-data-through-php","Quiz - Saving External API Data Through PHP",{"path":3707,"title":3708,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F07-saving-user-created-records","Quiz - Saving User-Created Records",{"path":3710,"title":3711,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F08-building-a-project-listing-page","Quiz - Building A Project Listing Page",{"path":3713,"title":3714,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F09-inline-editing-and-detail-views","Quiz - Inline Editing And Detail Views",{"path":3716,"title":3717,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F08-dynamic-interfaces-and-project-data\u002F10-second-project-milestone-checklist","Quiz - Second Project Milestone Checklist",{"path":3719,"title":3720,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F01-foreign-keys-and-referential-integrity","Quiz - Foreign Keys And Referential Integrity",{"path":3722,"title":3723,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F02-joining-tables-inner-join-left-join","Quiz - Joining Tables: INNER JOIN, LEFT JOIN",{"path":3725,"title":3726,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F03-user-owned-records-and-access-enforcement","Quiz - User-Owned Records And Access Enforcement",{"path":3728,"title":3729,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F04-connecting-api-data-to-user-records","Quiz - Connecting API Data To User Records",{"path":3731,"title":3732,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F05-searching-and-filtering-with-sql","Quiz - Searching And Filtering With SQL",{"path":3734,"title":3735,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F06-pagination-displaying-records-in-pages","Quiz - Pagination: Displaying Records In Pages",{"path":3737,"title":3738,"order":2776,"module":2776,"status":2776},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F07-aggregate-functions-count-sum-avg","Quiz - Aggregate Functions: COUNT, SUM, AVG",{"path":3740,"title":3741,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F08-simple-analytics-and-summary-views","Quiz - Simple Analytics And Summary Views",{"path":3743,"title":3744,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F09-relational-data-search-and-pagination\u002F09-third-project-milestone-checklist","Quiz - Third Project Milestone Checklist",{"path":3746,"title":3747,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F01-public-pages-and-unauthenticated-views","Quiz - Public Pages And Unauthenticated Views",{"path":3749,"title":3750,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F02-user-profile-and-activity-pages","Quiz - User Profile And Activity Pages",{"path":3752,"title":3753,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F03-refreshing-and-expiring-external-api-data","Quiz - Refreshing And Expiring External API Data",{"path":3755,"title":3756,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F04-application-wide-security-audit","Quiz - Application-Wide Security Audit",{"path":3758,"title":3759,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F05-cross-site-request-forgery-csrf-protection","Quiz - Cross-Site Request Forgery (CSRF) Protection",{"path":3761,"title":3762,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F06-qa-testing-and-collecting-evidence","Quiz - QA Testing And Collecting Evidence",{"path":3764,"title":3765,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F07-production-environment-checklist","Quiz - Production Environment Checklist",{"path":3767,"title":3768,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F08-writing-a-project-readme","Quiz - Writing A Project README",{"path":3770,"title":3771,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F09-final-presentation-and-code-walkthrough","Quiz - Final Presentation And Code Walkthrough",{"path":3773,"title":3774,"order":2776,"module":2776,"status":3435},"\u002Finternet-applications\u002Fbook\u002Fquizzes\u002Fmodules\u002F10-final-integration-testing-and-deployment\u002F10-configuration-drift-and-secrets-checks","Quiz - Configuration Drift And Secrets Checks",{"path":3776,"title":3777,"order":569,"module":2851,"status":2799},"\u002Finternet-applications\u002Fbook\u002Freference\u002Fa-command-line-basics","Command Line Basics",{"path":3779,"title":3780,"order":14,"module":2851,"status":2799},"\u002Finternet-applications\u002Fbook\u002Freference\u002Fb-git-and-github-recovery","Git And GitHub Recovery",{"path":3782,"title":3783,"order":265,"module":2851,"status":2799},"\u002Finternet-applications\u002Fbook\u002Freference\u002Fc-apache-and-php-troubleshooting","Apache And PHP Troubleshooting",{"path":3785,"title":3786,"order":2820,"module":2851,"status":2799},"\u002Finternet-applications\u002Fbook\u002Freference\u002Fd-mysql-troubleshooting","MySQL Troubleshooting",{"path":3788,"title":3789,"order":2798,"module":2851,"status":2799},"\u002Finternet-applications\u002Fbook\u002Freference\u002Fe-http-request-and-response-reference","HTTP Request And Response Reference",{"path":3791,"title":3792,"order":2830,"module":2851,"status":2799},"\u002Finternet-applications\u002Fbook\u002Freference\u002Ff-common-security-mistakes","Common Security Mistakes",{"path":3794,"title":3795,"order":3043,"module":2851,"status":2799},"\u002Finternet-applications\u002Fbook\u002Freference\u002Fg-ai-collaboration-and-disclosure","AI Collaboration And Disclosure",{"path":3797,"title":3798,"order":2851,"module":2851,"status":2799},"\u002Finternet-applications\u002Fbook\u002Ftoc","Internet Applications: Table of Contents",{"path":3800,"title":3801,"order":2803,"module":569,"status":2799},"\u002Finternet-applications\u002Flabs\u002F01-git-recovery-and-submission-evidence","Lab 1: Git Recovery And Submission Evidence",{"path":3803,"title":3804,"order":2807,"module":14,"status":2799},"\u002Finternet-applications\u002Flabs\u002F02-php-output-and-error-reading","Lab 2: PHP Output And Error Reading",{"path":3806,"title":3807,"order":2929,"module":265,"status":2799},"\u002Finternet-applications\u002Flabs\u002F03-form-methods-and-sticky-values","Lab 3: Form Methods And Sticky Values",{"path":3809,"title":3810,"order":2925,"module":2820,"status":2799},"\u002Finternet-applications\u002Flabs\u002F04-pdo-query-and-sql-evidence","Lab 4: PDO Query And SQL Evidence",{"path":3812,"title":3813,"order":2945,"module":2798,"status":2799},"\u002Finternet-applications\u002Flabs\u002F05-validation-debugging-and-friendly-errors","Lab 5: Validation, Debugging, And Friendly Errors",{"path":3815,"title":3816,"order":2949,"module":2830,"status":2799},"\u002Finternet-applications\u002Flabs\u002F06-role-protected-crud-check","Lab 6: Role-Protected CRUD Check",{"path":3818,"title":3819,"order":3820,"module":2830,"status":2799},"\u002Finternet-applications\u002Flabs\u002F06a-relative-paths-includes-and-feature-trace","Lab 6A: Relative Paths, Includes, And Feature Tracing","61",{"path":3822,"title":3823,"order":2982,"module":3043,"status":2799},"\u002Finternet-applications\u002Flabs\u002F07-json-endpoint-and-fetch-check","Lab 7: JSON Endpoint And Fetch Check",{"path":3825,"title":3826,"order":1446,"module":2834,"status":2799},"\u002Finternet-applications\u002Flabs\u002F08-jquery-ajax-interface-check","Lab 8: jQuery AJAX Interface Check",{"path":3828,"title":3829,"order":2772,"module":2841,"status":2799},"\u002Finternet-applications\u002Flabs\u002F09-search-pagination-and-summary-check","Lab 9: Search, Pagination, And Summary Check",{"path":3831,"title":3832,"order":2991,"module":2803,"status":2799},"\u002Finternet-applications\u002Flabs\u002F10-final-security-and-readme-check","Lab 10: Final Security And README Check",{"path":3834,"title":3835,"order":2776,"module":2776,"status":2799},"\u002Finternet-applications\u002Fpresentations-revised\u002F00-revision-plan","Internet Applications Presentation Revision Plan",{"path":3837,"title":3838,"order":2776,"module":2776,"status":2799},"\u002Finternet-applications\u002Fpresentations-revised\u002F01-20-minute-recording-plan","Internet Applications Twenty-Minute Recording Plan",{"path":3840,"title":2960,"order":2851,"module":569,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord",{"path":3842,"title":2963,"order":2803,"module":569,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands",{"path":3844,"title":2966,"order":2807,"module":569,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools",{"path":3846,"title":2969,"order":2929,"module":569,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh",{"path":3848,"title":2972,"order":2925,"module":569,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs",{"path":3850,"title":2975,"order":2945,"module":569,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment",{"path":3852,"title":2978,"order":2949,"module":569,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository",{"path":3854,"title":2981,"order":2982,"module":569,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches",{"path":3856,"title":2985,"order":1446,"module":569,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup",{"path":2773,"title":5,"order":2772,"module":569,"status":2778},{"path":3859,"title":2990,"order":2991,"module":569,"status":2799},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F10-local-ubuntu-web-server-vmware",{"path":3861,"title":2994,"order":2803,"module":14,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F02-php-and-javascript-basics\u002F01-compare-php-and-javascript",{"path":3863,"title":2997,"order":2807,"module":14,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F02-php-and-javascript-basics\u002F02-conditions-loops-functions",{"path":3865,"title":3000,"order":2803,"module":265,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F03-html-forms-css-and-dom\u002F01-intro-to-html",{"path":3867,"title":3003,"order":2807,"module":265,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F03-html-forms-css-and-dom\u002F02-intro-to-forms-and-get-post",{"path":3869,"title":3006,"order":2929,"module":265,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F03-html-forms-css-and-dom\u002F03-understanding-css-js-selectors-and-dom-updates",{"path":3871,"title":3009,"order":2803,"module":2820,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F04-databases-and-user-accounts\u002F01-intro-to-sql",{"path":3873,"title":3012,"order":2807,"module":2820,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F04-databases-and-user-accounts\u002F02-project-database-setup",{"path":3875,"title":3015,"order":2929,"module":2820,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F04-databases-and-user-accounts\u002F03-user-registration",{"path":3877,"title":3018,"order":2925,"module":2820,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F04-databases-and-user-accounts\u002F04-user-login",{"path":3879,"title":3021,"order":2803,"module":2798,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F05-validation-and-user-profiles\u002F01-intro-to-regex",{"path":3881,"title":3024,"order":2807,"module":2798,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F05-validation-and-user-profiles\u002F02-project-shared-helpers",{"path":3883,"title":3884,"order":2929,"module":2798,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F05-validation-and-user-profiles\u002F03-flash-messages-and-redirect-feedback","Flash Messages And Redirect Feedback",{"path":3886,"title":3030,"order":2925,"module":2798,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F05-validation-and-user-profiles\u002F04-user-profile",{"path":3888,"title":3033,"order":2803,"module":2830,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F06-roles-and-crud-pages\u002F01-user-roles-authorization",{"path":3890,"title":3036,"order":2807,"module":2830,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F06-roles-and-crud-pages\u002F02-user-login-enhancement",{"path":3892,"title":3039,"order":2929,"module":2830,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F06-roles-and-crud-pages\u002F03-dynamic-content",{"path":3894,"title":3042,"order":2803,"module":3043,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F07-api-data-and-database-helpers\u002F01-working-with-api-data",{"path":3896,"title":3046,"order":2807,"module":3043,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F07-api-data-and-database-helpers\u002F02-api-integration",{"path":3898,"title":3049,"order":2929,"module":3043,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F07-api-data-and-database-helpers\u002F03-database-utility-functions",{"path":3900,"title":3052,"order":2803,"module":2834,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F08-reusable-components-jquery-and-ajax\u002F01-milestone-2-bootstrap-and-reusability",{"path":3902,"title":3055,"order":2807,"module":2834,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F08-reusable-components-jquery-and-ajax\u002F02-jquery-brief-intro",{"path":3904,"title":3058,"order":2929,"module":2834,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F08-reusable-components-jquery-and-ajax\u002F03-intro-to-ajax",{"path":3906,"title":3061,"order":2803,"module":2841,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F09-relational-data-search-and-pagination\u002F01-user-associations",{"path":3908,"title":3064,"order":2807,"module":2841,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F09-relational-data-search-and-pagination\u002F02-association-views-and-pagination",{"path":3910,"title":3067,"order":2803,"module":2803,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F10-association-assignment-and-security\u002F01-association-assignment-and-public-profiles",{"path":3912,"title":3070,"order":2807,"module":2803,"status":2778},"\u002Finternet-applications\u002Fpresentations\u002F10-association-assignment-and-security\u002F02-reusable-csrf-protection",{"path":3914,"title":3073,"order":569,"module":2851,"status":2778},"\u002Finternet-applications\u002Fsyllabus\u002Fsummer-2026",{"path":3916,"title":3917,"order":3918,"module":2803,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Ffinal-project-submission-worksheet","Final Project Submission Worksheet","110",{"path":3920,"title":3921,"order":3922,"module":2830,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Flegacy-milestone-01-worksheet","Legacy Milestone 1 Worksheet","118",{"path":3924,"title":3925,"order":3926,"module":2830,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Flegacy-multi-dimension-php-problems-worksheet","Legacy Multi-Dimension PHP Problems Worksheet","119",{"path":3928,"title":3929,"order":3918,"module":2830,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmilestone-01-account-access-and-profile-worksheet","IT202 Milestone 1 - 2026",{"path":3931,"title":3932,"order":2768,"module":2834,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmilestone-02-api-data-and-crud-worksheet","IT202 Milestone 2 - 2026",{"path":3934,"title":3935,"order":3936,"module":2841,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmilestone-03-user-associations-worksheet","IT202 Milestone 3 - 2026","130",{"path":3938,"title":3939,"order":2803,"module":569,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-01-git-and-local-server-worksheet","Module 1 Worksheet: Git, GitHub, And Local Server Evidence",{"path":3941,"title":3942,"order":2807,"module":14,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-02-php-and-debugging-worksheet","Module 2 Worksheet: PHP Challenge Scenarios",{"path":3944,"title":3945,"order":2929,"module":265,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-03-forms-css-and-dom-worksheet","Module 3 Worksheet: HTML, CSS, JS Challenges",{"path":3947,"title":3948,"order":2925,"module":2820,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-04-database-auth-and-sessions-worksheet","Module 4 Worksheet: SQL Todo Challenge",{"path":3950,"title":3951,"order":2945,"module":2798,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-05-validation-and-debugging-worksheet","Module 5 Worksheet: Validation And Debugging Evidence",{"path":3953,"title":3954,"order":2949,"module":2830,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-06-authorization-and-crud-worksheet","Module 6 Worksheet: Authorization And CRUD Evidence",{"path":3956,"title":3957,"order":3958,"module":2830,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-06-multi-dimensional-php-arrays-worksheet","Module 06 Worksheet: Multi-Dimensional PHP Arrays","62",{"path":3960,"title":3961,"order":2982,"module":3043,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-07-api-testing-worksheet","Module 07 Worksheet: Project API Testing",{"path":3963,"title":3964,"order":1446,"module":2834,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-08-jquery-and-dynamic-ui-worksheet","Module 8 Worksheet: jQuery And Dynamic UI Evidence",{"path":3966,"title":3967,"order":2772,"module":2841,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-09-search-pagination-and-summary-worksheet","Module 9 Worksheet: Search, Pagination, And Summary Evidence",{"path":3969,"title":3970,"order":2991,"module":2803,"status":2799},"\u002Finternet-applications\u002Fworksheets\u002Fmodule-10-final-project-readiness-worksheet","Module 10 Worksheet: Final Project Readiness Evidence",{"path":3972,"title":2963,"order":2803,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F01-module-1-course-setup\u002F01-basic-cli-commands",{"path":3974,"title":2966,"order":2807,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F01-module-1-course-setup\u002F02-install-git-tools",{"path":3976,"title":2969,"order":2929,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F01-module-1-course-setup\u002F03-setup-github-ssh",{"path":3978,"title":2972,"order":2925,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F01-module-1-course-setup\u002F04-git-commands-prs",{"path":3980,"title":3981,"order":2945,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F01-module-1-course-setup\u002F05-course-repo-setup","Course Repository Setup",{"path":3983,"title":3984,"order":2949,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F01-module-1-course-setup\u002F06-java-environment-setup","Java Development Environment Setup",{"path":3986,"title":3987,"order":2803,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F02-module-2-java-basics\u002F01-java-basics","Java Basics",{"path":3989,"title":3990,"order":2807,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F02-module-2-java-basics\u002F02-flow-control","Java Flow Control",{"path":3992,"title":3993,"order":2929,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F02-module-2-java-basics\u002F03-loops","Java Loops",{"path":3995,"title":3996,"order":2925,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F02-module-2-java-basics\u002F04-collections","Java Arrays, Queue, Stack, ArrayList",{"path":3998,"title":3999,"order":2803,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F03-module-3-java-io-and-oop\u002F01-user-input","Java User Input",{"path":4001,"title":4002,"order":2807,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F03-module-3-java-io-and-oop\u002F02-oop-modifiers","Java Intro to OOP - Modifiers",{"path":4004,"title":4005,"order":2929,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F03-module-3-java-io-and-oop\u002F03-file-io","Java File I\u002FO",{"path":4007,"title":4008,"order":2925,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F03-module-3-java-io-and-oop\u002F04-recursion-trees","Java Recursion and Trees",{"path":4010,"title":4011,"order":2803,"module":2820,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F04-module-4-sockets-and-oop\u002F01-sockets-overview","Java Sockets: Overview",{"path":4013,"title":4014,"order":2807,"module":2820,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F04-module-4-sockets-and-oop\u002F02-oop-intermediate","Java OOP Intermediate",{"path":4016,"title":4017,"order":2929,"module":2820,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F04-module-4-sockets-and-oop\u002F03-multi-client-chat-part-1","Java Sockets: Multi-Client Chat Server Part 1",{"path":4019,"title":4020,"order":2803,"module":2798,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F05-module-5-multi-client-sockets\u002F01-multi-client-chat-part-2","Java Sockets: Multi-Client Chat Server Part 2",{"path":4022,"title":4023,"order":2807,"module":2830,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F06-module-6-milestone-2-prep\u002F02-prepare-milestone-2-2026","Java Advanced Programming Preparing for Milestone 2",{"path":4025,"title":4026,"order":2929,"module":2830,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F06-module-6-milestone-2-prep\u002F03-gameserver-ready-check","Java Advanced Programming Milestone 2: GameServer Ready Check",{"path":4028,"title":4029,"order":2803,"module":3043,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F07-module-7-game-rooms-and-turns\u002F01-game-rooms-ready-check","Java Advanced Programming Milestone 2: GameRooms and Ready Check",{"path":4031,"title":4032,"order":2807,"module":3043,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F07-module-7-game-rooms-and-turns\u002F02-round-robin-turns","Java Advanced Programming Milestone 2: Turn-based Turns (Round-Robin)",{"path":4034,"title":4035,"order":2929,"module":3043,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F07-module-7-game-rooms-and-turns\u002F03-phase-based-turns","Java Advanced Programming Milestone 2: Phase-based Turns",{"path":4037,"title":4038,"order":2925,"module":3043,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F07-module-7-game-rooms-and-turns\u002F04-simultaneous-turns","Java Advanced Programming Milestone 2: Simultaneous Turns",{"path":4040,"title":4041,"order":2945,"module":3043,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F07-module-7-game-rooms-and-turns\u002F05-individual-turns","Java Advanced Programming Milestone 2: Individual Turns",{"path":4043,"title":4044,"order":2803,"module":2834,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F08-module-8-grids-cards-and-ui\u002F01-grid-integration","Java Advanced Programming Milestone 2: Grid Integration",{"path":4046,"title":4047,"order":2807,"module":2834,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F08-module-8-grids-cards-and-ui\u002F02-card-integration","Java Advanced Programming Milestone 2: Cards Integration",{"path":4049,"title":4050,"order":2929,"module":2834,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F08-module-8-grids-cards-and-ui\u002F03-equals-6-mini-project","Java Advanced Programming Milestone 2: Equals 6 Mini Project",{"path":4052,"title":4053,"order":2925,"module":2834,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F08-module-8-grids-cards-and-ui\u002F04-nice-day-for-fishin","Java Advanced Programming Milestone 2: Project \"Nice Day For Fishin'\"",{"path":4055,"title":4056,"order":2945,"module":2834,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F08-module-8-grids-cards-and-ui\u002F05-java-ui-intro","Java Advanced Programming Java UI 2025",{"path":4058,"title":4059,"order":2803,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F09-module-9-ui-integration\u002F01-ui-integration-2026","UI Integration 2026",{"path":4061,"title":4062,"order":2807,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F09-module-9-ui-integration\u002F02-ui-drawing","UI Drawing",{"path":4064,"title":4065,"order":2929,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F09-module-9-ui-integration\u002F03-baseline-ui-integration","Baseline UI Integration",{"path":4067,"title":4068,"order":2925,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F09-module-9-ui-integration\u002F04-ndff-ui-integration","NDFF UI Integration",{"path":4070,"title":4071,"order":2945,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F09-module-9-ui-integration\u002F05-equals-6-ui","Equals 6 UI",{"path":4073,"title":4074,"order":2949,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F09-module-9-ui-integration\u002F06-popularity-mini-project","Popularity Mini Project",{"path":4076,"title":4077,"order":2803,"module":2803,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F10-module-10-wrap-up-and-deployment\u002F01-milestone-3-wrapup","Milestone 3 Wrapup",{"path":4079,"title":4080,"order":2807,"module":2803,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F10-module-10-wrap-up-and-deployment\u002F02-deploying-java-apps","Deploying Java Apps",{"path":4082,"title":4083,"order":2929,"module":2803,"status":2799},"\u002Fjava-advanced-programming\u002F2e\u002Fpresentations\u002F10-module-10-wrap-up-and-deployment\u002F03-ndff-away-spectator","NDFF Away Spectator",{"path":4085,"title":4086,"order":569,"module":2851,"status":2778},"\u002Fjava-advanced-programming\u002F2e\u002Fsyllabus\u002Ffall-2026","IT114 - Advanced Programming for Information Technology",{"path":4088,"title":4089,"order":2803,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F01-course-setup-and-workflow\u002F01-course-tools-and-workflow","Course Tools And Workflow",{"path":4091,"title":4092,"order":2807,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F01-course-setup-and-workflow\u002F02-terminal-git-and-github","Terminal, Git, And GitHub Basics",{"path":4094,"title":4095,"order":2929,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F01-course-setup-and-workflow\u002F03-java-development-environment","Java Development Environment",{"path":4097,"title":4098,"order":2803,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F02-java-basics\u002F01-java-program-shape","The Shape Of A Java Program",{"path":4100,"title":4101,"order":2807,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F02-java-basics\u002F02-values-types-and-expressions","Values, Types, And Expressions",{"path":4103,"title":4104,"order":2929,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F02-java-basics\u002F03-conditions-loops-and-collections","Conditions, Loops, And Collections",{"path":4106,"title":4107,"order":2803,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F03-java-input-io-and-oop\u002F01-user-input-and-output","User Input And Program Output",{"path":4109,"title":4110,"order":2807,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F03-java-input-io-and-oop\u002F02-classes-objects-and-modifiers","Classes, Objects, And Modifiers",{"path":4112,"title":4113,"order":2929,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F03-java-input-io-and-oop\u002F03-file-io-paths-and-exceptions","File I\u002FO, Paths, And Exceptions",{"path":4115,"title":4116,"order":2925,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F03-java-input-io-and-oop\u002F04-recursion-and-trees","Recursion And Tree Thinking",{"path":4118,"title":4119,"order":2803,"module":2820,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F04-sockets-and-oop\u002F01-sockets-client-server","Sockets And Client\u002FServer Thinking",{"path":4121,"title":4122,"order":2807,"module":2820,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F04-sockets-and-oop\u002F02-server-socket-flow","The ServerSocket Flow",{"path":4124,"title":4125,"order":2929,"module":2820,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F04-sockets-and-oop\u002F03-oop-for-socket-apps","OOP For Socket Applications",{"path":4127,"title":4128,"order":2803,"module":2798,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F05-multi-client-sockets\u002F01-multi-client-server-shape","Multi-Client Server Shape",{"path":4130,"title":4131,"order":2807,"module":2798,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F05-multi-client-sockets\u002F02-threads-shared-state-and-message-routing","Threads, Shared State, And Message Routing",{"path":4133,"title":4134,"order":2929,"module":2798,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Fmodules\u002F05-multi-client-sockets\u002F03-debugging-socket-programs","Debugging Socket Programs",{"path":4136,"title":4137,"order":2851,"module":2851,"status":2799},"\u002Fjava-advanced-programming\u002Fbook\u002Ftoc","Java Advanced Programming: Table of Contents",{"path":4139,"title":4140,"order":2776,"module":2776,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations-revised\u002F00-revision-plan","Java Advanced Programming Presentation Revision Plan",{"path":4142,"title":4143,"order":2776,"module":2776,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations-revised\u002F01-20-minute-recording-plan","Java Advanced Programming Twenty-Minute Recording Plan",{"path":4145,"title":2963,"order":2803,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F01-module-1-course-setup\u002F01-basic-cli-commands",{"path":4147,"title":2966,"order":2807,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F01-module-1-course-setup\u002F02-install-git-tools",{"path":4149,"title":2969,"order":2929,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F01-module-1-course-setup\u002F03-setup-github-ssh",{"path":4151,"title":2972,"order":2925,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F01-module-1-course-setup\u002F04-git-commands-prs",{"path":4153,"title":3981,"order":2945,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F01-module-1-course-setup\u002F05-course-repo-setup",{"path":4155,"title":3984,"order":2949,"module":569,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F01-module-1-course-setup\u002F06-java-environment-setup",{"path":4157,"title":3987,"order":2803,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F02-module-2-java-basics\u002F01-java-basics",{"path":4159,"title":3990,"order":2807,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F02-module-2-java-basics\u002F02-flow-control",{"path":4161,"title":3993,"order":2929,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F02-module-2-java-basics\u002F03-loops",{"path":4163,"title":3996,"order":2925,"module":14,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F02-module-2-java-basics\u002F04-collections",{"path":4165,"title":3999,"order":2803,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F03-module-3-java-io-and-oop\u002F01-user-input",{"path":4167,"title":4002,"order":2807,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F03-module-3-java-io-and-oop\u002F02-oop-modifiers",{"path":4169,"title":4005,"order":2929,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F03-module-3-java-io-and-oop\u002F03-file-io",{"path":4171,"title":4008,"order":2925,"module":265,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F03-module-3-java-io-and-oop\u002F04-recursion-trees",{"path":4173,"title":4011,"order":2803,"module":2820,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F04-module-4-sockets-and-oop\u002F01-sockets-overview",{"path":4175,"title":4014,"order":2807,"module":2820,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F04-module-4-sockets-and-oop\u002F02-oop-intermediate",{"path":4177,"title":4017,"order":2929,"module":2820,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F04-module-4-sockets-and-oop\u002F03-multi-client-chat-part-1",{"path":4179,"title":4020,"order":2803,"module":2798,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F05-module-5-multi-client-sockets\u002F01-multi-client-chat-part-2",{"path":4181,"title":4182,"order":2803,"module":2830,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F06-module-6-milestone-2-prep\u002F01-prepare-milestone-2-2025","Java Advanced Programming Preparing for Milestone2 2025",{"path":4184,"title":4023,"order":2807,"module":2830,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F06-module-6-milestone-2-prep\u002F02-prepare-milestone-2-2026",{"path":4186,"title":4026,"order":2929,"module":2830,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F06-module-6-milestone-2-prep\u002F03-gameserver-ready-check",{"path":4188,"title":4029,"order":2803,"module":3043,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F07-module-7-game-rooms-and-turns\u002F01-game-rooms-ready-check",{"path":4190,"title":4032,"order":2807,"module":3043,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F07-module-7-game-rooms-and-turns\u002F02-round-robin-turns",{"path":4192,"title":4035,"order":2929,"module":3043,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F07-module-7-game-rooms-and-turns\u002F03-phase-based-turns",{"path":4194,"title":4038,"order":2925,"module":3043,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F07-module-7-game-rooms-and-turns\u002F04-simultaneous-turns",{"path":4196,"title":4041,"order":2945,"module":3043,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F07-module-7-game-rooms-and-turns\u002F05-individual-turns",{"path":4198,"title":4044,"order":2803,"module":2834,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F08-module-8-grids-cards-and-ui\u002F01-grid-integration",{"path":4200,"title":4047,"order":2807,"module":2834,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F08-module-8-grids-cards-and-ui\u002F02-card-integration",{"path":4202,"title":4050,"order":2929,"module":2834,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F08-module-8-grids-cards-and-ui\u002F03-equals-6-mini-project",{"path":4204,"title":4053,"order":2925,"module":2834,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F08-module-8-grids-cards-and-ui\u002F04-nice-day-for-fishin",{"path":4206,"title":4056,"order":2945,"module":2834,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F08-module-8-grids-cards-and-ui\u002F05-java-ui-intro",{"path":4208,"title":4059,"order":2803,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F09-module-9-ui-integration\u002F01-ui-integration-2026",{"path":4210,"title":4062,"order":2807,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F09-module-9-ui-integration\u002F02-ui-drawing",{"path":4212,"title":4065,"order":2929,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F09-module-9-ui-integration\u002F03-baseline-ui-integration",{"path":4214,"title":4068,"order":2925,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F09-module-9-ui-integration\u002F04-ndff-ui-integration",{"path":4216,"title":4071,"order":2945,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F09-module-9-ui-integration\u002F05-equals-6-ui",{"path":4218,"title":4074,"order":2949,"module":2841,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F09-module-9-ui-integration\u002F06-popularity-mini-project",{"path":4220,"title":4077,"order":2803,"module":2803,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F10-module-10-wrap-up-and-deployment\u002F01-milestone-3-wrapup",{"path":4222,"title":4080,"order":2807,"module":2803,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F10-module-10-wrap-up-and-deployment\u002F02-deploying-java-apps",{"path":4224,"title":4083,"order":2929,"module":2803,"status":2799},"\u002Fjava-advanced-programming\u002Fpresentations\u002F10-module-10-wrap-up-and-deployment\u002F03-ndff-away-spectator",{"path":4226,"title":4227,"order":2803,"module":569,"status":2799},"\u002Fsystems-integration\u002F2e\u002Fpresentations\u002F01-required-architecture-overview","Required Architecture Overview",{"path":4229,"title":4230,"order":569,"module":2851,"status":2778},"\u002Fsystems-integration\u002F2e\u002Fsyllabus\u002Ffall-2026","IT490 - Systems Integration Syllabus",{"path":4232,"title":4233,"order":569,"module":2851,"status":2778},"\u002Fsystems-integration","Systems Integration",{"path":4235,"title":4236,"order":2776,"module":2776,"status":2799},"\u002Fsystems-integration\u002Fpresentations-revised\u002F00-revision-plan","Systems Integration Presentation Revision Plan",{"path":4238,"title":4239,"order":2776,"module":2776,"status":2799},"\u002Fsystems-integration\u002Fpresentations-revised\u002F01-20-minute-recording-plan","Systems Integration Twenty-Minute Recording Plan",{"path":4241,"title":4227,"order":2803,"module":569,"status":2778},"\u002Fsystems-integration\u002Fpresentations\u002F01-required-architecture-overview",{"path":4243,"title":4230,"order":569,"module":2851,"status":2778},"\u002Fsystems-integration\u002Fsyllabus\u002Fsummer-2026",{"path":4245,"title":4246,"order":2776,"module":2776,"status":2776},"\u002Fsystems-integration\u002Fworksheets\u002Fit490-authentication-authorization-core-2026-draft","IT490 Authentication and Authorization Core Milestone (2026)",{"path":4248,"title":4249,"order":2776,"module":2776,"status":2776},"\u002Fsystems-integration\u002Fworksheets\u002Fit490-centralized-logging-milestone-draft","IT490 Centralized Logging Milestone",{"path":4251,"title":4252,"order":2776,"module":2776,"status":2776},"\u002Fsystems-integration\u002Fworksheets\u002Fit490-milestone-3-resiliency-2026-draft","IT490 Milestone 3 - Deployment, Promotion, And Recovery",{"path":4254,"title":4255,"order":2776,"module":2776,"status":2776},"\u002Fsystems-integration\u002Fworksheets\u002Fit490-milestone-4-availability-2026-draft","IT490 Milestone 4 - Availability, Load Balancing, And Recovery",{"path":4257,"title":4258,"order":2807,"module":2851,"status":2799},"\u002Fsystems-integration\u002Fworksheets\u002Fmeeting-minutes-template","IT490 Meeting Minutes Template",{"path":4260,"title":4261,"order":2929,"module":2851,"status":2799},"\u002Fsystems-integration\u002Fworksheets\u002Fproject-changelog-template","IT490 Project Change Log Template",{"path":4263,"title":4264,"order":2803,"module":2851,"status":2799},"\u002Fsystems-integration\u002Fworksheets\u002Fproject-proposal-template","IT490 Project Proposal Template",1788152085696]