[{"data":1,"prerenderedAt":11403},["ShallowReactive",2],{"content-page:\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands":3,"content-page-quiz:none":1118,"book-module-total-pages":1119,"content-section-pages:\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F":1120,"content-directory-pages:\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands":11402},{"id":4,"title":5,"audience":6,"body":7,"contentType":1094,"course":1095,"description":1096,"estimateBasis":1097,"estimatedDiscussionMinutes":1098,"estimatedLiveMinutes":1099,"estimatedTotalMinutes":1100,"extension":1101,"meta":1102,"module":1103,"navigation":1104,"order":1098,"path":1105,"promptAssist":1106,"seo":1107,"status":1108,"stem":1109,"tags":1110,"videoDuration":1114,"videoId":1115,"videoLink":1116,"videoTitle":5,"week":1103,"__hash__":1117},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands.md","Basic CLI Commands","student",{"type":8,"value":9,"toc":1058},"minimark",[10,73,112,145,208,275,326,353,374,412,440,461,496,519,591,614,659,722,775,803,823,852,892,922,934,1009],[11,12,15,20],"slide",{"id":13,"level":14},"why-cli-first","2",[16,17,19],"h2",{"id":18},"why-cli-comes-first","Why CLI Comes First",[21,22,23,32,40,54,62],"ul",{},[24,25,26,27],"li",{},"Common language for setup and developer tools\n",[21,28,29],{},[24,30,31],{},"Git, servers, package installs, deployment logs",[24,33,34,35],{},"Works when there is no full desktop\n",[21,36,37],{},[24,38,39],{},"SSH, Ubuntu Server, minimal system access",[24,41,42,43],{},"Direct check of what the computer sees\n",[21,44,45,48,51],{},[24,46,47],{},"Current folder",[24,49,50],{},"Files and permissions",[24,52,53],{},"Command output",[24,55,56,57],{},"Repeatable steps beat guessing through menus\n",[21,58,59],{},[24,60,61],{},"Run a command, read output, adjust",[24,63,64,65],{},"Location still matters\n",[21,66,67,70],{},[24,68,69],{},"Wrong folder can make correct commands fail",[24,71,72],{},"Or create files in the wrong place",[11,74,76,79,83],{"id":75,"level":14},"goal",[16,77,78],{"id":75},"Goal",[80,81,82],"p",{},"Build the command-line habits that make setup work predictable:",[21,84,85,88,91,106,109],{},[24,86,87],{},"Know what folder the terminal is using",[24,89,90],{},"Read file and folder lists before moving",[24,92,93,94,98,99,102,103],{},"Recognize common flags like ",[95,96,97],"code",{},"-a",", ",[95,100,101],{},"-r",", and ",[95,104,105],{},"-l",[24,107,108],{},"Make small file changes and verify them",[24,110,111],{},"Stop safely when output does not match the lesson",[11,113,115,118,121,142],{"id":114,"level":14},"before-you-start",[16,116,117],{"id":114},"Before You Start",[80,119,120],{},"Run these commands on your host computer",[21,122,123,136,139],{},[24,124,125,126],{},"Windows: Git Bash",[21,127,128],{},[24,129,130,131],{},"Need Git Bash now? Use the Windows install slide in the next presentation:\n",[132,133,135],"a",{"href":134},"\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",[24,137,138],{},"Apple macOS: Terminal",[24,140,141],{},"Linux: Terminal",[80,143,144],{},"Use one terminal window for the whole practice so your location is easy to track",[11,146,148,152],{"id":147,"level":14},"working-directory",[16,149,151],{"id":150},"the-main-idea","The Main Idea",[21,153,154,166,177,200],{},[24,155,156,157],{},"Terminal commands run from one folder at a time\n",[21,158,159],{},[24,160,161,162],{},"That folder is the ",[163,164,165],"strong",{},"working directory",[24,167,168,171,172],{},[95,169,170],{},"pwd",": print working directory\n",[21,173,174],{},[24,175,176],{},"Shows the full path to the folder your terminal is using",[24,178,179,180],{},"Fresh terminal usually starts in your home folder\n",[21,181,182,188,194],{},[24,183,184,185],{},"Windows Git Bash: ",[95,186,187],{},"\u002Fc\u002FUsers\u002Fyour-username",[24,189,190,191],{},"Apple macOS: ",[95,192,193],{},"\u002FUsers\u002Fyour-username",[24,195,196,197],{},"Linux: ",[95,198,199],{},"\u002Fhome\u002Fyour-username",[24,201,202,203],{},"Commands from this lesson start from the working directory\n",[21,204,205],{},[24,206,207],{},"Unless you give a different path",[11,209,211,214,217,269],{"id":210,"level":14},"paths-relative-and-absolute",[16,212,213],{"id":210},"Paths: Relative And Absolute",[80,215,216],{},"Paths build on the working directory. They tell the terminal which file or folder you mean",[21,218,219,225,231,237,263],{},[24,220,221,222],{},"Relative path: starts from the working directory, like ",[95,223,224],{},"public\u002Findex.php",[24,226,227,228],{},"Absolute path: starts from the system root, like ",[95,229,230],{},"\u002Fhome\u002Fstudent\u002Fproject",[24,232,233,236],{},[95,234,235],{},"."," means the current folder",[24,238,239,242,243],{},[95,240,241],{},".."," means the parent folder\n",[21,244,245,251,257],{},[24,246,247,250],{},[95,248,249],{},"..\u002F.."," goes up two folders",[24,252,253,254],{},"Example: ",[95,255,256],{},"cd ..\u002F..",[24,258,259,262],{},[95,260,261],{},"..."," is not a shortcut",[24,264,265,268],{},[95,266,267],{},"~"," means your home folder",[80,270,271,272,274],{},"If a command affects the wrong place, check ",[95,273,170],{}," first, then check the path you typed",[11,276,278,281,284,303,306],{"id":277,"level":14},"flags-options-and-arguments",[16,279,280],{"id":277},"Flags, Options, And Arguments",[80,282,283],{},"Commands usually follow this shape:",[21,285,286,292,297],{},[24,287,288,289],{},"Command: what to do, like ",[95,290,291],{},"ls",[24,293,294,295],{},"Flag or option: how to do it, like ",[95,296,97],{},[24,298,299,300],{},"Argument: what to do it to, like ",[95,301,302],{},"public_html",[80,304,305],{},"Examples:",[21,307,308,314,320],{},[24,309,310,313],{},[95,311,312],{},"ls -a"," shows hidden files",[24,315,316,319],{},[95,317,318],{},"cp -r folder backup-folder"," copies a folder",[24,321,322,325],{},[95,323,324],{},"nano -l file.txt"," opens with line numbers",[11,327,329,333,336,348],{"id":328,"level":14},"practice-loop",[16,330,332],{"id":331},"practice-1-location-and-paths","Practice 1: Location And Paths",[80,334,335],{},"For each command, use the same pattern:",[337,338,339,342,345],"ol",{},[24,340,341],{},"Run one command",[24,343,344],{},"Read the output",[24,346,347],{},"Confirm the folder or file changed the way you expected",[21,349,350],{},[24,351,352],{},"See the slides below for workflow steps, checkpoints, and expected results",[11,354,357,360,363,368,371],{"id":355,"level":356},"step-1-confirm-where-you-are","3",[16,358,359],{"id":355},"Step 1: Confirm Where You Are",[80,361,362],{},"Run:",[364,365],"code-snippet",{"language":366,"src":367},"bash","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-1-confirm-where-you-01.sh",[80,369,370],{},"Expected result: a folder path",[80,372,373],{},"If you see a path, the terminal is working and you know your current location",[11,375,377,380,382,385,388,391,394],{"id":376,"level":356},"step-2-list-files",[16,378,379],{"id":376},"Step 2: List Files",[80,381,362],{},[364,383],{"language":366,"src":384},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-2-list-files-02.sh",[80,386,387],{},"Expected result: file and folder names from your current location",[80,389,390],{},"For hidden files and details too, run:",[364,392],{"language":366,"src":393},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-2-list-files-03.sh",[21,395,396,401,406],{},[24,397,398,400],{},[95,399,97],{}," includes hidden files",[24,402,403,405],{},[95,404,105],{}," uses a long listing",[24,407,408,411],{},[95,409,410],{},"-la"," combines both",[11,413,415,418,421,424,431,437],{"id":414,"level":356},"step-3-change-folders",[16,416,417],{"id":414},"Step 3: Change Folders",[80,419,420],{},"Start from your home folder, then move up and back",[364,422],{"language":366,"src":423},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-3-change-folders-04.sh",[80,425,426,427,430],{},"This avoids assuming your computer has a specific folder like ",[95,428,429],{},"Documents"," in the current location",[80,432,433,434,436],{},"When you move into a named folder later, run ",[95,435,291],{}," first and pick a folder that actually appears in the list",[80,438,439],{},"If a path has spaces, wrap it in quotes",[11,441,443,447,449,452],{"id":442,"level":356},"step-4-create-practice-folder",[16,444,446],{"id":445},"step-4-create-a-practice-folder","Step 4: Create A Practice Folder",[80,448,362],{},[364,450],{"language":366,"src":451},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-4-create-a-practice-05.sh",[80,453,454,455,457,458],{},"Expected result: ",[95,456,170],{}," ends with ",[95,459,460],{},"cli-practice",[11,462,464,468,470,473,476],{"id":463,"level":356},"step-5-create-and-read-file",[16,465,467],{"id":466},"step-5-write-text-to-a-file","Step 5: Write Text To A File",[80,469,362],{},[364,471],{"language":366,"src":472},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-5-write-text-to-a-f-06.sh",[80,474,475],{},"What this command does:",[21,477,478,484,490],{},[24,479,480,483],{},[95,481,482],{},"echo"," prepares text for the terminal",[24,485,486,489],{},[95,487,488],{},">"," redirects that text into a file instead of printing it on screen",[24,491,492,495],{},[95,493,494],{},"cli-proof.txt"," is created in the current folder, or replaced if it already exists",[11,497,499,504,507,510,516],{"id":498,"level":356},"step-5-read-file-back",[500,501,503],"h3",{"id":502},"step-5-continued-read-the-file-back","Step 5 Continued: Read The File Back",[80,505,506],{},"Then read it back:",[364,508],{"language":366,"src":509},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-5-continued-read-th-07.sh",[80,511,512,515],{},[95,513,514],{},"cat"," prints file contents in the terminal",[80,517,518],{},"Expected result: the terminal prints the text you wrote",[11,520,522,526,528,537,540,566,569],{"id":521,"level":14},"file-management-loop",[16,523,525],{"id":524},"practice-2-file-management","Practice 2: File Management",[80,527,335],{},[337,529,530,532,534],{},[24,531,341],{},[24,533,344],{},[24,535,536],{},"Confirm the file changed the way you expected",[80,538,539],{},"Commands in this practice:",[21,541,542,548,554,560],{},[24,543,544,547],{},[95,545,546],{},"touch"," creates an empty file",[24,549,550,553],{},[95,551,552],{},"cp"," copies a file or folder",[24,555,556,559],{},[95,557,558],{},"mv"," moves or renames",[24,561,562,565],{},[95,563,564],{},"rm"," deletes",[80,567,568],{},"Important flags:",[21,570,571,577,583,589],{},[24,572,573,576],{},[95,574,575],{},"cp -r"," copies folders",[24,578,579,582],{},[95,580,581],{},"rm -r"," deletes folders",[24,584,585,588],{},[95,586,587],{},"rm -f"," forces deletion",[24,590,352],{},[11,592,594,598,600,603,608],{"id":593,"level":356},"practice-2-step-1-create-empty-file",[16,595,597],{"id":596},"step-1-create-an-empty-file","Step 1: Create An Empty File",[80,599,362],{},[364,601],{"language":366,"src":602},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-1-create-an-empty-f-08.sh",[80,604,605,607],{},[95,606,546],{}," creates an empty file, or updates the timestamp if the file already exists",[80,609,454,610,613],{},[95,611,612],{},"practice-empty.txt"," appears in the folder list",[11,615,617,621,623,626,629,635,648],{"id":616,"level":356},"practice-2-step-2-copy-rename-and-delete",[16,618,620],{"id":619},"step-2-copy-rename-and-delete","Step 2: Copy, Rename, And Delete",[80,622,362],{},[364,624],{"language":366,"src":625},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-2-copy-rename-and-d-09.sh",[80,627,628],{},"Expected result: the backup is copied, renamed, then removed",[80,630,631,632,634],{},"Use ",[95,633,564],{}," carefully. Deleting from the terminal usually skips the recycle bin",[21,636,637,642],{},[24,638,639,641],{},[95,640,101],{},": recursive, includes folders and everything inside them",[24,643,644,647],{},[95,645,646],{},"-f",": force, skips many confirmation prompts",[649,650,652],"alert",{"color":651},"red",[80,653,654,655,658],{},"Never run ",[95,656,657],{},"rm -rf \u002F",". It can try to delete the whole system from the root folder.",[11,660,662,666,669,687,692,697,717],{"id":661,"level":14},"terminal-editors",[16,663,665],{"id":664},"practice-3-terminal-editors","Practice 3: Terminal Editors",[80,667,668],{},"Sometimes you need to edit a file from a terminal",[21,670,671,677],{},[24,672,673,676],{},[95,674,675],{},"nano"," is beginner-friendly",[24,678,679,682,683,686],{},[95,680,681],{},"vi"," or ",[95,684,685],{},"vim"," is common on servers but has a learning curve",[80,688,631,689,691],{},[95,690,675],{}," for this course unless a lesson says otherwise",[80,693,631,694,696],{},[95,695,324],{}," when line numbers would help",[80,698,699,700,682,702,704,705,708,709,712,713,716],{},"If you accidentally open ",[95,701,681],{},[95,703,685],{},", press ",[95,706,707],{},"Esc",", type ",[95,710,711],{},":q",", and press ",[95,714,715],{},"Enter"," to exit without saving",[21,718,719],{},[24,720,721],{},"See the slide below for workflow steps, checkpoints, and expected results",[11,723,725,730,732,735,741,763],{"id":724,"level":356},"edit-with-nano",[16,726,727,728],{"id":724},"Edit With ",[95,729,675],{},[80,731,362],{},[364,733],{"language":366,"src":734},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fedit-with-nano-10.sh",[80,736,737,738,740],{},"In ",[95,739,675],{},":",[21,742,743,746,753,757],{},[24,744,745],{},"Type a short note",[24,747,748,749,752],{},"Press ",[95,750,751],{},"Ctrl+O"," to save",[24,754,748,755],{},[95,756,715],{},[24,758,748,759,762],{},[95,760,761],{},"Ctrl+X"," to exit",[80,764,765,766,768,769,708,771,712,773],{},"If you open ",[95,767,681],{}," by mistake, press ",[95,770,707],{},[95,772,711],{},[95,774,715],{},[11,776,778,784,789,792,795,798],{"id":777,"level":14},"sudo-and-permission-boundaries",[16,779,780,783],{"id":777},[95,781,782],{},"sudo"," And Permission Boundaries",[80,785,786,788],{},[95,787,782],{}," runs a command with elevated permissions",[80,790,791],{},"Use it only when a setup lesson explicitly says to use it",[80,793,794],{},"Example:",[364,796],{"language":366,"src":797},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fsudo-and-permission-boun-11.sh",[21,799,800],{},[24,801,802],{},"See the slide below for supporting examples and follow-up details",[11,804,806,811,817],{"id":805,"level":356},"sudo-by-operating-system",[500,807,808,810],{"id":805},[95,809,782],{}," By Operating System",[80,812,813,814,816],{},"On Linux and macOS, ",[95,815,782],{}," is common for package installation and service management",[80,818,819,820,822],{},"Modern Windows also has a native ",[95,821,782],{}," 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,824,826,829,832,843],{"id":825,"level":14},"quick-safety-routine",[16,827,828],{"id":825},"Quick Safety Routine",[80,830,831],{},"Before a command changes files, ask:",[21,833,834,837,840],{},[24,835,836],{},"What folder am I in?",[24,838,839],{},"Do I see the files I expect?",[24,841,842],{},"Am I about to change the right folder?",[80,844,845,846,848,849],{},"If one answer is unclear, stop and run ",[95,847,170],{}," plus ",[95,850,851],{},"ls -la",[11,853,855,858],{"id":854,"level":14},"common-mistakes",[16,856,857],{"id":854},"Common Mistakes",[21,859,860,876,882,890],{},[24,861,862,865,866,868,869,871,872,875],{},[95,863,864],{},"No such file or directory",": run ",[95,867,170],{},", then ",[95,870,291],{},", then try ",[95,873,874],{},"cd"," again",[24,877,878,879,881],{},"Command affected the wrong folder: check ",[95,880,170],{}," before continuing",[24,883,884,886,887,889],{},[95,885,514],{}," cannot find the file: run ",[95,888,851],{}," and check the exact filename",[24,891,802],{},[11,893,895,899],{"id":894,"level":356},"common-mistakes-recovery",[500,896,898],{"id":897},"recovery-checks","Recovery Checks",[21,900,901,904,910,916],{},[24,902,903],{},"Spaces in a path: wrap the path in quotes",[24,905,906,907],{},"Command keeps running: press ",[95,908,909],{},"Ctrl+C",[24,911,912,913],{},"Permission denied: move back home with ",[95,914,915],{},"cd ~",[24,917,918,919,921],{},"Wrong ",[95,920,564],{},": stop and ask before doing more work",[11,923,925,928,931],{"id":924,"level":14},"quick-check",[16,926,927],{"id":924},"Quick Check",[80,929,930],{},"You are ready for the next setup lesson when these commands make sense:",[364,932],{"language":366,"src":933},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fquick-check-12.sh",[11,935,937,941],{"id":936,"level":14},"further-learning",[16,938,940],{"id":939},"key-terms-and-further-learning","Key Terms And Further Learning",[942,943,946,980],"two-col",{"gap":944,"left-width":945,"right-width":945},"lg","1fr",[947,948,950,954,960,969],"template",{"v-slot:left":949},"",[500,951,953],{"id":952},"key-terms","Key Terms",[80,955,956,959],{},[163,957,958],{},"Working directory"," - The folder where the next terminal command runs",[80,961,962,965,966],{},[163,963,964],{},"Path"," - A file or folder location, such as ",[95,967,968],{},"public_html\u002Findex.php",[80,970,971,974,975,977,978],{},[163,972,973],{},"Flag"," - An extra command option, such as ",[95,976,410],{}," in ",[95,979,851],{},[947,981,982,985],{"v-slot:right":949},[500,983,984],{"id":936},"Further Learning",[21,986,987,995,1002],{},[24,988,989],{},[132,990,994],{"href":991,"rel":992},"https:\u002F\u002Fdocumentation.ubuntu.com\u002Fdesktop\u002Fen\u002Flatest\u002Ftutorial\u002Fthe-linux-command-line-for-beginners\u002F",[993],"nofollow","Ubuntu Tutorial: The Linux Command Line For Beginners",[24,996,997],{},[132,998,1001],{"href":999,"rel":1000},"https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fcoreutils\u002Fmanual\u002Fcoreutils.html",[993],"GNU Coreutils Manual",[24,1003,1004],{},[132,1005,1008],{"href":1006,"rel":1007},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FLearn_web_development\u002FGetting_started\u002FEnvironment_setup\u002FCommand_line",[993],"MDN: Command Line Crash Course",[11,1010,1012,1015,1018],{"id":1011,"level":14},"summary",[16,1013,1014],{"id":1011},"Summary",[80,1016,1017],{},"Before leaving this presentation, confirm you can:",[21,1019,1020,1025,1030,1041,1055],{},[24,1021,631,1022,1024],{},[95,1023,170],{}," to check where commands will run",[24,1026,631,1027,1029],{},[95,1028,851],{}," to inspect the current folder",[24,1031,631,1032,98,1034,98,1036,102,1038,1040],{},[95,1033,874],{},[95,1035,235],{},[95,1037,241],{},[95,1039,267],{}," to move intentionally",[24,1042,1043,1044,98,1046,98,1048,98,1050,102,1052,1054],{},"Use file commands such as ",[95,1045,546],{},[95,1047,552],{},[95,1049,558],{},[95,1051,564],{},[95,1053,675],{}," carefully",[24,1056,1057],{},"Stop and check location when output does not match the lesson",{"title":949,"searchDepth":1059,"depth":1059,"links":1060},2,[1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1076,1077,1078,1079,1080,1082,1087,1088,1091,1092,1093],{"id":18,"depth":1059,"text":19},{"id":75,"depth":1059,"text":78},{"id":114,"depth":1059,"text":117},{"id":150,"depth":1059,"text":151},{"id":210,"depth":1059,"text":213},{"id":277,"depth":1059,"text":280},{"id":331,"depth":1059,"text":332},{"id":355,"depth":1059,"text":359},{"id":376,"depth":1059,"text":379},{"id":414,"depth":1059,"text":417},{"id":445,"depth":1059,"text":446},{"id":466,"depth":1059,"text":467,"children":1073},[1074],{"id":502,"depth":1075,"text":503},3,{"id":524,"depth":1059,"text":525},{"id":596,"depth":1059,"text":597},{"id":619,"depth":1059,"text":620},{"id":664,"depth":1059,"text":665},{"id":724,"depth":1059,"text":1081},"Edit With nano",{"id":777,"depth":1059,"text":1083,"children":1084},"sudo And Permission Boundaries",[1085],{"id":805,"depth":1075,"text":1086},"sudo By Operating System",{"id":825,"depth":1059,"text":828},{"id":854,"depth":1059,"text":857,"children":1089},[1090],{"id":897,"depth":1075,"text":898},{"id":924,"depth":1059,"text":927},{"id":939,"depth":1059,"text":940},{"id":1011,"depth":1059,"text":1014},"presentation","Internet Applications","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.","10","45","55","md",{},"1",true,"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands",false,{"title":5,"description":1096},"published","internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands",[1111,1112,1113],"cli","terminal","filesystem","46:05","NsSRKv_uBWM","https:\u002F\u002Fyoutu.be\u002FNsSRKv_uBWM","q_NRWUOCcsk5lm6u6kKPFGl9E9VqeQhaC0qb86nD7aY",null,[],[1121,1615,2373,3262,4358,5297,6088,7155,7881,8706],{"id":1122,"title":1123,"audience":6,"body":1124,"contentType":1094,"course":1095,"description":1596,"estimateBasis":1597,"estimatedDiscussionMinutes":1098,"estimatedLiveMinutes":1598,"estimatedTotalMinutes":1599,"extension":1101,"meta":1600,"module":1103,"navigation":1104,"order":1601,"path":1602,"promptAssist":1106,"seo":1603,"status":1108,"stem":1604,"tags":1605,"videoDuration":1610,"videoId":1611,"videoLink":1612,"videoTitle":1613,"week":1103,"__hash__":1614},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord.md","Learn Courses Platform And Discord",{"type":8,"value":1125,"toc":1581},[1126,1160,1200,1246,1295,1343,1376,1437,1478,1528,1555],[11,1127,1129,1133,1147],{"id":1128,"level":14},"learn-courses-flow",[16,1130,1132],{"id":1131},"what-is-the-learn-courses-platform","What is the Learn Courses Platform",[21,1134,1135,1138,1141,1144],{},[24,1136,1137],{},"This is a platform I've built over the years to aid assignment submissions and course utilities",[24,1139,1140],{},"It provides objective-based worksheets to fill in images, urls, and open responses to document assignment evidence",[24,1142,1143],{},"The goal is to keep tasks clear and objective for students and grading",[24,1145,1146],{},"Also includes a few other utilities for courses (such as joining the Discord server)",[80,1148,1149,1150,1154,1155,1159],{},"NOTE: Summer 2026 the previous Learn Platform (",[132,1151,1152],{"href":1152,"rel":1153},"https:\u002F\u002Flearn.ethereallab.app",[993],") has been replaced by Learn Courses Platform (",[132,1156,1157],{"href":1157,"rel":1158},"https:\u002F\u002Fcourses.ethereallab.app",[993],"). The deprecated site is still available as a backup but all activities\u002Fcontent is being migrated to the new version",[11,1161,1163,1166,1169,1197],{"id":1162,"level":14},"learn-courses-title",[16,1164,1123],{"id":1165},"learn-courses-platform-and-discord",[80,1167,1168],{},"How to join:",[21,1170,1171,1177,1185,1188,1191,1194],{},[24,1172,1173,1174],{},"Visit the platform ",[132,1175,1157],{"href":1157,"rel":1176},[993],[24,1178,1179,1180],{},"Sign in with your NJIT email\n",[21,1181,1182],{},[24,1183,1184],{},"If you're in the Canvas course, you should automatically get synced to this platform",[24,1186,1187],{},"Visit your Profile page",[24,1189,1190],{},"Associate your Discord account",[24,1192,1193],{},"Join the course Discord server",[24,1195,1196],{},"Verify that your course channels appear on Discord",[80,1198,1199],{},"You can follow the steps on the below slides for guidance",[11,1201,1203,1206],{"id":1202,"level":356},"visit-learn-courses",[16,1204,1205],{"id":1202},"Visit Learn Courses",[942,1207,1208,1236],{"gap":944,"left-width":945,"right-width":945},[947,1209,1210,1213,1218],{"v-slot:left":949},[80,1211,1212],{},"Go to:",[80,1214,1215],{},[132,1216,1157],{"href":1157,"rel":1217},[993],[21,1219,1220,1227,1230,1233],{},[24,1221,1222,1223,1226],{},"Click the ",[163,1224,1225],{},"Login"," button",[24,1228,1229],{},"Use your NJIT email",[24,1231,1232],{},"Only NJIT accounts are allowed",[24,1234,1235],{},"If the browser tries a personal Chrome profile, log out of that account or switch profiles",[947,1237,1238],{"v-slot:right":949},[80,1239,1240],{},[1241,1242],"img",{"alt":1243,"src":1244,"variant":1245},"Learn Courses logged-out home page with the Login button visible","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fhome-loggedout-login-button.png","sidecar-screenshot",[11,1247,1249,1252],{"id":1248,"level":356},"associate-discord-name",[16,1250,1251],{"id":1248},"Associate Discord Name",[942,1253,1254,1279],{"gap":944,"left-width":945,"right-width":945},[947,1255,1256,1259,1276],{"v-slot:left":949},[80,1257,1258],{},"On Learn Courses:",[337,1260,1261,1264,1270,1273],{},[24,1262,1263],{},"Open your Profile",[24,1265,1266,1267],{},"Click ",[163,1268,1269],{},"Refresh Discord Username",[24,1271,1272],{},"Authorize the Discord prompt",[24,1274,1275],{},"After the success message appears, save your profile",[80,1277,1278],{},"If you are not sure where you are, use the Home icon in the top left to return to the dashboard.",[947,1280,1281,1288],{"v-slot:right":949},[80,1282,1283],{},[1241,1284],{"alt":1285,"src":1286,"variant":1245,"max-height":1287},"Learn Courses dashboard sidebar with Profile and course links visible","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fdashboard-sidebar-profile-links.png","13rem",[80,1289,1290],{},[1241,1291],{"alt":1292,"src":1293,"variant":1245,"max-height":1294},"Learn Courses profile page with Discord connection controls visible","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fprofile-page.png","16rem",[11,1296,1298,1301],{"id":1297,"level":356},"authorize-discord",[16,1299,1300],{"id":1297},"Authorize Discord",[942,1302,1303,1327],{"gap":944,"left-width":945,"right-width":945},[947,1304,1305,1308],{"v-slot:left":949},[80,1306,1307],{},"Discord will ask whether Learn Courses can access your Discord account.",[21,1309,1310,1313,1318,1321,1324],{},[24,1311,1312],{},"Confirm you are signed in to the correct Discord account",[24,1314,1266,1315],{},[163,1316,1317],{},"Authorize",[24,1319,1320],{},"Return to Learn Courses",[24,1322,1323],{},"Look for the success message",[24,1325,1326],{},"Save the profile change",[947,1328,1329,1336],{"v-slot:right":949},[80,1330,1331],{},[1241,1332],{"alt":1333,"src":1334,"variant":1245,"max-height":1335},"Discord authorization prompt for Learn Courses","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fdiscord-auth.png","25rem",[80,1337,1338],{},[1241,1339],{"alt":1340,"src":1341,"variant":1245,"max-height":1342},"Learn Courses success message after connecting Discord","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fdiscord-connected-success.png","7rem",[11,1344,1346,1349,1352,1358,1365],{"id":1345,"level":356},"join-the-channel",[16,1347,1348],{"id":1345},"Join The Channel",[80,1350,1351],{},"Use the Discord link provided on Canvas, or use:",[80,1353,1354],{},[132,1355,1356],{"href":1356,"rel":1357},"https:\u002F\u002Fdiscord.com\u002Finvite\u002FYEHcm44wzg",[993],[80,1359,1360,1361,1364],{},"This should send you to the ",[95,1362,1363],{},"access-channel"," channel.",[21,1366,1367,1370,1373],{},[24,1368,1369],{},"Other channels are protected by a bot",[24,1371,1372],{},"Messages may be blocked until your name and role are set",[24,1374,1375],{},"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,1377,1379,1382],{"id":1378,"level":14},"verify-with-quackbot",[16,1380,1381],{"id":1378},"Verify With QuackBot",[942,1383,1384,1428],{"gap":944,"left-width":945,"right-width":945},[947,1385,1386,1398,1403,1408,1411,1425],{"v-slot:left":949},[21,1387,1388,1391],{},[24,1389,1390],{},"A summer 2026 change was to have the bot attempt to auto-detect new members and apply roles automatically",[24,1392,1393,1394,1397],{},"If you don't see the proper semester category (i.e., ",[95,1395,1396],{},"summer-2026",") or the expected channels you can do the below action",[80,1399,737,1400,1402],{},[95,1401,1363],{},", enter:",[80,1404,1405],{},[95,1406,1407],{},"@QuackBot",[80,1409,1410],{},"QuackBot will:",[21,1412,1413,1416,1419,1422],{},[24,1414,1415],{},"Verify your account",[24,1417,1418],{},"Pull in your name and section",[24,1420,1421],{},"Apply your class role",[24,1423,1424],{},"Update your server nickname",[80,1426,1427],{},"This does not change your real Discord username.",[947,1429,1430],{"v-slot:right":949},[80,1431,1432],{},[1241,1433],{"alt":1434,"src":1435,"variant":1245,"max-height":1436},"QuackBot response showing the student already has a course role","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fquackbot-role-response.png","8rem",[11,1438,1440,1444,1447,1458,1462],{"id":1439,"level":14},"welcome-and-potential-issues",[16,1441,1443],{"id":1442},"welcome","Welcome",[80,1445,1446],{},"If the previous steps worked, you should see a new semester category in the Discord sidebar.",[21,1448,1449,1452,1455],{},[24,1450,1451],{},"It should appear after the general channels",[24,1453,1454],{},"It should include one or more channels for your active courses",[24,1456,1457],{},"Use the correct course channel for class questions and discussion",[500,1459,1461],{"id":1460},"potential-issues","Potential Issues",[21,1463,1464,1467],{},[24,1465,1466],{},"If you recently joined the class, your UCID may still need to be added to Learn Courses",[24,1468,1469,1470,1473],{},"If there is an issue, email the instructor or DM ",[95,1471,1472],{},"MattToegel",[21,1474,1475],{},[24,1476,1477],{},"Some Discord privacy settings may require a friend request before DMs work",[11,1479,1481,1484],{"id":1480,"level":14},"general-conduct",[16,1482,1483],{"id":1480},"General Conduct",[21,1485,1486,1489,1492,1503,1506,1514,1522,1525],{},[24,1487,1488],{},"Use class-related channels for questions and discussion",[24,1490,1491],{},"Ask general course questions in the channel instead of DM when possible",[24,1493,1494,1495],{},"Do not post screenshots of in-progress assignment solutions\n",[21,1496,1497,1500],{},[24,1498,1499],{},"This would be more ideal for a DM",[24,1501,1502],{},"If you see posted solution-like items don't assume they're correct",[24,1504,1505],{},"General unrelated code is okay when it supports a discussion (like content from a presentation or reading)",[24,1507,1508,1509],{},"If the instructor needs to see assignment code, they may ask you to DM the screenshot\n",[21,1510,1511],{},[24,1512,1513],{},"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",[24,1515,1516,1517],{},"Keep off-topic items out of class channels\n",[21,1518,1519],{},[24,1520,1521],{},"There are plenty of categorized channels to use and I can always make more",[24,1523,1524],{},"Helping classmates understand topics is encouraged just be mindful not to spoon-feed",[24,1526,1527],{},"Sharing direct solutions goes against the Academic Integrity Policy",[11,1529,1530,1532,1535],{"id":924,"level":14},[16,1531,927],{"id":924},[80,1533,1534],{},"Before continuing, confirm:",[21,1536,1537,1540,1543,1546,1549,1552],{},[24,1538,1539],{},"You can sign in to Learn Courses with your NJIT email",[24,1541,1542],{},"Your profile is saved",[24,1544,1545],{},"Discord is associated with your Learn Courses profile",[24,1547,1548],{},"You joined the Discord server",[24,1550,1551],{},"QuackBot applied your course role",[24,1553,1554],{},"You can see the correct course channel",[11,1556,1557,1559],{"id":1011,"level":14},[16,1558,1014],{"id":1011},[21,1560,1561,1564,1572,1575,1578],{},[24,1562,1563],{},"Learn Courses supports course tools and course-specific setup",[24,1565,1566,1567],{},"Canvas remains the official assignment, grade, and course hub\n",[21,1568,1569],{},[24,1570,1571],{},"All necessary items will be linked on Canvas",[24,1573,1574],{},"Discord is the preferred quick communication channel",[24,1576,1577],{},"QuackBot connects your Discord account to the correct course role",[24,1579,1580],{},"Good course communication keeps help requests specific and protects private information",{"title":949,"searchDepth":1059,"depth":1059,"links":1582},[1583,1584,1585,1586,1587,1588,1589,1590,1593,1594,1595],{"id":1131,"depth":1059,"text":1132},{"id":1165,"depth":1059,"text":1123},{"id":1202,"depth":1059,"text":1205},{"id":1248,"depth":1059,"text":1251},{"id":1297,"depth":1059,"text":1300},{"id":1345,"depth":1059,"text":1348},{"id":1378,"depth":1059,"text":1381},{"id":1442,"depth":1059,"text":1443,"children":1591},[1592],{"id":1460,"depth":1075,"text":1461},{"id":1480,"depth":1059,"text":1483},{"id":924,"depth":1059,"text":927},{"id":1011,"depth":1059,"text":1014},"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.","20","30",{},"0","\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord",{"title":1123,"description":1596},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord",[1606,1607,1608,1609],"course-tools","learn-courses","discord","setup","11:16","ScmHyEF1sA0","https:\u002F\u002Fyoutu.be\u002FScmHyEF1sA0","Joining Learn Platform and Discord Server","tEFV7lUabcy7whz7FSHEjPXSirrd3ginqQq4O4AkW9o",{"id":4,"title":5,"audience":6,"body":1616,"contentType":1094,"course":1095,"description":1096,"estimateBasis":1097,"estimatedDiscussionMinutes":1098,"estimatedLiveMinutes":1099,"estimatedTotalMinutes":1100,"extension":1101,"meta":2370,"module":1103,"navigation":1104,"order":1098,"path":1105,"promptAssist":1106,"seo":2371,"status":1108,"stem":1109,"tags":2372,"videoDuration":1114,"videoId":1115,"videoLink":1116,"videoTitle":5,"week":1103,"__hash__":1117},{"type":8,"value":1617,"toc":2339},[1618,1660,1684,1706,1750,1796,1832,1850,1862,1890,1908,1922,1946,1960,2012,2028,2058,2100,2140,2160,2174,2194,2222,2242,2250,2299],[11,1619,1620,1622],{"id":13,"level":14},[16,1621,19],{"id":18},[21,1623,1624,1630,1636,1646,1652],{},[24,1625,26,1626],{},[21,1627,1628],{},[24,1629,31],{},[24,1631,34,1632],{},[21,1633,1634],{},[24,1635,39],{},[24,1637,42,1638],{},[21,1639,1640,1642,1644],{},[24,1641,47],{},[24,1643,50],{},[24,1645,53],{},[24,1647,56,1648],{},[21,1649,1650],{},[24,1651,61],{},[24,1653,64,1654],{},[21,1655,1656,1658],{},[24,1657,69],{},[24,1659,72],{},[11,1661,1662,1664,1666],{"id":75,"level":14},[16,1663,78],{"id":75},[80,1665,82],{},[21,1667,1668,1670,1672,1680,1682],{},[24,1669,87],{},[24,1671,90],{},[24,1673,93,1674,98,1676,102,1678],{},[95,1675,97],{},[95,1677,101],{},[95,1679,105],{},[24,1681,108],{},[24,1683,111],{},[11,1685,1686,1688,1690,1704],{"id":114,"level":14},[16,1687,117],{"id":114},[80,1689,120],{},[21,1691,1692,1700,1702],{},[24,1693,125,1694],{},[21,1695,1696],{},[24,1697,130,1698],{},[132,1699,135],{"href":134},[24,1701,138],{},[24,1703,141],{},[80,1705,144],{},[11,1707,1708,1710],{"id":147,"level":14},[16,1709,151],{"id":150},[21,1711,1712,1720,1728,1744],{},[24,1713,156,1714],{},[21,1715,1716],{},[24,1717,161,1718],{},[163,1719,165],{},[24,1721,1722,171,1724],{},[95,1723,170],{},[21,1725,1726],{},[24,1727,176],{},[24,1729,179,1730],{},[21,1731,1732,1736,1740],{},[24,1733,184,1734],{},[95,1735,187],{},[24,1737,190,1738],{},[95,1739,193],{},[24,1741,196,1742],{},[95,1743,199],{},[24,1745,202,1746],{},[21,1747,1748],{},[24,1749,207],{},[11,1751,1752,1754,1756,1792],{"id":210,"level":14},[16,1753,213],{"id":210},[80,1755,216],{},[21,1757,1758,1762,1766,1770,1788],{},[24,1759,221,1760],{},[95,1761,224],{},[24,1763,227,1764],{},[95,1765,230],{},[24,1767,1768,236],{},[95,1769,235],{},[24,1771,1772,242,1774],{},[95,1773,241],{},[21,1775,1776,1780,1784],{},[24,1777,1778,250],{},[95,1779,249],{},[24,1781,253,1782],{},[95,1783,256],{},[24,1785,1786,262],{},[95,1787,261],{},[24,1789,1790,268],{},[95,1791,267],{},[80,1793,271,1794,274],{},[95,1795,170],{},[11,1797,1798,1800,1802,1816,1818],{"id":277,"level":14},[16,1799,280],{"id":277},[80,1801,283],{},[21,1803,1804,1808,1812],{},[24,1805,288,1806],{},[95,1807,291],{},[24,1809,294,1810],{},[95,1811,97],{},[24,1813,299,1814],{},[95,1815,302],{},[80,1817,305],{},[21,1819,1820,1824,1828],{},[24,1821,1822,313],{},[95,1823,312],{},[24,1825,1826,319],{},[95,1827,318],{},[24,1829,1830,325],{},[95,1831,324],{},[11,1833,1834,1836,1838,1846],{"id":328,"level":14},[16,1835,332],{"id":331},[80,1837,335],{},[337,1839,1840,1842,1844],{},[24,1841,341],{},[24,1843,344],{},[24,1845,347],{},[21,1847,1848],{},[24,1849,352],{},[11,1851,1852,1854,1856,1858,1860],{"id":355,"level":356},[16,1853,359],{"id":355},[80,1855,362],{},[364,1857],{"language":366,"src":367},[80,1859,370],{},[80,1861,373],{},[11,1863,1864,1866,1868,1870,1872,1874,1876],{"id":376,"level":356},[16,1865,379],{"id":376},[80,1867,362],{},[364,1869],{"language":366,"src":384},[80,1871,387],{},[80,1873,390],{},[364,1875],{"language":366,"src":393},[21,1877,1878,1882,1886],{},[24,1879,1880,400],{},[95,1881,97],{},[24,1883,1884,405],{},[95,1885,105],{},[24,1887,1888,411],{},[95,1889,410],{},[11,1891,1892,1894,1896,1898,1902,1906],{"id":414,"level":356},[16,1893,417],{"id":414},[80,1895,420],{},[364,1897],{"language":366,"src":423},[80,1899,426,1900,430],{},[95,1901,429],{},[80,1903,433,1904,436],{},[95,1905,291],{},[80,1907,439],{},[11,1909,1910,1912,1914,1916],{"id":442,"level":356},[16,1911,446],{"id":445},[80,1913,362],{},[364,1915],{"language":366,"src":451},[80,1917,454,1918,457,1920],{},[95,1919,170],{},[95,1921,460],{},[11,1923,1924,1926,1928,1930,1932],{"id":463,"level":356},[16,1925,467],{"id":466},[80,1927,362],{},[364,1929],{"language":366,"src":472},[80,1931,475],{},[21,1933,1934,1938,1942],{},[24,1935,1936,483],{},[95,1937,482],{},[24,1939,1940,489],{},[95,1941,488],{},[24,1943,1944,495],{},[95,1945,494],{},[11,1947,1948,1950,1952,1954,1958],{"id":498,"level":356},[500,1949,503],{"id":502},[80,1951,506],{},[364,1953],{"language":366,"src":509},[80,1955,1956,515],{},[95,1957,514],{},[80,1959,518],{},[11,1961,1962,1964,1966,1974,1976,1994,1996],{"id":521,"level":14},[16,1963,525],{"id":524},[80,1965,335],{},[337,1967,1968,1970,1972],{},[24,1969,341],{},[24,1971,344],{},[24,1973,536],{},[80,1975,539],{},[21,1977,1978,1982,1986,1990],{},[24,1979,1980,547],{},[95,1981,546],{},[24,1983,1984,553],{},[95,1985,552],{},[24,1987,1988,559],{},[95,1989,558],{},[24,1991,1992,565],{},[95,1993,564],{},[80,1995,568],{},[21,1997,1998,2002,2006,2010],{},[24,1999,2000,576],{},[95,2001,575],{},[24,2003,2004,582],{},[95,2005,581],{},[24,2007,2008,588],{},[95,2009,587],{},[24,2011,352],{},[11,2013,2014,2016,2018,2020,2024],{"id":593,"level":356},[16,2015,597],{"id":596},[80,2017,362],{},[364,2019],{"language":366,"src":602},[80,2021,2022,607],{},[95,2023,546],{},[80,2025,454,2026,613],{},[95,2027,612],{},[11,2029,2030,2032,2034,2036,2038,2042,2052],{"id":616,"level":356},[16,2031,620],{"id":619},[80,2033,362],{},[364,2035],{"language":366,"src":625},[80,2037,628],{},[80,2039,631,2040,634],{},[95,2041,564],{},[21,2043,2044,2048],{},[24,2045,2046,641],{},[95,2047,101],{},[24,2049,2050,647],{},[95,2051,646],{},[649,2053,2054],{"color":651},[80,2055,654,2056,658],{},[95,2057,657],{},[11,2059,2060,2062,2064,2076,2080,2084,2096],{"id":661,"level":14},[16,2061,665],{"id":664},[80,2063,668],{},[21,2065,2066,2070],{},[24,2067,2068,676],{},[95,2069,675],{},[24,2071,2072,682,2074,686],{},[95,2073,681],{},[95,2075,685],{},[80,2077,631,2078,691],{},[95,2079,675],{},[80,2081,631,2082,696],{},[95,2083,324],{},[80,2085,699,2086,682,2088,704,2090,708,2092,712,2094,716],{},[95,2087,681],{},[95,2089,685],{},[95,2091,707],{},[95,2093,711],{},[95,2095,715],{},[21,2097,2098],{},[24,2099,721],{},[11,2101,2102,2106,2108,2110,2114,2130],{"id":724,"level":356},[16,2103,727,2104],{"id":724},[95,2105,675],{},[80,2107,362],{},[364,2109],{"language":366,"src":734},[80,2111,737,2112,740],{},[95,2113,675],{},[21,2115,2116,2118,2122,2126],{},[24,2117,745],{},[24,2119,748,2120,752],{},[95,2121,751],{},[24,2123,748,2124],{},[95,2125,715],{},[24,2127,748,2128,762],{},[95,2129,761],{},[80,2131,765,2132,768,2134,708,2136,712,2138],{},[95,2133,681],{},[95,2135,707],{},[95,2137,711],{},[95,2139,715],{},[11,2141,2142,2146,2150,2152,2154,2156],{"id":777,"level":14},[16,2143,2144,783],{"id":777},[95,2145,782],{},[80,2147,2148,788],{},[95,2149,782],{},[80,2151,791],{},[80,2153,794],{},[364,2155],{"language":366,"src":797},[21,2157,2158],{},[24,2159,802],{},[11,2161,2162,2166,2170],{"id":805,"level":356},[500,2163,2164,810],{"id":805},[95,2165,782],{},[80,2167,813,2168,816],{},[95,2169,782],{},[80,2171,819,2172,822],{},[95,2173,782],{},[11,2175,2176,2178,2180,2188],{"id":825,"level":14},[16,2177,828],{"id":825},[80,2179,831],{},[21,2181,2182,2184,2186],{},[24,2183,836],{},[24,2185,839],{},[24,2187,842],{},[80,2189,845,2190,848,2192],{},[95,2191,170],{},[95,2193,851],{},[11,2195,2196,2198],{"id":854,"level":14},[16,2197,857],{"id":854},[21,2199,2200,2210,2214,2220],{},[24,2201,2202,865,2204,868,2206,871,2208,875],{},[95,2203,864],{},[95,2205,170],{},[95,2207,291],{},[95,2209,874],{},[24,2211,878,2212,881],{},[95,2213,170],{},[24,2215,2216,886,2218,889],{},[95,2217,514],{},[95,2219,851],{},[24,2221,802],{},[11,2223,2224,2226],{"id":894,"level":356},[500,2225,898],{"id":897},[21,2227,2228,2230,2234,2238],{},[24,2229,903],{},[24,2231,906,2232],{},[95,2233,909],{},[24,2235,912,2236],{},[95,2237,915],{},[24,2239,918,2240,921],{},[95,2241,564],{},[11,2243,2244,2246,2248],{"id":924,"level":14},[16,2245,927],{"id":924},[80,2247,930],{},[364,2249],{"language":366,"src":933},[11,2251,2252,2254],{"id":936,"level":14},[16,2253,940],{"id":939},[942,2255,2256,2278],{"gap":944,"left-width":945,"right-width":945},[947,2257,2258,2260,2264,2270],{"v-slot:left":949},[500,2259,953],{"id":952},[80,2261,2262,959],{},[163,2263,958],{},[80,2265,2266,965,2268],{},[163,2267,964],{},[95,2269,968],{},[80,2271,2272,974,2274,977,2276],{},[163,2273,973],{},[95,2275,410],{},[95,2277,851],{},[947,2279,2280,2282],{"v-slot:right":949},[500,2281,984],{"id":936},[21,2283,2284,2289,2294],{},[24,2285,2286],{},[132,2287,994],{"href":991,"rel":2288},[993],[24,2290,2291],{},[132,2292,1001],{"href":999,"rel":2293},[993],[24,2295,2296],{},[132,2297,1008],{"href":1006,"rel":2298},[993],[11,2300,2301,2303,2305],{"id":1011,"level":14},[16,2302,1014],{"id":1011},[80,2304,1017],{},[21,2306,2307,2311,2315,2325,2337],{},[24,2308,631,2309,1024],{},[95,2310,170],{},[24,2312,631,2313,1029],{},[95,2314,851],{},[24,2316,631,2317,98,2319,98,2321,102,2323,1040],{},[95,2318,874],{},[95,2320,235],{},[95,2322,241],{},[95,2324,267],{},[24,2326,1043,2327,98,2329,98,2331,98,2333,102,2335,1054],{},[95,2328,546],{},[95,2330,552],{},[95,2332,558],{},[95,2334,564],{},[95,2336,675],{},[24,2338,1057],{},{"title":949,"searchDepth":1059,"depth":1059,"links":2340},[2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2355,2356,2357,2358,2359,2360,2363,2364,2367,2368,2369],{"id":18,"depth":1059,"text":19},{"id":75,"depth":1059,"text":78},{"id":114,"depth":1059,"text":117},{"id":150,"depth":1059,"text":151},{"id":210,"depth":1059,"text":213},{"id":277,"depth":1059,"text":280},{"id":331,"depth":1059,"text":332},{"id":355,"depth":1059,"text":359},{"id":376,"depth":1059,"text":379},{"id":414,"depth":1059,"text":417},{"id":445,"depth":1059,"text":446},{"id":466,"depth":1059,"text":467,"children":2353},[2354],{"id":502,"depth":1075,"text":503},{"id":524,"depth":1059,"text":525},{"id":596,"depth":1059,"text":597},{"id":619,"depth":1059,"text":620},{"id":664,"depth":1059,"text":665},{"id":724,"depth":1059,"text":1081},{"id":777,"depth":1059,"text":1083,"children":2361},[2362],{"id":805,"depth":1075,"text":1086},{"id":825,"depth":1059,"text":828},{"id":854,"depth":1059,"text":857,"children":2365},[2366],{"id":897,"depth":1075,"text":898},{"id":924,"depth":1059,"text":927},{"id":939,"depth":1059,"text":940},{"id":1011,"depth":1059,"text":1014},{},{"title":5,"description":1096},[1111,1112,1113],{"id":2374,"title":2375,"audience":6,"body":2376,"contentType":1094,"course":1095,"description":3250,"estimateBasis":3251,"estimatedDiscussionMinutes":1098,"estimatedLiveMinutes":3252,"estimatedTotalMinutes":1099,"extension":1101,"meta":3253,"module":1103,"navigation":1104,"order":1598,"path":3254,"promptAssist":1106,"seo":3255,"status":1108,"stem":3256,"tags":3257,"videoDuration":3258,"videoId":3259,"videoLink":3260,"videoTitle":2375,"week":1103,"__hash__":3261},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools.md","Git Tools",{"type":8,"value":2377,"toc":3220},[2378,2401,2430,2458,2496,2527,2559,2594,2623,2653,2690,2693,2723,2754,2783,2833,2851,2868,2888,2913,2944,2962,3003,3048,3131,3191],[11,2379,2380,2382],{"id":75,"level":14},[16,2381,78],{"id":75},[21,2383,2384,2387,2390],{},[24,2385,2386],{},"Install Git",[24,2388,2389],{},"Choose one terminal for your operating system",[24,2391,2392,2393,98,2396,102,2398,2400],{},"Confirm ",[95,2394,2395],{},"git --version",[95,2397,170],{},[95,2399,851],{}," work before GitHub setup",[11,2402,2404,2408],{"id":2403,"level":14},"terminal-choice-by-os",[16,2405,2407],{"id":2406},"terminal-choices","Terminal Choices",[21,2409,2410,2413,2416,2419,2421,2424,2427],{},[24,2411,2412],{},"Pick the terminal for your operating system",[24,2414,2415],{},"Use that same terminal for this lesson path",[24,2417,2418],{},"Run commands on your own computer unless a later lesson explicitly says \"inside the VM\"",[24,2420,125],{},[24,2422,2423],{},"Apple macOS: Terminal, with iTerm2 optional",[24,2425,2426],{},"Linux: Terminal, with Tilix optional",[24,2428,2429],{},"These operating system notes are alternatives, not a sequence",[11,2431,2433,2437,2455],{"id":2432,"level":14},"step-1-install-git-on-windows",[16,2434,2436],{"id":2435},"windows-path-git-bash","Windows Path: Git Bash",[337,2438,2439,2446,2449,2452],{},[24,2440,2441,2442],{},"Go to ",[132,2443,2444],{"href":2444,"rel":2445},"https:\u002F\u002Fgit-scm.com\u002Finstall\u002Fwindows",[993],[24,2447,2448],{},"Download and run the Git for Windows installer",[24,2450,2451],{},"Open Git Bash from the Start menu",[24,2453,2454],{},"Use Git Bash whenever this course says to use the terminal",[80,2456,2457],{},"See the slides below for the install settings, launch check, and Windows terminal habit",[11,2459,2461,2464],{"id":2460,"level":356},"windows-installer-components",[500,2462,2463],{"id":2460},"Windows Installer: Components",[942,2465,2469,2477],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},"1.4fr","0.9fr","never",[947,2470,2471],{"v-slot:left":949},[80,2472,2473],{},[1241,2474],{"alt":2475,"src":2476,"variant":1245},"Git for Windows installer component selection screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep01_components.png",[947,2478,2479],{"v-slot:right":949},[21,2480,2481,2484,2490],{},[24,2482,2483],{},"Recommended to have these components selected",[24,2485,2486,2487],{},"Keep ",[95,2488,2489],{},"Git Bash Here",[24,2491,2492,2493],{},"Continue with ",[95,2494,2495],{},"Next",[11,2497,2499,2502],{"id":2498,"level":356},"windows-installer-default-editor",[500,2500,2501],{"id":2498},"Windows Installer: Default Editor",[942,2503,2504,2512],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,2505,2506],{"v-slot:left":949},[80,2507,2508],{},[1241,2509],{"alt":2510,"src":2511,"variant":1245},"Git for Windows installer default editor selection screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep02_default_editor.png",[947,2513,2514],{"v-slot:right":949},[21,2515,2516,2519,2524],{},[24,2517,2518],{},"Choose the editor you are comfortable with",[24,2520,2521,2523],{},[95,2522,675],{}," or VS Code is friendlier than Vim for most beginners",[24,2525,2526],{},"This setting affects Git messages if Git opens an editor",[11,2528,2530,2533],{"id":2529,"level":356},"windows-installer-branch-name",[500,2531,2532],{"id":2529},"Windows Installer: Branch Name",[942,2534,2535,2543],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,2536,2537],{"v-slot:left":949},[80,2538,2539],{},[1241,2540],{"alt":2541,"src":2542,"variant":1245},"Git for Windows installer default branch name screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep03_branch_naming.png",[947,2544,2545],{"v-slot:right":949},[21,2546,2547,2553,2556],{},[24,2548,2549,2550],{},"Select the option that uses ",[95,2551,2552],{},"main",[24,2554,2555],{},"Course repositories will tell you which branch to use later",[24,2557,2558],{},"Do not create custom branch names here",[11,2560,2562,2565],{"id":2561,"level":356},"windows-installer-path",[500,2563,2564],{"id":2561},"Windows Installer: PATH",[942,2566,2567,2575],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,2568,2569],{"v-slot:left":949},[80,2570,2571],{},[1241,2572],{"alt":2573,"src":2574,"variant":1245},"Git for Windows installer PATH environment screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep04_path.png",[947,2576,2577],{"v-slot:right":949},[21,2578,2579,2582,2588,2591],{},[24,2580,2581],{},"Select the recommended PATH option",[24,2583,2584,2585],{},"This lets Git Bash and common tools find ",[95,2586,2587],{},"git",[24,2589,2590],{},"Avoid options that say Git Bash only",[24,2592,2593],{},"The third option can be used if you understand the consequences",[11,2595,2597,2600],{"id":2596,"level":356},"windows-installer-ssh",[500,2598,2599],{"id":2596},"Windows Installer: SSH",[942,2601,2602,2610],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,2603,2604],{"v-slot:left":949},[80,2605,2606],{},[1241,2607],{"alt":2608,"src":2609,"variant":1245},"Git for Windows installer SSH executable screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep05_ssh_bundled.png",[947,2611,2612],{"v-slot:right":949},[21,2613,2614,2617,2620],{},[24,2615,2616],{},"Use the bundled OpenSSH option",[24,2618,2619],{},"This keeps Git Bash SSH behavior predictable",[24,2621,2622],{},"SSH setup happens in the next lesson",[11,2624,2626,2630],{"id":2625,"level":356},"windows-installer-openssl",[500,2627,2629],{"id":2628},"windows-installer-https","Windows Installer: HTTPS",[942,2631,2632,2640],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,2633,2634],{"v-slot:left":949},[80,2635,2636],{},[1241,2637],{"alt":2638,"src":2639,"variant":1245},"Git for Windows installer HTTPS transport backend screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep06_openssl.png",[947,2641,2642],{"v-slot:right":949},[21,2643,2644,2647,2650],{},[24,2645,2646],{},"Keep the OpenSSL option",[24,2648,2649],{},"This is the normal Git for Windows choice",[24,2651,2652],{},"It supports secure GitHub connections",[11,2654,2656,2660],{"id":2655,"level":356},"windows-installer-checkout-style",[500,2657,2659],{"id":2658},"windows-installer-line-endings","Windows Installer: Line Endings",[942,2661,2662,2670],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,2663,2664],{"v-slot:left":949},[80,2665,2666],{},[1241,2667],{"alt":2668,"src":2669,"variant":1245},"Git for Windows installer line ending conversion screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep07_checkout_style.png",[947,2671,2672,2683],{"v-slot:right":949},[21,2673,2674,2677,2680],{},[24,2675,2676],{},"Keep the default line-ending option",[24,2678,2679],{},"Git handles Windows and Linux line endings for you",[24,2681,2682],{},"Do not change this unless a lesson says to",[2684,2685,2687],"admonition",{"type":2686},"note",[80,2688,2689],{},"Line-ending warnings may appear later. They are usually informational, not a sign that there's an issue.",[80,2691,2692],{},"::\n::",[11,2694,2696,2700],{"id":2695,"level":356},"windows-installer-mintty",[500,2697,2699],{"id":2698},"windows-installer-terminal-emulator","Windows Installer: Terminal Emulator",[942,2701,2702,2710],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,2703,2704],{"v-slot:left":949},[80,2705,2706],{},[1241,2707],{"alt":2708,"src":2709,"variant":1245},"Git for Windows installer terminal emulator screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep08_mintty.png",[947,2711,2712],{"v-slot:right":949},[21,2713,2714,2717,2720],{},[24,2715,2716],{},"Keep MinTTY selected",[24,2718,2719],{},"This is the normal Git Bash window",[24,2721,2722],{},"Course screenshots will assume this terminal style",[11,2724,2726,2730],{"id":2725,"level":356},"windows-installer-fast-forward",[500,2727,2729],{"id":2728},"windows-installer-pull-behavior","Windows Installer: Pull Behavior",[942,2731,2732,2740],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,2733,2734],{"v-slot:left":949},[80,2735,2736],{},[1241,2737],{"alt":2738,"src":2739,"variant":1245},"Git for Windows installer git pull behavior screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep09_ff_merge.png",[947,2741,2742],{"v-slot:right":949},[21,2743,2744,2751],{},[24,2745,2746,2747,2750],{},"Keep the default ",[95,2748,2749],{},"git pull"," behavior",[24,2752,2753],{},"Later lessons explain pull, merge, and conflicts",[11,2755,2757,2760],{"id":2756,"level":356},"windows-installer-credential-manager",[500,2758,2759],{"id":2756},"Windows Installer: Credential Manager",[942,2761,2762,2770],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,2763,2764],{"v-slot:left":949},[80,2765,2766],{},[1241,2767],{"alt":2768,"src":2769,"variant":1245},"Git for Windows installer credential manager screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep10_credential_manager.png",[947,2771,2772],{"v-slot:right":949},[21,2773,2774,2777,2780],{},[24,2775,2776],{},"Keep Git Credential Manager enabled",[24,2778,2779],{},"It helps with browser-based GitHub sign-in",[24,2781,2782],{},"This course still uses SSH for repo pushes",[11,2784,2786,2789],{"id":2785,"level":356},"windows-installer-extra-options",[500,2787,2788],{"id":2785},"Windows Installer: Extra Options",[942,2790,2791,2799],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,2792,2793],{"v-slot:left":949},[80,2794,2795],{},[1241,2796],{"alt":2797,"src":2798,"variant":1245},"Git for Windows installer extra options screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep11_extra_options_optional.png",[947,2800,2801],{"v-slot:right":949},[21,2802,2803,2811,2822,2830],{},[24,2804,2805,2806],{},"Enable file system caching\n",[21,2807,2808],{},[24,2809,2810],{},"Improves Git performance on Windows",[24,2812,2813,2814],{},"Enable symbolic links if available\n",[21,2815,2816,2819],{},[24,2817,2818],{},"Helps Git handle link-like files correctly",[24,2820,2821],{},"May require Windows Developer Mode or admin rights",[24,2823,2824,2825],{},"Skip experimental options\n",[21,2826,2827],{},[24,2828,2829],{},"They can change behavior between Git versions",[24,2831,2832],{},"Finish the installer",[11,2834,2836,2840],{"id":2835,"level":356},"step-1-open-git-bash-on-windows",[500,2837,2839],{"id":2838},"open-git-bash","Open Git Bash",[21,2841,2842,2845,2848],{},[24,2843,2844],{},"Start menu -> Git Bash",[24,2846,2847],{},"Pin it if that helps you find the same terminal later",[24,2849,2850],{},"Run the checks in the next slides from Git Bash",[11,2852,2854,2857],{"id":2853,"level":356},"windows-terminal-habit",[500,2855,2856],{"id":2853},"Windows Terminal Habit",[21,2858,2859,2862,2865],{},[24,2860,2861],{},"Use Git Bash for course commands on Windows",[24,2863,2864],{},"If another terminal opens by accident, close it and open Git Bash",[24,2866,2867],{},"Staying in one terminal makes setup problems easier to diagnose",[11,2869,2871,2874],{"id":2870,"level":14},"macos-path-terminal",[16,2872,2873],{"id":2870},"macOS Path: Terminal",[21,2875,2876,2879,2882,2885],{},[24,2877,2878],{},"Built-in Terminal is fully supported",[24,2880,2881],{},"Optional iTerm2 gives you tabs, split panes, and profiles",[24,2883,2884],{},"Beginner default: start with Terminal unless you already prefer iTerm2",[24,2886,2887],{},"See the slide below for the optional modern terminal install path",[11,2889,2891,2895],{"id":2890,"level":356},"macos-optional-iterm2-install",[500,2892,2894],{"id":2893},"optional-iterm2-install","Optional iTerm2 Install",[21,2896,2897,2904,2907,2910],{},[24,2898,2899,2900],{},"Download the stable release from ",[132,2901,2902],{"href":2902,"rel":2903},"https:\u002F\u002Fiterm2.com\u002Fdownloads.html",[993],[24,2905,2906],{},"Move iTerm2 to Applications",[24,2908,2909],{},"Open iTerm2 and run the same checks as Terminal",[24,2911,2912],{},"Use Terminal or iTerm2 consistently for course commands",[11,2914,2916,2919,2933,2936,2939],{"id":2915,"level":14},"linux-path-terminal",[16,2917,2918],{"id":2915},"Linux Path: Terminal",[21,2920,2921,2924,2927],{},[24,2922,2923],{},"Open the built-in Terminal app",[24,2925,2926],{},"Git is often installed already",[24,2928,2929,2930,2932],{},"If ",[95,2931,2395],{}," fails, use your distribution package manager",[80,2934,2935],{},"For Ubuntu:",[364,2937],{"language":366,"src":2938},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Flinux-path-terminal-01.sh",[21,2940,2941],{},[24,2942,2943],{},"See the slide below for the optional split-pane terminal setup",[11,2945,2947,2951,2954,2956,2959],{"id":2946,"level":356},"linux-optional-tilix-install",[500,2948,2950],{"id":2949},"optional-tilix-install","Optional Tilix Install",[80,2952,2953],{},"Tilix is a Linux terminal with split panes and profiles",[80,2955,2935],{},[364,2957],{"language":366,"src":2958},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Foptional-tilix-install-02.sh",[80,2960,2961],{},"Use the built-in Terminal if optional installs add friction",[11,2963,2965,2969],{"id":2964,"level":14},"step-3-confirm-git-and-shell",[16,2966,2968],{"id":2967},"confirm-git-and-shell","Confirm Git And Shell",[942,2970,2973,2987],{"gap":944,"left-width":2971,"right-width":2972},"1.15fr","0.85fr",[947,2974,2975,2977,2980,2983],{"v-slot:left":949},[80,2976,362],{},[364,2978],{"language":366,"src":2979},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fconfirm-git-and-shell-03.sh",[80,2981,2982],{},"Expected output:",[364,2984],{"language":2985,"src":2986},"plaintext","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fexample-output-04.txt",[947,2988,2989,2992],{"v-slot:right":949},[80,2990,2991],{},"This confirms:",[21,2993,2994,2997,3000],{},[24,2995,2996],{},"Git is installed",[24,2998,2999],{},"The terminal can find Git",[24,3001,3002],{},"Your shell matches later course commands",[11,3004,3006,3010],{"id":3005,"level":14},"step-4-cli-safety-check-before-every-git-command",[16,3007,3009],{"id":3008},"check-location-before-git-commands","Check Location Before Git Commands",[942,3011,3013,3025],{"gap":944,"left-width":3012,"right-width":2467},"1.1fr",[947,3014,3015,3017,3020,3022],{"v-slot:left":949},[80,3016,362],{},[364,3018],{"language":366,"src":3019},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fcheck-location-before-git-commands-05.sh",[80,3021,2982],{},[364,3023],{"language":2985,"src":3024},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fexample-output-06.txt",[947,3026,3027,3030],{"v-slot:right":949},[80,3028,3029],{},"Use this before Git commands:",[21,3031,3032,3037,3042,3045],{},[24,3033,3034,3036],{},[95,3035,170],{}," shows the current folder",[24,3038,3039,3041],{},[95,3040,851],{}," shows what is inside it",[24,3043,3044],{},"If the folder is wrong, fix location first",[24,3046,3047],{},"Do not run Git commands while guessing",[11,3049,3050,3052],{"id":854,"level":14},[16,3051,857],{"id":854},[942,3053,3054,3097],{"gap":944,"left-width":945,"right-width":945},[947,3055,3056],{"v-slot:left":949},[21,3057,3058,3071,3089],{},[24,3059,3060,3063],{},[95,3061,3062],{},"git: command not found",[21,3064,3065,3068],{},[24,3066,3067],{},"Git is missing, or this terminal cannot find it",[24,3069,3070],{},"Close the terminal and reopen the correct one",[24,3072,3073,3076],{},[95,3074,3075],{},"not a git repository",[21,3077,3078,3081],{},[24,3079,3080],{},"The command ran outside a cloned repository",[24,3082,631,3083,3085,3086,3088],{},[95,3084,170],{}," and ",[95,3087,851],{},", then move to the repo folder",[24,3090,3091,3092],{},"Wrong terminal",[21,3093,3094],{},[24,3095,3096],{},"Windows users should switch back to Git Bash",[947,3098,3099,3102],{"v-slot:right":949},[24,3100,3101],{},"Too many terminals open",[337,3103,3104,3107,3117,3122,3128],{},[24,3105,3106],{},"Close extra terminal windows",[24,3108,3109,3110],{},"Open the correct terminal\n",[21,3111,3112,3114],{},[24,3113,125],{},[24,3115,3116],{},"Apple macOS\u002FLinux: Terminal",[24,3118,3119,3120],{},"Run ",[95,3121,2395],{},[24,3123,3119,3124,3085,3126],{},[95,3125,170],{},[95,3127,851],{},[24,3129,3130],{},"Continue only after the folder looks right",[11,3132,3133,3135],{"id":936,"level":14},[16,3134,940],{"id":939},[942,3136,3137,3159],{"gap":944,"left-width":945,"right-width":945},[947,3138,3139,3141,3147,3153],{"v-slot:left":949},[500,3140,953],{"id":952},[80,3142,3143,3146],{},[163,3144,3145],{},"Terminal"," - A text-based interface where you type commands to control your computer",[80,3148,3149,3152],{},[163,3150,3151],{},"CLI (Command Line Interface)"," - The text-based interface where you type commands",[80,3154,3155,3158],{},[163,3156,3157],{},"Git"," - A tool for tracking changes in code files over time",[947,3160,3161,3163],{"v-slot:right":949},[500,3162,984],{"id":936},[21,3164,3165,3172,3178,3184],{},[24,3166,3167],{},[132,3168,3171],{"href":3169,"rel":3170},"https:\u002F\u002Fgit-scm.com\u002Fdownloads",[993],"Git Downloads",[24,3173,3174],{},[132,3175,3177],{"href":2444,"rel":3176},[993],"Git For Windows Install Page",[24,3179,3180],{},[132,3181,3183],{"href":2902,"rel":3182},[993],"iTerm2 Downloads",[24,3185,3186],{},[132,3187,3190],{"href":3188,"rel":3189},"https:\u002F\u002Fgnunn1.github.io\u002Ftilix-web\u002F",[993],"Tilix",[11,3192,3193,3195,3198],{"id":1011,"level":14},[16,3194,1014],{"id":1011},[80,3196,3197],{},"Before moving on, confirm you can:",[21,3199,3200,3203,3207,3214,3217],{},[24,3201,3202],{},"Open the correct terminal for your operating system",[24,3204,3119,3205],{},[95,3206,2395],{},[24,3208,631,3209,3085,3211,3213],{},[95,3210,170],{},[95,3212,851],{}," to check your location",[24,3215,3216],{},"Understand what terminal\u002FCLI refers to",[24,3218,3219],{},"Keep track of terminal instances",{"title":949,"searchDepth":1059,"depth":1059,"links":3221},[3222,3223,3224,3239,3242,3245,3246,3247,3248,3249],{"id":75,"depth":1059,"text":78},{"id":2406,"depth":1059,"text":2407},{"id":2435,"depth":1059,"text":2436,"children":3225},[3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238],{"id":2460,"depth":1075,"text":2463},{"id":2498,"depth":1075,"text":2501},{"id":2529,"depth":1075,"text":2532},{"id":2561,"depth":1075,"text":2564},{"id":2596,"depth":1075,"text":2599},{"id":2628,"depth":1075,"text":2629},{"id":2658,"depth":1075,"text":2659},{"id":2698,"depth":1075,"text":2699},{"id":2728,"depth":1075,"text":2729},{"id":2756,"depth":1075,"text":2759},{"id":2785,"depth":1075,"text":2788},{"id":2838,"depth":1075,"text":2839},{"id":2853,"depth":1075,"text":2856},{"id":2870,"depth":1059,"text":2873,"children":3240},[3241],{"id":2893,"depth":1075,"text":2894},{"id":2915,"depth":1059,"text":2918,"children":3243},[3244],{"id":2949,"depth":1075,"text":2950},{"id":2967,"depth":1059,"text":2968},{"id":3008,"depth":1059,"text":3009},{"id":854,"depth":1059,"text":857},{"id":939,"depth":1059,"text":940},{"id":1011,"depth":1059,"text":1014},"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":2375,"description":3250},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools",[2587,1112,1609],"21:30","u1x5bq-JmCg","https:\u002F\u002Fyoutu.be\u002Fu1x5bq-JmCg","71DrP8YI_ks4jUswWJXy9rmZOVVoeaJAEPancHNHsV4",{"id":3263,"title":3264,"audience":6,"body":3265,"contentType":1094,"course":1095,"description":4340,"estimateBasis":4341,"estimatedDiscussionMinutes":4342,"estimatedLiveMinutes":4343,"estimatedTotalMinutes":4344,"extension":1101,"meta":4345,"module":1103,"navigation":1104,"order":1599,"path":4346,"promptAssist":1106,"seo":4347,"status":1108,"stem":4348,"tags":4349,"videoDuration":4353,"videoId":4354,"videoLink":4355,"videoTitle":4356,"week":1103,"__hash__":4357},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh.md","Set Up GitHub SSH",{"type":8,"value":3266,"toc":4312},[3267,3293,3311,3336,3349,3376,3413,3490,3538,3605,3681,3723,3749,3781,3819,3864,3898,3967,3969,3972,3983,4055,4084,4118,4166,4212,4280],[11,3268,3270,3273],{"id":3269,"level":14},"goals",[16,3271,3272],{"id":3269},"Goals",[21,3274,3275,3278,3281,3284,3287,3290],{},[24,3276,3277],{},"Confirm Git works in the correct terminal",[24,3279,3280],{},"Sign in to GitHub with a school or personal account",[24,3282,3283],{},"Create or reuse an SSH key for GitHub",[24,3285,3286],{},"Add the public key to GitHub",[24,3288,3289],{},"Create and clone your course repository",[24,3291,3292],{},"Set Git identity inside the cloned repository",[11,3294,3296,3299,3308],{"id":3295,"level":14},"terminal-by-os",[16,3297,3298],{"id":3295},"Terminal By OS",[21,3300,3301,3303,3306],{},[24,3302,125],{},[24,3304,3305],{},"Apple macOS: Terminal or iTerm2",[24,3307,141],{},[80,3309,3310],{},"Run these commands on your own computer",[11,3312,3314,3317],{"id":3313,"level":14},"git-and-ssh-terms",[16,3315,3316],{"id":3313},"Git And SSH Terms",[21,3318,3319,3322,3330,3333],{},[24,3320,3321],{},"Git identity: name and email attached to commits in a repository",[24,3323,3324,3325],{},"SSH key pair: private key stays on your computer, public key goes to GitHub\n",[21,3326,3327],{},[24,3328,3329],{},"This is how we'll authenticate to GitHub",[24,3331,3332],{},"SSH agent: helper that keeps your private key available to Git commands",[24,3334,3335],{},"Clone: local folder connected to a GitHub repository",[11,3337,3339,3342,3346],{"id":3338,"level":14},"ssh-key-flow",[16,3340,3341],{"id":3338},"SSH Key Flow",[3343,3344],"mermaid",{"code":3345},"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",[80,3347,3348],{},"GitHub receives only the public key. The private key stays on your computer",[11,3350,3352,3355],{"id":3351,"level":14},"step-1-check-git",[16,3353,3354],{"id":3351},"Step 1: Check Git",[942,3356,3357,3365],{"gap":944,"left-width":945,"right-width":945},[947,3358,3359,3361],{"v-slot:left":949},[80,3360,362],{},[364,3362],{"label":3363,"language":366,"src":3364},"check-git.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-1-check-git-01.sh",[947,3366,3367,3369,3373],{"v-slot:right":949},[80,3368,2982],{},[364,3370],{"label":3371,"language":2985,"src":3372},"example-output.txt","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-02.txt",[80,3374,3375],{},"A valid version means Git is installed and available in this terminal",[11,3377,3379,3383],{"id":3378,"level":14},"step-2-github-account",[16,3380,3382],{"id":3381},"step-2-sign-in-to-github","Step 2: Sign In To GitHub",[942,3384,3386,3405],{"gap":944,"left-width":945,"right-width":3385},"0.8fr",[947,3387,3388],{"v-slot:left":949},[21,3389,3390,3393,3396,3399,3402],{},[24,3391,3392],{},"Use an existing GitHub account or create one",[24,3394,3395],{},"School email recommended for course identity",[24,3397,3398],{},"Personal email is fine if you prefer it",[24,3400,3401],{},"Avoid work email so course access does not depend on an employer account",[24,3403,3404],{},"Confirm you can open GitHub Settings before continuing",[947,3406,3407],{"v-slot:right":949},[80,3408,3409],{},[1241,3410],{"alt":3411,"src":3412,"variant":1245},"GitHub account menu open with Settings visible","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fgithub-logged-in.png",[11,3414,3416,3420],{"id":3415,"level":14},"step-2-create-repo",[16,3417,3419],{"id":3418},"step-3-create-course-repository","Step 3: Create Course Repository",[942,3421,3423,3482],{"gap":944,"left-width":3422,"right-width":2971},"0.95fr",[947,3424,3425,3428],{"v-slot:left":949},[80,3426,3427],{},"In GitHub:",[21,3429,3430,3435,3441,3447,3462,3468,3471,3479],{},[24,3431,1266,3432],{},[95,3433,3434],{},"+",[24,3436,3437,3438],{},"Choose ",[95,3439,3440],{},"New repository",[24,3442,3443,3444],{},"Name it ",[95,3445,3446],{},"\u003Cucid>-IT202-\u003Csection>-\u003CsemYear>",[24,3448,3449,3450,3453,3454,3457,3458,3461],{},"Semester code examples: ",[95,3451,3452],{},"S2026"," spring, ",[95,3455,3456],{},"M2026"," summer, ",[95,3459,3460],{},"F2026"," fall",[24,3463,3464,3465],{},"Set visibility to ",[95,3466,3467],{},"Private",[24,3469,3470],{},"Toggle \"Add README\"",[24,3472,3473,3474],{},"Do not toggle \"Add .gitignore\"",[21,3475,3476],{},[24,3477,3478],{},"A future lesson will discuss and add this important file",[24,3480,3481],{},"Do not add starter files unless instructed",[947,3483,3484],{"v-slot:right":949},[80,3485,3486],{},[1241,3487],{"alt":3488,"src":3489,"variant":1245},"GitHub new repository form with course naming pattern, private visibility, and README enabled","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fnew-repo.png",[11,3491,3493,3497,3524],{"id":3492,"level":14},"step-3-check-existing-key",[16,3494,3496],{"id":3495},"step-4-check-for-existing-ssh-key","Step 4: Check For Existing SSH Key",[942,3498,3499,3507],{"gap":944,"left-width":945,"right-width":945},[947,3500,3501,3503],{"v-slot:left":949},[80,3502,362],{},[364,3504],{"label":3505,"language":366,"src":3506},"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",[947,3508,3509,3512,3515],{"v-slot:right":949},[80,3510,3511],{},"Example output:",[364,3513],{"label":3371,"language":2985,"src":3514},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-04.txt",[80,3516,3517,3518,3085,3521],{},"Look for a matching GitHub-specific pair such as ",[95,3519,3520],{},"github_key",[95,3522,3523],{},"github_key.pub",[80,3525,3526,3527,3530,3531,682,3534,3537],{},"You can reuse an existing matching pair only if it is ",[163,3528,3529],{},"NOT"," a default key such as ",[95,3532,3533],{},"id_ed25519",[95,3535,3536],{},"id_rsa",". Otherwise, create a GitHub-specific key in the next step",[11,3539,3541,3545,3547,3551,3553,3556],{"id":3540,"level":14},"step-4-create-key-if-needed",[16,3542,3544],{"id":3543},"step-5-create-ssh-key-if-needed","Step 5: Create SSH Key If Needed",[80,3546,362],{},[364,3548],{"label":3549,"language":366,"src":3550},"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",[80,3552,3511],{},[364,3554],{"label":3371,"language":2985,"src":3555},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-06.txt",[21,3557,3558,3584,3589,3594],{},[24,3559,3560,3561],{},"Command flags:\n",[21,3562,3563,3569,3575],{},[24,3564,3565,3568],{},[95,3566,3567],{},"-t"," chooses the key type",[24,3570,3571,3574],{},[95,3572,3573],{},"-C"," adds a comment label, usually your GitHub email",[24,3576,3577,3579,3580,3583],{},[95,3578,646],{}," chooses the output file path (must include ",[95,3581,3582],{},"~\u002F.ssh\u002F"," followed by the file name)",[24,3585,3586,3588],{},[95,3587,3520],{}," is the private key file",[24,3590,3591,3593],{},[95,3592,3523],{}," is the public key file for GitHub",[24,3595,3596,3597],{},"Passphrase is optional unless your instructor requires one\n",[21,3598,3599,3602],{},[24,3600,3601],{},"Pro: protects the key if someone gets the file",[24,3603,3604],{},"Con: adds an unlock prompt when the key is used",[11,3606,3608,3612,3629,3661],{"id":3607,"level":14},"step-5-start-agent-and-add-key",[16,3609,3611],{"id":3610},"step-6-start-ssh-agent-and-verify-key","Step 6: Start SSH Agent And Verify Key",[942,3613,3614,3622],{"gap":944,"left-width":3012,"right-width":945},[947,3615,3616,3618],{"v-slot:left":949},[80,3617,362],{},[364,3619],{"label":3620,"language":366,"src":3621},"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",[947,3623,3624,3626],{"v-slot:right":949},[80,3625,3511],{},[364,3627],{"label":3371,"language":2985,"src":3628},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-08.txt",[21,3630,3631,3637,3658],{},[24,3632,3633,3636],{},[95,3634,3635],{},"eval \"$(ssh-agent -s)\""," starts the SSH helper GitHub docs usually show",[24,3638,3639,3640,3643,3644,3647],{},"If that fails, run ",[95,3641,3642],{},"exec ssh-agent bash",", then run ",[95,3645,3646],{},"ssh-add ~\u002F.ssh\u002Fgithub_key",[21,3648,3649],{},[24,3650,631,3651,3654,3655,3657],{},[95,3652,3653],{},"~\u002F.ssh\u002Fgithub_key"," because ",[95,3656,267],{}," avoids issues with spaces in home directory paths",[24,3659,3660],{},"Then verify the key is loaded",[942,3662,3663,3671],{"gap":944,"left-width":945,"right-width":945},[947,3664,3665,3667],{"v-slot:left":949},[80,3666,362],{},[364,3668],{"label":3669,"language":366,"src":3670},"verify-loaded-key.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fverify-loaded-key-09.sh",[947,3672,3673,3675,3678],{"v-slot:right":949},[80,3674,2982],{},[364,3676],{"label":3371,"language":2985,"src":3677},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-10.txt",[80,3679,3680],{},"One loaded key is enough for this lesson",[11,3682,3684,3688,3705],{"id":3683,"level":14},"step-6-copy-public-key",[16,3685,3687],{"id":3686},"step-7-copy-public-key","Step 7: Copy Public Key",[942,3689,3690,3698],{"gap":944,"left-width":945,"right-width":945},[947,3691,3692,3694],{"v-slot:left":949},[80,3693,362],{},[364,3695],{"label":3696,"language":366,"src":3697},"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",[947,3699,3700,3702],{"v-slot:right":949},[80,3701,3511],{},[364,3703],{"label":3371,"language":2985,"src":3704},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-12.txt",[21,3706,3707,3717],{},[24,3708,3709,3710,3713,3714,3716],{},"Copy the full line starting with ",[95,3711,3712],{},"ssh-ed25519"," and ending with the value you set with ",[95,3715,3573],{}," earlier",[24,3718,3719,3720,3722],{},"Do not copy ",[95,3721,3520],{},", which is the private key (never share the private key)",[11,3724,3726,3730],{"id":3725,"level":14},"step-7-add-key-to-github",[16,3727,3729],{"id":3728},"step-8-add-key-to-github","Step 8: Add Key To GitHub",[21,3731,3732,3735,3740,3743,3746],{},[24,3733,3734],{},"In GitHub, open account settings",[24,3736,2441,3737],{},[95,3738,3739],{},"SSH and GPG keys",[24,3741,3742],{},"Add a new authentication key",[24,3744,3745],{},"Paste the public key from the previous step",[24,3747,3748],{},"See the slides below for the GitHub screens",[11,3750,3752,3756],{"id":3751,"level":356},"step-8-open-github-settings",[500,3753,3755],{"id":3754},"open-github-settings","Open GitHub Settings",[942,3757,3758,3766],{"gap":944,"left-width":3012,"right-width":2467,"stack":2468},[947,3759,3760],{"v-slot:left":949},[80,3761,3762],{},[1241,3763],{"alt":3764,"src":3765,"variant":1245},"GitHub profile menu with Settings highlighted","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fssh-key-01-gh-menu.png",[947,3767,3768],{"v-slot:right":949},[21,3769,3770,3773,3778],{},[24,3771,3772],{},"Click your GitHub profile photo",[24,3774,3437,3775],{},[95,3776,3777],{},"Settings",[24,3779,3780],{},"Use the account menu, not the repository settings",[11,3782,3784,3788],{"id":3783,"level":356},"step-8-open-ssh-keys-page",[500,3785,3787],{"id":3786},"open-ssh-and-gpg-keys","Open SSH And GPG Keys",[942,3789,3790,3798],{"gap":944,"left-width":3012,"right-width":2467,"stack":2468},[947,3791,3792],{"v-slot:left":949},[80,3793,3794],{},[1241,3795],{"alt":3796,"src":3797,"variant":1245},"GitHub settings sidebar with SSH and GPG keys selected","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fssh-key-02-gh-ssh-link.png",[947,3799,3800],{"v-slot:right":949},[21,3801,3802,3809,3814],{},[24,3803,3804,3805,3808],{},"Find the ",[95,3806,3807],{},"Access"," section",[24,3810,3811,3812],{},"Open ",[95,3813,3739],{},[24,3815,3437,3816],{},[95,3817,3818],{},"New SSH key",[11,3820,3822,3826],{"id":3821,"level":356},"step-8-add-new-ssh-key",[500,3823,3825],{"id":3824},"add-new-ssh-key","Add New SSH Key",[942,3827,3829,3837],{"gap":944,"left-width":3828,"right-width":2972,"stack":2468},"1.35fr",[947,3830,3831],{"v-slot:left":949},[80,3832,3833],{},[1241,3834],{"alt":3835,"src":3836,"variant":1245},"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",[947,3838,3839],{"v-slot:right":949},[21,3840,3841,3847,3853,3856,3861],{},[24,3842,3843,3844],{},"Title it clearly, such as ",[95,3845,3846],{},"\u003Ccourse> Laptop",[24,3848,3849,3850],{},"Keep key type as ",[95,3851,3852],{},"Authentication Key",[24,3854,3855],{},"Paste the full public key line",[24,3857,1266,3858],{},[95,3859,3860],{},"Add SSH key",[24,3862,3863],{},"Never paste the private key",[11,3865,3867,3871],{"id":3866,"level":14},"step-8-test-auth",[16,3868,3870],{"id":3869},"step-9-test-github-ssh-access","Step 9: Test GitHub SSH Access",[942,3872,3873,3888],{"gap":944,"left-width":945,"right-width":3012},[947,3874,3875,3877,3881],{"v-slot:left":949},[80,3876,362],{},[364,3878],{"label":3879,"language":366,"src":3880},"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",[80,3882,3883,3884,3887],{},"If prompted the first time, type ",[95,3885,3886],{},"yes"," to trust GitHub's host key",[947,3889,3890,3892,3895],{"v-slot:right":949},[80,3891,2982],{},[364,3893],{"label":3371,"language":2985,"src":3894},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-14.txt",[80,3896,3897],{},"This confirms authentication, then GitHub closes the connection",[11,3899,3901,3905],{"id":3900,"level":14},"step-9-clone-repo",[16,3902,3904],{"id":3903},"step-10-clone-course-repository","Step 10: Clone Course Repository",[942,3906,3907,3948],{"gap":944,"left-width":2467,"right-width":3012},[947,3908,3909,3913,3942],{"v-slot:left":949},[500,3910,3912],{"id":3911},"get-the-ssh-clone-url","Get The SSH Clone URL",[21,3914,3915,3921,3928,3935],{},[24,3916,3917,3918],{},"In your GitHub repository, click ",[95,3919,3920],{},"Code",[24,3922,3923,3924,3927],{},"Choose the ",[95,3925,3926],{},"SSH"," tab",[24,3929,3930,3931,3934],{},"Copy the ",[95,3932,3933],{},"git@github.com:..."," link",[24,3936,3937,3938,3941],{},"Use that link in the ",[95,3939,3940],{},"git clone"," command",[80,3943,3944],{},[1241,3945],{"alt":3946,"src":3947,"variant":1245},"GitHub repository Code menu with SSH clone URL selected","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fgithub-clone-url.png",[947,3949,3950,3953,3957],{"v-slot:right":949},[80,3951,3952],{},"Run from the folder that should contain your course repo:",[364,3954],{"label":3955,"language":366,"src":3956},"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",[2684,3958,3960],{"type":3959},"tip",[80,3961,3962,3963,3966],{},"Before cloning, run ",[95,3964,3965],{},"git rev-parse --show-toplevel",". If it prints a path, move somewhere else first. Clone this repo only once.",[80,3968,3511],{},[364,3970],{"label":3371,"language":2985,"src":3971},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-16.txt",[80,3973,3974,3975,3978,3979,3982],{},"If you see an empty repository warning, you probably forgot to add ",[95,3976,3977],{},"README.md"," when creating the repo. Create it with ",[95,3980,3981],{},"touch README.md",", then use the add\u002Fcommit\u002Fpush commands from the next lesson\n::\n::",[11,3984,3986,3990,4009,4028,4048],{"id":3985,"level":14},"step-10-set-repo-identity",[16,3987,3989],{"id":3988},"step-11-set-repo-git-identity","Step 11: Set Repo Git Identity",[942,3991,3992,4001],{"gap":944,"left-width":945,"right-width":945},[947,3993,3994,3997],{"v-slot:left":949},[80,3995,3996],{},"Run inside the cloned repository:",[364,3998],{"label":3999,"language":366,"src":4000},"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",[947,4002,4003,4005],{"v-slot:right":949},[80,4004,2982],{},[364,4006],{"label":4007,"language":2985,"src":4008},"config-output.txt","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-19.txt",[942,4010,4011,4020],{"gap":944,"left-width":945,"right-width":945},[947,4012,4013,4016],{"v-slot:left":949},[80,4014,4015],{},"Then verify:",[364,4017],{"label":4018,"language":366,"src":4019},"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",[947,4021,4022,4024],{"v-slot:right":949},[80,4023,2982],{},[364,4025],{"label":4026,"language":2985,"src":4027},"identity-output.txt","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-20.txt",[21,4029,4030,4036,4042],{},[24,4031,4032,4035],{},[95,4033,4034],{},"user.name"," can be your real or display name, though commonly it's your GitHub username",[24,4037,4038,4041],{},[95,4039,4040],{},"user.email"," should match a GitHub email or GitHub no-reply address for commit linking to work (this is important)",[24,4043,4044,4047],{},[95,4045,4046],{},"core.sshCommand"," tells this repository to use your course GitHub key",[80,4049,4050,4051,4054],{},"These commands set identity for this repository. The ",[95,4052,4053],{},"--global"," flag is an option only if you intentionally want the same identity for all repositories",[11,4056,4058,4062,4065,4081],{"id":4057,"level":14},"step-11-invite-collaborators",[16,4059,4061],{"id":4060},"step-12-invite-course-collaborators","Step 12: Invite Course Collaborators",[80,4063,4064],{},"In GitHub, open your course repository:",[21,4066,4067,4070,4075,4078],{},[24,4068,4069],{},"Settings -> Collaborators and teams",[24,4071,4072,4073],{},"Invite ",[95,4074,1472],{},[24,4076,4077],{},"Invite your TA if your section has one",[24,4079,4080],{},"Wait until the invitation shows as sent or accepted",[80,4082,4083],{},"This is so it can be accessed for grading and assistance",[11,4085,4087,4090],{"id":4086,"level":14},"troubleshooting-auth",[16,4088,4089],{"id":4086},"Troubleshooting Auth",[21,4091,4092,4098,4105,4112,4115],{},[24,4093,4094,4097],{},[95,4095,4096],{},"Permission denied (publickey)",": GitHub did not accept a loaded key",[24,4099,4100,4101,4104],{},"No loaded key in ",[95,4102,4103],{},"ssh-add -l",": start the agent and add the key again",[24,4106,4107,4108,4111],{},"Wrong key in GitHub: delete it and paste the ",[95,4109,4110],{},".pub"," key again",[24,4113,4114],{},"Wrong account: make sure the success message names your GitHub account",[24,4116,4117],{},"See the slide below for a quick reset sequence",[11,4119,4121,4125,4127,4154],{"id":4120,"level":356},"troubleshooting-auth-recovery",[500,4122,4124],{"id":4123},"quick-reset-sequence","Quick Reset Sequence",[80,4126,362],{},[337,4128,4129,4133,4137,4141,4146,4149],{},[24,4130,4131],{},[95,4132,3635],{},[24,4134,4135],{},[95,4136,3646],{},[24,4138,4139],{},[95,4140,4103],{},[24,4142,4143],{},[95,4144,4145],{},"cat ~\u002F.ssh\u002Fgithub_key.pub",[24,4147,4148],{},"Re-paste the public key in GitHub if needed",[24,4150,4151],{},[95,4152,4153],{},"ssh -T git@github.com",[80,4155,2929,4156,4158,4159,4161,4162,4165],{},[95,4157,3635],{}," fails in Git Bash, use ",[95,4160,3642],{},", then repeat the ",[95,4163,4164],{},"ssh-add"," steps",[11,4167,4168,4170,4173],{"id":924,"level":14},[16,4169,927],{"id":924},[80,4171,4172],{},"You are done when all are true:",[21,4174,4175,4180,4187,4192,4195,4200,4203],{},[24,4176,4177,4179],{},[95,4178,2395],{}," works",[24,4181,4182,4184,4185],{},[95,4183,4103],{}," shows ",[95,4186,3520],{},[24,4188,4189,4191],{},[95,4190,4153],{}," names your GitHub account",[24,4193,4194],{},"Your private course repository exists on GitHub",[24,4196,4197,4199],{},[95,4198,1472],{}," and your TA, if applicable, are invited as collaborators",[24,4201,4202],{},"Your local terminal is open to the cloned repository",[24,4204,4205,3085,4208,4211],{},[95,4206,4207],{},"git config user.name",[95,4209,4210],{},"git config user.email"," return your repo identity",[11,4213,4214,4216],{"id":936,"level":14},[16,4215,940],{"id":939},[942,4217,4218,4246],{"gap":944,"left-width":945,"right-width":945},[947,4219,4220,4222,4228,4234,4240],{"v-slot:left":949},[500,4221,953],{"id":952},[80,4223,4224,4227],{},[163,4225,4226],{},"Git identity"," - commit name and email saved in repo config",[80,4229,4230,4233],{},[163,4231,4232],{},"SSH key pair"," - private key on your computer, public key in GitHub",[80,4235,4236,4239],{},[163,4237,4238],{},"SSH agent"," - background helper that makes your private key available",[80,4241,4242,4245],{},[163,4243,4244],{},"Clone"," - local copy of a GitHub repository",[947,4247,4248,4250],{"v-slot:right":949},[500,4249,984],{"id":936},[21,4251,4252,4259,4266,4273],{},[24,4253,4254],{},[132,4255,4258],{"href":4256,"rel":4257},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fauthentication\u002Fconnecting-to-github-with-ssh\u002Fgenerating-a-new-ssh-key-and-adding-it-to-the-ssh-agent",[993],"GitHub Docs: Generate a new SSH key and add it to the ssh-agent",[24,4260,4261],{},[132,4262,4265],{"href":4263,"rel":4264},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fauthentication\u002Fconnecting-to-github-with-ssh\u002Ftesting-your-ssh-connection",[993],"GitHub Docs: Testing your SSH connection",[24,4267,4268],{},[132,4269,4272],{"href":4270,"rel":4271},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fcreating-and-managing-repositories\u002Fcreating-a-new-repository",[993],"GitHub Docs: Create a repository",[24,4274,4275],{},[132,4276,4279],{"href":4277,"rel":4278},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fcreating-and-managing-repositories\u002Fcloning-a-repository",[993],"GitHub Docs: Cloning a repository",[11,4281,4282,4284,4286],{"id":1011,"level":14},[16,4283,1014],{"id":1011},[80,4285,1017],{},[21,4287,4288,4291,4294,4297,4300,4303,4309],{},[24,4289,4290],{},"Use the correct terminal for your operating system",[24,4292,4293],{},"Authenticate to GitHub with SSH",[24,4295,4296],{},"Find your private course repository on GitHub",[24,4298,4299],{},"Invite course collaborators",[24,4301,4302],{},"Open the local clone in the terminal",[24,4304,4305,4306],{},"Show repo-local Git identity with ",[95,4307,4308],{},"git config",[24,4310,4311],{},"Next: practice the Git commands used for course work",{"title":949,"searchDepth":1059,"depth":1059,"links":4313},[4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4330,4331,4332,4333,4334,4337,4338,4339],{"id":3269,"depth":1059,"text":3272},{"id":3295,"depth":1059,"text":3298},{"id":3313,"depth":1059,"text":3316},{"id":3338,"depth":1059,"text":3341},{"id":3351,"depth":1059,"text":3354},{"id":3381,"depth":1059,"text":3382},{"id":3418,"depth":1059,"text":3419},{"id":3495,"depth":1059,"text":3496},{"id":3543,"depth":1059,"text":3544},{"id":3610,"depth":1059,"text":3611},{"id":3686,"depth":1059,"text":3687},{"id":3728,"depth":1059,"text":3729,"children":4326},[4327,4328,4329],{"id":3754,"depth":1075,"text":3755},{"id":3786,"depth":1075,"text":3787},{"id":3824,"depth":1075,"text":3825},{"id":3869,"depth":1059,"text":3870},{"id":3903,"depth":1059,"text":3904},{"id":3988,"depth":1059,"text":3989},{"id":4060,"depth":1059,"text":4061},{"id":4086,"depth":1059,"text":4089,"children":4335},[4336],{"id":4123,"depth":1075,"text":4124},{"id":924,"depth":1059,"text":927},{"id":939,"depth":1059,"text":940},{"id":1011,"depth":1059,"text":1014},"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.","15","70","85",{},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh",{"title":3264,"description":4340},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh",[2587,4350,4351,4352],"github","ssh","repository","48:26","HZG3_HfczOk","https:\u002F\u002Fyoutu.be\u002FHZG3_HfczOk","Setup Git SSH and GitHub","rJ2RP6nrPEoOj98kzeevFpO0YOXaJl-M5ajP_tsjwvA",{"id":4359,"title":4360,"audience":6,"body":4361,"contentType":1094,"course":1095,"description":5281,"estimateBasis":5282,"estimatedDiscussionMinutes":1598,"estimatedLiveMinutes":4343,"estimatedTotalMinutes":5283,"extension":1101,"meta":5284,"module":1103,"navigation":1104,"order":5285,"path":5286,"promptAssist":1106,"seo":5287,"status":1108,"stem":5288,"tags":5289,"videoDuration":5292,"videoId":5293,"videoLink":5294,"videoTitle":5295,"week":1103,"__hash__":5296},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs.md","Git Commands And Pull Requests",{"type":8,"value":4362,"toc":5246},[4363,4392,4413,4430,4462,4496,4547,4563,4584,4615,4647,4689,4720,4755,4779,4824,4851,4881,4899,4911,4947,4980,5016,5050,5076,5104,5134,5201,5243],[11,4364,4366,4369,4372],{"id":4365,"level":14},"objectives",[16,4367,4368],{"id":4365},"Objectives",[80,4370,4371],{},"By the end, you should be able to:",[21,4373,4374,4377,4380,4383,4386,4389],{},[24,4375,4376],{},"Explain what the common Git commands do",[24,4378,4379],{},"Connect commands to the working folder, staging area, local commits, and GitHub remote",[24,4381,4382],{},"Create a branch for practice work",[24,4384,4385],{},"Stage, commit, and push a small change",[24,4387,4388],{},"Open a pull request on GitHub",[24,4390,4391],{},"Investigate a failed push and a merge conflict",[11,4393,4395,4399,4402,4405],{"id":4394,"level":14},"git-vs-github",[16,4396,4398],{"id":4397},"git-versus-github","Git Versus GitHub",[80,4400,4401],{},"Git is the tool that tracks file history",[80,4403,4404],{},"GitHub is a website that hosts a remote copy of a Git repository",[21,4406,4407,4410],{},[24,4408,4409],{},"Git: local terminal workflow",[24,4411,4412],{},"GitHub: remote branches, pull requests, issues, and project evidence",[11,4414,4416,4420,4424,4427],{"id":4415,"level":14},"git-stages",[16,4417,4419],{"id":4418},"the-git-stages","The Git Stages",[364,4421],{"language":4422,"src":4423},"text","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fthe-git-stages-01.txt",[80,4425,4426],{},"Common commands:",[364,4428],{"language":4422,"src":4429},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fthe-git-stages-02.txt",[11,4431,4433,4437,4439,4442,4445,4448],{"id":4432,"level":14},"status-first",[16,4434,4436],{"id":4435},"command-1-git-status","Command 1: git status",[80,4438,362],{},[364,4440],{"language":366,"src":4441},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-1-git-status-03.sh",[80,4443,4444],{},"Use this before and after every important Git action",[80,4446,4447],{},"It tells you:",[21,4449,4450,4453,4456,4459],{},[24,4451,4452],{},"Current branch",[24,4454,4455],{},"Changed files",[24,4457,4458],{},"Staged files",[24,4460,4461],{},"Whether your working tree is clean",[11,4463,4465,4469,4471,4474],{"id":4464,"level":14},"branch-command",[16,4466,4468],{"id":4467},"command-2-git-branch","Command 2: git branch",[80,4470,362],{},[364,4472],{"language":366,"src":4473},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-2-git-branch-04.sh",[21,4475,4476,4479,4482],{},[24,4477,4478],{},"Active branch has an asterisk",[24,4480,4481],{},"Branches are separate timelines for work",[24,4483,4484,4485],{},"Branch names are case-sensitive\n",[21,4486,4487],{},[24,4488,4489,3085,4492,4495],{},[95,4490,4491],{},"Practice",[95,4493,4494],{},"practice"," are different names",[11,4497,4499,4503,4508,4511],{"id":4498,"level":14},"create-branch",[16,4500,4502],{"id":4501},"practice-step-1-create-a-branch","Practice Step 1: Create A Branch",[80,4504,4505,4506,740],{},"Start from ",[95,4507,2552],{},[364,4509],{"language":366,"src":4510},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpractice-step-1-create-a-05.sh",[21,4512,4513,4524],{},[24,4514,4515,4516,4518,4519],{},"First two commands: make sure ",[95,4517,2552],{}," is current\n",[21,4520,4521],{},[24,4522,4523],{},"Explained more later",[24,4525,4526,4527],{},"Branch control commands\n",[21,4528,4529,4535,4541],{},[24,4530,4531,4534],{},[95,4532,4533],{},"git checkout -b practice",": create and switch",[24,4536,4537,4540],{},[95,4538,4539],{},"git branch practice",": create only",[24,4542,4543,4546],{},[95,4544,4545],{},"git checkout practice",": switch to existing",[11,4548,4550,4554,4557,4560],{"id":4549,"level":14},"make-file",[16,4551,4553],{"id":4552},"practice-step-2-make-a-small-file","Practice Step 2: Make A Small File",[80,4555,4556],{},"Create a small practice file:",[364,4558],{"language":366,"src":4559},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpractice-step-2-make-a-s-06.sh",[80,4561,4562],{},"Expected result: Git shows the new file as untracked",[11,4564,4566,4570,4573,4576,4579],{"id":4565,"level":14},"add-command",[16,4567,4569],{"id":4568},"command-3-git-add","Command 3: git add",[80,4571,4572],{},"Stage the new file:",[364,4574],{"language":366,"src":4575},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-3-git-add-07.sh",[80,4577,4578],{},"Staging means: include this change in the next commit",[21,4580,4581],{},[24,4582,4583],{},"See below for add patterns and verification checks",[11,4585,4587,4591,4594,4597],{"id":4586,"level":356},"add-variants",[500,4588,4590],{"id":4589},"common-git-add-patterns","Common git add Patterns",[80,4592,4593],{},"Use the smallest clear target when possible",[364,4595],{"language":366,"src":4596},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommon-git-add-patterns-08.sh",[21,4598,4599,4602,4605],{},[24,4600,4601],{},"Single file: safest when you changed one file",[24,4603,4604],{},"Folder: useful when one feature is grouped in one folder",[24,4606,4607,4610,4611,4614],{},[95,4608,4609],{},"git add .",": convenient, but review ",[95,4612,4613],{},"git status"," first",[11,4616,4618,4622,4625,4628],{"id":4617,"level":14},"diff-command",[16,4619,4621],{"id":4620},"command-4-git-diff","Command 4: git diff",[80,4623,4624],{},"Before committing, inspect what changed:",[364,4626],{"language":366,"src":4627},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-4-git-diff-09.sh",[21,4629,4630,4637,4640,4645],{},[24,4631,4632,4633,4636],{},"New untracked file: ",[95,4634,4635],{},"git diff"," may show nothing",[24,4638,4639],{},"That does not mean the file is missing",[24,4641,631,4642,4644],{},[95,4643,4613],{}," to confirm untracked files",[24,4646,802],{},[11,4648,4650,4654,4657,4660,4663,4666],{"id":4649,"level":356},"cached-rm",[500,4651,4653],{"id":4652},"if-you-staged-the-wrong-file","If You Staged The Wrong File",[80,4655,4656],{},"If a file was staged by mistake, remove it from staging:",[364,4658],{"language":366,"src":4659},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fif-you-staged-the-wrong--10.sh",[80,4661,4662],{},"For a folder:",[364,4664],{"language":366,"src":4665},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fif-you-staged-the-wrong--11.sh",[21,4667,4668,4679],{},[24,4669,4670,4673,4674],{},[95,4671,4672],{},"--cached",": remove from staging only\n",[21,4675,4676],{},[24,4677,4678],{},"Keeps the file in your working folder",[24,4680,4681,4683,4684],{},[95,4682,101],{},": folder mode\n",[21,4685,4686],{},[24,4687,4688],{},"Recursive: include files inside the folder",[11,4690,4692,4696,4699,4702,4705],{"id":4691,"level":14},"commit-command",[16,4693,4695],{"id":4694},"command-5-git-commit","Command 5: git commit",[80,4697,4698],{},"Commit the staged file:",[364,4700],{"language":366,"src":4701},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-5-git-commit-12.sh",[80,4703,4704],{},"A commit is a saved checkpoint in your local repository",[21,4706,4707,4718],{},[24,4708,4709,4712,4713],{},[95,4710,4711],{},"-m",": commit message",[21,4714,4715],{},[24,4716,4717],{},"Required, even if the message is an empty string",[24,4719,802],{},[11,4721,4723,4727,4729,4732,4752],{"id":4722,"level":356},"log-command",[500,4724,4726],{"id":4725},"check-the-local-history","Check The Local History",[80,4728,362],{},[364,4730],{"language":366,"src":4731},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcheck-the-local-history-13.sh",[21,4733,4734,4740,4746],{},[24,4735,4736,4739],{},[95,4737,4738],{},"log",": show commit history",[24,4741,4742,4745],{},[95,4743,4744],{},"--oneline",": one commit per line",[24,4747,4748,4751],{},[95,4749,4750],{},"-5",": show the latest five commits",[80,4753,4754],{},"You should see your latest commit near the top",[11,4756,4758,4762,4765,4768],{"id":4757,"level":14},"push-command",[16,4759,4761],{"id":4760},"command-6-git-push","Command 6: git push",[80,4763,4764],{},"Send the branch to GitHub:",[364,4766],{"language":366,"src":4767},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-6-git-push-14.sh",[21,4769,4770,4776],{},[24,4771,4772,4775],{},[95,4773,4774],{},"origin",": common remote name for GitHub",[24,4777,4778],{},"Final part: branch you are pushing",[11,4780,4782,4786],{"id":4781,"level":14},"open-pr",[16,4783,4785],{"id":4784},"pull-request","Pull Request",[942,4787,4788,4816],{"gap":944,"left-width":945,"right-width":945},[947,4789,4790,4793,4796,4799,4802,4805],{"v-slot:left":949},[80,4791,4792],{},"On GitHub, open a pull request",[80,4794,4795],{},"Use this direction:",[364,4797],{"language":4422,"src":4798},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-request-15.txt",[80,4800,4801],{},"Use a clear description:",[364,4803],{"language":4422,"src":4804},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-request-description-16.txt",[21,4806,4807,4810,4813],{},[24,4808,4809],{},"Review page before merge",[24,4811,4812],{},"Shows what will change",[24,4814,4815],{},"Captures branch evidence",[947,4817,4818],{"v-slot:right":949},[80,4819,4820],{},[1241,4821],{"alt":4822,"src":4823,"variant":1245},"GitHub pull request creation page showing base main and compare practice","\u002Fimages\u002Fshared\u002Fgit-workflow\u002Fgithub-create-pull-request.png",[11,4825,4827,4831,4834,4842,4845,4848],{"id":4826,"level":14},"merge-pr",[16,4828,4830],{"id":4829},"merge-and-sync","Merge And Sync",[80,4832,4833],{},"After GitHub merge:",[21,4835,4836],{},[24,4837,4838,4839,4841],{},"Local ",[95,4840,2552],{}," is not updated automatically",[80,4843,4844],{},"Sync it:",[364,4846],{"language":366,"src":4847},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fmerge-and-sync-15.sh",[80,4849,4850],{},"Remote changes must be pulled down intentionally",[11,4852,4854,4858,4861,4878],{"id":4853,"level":14},"why-prs",[16,4855,4857],{"id":4856},"why-pull-requests-matter","Why Pull Requests Matter",[80,4859,4860],{},"Pull requests create evidence:",[21,4862,4863,4866,4869,4872,4875],{},[24,4864,4865],{},"Which branch changed",[24,4867,4868],{},"Which files changed",[24,4870,4871],{},"What discussion or explanation was provided",[24,4873,4874],{},"Chance to review risky changes before merging",[24,4876,4877],{},"When the change was merged",[80,4879,4880],{},"For this course, pull requests are part of the workflow evidence, not just a GitHub feature",[11,4882,4884,4888,4891],{"id":4883,"level":14},"exploration-intro",[16,4885,4887],{"id":4886},"troubleshooting-explorations","Troubleshooting Explorations",[80,4889,4890],{},"The next slides use controlled problems to practice recovery",[21,4892,4893,4896],{},[24,4894,4895],{},"The goal is not avoiding every error",[24,4897,4898],{},"The goal is reading output, identifying state, and recovering without guessing",[11,4900,4902,4905,4908],{"id":4901,"level":14},"exploration-setup",[16,4903,4904],{"id":4901},"Exploration Setup",[80,4906,4907],{},"Create a conflict practice branch:",[364,4909],{"language":366,"src":4910},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fexploration-setup-16.sh",[11,4912,4914,4918,4924,4931,4936,4939,4942],{"id":4913,"level":14},"exploration-issue-1",[16,4915,4917],{"id":4916},"exploration-issue-1-push-rejected","Exploration Issue 1: Push Rejected",[80,4919,4920,4921],{},"On GitHub, switch to ",[95,4922,4923],{},"practice-conflict",[80,4925,4926,4927,4930],{},"Edit one line in ",[95,4928,4929],{},"myFile.txt"," directly on GitHub and commit the change",[21,4932,4933],{},[24,4934,4935],{},"Use the same line you will change locally",[80,4937,4938],{},"Back locally, edit that same line and commit:",[364,4940],{"language":366,"src":4941},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fexploration-issue-1-push-17.sh",[21,4943,4944],{},[24,4945,4946],{},"See the slides below for the rejected push and the pull that creates the conflict",[11,4948,4950,4954,4957],{"id":4949,"level":356},"issue-1-push-without-pulling",[500,4951,4953],{"id":4952},"try-push-without-pulling","Try Push Without Pulling",[80,4955,4956],{},"Push the local commit before pulling the GitHub commit:",[942,4958,4959,4972],{"gap":944,"left-width":945,"right-width":945},[947,4960,4961,4964],{"v-slot:left":949},[364,4962],{"language":366,"src":4963},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Ftry-push-without-pulling-20.sh",[21,4965,4966,4969],{},[24,4967,4968],{},"Expected result: push rejected",[24,4970,4971],{},"Reason: GitHub has a commit your local branch does not have",[947,4973,4974],{"v-slot:right":949},[80,4975,4976],{},[1241,4977],{"alt":4978,"src":4979,"variant":1245},"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,4981,4983,4987],{"id":4982,"level":356},"issue-1-read-output",[500,4984,4986],{"id":4985},"pull-the-remote-change","Pull The Remote Change",[942,4988,4989,5008],{"gap":944,"left-width":945,"right-width":945},[947,4990,4991,4994,4997,5000,5005],{"v-slot:left":949},[80,4992,4993],{},"The usual next command is:",[364,4995],{"language":366,"src":4996},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-the-remote-change-20.sh",[80,4998,4999],{},"If Git asks how to reconcile divergent branches:",[21,5001,5002],{},[24,5003,5004],{},"Use merge behavior for this course practice",[364,5006],{"language":366,"src":5007},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-the-remote-change-21.sh",[947,5009,5010],{"v-slot:right":949},[80,5011,5012],{},[1241,5013],{"alt":5014,"src":5015,"variant":1245},"Git pull output asking how to reconcile divergent branches","\u002Fimages\u002Fshared\u002Fgit-workflow\u002Fgit-pull-divergent-branches.png",[11,5017,5019,5023,5026,5030,5033,5036,5039],{"id":5018,"level":14},"exploration-issue-2",[16,5020,5022],{"id":5021},"exploration-issue-2-merge-conflict","Exploration Issue 2: Merge Conflict",[80,5024,5025],{},"After pulling, Git should report a conflict",[80,5027,3811,5028],{},[95,5029,4929],{},[80,5031,5032],{},"You may see markers like:",[364,5034],{"language":4422,"src":5035},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fexploration-issue-2-merg-18.txt",[80,5037,5038],{},"Conflict markers show:",[21,5040,5041,5044,5047],{},[24,5042,5043],{},"Your local version",[24,5045,5046],{},"The GitHub version",[24,5048,5049],{},"The part Git could not combine automatically",[11,5051,5053,5057,5063,5066,5069,5072],{"id":5052,"level":356},"resolve-conflict",[500,5054,5056],{"id":5055},"resolve-the-conflict","Resolve The Conflict",[80,5058,5059,5060,5062],{},"Edit ",[95,5061,4929],{}," so it contains the final text you want",[80,5064,5065],{},"Remove all conflict markers",[80,5067,5068],{},"Then run:",[364,5070],{"language":366,"src":5071},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fresolve-the-conflict-19.sh",[21,5073,5074],{},[24,5075,802],{},[11,5077,5079,5083,5086],{"id":5078,"level":356},"verify-conflict-resolution",[500,5080,5082],{"id":5081},"verify-the-recovery","Verify The Recovery",[80,5084,5085],{},"Check:",[21,5087,5088,5093,5096,5101],{},[24,5089,5090,5092],{},[95,5091,4613],{}," is clean",[24,5094,5095],{},"GitHub shows the updated branch",[24,5097,5098,5100],{},[95,5099,4929],{}," contains the final text",[24,5102,5103],{},"No conflict markers remain",[11,5105,5106,5108],{"id":854,"level":14},[16,5107,857],{"id":854},[21,5109,5110,5113,5116,5119,5122,5131],{},[24,5111,5112],{},"Committing on the wrong branch",[24,5114,5115],{},"Forgetting to push after committing",[24,5117,5118],{},"Forgetting to pull after merging on GitHub",[24,5120,5121],{},"Leaving conflict markers in a file",[24,5123,5124,5125,682,5128],{},"Using vague branch names like ",[95,5126,5127],{},"stuff",[95,5129,5130],{},"final",[24,5132,5133],{},"Making several unrelated changes in one commit",[11,5135,5136,5138],{"id":936,"level":14},[16,5137,940],{"id":939},[942,5139,5140,5164],{"gap":944,"left-width":945,"right-width":945},[947,5141,5142,5144],{"v-slot:left":949},[500,5143,953],{"id":952},[21,5145,5146,5149,5152,5155,5158,5161],{},[24,5147,5148],{},"Working folder: files you can edit",[24,5150,5151],{},"Staging area: changes selected for the next commit",[24,5153,5154],{},"Commit: local saved checkpoint",[24,5156,5157],{},"Remote: GitHub copy of the repository",[24,5159,5160],{},"Pull request: GitHub page for reviewing and merging branch work",[24,5162,5163],{},"Conflict: a change Git cannot merge automatically",[947,5165,5166,5168],{"v-slot:right":949},[500,5167,984],{"id":936},[21,5169,5170,5178,5185,5193],{},[24,5171,5172,5173],{},"Pro Git Book: ",[132,5174,5177],{"href":5175,"rel":5176},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGit-Basics-Getting-a-Git-Repository",[993],"Git Basics",[24,5179,5172,5180],{},[132,5181,5184],{"href":5182,"rel":5183},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGit-Branching-Basic-Branching-and-Merging",[993],"Basic Branching and Merging",[24,5186,5187,5188],{},"GitHub Docs: ",[132,5189,5192],{"href":5190,"rel":5191},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpull-requests\u002Fcollaborating-with-pull-requests\u002Fproposing-changes-to-your-work-with-pull-requests\u002Fcreating-a-pull-request",[993],"Creating a pull request",[24,5194,5195,5196],{},"Oh Shit, Git!?!: ",[132,5197,5200],{"href":5198,"rel":5199},"https:\u002F\u002Fohshitgit.com\u002F",[993],"Common Git recovery situations",[11,5202,5203,5205],{"id":1011,"level":14},[16,5204,1014],{"id":1011},[942,5206,5209,5233],{"gap":1101,"left-width":5207,"right-width":5208},"0.72fr","1.38fr",[947,5210,5211,5213],{"v-slot:left":949},[80,5212,1017],{},[21,5214,5215,5221,5224,5227,5230],{},[24,5216,5217,5218,5220],{},"Read ",[95,5219,4613],{}," before choosing the next command",[24,5222,5223],{},"Move a change from working folder to staging area to commit",[24,5225,5226],{},"Push a branch to GitHub and open a pull request",[24,5228,5229],{},"Recognize when a failed push or conflict needs recovery",[24,5231,5232],{},"Next: open the cloned repository in VS Code",[947,5234,5235,5238],{"v-slot:right":949},[80,5236,5237],{},"Git\u002FGitHub flow:",[5239,5240],"figure-image",{"alt":5241,"src":5242},"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",[80,5244,5245],{},"::",{"title":949,"searchDepth":1059,"depth":1059,"links":5247},[5248,5249,5250,5251,5252,5253,5254,5255,5258,5261,5264,5265,5266,5267,5268,5269,5270,5274,5278,5279,5280],{"id":4365,"depth":1059,"text":4368},{"id":4397,"depth":1059,"text":4398},{"id":4418,"depth":1059,"text":4419},{"id":4435,"depth":1059,"text":4436},{"id":4467,"depth":1059,"text":4468},{"id":4501,"depth":1059,"text":4502},{"id":4552,"depth":1059,"text":4553},{"id":4568,"depth":1059,"text":4569,"children":5256},[5257],{"id":4589,"depth":1075,"text":4590},{"id":4620,"depth":1059,"text":4621,"children":5259},[5260],{"id":4652,"depth":1075,"text":4653},{"id":4694,"depth":1059,"text":4695,"children":5262},[5263],{"id":4725,"depth":1075,"text":4726},{"id":4760,"depth":1059,"text":4761},{"id":4784,"depth":1059,"text":4785},{"id":4829,"depth":1059,"text":4830},{"id":4856,"depth":1059,"text":4857},{"id":4886,"depth":1059,"text":4887},{"id":4901,"depth":1059,"text":4904},{"id":4916,"depth":1059,"text":4917,"children":5271},[5272,5273],{"id":4952,"depth":1075,"text":4953},{"id":4985,"depth":1075,"text":4986},{"id":5021,"depth":1059,"text":5022,"children":5275},[5276,5277],{"id":5055,"depth":1075,"text":5056},{"id":5081,"depth":1075,"text":5082},{"id":854,"depth":1059,"text":857},{"id":939,"depth":1059,"text":940},{"id":1011,"depth":1059,"text":1014},"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":4360,"description":5281},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs",[2587,5290,5291],"branches","pull-requests","48:54","MOa9zIUOqaI","https:\u002F\u002Fyoutu.be\u002FMOa9zIUOqaI","Git Commands and PRs","GTIGHU5IyAE7RcRy68evvCM5YPZVDAWUbiTdBfC9nCI",{"id":5298,"title":5299,"audience":6,"body":5300,"contentType":1094,"course":1095,"description":6072,"estimateBasis":6073,"estimatedDiscussionMinutes":1098,"estimatedLiveMinutes":1599,"estimatedTotalMinutes":5285,"extension":1101,"meta":6074,"module":1103,"navigation":1104,"order":6075,"path":6076,"promptAssist":1106,"seo":6077,"status":1108,"stem":6078,"tags":6079,"videoDuration":6083,"videoId":6084,"videoLink":6085,"videoTitle":6086,"week":1103,"__hash__":6087},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment.md","Local Development Environment Setup",{"type":8,"value":5301,"toc":6050},[5302,5319,5337,5358,5383,5418,5450,5528,5605,5707,5735,5800,5877,5901,5928,5946,5970,6021],[11,5303,5305,5308],{"id":5304,"level":14},"local-development-environment-title",[16,5306,5299],{"id":5307},"local-development-environment-setup",[21,5309,5310,5313,5316],{},[24,5311,5312],{},"VS Code for editing course files",[24,5314,5315],{},"Course profile for Internet Applications extensions",[24,5317,5318],{},"Optional local PHP check on your own computer",[11,5320,5321,5323],{"id":75,"level":14},[16,5322,78],{"id":75},[21,5324,5325,5328,5331,5334],{},[24,5326,5327],{},"Install VS Code",[24,5329,5330],{},"Open the course repository root",[24,5332,5333],{},"Install the required extensions for the course",[24,5335,5336],{},"Have a local php install as a light weight dev server (as a backup for the VM lessons)",[11,5338,5340,5343],{"id":5339,"level":14},"what-this-setup-does",[16,5341,5342],{"id":5339},"What This Setup Does",[21,5344,5345,5348,5351],{},[24,5346,5347],{},"VS Code: editor for course files",[24,5349,5350],{},"Extensions: syntax help, Git visibility, database viewing, time tracking",[24,5352,5353,5354,5357],{},"Optional host PHP: quick ",[95,5355,5356],{},"php -v"," check and editor support",[11,5359,5361,5364],{"id":5360,"level":14},"step-1-install-vs-code",[16,5362,5363],{"id":5360},"Step 1: Install VS Code",[21,5365,5366,5374,5377,5380],{},[24,5367,5368,5369],{},"Download: ",[132,5370,5373],{"href":5371,"rel":5372},"https:\u002F\u002Fcode.visualstudio.com\u002FDownload",[993],"Visual Studio Code",[24,5375,5376],{},"Install like a normal desktop app",[24,5378,5379],{},"Do not install VS Code inside your repository folder",[24,5381,5382],{},"VS Code is the editor; the repo is the workspace folder",[11,5384,5386,5389,5392,5415],{"id":5385,"level":14},"step-2-open-the-repository",[16,5387,5388],{"id":5385},"Step 2: Open The Repository",[80,5390,5391],{},"After the course repo is cloned:",[21,5393,5394,5404,5407,5412],{},[24,5395,5396,5397,5400,5401],{},"VS Code -> ",[95,5398,5399],{},"File"," -> ",[95,5402,5403],{},"Open Folder",[24,5405,5406],{},"Choose the repository root",[24,5408,5409,5410],{},"Folder name should match ",[95,5411,3446],{},[24,5413,5414],{},"Trust the workspace only if it is your cloned GitHub repo",[80,5416,5417],{},"Do not open a ZIP copy or clone the same repo again",[11,5419,5421,5425,5447],{"id":5420,"level":14},"step-3-create-course-profile",[16,5422,5424],{"id":5423},"step-3-create-a-course-profile","Step 3: Create A Course Profile",[21,5426,5427,5433,5441,5444],{},[24,5428,5429,5430],{},"Gear icon -> ",[95,5431,5432],{},"Profiles",[24,5434,5435,5436,682,5438],{},"Create ",[95,5437,1095],{},[95,5439,5440],{},"PHP",[24,5442,5443],{},"Switch into that profile",[24,5445,5446],{},"Install course extensions there",[80,5448,5449],{},"Profiles keep this course setup separate from other projects",[11,5451,5453,5456,5460],{"id":5452,"level":14},"step-4-install-extensions",[16,5454,5455],{"id":5452},"Step 4: Install Extensions",[500,5457,5459],{"id":5458},"start-with-these","Start With These",[21,5461,5462,5470,5478,5486,5494,5502,5517,5525],{},[24,5463,5464,5465],{},"Auto Rename Tag (Jun Han)\n",[21,5466,5467],{},[24,5468,5469],{},"Auto-completes matching HTML tags while you edit",[24,5471,5472,5473],{},"Bracket Lens (wraith13)\n",[21,5474,5475],{},[24,5476,5477],{},"Adds readability cues for closing brackets",[24,5479,5480,5481],{},"GitLens (GitKraken)\n",[21,5482,5483],{},[24,5484,5485],{},"Required: Git history, blame, and branch visibility in-editor",[24,5487,5488,5489],{},"MySQL (cweijan)\n",[21,5490,5491],{},[24,5492,5493],{},"Required later: connect to and inspect course database tables",[24,5495,5496,5497],{},"PHP Intelephense (Ben Mewburn)\n",[21,5498,5499],{},[24,5500,5501],{},"PHP language support, syntax checks, and warnings",[24,5503,5504,5505],{},"Todo Tree (Gruntfuggly)\n",[21,5506,5507],{},[24,5508,5509,5510,98,5513,5516],{},"Finds and lists ",[95,5511,5512],{},"TODO",[95,5514,5515],{},"FIXME",", and similar comments",[24,5518,5519,5520],{},"WakaTime\n",[21,5521,5522],{},[24,5523,5524],{},"Required in sections that use time tracking; needs your API key",[24,5526,5527],{},"See the slides below for MySQL and WakaTime setup",[11,5529,5531,5535],{"id":5530,"level":356},"step-4a-setup-mysql-extension",[16,5532,5534],{"id":5533},"step-4a-configure-mysql-extension","Step 4A: Configure MySQL Extension",[942,5536,5538,5597],{"gap":944,"left-width":2467,"right-width":3012,"align":5537},"center",[947,5539,5540,5544],{"v-slot:left":949},[500,5541,5543],{"id":5542},"connection-settings","Connection Settings",[21,5545,5546,5549,5594],{},[24,5547,5548],{},"Open the MySQL panel from the VS Code sidebar",[24,5550,5551,5552],{},"Create a new connection with your course database details",[21,5553,5554,5560,5566,5569,5572],{},[24,5555,5556,5557],{},"Host: ",[95,5558,5559],{},"db.ethereallab.app",[24,5561,5562,5563],{},"Port: ",[95,5564,5565],{},"3306",[24,5567,5568],{},"Username: your UCID",[24,5570,5571],{},"Database: your UCID",[24,5573,5574,5575],{},"Password: from your generated connection string\n",[21,5576,5577,5585],{},[24,5578,5579,5580],{},"Get it from the ",[132,5581,5584],{"href":5582,"rel":5583},"https:\u002F\u002Fcourses.ethereallab.app\u002Fdatabase",[993],"course database page",[24,5586,5587,5588,3085,5591],{},"Use the 12 characters between ",[95,5589,5590],{},"ucid:",[95,5592,5593],{},"@",[24,5595,5596],{},"Save this connection; you will reuse it in later database lessons",[947,5598,5599],{"v-slot:right":949},[80,5600,5601],{},[1241,5602],{"alt":5603,"src":5604,"variant":1245},"MySQL extension connection setup for the course database","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fmysql-setup.png",[11,5606,5608,5612],{"id":5607,"level":356},"step-4b-setup-wakatime",[16,5609,5611],{"id":5610},"step-4b-configure-wakatime","Step 4B: Configure WakaTime",[942,5613,5615,5670],{"gap":944,"left-width":3422,"right-width":5614,"align":5537},"1.05fr",[947,5616,5617,5621],{"v-slot:left":949},[500,5618,5620],{"id":5619},"setup-order","Setup Order",[21,5622,5623,5630,5633,5636,5639,5642,5659,5664,5667],{},[24,5624,2441,5625],{},[132,5626,5629],{"href":5627,"rel":5628},"https:\u002F\u002Fwakatime.com\u002Fsignup",[993],"WakaTime",[24,5631,5632],{},"Create or open your account",[24,5634,5635],{},"Copy your API key from account settings",[24,5637,5638],{},"In VS Code, search Extensions for WakaTime",[24,5640,5641],{},"Install the WakaTime extension",[24,5643,5644,5645],{},"Open Command Palette:",[21,5646,5647,5653],{},[24,5648,5649,5650],{},"Windows\u002FLinux: ",[95,5651,5652],{},"Ctrl+Shift+P",[24,5654,5655,5656],{},"macOS: ",[95,5657,5658],{},"Cmd+Shift+P",[24,5660,3119,5661],{},[95,5662,5663],{},"WakaTime: API Key",[24,5665,5666],{},"Paste your API key",[24,5668,5669],{},"Restart VS Code if tracking does not appear right away",[947,5671,5672,5677,5684,5689,5696,5701],{"v-slot:right":949},[337,5673,5674],{},[24,5675,5676],{},"WakaTime account settings:",[80,5678,5679],{},[1241,5680],{"alt":5681,"src":5682,"variant":1245,"max-height":5683},"WakaTime account settings API key detail","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fwakatime\u002Fsettings-api-key-detail.png","14rem",[337,5685,5686],{"start":1059},[24,5687,5688],{},"VS Code extension search:",[80,5690,5691],{},[1241,5692],{"alt":5693,"src":5694,"variant":1245,"max-height":5695},"VS Code Extensions search results showing WakaTime","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fwakatime\u002Fvs-code-search.png","9rem",[337,5697,5698],{"start":1075},[24,5699,5700],{},"VS Code API key command:",[80,5702,5703],{},[1241,5704],{"alt":5705,"src":5706,"variant":1245,"max-height":5695},"Command Palette with WakaTime API key command","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fwakatime\u002Fvs-code-prompt.png",[11,5708,5710,5713],{"id":5709,"level":14},"step-5-optional-local-php",[16,5711,5712],{"id":5709},"Step 5: Optional Local PHP",[21,5714,5715,5718,5721,5729,5732],{},[24,5716,5717],{},"Useful for editor support",[24,5719,5720],{},"Useful for quick terminal checks",[24,5722,5723,5724],{},"Not the main course runtime\n",[21,5725,5726],{},[24,5727,5728],{},"Viable backup solution if VM lesson has issues",[24,5730,5731],{},"VM and Render still run the real app path",[24,5733,5734],{},"See the slides below for OS-specific install notes",[11,5736,5738,5741],{"id":5737,"level":356},"step-5a-windows-php-zip",[16,5739,5740],{"id":5737},"Step 5A: Windows PHP ZIP",[942,5742,5743,5774],{"gap":944,"left-width":945,"right-width":945},[947,5744,5745,5749],{"v-slot:left":949},[500,5746,5748],{"id":5747},"download-and-extract","Download And Extract",[21,5750,5751,5754,5764,5769],{},[24,5752,5753],{},"Download PHP for Windows as a ZIP",[24,5755,5756,5757],{},"Extract it outside your repository",[21,5758,5759],{},[24,5760,253,5761],{},[95,5762,5763],{},"C:\\tools\\php",[24,5765,5766,5767],{},"Add that extracted PHP folder to the user ",[95,5768,964],{},[24,5770,5771,5772],{},"Restart Git Bash, PowerShell, and VS Code after editing ",[95,5773,964],{},[947,5775,5776,5780,5796],{"v-slot:right":949},[500,5777,5779],{"id":5778},"visual-checks","Visual Checks",[21,5781,5782,5788,5793],{},[24,5783,5784,5785],{},"The extracted folder contains ",[95,5786,5787],{},"php.exe",[24,5789,5790,5791],{},"The Path entry points to the folder, not to ",[95,5792,5787],{},[24,5794,5795],{},"A new terminal can run:",[364,5797],{"language":366,"src":5798,"label":5799},"\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,5801,5803,5806],{"id":5802,"level":356},"step-5b-macos-homebrew-php",[16,5804,5805],{"id":5802},"Step 5B: macOS Homebrew PHP",[942,5807,5808,5839],{"gap":944,"left-width":945,"right-width":945},[947,5809,5810,5814],{"v-slot:left":949},[500,5811,5813],{"id":5812},"install-homebrew","Install Homebrew",[21,5815,5816,5819,5827,5830,5833,5836],{},[24,5817,5818],{},"Open Terminal",[24,5820,5821,5822],{},"Copy the install command from ",[132,5823,5826],{"href":5824,"rel":5825},"https:\u002F\u002Fbrew.sh\u002F",[993],"brew.sh",[24,5828,5829],{},"Expect Terminal to ask for your Mac password",[24,5831,5832],{},"Expect Homebrew to mention Command Line Tools if needed",[24,5834,5835],{},"At the end, Homebrew may print \"Next steps\"",[24,5837,5838],{},"Run those \"Next steps\" commands if shown",[947,5840,5841,5845,5849,5852],{"v-slot:right":949},[500,5842,5844],{"id":5843},"then-install-php","Then Install PHP",[364,5846],{"language":366,"src":5847,"label":5848},"\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",[80,5850,5851],{},"Look for:",[21,5853,5854,5860,5865,5871],{},[24,5855,5856,5859],{},[95,5857,5858],{},"brew --version"," prints a version",[24,5861,5862,5864],{},[95,5863,5356],{}," prints PHP 8 output",[24,5866,5867,5868],{},"Apple Silicon Macs commonly use ",[95,5869,5870],{},"\u002Fopt\u002Fhomebrew",[24,5872,5873,5874],{},"Intel Macs commonly use ",[95,5875,5876],{},"\u002Fusr\u002Flocal",[11,5878,5880,5884,5886,5890],{"id":5879,"level":356},"step-5c-linux-php-cli",[16,5881,5883],{"id":5882},"step-5c-ubuntulinux-php-cli","Step 5C: Ubuntu\u002FLinux PHP CLI",[80,5885,362],{},[364,5887],{"language":366,"src":5888,"label":5889},"\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",[21,5891,5892,5895,5898],{},[24,5893,5894],{},"This installs command-line PHP",[24,5896,5897],{},"This is only for local terminal checks",[24,5899,5900],{},"The later VM lesson installs Apache, PHP, and MySQL together",[11,5902,5904,5907,5909,5912,5914,5917],{"id":5903,"level":14},"step-6-verify-optional-php",[16,5905,5906],{"id":5903},"Step 6: Verify Optional PHP",[80,5908,362],{},[364,5910],{"language":366,"src":5911},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment\u002Fstep-6-verify-optional-p-01.sh",[80,5913,3511],{},[364,5915],{"language":4422,"src":5916},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment\u002Fexample-output-02.txt",[21,5918,5919,5922,5925],{},[24,5920,5921],{},"Exact version can differ",[24,5923,5924],{},"PHP 8 output means the terminal can find PHP",[24,5926,5927],{},"Windows may need a terminal or VS Code restart after PATH changes",[11,5929,5930,5932],{"id":854,"level":14},[16,5931,857],{"id":854},[21,5933,5934,5937,5940,5943],{},[24,5935,5936],{},"Installing tools inside the repository folder",[24,5938,5939],{},"Opening the parent folder instead of the repo root",[24,5941,5942],{},"Editing a ZIP copy instead of the cloned repo",[24,5944,5945],{},"Installing extensions in the wrong VS Code profile",[11,5947,5948,5950],{"id":924,"level":14},[16,5949,927],{"id":924},[21,5951,5952,5955,5958,5961,5964],{},[24,5953,5954],{},"VS Code opens your course repository root",[24,5956,5957],{},"Course profile is active",[24,5959,5960],{},"PHP Intelephense is installed",[24,5962,5963],{},"GitLens is installed",[24,5965,5966,5967,5969],{},"Optional: ",[95,5968,5356],{}," prints a PHP 8 version",[11,5971,5972,5974],{"id":939,"level":14},[16,5973,940],{"id":939},[942,5975,5976,5994],{"gap":944,"left-width":945,"right-width":945},[947,5977,5978,5980],{"v-slot:left":949},[500,5979,953],{"id":952},[21,5981,5982,5985,5988,5991],{},[24,5983,5984],{},"IDE: editor with development tools",[24,5986,5987],{},"Extension: add-on that changes VS Code behavior",[24,5989,5990],{},"Profile: saved VS Code setup",[24,5992,5993],{},"PATH: system setting used to find commands",[947,5995,5996,5998],{"v-slot:right":949},[500,5997,984],{"id":936},[21,5999,6000,6007,6014],{},[24,6001,6002],{},[132,6003,6006],{"href":6004,"rel":6005},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fintrovideos\u002Fbasics",[993],"VS Code Getting Started",[24,6008,6009],{},[132,6010,6013],{"href":6011,"rel":6012},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fconfigure\u002Fprofiles",[993],"VS Code Profiles",[24,6015,6016],{},[132,6017,6020],{"href":6018,"rel":6019},"https:\u002F\u002Fwww.php.net\u002Fmanual\u002Fen\u002Finstall.php",[993],"PHP Installation",[11,6022,6023,6025],{"id":1011,"level":14},[16,6024,1014],{"id":1011},[21,6026,6027,6030,6033,6036,6047],{},[24,6028,6029],{},"VS Code installed as the course editor",[24,6031,6032],{},"Repository opens from its root folder",[24,6034,6035],{},"Course extensions live in a course profile",[24,6037,6038,6039],{},"Local PHP is optional for this Internet Applications path\n",[21,6040,6041,6044],{},[24,6042,6043],{},"Summer 2026 added information about VM setup in a future lesson to teach clearer Apache\u002FMySQL topics",[24,6045,6046],{},"VM, Apache, Render QA, and Render production remain the real runtime checks",[24,6048,6049],{},"Next: copy the instructor template into the repository",{"title":949,"searchDepth":1059,"depth":1059,"links":6051},[6052,6053,6054,6055,6056,6057,6058,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071],{"id":5307,"depth":1059,"text":5299},{"id":75,"depth":1059,"text":78},{"id":5339,"depth":1059,"text":5342},{"id":5360,"depth":1059,"text":5363},{"id":5385,"depth":1059,"text":5388},{"id":5423,"depth":1059,"text":5424},{"id":5452,"depth":1059,"text":5455,"children":6059},[6060],{"id":5458,"depth":1075,"text":5459},{"id":5533,"depth":1059,"text":5534},{"id":5610,"depth":1059,"text":5611},{"id":5709,"depth":1059,"text":5712},{"id":5737,"depth":1059,"text":5740},{"id":5802,"depth":1059,"text":5805},{"id":5882,"depth":1059,"text":5883},{"id":5903,"depth":1059,"text":5906},{"id":854,"depth":1059,"text":857},{"id":924,"depth":1059,"text":927},{"id":939,"depth":1059,"text":940},{"id":1011,"depth":1059,"text":1014},"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":5299,"description":6072},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment",[6080,6081,6082],"vscode","local-development","php","44:26","0s1N-m3LABc","https:\u002F\u002Fyoutu.be\u002F0s1N-m3LABc","Local Development Environment setup","X5U0DDKjg7X7HrYtDDcsE4QqlBLimZ9weKgnZlc8H2s",{"id":6089,"title":6090,"audience":6,"body":6091,"contentType":1094,"course":1095,"description":7142,"estimateBasis":7143,"estimatedDiscussionMinutes":4342,"estimatedLiveMinutes":1099,"estimatedTotalMinutes":7144,"extension":1101,"meta":7145,"module":1103,"navigation":1104,"order":7144,"path":7146,"promptAssist":1106,"seo":7147,"status":1108,"stem":7148,"tags":7149,"videoDuration":7150,"videoId":7151,"videoLink":7152,"videoTitle":7153,"week":1103,"__hash__":7154},"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":6092,"toc":7114},[6093,6122,6164,6192,6225,6256,6302,6395,6439,6484,6529,6574,6646,6705,6778,6832,6908,6977,7009,7061,7085],[11,6094,6095,6097,6100],{"id":4365,"level":14},[16,6096,4368],{"id":4365},[80,6098,6099],{},"By the end, you should have:",[21,6101,6102,6105,6108,6114,6119],{},[24,6103,6104],{},"Cloned course repository open in the terminal",[24,6106,6107],{},"Starter template copied into the repository root",[24,6109,6110,6111],{},"Baseline commit on ",[95,6112,6113],{},"Module01-Course-Template",[24,6115,6116,6117],{},"Pull request merged into ",[95,6118,2552],{},[24,6120,6121],{},"Clean working tree before moving on",[11,6123,6125,6129],{"id":6124,"level":14},"step-1-open-clone",[16,6126,6128],{"id":6127},"step-1-open-the-cloned-repository","Step 1: Open The Cloned Repository",[942,6130,6131,6139],{"gap":944,"left-width":945,"right-width":945},[947,6132,6133,6135],{"v-slot:left":949},[80,6134,362],{},[364,6136],{"language":366,"src":6137,"label":6138},"\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",[947,6140,6141,6143,6146],{"v-slot:right":949},[80,6142,3511],{},[364,6144],{"language":2985,"src":6145,"label":3371},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fopen-cloned-repository-output.txt",[21,6147,6148,6153,6158],{},[24,6149,6150,6152],{},[95,6151,170],{},": current working directory",[24,6154,6155,6157],{},[95,6156,4613],{},": current branch and file state",[24,6159,6160,6161,6163],{},"Important check: ",[95,6162,170],{}," ends with your repository folder",[11,6165,6167,6171,6174,6177],{"id":6166,"level":14},"step-2-open-vscode",[16,6168,6170],{"id":6169},"step-2-open-the-repository-root","Step 2: Open The Repository Root",[80,6172,6173],{},"Run from inside the cloned repository folder:",[364,6175],{"language":366,"src":6176},"\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",[21,6178,6179,6184,6189],{},[24,6180,6181,6183],{},[95,6182,95],{},": opens VS Code from the terminal",[24,6185,6186,6188],{},[95,6187,235],{}," means \"this current folder\"",[24,6190,6191],{},"VS Code should show your repository folder, not the parent folder",[11,6193,6195,6199],{"id":6194,"level":14},"step-3-download-template",[16,6196,6198],{"id":6197},"step-3-download-the-instructor-template","Step 3: Download The Instructor Template",[21,6200,6201,6213,6216,6219,6222],{},[24,6202,6203,6204],{},"Open the instructor template repository",[21,6205,6206],{},[24,6207,6208],{},[132,6209,6212],{"href":6210,"rel":6211},"https:\u002F\u002Fgithub.com\u002FMattToegel\u002FIT202-2026",[993],"IT202-2026",[24,6214,6215],{},"Download the ZIP",[24,6217,6218],{},"Extract the ZIP",[24,6220,6221],{},"Copy scaffold contents into your repository root",[24,6223,6224],{},"See the slide below for the copy rule",[11,6226,6228,6232,6235,6238,6253],{"id":6227,"level":356},"template-copy-rule",[500,6229,6231],{"id":6230},"copy-rule","Copy Rule",[80,6233,6234],{},"Copy the contents of the extracted template folder",[80,6236,6237],{},"Do not copy:",[21,6239,6240,6243,6250],{},[24,6241,6242],{},"The extracted wrapper folder as one extra nested folder",[24,6244,6245,6246,6249],{},"The template repository's hidden ",[95,6247,6248],{},".git"," folder",[24,6251,6252],{},"Old files from a different semester",[80,6254,6255],{},"Repository root should contain the starter folders directly",[11,6257,6259,6263,6266,6269],{"id":6258,"level":14},"step-4-check-structure",[16,6260,6262],{"id":6261},"step-4-check-the-starter-structure","Step 4: Check The Starter Structure",[80,6264,6265],{},"After copying, repository root should look similar to:",[364,6267],{"language":4422,"src":6268},"\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",[21,6270,6271,6276,6285,6299],{},[24,6272,6273,6275],{},[95,6274,302],{}," should be directly inside your repository root",[24,6277,6278,6279,6282,6283],{},"Module folders and ",[95,6280,6281],{},"project"," live inside ",[95,6284,302],{},[24,6286,6287,98,6290,102,6293,6296,6297],{},[95,6288,6289],{},"lib",[95,6291,6292],{},"partials",[95,6294,6295],{},"sql"," stay outside ",[95,6298,302],{},[24,6300,6301],{},"See the slide below for the public\u002Fprivate folder boundary",[11,6303,6305,6309,6392],{"id":6304,"level":356},"public-html-boundary",[500,6306,6308],{"id":6307},"public-and-private-boundary","Public And Private Boundary",[21,6310,6311,6345,6367,6372,6377,6383,6389],{},[24,6312,6313,6315,6316],{},[95,6314,302],{},": web root Apache can serve\n",[21,6317,6318,6328,6333,6339],{},[24,6319,6320,6323,6324,6327],{},[95,6321,6322],{},"m01"," through ",[95,6325,6326],{},"m10",": module practice folders",[24,6329,6330,6332],{},[95,6331,6281],{},": course project folder",[24,6334,6335,6338],{},[95,6336,6337],{},"index.php",": first browser entry point",[24,6340,6341,6344],{},[95,6342,6343],{},"test_db.php",": database connection check",[24,6346,6347,6349,6350],{},[95,6348,6289],{},": reusable PHP helpers\n",[21,6351,6352,6358],{},[24,6353,6354,6357],{},[95,6355,6356],{},".env.sample",": example local config file",[24,6359,6360,3085,6363,6366],{},[95,6361,6362],{},"config.php",[95,6364,6365],{},"db.php",": config and database helpers",[24,6368,6369,6371],{},[95,6370,6292],{},": shared page pieces",[24,6373,6374,6376],{},[95,6375,6295],{},": database setup scripts",[24,6378,6379,6382],{},[95,6380,6381],{},"Dockerfile",": consistent runtime setup",[24,6384,6385,6388],{},[95,6386,6387],{},"structure.md",": starter layout notes",[24,6390,6391],{},"Private folders should not be opened directly in the browser",[80,6393,6394],{},"Later server setup expects this folder boundary",[11,6396,6398,6402],{"id":6397,"level":14},"step-5-check-status",[16,6399,6401],{"id":6400},"step-5-create-the-template-branch","Step 5: Create The Template Branch",[942,6403,6404,6412],{"gap":944,"left-width":945,"right-width":945},[947,6405,6406,6408],{"v-slot:left":949},[80,6407,362],{},[364,6409],{"language":366,"src":6410,"label":6411},"\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",[947,6413,6414,6417,6420],{"v-slot:right":949},[80,6415,6416],{},"Expected idea:",[364,6418],{"language":4422,"src":6419,"label":3371},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstatus-after-template-copy.txt",[21,6421,6422,6428,6433,6436],{},[24,6423,6424,6427],{},[95,6425,6426],{},"git checkout -b",": create and move to a new branch",[24,6429,6430,6431],{},"Branch name: ",[95,6432,6113],{},[24,6434,6435],{},"New files listed as untracked",[24,6437,6438],{},"No changes means likely wrong folder or copy missed",[11,6440,6442,6446],{"id":6441,"level":14},"step-6-stage",[16,6443,6445],{"id":6444},"step-6-stage-the-baseline-files","Step 6: Stage The Baseline Files",[942,6447,6448,6456],{"gap":944,"left-width":945,"right-width":945},[947,6449,6450,6452],{"v-slot:left":949},[80,6451,362],{},[364,6453],{"language":366,"src":6454,"label":6455},"\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",[947,6457,6458,6461,6479,6481],{"v-slot:right":949},[80,6459,6460],{},"What this means:",[21,6462,6463,6469,6474],{},[24,6464,6465,6468],{},[95,6466,6467],{},"git add",": choose files for the next commit",[24,6470,6471,6473],{},[95,6472,235],{}," means current folder and contents",[24,6475,6476,6478],{},[95,6477,4613],{},": verify what is staged before committing",[80,6480,6416],{},[364,6482],{"language":4422,"src":6483,"label":3371},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstatus-after-stage.txt",[11,6485,6487,6491],{"id":6486,"level":14},"step-7-commit",[16,6488,6490],{"id":6489},"step-7-commit-the-baseline","Step 7: Commit The Baseline",[942,6492,6493,6501],{"gap":944,"left-width":945,"right-width":945},[947,6494,6495,6497],{"v-slot:left":949},[80,6496,362],{},[364,6498],{"language":366,"src":6499,"label":6500},"\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",[947,6502,6503,6505,6508],{"v-slot:right":949},[80,6504,6416],{},[364,6506],{"language":4422,"src":6507,"label":3371},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fcommit-baseline-output.txt",[21,6509,6510,6516,6526],{},[24,6511,6512,6515],{},[95,6513,6514],{},"git commit",": save staged changes in local history",[24,6517,6518,6520,6521],{},[95,6519,4711],{},": commit message\n",[21,6522,6523],{},[24,6524,6525],{},"Message is required, even if empty",[24,6527,6528],{},"Baseline commit: starter state before custom work",[11,6530,6532,6536],{"id":6531,"level":14},"step-8-push",[16,6533,6535],{"id":6534},"step-8-push-the-template-branch","Step 8: Push The Template Branch",[942,6537,6538,6546],{"gap":944,"left-width":945,"right-width":945},[947,6539,6540,6542],{"v-slot:left":949},[80,6541,362],{},[364,6543],{"language":366,"src":6544,"label":6545},"\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",[947,6547,6548,6550,6553],{"v-slot:right":949},[80,6549,6416],{},[364,6551],{"language":4422,"src":6552,"label":3371},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fpush-baseline-output.txt",[21,6554,6555,6560,6566,6571],{},[24,6556,6557,6559],{},[95,6558,4774],{},": GitHub remote",[24,6561,6562,6565],{},[95,6563,6564],{},"-u",": remembers this branch's GitHub tracking branch",[24,6567,6568,6570],{},[95,6569,6113],{},": branch being sent",[24,6572,6573],{},"Refresh GitHub after the push",[11,6575,6577,6581],{"id":6576,"level":14},"step-9-open-pull-request",[16,6578,6580],{"id":6579},"step-9-open-the-pull-request","Step 9: Open The Pull Request",[942,6582,6583,6626],{"gap":944,"left-width":945,"right-width":945},[947,6584,6585,6587],{"v-slot:left":949},[80,6586,3427],{},[21,6588,6589,6592,6608,6613,6618,6621],{},[24,6590,6591],{},"Open your course repository",[24,6593,1266,6594,6597],{},[163,6595,6596],{},"Compare & pull request",[21,6598,6599],{},[24,6600,6601,6602,5400,6605],{},"Or use ",[163,6603,6604],{},"Pull requests",[163,6606,6607],{},"New pull request",[24,6609,6610,6611],{},"Set base branch to ",[95,6612,2552],{},[24,6614,6615,6616],{},"Set compare branch to ",[95,6617,6113],{},[24,6619,6620],{},"Confirm the changed files are the starter template files",[24,6622,1266,6623],{},[163,6624,6625],{},"Create pull request",[947,6627,6628,6631,6635],{"v-slot:right":949},[80,6629,6630],{},"Use a short title and description:",[364,6632],{"language":4422,"src":6633,"label":6634},"\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",[21,6636,6637,6640,6643],{},[24,6638,6639],{},"Base receives the changes",[24,6641,6642],{},"Compare contains your branch work",[24,6644,6645],{},"If base and compare are reversed, do not create the pull request",[11,6647,6649,6655],{"id":6648,"level":14},"step-10-merge-sync-main",[16,6650,6652,6653],{"id":6651},"step-10-merge-and-sync-main","Step 10: Merge And Sync ",[95,6654,2552],{},[942,6656,6657,6679],{"gap":944,"left-width":945,"right-width":945},[947,6658,6659,6661,6673,6675],{"v-slot:left":949},[80,6660,3427],{},[21,6662,6663,6668],{},[24,6664,1266,6665],{},[163,6666,6667],{},"Merge pull request",[24,6669,1266,6670],{},[163,6671,6672],{},"Confirm merge",[80,6674,5068],{},[364,6676],{"language":366,"src":6677,"label":6678},"\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",[947,6680,6681,6683,6686],{"v-slot:right":949},[80,6682,6416],{},[364,6684],{"language":4422,"src":6685,"label":3371},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fsync-main-after-pr-output.txt",[21,6687,6688,6694,6700],{},[24,6689,6690,6693],{},[95,6691,6692],{},"git checkout main",": return to the main branch",[24,6695,6696,6699],{},[95,6697,6698],{},"git pull origin main",": download the merged template files",[24,6701,6702,6703,5092],{},"Continue only when local ",[95,6704,2552],{},[11,6706,6708,6714],{"id":6707,"level":14},"step-11-create-local-env",[16,6709,6710,6711],{"id":6707},"Step 11: Create Local ",[95,6712,6713],{},".env",[942,6715,6716,6738],{"gap":944,"left-width":945,"right-width":945},[947,6717,6718,6721,6725],{"v-slot:left":949},[80,6719,6720],{},"Run from the repository root:",[364,6722],{"language":366,"src":6723,"label":6724},"\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",[21,6726,6727],{},[24,6728,6729,6730,6733,6734],{},"Get ",[95,6731,6732],{},"DB_URL"," from ",[132,6735,6737],{"href":5582,"rel":6736},[993],"courses.ethereallab.app\u002Fdatabase",[947,6739,6740,6743,6748],{"v-slot:right":949},[80,6741,6742],{},"Fill in values similar to:",[364,6744],{"language":6745,"src":6746,"label":6747},"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",[21,6749,6750,6755,6760,6763,6768,6773],{},[24,6751,6752,6754],{},[95,6753,6713],{}," stores local secrets",[24,6756,2486,6757,6759],{},[95,6758,6713],{}," on your computer only",[24,6761,6762],{},"Do not commit your real connection string",[24,6764,6765,6766],{},"Paste the generated database connection string as ",[95,6767,6732],{},[24,6769,6770,6772],{},[95,6771,6362],{}," loads local or hosted environment variables",[24,6774,6775,6776],{},"Do not paste secrets directly into ",[95,6777,6362],{},[11,6779,6781,6785],{"id":6780,"level":14},"step-12-test-local-db",[16,6782,6784],{"id":6783},"step-12-test-local-database-connection","Step 12: Test Local Database Connection",[942,6786,6787,6795],{"gap":944,"left-width":945,"right-width":945},[947,6788,6789,6791],{"v-slot:left":949},[80,6790,6720],{},[364,6792],{"language":366,"src":6793,"label":6794},"\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",[947,6796,6797,6800,6804],{"v-slot:right":949},[80,6798,6799],{},"Then open:",[364,6801],{"language":4422,"src":6802,"label":6803},"\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",[21,6805,6806,6812,6818,6826],{},[24,6807,6808,6811],{},[95,6809,6810],{},"php -S",": starts PHP's built-in local server",[24,6813,6814,6817],{},[95,6815,6816],{},"-t public_html",": serves the course web root",[24,6819,6820,6822,6823,6825],{},[95,6821,6343],{},": confirms PHP can read ",[95,6824,6713],{}," and connect to MySQL",[24,6827,6828,6829,6831],{},"Stop the server with ",[95,6830,909],{}," when finished",[11,6833,6835,6843,6849],{"id":6834,"level":14},"step-13-enable-pdo-mysql",[16,6836,6838,6839,6842],{"id":6837},"step-13-enable-pdo_mysql-if-needed","Step 13: Enable ",[95,6840,6841],{},"pdo_mysql"," If Needed",[80,6844,6845,6846,235],{},"This is usually a Windows PHP ZIP setup issue. macOS and Linux usually install MySQL support through Homebrew or ",[95,6847,6848],{},"apt",[942,6850,6851,6882],{"gap":944,"left-width":945,"right-width":945},[947,6852,6853,6856,6860,6863],{"v-slot:left":949},[80,6854,6855],{},"Find the PHP folder:",[364,6857],{"language":366,"src":6858,"label":6859},"\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",[80,6861,6862],{},"In that folder:",[21,6864,6865,6871,6877],{},[24,6866,6867,6868],{},"Find ",[95,6869,6870],{},"php.ini-development",[24,6872,6873,6874],{},"Copy it as ",[95,6875,6876],{},"php.ini",[24,6878,3811,6879,6881],{},[95,6880,6876],{}," in your editor",[947,6883,6884,6887,6891,6894,6898],{"v-slot:right":949},[80,6885,6886],{},"Uncomment these lines:",[364,6888],{"language":6889,"src":6890,"label":6876},"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",[80,6892,6893],{},"Mac\u002FLinux usually use:",[364,6895],{"language":366,"src":6896,"label":6897},"\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",[21,6899,6900,6905],{},[24,6901,6902,6903],{},"Restart the php dev server after changing ",[95,6904,6876],{},[24,6906,6907],{},"Run Step 12 again after enabling the extension",[11,6909,6911,6913,6916],{"id":6910,"level":14},"quick-check-final",[16,6912,927],{"id":924},[80,6914,6915],{},"Confirm all of these:",[21,6917,6918,6921,6929,6932,6937,6946,6952,6957,6962,6968],{},[24,6919,6920],{},"GitHub shows the starter files",[24,6922,6923,6924,6926,6927],{},"GitHub shows a pull request from ",[95,6925,6113],{}," into ",[95,6928,2552],{},[24,6930,6931],{},"The pull request is merged",[24,6933,4838,6934,6936],{},[95,6935,2552],{}," says the working tree is clean",[24,6938,6939,6323,6942,6945],{},[95,6940,6941],{},"public_html\u002Fm01",[95,6943,6944],{},"public_html\u002Fm10"," exist",[24,6947,6948,6951],{},[95,6949,6950],{},"public_html\u002Fproject"," exists",[24,6953,6954,6956],{},[95,6955,302],{}," is not nested inside another accidental folder",[24,6958,6959,6961],{},[95,6960,6747],{}," exists locally and is not committed with real secrets",[24,6963,6964,6967],{},[95,6965,6966],{},"http:\u002F\u002Flocalhost:3000\u002Ftest_db.php"," confirms the database connection",[24,6969,6970,6971,6973,6974,6976],{},"Windows PHP has ",[95,6972,6841],{}," enabled if ",[95,6975,6343],{}," reports a missing driver",[11,6978,6980,6984,6986,6989,6998],{"id":6979,"level":14},"reset-check",[16,6981,6983],{"id":6982},"if-something-looks-wrong","If Something Looks Wrong",[80,6985,362],{},[364,6987],{"language":366,"src":6988},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fif-something-looks-wrong-03.sh",[6990,6991,6992],"blockquote",{},[80,6993,6994,6995,6997],{},"Tip: ",[95,6996,3965],{}," prints the repository root when your current folder is inside a Git repository",[21,6999,7000,7003,7006],{},[24,7001,7002],{},"Output should point to your course repository",[24,7004,7005],{},"If it points somewhere else, move folders before continuing",[24,7007,7008],{},"Avoid cloning inside another cloned repository",[11,7010,7011,7013],{"id":854,"level":14},[16,7012,857],{"id":854},[21,7014,7015,7018,7021,7026,7029,7032,7037,7047,7052,7055],{},[24,7016,7017],{},"Opening the parent folder instead of the repository root",[24,7019,7020],{},"Copying the instructor template folder as a nested folder",[24,7022,7023,7024,6249],{},"Copying the template ",[95,7025,6248],{},[24,7027,7028],{},"Keeping the downloaded ZIP inside the repository",[24,7030,7031],{},"Re-cloning the repository instead of opening the existing clone",[24,7033,7034,7035],{},"Putting module folders outside ",[95,7036,302],{},[24,7038,7039,7040,7042,7043,7046],{},"Renaming ",[95,7041,6322],{}," to ",[95,7044,7045],{},"M1"," or mixing folder casing",[24,7048,7049,7050],{},"Doing template work directly on ",[95,7051,2552],{},[24,7053,7054],{},"Reversing base and compare branches in the pull request",[24,7056,7057,7058,7060],{},"Forgetting to sync local ",[95,7059,2552],{}," after the pull request is merged",[11,7062,7063,7065],{"id":952,"level":14},[16,7064,953],{"id":952},[21,7066,7067,7070,7073,7076,7079,7082],{},[24,7068,7069],{},"Repository root: top folder of the cloned project",[24,7071,7072],{},"Baseline: starter state before custom work begins",[24,7074,7075],{},"Pull request: GitHub review page used to merge branch work",[24,7077,7078],{},"Web root: folder served to the browser",[24,7080,7081],{},"Scaffold: starter folders that organize future work",[24,7083,7084],{},"Staging: choosing files for the next commit",[11,7086,7087,7089,7092],{"id":1011,"level":14},[16,7088,1014],{"id":1011},[80,7090,7091],{},"Before leaving this presentation, confirm the following:",[21,7093,7094,7097,7100,7103,7109],{},[24,7095,7096],{},"You still have one clone for your repository",[24,7098,7099],{},"Your VS Code is able to open directly to your repository",[24,7101,7102],{},"Your repository has the full starter baseline correctly structured",[24,7104,7105,7106,7108],{},"GitHub remote ",[95,7107,2552],{}," has the baseline content",[24,7110,4838,7111,7113],{},[95,7112,2552],{}," was synchronized",{"title":949,"searchDepth":1059,"depth":1059,"links":7115},[7116,7117,7118,7119,7122,7125,7126,7127,7128,7129,7130,7132,7134,7135,7137,7138,7139,7140,7141],{"id":4365,"depth":1059,"text":4368},{"id":6127,"depth":1059,"text":6128},{"id":6169,"depth":1059,"text":6170},{"id":6197,"depth":1059,"text":6198,"children":7120},[7121],{"id":6230,"depth":1075,"text":6231},{"id":6261,"depth":1059,"text":6262,"children":7123},[7124],{"id":6307,"depth":1075,"text":6308},{"id":6400,"depth":1059,"text":6401},{"id":6444,"depth":1059,"text":6445},{"id":6489,"depth":1059,"text":6490},{"id":6534,"depth":1059,"text":6535},{"id":6579,"depth":1059,"text":6580},{"id":6651,"depth":1059,"text":7131},"Step 10: Merge And Sync main",{"id":6707,"depth":1059,"text":7133},"Step 11: Create Local .env",{"id":6783,"depth":1059,"text":6784},{"id":6837,"depth":1059,"text":7136},"Step 13: Enable pdo_mysql If Needed",{"id":924,"depth":1059,"text":927},{"id":6982,"depth":1059,"text":6983},{"id":854,"depth":1059,"text":857},{"id":952,"depth":1059,"text":953},{"id":1011,"depth":1059,"text":1014},"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":6090,"description":7142},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository",[4352,947,2587],"47:11","4n0-QuXO_Aw","https:\u002F\u002Fyoutu.be\u002F4n0-QuXO_Aw","Adding Instructor\u002FCourse Template","iYq9WdND1ODBRrXLU2gX9dNCXvDc-Kvqufsokl_jg3E",{"id":7156,"title":7157,"audience":6,"body":7158,"contentType":1094,"course":1095,"description":7868,"estimateBasis":7869,"estimatedDiscussionMinutes":4342,"estimatedLiveMinutes":5285,"estimatedTotalMinutes":1100,"extension":1101,"meta":7870,"module":1103,"navigation":1104,"order":4343,"path":7871,"promptAssist":1106,"seo":7872,"status":1108,"stem":7873,"tags":7874,"videoDuration":7876,"videoId":7877,"videoLink":7878,"videoTitle":7879,"week":1103,"__hash__":7880},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches.md","QA And Prod Branches",{"type":8,"value":7159,"toc":7847},[7160,7194,7242,7264,7318,7383,7441,7491,7556,7597,7689,7729,7756,7814],[11,7161,7162,7164,7166],{"id":4365,"level":14},[16,7163,4368],{"id":4365},[80,7165,4371],{},[21,7167,7168,7177,7182,7186,7191],{},[24,7169,7170,7171,3085,7174],{},"Understand the purpose and usage of ",[95,7172,7173],{},"qa",[95,7175,7176],{},"prod",[24,7178,7179,7180],{},"Create and push ",[95,7181,7173],{},[24,7183,7179,7184],{},[95,7185,7176],{},[24,7187,7188,7189],{},"Keep local work pointed at ",[95,7190,7173],{},[24,7192,7193],{},"Confirm GitHub has the expected branches",[11,7195,7197,7200,7235],{"id":7196,"level":14},"branch-roles",[16,7198,7199],{"id":7196},"Branch Roles",[21,7201,7202,7212,7222,7232],{},[24,7203,7204,7206,7207],{},[95,7205,2552],{},": starter baseline and shared source branch\n",[21,7208,7209],{},[24,7210,7211],{},"Most projects stick with this; we'll split ours into development lanes",[24,7213,7214,7216,7217],{},[95,7215,7173],{},": public testing and evidence branch\n",[21,7218,7219],{},[24,7220,7221],{},"Normal branch to return to before new course work",[24,7223,7224,7226,7227],{},[95,7225,7176],{},": stable grading and evaluation branch\n",[21,7228,7229],{},[24,7230,7231],{},"Protected from everyday local edits",[24,7233,7234],{},"Later deployment setup connects Render to these branches",[80,7236,7237,7238,5400,7240],{},"Course flow: feature or homework branch -> ",[95,7239,7173],{},[95,7241,7176],{},[11,7243,7244,7246,7249,7253],{"id":114,"level":14},[16,7245,117],{"id":114},[80,7247,7248],{},"Run inside the course repository:",[364,7250],{"label":7251,"language":366,"src":7252},"before-you-start.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fbefore-you-start.sh",[21,7254,7255,7258,7261],{},[24,7256,7257],{},"Working tree should be clean",[24,7259,7260],{},"Starter baseline already pushed to GitHub",[24,7262,7263],{},"Stop if Git says files are modified or untracked",[11,7265,7267,7273],{"id":7266,"level":14},"step-1-sync-main",[16,7268,7270,7271],{"id":7269},"step-1-start-from-main","Step 1: Start From ",[95,7272,2552],{},[942,7274,7275,7283],{"gap":944,"left-width":945,"right-width":945},[947,7276,7277,7279],{"v-slot:left":949},[80,7278,362],{},[364,7280],{"label":7281,"language":366,"src":7282},"sync-main.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fsync-main.sh",[947,7284,7285,7287,7290],{"v-slot:right":949},[80,7286,3511],{},[364,7288],{"label":3371,"language":4422,"src":7289},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fsync-main-output.txt",[21,7291,7292,7299],{},[24,7293,7294,7296,7297],{},[95,7295,6692],{},": switch to ",[95,7298,2552],{},[24,7300,7301,7303,7304,7306,7307],{},[95,7302,6698],{},": get the latest ",[95,7305,2552],{}," from GitHub\n",[21,7308,7309,7313],{},[24,7310,7311,6559],{},[95,7312,4774],{},[24,7314,7315,7317],{},[95,7316,2552],{},": remote branch being pulled",[11,7319,7321,7327],{"id":7320,"level":14},"step-2-create-qa",[16,7322,7324,7325],{"id":7323},"step-2-create-and-push-qa","Step 2: Create And Push ",[95,7326,7173],{},[942,7328,7329,7337],{"gap":944,"left-width":945,"right-width":945},[947,7330,7331,7333],{"v-slot:left":949},[80,7332,362],{},[364,7334],{"label":7335,"language":366,"src":7336},"create-qa.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-qa.sh",[947,7338,7339,7341,7344],{"v-slot:right":949},[80,7340,3511],{},[364,7342],{"label":3371,"language":4422,"src":7343},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-qa-output.txt",[21,7345,7346,7363],{},[24,7347,7348,7351,7352,7354,7355],{},[95,7349,7350],{},"git checkout -b qa",": create ",[95,7353,7173],{}," and switch to it\n",[21,7356,7357],{},[24,7358,7359,7362],{},[95,7360,7361],{},"-b",": creates a new branch of the following name",[24,7364,7365,7368,7369,7371,7372],{},[95,7366,7367],{},"git push -u origin qa",": send ",[95,7370,7173],{}," to GitHub\n",[21,7373,7374],{},[24,7375,7376,7378,7379,7382],{},[95,7377,6564],{},": remember ",[95,7380,7381],{},"origin\u002Fqa"," as the upstream branch",[11,7384,7386,7392],{"id":7385,"level":14},"step-3-create-prod",[16,7387,7389,7390],{"id":7388},"step-3-create-and-push-prod","Step 3: Create And Push ",[95,7391,7176],{},[942,7393,7394,7402],{"gap":944,"left-width":945,"right-width":945},[947,7395,7396,7398],{"v-slot:left":949},[80,7397,362],{},[364,7399],{"label":7400,"language":366,"src":7401},"create-prod.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-prod.sh",[947,7403,7404,7406,7409],{"v-slot:right":949},[80,7405,3511],{},[364,7407],{"label":3371,"language":4422,"src":7408},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-prod-output.txt",[21,7410,7411,7419,7424,7436],{},[24,7412,5435,7413,7415,7416,7418],{},[95,7414,7176],{}," from the current ",[95,7417,7173],{}," branch",[24,7420,7421],{},[95,7422,7423],{},"git checkout -b prod",[24,7425,7426,7427,7371,7429],{},"Push ",[95,7428,7176],{},[21,7430,7431],{},[24,7432,7433],{},[95,7434,7435],{},"git push origin prod",[24,7437,7438,7440],{},[95,7439,7176],{}," starts from the same clean baseline",[11,7442,7444,7449],{"id":7443,"level":14},"step-4-return-to-qa",[16,7445,7446,7447],{"id":7443},"Step 4: Return To ",[95,7448,7173],{},[942,7450,7451,7459],{"gap":944,"left-width":945,"right-width":945},[947,7452,7453,7455],{"v-slot:left":949},[80,7454,362],{},[364,7456],{"label":7457,"language":366,"src":7458},"return-to-qa.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Freturn-to-qa.sh",[947,7460,7461,7463,7466],{"v-slot:right":949},[80,7462,3511],{},[364,7464],{"label":3371,"language":4422,"src":7465},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Freturn-to-qa-output.txt",[21,7467,7468,7473,7478],{},[24,7469,7470,7472],{},[95,7471,7173],{}," should have the asterisk",[24,7474,7475,7477],{},[95,7476,7176],{}," should still exist on GitHub",[24,7479,7480,7481,7483],{},"Do not start normal course work from ",[95,7482,7176],{},[21,7484,7485],{},[24,7486,7487,7488,7490],{},"We'll remove local ",[95,7489,7176],{}," to avoid this issue",[11,7492,7494,7500],{"id":7493,"level":14},"step-5-delete-local-prod",[16,7495,7497,7498],{"id":7496},"step-5-remove-local-prod","Step 5: Remove Local ",[95,7499,7176],{},[942,7501,7502,7510],{"gap":944,"left-width":945,"right-width":945},[947,7503,7504,7506],{"v-slot:left":949},[80,7505,362],{},[364,7507],{"label":7508,"language":366,"src":7509},"delete-local-prod.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fdelete-local-prod.sh",[947,7511,7512,7514,7517],{"v-slot:right":949},[80,7513,3511],{},[364,7515],{"label":3371,"language":4422,"src":7516},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fdelete-local-prod-output.txt",[21,7518,7519,7541],{},[24,7520,7521,7524,7525,7527],{},[95,7522,7523],{},"git branch -d prod",": delete local ",[95,7526,7176],{},[21,7528,7529,7535],{},[24,7530,7531,7534],{},[95,7532,7533],{},"-d",": delete only if Git considers it safe",[24,7536,7537,7540],{},[95,7538,7539],{},"-D",": can be used as a forced delete",[24,7542,7543,7546,7547],{},[95,7544,7545],{},"git branch -r",": list remote branches\n",[21,7548,7549],{},[24,7550,7551,7552,7555],{},"Confirms ",[95,7553,7554],{},"origin\u002Fprod"," still exists",[11,7557,7559,7562,7565,7568,7582,7585],{"id":7558,"level":14},"github-check",[16,7560,7561],{"id":7558},"GitHub Check",[80,7563,7564],{},"Open the branch dropdown on GitHub",[80,7566,7567],{},"You should see:",[21,7569,7570,7574,7578],{},[24,7571,7572],{},[95,7573,2552],{},[24,7575,7576],{},[95,7577,7173],{},[24,7579,7580],{},[95,7581,7176],{},[80,7583,7584],{},"Branch roles:",[21,7586,7587,7592],{},[24,7588,7589,7591],{},[95,7590,7173],{},": testing and evidence",[24,7593,7594,7596],{},[95,7595,7176],{},": stable grading target",[11,7598,7600,7604],{"id":7599,"level":14},"normal-workflow",[16,7601,7603],{"id":7602},"normal-workflow-after-setup","Normal Workflow After Setup",[337,7605,7606,7623,7631,7642,7647,7661,7664,7671,7683],{},[24,7607,7608,7609,7611],{},"Return to ",[95,7610,7173],{},[21,7612,7613,7618],{},[24,7614,7615],{},[95,7616,7617],{},"git checkout qa",[24,7619,7620],{},[95,7621,7622],{},"git pull origin qa",[24,7624,7625,7626],{},"Create a feature or homework branch\n",[21,7627,7628],{},[24,7629,7630],{},"Branch name matches the task",[24,7632,7633,7634],{},"Commit the work on that branch\n",[21,7635,7636],{},[24,7637,7638,7639,7641],{},"Check ",[95,7640,4613],{}," before each Git command",[24,7643,7644,7645],{},"Push the branch and open a pull request into ",[95,7646,7173],{},[24,7648,7649,7650,7652,7653],{},"Merge into ",[95,7651,7173],{}," after review\n",[21,7654,7655],{},[24,7656,7657,7658,7660],{},"QA deployment will update from ",[95,7659,7173],{}," after Render setup",[24,7662,7663],{},"Test the QA version",[24,7665,7666,7667,6926,7669],{},"Open a pull request from ",[95,7668,7173],{},[95,7670,7176],{},[24,7672,7649,7673,7675,7676],{},[95,7674,7176],{}," when stable\n",[21,7677,7678],{},[24,7679,7680,7681,7660],{},"Production deployment will use ",[95,7682,7176],{},[24,7684,7685,7686,7688],{},"Return locally to ",[95,7687,7173],{}," and pull before the next task",[11,7690,7691,7693],{"id":854,"level":14},[16,7692,857],{"id":854},[21,7694,7695,7700,7705,7713,7721,7724],{},[24,7696,7697,7698],{},"Working directly on ",[95,7699,7176],{},[24,7701,7702,7703],{},"Forgetting to return to ",[95,7704,7173],{},[24,7706,7707,7708,7710,7711],{},"Pushing ",[95,7709,7173],{}," but not ",[95,7712,7176],{},[24,7714,7715,7716,7718,7719],{},"Deleting remote ",[95,7717,7176],{}," instead of local ",[95,7720,7176],{},[24,7722,7723],{},"Assuming GitHub has the branch without checking",[24,7725,7726,7727,5092],{},"Starting new work before ",[95,7728,4613],{},[11,7730,7731,7733,7736],{"id":924,"level":14},[16,7732,927],{"id":924},[80,7734,7735],{},"Answer before moving on:",[21,7737,7738,7741,7744,7747,7753],{},[24,7739,7740],{},"Which branch should QA deployment watch?",[24,7742,7743],{},"Which branch should production grading use?",[24,7745,7746],{},"Which branch should you return to before new work?",[24,7748,7749,7750,7752],{},"Why remove local ",[95,7751,7176],{}," after pushing it?",[24,7754,7755],{},"What future setup connects Render to these branches?",[11,7757,7758,7760],{"id":936,"level":14},[16,7759,940],{"id":939},[942,7761,7762,7787],{"gap":944,"left-width":945,"right-width":945},[947,7763,7764,7766],{"v-slot:left":949},[500,7765,953],{"id":952},[21,7767,7768,7771,7774,7779,7784],{},[24,7769,7770],{},"Branch: named line of Git history",[24,7772,7773],{},"Upstream: remote branch Git remembers for push\u002Fpull",[24,7775,7776,7778],{},[95,7777,7173],{},": public testing branch",[24,7780,7781,7783],{},[95,7782,7176],{},": stable grading branch",[24,7785,7786],{},"Remote-only branch: exists on GitHub, not locally",[947,7788,7789,7791],{"v-slot:right":949},[500,7790,984],{"id":936},[21,7792,7793,7800,7807],{},[24,7794,5187,7795],{},[132,7796,7799],{"href":7797,"rel":7798},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fget-started\u002Fusing-git\u002Fabout-git#about-branches",[993],"About branches",[24,7801,5187,7802],{},[132,7803,7806],{"href":7804,"rel":7805},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpull-requests\u002Fcollaborating-with-pull-requests\u002Fproposing-changes-to-your-work-with-pull-requests\u002Fabout-pull-requests",[993],"About pull requests",[24,7808,5172,7809],{},[132,7810,7813],{"href":7811,"rel":7812},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGit-Branching-Branches-in-a-Nutshell",[993],"Git Branching",[11,7815,7816,7818,7820],{"id":1011,"level":14},[16,7817,1014],{"id":1011},[80,7819,1017],{},[21,7821,7822,7831,7835,7839,7844],{},[24,7823,7824,7825,98,7827,102,7829],{},"Explain ",[95,7826,2552],{},[95,7828,7173],{},[95,7830,7176],{},[24,7832,7179,7833],{},[95,7834,7173],{},[24,7836,7179,7837],{},[95,7838,7176],{},[24,7840,7841,7842],{},"Keep local work branched from ",[95,7843,7173],{},[24,7845,7846],{},"Verify remote branches on GitHub",{"title":949,"searchDepth":1059,"depth":1059,"links":7848},[7849,7850,7851,7852,7854,7856,7858,7860,7862,7863,7864,7865,7866,7867],{"id":4365,"depth":1059,"text":4368},{"id":7196,"depth":1059,"text":7199},{"id":114,"depth":1059,"text":117},{"id":7269,"depth":1059,"text":7853},"Step 1: Start From main",{"id":7323,"depth":1059,"text":7855},"Step 2: Create And Push qa",{"id":7388,"depth":1059,"text":7857},"Step 3: Create And Push prod",{"id":7443,"depth":1059,"text":7859},"Step 4: Return To qa",{"id":7496,"depth":1059,"text":7861},"Step 5: Remove Local prod",{"id":7558,"depth":1059,"text":7561},{"id":7602,"depth":1059,"text":7603},{"id":854,"depth":1059,"text":857},{"id":924,"depth":1059,"text":927},{"id":939,"depth":1059,"text":940},{"id":1011,"depth":1059,"text":1014},"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":7157,"description":7868},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches",[2587,5290,7173,7875],"production","10:35","32XilHQwRiY","https:\u002F\u002Fyoutu.be\u002F32XilHQwRiY","Create QA and Prod Branches","GZx1sXtI0BMbyb6Gbpj7aoBvczhhR-FV7YpFE4j4UCs",{"id":7882,"title":7883,"audience":6,"body":7884,"contentType":1094,"course":1095,"description":8691,"estimateBasis":8692,"estimatedDiscussionMinutes":4342,"estimatedLiveMinutes":1100,"estimatedTotalMinutes":4343,"extension":1101,"meta":8693,"module":1103,"navigation":1104,"order":8694,"path":8695,"promptAssist":1106,"seo":8696,"status":1108,"stem":8697,"tags":8698,"videoDuration":8701,"videoId":8702,"videoLink":8703,"videoTitle":8704,"week":1103,"__hash__":8705},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup.md","Render Setup",{"type":8,"value":7885,"toc":8670},[7886,7913,7936,7965,8033,8094,8129,8165,8202,8252,8298,8333,8379,8416,8444,8476,8523,8556,8624],[11,7887,7889,7892],{"id":7888,"level":14},"render-setup-title",[16,7890,7883],{"id":7891},"render-setup",[21,7893,7894,7897,7902,7907,7910],{},[24,7895,7896],{},"Connect GitHub repo to Render",[24,7898,7899,7900],{},"Create a QA service from ",[95,7901,7173],{},[24,7903,7904,7905],{},"Create a production service from ",[95,7906,7176],{},[24,7908,7909],{},"Add the course database connection string",[24,7911,7912],{},"Verify live URLs and deploy logs",[11,7914,7915,7917,7919],{"id":3269,"level":14},[16,7916,3272],{"id":3269},[80,7918,4371],{},[21,7920,7921,7924,7927,7930,7933],{},[24,7922,7923],{},"Explain what Render does in the course workflow",[24,7925,7926],{},"Create separate QA and production services",[24,7928,7929],{},"Connect each service to the correct branch",[24,7931,7932],{},"Read Render logs when a deploy fails",[24,7934,7935],{},"Identify which deployed URL to submit or test",[11,7937,7939,7942,7959],{"id":7938,"level":14},"what-render-does",[16,7940,7941],{"id":7938},"What Render Does",[21,7943,7944,7947,7950,7953,7956],{},[24,7945,7946],{},"Hosts your PHP app from GitHub",[24,7948,7949],{},"Watches a selected branch",[24,7951,7952],{},"Rebuilds when that branch changes",[24,7954,7955],{},"Stores secrets as environment variables",[24,7957,7958],{},"Gives each service a public URL",[80,7960,7961,7962],{},"Course loop: ",[95,7963,7964],{},"local work -> GitHub branch -> Render URL",[11,7966,7968,7970],{"id":7967,"level":14},"free-tier-and-before-start",[16,7969,117],{"id":114},[942,7971,7972,8001],{"gap":944,"left-width":945,"right-width":945},[947,7973,7974,7978],{"v-slot:left":949},[500,7975,7977],{"id":7976},"free-tier","Free Tier",[21,7979,7980,7990,7998],{},[24,7981,3437,7982,7985],{},[95,7983,7984],{},"Free",[21,7986,7987],{},[24,7988,7989],{},"Render may default to a paid plan",[24,7991,7992,7993],{},"Free services can sleep",[21,7994,7995],{},[24,7996,7997],{},"First visit after sleep may be slow",[24,7999,8000],{},"Avoid extra services unless instructed",[947,8002,8003,8007],{"v-slot:right":949},[500,8004,8006],{"id":8005},"repo-ready","Repo Ready",[21,8008,8009,8012,8017,8026],{},[24,8010,8011],{},"Starter files committed and pushed",[24,8013,8014,8016],{},[95,8015,6381],{}," in repo root",[24,8018,8019,98,8021,102,8023,8025],{},[95,8020,302],{},[95,8022,6289],{},[95,8024,6292],{}," present",[24,8027,8028,3085,8030,8032],{},[95,8029,7173],{},[95,8031,7176],{}," branches exist on GitHub",[11,8034,8036,8039],{"id":8035,"level":14},"target-architecture",[16,8037,8038],{"id":8035},"Target Architecture",[942,8040,8041,8069],{"gap":944,"left-width":945,"right-width":945},[947,8042,8043,8047],{"v-slot:left":949},[500,8044,8046],{"id":8045},"qa-service","QA Service",[21,8048,8049,8055,8060,8063],{},[24,8050,8051,8052],{},"Name: ",[95,8053,8054],{},"\u003Cucid>-it202-\u003Csection>-qa",[24,8056,8057,8058],{},"Watches ",[95,8059,7173],{},[24,8061,8062],{},"Used for testing and evidence",[24,8064,8065,8066],{},"URL ends with ",[95,8067,8068],{},"-qa.onrender.com",[947,8070,8071,8075],{"v-slot:right":949},[500,8072,8074],{"id":8073},"production-service","Production Service",[21,8076,8077,8082,8086,8089],{},[24,8078,8051,8079],{},[95,8080,8081],{},"\u003Cucid>-it202-\u003Csection>-prod",[24,8083,8057,8084],{},[95,8085,7176],{},[24,8087,8088],{},"Stable version after QA checks",[24,8090,8065,8091],{},[95,8092,8093],{},"-prod.onrender.com",[11,8095,8097,8101],{"id":8096,"level":14},"step-1-sign-up",[16,8098,8100],{"id":8099},"step-1-sign-up-with-github","Step 1: Sign Up With GitHub",[942,8102,8103,8121],{"gap":944,"left-width":2972,"right-width":2971},[947,8104,8105],{"v-slot:left":949},[21,8106,8107,8112,8115,8118],{},[24,8108,2441,8109],{},[95,8110,8111],{},"render.com",[24,8113,8114],{},"Choose GitHub sign-in",[24,8116,8117],{},"Authorize Render when prompted",[24,8119,8120],{},"Land on the Render dashboard",[947,8122,8123],{"v-slot:right":949},[80,8124,8125],{},[1241,8126],{"alt":8127,"src":8128,"variant":1245},"Render GitHub sign-in screen","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-01-github-signin.png",[11,8130,8132,8135],{"id":8131,"level":14},"step-2-new-web-service",[16,8133,8134],{"id":8131},"Step 2: New Web Service",[942,8136,8137,8157],{"gap":944,"left-width":2972,"right-width":2971},[947,8138,8139],{"v-slot:left":949},[21,8140,8141,8146,8151,8154],{},[24,8142,1266,8143],{},[95,8144,8145],{},"New +",[24,8147,3437,8148],{},[95,8149,8150],{},"Web Service",[24,8152,8153],{},"Do not choose a database service here",[24,8155,8156],{},"This creates the hosted PHP app",[947,8158,8159],{"v-slot:right":949},[80,8160,8161],{},[1241,8162],{"alt":8163,"src":8164,"variant":1245},"Render New menu with Web Service option","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-04-new-menu.png",[11,8166,8168,8172],{"id":8167,"level":14},"step-3-connect-repo",[16,8169,8171],{"id":8170},"step-3-connect-repository","Step 3: Connect Repository",[942,8173,8174,8194],{"gap":944,"left-width":2467,"right-width":3012},[947,8175,8176],{"v-slot:left":949},[21,8177,8178,8181,8184,8191],{},[24,8179,8180],{},"Select your student course repository",[24,8182,8183],{},"Authorize repository access if Render asks",[24,8185,8186,8187,8190],{},"Ensure it's the proper repository (format: ",[95,8188,8189],{},"ucid-course-section-semYear",")",[24,8192,8193],{},"Continue to service settings",[947,8195,8196],{"v-slot:right":949},[80,8197,8198],{},[1241,8199],{"alt":8200,"src":8201,"variant":1245},"Render repository selection screen","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-07-select-repo.png",[11,8203,8205,8209],{"id":8204,"level":14},"step-4-configure-qa",[16,8206,8208],{"id":8207},"step-4-configure-qa-service","Step 4: Configure QA Service",[942,8210,8211,8244],{"gap":944,"left-width":2972,"right-width":2971},[947,8212,8213,8216],{"v-slot:left":949},[80,8214,8215],{},"Use these settings:",[21,8217,8218,8222,8227,8233,8238,8241],{},[24,8219,8051,8220],{},[95,8221,8054],{},[24,8223,8224,8225],{},"Branch: ",[95,8226,7173],{},[24,8228,8229,8230],{},"Runtime: ",[95,8231,8232],{},"Docker",[24,8234,8235,8236],{},"Instance type: ",[95,8237,7984],{},[24,8239,8240],{},"Root directory: blank",[24,8242,8243],{},"Build\u002Fstart commands: blank",[947,8245,8246],{"v-slot:right":949},[80,8247,8248],{},[1241,8249],{"alt":8250,"src":8251,"variant":1245},"Render QA service configuration","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-08-qa-config-basic.png",[11,8253,8255,8259],{"id":8254,"level":14},"step-5-env-vars",[16,8256,8258],{"id":8257},"step-5-add-environment-variables","Step 5: Add Environment Variables",[942,8260,8261,8290],{"gap":944,"left-width":3422,"right-width":5614},[947,8262,8263],{"v-slot:left":949},[21,8264,8265,8278,8284,8287],{},[24,8266,8267,8268,8270],{},"Add ",[95,8269,6732],{},[21,8271,8272],{},[24,8273,8274,8275],{},"Get it from ",[132,8276,6737],{"href":5582,"rel":8277},[993],[24,8279,8280,8281,8283],{},"Do not use \"add from ",[95,8282,6713],{},"\"",[24,8285,8286],{},"Add later API keys only when a later lesson requires them",[24,8288,8289],{},"Repeat required env vars on both QA and production",[947,8291,8292],{"v-slot:right":949},[80,8293,8294],{},[1241,8295],{"alt":8296,"src":8297,"variant":1245},"Render environment variables section","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-09-env-vars.png",[11,8299,8301,8304],{"id":8300,"level":14},"step-6-deploy-qa",[16,8302,8303],{"id":8300},"Step 6: Deploy QA",[942,8305,8306,8325],{"gap":944,"left-width":2467,"right-width":3012},[947,8307,8308],{"v-slot:left":949},[21,8309,8310,8313,8316,8319,8322],{},[24,8311,8312],{},"Create the QA service",[24,8314,8315],{},"Watch the first deploy log",[24,8317,8318],{},"Wait for a success state",[24,8320,8321],{},"Open the QA URL",[24,8323,8324],{},"Confirm the starter page loads",[947,8326,8327],{"v-slot:right":949},[80,8328,8329],{},[1241,8330],{"alt":8331,"src":8332,"variant":1245},"Successful Render QA deployment","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-10-qa-deployed.png",[11,8334,8336,8340],{"id":8335,"level":14},"step-7-create-prod",[16,8337,8339],{"id":8338},"step-7-create-production-service","Step 7: Create Production Service",[942,8341,8342,8371],{"gap":944,"left-width":2972,"right-width":2971},[947,8343,8344,8347],{"v-slot:left":949},[80,8345,8346],{},"Create a second web service:",[21,8348,8349,8352,8356,8360,8364,8368],{},[24,8350,8351],{},"Same repository",[24,8353,8051,8354],{},[95,8355,8081],{},[24,8357,8224,8358],{},[95,8359,7176],{},[24,8361,8229,8362],{},[95,8363,8232],{},[24,8365,8235,8366],{},[95,8367,7984],{},[24,8369,8370],{},"Same required env vars",[947,8372,8373],{"v-slot:right":949},[80,8374,8375],{},[1241,8376],{"alt":8377,"src":8378,"variant":1245},"Render production service configuration","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-11-prod-config.png",[11,8380,8381,8384],{"id":7599,"level":14},[16,8382,8383],{"id":7599},"Normal Workflow",[337,8385,8386,8389,8392,8397,8400,8403,8406,8413],{},[24,8387,8388],{},"Work locally on a feature or homework branch",[24,8390,8391],{},"Commit and push that branch to GitHub",[24,8393,8394,8395],{},"Open a pull request into ",[95,8396,7173],{},[24,8398,8399],{},"Merge after review",[24,8401,8402],{},"Render updates the QA URL",[24,8404,8405],{},"Test the QA URL",[24,8407,7666,8408,6926,8410,8412],{},[95,8409,7173],{},[95,8411,7176],{}," after evidence gathering",[24,8414,8415],{},"Render updates the production URL",[11,8417,8419,8422],{"id":8418,"level":14},"urls-and-cold-starts",[16,8420,8421],{"id":8418},"URLs And Cold Starts",[21,8423,8424,8427,8430,8433,8441],{},[24,8425,8426],{},"QA URL shows the test deployment",[24,8428,8429],{},"Production URL shows the stable deployment",[24,8431,8432],{},"Homework evidence usually starts with QA",[24,8434,8435,8436],{},"Free services may sleep after inactivity\n",[21,8437,8438],{},[24,8439,8440],{},"First visit after sleep may take extra time (2 - 5 minutes)",[24,8442,8443],{},"Do not submit before Render finishes deploying",[11,8445,8447,8450],{"id":8446,"level":14},"logs-and-status",[16,8448,8449],{"id":8446},"Logs And Status",[942,8451,8452,8468],{"gap":944,"left-width":2467,"right-width":3012},[947,8453,8454],{"v-slot:left":949},[21,8455,8456,8459,8462,8465],{},[24,8457,8458],{},"Logs show build and startup output",[24,8460,8461],{},"Dashboard status shows deploy progress",[24,8463,8464],{},"Failed deploys usually show the first useful clue",[24,8466,8467],{},"Read the first clear error before changing settings",[947,8469,8470],{"v-slot:right":949},[80,8471,8472],{},[1241,8473],{"alt":8474,"src":8475,"variant":1245},"Render deploy logs","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-12-logs.png",[11,8477,8479,8482],{"id":8478,"level":14},"troubleshooting",[16,8480,8481],{"id":8478},"Troubleshooting",[21,8483,8484,8494,8502,8512],{},[24,8485,8486,8487],{},"Build fails\n",[21,8488,8489],{},[24,8490,7638,8491,8493],{},[95,8492,6381],{},", root directory, runtime, and instance type",[24,8495,8496,8497],{},"App deploys but page fails\n",[21,8498,8499],{},[24,8500,8501],{},"Check logs for PHP errors",[24,8503,8504,8505],{},"Database connection fails\n",[21,8506,8507],{},[24,8508,7638,8509,8511],{},[95,8510,6732],{}," spelling and copied value",[24,8513,8514,8515],{},"Wrong version appears\n",[21,8516,8517,8520],{},[24,8518,8519],{},"Confirm the service watches the expected branch",[24,8521,8522],{},"Clear browser cache or test in a private window",[11,8524,8525,8527],{"id":854,"level":14},[16,8526,857],{"id":854},[21,8528,8529,8539,8542,8547,8550,8553],{},[24,8530,8531,8532,8534,8535,682,8537],{},"Choosing ",[95,8533,2552],{}," instead of ",[95,8536,7173],{},[95,8538,7176],{},[24,8540,8541],{},"Creating one service for both environments",[24,8543,8544,8545],{},"Forgetting ",[95,8546,6732],{},[24,8548,8549],{},"Using a paid instance type by accident",[24,8551,8552],{},"Checking GitHub but not the Render URL",[24,8554,8555],{},"Changing code locally but forgetting to push and merge",[11,8557,8558,8560],{"id":939,"level":14},[16,8559,940],{"id":939},[942,8561,8562,8590],{"gap":944,"left-width":945,"right-width":945},[947,8563,8564,8566,8572,8578,8584],{"v-slot:left":949},[500,8565,953],{"id":952},[80,8567,8568,8571],{},[163,8569,8570],{},"Service"," - one deployed app on Render",[80,8573,8574,8577],{},[163,8575,8576],{},"Watched branch"," - Git branch Render deploys from",[80,8579,8580,8583],{},[163,8581,8582],{},"Environment variable"," - setting stored outside code",[80,8585,8586,8589],{},[163,8587,8588],{},"Deploy log"," - output from Render's build\u002Fstart process",[947,8591,8592,8594],{"v-slot:right":949},[500,8593,984],{"id":936},[21,8595,8596,8603,8610,8617],{},[24,8597,8598],{},[132,8599,8602],{"href":8600,"rel":8601},"https:\u002F\u002Frender.com\u002Fdocs\u002Fweb-services",[993],"Render Docs: Web Services",[24,8604,8605],{},[132,8606,8609],{"href":8607,"rel":8608},"https:\u002F\u002Frender.com\u002Fdocs\u002Fdeploys",[993],"Render Docs: Deploys",[24,8611,8612],{},[132,8613,8616],{"href":8614,"rel":8615},"https:\u002F\u002Frender.com\u002Fdocs\u002Fconfigure-environment-variables",[993],"Render Docs: Environment Variables",[24,8618,8619],{},[132,8620,8623],{"href":8621,"rel":8622},"https:\u002F\u002Frender.com\u002Fdocs\u002Ffree",[993],"Render Docs: Free Instance Types",[11,8625,8626,8628,8631],{"id":1011,"level":14},[16,8627,1014],{"id":1011},[80,8629,8630],{},"Before leaving this presentation, confirm you:",[21,8632,8633,8636,8639,8646,8649,8652],{},[24,8634,8635],{},"Created QA and production Render services",[24,8637,8638],{},"Matched each service to the correct branch",[24,8640,8641,8642,6733,8644],{},"Added ",[95,8643,6732],{},[95,8645,6737],{},[24,8647,8648],{},"Opened each deployed URL",[24,8650,8651],{},"Read logs instead of assuming it worked",[24,8653,8654,8655],{},"Understand the local -> GitHub -> Render loop\n",[21,8656,8657,8660,8665],{},[24,8658,8659],{},"Majority of your work will be done locally and tested locally",[24,8661,8662,8664],{},[95,8663,7173],{}," is just for gathering evidence for submissions",[24,8666,8667,8669],{},[95,8668,7176],{}," is what will be verified during grading",{"title":949,"searchDepth":1059,"depth":1059,"links":8671},[8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690],{"id":7891,"depth":1059,"text":7883},{"id":3269,"depth":1059,"text":3272},{"id":7938,"depth":1059,"text":7941},{"id":114,"depth":1059,"text":117},{"id":8035,"depth":1059,"text":8038},{"id":8099,"depth":1059,"text":8100},{"id":8131,"depth":1059,"text":8134},{"id":8170,"depth":1059,"text":8171},{"id":8207,"depth":1059,"text":8208},{"id":8257,"depth":1059,"text":8258},{"id":8300,"depth":1059,"text":8303},{"id":8338,"depth":1059,"text":8339},{"id":7599,"depth":1059,"text":8383},{"id":8418,"depth":1059,"text":8421},{"id":8446,"depth":1059,"text":8449},{"id":8478,"depth":1059,"text":8481},{"id":854,"depth":1059,"text":857},{"id":939,"depth":1059,"text":940},{"id":1011,"depth":1059,"text":1014},"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.",{},"80","\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup",{"title":7883,"description":8691},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup",[8699,8700,7173,7875],"render","deployment","21:42","esZd5RIpqCQ","https:\u002F\u002Fyoutu.be\u002FesZd5RIpqCQ","Render.com Setup (QA and Prod)","_1jV7vdhppggQ8TAOecx_1jFvjG90__8eGGlaXbnc28",{"id":8707,"title":8708,"audience":6,"body":8709,"contentType":1094,"course":1095,"description":11383,"estimateBasis":11384,"estimatedDiscussionMinutes":11385,"estimatedLiveMinutes":11386,"estimatedTotalMinutes":11387,"extension":1101,"meta":11388,"module":1103,"navigation":1104,"order":5283,"path":11389,"promptAssist":1106,"seo":11390,"status":1108,"stem":11391,"tags":11392,"videoDuration":11397,"videoId":11398,"videoLink":11399,"videoTitle":11400,"week":1103,"__hash__":11401},"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":8710,"toc":11315},[8711,8740,8785,8821,8890,8922,8949,8981,9007,9036,9065,9092,9123,9151,9187,9252,9287,9333,9376,9420,9467,9530,9566,9601,9638,9671,9708,9741,9771,9801,9831,9861,9891,9925,9957,9989,10021,10070,10072,10115,10141,10182,10234,10313,10364,10395,10425,10455,10505,10530,10580,10628,10686,10744,10785,10815,10849,10883,10917,10968,11020,11039,11067,11115,11187,11287],[11,8712,8714,8717],{"id":8713,"level":14},"virtualbox-title",[16,8715,8708],{"id":8716},"local-ubuntu-web-server-with-virtualbox",[21,8718,8719,8722,8725,8728,8731,8737],{},[24,8720,8721],{},"Primary course path for the local Ubuntu VM",[24,8723,8724],{},"Create an Ubuntu Server VM in VirtualBox",[24,8726,8727],{},"Connect from your host terminal with SSH",[24,8729,8730],{},"Share the course repo into Ubuntu",[24,8732,8733,8734,8736],{},"Serve ",[95,8735,302],{}," through Apache and PHP",[24,8738,8739],{},"Create a local MySQL database for testing",[11,8741,8743,8746,8749,8760,8763],{"id":8742,"level":14},"main-goal",[16,8744,8745],{"id":8742},"Main Goal",[80,8747,8748],{},"Your host computer and Ubuntu VM have different jobs:",[21,8750,8751,8754,8757],{},[24,8752,8753],{},"Host computer: edit files with VS Code and open the browser",[24,8755,8756],{},"Ubuntu VM: run Apache, PHP, MySQL, and server commands",[24,8758,8759],{},"Shared folder: lets both use the same course repo files",[80,8761,8762],{},"Target result:",[21,8764,8765,8771,8776,8779,8782],{},[24,8766,8767,8768],{},"Host browser opens ",[95,8769,8770],{},"http:\u002F\u002Flocalhost:3000",[24,8772,8773,8774],{},"Apache serves the repo's ",[95,8775,302],{},[24,8777,8778],{},"PHP executes inside Ubuntu",[24,8780,8781],{},"Local MySQL has a database and user named after your UCID",[24,8783,8784],{},"Edits made on the host appear after browser refresh",[11,8786,8788,8791,8794,8813,8816],{"id":8787,"level":14},"virtualbox-caveat",[16,8789,8790],{"id":8787},"VirtualBox Caveat",[80,8792,8793],{},"VirtualBox is the primary local VM path for this course:",[21,8795,8796,8799,8802,8810],{},[24,8797,8798],{},"Works well on modern Windows, Linux, and Intel Mac hosts",[24,8800,8801],{},"Apple Silicon Mac requires an ARM64 Ubuntu Server ISO",[24,8803,8804,8805],{},"Windows on Arm support is experimental in VirtualBox\n",[21,8806,8807],{},[24,8808,8809],{},"Avoid unless your instructor confirms it for your machine",[24,8811,8812],{},"Arm hosts cannot run x86\u002FAMD64 guest images",[80,8814,8815],{},"VMware is the fallback path if VirtualBox is not a good fit for your machine",[2684,8817,8818],{"type":3959},[80,8819,8820],{},"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,8822,8823,8825],{"id":114,"level":14},[16,8824,117],{"id":114},[21,8826,8827,8845,8863,8866,8869,8872,8887],{},[24,8828,8829,8830],{},"VirtualBox downloaded\n",[21,8831,8832,8839,8842],{},[24,8833,8834],{},[132,8835,8838],{"href":8836,"rel":8837},"https:\u002F\u002Fwww.virtualbox.org\u002Fwiki\u002FDownloads",[993],"VirtualBox downloads",[24,8840,8841],{},"Windows\u002FLinux\u002FIntel Mac: use the standard host installer",[24,8843,8844],{},"Apple Silicon Mac: use the macOS Arm64 host installer",[24,8846,8847,8848],{},"Ubuntu Server ISO downloaded\n",[21,8849,8850,8857,8860],{},[24,8851,8852],{},[132,8853,8856],{"href":8854,"rel":8855},"https:\u002F\u002Fubuntu.com\u002Fdownload\u002Fserver#how-to-install-tab-lts",[993],"Ubuntu Server installer",[24,8858,8859],{},"Apple Silicon Mac: use the ARM64 server ISO",[24,8861,8862],{},"Windows, Linux, and Intel Mac: use the AMD64 server ISO",[24,8864,8865],{},"Internet Applications course repo cloned on host computer",[24,8867,8868],{},"Git\u002FGitHub setup already working",[24,8870,8871],{},"Administrator access on your computer",[24,8873,8874,8875,8878,8879],{},"At least ",[95,8876,8877],{},"10 GB"," free disk space for the VM\n",[21,8880,8881],{},[24,8882,8883,8886],{},[95,8884,8885],{},"20-25 GB"," is safer if your computer has room",[24,8888,8889],{},"Stable internet for package installs",[11,8891,8893,8896],{"id":8892,"level":14},"setup-parts",[16,8894,8895],{"id":8892},"Setup Parts",[21,8897,8898,8901,8904,8907,8913,8916,8919],{},[24,8899,8900],{},"VM: Ubuntu Server running inside VirtualBox",[24,8902,8903],{},"NAT adapter: gives the VM internet access",[24,8905,8906],{},"Port forwarding: lets the host reach SSH and Apache",[24,8908,8909,8910],{},"SSH: lets the host terminal control Ubuntu through ",[95,8911,8912],{},"localhost",[24,8914,8915],{},"Shared folder: exposes the host repo inside Ubuntu",[24,8917,8918],{},"Apache\u002FPHP: serves and executes the web app",[24,8920,8921],{},"MySQL: local database server for local testing",[11,8923,8925,8929],{"id":8924,"level":14},"install-virtualbox-windows",[16,8926,8928],{"id":8927},"install-virtualbox-on-windows","Install VirtualBox On Windows",[21,8930,8931,8934,8937,8940,8943,8946],{},[24,8932,8933],{},"Download VirtualBox for Windows hosts",[24,8935,8936],{},"Run the installer as an administrator if prompted",[24,8938,8939],{},"Keep the default install path and features",[24,8941,8942],{},"Accept the network reset warning",[24,8944,8945],{},"Open VirtualBox after installation",[24,8947,8948],{},"See the slides below for the Windows installer screens",[11,8950,8952,8955],{"id":8951,"level":356},"windows-installer-start",[16,8953,8954],{"id":8951},"Windows Installer: Start",[942,8956,8957,8965],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,8958,8959],{"v-slot:left":949},[80,8960,8961],{},[1241,8962],{"alt":8963,"src":8964,"variant":1245},"VirtualBox Windows installer start screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step1.png",[947,8966,8967],{"v-slot:right":949},[21,8968,8969,8975,8978],{},[24,8970,8971,8972],{},"Launch the downloaded ",[95,8973,8974],{},".exe",[24,8976,8977],{},"Approve the Windows security prompt if shown",[24,8979,8980],{},"Start the setup wizard",[11,8982,8984,8987],{"id":8983,"level":356},"windows-installer-features",[16,8985,8986],{"id":8983},"Windows Installer: Features",[942,8988,8989,8997],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,8990,8991],{"v-slot:left":949},[80,8992,8993],{},[1241,8994],{"alt":8995,"src":8996,"variant":1245},"VirtualBox Windows installer feature selection screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step2.png",[947,8998,8999],{"v-slot:right":949},[21,9000,9001,9004],{},[24,9002,9003],{},"Keep the default install location",[24,9005,9006],{},"Keep the default features selected",[11,9008,9010,9013],{"id":9009,"level":356},"windows-installer-network-warning",[16,9011,9012],{"id":9009},"Windows Installer: Network Warning",[942,9014,9015,9023],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,9016,9017],{"v-slot:left":949},[80,9018,9019],{},[1241,9020],{"alt":9021,"src":9022,"variant":1245},"VirtualBox Windows installer network warning","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step3.png",[947,9024,9025],{"v-slot:right":949},[21,9026,9027,9030,9033],{},[24,9028,9029],{},"VirtualBox may reset network adapters briefly",[24,9031,9032],{},"This is expected during install",[24,9034,9035],{},"Save web work before continuing if needed",[11,9037,9039,9042],{"id":9038,"level":356},"windows-installer-ready",[16,9040,9041],{"id":9038},"Windows Installer: Ready",[942,9043,9044,9052],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,9045,9046],{"v-slot:left":949},[80,9047,9048],{},[1241,9049],{"alt":9050,"src":9051,"variant":1245},"VirtualBox Windows installer ready screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step4.png",[947,9053,9054],{"v-slot:right":949},[21,9055,9056,9059,9062],{},[24,9057,9058],{},"Start the installation",[24,9060,9061],{},"Keep the default choices",[24,9063,9064],{},"Wait for the installer to request permissions if needed",[11,9066,9068,9072],{"id":9067,"level":356},"windows-installer-progress",[16,9069,9071],{"id":9070},"windows-installer-start-options","Windows Installer: Start Options",[942,9073,9074,9082],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,9075,9076],{"v-slot:left":949},[80,9077,9078],{},[1241,9079],{"alt":9080,"src":9081,"variant":1245},"VirtualBox Windows installer progress screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step5.png",[947,9083,9084],{"v-slot:right":949},[21,9085,9086,9089],{},[24,9087,9088],{},"No need to create a Start Menu item or desktop shortcut unless desired",[24,9090,9091],{},"Third option is likely optional too since we'll be using the VirtualBox Manager",[11,9093,9095,9098],{"id":9094,"level":356},"windows-installer-permission",[16,9096,9097],{"id":9094},"Windows Installer: Permission",[942,9099,9100,9108],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,9101,9102],{"v-slot:left":949},[80,9103,9104],{},[1241,9105],{"alt":9106,"src":9107,"variant":1245},"VirtualBox Windows installer permission prompt","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step6.png",[947,9109,9110],{"v-slot:right":949},[21,9111,9112,9115],{},[24,9113,9114],{},"Proceed with install",[24,9116,9117,9118],{},"Approve VirtualBox driver prompts\n",[21,9119,9120],{},[24,9121,9122],{},"These let VirtualBox create virtual hardware",[11,9124,9126,9129],{"id":9125,"level":356},"windows-installer-complete",[16,9127,9128],{"id":9125},"Windows Installer: Complete",[942,9130,9131,9139],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,9132,9133],{"v-slot:left":949},[80,9134,9135],{},[1241,9136],{"alt":9137,"src":9138,"variant":1245},"VirtualBox Windows installer completion screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step7.png",[947,9140,9141],{"v-slot:right":949},[21,9142,9143,9145,9148],{},[24,9144,2832],{},[24,9146,9147],{},"Open VirtualBox",[24,9149,9150],{},"Continue to VM creation",[11,9152,9154,9158],{"id":9153,"level":14},"install-virtualbox-macos",[16,9155,9157],{"id":9156},"install-virtualbox-on-macos","Install VirtualBox On macOS",[942,9159,9160,9179],{"gap":944,"left-width":3422,"right-width":5614,"stack":2468},[947,9161,9162],{"v-slot:left":949},[21,9163,9164,9167,9170,9173,9176],{},[24,9165,9166],{},"Install the VirtualBox host package for your Mac CPU type",[24,9168,9169],{},"Intel Mac: standard macOS host installer",[24,9171,9172],{},"Apple Silicon Mac: Arm64 host installer and Arm64 Ubuntu Server ISO",[24,9174,9175],{},"Approve macOS security prompts if needed",[24,9177,9178],{},"If VirtualBox is not a good fit, use the VMware fallback lesson",[947,9180,9181],{"v-slot:right":949},[80,9182,9183],{},[1241,9184],{"alt":9185,"src":9186,"variant":1245},"Summary of macOS VirtualBox setup notes","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvm_summary_mac.png",[11,9188,9190,9194,9197],{"id":9189,"level":14},"step-1-create-vm",[16,9191,9193],{"id":9192},"step-1-create-the-vm","Step 1: Create The VM",[80,9195,9196],{},"Create a lightweight Ubuntu Server VM:",[21,9198,9199,9202,9210,9225,9237,9243,9246,9249],{},[24,9200,9201],{},"Type: Linux",[24,9203,9204,9205],{},"Version: Ubuntu 64-bit or Ubuntu Arm64\n",[21,9206,9207],{},[24,9208,9209],{},"Match the version to the ISO you downloaded",[24,9211,9212,9213,9216,9217],{},"Memory: ",[95,9214,9215],{},"1 GB"," course target\n",[21,9218,9219],{},[24,9220,631,9221,9224],{},[95,9222,9223],{},"1.5-2 GB"," if the installer is too slow or refuses to continue (you shouldn't need to do this)",[24,9226,9227,9228,9230,9231],{},"Disk: ",[95,9229,8877],{}," course minimum\n",[21,9232,9233],{},[24,9234,9235,8886],{},[95,9236,8885],{},[24,9238,9239,9240,9242],{},"CPU: ",[95,9241,1103],{}," core is enough for this course VM",[24,9244,9245],{},"Enable OpenSSH during install if prompted",[24,9247,9248],{},"Username: use your UCID",[24,9250,9251],{},"See the slides below for VM settings and Ubuntu install screens",[11,9253,9255,9258],{"id":9254,"level":356},"vm-setup-name-and-iso",[16,9256,9257],{"id":9254},"VM Setup: Name And ISO",[942,9259,9260,9268],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,9261,9262],{"v-slot:left":949},[80,9263,9264],{},[1241,9265],{"alt":9266,"src":9267,"variant":1245},"VirtualBox VM name and ISO setup","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_1.png",[947,9269,9270],{"v-slot:right":949},[21,9271,9272,9275,9281,9284],{},[24,9273,9274],{},"Start a new virtual machine",[24,9276,9277,9278],{},"Name it clearly, such as ",[95,9279,9280],{},"it202-vm",[24,9282,9283],{},"Choose the Ubuntu Server ISO file next",[24,9285,9286],{},"OS fields may look wrong until the ISO is selected",[11,9288,9290,9293],{"id":9289,"level":356},"vm-setup-confirm-ubuntu-iso",[16,9291,9292],{"id":9289},"VM Setup: Confirm Ubuntu ISO",[942,9294,9295,9303],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,9296,9297],{"v-slot:left":949},[80,9298,9299],{},[1241,9300],{"alt":9301,"src":9302,"variant":1245},"VirtualBox VM name and Ubuntu ISO selected","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_2.png",[947,9304,9305],{"v-slot:right":949},[21,9306,9307,9313,9319,9322],{},[24,9308,9309,9310],{},"Confirm OS is ",[95,9311,9312],{},"Linux",[24,9314,9315,9316],{},"Confirm distribution is ",[95,9317,9318],{},"Ubuntu",[24,9320,9321],{},"Confirm version matches your ISO",[24,9323,2486,9324,9327,9328],{},[95,9325,9326],{},"Unattended Installation"," off\n",[21,9329,9330],{},[24,9331,9332],{},"The Ubuntu installer screens are easier to teach manually",[11,9334,9336,9339],{"id":9335,"level":356},"vm-setup-memory-and-cpu",[16,9337,9338],{"id":9335},"VM Setup: Memory And CPU",[942,9340,9341,9349],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,9342,9343],{"v-slot:left":949},[80,9344,9345],{},[1241,9346],{"alt":9347,"src":9348,"variant":1245},"VirtualBox VM memory and CPU settings","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_4.png",[947,9350,9351],{"v-slot:right":949},[21,9352,9353,9366,9370,9373],{},[24,9354,9212,9355,9216,9358],{},[95,9356,9357],{},"1024 MB",[21,9359,9360,9363],{},[24,9361,9362],{},"The goal is to match free-tier cloud services",[24,9364,9365],{},"Demonstrates that small apps can run with limited resources",[24,9367,9239,9368],{},[95,9369,1103],{},[24,9371,9372],{},"Keep EFI off unless your machine requires it",[24,9374,9375],{},"This VM is for Apache, PHP, MySQL, and local development\u002Ftesting",[11,9377,9379,9382],{"id":9378,"level":356},"vm-setup-virtual-disk",[16,9380,9381],{"id":9378},"VM Setup: Virtual Disk",[942,9383,9384,9392],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,9385,9386],{"v-slot:left":949},[80,9387,9388],{},[1241,9389],{"alt":9390,"src":9391,"variant":1245},"VirtualBox virtual hard disk settings","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_5.png",[947,9393,9394],{"v-slot:right":949},[21,9395,9396,9402,9405,9417],{},[24,9397,9398,9399],{},"Disk type: ",[95,9400,9401],{},"VDI",[24,9403,9404],{},"Storage: dynamically allocated",[24,9406,9407,9408,9410],{},"Minimum: ",[95,9409,8877],{},[21,9411,9412],{},[24,9413,9414,9416],{},[95,9415,8885],{}," is safer if you have room",[24,9418,9419],{},"Dynamic disk uses space as needed, not all at once",[11,9421,9423,9426],{"id":9422,"level":356},"vm-setup-start-with-gui",[16,9424,9425],{"id":9422},"VM Setup: Start With GUI",[942,9427,9428,9436],{"gap":944,"left-width":2466,"right-width":2467,"stack":2468},[947,9429,9430],{"v-slot:left":949},[80,9431,9432],{},[1241,9433],{"alt":9434,"src":9435,"variant":1245},"VirtualBox VM selected with the Start button visible","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_6.png",[947,9437,9438],{"v-slot:right":949},[21,9439,9440,9443,9453,9456],{},[24,9441,9442],{},"Select the newly created VM",[24,9444,1266,9445,9448],{},[95,9446,9447],{},"Start",[21,9449,9450],{},[24,9451,9452],{},"Choose the normal GUI start for the first boot",[24,9454,9455],{},"Complete the Ubuntu installer in the VM window",[24,9457,9458,9459],{},"After install and SSH setup, future starts can be headless\n",[21,9460,9461],{},[24,9462,9463,9464,9466],{},"You will connect with ",[95,9465,4351],{}," when you need the VM",[11,9468,9470,9474,9477],{"id":9469,"level":14},"ubuntu-installer",[16,9471,9473],{"id":9472},"step-2-ubuntu-installer","Step 2: Ubuntu Installer",[80,9475,9476],{},"Use the Ubuntu Server installer after the VM starts:",[21,9478,9479,9482,9485,9488,9491,9494,9527],{},[24,9480,9481],{},"Choose the default course options unless noted",[24,9483,9484],{},"Continue without updating the installer if instructed",[24,9486,9487],{},"Use your UCID for the Ubuntu username",[24,9489,9490],{},"Install OpenSSH server during setup",[24,9492,9493],{},"Skip optional server snaps",[24,9495,9496,9497],{},"Keyboard navigation:\n",[21,9498,9499,9506,9516,9522],{},[24,9500,9501,9505],{},[9502,9503,9504],"kbd",{},"Tab"," moves between fields and buttons",[24,9507,9508,9511,9512,9515],{},[9502,9509,9510],{},"Up"," \u002F ",[9502,9513,9514],{},"Down"," moves through lists",[24,9517,9518,9521],{},[9502,9519,9520],{},"Space"," toggles checkboxes",[24,9523,9524,9526],{},[9502,9525,715],{}," confirms the selected option",[24,9528,9529],{},"See the slides below for the installer screens",[11,9531,9533,9537],{"id":9532,"level":356},"ubuntu-installer-boot-menu",[16,9534,9536],{"id":9535},"step-21-boot-menu","Step 2.1: Boot Menu",[942,9538,9541,9550],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},"1.75fr","0.65fr",[947,9542,9543],{"v-slot:left":949},[80,9544,9545],{},[1241,9546],{"alt":9547,"src":9548,"variant":9549},"Ubuntu Server boot menu in VirtualBox","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_1.png","slide-screenshot",[947,9551,9552],{"v-slot:right":949},[21,9553,9554,9559,9563],{},[24,9555,3437,9556],{},[95,9557,9558],{},"Try or Install Ubuntu Server",[24,9560,748,9561],{},[9502,9562,715],{},[24,9564,9565],{},"This starts the Ubuntu Server installer",[11,9567,9569,9573],{"id":9568,"level":356},"ubuntu-installer-language",[16,9570,9572],{"id":9571},"step-22-language","Step 2.2: Language",[942,9574,9575,9583],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9576,9577],{"v-slot:left":949},[80,9578,9579],{},[1241,9580],{"alt":9581,"src":9582,"variant":9549},"Ubuntu Server installer language screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_2.0.png",[947,9584,9585],{"v-slot:right":949},[21,9586,9587,9590,9596],{},[24,9588,9589],{},"Choose your preferred language",[24,9591,9592,9595],{},[95,9593,9594],{},"English"," is the expected course screenshot path",[24,9597,748,9598,9600],{},[9502,9599,715],{}," to continue",[11,9602,9604,9608],{"id":9603,"level":356},"ubuntu-installer-update",[16,9605,9607],{"id":9606},"step-23-update-prompt","Step 2.3: Update Prompt",[942,9609,9610,9618],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9611,9612],{"v-slot:left":949},[80,9613,9614],{},[1241,9615],{"alt":9616,"src":9617,"variant":9549},"Ubuntu Server installer update prompt","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_2.5.png",[947,9619,9620],{"v-slot:right":949},[21,9621,9622,9632,9635],{},[24,9623,3437,9624,9627],{},[95,9625,9626],{},"Continue without updating",[21,9628,9629],{},[24,9630,9631],{},"If I forget to update the image, it's the second option",[24,9633,9634],{},"Keeps the install path consistent",[24,9636,9637],{},"Package updates happen after Ubuntu is installed",[11,9639,9641,9645],{"id":9640,"level":356},"ubuntu-installer-keyboard",[16,9642,9644],{"id":9643},"step-24-keyboard","Step 2.4: Keyboard",[942,9646,9647,9655],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9648,9649],{"v-slot:left":949},[80,9650,9651],{},[1241,9652],{"alt":9653,"src":9654,"variant":9549},"Ubuntu Server installer keyboard screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_3.png",[947,9656,9657],{"v-slot:right":949},[21,9658,9659,9662,9668],{},[24,9660,9661],{},"Keep the detected keyboard layout if it matches",[24,9663,9664,9665],{},"Common setting: ",[95,9666,9667],{},"English (US)",[24,9669,9670],{},"Use Identify keyboard only if typing is wrong",[11,9672,9674,9678],{"id":9673,"level":356},"ubuntu-installer-install-type",[16,9675,9677],{"id":9676},"step-25-install-type","Step 2.5: Install Type",[942,9679,9680,9688],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9681,9682],{"v-slot:left":949},[80,9683,9684],{},[1241,9685],{"alt":9686,"src":9687,"variant":9549},"Ubuntu Server installer installation type screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_4.png",[947,9689,9690],{"v-slot:right":949},[21,9691,9692,9702,9705],{},[24,9693,9694,9695,9698,9699],{},"Select ",[95,9696,9697],{},"Ubuntu Server (minimized)","; don't choose full ",[95,9700,9701],{},"Ubuntu Server",[24,9703,9704],{},"Keep third-party drivers unchecked",[24,9706,9707],{},"Minimized keeps the VM lighter and aids future lessons",[11,9709,9711,9715],{"id":9710,"level":356},"ubuntu-installer-network",[16,9712,9714],{"id":9713},"step-26-network","Step 2.6: Network",[942,9716,9717,9725],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9718,9719],{"v-slot:left":949},[80,9720,9721],{},[1241,9722],{"alt":9723,"src":9724,"variant":9549},"Ubuntu Server installer network configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_5.png",[947,9726,9727],{"v-slot:right":949},[21,9728,9729,9732,9738],{},[24,9730,9731],{},"DHCP address is expected",[24,9733,9734,9737],{},[95,9735,9736],{},"10.0.2.15"," is normal for VirtualBox NAT",[24,9739,9740],{},"Leave the network settings alone",[11,9742,9744,9748],{"id":9743,"level":356},"ubuntu-installer-proxy",[16,9745,9747],{"id":9746},"step-27-proxy","Step 2.7: Proxy",[942,9749,9750,9758],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9751,9752],{"v-slot:left":949},[80,9753,9754],{},[1241,9755],{"alt":9756,"src":9757,"variant":9549},"Ubuntu Server installer proxy screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_6.png",[947,9759,9760],{"v-slot:right":949},[21,9761,9762,9765,9768],{},[24,9763,9764],{},"Leave proxy blank",[24,9766,9767],{},"Only fill this in if your network requires a proxy",[24,9769,9770],{},"Most student home networks do not need one",[11,9772,9774,9778],{"id":9773,"level":356},"ubuntu-installer-mirror",[16,9775,9777],{"id":9776},"step-28-mirror","Step 2.8: Mirror",[942,9779,9780,9788],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9781,9782],{"v-slot:left":949},[80,9783,9784],{},[1241,9785],{"alt":9786,"src":9787,"variant":9549},"Ubuntu Server installer archive mirror screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_7.png",[947,9789,9790],{"v-slot:right":949},[21,9791,9792,9795,9798],{},[24,9793,9794],{},"Keep the default Ubuntu archive mirror",[24,9796,9797],{},"Wait for the mirror check to finish",[24,9799,9800],{},"Continue when the installer allows it",[11,9802,9804,9808],{"id":9803,"level":356},"ubuntu-installer-storage-guided",[16,9805,9807],{"id":9806},"step-29-guided-storage","Step 2.9: Guided Storage",[942,9809,9810,9818],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9811,9812],{"v-slot:left":949},[80,9813,9814],{},[1241,9815],{"alt":9816,"src":9817,"variant":9549},"Ubuntu Server installer guided storage screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_8.png",[947,9819,9820],{"v-slot:right":949},[21,9821,9822,9825,9828],{},[24,9823,9824],{},"Use the entire virtual disk",[24,9826,9827],{},"LVM is optional, not needed for this course VM",[24,9829,9830],{},"Leave encryption off",[11,9832,9834,9838],{"id":9833,"level":356},"ubuntu-installer-storage-summary",[16,9835,9837],{"id":9836},"step-210-storage-summary","Step 2.10: Storage Summary",[942,9839,9840,9848],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9841,9842],{"v-slot:left":949},[80,9843,9844],{},[1241,9845],{"alt":9846,"src":9847,"variant":9549},"Ubuntu Server installer storage summary screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_9.png",[947,9849,9850],{"v-slot:right":949},[21,9851,9852,9855,9858],{},[24,9853,9854],{},"Confirm the virtual disk is selected",[24,9856,9857],{},"This only affects the VM disk file",[24,9859,9860],{},"Continue when the layout looks correct",[11,9862,9864,9868],{"id":9863,"level":356},"ubuntu-installer-confirm-storage",[16,9865,9867],{"id":9866},"step-211-confirm-storage","Step 2.11: Confirm Storage",[942,9869,9870,9878],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9871,9872],{"v-slot:left":949},[80,9873,9874],{},[1241,9875],{"alt":9876,"src":9877,"variant":9549},"Ubuntu Server installer destructive action confirmation","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_10.png",[947,9879,9880],{"v-slot:right":949},[21,9881,9882,9885,9888],{},[24,9883,9884],{},"Confirm the virtual disk format",[24,9886,9887],{},"This does not erase your host computer files",[24,9889,9890],{},"It formats the VM's virtual disk",[11,9892,9894,9898],{"id":9893,"level":356},"ubuntu-installer-profile",[16,9895,9897],{"id":9896},"step-212-profile","Step 2.12: Profile",[942,9899,9900,9908],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9901,9902],{"v-slot:left":949},[80,9903,9904],{},[1241,9905],{"alt":9906,"src":9907,"variant":9549},"Ubuntu Server installer profile configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_11.png",[947,9909,9910],{"v-slot:right":949},[21,9911,9912,9915,9920,9922],{},[24,9913,9914],{},"Your name: your UCID or name is fine",[24,9916,9917,9918],{},"Server name: ",[95,9919,9280],{},[24,9921,5568],{},[24,9923,9924],{},"Choose a password you can type reliably (it can be simple since it's only for local work)",[11,9926,9928,9932],{"id":9927,"level":356},"ubuntu-installer-pro",[16,9929,9931],{"id":9930},"step-213-ubuntu-pro","Step 2.13: Ubuntu Pro",[942,9933,9934,9942],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9935,9936],{"v-slot:left":949},[80,9937,9938],{},[1241,9939],{"alt":9940,"src":9941,"variant":9549},"Ubuntu Server installer Ubuntu Pro screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_12.png",[947,9943,9944],{"v-slot:right":949},[21,9945,9946,9951,9954],{},[24,9947,3437,9948],{},[95,9949,9950],{},"Skip for now",[24,9952,9953],{},"Ubuntu Pro is not needed for the course VM",[24,9955,9956],{},"You can continue without an Ubuntu account",[11,9958,9960,9964],{"id":9959,"level":356},"ubuntu-installer-ssh",[16,9961,9963],{"id":9962},"step-214-ssh","Step 2.14: SSH",[942,9965,9966,9974],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9967,9968],{"v-slot:left":949},[80,9969,9970],{},[1241,9971],{"alt":9972,"src":9973,"variant":9549},"Ubuntu Server installer SSH configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_13.png",[947,9975,9976],{"v-slot:right":949},[21,9977,9978,9983,9986],{},[24,9979,7638,9980],{},[95,9981,9982],{},"Install OpenSSH server",[24,9984,9985],{},"Password authentication is fine for this local VM",[24,9987,9988],{},"No need to import SSH keys for this course setup",[11,9990,9992,9996],{"id":9991,"level":356},"ubuntu-installer-snaps",[16,9993,9995],{"id":9994},"step-215-featured-snaps","Step 2.15: Featured Snaps",[942,9997,9998,10006],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,9999,10000],{"v-slot:left":949},[80,10001,10002],{},[1241,10003],{"alt":10004,"src":10005,"variant":9549},"Ubuntu Server installer featured server snaps screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_14.png",[947,10007,10008],{"v-slot:right":949},[21,10009,10010,10013,10018],{},[24,10011,10012],{},"Leave all featured snaps unchecked",[24,10014,10015,10016],{},"Apache, PHP, and MySQL are installed later with ",[95,10017,6848],{},[24,10019,10020],{},"Continue without selecting extra packages",[11,10022,10024,10028],{"id":10023,"level":356},"ubuntu-installer-installing",[16,10025,10027],{"id":10026},"step-216-installing","Step 2.16: Installing",[942,10029,10030,10038],{"gap":1101,"left-width":9539,"right-width":9540,"stack":2468},[947,10031,10032],{"v-slot:left":949},[80,10033,10034],{},[1241,10035],{"alt":10036,"src":10037,"variant":9549},"Ubuntu Server installer installing system screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_15.png",[947,10039,10040,10065],{"v-slot:right":949},[21,10041,10042,10045,10048,10056,10062],{},[24,10043,10044],{},"Installation can take a while",[24,10046,10047],{},"High CPU during install is normal",[24,10049,10050,10051,10053,10054],{},"If install struggles at ",[95,10052,9215],{},", recreate the VM with ",[95,10055,9223],{},[24,10057,10058,10059,10061],{},"Keep the course target at ",[95,10060,9215],{}," after setup if possible",[24,10063,10064],{},"Reboot once complete",[2684,10066,10067],{"type":3959},[80,10068,10069],{},"These target resources stay close to common cloud free-tier VMs",[80,10071,2692],{},[11,10073,10075,10079,10082],{"id":10074,"level":14},"step-2-networking",[16,10076,10078],{"id":10077},"virtualbox-configure-networking","VirtualBox: Configure Networking",[80,10080,10081],{},"Use one NAT adapter with port forwarding:",[21,10083,10084,10090,10099,10107,10112],{},[24,10085,10086,10087],{},"VM internet: ",[95,10088,10089],{},"NAT",[24,10091,10092,10093,10096,10097],{},"Host SSH: host ",[95,10094,10095],{},"22"," -> guest ",[95,10098,10095],{},[24,10100,10101,10102,10096,10105],{},"Host browser: host ",[95,10103,10104],{},"3000",[95,10106,8694],{},[24,10108,631,10109,10111],{},[95,10110,8912],{}," from the host computer",[24,10113,10114],{},"See the slides below for adapter and port-forwarding screens",[11,10116,10118,10122,10135],{"id":10117,"level":356},"adapter-settings-screen",[16,10119,10121],{"id":10120},"adapter-settings","Adapter Settings",[21,10123,10124,10127,10132],{},[24,10125,10126],{},"Adapter 1 enabled",[24,10128,10129,10130],{},"Attached to ",[95,10131,10089],{},[24,10133,10134],{},"No second adapter needed for the baseline path",[80,10136,10137],{},[1241,10138],{"alt":10139,"src":10140,"variant":9549},"VirtualBox Adapter 1 configured as NAT","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_adapter_1.png",[11,10142,10144,10148,10176],{"id":10143,"level":356},"port-forwarding-screen",[16,10145,10147],{"id":10146},"port-forwarding","Port Forwarding",[21,10149,10150,10158,10165],{},[24,10151,10152,10153,10155,10156],{},"SSH: host ",[95,10154,10095],{}," to guest ",[95,10157,10095],{},[24,10159,10160,10161,10155,10163],{},"Apache HTTP: host ",[95,10162,10104],{},[95,10164,8694],{},[24,10166,10167,10168,10170,10171,10155,10174],{},"If host ",[95,10169,10095],{}," is already busy, use host ",[95,10172,10173],{},"2222",[95,10175,10095],{},[80,10177,10178],{},[1241,10179],{"alt":10180,"src":10181,"variant":9549},"VirtualBox NAT port forwarding rules","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_adapter_1_ports.png",[11,10183,10185,10189,10192,10195,10198,10201],{"id":10184,"level":14},"step-3-connect-ssh",[16,10186,10188],{"id":10187},"step-3-connect-with-ssh","Step 3: Connect With SSH",[80,10190,10191],{},"Run from your host terminal:",[364,10193],{"language":366,"src":10194},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-3-connect-with-ssh-01.sh",[80,10196,10197],{},"First connection prompt:",[364,10199],{"language":4422,"src":10200},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-3-connect-with-ssh-02.txt",[21,10202,10203,10210,10219,10222,10225],{},[24,10204,10205,10206,10209],{},"Replace ",[95,10207,10208],{},"your_ucid"," with your UCID",[24,10211,10212,10213,10215,10216,10218],{},"Type ",[95,10214,3886],{}," once for this course VM on ",[95,10217,8912],{}," (if prompted like the example above)",[24,10220,10221],{},"Enter your Ubuntu password",[24,10223,10224],{},"After login, commands run inside Ubuntu",[24,10226,10227,682,10230,10233],{},[95,10228,10229],{},"exit",[95,10231,10232],{},"logout"," disconnects from the VM",[11,10235,10237,10241,10244],{"id":10236,"level":14},"step-4-confirm-network",[16,10238,10240],{"id":10239},"step-4-confirm-vm-network","Step 4: Confirm VM Network",[80,10242,10243],{},"Run inside Ubuntu through SSH:",[942,10245,10246,10288],{"gap":944,"left-width":3012,"right-width":945,"stack":2468},[947,10247,10248,10251,10254],{"v-slot:left":949},[80,10249,10250],{},"Network check:",[364,10252],{"language":366,"src":10253},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-4-confirm-vm-networ-03.sh",[21,10255,10256,10262,10268,10274,10280],{},[24,10257,10258,10261],{},[95,10259,10260],{},"ping",": confirms basic network access",[24,10263,10264,10267],{},[95,10265,10266],{},"-c 4",": stop after four replies",[24,10269,10270,10273],{},[95,10271,10272],{},"apt update",": refreshes package indexes",[24,10275,10276,10279],{},[95,10277,10278],{},"apt upgrade",": applies available package updates",[24,10281,2929,10282,10284,10285],{},[95,10283,10260],{}," is not found, run ",[95,10286,10287],{},"sudo apt install iputils-ping",[947,10289,10290,10293,10296],{"v-slot:right":949},[80,10291,10292],{},"Port-forwarding check:",[364,10294],{"language":366,"src":10295},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fslide-id-summary-level-2-04.sh",[21,10297,10298,10303,10306,10310],{},[24,10299,10300,10301],{},"The VM may show ",[95,10302,9736],{},[24,10304,10305],{},"That is normal for VirtualBox NAT",[24,10307,631,10308,10111],{},[95,10309,8912],{},[24,10311,10312],{},"Port forwarding routes host traffic into the VM",[11,10314,10316,10320],{"id":10315,"level":14},"step-5-shared-folder",[16,10317,10319],{"id":10318},"step-5-enable-shared-folder","Step 5: Enable Shared Folder",[942,10321,10322,10356],{"gap":944,"left-width":2467,"right-width":3012,"stack":2468},[947,10323,10324,10327],{"v-slot:left":949},[80,10325,10326],{},"In VirtualBox:",[21,10328,10329,10332,10335,10338,10341,10344,10347,10350,10353],{},[24,10330,10331],{},"Open VM settings",[24,10333,10334],{},"Choose Shared Folders",[24,10336,10337],{},"Folder Path: your cloned course repository folder",[24,10339,10340],{},"Folder Name: a simple repo name with no spaces",[24,10342,10343],{},"Mount Point: leave blank",[24,10345,10346],{},"Read-only: off",[24,10348,10349],{},"Auto-mount: on",[24,10351,10352],{},"Make Machine-permanent: on",[24,10354,10355],{},"Make Global: off",[947,10357,10358],{"v-slot:right":949},[80,10359,10360],{},[1241,10361],{"alt":10362,"src":10363,"variant":1245},"VirtualBox shared folder settings with the course repo selected","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_shared_folder.png",[11,10365,10367,10371,10374,10377],{"id":10366,"level":14},"step-6-guest-additions",[16,10368,10370],{"id":10369},"step-6-install-shared-folder-support","Step 6: Install Shared Folder Support",[80,10372,10373],{},"Run inside Ubuntu:",[364,10375],{"language":366,"src":10376},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-6-install-shared-fo-05.sh",[21,10378,10379,10386,10392],{},[24,10380,3119,10381,3085,10383,10385],{},[95,10382,10272],{},[95,10384,10278],{}," first only if you skipped the Step 4 updates",[24,10387,10388,10391],{},[95,10389,10390],{},"virtualbox-guest-utils",": VirtualBox shared-folder support",[24,10393,10394],{},"Reboot after the group step on the next slide",[11,10396,10398,10402,10405,10408],{"id":10397,"level":356},"step-6b-confirm-vboxsf",[16,10399,10401],{"id":10400},"step-61-check-the-shared-folder","Step 6.1: Check The Shared Folder",[80,10403,10404],{},"Reconnect with SSH, then run inside Ubuntu:",[364,10406],{"language":366,"src":10407},"\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",[21,10409,10410,10416,10422],{},[24,10411,10412,10415],{},[95,10413,10414],{},"ls \u002Fmedia",": shows available mounted folders",[24,10417,10418,10421],{},[95,10419,10420],{},"ls \u002Fmedia\u002F\u003Cshared-folder>",": checks your course repo share",[24,10423,10424],{},"Permission denied is common the first time",[11,10426,10428,10432,10435,10438],{"id":10427,"level":14},"step-7-locate-share",[16,10429,10431],{"id":10430},"step-7-allow-shared-folder-access","Step 7: Allow Shared Folder Access",[80,10433,10434],{},"If the shared folder exists but says permission denied:",[364,10436],{"language":366,"src":10437},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-7-allow-shared-fold-07.sh",[21,10439,10440,10446,10452],{},[24,10441,10442,10445],{},[95,10443,10444],{},"vboxsf",": group allowed to read VirtualBox shared folders",[24,10447,10448,10451],{},[95,10449,10450],{},"$USER",": your Ubuntu login user for terminal access",[24,10453,10454],{},"Reboot applies the shared-folder support and new group membership",[11,10456,10458,10462,10464,10467,10484,10487],{"id":10457,"level":356},"step-7b-locate-share",[16,10459,10461],{"id":10460},"step-71-locate-the-shared-repo","Step 7.1: Locate The Shared Repo",[80,10463,10404],{},[364,10465],{"language":366,"src":10466},"\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",[21,10468,10469,10475,10481],{},[24,10470,10471,10474],{},[95,10472,10473],{},"\u002Fmedia",": VirtualBox auto-mounted shared folders",[24,10476,10477,10480],{},[95,10478,10479],{},"\u003Cshared-folder>",": your shared course repo folder name",[24,10482,10483],{},"Use the folder that points to your repository",[80,10485,10486],{},"Expected repo folders:",[21,10488,10489,10493,10497,10501],{},[24,10490,10491],{},[95,10492,302],{},[24,10494,10495],{},[95,10496,6289],{},[24,10498,10499],{},[95,10500,6292],{},[24,10502,10503],{},[95,10504,6295],{},[11,10506,10508,10512,10527],{"id":10507,"level":356},"step-7-2-shared-folder-check",[16,10509,10511],{"id":10510},"step-72-shared-folder-check","Step 7.2: Shared Folder Check",[21,10513,10514,10517,10524],{},[24,10515,10516],{},"Edit a small file from VS Code on host",[24,10518,3119,10519,682,10521,10523],{},[95,10520,291],{},[95,10522,514],{}," inside Ubuntu",[24,10525,10526],{},"Confirm Ubuntu sees the same file content",[80,10528,10529],{},"If the file does not match, stop and fix the share before Apache setup",[11,10531,10533,10537,10539,10542],{"id":10532,"level":14},"step-8-install-apache-php-mysql",[16,10534,10536],{"id":10535},"step-8-install-apache-php-and-mysql","Step 8: Install Apache, PHP, And MySQL",[80,10538,10373],{},[364,10540],{"language":366,"src":10541},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-8-install-apache-ph-09.sh",[21,10543,10544,10550,10555,10561,10567,10573],{},[24,10545,10546,10549],{},[95,10547,10548],{},"apache2",": web server",[24,10551,10552,10554],{},[95,10553,6082],{},": PHP runtime",[24,10556,10557,10560],{},[95,10558,10559],{},"libapache2-mod-php",": lets Apache execute PHP files",[24,10562,10563,10566],{},[95,10564,10565],{},"mysql-server",": local MySQL database server",[24,10568,10569,10572],{},[95,10570,10571],{},"php-mysql",": lets PHP connect to MySQL",[24,10574,3119,10575,3085,10577,10579],{},[95,10576,10272],{},[95,10578,10278],{}," first only if they have not been run recently",[11,10581,10583,10587,10594],{"id":10582,"level":356},"optional-swap-check",[16,10584,10586],{"id":10585},"optional-add-swap-if-swap-is-off","Optional: Add Swap If Swap Is Off",[80,10588,10589,10590,10593],{},"Ubuntu usually has swap already. Only add this if ",[95,10591,10592],{},"swapon --show"," prints nothing.",[942,10595,10596,10610],{"gap":944,"left-width":945,"right-width":945},[947,10597,10598,10601,10604,10607],{"v-slot:left":949},[80,10599,10600],{},"Check first:",[364,10602],{"language":366,"src":10603},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-add-swap-if-swa-10.sh",[80,10605,10606],{},"Add a small swap file only if swap is off:",[364,10608],{"language":366,"src":10609},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-add-swap-if-swa-11.sh",[947,10611,10612],{"v-slot:right":949},[21,10613,10614,10617,10622,10625],{},[24,10615,10616],{},"Swap gives Ubuntu emergency disk-backed memory",[24,10618,10619,10620],{},"It helps when installs or MySQL briefly need more than ",[95,10621,9215],{},[24,10623,10624],{},"It is slower than RAM, so it is not a performance upgrade",[24,10626,10627],{},"Do not run the setup again if swap already exists",[11,10629,10631,10635,10641],{"id":10630,"level":356},"optional-apache-low-memory",[16,10632,10634],{"id":10633},"optional-limit-apache-memory-use","Optional: Limit Apache Memory Use",[80,10636,10637,10638,10640],{},"Use this if the ",[95,10639,9215],{}," VM feels unstable or Apache starts too many PHP workers.",[942,10642,10643,10656],{"gap":944,"left-width":945,"right-width":945},[947,10644,10645,10648,10653],{"v-slot:left":949},[80,10646,10647],{},"Edit Apache prefork settings in:",[80,10649,10650],{},[95,10651,10652],{},"\u002Fetc\u002Fapache2\u002Fmods-available\u002Fmpm_prefork.conf",[364,10654],{"language":366,"src":10655},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-apache-me-12.sh",[947,10657,10658,10661,10665],{"v-slot:right":949},[80,10659,10660],{},"Change the existing values to:",[364,10662],{"language":10663,"src":10664},"apache","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-apache-me-13.txt",[21,10666,10667,10673,10676,10683],{},[24,10668,10669,10670],{},"Edit the existing lines inside ",[95,10671,10672],{},"\u003CIfModule mpm_prefork_module>",[24,10674,10675],{},"If a line is missing, add it inside that same block",[24,10677,10678,10679,10682],{},"Do not paste a second ",[95,10680,10681],{},"\u003CIfModule>"," block",[24,10684,10685],{},"Restart Apache after config changes",[11,10687,10689,10693,10699],{"id":10688,"level":356},"optional-mysql-low-memory",[16,10690,10692],{"id":10691},"optional-limit-mysql-memory-use","Optional: Limit MySQL Memory Use",[80,10694,10695,10696,10698],{},"Use this only if MySQL struggles on the ",[95,10697,9215],{}," VM.",[942,10700,10701,10714],{"gap":944,"left-width":945,"right-width":945},[947,10702,10703,10706,10711],{"v-slot:left":949},[80,10704,10705],{},"Edit MySQL server settings in:",[80,10707,10708],{},[95,10709,10710],{},"\u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf",[364,10712],{"language":366,"src":10713},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-mysql-mem-14.sh",[947,10715,10716,10722,10725],{"v-slot:right":949},[80,10717,10718,10719,740],{},"Add or edit these under ",[95,10720,10721],{},"[mysqld]",[364,10723],{"language":6889,"src":10724},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-mysql-mem-15.txt",[21,10726,10727,10733,10738,10741],{},[24,10728,10729,10730,10732],{},"Keep these under the existing ",[95,10731,10721],{}," heading",[24,10734,10735,10736,10732],{},"Do not create a second ",[95,10737,10721],{},[24,10739,10740],{},"If either setting already exists, edit it instead of adding a duplicate",[24,10742,10743],{},"Restart MySQL after config changes",[11,10745,10747,10750,10753,10756],{"id":10746,"level":356},"low-memory-diagnostics",[16,10748,10749],{"id":10746},"Low Memory Diagnostics",[80,10751,10752],{},"Run these after the minor tuning checks:",[364,10754],{"language":366,"src":10755},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Flow-memory-diagnostics-10.sh",[21,10757,10758,10764,10769,10775,10782],{},[24,10759,10760,10763],{},[95,10761,10762],{},"free -h",": shows RAM and swap",[24,10765,10766,10768],{},[95,10767,10592],{},": confirms whether swap is active",[24,10770,10771,10774],{},[95,10772,10773],{},"systemctl status",": checks whether Apache and MySQL are running",[24,10776,10777,10778,10781],{},"No output from the ",[95,10779,10780],{},"grep"," line is usually good",[24,10783,10784],{},"Do not tune randomly; change one setting, restart, then retest",[11,10786,10788,10792,10794,10797,10800,10803],{"id":10787,"level":14},"step-9-create-local-mysql-db",[16,10789,10791],{"id":10790},"step-9-create-a-local-mysql-database","Step 9: Create A Local MySQL Database",[80,10793,10373],{},[364,10795],{"language":366,"src":10796},"\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",[80,10798,10799],{},"Then run in the MySQL prompt:",[364,10801],{"language":6295,"src":10802},"\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",[21,10804,10805,10809,10812],{},[24,10806,10205,10807,10209],{},[95,10808,10208],{},[24,10810,10811],{},"Database name and username should match your UCID",[24,10813,10814],{},"Password is local-only unless your instructor says otherwise",[11,10816,10818,10821,10824,10837,10840,10846],{"id":10817,"level":14},"local-vs-remote-database",[16,10819,10820],{"id":10817},"Local Vs Remote Database",[80,10822,10823],{},"This MySQL database is only for local testing:",[21,10825,10826,10830,10832,10834],{},[24,10827,5556,10828],{},[95,10829,8912],{},[24,10831,5571],{},[24,10833,5568],{},[24,10835,10836],{},"Password: your local password",[80,10838,10839],{},"Render uses the instructor-provided remote database connection string",[80,10841,10842,10843],{},"Get that string from ",[132,10844,5582],{"href":5582,"rel":10845},[993],[80,10847,10848],{},"After this lesson, you may optionally point local code at that remote database for extra testing",[11,10850,10852,10856,10858,10861,10863,10866,10869],{"id":10851,"level":14},"step-10-confirm-local-mysql",[16,10853,10855],{"id":10854},"step-10-confirm-local-mysql-login","Step 10: Confirm Local MySQL Login",[80,10857,10373],{},[364,10859],{"language":366,"src":10860},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-10-confirm-local-my-13.sh",[80,10862,5068],{},[364,10864],{"language":6295,"src":10865},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-10-confirm-local-my-14.sql",[80,10867,10868],{},"Expected:",[21,10870,10871,10877],{},[24,10872,10873,10876],{},[95,10874,10875],{},"SELECT DATABASE()"," returns your UCID",[24,10878,10879,10882],{},[95,10880,10881],{},"SHOW TABLES"," is empty or shows starter tables later",[11,10884,10886,10892,10895,10898,10901],{"id":10885,"level":14},"step-11-documentroot",[16,10887,10889,10890],{"id":10888},"step-11-point-apache-at-public_html","Step 11: Point Apache At ",[95,10891,302],{},[80,10893,10894],{},"Apache should serve:",[364,10896],{"language":4422,"src":10897},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-11-point-apache-at--15.txt",[80,10899,10900],{},"Do not serve the whole repo",[21,10902,10903,10912],{},[24,10904,10905,98,10907,102,10909,10911],{},[95,10906,6289],{},[95,10908,6292],{},[95,10910,6295],{}," stay outside the web root",[24,10913,10914,10916],{},[95,10915,302],{}," is the browser-facing folder",[11,10918,10920,10924,10927,10932,10934,10939,10942,10945],{"id":10919,"level":356},"apache-site-config",[16,10921,10923],{"id":10922},"step-111-apache-site-config","Step 11.1: Apache Site Config",[80,10925,10926],{},"Create or edit this Apache site config file inside Ubuntu:",[80,10928,10929],{},[95,10930,10931],{},"\u002Fetc\u002Fapache2\u002Fsites-available\u002Fit202.conf",[80,10933,362],{},[80,10935,10936],{},[95,10937,10938],{},"sudo nano \u002Fetc\u002Fapache2\u002Fsites-available\u002Fit202.conf",[80,10940,10941],{},"Add this content to that file:",[364,10943],{"language":10663,"src":10944},"\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",[21,10946,10947,10952,10958,10963],{},[24,10948,10205,10949,10951],{},[95,10950,10479],{}," with the actual shared folder name",[24,10953,10954,10955],{},"Save the file as ",[95,10956,10957],{},"it202.conf",[24,10959,10960,10961],{},"Apache listens on guest port ",[95,10962,8694],{},[24,10964,10965,10966],{},"Host browser reaches it through ",[95,10967,8770],{},[11,10969,10971,10975,10977,10980],{"id":10970,"level":356},"enable-site",[16,10972,10974],{"id":10973},"step-112-enable-the-site","Step 11.2: Enable The Site",[80,10976,10373],{},[364,10978],{"language":366,"src":10979},"\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",[21,10981,10982,10988,10994,11000,11008,11014],{},[24,10983,10984,10987],{},[95,10985,10986],{},"a2ensite",": enable a site config",[24,10989,10990,10993],{},[95,10991,10992],{},"a2dissite",": disable a site config",[24,10995,10996,10999],{},[95,10997,10998],{},"www-data",": Apache's user for browser requests",[24,11001,11002,11003,7042,11005,11007],{},"Adding ",[95,11004,10998],{},[95,11006,10444],{}," lets Apache read the shared folder",[24,11009,11010,11013],{},[95,11011,11012],{},"configtest",": check syntax before reload",[24,11015,11016,11019],{},[95,11017,11018],{},"restart",": applies the Apache user group change",[11,11021,11023,11027,11030,11033,11036],{"id":11022,"level":14},"step-12-php-check-page",[16,11024,11026],{"id":11025},"step-12-create-a-php-check-page","Step 12: Create A PHP Check Page",[80,11028,11029],{},"Create this file on the host:",[364,11031],{"language":4422,"src":11032},"\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",[80,11034,11035],{},"Example content:",[364,11037],{"language":6082,"src":11038},"\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,11040,11042,11045,11048,11051,11053],{"id":11041,"level":14},"final-browser-check",[16,11043,11044],{"id":11041},"Final Browser Check",[80,11046,11047],{},"Open from host browser:",[364,11049],{"language":4422,"src":11050},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Ffinal-browser-check-20.txt",[80,11052,10868],{},[21,11054,11055,11058,11061,11064],{},[24,11056,11057],{},"Message appears",[24,11059,11060],{},"Time appears",[24,11062,11063],{},"PHP code is not shown as raw text",[24,11065,11066],{},"Editing the file on host changes output after refresh",[11,11068,11070,11073],{"id":11069,"level":14},"common-problems",[16,11071,11072],{"id":11069},"Common Problems",[21,11074,11075,11078,11081,11086,11089,11102,11112],{},[24,11076,11077],{},"Browser timeout: missing or wrong port-forwarding rule",[24,11079,11080],{},"Connection refused: Apache not running",[24,11082,11083,11084],{},"No internet in VM: check Adapter 1 is still ",[95,11085,10089],{},[24,11087,11088],{},"Shared folder missing: check Auto-mount and guest utilities",[24,11090,11091,11092,11095,11096,11098,11099,11101],{},"Browser shows ",[95,11093,11094],{},"403 Forbidden",": confirm ",[95,11097,10998],{}," is in ",[95,11100,10444],{},", then restart Apache or reboot",[24,11103,11104,11105,11108,11109,11111],{},"Permission denied on ",[95,11106,11107],{},"\u002Fmedia\u002Fsf_...",": confirm your Ubuntu user is in ",[95,11110,10444],{}," and reboot",[24,11113,11114],{},"Raw PHP code: PHP module not running through Apache",[11,11116,11118,11121,11124],{"id":11117,"level":14},"recovery-routine",[16,11119,11120],{"id":11117},"Recovery Routine",[80,11122,11123],{},"Check in this order:",[337,11125,11126,11129,11135,11141,11146,11154,11161,11167,11172,11181],{},[24,11127,11128],{},"VM is running",[24,11130,11131,11134],{},[95,11132,11133],{},"ping github.com"," works inside Ubuntu",[24,11136,11137,11140],{},[95,11138,11139],{},"ssh username@localhost"," works from host",[24,11142,11143,11145],{},[95,11144,10420],{}," shows the shared repo",[24,11147,11148,11151,11152],{},[95,11149,11150],{},"groups"," includes ",[95,11153,10444],{},[24,11155,11156,11151,11159],{},[95,11157,11158],{},"id www-data",[95,11160,10444],{},[24,11162,11163,11166],{},[95,11164,11165],{},"sudo systemctl status apache2"," is active",[24,11168,11169,11166],{},[95,11170,11171],{},"sudo systemctl status mysql",[24,11173,11174,11177,11178],{},[95,11175,11176],{},"sudo apache2ctl configtest"," says ",[95,11179,11180],{},"Syntax OK",[24,11182,11183,11186],{},[95,11184,11185],{},"http:\u002F\u002Flocalhost:3000\u002Fsystem\u002Fvm-check.php"," loads from the host browser",[11,11188,11189,11191],{"id":939,"level":14},[16,11190,940],{"id":939},[942,11192,11193,11234],{"gap":944,"left-width":945,"right-width":945},[947,11194,11195,11197,11203,11212,11217,11223,11229],{"v-slot:left":949},[500,11196,953],{"id":952},[80,11198,11199,11202],{},[163,11200,11201],{},"VM"," - separate computer running inside your host computer",[80,11204,11205,11208,11209,11211],{},[163,11206,11207],{},"Port forwarding"," - host ",[95,11210,8912],{}," traffic routed into the VM",[80,11213,11214,11216],{},[163,11215,10444],{}," - VirtualBox shared-folder permission group",[80,11218,11219,11222],{},[163,11220,11221],{},"Guest utilities"," - VirtualBox tools that help shared folders work inside Ubuntu",[80,11224,11225,11228],{},[163,11226,11227],{},"DocumentRoot"," - folder Apache serves to browsers",[80,11230,11231,11233],{},[163,11232,10089],{}," - VM network mode that gives the VM outbound internet access",[947,11235,11236,11238],{"v-slot:right":949},[500,11237,984],{"id":936},[21,11239,11240,11246,11253,11260,11267,11274,11280],{},[24,11241,11242],{},[132,11243,11245],{"href":8836,"rel":11244},[993],"VirtualBox Downloads",[24,11247,11248],{},[132,11249,11252],{"href":11250,"rel":11251},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002FIntroduction.html",[993],"VirtualBox Manual: Host And Guest Combinations",[24,11254,11255],{},[132,11256,11259],{"href":11257,"rel":11258},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Finstallation.html",[993],"VirtualBox Manual: Installation",[24,11261,11262],{},[132,11263,11266],{"href":11264,"rel":11265},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Fsharedfolders.html",[993],"VirtualBox Manual: Shared Folders",[24,11268,11269],{},[132,11270,11273],{"href":11271,"rel":11272},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Fnetworkingdetails.html#network_nat_service",[993],"VirtualBox Manual: NAT Port Forwarding",[24,11275,11276],{},[132,11277,11279],{"href":8854,"rel":11278},[993],"Ubuntu Server: Installer",[24,11281,11282],{},[132,11283,11286],{"href":11284,"rel":11285},"https:\u002F\u002Fdocumentation.ubuntu.com\u002Fserver\u002Fhow-to\u002Fsecurity\u002Fopenssh-server\u002F",[993],"Ubuntu Server: OpenSSH Server",[11,11288,11289,11291,11293],{"id":1011,"level":14},[16,11290,1014],{"id":1011},[80,11292,1017],{},[21,11294,11295,11298,11301,11304,11307,11312],{},[24,11296,11297],{},"Pick the correct Ubuntu ISO for your host CPU",[24,11299,11300],{},"Configure NAT port forwarding",[24,11302,11303],{},"Connect to Ubuntu with SSH",[24,11305,11306],{},"Find the VirtualBox shared repo",[24,11308,11309,11310],{},"Configure Apache to serve ",[95,11311,302],{},[24,11313,11314],{},"Create a local MySQL database and user named after your UCID",{"title":949,"searchDepth":1059,"depth":1059,"links":11316},[11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11375,11376,11377,11378,11379,11380,11381,11382],{"id":8716,"depth":1059,"text":8708},{"id":8742,"depth":1059,"text":8745},{"id":8787,"depth":1059,"text":8790},{"id":114,"depth":1059,"text":117},{"id":8892,"depth":1059,"text":8895},{"id":8927,"depth":1059,"text":8928},{"id":8951,"depth":1059,"text":8954},{"id":8983,"depth":1059,"text":8986},{"id":9009,"depth":1059,"text":9012},{"id":9038,"depth":1059,"text":9041},{"id":9070,"depth":1059,"text":9071},{"id":9094,"depth":1059,"text":9097},{"id":9125,"depth":1059,"text":9128},{"id":9156,"depth":1059,"text":9157},{"id":9192,"depth":1059,"text":9193},{"id":9254,"depth":1059,"text":9257},{"id":9289,"depth":1059,"text":9292},{"id":9335,"depth":1059,"text":9338},{"id":9378,"depth":1059,"text":9381},{"id":9422,"depth":1059,"text":9425},{"id":9472,"depth":1059,"text":9473},{"id":9535,"depth":1059,"text":9536},{"id":9571,"depth":1059,"text":9572},{"id":9606,"depth":1059,"text":9607},{"id":9643,"depth":1059,"text":9644},{"id":9676,"depth":1059,"text":9677},{"id":9713,"depth":1059,"text":9714},{"id":9746,"depth":1059,"text":9747},{"id":9776,"depth":1059,"text":9777},{"id":9806,"depth":1059,"text":9807},{"id":9836,"depth":1059,"text":9837},{"id":9866,"depth":1059,"text":9867},{"id":9896,"depth":1059,"text":9897},{"id":9930,"depth":1059,"text":9931},{"id":9962,"depth":1059,"text":9963},{"id":9994,"depth":1059,"text":9995},{"id":10026,"depth":1059,"text":10027},{"id":10077,"depth":1059,"text":10078},{"id":10120,"depth":1059,"text":10121},{"id":10146,"depth":1059,"text":10147},{"id":10187,"depth":1059,"text":10188},{"id":10239,"depth":1059,"text":10240},{"id":10318,"depth":1059,"text":10319},{"id":10369,"depth":1059,"text":10370},{"id":10400,"depth":1059,"text":10401},{"id":10430,"depth":1059,"text":10431},{"id":10460,"depth":1059,"text":10461},{"id":10510,"depth":1059,"text":10511},{"id":10535,"depth":1059,"text":10536},{"id":10585,"depth":1059,"text":10586},{"id":10633,"depth":1059,"text":10634},{"id":10691,"depth":1059,"text":10692},{"id":10746,"depth":1059,"text":10749},{"id":10790,"depth":1059,"text":10791},{"id":10817,"depth":1059,"text":10820},{"id":10854,"depth":1059,"text":10855},{"id":10888,"depth":1059,"text":11374},"Step 11: Point Apache At public_html",{"id":10922,"depth":1059,"text":10923},{"id":10973,"depth":1059,"text":10974},{"id":11025,"depth":1059,"text":11026},{"id":11041,"depth":1059,"text":11044},{"id":11069,"depth":1059,"text":11072},{"id":11117,"depth":1059,"text":11120},{"id":939,"depth":1059,"text":940},{"id":1011,"depth":1059,"text":1014},"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":8708,"description":11383},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox",[11393,11394,10663,11395,11396],"virtualbox","ubuntu","mysql","vm","1:06:16","ArTDIgihfd4","https:\u002F\u002Fyoutu.be\u002FArTDIgihfd4","IT202 VirtualBox and VM Setup","CNlzYvIiYNPSzbQ6tvCdcnJLlvvGSGmurOGWR_mSnms",[],1780581680958]