[{"data":1,"prerenderedAt":11269},["ShallowReactive",2],{"content-page:\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup":3,"content-page-quiz:none":905,"book-module-total-pages":906,"content-section-pages:\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F":907,"content-directory-pages:\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup":11268},{"id":4,"title":5,"audience":6,"body":7,"contentType":879,"course":880,"description":881,"estimateBasis":882,"estimatedDiscussionMinutes":883,"estimatedLiveMinutes":884,"estimatedTotalMinutes":885,"extension":886,"meta":887,"module":888,"navigation":889,"order":890,"path":891,"promptAssist":892,"seo":893,"status":894,"stem":895,"tags":896,"videoDuration":900,"videoId":901,"videoLink":902,"videoTitle":903,"week":888,"__hash__":904},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup.md","Render Setup","student",{"type":8,"value":9,"toc":857},"minimark",[10,45,72,101,185,246,286,323,362,412,466,501,547,588,616,648,696,733,808],[11,12,15,19],"slide",{"id":13,"level":14},"render-setup-title","2",[16,17,5],"h2",{"id":18},"render-setup",[20,21,22,26,33,39,42],"ul",{},[23,24,25],"li",{},"Connect GitHub repo to Render",[23,27,28,29],{},"Create a QA service from ",[30,31,32],"code",{},"qa",[23,34,35,36],{},"Create a production service from ",[30,37,38],{},"prod",[23,40,41],{},"Add the course database connection string",[23,43,44],{},"Verify live URLs and deploy logs",[11,46,48,51,55],{"id":47,"level":14},"goals",[16,49,50],{"id":47},"Goals",[52,53,54],"p",{},"By the end, you should be able to:",[20,56,57,60,63,66,69],{},[23,58,59],{},"Explain what Render does in the course workflow",[23,61,62],{},"Create separate QA and production services",[23,64,65],{},"Connect each service to the correct branch",[23,67,68],{},"Read Render logs when a deploy fails",[23,70,71],{},"Identify which deployed URL to submit or test",[11,73,75,78,95],{"id":74,"level":14},"what-render-does",[16,76,77],{"id":74},"What Render Does",[20,79,80,83,86,89,92],{},[23,81,82],{},"Hosts your PHP app from GitHub",[23,84,85],{},"Watches a selected branch",[23,87,88],{},"Rebuilds when that branch changes",[23,90,91],{},"Stores secrets as environment variables",[23,93,94],{},"Gives each service a public URL",[52,96,97,98],{},"Course loop: ",[30,99,100],{},"local work -> GitHub branch -> Render URL",[11,102,104,108],{"id":103,"level":14},"free-tier-and-before-start",[16,105,107],{"id":106},"before-you-start","Before You Start",[109,110,113,146],"two-col",{"gap":111,"left-width":112,"right-width":112},"lg","1fr",[114,115,117,122],"template",{"v-slot:left":116},"",[118,119,121],"h3",{"id":120},"free-tier","Free Tier",[20,123,124,135,143],{},[23,125,126,127,130],{},"Choose ",[30,128,129],{},"Free",[20,131,132],{},[23,133,134],{},"Render may default to a paid plan",[23,136,137,138],{},"Free services can sleep",[20,139,140],{},[23,141,142],{},"First visit after sleep may be slow",[23,144,145],{},"Avoid extra services unless instructed",[114,147,148,152],{"v-slot:right":116},[118,149,151],{"id":150},"repo-ready","Repo Ready",[20,153,154,157,163,177],{},[23,155,156],{},"Starter files committed and pushed",[23,158,159,162],{},[30,160,161],{},"Dockerfile"," in repo root",[23,164,165,168,169,172,173,176],{},[30,166,167],{},"public_html",", ",[30,170,171],{},"lib",", and ",[30,174,175],{},"partials"," present",[23,178,179,181,182,184],{},[30,180,32],{}," and ",[30,183,38],{}," branches exist on GitHub",[11,186,188,191],{"id":187,"level":14},"target-architecture",[16,189,190],{"id":187},"Target Architecture",[109,192,193,221],{"gap":111,"left-width":112,"right-width":112},[114,194,195,199],{"v-slot:left":116},[118,196,198],{"id":197},"qa-service","QA Service",[20,200,201,207,212,215],{},[23,202,203,204],{},"Name: ",[30,205,206],{},"\u003Cucid>-it202-\u003Csection>-qa",[23,208,209,210],{},"Watches ",[30,211,32],{},[23,213,214],{},"Used for testing and evidence",[23,216,217,218],{},"URL ends with ",[30,219,220],{},"-qa.onrender.com",[114,222,223,227],{"v-slot:right":116},[118,224,226],{"id":225},"production-service","Production Service",[20,228,229,234,238,241],{},[23,230,203,231],{},[30,232,233],{},"\u003Cucid>-it202-\u003Csection>-prod",[23,235,209,236],{},[30,237,38],{},[23,239,240],{},"Stable version after QA checks",[23,242,217,243],{},[30,244,245],{},"-prod.onrender.com",[11,247,249,253],{"id":248,"level":14},"step-1-sign-up",[16,250,252],{"id":251},"step-1-sign-up-with-github","Step 1: Sign Up With GitHub",[109,254,257,276],{"gap":111,"left-width":255,"right-width":256},"0.85fr","1.15fr",[114,258,259],{"v-slot:left":116},[20,260,261,267,270,273],{},[23,262,263,264],{},"Go to ",[30,265,266],{},"render.com",[23,268,269],{},"Choose GitHub sign-in",[23,271,272],{},"Authorize Render when prompted",[23,274,275],{},"Land on the Render dashboard",[114,277,278],{"v-slot:right":116},[52,279,280],{},[281,282],"img",{"alt":283,"src":284,"variant":285},"Render GitHub sign-in screen","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-01-github-signin.png","sidecar-screenshot",[11,287,289,292],{"id":288,"level":14},"step-2-new-web-service",[16,290,291],{"id":288},"Step 2: New Web Service",[109,293,294,315],{"gap":111,"left-width":255,"right-width":256},[114,295,296],{"v-slot:left":116},[20,297,298,304,309,312],{},[23,299,300,301],{},"Click ",[30,302,303],{},"New +",[23,305,126,306],{},[30,307,308],{},"Web Service",[23,310,311],{},"Do not choose a database service here",[23,313,314],{},"This creates the hosted PHP app",[114,316,317],{"v-slot:right":116},[52,318,319],{},[281,320],{"alt":321,"src":322,"variant":285},"Render New menu with Web Service option","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-04-new-menu.png",[11,324,326,330],{"id":325,"level":14},"step-3-connect-repo",[16,327,329],{"id":328},"step-3-connect-repository","Step 3: Connect Repository",[109,331,334,354],{"gap":111,"left-width":332,"right-width":333},"0.9fr","1.1fr",[114,335,336],{"v-slot:left":116},[20,337,338,341,344,351],{},[23,339,340],{},"Select your student course repository",[23,342,343],{},"Authorize repository access if Render asks",[23,345,346,347,350],{},"Ensure it's the proper repository (format: ",[30,348,349],{},"ucid-course-section-semYear",")",[23,352,353],{},"Continue to service settings",[114,355,356],{"v-slot:right":116},[52,357,358],{},[281,359],{"alt":360,"src":361,"variant":285},"Render repository selection screen","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-07-select-repo.png",[11,363,365,369],{"id":364,"level":14},"step-4-configure-qa",[16,366,368],{"id":367},"step-4-configure-qa-service","Step 4: Configure QA Service",[109,370,371,404],{"gap":111,"left-width":255,"right-width":256},[114,372,373,376],{"v-slot:left":116},[52,374,375],{},"Use these settings:",[20,377,378,382,387,393,398,401],{},[23,379,203,380],{},[30,381,206],{},[23,383,384,385],{},"Branch: ",[30,386,32],{},[23,388,389,390],{},"Runtime: ",[30,391,392],{},"Docker",[23,394,395,396],{},"Instance type: ",[30,397,129],{},[23,399,400],{},"Root directory: blank",[23,402,403],{},"Build\u002Fstart commands: blank",[114,405,406],{"v-slot:right":116},[52,407,408],{},[281,409],{"alt":410,"src":411,"variant":285},"Render QA service configuration","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-08-qa-config-basic.png",[11,413,415,419],{"id":414,"level":14},"step-5-env-vars",[16,416,418],{"id":417},"step-5-add-environment-variables","Step 5: Add Environment Variables",[109,420,423,458],{"gap":111,"left-width":421,"right-width":422},"0.95fr","1.05fr",[114,424,425],{"v-slot:left":116},[20,426,427,445,452,455],{},[23,428,429,430,433],{},"Add ",[30,431,432],{},"DB_URL",[20,434,435],{},[23,436,437,438],{},"Get it from ",[439,440,444],"a",{"href":441,"rel":442},"https:\u002F\u002Fcourses.ethereallab.app\u002Fdatabase",[443],"nofollow","courses.ethereallab.app\u002Fdatabase",[23,446,447,448,451],{},"Do not use \"add from ",[30,449,450],{},".env","\"",[23,453,454],{},"Add later API keys only when a later lesson requires them",[23,456,457],{},"Repeat required env vars on both QA and production",[114,459,460],{"v-slot:right":116},[52,461,462],{},[281,463],{"alt":464,"src":465,"variant":285},"Render environment variables section","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-09-env-vars.png",[11,467,469,472],{"id":468,"level":14},"step-6-deploy-qa",[16,470,471],{"id":468},"Step 6: Deploy QA",[109,473,474,493],{"gap":111,"left-width":332,"right-width":333},[114,475,476],{"v-slot:left":116},[20,477,478,481,484,487,490],{},[23,479,480],{},"Create the QA service",[23,482,483],{},"Watch the first deploy log",[23,485,486],{},"Wait for a success state",[23,488,489],{},"Open the QA URL",[23,491,492],{},"Confirm the starter page loads",[114,494,495],{"v-slot:right":116},[52,496,497],{},[281,498],{"alt":499,"src":500,"variant":285},"Successful Render QA deployment","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-10-qa-deployed.png",[11,502,504,508],{"id":503,"level":14},"step-7-create-prod",[16,505,507],{"id":506},"step-7-create-production-service","Step 7: Create Production Service",[109,509,510,539],{"gap":111,"left-width":255,"right-width":256},[114,511,512,515],{"v-slot:left":116},[52,513,514],{},"Create a second web service:",[20,516,517,520,524,528,532,536],{},[23,518,519],{},"Same repository",[23,521,203,522],{},[30,523,233],{},[23,525,384,526],{},[30,527,38],{},[23,529,389,530],{},[30,531,392],{},[23,533,395,534],{},[30,535,129],{},[23,537,538],{},"Same required env vars",[114,540,541],{"v-slot:right":116},[52,542,543],{},[281,544],{"alt":545,"src":546,"variant":285},"Render production service configuration","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-11-prod-config.png",[11,548,550,553],{"id":549,"level":14},"normal-workflow",[16,551,552],{"id":549},"Normal Workflow",[554,555,556,559,562,567,570,573,576,585],"ol",{},[23,557,558],{},"Work locally on a feature or homework branch",[23,560,561],{},"Commit and push that branch to GitHub",[23,563,564,565],{},"Open a pull request into ",[30,566,32],{},[23,568,569],{},"Merge after review",[23,571,572],{},"Render updates the QA URL",[23,574,575],{},"Test the QA URL",[23,577,578,579,581,582,584],{},"Open a pull request from ",[30,580,32],{}," into ",[30,583,38],{}," after evidence gathering",[23,586,587],{},"Render updates the production URL",[11,589,591,594],{"id":590,"level":14},"urls-and-cold-starts",[16,592,593],{"id":590},"URLs And Cold Starts",[20,595,596,599,602,605,613],{},[23,597,598],{},"QA URL shows the test deployment",[23,600,601],{},"Production URL shows the stable deployment",[23,603,604],{},"Homework evidence usually starts with QA",[23,606,607,608],{},"Free services may sleep after inactivity\n",[20,609,610],{},[23,611,612],{},"First visit after sleep may take extra time (2 - 5 minutes)",[23,614,615],{},"Do not submit before Render finishes deploying",[11,617,619,622],{"id":618,"level":14},"logs-and-status",[16,620,621],{"id":618},"Logs And Status",[109,623,624,640],{"gap":111,"left-width":332,"right-width":333},[114,625,626],{"v-slot:left":116},[20,627,628,631,634,637],{},[23,629,630],{},"Logs show build and startup output",[23,632,633],{},"Dashboard status shows deploy progress",[23,635,636],{},"Failed deploys usually show the first useful clue",[23,638,639],{},"Read the first clear error before changing settings",[114,641,642],{"v-slot:right":116},[52,643,644],{},[281,645],{"alt":646,"src":647,"variant":285},"Render deploy logs","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-12-logs.png",[11,649,651,654],{"id":650,"level":14},"troubleshooting",[16,652,653],{"id":650},"Troubleshooting",[20,655,656,667,675,685],{},[23,657,658,659],{},"Build fails\n",[20,660,661],{},[23,662,663,664,666],{},"Check ",[30,665,161],{},", root directory, runtime, and instance type",[23,668,669,670],{},"App deploys but page fails\n",[20,671,672],{},[23,673,674],{},"Check logs for PHP errors",[23,676,677,678],{},"Database connection fails\n",[20,679,680],{},[23,681,663,682,684],{},[30,683,432],{}," spelling and copied value",[23,686,687,688],{},"Wrong version appears\n",[20,689,690,693],{},[23,691,692],{},"Confirm the service watches the expected branch",[23,694,695],{},"Clear browser cache or test in a private window",[11,697,699,702],{"id":698,"level":14},"common-mistakes",[16,700,701],{"id":698},"Common Mistakes",[20,703,704,716,719,724,727,730],{},[23,705,706,707,710,711,713,714],{},"Choosing ",[30,708,709],{},"main"," instead of ",[30,712,32],{}," or ",[30,715,38],{},[23,717,718],{},"Creating one service for both environments",[23,720,721,722],{},"Forgetting ",[30,723,432],{},[23,725,726],{},"Using a paid instance type by accident",[23,728,729],{},"Checking GitHub but not the Render URL",[23,731,732],{},"Changing code locally but forgetting to push and merge",[11,734,736,739],{"id":735,"level":14},"key-terms-and-further-learning",[16,737,738],{"id":735},"Key Terms And Further Learning",[109,740,741,772],{"gap":111,"left-width":112,"right-width":112},[114,742,743,747,754,760,766],{"v-slot:left":116},[118,744,746],{"id":745},"key-terms","Key Terms",[52,748,749,753],{},[750,751,752],"strong",{},"Service"," - one deployed app on Render",[52,755,756,759],{},[750,757,758],{},"Watched branch"," - Git branch Render deploys from",[52,761,762,765],{},[750,763,764],{},"Environment variable"," - setting stored outside code",[52,767,768,771],{},[750,769,770],{},"Deploy log"," - output from Render's build\u002Fstart process",[114,773,774,778],{"v-slot:right":116},[118,775,777],{"id":776},"further-learning","Further Learning",[20,779,780,787,794,801],{},[23,781,782],{},[439,783,786],{"href":784,"rel":785},"https:\u002F\u002Frender.com\u002Fdocs\u002Fweb-services",[443],"Render Docs: Web Services",[23,788,789],{},[439,790,793],{"href":791,"rel":792},"https:\u002F\u002Frender.com\u002Fdocs\u002Fdeploys",[443],"Render Docs: Deploys",[23,795,796],{},[439,797,800],{"href":798,"rel":799},"https:\u002F\u002Frender.com\u002Fdocs\u002Fconfigure-environment-variables",[443],"Render Docs: Environment Variables",[23,802,803],{},[439,804,807],{"href":805,"rel":806},"https:\u002F\u002Frender.com\u002Fdocs\u002Ffree",[443],"Render Docs: Free Instance Types",[11,809,811,814,817],{"id":810,"level":14},"summary",[16,812,813],{"id":810},"Summary",[52,815,816],{},"Before leaving this presentation, confirm you:",[20,818,819,822,825,833,836,839],{},[23,820,821],{},"Created QA and production Render services",[23,823,824],{},"Matched each service to the correct branch",[23,826,827,828,830,831],{},"Added ",[30,829,432],{}," from ",[30,832,444],{},[23,834,835],{},"Opened each deployed URL",[23,837,838],{},"Read logs instead of assuming it worked",[23,840,841,842],{},"Understand the local -> GitHub -> Render loop\n",[20,843,844,847,852],{},[23,845,846],{},"Majority of your work will be done locally and tested locally",[23,848,849,851],{},[30,850,32],{}," is just for gathering evidence for submissions",[23,853,854,856],{},[30,855,38],{}," is what will be verified during grading",{"title":116,"searchDepth":858,"depth":858,"links":859},2,[860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878],{"id":18,"depth":858,"text":5},{"id":47,"depth":858,"text":50},{"id":74,"depth":858,"text":77},{"id":106,"depth":858,"text":107},{"id":187,"depth":858,"text":190},{"id":251,"depth":858,"text":252},{"id":288,"depth":858,"text":291},{"id":328,"depth":858,"text":329},{"id":367,"depth":858,"text":368},{"id":417,"depth":858,"text":418},{"id":468,"depth":858,"text":471},{"id":506,"depth":858,"text":507},{"id":549,"depth":858,"text":552},{"id":590,"depth":858,"text":593},{"id":618,"depth":858,"text":621},{"id":650,"depth":858,"text":653},{"id":698,"depth":858,"text":701},{"id":735,"depth":858,"text":738},{"id":810,"depth":858,"text":813},"presentation","Internet Applications","Connect the course repository to Render, create QA and production services, and verify the deploy loop from GitHub to a live URL.","Face-to-face class of about 40 students; includes Render account setup, QA\u002Fprod service creation, environment variables, deploy verification, and first troubleshooting pass.","15","55","70","md",{},"1",true,"80","\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup",false,{"title":5,"description":881},"published","internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup",[897,898,32,899],"render","deployment","production","21:42","esZd5RIpqCQ","https:\u002F\u002Fyoutu.be\u002FesZd5RIpqCQ","Render.com Setup (QA and Prod)","_1jV7vdhppggQ8TAOecx_1jFvjG90__8eGGlaXbnc28",null,[],[908,1405,2470,3352,4442,5380,6169,7228,7948,8572],{"id":909,"title":910,"audience":6,"body":911,"contentType":879,"course":880,"description":1385,"estimateBasis":1386,"estimatedDiscussionMinutes":1387,"estimatedLiveMinutes":1388,"estimatedTotalMinutes":1389,"extension":886,"meta":1390,"module":888,"navigation":889,"order":1391,"path":1392,"promptAssist":892,"seo":1393,"status":894,"stem":1394,"tags":1395,"videoDuration":1400,"videoId":1401,"videoLink":1402,"videoTitle":1403,"week":888,"__hash__":1404},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord.md","Learn Courses Platform And Discord",{"type":8,"value":912,"toc":1369},[913,947,987,1032,1080,1128,1161,1223,1264,1314,1343],[11,914,916,920,934],{"id":915,"level":14},"learn-courses-flow",[16,917,919],{"id":918},"what-is-the-learn-courses-platform","What is the Learn Courses Platform",[20,921,922,925,928,931],{},[23,923,924],{},"This is a platform I've built over the years to aid assignment submissions and course utilities",[23,926,927],{},"It provides objective-based worksheets to fill in images, urls, and open responses to document assignment evidence",[23,929,930],{},"The goal is to keep tasks clear and objective for students and grading",[23,932,933],{},"Also includes a few other utilities for courses (such as joining the Discord server)",[52,935,936,937,941,942,946],{},"NOTE: Summer 2026 the previous Learn Platform (",[439,938,939],{"href":939,"rel":940},"https:\u002F\u002Flearn.ethereallab.app",[443],") has been replaced by Learn Courses Platform (",[439,943,944],{"href":944,"rel":945},"https:\u002F\u002Fcourses.ethereallab.app",[443],"). The deprecated site is still available as a backup but all activities\u002Fcontent is being migrated to the new version",[11,948,950,953,956,984],{"id":949,"level":14},"learn-courses-title",[16,951,910],{"id":952},"learn-courses-platform-and-discord",[52,954,955],{},"How to join:",[20,957,958,964,972,975,978,981],{},[23,959,960,961],{},"Visit the platform ",[439,962,944],{"href":944,"rel":963},[443],[23,965,966,967],{},"Sign in with your NJIT email\n",[20,968,969],{},[23,970,971],{},"If you're in the Canvas course, you should automatically get synced to this platform",[23,973,974],{},"Visit your Profile page",[23,976,977],{},"Associate your Discord account",[23,979,980],{},"Join the course Discord server",[23,982,983],{},"Verify that your course channels appear on Discord",[52,985,986],{},"You can follow the steps on the below slides for guidance",[11,988,991,994],{"id":989,"level":990},"visit-learn-courses","3",[16,992,993],{"id":989},"Visit Learn Courses",[109,995,996,1024],{"gap":111,"left-width":112,"right-width":112},[114,997,998,1001,1006],{"v-slot:left":116},[52,999,1000],{},"Go to:",[52,1002,1003],{},[439,1004,944],{"href":944,"rel":1005},[443],[20,1007,1008,1015,1018,1021],{},[23,1009,1010,1011,1014],{},"Click the ",[750,1012,1013],{},"Login"," button",[23,1016,1017],{},"Use your NJIT email",[23,1019,1020],{},"Only NJIT accounts are allowed",[23,1022,1023],{},"If the browser tries a personal Chrome profile, log out of that account or switch profiles",[114,1025,1026],{"v-slot:right":116},[52,1027,1028],{},[281,1029],{"alt":1030,"src":1031,"variant":285},"Learn Courses logged-out home page with the Login button visible","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fhome-loggedout-login-button.png",[11,1033,1035,1038],{"id":1034,"level":990},"associate-discord-name",[16,1036,1037],{"id":1034},"Associate Discord Name",[109,1039,1040,1064],{"gap":111,"left-width":112,"right-width":112},[114,1041,1042,1045,1061],{"v-slot:left":116},[52,1043,1044],{},"On Learn Courses:",[554,1046,1047,1050,1055,1058],{},[23,1048,1049],{},"Open your Profile",[23,1051,300,1052],{},[750,1053,1054],{},"Refresh Discord Username",[23,1056,1057],{},"Authorize the Discord prompt",[23,1059,1060],{},"After the success message appears, save your profile",[52,1062,1063],{},"If you are not sure where you are, use the Home icon in the top left to return to the dashboard.",[114,1065,1066,1073],{"v-slot:right":116},[52,1067,1068],{},[281,1069],{"alt":1070,"src":1071,"variant":285,"max-height":1072},"Learn Courses dashboard sidebar with Profile and course links visible","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fdashboard-sidebar-profile-links.png","13rem",[52,1074,1075],{},[281,1076],{"alt":1077,"src":1078,"variant":285,"max-height":1079},"Learn Courses profile page with Discord connection controls visible","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fprofile-page.png","16rem",[11,1081,1083,1086],{"id":1082,"level":990},"authorize-discord",[16,1084,1085],{"id":1082},"Authorize Discord",[109,1087,1088,1112],{"gap":111,"left-width":112,"right-width":112},[114,1089,1090,1093],{"v-slot:left":116},[52,1091,1092],{},"Discord will ask whether Learn Courses can access your Discord account.",[20,1094,1095,1098,1103,1106,1109],{},[23,1096,1097],{},"Confirm you are signed in to the correct Discord account",[23,1099,300,1100],{},[750,1101,1102],{},"Authorize",[23,1104,1105],{},"Return to Learn Courses",[23,1107,1108],{},"Look for the success message",[23,1110,1111],{},"Save the profile change",[114,1113,1114,1121],{"v-slot:right":116},[52,1115,1116],{},[281,1117],{"alt":1118,"src":1119,"variant":285,"max-height":1120},"Discord authorization prompt for Learn Courses","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fdiscord-auth.png","25rem",[52,1122,1123],{},[281,1124],{"alt":1125,"src":1126,"variant":285,"max-height":1127},"Learn Courses success message after connecting Discord","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fdiscord-connected-success.png","7rem",[11,1129,1131,1134,1137,1143,1150],{"id":1130,"level":990},"join-the-channel",[16,1132,1133],{"id":1130},"Join The Channel",[52,1135,1136],{},"Use the Discord link provided on Canvas, or use:",[52,1138,1139],{},[439,1140,1141],{"href":1141,"rel":1142},"https:\u002F\u002Fdiscord.com\u002Finvite\u002FYEHcm44wzg",[443],[52,1144,1145,1146,1149],{},"This should send you to the ",[30,1147,1148],{},"access-channel"," channel.",[20,1151,1152,1155,1158],{},[23,1153,1154],{},"Other channels are protected by a bot",[23,1156,1157],{},"Messages may be blocked until your name and role are set",[23,1159,1160],{},"You'll have temporary access until a role is applied so if you leave before completing the steps you'll have to revisit the invite link",[11,1162,1164,1167],{"id":1163,"level":14},"verify-with-quackbot",[16,1165,1166],{"id":1163},"Verify With QuackBot",[109,1168,1169,1214],{"gap":111,"left-width":112,"right-width":112},[114,1170,1171,1183,1189,1194,1197,1211],{"v-slot:left":116},[20,1172,1173,1176],{},[23,1174,1175],{},"A summer 2026 change was to have the bot attempt to auto-detect new members and apply roles automatically",[23,1177,1178,1179,1182],{},"If you don't see the proper semester category (i.e., ",[30,1180,1181],{},"summer-2026",") or the expected channels you can do the below action",[52,1184,1185,1186,1188],{},"In ",[30,1187,1148],{},", enter:",[52,1190,1191],{},[30,1192,1193],{},"@QuackBot",[52,1195,1196],{},"QuackBot will:",[20,1198,1199,1202,1205,1208],{},[23,1200,1201],{},"Verify your account",[23,1203,1204],{},"Pull in your name and section",[23,1206,1207],{},"Apply your class role",[23,1209,1210],{},"Update your server nickname",[52,1212,1213],{},"This does not change your real Discord username.",[114,1215,1216],{"v-slot:right":116},[52,1217,1218],{},[281,1219],{"alt":1220,"src":1221,"variant":285,"max-height":1222},"QuackBot response showing the student already has a course role","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fquackbot-role-response.png","8rem",[11,1224,1226,1230,1233,1244,1248],{"id":1225,"level":14},"welcome-and-potential-issues",[16,1227,1229],{"id":1228},"welcome","Welcome",[52,1231,1232],{},"If the previous steps worked, you should see a new semester category in the Discord sidebar.",[20,1234,1235,1238,1241],{},[23,1236,1237],{},"It should appear after the general channels",[23,1239,1240],{},"It should include one or more channels for your active courses",[23,1242,1243],{},"Use the correct course channel for class questions and discussion",[118,1245,1247],{"id":1246},"potential-issues","Potential Issues",[20,1249,1250,1253],{},[23,1251,1252],{},"If you recently joined the class, your UCID may still need to be added to Learn Courses",[23,1254,1255,1256,1259],{},"If there is an issue, email the instructor or DM ",[30,1257,1258],{},"MattToegel",[20,1260,1261],{},[23,1262,1263],{},"Some Discord privacy settings may require a friend request before DMs work",[11,1265,1267,1270],{"id":1266,"level":14},"general-conduct",[16,1268,1269],{"id":1266},"General Conduct",[20,1271,1272,1275,1278,1289,1292,1300,1308,1311],{},[23,1273,1274],{},"Use class-related channels for questions and discussion",[23,1276,1277],{},"Ask general course questions in the channel instead of DM when possible",[23,1279,1280,1281],{},"Do not post screenshots of in-progress assignment solutions\n",[20,1282,1283,1286],{},[23,1284,1285],{},"This would be more ideal for a DM",[23,1287,1288],{},"If you see posted solution-like items don't assume they're correct",[23,1290,1291],{},"General unrelated code is okay when it supports a discussion (like content from a presentation or reading)",[23,1293,1294,1295],{},"If the instructor needs to see assignment code, they may ask you to DM the screenshot\n",[20,1296,1297],{},[23,1298,1299],{},"Since repositories should be set to private; repo links are fine to post in the class channel since other students should not have access to them",[23,1301,1302,1303],{},"Keep off-topic items out of class channels\n",[20,1304,1305],{},[23,1306,1307],{},"There are plenty of categorized channels to use and I can always make more",[23,1309,1310],{},"Helping classmates understand topics is encouraged just be mindful not to spoon-feed",[23,1312,1313],{},"Sharing direct solutions goes against the Academic Integrity Policy",[11,1315,1317,1320,1323],{"id":1316,"level":14},"quick-check",[16,1318,1319],{"id":1316},"Quick Check",[52,1321,1322],{},"Before continuing, confirm:",[20,1324,1325,1328,1331,1334,1337,1340],{},[23,1326,1327],{},"You can sign in to Learn Courses with your NJIT email",[23,1329,1330],{},"Your profile is saved",[23,1332,1333],{},"Discord is associated with your Learn Courses profile",[23,1335,1336],{},"You joined the Discord server",[23,1338,1339],{},"QuackBot applied your course role",[23,1341,1342],{},"You can see the correct course channel",[11,1344,1345,1347],{"id":810,"level":14},[16,1346,813],{"id":810},[20,1348,1349,1352,1360,1363,1366],{},[23,1350,1351],{},"Learn Courses supports course tools and course-specific setup",[23,1353,1354,1355],{},"Canvas remains the official assignment, grade, and course hub\n",[20,1356,1357],{},[23,1358,1359],{},"All necessary items will be linked on Canvas",[23,1361,1362],{},"Discord is the preferred quick communication channel",[23,1364,1365],{},"QuackBot connects your Discord account to the correct course role",[23,1367,1368],{},"Good course communication keeps help requests specific and protects private information",{"title":116,"searchDepth":858,"depth":858,"links":1370},[1371,1372,1373,1374,1375,1376,1377,1378,1382,1383,1384],{"id":918,"depth":858,"text":919},{"id":952,"depth":858,"text":910},{"id":989,"depth":858,"text":993},{"id":1034,"depth":858,"text":1037},{"id":1082,"depth":858,"text":1085},{"id":1130,"depth":858,"text":1133},{"id":1163,"depth":858,"text":1166},{"id":1228,"depth":858,"text":1229,"children":1379},[1380],{"id":1246,"depth":1381,"text":1247},3,{"id":1266,"depth":858,"text":1269},{"id":1316,"depth":858,"text":1319},{"id":810,"depth":858,"text":813},"Set up Learn Courses Platform and Discord before starting terminal, Git, and local server work.","Face-to-face class of about 40 students; includes account sign-in, Discord association, QuackBot role setup, and communication expectations.","10","20","30",{},"0","\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord",{"title":910,"description":1385},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord",[1396,1397,1398,1399],"course-tools","learn-courses","discord","setup","11:16","ScmHyEF1sA0","https:\u002F\u002Fyoutu.be\u002FScmHyEF1sA0","Joining Learn Platform and Discord Server","tEFV7lUabcy7whz7FSHEjPXSirrd3ginqQq4O4AkW9o",{"id":1406,"title":1407,"audience":6,"body":1408,"contentType":879,"course":880,"description":2455,"estimateBasis":2456,"estimatedDiscussionMinutes":1387,"estimatedLiveMinutes":2457,"estimatedTotalMinutes":884,"extension":886,"meta":2458,"module":888,"navigation":889,"order":1387,"path":2459,"promptAssist":892,"seo":2460,"status":894,"stem":2461,"tags":2462,"videoDuration":2466,"videoId":2467,"videoLink":2468,"videoTitle":1407,"week":888,"__hash__":2469},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands.md","Basic CLI Commands",{"type":8,"value":1409,"toc":2421},[1410,1468,1503,1533,1595,1662,1712,1738,1758,1796,1824,1845,1880,1902,1974,1997,2042,2104,2156,2184,2204,2233,2271,2301,2311,2374],[11,1411,1413,1417],{"id":1412,"level":14},"why-cli-first",[16,1414,1416],{"id":1415},"why-cli-comes-first","Why CLI Comes First",[20,1418,1419,1427,1435,1449,1457],{},[23,1420,1421,1422],{},"Common language for setup and developer tools\n",[20,1423,1424],{},[23,1425,1426],{},"Git, servers, package installs, deployment logs",[23,1428,1429,1430],{},"Works when there is no full desktop\n",[20,1431,1432],{},[23,1433,1434],{},"SSH, Ubuntu Server, minimal system access",[23,1436,1437,1438],{},"Direct check of what the computer sees\n",[20,1439,1440,1443,1446],{},[23,1441,1442],{},"Current folder",[23,1444,1445],{},"Files and permissions",[23,1447,1448],{},"Command output",[23,1450,1451,1452],{},"Repeatable steps beat guessing through menus\n",[20,1453,1454],{},[23,1455,1456],{},"Run a command, read output, adjust",[23,1458,1459,1460],{},"Location still matters\n",[20,1461,1462,1465],{},[23,1463,1464],{},"Wrong folder can make correct commands fail",[23,1466,1467],{},"Or create files in the wrong place",[11,1469,1471,1474,1477],{"id":1470,"level":14},"goal",[16,1472,1473],{"id":1470},"Goal",[52,1475,1476],{},"Build the command-line habits that make setup work predictable:",[20,1478,1479,1482,1485,1497,1500],{},[23,1480,1481],{},"Know what folder the terminal is using",[23,1483,1484],{},"Read file and folder lists before moving",[23,1486,1487,1488,168,1491,172,1494],{},"Recognize common flags like ",[30,1489,1490],{},"-a",[30,1492,1493],{},"-r",[30,1495,1496],{},"-l",[23,1498,1499],{},"Make small file changes and verify them",[23,1501,1502],{},"Stop safely when output does not match the lesson",[11,1504,1505,1507,1510,1530],{"id":106,"level":14},[16,1506,107],{"id":106},[52,1508,1509],{},"Run these commands on your host computer",[20,1511,1512,1524,1527],{},[23,1513,1514,1515],{},"Windows: Git Bash",[20,1516,1517],{},[23,1518,1519,1520],{},"Need Git Bash now? Use the Windows install slide in the next presentation:\n",[439,1521,1523],{"href":1522},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fview\u002Fslides#step-1-install-git-on-windows","Install Git On Windows",[23,1525,1526],{},"Apple macOS: Terminal",[23,1528,1529],{},"Linux: Terminal",[52,1531,1532],{},"Use one terminal window for the whole practice so your location is easy to track",[11,1534,1536,1540],{"id":1535,"level":14},"working-directory",[16,1537,1539],{"id":1538},"the-main-idea","The Main Idea",[20,1541,1542,1553,1564,1587],{},[23,1543,1544,1545],{},"Terminal commands run from one folder at a time\n",[20,1546,1547],{},[23,1548,1549,1550],{},"That folder is the ",[750,1551,1552],{},"working directory",[23,1554,1555,1558,1559],{},[30,1556,1557],{},"pwd",": print working directory\n",[20,1560,1561],{},[23,1562,1563],{},"Shows the full path to the folder your terminal is using",[23,1565,1566,1567],{},"Fresh terminal usually starts in your home folder\n",[20,1568,1569,1575,1581],{},[23,1570,1571,1572],{},"Windows Git Bash: ",[30,1573,1574],{},"\u002Fc\u002FUsers\u002Fyour-username",[23,1576,1577,1578],{},"Apple macOS: ",[30,1579,1580],{},"\u002FUsers\u002Fyour-username",[23,1582,1583,1584],{},"Linux: ",[30,1585,1586],{},"\u002Fhome\u002Fyour-username",[23,1588,1589,1590],{},"Commands from this lesson start from the working directory\n",[20,1591,1592],{},[23,1593,1594],{},"Unless you give a different path",[11,1596,1598,1601,1604,1656],{"id":1597,"level":14},"paths-relative-and-absolute",[16,1599,1600],{"id":1597},"Paths: Relative And Absolute",[52,1602,1603],{},"Paths build on the working directory. They tell the terminal which file or folder you mean",[20,1605,1606,1612,1618,1624,1650],{},[23,1607,1608,1609],{},"Relative path: starts from the working directory, like ",[30,1610,1611],{},"public\u002Findex.php",[23,1613,1614,1615],{},"Absolute path: starts from the system root, like ",[30,1616,1617],{},"\u002Fhome\u002Fstudent\u002Fproject",[23,1619,1620,1623],{},[30,1621,1622],{},"."," means the current folder",[23,1625,1626,1629,1630],{},[30,1627,1628],{},".."," means the parent folder\n",[20,1631,1632,1638,1644],{},[23,1633,1634,1637],{},[30,1635,1636],{},"..\u002F.."," goes up two folders",[23,1639,1640,1641],{},"Example: ",[30,1642,1643],{},"cd ..\u002F..",[23,1645,1646,1649],{},[30,1647,1648],{},"..."," is not a shortcut",[23,1651,1652,1655],{},[30,1653,1654],{},"~"," means your home folder",[52,1657,1658,1659,1661],{},"If a command affects the wrong place, check ",[30,1660,1557],{}," first, then check the path you typed",[11,1663,1665,1668,1671,1689,1692],{"id":1664,"level":14},"flags-options-and-arguments",[16,1666,1667],{"id":1664},"Flags, Options, And Arguments",[52,1669,1670],{},"Commands usually follow this shape:",[20,1672,1673,1679,1684],{},[23,1674,1675,1676],{},"Command: what to do, like ",[30,1677,1678],{},"ls",[23,1680,1681,1682],{},"Flag or option: how to do it, like ",[30,1683,1490],{},[23,1685,1686,1687],{},"Argument: what to do it to, like ",[30,1688,167],{},[52,1690,1691],{},"Examples:",[20,1693,1694,1700,1706],{},[23,1695,1696,1699],{},[30,1697,1698],{},"ls -a"," shows hidden files",[23,1701,1702,1705],{},[30,1703,1704],{},"cp -r folder backup-folder"," copies a folder",[23,1707,1708,1711],{},[30,1709,1710],{},"nano -l file.txt"," opens with line numbers",[11,1713,1715,1719,1722,1733],{"id":1714,"level":14},"practice-loop",[16,1716,1718],{"id":1717},"practice-1-location-and-paths","Practice 1: Location And Paths",[52,1720,1721],{},"For each command, use the same pattern:",[554,1723,1724,1727,1730],{},[23,1725,1726],{},"Run one command",[23,1728,1729],{},"Read the output",[23,1731,1732],{},"Confirm the folder or file changed the way you expected",[20,1734,1735],{},[23,1736,1737],{},"See the slides below for workflow steps, checkpoints, and expected results",[11,1739,1741,1744,1747,1752,1755],{"id":1740,"level":990},"step-1-confirm-where-you-are",[16,1742,1743],{"id":1740},"Step 1: Confirm Where You Are",[52,1745,1746],{},"Run:",[1748,1749],"code-snippet",{"language":1750,"src":1751},"bash","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-1-confirm-where-you-01.sh",[52,1753,1754],{},"Expected result: a folder path",[52,1756,1757],{},"If you see a path, the terminal is working and you know your current location",[11,1759,1761,1764,1766,1769,1772,1775,1778],{"id":1760,"level":990},"step-2-list-files",[16,1762,1763],{"id":1760},"Step 2: List Files",[52,1765,1746],{},[1748,1767],{"language":1750,"src":1768},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-2-list-files-02.sh",[52,1770,1771],{},"Expected result: file and folder names from your current location",[52,1773,1774],{},"For hidden files and details too, run:",[1748,1776],{"language":1750,"src":1777},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-2-list-files-03.sh",[20,1779,1780,1785,1790],{},[23,1781,1782,1784],{},[30,1783,1490],{}," includes hidden files",[23,1786,1787,1789],{},[30,1788,1496],{}," uses a long listing",[23,1791,1792,1795],{},[30,1793,1794],{},"-la"," combines both",[11,1797,1799,1802,1805,1808,1815,1821],{"id":1798,"level":990},"step-3-change-folders",[16,1800,1801],{"id":1798},"Step 3: Change Folders",[52,1803,1804],{},"Start from your home folder, then move up and back",[1748,1806],{"language":1750,"src":1807},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-3-change-folders-04.sh",[52,1809,1810,1811,1814],{},"This avoids assuming your computer has a specific folder like ",[30,1812,1813],{},"Documents"," in the current location",[52,1816,1817,1818,1820],{},"When you move into a named folder later, run ",[30,1819,1678],{}," first and pick a folder that actually appears in the list",[52,1822,1823],{},"If a path has spaces, wrap it in quotes",[11,1825,1827,1831,1833,1836],{"id":1826,"level":990},"step-4-create-practice-folder",[16,1828,1830],{"id":1829},"step-4-create-a-practice-folder","Step 4: Create A Practice Folder",[52,1832,1746],{},[1748,1834],{"language":1750,"src":1835},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-4-create-a-practice-05.sh",[52,1837,1838,1839,1841,1842],{},"Expected result: ",[30,1840,1557],{}," ends with ",[30,1843,1844],{},"cli-practice",[11,1846,1848,1852,1854,1857,1860],{"id":1847,"level":990},"step-5-create-and-read-file",[16,1849,1851],{"id":1850},"step-5-write-text-to-a-file","Step 5: Write Text To A File",[52,1853,1746],{},[1748,1855],{"language":1750,"src":1856},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-5-write-text-to-a-f-06.sh",[52,1858,1859],{},"What this command does:",[20,1861,1862,1868,1874],{},[23,1863,1864,1867],{},[30,1865,1866],{},"echo"," prepares text for the terminal",[23,1869,1870,1873],{},[30,1871,1872],{},">"," redirects that text into a file instead of printing it on screen",[23,1875,1876,1879],{},[30,1877,1878],{},"cli-proof.txt"," is created in the current folder, or replaced if it already exists",[11,1881,1883,1887,1890,1893,1899],{"id":1882,"level":990},"step-5-read-file-back",[118,1884,1886],{"id":1885},"step-5-continued-read-the-file-back","Step 5 Continued: Read The File Back",[52,1888,1889],{},"Then read it back:",[1748,1891],{"language":1750,"src":1892},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-5-continued-read-th-07.sh",[52,1894,1895,1898],{},[30,1896,1897],{},"cat"," prints file contents in the terminal",[52,1900,1901],{},"Expected result: the terminal prints the text you wrote",[11,1903,1905,1909,1911,1920,1923,1949,1952],{"id":1904,"level":14},"file-management-loop",[16,1906,1908],{"id":1907},"practice-2-file-management","Practice 2: File Management",[52,1910,1721],{},[554,1912,1913,1915,1917],{},[23,1914,1726],{},[23,1916,1729],{},[23,1918,1919],{},"Confirm the file changed the way you expected",[52,1921,1922],{},"Commands in this practice:",[20,1924,1925,1931,1937,1943],{},[23,1926,1927,1930],{},[30,1928,1929],{},"touch"," creates an empty file",[23,1932,1933,1936],{},[30,1934,1935],{},"cp"," copies a file or folder",[23,1938,1939,1942],{},[30,1940,1941],{},"mv"," moves or renames",[23,1944,1945,1948],{},[30,1946,1947],{},"rm"," deletes",[52,1950,1951],{},"Important flags:",[20,1953,1954,1960,1966,1972],{},[23,1955,1956,1959],{},[30,1957,1958],{},"cp -r"," copies folders",[23,1961,1962,1965],{},[30,1963,1964],{},"rm -r"," deletes folders",[23,1967,1968,1971],{},[30,1969,1970],{},"rm -f"," forces deletion",[23,1973,1737],{},[11,1975,1977,1981,1983,1986,1991],{"id":1976,"level":990},"practice-2-step-1-create-empty-file",[16,1978,1980],{"id":1979},"step-1-create-an-empty-file","Step 1: Create An Empty File",[52,1982,1746],{},[1748,1984],{"language":1750,"src":1985},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-1-create-an-empty-f-08.sh",[52,1987,1988,1990],{},[30,1989,1929],{}," creates an empty file, or updates the timestamp if the file already exists",[52,1992,1838,1993,1996],{},[30,1994,1995],{},"practice-empty.txt"," appears in the folder list",[11,1998,2000,2004,2006,2009,2012,2018,2031],{"id":1999,"level":990},"practice-2-step-2-copy-rename-and-delete",[16,2001,2003],{"id":2002},"step-2-copy-rename-and-delete","Step 2: Copy, Rename, And Delete",[52,2005,1746],{},[1748,2007],{"language":1750,"src":2008},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-2-copy-rename-and-d-09.sh",[52,2010,2011],{},"Expected result: the backup is copied, renamed, then removed",[52,2013,2014,2015,2017],{},"Use ",[30,2016,1947],{}," carefully. Deleting from the terminal usually skips the recycle bin",[20,2019,2020,2025],{},[23,2021,2022,2024],{},[30,2023,1493],{},": recursive, includes folders and everything inside them",[23,2026,2027,2030],{},[30,2028,2029],{},"-f",": force, skips many confirmation prompts",[2032,2033,2035],"alert",{"color":2034},"red",[52,2036,2037,2038,2041],{},"Never run ",[30,2039,2040],{},"rm -rf \u002F",". It can try to delete the whole system from the root folder.",[11,2043,2045,2049,2052,2069,2074,2079,2099],{"id":2044,"level":14},"terminal-editors",[16,2046,2048],{"id":2047},"practice-3-terminal-editors","Practice 3: Terminal Editors",[52,2050,2051],{},"Sometimes you need to edit a file from a terminal",[20,2053,2054,2060],{},[23,2055,2056,2059],{},[30,2057,2058],{},"nano"," is beginner-friendly",[23,2061,2062,713,2065,2068],{},[30,2063,2064],{},"vi",[30,2066,2067],{},"vim"," is common on servers but has a learning curve",[52,2070,2014,2071,2073],{},[30,2072,2058],{}," for this course unless a lesson says otherwise",[52,2075,2014,2076,2078],{},[30,2077,1710],{}," when line numbers would help",[52,2080,2081,2082,713,2084,2086,2087,2090,2091,2094,2095,2098],{},"If you accidentally open ",[30,2083,2064],{},[30,2085,2067],{},", press ",[30,2088,2089],{},"Esc",", type ",[30,2092,2093],{},":q",", and press ",[30,2096,2097],{},"Enter"," to exit without saving",[20,2100,2101],{},[23,2102,2103],{},"See the slide below for workflow steps, checkpoints, and expected results",[11,2105,2107,2112,2114,2117,2122,2144],{"id":2106,"level":990},"edit-with-nano",[16,2108,2109,2110],{"id":2106},"Edit With ",[30,2111,2058],{},[52,2113,1746],{},[1748,2115],{"language":1750,"src":2116},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fedit-with-nano-10.sh",[52,2118,1185,2119,2121],{},[30,2120,2058],{},":",[20,2123,2124,2127,2134,2138],{},[23,2125,2126],{},"Type a short note",[23,2128,2129,2130,2133],{},"Press ",[30,2131,2132],{},"Ctrl+O"," to save",[23,2135,2129,2136],{},[30,2137,2097],{},[23,2139,2129,2140,2143],{},[30,2141,2142],{},"Ctrl+X"," to exit",[52,2145,2146,2147,2149,2150,2090,2152,2094,2154],{},"If you open ",[30,2148,2064],{}," by mistake, press ",[30,2151,2089],{},[30,2153,2093],{},[30,2155,2097],{},[11,2157,2159,2165,2170,2173,2176,2179],{"id":2158,"level":14},"sudo-and-permission-boundaries",[16,2160,2161,2164],{"id":2158},[30,2162,2163],{},"sudo"," And Permission Boundaries",[52,2166,2167,2169],{},[30,2168,2163],{}," runs a command with elevated permissions",[52,2171,2172],{},"Use it only when a setup lesson explicitly says to use it",[52,2174,2175],{},"Example:",[1748,2177],{"language":1750,"src":2178},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fsudo-and-permission-boun-11.sh",[20,2180,2181],{},[23,2182,2183],{},"See the slide below for supporting examples and follow-up details",[11,2185,2187,2192,2198],{"id":2186,"level":990},"sudo-by-operating-system",[118,2188,2189,2191],{"id":2186},[30,2190,2163],{}," By Operating System",[52,2193,2194,2195,2197],{},"On Linux and macOS, ",[30,2196,2163],{}," is common for package installation and service management",[52,2199,2200,2201,2203],{},"Modern Windows also has a native ",[30,2202,2163],{}," option, but Windows Git Bash usually does not need it for this course. If elevated access is needed on Windows, open Git Bash as administrator",[11,2205,2207,2210,2213,2224],{"id":2206,"level":14},"quick-safety-routine",[16,2208,2209],{"id":2206},"Quick Safety Routine",[52,2211,2212],{},"Before a command changes files, ask:",[20,2214,2215,2218,2221],{},[23,2216,2217],{},"What folder am I in?",[23,2219,2220],{},"Do I see the files I expect?",[23,2222,2223],{},"Am I about to change the right folder?",[52,2225,2226,2227,2229,2230],{},"If one answer is unclear, stop and run ",[30,2228,1557],{}," plus ",[30,2231,2232],{},"ls -la",[11,2234,2235,2237],{"id":698,"level":14},[16,2236,701],{"id":698},[20,2238,2239,2255,2261,2269],{},[23,2240,2241,2244,2245,2247,2248,2250,2251,2254],{},[30,2242,2243],{},"No such file or directory",": run ",[30,2246,1557],{},", then ",[30,2249,1678],{},", then try ",[30,2252,2253],{},"cd"," again",[23,2256,2257,2258,2260],{},"Command affected the wrong folder: check ",[30,2259,1557],{}," before continuing",[23,2262,2263,2265,2266,2268],{},[30,2264,1897],{}," cannot find the file: run ",[30,2267,2232],{}," and check the exact filename",[23,2270,2183],{},[11,2272,2274,2278],{"id":2273,"level":990},"common-mistakes-recovery",[118,2275,2277],{"id":2276},"recovery-checks","Recovery Checks",[20,2279,2280,2283,2289,2295],{},[23,2281,2282],{},"Spaces in a path: wrap the path in quotes",[23,2284,2285,2286],{},"Command keeps running: press ",[30,2287,2288],{},"Ctrl+C",[23,2290,2291,2292],{},"Permission denied: move back home with ",[30,2293,2294],{},"cd ~",[23,2296,2297,2298,2300],{},"Wrong ",[30,2299,1947],{},": stop and ask before doing more work",[11,2302,2303,2305,2308],{"id":1316,"level":14},[16,2304,1319],{"id":1316},[52,2306,2307],{},"You are ready for the next setup lesson when these commands make sense:",[1748,2309],{"language":1750,"src":2310},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fquick-check-12.sh",[11,2312,2313,2315],{"id":776,"level":14},[16,2314,738],{"id":735},[109,2316,2317,2347],{"gap":111,"left-width":112,"right-width":112},[114,2318,2319,2321,2327,2336],{"v-slot:left":116},[118,2320,746],{"id":745},[52,2322,2323,2326],{},[750,2324,2325],{},"Working directory"," - The folder where the next terminal command runs",[52,2328,2329,2332,2333],{},[750,2330,2331],{},"Path"," - A file or folder location, such as ",[30,2334,2335],{},"public_html\u002Findex.php",[52,2337,2338,2341,2342,2344,2345],{},[750,2339,2340],{},"Flag"," - An extra command option, such as ",[30,2343,1794],{}," in ",[30,2346,2232],{},[114,2348,2349,2351],{"v-slot:right":116},[118,2350,777],{"id":776},[20,2352,2353,2360,2367],{},[23,2354,2355],{},[439,2356,2359],{"href":2357,"rel":2358},"https:\u002F\u002Fdocumentation.ubuntu.com\u002Fdesktop\u002Fen\u002Flatest\u002Ftutorial\u002Fthe-linux-command-line-for-beginners\u002F",[443],"Ubuntu Tutorial: The Linux Command Line For Beginners",[23,2361,2362],{},[439,2363,2366],{"href":2364,"rel":2365},"https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fcoreutils\u002Fmanual\u002Fcoreutils.html",[443],"GNU Coreutils Manual",[23,2368,2369],{},[439,2370,2373],{"href":2371,"rel":2372},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FLearn_web_development\u002FGetting_started\u002FEnvironment_setup\u002FCommand_line",[443],"MDN: Command Line Crash Course",[11,2375,2376,2378,2381],{"id":810,"level":14},[16,2377,813],{"id":810},[52,2379,2380],{},"Before leaving this presentation, confirm you can:",[20,2382,2383,2388,2393,2404,2418],{},[23,2384,2014,2385,2387],{},[30,2386,1557],{}," to check where commands will run",[23,2389,2014,2390,2392],{},[30,2391,2232],{}," to inspect the current folder",[23,2394,2014,2395,168,2397,168,2399,172,2401,2403],{},[30,2396,2253],{},[30,2398,1622],{},[30,2400,1628],{},[30,2402,1654],{}," to move intentionally",[23,2405,2406,2407,168,2409,168,2411,168,2413,172,2415,2417],{},"Use file commands such as ",[30,2408,1929],{},[30,2410,1935],{},[30,2412,1941],{},[30,2414,1947],{},[30,2416,2058],{}," carefully",[23,2419,2420],{},"Stop and check location when output does not match the lesson",{"title":116,"searchDepth":858,"depth":858,"links":2422},[2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2437,2438,2439,2440,2441,2443,2448,2449,2452,2453,2454],{"id":1415,"depth":858,"text":1416},{"id":1470,"depth":858,"text":1473},{"id":106,"depth":858,"text":107},{"id":1538,"depth":858,"text":1539},{"id":1597,"depth":858,"text":1600},{"id":1664,"depth":858,"text":1667},{"id":1717,"depth":858,"text":1718},{"id":1740,"depth":858,"text":1743},{"id":1760,"depth":858,"text":1763},{"id":1798,"depth":858,"text":1801},{"id":1829,"depth":858,"text":1830},{"id":1850,"depth":858,"text":1851,"children":2435},[2436],{"id":1885,"depth":1381,"text":1886},{"id":1907,"depth":858,"text":1908},{"id":1979,"depth":858,"text":1980},{"id":2002,"depth":858,"text":2003},{"id":2047,"depth":858,"text":2048},{"id":2106,"depth":858,"text":2442},"Edit With nano",{"id":2158,"depth":858,"text":2444,"children":2445},"sudo And Permission Boundaries",[2446],{"id":2186,"depth":1381,"text":2447},"sudo By Operating System",{"id":2206,"depth":858,"text":2209},{"id":698,"depth":858,"text":701,"children":2450},[2451],{"id":2276,"depth":1381,"text":2277},{"id":1316,"depth":858,"text":1319},{"id":735,"depth":858,"text":738},{"id":810,"depth":858,"text":813},"Practice the terminal commands you need so you can move through folders, inspect files, and verify your location before running course commands.","Face-to-face class of about 40 students; includes short CLI demo, student command practice, path\u002Fflag checks, and common beginner recovery questions.","45",{},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands",{"title":1407,"description":2455},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands",[2463,2464,2465],"cli","terminal","filesystem","46:05","NsSRKv_uBWM","https:\u002F\u002Fyoutu.be\u002FNsSRKv_uBWM","q_NRWUOCcsk5lm6u6kKPFGl9E9VqeQhaC0qb86nD7aY",{"id":2471,"title":2472,"audience":6,"body":2473,"contentType":879,"course":880,"description":3340,"estimateBasis":3341,"estimatedDiscussionMinutes":1387,"estimatedLiveMinutes":3342,"estimatedTotalMinutes":2457,"extension":886,"meta":3343,"module":888,"navigation":889,"order":1388,"path":3344,"promptAssist":892,"seo":3345,"status":894,"stem":3346,"tags":3347,"videoDuration":3348,"videoId":3349,"videoLink":3350,"videoTitle":2472,"week":888,"__hash__":3351},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools.md","Git Tools",{"type":8,"value":2474,"toc":3310},[2475,2498,2527,2554,2591,2622,2653,2688,2717,2747,2784,2787,2817,2848,2877,2927,2945,2962,2982,3007,3038,3056,3095,3139,3221,3281],[11,2476,2477,2479],{"id":1470,"level":14},[16,2478,1473],{"id":1470},[20,2480,2481,2484,2487],{},[23,2482,2483],{},"Install Git",[23,2485,2486],{},"Choose one terminal for your operating system",[23,2488,2489,2490,168,2493,172,2495,2497],{},"Confirm ",[30,2491,2492],{},"git --version",[30,2494,1557],{},[30,2496,2232],{}," work before GitHub setup",[11,2499,2501,2505],{"id":2500,"level":14},"terminal-choice-by-os",[16,2502,2504],{"id":2503},"terminal-choices","Terminal Choices",[20,2506,2507,2510,2513,2516,2518,2521,2524],{},[23,2508,2509],{},"Pick the terminal for your operating system",[23,2511,2512],{},"Use that same terminal for this lesson path",[23,2514,2515],{},"Run commands on your own computer unless a later lesson explicitly says \"inside the VM\"",[23,2517,1514],{},[23,2519,2520],{},"Apple macOS: Terminal, with iTerm2 optional",[23,2522,2523],{},"Linux: Terminal, with Tilix optional",[23,2525,2526],{},"These operating system notes are alternatives, not a sequence",[11,2528,2530,2534,2551],{"id":2529,"level":14},"step-1-install-git-on-windows",[16,2531,2533],{"id":2532},"windows-path-git-bash","Windows Path: Git Bash",[554,2535,2536,2542,2545,2548],{},[23,2537,263,2538],{},[439,2539,2540],{"href":2540,"rel":2541},"https:\u002F\u002Fgit-scm.com\u002Finstall\u002Fwindows",[443],[23,2543,2544],{},"Download and run the Git for Windows installer",[23,2546,2547],{},"Open Git Bash from the Start menu",[23,2549,2550],{},"Use Git Bash whenever this course says to use the terminal",[52,2552,2553],{},"See the slides below for the install settings, launch check, and Windows terminal habit",[11,2555,2557,2560],{"id":2556,"level":990},"windows-installer-components",[118,2558,2559],{"id":2556},"Windows Installer: Components",[109,2561,2564,2572],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},"1.4fr","never",[114,2565,2566],{"v-slot:left":116},[52,2567,2568],{},[281,2569],{"alt":2570,"src":2571,"variant":285},"Git for Windows installer component selection screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep01_components.png",[114,2573,2574],{"v-slot:right":116},[20,2575,2576,2579,2585],{},[23,2577,2578],{},"Recommended to have these components selected",[23,2580,2581,2582],{},"Keep ",[30,2583,2584],{},"Git Bash Here",[23,2586,2587,2588],{},"Continue with ",[30,2589,2590],{},"Next",[11,2592,2594,2597],{"id":2593,"level":990},"windows-installer-default-editor",[118,2595,2596],{"id":2593},"Windows Installer: Default Editor",[109,2598,2599,2607],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,2600,2601],{"v-slot:left":116},[52,2602,2603],{},[281,2604],{"alt":2605,"src":2606,"variant":285},"Git for Windows installer default editor selection screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep02_default_editor.png",[114,2608,2609],{"v-slot:right":116},[20,2610,2611,2614,2619],{},[23,2612,2613],{},"Choose the editor you are comfortable with",[23,2615,2616,2618],{},[30,2617,2058],{}," or VS Code is friendlier than Vim for most beginners",[23,2620,2621],{},"This setting affects Git messages if Git opens an editor",[11,2623,2625,2628],{"id":2624,"level":990},"windows-installer-branch-name",[118,2626,2627],{"id":2624},"Windows Installer: Branch Name",[109,2629,2630,2638],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,2631,2632],{"v-slot:left":116},[52,2633,2634],{},[281,2635],{"alt":2636,"src":2637,"variant":285},"Git for Windows installer default branch name screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep03_branch_naming.png",[114,2639,2640],{"v-slot:right":116},[20,2641,2642,2647,2650],{},[23,2643,2644,2645],{},"Select the option that uses ",[30,2646,709],{},[23,2648,2649],{},"Course repositories will tell you which branch to use later",[23,2651,2652],{},"Do not create custom branch names here",[11,2654,2656,2659],{"id":2655,"level":990},"windows-installer-path",[118,2657,2658],{"id":2655},"Windows Installer: PATH",[109,2660,2661,2669],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,2662,2663],{"v-slot:left":116},[52,2664,2665],{},[281,2666],{"alt":2667,"src":2668,"variant":285},"Git for Windows installer PATH environment screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep04_path.png",[114,2670,2671],{"v-slot:right":116},[20,2672,2673,2676,2682,2685],{},[23,2674,2675],{},"Select the recommended PATH option",[23,2677,2678,2679],{},"This lets Git Bash and common tools find ",[30,2680,2681],{},"git",[23,2683,2684],{},"Avoid options that say Git Bash only",[23,2686,2687],{},"The third option can be used if you understand the consequences",[11,2689,2691,2694],{"id":2690,"level":990},"windows-installer-ssh",[118,2692,2693],{"id":2690},"Windows Installer: SSH",[109,2695,2696,2704],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,2697,2698],{"v-slot:left":116},[52,2699,2700],{},[281,2701],{"alt":2702,"src":2703,"variant":285},"Git for Windows installer SSH executable screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep05_ssh_bundled.png",[114,2705,2706],{"v-slot:right":116},[20,2707,2708,2711,2714],{},[23,2709,2710],{},"Use the bundled OpenSSH option",[23,2712,2713],{},"This keeps Git Bash SSH behavior predictable",[23,2715,2716],{},"SSH setup happens in the next lesson",[11,2718,2720,2724],{"id":2719,"level":990},"windows-installer-openssl",[118,2721,2723],{"id":2722},"windows-installer-https","Windows Installer: HTTPS",[109,2725,2726,2734],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,2727,2728],{"v-slot:left":116},[52,2729,2730],{},[281,2731],{"alt":2732,"src":2733,"variant":285},"Git for Windows installer HTTPS transport backend screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep06_openssl.png",[114,2735,2736],{"v-slot:right":116},[20,2737,2738,2741,2744],{},[23,2739,2740],{},"Keep the OpenSSL option",[23,2742,2743],{},"This is the normal Git for Windows choice",[23,2745,2746],{},"It supports secure GitHub connections",[11,2748,2750,2754],{"id":2749,"level":990},"windows-installer-checkout-style",[118,2751,2753],{"id":2752},"windows-installer-line-endings","Windows Installer: Line Endings",[109,2755,2756,2764],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,2757,2758],{"v-slot:left":116},[52,2759,2760],{},[281,2761],{"alt":2762,"src":2763,"variant":285},"Git for Windows installer line ending conversion screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep07_checkout_style.png",[114,2765,2766,2777],{"v-slot:right":116},[20,2767,2768,2771,2774],{},[23,2769,2770],{},"Keep the default line-ending option",[23,2772,2773],{},"Git handles Windows and Linux line endings for you",[23,2775,2776],{},"Do not change this unless a lesson says to",[2778,2779,2781],"admonition",{"type":2780},"note",[52,2782,2783],{},"Line-ending warnings may appear later. They are usually informational, not a sign that there's an issue.",[52,2785,2786],{},"::\n::",[11,2788,2790,2794],{"id":2789,"level":990},"windows-installer-mintty",[118,2791,2793],{"id":2792},"windows-installer-terminal-emulator","Windows Installer: Terminal Emulator",[109,2795,2796,2804],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,2797,2798],{"v-slot:left":116},[52,2799,2800],{},[281,2801],{"alt":2802,"src":2803,"variant":285},"Git for Windows installer terminal emulator screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep08_mintty.png",[114,2805,2806],{"v-slot:right":116},[20,2807,2808,2811,2814],{},[23,2809,2810],{},"Keep MinTTY selected",[23,2812,2813],{},"This is the normal Git Bash window",[23,2815,2816],{},"Course screenshots will assume this terminal style",[11,2818,2820,2824],{"id":2819,"level":990},"windows-installer-fast-forward",[118,2821,2823],{"id":2822},"windows-installer-pull-behavior","Windows Installer: Pull Behavior",[109,2825,2826,2834],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,2827,2828],{"v-slot:left":116},[52,2829,2830],{},[281,2831],{"alt":2832,"src":2833,"variant":285},"Git for Windows installer git pull behavior screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep09_ff_merge.png",[114,2835,2836],{"v-slot:right":116},[20,2837,2838,2845],{},[23,2839,2840,2841,2844],{},"Keep the default ",[30,2842,2843],{},"git pull"," behavior",[23,2846,2847],{},"Later lessons explain pull, merge, and conflicts",[11,2849,2851,2854],{"id":2850,"level":990},"windows-installer-credential-manager",[118,2852,2853],{"id":2850},"Windows Installer: Credential Manager",[109,2855,2856,2864],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,2857,2858],{"v-slot:left":116},[52,2859,2860],{},[281,2861],{"alt":2862,"src":2863,"variant":285},"Git for Windows installer credential manager screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep10_credential_manager.png",[114,2865,2866],{"v-slot:right":116},[20,2867,2868,2871,2874],{},[23,2869,2870],{},"Keep Git Credential Manager enabled",[23,2872,2873],{},"It helps with browser-based GitHub sign-in",[23,2875,2876],{},"This course still uses SSH for repo pushes",[11,2878,2880,2883],{"id":2879,"level":990},"windows-installer-extra-options",[118,2881,2882],{"id":2879},"Windows Installer: Extra Options",[109,2884,2885,2893],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,2886,2887],{"v-slot:left":116},[52,2888,2889],{},[281,2890],{"alt":2891,"src":2892,"variant":285},"Git for Windows installer extra options screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep11_extra_options_optional.png",[114,2894,2895],{"v-slot:right":116},[20,2896,2897,2905,2916,2924],{},[23,2898,2899,2900],{},"Enable file system caching\n",[20,2901,2902],{},[23,2903,2904],{},"Improves Git performance on Windows",[23,2906,2907,2908],{},"Enable symbolic links if available\n",[20,2909,2910,2913],{},[23,2911,2912],{},"Helps Git handle link-like files correctly",[23,2914,2915],{},"May require Windows Developer Mode or admin rights",[23,2917,2918,2919],{},"Skip experimental options\n",[20,2920,2921],{},[23,2922,2923],{},"They can change behavior between Git versions",[23,2925,2926],{},"Finish the installer",[11,2928,2930,2934],{"id":2929,"level":990},"step-1-open-git-bash-on-windows",[118,2931,2933],{"id":2932},"open-git-bash","Open Git Bash",[20,2935,2936,2939,2942],{},[23,2937,2938],{},"Start menu -> Git Bash",[23,2940,2941],{},"Pin it if that helps you find the same terminal later",[23,2943,2944],{},"Run the checks in the next slides from Git Bash",[11,2946,2948,2951],{"id":2947,"level":990},"windows-terminal-habit",[118,2949,2950],{"id":2947},"Windows Terminal Habit",[20,2952,2953,2956,2959],{},[23,2954,2955],{},"Use Git Bash for course commands on Windows",[23,2957,2958],{},"If another terminal opens by accident, close it and open Git Bash",[23,2960,2961],{},"Staying in one terminal makes setup problems easier to diagnose",[11,2963,2965,2968],{"id":2964,"level":14},"macos-path-terminal",[16,2966,2967],{"id":2964},"macOS Path: Terminal",[20,2969,2970,2973,2976,2979],{},[23,2971,2972],{},"Built-in Terminal is fully supported",[23,2974,2975],{},"Optional iTerm2 gives you tabs, split panes, and profiles",[23,2977,2978],{},"Beginner default: start with Terminal unless you already prefer iTerm2",[23,2980,2981],{},"See the slide below for the optional modern terminal install path",[11,2983,2985,2989],{"id":2984,"level":990},"macos-optional-iterm2-install",[118,2986,2988],{"id":2987},"optional-iterm2-install","Optional iTerm2 Install",[20,2990,2991,2998,3001,3004],{},[23,2992,2993,2994],{},"Download the stable release from ",[439,2995,2996],{"href":2996,"rel":2997},"https:\u002F\u002Fiterm2.com\u002Fdownloads.html",[443],[23,2999,3000],{},"Move iTerm2 to Applications",[23,3002,3003],{},"Open iTerm2 and run the same checks as Terminal",[23,3005,3006],{},"Use Terminal or iTerm2 consistently for course commands",[11,3008,3010,3013,3027,3030,3033],{"id":3009,"level":14},"linux-path-terminal",[16,3011,3012],{"id":3009},"Linux Path: Terminal",[20,3014,3015,3018,3021],{},[23,3016,3017],{},"Open the built-in Terminal app",[23,3019,3020],{},"Git is often installed already",[23,3022,3023,3024,3026],{},"If ",[30,3025,2492],{}," fails, use your distribution package manager",[52,3028,3029],{},"For Ubuntu:",[1748,3031],{"language":1750,"src":3032},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Flinux-path-terminal-01.sh",[20,3034,3035],{},[23,3036,3037],{},"See the slide below for the optional split-pane terminal setup",[11,3039,3041,3045,3048,3050,3053],{"id":3040,"level":990},"linux-optional-tilix-install",[118,3042,3044],{"id":3043},"optional-tilix-install","Optional Tilix Install",[52,3046,3047],{},"Tilix is a Linux terminal with split panes and profiles",[52,3049,3029],{},[1748,3051],{"language":1750,"src":3052},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Foptional-tilix-install-02.sh",[52,3054,3055],{},"Use the built-in Terminal if optional installs add friction",[11,3057,3059,3063],{"id":3058,"level":14},"step-3-confirm-git-and-shell",[16,3060,3062],{"id":3061},"confirm-git-and-shell","Confirm Git And Shell",[109,3064,3065,3079],{"gap":111,"left-width":256,"right-width":255},[114,3066,3067,3069,3072,3075],{"v-slot:left":116},[52,3068,1746],{},[1748,3070],{"language":1750,"src":3071},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fconfirm-git-and-shell-03.sh",[52,3073,3074],{},"Expected output:",[1748,3076],{"language":3077,"src":3078},"plaintext","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fexample-output-04.txt",[114,3080,3081,3084],{"v-slot:right":116},[52,3082,3083],{},"This confirms:",[20,3085,3086,3089,3092],{},[23,3087,3088],{},"Git is installed",[23,3090,3091],{},"The terminal can find Git",[23,3093,3094],{},"Your shell matches later course commands",[11,3096,3098,3102],{"id":3097,"level":14},"step-4-cli-safety-check-before-every-git-command",[16,3099,3101],{"id":3100},"check-location-before-git-commands","Check Location Before Git Commands",[109,3103,3104,3116],{"gap":111,"left-width":333,"right-width":332},[114,3105,3106,3108,3111,3113],{"v-slot:left":116},[52,3107,1746],{},[1748,3109],{"language":1750,"src":3110},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fcheck-location-before-git-commands-05.sh",[52,3112,3074],{},[1748,3114],{"language":3077,"src":3115},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fexample-output-06.txt",[114,3117,3118,3121],{"v-slot:right":116},[52,3119,3120],{},"Use this before Git commands:",[20,3122,3123,3128,3133,3136],{},[23,3124,3125,3127],{},[30,3126,1557],{}," shows the current folder",[23,3129,3130,3132],{},[30,3131,2232],{}," shows what is inside it",[23,3134,3135],{},"If the folder is wrong, fix location first",[23,3137,3138],{},"Do not run Git commands while guessing",[11,3140,3141,3143],{"id":698,"level":14},[16,3142,701],{"id":698},[109,3144,3145,3187],{"gap":111,"left-width":112,"right-width":112},[114,3146,3147],{"v-slot:left":116},[20,3148,3149,3162,3179],{},[23,3150,3151,3154],{},[30,3152,3153],{},"git: command not found",[20,3155,3156,3159],{},[23,3157,3158],{},"Git is missing, or this terminal cannot find it",[23,3160,3161],{},"Close the terminal and reopen the correct one",[23,3163,3164,3167],{},[30,3165,3166],{},"not a git repository",[20,3168,3169,3172],{},[23,3170,3171],{},"The command ran outside a cloned repository",[23,3173,2014,3174,181,3176,3178],{},[30,3175,1557],{},[30,3177,2232],{},", then move to the repo folder",[23,3180,3181,3182],{},"Wrong terminal",[20,3183,3184],{},[23,3185,3186],{},"Windows users should switch back to Git Bash",[114,3188,3189,3192],{"v-slot:right":116},[23,3190,3191],{},"Too many terminals open",[554,3193,3194,3197,3207,3212,3218],{},[23,3195,3196],{},"Close extra terminal windows",[23,3198,3199,3200],{},"Open the correct terminal\n",[20,3201,3202,3204],{},[23,3203,1514],{},[23,3205,3206],{},"Apple macOS\u002FLinux: Terminal",[23,3208,3209,3210],{},"Run ",[30,3211,2492],{},[23,3213,3209,3214,181,3216],{},[30,3215,1557],{},[30,3217,2232],{},[23,3219,3220],{},"Continue only after the folder looks right",[11,3222,3223,3225],{"id":776,"level":14},[16,3224,738],{"id":735},[109,3226,3227,3249],{"gap":111,"left-width":112,"right-width":112},[114,3228,3229,3231,3237,3243],{"v-slot:left":116},[118,3230,746],{"id":745},[52,3232,3233,3236],{},[750,3234,3235],{},"Terminal"," - A text-based interface where you type commands to control your computer",[52,3238,3239,3242],{},[750,3240,3241],{},"CLI (Command Line Interface)"," - The text-based interface where you type commands",[52,3244,3245,3248],{},[750,3246,3247],{},"Git"," - A tool for tracking changes in code files over time",[114,3250,3251,3253],{"v-slot:right":116},[118,3252,777],{"id":776},[20,3254,3255,3262,3268,3274],{},[23,3256,3257],{},[439,3258,3261],{"href":3259,"rel":3260},"https:\u002F\u002Fgit-scm.com\u002Fdownloads",[443],"Git Downloads",[23,3263,3264],{},[439,3265,3267],{"href":2540,"rel":3266},[443],"Git For Windows Install Page",[23,3269,3270],{},[439,3271,3273],{"href":2996,"rel":3272},[443],"iTerm2 Downloads",[23,3275,3276],{},[439,3277,3280],{"href":3278,"rel":3279},"https:\u002F\u002Fgnunn1.github.io\u002Ftilix-web\u002F",[443],"Tilix",[11,3282,3283,3285,3288],{"id":810,"level":14},[16,3284,813],{"id":810},[52,3286,3287],{},"Before moving on, confirm you can:",[20,3289,3290,3293,3297,3304,3307],{},[23,3291,3292],{},"Open the correct terminal for your operating system",[23,3294,3209,3295],{},[30,3296,2492],{},[23,3298,2014,3299,181,3301,3303],{},[30,3300,1557],{},[30,3302,2232],{}," to check your location",[23,3305,3306],{},"Understand what terminal\u002FCLI refers to",[23,3308,3309],{},"Keep track of terminal instances",{"title":116,"searchDepth":858,"depth":858,"links":3311},[3312,3313,3314,3329,3332,3335,3336,3337,3338,3339],{"id":1470,"depth":858,"text":1473},{"id":2503,"depth":858,"text":2504},{"id":2532,"depth":858,"text":2533,"children":3315},[3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328],{"id":2556,"depth":1381,"text":2559},{"id":2593,"depth":1381,"text":2596},{"id":2624,"depth":1381,"text":2627},{"id":2655,"depth":1381,"text":2658},{"id":2690,"depth":1381,"text":2693},{"id":2722,"depth":1381,"text":2723},{"id":2752,"depth":1381,"text":2753},{"id":2792,"depth":1381,"text":2793},{"id":2822,"depth":1381,"text":2823},{"id":2850,"depth":1381,"text":2853},{"id":2879,"depth":1381,"text":2882},{"id":2932,"depth":1381,"text":2933},{"id":2947,"depth":1381,"text":2950},{"id":2964,"depth":858,"text":2967,"children":3330},[3331],{"id":2987,"depth":1381,"text":2988},{"id":3009,"depth":858,"text":3012,"children":3333},[3334],{"id":3043,"depth":1381,"text":3044},{"id":3061,"depth":858,"text":3062},{"id":3100,"depth":858,"text":3101},{"id":698,"depth":858,"text":701},{"id":735,"depth":858,"text":738},{"id":810,"depth":858,"text":813},"Install Git and choose the correct terminal for course commands.","Face-to-face class of about 40 students; includes OS-specific terminal choices, Git installation, short checks, and setup friction.","35",{},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools",{"title":2472,"description":3340},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools",[2681,2464,1399],"21:30","u1x5bq-JmCg","https:\u002F\u002Fyoutu.be\u002Fu1x5bq-JmCg","71DrP8YI_ks4jUswWJXy9rmZOVVoeaJAEPancHNHsV4",{"id":3353,"title":3354,"audience":6,"body":3355,"contentType":879,"course":880,"description":4426,"estimateBasis":4427,"estimatedDiscussionMinutes":883,"estimatedLiveMinutes":885,"estimatedTotalMinutes":4428,"extension":886,"meta":4429,"module":888,"navigation":889,"order":1389,"path":4430,"promptAssist":892,"seo":4431,"status":894,"stem":4432,"tags":4433,"videoDuration":4437,"videoId":4438,"videoLink":4439,"videoTitle":4440,"week":888,"__hash__":4441},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh.md","Set Up GitHub SSH",{"type":8,"value":3356,"toc":4398},[3357,3381,3399,3424,3437,3464,3501,3576,3624,3691,3767,3809,3835,3867,3905,3950,3984,4053,4055,4058,4069,4141,4170,4204,4252,4298,4366],[11,3358,3359,3361],{"id":47,"level":14},[16,3360,50],{"id":47},[20,3362,3363,3366,3369,3372,3375,3378],{},[23,3364,3365],{},"Confirm Git works in the correct terminal",[23,3367,3368],{},"Sign in to GitHub with a school or personal account",[23,3370,3371],{},"Create or reuse an SSH key for GitHub",[23,3373,3374],{},"Add the public key to GitHub",[23,3376,3377],{},"Create and clone your course repository",[23,3379,3380],{},"Set Git identity inside the cloned repository",[11,3382,3384,3387,3396],{"id":3383,"level":14},"terminal-by-os",[16,3385,3386],{"id":3383},"Terminal By OS",[20,3388,3389,3391,3394],{},[23,3390,1514],{},[23,3392,3393],{},"Apple macOS: Terminal or iTerm2",[23,3395,1529],{},[52,3397,3398],{},"Run these commands on your own computer",[11,3400,3402,3405],{"id":3401,"level":14},"git-and-ssh-terms",[16,3403,3404],{"id":3401},"Git And SSH Terms",[20,3406,3407,3410,3418,3421],{},[23,3408,3409],{},"Git identity: name and email attached to commits in a repository",[23,3411,3412,3413],{},"SSH key pair: private key stays on your computer, public key goes to GitHub\n",[20,3414,3415],{},[23,3416,3417],{},"This is how we'll authenticate to GitHub",[23,3419,3420],{},"SSH agent: helper that keeps your private key available to Git commands",[23,3422,3423],{},"Clone: local folder connected to a GitHub repository",[11,3425,3427,3430,3434],{"id":3426,"level":14},"ssh-key-flow",[16,3428,3429],{"id":3426},"SSH Key Flow",[3431,3432],"mermaid",{"code":3433},"sequenceDiagram\n  participant Terminal\n  participant PrivateKey as Private key on your computer\n  participant GitHub as Public key in GitHub\n  Terminal->>PrivateKey: Load key with ssh-add\n  Terminal->>GitHub: Ask to authenticate\n  GitHub-->>Terminal: Confirm matching public key\n",[52,3435,3436],{},"GitHub receives only the public key. The private key stays on your computer",[11,3438,3440,3443],{"id":3439,"level":14},"step-1-check-git",[16,3441,3442],{"id":3439},"Step 1: Check Git",[109,3444,3445,3453],{"gap":111,"left-width":112,"right-width":112},[114,3446,3447,3449],{"v-slot:left":116},[52,3448,1746],{},[1748,3450],{"label":3451,"language":1750,"src":3452},"check-git.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-1-check-git-01.sh",[114,3454,3455,3457,3461],{"v-slot:right":116},[52,3456,3074],{},[1748,3458],{"label":3459,"language":3077,"src":3460},"example-output.txt","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-02.txt",[52,3462,3463],{},"A valid version means Git is installed and available in this terminal",[11,3465,3467,3471],{"id":3466,"level":14},"step-2-github-account",[16,3468,3470],{"id":3469},"step-2-sign-in-to-github","Step 2: Sign In To GitHub",[109,3472,3474,3493],{"gap":111,"left-width":112,"right-width":3473},"0.8fr",[114,3475,3476],{"v-slot:left":116},[20,3477,3478,3481,3484,3487,3490],{},[23,3479,3480],{},"Use an existing GitHub account or create one",[23,3482,3483],{},"School email recommended for course identity",[23,3485,3486],{},"Personal email is fine if you prefer it",[23,3488,3489],{},"Avoid work email so course access does not depend on an employer account",[23,3491,3492],{},"Confirm you can open GitHub Settings before continuing",[114,3494,3495],{"v-slot:right":116},[52,3496,3497],{},[281,3498],{"alt":3499,"src":3500,"variant":285},"GitHub account menu open with Settings visible","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fgithub-logged-in.png",[11,3502,3504,3508],{"id":3503,"level":14},"step-2-create-repo",[16,3505,3507],{"id":3506},"step-3-create-course-repository","Step 3: Create Course Repository",[109,3509,3510,3568],{"gap":111,"left-width":421,"right-width":256},[114,3511,3512,3515],{"v-slot:left":116},[52,3513,3514],{},"In GitHub:",[20,3516,3517,3522,3527,3533,3548,3554,3557,3565],{},[23,3518,300,3519],{},[30,3520,3521],{},"+",[23,3523,126,3524],{},[30,3525,3526],{},"New repository",[23,3528,3529,3530],{},"Name it ",[30,3531,3532],{},"\u003Cucid>-IT202-\u003Csection>-\u003CsemYear>",[23,3534,3535,3536,3539,3540,3543,3544,3547],{},"Semester code examples: ",[30,3537,3538],{},"S2026"," spring, ",[30,3541,3542],{},"M2026"," summer, ",[30,3545,3546],{},"F2026"," fall",[23,3549,3550,3551],{},"Set visibility to ",[30,3552,3553],{},"Private",[23,3555,3556],{},"Toggle \"Add README\"",[23,3558,3559,3560],{},"Do not toggle \"Add .gitignore\"",[20,3561,3562],{},[23,3563,3564],{},"A future lesson will discuss and add this important file",[23,3566,3567],{},"Do not add starter files unless instructed",[114,3569,3570],{"v-slot:right":116},[52,3571,3572],{},[281,3573],{"alt":3574,"src":3575,"variant":285},"GitHub new repository form with course naming pattern, private visibility, and README enabled","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fnew-repo.png",[11,3577,3579,3583,3610],{"id":3578,"level":14},"step-3-check-existing-key",[16,3580,3582],{"id":3581},"step-4-check-for-existing-ssh-key","Step 4: Check For Existing SSH Key",[109,3584,3585,3593],{"gap":111,"left-width":112,"right-width":112},[114,3586,3587,3589],{"v-slot:left":116},[52,3588,1746],{},[1748,3590],{"label":3591,"language":1750,"src":3592},"check-ssh-folder.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-3-check-for-existing-ssh-key-03.sh",[114,3594,3595,3598,3601],{"v-slot:right":116},[52,3596,3597],{},"Example output:",[1748,3599],{"label":3459,"language":3077,"src":3600},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-04.txt",[52,3602,3603,3604,181,3607],{},"Look for a matching GitHub-specific pair such as ",[30,3605,3606],{},"github_key",[30,3608,3609],{},"github_key.pub",[52,3611,3612,3613,3616,3617,713,3620,3623],{},"You can reuse an existing matching pair only if it is ",[750,3614,3615],{},"NOT"," a default key such as ",[30,3618,3619],{},"id_ed25519",[30,3621,3622],{},"id_rsa",". Otherwise, create a GitHub-specific key in the next step",[11,3625,3627,3631,3633,3637,3639,3642],{"id":3626,"level":14},"step-4-create-key-if-needed",[16,3628,3630],{"id":3629},"step-5-create-ssh-key-if-needed","Step 5: Create SSH Key If Needed",[52,3632,1746],{},[1748,3634],{"label":3635,"language":1750,"src":3636},"create-github-key.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-4-create-ssh-key-if-needed-05.sh",[52,3638,3597],{},[1748,3640],{"label":3459,"language":3077,"src":3641},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-06.txt",[20,3643,3644,3670,3675,3680],{},[23,3645,3646,3647],{},"Command flags:\n",[20,3648,3649,3655,3661],{},[23,3650,3651,3654],{},[30,3652,3653],{},"-t"," chooses the key type",[23,3656,3657,3660],{},[30,3658,3659],{},"-C"," adds a comment label, usually your GitHub email",[23,3662,3663,3665,3666,3669],{},[30,3664,2029],{}," chooses the output file path (must include ",[30,3667,3668],{},"~\u002F.ssh\u002F"," followed by the file name)",[23,3671,3672,3674],{},[30,3673,3606],{}," is the private key file",[23,3676,3677,3679],{},[30,3678,3609],{}," is the public key file for GitHub",[23,3681,3682,3683],{},"Passphrase is optional unless your instructor requires one\n",[20,3684,3685,3688],{},[23,3686,3687],{},"Pro: protects the key if someone gets the file",[23,3689,3690],{},"Con: adds an unlock prompt when the key is used",[11,3692,3694,3698,3715,3747],{"id":3693,"level":14},"step-5-start-agent-and-add-key",[16,3695,3697],{"id":3696},"step-6-start-ssh-agent-and-verify-key","Step 6: Start SSH Agent And Verify Key",[109,3699,3700,3708],{"gap":111,"left-width":333,"right-width":112},[114,3701,3702,3704],{"v-slot:left":116},[52,3703,1746],{},[1748,3705],{"label":3706,"language":1750,"src":3707},"start-agent-add-key.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-5-start-ssh-agent-and-add-key-07.sh",[114,3709,3710,3712],{"v-slot:right":116},[52,3711,3597],{},[1748,3713],{"label":3459,"language":3077,"src":3714},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-08.txt",[20,3716,3717,3723,3744],{},[23,3718,3719,3722],{},[30,3720,3721],{},"eval \"$(ssh-agent -s)\""," starts the SSH helper GitHub docs usually show",[23,3724,3725,3726,3729,3730,3733],{},"If that fails, run ",[30,3727,3728],{},"exec ssh-agent bash",", then run ",[30,3731,3732],{},"ssh-add ~\u002F.ssh\u002Fgithub_key",[20,3734,3735],{},[23,3736,2014,3737,3740,3741,3743],{},[30,3738,3739],{},"~\u002F.ssh\u002Fgithub_key"," because ",[30,3742,1654],{}," avoids issues with spaces in home directory paths",[23,3745,3746],{},"Then verify the key is loaded",[109,3748,3749,3757],{"gap":111,"left-width":112,"right-width":112},[114,3750,3751,3753],{"v-slot:left":116},[52,3752,1746],{},[1748,3754],{"label":3755,"language":1750,"src":3756},"verify-loaded-key.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fverify-loaded-key-09.sh",[114,3758,3759,3761,3764],{"v-slot:right":116},[52,3760,3074],{},[1748,3762],{"label":3459,"language":3077,"src":3763},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-10.txt",[52,3765,3766],{},"One loaded key is enough for this lesson",[11,3768,3770,3774,3791],{"id":3769,"level":14},"step-6-copy-public-key",[16,3771,3773],{"id":3772},"step-7-copy-public-key","Step 7: Copy Public Key",[109,3775,3776,3784],{"gap":111,"left-width":112,"right-width":112},[114,3777,3778,3780],{"v-slot:left":116},[52,3779,1746],{},[1748,3781],{"label":3782,"language":1750,"src":3783},"show-public-key.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-6-copy-public-key-11.sh",[114,3785,3786,3788],{"v-slot:right":116},[52,3787,3597],{},[1748,3789],{"label":3459,"language":3077,"src":3790},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-12.txt",[20,3792,3793,3803],{},[23,3794,3795,3796,3799,3800,3802],{},"Copy the full line starting with ",[30,3797,3798],{},"ssh-ed25519"," and ending with the value you set with ",[30,3801,3659],{}," earlier",[23,3804,3805,3806,3808],{},"Do not copy ",[30,3807,3606],{},", which is the private key (never share the private key)",[11,3810,3812,3816],{"id":3811,"level":14},"step-7-add-key-to-github",[16,3813,3815],{"id":3814},"step-8-add-key-to-github","Step 8: Add Key To GitHub",[20,3817,3818,3821,3826,3829,3832],{},[23,3819,3820],{},"In GitHub, open account settings",[23,3822,263,3823],{},[30,3824,3825],{},"SSH and GPG keys",[23,3827,3828],{},"Add a new authentication key",[23,3830,3831],{},"Paste the public key from the previous step",[23,3833,3834],{},"See the slides below for the GitHub screens",[11,3836,3838,3842],{"id":3837,"level":990},"step-8-open-github-settings",[118,3839,3841],{"id":3840},"open-github-settings","Open GitHub Settings",[109,3843,3844,3852],{"gap":111,"left-width":333,"right-width":332,"stack":2563},[114,3845,3846],{"v-slot:left":116},[52,3847,3848],{},[281,3849],{"alt":3850,"src":3851,"variant":285},"GitHub profile menu with Settings highlighted","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fssh-key-01-gh-menu.png",[114,3853,3854],{"v-slot:right":116},[20,3855,3856,3859,3864],{},[23,3857,3858],{},"Click your GitHub profile photo",[23,3860,126,3861],{},[30,3862,3863],{},"Settings",[23,3865,3866],{},"Use the account menu, not the repository settings",[11,3868,3870,3874],{"id":3869,"level":990},"step-8-open-ssh-keys-page",[118,3871,3873],{"id":3872},"open-ssh-and-gpg-keys","Open SSH And GPG Keys",[109,3875,3876,3884],{"gap":111,"left-width":333,"right-width":332,"stack":2563},[114,3877,3878],{"v-slot:left":116},[52,3879,3880],{},[281,3881],{"alt":3882,"src":3883,"variant":285},"GitHub settings sidebar with SSH and GPG keys selected","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fssh-key-02-gh-ssh-link.png",[114,3885,3886],{"v-slot:right":116},[20,3887,3888,3895,3900],{},[23,3889,3890,3891,3894],{},"Find the ",[30,3892,3893],{},"Access"," section",[23,3896,3897,3898],{},"Open ",[30,3899,3825],{},[23,3901,126,3902],{},[30,3903,3904],{},"New SSH key",[11,3906,3908,3912],{"id":3907,"level":990},"step-8-add-new-ssh-key",[118,3909,3911],{"id":3910},"add-new-ssh-key","Add New SSH Key",[109,3913,3915,3923],{"gap":111,"left-width":3914,"right-width":255,"stack":2563},"1.35fr",[114,3916,3917],{"v-slot:left":116},[52,3918,3919],{},[281,3920],{"alt":3921,"src":3922,"variant":285},"GitHub Add new SSH Key form with title, authentication key type, and public key field","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fssh-key-03-add-new-key.png",[114,3924,3925],{"v-slot:right":116},[20,3926,3927,3933,3939,3942,3947],{},[23,3928,3929,3930],{},"Title it clearly, such as ",[30,3931,3932],{},"\u003Ccourse> Laptop",[23,3934,3935,3936],{},"Keep key type as ",[30,3937,3938],{},"Authentication Key",[23,3940,3941],{},"Paste the full public key line",[23,3943,300,3944],{},[30,3945,3946],{},"Add SSH key",[23,3948,3949],{},"Never paste the private key",[11,3951,3953,3957],{"id":3952,"level":14},"step-8-test-auth",[16,3954,3956],{"id":3955},"step-9-test-github-ssh-access","Step 9: Test GitHub SSH Access",[109,3958,3959,3974],{"gap":111,"left-width":112,"right-width":333},[114,3960,3961,3963,3967],{"v-slot:left":116},[52,3962,1746],{},[1748,3964],{"label":3965,"language":1750,"src":3966},"test-github-ssh.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-8-test-github-ssh-access-13.sh",[52,3968,3969,3970,3973],{},"If prompted the first time, type ",[30,3971,3972],{},"yes"," to trust GitHub's host key",[114,3975,3976,3978,3981],{"v-slot:right":116},[52,3977,3074],{},[1748,3979],{"label":3459,"language":3077,"src":3980},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-14.txt",[52,3982,3983],{},"This confirms authentication, then GitHub closes the connection",[11,3985,3987,3991],{"id":3986,"level":14},"step-9-clone-repo",[16,3988,3990],{"id":3989},"step-10-clone-course-repository","Step 10: Clone Course Repository",[109,3992,3993,4034],{"gap":111,"left-width":332,"right-width":333},[114,3994,3995,3999,4028],{"v-slot:left":116},[118,3996,3998],{"id":3997},"get-the-ssh-clone-url","Get The SSH Clone URL",[20,4000,4001,4007,4014,4021],{},[23,4002,4003,4004],{},"In your GitHub repository, click ",[30,4005,4006],{},"Code",[23,4008,4009,4010,4013],{},"Choose the ",[30,4011,4012],{},"SSH"," tab",[23,4015,4016,4017,4020],{},"Copy the ",[30,4018,4019],{},"git@github.com:..."," link",[23,4022,4023,4024,4027],{},"Use that link in the ",[30,4025,4026],{},"git clone"," command",[52,4029,4030],{},[281,4031],{"alt":4032,"src":4033,"variant":285},"GitHub repository Code menu with SSH clone URL selected","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fgithub-clone-url.png",[114,4035,4036,4039,4043],{"v-slot:right":116},[52,4037,4038],{},"Run from the folder that should contain your course repo:",[1748,4040],{"label":4041,"language":1750,"src":4042},"clone-course-repository.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-9-clone-course-repository-15.sh",[2778,4044,4046],{"type":4045},"tip",[52,4047,4048,4049,4052],{},"Before cloning, run ",[30,4050,4051],{},"git rev-parse --show-toplevel",". If it prints a path, move somewhere else first. Clone this repo only once.",[52,4054,3597],{},[1748,4056],{"label":3459,"language":3077,"src":4057},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-16.txt",[52,4059,4060,4061,4064,4065,4068],{},"If you see an empty repository warning, you probably forgot to add ",[30,4062,4063],{},"README.md"," when creating the repo. Create it with ",[30,4066,4067],{},"touch README.md",", then use the add\u002Fcommit\u002Fpush commands from the next lesson\n::\n::",[11,4070,4072,4076,4095,4114,4134],{"id":4071,"level":14},"step-10-set-repo-identity",[16,4073,4075],{"id":4074},"step-11-set-repo-git-identity","Step 11: Set Repo Git Identity",[109,4077,4078,4087],{"gap":111,"left-width":112,"right-width":112},[114,4079,4080,4083],{"v-slot:left":116},[52,4081,4082],{},"Run inside the cloned repository:",[1748,4084],{"label":4085,"language":1750,"src":4086},"set-repo-identity.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-10-set-repo-git-identity-17.sh",[114,4088,4089,4091],{"v-slot:right":116},[52,4090,3074],{},[1748,4092],{"label":4093,"language":3077,"src":4094},"config-output.txt","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-19.txt",[109,4096,4097,4106],{"gap":111,"left-width":112,"right-width":112},[114,4098,4099,4102],{"v-slot:left":116},[52,4100,4101],{},"Then verify:",[1748,4103],{"label":4104,"language":1750,"src":4105},"verify-repo-identity.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-10-set-repo-git-identity-18.sh",[114,4107,4108,4110],{"v-slot:right":116},[52,4109,3074],{},[1748,4111],{"label":4112,"language":3077,"src":4113},"identity-output.txt","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-20.txt",[20,4115,4116,4122,4128],{},[23,4117,4118,4121],{},[30,4119,4120],{},"user.name"," can be your real or display name, though commonly it's your GitHub username",[23,4123,4124,4127],{},[30,4125,4126],{},"user.email"," should match a GitHub email or GitHub no-reply address for commit linking to work (this is important)",[23,4129,4130,4133],{},[30,4131,4132],{},"core.sshCommand"," tells this repository to use your course GitHub key",[52,4135,4136,4137,4140],{},"These commands set identity for this repository. The ",[30,4138,4139],{},"--global"," flag is an option only if you intentionally want the same identity for all repositories",[11,4142,4144,4148,4151,4167],{"id":4143,"level":14},"step-11-invite-collaborators",[16,4145,4147],{"id":4146},"step-12-invite-course-collaborators","Step 12: Invite Course Collaborators",[52,4149,4150],{},"In GitHub, open your course repository:",[20,4152,4153,4156,4161,4164],{},[23,4154,4155],{},"Settings -> Collaborators and teams",[23,4157,4158,4159],{},"Invite ",[30,4160,1258],{},[23,4162,4163],{},"Invite your TA if your section has one",[23,4165,4166],{},"Wait until the invitation shows as sent or accepted",[52,4168,4169],{},"This is so it can be accessed for grading and assistance",[11,4171,4173,4176],{"id":4172,"level":14},"troubleshooting-auth",[16,4174,4175],{"id":4172},"Troubleshooting Auth",[20,4177,4178,4184,4191,4198,4201],{},[23,4179,4180,4183],{},[30,4181,4182],{},"Permission denied (publickey)",": GitHub did not accept a loaded key",[23,4185,4186,4187,4190],{},"No loaded key in ",[30,4188,4189],{},"ssh-add -l",": start the agent and add the key again",[23,4192,4193,4194,4197],{},"Wrong key in GitHub: delete it and paste the ",[30,4195,4196],{},".pub"," key again",[23,4199,4200],{},"Wrong account: make sure the success message names your GitHub account",[23,4202,4203],{},"See the slide below for a quick reset sequence",[11,4205,4207,4211,4213,4240],{"id":4206,"level":990},"troubleshooting-auth-recovery",[118,4208,4210],{"id":4209},"quick-reset-sequence","Quick Reset Sequence",[52,4212,1746],{},[554,4214,4215,4219,4223,4227,4232,4235],{},[23,4216,4217],{},[30,4218,3721],{},[23,4220,4221],{},[30,4222,3732],{},[23,4224,4225],{},[30,4226,4189],{},[23,4228,4229],{},[30,4230,4231],{},"cat ~\u002F.ssh\u002Fgithub_key.pub",[23,4233,4234],{},"Re-paste the public key in GitHub if needed",[23,4236,4237],{},[30,4238,4239],{},"ssh -T git@github.com",[52,4241,3023,4242,4244,4245,4247,4248,4251],{},[30,4243,3721],{}," fails in Git Bash, use ",[30,4246,3728],{},", then repeat the ",[30,4249,4250],{},"ssh-add"," steps",[11,4253,4254,4256,4259],{"id":1316,"level":14},[16,4255,1319],{"id":1316},[52,4257,4258],{},"You are done when all are true:",[20,4260,4261,4266,4273,4278,4281,4286,4289],{},[23,4262,4263,4265],{},[30,4264,2492],{}," works",[23,4267,4268,4270,4271],{},[30,4269,4189],{}," shows ",[30,4272,3606],{},[23,4274,4275,4277],{},[30,4276,4239],{}," names your GitHub account",[23,4279,4280],{},"Your private course repository exists on GitHub",[23,4282,4283,4285],{},[30,4284,1258],{}," and your TA, if applicable, are invited as collaborators",[23,4287,4288],{},"Your local terminal is open to the cloned repository",[23,4290,4291,181,4294,4297],{},[30,4292,4293],{},"git config user.name",[30,4295,4296],{},"git config user.email"," return your repo identity",[11,4299,4300,4302],{"id":776,"level":14},[16,4301,738],{"id":735},[109,4303,4304,4332],{"gap":111,"left-width":112,"right-width":112},[114,4305,4306,4308,4314,4320,4326],{"v-slot:left":116},[118,4307,746],{"id":745},[52,4309,4310,4313],{},[750,4311,4312],{},"Git identity"," - commit name and email saved in repo config",[52,4315,4316,4319],{},[750,4317,4318],{},"SSH key pair"," - private key on your computer, public key in GitHub",[52,4321,4322,4325],{},[750,4323,4324],{},"SSH agent"," - background helper that makes your private key available",[52,4327,4328,4331],{},[750,4329,4330],{},"Clone"," - local copy of a GitHub repository",[114,4333,4334,4336],{"v-slot:right":116},[118,4335,777],{"id":776},[20,4337,4338,4345,4352,4359],{},[23,4339,4340],{},[439,4341,4344],{"href":4342,"rel":4343},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fauthentication\u002Fconnecting-to-github-with-ssh\u002Fgenerating-a-new-ssh-key-and-adding-it-to-the-ssh-agent",[443],"GitHub Docs: Generate a new SSH key and add it to the ssh-agent",[23,4346,4347],{},[439,4348,4351],{"href":4349,"rel":4350},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fauthentication\u002Fconnecting-to-github-with-ssh\u002Ftesting-your-ssh-connection",[443],"GitHub Docs: Testing your SSH connection",[23,4353,4354],{},[439,4355,4358],{"href":4356,"rel":4357},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fcreating-and-managing-repositories\u002Fcreating-a-new-repository",[443],"GitHub Docs: Create a repository",[23,4360,4361],{},[439,4362,4365],{"href":4363,"rel":4364},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fcreating-and-managing-repositories\u002Fcloning-a-repository",[443],"GitHub Docs: Cloning a repository",[11,4367,4368,4370,4372],{"id":810,"level":14},[16,4369,813],{"id":810},[52,4371,2380],{},[20,4373,4374,4377,4380,4383,4386,4389,4395],{},[23,4375,4376],{},"Use the correct terminal for your operating system",[23,4378,4379],{},"Authenticate to GitHub with SSH",[23,4381,4382],{},"Find your private course repository on GitHub",[23,4384,4385],{},"Invite course collaborators",[23,4387,4388],{},"Open the local clone in the terminal",[23,4390,4391,4392],{},"Show repo-local Git identity with ",[30,4393,4394],{},"git config",[23,4396,4397],{},"Next: practice the Git commands used for course work",{"title":116,"searchDepth":858,"depth":858,"links":4399},[4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4416,4417,4418,4419,4420,4423,4424,4425],{"id":47,"depth":858,"text":50},{"id":3383,"depth":858,"text":3386},{"id":3401,"depth":858,"text":3404},{"id":3426,"depth":858,"text":3429},{"id":3439,"depth":858,"text":3442},{"id":3469,"depth":858,"text":3470},{"id":3506,"depth":858,"text":3507},{"id":3581,"depth":858,"text":3582},{"id":3629,"depth":858,"text":3630},{"id":3696,"depth":858,"text":3697},{"id":3772,"depth":858,"text":3773},{"id":3814,"depth":858,"text":3815,"children":4412},[4413,4414,4415],{"id":3840,"depth":1381,"text":3841},{"id":3872,"depth":1381,"text":3873},{"id":3910,"depth":1381,"text":3911},{"id":3955,"depth":858,"text":3956},{"id":3989,"depth":858,"text":3990},{"id":4074,"depth":858,"text":4075},{"id":4146,"depth":858,"text":4147},{"id":4172,"depth":858,"text":4175,"children":4421},[4422],{"id":4209,"depth":1381,"text":4210},{"id":1316,"depth":858,"text":1319},{"id":735,"depth":858,"text":738},{"id":810,"depth":858,"text":813},"Connect your computer to GitHub with SSH, create the course repository, clone it, and set repo-local Git identity.","Face-to-face class of about 40 students; includes GitHub account check, SSH key generation, GitHub UI steps, repo creation, clone troubleshooting, repo-local Git identity, and authentication checks.","85",{},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh",{"title":3354,"description":4426},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh",[2681,4434,4435,4436],"github","ssh","repository","48:26","HZG3_HfczOk","https:\u002F\u002Fyoutu.be\u002FHZG3_HfczOk","Setup Git SSH and GitHub","rJ2RP6nrPEoOj98kzeevFpO0YOXaJl-M5ajP_tsjwvA",{"id":4443,"title":4444,"audience":6,"body":4445,"contentType":879,"course":880,"description":5364,"estimateBasis":5365,"estimatedDiscussionMinutes":1388,"estimatedLiveMinutes":885,"estimatedTotalMinutes":5366,"extension":886,"meta":5367,"module":888,"navigation":889,"order":5368,"path":5369,"promptAssist":892,"seo":5370,"status":894,"stem":5371,"tags":5372,"videoDuration":5375,"videoId":5376,"videoLink":5377,"videoTitle":5378,"week":888,"__hash__":5379},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs.md","Git Commands And Pull Requests",{"type":8,"value":4446,"toc":5329},[4447,4475,4496,4513,4545,4579,4630,4646,4667,4698,4730,4772,4803,4838,4862,4907,4934,4964,4982,4994,5030,5063,5099,5133,5159,5187,5217,5284,5326],[11,4448,4450,4453,4455],{"id":4449,"level":14},"objectives",[16,4451,4452],{"id":4449},"Objectives",[52,4454,54],{},[20,4456,4457,4460,4463,4466,4469,4472],{},[23,4458,4459],{},"Explain what the common Git commands do",[23,4461,4462],{},"Connect commands to the working folder, staging area, local commits, and GitHub remote",[23,4464,4465],{},"Create a branch for practice work",[23,4467,4468],{},"Stage, commit, and push a small change",[23,4470,4471],{},"Open a pull request on GitHub",[23,4473,4474],{},"Investigate a failed push and a merge conflict",[11,4476,4478,4482,4485,4488],{"id":4477,"level":14},"git-vs-github",[16,4479,4481],{"id":4480},"git-versus-github","Git Versus GitHub",[52,4483,4484],{},"Git is the tool that tracks file history",[52,4486,4487],{},"GitHub is a website that hosts a remote copy of a Git repository",[20,4489,4490,4493],{},[23,4491,4492],{},"Git: local terminal workflow",[23,4494,4495],{},"GitHub: remote branches, pull requests, issues, and project evidence",[11,4497,4499,4503,4507,4510],{"id":4498,"level":14},"git-stages",[16,4500,4502],{"id":4501},"the-git-stages","The Git Stages",[1748,4504],{"language":4505,"src":4506},"text","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fthe-git-stages-01.txt",[52,4508,4509],{},"Common commands:",[1748,4511],{"language":4505,"src":4512},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fthe-git-stages-02.txt",[11,4514,4516,4520,4522,4525,4528,4531],{"id":4515,"level":14},"status-first",[16,4517,4519],{"id":4518},"command-1-git-status","Command 1: git status",[52,4521,1746],{},[1748,4523],{"language":1750,"src":4524},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-1-git-status-03.sh",[52,4526,4527],{},"Use this before and after every important Git action",[52,4529,4530],{},"It tells you:",[20,4532,4533,4536,4539,4542],{},[23,4534,4535],{},"Current branch",[23,4537,4538],{},"Changed files",[23,4540,4541],{},"Staged files",[23,4543,4544],{},"Whether your working tree is clean",[11,4546,4548,4552,4554,4557],{"id":4547,"level":14},"branch-command",[16,4549,4551],{"id":4550},"command-2-git-branch","Command 2: git branch",[52,4553,1746],{},[1748,4555],{"language":1750,"src":4556},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-2-git-branch-04.sh",[20,4558,4559,4562,4565],{},[23,4560,4561],{},"Active branch has an asterisk",[23,4563,4564],{},"Branches are separate timelines for work",[23,4566,4567,4568],{},"Branch names are case-sensitive\n",[20,4569,4570],{},[23,4571,4572,181,4575,4578],{},[30,4573,4574],{},"Practice",[30,4576,4577],{},"practice"," are different names",[11,4580,4582,4586,4591,4594],{"id":4581,"level":14},"create-branch",[16,4583,4585],{"id":4584},"practice-step-1-create-a-branch","Practice Step 1: Create A Branch",[52,4587,4588,4589,2121],{},"Start from ",[30,4590,709],{},[1748,4592],{"language":1750,"src":4593},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpractice-step-1-create-a-05.sh",[20,4595,4596,4607],{},[23,4597,4598,4599,4601,4602],{},"First two commands: make sure ",[30,4600,709],{}," is current\n",[20,4603,4604],{},[23,4605,4606],{},"Explained more later",[23,4608,4609,4610],{},"Branch control commands\n",[20,4611,4612,4618,4624],{},[23,4613,4614,4617],{},[30,4615,4616],{},"git checkout -b practice",": create and switch",[23,4619,4620,4623],{},[30,4621,4622],{},"git branch practice",": create only",[23,4625,4626,4629],{},[30,4627,4628],{},"git checkout practice",": switch to existing",[11,4631,4633,4637,4640,4643],{"id":4632,"level":14},"make-file",[16,4634,4636],{"id":4635},"practice-step-2-make-a-small-file","Practice Step 2: Make A Small File",[52,4638,4639],{},"Create a small practice file:",[1748,4641],{"language":1750,"src":4642},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpractice-step-2-make-a-s-06.sh",[52,4644,4645],{},"Expected result: Git shows the new file as untracked",[11,4647,4649,4653,4656,4659,4662],{"id":4648,"level":14},"add-command",[16,4650,4652],{"id":4651},"command-3-git-add","Command 3: git add",[52,4654,4655],{},"Stage the new file:",[1748,4657],{"language":1750,"src":4658},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-3-git-add-07.sh",[52,4660,4661],{},"Staging means: include this change in the next commit",[20,4663,4664],{},[23,4665,4666],{},"See below for add patterns and verification checks",[11,4668,4670,4674,4677,4680],{"id":4669,"level":990},"add-variants",[118,4671,4673],{"id":4672},"common-git-add-patterns","Common git add Patterns",[52,4675,4676],{},"Use the smallest clear target when possible",[1748,4678],{"language":1750,"src":4679},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommon-git-add-patterns-08.sh",[20,4681,4682,4685,4688],{},[23,4683,4684],{},"Single file: safest when you changed one file",[23,4686,4687],{},"Folder: useful when one feature is grouped in one folder",[23,4689,4690,4693,4694,4697],{},[30,4691,4692],{},"git add .",": convenient, but review ",[30,4695,4696],{},"git status"," first",[11,4699,4701,4705,4708,4711],{"id":4700,"level":14},"diff-command",[16,4702,4704],{"id":4703},"command-4-git-diff","Command 4: git diff",[52,4706,4707],{},"Before committing, inspect what changed:",[1748,4709],{"language":1750,"src":4710},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-4-git-diff-09.sh",[20,4712,4713,4720,4723,4728],{},[23,4714,4715,4716,4719],{},"New untracked file: ",[30,4717,4718],{},"git diff"," may show nothing",[23,4721,4722],{},"That does not mean the file is missing",[23,4724,2014,4725,4727],{},[30,4726,4696],{}," to confirm untracked files",[23,4729,2183],{},[11,4731,4733,4737,4740,4743,4746,4749],{"id":4732,"level":990},"cached-rm",[118,4734,4736],{"id":4735},"if-you-staged-the-wrong-file","If You Staged The Wrong File",[52,4738,4739],{},"If a file was staged by mistake, remove it from staging:",[1748,4741],{"language":1750,"src":4742},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fif-you-staged-the-wrong--10.sh",[52,4744,4745],{},"For a folder:",[1748,4747],{"language":1750,"src":4748},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fif-you-staged-the-wrong--11.sh",[20,4750,4751,4762],{},[23,4752,4753,4756,4757],{},[30,4754,4755],{},"--cached",": remove from staging only\n",[20,4758,4759],{},[23,4760,4761],{},"Keeps the file in your working folder",[23,4763,4764,4766,4767],{},[30,4765,1493],{},": folder mode\n",[20,4768,4769],{},[23,4770,4771],{},"Recursive: include files inside the folder",[11,4773,4775,4779,4782,4785,4788],{"id":4774,"level":14},"commit-command",[16,4776,4778],{"id":4777},"command-5-git-commit","Command 5: git commit",[52,4780,4781],{},"Commit the staged file:",[1748,4783],{"language":1750,"src":4784},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-5-git-commit-12.sh",[52,4786,4787],{},"A commit is a saved checkpoint in your local repository",[20,4789,4790,4801],{},[23,4791,4792,4795,4796],{},[30,4793,4794],{},"-m",": commit message",[20,4797,4798],{},[23,4799,4800],{},"Required, even if the message is an empty string",[23,4802,2183],{},[11,4804,4806,4810,4812,4815,4835],{"id":4805,"level":990},"log-command",[118,4807,4809],{"id":4808},"check-the-local-history","Check The Local History",[52,4811,1746],{},[1748,4813],{"language":1750,"src":4814},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcheck-the-local-history-13.sh",[20,4816,4817,4823,4829],{},[23,4818,4819,4822],{},[30,4820,4821],{},"log",": show commit history",[23,4824,4825,4828],{},[30,4826,4827],{},"--oneline",": one commit per line",[23,4830,4831,4834],{},[30,4832,4833],{},"-5",": show the latest five commits",[52,4836,4837],{},"You should see your latest commit near the top",[11,4839,4841,4845,4848,4851],{"id":4840,"level":14},"push-command",[16,4842,4844],{"id":4843},"command-6-git-push","Command 6: git push",[52,4846,4847],{},"Send the branch to GitHub:",[1748,4849],{"language":1750,"src":4850},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-6-git-push-14.sh",[20,4852,4853,4859],{},[23,4854,4855,4858],{},[30,4856,4857],{},"origin",": common remote name for GitHub",[23,4860,4861],{},"Final part: branch you are pushing",[11,4863,4865,4869],{"id":4864,"level":14},"open-pr",[16,4866,4868],{"id":4867},"pull-request","Pull Request",[109,4870,4871,4899],{"gap":111,"left-width":112,"right-width":112},[114,4872,4873,4876,4879,4882,4885,4888],{"v-slot:left":116},[52,4874,4875],{},"On GitHub, open a pull request",[52,4877,4878],{},"Use this direction:",[1748,4880],{"language":4505,"src":4881},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-request-15.txt",[52,4883,4884],{},"Use a clear description:",[1748,4886],{"language":4505,"src":4887},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-request-description-16.txt",[20,4889,4890,4893,4896],{},[23,4891,4892],{},"Review page before merge",[23,4894,4895],{},"Shows what will change",[23,4897,4898],{},"Captures branch evidence",[114,4900,4901],{"v-slot:right":116},[52,4902,4903],{},[281,4904],{"alt":4905,"src":4906,"variant":285},"GitHub pull request creation page showing base main and compare practice","\u002Fimages\u002Fshared\u002Fgit-workflow\u002Fgithub-create-pull-request.png",[11,4908,4910,4914,4917,4925,4928,4931],{"id":4909,"level":14},"merge-pr",[16,4911,4913],{"id":4912},"merge-and-sync","Merge And Sync",[52,4915,4916],{},"After GitHub merge:",[20,4918,4919],{},[23,4920,4921,4922,4924],{},"Local ",[30,4923,709],{}," is not updated automatically",[52,4926,4927],{},"Sync it:",[1748,4929],{"language":1750,"src":4930},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fmerge-and-sync-15.sh",[52,4932,4933],{},"Remote changes must be pulled down intentionally",[11,4935,4937,4941,4944,4961],{"id":4936,"level":14},"why-prs",[16,4938,4940],{"id":4939},"why-pull-requests-matter","Why Pull Requests Matter",[52,4942,4943],{},"Pull requests create evidence:",[20,4945,4946,4949,4952,4955,4958],{},[23,4947,4948],{},"Which branch changed",[23,4950,4951],{},"Which files changed",[23,4953,4954],{},"What discussion or explanation was provided",[23,4956,4957],{},"Chance to review risky changes before merging",[23,4959,4960],{},"When the change was merged",[52,4962,4963],{},"For this course, pull requests are part of the workflow evidence, not just a GitHub feature",[11,4965,4967,4971,4974],{"id":4966,"level":14},"exploration-intro",[16,4968,4970],{"id":4969},"troubleshooting-explorations","Troubleshooting Explorations",[52,4972,4973],{},"The next slides use controlled problems to practice recovery",[20,4975,4976,4979],{},[23,4977,4978],{},"The goal is not avoiding every error",[23,4980,4981],{},"The goal is reading output, identifying state, and recovering without guessing",[11,4983,4985,4988,4991],{"id":4984,"level":14},"exploration-setup",[16,4986,4987],{"id":4984},"Exploration Setup",[52,4989,4990],{},"Create a conflict practice branch:",[1748,4992],{"language":1750,"src":4993},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fexploration-setup-16.sh",[11,4995,4997,5001,5007,5014,5019,5022,5025],{"id":4996,"level":14},"exploration-issue-1",[16,4998,5000],{"id":4999},"exploration-issue-1-push-rejected","Exploration Issue 1: Push Rejected",[52,5002,5003,5004],{},"On GitHub, switch to ",[30,5005,5006],{},"practice-conflict",[52,5008,5009,5010,5013],{},"Edit one line in ",[30,5011,5012],{},"myFile.txt"," directly on GitHub and commit the change",[20,5015,5016],{},[23,5017,5018],{},"Use the same line you will change locally",[52,5020,5021],{},"Back locally, edit that same line and commit:",[1748,5023],{"language":1750,"src":5024},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fexploration-issue-1-push-17.sh",[20,5026,5027],{},[23,5028,5029],{},"See the slides below for the rejected push and the pull that creates the conflict",[11,5031,5033,5037,5040],{"id":5032,"level":990},"issue-1-push-without-pulling",[118,5034,5036],{"id":5035},"try-push-without-pulling","Try Push Without Pulling",[52,5038,5039],{},"Push the local commit before pulling the GitHub commit:",[109,5041,5042,5055],{"gap":111,"left-width":112,"right-width":112},[114,5043,5044,5047],{"v-slot:left":116},[1748,5045],{"language":1750,"src":5046},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Ftry-push-without-pulling-20.sh",[20,5048,5049,5052],{},[23,5050,5051],{},"Expected result: push rejected",[23,5053,5054],{},"Reason: GitHub has a commit your local branch does not have",[114,5056,5057],{"v-slot:right":116},[52,5058,5059],{},[281,5060],{"alt":5061,"src":5062,"variant":285},"Git push rejected because the remote branch has commits that are not local yet","\u002Fimages\u002Fshared\u002Fgit-workflow\u002Fgit-push-rejected-before-pull.png",[11,5064,5066,5070],{"id":5065,"level":990},"issue-1-read-output",[118,5067,5069],{"id":5068},"pull-the-remote-change","Pull The Remote Change",[109,5071,5072,5091],{"gap":111,"left-width":112,"right-width":112},[114,5073,5074,5077,5080,5083,5088],{"v-slot:left":116},[52,5075,5076],{},"The usual next command is:",[1748,5078],{"language":1750,"src":5079},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-the-remote-change-20.sh",[52,5081,5082],{},"If Git asks how to reconcile divergent branches:",[20,5084,5085],{},[23,5086,5087],{},"Use merge behavior for this course practice",[1748,5089],{"language":1750,"src":5090},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-the-remote-change-21.sh",[114,5092,5093],{"v-slot:right":116},[52,5094,5095],{},[281,5096],{"alt":5097,"src":5098,"variant":285},"Git pull output asking how to reconcile divergent branches","\u002Fimages\u002Fshared\u002Fgit-workflow\u002Fgit-pull-divergent-branches.png",[11,5100,5102,5106,5109,5113,5116,5119,5122],{"id":5101,"level":14},"exploration-issue-2",[16,5103,5105],{"id":5104},"exploration-issue-2-merge-conflict","Exploration Issue 2: Merge Conflict",[52,5107,5108],{},"After pulling, Git should report a conflict",[52,5110,3897,5111],{},[30,5112,5012],{},[52,5114,5115],{},"You may see markers like:",[1748,5117],{"language":4505,"src":5118},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fexploration-issue-2-merg-18.txt",[52,5120,5121],{},"Conflict markers show:",[20,5123,5124,5127,5130],{},[23,5125,5126],{},"Your local version",[23,5128,5129],{},"The GitHub version",[23,5131,5132],{},"The part Git could not combine automatically",[11,5134,5136,5140,5146,5149,5152,5155],{"id":5135,"level":990},"resolve-conflict",[118,5137,5139],{"id":5138},"resolve-the-conflict","Resolve The Conflict",[52,5141,5142,5143,5145],{},"Edit ",[30,5144,5012],{}," so it contains the final text you want",[52,5147,5148],{},"Remove all conflict markers",[52,5150,5151],{},"Then run:",[1748,5153],{"language":1750,"src":5154},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fresolve-the-conflict-19.sh",[20,5156,5157],{},[23,5158,2183],{},[11,5160,5162,5166,5169],{"id":5161,"level":990},"verify-conflict-resolution",[118,5163,5165],{"id":5164},"verify-the-recovery","Verify The Recovery",[52,5167,5168],{},"Check:",[20,5170,5171,5176,5179,5184],{},[23,5172,5173,5175],{},[30,5174,4696],{}," is clean",[23,5177,5178],{},"GitHub shows the updated branch",[23,5180,5181,5183],{},[30,5182,5012],{}," contains the final text",[23,5185,5186],{},"No conflict markers remain",[11,5188,5189,5191],{"id":698,"level":14},[16,5190,701],{"id":698},[20,5192,5193,5196,5199,5202,5205,5214],{},[23,5194,5195],{},"Committing on the wrong branch",[23,5197,5198],{},"Forgetting to push after committing",[23,5200,5201],{},"Forgetting to pull after merging on GitHub",[23,5203,5204],{},"Leaving conflict markers in a file",[23,5206,5207,5208,713,5211],{},"Using vague branch names like ",[30,5209,5210],{},"stuff",[30,5212,5213],{},"final",[23,5215,5216],{},"Making several unrelated changes in one commit",[11,5218,5219,5221],{"id":776,"level":14},[16,5220,738],{"id":735},[109,5222,5223,5247],{"gap":111,"left-width":112,"right-width":112},[114,5224,5225,5227],{"v-slot:left":116},[118,5226,746],{"id":745},[20,5228,5229,5232,5235,5238,5241,5244],{},[23,5230,5231],{},"Working folder: files you can edit",[23,5233,5234],{},"Staging area: changes selected for the next commit",[23,5236,5237],{},"Commit: local saved checkpoint",[23,5239,5240],{},"Remote: GitHub copy of the repository",[23,5242,5243],{},"Pull request: GitHub page for reviewing and merging branch work",[23,5245,5246],{},"Conflict: a change Git cannot merge automatically",[114,5248,5249,5251],{"v-slot:right":116},[118,5250,777],{"id":776},[20,5252,5253,5261,5268,5276],{},[23,5254,5255,5256],{},"Pro Git Book: ",[439,5257,5260],{"href":5258,"rel":5259},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGit-Basics-Getting-a-Git-Repository",[443],"Git Basics",[23,5262,5255,5263],{},[439,5264,5267],{"href":5265,"rel":5266},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGit-Branching-Basic-Branching-and-Merging",[443],"Basic Branching and Merging",[23,5269,5270,5271],{},"GitHub Docs: ",[439,5272,5275],{"href":5273,"rel":5274},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpull-requests\u002Fcollaborating-with-pull-requests\u002Fproposing-changes-to-your-work-with-pull-requests\u002Fcreating-a-pull-request",[443],"Creating a pull request",[23,5277,5278,5279],{},"Oh Shit, Git!?!: ",[439,5280,5283],{"href":5281,"rel":5282},"https:\u002F\u002Fohshitgit.com\u002F",[443],"Common Git recovery situations",[11,5285,5286,5288],{"id":810,"level":14},[16,5287,813],{"id":810},[109,5289,5292,5316],{"gap":886,"left-width":5290,"right-width":5291},"0.72fr","1.38fr",[114,5293,5294,5296],{"v-slot:left":116},[52,5295,2380],{},[20,5297,5298,5304,5307,5310,5313],{},[23,5299,5300,5301,5303],{},"Read ",[30,5302,4696],{}," before choosing the next command",[23,5305,5306],{},"Move a change from working folder to staging area to commit",[23,5308,5309],{},"Push a branch to GitHub and open a pull request",[23,5311,5312],{},"Recognize when a failed push or conflict needs recovery",[23,5314,5315],{},"Next: open the cloned repository in VS Code",[114,5317,5318,5321],{"v-slot:right":116},[52,5319,5320],{},"Git\u002FGitHub flow:",[5322,5323],"figure-image",{"alt":5324,"src":5325},"Lane diagram showing local Git commands moving from the base branch to a feature or homework branch, then pushing to GitHub for pull request review and merge, then pulling the base branch back locally","\u002Fimages\u002Fshared\u002Fgit-github-lane-flow.svg",[52,5327,5328],{},"::",{"title":116,"searchDepth":858,"depth":858,"links":5330},[5331,5332,5333,5334,5335,5336,5337,5338,5341,5344,5347,5348,5349,5350,5351,5352,5353,5357,5361,5362,5363],{"id":4449,"depth":858,"text":4452},{"id":4480,"depth":858,"text":4481},{"id":4501,"depth":858,"text":4502},{"id":4518,"depth":858,"text":4519},{"id":4550,"depth":858,"text":4551},{"id":4584,"depth":858,"text":4585},{"id":4635,"depth":858,"text":4636},{"id":4651,"depth":858,"text":4652,"children":5339},[5340],{"id":4672,"depth":1381,"text":4673},{"id":4703,"depth":858,"text":4704,"children":5342},[5343],{"id":4735,"depth":1381,"text":4736},{"id":4777,"depth":858,"text":4778,"children":5345},[5346],{"id":4808,"depth":1381,"text":4809},{"id":4843,"depth":858,"text":4844},{"id":4867,"depth":858,"text":4868},{"id":4912,"depth":858,"text":4913},{"id":4939,"depth":858,"text":4940},{"id":4969,"depth":858,"text":4970},{"id":4984,"depth":858,"text":4987},{"id":4999,"depth":858,"text":5000,"children":5354},[5355,5356],{"id":5035,"depth":1381,"text":5036},{"id":5068,"depth":1381,"text":5069},{"id":5104,"depth":858,"text":5105,"children":5358},[5359,5360],{"id":5138,"depth":1381,"text":5139},{"id":5164,"depth":1381,"text":5165},{"id":698,"depth":858,"text":701},{"id":735,"depth":858,"text":738},{"id":810,"depth":858,"text":813},"Practice the core Git workflow with small changes, branches, pull requests, and two guided troubleshooting scenarios.","Face-to-face class of about 40 students; includes command explanation, branch practice, pull request walkthrough, conflict exploration, and recovery discussion.","90",{},"40","\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs",{"title":4444,"description":5364},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs",[2681,5373,5374],"branches","pull-requests","48:54","MOa9zIUOqaI","https:\u002F\u002Fyoutu.be\u002FMOa9zIUOqaI","Git Commands and PRs","GTIGHU5IyAE7RcRy68evvCM5YPZVDAWUbiTdBfC9nCI",{"id":5381,"title":5382,"audience":6,"body":5383,"contentType":879,"course":880,"description":6153,"estimateBasis":6154,"estimatedDiscussionMinutes":1387,"estimatedLiveMinutes":1389,"estimatedTotalMinutes":5368,"extension":886,"meta":6155,"module":888,"navigation":889,"order":6156,"path":6157,"promptAssist":892,"seo":6158,"status":894,"stem":6159,"tags":6160,"videoDuration":6164,"videoId":6165,"videoLink":6166,"videoTitle":6167,"week":888,"__hash__":6168},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment.md","Local Development Environment Setup",{"type":8,"value":5384,"toc":6131},[5385,5402,5420,5441,5466,5501,5533,5611,5687,5788,5816,5881,5958,5982,6009,6027,6051,6102],[11,5386,5388,5391],{"id":5387,"level":14},"local-development-environment-title",[16,5389,5382],{"id":5390},"local-development-environment-setup",[20,5392,5393,5396,5399],{},[23,5394,5395],{},"VS Code for editing course files",[23,5397,5398],{},"Course profile for Internet Applications extensions",[23,5400,5401],{},"Optional local PHP check on your own computer",[11,5403,5404,5406],{"id":1470,"level":14},[16,5405,1473],{"id":1470},[20,5407,5408,5411,5414,5417],{},[23,5409,5410],{},"Install VS Code",[23,5412,5413],{},"Open the course repository root",[23,5415,5416],{},"Install the required extensions for the course",[23,5418,5419],{},"Have a local php install as a light weight dev server (as a backup for the VM lessons)",[11,5421,5423,5426],{"id":5422,"level":14},"what-this-setup-does",[16,5424,5425],{"id":5422},"What This Setup Does",[20,5427,5428,5431,5434],{},[23,5429,5430],{},"VS Code: editor for course files",[23,5432,5433],{},"Extensions: syntax help, Git visibility, database viewing, time tracking",[23,5435,5436,5437,5440],{},"Optional host PHP: quick ",[30,5438,5439],{},"php -v"," check and editor support",[11,5442,5444,5447],{"id":5443,"level":14},"step-1-install-vs-code",[16,5445,5446],{"id":5443},"Step 1: Install VS Code",[20,5448,5449,5457,5460,5463],{},[23,5450,5451,5452],{},"Download: ",[439,5453,5456],{"href":5454,"rel":5455},"https:\u002F\u002Fcode.visualstudio.com\u002FDownload",[443],"Visual Studio Code",[23,5458,5459],{},"Install like a normal desktop app",[23,5461,5462],{},"Do not install VS Code inside your repository folder",[23,5464,5465],{},"VS Code is the editor; the repo is the workspace folder",[11,5467,5469,5472,5475,5498],{"id":5468,"level":14},"step-2-open-the-repository",[16,5470,5471],{"id":5468},"Step 2: Open The Repository",[52,5473,5474],{},"After the course repo is cloned:",[20,5476,5477,5487,5490,5495],{},[23,5478,5479,5480,5483,5484],{},"VS Code -> ",[30,5481,5482],{},"File"," -> ",[30,5485,5486],{},"Open Folder",[23,5488,5489],{},"Choose the repository root",[23,5491,5492,5493],{},"Folder name should match ",[30,5494,3532],{},[23,5496,5497],{},"Trust the workspace only if it is your cloned GitHub repo",[52,5499,5500],{},"Do not open a ZIP copy or clone the same repo again",[11,5502,5504,5508,5530],{"id":5503,"level":14},"step-3-create-course-profile",[16,5505,5507],{"id":5506},"step-3-create-a-course-profile","Step 3: Create A Course Profile",[20,5509,5510,5516,5524,5527],{},[23,5511,5512,5513],{},"Gear icon -> ",[30,5514,5515],{},"Profiles",[23,5517,5518,5519,713,5521],{},"Create ",[30,5520,880],{},[30,5522,5523],{},"PHP",[23,5525,5526],{},"Switch into that profile",[23,5528,5529],{},"Install course extensions there",[52,5531,5532],{},"Profiles keep this course setup separate from other projects",[11,5534,5536,5539,5543],{"id":5535,"level":14},"step-4-install-extensions",[16,5537,5538],{"id":5535},"Step 4: Install Extensions",[118,5540,5542],{"id":5541},"start-with-these","Start With These",[20,5544,5545,5553,5561,5569,5577,5585,5600,5608],{},[23,5546,5547,5548],{},"Auto Rename Tag (Jun Han)\n",[20,5549,5550],{},[23,5551,5552],{},"Auto-completes matching HTML tags while you edit",[23,5554,5555,5556],{},"Bracket Lens (wraith13)\n",[20,5557,5558],{},[23,5559,5560],{},"Adds readability cues for closing brackets",[23,5562,5563,5564],{},"GitLens (GitKraken)\n",[20,5565,5566],{},[23,5567,5568],{},"Required: Git history, blame, and branch visibility in-editor",[23,5570,5571,5572],{},"MySQL (cweijan)\n",[20,5573,5574],{},[23,5575,5576],{},"Required later: connect to and inspect course database tables",[23,5578,5579,5580],{},"PHP Intelephense (Ben Mewburn)\n",[20,5581,5582],{},[23,5583,5584],{},"PHP language support, syntax checks, and warnings",[23,5586,5587,5588],{},"Todo Tree (Gruntfuggly)\n",[20,5589,5590],{},[23,5591,5592,5593,168,5596,5599],{},"Finds and lists ",[30,5594,5595],{},"TODO",[30,5597,5598],{},"FIXME",", and similar comments",[23,5601,5602,5603],{},"WakaTime\n",[20,5604,5605],{},[23,5606,5607],{},"Required in sections that use time tracking; needs your API key",[23,5609,5610],{},"See the slides below for MySQL and WakaTime setup",[11,5612,5614,5618],{"id":5613,"level":990},"step-4a-setup-mysql-extension",[16,5615,5617],{"id":5616},"step-4a-configure-mysql-extension","Step 4A: Configure MySQL Extension",[109,5619,5621,5679],{"gap":111,"left-width":332,"right-width":333,"align":5620},"center",[114,5622,5623,5627],{"v-slot:left":116},[118,5624,5626],{"id":5625},"connection-settings","Connection Settings",[20,5628,5629,5632,5676],{},[23,5630,5631],{},"Open the MySQL panel from the VS Code sidebar",[23,5633,5634,5635],{},"Create a new connection with your course database details",[20,5636,5637,5643,5649,5652,5655],{},[23,5638,5639,5640],{},"Host: ",[30,5641,5642],{},"db.ethereallab.app",[23,5644,5645,5646],{},"Port: ",[30,5647,5648],{},"3306",[23,5650,5651],{},"Username: your UCID",[23,5653,5654],{},"Database: your UCID",[23,5656,5657,5658],{},"Password: from your generated connection string\n",[20,5659,5660,5667],{},[23,5661,5662,5663],{},"Get it from the ",[439,5664,5666],{"href":441,"rel":5665},[443],"course database page",[23,5668,5669,5670,181,5673],{},"Use the 12 characters between ",[30,5671,5672],{},"ucid:",[30,5674,5675],{},"@",[23,5677,5678],{},"Save this connection; you will reuse it in later database lessons",[114,5680,5681],{"v-slot:right":116},[52,5682,5683],{},[281,5684],{"alt":5685,"src":5686,"variant":285},"MySQL extension connection setup for the course database","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fmysql-setup.png",[11,5688,5690,5694],{"id":5689,"level":990},"step-4b-setup-wakatime",[16,5691,5693],{"id":5692},"step-4b-configure-wakatime","Step 4B: Configure WakaTime",[109,5695,5696,5751],{"gap":111,"left-width":421,"right-width":422,"align":5620},[114,5697,5698,5702],{"v-slot:left":116},[118,5699,5701],{"id":5700},"setup-order","Setup Order",[20,5703,5704,5711,5714,5717,5720,5723,5740,5745,5748],{},[23,5705,263,5706],{},[439,5707,5710],{"href":5708,"rel":5709},"https:\u002F\u002Fwakatime.com\u002Fsignup",[443],"WakaTime",[23,5712,5713],{},"Create or open your account",[23,5715,5716],{},"Copy your API key from account settings",[23,5718,5719],{},"In VS Code, search Extensions for WakaTime",[23,5721,5722],{},"Install the WakaTime extension",[23,5724,5725,5726],{},"Open Command Palette:",[20,5727,5728,5734],{},[23,5729,5730,5731],{},"Windows\u002FLinux: ",[30,5732,5733],{},"Ctrl+Shift+P",[23,5735,5736,5737],{},"macOS: ",[30,5738,5739],{},"Cmd+Shift+P",[23,5741,3209,5742],{},[30,5743,5744],{},"WakaTime: API Key",[23,5746,5747],{},"Paste your API key",[23,5749,5750],{},"Restart VS Code if tracking does not appear right away",[114,5752,5753,5758,5765,5770,5777,5782],{"v-slot:right":116},[554,5754,5755],{},[23,5756,5757],{},"WakaTime account settings:",[52,5759,5760],{},[281,5761],{"alt":5762,"src":5763,"variant":285,"max-height":5764},"WakaTime account settings API key detail","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fwakatime\u002Fsettings-api-key-detail.png","14rem",[554,5766,5767],{"start":858},[23,5768,5769],{},"VS Code extension search:",[52,5771,5772],{},[281,5773],{"alt":5774,"src":5775,"variant":285,"max-height":5776},"VS Code Extensions search results showing WakaTime","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fwakatime\u002Fvs-code-search.png","9rem",[554,5778,5779],{"start":1381},[23,5780,5781],{},"VS Code API key command:",[52,5783,5784],{},[281,5785],{"alt":5786,"src":5787,"variant":285,"max-height":5776},"Command Palette with WakaTime API key command","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fwakatime\u002Fvs-code-prompt.png",[11,5789,5791,5794],{"id":5790,"level":14},"step-5-optional-local-php",[16,5792,5793],{"id":5790},"Step 5: Optional Local PHP",[20,5795,5796,5799,5802,5810,5813],{},[23,5797,5798],{},"Useful for editor support",[23,5800,5801],{},"Useful for quick terminal checks",[23,5803,5804,5805],{},"Not the main course runtime\n",[20,5806,5807],{},[23,5808,5809],{},"Viable backup solution if VM lesson has issues",[23,5811,5812],{},"VM and Render still run the real app path",[23,5814,5815],{},"See the slides below for OS-specific install notes",[11,5817,5819,5822],{"id":5818,"level":990},"step-5a-windows-php-zip",[16,5820,5821],{"id":5818},"Step 5A: Windows PHP ZIP",[109,5823,5824,5855],{"gap":111,"left-width":112,"right-width":112},[114,5825,5826,5830],{"v-slot:left":116},[118,5827,5829],{"id":5828},"download-and-extract","Download And Extract",[20,5831,5832,5835,5845,5850],{},[23,5833,5834],{},"Download PHP for Windows as a ZIP",[23,5836,5837,5838],{},"Extract it outside your repository",[20,5839,5840],{},[23,5841,1640,5842],{},[30,5843,5844],{},"C:\\tools\\php",[23,5846,5847,5848],{},"Add that extracted PHP folder to the user ",[30,5849,2331],{},[23,5851,5852,5853],{},"Restart Git Bash, PowerShell, and VS Code after editing ",[30,5854,2331],{},[114,5856,5857,5861,5877],{"v-slot:right":116},[118,5858,5860],{"id":5859},"visual-checks","Visual Checks",[20,5862,5863,5869,5874],{},[23,5864,5865,5866],{},"The extracted folder contains ",[30,5867,5868],{},"php.exe",[23,5870,5871,5872],{},"The Path entry points to the folder, not to ",[30,5873,5868],{},[23,5875,5876],{},"A new terminal can run:",[1748,5878],{"language":1750,"src":5879,"label":5880},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment\u002Fwindows-php-path-check-03.sh","windows-php-check.sh",[11,5882,5884,5887],{"id":5883,"level":990},"step-5b-macos-homebrew-php",[16,5885,5886],{"id":5883},"Step 5B: macOS Homebrew PHP",[109,5888,5889,5920],{"gap":111,"left-width":112,"right-width":112},[114,5890,5891,5895],{"v-slot:left":116},[118,5892,5894],{"id":5893},"install-homebrew","Install Homebrew",[20,5896,5897,5900,5908,5911,5914,5917],{},[23,5898,5899],{},"Open Terminal",[23,5901,5902,5903],{},"Copy the install command from ",[439,5904,5907],{"href":5905,"rel":5906},"https:\u002F\u002Fbrew.sh\u002F",[443],"brew.sh",[23,5909,5910],{},"Expect Terminal to ask for your Mac password",[23,5912,5913],{},"Expect Homebrew to mention Command Line Tools if needed",[23,5915,5916],{},"At the end, Homebrew may print \"Next steps\"",[23,5918,5919],{},"Run those \"Next steps\" commands if shown",[114,5921,5922,5926,5930,5933],{"v-slot:right":116},[118,5923,5925],{"id":5924},"then-install-php","Then Install PHP",[1748,5927],{"language":1750,"src":5928,"label":5929},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment\u002Fmacos-install-php-homebrew-04.sh","macos-php.sh",[52,5931,5932],{},"Look for:",[20,5934,5935,5941,5946,5952],{},[23,5936,5937,5940],{},[30,5938,5939],{},"brew --version"," prints a version",[23,5942,5943,5945],{},[30,5944,5439],{}," prints PHP 8 output",[23,5947,5948,5949],{},"Apple Silicon Macs commonly use ",[30,5950,5951],{},"\u002Fopt\u002Fhomebrew",[23,5953,5954,5955],{},"Intel Macs commonly use ",[30,5956,5957],{},"\u002Fusr\u002Flocal",[11,5959,5961,5965,5967,5971],{"id":5960,"level":990},"step-5c-linux-php-cli",[16,5962,5964],{"id":5963},"step-5c-ubuntulinux-php-cli","Step 5C: Ubuntu\u002FLinux PHP CLI",[52,5966,1746],{},[1748,5968],{"language":1750,"src":5969,"label":5970},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment\u002Flinux-install-php-cli-05.sh","linux-php.sh",[20,5972,5973,5976,5979],{},[23,5974,5975],{},"This installs command-line PHP",[23,5977,5978],{},"This is only for local terminal checks",[23,5980,5981],{},"The later VM lesson installs Apache, PHP, and MySQL together",[11,5983,5985,5988,5990,5993,5995,5998],{"id":5984,"level":14},"step-6-verify-optional-php",[16,5986,5987],{"id":5984},"Step 6: Verify Optional PHP",[52,5989,1746],{},[1748,5991],{"language":1750,"src":5992},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment\u002Fstep-6-verify-optional-p-01.sh",[52,5994,3597],{},[1748,5996],{"language":4505,"src":5997},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment\u002Fexample-output-02.txt",[20,5999,6000,6003,6006],{},[23,6001,6002],{},"Exact version can differ",[23,6004,6005],{},"PHP 8 output means the terminal can find PHP",[23,6007,6008],{},"Windows may need a terminal or VS Code restart after PATH changes",[11,6010,6011,6013],{"id":698,"level":14},[16,6012,701],{"id":698},[20,6014,6015,6018,6021,6024],{},[23,6016,6017],{},"Installing tools inside the repository folder",[23,6019,6020],{},"Opening the parent folder instead of the repo root",[23,6022,6023],{},"Editing a ZIP copy instead of the cloned repo",[23,6025,6026],{},"Installing extensions in the wrong VS Code profile",[11,6028,6029,6031],{"id":1316,"level":14},[16,6030,1319],{"id":1316},[20,6032,6033,6036,6039,6042,6045],{},[23,6034,6035],{},"VS Code opens your course repository root",[23,6037,6038],{},"Course profile is active",[23,6040,6041],{},"PHP Intelephense is installed",[23,6043,6044],{},"GitLens is installed",[23,6046,6047,6048,6050],{},"Optional: ",[30,6049,5439],{}," prints a PHP 8 version",[11,6052,6053,6055],{"id":735,"level":14},[16,6054,738],{"id":735},[109,6056,6057,6075],{"gap":111,"left-width":112,"right-width":112},[114,6058,6059,6061],{"v-slot:left":116},[118,6060,746],{"id":745},[20,6062,6063,6066,6069,6072],{},[23,6064,6065],{},"IDE: editor with development tools",[23,6067,6068],{},"Extension: add-on that changes VS Code behavior",[23,6070,6071],{},"Profile: saved VS Code setup",[23,6073,6074],{},"PATH: system setting used to find commands",[114,6076,6077,6079],{"v-slot:right":116},[118,6078,777],{"id":776},[20,6080,6081,6088,6095],{},[23,6082,6083],{},[439,6084,6087],{"href":6085,"rel":6086},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fintrovideos\u002Fbasics",[443],"VS Code Getting Started",[23,6089,6090],{},[439,6091,6094],{"href":6092,"rel":6093},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fconfigure\u002Fprofiles",[443],"VS Code Profiles",[23,6096,6097],{},[439,6098,6101],{"href":6099,"rel":6100},"https:\u002F\u002Fwww.php.net\u002Fmanual\u002Fen\u002Finstall.php",[443],"PHP Installation",[11,6103,6104,6106],{"id":810,"level":14},[16,6105,813],{"id":810},[20,6107,6108,6111,6114,6117,6128],{},[23,6109,6110],{},"VS Code installed as the course editor",[23,6112,6113],{},"Repository opens from its root folder",[23,6115,6116],{},"Course extensions live in a course profile",[23,6118,6119,6120],{},"Local PHP is optional for this Internet Applications path\n",[20,6121,6122,6125],{},[23,6123,6124],{},"Summer 2026 added information about VM setup in a future lesson to teach clearer Apache\u002FMySQL topics",[23,6126,6127],{},"VM, Apache, Render QA, and Render production remain the real runtime checks",[23,6129,6130],{},"Next: copy the instructor template into the repository",{"title":116,"searchDepth":858,"depth":858,"links":6132},[6133,6134,6135,6136,6137,6138,6139,6142,6143,6144,6145,6146,6147,6148,6149,6150,6151,6152],{"id":5390,"depth":858,"text":5382},{"id":1470,"depth":858,"text":1473},{"id":5422,"depth":858,"text":5425},{"id":5443,"depth":858,"text":5446},{"id":5468,"depth":858,"text":5471},{"id":5506,"depth":858,"text":5507},{"id":5535,"depth":858,"text":5538,"children":6140},[6141],{"id":5541,"depth":1381,"text":5542},{"id":5616,"depth":858,"text":5617},{"id":5692,"depth":858,"text":5693},{"id":5790,"depth":858,"text":5793},{"id":5818,"depth":858,"text":5821},{"id":5883,"depth":858,"text":5886},{"id":5963,"depth":858,"text":5964},{"id":5984,"depth":858,"text":5987},{"id":698,"depth":858,"text":701},{"id":1316,"depth":858,"text":1319},{"id":735,"depth":858,"text":738},{"id":810,"depth":858,"text":813},"Set up VS Code, course extensions, and optional local PHP checks.","First-pass timing estimate for VS Code installation, extension profile setup, optional PHP verification, and beginner folder checks.",{},"50","\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment",{"title":5382,"description":6153},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment",[6161,6162,6163],"vscode","local-development","php","44:26","0s1N-m3LABc","https:\u002F\u002Fyoutu.be\u002F0s1N-m3LABc","Local Development Environment setup","X5U0DDKjg7X7HrYtDDcsE4QqlBLimZ9weKgnZlc8H2s",{"id":6170,"title":6171,"audience":6,"body":6172,"contentType":879,"course":880,"description":7215,"estimateBasis":7216,"estimatedDiscussionMinutes":883,"estimatedLiveMinutes":2457,"estimatedTotalMinutes":7217,"extension":886,"meta":7218,"module":888,"navigation":889,"order":7217,"path":7219,"promptAssist":892,"seo":7220,"status":894,"stem":7221,"tags":7222,"videoDuration":7223,"videoId":7224,"videoLink":7225,"videoTitle":7226,"week":888,"__hash__":7227},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository.md","Add Instructor Template To Your Repository",{"type":8,"value":6173,"toc":7187},[6174,6203,6245,6273,6306,6337,6381,6473,6517,6562,6607,6652,6724,6783,6852,6906,6982,7050,7082,7134,7158],[11,6175,6176,6178,6181],{"id":4449,"level":14},[16,6177,4452],{"id":4449},[52,6179,6180],{},"By the end, you should have:",[20,6182,6183,6186,6189,6195,6200],{},[23,6184,6185],{},"Cloned course repository open in the terminal",[23,6187,6188],{},"Starter template copied into the repository root",[23,6190,6191,6192],{},"Baseline commit on ",[30,6193,6194],{},"Module01-Course-Template",[23,6196,6197,6198],{},"Pull request merged into ",[30,6199,709],{},[23,6201,6202],{},"Clean working tree before moving on",[11,6204,6206,6210],{"id":6205,"level":14},"step-1-open-clone",[16,6207,6209],{"id":6208},"step-1-open-the-cloned-repository","Step 1: Open The Cloned Repository",[109,6211,6212,6220],{"gap":111,"left-width":112,"right-width":112},[114,6213,6214,6216],{"v-slot:left":116},[52,6215,1746],{},[1748,6217],{"language":1750,"src":6218,"label":6219},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-1-open-the-cloned-repository-01.sh","open-cloned-repository.sh",[114,6221,6222,6224,6227],{"v-slot:right":116},[52,6223,3597],{},[1748,6225],{"language":3077,"src":6226,"label":3459},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fopen-cloned-repository-output.txt",[20,6228,6229,6234,6239],{},[23,6230,6231,6233],{},[30,6232,1557],{},": current working directory",[23,6235,6236,6238],{},[30,6237,4696],{},": current branch and file state",[23,6240,6241,6242,6244],{},"Important check: ",[30,6243,1557],{}," ends with your repository folder",[11,6246,6248,6252,6255,6258],{"id":6247,"level":14},"step-2-open-vscode",[16,6249,6251],{"id":6250},"step-2-open-the-repository-root","Step 2: Open The Repository Root",[52,6253,6254],{},"Run from inside the cloned repository folder:",[1748,6256],{"language":1750,"src":6257},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-2-open-the-reposito-01.sh",[20,6259,6260,6265,6270],{},[23,6261,6262,6264],{},[30,6263,30],{},": opens VS Code from the terminal",[23,6266,6267,6269],{},[30,6268,1622],{}," means \"this current folder\"",[23,6271,6272],{},"VS Code should show your repository folder, not the parent folder",[11,6274,6276,6280],{"id":6275,"level":14},"step-3-download-template",[16,6277,6279],{"id":6278},"step-3-download-the-instructor-template","Step 3: Download The Instructor Template",[20,6281,6282,6294,6297,6300,6303],{},[23,6283,6284,6285],{},"Open the instructor template repository",[20,6286,6287],{},[23,6288,6289],{},[439,6290,6293],{"href":6291,"rel":6292},"https:\u002F\u002Fgithub.com\u002FMattToegel\u002FIT202-2026",[443],"IT202-2026",[23,6295,6296],{},"Download the ZIP",[23,6298,6299],{},"Extract the ZIP",[23,6301,6302],{},"Copy scaffold contents into your repository root",[23,6304,6305],{},"See the slide below for the copy rule",[11,6307,6309,6313,6316,6319,6334],{"id":6308,"level":990},"template-copy-rule",[118,6310,6312],{"id":6311},"copy-rule","Copy Rule",[52,6314,6315],{},"Copy the contents of the extracted template folder",[52,6317,6318],{},"Do not copy:",[20,6320,6321,6324,6331],{},[23,6322,6323],{},"The extracted wrapper folder as one extra nested folder",[23,6325,6326,6327,6330],{},"The template repository's hidden ",[30,6328,6329],{},".git"," folder",[23,6332,6333],{},"Old files from a different semester",[52,6335,6336],{},"Repository root should contain the starter folders directly",[11,6338,6340,6344,6347,6350],{"id":6339,"level":14},"step-4-check-structure",[16,6341,6343],{"id":6342},"step-4-check-the-starter-structure","Step 4: Check The Starter Structure",[52,6345,6346],{},"After copying, repository root should look similar to:",[1748,6348],{"language":4505,"src":6349},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-4-check-the-starter-02.txt",[20,6351,6352,6357,6366,6378],{},[23,6353,6354,6356],{},[30,6355,167],{}," should be directly inside your repository root",[23,6358,6359,6360,6363,6364],{},"Module folders and ",[30,6361,6362],{},"project"," live inside ",[30,6365,167],{},[23,6367,6368,168,6370,172,6372,6375,6376],{},[30,6369,171],{},[30,6371,175],{},[30,6373,6374],{},"sql"," stay outside ",[30,6377,167],{},[23,6379,6380],{},"See the slide below for the public\u002Fprivate folder boundary",[11,6382,6384,6388,6470],{"id":6383,"level":990},"public-html-boundary",[118,6385,6387],{"id":6386},"public-and-private-boundary","Public And Private Boundary",[20,6389,6390,6424,6446,6451,6456,6461,6467],{},[23,6391,6392,6394,6395],{},[30,6393,167],{},": web root Apache can serve\n",[20,6396,6397,6407,6412,6418],{},[23,6398,6399,6402,6403,6406],{},[30,6400,6401],{},"m01"," through ",[30,6404,6405],{},"m10",": module practice folders",[23,6408,6409,6411],{},[30,6410,6362],{},": course project folder",[23,6413,6414,6417],{},[30,6415,6416],{},"index.php",": first browser entry point",[23,6419,6420,6423],{},[30,6421,6422],{},"test_db.php",": database connection check",[23,6425,6426,6428,6429],{},[30,6427,171],{},": reusable PHP helpers\n",[20,6430,6431,6437],{},[23,6432,6433,6436],{},[30,6434,6435],{},".env.sample",": example local config file",[23,6438,6439,181,6442,6445],{},[30,6440,6441],{},"config.php",[30,6443,6444],{},"db.php",": config and database helpers",[23,6447,6448,6450],{},[30,6449,175],{},": shared page pieces",[23,6452,6453,6455],{},[30,6454,6374],{},": database setup scripts",[23,6457,6458,6460],{},[30,6459,161],{},": consistent runtime setup",[23,6462,6463,6466],{},[30,6464,6465],{},"structure.md",": starter layout notes",[23,6468,6469],{},"Private folders should not be opened directly in the browser",[52,6471,6472],{},"Later server setup expects this folder boundary",[11,6474,6476,6480],{"id":6475,"level":14},"step-5-check-status",[16,6477,6479],{"id":6478},"step-5-create-the-template-branch","Step 5: Create The Template Branch",[109,6481,6482,6490],{"gap":111,"left-width":112,"right-width":112},[114,6483,6484,6486],{"v-slot:left":116},[52,6485,1746],{},[1748,6487],{"language":1750,"src":6488,"label":6489},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-5-create-template-branch-05.sh","create-template-branch.sh",[114,6491,6492,6495,6498],{"v-slot:right":116},[52,6493,6494],{},"Expected idea:",[1748,6496],{"language":4505,"src":6497,"label":3459},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstatus-after-template-copy.txt",[20,6499,6500,6506,6511,6514],{},[23,6501,6502,6505],{},[30,6503,6504],{},"git checkout -b",": create and move to a new branch",[23,6507,6508,6509],{},"Branch name: ",[30,6510,6194],{},[23,6512,6513],{},"New files listed as untracked",[23,6515,6516],{},"No changes means likely wrong folder or copy missed",[11,6518,6520,6524],{"id":6519,"level":14},"step-6-stage",[16,6521,6523],{"id":6522},"step-6-stage-the-baseline-files","Step 6: Stage The Baseline Files",[109,6525,6526,6534],{"gap":111,"left-width":112,"right-width":112},[114,6527,6528,6530],{"v-slot:left":116},[52,6529,1746],{},[1748,6531],{"language":1750,"src":6532,"label":6533},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-6-stage-the-baseline-files-06.sh","stage-baseline.sh",[114,6535,6536,6539,6557,6559],{"v-slot:right":116},[52,6537,6538],{},"What this means:",[20,6540,6541,6547,6552],{},[23,6542,6543,6546],{},[30,6544,6545],{},"git add",": choose files for the next commit",[23,6548,6549,6551],{},[30,6550,1622],{}," means current folder and contents",[23,6553,6554,6556],{},[30,6555,4696],{},": verify what is staged before committing",[52,6558,6494],{},[1748,6560],{"language":4505,"src":6561,"label":3459},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstatus-after-stage.txt",[11,6563,6565,6569],{"id":6564,"level":14},"step-7-commit",[16,6566,6568],{"id":6567},"step-7-commit-the-baseline","Step 7: Commit The Baseline",[109,6570,6571,6579],{"gap":111,"left-width":112,"right-width":112},[114,6572,6573,6575],{"v-slot:left":116},[52,6574,1746],{},[1748,6576],{"language":1750,"src":6577,"label":6578},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-7-commit-the-baseline-07.sh","commit-baseline.sh",[114,6580,6581,6583,6586],{"v-slot:right":116},[52,6582,6494],{},[1748,6584],{"language":4505,"src":6585,"label":3459},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fcommit-baseline-output.txt",[20,6587,6588,6594,6604],{},[23,6589,6590,6593],{},[30,6591,6592],{},"git commit",": save staged changes in local history",[23,6595,6596,6598,6599],{},[30,6597,4794],{},": commit message\n",[20,6600,6601],{},[23,6602,6603],{},"Message is required, even if empty",[23,6605,6606],{},"Baseline commit: starter state before custom work",[11,6608,6610,6614],{"id":6609,"level":14},"step-8-push",[16,6611,6613],{"id":6612},"step-8-push-the-template-branch","Step 8: Push The Template Branch",[109,6615,6616,6624],{"gap":111,"left-width":112,"right-width":112},[114,6617,6618,6620],{"v-slot:left":116},[52,6619,1746],{},[1748,6621],{"language":1750,"src":6622,"label":6623},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-8-push-to-github-08.sh","push-baseline.sh",[114,6625,6626,6628,6631],{"v-slot:right":116},[52,6627,6494],{},[1748,6629],{"language":4505,"src":6630,"label":3459},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fpush-baseline-output.txt",[20,6632,6633,6638,6644,6649],{},[23,6634,6635,6637],{},[30,6636,4857],{},": GitHub remote",[23,6639,6640,6643],{},[30,6641,6642],{},"-u",": remembers this branch's GitHub tracking branch",[23,6645,6646,6648],{},[30,6647,6194],{},": branch being sent",[23,6650,6651],{},"Refresh GitHub after the push",[11,6653,6655,6659],{"id":6654,"level":14},"step-9-open-pull-request",[16,6656,6658],{"id":6657},"step-9-open-the-pull-request","Step 9: Open The Pull Request",[109,6660,6661,6704],{"gap":111,"left-width":112,"right-width":112},[114,6662,6663,6665],{"v-slot:left":116},[52,6664,3514],{},[20,6666,6667,6670,6686,6691,6696,6699],{},[23,6668,6669],{},"Open your course repository",[23,6671,300,6672,6675],{},[750,6673,6674],{},"Compare & pull request",[20,6676,6677],{},[23,6678,6679,6680,5483,6683],{},"Or use ",[750,6681,6682],{},"Pull requests",[750,6684,6685],{},"New pull request",[23,6687,6688,6689],{},"Set base branch to ",[30,6690,709],{},[23,6692,6693,6694],{},"Set compare branch to ",[30,6695,6194],{},[23,6697,6698],{},"Confirm the changed files are the starter template files",[23,6700,300,6701],{},[750,6702,6703],{},"Create pull request",[114,6705,6706,6709,6713],{"v-slot:right":116},[52,6707,6708],{},"Use a short title and description:",[1748,6710],{"language":4505,"src":6711,"label":6712},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fpull-request-description.txt","pull-request-description.txt",[20,6714,6715,6718,6721],{},[23,6716,6717],{},"Base receives the changes",[23,6719,6720],{},"Compare contains your branch work",[23,6722,6723],{},"If base and compare are reversed, do not create the pull request",[11,6725,6727,6733],{"id":6726,"level":14},"step-10-merge-sync-main",[16,6728,6730,6731],{"id":6729},"step-10-merge-and-sync-main","Step 10: Merge And Sync ",[30,6732,709],{},[109,6734,6735,6757],{"gap":111,"left-width":112,"right-width":112},[114,6736,6737,6739,6751,6753],{"v-slot:left":116},[52,6738,3514],{},[20,6740,6741,6746],{},[23,6742,300,6743],{},[750,6744,6745],{},"Merge pull request",[23,6747,300,6748],{},[750,6749,6750],{},"Confirm merge",[52,6752,5151],{},[1748,6754],{"language":1750,"src":6755,"label":6756},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-10-sync-main-after-pr-10.sh","sync-main-after-pr.sh",[114,6758,6759,6761,6764],{"v-slot:right":116},[52,6760,6494],{},[1748,6762],{"language":4505,"src":6763,"label":3459},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fsync-main-after-pr-output.txt",[20,6765,6766,6772,6778],{},[23,6767,6768,6771],{},[30,6769,6770],{},"git checkout main",": return to the main branch",[23,6773,6774,6777],{},[30,6775,6776],{},"git pull origin main",": download the merged template files",[23,6779,6780,6781,5175],{},"Continue only when local ",[30,6782,709],{},[11,6784,6786,6791],{"id":6785,"level":14},"step-11-create-local-env",[16,6787,6788,6789],{"id":6785},"Step 11: Create Local ",[30,6790,450],{},[109,6792,6793,6812],{"gap":111,"left-width":112,"right-width":112},[114,6794,6795,6798,6802],{"v-slot:left":116},[52,6796,6797],{},"Run from the repository root:",[1748,6799],{"language":1750,"src":6800,"label":6801},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-11-create-local-env-11.sh","create-local-env.sh",[20,6803,6804],{},[23,6805,6806,6807,830,6809],{},"Get ",[30,6808,432],{},[439,6810,444],{"href":441,"rel":6811},[443],[114,6813,6814,6817,6822],{"v-slot:right":116},[52,6815,6816],{},"Fill in values similar to:",[1748,6818],{"language":6819,"src":6820,"label":6821},"dotenv","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Flocal-env-example.txt","lib\u002F.env",[20,6823,6824,6829,6834,6837,6842,6847],{},[23,6825,6826,6828],{},[30,6827,450],{}," stores local secrets",[23,6830,2581,6831,6833],{},[30,6832,450],{}," on your computer only",[23,6835,6836],{},"Do not commit your real connection string",[23,6838,6839,6840],{},"Paste the generated database connection string as ",[30,6841,432],{},[23,6843,6844,6846],{},[30,6845,6441],{}," loads local or hosted environment variables",[23,6848,6849,6850],{},"Do not paste secrets directly into ",[30,6851,6441],{},[11,6853,6855,6859],{"id":6854,"level":14},"step-12-test-local-db",[16,6856,6858],{"id":6857},"step-12-test-local-database-connection","Step 12: Test Local Database Connection",[109,6860,6861,6869],{"gap":111,"left-width":112,"right-width":112},[114,6862,6863,6865],{"v-slot:left":116},[52,6864,6797],{},[1748,6866],{"language":1750,"src":6867,"label":6868},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-12-test-local-db-12.sh","run-local-php.sh",[114,6870,6871,6874,6878],{"v-slot:right":116},[52,6872,6873],{},"Then open:",[1748,6875],{"language":4505,"src":6876,"label":6877},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Ftest-db-url.txt","browser-url.txt",[20,6879,6880,6886,6892,6900],{},[23,6881,6882,6885],{},[30,6883,6884],{},"php -S",": starts PHP's built-in local server",[23,6887,6888,6891],{},[30,6889,6890],{},"-t public_html",": serves the course web root",[23,6893,6894,6896,6897,6899],{},[30,6895,6422],{},": confirms PHP can read ",[30,6898,450],{}," and connect to MySQL",[23,6901,6902,6903,6905],{},"Stop the server with ",[30,6904,2288],{}," when finished",[11,6907,6909,6917,6923],{"id":6908,"level":14},"step-13-enable-pdo-mysql",[16,6910,6912,6913,6916],{"id":6911},"step-13-enable-pdo_mysql-if-needed","Step 13: Enable ",[30,6914,6915],{},"pdo_mysql"," If Needed",[52,6918,6919,6920,1622],{},"This is usually a Windows PHP ZIP setup issue. macOS and Linux usually install MySQL support through Homebrew or ",[30,6921,6922],{},"apt",[109,6924,6925,6956],{"gap":111,"left-width":112,"right-width":112},[114,6926,6927,6930,6934,6937],{"v-slot:left":116},[52,6928,6929],{},"Find the PHP folder:",[1748,6931],{"language":1750,"src":6932,"label":6933},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-13-find-php-folder-13.sh","find-php-folder.sh",[52,6935,6936],{},"In that folder:",[20,6938,6939,6945,6951],{},[23,6940,6941,6942],{},"Find ",[30,6943,6944],{},"php.ini-development",[23,6946,6947,6948],{},"Copy it as ",[30,6949,6950],{},"php.ini",[23,6952,3897,6953,6955],{},[30,6954,6950],{}," in your editor",[114,6957,6958,6961,6965,6968,6972],{"v-slot:right":116},[52,6959,6960],{},"Uncomment these lines:",[1748,6962],{"language":6963,"src":6964,"label":6950},"ini","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fphp-ini-pdo-mysql-settings.txt",[52,6966,6967],{},"Mac\u002FLinux usually use:",[1748,6969],{"language":1750,"src":6970,"label":6971},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fmacos-linux-pdo-mysql-commands-14.sh","macos-linux-php-mysql.sh",[20,6973,6974,6979],{},[23,6975,6976,6977],{},"Restart the php dev server after changing ",[30,6978,6950],{},[23,6980,6981],{},"Run Step 12 again after enabling the extension",[11,6983,6985,6987,6990],{"id":6984,"level":14},"quick-check-final",[16,6986,1319],{"id":1316},[52,6988,6989],{},"Confirm all of these:",[20,6991,6992,6995,7002,7005,7010,7019,7025,7030,7035,7041],{},[23,6993,6994],{},"GitHub shows the starter files",[23,6996,6997,6998,581,7000],{},"GitHub shows a pull request from ",[30,6999,6194],{},[30,7001,709],{},[23,7003,7004],{},"The pull request is merged",[23,7006,4921,7007,7009],{},[30,7008,709],{}," says the working tree is clean",[23,7011,7012,6402,7015,7018],{},[30,7013,7014],{},"public_html\u002Fm01",[30,7016,7017],{},"public_html\u002Fm10"," exist",[23,7020,7021,7024],{},[30,7022,7023],{},"public_html\u002Fproject"," exists",[23,7026,7027,7029],{},[30,7028,167],{}," is not nested inside another accidental folder",[23,7031,7032,7034],{},[30,7033,6821],{}," exists locally and is not committed with real secrets",[23,7036,7037,7040],{},[30,7038,7039],{},"http:\u002F\u002Flocalhost:3000\u002Ftest_db.php"," confirms the database connection",[23,7042,7043,7044,7046,7047,7049],{},"Windows PHP has ",[30,7045,6915],{}," enabled if ",[30,7048,6422],{}," reports a missing driver",[11,7051,7053,7057,7059,7062,7071],{"id":7052,"level":14},"reset-check",[16,7054,7056],{"id":7055},"if-something-looks-wrong","If Something Looks Wrong",[52,7058,1746],{},[1748,7060],{"language":1750,"src":7061},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fif-something-looks-wrong-03.sh",[7063,7064,7065],"blockquote",{},[52,7066,7067,7068,7070],{},"Tip: ",[30,7069,4051],{}," prints the repository root when your current folder is inside a Git repository",[20,7072,7073,7076,7079],{},[23,7074,7075],{},"Output should point to your course repository",[23,7077,7078],{},"If it points somewhere else, move folders before continuing",[23,7080,7081],{},"Avoid cloning inside another cloned repository",[11,7083,7084,7086],{"id":698,"level":14},[16,7085,701],{"id":698},[20,7087,7088,7091,7094,7099,7102,7105,7110,7120,7125,7128],{},[23,7089,7090],{},"Opening the parent folder instead of the repository root",[23,7092,7093],{},"Copying the instructor template folder as a nested folder",[23,7095,7096,7097,6330],{},"Copying the template ",[30,7098,6329],{},[23,7100,7101],{},"Keeping the downloaded ZIP inside the repository",[23,7103,7104],{},"Re-cloning the repository instead of opening the existing clone",[23,7106,7107,7108],{},"Putting module folders outside ",[30,7109,167],{},[23,7111,7112,7113,7115,7116,7119],{},"Renaming ",[30,7114,6401],{}," to ",[30,7117,7118],{},"M1"," or mixing folder casing",[23,7121,7122,7123],{},"Doing template work directly on ",[30,7124,709],{},[23,7126,7127],{},"Reversing base and compare branches in the pull request",[23,7129,7130,7131,7133],{},"Forgetting to sync local ",[30,7132,709],{}," after the pull request is merged",[11,7135,7136,7138],{"id":745,"level":14},[16,7137,746],{"id":745},[20,7139,7140,7143,7146,7149,7152,7155],{},[23,7141,7142],{},"Repository root: top folder of the cloned project",[23,7144,7145],{},"Baseline: starter state before custom work begins",[23,7147,7148],{},"Pull request: GitHub review page used to merge branch work",[23,7150,7151],{},"Web root: folder served to the browser",[23,7153,7154],{},"Scaffold: starter folders that organize future work",[23,7156,7157],{},"Staging: choosing files for the next commit",[11,7159,7160,7162,7165],{"id":810,"level":14},[16,7161,813],{"id":810},[52,7163,7164],{},"Before leaving this presentation, confirm the following:",[20,7166,7167,7170,7173,7176,7182],{},[23,7168,7169],{},"You still have one clone for your repository",[23,7171,7172],{},"Your VS Code is able to open directly to your repository",[23,7174,7175],{},"Your repository has the full starter baseline correctly structured",[23,7177,7178,7179,7181],{},"GitHub remote ",[30,7180,709],{}," has the baseline content",[23,7183,4921,7184,7186],{},[30,7185,709],{}," was synchronized",{"title":116,"searchDepth":858,"depth":858,"links":7188},[7189,7190,7191,7192,7195,7198,7199,7200,7201,7202,7203,7205,7207,7208,7210,7211,7212,7213,7214],{"id":4449,"depth":858,"text":4452},{"id":6208,"depth":858,"text":6209},{"id":6250,"depth":858,"text":6251},{"id":6278,"depth":858,"text":6279,"children":7193},[7194],{"id":6311,"depth":1381,"text":6312},{"id":6342,"depth":858,"text":6343,"children":7196},[7197],{"id":6386,"depth":1381,"text":6387},{"id":6478,"depth":858,"text":6479},{"id":6522,"depth":858,"text":6523},{"id":6567,"depth":858,"text":6568},{"id":6612,"depth":858,"text":6613},{"id":6657,"depth":858,"text":6658},{"id":6729,"depth":858,"text":7204},"Step 10: Merge And Sync main",{"id":6785,"depth":858,"text":7206},"Step 11: Create Local .env",{"id":6857,"depth":858,"text":6858},{"id":6911,"depth":858,"text":7209},"Step 13: Enable pdo_mysql If Needed",{"id":1316,"depth":858,"text":1319},{"id":7055,"depth":858,"text":7056},{"id":698,"depth":858,"text":701},{"id":745,"depth":858,"text":746},{"id":810,"depth":858,"text":813},"Continue from your cloned course repository, copy in the instructor template, and merge the baseline files through a pull request.","Face-to-face class of about 40 students; starts from an existing clone and includes template copy checks, ZIP extraction, first commit verification, and common folder mistakes.","60",{},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository",{"title":6171,"description":7215},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository",[4436,114,2681],"47:11","4n0-QuXO_Aw","https:\u002F\u002Fyoutu.be\u002F4n0-QuXO_Aw","Adding Instructor\u002FCourse Template","iYq9WdND1ODBRrXLU2gX9dNCXvDc-Kvqufsokl_jg3E",{"id":7229,"title":7230,"audience":6,"body":7231,"contentType":879,"course":880,"description":7936,"estimateBasis":7937,"estimatedDiscussionMinutes":883,"estimatedLiveMinutes":5368,"estimatedTotalMinutes":884,"extension":886,"meta":7938,"module":888,"navigation":889,"order":885,"path":7939,"promptAssist":892,"seo":7940,"status":894,"stem":7941,"tags":7942,"videoDuration":7943,"videoId":7944,"videoLink":7945,"videoTitle":7946,"week":888,"__hash__":7947},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches.md","QA And Prod Branches",{"type":8,"value":7232,"toc":7915},[7233,7265,7313,7335,7389,7454,7512,7562,7627,7668,7757,7797,7824,7882],[11,7234,7235,7237,7239],{"id":4449,"level":14},[16,7236,4452],{"id":4449},[52,7238,54],{},[20,7240,7241,7248,7253,7257,7262],{},[23,7242,7243,7244,181,7246],{},"Understand the purpose and usage of ",[30,7245,32],{},[30,7247,38],{},[23,7249,7250,7251],{},"Create and push ",[30,7252,32],{},[23,7254,7250,7255],{},[30,7256,38],{},[23,7258,7259,7260],{},"Keep local work pointed at ",[30,7261,32],{},[23,7263,7264],{},"Confirm GitHub has the expected branches",[11,7266,7268,7271,7306],{"id":7267,"level":14},"branch-roles",[16,7269,7270],{"id":7267},"Branch Roles",[20,7272,7273,7283,7293,7303],{},[23,7274,7275,7277,7278],{},[30,7276,709],{},": starter baseline and shared source branch\n",[20,7279,7280],{},[23,7281,7282],{},"Most projects stick with this; we'll split ours into development lanes",[23,7284,7285,7287,7288],{},[30,7286,32],{},": public testing and evidence branch\n",[20,7289,7290],{},[23,7291,7292],{},"Normal branch to return to before new course work",[23,7294,7295,7297,7298],{},[30,7296,38],{},": stable grading and evaluation branch\n",[20,7299,7300],{},[23,7301,7302],{},"Protected from everyday local edits",[23,7304,7305],{},"Later deployment setup connects Render to these branches",[52,7307,7308,7309,5483,7311],{},"Course flow: feature or homework branch -> ",[30,7310,32],{},[30,7312,38],{},[11,7314,7315,7317,7320,7324],{"id":106,"level":14},[16,7316,107],{"id":106},[52,7318,7319],{},"Run inside the course repository:",[1748,7321],{"label":7322,"language":1750,"src":7323},"before-you-start.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fbefore-you-start.sh",[20,7325,7326,7329,7332],{},[23,7327,7328],{},"Working tree should be clean",[23,7330,7331],{},"Starter baseline already pushed to GitHub",[23,7333,7334],{},"Stop if Git says files are modified or untracked",[11,7336,7338,7344],{"id":7337,"level":14},"step-1-sync-main",[16,7339,7341,7342],{"id":7340},"step-1-start-from-main","Step 1: Start From ",[30,7343,709],{},[109,7345,7346,7354],{"gap":111,"left-width":112,"right-width":112},[114,7347,7348,7350],{"v-slot:left":116},[52,7349,1746],{},[1748,7351],{"label":7352,"language":1750,"src":7353},"sync-main.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fsync-main.sh",[114,7355,7356,7358,7361],{"v-slot:right":116},[52,7357,3597],{},[1748,7359],{"label":3459,"language":4505,"src":7360},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fsync-main-output.txt",[20,7362,7363,7370],{},[23,7364,7365,7367,7368],{},[30,7366,6770],{},": switch to ",[30,7369,709],{},[23,7371,7372,7374,7375,7377,7378],{},[30,7373,6776],{},": get the latest ",[30,7376,709],{}," from GitHub\n",[20,7379,7380,7384],{},[23,7381,7382,6637],{},[30,7383,4857],{},[23,7385,7386,7388],{},[30,7387,709],{},": remote branch being pulled",[11,7390,7392,7398],{"id":7391,"level":14},"step-2-create-qa",[16,7393,7395,7396],{"id":7394},"step-2-create-and-push-qa","Step 2: Create And Push ",[30,7397,32],{},[109,7399,7400,7408],{"gap":111,"left-width":112,"right-width":112},[114,7401,7402,7404],{"v-slot:left":116},[52,7403,1746],{},[1748,7405],{"label":7406,"language":1750,"src":7407},"create-qa.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-qa.sh",[114,7409,7410,7412,7415],{"v-slot:right":116},[52,7411,3597],{},[1748,7413],{"label":3459,"language":4505,"src":7414},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-qa-output.txt",[20,7416,7417,7434],{},[23,7418,7419,7422,7423,7425,7426],{},[30,7420,7421],{},"git checkout -b qa",": create ",[30,7424,32],{}," and switch to it\n",[20,7427,7428],{},[23,7429,7430,7433],{},[30,7431,7432],{},"-b",": creates a new branch of the following name",[23,7435,7436,7439,7440,7442,7443],{},[30,7437,7438],{},"git push -u origin qa",": send ",[30,7441,32],{}," to GitHub\n",[20,7444,7445],{},[23,7446,7447,7449,7450,7453],{},[30,7448,6642],{},": remember ",[30,7451,7452],{},"origin\u002Fqa"," as the upstream branch",[11,7455,7457,7463],{"id":7456,"level":14},"step-3-create-prod",[16,7458,7460,7461],{"id":7459},"step-3-create-and-push-prod","Step 3: Create And Push ",[30,7462,38],{},[109,7464,7465,7473],{"gap":111,"left-width":112,"right-width":112},[114,7466,7467,7469],{"v-slot:left":116},[52,7468,1746],{},[1748,7470],{"label":7471,"language":1750,"src":7472},"create-prod.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-prod.sh",[114,7474,7475,7477,7480],{"v-slot:right":116},[52,7476,3597],{},[1748,7478],{"label":3459,"language":4505,"src":7479},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-prod-output.txt",[20,7481,7482,7490,7495,7507],{},[23,7483,5518,7484,7486,7487,7489],{},[30,7485,38],{}," from the current ",[30,7488,32],{}," branch",[23,7491,7492],{},[30,7493,7494],{},"git checkout -b prod",[23,7496,7497,7498,7442,7500],{},"Push ",[30,7499,38],{},[20,7501,7502],{},[23,7503,7504],{},[30,7505,7506],{},"git push origin prod",[23,7508,7509,7511],{},[30,7510,38],{}," starts from the same clean baseline",[11,7513,7515,7520],{"id":7514,"level":14},"step-4-return-to-qa",[16,7516,7517,7518],{"id":7514},"Step 4: Return To ",[30,7519,32],{},[109,7521,7522,7530],{"gap":111,"left-width":112,"right-width":112},[114,7523,7524,7526],{"v-slot:left":116},[52,7525,1746],{},[1748,7527],{"label":7528,"language":1750,"src":7529},"return-to-qa.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Freturn-to-qa.sh",[114,7531,7532,7534,7537],{"v-slot:right":116},[52,7533,3597],{},[1748,7535],{"label":3459,"language":4505,"src":7536},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Freturn-to-qa-output.txt",[20,7538,7539,7544,7549],{},[23,7540,7541,7543],{},[30,7542,32],{}," should have the asterisk",[23,7545,7546,7548],{},[30,7547,38],{}," should still exist on GitHub",[23,7550,7551,7552,7554],{},"Do not start normal course work from ",[30,7553,38],{},[20,7555,7556],{},[23,7557,7558,7559,7561],{},"We'll remove local ",[30,7560,38],{}," to avoid this issue",[11,7563,7565,7571],{"id":7564,"level":14},"step-5-delete-local-prod",[16,7566,7568,7569],{"id":7567},"step-5-remove-local-prod","Step 5: Remove Local ",[30,7570,38],{},[109,7572,7573,7581],{"gap":111,"left-width":112,"right-width":112},[114,7574,7575,7577],{"v-slot:left":116},[52,7576,1746],{},[1748,7578],{"label":7579,"language":1750,"src":7580},"delete-local-prod.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fdelete-local-prod.sh",[114,7582,7583,7585,7588],{"v-slot:right":116},[52,7584,3597],{},[1748,7586],{"label":3459,"language":4505,"src":7587},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fdelete-local-prod-output.txt",[20,7589,7590,7612],{},[23,7591,7592,7595,7596,7598],{},[30,7593,7594],{},"git branch -d prod",": delete local ",[30,7597,38],{},[20,7599,7600,7606],{},[23,7601,7602,7605],{},[30,7603,7604],{},"-d",": delete only if Git considers it safe",[23,7607,7608,7611],{},[30,7609,7610],{},"-D",": can be used as a forced delete",[23,7613,7614,7617,7618],{},[30,7615,7616],{},"git branch -r",": list remote branches\n",[20,7619,7620],{},[23,7621,7622,7623,7626],{},"Confirms ",[30,7624,7625],{},"origin\u002Fprod"," still exists",[11,7628,7630,7633,7636,7639,7653,7656],{"id":7629,"level":14},"github-check",[16,7631,7632],{"id":7629},"GitHub Check",[52,7634,7635],{},"Open the branch dropdown on GitHub",[52,7637,7638],{},"You should see:",[20,7640,7641,7645,7649],{},[23,7642,7643],{},[30,7644,709],{},[23,7646,7647],{},[30,7648,32],{},[23,7650,7651],{},[30,7652,38],{},[52,7654,7655],{},"Branch roles:",[20,7657,7658,7663],{},[23,7659,7660,7662],{},[30,7661,32],{},": testing and evidence",[23,7664,7665,7667],{},[30,7666,38],{},": stable grading target",[11,7669,7670,7674],{"id":549,"level":14},[16,7671,7673],{"id":7672},"normal-workflow-after-setup","Normal Workflow After Setup",[554,7675,7676,7693,7701,7711,7716,7730,7733,7739,7751],{},[23,7677,7678,7679,7681],{},"Return to ",[30,7680,32],{},[20,7682,7683,7688],{},[23,7684,7685],{},[30,7686,7687],{},"git checkout qa",[23,7689,7690],{},[30,7691,7692],{},"git pull origin qa",[23,7694,7695,7696],{},"Create a feature or homework branch\n",[20,7697,7698],{},[23,7699,7700],{},"Branch name matches the task",[23,7702,7703,7704],{},"Commit the work on that branch\n",[20,7705,7706],{},[23,7707,663,7708,7710],{},[30,7709,4696],{}," before each Git command",[23,7712,7713,7714],{},"Push the branch and open a pull request into ",[30,7715,32],{},[23,7717,7718,7719,7721,7722],{},"Merge into ",[30,7720,32],{}," after review\n",[20,7723,7724],{},[23,7725,7726,7727,7729],{},"QA deployment will update from ",[30,7728,32],{}," after Render setup",[23,7731,7732],{},"Test the QA version",[23,7734,578,7735,581,7737],{},[30,7736,32],{},[30,7738,38],{},[23,7740,7718,7741,7743,7744],{},[30,7742,38],{}," when stable\n",[20,7745,7746],{},[23,7747,7748,7749,7729],{},"Production deployment will use ",[30,7750,38],{},[23,7752,7753,7754,7756],{},"Return locally to ",[30,7755,32],{}," and pull before the next task",[11,7758,7759,7761],{"id":698,"level":14},[16,7760,701],{"id":698},[20,7762,7763,7768,7773,7781,7789,7792],{},[23,7764,7765,7766],{},"Working directly on ",[30,7767,38],{},[23,7769,7770,7771],{},"Forgetting to return to ",[30,7772,32],{},[23,7774,7775,7776,7778,7779],{},"Pushing ",[30,7777,32],{}," but not ",[30,7780,38],{},[23,7782,7783,7784,7786,7787],{},"Deleting remote ",[30,7785,38],{}," instead of local ",[30,7788,38],{},[23,7790,7791],{},"Assuming GitHub has the branch without checking",[23,7793,7794,7795,5175],{},"Starting new work before ",[30,7796,4696],{},[11,7798,7799,7801,7804],{"id":1316,"level":14},[16,7800,1319],{"id":1316},[52,7802,7803],{},"Answer before moving on:",[20,7805,7806,7809,7812,7815,7821],{},[23,7807,7808],{},"Which branch should QA deployment watch?",[23,7810,7811],{},"Which branch should production grading use?",[23,7813,7814],{},"Which branch should you return to before new work?",[23,7816,7817,7818,7820],{},"Why remove local ",[30,7819,38],{}," after pushing it?",[23,7822,7823],{},"What future setup connects Render to these branches?",[11,7825,7826,7828],{"id":776,"level":14},[16,7827,738],{"id":735},[109,7829,7830,7855],{"gap":111,"left-width":112,"right-width":112},[114,7831,7832,7834],{"v-slot:left":116},[118,7833,746],{"id":745},[20,7835,7836,7839,7842,7847,7852],{},[23,7837,7838],{},"Branch: named line of Git history",[23,7840,7841],{},"Upstream: remote branch Git remembers for push\u002Fpull",[23,7843,7844,7846],{},[30,7845,32],{},": public testing branch",[23,7848,7849,7851],{},[30,7850,38],{},": stable grading branch",[23,7853,7854],{},"Remote-only branch: exists on GitHub, not locally",[114,7856,7857,7859],{"v-slot:right":116},[118,7858,777],{"id":776},[20,7860,7861,7868,7875],{},[23,7862,5270,7863],{},[439,7864,7867],{"href":7865,"rel":7866},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fget-started\u002Fusing-git\u002Fabout-git#about-branches",[443],"About branches",[23,7869,5270,7870],{},[439,7871,7874],{"href":7872,"rel":7873},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpull-requests\u002Fcollaborating-with-pull-requests\u002Fproposing-changes-to-your-work-with-pull-requests\u002Fabout-pull-requests",[443],"About pull requests",[23,7876,5255,7877],{},[439,7878,7881],{"href":7879,"rel":7880},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGit-Branching-Branches-in-a-Nutshell",[443],"Git Branching",[11,7883,7884,7886,7888],{"id":810,"level":14},[16,7885,813],{"id":810},[52,7887,2380],{},[20,7889,7890,7899,7903,7907,7912],{},[23,7891,7892,7893,168,7895,172,7897],{},"Explain ",[30,7894,709],{},[30,7896,32],{},[30,7898,38],{},[23,7900,7250,7901],{},[30,7902,32],{},[23,7904,7250,7905],{},[30,7906,38],{},[23,7908,7909,7910],{},"Keep local work branched from ",[30,7911,32],{},[23,7913,7914],{},"Verify remote branches on GitHub",{"title":116,"searchDepth":858,"depth":858,"links":7916},[7917,7918,7919,7920,7922,7924,7926,7928,7930,7931,7932,7933,7934,7935],{"id":4449,"depth":858,"text":4452},{"id":7267,"depth":858,"text":7270},{"id":106,"depth":858,"text":107},{"id":7340,"depth":858,"text":7921},"Step 1: Start From main",{"id":7394,"depth":858,"text":7923},"Step 2: Create And Push qa",{"id":7459,"depth":858,"text":7925},"Step 3: Create And Push prod",{"id":7514,"depth":858,"text":7927},"Step 4: Return To qa",{"id":7567,"depth":858,"text":7929},"Step 5: Remove Local prod",{"id":7629,"depth":858,"text":7632},{"id":7672,"depth":858,"text":7673},{"id":698,"depth":858,"text":701},{"id":1316,"depth":858,"text":1319},{"id":735,"depth":858,"text":738},{"id":810,"depth":858,"text":813},"Create the Internet Applications QA and production branches, then connect each branch to its role in the course workflow.","Face-to-face class of about 40 students; includes branch roles, command practice, GitHub branch checks, and QA\u002Fprod workflow questions.",{},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches",{"title":7230,"description":7936},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches",[2681,5373,32,899],"10:35","32XilHQwRiY","https:\u002F\u002Fyoutu.be\u002F32XilHQwRiY","Create QA and Prod Branches","GZx1sXtI0BMbyb6Gbpj7aoBvczhhR-FV7YpFE4j4UCs",{"id":4,"title":5,"audience":6,"body":7949,"contentType":879,"course":880,"description":881,"estimateBasis":882,"estimatedDiscussionMinutes":883,"estimatedLiveMinutes":884,"estimatedTotalMinutes":885,"extension":886,"meta":8569,"module":888,"navigation":889,"order":890,"path":891,"promptAssist":892,"seo":8570,"status":894,"stem":895,"tags":8571,"videoDuration":900,"videoId":901,"videoLink":902,"videoTitle":903,"week":888,"__hash__":904},{"type":8,"value":7950,"toc":8548},[7951,7971,7989,8009,8063,8109,8135,8163,8189,8227,8262,8288,8326,8354,8374,8398,8434,8460,8512],[11,7952,7953,7955],{"id":13,"level":14},[16,7954,5],{"id":18},[20,7956,7957,7959,7963,7967,7969],{},[23,7958,25],{},[23,7960,28,7961],{},[30,7962,32],{},[23,7964,35,7965],{},[30,7966,38],{},[23,7968,41],{},[23,7970,44],{},[11,7972,7973,7975,7977],{"id":47,"level":14},[16,7974,50],{"id":47},[52,7976,54],{},[20,7978,7979,7981,7983,7985,7987],{},[23,7980,59],{},[23,7982,62],{},[23,7984,65],{},[23,7986,68],{},[23,7988,71],{},[11,7990,7991,7993,8005],{"id":74,"level":14},[16,7992,77],{"id":74},[20,7994,7995,7997,7999,8001,8003],{},[23,7996,82],{},[23,7998,85],{},[23,8000,88],{},[23,8002,91],{},[23,8004,94],{},[52,8006,97,8007],{},[30,8008,100],{},[11,8010,8011,8013],{"id":103,"level":14},[16,8012,107],{"id":106},[109,8014,8015,8037],{"gap":111,"left-width":112,"right-width":112},[114,8016,8017,8019],{"v-slot:left":116},[118,8018,121],{"id":120},[20,8020,8021,8029,8035],{},[23,8022,126,8023,8025],{},[30,8024,129],{},[20,8026,8027],{},[23,8028,134],{},[23,8030,137,8031],{},[20,8032,8033],{},[23,8034,142],{},[23,8036,145],{},[114,8038,8039,8041],{"v-slot:right":116},[118,8040,151],{"id":150},[20,8042,8043,8045,8049,8057],{},[23,8044,156],{},[23,8046,8047,162],{},[30,8048,161],{},[23,8050,8051,168,8053,172,8055,176],{},[30,8052,167],{},[30,8054,171],{},[30,8056,175],{},[23,8058,8059,181,8061,184],{},[30,8060,32],{},[30,8062,38],{},[11,8064,8065,8067],{"id":187,"level":14},[16,8066,190],{"id":187},[109,8068,8069,8089],{"gap":111,"left-width":112,"right-width":112},[114,8070,8071,8073],{"v-slot:left":116},[118,8072,198],{"id":197},[20,8074,8075,8079,8083,8085],{},[23,8076,203,8077],{},[30,8078,206],{},[23,8080,209,8081],{},[30,8082,32],{},[23,8084,214],{},[23,8086,217,8087],{},[30,8088,220],{},[114,8090,8091,8093],{"v-slot:right":116},[118,8092,226],{"id":225},[20,8094,8095,8099,8103,8105],{},[23,8096,203,8097],{},[30,8098,233],{},[23,8100,209,8101],{},[30,8102,38],{},[23,8104,240],{},[23,8106,217,8107],{},[30,8108,245],{},[11,8110,8111,8113],{"id":248,"level":14},[16,8112,252],{"id":251},[109,8114,8115,8129],{"gap":111,"left-width":255,"right-width":256},[114,8116,8117],{"v-slot:left":116},[20,8118,8119,8123,8125,8127],{},[23,8120,263,8121],{},[30,8122,266],{},[23,8124,269],{},[23,8126,272],{},[23,8128,275],{},[114,8130,8131],{"v-slot:right":116},[52,8132,8133],{},[281,8134],{"alt":283,"src":284,"variant":285},[11,8136,8137,8139],{"id":288,"level":14},[16,8138,291],{"id":288},[109,8140,8141,8157],{"gap":111,"left-width":255,"right-width":256},[114,8142,8143],{"v-slot:left":116},[20,8144,8145,8149,8153,8155],{},[23,8146,300,8147],{},[30,8148,303],{},[23,8150,126,8151],{},[30,8152,308],{},[23,8154,311],{},[23,8156,314],{},[114,8158,8159],{"v-slot:right":116},[52,8160,8161],{},[281,8162],{"alt":321,"src":322,"variant":285},[11,8164,8165,8167],{"id":325,"level":14},[16,8166,329],{"id":328},[109,8168,8169,8183],{"gap":111,"left-width":332,"right-width":333},[114,8170,8171],{"v-slot:left":116},[20,8172,8173,8175,8177,8181],{},[23,8174,340],{},[23,8176,343],{},[23,8178,346,8179,350],{},[30,8180,349],{},[23,8182,353],{},[114,8184,8185],{"v-slot:right":116},[52,8186,8187],{},[281,8188],{"alt":360,"src":361,"variant":285},[11,8190,8191,8193],{"id":364,"level":14},[16,8192,368],{"id":367},[109,8194,8195,8221],{"gap":111,"left-width":255,"right-width":256},[114,8196,8197,8199],{"v-slot:left":116},[52,8198,375],{},[20,8200,8201,8205,8209,8213,8217,8219],{},[23,8202,203,8203],{},[30,8204,206],{},[23,8206,384,8207],{},[30,8208,32],{},[23,8210,389,8211],{},[30,8212,392],{},[23,8214,395,8215],{},[30,8216,129],{},[23,8218,400],{},[23,8220,403],{},[114,8222,8223],{"v-slot:right":116},[52,8224,8225],{},[281,8226],{"alt":410,"src":411,"variant":285},[11,8228,8229,8231],{"id":414,"level":14},[16,8230,418],{"id":417},[109,8232,8233,8256],{"gap":111,"left-width":421,"right-width":422},[114,8234,8235],{"v-slot:left":116},[20,8236,8237,8248,8252,8254],{},[23,8238,429,8239,8241],{},[30,8240,432],{},[20,8242,8243],{},[23,8244,437,8245],{},[439,8246,444],{"href":441,"rel":8247},[443],[23,8249,447,8250,451],{},[30,8251,450],{},[23,8253,454],{},[23,8255,457],{},[114,8257,8258],{"v-slot:right":116},[52,8259,8260],{},[281,8261],{"alt":464,"src":465,"variant":285},[11,8263,8264,8266],{"id":468,"level":14},[16,8265,471],{"id":468},[109,8267,8268,8282],{"gap":111,"left-width":332,"right-width":333},[114,8269,8270],{"v-slot:left":116},[20,8271,8272,8274,8276,8278,8280],{},[23,8273,480],{},[23,8275,483],{},[23,8277,486],{},[23,8279,489],{},[23,8281,492],{},[114,8283,8284],{"v-slot:right":116},[52,8285,8286],{},[281,8287],{"alt":499,"src":500,"variant":285},[11,8289,8290,8292],{"id":503,"level":14},[16,8291,507],{"id":506},[109,8293,8294,8320],{"gap":111,"left-width":255,"right-width":256},[114,8295,8296,8298],{"v-slot:left":116},[52,8297,514],{},[20,8299,8300,8302,8306,8310,8314,8318],{},[23,8301,519],{},[23,8303,203,8304],{},[30,8305,233],{},[23,8307,384,8308],{},[30,8309,38],{},[23,8311,389,8312],{},[30,8313,392],{},[23,8315,395,8316],{},[30,8317,129],{},[23,8319,538],{},[114,8321,8322],{"v-slot:right":116},[52,8323,8324],{},[281,8325],{"alt":545,"src":546,"variant":285},[11,8327,8328,8330],{"id":549,"level":14},[16,8329,552],{"id":549},[554,8331,8332,8334,8336,8340,8342,8344,8346,8352],{},[23,8333,558],{},[23,8335,561],{},[23,8337,564,8338],{},[30,8339,32],{},[23,8341,569],{},[23,8343,572],{},[23,8345,575],{},[23,8347,578,8348,581,8350,584],{},[30,8349,32],{},[30,8351,38],{},[23,8353,587],{},[11,8355,8356,8358],{"id":590,"level":14},[16,8357,593],{"id":590},[20,8359,8360,8362,8364,8366,8372],{},[23,8361,598],{},[23,8363,601],{},[23,8365,604],{},[23,8367,607,8368],{},[20,8369,8370],{},[23,8371,612],{},[23,8373,615],{},[11,8375,8376,8378],{"id":618,"level":14},[16,8377,621],{"id":618},[109,8379,8380,8392],{"gap":111,"left-width":332,"right-width":333},[114,8381,8382],{"v-slot:left":116},[20,8383,8384,8386,8388,8390],{},[23,8385,630],{},[23,8387,633],{},[23,8389,636],{},[23,8391,639],{},[114,8393,8394],{"v-slot:right":116},[52,8395,8396],{},[281,8397],{"alt":646,"src":647,"variant":285},[11,8399,8400,8402],{"id":650,"level":14},[16,8401,653],{"id":650},[20,8403,8404,8412,8418,8426],{},[23,8405,658,8406],{},[20,8407,8408],{},[23,8409,663,8410,666],{},[30,8411,161],{},[23,8413,669,8414],{},[20,8415,8416],{},[23,8417,674],{},[23,8419,677,8420],{},[20,8421,8422],{},[23,8423,663,8424,684],{},[30,8425,432],{},[23,8427,687,8428],{},[20,8429,8430,8432],{},[23,8431,692],{},[23,8433,695],{},[11,8435,8436,8438],{"id":698,"level":14},[16,8437,701],{"id":698},[20,8439,8440,8448,8450,8454,8456,8458],{},[23,8441,706,8442,710,8444,713,8446],{},[30,8443,709],{},[30,8445,32],{},[30,8447,38],{},[23,8449,718],{},[23,8451,721,8452],{},[30,8453,432],{},[23,8455,726],{},[23,8457,729],{},[23,8459,732],{},[11,8461,8462,8464],{"id":735,"level":14},[16,8463,738],{"id":735},[109,8465,8466,8486],{"gap":111,"left-width":112,"right-width":112},[114,8467,8468,8470,8474,8478,8482],{"v-slot:left":116},[118,8469,746],{"id":745},[52,8471,8472,753],{},[750,8473,752],{},[52,8475,8476,759],{},[750,8477,758],{},[52,8479,8480,765],{},[750,8481,764],{},[52,8483,8484,771],{},[750,8485,770],{},[114,8487,8488,8490],{"v-slot:right":116},[118,8489,777],{"id":776},[20,8491,8492,8497,8502,8507],{},[23,8493,8494],{},[439,8495,786],{"href":784,"rel":8496},[443],[23,8498,8499],{},[439,8500,793],{"href":791,"rel":8501},[443],[23,8503,8504],{},[439,8505,800],{"href":798,"rel":8506},[443],[23,8508,8509],{},[439,8510,807],{"href":805,"rel":8511},[443],[11,8513,8514,8516,8518],{"id":810,"level":14},[16,8515,813],{"id":810},[52,8517,816],{},[20,8519,8520,8522,8524,8530,8532,8534],{},[23,8521,821],{},[23,8523,824],{},[23,8525,827,8526,830,8528],{},[30,8527,432],{},[30,8529,444],{},[23,8531,835],{},[23,8533,838],{},[23,8535,841,8536],{},[20,8537,8538,8540,8544],{},[23,8539,846],{},[23,8541,8542,851],{},[30,8543,32],{},[23,8545,8546,856],{},[30,8547,38],{},{"title":116,"searchDepth":858,"depth":858,"links":8549},[8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568],{"id":18,"depth":858,"text":5},{"id":47,"depth":858,"text":50},{"id":74,"depth":858,"text":77},{"id":106,"depth":858,"text":107},{"id":187,"depth":858,"text":190},{"id":251,"depth":858,"text":252},{"id":288,"depth":858,"text":291},{"id":328,"depth":858,"text":329},{"id":367,"depth":858,"text":368},{"id":417,"depth":858,"text":418},{"id":468,"depth":858,"text":471},{"id":506,"depth":858,"text":507},{"id":549,"depth":858,"text":552},{"id":590,"depth":858,"text":593},{"id":618,"depth":858,"text":621},{"id":650,"depth":858,"text":653},{"id":698,"depth":858,"text":701},{"id":735,"depth":858,"text":738},{"id":810,"depth":858,"text":813},{},{"title":5,"description":881},[897,898,32,899],{"id":8573,"title":8574,"audience":6,"body":8575,"contentType":879,"course":880,"description":11249,"estimateBasis":11250,"estimatedDiscussionMinutes":11251,"estimatedLiveMinutes":11252,"estimatedTotalMinutes":11253,"extension":886,"meta":11254,"module":888,"navigation":889,"order":5366,"path":11255,"promptAssist":892,"seo":11256,"status":894,"stem":11257,"tags":11258,"videoDuration":11263,"videoId":11264,"videoLink":11265,"videoTitle":11266,"week":888,"__hash__":11267},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox.md","Local Ubuntu Web Server With VirtualBox",{"type":8,"value":8576,"toc":11181},[8577,8606,8651,8687,8756,8788,8815,8847,8873,8902,8931,8958,8989,9017,9053,9118,9153,9199,9242,9286,9333,9396,9432,9467,9504,9537,9574,9607,9637,9667,9697,9727,9757,9791,9823,9855,9887,9936,9938,9981,10007,10048,10100,10179,10230,10261,10291,10321,10371,10396,10446,10494,10552,10610,10651,10681,10715,10749,10783,10834,10886,10905,10933,10981,11053,11153],[11,8578,8580,8583],{"id":8579,"level":14},"virtualbox-title",[16,8581,8574],{"id":8582},"local-ubuntu-web-server-with-virtualbox",[20,8584,8585,8588,8591,8594,8597,8603],{},[23,8586,8587],{},"Primary course path for the local Ubuntu VM",[23,8589,8590],{},"Create an Ubuntu Server VM in VirtualBox",[23,8592,8593],{},"Connect from your host terminal with SSH",[23,8595,8596],{},"Share the course repo into Ubuntu",[23,8598,8599,8600,8602],{},"Serve ",[30,8601,167],{}," through Apache and PHP",[23,8604,8605],{},"Create a local MySQL database for testing",[11,8607,8609,8612,8615,8626,8629],{"id":8608,"level":14},"main-goal",[16,8610,8611],{"id":8608},"Main Goal",[52,8613,8614],{},"Your host computer and Ubuntu VM have different jobs:",[20,8616,8617,8620,8623],{},[23,8618,8619],{},"Host computer: edit files with VS Code and open the browser",[23,8621,8622],{},"Ubuntu VM: run Apache, PHP, MySQL, and server commands",[23,8624,8625],{},"Shared folder: lets both use the same course repo files",[52,8627,8628],{},"Target result:",[20,8630,8631,8637,8642,8645,8648],{},[23,8632,8633,8634],{},"Host browser opens ",[30,8635,8636],{},"http:\u002F\u002Flocalhost:3000",[23,8638,8639,8640],{},"Apache serves the repo's ",[30,8641,167],{},[23,8643,8644],{},"PHP executes inside Ubuntu",[23,8646,8647],{},"Local MySQL has a database and user named after your UCID",[23,8649,8650],{},"Edits made on the host appear after browser refresh",[11,8652,8654,8657,8660,8679,8682],{"id":8653,"level":14},"virtualbox-caveat",[16,8655,8656],{"id":8653},"VirtualBox Caveat",[52,8658,8659],{},"VirtualBox is the primary local VM path for this course:",[20,8661,8662,8665,8668,8676],{},[23,8663,8664],{},"Works well on modern Windows, Linux, and Intel Mac hosts",[23,8666,8667],{},"Apple Silicon Mac requires an ARM64 Ubuntu Server ISO",[23,8669,8670,8671],{},"Windows on Arm support is experimental in VirtualBox\n",[20,8672,8673],{},[23,8674,8675],{},"Avoid unless your instructor confirms it for your machine",[23,8677,8678],{},"Arm hosts cannot run x86\u002FAMD64 guest images",[52,8680,8681],{},"VMware is the fallback path if VirtualBox is not a good fit for your machine",[2778,8683,8684],{"type":4045},[52,8685,8686],{},"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,8688,8689,8691],{"id":106,"level":14},[16,8690,107],{"id":106},[20,8692,8693,8711,8729,8732,8735,8738,8753],{},[23,8694,8695,8696],{},"VirtualBox downloaded\n",[20,8697,8698,8705,8708],{},[23,8699,8700],{},[439,8701,8704],{"href":8702,"rel":8703},"https:\u002F\u002Fwww.virtualbox.org\u002Fwiki\u002FDownloads",[443],"VirtualBox downloads",[23,8706,8707],{},"Windows\u002FLinux\u002FIntel Mac: use the standard host installer",[23,8709,8710],{},"Apple Silicon Mac: use the macOS Arm64 host installer",[23,8712,8713,8714],{},"Ubuntu Server ISO downloaded\n",[20,8715,8716,8723,8726],{},[23,8717,8718],{},[439,8719,8722],{"href":8720,"rel":8721},"https:\u002F\u002Fubuntu.com\u002Fdownload\u002Fserver#how-to-install-tab-lts",[443],"Ubuntu Server installer",[23,8724,8725],{},"Apple Silicon Mac: use the ARM64 server ISO",[23,8727,8728],{},"Windows, Linux, and Intel Mac: use the AMD64 server ISO",[23,8730,8731],{},"Internet Applications course repo cloned on host computer",[23,8733,8734],{},"Git\u002FGitHub setup already working",[23,8736,8737],{},"Administrator access on your computer",[23,8739,8740,8741,8744,8745],{},"At least ",[30,8742,8743],{},"10 GB"," free disk space for the VM\n",[20,8746,8747],{},[23,8748,8749,8752],{},[30,8750,8751],{},"20-25 GB"," is safer if your computer has room",[23,8754,8755],{},"Stable internet for package installs",[11,8757,8759,8762],{"id":8758,"level":14},"setup-parts",[16,8760,8761],{"id":8758},"Setup Parts",[20,8763,8764,8767,8770,8773,8779,8782,8785],{},[23,8765,8766],{},"VM: Ubuntu Server running inside VirtualBox",[23,8768,8769],{},"NAT adapter: gives the VM internet access",[23,8771,8772],{},"Port forwarding: lets the host reach SSH and Apache",[23,8774,8775,8776],{},"SSH: lets the host terminal control Ubuntu through ",[30,8777,8778],{},"localhost",[23,8780,8781],{},"Shared folder: exposes the host repo inside Ubuntu",[23,8783,8784],{},"Apache\u002FPHP: serves and executes the web app",[23,8786,8787],{},"MySQL: local database server for local testing",[11,8789,8791,8795],{"id":8790,"level":14},"install-virtualbox-windows",[16,8792,8794],{"id":8793},"install-virtualbox-on-windows","Install VirtualBox On Windows",[20,8796,8797,8800,8803,8806,8809,8812],{},[23,8798,8799],{},"Download VirtualBox for Windows hosts",[23,8801,8802],{},"Run the installer as an administrator if prompted",[23,8804,8805],{},"Keep the default install path and features",[23,8807,8808],{},"Accept the network reset warning",[23,8810,8811],{},"Open VirtualBox after installation",[23,8813,8814],{},"See the slides below for the Windows installer screens",[11,8816,8818,8821],{"id":8817,"level":990},"windows-installer-start",[16,8819,8820],{"id":8817},"Windows Installer: Start",[109,8822,8823,8831],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,8824,8825],{"v-slot:left":116},[52,8826,8827],{},[281,8828],{"alt":8829,"src":8830,"variant":285},"VirtualBox Windows installer start screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step1.png",[114,8832,8833],{"v-slot:right":116},[20,8834,8835,8841,8844],{},[23,8836,8837,8838],{},"Launch the downloaded ",[30,8839,8840],{},".exe",[23,8842,8843],{},"Approve the Windows security prompt if shown",[23,8845,8846],{},"Start the setup wizard",[11,8848,8850,8853],{"id":8849,"level":990},"windows-installer-features",[16,8851,8852],{"id":8849},"Windows Installer: Features",[109,8854,8855,8863],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,8856,8857],{"v-slot:left":116},[52,8858,8859],{},[281,8860],{"alt":8861,"src":8862,"variant":285},"VirtualBox Windows installer feature selection screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step2.png",[114,8864,8865],{"v-slot:right":116},[20,8866,8867,8870],{},[23,8868,8869],{},"Keep the default install location",[23,8871,8872],{},"Keep the default features selected",[11,8874,8876,8879],{"id":8875,"level":990},"windows-installer-network-warning",[16,8877,8878],{"id":8875},"Windows Installer: Network Warning",[109,8880,8881,8889],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,8882,8883],{"v-slot:left":116},[52,8884,8885],{},[281,8886],{"alt":8887,"src":8888,"variant":285},"VirtualBox Windows installer network warning","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step3.png",[114,8890,8891],{"v-slot:right":116},[20,8892,8893,8896,8899],{},[23,8894,8895],{},"VirtualBox may reset network adapters briefly",[23,8897,8898],{},"This is expected during install",[23,8900,8901],{},"Save web work before continuing if needed",[11,8903,8905,8908],{"id":8904,"level":990},"windows-installer-ready",[16,8906,8907],{"id":8904},"Windows Installer: Ready",[109,8909,8910,8918],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,8911,8912],{"v-slot:left":116},[52,8913,8914],{},[281,8915],{"alt":8916,"src":8917,"variant":285},"VirtualBox Windows installer ready screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step4.png",[114,8919,8920],{"v-slot:right":116},[20,8921,8922,8925,8928],{},[23,8923,8924],{},"Start the installation",[23,8926,8927],{},"Keep the default choices",[23,8929,8930],{},"Wait for the installer to request permissions if needed",[11,8932,8934,8938],{"id":8933,"level":990},"windows-installer-progress",[16,8935,8937],{"id":8936},"windows-installer-start-options","Windows Installer: Start Options",[109,8939,8940,8948],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,8941,8942],{"v-slot:left":116},[52,8943,8944],{},[281,8945],{"alt":8946,"src":8947,"variant":285},"VirtualBox Windows installer progress screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step5.png",[114,8949,8950],{"v-slot:right":116},[20,8951,8952,8955],{},[23,8953,8954],{},"No need to create a Start Menu item or desktop shortcut unless desired",[23,8956,8957],{},"Third option is likely optional too since we'll be using the VirtualBox Manager",[11,8959,8961,8964],{"id":8960,"level":990},"windows-installer-permission",[16,8962,8963],{"id":8960},"Windows Installer: Permission",[109,8965,8966,8974],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,8967,8968],{"v-slot:left":116},[52,8969,8970],{},[281,8971],{"alt":8972,"src":8973,"variant":285},"VirtualBox Windows installer permission prompt","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step6.png",[114,8975,8976],{"v-slot:right":116},[20,8977,8978,8981],{},[23,8979,8980],{},"Proceed with install",[23,8982,8983,8984],{},"Approve VirtualBox driver prompts\n",[20,8985,8986],{},[23,8987,8988],{},"These let VirtualBox create virtual hardware",[11,8990,8992,8995],{"id":8991,"level":990},"windows-installer-complete",[16,8993,8994],{"id":8991},"Windows Installer: Complete",[109,8996,8997,9005],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,8998,8999],{"v-slot:left":116},[52,9000,9001],{},[281,9002],{"alt":9003,"src":9004,"variant":285},"VirtualBox Windows installer completion screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step7.png",[114,9006,9007],{"v-slot:right":116},[20,9008,9009,9011,9014],{},[23,9010,2926],{},[23,9012,9013],{},"Open VirtualBox",[23,9015,9016],{},"Continue to VM creation",[11,9018,9020,9024],{"id":9019,"level":14},"install-virtualbox-macos",[16,9021,9023],{"id":9022},"install-virtualbox-on-macos","Install VirtualBox On macOS",[109,9025,9026,9045],{"gap":111,"left-width":421,"right-width":422,"stack":2563},[114,9027,9028],{"v-slot:left":116},[20,9029,9030,9033,9036,9039,9042],{},[23,9031,9032],{},"Install the VirtualBox host package for your Mac CPU type",[23,9034,9035],{},"Intel Mac: standard macOS host installer",[23,9037,9038],{},"Apple Silicon Mac: Arm64 host installer and Arm64 Ubuntu Server ISO",[23,9040,9041],{},"Approve macOS security prompts if needed",[23,9043,9044],{},"If VirtualBox is not a good fit, use the VMware fallback lesson",[114,9046,9047],{"v-slot:right":116},[52,9048,9049],{},[281,9050],{"alt":9051,"src":9052,"variant":285},"Summary of macOS VirtualBox setup notes","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvm_summary_mac.png",[11,9054,9056,9060,9063],{"id":9055,"level":14},"step-1-create-vm",[16,9057,9059],{"id":9058},"step-1-create-the-vm","Step 1: Create The VM",[52,9061,9062],{},"Create a lightweight Ubuntu Server VM:",[20,9064,9065,9068,9076,9091,9103,9109,9112,9115],{},[23,9066,9067],{},"Type: Linux",[23,9069,9070,9071],{},"Version: Ubuntu 64-bit or Ubuntu Arm64\n",[20,9072,9073],{},[23,9074,9075],{},"Match the version to the ISO you downloaded",[23,9077,9078,9079,9082,9083],{},"Memory: ",[30,9080,9081],{},"1 GB"," course target\n",[20,9084,9085],{},[23,9086,2014,9087,9090],{},[30,9088,9089],{},"1.5-2 GB"," if the installer is too slow or refuses to continue (you shouldn't need to do this)",[23,9092,9093,9094,9096,9097],{},"Disk: ",[30,9095,8743],{}," course minimum\n",[20,9098,9099],{},[23,9100,9101,8752],{},[30,9102,8751],{},[23,9104,9105,9106,9108],{},"CPU: ",[30,9107,888],{}," core is enough for this course VM",[23,9110,9111],{},"Enable OpenSSH during install if prompted",[23,9113,9114],{},"Username: use your UCID",[23,9116,9117],{},"See the slides below for VM settings and Ubuntu install screens",[11,9119,9121,9124],{"id":9120,"level":990},"vm-setup-name-and-iso",[16,9122,9123],{"id":9120},"VM Setup: Name And ISO",[109,9125,9126,9134],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,9127,9128],{"v-slot:left":116},[52,9129,9130],{},[281,9131],{"alt":9132,"src":9133,"variant":285},"VirtualBox VM name and ISO setup","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_1.png",[114,9135,9136],{"v-slot:right":116},[20,9137,9138,9141,9147,9150],{},[23,9139,9140],{},"Start a new virtual machine",[23,9142,9143,9144],{},"Name it clearly, such as ",[30,9145,9146],{},"it202-vm",[23,9148,9149],{},"Choose the Ubuntu Server ISO file next",[23,9151,9152],{},"OS fields may look wrong until the ISO is selected",[11,9154,9156,9159],{"id":9155,"level":990},"vm-setup-confirm-ubuntu-iso",[16,9157,9158],{"id":9155},"VM Setup: Confirm Ubuntu ISO",[109,9160,9161,9169],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,9162,9163],{"v-slot:left":116},[52,9164,9165],{},[281,9166],{"alt":9167,"src":9168,"variant":285},"VirtualBox VM name and Ubuntu ISO selected","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_2.png",[114,9170,9171],{"v-slot:right":116},[20,9172,9173,9179,9185,9188],{},[23,9174,9175,9176],{},"Confirm OS is ",[30,9177,9178],{},"Linux",[23,9180,9181,9182],{},"Confirm distribution is ",[30,9183,9184],{},"Ubuntu",[23,9186,9187],{},"Confirm version matches your ISO",[23,9189,2581,9190,9193,9194],{},[30,9191,9192],{},"Unattended Installation"," off\n",[20,9195,9196],{},[23,9197,9198],{},"The Ubuntu installer screens are easier to teach manually",[11,9200,9202,9205],{"id":9201,"level":990},"vm-setup-memory-and-cpu",[16,9203,9204],{"id":9201},"VM Setup: Memory And CPU",[109,9206,9207,9215],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,9208,9209],{"v-slot:left":116},[52,9210,9211],{},[281,9212],{"alt":9213,"src":9214,"variant":285},"VirtualBox VM memory and CPU settings","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_4.png",[114,9216,9217],{"v-slot:right":116},[20,9218,9219,9232,9236,9239],{},[23,9220,9078,9221,9082,9224],{},[30,9222,9223],{},"1024 MB",[20,9225,9226,9229],{},[23,9227,9228],{},"The goal is to match free-tier cloud services",[23,9230,9231],{},"Demonstrates that small apps can run with limited resources",[23,9233,9105,9234],{},[30,9235,888],{},[23,9237,9238],{},"Keep EFI off unless your machine requires it",[23,9240,9241],{},"This VM is for Apache, PHP, MySQL, and local development\u002Ftesting",[11,9243,9245,9248],{"id":9244,"level":990},"vm-setup-virtual-disk",[16,9246,9247],{"id":9244},"VM Setup: Virtual Disk",[109,9249,9250,9258],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,9251,9252],{"v-slot:left":116},[52,9253,9254],{},[281,9255],{"alt":9256,"src":9257,"variant":285},"VirtualBox virtual hard disk settings","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_5.png",[114,9259,9260],{"v-slot:right":116},[20,9261,9262,9268,9271,9283],{},[23,9263,9264,9265],{},"Disk type: ",[30,9266,9267],{},"VDI",[23,9269,9270],{},"Storage: dynamically allocated",[23,9272,9273,9274,9276],{},"Minimum: ",[30,9275,8743],{},[20,9277,9278],{},[23,9279,9280,9282],{},[30,9281,8751],{}," is safer if you have room",[23,9284,9285],{},"Dynamic disk uses space as needed, not all at once",[11,9287,9289,9292],{"id":9288,"level":990},"vm-setup-start-with-gui",[16,9290,9291],{"id":9288},"VM Setup: Start With GUI",[109,9293,9294,9302],{"gap":111,"left-width":2562,"right-width":332,"stack":2563},[114,9295,9296],{"v-slot:left":116},[52,9297,9298],{},[281,9299],{"alt":9300,"src":9301,"variant":285},"VirtualBox VM selected with the Start button visible","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_6.png",[114,9303,9304],{"v-slot:right":116},[20,9305,9306,9309,9319,9322],{},[23,9307,9308],{},"Select the newly created VM",[23,9310,300,9311,9314],{},[30,9312,9313],{},"Start",[20,9315,9316],{},[23,9317,9318],{},"Choose the normal GUI start for the first boot",[23,9320,9321],{},"Complete the Ubuntu installer in the VM window",[23,9323,9324,9325],{},"After install and SSH setup, future starts can be headless\n",[20,9326,9327],{},[23,9328,9329,9330,9332],{},"You will connect with ",[30,9331,4435],{}," when you need the VM",[11,9334,9336,9340,9343],{"id":9335,"level":14},"ubuntu-installer",[16,9337,9339],{"id":9338},"step-2-ubuntu-installer","Step 2: Ubuntu Installer",[52,9341,9342],{},"Use the Ubuntu Server installer after the VM starts:",[20,9344,9345,9348,9351,9354,9357,9360,9393],{},[23,9346,9347],{},"Choose the default course options unless noted",[23,9349,9350],{},"Continue without updating the installer if instructed",[23,9352,9353],{},"Use your UCID for the Ubuntu username",[23,9355,9356],{},"Install OpenSSH server during setup",[23,9358,9359],{},"Skip optional server snaps",[23,9361,9362,9363],{},"Keyboard navigation:\n",[20,9364,9365,9372,9382,9388],{},[23,9366,9367,9371],{},[9368,9369,9370],"kbd",{},"Tab"," moves between fields and buttons",[23,9373,9374,9377,9378,9381],{},[9368,9375,9376],{},"Up"," \u002F ",[9368,9379,9380],{},"Down"," moves through lists",[23,9383,9384,9387],{},[9368,9385,9386],{},"Space"," toggles checkboxes",[23,9389,9390,9392],{},[9368,9391,2097],{}," confirms the selected option",[23,9394,9395],{},"See the slides below for the installer screens",[11,9397,9399,9403],{"id":9398,"level":990},"ubuntu-installer-boot-menu",[16,9400,9402],{"id":9401},"step-21-boot-menu","Step 2.1: Boot Menu",[109,9404,9407,9416],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},"1.75fr","0.65fr",[114,9408,9409],{"v-slot:left":116},[52,9410,9411],{},[281,9412],{"alt":9413,"src":9414,"variant":9415},"Ubuntu Server boot menu in VirtualBox","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_1.png","slide-screenshot",[114,9417,9418],{"v-slot:right":116},[20,9419,9420,9425,9429],{},[23,9421,126,9422],{},[30,9423,9424],{},"Try or Install Ubuntu Server",[23,9426,2129,9427],{},[9368,9428,2097],{},[23,9430,9431],{},"This starts the Ubuntu Server installer",[11,9433,9435,9439],{"id":9434,"level":990},"ubuntu-installer-language",[16,9436,9438],{"id":9437},"step-22-language","Step 2.2: Language",[109,9440,9441,9449],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9442,9443],{"v-slot:left":116},[52,9444,9445],{},[281,9446],{"alt":9447,"src":9448,"variant":9415},"Ubuntu Server installer language screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_2.0.png",[114,9450,9451],{"v-slot:right":116},[20,9452,9453,9456,9462],{},[23,9454,9455],{},"Choose your preferred language",[23,9457,9458,9461],{},[30,9459,9460],{},"English"," is the expected course screenshot path",[23,9463,2129,9464,9466],{},[9368,9465,2097],{}," to continue",[11,9468,9470,9474],{"id":9469,"level":990},"ubuntu-installer-update",[16,9471,9473],{"id":9472},"step-23-update-prompt","Step 2.3: Update Prompt",[109,9475,9476,9484],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9477,9478],{"v-slot:left":116},[52,9479,9480],{},[281,9481],{"alt":9482,"src":9483,"variant":9415},"Ubuntu Server installer update prompt","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_2.5.png",[114,9485,9486],{"v-slot:right":116},[20,9487,9488,9498,9501],{},[23,9489,126,9490,9493],{},[30,9491,9492],{},"Continue without updating",[20,9494,9495],{},[23,9496,9497],{},"If I forget to update the image, it's the second option",[23,9499,9500],{},"Keeps the install path consistent",[23,9502,9503],{},"Package updates happen after Ubuntu is installed",[11,9505,9507,9511],{"id":9506,"level":990},"ubuntu-installer-keyboard",[16,9508,9510],{"id":9509},"step-24-keyboard","Step 2.4: Keyboard",[109,9512,9513,9521],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9514,9515],{"v-slot:left":116},[52,9516,9517],{},[281,9518],{"alt":9519,"src":9520,"variant":9415},"Ubuntu Server installer keyboard screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_3.png",[114,9522,9523],{"v-slot:right":116},[20,9524,9525,9528,9534],{},[23,9526,9527],{},"Keep the detected keyboard layout if it matches",[23,9529,9530,9531],{},"Common setting: ",[30,9532,9533],{},"English (US)",[23,9535,9536],{},"Use Identify keyboard only if typing is wrong",[11,9538,9540,9544],{"id":9539,"level":990},"ubuntu-installer-install-type",[16,9541,9543],{"id":9542},"step-25-install-type","Step 2.5: Install Type",[109,9545,9546,9554],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9547,9548],{"v-slot:left":116},[52,9549,9550],{},[281,9551],{"alt":9552,"src":9553,"variant":9415},"Ubuntu Server installer installation type screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_4.png",[114,9555,9556],{"v-slot:right":116},[20,9557,9558,9568,9571],{},[23,9559,9560,9561,9564,9565],{},"Select ",[30,9562,9563],{},"Ubuntu Server (minimized)","; don't choose full ",[30,9566,9567],{},"Ubuntu Server",[23,9569,9570],{},"Keep third-party drivers unchecked",[23,9572,9573],{},"Minimized keeps the VM lighter and aids future lessons",[11,9575,9577,9581],{"id":9576,"level":990},"ubuntu-installer-network",[16,9578,9580],{"id":9579},"step-26-network","Step 2.6: Network",[109,9582,9583,9591],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9584,9585],{"v-slot:left":116},[52,9586,9587],{},[281,9588],{"alt":9589,"src":9590,"variant":9415},"Ubuntu Server installer network configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_5.png",[114,9592,9593],{"v-slot:right":116},[20,9594,9595,9598,9604],{},[23,9596,9597],{},"DHCP address is expected",[23,9599,9600,9603],{},[30,9601,9602],{},"10.0.2.15"," is normal for VirtualBox NAT",[23,9605,9606],{},"Leave the network settings alone",[11,9608,9610,9614],{"id":9609,"level":990},"ubuntu-installer-proxy",[16,9611,9613],{"id":9612},"step-27-proxy","Step 2.7: Proxy",[109,9615,9616,9624],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9617,9618],{"v-slot:left":116},[52,9619,9620],{},[281,9621],{"alt":9622,"src":9623,"variant":9415},"Ubuntu Server installer proxy screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_6.png",[114,9625,9626],{"v-slot:right":116},[20,9627,9628,9631,9634],{},[23,9629,9630],{},"Leave proxy blank",[23,9632,9633],{},"Only fill this in if your network requires a proxy",[23,9635,9636],{},"Most student home networks do not need one",[11,9638,9640,9644],{"id":9639,"level":990},"ubuntu-installer-mirror",[16,9641,9643],{"id":9642},"step-28-mirror","Step 2.8: Mirror",[109,9645,9646,9654],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9647,9648],{"v-slot:left":116},[52,9649,9650],{},[281,9651],{"alt":9652,"src":9653,"variant":9415},"Ubuntu Server installer archive mirror screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_7.png",[114,9655,9656],{"v-slot:right":116},[20,9657,9658,9661,9664],{},[23,9659,9660],{},"Keep the default Ubuntu archive mirror",[23,9662,9663],{},"Wait for the mirror check to finish",[23,9665,9666],{},"Continue when the installer allows it",[11,9668,9670,9674],{"id":9669,"level":990},"ubuntu-installer-storage-guided",[16,9671,9673],{"id":9672},"step-29-guided-storage","Step 2.9: Guided Storage",[109,9675,9676,9684],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9677,9678],{"v-slot:left":116},[52,9679,9680],{},[281,9681],{"alt":9682,"src":9683,"variant":9415},"Ubuntu Server installer guided storage screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_8.png",[114,9685,9686],{"v-slot:right":116},[20,9687,9688,9691,9694],{},[23,9689,9690],{},"Use the entire virtual disk",[23,9692,9693],{},"LVM is optional, not needed for this course VM",[23,9695,9696],{},"Leave encryption off",[11,9698,9700,9704],{"id":9699,"level":990},"ubuntu-installer-storage-summary",[16,9701,9703],{"id":9702},"step-210-storage-summary","Step 2.10: Storage Summary",[109,9705,9706,9714],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9707,9708],{"v-slot:left":116},[52,9709,9710],{},[281,9711],{"alt":9712,"src":9713,"variant":9415},"Ubuntu Server installer storage summary screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_9.png",[114,9715,9716],{"v-slot:right":116},[20,9717,9718,9721,9724],{},[23,9719,9720],{},"Confirm the virtual disk is selected",[23,9722,9723],{},"This only affects the VM disk file",[23,9725,9726],{},"Continue when the layout looks correct",[11,9728,9730,9734],{"id":9729,"level":990},"ubuntu-installer-confirm-storage",[16,9731,9733],{"id":9732},"step-211-confirm-storage","Step 2.11: Confirm Storage",[109,9735,9736,9744],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9737,9738],{"v-slot:left":116},[52,9739,9740],{},[281,9741],{"alt":9742,"src":9743,"variant":9415},"Ubuntu Server installer destructive action confirmation","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_10.png",[114,9745,9746],{"v-slot:right":116},[20,9747,9748,9751,9754],{},[23,9749,9750],{},"Confirm the virtual disk format",[23,9752,9753],{},"This does not erase your host computer files",[23,9755,9756],{},"It formats the VM's virtual disk",[11,9758,9760,9764],{"id":9759,"level":990},"ubuntu-installer-profile",[16,9761,9763],{"id":9762},"step-212-profile","Step 2.12: Profile",[109,9765,9766,9774],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9767,9768],{"v-slot:left":116},[52,9769,9770],{},[281,9771],{"alt":9772,"src":9773,"variant":9415},"Ubuntu Server installer profile configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_11.png",[114,9775,9776],{"v-slot:right":116},[20,9777,9778,9781,9786,9788],{},[23,9779,9780],{},"Your name: your UCID or name is fine",[23,9782,9783,9784],{},"Server name: ",[30,9785,9146],{},[23,9787,5651],{},[23,9789,9790],{},"Choose a password you can type reliably (it can be simple since it's only for local work)",[11,9792,9794,9798],{"id":9793,"level":990},"ubuntu-installer-pro",[16,9795,9797],{"id":9796},"step-213-ubuntu-pro","Step 2.13: Ubuntu Pro",[109,9799,9800,9808],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9801,9802],{"v-slot:left":116},[52,9803,9804],{},[281,9805],{"alt":9806,"src":9807,"variant":9415},"Ubuntu Server installer Ubuntu Pro screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_12.png",[114,9809,9810],{"v-slot:right":116},[20,9811,9812,9817,9820],{},[23,9813,126,9814],{},[30,9815,9816],{},"Skip for now",[23,9818,9819],{},"Ubuntu Pro is not needed for the course VM",[23,9821,9822],{},"You can continue without an Ubuntu account",[11,9824,9826,9830],{"id":9825,"level":990},"ubuntu-installer-ssh",[16,9827,9829],{"id":9828},"step-214-ssh","Step 2.14: SSH",[109,9831,9832,9840],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9833,9834],{"v-slot:left":116},[52,9835,9836],{},[281,9837],{"alt":9838,"src":9839,"variant":9415},"Ubuntu Server installer SSH configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_13.png",[114,9841,9842],{"v-slot:right":116},[20,9843,9844,9849,9852],{},[23,9845,663,9846],{},[30,9847,9848],{},"Install OpenSSH server",[23,9850,9851],{},"Password authentication is fine for this local VM",[23,9853,9854],{},"No need to import SSH keys for this course setup",[11,9856,9858,9862],{"id":9857,"level":990},"ubuntu-installer-snaps",[16,9859,9861],{"id":9860},"step-215-featured-snaps","Step 2.15: Featured Snaps",[109,9863,9864,9872],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9865,9866],{"v-slot:left":116},[52,9867,9868],{},[281,9869],{"alt":9870,"src":9871,"variant":9415},"Ubuntu Server installer featured server snaps screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_14.png",[114,9873,9874],{"v-slot:right":116},[20,9875,9876,9879,9884],{},[23,9877,9878],{},"Leave all featured snaps unchecked",[23,9880,9881,9882],{},"Apache, PHP, and MySQL are installed later with ",[30,9883,6922],{},[23,9885,9886],{},"Continue without selecting extra packages",[11,9888,9890,9894],{"id":9889,"level":990},"ubuntu-installer-installing",[16,9891,9893],{"id":9892},"step-216-installing","Step 2.16: Installing",[109,9895,9896,9904],{"gap":886,"left-width":9405,"right-width":9406,"stack":2563},[114,9897,9898],{"v-slot:left":116},[52,9899,9900],{},[281,9901],{"alt":9902,"src":9903,"variant":9415},"Ubuntu Server installer installing system screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_15.png",[114,9905,9906,9931],{"v-slot:right":116},[20,9907,9908,9911,9914,9922,9928],{},[23,9909,9910],{},"Installation can take a while",[23,9912,9913],{},"High CPU during install is normal",[23,9915,9916,9917,9919,9920],{},"If install struggles at ",[30,9918,9081],{},", recreate the VM with ",[30,9921,9089],{},[23,9923,9924,9925,9927],{},"Keep the course target at ",[30,9926,9081],{}," after setup if possible",[23,9929,9930],{},"Reboot once complete",[2778,9932,9933],{"type":4045},[52,9934,9935],{},"These target resources stay close to common cloud free-tier VMs",[52,9937,2786],{},[11,9939,9941,9945,9948],{"id":9940,"level":14},"step-2-networking",[16,9942,9944],{"id":9943},"virtualbox-configure-networking","VirtualBox: Configure Networking",[52,9946,9947],{},"Use one NAT adapter with port forwarding:",[20,9949,9950,9956,9965,9973,9978],{},[23,9951,9952,9953],{},"VM internet: ",[30,9954,9955],{},"NAT",[23,9957,9958,9959,9962,9963],{},"Host SSH: host ",[30,9960,9961],{},"22"," -> guest ",[30,9964,9961],{},[23,9966,9967,9968,9962,9971],{},"Host browser: host ",[30,9969,9970],{},"3000",[30,9972,890],{},[23,9974,2014,9975,9977],{},[30,9976,8778],{}," from the host computer",[23,9979,9980],{},"See the slides below for adapter and port-forwarding screens",[11,9982,9984,9988,10001],{"id":9983,"level":990},"adapter-settings-screen",[16,9985,9987],{"id":9986},"adapter-settings","Adapter Settings",[20,9989,9990,9993,9998],{},[23,9991,9992],{},"Adapter 1 enabled",[23,9994,9995,9996],{},"Attached to ",[30,9997,9955],{},[23,9999,10000],{},"No second adapter needed for the baseline path",[52,10002,10003],{},[281,10004],{"alt":10005,"src":10006,"variant":9415},"VirtualBox Adapter 1 configured as NAT","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_adapter_1.png",[11,10008,10010,10014,10042],{"id":10009,"level":990},"port-forwarding-screen",[16,10011,10013],{"id":10012},"port-forwarding","Port Forwarding",[20,10015,10016,10024,10031],{},[23,10017,10018,10019,10021,10022],{},"SSH: host ",[30,10020,9961],{}," to guest ",[30,10023,9961],{},[23,10025,10026,10027,10021,10029],{},"Apache HTTP: host ",[30,10028,9970],{},[30,10030,890],{},[23,10032,10033,10034,10036,10037,10021,10040],{},"If host ",[30,10035,9961],{}," is already busy, use host ",[30,10038,10039],{},"2222",[30,10041,9961],{},[52,10043,10044],{},[281,10045],{"alt":10046,"src":10047,"variant":9415},"VirtualBox NAT port forwarding rules","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_adapter_1_ports.png",[11,10049,10051,10055,10058,10061,10064,10067],{"id":10050,"level":14},"step-3-connect-ssh",[16,10052,10054],{"id":10053},"step-3-connect-with-ssh","Step 3: Connect With SSH",[52,10056,10057],{},"Run from your host terminal:",[1748,10059],{"language":1750,"src":10060},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-3-connect-with-ssh-01.sh",[52,10062,10063],{},"First connection prompt:",[1748,10065],{"language":4505,"src":10066},"\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,10068,10069,10076,10085,10088,10091],{},[23,10070,10071,10072,10075],{},"Replace ",[30,10073,10074],{},"your_ucid"," with your UCID",[23,10077,10078,10079,10081,10082,10084],{},"Type ",[30,10080,3972],{}," once for this course VM on ",[30,10083,8778],{}," (if prompted like the example above)",[23,10086,10087],{},"Enter your Ubuntu password",[23,10089,10090],{},"After login, commands run inside Ubuntu",[23,10092,10093,713,10096,10099],{},[30,10094,10095],{},"exit",[30,10097,10098],{},"logout"," disconnects from the VM",[11,10101,10103,10107,10110],{"id":10102,"level":14},"step-4-confirm-network",[16,10104,10106],{"id":10105},"step-4-confirm-vm-network","Step 4: Confirm VM Network",[52,10108,10109],{},"Run inside Ubuntu through SSH:",[109,10111,10112,10154],{"gap":111,"left-width":333,"right-width":112,"stack":2563},[114,10113,10114,10117,10120],{"v-slot:left":116},[52,10115,10116],{},"Network check:",[1748,10118],{"language":1750,"src":10119},"\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,10121,10122,10128,10134,10140,10146],{},[23,10123,10124,10127],{},[30,10125,10126],{},"ping",": confirms basic network access",[23,10129,10130,10133],{},[30,10131,10132],{},"-c 4",": stop after four replies",[23,10135,10136,10139],{},[30,10137,10138],{},"apt update",": refreshes package indexes",[23,10141,10142,10145],{},[30,10143,10144],{},"apt upgrade",": applies available package updates",[23,10147,3023,10148,10150,10151],{},[30,10149,10126],{}," is not found, run ",[30,10152,10153],{},"sudo apt install iputils-ping",[114,10155,10156,10159,10162],{"v-slot:right":116},[52,10157,10158],{},"Port-forwarding check:",[1748,10160],{"language":1750,"src":10161},"\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,10163,10164,10169,10172,10176],{},[23,10165,10166,10167],{},"The VM may show ",[30,10168,9602],{},[23,10170,10171],{},"That is normal for VirtualBox NAT",[23,10173,2014,10174,9977],{},[30,10175,8778],{},[23,10177,10178],{},"Port forwarding routes host traffic into the VM",[11,10180,10182,10186],{"id":10181,"level":14},"step-5-shared-folder",[16,10183,10185],{"id":10184},"step-5-enable-shared-folder","Step 5: Enable Shared Folder",[109,10187,10188,10222],{"gap":111,"left-width":332,"right-width":333,"stack":2563},[114,10189,10190,10193],{"v-slot:left":116},[52,10191,10192],{},"In VirtualBox:",[20,10194,10195,10198,10201,10204,10207,10210,10213,10216,10219],{},[23,10196,10197],{},"Open VM settings",[23,10199,10200],{},"Choose Shared Folders",[23,10202,10203],{},"Folder Path: your cloned course repository folder",[23,10205,10206],{},"Folder Name: a simple repo name with no spaces",[23,10208,10209],{},"Mount Point: leave blank",[23,10211,10212],{},"Read-only: off",[23,10214,10215],{},"Auto-mount: on",[23,10217,10218],{},"Make Machine-permanent: on",[23,10220,10221],{},"Make Global: off",[114,10223,10224],{"v-slot:right":116},[52,10225,10226],{},[281,10227],{"alt":10228,"src":10229,"variant":285},"VirtualBox shared folder settings with the course repo selected","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_shared_folder.png",[11,10231,10233,10237,10240,10243],{"id":10232,"level":14},"step-6-guest-additions",[16,10234,10236],{"id":10235},"step-6-install-shared-folder-support","Step 6: Install Shared Folder Support",[52,10238,10239],{},"Run inside Ubuntu:",[1748,10241],{"language":1750,"src":10242},"\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,10244,10245,10252,10258],{},[23,10246,3209,10247,181,10249,10251],{},[30,10248,10138],{},[30,10250,10144],{}," first only if you skipped the Step 4 updates",[23,10253,10254,10257],{},[30,10255,10256],{},"virtualbox-guest-utils",": VirtualBox shared-folder support",[23,10259,10260],{},"Reboot after the group step on the next slide",[11,10262,10264,10268,10271,10274],{"id":10263,"level":990},"step-6b-confirm-vboxsf",[16,10265,10267],{"id":10266},"step-61-check-the-shared-folder","Step 6.1: Check The Shared Folder",[52,10269,10270],{},"Reconnect with SSH, then run inside Ubuntu:",[1748,10272],{"language":1750,"src":10273},"\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,10275,10276,10282,10288],{},[23,10277,10278,10281],{},[30,10279,10280],{},"ls \u002Fmedia",": shows available mounted folders",[23,10283,10284,10287],{},[30,10285,10286],{},"ls \u002Fmedia\u002F\u003Cshared-folder>",": checks your course repo share",[23,10289,10290],{},"Permission denied is common the first time",[11,10292,10294,10298,10301,10304],{"id":10293,"level":14},"step-7-locate-share",[16,10295,10297],{"id":10296},"step-7-allow-shared-folder-access","Step 7: Allow Shared Folder Access",[52,10299,10300],{},"If the shared folder exists but says permission denied:",[1748,10302],{"language":1750,"src":10303},"\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,10305,10306,10312,10318],{},[23,10307,10308,10311],{},[30,10309,10310],{},"vboxsf",": group allowed to read VirtualBox shared folders",[23,10313,10314,10317],{},[30,10315,10316],{},"$USER",": your Ubuntu login user for terminal access",[23,10319,10320],{},"Reboot applies the shared-folder support and new group membership",[11,10322,10324,10328,10330,10333,10350,10353],{"id":10323,"level":990},"step-7b-locate-share",[16,10325,10327],{"id":10326},"step-71-locate-the-shared-repo","Step 7.1: Locate The Shared Repo",[52,10329,10270],{},[1748,10331],{"language":1750,"src":10332},"\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,10334,10335,10341,10347],{},[23,10336,10337,10340],{},[30,10338,10339],{},"\u002Fmedia",": VirtualBox auto-mounted shared folders",[23,10342,10343,10346],{},[30,10344,10345],{},"\u003Cshared-folder>",": your shared course repo folder name",[23,10348,10349],{},"Use the folder that points to your repository",[52,10351,10352],{},"Expected repo folders:",[20,10354,10355,10359,10363,10367],{},[23,10356,10357],{},[30,10358,167],{},[23,10360,10361],{},[30,10362,171],{},[23,10364,10365],{},[30,10366,175],{},[23,10368,10369],{},[30,10370,6374],{},[11,10372,10374,10378,10393],{"id":10373,"level":990},"step-7-2-shared-folder-check",[16,10375,10377],{"id":10376},"step-72-shared-folder-check","Step 7.2: Shared Folder Check",[20,10379,10380,10383,10390],{},[23,10381,10382],{},"Edit a small file from VS Code on host",[23,10384,3209,10385,713,10387,10389],{},[30,10386,1678],{},[30,10388,1897],{}," inside Ubuntu",[23,10391,10392],{},"Confirm Ubuntu sees the same file content",[52,10394,10395],{},"If the file does not match, stop and fix the share before Apache setup",[11,10397,10399,10403,10405,10408],{"id":10398,"level":14},"step-8-install-apache-php-mysql",[16,10400,10402],{"id":10401},"step-8-install-apache-php-and-mysql","Step 8: Install Apache, PHP, And MySQL",[52,10404,10239],{},[1748,10406],{"language":1750,"src":10407},"\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,10409,10410,10416,10421,10427,10433,10439],{},[23,10411,10412,10415],{},[30,10413,10414],{},"apache2",": web server",[23,10417,10418,10420],{},[30,10419,6163],{},": PHP runtime",[23,10422,10423,10426],{},[30,10424,10425],{},"libapache2-mod-php",": lets Apache execute PHP files",[23,10428,10429,10432],{},[30,10430,10431],{},"mysql-server",": local MySQL database server",[23,10434,10435,10438],{},[30,10436,10437],{},"php-mysql",": lets PHP connect to MySQL",[23,10440,3209,10441,181,10443,10445],{},[30,10442,10138],{},[30,10444,10144],{}," first only if they have not been run recently",[11,10447,10449,10453,10460],{"id":10448,"level":990},"optional-swap-check",[16,10450,10452],{"id":10451},"optional-add-swap-if-swap-is-off","Optional: Add Swap If Swap Is Off",[52,10454,10455,10456,10459],{},"Ubuntu usually has swap already. Only add this if ",[30,10457,10458],{},"swapon --show"," prints nothing.",[109,10461,10462,10476],{"gap":111,"left-width":112,"right-width":112},[114,10463,10464,10467,10470,10473],{"v-slot:left":116},[52,10465,10466],{},"Check first:",[1748,10468],{"language":1750,"src":10469},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-add-swap-if-swa-10.sh",[52,10471,10472],{},"Add a small swap file only if swap is off:",[1748,10474],{"language":1750,"src":10475},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-add-swap-if-swa-11.sh",[114,10477,10478],{"v-slot:right":116},[20,10479,10480,10483,10488,10491],{},[23,10481,10482],{},"Swap gives Ubuntu emergency disk-backed memory",[23,10484,10485,10486],{},"It helps when installs or MySQL briefly need more than ",[30,10487,9081],{},[23,10489,10490],{},"It is slower than RAM, so it is not a performance upgrade",[23,10492,10493],{},"Do not run the setup again if swap already exists",[11,10495,10497,10501,10507],{"id":10496,"level":990},"optional-apache-low-memory",[16,10498,10500],{"id":10499},"optional-limit-apache-memory-use","Optional: Limit Apache Memory Use",[52,10502,10503,10504,10506],{},"Use this if the ",[30,10505,9081],{}," VM feels unstable or Apache starts too many PHP workers.",[109,10508,10509,10522],{"gap":111,"left-width":112,"right-width":112},[114,10510,10511,10514,10519],{"v-slot:left":116},[52,10512,10513],{},"Edit Apache prefork settings in:",[52,10515,10516],{},[30,10517,10518],{},"\u002Fetc\u002Fapache2\u002Fmods-available\u002Fmpm_prefork.conf",[1748,10520],{"language":1750,"src":10521},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-apache-me-12.sh",[114,10523,10524,10527,10531],{"v-slot:right":116},[52,10525,10526],{},"Change the existing values to:",[1748,10528],{"language":10529,"src":10530},"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,10532,10533,10539,10542,10549],{},[23,10534,10535,10536],{},"Edit the existing lines inside ",[30,10537,10538],{},"\u003CIfModule mpm_prefork_module>",[23,10540,10541],{},"If a line is missing, add it inside that same block",[23,10543,10544,10545,10548],{},"Do not paste a second ",[30,10546,10547],{},"\u003CIfModule>"," block",[23,10550,10551],{},"Restart Apache after config changes",[11,10553,10555,10559,10565],{"id":10554,"level":990},"optional-mysql-low-memory",[16,10556,10558],{"id":10557},"optional-limit-mysql-memory-use","Optional: Limit MySQL Memory Use",[52,10560,10561,10562,10564],{},"Use this only if MySQL struggles on the ",[30,10563,9081],{}," VM.",[109,10566,10567,10580],{"gap":111,"left-width":112,"right-width":112},[114,10568,10569,10572,10577],{"v-slot:left":116},[52,10570,10571],{},"Edit MySQL server settings in:",[52,10573,10574],{},[30,10575,10576],{},"\u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf",[1748,10578],{"language":1750,"src":10579},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-mysql-mem-14.sh",[114,10581,10582,10588,10591],{"v-slot:right":116},[52,10583,10584,10585,2121],{},"Add or edit these under ",[30,10586,10587],{},"[mysqld]",[1748,10589],{"language":6963,"src":10590},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-mysql-mem-15.txt",[20,10592,10593,10599,10604,10607],{},[23,10594,10595,10596,10598],{},"Keep these under the existing ",[30,10597,10587],{}," heading",[23,10600,10601,10602,10598],{},"Do not create a second ",[30,10603,10587],{},[23,10605,10606],{},"If either setting already exists, edit it instead of adding a duplicate",[23,10608,10609],{},"Restart MySQL after config changes",[11,10611,10613,10616,10619,10622],{"id":10612,"level":990},"low-memory-diagnostics",[16,10614,10615],{"id":10612},"Low Memory Diagnostics",[52,10617,10618],{},"Run these after the minor tuning checks:",[1748,10620],{"language":1750,"src":10621},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Flow-memory-diagnostics-10.sh",[20,10623,10624,10630,10635,10641,10648],{},[23,10625,10626,10629],{},[30,10627,10628],{},"free -h",": shows RAM and swap",[23,10631,10632,10634],{},[30,10633,10458],{},": confirms whether swap is active",[23,10636,10637,10640],{},[30,10638,10639],{},"systemctl status",": checks whether Apache and MySQL are running",[23,10642,10643,10644,10647],{},"No output from the ",[30,10645,10646],{},"grep"," line is usually good",[23,10649,10650],{},"Do not tune randomly; change one setting, restart, then retest",[11,10652,10654,10658,10660,10663,10666,10669],{"id":10653,"level":14},"step-9-create-local-mysql-db",[16,10655,10657],{"id":10656},"step-9-create-a-local-mysql-database","Step 9: Create A Local MySQL Database",[52,10659,10239],{},[1748,10661],{"language":1750,"src":10662},"\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",[52,10664,10665],{},"Then run in the MySQL prompt:",[1748,10667],{"language":6374,"src":10668},"\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,10670,10671,10675,10678],{},[23,10672,10071,10673,10075],{},[30,10674,10074],{},[23,10676,10677],{},"Database name and username should match your UCID",[23,10679,10680],{},"Password is local-only unless your instructor says otherwise",[11,10682,10684,10687,10690,10703,10706,10712],{"id":10683,"level":14},"local-vs-remote-database",[16,10685,10686],{"id":10683},"Local Vs Remote Database",[52,10688,10689],{},"This MySQL database is only for local testing:",[20,10691,10692,10696,10698,10700],{},[23,10693,5639,10694],{},[30,10695,8778],{},[23,10697,5654],{},[23,10699,5651],{},[23,10701,10702],{},"Password: your local password",[52,10704,10705],{},"Render uses the instructor-provided remote database connection string",[52,10707,10708,10709],{},"Get that string from ",[439,10710,441],{"href":441,"rel":10711},[443],[52,10713,10714],{},"After this lesson, you may optionally point local code at that remote database for extra testing",[11,10716,10718,10722,10724,10727,10729,10732,10735],{"id":10717,"level":14},"step-10-confirm-local-mysql",[16,10719,10721],{"id":10720},"step-10-confirm-local-mysql-login","Step 10: Confirm Local MySQL Login",[52,10723,10239],{},[1748,10725],{"language":1750,"src":10726},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-10-confirm-local-my-13.sh",[52,10728,5151],{},[1748,10730],{"language":6374,"src":10731},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-10-confirm-local-my-14.sql",[52,10733,10734],{},"Expected:",[20,10736,10737,10743],{},[23,10738,10739,10742],{},[30,10740,10741],{},"SELECT DATABASE()"," returns your UCID",[23,10744,10745,10748],{},[30,10746,10747],{},"SHOW TABLES"," is empty or shows starter tables later",[11,10750,10752,10758,10761,10764,10767],{"id":10751,"level":14},"step-11-documentroot",[16,10753,10755,10756],{"id":10754},"step-11-point-apache-at-public_html","Step 11: Point Apache At ",[30,10757,167],{},[52,10759,10760],{},"Apache should serve:",[1748,10762],{"language":4505,"src":10763},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-11-point-apache-at--15.txt",[52,10765,10766],{},"Do not serve the whole repo",[20,10768,10769,10778],{},[23,10770,10771,168,10773,172,10775,10777],{},[30,10772,171],{},[30,10774,175],{},[30,10776,6374],{}," stay outside the web root",[23,10779,10780,10782],{},[30,10781,167],{}," is the browser-facing folder",[11,10784,10786,10790,10793,10798,10800,10805,10808,10811],{"id":10785,"level":990},"apache-site-config",[16,10787,10789],{"id":10788},"step-111-apache-site-config","Step 11.1: Apache Site Config",[52,10791,10792],{},"Create or edit this Apache site config file inside Ubuntu:",[52,10794,10795],{},[30,10796,10797],{},"\u002Fetc\u002Fapache2\u002Fsites-available\u002Fit202.conf",[52,10799,1746],{},[52,10801,10802],{},[30,10803,10804],{},"sudo nano \u002Fetc\u002Fapache2\u002Fsites-available\u002Fit202.conf",[52,10806,10807],{},"Add this content to that file:",[1748,10809],{"language":10529,"src":10810},"\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,10812,10813,10818,10824,10829],{},[23,10814,10071,10815,10817],{},[30,10816,10345],{}," with the actual shared folder name",[23,10819,10820,10821],{},"Save the file as ",[30,10822,10823],{},"it202.conf",[23,10825,10826,10827],{},"Apache listens on guest port ",[30,10828,890],{},[23,10830,10831,10832],{},"Host browser reaches it through ",[30,10833,8636],{},[11,10835,10837,10841,10843,10846],{"id":10836,"level":990},"enable-site",[16,10838,10840],{"id":10839},"step-112-enable-the-site","Step 11.2: Enable The Site",[52,10842,10239],{},[1748,10844],{"language":1750,"src":10845},"\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,10847,10848,10854,10860,10866,10874,10880],{},[23,10849,10850,10853],{},[30,10851,10852],{},"a2ensite",": enable a site config",[23,10855,10856,10859],{},[30,10857,10858],{},"a2dissite",": disable a site config",[23,10861,10862,10865],{},[30,10863,10864],{},"www-data",": Apache's user for browser requests",[23,10867,10868,10869,7115,10871,10873],{},"Adding ",[30,10870,10864],{},[30,10872,10310],{}," lets Apache read the shared folder",[23,10875,10876,10879],{},[30,10877,10878],{},"configtest",": check syntax before reload",[23,10881,10882,10885],{},[30,10883,10884],{},"restart",": applies the Apache user group change",[11,10887,10889,10893,10896,10899,10902],{"id":10888,"level":14},"step-12-php-check-page",[16,10890,10892],{"id":10891},"step-12-create-a-php-check-page","Step 12: Create A PHP Check Page",[52,10894,10895],{},"Create this file on the host:",[1748,10897],{"language":4505,"src":10898},"\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",[52,10900,10901],{},"Example content:",[1748,10903],{"language":6163,"src":10904},"\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,10906,10908,10911,10914,10917,10919],{"id":10907,"level":14},"final-browser-check",[16,10909,10910],{"id":10907},"Final Browser Check",[52,10912,10913],{},"Open from host browser:",[1748,10915],{"language":4505,"src":10916},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Ffinal-browser-check-20.txt",[52,10918,10734],{},[20,10920,10921,10924,10927,10930],{},[23,10922,10923],{},"Message appears",[23,10925,10926],{},"Time appears",[23,10928,10929],{},"PHP code is not shown as raw text",[23,10931,10932],{},"Editing the file on host changes output after refresh",[11,10934,10936,10939],{"id":10935,"level":14},"common-problems",[16,10937,10938],{"id":10935},"Common Problems",[20,10940,10941,10944,10947,10952,10955,10968,10978],{},[23,10942,10943],{},"Browser timeout: missing or wrong port-forwarding rule",[23,10945,10946],{},"Connection refused: Apache not running",[23,10948,10949,10950],{},"No internet in VM: check Adapter 1 is still ",[30,10951,9955],{},[23,10953,10954],{},"Shared folder missing: check Auto-mount and guest utilities",[23,10956,10957,10958,10961,10962,10964,10965,10967],{},"Browser shows ",[30,10959,10960],{},"403 Forbidden",": confirm ",[30,10963,10864],{}," is in ",[30,10966,10310],{},", then restart Apache or reboot",[23,10969,10970,10971,10974,10975,10977],{},"Permission denied on ",[30,10972,10973],{},"\u002Fmedia\u002Fsf_...",": confirm your Ubuntu user is in ",[30,10976,10310],{}," and reboot",[23,10979,10980],{},"Raw PHP code: PHP module not running through Apache",[11,10982,10984,10987,10990],{"id":10983,"level":14},"recovery-routine",[16,10985,10986],{"id":10983},"Recovery Routine",[52,10988,10989],{},"Check in this order:",[554,10991,10992,10995,11001,11007,11012,11020,11027,11033,11038,11047],{},[23,10993,10994],{},"VM is running",[23,10996,10997,11000],{},[30,10998,10999],{},"ping github.com"," works inside Ubuntu",[23,11002,11003,11006],{},[30,11004,11005],{},"ssh username@localhost"," works from host",[23,11008,11009,11011],{},[30,11010,10286],{}," shows the shared repo",[23,11013,11014,11017,11018],{},[30,11015,11016],{},"groups"," includes ",[30,11019,10310],{},[23,11021,11022,11017,11025],{},[30,11023,11024],{},"id www-data",[30,11026,10310],{},[23,11028,11029,11032],{},[30,11030,11031],{},"sudo systemctl status apache2"," is active",[23,11034,11035,11032],{},[30,11036,11037],{},"sudo systemctl status mysql",[23,11039,11040,11043,11044],{},[30,11041,11042],{},"sudo apache2ctl configtest"," says ",[30,11045,11046],{},"Syntax OK",[23,11048,11049,11052],{},[30,11050,11051],{},"http:\u002F\u002Flocalhost:3000\u002Fsystem\u002Fvm-check.php"," loads from the host browser",[11,11054,11055,11057],{"id":735,"level":14},[16,11056,738],{"id":735},[109,11058,11059,11100],{"gap":111,"left-width":112,"right-width":112},[114,11060,11061,11063,11069,11078,11083,11089,11095],{"v-slot:left":116},[118,11062,746],{"id":745},[52,11064,11065,11068],{},[750,11066,11067],{},"VM"," - separate computer running inside your host computer",[52,11070,11071,11074,11075,11077],{},[750,11072,11073],{},"Port forwarding"," - host ",[30,11076,8778],{}," traffic routed into the VM",[52,11079,11080,11082],{},[750,11081,10310],{}," - VirtualBox shared-folder permission group",[52,11084,11085,11088],{},[750,11086,11087],{},"Guest utilities"," - VirtualBox tools that help shared folders work inside Ubuntu",[52,11090,11091,11094],{},[750,11092,11093],{},"DocumentRoot"," - folder Apache serves to browsers",[52,11096,11097,11099],{},[750,11098,9955],{}," - VM network mode that gives the VM outbound internet access",[114,11101,11102,11104],{"v-slot:right":116},[118,11103,777],{"id":776},[20,11105,11106,11112,11119,11126,11133,11140,11146],{},[23,11107,11108],{},[439,11109,11111],{"href":8702,"rel":11110},[443],"VirtualBox Downloads",[23,11113,11114],{},[439,11115,11118],{"href":11116,"rel":11117},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002FIntroduction.html",[443],"VirtualBox Manual: Host And Guest Combinations",[23,11120,11121],{},[439,11122,11125],{"href":11123,"rel":11124},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Finstallation.html",[443],"VirtualBox Manual: Installation",[23,11127,11128],{},[439,11129,11132],{"href":11130,"rel":11131},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Fsharedfolders.html",[443],"VirtualBox Manual: Shared Folders",[23,11134,11135],{},[439,11136,11139],{"href":11137,"rel":11138},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Fnetworkingdetails.html#network_nat_service",[443],"VirtualBox Manual: NAT Port Forwarding",[23,11141,11142],{},[439,11143,11145],{"href":8720,"rel":11144},[443],"Ubuntu Server: Installer",[23,11147,11148],{},[439,11149,11152],{"href":11150,"rel":11151},"https:\u002F\u002Fdocumentation.ubuntu.com\u002Fserver\u002Fhow-to\u002Fsecurity\u002Fopenssh-server\u002F",[443],"Ubuntu Server: OpenSSH Server",[11,11154,11155,11157,11159],{"id":810,"level":14},[16,11156,813],{"id":810},[52,11158,2380],{},[20,11160,11161,11164,11167,11170,11173,11178],{},[23,11162,11163],{},"Pick the correct Ubuntu ISO for your host CPU",[23,11165,11166],{},"Configure NAT port forwarding",[23,11168,11169],{},"Connect to Ubuntu with SSH",[23,11171,11172],{},"Find the VirtualBox shared repo",[23,11174,11175,11176],{},"Configure Apache to serve ",[30,11177,167],{},[23,11179,11180],{},"Create a local MySQL database and user named after your UCID",{"title":116,"searchDepth":858,"depth":858,"links":11182},[11183,11184,11185,11186,11187,11188,11189,11190,11191,11192,11193,11194,11195,11196,11197,11198,11199,11200,11201,11202,11203,11204,11205,11206,11207,11208,11209,11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225,11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11241,11242,11243,11244,11245,11246,11247,11248],{"id":8582,"depth":858,"text":8574},{"id":8608,"depth":858,"text":8611},{"id":8653,"depth":858,"text":8656},{"id":106,"depth":858,"text":107},{"id":8758,"depth":858,"text":8761},{"id":8793,"depth":858,"text":8794},{"id":8817,"depth":858,"text":8820},{"id":8849,"depth":858,"text":8852},{"id":8875,"depth":858,"text":8878},{"id":8904,"depth":858,"text":8907},{"id":8936,"depth":858,"text":8937},{"id":8960,"depth":858,"text":8963},{"id":8991,"depth":858,"text":8994},{"id":9022,"depth":858,"text":9023},{"id":9058,"depth":858,"text":9059},{"id":9120,"depth":858,"text":9123},{"id":9155,"depth":858,"text":9158},{"id":9201,"depth":858,"text":9204},{"id":9244,"depth":858,"text":9247},{"id":9288,"depth":858,"text":9291},{"id":9338,"depth":858,"text":9339},{"id":9401,"depth":858,"text":9402},{"id":9437,"depth":858,"text":9438},{"id":9472,"depth":858,"text":9473},{"id":9509,"depth":858,"text":9510},{"id":9542,"depth":858,"text":9543},{"id":9579,"depth":858,"text":9580},{"id":9612,"depth":858,"text":9613},{"id":9642,"depth":858,"text":9643},{"id":9672,"depth":858,"text":9673},{"id":9702,"depth":858,"text":9703},{"id":9732,"depth":858,"text":9733},{"id":9762,"depth":858,"text":9763},{"id":9796,"depth":858,"text":9797},{"id":9828,"depth":858,"text":9829},{"id":9860,"depth":858,"text":9861},{"id":9892,"depth":858,"text":9893},{"id":9943,"depth":858,"text":9944},{"id":9986,"depth":858,"text":9987},{"id":10012,"depth":858,"text":10013},{"id":10053,"depth":858,"text":10054},{"id":10105,"depth":858,"text":10106},{"id":10184,"depth":858,"text":10185},{"id":10235,"depth":858,"text":10236},{"id":10266,"depth":858,"text":10267},{"id":10296,"depth":858,"text":10297},{"id":10326,"depth":858,"text":10327},{"id":10376,"depth":858,"text":10377},{"id":10401,"depth":858,"text":10402},{"id":10451,"depth":858,"text":10452},{"id":10499,"depth":858,"text":10500},{"id":10557,"depth":858,"text":10558},{"id":10612,"depth":858,"text":10615},{"id":10656,"depth":858,"text":10657},{"id":10683,"depth":858,"text":10686},{"id":10720,"depth":858,"text":10721},{"id":10754,"depth":858,"text":11240},"Step 11: Point Apache At public_html",{"id":10788,"depth":858,"text":10789},{"id":10839,"depth":858,"text":10840},{"id":10891,"depth":858,"text":10892},{"id":10907,"depth":858,"text":10910},{"id":10935,"depth":858,"text":10938},{"id":10983,"depth":858,"text":10986},{"id":735,"depth":858,"text":738},{"id":810,"depth":858,"text":813},"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",{},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox",{"title":8574,"description":11249},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox",[11259,11260,10529,11261,11262],"virtualbox","ubuntu","mysql","vm","1:06:16","ArTDIgihfd4","https:\u002F\u002Fyoutu.be\u002FArTDIgihfd4","IT202 VirtualBox and VM Setup","CNlzYvIiYNPSzbQ6tvCdcnJLlvvGSGmurOGWR_mSnms",[],1780581681491]