[{"data":1,"prerenderedAt":11423},["ShallowReactive",2],{"content-page:\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh":3,"content-page-quiz:none":1166,"book-module-total-pages":1167,"content-section-pages:\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F":1168,"content-directory-pages:\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh":11422},{"id":4,"title":5,"audience":6,"body":7,"contentType":1139,"course":1140,"description":1141,"estimateBasis":1142,"estimatedDiscussionMinutes":1143,"estimatedLiveMinutes":1144,"estimatedTotalMinutes":1145,"extension":1146,"meta":1147,"module":1148,"navigation":1149,"order":1150,"path":1151,"promptAssist":1152,"seo":1153,"status":1154,"stem":1155,"tags":1156,"videoDuration":1161,"videoId":1162,"videoLink":1163,"videoTitle":1164,"week":1148,"__hash__":1165},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh.md","Set Up GitHub SSH","student",{"type":8,"value":9,"toc":1109},"minimark",[10,41,62,87,100,137,176,256,307,375,454,496,523,559,597,643,677,747,749,752,763,835,865,899,949,998,1074],[11,12,15,19],"slide",{"id":13,"level":14},"goals","2",[16,17,18],"h2",{"id":13},"Goals",[20,21,22,26,29,32,35,38],"ul",{},[23,24,25],"li",{},"Confirm Git works in the correct terminal",[23,27,28],{},"Sign in to GitHub with a school or personal account",[23,30,31],{},"Create or reuse an SSH key for GitHub",[23,33,34],{},"Add the public key to GitHub",[23,36,37],{},"Create and clone your course repository",[23,39,40],{},"Set Git identity inside the cloned repository",[11,42,44,47,58],{"id":43,"level":14},"terminal-by-os",[16,45,46],{"id":43},"Terminal By OS",[20,48,49,52,55],{},[23,50,51],{},"Windows: Git Bash",[23,53,54],{},"Apple macOS: Terminal or iTerm2",[23,56,57],{},"Linux: Terminal",[59,60,61],"p",{},"Run these commands on your own computer",[11,63,65,68],{"id":64,"level":14},"git-and-ssh-terms",[16,66,67],{"id":64},"Git And SSH Terms",[20,69,70,73,81,84],{},[23,71,72],{},"Git identity: name and email attached to commits in a repository",[23,74,75,76],{},"SSH key pair: private key stays on your computer, public key goes to GitHub\n",[20,77,78],{},[23,79,80],{},"This is how we'll authenticate to GitHub",[23,82,83],{},"SSH agent: helper that keeps your private key available to Git commands",[23,85,86],{},"Clone: local folder connected to a GitHub repository",[11,88,90,93,97],{"id":89,"level":14},"ssh-key-flow",[16,91,92],{"id":89},"SSH Key Flow",[94,95],"mermaid",{"code":96},"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",[59,98,99],{},"GitHub receives only the public key. The private key stays on your computer",[11,101,103,106],{"id":102,"level":14},"step-1-check-git",[16,104,105],{"id":102},"Step 1: Check Git",[107,108,111,124],"two-col",{"gap":109,"left-width":110,"right-width":110},"lg","1fr",[112,113,115,118],"template",{"v-slot:left":114},"",[59,116,117],{},"Run:",[119,120],"code-snippet",{"label":121,"language":122,"src":123},"check-git.sh","bash","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fstep-1-check-git-01.sh",[112,125,126,129,134],{"v-slot:right":114},[59,127,128],{},"Expected output:",[119,130],{"label":131,"language":132,"src":133},"example-output.txt","plaintext","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-02.txt",[59,135,136],{},"A valid version means Git is installed and available in this terminal",[11,138,140,144],{"id":139,"level":14},"step-2-github-account",[16,141,143],{"id":142},"step-2-sign-in-to-github","Step 2: Sign In To GitHub",[107,145,147,166],{"gap":109,"left-width":110,"right-width":146},"0.8fr",[112,148,149],{"v-slot:left":114},[20,150,151,154,157,160,163],{},[23,152,153],{},"Use an existing GitHub account or create one",[23,155,156],{},"School email recommended for course identity",[23,158,159],{},"Personal email is fine if you prefer it",[23,161,162],{},"Avoid work email so course access does not depend on an employer account",[23,164,165],{},"Confirm you can open GitHub Settings before continuing",[112,167,168],{"v-slot:right":114},[59,169,170],{},[171,172],"img",{"alt":173,"src":174,"variant":175},"GitHub account menu open with Settings visible","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fgithub-logged-in.png","sidecar-screenshot",[11,177,179,183],{"id":178,"level":14},"step-2-create-repo",[16,180,182],{"id":181},"step-3-create-course-repository","Step 3: Create Course Repository",[107,184,187,248],{"gap":109,"left-width":185,"right-width":186},"0.95fr","1.15fr",[112,188,189,192],{"v-slot:left":114},[59,190,191],{},"In GitHub:",[20,193,194,201,207,213,228,234,237,245],{},[23,195,196,197],{},"Click ",[198,199,200],"code",{},"+",[23,202,203,204],{},"Choose ",[198,205,206],{},"New repository",[23,208,209,210],{},"Name it ",[198,211,212],{},"\u003Cucid>-IT202-\u003Csection>-\u003CsemYear>",[23,214,215,216,219,220,223,224,227],{},"Semester code examples: ",[198,217,218],{},"S2026"," spring, ",[198,221,222],{},"M2026"," summer, ",[198,225,226],{},"F2026"," fall",[23,229,230,231],{},"Set visibility to ",[198,232,233],{},"Private",[23,235,236],{},"Toggle \"Add README\"",[23,238,239,240],{},"Do not toggle \"Add .gitignore\"",[20,241,242],{},[23,243,244],{},"A future lesson will discuss and add this important file",[23,246,247],{},"Do not add starter files unless instructed",[112,249,250],{"v-slot:right":114},[59,251,252],{},[171,253],{"alt":254,"src":255,"variant":175},"GitHub new repository form with course naming pattern, private visibility, and README enabled","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fnew-repo.png",[11,257,259,263,291],{"id":258,"level":14},"step-3-check-existing-key",[16,260,262],{"id":261},"step-4-check-for-existing-ssh-key","Step 4: Check For Existing SSH Key",[107,264,265,273],{"gap":109,"left-width":110,"right-width":110},[112,266,267,269],{"v-slot:left":114},[59,268,117],{},[119,270],{"label":271,"language":122,"src":272},"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",[112,274,275,278,281],{"v-slot:right":114},[59,276,277],{},"Example output:",[119,279],{"label":131,"language":132,"src":280},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-04.txt",[59,282,283,284,287,288],{},"Look for a matching GitHub-specific pair such as ",[198,285,286],{},"github_key"," and ",[198,289,290],{},"github_key.pub",[59,292,293,294,298,299,302,303,306],{},"You can reuse an existing matching pair only if it is ",[295,296,297],"strong",{},"NOT"," a default key such as ",[198,300,301],{},"id_ed25519"," or ",[198,304,305],{},"id_rsa",". Otherwise, create a GitHub-specific key in the next step",[11,308,310,314,316,320,322,325],{"id":309,"level":14},"step-4-create-key-if-needed",[16,311,313],{"id":312},"step-5-create-ssh-key-if-needed","Step 5: Create SSH Key If Needed",[59,315,117],{},[119,317],{"label":318,"language":122,"src":319},"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",[59,321,277],{},[119,323],{"label":131,"language":132,"src":324},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-06.txt",[20,326,327,354,359,364],{},[23,328,329,330],{},"Command flags:\n",[20,331,332,338,344],{},[23,333,334,337],{},[198,335,336],{},"-t"," chooses the key type",[23,339,340,343],{},[198,341,342],{},"-C"," adds a comment label, usually your GitHub email",[23,345,346,349,350,353],{},[198,347,348],{},"-f"," chooses the output file path (must include ",[198,351,352],{},"~\u002F.ssh\u002F"," followed by the file name)",[23,355,356,358],{},[198,357,286],{}," is the private key file",[23,360,361,363],{},[198,362,290],{}," is the public key file for GitHub",[23,365,366,367],{},"Passphrase is optional unless your instructor requires one\n",[20,368,369,372],{},[23,370,371],{},"Pro: protects the key if someone gets the file",[23,373,374],{},"Con: adds an unlock prompt when the key is used",[11,376,378,382,400,434],{"id":377,"level":14},"step-5-start-agent-and-add-key",[16,379,381],{"id":380},"step-6-start-ssh-agent-and-verify-key","Step 6: Start SSH Agent And Verify Key",[107,383,385,393],{"gap":109,"left-width":384,"right-width":110},"1.1fr",[112,386,387,389],{"v-slot:left":114},[59,388,117],{},[119,390],{"label":391,"language":122,"src":392},"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",[112,394,395,397],{"v-slot:right":114},[59,396,277],{},[119,398],{"label":131,"language":132,"src":399},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-08.txt",[20,401,402,408,431],{},[23,403,404,407],{},[198,405,406],{},"eval \"$(ssh-agent -s)\""," starts the SSH helper GitHub docs usually show",[23,409,410,411,414,415,418],{},"If that fails, run ",[198,412,413],{},"exec ssh-agent bash",", then run ",[198,416,417],{},"ssh-add ~\u002F.ssh\u002Fgithub_key",[20,419,420],{},[23,421,422,423,426,427,430],{},"Use ",[198,424,425],{},"~\u002F.ssh\u002Fgithub_key"," because ",[198,428,429],{},"~"," avoids issues with spaces in home directory paths",[23,432,433],{},"Then verify the key is loaded",[107,435,436,444],{"gap":109,"left-width":110,"right-width":110},[112,437,438,440],{"v-slot:left":114},[59,439,117],{},[119,441],{"label":442,"language":122,"src":443},"verify-loaded-key.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fverify-loaded-key-09.sh",[112,445,446,448,451],{"v-slot:right":114},[59,447,128],{},[119,449],{"label":131,"language":132,"src":450},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-10.txt",[59,452,453],{},"One loaded key is enough for this lesson",[11,455,457,461,478],{"id":456,"level":14},"step-6-copy-public-key",[16,458,460],{"id":459},"step-7-copy-public-key","Step 7: Copy Public Key",[107,462,463,471],{"gap":109,"left-width":110,"right-width":110},[112,464,465,467],{"v-slot:left":114},[59,466,117],{},[119,468],{"label":469,"language":122,"src":470},"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",[112,472,473,475],{"v-slot:right":114},[59,474,277],{},[119,476],{"label":131,"language":132,"src":477},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-12.txt",[20,479,480,490],{},[23,481,482,483,486,487,489],{},"Copy the full line starting with ",[198,484,485],{},"ssh-ed25519"," and ending with the value you set with ",[198,488,342],{}," earlier",[23,491,492,493,495],{},"Do not copy ",[198,494,286],{},", which is the private key (never share the private key)",[11,497,499,503],{"id":498,"level":14},"step-7-add-key-to-github",[16,500,502],{"id":501},"step-8-add-key-to-github","Step 8: Add Key To GitHub",[20,504,505,508,514,517,520],{},[23,506,507],{},"In GitHub, open account settings",[23,509,510,511],{},"Go to ",[198,512,513],{},"SSH and GPG keys",[23,515,516],{},"Add a new authentication key",[23,518,519],{},"Paste the public key from the previous step",[23,521,522],{},"See the slides below for the GitHub screens",[11,524,527,532],{"id":525,"level":526},"step-8-open-github-settings","3",[528,529,531],"h3",{"id":530},"open-github-settings","Open GitHub Settings",[107,533,536,544],{"gap":109,"left-width":384,"right-width":534,"stack":535},"0.9fr","never",[112,537,538],{"v-slot:left":114},[59,539,540],{},[171,541],{"alt":542,"src":543,"variant":175},"GitHub profile menu with Settings highlighted","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fssh-key-01-gh-menu.png",[112,545,546],{"v-slot:right":114},[20,547,548,551,556],{},[23,549,550],{},"Click your GitHub profile photo",[23,552,203,553],{},[198,554,555],{},"Settings",[23,557,558],{},"Use the account menu, not the repository settings",[11,560,562,566],{"id":561,"level":526},"step-8-open-ssh-keys-page",[528,563,565],{"id":564},"open-ssh-and-gpg-keys","Open SSH And GPG Keys",[107,567,568,576],{"gap":109,"left-width":384,"right-width":534,"stack":535},[112,569,570],{"v-slot:left":114},[59,571,572],{},[171,573],{"alt":574,"src":575,"variant":175},"GitHub settings sidebar with SSH and GPG keys selected","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fssh-key-02-gh-ssh-link.png",[112,577,578],{"v-slot:right":114},[20,579,580,587,592],{},[23,581,582,583,586],{},"Find the ",[198,584,585],{},"Access"," section",[23,588,589,590],{},"Open ",[198,591,513],{},[23,593,203,594],{},[198,595,596],{},"New SSH key",[11,598,600,604],{"id":599,"level":526},"step-8-add-new-ssh-key",[528,601,603],{"id":602},"add-new-ssh-key","Add New SSH Key",[107,605,608,616],{"gap":109,"left-width":606,"right-width":607,"stack":535},"1.35fr","0.85fr",[112,609,610],{"v-slot:left":114},[59,611,612],{},[171,613],{"alt":614,"src":615,"variant":175},"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",[112,617,618],{"v-slot:right":114},[20,619,620,626,632,635,640],{},[23,621,622,623],{},"Title it clearly, such as ",[198,624,625],{},"\u003Ccourse> Laptop",[23,627,628,629],{},"Keep key type as ",[198,630,631],{},"Authentication Key",[23,633,634],{},"Paste the full public key line",[23,636,196,637],{},[198,638,639],{},"Add SSH key",[23,641,642],{},"Never paste the private key",[11,644,646,650],{"id":645,"level":14},"step-8-test-auth",[16,647,649],{"id":648},"step-9-test-github-ssh-access","Step 9: Test GitHub SSH Access",[107,651,652,667],{"gap":109,"left-width":110,"right-width":384},[112,653,654,656,660],{"v-slot:left":114},[59,655,117],{},[119,657],{"label":658,"language":122,"src":659},"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",[59,661,662,663,666],{},"If prompted the first time, type ",[198,664,665],{},"yes"," to trust GitHub's host key",[112,668,669,671,674],{"v-slot:right":114},[59,670,128],{},[119,672],{"label":131,"language":132,"src":673},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-14.txt",[59,675,676],{},"This confirms authentication, then GitHub closes the connection",[11,678,680,684],{"id":679,"level":14},"step-9-clone-repo",[16,681,683],{"id":682},"step-10-clone-course-repository","Step 10: Clone Course Repository",[107,685,686,727],{"gap":109,"left-width":534,"right-width":384},[112,687,688,692,721],{"v-slot:left":114},[528,689,691],{"id":690},"get-the-ssh-clone-url","Get The SSH Clone URL",[20,693,694,700,707,714],{},[23,695,696,697],{},"In your GitHub repository, click ",[198,698,699],{},"Code",[23,701,702,703,706],{},"Choose the ",[198,704,705],{},"SSH"," tab",[23,708,709,710,713],{},"Copy the ",[198,711,712],{},"git@github.com:..."," link",[23,715,716,717,720],{},"Use that link in the ",[198,718,719],{},"git clone"," command",[59,722,723],{},[171,724],{"alt":725,"src":726,"variant":175},"GitHub repository Code menu with SSH clone URL selected","\u002Fimages\u002Finternet-applications\u002Fgithub-ssh\u002Fgithub-clone-url.png",[112,728,729,732,736],{"v-slot:right":114},[59,730,731],{},"Run from the folder that should contain your course repo:",[119,733],{"label":734,"language":122,"src":735},"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",[737,738,740],"admonition",{"type":739},"tip",[59,741,742,743,746],{},"Before cloning, run ",[198,744,745],{},"git rev-parse --show-toplevel",". If it prints a path, move somewhere else first. Clone this repo only once.",[59,748,277],{},[119,750],{"label":131,"language":132,"src":751},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-16.txt",[59,753,754,755,758,759,762],{},"If you see an empty repository warning, you probably forgot to add ",[198,756,757],{},"README.md"," when creating the repo. Create it with ",[198,760,761],{},"touch README.md",", then use the add\u002Fcommit\u002Fpush commands from the next lesson\n::\n::",[11,764,766,770,789,808,828],{"id":765,"level":14},"step-10-set-repo-identity",[16,767,769],{"id":768},"step-11-set-repo-git-identity","Step 11: Set Repo Git Identity",[107,771,772,781],{"gap":109,"left-width":110,"right-width":110},[112,773,774,777],{"v-slot:left":114},[59,775,776],{},"Run inside the cloned repository:",[119,778],{"label":779,"language":122,"src":780},"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",[112,782,783,785],{"v-slot:right":114},[59,784,128],{},[119,786],{"label":787,"language":132,"src":788},"config-output.txt","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-19.txt",[107,790,791,800],{"gap":109,"left-width":110,"right-width":110},[112,792,793,796],{"v-slot:left":114},[59,794,795],{},"Then verify:",[119,797],{"label":798,"language":122,"src":799},"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",[112,801,802,804],{"v-slot:right":114},[59,803,128],{},[119,805],{"label":806,"language":132,"src":807},"identity-output.txt","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh\u002Fexample-output-20.txt",[20,809,810,816,822],{},[23,811,812,815],{},[198,813,814],{},"user.name"," can be your real or display name, though commonly it's your GitHub username",[23,817,818,821],{},[198,819,820],{},"user.email"," should match a GitHub email or GitHub no-reply address for commit linking to work (this is important)",[23,823,824,827],{},[198,825,826],{},"core.sshCommand"," tells this repository to use your course GitHub key",[59,829,830,831,834],{},"These commands set identity for this repository. The ",[198,832,833],{},"--global"," flag is an option only if you intentionally want the same identity for all repositories",[11,836,838,842,845,862],{"id":837,"level":14},"step-11-invite-collaborators",[16,839,841],{"id":840},"step-12-invite-course-collaborators","Step 12: Invite Course Collaborators",[59,843,844],{},"In GitHub, open your course repository:",[20,846,847,850,856,859],{},[23,848,849],{},"Settings -> Collaborators and teams",[23,851,852,853],{},"Invite ",[198,854,855],{},"MattToegel",[23,857,858],{},"Invite your TA if your section has one",[23,860,861],{},"Wait until the invitation shows as sent or accepted",[59,863,864],{},"This is so it can be accessed for grading and assistance",[11,866,868,871],{"id":867,"level":14},"troubleshooting-auth",[16,869,870],{"id":867},"Troubleshooting Auth",[20,872,873,879,886,893,896],{},[23,874,875,878],{},[198,876,877],{},"Permission denied (publickey)",": GitHub did not accept a loaded key",[23,880,881,882,885],{},"No loaded key in ",[198,883,884],{},"ssh-add -l",": start the agent and add the key again",[23,887,888,889,892],{},"Wrong key in GitHub: delete it and paste the ",[198,890,891],{},".pub"," key again",[23,894,895],{},"Wrong account: make sure the success message names your GitHub account",[23,897,898],{},"See the slide below for a quick reset sequence",[11,900,902,906,908,936],{"id":901,"level":526},"troubleshooting-auth-recovery",[528,903,905],{"id":904},"quick-reset-sequence","Quick Reset Sequence",[59,907,117],{},[909,910,911,915,919,923,928,931],"ol",{},[23,912,913],{},[198,914,406],{},[23,916,917],{},[198,918,417],{},[23,920,921],{},[198,922,884],{},[23,924,925],{},[198,926,927],{},"cat ~\u002F.ssh\u002Fgithub_key.pub",[23,929,930],{},"Re-paste the public key in GitHub if needed",[23,932,933],{},[198,934,935],{},"ssh -T git@github.com",[59,937,938,939,941,942,944,945,948],{},"If ",[198,940,406],{}," fails in Git Bash, use ",[198,943,413],{},", then repeat the ",[198,946,947],{},"ssh-add"," steps",[11,950,952,955,958],{"id":951,"level":14},"quick-check",[16,953,954],{"id":951},"Quick Check",[59,956,957],{},"You are done when all are true:",[20,959,960,966,973,978,981,986,989],{},[23,961,962,965],{},[198,963,964],{},"git --version"," works",[23,967,968,970,971],{},[198,969,884],{}," shows ",[198,972,286],{},[23,974,975,977],{},[198,976,935],{}," names your GitHub account",[23,979,980],{},"Your private course repository exists on GitHub",[23,982,983,985],{},[198,984,855],{}," and your TA, if applicable, are invited as collaborators",[23,987,988],{},"Your local terminal is open to the cloned repository",[23,990,991,287,994,997],{},[198,992,993],{},"git config user.name",[198,995,996],{},"git config user.email"," return your repo identity",[11,999,1001,1005],{"id":1000,"level":14},"further-learning",[16,1002,1004],{"id":1003},"key-terms-and-further-learning","Key Terms And Further Learning",[107,1006,1007,1037],{"gap":109,"left-width":110,"right-width":110},[112,1008,1009,1013,1019,1025,1031],{"v-slot:left":114},[528,1010,1012],{"id":1011},"key-terms","Key Terms",[59,1014,1015,1018],{},[295,1016,1017],{},"Git identity"," - commit name and email saved in repo config",[59,1020,1021,1024],{},[295,1022,1023],{},"SSH key pair"," - private key on your computer, public key in GitHub",[59,1026,1027,1030],{},[295,1028,1029],{},"SSH agent"," - background helper that makes your private key available",[59,1032,1033,1036],{},[295,1034,1035],{},"Clone"," - local copy of a GitHub repository",[112,1038,1039,1042],{"v-slot:right":114},[528,1040,1041],{"id":1000},"Further Learning",[20,1043,1044,1053,1060,1067],{},[23,1045,1046],{},[1047,1048,1052],"a",{"href":1049,"rel":1050},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fauthentication\u002Fconnecting-to-github-with-ssh\u002Fgenerating-a-new-ssh-key-and-adding-it-to-the-ssh-agent",[1051],"nofollow","GitHub Docs: Generate a new SSH key and add it to the ssh-agent",[23,1054,1055],{},[1047,1056,1059],{"href":1057,"rel":1058},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fauthentication\u002Fconnecting-to-github-with-ssh\u002Ftesting-your-ssh-connection",[1051],"GitHub Docs: Testing your SSH connection",[23,1061,1062],{},[1047,1063,1066],{"href":1064,"rel":1065},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fcreating-and-managing-repositories\u002Fcreating-a-new-repository",[1051],"GitHub Docs: Create a repository",[23,1068,1069],{},[1047,1070,1073],{"href":1071,"rel":1072},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fcreating-and-managing-repositories\u002Fcloning-a-repository",[1051],"GitHub Docs: Cloning a repository",[11,1075,1077,1080,1083],{"id":1076,"level":14},"summary",[16,1078,1079],{"id":1076},"Summary",[59,1081,1082],{},"Before leaving this presentation, confirm you can:",[20,1084,1085,1088,1091,1094,1097,1100,1106],{},[23,1086,1087],{},"Use the correct terminal for your operating system",[23,1089,1090],{},"Authenticate to GitHub with SSH",[23,1092,1093],{},"Find your private course repository on GitHub",[23,1095,1096],{},"Invite course collaborators",[23,1098,1099],{},"Open the local clone in the terminal",[23,1101,1102,1103],{},"Show repo-local Git identity with ",[198,1104,1105],{},"git config",[23,1107,1108],{},"Next: practice the Git commands used for course work",{"title":114,"searchDepth":1110,"depth":1110,"links":1111},2,[1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1129,1130,1131,1132,1133,1136,1137,1138],{"id":13,"depth":1110,"text":18},{"id":43,"depth":1110,"text":46},{"id":64,"depth":1110,"text":67},{"id":89,"depth":1110,"text":92},{"id":102,"depth":1110,"text":105},{"id":142,"depth":1110,"text":143},{"id":181,"depth":1110,"text":182},{"id":261,"depth":1110,"text":262},{"id":312,"depth":1110,"text":313},{"id":380,"depth":1110,"text":381},{"id":459,"depth":1110,"text":460},{"id":501,"depth":1110,"text":502,"children":1124},[1125,1127,1128],{"id":530,"depth":1126,"text":531},3,{"id":564,"depth":1126,"text":565},{"id":602,"depth":1126,"text":603},{"id":648,"depth":1110,"text":649},{"id":682,"depth":1110,"text":683},{"id":768,"depth":1110,"text":769},{"id":840,"depth":1110,"text":841},{"id":867,"depth":1110,"text":870,"children":1134},[1135],{"id":904,"depth":1126,"text":905},{"id":951,"depth":1110,"text":954},{"id":1003,"depth":1110,"text":1004},{"id":1076,"depth":1110,"text":1079},"presentation","Internet Applications","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","md",{},"1",true,"30","\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh",false,{"title":5,"description":1141},"published","internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F03-setup-github-ssh",[1157,1158,1159,1160],"git","github","ssh","repository","48:26","HZG3_HfczOk","https:\u002F\u002Fyoutu.be\u002FHZG3_HfczOk","Setup Git SSH and GitHub","rJ2RP6nrPEoOj98kzeevFpO0YOXaJl-M5ajP_tsjwvA",null,[],[1169,1660,2724,3600,4378,5317,6108,7175,7901,8726],{"id":1170,"title":1171,"audience":6,"body":1172,"contentType":1139,"course":1140,"description":1641,"estimateBasis":1642,"estimatedDiscussionMinutes":1643,"estimatedLiveMinutes":1644,"estimatedTotalMinutes":1150,"extension":1146,"meta":1645,"module":1148,"navigation":1149,"order":1646,"path":1647,"promptAssist":1152,"seo":1648,"status":1154,"stem":1649,"tags":1650,"videoDuration":1655,"videoId":1656,"videoLink":1657,"videoTitle":1658,"week":1148,"__hash__":1659},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord.md","Learn Courses Platform And Discord",{"type":8,"value":1173,"toc":1626},[1174,1208,1248,1292,1340,1388,1421,1483,1523,1573,1600],[11,1175,1177,1181,1195],{"id":1176,"level":14},"learn-courses-flow",[16,1178,1180],{"id":1179},"what-is-the-learn-courses-platform","What is the Learn Courses Platform",[20,1182,1183,1186,1189,1192],{},[23,1184,1185],{},"This is a platform I've built over the years to aid assignment submissions and course utilities",[23,1187,1188],{},"It provides objective-based worksheets to fill in images, urls, and open responses to document assignment evidence",[23,1190,1191],{},"The goal is to keep tasks clear and objective for students and grading",[23,1193,1194],{},"Also includes a few other utilities for courses (such as joining the Discord server)",[59,1196,1197,1198,1202,1203,1207],{},"NOTE: Summer 2026 the previous Learn Platform (",[1047,1199,1200],{"href":1200,"rel":1201},"https:\u002F\u002Flearn.ethereallab.app",[1051],") has been replaced by Learn Courses Platform (",[1047,1204,1205],{"href":1205,"rel":1206},"https:\u002F\u002Fcourses.ethereallab.app",[1051],"). The deprecated site is still available as a backup but all activities\u002Fcontent is being migrated to the new version",[11,1209,1211,1214,1217,1245],{"id":1210,"level":14},"learn-courses-title",[16,1212,1171],{"id":1213},"learn-courses-platform-and-discord",[59,1215,1216],{},"How to join:",[20,1218,1219,1225,1233,1236,1239,1242],{},[23,1220,1221,1222],{},"Visit the platform ",[1047,1223,1205],{"href":1205,"rel":1224},[1051],[23,1226,1227,1228],{},"Sign in with your NJIT email\n",[20,1229,1230],{},[23,1231,1232],{},"If you're in the Canvas course, you should automatically get synced to this platform",[23,1234,1235],{},"Visit your Profile page",[23,1237,1238],{},"Associate your Discord account",[23,1240,1241],{},"Join the course Discord server",[23,1243,1244],{},"Verify that your course channels appear on Discord",[59,1246,1247],{},"You can follow the steps on the below slides for guidance",[11,1249,1251,1254],{"id":1250,"level":526},"visit-learn-courses",[16,1252,1253],{"id":1250},"Visit Learn Courses",[107,1255,1256,1284],{"gap":109,"left-width":110,"right-width":110},[112,1257,1258,1261,1266],{"v-slot:left":114},[59,1259,1260],{},"Go to:",[59,1262,1263],{},[1047,1264,1205],{"href":1205,"rel":1265},[1051],[20,1267,1268,1275,1278,1281],{},[23,1269,1270,1271,1274],{},"Click the ",[295,1272,1273],{},"Login"," button",[23,1276,1277],{},"Use your NJIT email",[23,1279,1280],{},"Only NJIT accounts are allowed",[23,1282,1283],{},"If the browser tries a personal Chrome profile, log out of that account or switch profiles",[112,1285,1286],{"v-slot:right":114},[59,1287,1288],{},[171,1289],{"alt":1290,"src":1291,"variant":175},"Learn Courses logged-out home page with the Login button visible","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fhome-loggedout-login-button.png",[11,1293,1295,1298],{"id":1294,"level":526},"associate-discord-name",[16,1296,1297],{"id":1294},"Associate Discord Name",[107,1299,1300,1324],{"gap":109,"left-width":110,"right-width":110},[112,1301,1302,1305,1321],{"v-slot:left":114},[59,1303,1304],{},"On Learn Courses:",[909,1306,1307,1310,1315,1318],{},[23,1308,1309],{},"Open your Profile",[23,1311,196,1312],{},[295,1313,1314],{},"Refresh Discord Username",[23,1316,1317],{},"Authorize the Discord prompt",[23,1319,1320],{},"After the success message appears, save your profile",[59,1322,1323],{},"If you are not sure where you are, use the Home icon in the top left to return to the dashboard.",[112,1325,1326,1333],{"v-slot:right":114},[59,1327,1328],{},[171,1329],{"alt":1330,"src":1331,"variant":175,"max-height":1332},"Learn Courses dashboard sidebar with Profile and course links visible","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fdashboard-sidebar-profile-links.png","13rem",[59,1334,1335],{},[171,1336],{"alt":1337,"src":1338,"variant":175,"max-height":1339},"Learn Courses profile page with Discord connection controls visible","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fprofile-page.png","16rem",[11,1341,1343,1346],{"id":1342,"level":526},"authorize-discord",[16,1344,1345],{"id":1342},"Authorize Discord",[107,1347,1348,1372],{"gap":109,"left-width":110,"right-width":110},[112,1349,1350,1353],{"v-slot:left":114},[59,1351,1352],{},"Discord will ask whether Learn Courses can access your Discord account.",[20,1354,1355,1358,1363,1366,1369],{},[23,1356,1357],{},"Confirm you are signed in to the correct Discord account",[23,1359,196,1360],{},[295,1361,1362],{},"Authorize",[23,1364,1365],{},"Return to Learn Courses",[23,1367,1368],{},"Look for the success message",[23,1370,1371],{},"Save the profile change",[112,1373,1374,1381],{"v-slot:right":114},[59,1375,1376],{},[171,1377],{"alt":1378,"src":1379,"variant":175,"max-height":1380},"Discord authorization prompt for Learn Courses","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fdiscord-auth.png","25rem",[59,1382,1383],{},[171,1384],{"alt":1385,"src":1386,"variant":175,"max-height":1387},"Learn Courses success message after connecting Discord","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fdiscord-connected-success.png","7rem",[11,1389,1391,1394,1397,1403,1410],{"id":1390,"level":526},"join-the-channel",[16,1392,1393],{"id":1390},"Join The Channel",[59,1395,1396],{},"Use the Discord link provided on Canvas, or use:",[59,1398,1399],{},[1047,1400,1401],{"href":1401,"rel":1402},"https:\u002F\u002Fdiscord.com\u002Finvite\u002FYEHcm44wzg",[1051],[59,1404,1405,1406,1409],{},"This should send you to the ",[198,1407,1408],{},"access-channel"," channel.",[20,1411,1412,1415,1418],{},[23,1413,1414],{},"Other channels are protected by a bot",[23,1416,1417],{},"Messages may be blocked until your name and role are set",[23,1419,1420],{},"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,1422,1424,1427],{"id":1423,"level":14},"verify-with-quackbot",[16,1425,1426],{"id":1423},"Verify With QuackBot",[107,1428,1429,1474],{"gap":109,"left-width":110,"right-width":110},[112,1430,1431,1443,1449,1454,1457,1471],{"v-slot:left":114},[20,1432,1433,1436],{},[23,1434,1435],{},"A summer 2026 change was to have the bot attempt to auto-detect new members and apply roles automatically",[23,1437,1438,1439,1442],{},"If you don't see the proper semester category (i.e., ",[198,1440,1441],{},"summer-2026",") or the expected channels you can do the below action",[59,1444,1445,1446,1448],{},"In ",[198,1447,1408],{},", enter:",[59,1450,1451],{},[198,1452,1453],{},"@QuackBot",[59,1455,1456],{},"QuackBot will:",[20,1458,1459,1462,1465,1468],{},[23,1460,1461],{},"Verify your account",[23,1463,1464],{},"Pull in your name and section",[23,1466,1467],{},"Apply your class role",[23,1469,1470],{},"Update your server nickname",[59,1472,1473],{},"This does not change your real Discord username.",[112,1475,1476],{"v-slot:right":114},[59,1477,1478],{},[171,1479],{"alt":1480,"src":1481,"variant":175,"max-height":1482},"QuackBot response showing the student already has a course role","\u002Fimages\u002Finternet-applications\u002Flearn-courses-discord\u002Fquackbot-role-response.png","8rem",[11,1484,1486,1490,1493,1504,1508],{"id":1485,"level":14},"welcome-and-potential-issues",[16,1487,1489],{"id":1488},"welcome","Welcome",[59,1491,1492],{},"If the previous steps worked, you should see a new semester category in the Discord sidebar.",[20,1494,1495,1498,1501],{},[23,1496,1497],{},"It should appear after the general channels",[23,1499,1500],{},"It should include one or more channels for your active courses",[23,1502,1503],{},"Use the correct course channel for class questions and discussion",[528,1505,1507],{"id":1506},"potential-issues","Potential Issues",[20,1509,1510,1513],{},[23,1511,1512],{},"If you recently joined the class, your UCID may still need to be added to Learn Courses",[23,1514,1515,1516,1518],{},"If there is an issue, email the instructor or DM ",[198,1517,855],{},[20,1519,1520],{},[23,1521,1522],{},"Some Discord privacy settings may require a friend request before DMs work",[11,1524,1526,1529],{"id":1525,"level":14},"general-conduct",[16,1527,1528],{"id":1525},"General Conduct",[20,1530,1531,1534,1537,1548,1551,1559,1567,1570],{},[23,1532,1533],{},"Use class-related channels for questions and discussion",[23,1535,1536],{},"Ask general course questions in the channel instead of DM when possible",[23,1538,1539,1540],{},"Do not post screenshots of in-progress assignment solutions\n",[20,1541,1542,1545],{},[23,1543,1544],{},"This would be more ideal for a DM",[23,1546,1547],{},"If you see posted solution-like items don't assume they're correct",[23,1549,1550],{},"General unrelated code is okay when it supports a discussion (like content from a presentation or reading)",[23,1552,1553,1554],{},"If the instructor needs to see assignment code, they may ask you to DM the screenshot\n",[20,1555,1556],{},[23,1557,1558],{},"Since repositories should be set to private; repo links are fine to post in the class channel since other students should not have access to them",[23,1560,1561,1562],{},"Keep off-topic items out of class channels\n",[20,1563,1564],{},[23,1565,1566],{},"There are plenty of categorized channels to use and I can always make more",[23,1568,1569],{},"Helping classmates understand topics is encouraged just be mindful not to spoon-feed",[23,1571,1572],{},"Sharing direct solutions goes against the Academic Integrity Policy",[11,1574,1575,1577,1580],{"id":951,"level":14},[16,1576,954],{"id":951},[59,1578,1579],{},"Before continuing, confirm:",[20,1581,1582,1585,1588,1591,1594,1597],{},[23,1583,1584],{},"You can sign in to Learn Courses with your NJIT email",[23,1586,1587],{},"Your profile is saved",[23,1589,1590],{},"Discord is associated with your Learn Courses profile",[23,1592,1593],{},"You joined the Discord server",[23,1595,1596],{},"QuackBot applied your course role",[23,1598,1599],{},"You can see the correct course channel",[11,1601,1602,1604],{"id":1076,"level":14},[16,1603,1079],{"id":1076},[20,1605,1606,1609,1617,1620,1623],{},[23,1607,1608],{},"Learn Courses supports course tools and course-specific setup",[23,1610,1611,1612],{},"Canvas remains the official assignment, grade, and course hub\n",[20,1613,1614],{},[23,1615,1616],{},"All necessary items will be linked on Canvas",[23,1618,1619],{},"Discord is the preferred quick communication channel",[23,1621,1622],{},"QuackBot connects your Discord account to the correct course role",[23,1624,1625],{},"Good course communication keeps help requests specific and protects private information",{"title":114,"searchDepth":1110,"depth":1110,"links":1627},[1628,1629,1630,1631,1632,1633,1634,1635,1638,1639,1640],{"id":1179,"depth":1110,"text":1180},{"id":1213,"depth":1110,"text":1171},{"id":1250,"depth":1110,"text":1253},{"id":1294,"depth":1110,"text":1297},{"id":1342,"depth":1110,"text":1345},{"id":1390,"depth":1110,"text":1393},{"id":1423,"depth":1110,"text":1426},{"id":1488,"depth":1110,"text":1489,"children":1636},[1637],{"id":1506,"depth":1126,"text":1507},{"id":1525,"depth":1110,"text":1528},{"id":951,"depth":1110,"text":954},{"id":1076,"depth":1110,"text":1079},"Set up Learn Courses Platform and Discord before starting terminal, Git, and local server work.","Face-to-face class of about 40 students; includes account sign-in, Discord association, QuackBot role setup, and communication expectations.","10","20",{},"0","\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord",{"title":1171,"description":1641},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F00-learn-courses-and-discord",[1651,1652,1653,1654],"course-tools","learn-courses","discord","setup","11:16","ScmHyEF1sA0","https:\u002F\u002Fyoutu.be\u002FScmHyEF1sA0","Joining Learn Platform and Discord Server","tEFV7lUabcy7whz7FSHEjPXSirrd3ginqQq4O4AkW9o",{"id":1661,"title":1662,"audience":6,"body":1663,"contentType":1139,"course":1140,"description":2708,"estimateBasis":2709,"estimatedDiscussionMinutes":1643,"estimatedLiveMinutes":2710,"estimatedTotalMinutes":2711,"extension":1146,"meta":2712,"module":1148,"navigation":1149,"order":1643,"path":2713,"promptAssist":1152,"seo":2714,"status":1154,"stem":2715,"tags":2716,"videoDuration":2720,"videoId":2721,"videoLink":2722,"videoTitle":1662,"week":1148,"__hash__":2723},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands.md","Basic CLI Commands",{"type":8,"value":1664,"toc":2674},[1665,1723,1760,1790,1852,1918,1969,1995,2012,2050,2078,2099,2134,2156,2228,2251,2294,2356,2408,2436,2456,2485,2525,2555,2565,2628],[11,1666,1668,1672],{"id":1667,"level":14},"why-cli-first",[16,1669,1671],{"id":1670},"why-cli-comes-first","Why CLI Comes First",[20,1673,1674,1682,1690,1704,1712],{},[23,1675,1676,1677],{},"Common language for setup and developer tools\n",[20,1678,1679],{},[23,1680,1681],{},"Git, servers, package installs, deployment logs",[23,1683,1684,1685],{},"Works when there is no full desktop\n",[20,1686,1687],{},[23,1688,1689],{},"SSH, Ubuntu Server, minimal system access",[23,1691,1692,1693],{},"Direct check of what the computer sees\n",[20,1694,1695,1698,1701],{},[23,1696,1697],{},"Current folder",[23,1699,1700],{},"Files and permissions",[23,1702,1703],{},"Command output",[23,1705,1706,1707],{},"Repeatable steps beat guessing through menus\n",[20,1708,1709],{},[23,1710,1711],{},"Run a command, read output, adjust",[23,1713,1714,1715],{},"Location still matters\n",[20,1716,1717,1720],{},[23,1718,1719],{},"Wrong folder can make correct commands fail",[23,1721,1722],{},"Or create files in the wrong place",[11,1724,1726,1729,1732],{"id":1725,"level":14},"goal",[16,1727,1728],{"id":1725},"Goal",[59,1730,1731],{},"Build the command-line habits that make setup work predictable:",[20,1733,1734,1737,1740,1754,1757],{},[23,1735,1736],{},"Know what folder the terminal is using",[23,1738,1739],{},"Read file and folder lists before moving",[23,1741,1742,1743,1746,1747,1750,1751],{},"Recognize common flags like ",[198,1744,1745],{},"-a",", ",[198,1748,1749],{},"-r",", and ",[198,1752,1753],{},"-l",[23,1755,1756],{},"Make small file changes and verify them",[23,1758,1759],{},"Stop safely when output does not match the lesson",[11,1761,1763,1766,1769,1787],{"id":1762,"level":14},"before-you-start",[16,1764,1765],{"id":1762},"Before You Start",[59,1767,1768],{},"Run these commands on your host computer",[20,1770,1771,1782,1785],{},[23,1772,51,1773],{},[20,1774,1775],{},[23,1776,1777,1778],{},"Need Git Bash now? Use the Windows install slide in the next presentation:\n",[1047,1779,1781],{"href":1780},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fview\u002Fslides#step-1-install-git-on-windows","Install Git On Windows",[23,1783,1784],{},"Apple macOS: Terminal",[23,1786,57],{},[59,1788,1789],{},"Use one terminal window for the whole practice so your location is easy to track",[11,1791,1793,1797],{"id":1792,"level":14},"working-directory",[16,1794,1796],{"id":1795},"the-main-idea","The Main Idea",[20,1798,1799,1810,1821,1844],{},[23,1800,1801,1802],{},"Terminal commands run from one folder at a time\n",[20,1803,1804],{},[23,1805,1806,1807],{},"That folder is the ",[295,1808,1809],{},"working directory",[23,1811,1812,1815,1816],{},[198,1813,1814],{},"pwd",": print working directory\n",[20,1817,1818],{},[23,1819,1820],{},"Shows the full path to the folder your terminal is using",[23,1822,1823,1824],{},"Fresh terminal usually starts in your home folder\n",[20,1825,1826,1832,1838],{},[23,1827,1828,1829],{},"Windows Git Bash: ",[198,1830,1831],{},"\u002Fc\u002FUsers\u002Fyour-username",[23,1833,1834,1835],{},"Apple macOS: ",[198,1836,1837],{},"\u002FUsers\u002Fyour-username",[23,1839,1840,1841],{},"Linux: ",[198,1842,1843],{},"\u002Fhome\u002Fyour-username",[23,1845,1846,1847],{},"Commands from this lesson start from the working directory\n",[20,1848,1849],{},[23,1850,1851],{},"Unless you give a different path",[11,1853,1855,1858,1861,1912],{"id":1854,"level":14},"paths-relative-and-absolute",[16,1856,1857],{"id":1854},"Paths: Relative And Absolute",[59,1859,1860],{},"Paths build on the working directory. They tell the terminal which file or folder you mean",[20,1862,1863,1869,1875,1881,1907],{},[23,1864,1865,1866],{},"Relative path: starts from the working directory, like ",[198,1867,1868],{},"public\u002Findex.php",[23,1870,1871,1872],{},"Absolute path: starts from the system root, like ",[198,1873,1874],{},"\u002Fhome\u002Fstudent\u002Fproject",[23,1876,1877,1880],{},[198,1878,1879],{},"."," means the current folder",[23,1882,1883,1886,1887],{},[198,1884,1885],{},".."," means the parent folder\n",[20,1888,1889,1895,1901],{},[23,1890,1891,1894],{},[198,1892,1893],{},"..\u002F.."," goes up two folders",[23,1896,1897,1898],{},"Example: ",[198,1899,1900],{},"cd ..\u002F..",[23,1902,1903,1906],{},[198,1904,1905],{},"..."," is not a shortcut",[23,1908,1909,1911],{},[198,1910,429],{}," means your home folder",[59,1913,1914,1915,1917],{},"If a command affects the wrong place, check ",[198,1916,1814],{}," first, then check the path you typed",[11,1919,1921,1924,1927,1946,1949],{"id":1920,"level":14},"flags-options-and-arguments",[16,1922,1923],{"id":1920},"Flags, Options, And Arguments",[59,1925,1926],{},"Commands usually follow this shape:",[20,1928,1929,1935,1940],{},[23,1930,1931,1932],{},"Command: what to do, like ",[198,1933,1934],{},"ls",[23,1936,1937,1938],{},"Flag or option: how to do it, like ",[198,1939,1745],{},[23,1941,1942,1943],{},"Argument: what to do it to, like ",[198,1944,1945],{},"public_html",[59,1947,1948],{},"Examples:",[20,1950,1951,1957,1963],{},[23,1952,1953,1956],{},[198,1954,1955],{},"ls -a"," shows hidden files",[23,1958,1959,1962],{},[198,1960,1961],{},"cp -r folder backup-folder"," copies a folder",[23,1964,1965,1968],{},[198,1966,1967],{},"nano -l file.txt"," opens with line numbers",[11,1970,1972,1976,1979,1990],{"id":1971,"level":14},"practice-loop",[16,1973,1975],{"id":1974},"practice-1-location-and-paths","Practice 1: Location And Paths",[59,1977,1978],{},"For each command, use the same pattern:",[909,1980,1981,1984,1987],{},[23,1982,1983],{},"Run one command",[23,1985,1986],{},"Read the output",[23,1988,1989],{},"Confirm the folder or file changed the way you expected",[20,1991,1992],{},[23,1993,1994],{},"See the slides below for workflow steps, checkpoints, and expected results",[11,1996,1998,2001,2003,2006,2009],{"id":1997,"level":526},"step-1-confirm-where-you-are",[16,1999,2000],{"id":1997},"Step 1: Confirm Where You Are",[59,2002,117],{},[119,2004],{"language":122,"src":2005},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-1-confirm-where-you-01.sh",[59,2007,2008],{},"Expected result: a folder path",[59,2010,2011],{},"If you see a path, the terminal is working and you know your current location",[11,2013,2015,2018,2020,2023,2026,2029,2032],{"id":2014,"level":526},"step-2-list-files",[16,2016,2017],{"id":2014},"Step 2: List Files",[59,2019,117],{},[119,2021],{"language":122,"src":2022},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-2-list-files-02.sh",[59,2024,2025],{},"Expected result: file and folder names from your current location",[59,2027,2028],{},"For hidden files and details too, run:",[119,2030],{"language":122,"src":2031},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-2-list-files-03.sh",[20,2033,2034,2039,2044],{},[23,2035,2036,2038],{},[198,2037,1745],{}," includes hidden files",[23,2040,2041,2043],{},[198,2042,1753],{}," uses a long listing",[23,2045,2046,2049],{},[198,2047,2048],{},"-la"," combines both",[11,2051,2053,2056,2059,2062,2069,2075],{"id":2052,"level":526},"step-3-change-folders",[16,2054,2055],{"id":2052},"Step 3: Change Folders",[59,2057,2058],{},"Start from your home folder, then move up and back",[119,2060],{"language":122,"src":2061},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-3-change-folders-04.sh",[59,2063,2064,2065,2068],{},"This avoids assuming your computer has a specific folder like ",[198,2066,2067],{},"Documents"," in the current location",[59,2070,2071,2072,2074],{},"When you move into a named folder later, run ",[198,2073,1934],{}," first and pick a folder that actually appears in the list",[59,2076,2077],{},"If a path has spaces, wrap it in quotes",[11,2079,2081,2085,2087,2090],{"id":2080,"level":526},"step-4-create-practice-folder",[16,2082,2084],{"id":2083},"step-4-create-a-practice-folder","Step 4: Create A Practice Folder",[59,2086,117],{},[119,2088],{"language":122,"src":2089},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-4-create-a-practice-05.sh",[59,2091,2092,2093,2095,2096],{},"Expected result: ",[198,2094,1814],{}," ends with ",[198,2097,2098],{},"cli-practice",[11,2100,2102,2106,2108,2111,2114],{"id":2101,"level":526},"step-5-create-and-read-file",[16,2103,2105],{"id":2104},"step-5-write-text-to-a-file","Step 5: Write Text To A File",[59,2107,117],{},[119,2109],{"language":122,"src":2110},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-5-write-text-to-a-f-06.sh",[59,2112,2113],{},"What this command does:",[20,2115,2116,2122,2128],{},[23,2117,2118,2121],{},[198,2119,2120],{},"echo"," prepares text for the terminal",[23,2123,2124,2127],{},[198,2125,2126],{},">"," redirects that text into a file instead of printing it on screen",[23,2129,2130,2133],{},[198,2131,2132],{},"cli-proof.txt"," is created in the current folder, or replaced if it already exists",[11,2135,2137,2141,2144,2147,2153],{"id":2136,"level":526},"step-5-read-file-back",[528,2138,2140],{"id":2139},"step-5-continued-read-the-file-back","Step 5 Continued: Read The File Back",[59,2142,2143],{},"Then read it back:",[119,2145],{"language":122,"src":2146},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-5-continued-read-th-07.sh",[59,2148,2149,2152],{},[198,2150,2151],{},"cat"," prints file contents in the terminal",[59,2154,2155],{},"Expected result: the terminal prints the text you wrote",[11,2157,2159,2163,2165,2174,2177,2203,2206],{"id":2158,"level":14},"file-management-loop",[16,2160,2162],{"id":2161},"practice-2-file-management","Practice 2: File Management",[59,2164,1978],{},[909,2166,2167,2169,2171],{},[23,2168,1983],{},[23,2170,1986],{},[23,2172,2173],{},"Confirm the file changed the way you expected",[59,2175,2176],{},"Commands in this practice:",[20,2178,2179,2185,2191,2197],{},[23,2180,2181,2184],{},[198,2182,2183],{},"touch"," creates an empty file",[23,2186,2187,2190],{},[198,2188,2189],{},"cp"," copies a file or folder",[23,2192,2193,2196],{},[198,2194,2195],{},"mv"," moves or renames",[23,2198,2199,2202],{},[198,2200,2201],{},"rm"," deletes",[59,2204,2205],{},"Important flags:",[20,2207,2208,2214,2220,2226],{},[23,2209,2210,2213],{},[198,2211,2212],{},"cp -r"," copies folders",[23,2215,2216,2219],{},[198,2217,2218],{},"rm -r"," deletes folders",[23,2221,2222,2225],{},[198,2223,2224],{},"rm -f"," forces deletion",[23,2227,1994],{},[11,2229,2231,2235,2237,2240,2245],{"id":2230,"level":526},"practice-2-step-1-create-empty-file",[16,2232,2234],{"id":2233},"step-1-create-an-empty-file","Step 1: Create An Empty File",[59,2236,117],{},[119,2238],{"language":122,"src":2239},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-1-create-an-empty-f-08.sh",[59,2241,2242,2244],{},[198,2243,2183],{}," creates an empty file, or updates the timestamp if the file already exists",[59,2246,2092,2247,2250],{},[198,2248,2249],{},"practice-empty.txt"," appears in the folder list",[11,2252,2254,2258,2260,2263,2266,2271,2283],{"id":2253,"level":526},"practice-2-step-2-copy-rename-and-delete",[16,2255,2257],{"id":2256},"step-2-copy-rename-and-delete","Step 2: Copy, Rename, And Delete",[59,2259,117],{},[119,2261],{"language":122,"src":2262},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fstep-2-copy-rename-and-d-09.sh",[59,2264,2265],{},"Expected result: the backup is copied, renamed, then removed",[59,2267,422,2268,2270],{},[198,2269,2201],{}," carefully. Deleting from the terminal usually skips the recycle bin",[20,2272,2273,2278],{},[23,2274,2275,2277],{},[198,2276,1749],{},": recursive, includes folders and everything inside them",[23,2279,2280,2282],{},[198,2281,348],{},": force, skips many confirmation prompts",[2284,2285,2287],"alert",{"color":2286},"red",[59,2288,2289,2290,2293],{},"Never run ",[198,2291,2292],{},"rm -rf \u002F",". It can try to delete the whole system from the root folder.",[11,2295,2297,2301,2304,2321,2326,2331,2351],{"id":2296,"level":14},"terminal-editors",[16,2298,2300],{"id":2299},"practice-3-terminal-editors","Practice 3: Terminal Editors",[59,2302,2303],{},"Sometimes you need to edit a file from a terminal",[20,2305,2306,2312],{},[23,2307,2308,2311],{},[198,2309,2310],{},"nano"," is beginner-friendly",[23,2313,2314,302,2317,2320],{},[198,2315,2316],{},"vi",[198,2318,2319],{},"vim"," is common on servers but has a learning curve",[59,2322,422,2323,2325],{},[198,2324,2310],{}," for this course unless a lesson says otherwise",[59,2327,422,2328,2330],{},[198,2329,1967],{}," when line numbers would help",[59,2332,2333,2334,302,2336,2338,2339,2342,2343,2346,2347,2350],{},"If you accidentally open ",[198,2335,2316],{},[198,2337,2319],{},", press ",[198,2340,2341],{},"Esc",", type ",[198,2344,2345],{},":q",", and press ",[198,2348,2349],{},"Enter"," to exit without saving",[20,2352,2353],{},[23,2354,2355],{},"See the slide below for workflow steps, checkpoints, and expected results",[11,2357,2359,2364,2366,2369,2374,2396],{"id":2358,"level":526},"edit-with-nano",[16,2360,2361,2362],{"id":2358},"Edit With ",[198,2363,2310],{},[59,2365,117],{},[119,2367],{"language":122,"src":2368},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fedit-with-nano-10.sh",[59,2370,1445,2371,2373],{},[198,2372,2310],{},":",[20,2375,2376,2379,2386,2390],{},[23,2377,2378],{},"Type a short note",[23,2380,2381,2382,2385],{},"Press ",[198,2383,2384],{},"Ctrl+O"," to save",[23,2387,2381,2388],{},[198,2389,2349],{},[23,2391,2381,2392,2395],{},[198,2393,2394],{},"Ctrl+X"," to exit",[59,2397,2398,2399,2401,2402,2342,2404,2346,2406],{},"If you open ",[198,2400,2316],{}," by mistake, press ",[198,2403,2341],{},[198,2405,2345],{},[198,2407,2349],{},[11,2409,2411,2417,2422,2425,2428,2431],{"id":2410,"level":14},"sudo-and-permission-boundaries",[16,2412,2413,2416],{"id":2410},[198,2414,2415],{},"sudo"," And Permission Boundaries",[59,2418,2419,2421],{},[198,2420,2415],{}," runs a command with elevated permissions",[59,2423,2424],{},"Use it only when a setup lesson explicitly says to use it",[59,2426,2427],{},"Example:",[119,2429],{"language":122,"src":2430},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fsudo-and-permission-boun-11.sh",[20,2432,2433],{},[23,2434,2435],{},"See the slide below for supporting examples and follow-up details",[11,2437,2439,2444,2450],{"id":2438,"level":526},"sudo-by-operating-system",[528,2440,2441,2443],{"id":2438},[198,2442,2415],{}," By Operating System",[59,2445,2446,2447,2449],{},"On Linux and macOS, ",[198,2448,2415],{}," is common for package installation and service management",[59,2451,2452,2453,2455],{},"Modern Windows also has a native ",[198,2454,2415],{}," 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,2457,2459,2462,2465,2476],{"id":2458,"level":14},"quick-safety-routine",[16,2460,2461],{"id":2458},"Quick Safety Routine",[59,2463,2464],{},"Before a command changes files, ask:",[20,2466,2467,2470,2473],{},[23,2468,2469],{},"What folder am I in?",[23,2471,2472],{},"Do I see the files I expect?",[23,2474,2475],{},"Am I about to change the right folder?",[59,2477,2478,2479,2481,2482],{},"If one answer is unclear, stop and run ",[198,2480,1814],{}," plus ",[198,2483,2484],{},"ls -la",[11,2486,2488,2491],{"id":2487,"level":14},"common-mistakes",[16,2489,2490],{"id":2487},"Common Mistakes",[20,2492,2493,2509,2515,2523],{},[23,2494,2495,2498,2499,2501,2502,2504,2505,2508],{},[198,2496,2497],{},"No such file or directory",": run ",[198,2500,1814],{},", then ",[198,2503,1934],{},", then try ",[198,2506,2507],{},"cd"," again",[23,2510,2511,2512,2514],{},"Command affected the wrong folder: check ",[198,2513,1814],{}," before continuing",[23,2516,2517,2519,2520,2522],{},[198,2518,2151],{}," cannot find the file: run ",[198,2521,2484],{}," and check the exact filename",[23,2524,2435],{},[11,2526,2528,2532],{"id":2527,"level":526},"common-mistakes-recovery",[528,2529,2531],{"id":2530},"recovery-checks","Recovery Checks",[20,2533,2534,2537,2543,2549],{},[23,2535,2536],{},"Spaces in a path: wrap the path in quotes",[23,2538,2539,2540],{},"Command keeps running: press ",[198,2541,2542],{},"Ctrl+C",[23,2544,2545,2546],{},"Permission denied: move back home with ",[198,2547,2548],{},"cd ~",[23,2550,2551,2552,2554],{},"Wrong ",[198,2553,2201],{},": stop and ask before doing more work",[11,2556,2557,2559,2562],{"id":951,"level":14},[16,2558,954],{"id":951},[59,2560,2561],{},"You are ready for the next setup lesson when these commands make sense:",[119,2563],{"language":122,"src":2564},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands\u002Fquick-check-12.sh",[11,2566,2567,2569],{"id":1000,"level":14},[16,2568,1004],{"id":1003},[107,2570,2571,2601],{"gap":109,"left-width":110,"right-width":110},[112,2572,2573,2575,2581,2590],{"v-slot:left":114},[528,2574,1012],{"id":1011},[59,2576,2577,2580],{},[295,2578,2579],{},"Working directory"," - The folder where the next terminal command runs",[59,2582,2583,2586,2587],{},[295,2584,2585],{},"Path"," - A file or folder location, such as ",[198,2588,2589],{},"public_html\u002Findex.php",[59,2591,2592,2595,2596,2598,2599],{},[295,2593,2594],{},"Flag"," - An extra command option, such as ",[198,2597,2048],{}," in ",[198,2600,2484],{},[112,2602,2603,2605],{"v-slot:right":114},[528,2604,1041],{"id":1000},[20,2606,2607,2614,2621],{},[23,2608,2609],{},[1047,2610,2613],{"href":2611,"rel":2612},"https:\u002F\u002Fdocumentation.ubuntu.com\u002Fdesktop\u002Fen\u002Flatest\u002Ftutorial\u002Fthe-linux-command-line-for-beginners\u002F",[1051],"Ubuntu Tutorial: The Linux Command Line For Beginners",[23,2615,2616],{},[1047,2617,2620],{"href":2618,"rel":2619},"https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fcoreutils\u002Fmanual\u002Fcoreutils.html",[1051],"GNU Coreutils Manual",[23,2622,2623],{},[1047,2624,2627],{"href":2625,"rel":2626},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FLearn_web_development\u002FGetting_started\u002FEnvironment_setup\u002FCommand_line",[1051],"MDN: Command Line Crash Course",[11,2629,2630,2632,2634],{"id":1076,"level":14},[16,2631,1079],{"id":1076},[59,2633,1082],{},[20,2635,2636,2641,2646,2657,2671],{},[23,2637,422,2638,2640],{},[198,2639,1814],{}," to check where commands will run",[23,2642,422,2643,2645],{},[198,2644,2484],{}," to inspect the current folder",[23,2647,422,2648,1746,2650,1746,2652,1750,2654,2656],{},[198,2649,2507],{},[198,2651,1879],{},[198,2653,1885],{},[198,2655,429],{}," to move intentionally",[23,2658,2659,2660,1746,2662,1746,2664,1746,2666,1750,2668,2670],{},"Use file commands such as ",[198,2661,2183],{},[198,2663,2189],{},[198,2665,2195],{},[198,2667,2201],{},[198,2669,2310],{}," carefully",[23,2672,2673],{},"Stop and check location when output does not match the lesson",{"title":114,"searchDepth":1110,"depth":1110,"links":2675},[2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2690,2691,2692,2693,2694,2696,2701,2702,2705,2706,2707],{"id":1670,"depth":1110,"text":1671},{"id":1725,"depth":1110,"text":1728},{"id":1762,"depth":1110,"text":1765},{"id":1795,"depth":1110,"text":1796},{"id":1854,"depth":1110,"text":1857},{"id":1920,"depth":1110,"text":1923},{"id":1974,"depth":1110,"text":1975},{"id":1997,"depth":1110,"text":2000},{"id":2014,"depth":1110,"text":2017},{"id":2052,"depth":1110,"text":2055},{"id":2083,"depth":1110,"text":2084},{"id":2104,"depth":1110,"text":2105,"children":2688},[2689],{"id":2139,"depth":1126,"text":2140},{"id":2161,"depth":1110,"text":2162},{"id":2233,"depth":1110,"text":2234},{"id":2256,"depth":1110,"text":2257},{"id":2299,"depth":1110,"text":2300},{"id":2358,"depth":1110,"text":2695},"Edit With nano",{"id":2410,"depth":1110,"text":2697,"children":2698},"sudo And Permission Boundaries",[2699],{"id":2438,"depth":1126,"text":2700},"sudo By Operating System",{"id":2458,"depth":1110,"text":2461},{"id":2487,"depth":1110,"text":2490,"children":2703},[2704],{"id":2530,"depth":1126,"text":2531},{"id":951,"depth":1110,"text":954},{"id":1003,"depth":1110,"text":1004},{"id":1076,"depth":1110,"text":1079},"Practice the terminal commands you need so you can move through folders, inspect files, and verify your location before running course commands.","Face-to-face class of about 40 students; includes short CLI demo, student command practice, path\u002Fflag checks, and common beginner recovery questions.","45","55",{},"\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands",{"title":1662,"description":2708},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F01-basic-cli-commands",[2717,2718,2719],"cli","terminal","filesystem","46:05","NsSRKv_uBWM","https:\u002F\u002Fyoutu.be\u002FNsSRKv_uBWM","q_NRWUOCcsk5lm6u6kKPFGl9E9VqeQhaC0qb86nD7aY",{"id":2725,"title":2726,"audience":6,"body":2727,"contentType":1139,"course":1140,"description":3588,"estimateBasis":3589,"estimatedDiscussionMinutes":1643,"estimatedLiveMinutes":3590,"estimatedTotalMinutes":2710,"extension":1146,"meta":3591,"module":1148,"navigation":1149,"order":1644,"path":3592,"promptAssist":1152,"seo":3593,"status":1154,"stem":3594,"tags":3595,"videoDuration":3596,"videoId":3597,"videoLink":3598,"videoTitle":2726,"week":1148,"__hash__":3599},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools.md","Git Tools",{"type":8,"value":2728,"toc":3558},[2729,2751,2780,2807,2843,2874,2906,2940,2969,2999,3035,3038,3068,3099,3128,3178,3196,3213,3233,3258,3288,3306,3343,3387,3469,3529],[11,2730,2731,2733],{"id":1725,"level":14},[16,2732,1728],{"id":1725},[20,2734,2735,2738,2741],{},[23,2736,2737],{},"Install Git",[23,2739,2740],{},"Choose one terminal for your operating system",[23,2742,2743,2744,1746,2746,1750,2748,2750],{},"Confirm ",[198,2745,964],{},[198,2747,1814],{},[198,2749,2484],{}," work before GitHub setup",[11,2752,2754,2758],{"id":2753,"level":14},"terminal-choice-by-os",[16,2755,2757],{"id":2756},"terminal-choices","Terminal Choices",[20,2759,2760,2763,2766,2769,2771,2774,2777],{},[23,2761,2762],{},"Pick the terminal for your operating system",[23,2764,2765],{},"Use that same terminal for this lesson path",[23,2767,2768],{},"Run commands on your own computer unless a later lesson explicitly says \"inside the VM\"",[23,2770,51],{},[23,2772,2773],{},"Apple macOS: Terminal, with iTerm2 optional",[23,2775,2776],{},"Linux: Terminal, with Tilix optional",[23,2778,2779],{},"These operating system notes are alternatives, not a sequence",[11,2781,2783,2787,2804],{"id":2782,"level":14},"step-1-install-git-on-windows",[16,2784,2786],{"id":2785},"windows-path-git-bash","Windows Path: Git Bash",[909,2788,2789,2795,2798,2801],{},[23,2790,510,2791],{},[1047,2792,2793],{"href":2793,"rel":2794},"https:\u002F\u002Fgit-scm.com\u002Finstall\u002Fwindows",[1051],[23,2796,2797],{},"Download and run the Git for Windows installer",[23,2799,2800],{},"Open Git Bash from the Start menu",[23,2802,2803],{},"Use Git Bash whenever this course says to use the terminal",[59,2805,2806],{},"See the slides below for the install settings, launch check, and Windows terminal habit",[11,2808,2810,2813],{"id":2809,"level":526},"windows-installer-components",[528,2811,2812],{"id":2809},"Windows Installer: Components",[107,2814,2816,2824],{"gap":109,"left-width":2815,"right-width":534,"stack":535},"1.4fr",[112,2817,2818],{"v-slot:left":114},[59,2819,2820],{},[171,2821],{"alt":2822,"src":2823,"variant":175},"Git for Windows installer component selection screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep01_components.png",[112,2825,2826],{"v-slot:right":114},[20,2827,2828,2831,2837],{},[23,2829,2830],{},"Recommended to have these components selected",[23,2832,2833,2834],{},"Keep ",[198,2835,2836],{},"Git Bash Here",[23,2838,2839,2840],{},"Continue with ",[198,2841,2842],{},"Next",[11,2844,2846,2849],{"id":2845,"level":526},"windows-installer-default-editor",[528,2847,2848],{"id":2845},"Windows Installer: Default Editor",[107,2850,2851,2859],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,2852,2853],{"v-slot:left":114},[59,2854,2855],{},[171,2856],{"alt":2857,"src":2858,"variant":175},"Git for Windows installer default editor selection screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep02_default_editor.png",[112,2860,2861],{"v-slot:right":114},[20,2862,2863,2866,2871],{},[23,2864,2865],{},"Choose the editor you are comfortable with",[23,2867,2868,2870],{},[198,2869,2310],{}," or VS Code is friendlier than Vim for most beginners",[23,2872,2873],{},"This setting affects Git messages if Git opens an editor",[11,2875,2877,2880],{"id":2876,"level":526},"windows-installer-branch-name",[528,2878,2879],{"id":2876},"Windows Installer: Branch Name",[107,2881,2882,2890],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,2883,2884],{"v-slot:left":114},[59,2885,2886],{},[171,2887],{"alt":2888,"src":2889,"variant":175},"Git for Windows installer default branch name screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep03_branch_naming.png",[112,2891,2892],{"v-slot:right":114},[20,2893,2894,2900,2903],{},[23,2895,2896,2897],{},"Select the option that uses ",[198,2898,2899],{},"main",[23,2901,2902],{},"Course repositories will tell you which branch to use later",[23,2904,2905],{},"Do not create custom branch names here",[11,2907,2909,2912],{"id":2908,"level":526},"windows-installer-path",[528,2910,2911],{"id":2908},"Windows Installer: PATH",[107,2913,2914,2922],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,2915,2916],{"v-slot:left":114},[59,2917,2918],{},[171,2919],{"alt":2920,"src":2921,"variant":175},"Git for Windows installer PATH environment screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep04_path.png",[112,2923,2924],{"v-slot:right":114},[20,2925,2926,2929,2934,2937],{},[23,2927,2928],{},"Select the recommended PATH option",[23,2930,2931,2932],{},"This lets Git Bash and common tools find ",[198,2933,1157],{},[23,2935,2936],{},"Avoid options that say Git Bash only",[23,2938,2939],{},"The third option can be used if you understand the consequences",[11,2941,2943,2946],{"id":2942,"level":526},"windows-installer-ssh",[528,2944,2945],{"id":2942},"Windows Installer: SSH",[107,2947,2948,2956],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,2949,2950],{"v-slot:left":114},[59,2951,2952],{},[171,2953],{"alt":2954,"src":2955,"variant":175},"Git for Windows installer SSH executable screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep05_ssh_bundled.png",[112,2957,2958],{"v-slot:right":114},[20,2959,2960,2963,2966],{},[23,2961,2962],{},"Use the bundled OpenSSH option",[23,2964,2965],{},"This keeps Git Bash SSH behavior predictable",[23,2967,2968],{},"SSH setup happens in the next lesson",[11,2970,2972,2976],{"id":2971,"level":526},"windows-installer-openssl",[528,2973,2975],{"id":2974},"windows-installer-https","Windows Installer: HTTPS",[107,2977,2978,2986],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,2979,2980],{"v-slot:left":114},[59,2981,2982],{},[171,2983],{"alt":2984,"src":2985,"variant":175},"Git for Windows installer HTTPS transport backend screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep06_openssl.png",[112,2987,2988],{"v-slot:right":114},[20,2989,2990,2993,2996],{},[23,2991,2992],{},"Keep the OpenSSL option",[23,2994,2995],{},"This is the normal Git for Windows choice",[23,2997,2998],{},"It supports secure GitHub connections",[11,3000,3002,3006],{"id":3001,"level":526},"windows-installer-checkout-style",[528,3003,3005],{"id":3004},"windows-installer-line-endings","Windows Installer: Line Endings",[107,3007,3008,3016],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,3009,3010],{"v-slot:left":114},[59,3011,3012],{},[171,3013],{"alt":3014,"src":3015,"variant":175},"Git for Windows installer line ending conversion screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep07_checkout_style.png",[112,3017,3018,3029],{"v-slot:right":114},[20,3019,3020,3023,3026],{},[23,3021,3022],{},"Keep the default line-ending option",[23,3024,3025],{},"Git handles Windows and Linux line endings for you",[23,3027,3028],{},"Do not change this unless a lesson says to",[737,3030,3032],{"type":3031},"note",[59,3033,3034],{},"Line-ending warnings may appear later. They are usually informational, not a sign that there's an issue.",[59,3036,3037],{},"::\n::",[11,3039,3041,3045],{"id":3040,"level":526},"windows-installer-mintty",[528,3042,3044],{"id":3043},"windows-installer-terminal-emulator","Windows Installer: Terminal Emulator",[107,3046,3047,3055],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,3048,3049],{"v-slot:left":114},[59,3050,3051],{},[171,3052],{"alt":3053,"src":3054,"variant":175},"Git for Windows installer terminal emulator screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep08_mintty.png",[112,3056,3057],{"v-slot:right":114},[20,3058,3059,3062,3065],{},[23,3060,3061],{},"Keep MinTTY selected",[23,3063,3064],{},"This is the normal Git Bash window",[23,3066,3067],{},"Course screenshots will assume this terminal style",[11,3069,3071,3075],{"id":3070,"level":526},"windows-installer-fast-forward",[528,3072,3074],{"id":3073},"windows-installer-pull-behavior","Windows Installer: Pull Behavior",[107,3076,3077,3085],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,3078,3079],{"v-slot:left":114},[59,3080,3081],{},[171,3082],{"alt":3083,"src":3084,"variant":175},"Git for Windows installer git pull behavior screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep09_ff_merge.png",[112,3086,3087],{"v-slot:right":114},[20,3088,3089,3096],{},[23,3090,3091,3092,3095],{},"Keep the default ",[198,3093,3094],{},"git pull"," behavior",[23,3097,3098],{},"Later lessons explain pull, merge, and conflicts",[11,3100,3102,3105],{"id":3101,"level":526},"windows-installer-credential-manager",[528,3103,3104],{"id":3101},"Windows Installer: Credential Manager",[107,3106,3107,3115],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,3108,3109],{"v-slot:left":114},[59,3110,3111],{},[171,3112],{"alt":3113,"src":3114,"variant":175},"Git for Windows installer credential manager screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep10_credential_manager.png",[112,3116,3117],{"v-slot:right":114},[20,3118,3119,3122,3125],{},[23,3120,3121],{},"Keep Git Credential Manager enabled",[23,3123,3124],{},"It helps with browser-based GitHub sign-in",[23,3126,3127],{},"This course still uses SSH for repo pushes",[11,3129,3131,3134],{"id":3130,"level":526},"windows-installer-extra-options",[528,3132,3133],{"id":3130},"Windows Installer: Extra Options",[107,3135,3136,3144],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,3137,3138],{"v-slot:left":114},[59,3139,3140],{},[171,3141],{"alt":3142,"src":3143,"variant":175},"Git for Windows installer extra options screen","\u002Fimages\u002Finternet-applications\u002Fgitbash\u002Fstep11_extra_options_optional.png",[112,3145,3146],{"v-slot:right":114},[20,3147,3148,3156,3167,3175],{},[23,3149,3150,3151],{},"Enable file system caching\n",[20,3152,3153],{},[23,3154,3155],{},"Improves Git performance on Windows",[23,3157,3158,3159],{},"Enable symbolic links if available\n",[20,3160,3161,3164],{},[23,3162,3163],{},"Helps Git handle link-like files correctly",[23,3165,3166],{},"May require Windows Developer Mode or admin rights",[23,3168,3169,3170],{},"Skip experimental options\n",[20,3171,3172],{},[23,3173,3174],{},"They can change behavior between Git versions",[23,3176,3177],{},"Finish the installer",[11,3179,3181,3185],{"id":3180,"level":526},"step-1-open-git-bash-on-windows",[528,3182,3184],{"id":3183},"open-git-bash","Open Git Bash",[20,3186,3187,3190,3193],{},[23,3188,3189],{},"Start menu -> Git Bash",[23,3191,3192],{},"Pin it if that helps you find the same terminal later",[23,3194,3195],{},"Run the checks in the next slides from Git Bash",[11,3197,3199,3202],{"id":3198,"level":526},"windows-terminal-habit",[528,3200,3201],{"id":3198},"Windows Terminal Habit",[20,3203,3204,3207,3210],{},[23,3205,3206],{},"Use Git Bash for course commands on Windows",[23,3208,3209],{},"If another terminal opens by accident, close it and open Git Bash",[23,3211,3212],{},"Staying in one terminal makes setup problems easier to diagnose",[11,3214,3216,3219],{"id":3215,"level":14},"macos-path-terminal",[16,3217,3218],{"id":3215},"macOS Path: Terminal",[20,3220,3221,3224,3227,3230],{},[23,3222,3223],{},"Built-in Terminal is fully supported",[23,3225,3226],{},"Optional iTerm2 gives you tabs, split panes, and profiles",[23,3228,3229],{},"Beginner default: start with Terminal unless you already prefer iTerm2",[23,3231,3232],{},"See the slide below for the optional modern terminal install path",[11,3234,3236,3240],{"id":3235,"level":526},"macos-optional-iterm2-install",[528,3237,3239],{"id":3238},"optional-iterm2-install","Optional iTerm2 Install",[20,3241,3242,3249,3252,3255],{},[23,3243,3244,3245],{},"Download the stable release from ",[1047,3246,3247],{"href":3247,"rel":3248},"https:\u002F\u002Fiterm2.com\u002Fdownloads.html",[1051],[23,3250,3251],{},"Move iTerm2 to Applications",[23,3253,3254],{},"Open iTerm2 and run the same checks as Terminal",[23,3256,3257],{},"Use Terminal or iTerm2 consistently for course commands",[11,3259,3261,3264,3277,3280,3283],{"id":3260,"level":14},"linux-path-terminal",[16,3262,3263],{"id":3260},"Linux Path: Terminal",[20,3265,3266,3269,3272],{},[23,3267,3268],{},"Open the built-in Terminal app",[23,3270,3271],{},"Git is often installed already",[23,3273,938,3274,3276],{},[198,3275,964],{}," fails, use your distribution package manager",[59,3278,3279],{},"For Ubuntu:",[119,3281],{"language":122,"src":3282},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Flinux-path-terminal-01.sh",[20,3284,3285],{},[23,3286,3287],{},"See the slide below for the optional split-pane terminal setup",[11,3289,3291,3295,3298,3300,3303],{"id":3290,"level":526},"linux-optional-tilix-install",[528,3292,3294],{"id":3293},"optional-tilix-install","Optional Tilix Install",[59,3296,3297],{},"Tilix is a Linux terminal with split panes and profiles",[59,3299,3279],{},[119,3301],{"language":122,"src":3302},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Foptional-tilix-install-02.sh",[59,3304,3305],{},"Use the built-in Terminal if optional installs add friction",[11,3307,3309,3313],{"id":3308,"level":14},"step-3-confirm-git-and-shell",[16,3310,3312],{"id":3311},"confirm-git-and-shell","Confirm Git And Shell",[107,3314,3315,3327],{"gap":109,"left-width":186,"right-width":607},[112,3316,3317,3319,3322,3324],{"v-slot:left":114},[59,3318,117],{},[119,3320],{"language":122,"src":3321},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fconfirm-git-and-shell-03.sh",[59,3323,128],{},[119,3325],{"language":132,"src":3326},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fexample-output-04.txt",[112,3328,3329,3332],{"v-slot:right":114},[59,3330,3331],{},"This confirms:",[20,3333,3334,3337,3340],{},[23,3335,3336],{},"Git is installed",[23,3338,3339],{},"The terminal can find Git",[23,3341,3342],{},"Your shell matches later course commands",[11,3344,3346,3350],{"id":3345,"level":14},"step-4-cli-safety-check-before-every-git-command",[16,3347,3349],{"id":3348},"check-location-before-git-commands","Check Location Before Git Commands",[107,3351,3352,3364],{"gap":109,"left-width":384,"right-width":534},[112,3353,3354,3356,3359,3361],{"v-slot:left":114},[59,3355,117],{},[119,3357],{"language":122,"src":3358},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fcheck-location-before-git-commands-05.sh",[59,3360,128],{},[119,3362],{"language":132,"src":3363},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools\u002Fexample-output-06.txt",[112,3365,3366,3369],{"v-slot:right":114},[59,3367,3368],{},"Use this before Git commands:",[20,3370,3371,3376,3381,3384],{},[23,3372,3373,3375],{},[198,3374,1814],{}," shows the current folder",[23,3377,3378,3380],{},[198,3379,2484],{}," shows what is inside it",[23,3382,3383],{},"If the folder is wrong, fix location first",[23,3385,3386],{},"Do not run Git commands while guessing",[11,3388,3389,3391],{"id":2487,"level":14},[16,3390,2490],{"id":2487},[107,3392,3393,3435],{"gap":109,"left-width":110,"right-width":110},[112,3394,3395],{"v-slot:left":114},[20,3396,3397,3410,3427],{},[23,3398,3399,3402],{},[198,3400,3401],{},"git: command not found",[20,3403,3404,3407],{},[23,3405,3406],{},"Git is missing, or this terminal cannot find it",[23,3408,3409],{},"Close the terminal and reopen the correct one",[23,3411,3412,3415],{},[198,3413,3414],{},"not a git repository",[20,3416,3417,3420],{},[23,3418,3419],{},"The command ran outside a cloned repository",[23,3421,422,3422,287,3424,3426],{},[198,3423,1814],{},[198,3425,2484],{},", then move to the repo folder",[23,3428,3429,3430],{},"Wrong terminal",[20,3431,3432],{},[23,3433,3434],{},"Windows users should switch back to Git Bash",[112,3436,3437,3440],{"v-slot:right":114},[23,3438,3439],{},"Too many terminals open",[909,3441,3442,3445,3455,3460,3466],{},[23,3443,3444],{},"Close extra terminal windows",[23,3446,3447,3448],{},"Open the correct terminal\n",[20,3449,3450,3452],{},[23,3451,51],{},[23,3453,3454],{},"Apple macOS\u002FLinux: Terminal",[23,3456,3457,3458],{},"Run ",[198,3459,964],{},[23,3461,3457,3462,287,3464],{},[198,3463,1814],{},[198,3465,2484],{},[23,3467,3468],{},"Continue only after the folder looks right",[11,3470,3471,3473],{"id":1000,"level":14},[16,3472,1004],{"id":1003},[107,3474,3475,3497],{"gap":109,"left-width":110,"right-width":110},[112,3476,3477,3479,3485,3491],{"v-slot:left":114},[528,3478,1012],{"id":1011},[59,3480,3481,3484],{},[295,3482,3483],{},"Terminal"," - A text-based interface where you type commands to control your computer",[59,3486,3487,3490],{},[295,3488,3489],{},"CLI (Command Line Interface)"," - The text-based interface where you type commands",[59,3492,3493,3496],{},[295,3494,3495],{},"Git"," - A tool for tracking changes in code files over time",[112,3498,3499,3501],{"v-slot:right":114},[528,3500,1041],{"id":1000},[20,3502,3503,3510,3516,3522],{},[23,3504,3505],{},[1047,3506,3509],{"href":3507,"rel":3508},"https:\u002F\u002Fgit-scm.com\u002Fdownloads",[1051],"Git Downloads",[23,3511,3512],{},[1047,3513,3515],{"href":2793,"rel":3514},[1051],"Git For Windows Install Page",[23,3517,3518],{},[1047,3519,3521],{"href":3247,"rel":3520},[1051],"iTerm2 Downloads",[23,3523,3524],{},[1047,3525,3528],{"href":3526,"rel":3527},"https:\u002F\u002Fgnunn1.github.io\u002Ftilix-web\u002F",[1051],"Tilix",[11,3530,3531,3533,3536],{"id":1076,"level":14},[16,3532,1079],{"id":1076},[59,3534,3535],{},"Before moving on, confirm you can:",[20,3537,3538,3541,3545,3552,3555],{},[23,3539,3540],{},"Open the correct terminal for your operating system",[23,3542,3457,3543],{},[198,3544,964],{},[23,3546,422,3547,287,3549,3551],{},[198,3548,1814],{},[198,3550,2484],{}," to check your location",[23,3553,3554],{},"Understand what terminal\u002FCLI refers to",[23,3556,3557],{},"Keep track of terminal instances",{"title":114,"searchDepth":1110,"depth":1110,"links":3559},[3560,3561,3562,3577,3580,3583,3584,3585,3586,3587],{"id":1725,"depth":1110,"text":1728},{"id":2756,"depth":1110,"text":2757},{"id":2785,"depth":1110,"text":2786,"children":3563},[3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576],{"id":2809,"depth":1126,"text":2812},{"id":2845,"depth":1126,"text":2848},{"id":2876,"depth":1126,"text":2879},{"id":2908,"depth":1126,"text":2911},{"id":2942,"depth":1126,"text":2945},{"id":2974,"depth":1126,"text":2975},{"id":3004,"depth":1126,"text":3005},{"id":3043,"depth":1126,"text":3044},{"id":3073,"depth":1126,"text":3074},{"id":3101,"depth":1126,"text":3104},{"id":3130,"depth":1126,"text":3133},{"id":3183,"depth":1126,"text":3184},{"id":3198,"depth":1126,"text":3201},{"id":3215,"depth":1110,"text":3218,"children":3578},[3579],{"id":3238,"depth":1126,"text":3239},{"id":3260,"depth":1110,"text":3263,"children":3581},[3582],{"id":3293,"depth":1126,"text":3294},{"id":3311,"depth":1110,"text":3312},{"id":3348,"depth":1110,"text":3349},{"id":2487,"depth":1110,"text":2490},{"id":1003,"depth":1110,"text":1004},{"id":1076,"depth":1110,"text":1079},"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":2726,"description":3588},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F02-install-git-tools",[1157,2718,1654],"21:30","u1x5bq-JmCg","https:\u002F\u002Fyoutu.be\u002Fu1x5bq-JmCg","71DrP8YI_ks4jUswWJXy9rmZOVVoeaJAEPancHNHsV4",{"id":4,"title":5,"audience":6,"body":3601,"contentType":1139,"course":1140,"description":1141,"estimateBasis":1142,"estimatedDiscussionMinutes":1143,"estimatedLiveMinutes":1144,"estimatedTotalMinutes":1145,"extension":1146,"meta":4375,"module":1148,"navigation":1149,"order":1150,"path":1151,"promptAssist":1152,"seo":4376,"status":1154,"stem":1155,"tags":4377,"videoDuration":1161,"videoId":1162,"videoLink":1163,"videoTitle":1164,"week":1148,"__hash__":1165},{"type":8,"value":3602,"toc":4347},[3603,3621,3635,3653,3661,3681,3707,3759,3791,3839,3895,3925,3943,3967,3995,4027,4051,4095,4097,4099,4105,4155,4175,4197,4235,4271,4323],[11,3604,3605,3607],{"id":13,"level":14},[16,3606,18],{"id":13},[20,3608,3609,3611,3613,3615,3617,3619],{},[23,3610,25],{},[23,3612,28],{},[23,3614,31],{},[23,3616,34],{},[23,3618,37],{},[23,3620,40],{},[11,3622,3623,3625,3633],{"id":43,"level":14},[16,3624,46],{"id":43},[20,3626,3627,3629,3631],{},[23,3628,51],{},[23,3630,54],{},[23,3632,57],{},[59,3634,61],{},[11,3636,3637,3639],{"id":64,"level":14},[16,3638,67],{"id":64},[20,3640,3641,3643,3649,3651],{},[23,3642,72],{},[23,3644,75,3645],{},[20,3646,3647],{},[23,3648,80],{},[23,3650,83],{},[23,3652,86],{},[11,3654,3655,3657,3659],{"id":89,"level":14},[16,3656,92],{"id":89},[94,3658],{"code":96},[59,3660,99],{},[11,3662,3663,3665],{"id":102,"level":14},[16,3664,105],{"id":102},[107,3666,3667,3673],{"gap":109,"left-width":110,"right-width":110},[112,3668,3669,3671],{"v-slot:left":114},[59,3670,117],{},[119,3672],{"label":121,"language":122,"src":123},[112,3674,3675,3677,3679],{"v-slot:right":114},[59,3676,128],{},[119,3678],{"label":131,"language":132,"src":133},[59,3680,136],{},[11,3682,3683,3685],{"id":139,"level":14},[16,3684,143],{"id":142},[107,3686,3687,3701],{"gap":109,"left-width":110,"right-width":146},[112,3688,3689],{"v-slot:left":114},[20,3690,3691,3693,3695,3697,3699],{},[23,3692,153],{},[23,3694,156],{},[23,3696,159],{},[23,3698,162],{},[23,3700,165],{},[112,3702,3703],{"v-slot:right":114},[59,3704,3705],{},[171,3706],{"alt":173,"src":174,"variant":175},[11,3708,3709,3711],{"id":178,"level":14},[16,3710,182],{"id":181},[107,3712,3713,3753],{"gap":109,"left-width":185,"right-width":186},[112,3714,3715,3717],{"v-slot:left":114},[59,3716,191],{},[20,3718,3719,3723,3727,3731,3739,3743,3745,3751],{},[23,3720,196,3721],{},[198,3722,200],{},[23,3724,203,3725],{},[198,3726,206],{},[23,3728,209,3729],{},[198,3730,212],{},[23,3732,215,3733,219,3735,223,3737,227],{},[198,3734,218],{},[198,3736,222],{},[198,3738,226],{},[23,3740,230,3741],{},[198,3742,233],{},[23,3744,236],{},[23,3746,239,3747],{},[20,3748,3749],{},[23,3750,244],{},[23,3752,247],{},[112,3754,3755],{"v-slot:right":114},[59,3756,3757],{},[171,3758],{"alt":254,"src":255,"variant":175},[11,3760,3761,3763,3783],{"id":258,"level":14},[16,3762,262],{"id":261},[107,3764,3765,3771],{"gap":109,"left-width":110,"right-width":110},[112,3766,3767,3769],{"v-slot:left":114},[59,3768,117],{},[119,3770],{"label":271,"language":122,"src":272},[112,3772,3773,3775,3777],{"v-slot:right":114},[59,3774,277],{},[119,3776],{"label":131,"language":132,"src":280},[59,3778,283,3779,287,3781],{},[198,3780,286],{},[198,3782,290],{},[59,3784,293,3785,298,3787,302,3789,306],{},[295,3786,297],{},[198,3788,301],{},[198,3790,305],{},[11,3792,3793,3795,3797,3799,3801,3803],{"id":309,"level":14},[16,3794,313],{"id":312},[59,3796,117],{},[119,3798],{"label":318,"language":122,"src":319},[59,3800,277],{},[119,3802],{"label":131,"language":132,"src":324},[20,3804,3805,3823,3827,3831],{},[23,3806,329,3807],{},[20,3808,3809,3813,3817],{},[23,3810,3811,337],{},[198,3812,336],{},[23,3814,3815,343],{},[198,3816,342],{},[23,3818,3819,349,3821,353],{},[198,3820,348],{},[198,3822,352],{},[23,3824,3825,358],{},[198,3826,286],{},[23,3828,3829,363],{},[198,3830,290],{},[23,3832,366,3833],{},[20,3834,3835,3837],{},[23,3836,371],{},[23,3838,374],{},[11,3840,3841,3843,3857,3879],{"id":377,"level":14},[16,3842,381],{"id":380},[107,3844,3845,3851],{"gap":109,"left-width":384,"right-width":110},[112,3846,3847,3849],{"v-slot:left":114},[59,3848,117],{},[119,3850],{"label":391,"language":122,"src":392},[112,3852,3853,3855],{"v-slot:right":114},[59,3854,277],{},[119,3856],{"label":131,"language":132,"src":399},[20,3858,3859,3863,3877],{},[23,3860,3861,407],{},[198,3862,406],{},[23,3864,410,3865,414,3867,3869],{},[198,3866,413],{},[198,3868,417],{},[20,3870,3871],{},[23,3872,422,3873,426,3875,430],{},[198,3874,425],{},[198,3876,429],{},[23,3878,433],{},[107,3880,3881,3887],{"gap":109,"left-width":110,"right-width":110},[112,3882,3883,3885],{"v-slot:left":114},[59,3884,117],{},[119,3886],{"label":442,"language":122,"src":443},[112,3888,3889,3891,3893],{"v-slot:right":114},[59,3890,128],{},[119,3892],{"label":131,"language":132,"src":450},[59,3894,453],{},[11,3896,3897,3899,3913],{"id":456,"level":14},[16,3898,460],{"id":459},[107,3900,3901,3907],{"gap":109,"left-width":110,"right-width":110},[112,3902,3903,3905],{"v-slot:left":114},[59,3904,117],{},[119,3906],{"label":469,"language":122,"src":470},[112,3908,3909,3911],{"v-slot:right":114},[59,3910,277],{},[119,3912],{"label":131,"language":132,"src":477},[20,3914,3915,3921],{},[23,3916,482,3917,486,3919,489],{},[198,3918,485],{},[198,3920,342],{},[23,3922,492,3923,495],{},[198,3924,286],{},[11,3926,3927,3929],{"id":498,"level":14},[16,3928,502],{"id":501},[20,3930,3931,3933,3937,3939,3941],{},[23,3932,507],{},[23,3934,510,3935],{},[198,3936,513],{},[23,3938,516],{},[23,3940,519],{},[23,3942,522],{},[11,3944,3945,3947],{"id":525,"level":526},[528,3946,531],{"id":530},[107,3948,3949,3955],{"gap":109,"left-width":384,"right-width":534,"stack":535},[112,3950,3951],{"v-slot:left":114},[59,3952,3953],{},[171,3954],{"alt":542,"src":543,"variant":175},[112,3956,3957],{"v-slot:right":114},[20,3958,3959,3961,3965],{},[23,3960,550],{},[23,3962,203,3963],{},[198,3964,555],{},[23,3966,558],{},[11,3968,3969,3971],{"id":561,"level":526},[528,3970,565],{"id":564},[107,3972,3973,3979],{"gap":109,"left-width":384,"right-width":534,"stack":535},[112,3974,3975],{"v-slot:left":114},[59,3976,3977],{},[171,3978],{"alt":574,"src":575,"variant":175},[112,3980,3981],{"v-slot:right":114},[20,3982,3983,3987,3991],{},[23,3984,582,3985,586],{},[198,3986,585],{},[23,3988,589,3989],{},[198,3990,513],{},[23,3992,203,3993],{},[198,3994,596],{},[11,3996,3997,3999],{"id":599,"level":526},[528,3998,603],{"id":602},[107,4000,4001,4007],{"gap":109,"left-width":606,"right-width":607,"stack":535},[112,4002,4003],{"v-slot:left":114},[59,4004,4005],{},[171,4006],{"alt":614,"src":615,"variant":175},[112,4008,4009],{"v-slot:right":114},[20,4010,4011,4015,4019,4021,4025],{},[23,4012,622,4013],{},[198,4014,625],{},[23,4016,628,4017],{},[198,4018,631],{},[23,4020,634],{},[23,4022,196,4023],{},[198,4024,639],{},[23,4026,642],{},[11,4028,4029,4031],{"id":645,"level":14},[16,4030,649],{"id":648},[107,4032,4033,4043],{"gap":109,"left-width":110,"right-width":384},[112,4034,4035,4037,4039],{"v-slot:left":114},[59,4036,117],{},[119,4038],{"label":658,"language":122,"src":659},[59,4040,662,4041,666],{},[198,4042,665],{},[112,4044,4045,4047,4049],{"v-slot:right":114},[59,4046,128],{},[119,4048],{"label":131,"language":132,"src":673},[59,4050,676],{},[11,4052,4053,4055],{"id":679,"level":14},[16,4054,683],{"id":682},[107,4056,4057,4083],{"gap":109,"left-width":534,"right-width":384},[112,4058,4059,4061,4079],{"v-slot:left":114},[528,4060,691],{"id":690},[20,4062,4063,4067,4071,4075],{},[23,4064,696,4065],{},[198,4066,699],{},[23,4068,702,4069,706],{},[198,4070,705],{},[23,4072,709,4073,713],{},[198,4074,712],{},[23,4076,716,4077,720],{},[198,4078,719],{},[59,4080,4081],{},[171,4082],{"alt":725,"src":726,"variant":175},[112,4084,4085,4087,4089],{"v-slot:right":114},[59,4086,731],{},[119,4088],{"label":734,"language":122,"src":735},[737,4090,4091],{"type":739},[59,4092,742,4093,746],{},[198,4094,745],{},[59,4096,277],{},[119,4098],{"label":131,"language":132,"src":751},[59,4100,754,4101,758,4103,762],{},[198,4102,757],{},[198,4104,761],{},[11,4106,4107,4109,4123,4137,4151],{"id":765,"level":14},[16,4108,769],{"id":768},[107,4110,4111,4117],{"gap":109,"left-width":110,"right-width":110},[112,4112,4113,4115],{"v-slot:left":114},[59,4114,776],{},[119,4116],{"label":779,"language":122,"src":780},[112,4118,4119,4121],{"v-slot:right":114},[59,4120,128],{},[119,4122],{"label":787,"language":132,"src":788},[107,4124,4125,4131],{"gap":109,"left-width":110,"right-width":110},[112,4126,4127,4129],{"v-slot:left":114},[59,4128,795],{},[119,4130],{"label":798,"language":122,"src":799},[112,4132,4133,4135],{"v-slot:right":114},[59,4134,128],{},[119,4136],{"label":806,"language":132,"src":807},[20,4138,4139,4143,4147],{},[23,4140,4141,815],{},[198,4142,814],{},[23,4144,4145,821],{},[198,4146,820],{},[23,4148,4149,827],{},[198,4150,826],{},[59,4152,830,4153,834],{},[198,4154,833],{},[11,4156,4157,4159,4161,4173],{"id":837,"level":14},[16,4158,841],{"id":840},[59,4160,844],{},[20,4162,4163,4165,4169,4171],{},[23,4164,849],{},[23,4166,852,4167],{},[198,4168,855],{},[23,4170,858],{},[23,4172,861],{},[59,4174,864],{},[11,4176,4177,4179],{"id":867,"level":14},[16,4178,870],{"id":867},[20,4180,4181,4185,4189,4193,4195],{},[23,4182,4183,878],{},[198,4184,877],{},[23,4186,881,4187,885],{},[198,4188,884],{},[23,4190,888,4191,892],{},[198,4192,891],{},[23,4194,895],{},[23,4196,898],{},[11,4198,4199,4201,4203,4227],{"id":901,"level":526},[528,4200,905],{"id":904},[59,4202,117],{},[909,4204,4205,4209,4213,4217,4221,4223],{},[23,4206,4207],{},[198,4208,406],{},[23,4210,4211],{},[198,4212,417],{},[23,4214,4215],{},[198,4216,884],{},[23,4218,4219],{},[198,4220,927],{},[23,4222,930],{},[23,4224,4225],{},[198,4226,935],{},[59,4228,938,4229,941,4231,944,4233,948],{},[198,4230,406],{},[198,4232,413],{},[198,4234,947],{},[11,4236,4237,4239,4241],{"id":951,"level":14},[16,4238,954],{"id":951},[59,4240,957],{},[20,4242,4243,4247,4253,4257,4259,4263,4265],{},[23,4244,4245,965],{},[198,4246,964],{},[23,4248,4249,970,4251],{},[198,4250,884],{},[198,4252,286],{},[23,4254,4255,977],{},[198,4256,935],{},[23,4258,980],{},[23,4260,4261,985],{},[198,4262,855],{},[23,4264,988],{},[23,4266,4267,287,4269,997],{},[198,4268,993],{},[198,4270,996],{},[11,4272,4273,4275],{"id":1000,"level":14},[16,4274,1004],{"id":1003},[107,4276,4277,4297],{"gap":109,"left-width":110,"right-width":110},[112,4278,4279,4281,4285,4289,4293],{"v-slot:left":114},[528,4280,1012],{"id":1011},[59,4282,4283,1018],{},[295,4284,1017],{},[59,4286,4287,1024],{},[295,4288,1023],{},[59,4290,4291,1030],{},[295,4292,1029],{},[59,4294,4295,1036],{},[295,4296,1035],{},[112,4298,4299,4301],{"v-slot:right":114},[528,4300,1041],{"id":1000},[20,4302,4303,4308,4313,4318],{},[23,4304,4305],{},[1047,4306,1052],{"href":1049,"rel":4307},[1051],[23,4309,4310],{},[1047,4311,1059],{"href":1057,"rel":4312},[1051],[23,4314,4315],{},[1047,4316,1066],{"href":1064,"rel":4317},[1051],[23,4319,4320],{},[1047,4321,1073],{"href":1071,"rel":4322},[1051],[11,4324,4325,4327,4329],{"id":1076,"level":14},[16,4326,1079],{"id":1076},[59,4328,1082],{},[20,4330,4331,4333,4335,4337,4339,4341,4345],{},[23,4332,1087],{},[23,4334,1090],{},[23,4336,1093],{},[23,4338,1096],{},[23,4340,1099],{},[23,4342,1102,4343],{},[198,4344,1105],{},[23,4346,1108],{},{"title":114,"searchDepth":1110,"depth":1110,"links":4348},[4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4365,4366,4367,4368,4369,4372,4373,4374],{"id":13,"depth":1110,"text":18},{"id":43,"depth":1110,"text":46},{"id":64,"depth":1110,"text":67},{"id":89,"depth":1110,"text":92},{"id":102,"depth":1110,"text":105},{"id":142,"depth":1110,"text":143},{"id":181,"depth":1110,"text":182},{"id":261,"depth":1110,"text":262},{"id":312,"depth":1110,"text":313},{"id":380,"depth":1110,"text":381},{"id":459,"depth":1110,"text":460},{"id":501,"depth":1110,"text":502,"children":4361},[4362,4363,4364],{"id":530,"depth":1126,"text":531},{"id":564,"depth":1126,"text":565},{"id":602,"depth":1126,"text":603},{"id":648,"depth":1110,"text":649},{"id":682,"depth":1110,"text":683},{"id":768,"depth":1110,"text":769},{"id":840,"depth":1110,"text":841},{"id":867,"depth":1110,"text":870,"children":4370},[4371],{"id":904,"depth":1126,"text":905},{"id":951,"depth":1110,"text":954},{"id":1003,"depth":1110,"text":1004},{"id":1076,"depth":1110,"text":1079},{},{"title":5,"description":1141},[1157,1158,1159,1160],{"id":4379,"title":4380,"audience":6,"body":4381,"contentType":1139,"course":1140,"description":5301,"estimateBasis":5302,"estimatedDiscussionMinutes":1644,"estimatedLiveMinutes":1144,"estimatedTotalMinutes":5303,"extension":1146,"meta":5304,"module":1148,"navigation":1149,"order":5305,"path":5306,"promptAssist":1152,"seo":5307,"status":1154,"stem":5308,"tags":5309,"videoDuration":5312,"videoId":5313,"videoLink":5314,"videoTitle":5315,"week":1148,"__hash__":5316},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs.md","Git Commands And Pull Requests",{"type":8,"value":4382,"toc":5266},[4383,4412,4433,4450,4482,4516,4567,4583,4604,4635,4667,4709,4740,4775,4799,4844,4871,4901,4919,4931,4967,5000,5036,5070,5096,5124,5154,5221,5263],[11,4384,4386,4389,4392],{"id":4385,"level":14},"objectives",[16,4387,4388],{"id":4385},"Objectives",[59,4390,4391],{},"By the end, you should be able to:",[20,4393,4394,4397,4400,4403,4406,4409],{},[23,4395,4396],{},"Explain what the common Git commands do",[23,4398,4399],{},"Connect commands to the working folder, staging area, local commits, and GitHub remote",[23,4401,4402],{},"Create a branch for practice work",[23,4404,4405],{},"Stage, commit, and push a small change",[23,4407,4408],{},"Open a pull request on GitHub",[23,4410,4411],{},"Investigate a failed push and a merge conflict",[11,4413,4415,4419,4422,4425],{"id":4414,"level":14},"git-vs-github",[16,4416,4418],{"id":4417},"git-versus-github","Git Versus GitHub",[59,4420,4421],{},"Git is the tool that tracks file history",[59,4423,4424],{},"GitHub is a website that hosts a remote copy of a Git repository",[20,4426,4427,4430],{},[23,4428,4429],{},"Git: local terminal workflow",[23,4431,4432],{},"GitHub: remote branches, pull requests, issues, and project evidence",[11,4434,4436,4440,4444,4447],{"id":4435,"level":14},"git-stages",[16,4437,4439],{"id":4438},"the-git-stages","The Git Stages",[119,4441],{"language":4442,"src":4443},"text","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fthe-git-stages-01.txt",[59,4445,4446],{},"Common commands:",[119,4448],{"language":4442,"src":4449},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fthe-git-stages-02.txt",[11,4451,4453,4457,4459,4462,4465,4468],{"id":4452,"level":14},"status-first",[16,4454,4456],{"id":4455},"command-1-git-status","Command 1: git status",[59,4458,117],{},[119,4460],{"language":122,"src":4461},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-1-git-status-03.sh",[59,4463,4464],{},"Use this before and after every important Git action",[59,4466,4467],{},"It tells you:",[20,4469,4470,4473,4476,4479],{},[23,4471,4472],{},"Current branch",[23,4474,4475],{},"Changed files",[23,4477,4478],{},"Staged files",[23,4480,4481],{},"Whether your working tree is clean",[11,4483,4485,4489,4491,4494],{"id":4484,"level":14},"branch-command",[16,4486,4488],{"id":4487},"command-2-git-branch","Command 2: git branch",[59,4490,117],{},[119,4492],{"language":122,"src":4493},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-2-git-branch-04.sh",[20,4495,4496,4499,4502],{},[23,4497,4498],{},"Active branch has an asterisk",[23,4500,4501],{},"Branches are separate timelines for work",[23,4503,4504,4505],{},"Branch names are case-sensitive\n",[20,4506,4507],{},[23,4508,4509,287,4512,4515],{},[198,4510,4511],{},"Practice",[198,4513,4514],{},"practice"," are different names",[11,4517,4519,4523,4528,4531],{"id":4518,"level":14},"create-branch",[16,4520,4522],{"id":4521},"practice-step-1-create-a-branch","Practice Step 1: Create A Branch",[59,4524,4525,4526,2373],{},"Start from ",[198,4527,2899],{},[119,4529],{"language":122,"src":4530},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpractice-step-1-create-a-05.sh",[20,4532,4533,4544],{},[23,4534,4535,4536,4538,4539],{},"First two commands: make sure ",[198,4537,2899],{}," is current\n",[20,4540,4541],{},[23,4542,4543],{},"Explained more later",[23,4545,4546,4547],{},"Branch control commands\n",[20,4548,4549,4555,4561],{},[23,4550,4551,4554],{},[198,4552,4553],{},"git checkout -b practice",": create and switch",[23,4556,4557,4560],{},[198,4558,4559],{},"git branch practice",": create only",[23,4562,4563,4566],{},[198,4564,4565],{},"git checkout practice",": switch to existing",[11,4568,4570,4574,4577,4580],{"id":4569,"level":14},"make-file",[16,4571,4573],{"id":4572},"practice-step-2-make-a-small-file","Practice Step 2: Make A Small File",[59,4575,4576],{},"Create a small practice file:",[119,4578],{"language":122,"src":4579},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpractice-step-2-make-a-s-06.sh",[59,4581,4582],{},"Expected result: Git shows the new file as untracked",[11,4584,4586,4590,4593,4596,4599],{"id":4585,"level":14},"add-command",[16,4587,4589],{"id":4588},"command-3-git-add","Command 3: git add",[59,4591,4592],{},"Stage the new file:",[119,4594],{"language":122,"src":4595},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-3-git-add-07.sh",[59,4597,4598],{},"Staging means: include this change in the next commit",[20,4600,4601],{},[23,4602,4603],{},"See below for add patterns and verification checks",[11,4605,4607,4611,4614,4617],{"id":4606,"level":526},"add-variants",[528,4608,4610],{"id":4609},"common-git-add-patterns","Common git add Patterns",[59,4612,4613],{},"Use the smallest clear target when possible",[119,4615],{"language":122,"src":4616},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommon-git-add-patterns-08.sh",[20,4618,4619,4622,4625],{},[23,4620,4621],{},"Single file: safest when you changed one file",[23,4623,4624],{},"Folder: useful when one feature is grouped in one folder",[23,4626,4627,4630,4631,4634],{},[198,4628,4629],{},"git add .",": convenient, but review ",[198,4632,4633],{},"git status"," first",[11,4636,4638,4642,4645,4648],{"id":4637,"level":14},"diff-command",[16,4639,4641],{"id":4640},"command-4-git-diff","Command 4: git diff",[59,4643,4644],{},"Before committing, inspect what changed:",[119,4646],{"language":122,"src":4647},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-4-git-diff-09.sh",[20,4649,4650,4657,4660,4665],{},[23,4651,4652,4653,4656],{},"New untracked file: ",[198,4654,4655],{},"git diff"," may show nothing",[23,4658,4659],{},"That does not mean the file is missing",[23,4661,422,4662,4664],{},[198,4663,4633],{}," to confirm untracked files",[23,4666,2435],{},[11,4668,4670,4674,4677,4680,4683,4686],{"id":4669,"level":526},"cached-rm",[528,4671,4673],{"id":4672},"if-you-staged-the-wrong-file","If You Staged The Wrong File",[59,4675,4676],{},"If a file was staged by mistake, remove it from staging:",[119,4678],{"language":122,"src":4679},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fif-you-staged-the-wrong--10.sh",[59,4681,4682],{},"For a folder:",[119,4684],{"language":122,"src":4685},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fif-you-staged-the-wrong--11.sh",[20,4687,4688,4699],{},[23,4689,4690,4693,4694],{},[198,4691,4692],{},"--cached",": remove from staging only\n",[20,4695,4696],{},[23,4697,4698],{},"Keeps the file in your working folder",[23,4700,4701,4703,4704],{},[198,4702,1749],{},": folder mode\n",[20,4705,4706],{},[23,4707,4708],{},"Recursive: include files inside the folder",[11,4710,4712,4716,4719,4722,4725],{"id":4711,"level":14},"commit-command",[16,4713,4715],{"id":4714},"command-5-git-commit","Command 5: git commit",[59,4717,4718],{},"Commit the staged file:",[119,4720],{"language":122,"src":4721},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-5-git-commit-12.sh",[59,4723,4724],{},"A commit is a saved checkpoint in your local repository",[20,4726,4727,4738],{},[23,4728,4729,4732,4733],{},[198,4730,4731],{},"-m",": commit message",[20,4734,4735],{},[23,4736,4737],{},"Required, even if the message is an empty string",[23,4739,2435],{},[11,4741,4743,4747,4749,4752,4772],{"id":4742,"level":526},"log-command",[528,4744,4746],{"id":4745},"check-the-local-history","Check The Local History",[59,4748,117],{},[119,4750],{"language":122,"src":4751},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcheck-the-local-history-13.sh",[20,4753,4754,4760,4766],{},[23,4755,4756,4759],{},[198,4757,4758],{},"log",": show commit history",[23,4761,4762,4765],{},[198,4763,4764],{},"--oneline",": one commit per line",[23,4767,4768,4771],{},[198,4769,4770],{},"-5",": show the latest five commits",[59,4773,4774],{},"You should see your latest commit near the top",[11,4776,4778,4782,4785,4788],{"id":4777,"level":14},"push-command",[16,4779,4781],{"id":4780},"command-6-git-push","Command 6: git push",[59,4783,4784],{},"Send the branch to GitHub:",[119,4786],{"language":122,"src":4787},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fcommand-6-git-push-14.sh",[20,4789,4790,4796],{},[23,4791,4792,4795],{},[198,4793,4794],{},"origin",": common remote name for GitHub",[23,4797,4798],{},"Final part: branch you are pushing",[11,4800,4802,4806],{"id":4801,"level":14},"open-pr",[16,4803,4805],{"id":4804},"pull-request","Pull Request",[107,4807,4808,4836],{"gap":109,"left-width":110,"right-width":110},[112,4809,4810,4813,4816,4819,4822,4825],{"v-slot:left":114},[59,4811,4812],{},"On GitHub, open a pull request",[59,4814,4815],{},"Use this direction:",[119,4817],{"language":4442,"src":4818},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-request-15.txt",[59,4820,4821],{},"Use a clear description:",[119,4823],{"language":4442,"src":4824},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-request-description-16.txt",[20,4826,4827,4830,4833],{},[23,4828,4829],{},"Review page before merge",[23,4831,4832],{},"Shows what will change",[23,4834,4835],{},"Captures branch evidence",[112,4837,4838],{"v-slot:right":114},[59,4839,4840],{},[171,4841],{"alt":4842,"src":4843,"variant":175},"GitHub pull request creation page showing base main and compare practice","\u002Fimages\u002Fshared\u002Fgit-workflow\u002Fgithub-create-pull-request.png",[11,4845,4847,4851,4854,4862,4865,4868],{"id":4846,"level":14},"merge-pr",[16,4848,4850],{"id":4849},"merge-and-sync","Merge And Sync",[59,4852,4853],{},"After GitHub merge:",[20,4855,4856],{},[23,4857,4858,4859,4861],{},"Local ",[198,4860,2899],{}," is not updated automatically",[59,4863,4864],{},"Sync it:",[119,4866],{"language":122,"src":4867},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fmerge-and-sync-15.sh",[59,4869,4870],{},"Remote changes must be pulled down intentionally",[11,4872,4874,4878,4881,4898],{"id":4873,"level":14},"why-prs",[16,4875,4877],{"id":4876},"why-pull-requests-matter","Why Pull Requests Matter",[59,4879,4880],{},"Pull requests create evidence:",[20,4882,4883,4886,4889,4892,4895],{},[23,4884,4885],{},"Which branch changed",[23,4887,4888],{},"Which files changed",[23,4890,4891],{},"What discussion or explanation was provided",[23,4893,4894],{},"Chance to review risky changes before merging",[23,4896,4897],{},"When the change was merged",[59,4899,4900],{},"For this course, pull requests are part of the workflow evidence, not just a GitHub feature",[11,4902,4904,4908,4911],{"id":4903,"level":14},"exploration-intro",[16,4905,4907],{"id":4906},"troubleshooting-explorations","Troubleshooting Explorations",[59,4909,4910],{},"The next slides use controlled problems to practice recovery",[20,4912,4913,4916],{},[23,4914,4915],{},"The goal is not avoiding every error",[23,4917,4918],{},"The goal is reading output, identifying state, and recovering without guessing",[11,4920,4922,4925,4928],{"id":4921,"level":14},"exploration-setup",[16,4923,4924],{"id":4921},"Exploration Setup",[59,4926,4927],{},"Create a conflict practice branch:",[119,4929],{"language":122,"src":4930},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fexploration-setup-16.sh",[11,4932,4934,4938,4944,4951,4956,4959,4962],{"id":4933,"level":14},"exploration-issue-1",[16,4935,4937],{"id":4936},"exploration-issue-1-push-rejected","Exploration Issue 1: Push Rejected",[59,4939,4940,4941],{},"On GitHub, switch to ",[198,4942,4943],{},"practice-conflict",[59,4945,4946,4947,4950],{},"Edit one line in ",[198,4948,4949],{},"myFile.txt"," directly on GitHub and commit the change",[20,4952,4953],{},[23,4954,4955],{},"Use the same line you will change locally",[59,4957,4958],{},"Back locally, edit that same line and commit:",[119,4960],{"language":122,"src":4961},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fexploration-issue-1-push-17.sh",[20,4963,4964],{},[23,4965,4966],{},"See the slides below for the rejected push and the pull that creates the conflict",[11,4968,4970,4974,4977],{"id":4969,"level":526},"issue-1-push-without-pulling",[528,4971,4973],{"id":4972},"try-push-without-pulling","Try Push Without Pulling",[59,4975,4976],{},"Push the local commit before pulling the GitHub commit:",[107,4978,4979,4992],{"gap":109,"left-width":110,"right-width":110},[112,4980,4981,4984],{"v-slot:left":114},[119,4982],{"language":122,"src":4983},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Ftry-push-without-pulling-20.sh",[20,4985,4986,4989],{},[23,4987,4988],{},"Expected result: push rejected",[23,4990,4991],{},"Reason: GitHub has a commit your local branch does not have",[112,4993,4994],{"v-slot:right":114},[59,4995,4996],{},[171,4997],{"alt":4998,"src":4999,"variant":175},"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,5001,5003,5007],{"id":5002,"level":526},"issue-1-read-output",[528,5004,5006],{"id":5005},"pull-the-remote-change","Pull The Remote Change",[107,5008,5009,5028],{"gap":109,"left-width":110,"right-width":110},[112,5010,5011,5014,5017,5020,5025],{"v-slot:left":114},[59,5012,5013],{},"The usual next command is:",[119,5015],{"language":122,"src":5016},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-the-remote-change-20.sh",[59,5018,5019],{},"If Git asks how to reconcile divergent branches:",[20,5021,5022],{},[23,5023,5024],{},"Use merge behavior for this course practice",[119,5026],{"language":122,"src":5027},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fpull-the-remote-change-21.sh",[112,5029,5030],{"v-slot:right":114},[59,5031,5032],{},[171,5033],{"alt":5034,"src":5035,"variant":175},"Git pull output asking how to reconcile divergent branches","\u002Fimages\u002Fshared\u002Fgit-workflow\u002Fgit-pull-divergent-branches.png",[11,5037,5039,5043,5046,5050,5053,5056,5059],{"id":5038,"level":14},"exploration-issue-2",[16,5040,5042],{"id":5041},"exploration-issue-2-merge-conflict","Exploration Issue 2: Merge Conflict",[59,5044,5045],{},"After pulling, Git should report a conflict",[59,5047,589,5048],{},[198,5049,4949],{},[59,5051,5052],{},"You may see markers like:",[119,5054],{"language":4442,"src":5055},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fexploration-issue-2-merg-18.txt",[59,5057,5058],{},"Conflict markers show:",[20,5060,5061,5064,5067],{},[23,5062,5063],{},"Your local version",[23,5065,5066],{},"The GitHub version",[23,5068,5069],{},"The part Git could not combine automatically",[11,5071,5073,5077,5083,5086,5089,5092],{"id":5072,"level":526},"resolve-conflict",[528,5074,5076],{"id":5075},"resolve-the-conflict","Resolve The Conflict",[59,5078,5079,5080,5082],{},"Edit ",[198,5081,4949],{}," so it contains the final text you want",[59,5084,5085],{},"Remove all conflict markers",[59,5087,5088],{},"Then run:",[119,5090],{"language":122,"src":5091},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs\u002Fresolve-the-conflict-19.sh",[20,5093,5094],{},[23,5095,2435],{},[11,5097,5099,5103,5106],{"id":5098,"level":526},"verify-conflict-resolution",[528,5100,5102],{"id":5101},"verify-the-recovery","Verify The Recovery",[59,5104,5105],{},"Check:",[20,5107,5108,5113,5116,5121],{},[23,5109,5110,5112],{},[198,5111,4633],{}," is clean",[23,5114,5115],{},"GitHub shows the updated branch",[23,5117,5118,5120],{},[198,5119,4949],{}," contains the final text",[23,5122,5123],{},"No conflict markers remain",[11,5125,5126,5128],{"id":2487,"level":14},[16,5127,2490],{"id":2487},[20,5129,5130,5133,5136,5139,5142,5151],{},[23,5131,5132],{},"Committing on the wrong branch",[23,5134,5135],{},"Forgetting to push after committing",[23,5137,5138],{},"Forgetting to pull after merging on GitHub",[23,5140,5141],{},"Leaving conflict markers in a file",[23,5143,5144,5145,302,5148],{},"Using vague branch names like ",[198,5146,5147],{},"stuff",[198,5149,5150],{},"final",[23,5152,5153],{},"Making several unrelated changes in one commit",[11,5155,5156,5158],{"id":1000,"level":14},[16,5157,1004],{"id":1003},[107,5159,5160,5184],{"gap":109,"left-width":110,"right-width":110},[112,5161,5162,5164],{"v-slot:left":114},[528,5163,1012],{"id":1011},[20,5165,5166,5169,5172,5175,5178,5181],{},[23,5167,5168],{},"Working folder: files you can edit",[23,5170,5171],{},"Staging area: changes selected for the next commit",[23,5173,5174],{},"Commit: local saved checkpoint",[23,5176,5177],{},"Remote: GitHub copy of the repository",[23,5179,5180],{},"Pull request: GitHub page for reviewing and merging branch work",[23,5182,5183],{},"Conflict: a change Git cannot merge automatically",[112,5185,5186,5188],{"v-slot:right":114},[528,5187,1041],{"id":1000},[20,5189,5190,5198,5205,5213],{},[23,5191,5192,5193],{},"Pro Git Book: ",[1047,5194,5197],{"href":5195,"rel":5196},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGit-Basics-Getting-a-Git-Repository",[1051],"Git Basics",[23,5199,5192,5200],{},[1047,5201,5204],{"href":5202,"rel":5203},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGit-Branching-Basic-Branching-and-Merging",[1051],"Basic Branching and Merging",[23,5206,5207,5208],{},"GitHub Docs: ",[1047,5209,5212],{"href":5210,"rel":5211},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpull-requests\u002Fcollaborating-with-pull-requests\u002Fproposing-changes-to-your-work-with-pull-requests\u002Fcreating-a-pull-request",[1051],"Creating a pull request",[23,5214,5215,5216],{},"Oh Shit, Git!?!: ",[1047,5217,5220],{"href":5218,"rel":5219},"https:\u002F\u002Fohshitgit.com\u002F",[1051],"Common Git recovery situations",[11,5222,5223,5225],{"id":1076,"level":14},[16,5224,1079],{"id":1076},[107,5226,5229,5253],{"gap":1146,"left-width":5227,"right-width":5228},"0.72fr","1.38fr",[112,5230,5231,5233],{"v-slot:left":114},[59,5232,1082],{},[20,5234,5235,5241,5244,5247,5250],{},[23,5236,5237,5238,5240],{},"Read ",[198,5239,4633],{}," before choosing the next command",[23,5242,5243],{},"Move a change from working folder to staging area to commit",[23,5245,5246],{},"Push a branch to GitHub and open a pull request",[23,5248,5249],{},"Recognize when a failed push or conflict needs recovery",[23,5251,5252],{},"Next: open the cloned repository in VS Code",[112,5254,5255,5258],{"v-slot:right":114},[59,5256,5257],{},"Git\u002FGitHub flow:",[5259,5260],"figure-image",{"alt":5261,"src":5262},"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",[59,5264,5265],{},"::",{"title":114,"searchDepth":1110,"depth":1110,"links":5267},[5268,5269,5270,5271,5272,5273,5274,5275,5278,5281,5284,5285,5286,5287,5288,5289,5290,5294,5298,5299,5300],{"id":4385,"depth":1110,"text":4388},{"id":4417,"depth":1110,"text":4418},{"id":4438,"depth":1110,"text":4439},{"id":4455,"depth":1110,"text":4456},{"id":4487,"depth":1110,"text":4488},{"id":4521,"depth":1110,"text":4522},{"id":4572,"depth":1110,"text":4573},{"id":4588,"depth":1110,"text":4589,"children":5276},[5277],{"id":4609,"depth":1126,"text":4610},{"id":4640,"depth":1110,"text":4641,"children":5279},[5280],{"id":4672,"depth":1126,"text":4673},{"id":4714,"depth":1110,"text":4715,"children":5282},[5283],{"id":4745,"depth":1126,"text":4746},{"id":4780,"depth":1110,"text":4781},{"id":4804,"depth":1110,"text":4805},{"id":4849,"depth":1110,"text":4850},{"id":4876,"depth":1110,"text":4877},{"id":4906,"depth":1110,"text":4907},{"id":4921,"depth":1110,"text":4924},{"id":4936,"depth":1110,"text":4937,"children":5291},[5292,5293],{"id":4972,"depth":1126,"text":4973},{"id":5005,"depth":1126,"text":5006},{"id":5041,"depth":1110,"text":5042,"children":5295},[5296,5297],{"id":5075,"depth":1126,"text":5076},{"id":5101,"depth":1126,"text":5102},{"id":2487,"depth":1110,"text":2490},{"id":1003,"depth":1110,"text":1004},{"id":1076,"depth":1110,"text":1079},"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":4380,"description":5301},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F04-git-commands-prs",[1157,5310,5311],"branches","pull-requests","48:54","MOa9zIUOqaI","https:\u002F\u002Fyoutu.be\u002FMOa9zIUOqaI","Git Commands and PRs","GTIGHU5IyAE7RcRy68evvCM5YPZVDAWUbiTdBfC9nCI",{"id":5318,"title":5319,"audience":6,"body":5320,"contentType":1139,"course":1140,"description":6092,"estimateBasis":6093,"estimatedDiscussionMinutes":1643,"estimatedLiveMinutes":1150,"estimatedTotalMinutes":5305,"extension":1146,"meta":6094,"module":1148,"navigation":1149,"order":6095,"path":6096,"promptAssist":1152,"seo":6097,"status":1154,"stem":6098,"tags":6099,"videoDuration":6103,"videoId":6104,"videoLink":6105,"videoTitle":6106,"week":1148,"__hash__":6107},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment.md","Local Development Environment Setup",{"type":8,"value":5321,"toc":6070},[5322,5339,5357,5378,5403,5438,5470,5548,5625,5727,5755,5820,5897,5921,5948,5966,5990,6041],[11,5323,5325,5328],{"id":5324,"level":14},"local-development-environment-title",[16,5326,5319],{"id":5327},"local-development-environment-setup",[20,5329,5330,5333,5336],{},[23,5331,5332],{},"VS Code for editing course files",[23,5334,5335],{},"Course profile for Internet Applications extensions",[23,5337,5338],{},"Optional local PHP check on your own computer",[11,5340,5341,5343],{"id":1725,"level":14},[16,5342,1728],{"id":1725},[20,5344,5345,5348,5351,5354],{},[23,5346,5347],{},"Install VS Code",[23,5349,5350],{},"Open the course repository root",[23,5352,5353],{},"Install the required extensions for the course",[23,5355,5356],{},"Have a local php install as a light weight dev server (as a backup for the VM lessons)",[11,5358,5360,5363],{"id":5359,"level":14},"what-this-setup-does",[16,5361,5362],{"id":5359},"What This Setup Does",[20,5364,5365,5368,5371],{},[23,5366,5367],{},"VS Code: editor for course files",[23,5369,5370],{},"Extensions: syntax help, Git visibility, database viewing, time tracking",[23,5372,5373,5374,5377],{},"Optional host PHP: quick ",[198,5375,5376],{},"php -v"," check and editor support",[11,5379,5381,5384],{"id":5380,"level":14},"step-1-install-vs-code",[16,5382,5383],{"id":5380},"Step 1: Install VS Code",[20,5385,5386,5394,5397,5400],{},[23,5387,5388,5389],{},"Download: ",[1047,5390,5393],{"href":5391,"rel":5392},"https:\u002F\u002Fcode.visualstudio.com\u002FDownload",[1051],"Visual Studio Code",[23,5395,5396],{},"Install like a normal desktop app",[23,5398,5399],{},"Do not install VS Code inside your repository folder",[23,5401,5402],{},"VS Code is the editor; the repo is the workspace folder",[11,5404,5406,5409,5412,5435],{"id":5405,"level":14},"step-2-open-the-repository",[16,5407,5408],{"id":5405},"Step 2: Open The Repository",[59,5410,5411],{},"After the course repo is cloned:",[20,5413,5414,5424,5427,5432],{},[23,5415,5416,5417,5420,5421],{},"VS Code -> ",[198,5418,5419],{},"File"," -> ",[198,5422,5423],{},"Open Folder",[23,5425,5426],{},"Choose the repository root",[23,5428,5429,5430],{},"Folder name should match ",[198,5431,212],{},[23,5433,5434],{},"Trust the workspace only if it is your cloned GitHub repo",[59,5436,5437],{},"Do not open a ZIP copy or clone the same repo again",[11,5439,5441,5445,5467],{"id":5440,"level":14},"step-3-create-course-profile",[16,5442,5444],{"id":5443},"step-3-create-a-course-profile","Step 3: Create A Course Profile",[20,5446,5447,5453,5461,5464],{},[23,5448,5449,5450],{},"Gear icon -> ",[198,5451,5452],{},"Profiles",[23,5454,5455,5456,302,5458],{},"Create ",[198,5457,1140],{},[198,5459,5460],{},"PHP",[23,5462,5463],{},"Switch into that profile",[23,5465,5466],{},"Install course extensions there",[59,5468,5469],{},"Profiles keep this course setup separate from other projects",[11,5471,5473,5476,5480],{"id":5472,"level":14},"step-4-install-extensions",[16,5474,5475],{"id":5472},"Step 4: Install Extensions",[528,5477,5479],{"id":5478},"start-with-these","Start With These",[20,5481,5482,5490,5498,5506,5514,5522,5537,5545],{},[23,5483,5484,5485],{},"Auto Rename Tag (Jun Han)\n",[20,5486,5487],{},[23,5488,5489],{},"Auto-completes matching HTML tags while you edit",[23,5491,5492,5493],{},"Bracket Lens (wraith13)\n",[20,5494,5495],{},[23,5496,5497],{},"Adds readability cues for closing brackets",[23,5499,5500,5501],{},"GitLens (GitKraken)\n",[20,5502,5503],{},[23,5504,5505],{},"Required: Git history, blame, and branch visibility in-editor",[23,5507,5508,5509],{},"MySQL (cweijan)\n",[20,5510,5511],{},[23,5512,5513],{},"Required later: connect to and inspect course database tables",[23,5515,5516,5517],{},"PHP Intelephense (Ben Mewburn)\n",[20,5518,5519],{},[23,5520,5521],{},"PHP language support, syntax checks, and warnings",[23,5523,5524,5525],{},"Todo Tree (Gruntfuggly)\n",[20,5526,5527],{},[23,5528,5529,5530,1746,5533,5536],{},"Finds and lists ",[198,5531,5532],{},"TODO",[198,5534,5535],{},"FIXME",", and similar comments",[23,5538,5539,5540],{},"WakaTime\n",[20,5541,5542],{},[23,5543,5544],{},"Required in sections that use time tracking; needs your API key",[23,5546,5547],{},"See the slides below for MySQL and WakaTime setup",[11,5549,5551,5555],{"id":5550,"level":526},"step-4a-setup-mysql-extension",[16,5552,5554],{"id":5553},"step-4a-configure-mysql-extension","Step 4A: Configure MySQL Extension",[107,5556,5558,5617],{"gap":109,"left-width":534,"right-width":384,"align":5557},"center",[112,5559,5560,5564],{"v-slot:left":114},[528,5561,5563],{"id":5562},"connection-settings","Connection Settings",[20,5565,5566,5569,5614],{},[23,5567,5568],{},"Open the MySQL panel from the VS Code sidebar",[23,5570,5571,5572],{},"Create a new connection with your course database details",[20,5573,5574,5580,5586,5589,5592],{},[23,5575,5576,5577],{},"Host: ",[198,5578,5579],{},"db.ethereallab.app",[23,5581,5582,5583],{},"Port: ",[198,5584,5585],{},"3306",[23,5587,5588],{},"Username: your UCID",[23,5590,5591],{},"Database: your UCID",[23,5593,5594,5595],{},"Password: from your generated connection string\n",[20,5596,5597,5605],{},[23,5598,5599,5600],{},"Get it from the ",[1047,5601,5604],{"href":5602,"rel":5603},"https:\u002F\u002Fcourses.ethereallab.app\u002Fdatabase",[1051],"course database page",[23,5606,5607,5608,287,5611],{},"Use the 12 characters between ",[198,5609,5610],{},"ucid:",[198,5612,5613],{},"@",[23,5615,5616],{},"Save this connection; you will reuse it in later database lessons",[112,5618,5619],{"v-slot:right":114},[59,5620,5621],{},[171,5622],{"alt":5623,"src":5624,"variant":175},"MySQL extension connection setup for the course database","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fmysql-setup.png",[11,5626,5628,5632],{"id":5627,"level":526},"step-4b-setup-wakatime",[16,5629,5631],{"id":5630},"step-4b-configure-wakatime","Step 4B: Configure WakaTime",[107,5633,5635,5690],{"gap":109,"left-width":185,"right-width":5634,"align":5557},"1.05fr",[112,5636,5637,5641],{"v-slot:left":114},[528,5638,5640],{"id":5639},"setup-order","Setup Order",[20,5642,5643,5650,5653,5656,5659,5662,5679,5684,5687],{},[23,5644,510,5645],{},[1047,5646,5649],{"href":5647,"rel":5648},"https:\u002F\u002Fwakatime.com\u002Fsignup",[1051],"WakaTime",[23,5651,5652],{},"Create or open your account",[23,5654,5655],{},"Copy your API key from account settings",[23,5657,5658],{},"In VS Code, search Extensions for WakaTime",[23,5660,5661],{},"Install the WakaTime extension",[23,5663,5664,5665],{},"Open Command Palette:",[20,5666,5667,5673],{},[23,5668,5669,5670],{},"Windows\u002FLinux: ",[198,5671,5672],{},"Ctrl+Shift+P",[23,5674,5675,5676],{},"macOS: ",[198,5677,5678],{},"Cmd+Shift+P",[23,5680,3457,5681],{},[198,5682,5683],{},"WakaTime: API Key",[23,5685,5686],{},"Paste your API key",[23,5688,5689],{},"Restart VS Code if tracking does not appear right away",[112,5691,5692,5697,5704,5709,5716,5721],{"v-slot:right":114},[909,5693,5694],{},[23,5695,5696],{},"WakaTime account settings:",[59,5698,5699],{},[171,5700],{"alt":5701,"src":5702,"variant":175,"max-height":5703},"WakaTime account settings API key detail","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fwakatime\u002Fsettings-api-key-detail.png","14rem",[909,5705,5706],{"start":1110},[23,5707,5708],{},"VS Code extension search:",[59,5710,5711],{},[171,5712],{"alt":5713,"src":5714,"variant":175,"max-height":5715},"VS Code Extensions search results showing WakaTime","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fwakatime\u002Fvs-code-search.png","9rem",[909,5717,5718],{"start":1126},[23,5719,5720],{},"VS Code API key command:",[59,5722,5723],{},[171,5724],{"alt":5725,"src":5726,"variant":175,"max-height":5715},"Command Palette with WakaTime API key command","\u002Fimages\u002Finternet-applications\u002Flocal-setup\u002Fwakatime\u002Fvs-code-prompt.png",[11,5728,5730,5733],{"id":5729,"level":14},"step-5-optional-local-php",[16,5731,5732],{"id":5729},"Step 5: Optional Local PHP",[20,5734,5735,5738,5741,5749,5752],{},[23,5736,5737],{},"Useful for editor support",[23,5739,5740],{},"Useful for quick terminal checks",[23,5742,5743,5744],{},"Not the main course runtime\n",[20,5745,5746],{},[23,5747,5748],{},"Viable backup solution if VM lesson has issues",[23,5750,5751],{},"VM and Render still run the real app path",[23,5753,5754],{},"See the slides below for OS-specific install notes",[11,5756,5758,5761],{"id":5757,"level":526},"step-5a-windows-php-zip",[16,5759,5760],{"id":5757},"Step 5A: Windows PHP ZIP",[107,5762,5763,5794],{"gap":109,"left-width":110,"right-width":110},[112,5764,5765,5769],{"v-slot:left":114},[528,5766,5768],{"id":5767},"download-and-extract","Download And Extract",[20,5770,5771,5774,5784,5789],{},[23,5772,5773],{},"Download PHP for Windows as a ZIP",[23,5775,5776,5777],{},"Extract it outside your repository",[20,5778,5779],{},[23,5780,1897,5781],{},[198,5782,5783],{},"C:\\tools\\php",[23,5785,5786,5787],{},"Add that extracted PHP folder to the user ",[198,5788,2585],{},[23,5790,5791,5792],{},"Restart Git Bash, PowerShell, and VS Code after editing ",[198,5793,2585],{},[112,5795,5796,5800,5816],{"v-slot:right":114},[528,5797,5799],{"id":5798},"visual-checks","Visual Checks",[20,5801,5802,5808,5813],{},[23,5803,5804,5805],{},"The extracted folder contains ",[198,5806,5807],{},"php.exe",[23,5809,5810,5811],{},"The Path entry points to the folder, not to ",[198,5812,5807],{},[23,5814,5815],{},"A new terminal can run:",[119,5817],{"language":122,"src":5818,"label":5819},"\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,5821,5823,5826],{"id":5822,"level":526},"step-5b-macos-homebrew-php",[16,5824,5825],{"id":5822},"Step 5B: macOS Homebrew PHP",[107,5827,5828,5859],{"gap":109,"left-width":110,"right-width":110},[112,5829,5830,5834],{"v-slot:left":114},[528,5831,5833],{"id":5832},"install-homebrew","Install Homebrew",[20,5835,5836,5839,5847,5850,5853,5856],{},[23,5837,5838],{},"Open Terminal",[23,5840,5841,5842],{},"Copy the install command from ",[1047,5843,5846],{"href":5844,"rel":5845},"https:\u002F\u002Fbrew.sh\u002F",[1051],"brew.sh",[23,5848,5849],{},"Expect Terminal to ask for your Mac password",[23,5851,5852],{},"Expect Homebrew to mention Command Line Tools if needed",[23,5854,5855],{},"At the end, Homebrew may print \"Next steps\"",[23,5857,5858],{},"Run those \"Next steps\" commands if shown",[112,5860,5861,5865,5869,5872],{"v-slot:right":114},[528,5862,5864],{"id":5863},"then-install-php","Then Install PHP",[119,5866],{"language":122,"src":5867,"label":5868},"\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",[59,5870,5871],{},"Look for:",[20,5873,5874,5880,5885,5891],{},[23,5875,5876,5879],{},[198,5877,5878],{},"brew --version"," prints a version",[23,5881,5882,5884],{},[198,5883,5376],{}," prints PHP 8 output",[23,5886,5887,5888],{},"Apple Silicon Macs commonly use ",[198,5889,5890],{},"\u002Fopt\u002Fhomebrew",[23,5892,5893,5894],{},"Intel Macs commonly use ",[198,5895,5896],{},"\u002Fusr\u002Flocal",[11,5898,5900,5904,5906,5910],{"id":5899,"level":526},"step-5c-linux-php-cli",[16,5901,5903],{"id":5902},"step-5c-ubuntulinux-php-cli","Step 5C: Ubuntu\u002FLinux PHP CLI",[59,5905,117],{},[119,5907],{"language":122,"src":5908,"label":5909},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment\u002Flinux-install-php-cli-05.sh","linux-php.sh",[20,5911,5912,5915,5918],{},[23,5913,5914],{},"This installs command-line PHP",[23,5916,5917],{},"This is only for local terminal checks",[23,5919,5920],{},"The later VM lesson installs Apache, PHP, and MySQL together",[11,5922,5924,5927,5929,5932,5934,5937],{"id":5923,"level":14},"step-6-verify-optional-php",[16,5925,5926],{"id":5923},"Step 6: Verify Optional PHP",[59,5928,117],{},[119,5930],{"language":122,"src":5931},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment\u002Fstep-6-verify-optional-p-01.sh",[59,5933,277],{},[119,5935],{"language":4442,"src":5936},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment\u002Fexample-output-02.txt",[20,5938,5939,5942,5945],{},[23,5940,5941],{},"Exact version can differ",[23,5943,5944],{},"PHP 8 output means the terminal can find PHP",[23,5946,5947],{},"Windows may need a terminal or VS Code restart after PATH changes",[11,5949,5950,5952],{"id":2487,"level":14},[16,5951,2490],{"id":2487},[20,5953,5954,5957,5960,5963],{},[23,5955,5956],{},"Installing tools inside the repository folder",[23,5958,5959],{},"Opening the parent folder instead of the repo root",[23,5961,5962],{},"Editing a ZIP copy instead of the cloned repo",[23,5964,5965],{},"Installing extensions in the wrong VS Code profile",[11,5967,5968,5970],{"id":951,"level":14},[16,5969,954],{"id":951},[20,5971,5972,5975,5978,5981,5984],{},[23,5973,5974],{},"VS Code opens your course repository root",[23,5976,5977],{},"Course profile is active",[23,5979,5980],{},"PHP Intelephense is installed",[23,5982,5983],{},"GitLens is installed",[23,5985,5986,5987,5989],{},"Optional: ",[198,5988,5376],{}," prints a PHP 8 version",[11,5991,5992,5994],{"id":1003,"level":14},[16,5993,1004],{"id":1003},[107,5995,5996,6014],{"gap":109,"left-width":110,"right-width":110},[112,5997,5998,6000],{"v-slot:left":114},[528,5999,1012],{"id":1011},[20,6001,6002,6005,6008,6011],{},[23,6003,6004],{},"IDE: editor with development tools",[23,6006,6007],{},"Extension: add-on that changes VS Code behavior",[23,6009,6010],{},"Profile: saved VS Code setup",[23,6012,6013],{},"PATH: system setting used to find commands",[112,6015,6016,6018],{"v-slot:right":114},[528,6017,1041],{"id":1000},[20,6019,6020,6027,6034],{},[23,6021,6022],{},[1047,6023,6026],{"href":6024,"rel":6025},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fintrovideos\u002Fbasics",[1051],"VS Code Getting Started",[23,6028,6029],{},[1047,6030,6033],{"href":6031,"rel":6032},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fconfigure\u002Fprofiles",[1051],"VS Code Profiles",[23,6035,6036],{},[1047,6037,6040],{"href":6038,"rel":6039},"https:\u002F\u002Fwww.php.net\u002Fmanual\u002Fen\u002Finstall.php",[1051],"PHP Installation",[11,6042,6043,6045],{"id":1076,"level":14},[16,6044,1079],{"id":1076},[20,6046,6047,6050,6053,6056,6067],{},[23,6048,6049],{},"VS Code installed as the course editor",[23,6051,6052],{},"Repository opens from its root folder",[23,6054,6055],{},"Course extensions live in a course profile",[23,6057,6058,6059],{},"Local PHP is optional for this Internet Applications path\n",[20,6060,6061,6064],{},[23,6062,6063],{},"Summer 2026 added information about VM setup in a future lesson to teach clearer Apache\u002FMySQL topics",[23,6065,6066],{},"VM, Apache, Render QA, and Render production remain the real runtime checks",[23,6068,6069],{},"Next: copy the instructor template into the repository",{"title":114,"searchDepth":1110,"depth":1110,"links":6071},[6072,6073,6074,6075,6076,6077,6078,6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091],{"id":5327,"depth":1110,"text":5319},{"id":1725,"depth":1110,"text":1728},{"id":5359,"depth":1110,"text":5362},{"id":5380,"depth":1110,"text":5383},{"id":5405,"depth":1110,"text":5408},{"id":5443,"depth":1110,"text":5444},{"id":5472,"depth":1110,"text":5475,"children":6079},[6080],{"id":5478,"depth":1126,"text":5479},{"id":5553,"depth":1110,"text":5554},{"id":5630,"depth":1110,"text":5631},{"id":5729,"depth":1110,"text":5732},{"id":5757,"depth":1110,"text":5760},{"id":5822,"depth":1110,"text":5825},{"id":5902,"depth":1110,"text":5903},{"id":5923,"depth":1110,"text":5926},{"id":2487,"depth":1110,"text":2490},{"id":951,"depth":1110,"text":954},{"id":1003,"depth":1110,"text":1004},{"id":1076,"depth":1110,"text":1079},"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":5319,"description":6092},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F05-setup-local-development-environment",[6100,6101,6102],"vscode","local-development","php","44:26","0s1N-m3LABc","https:\u002F\u002Fyoutu.be\u002F0s1N-m3LABc","Local Development Environment setup","X5U0DDKjg7X7HrYtDDcsE4QqlBLimZ9weKgnZlc8H2s",{"id":6109,"title":6110,"audience":6,"body":6111,"contentType":1139,"course":1140,"description":7162,"estimateBasis":7163,"estimatedDiscussionMinutes":1143,"estimatedLiveMinutes":2710,"estimatedTotalMinutes":7164,"extension":1146,"meta":7165,"module":1148,"navigation":1149,"order":7164,"path":7166,"promptAssist":1152,"seo":7167,"status":1154,"stem":7168,"tags":7169,"videoDuration":7170,"videoId":7171,"videoLink":7172,"videoTitle":7173,"week":1148,"__hash__":7174},"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":6112,"toc":7134},[6113,6142,6184,6212,6245,6276,6322,6415,6459,6504,6549,6594,6666,6725,6798,6852,6928,6997,7029,7081,7105],[11,6114,6115,6117,6120],{"id":4385,"level":14},[16,6116,4388],{"id":4385},[59,6118,6119],{},"By the end, you should have:",[20,6121,6122,6125,6128,6134,6139],{},[23,6123,6124],{},"Cloned course repository open in the terminal",[23,6126,6127],{},"Starter template copied into the repository root",[23,6129,6130,6131],{},"Baseline commit on ",[198,6132,6133],{},"Module01-Course-Template",[23,6135,6136,6137],{},"Pull request merged into ",[198,6138,2899],{},[23,6140,6141],{},"Clean working tree before moving on",[11,6143,6145,6149],{"id":6144,"level":14},"step-1-open-clone",[16,6146,6148],{"id":6147},"step-1-open-the-cloned-repository","Step 1: Open The Cloned Repository",[107,6150,6151,6159],{"gap":109,"left-width":110,"right-width":110},[112,6152,6153,6155],{"v-slot:left":114},[59,6154,117],{},[119,6156],{"language":122,"src":6157,"label":6158},"\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",[112,6160,6161,6163,6166],{"v-slot:right":114},[59,6162,277],{},[119,6164],{"language":132,"src":6165,"label":131},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fopen-cloned-repository-output.txt",[20,6167,6168,6173,6178],{},[23,6169,6170,6172],{},[198,6171,1814],{},": current working directory",[23,6174,6175,6177],{},[198,6176,4633],{},": current branch and file state",[23,6179,6180,6181,6183],{},"Important check: ",[198,6182,1814],{}," ends with your repository folder",[11,6185,6187,6191,6194,6197],{"id":6186,"level":14},"step-2-open-vscode",[16,6188,6190],{"id":6189},"step-2-open-the-repository-root","Step 2: Open The Repository Root",[59,6192,6193],{},"Run from inside the cloned repository folder:",[119,6195],{"language":122,"src":6196},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-2-open-the-reposito-01.sh",[20,6198,6199,6204,6209],{},[23,6200,6201,6203],{},[198,6202,198],{},": opens VS Code from the terminal",[23,6205,6206,6208],{},[198,6207,1879],{}," means \"this current folder\"",[23,6210,6211],{},"VS Code should show your repository folder, not the parent folder",[11,6213,6215,6219],{"id":6214,"level":14},"step-3-download-template",[16,6216,6218],{"id":6217},"step-3-download-the-instructor-template","Step 3: Download The Instructor Template",[20,6220,6221,6233,6236,6239,6242],{},[23,6222,6223,6224],{},"Open the instructor template repository",[20,6225,6226],{},[23,6227,6228],{},[1047,6229,6232],{"href":6230,"rel":6231},"https:\u002F\u002Fgithub.com\u002FMattToegel\u002FIT202-2026",[1051],"IT202-2026",[23,6234,6235],{},"Download the ZIP",[23,6237,6238],{},"Extract the ZIP",[23,6240,6241],{},"Copy scaffold contents into your repository root",[23,6243,6244],{},"See the slide below for the copy rule",[11,6246,6248,6252,6255,6258,6273],{"id":6247,"level":526},"template-copy-rule",[528,6249,6251],{"id":6250},"copy-rule","Copy Rule",[59,6253,6254],{},"Copy the contents of the extracted template folder",[59,6256,6257],{},"Do not copy:",[20,6259,6260,6263,6270],{},[23,6261,6262],{},"The extracted wrapper folder as one extra nested folder",[23,6264,6265,6266,6269],{},"The template repository's hidden ",[198,6267,6268],{},".git"," folder",[23,6271,6272],{},"Old files from a different semester",[59,6274,6275],{},"Repository root should contain the starter folders directly",[11,6277,6279,6283,6286,6289],{"id":6278,"level":14},"step-4-check-structure",[16,6280,6282],{"id":6281},"step-4-check-the-starter-structure","Step 4: Check The Starter Structure",[59,6284,6285],{},"After copying, repository root should look similar to:",[119,6287],{"language":4442,"src":6288},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-4-check-the-starter-02.txt",[20,6290,6291,6296,6305,6319],{},[23,6292,6293,6295],{},[198,6294,1945],{}," should be directly inside your repository root",[23,6297,6298,6299,6302,6303],{},"Module folders and ",[198,6300,6301],{},"project"," live inside ",[198,6304,1945],{},[23,6306,6307,1746,6310,1750,6313,6316,6317],{},[198,6308,6309],{},"lib",[198,6311,6312],{},"partials",[198,6314,6315],{},"sql"," stay outside ",[198,6318,1945],{},[23,6320,6321],{},"See the slide below for the public\u002Fprivate folder boundary",[11,6323,6325,6329,6412],{"id":6324,"level":526},"public-html-boundary",[528,6326,6328],{"id":6327},"public-and-private-boundary","Public And Private Boundary",[20,6330,6331,6365,6387,6392,6397,6403,6409],{},[23,6332,6333,6335,6336],{},[198,6334,1945],{},": web root Apache can serve\n",[20,6337,6338,6348,6353,6359],{},[23,6339,6340,6343,6344,6347],{},[198,6341,6342],{},"m01"," through ",[198,6345,6346],{},"m10",": module practice folders",[23,6349,6350,6352],{},[198,6351,6301],{},": course project folder",[23,6354,6355,6358],{},[198,6356,6357],{},"index.php",": first browser entry point",[23,6360,6361,6364],{},[198,6362,6363],{},"test_db.php",": database connection check",[23,6366,6367,6369,6370],{},[198,6368,6309],{},": reusable PHP helpers\n",[20,6371,6372,6378],{},[23,6373,6374,6377],{},[198,6375,6376],{},".env.sample",": example local config file",[23,6379,6380,287,6383,6386],{},[198,6381,6382],{},"config.php",[198,6384,6385],{},"db.php",": config and database helpers",[23,6388,6389,6391],{},[198,6390,6312],{},": shared page pieces",[23,6393,6394,6396],{},[198,6395,6315],{},": database setup scripts",[23,6398,6399,6402],{},[198,6400,6401],{},"Dockerfile",": consistent runtime setup",[23,6404,6405,6408],{},[198,6406,6407],{},"structure.md",": starter layout notes",[23,6410,6411],{},"Private folders should not be opened directly in the browser",[59,6413,6414],{},"Later server setup expects this folder boundary",[11,6416,6418,6422],{"id":6417,"level":14},"step-5-check-status",[16,6419,6421],{"id":6420},"step-5-create-the-template-branch","Step 5: Create The Template Branch",[107,6423,6424,6432],{"gap":109,"left-width":110,"right-width":110},[112,6425,6426,6428],{"v-slot:left":114},[59,6427,117],{},[119,6429],{"language":122,"src":6430,"label":6431},"\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",[112,6433,6434,6437,6440],{"v-slot:right":114},[59,6435,6436],{},"Expected idea:",[119,6438],{"language":4442,"src":6439,"label":131},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstatus-after-template-copy.txt",[20,6441,6442,6448,6453,6456],{},[23,6443,6444,6447],{},[198,6445,6446],{},"git checkout -b",": create and move to a new branch",[23,6449,6450,6451],{},"Branch name: ",[198,6452,6133],{},[23,6454,6455],{},"New files listed as untracked",[23,6457,6458],{},"No changes means likely wrong folder or copy missed",[11,6460,6462,6466],{"id":6461,"level":14},"step-6-stage",[16,6463,6465],{"id":6464},"step-6-stage-the-baseline-files","Step 6: Stage The Baseline Files",[107,6467,6468,6476],{"gap":109,"left-width":110,"right-width":110},[112,6469,6470,6472],{"v-slot:left":114},[59,6471,117],{},[119,6473],{"language":122,"src":6474,"label":6475},"\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",[112,6477,6478,6481,6499,6501],{"v-slot:right":114},[59,6479,6480],{},"What this means:",[20,6482,6483,6489,6494],{},[23,6484,6485,6488],{},[198,6486,6487],{},"git add",": choose files for the next commit",[23,6490,6491,6493],{},[198,6492,1879],{}," means current folder and contents",[23,6495,6496,6498],{},[198,6497,4633],{},": verify what is staged before committing",[59,6500,6436],{},[119,6502],{"language":4442,"src":6503,"label":131},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstatus-after-stage.txt",[11,6505,6507,6511],{"id":6506,"level":14},"step-7-commit",[16,6508,6510],{"id":6509},"step-7-commit-the-baseline","Step 7: Commit The Baseline",[107,6512,6513,6521],{"gap":109,"left-width":110,"right-width":110},[112,6514,6515,6517],{"v-slot:left":114},[59,6516,117],{},[119,6518],{"language":122,"src":6519,"label":6520},"\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",[112,6522,6523,6525,6528],{"v-slot:right":114},[59,6524,6436],{},[119,6526],{"language":4442,"src":6527,"label":131},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fcommit-baseline-output.txt",[20,6529,6530,6536,6546],{},[23,6531,6532,6535],{},[198,6533,6534],{},"git commit",": save staged changes in local history",[23,6537,6538,6540,6541],{},[198,6539,4731],{},": commit message\n",[20,6542,6543],{},[23,6544,6545],{},"Message is required, even if empty",[23,6547,6548],{},"Baseline commit: starter state before custom work",[11,6550,6552,6556],{"id":6551,"level":14},"step-8-push",[16,6553,6555],{"id":6554},"step-8-push-the-template-branch","Step 8: Push The Template Branch",[107,6557,6558,6566],{"gap":109,"left-width":110,"right-width":110},[112,6559,6560,6562],{"v-slot:left":114},[59,6561,117],{},[119,6563],{"language":122,"src":6564,"label":6565},"\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",[112,6567,6568,6570,6573],{"v-slot:right":114},[59,6569,6436],{},[119,6571],{"language":4442,"src":6572,"label":131},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fpush-baseline-output.txt",[20,6574,6575,6580,6586,6591],{},[23,6576,6577,6579],{},[198,6578,4794],{},": GitHub remote",[23,6581,6582,6585],{},[198,6583,6584],{},"-u",": remembers this branch's GitHub tracking branch",[23,6587,6588,6590],{},[198,6589,6133],{},": branch being sent",[23,6592,6593],{},"Refresh GitHub after the push",[11,6595,6597,6601],{"id":6596,"level":14},"step-9-open-pull-request",[16,6598,6600],{"id":6599},"step-9-open-the-pull-request","Step 9: Open The Pull Request",[107,6602,6603,6646],{"gap":109,"left-width":110,"right-width":110},[112,6604,6605,6607],{"v-slot:left":114},[59,6606,191],{},[20,6608,6609,6612,6628,6633,6638,6641],{},[23,6610,6611],{},"Open your course repository",[23,6613,196,6614,6617],{},[295,6615,6616],{},"Compare & pull request",[20,6618,6619],{},[23,6620,6621,6622,5420,6625],{},"Or use ",[295,6623,6624],{},"Pull requests",[295,6626,6627],{},"New pull request",[23,6629,6630,6631],{},"Set base branch to ",[198,6632,2899],{},[23,6634,6635,6636],{},"Set compare branch to ",[198,6637,6133],{},[23,6639,6640],{},"Confirm the changed files are the starter template files",[23,6642,196,6643],{},[295,6644,6645],{},"Create pull request",[112,6647,6648,6651,6655],{"v-slot:right":114},[59,6649,6650],{},"Use a short title and description:",[119,6652],{"language":4442,"src":6653,"label":6654},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fpull-request-description.txt","pull-request-description.txt",[20,6656,6657,6660,6663],{},[23,6658,6659],{},"Base receives the changes",[23,6661,6662],{},"Compare contains your branch work",[23,6664,6665],{},"If base and compare are reversed, do not create the pull request",[11,6667,6669,6675],{"id":6668,"level":14},"step-10-merge-sync-main",[16,6670,6672,6673],{"id":6671},"step-10-merge-and-sync-main","Step 10: Merge And Sync ",[198,6674,2899],{},[107,6676,6677,6699],{"gap":109,"left-width":110,"right-width":110},[112,6678,6679,6681,6693,6695],{"v-slot:left":114},[59,6680,191],{},[20,6682,6683,6688],{},[23,6684,196,6685],{},[295,6686,6687],{},"Merge pull request",[23,6689,196,6690],{},[295,6691,6692],{},"Confirm merge",[59,6694,5088],{},[119,6696],{"language":122,"src":6697,"label":6698},"\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",[112,6700,6701,6703,6706],{"v-slot:right":114},[59,6702,6436],{},[119,6704],{"language":4442,"src":6705,"label":131},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fsync-main-after-pr-output.txt",[20,6707,6708,6714,6720],{},[23,6709,6710,6713],{},[198,6711,6712],{},"git checkout main",": return to the main branch",[23,6715,6716,6719],{},[198,6717,6718],{},"git pull origin main",": download the merged template files",[23,6721,6722,6723,5112],{},"Continue only when local ",[198,6724,2899],{},[11,6726,6728,6734],{"id":6727,"level":14},"step-11-create-local-env",[16,6729,6730,6731],{"id":6727},"Step 11: Create Local ",[198,6732,6733],{},".env",[107,6735,6736,6758],{"gap":109,"left-width":110,"right-width":110},[112,6737,6738,6741,6745],{"v-slot:left":114},[59,6739,6740],{},"Run from the repository root:",[119,6742],{"language":122,"src":6743,"label":6744},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fstep-11-create-local-env-11.sh","create-local-env.sh",[20,6746,6747],{},[23,6748,6749,6750,6753,6754],{},"Get ",[198,6751,6752],{},"DB_URL"," from ",[1047,6755,6757],{"href":5602,"rel":6756},[1051],"courses.ethereallab.app\u002Fdatabase",[112,6759,6760,6763,6768],{"v-slot:right":114},[59,6761,6762],{},"Fill in values similar to:",[119,6764],{"language":6765,"src":6766,"label":6767},"dotenv","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Flocal-env-example.txt","lib\u002F.env",[20,6769,6770,6775,6780,6783,6788,6793],{},[23,6771,6772,6774],{},[198,6773,6733],{}," stores local secrets",[23,6776,2833,6777,6779],{},[198,6778,6733],{}," on your computer only",[23,6781,6782],{},"Do not commit your real connection string",[23,6784,6785,6786],{},"Paste the generated database connection string as ",[198,6787,6752],{},[23,6789,6790,6792],{},[198,6791,6382],{}," loads local or hosted environment variables",[23,6794,6795,6796],{},"Do not paste secrets directly into ",[198,6797,6382],{},[11,6799,6801,6805],{"id":6800,"level":14},"step-12-test-local-db",[16,6802,6804],{"id":6803},"step-12-test-local-database-connection","Step 12: Test Local Database Connection",[107,6806,6807,6815],{"gap":109,"left-width":110,"right-width":110},[112,6808,6809,6811],{"v-slot:left":114},[59,6810,6740],{},[119,6812],{"language":122,"src":6813,"label":6814},"\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",[112,6816,6817,6820,6824],{"v-slot:right":114},[59,6818,6819],{},"Then open:",[119,6821],{"language":4442,"src":6822,"label":6823},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Ftest-db-url.txt","browser-url.txt",[20,6825,6826,6832,6838,6846],{},[23,6827,6828,6831],{},[198,6829,6830],{},"php -S",": starts PHP's built-in local server",[23,6833,6834,6837],{},[198,6835,6836],{},"-t public_html",": serves the course web root",[23,6839,6840,6842,6843,6845],{},[198,6841,6363],{},": confirms PHP can read ",[198,6844,6733],{}," and connect to MySQL",[23,6847,6848,6849,6851],{},"Stop the server with ",[198,6850,2542],{}," when finished",[11,6853,6855,6863,6869],{"id":6854,"level":14},"step-13-enable-pdo-mysql",[16,6856,6858,6859,6862],{"id":6857},"step-13-enable-pdo_mysql-if-needed","Step 13: Enable ",[198,6860,6861],{},"pdo_mysql"," If Needed",[59,6864,6865,6866,1879],{},"This is usually a Windows PHP ZIP setup issue. macOS and Linux usually install MySQL support through Homebrew or ",[198,6867,6868],{},"apt",[107,6870,6871,6902],{"gap":109,"left-width":110,"right-width":110},[112,6872,6873,6876,6880,6883],{"v-slot:left":114},[59,6874,6875],{},"Find the PHP folder:",[119,6877],{"language":122,"src":6878,"label":6879},"\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",[59,6881,6882],{},"In that folder:",[20,6884,6885,6891,6897],{},[23,6886,6887,6888],{},"Find ",[198,6889,6890],{},"php.ini-development",[23,6892,6893,6894],{},"Copy it as ",[198,6895,6896],{},"php.ini",[23,6898,589,6899,6901],{},[198,6900,6896],{}," in your editor",[112,6903,6904,6907,6911,6914,6918],{"v-slot:right":114},[59,6905,6906],{},"Uncomment these lines:",[119,6908],{"language":6909,"src":6910,"label":6896},"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",[59,6912,6913],{},"Mac\u002FLinux usually use:",[119,6915],{"language":122,"src":6916,"label":6917},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fmacos-linux-pdo-mysql-commands-14.sh","macos-linux-php-mysql.sh",[20,6919,6920,6925],{},[23,6921,6922,6923],{},"Restart the php dev server after changing ",[198,6924,6896],{},[23,6926,6927],{},"Run Step 12 again after enabling the extension",[11,6929,6931,6933,6936],{"id":6930,"level":14},"quick-check-final",[16,6932,954],{"id":951},[59,6934,6935],{},"Confirm all of these:",[20,6937,6938,6941,6949,6952,6957,6966,6972,6977,6982,6988],{},[23,6939,6940],{},"GitHub shows the starter files",[23,6942,6943,6944,6946,6947],{},"GitHub shows a pull request from ",[198,6945,6133],{}," into ",[198,6948,2899],{},[23,6950,6951],{},"The pull request is merged",[23,6953,4858,6954,6956],{},[198,6955,2899],{}," says the working tree is clean",[23,6958,6959,6343,6962,6965],{},[198,6960,6961],{},"public_html\u002Fm01",[198,6963,6964],{},"public_html\u002Fm10"," exist",[23,6967,6968,6971],{},[198,6969,6970],{},"public_html\u002Fproject"," exists",[23,6973,6974,6976],{},[198,6975,1945],{}," is not nested inside another accidental folder",[23,6978,6979,6981],{},[198,6980,6767],{}," exists locally and is not committed with real secrets",[23,6983,6984,6987],{},[198,6985,6986],{},"http:\u002F\u002Flocalhost:3000\u002Ftest_db.php"," confirms the database connection",[23,6989,6990,6991,6993,6994,6996],{},"Windows PHP has ",[198,6992,6861],{}," enabled if ",[198,6995,6363],{}," reports a missing driver",[11,6998,7000,7004,7006,7009,7018],{"id":6999,"level":14},"reset-check",[16,7001,7003],{"id":7002},"if-something-looks-wrong","If Something Looks Wrong",[59,7005,117],{},[119,7007],{"language":122,"src":7008},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository\u002Fif-something-looks-wrong-03.sh",[7010,7011,7012],"blockquote",{},[59,7013,7014,7015,7017],{},"Tip: ",[198,7016,745],{}," prints the repository root when your current folder is inside a Git repository",[20,7019,7020,7023,7026],{},[23,7021,7022],{},"Output should point to your course repository",[23,7024,7025],{},"If it points somewhere else, move folders before continuing",[23,7027,7028],{},"Avoid cloning inside another cloned repository",[11,7030,7031,7033],{"id":2487,"level":14},[16,7032,2490],{"id":2487},[20,7034,7035,7038,7041,7046,7049,7052,7057,7067,7072,7075],{},[23,7036,7037],{},"Opening the parent folder instead of the repository root",[23,7039,7040],{},"Copying the instructor template folder as a nested folder",[23,7042,7043,7044,6269],{},"Copying the template ",[198,7045,6268],{},[23,7047,7048],{},"Keeping the downloaded ZIP inside the repository",[23,7050,7051],{},"Re-cloning the repository instead of opening the existing clone",[23,7053,7054,7055],{},"Putting module folders outside ",[198,7056,1945],{},[23,7058,7059,7060,7062,7063,7066],{},"Renaming ",[198,7061,6342],{}," to ",[198,7064,7065],{},"M1"," or mixing folder casing",[23,7068,7069,7070],{},"Doing template work directly on ",[198,7071,2899],{},[23,7073,7074],{},"Reversing base and compare branches in the pull request",[23,7076,7077,7078,7080],{},"Forgetting to sync local ",[198,7079,2899],{}," after the pull request is merged",[11,7082,7083,7085],{"id":1011,"level":14},[16,7084,1012],{"id":1011},[20,7086,7087,7090,7093,7096,7099,7102],{},[23,7088,7089],{},"Repository root: top folder of the cloned project",[23,7091,7092],{},"Baseline: starter state before custom work begins",[23,7094,7095],{},"Pull request: GitHub review page used to merge branch work",[23,7097,7098],{},"Web root: folder served to the browser",[23,7100,7101],{},"Scaffold: starter folders that organize future work",[23,7103,7104],{},"Staging: choosing files for the next commit",[11,7106,7107,7109,7112],{"id":1076,"level":14},[16,7108,1079],{"id":1076},[59,7110,7111],{},"Before leaving this presentation, confirm the following:",[20,7113,7114,7117,7120,7123,7129],{},[23,7115,7116],{},"You still have one clone for your repository",[23,7118,7119],{},"Your VS Code is able to open directly to your repository",[23,7121,7122],{},"Your repository has the full starter baseline correctly structured",[23,7124,7125,7126,7128],{},"GitHub remote ",[198,7127,2899],{}," has the baseline content",[23,7130,4858,7131,7133],{},[198,7132,2899],{}," was synchronized",{"title":114,"searchDepth":1110,"depth":1110,"links":7135},[7136,7137,7138,7139,7142,7145,7146,7147,7148,7149,7150,7152,7154,7155,7157,7158,7159,7160,7161],{"id":4385,"depth":1110,"text":4388},{"id":6147,"depth":1110,"text":6148},{"id":6189,"depth":1110,"text":6190},{"id":6217,"depth":1110,"text":6218,"children":7140},[7141],{"id":6250,"depth":1126,"text":6251},{"id":6281,"depth":1110,"text":6282,"children":7143},[7144],{"id":6327,"depth":1126,"text":6328},{"id":6420,"depth":1110,"text":6421},{"id":6464,"depth":1110,"text":6465},{"id":6509,"depth":1110,"text":6510},{"id":6554,"depth":1110,"text":6555},{"id":6599,"depth":1110,"text":6600},{"id":6671,"depth":1110,"text":7151},"Step 10: Merge And Sync main",{"id":6727,"depth":1110,"text":7153},"Step 11: Create Local .env",{"id":6803,"depth":1110,"text":6804},{"id":6857,"depth":1110,"text":7156},"Step 13: Enable pdo_mysql If Needed",{"id":951,"depth":1110,"text":954},{"id":7002,"depth":1110,"text":7003},{"id":2487,"depth":1110,"text":2490},{"id":1011,"depth":1110,"text":1012},{"id":1076,"depth":1110,"text":1079},"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":6110,"description":7162},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F06-add-instructor-template-to-your-repository",[1160,112,1157],"47:11","4n0-QuXO_Aw","https:\u002F\u002Fyoutu.be\u002F4n0-QuXO_Aw","Adding Instructor\u002FCourse Template","iYq9WdND1ODBRrXLU2gX9dNCXvDc-Kvqufsokl_jg3E",{"id":7176,"title":7177,"audience":6,"body":7178,"contentType":1139,"course":1140,"description":7888,"estimateBasis":7889,"estimatedDiscussionMinutes":1143,"estimatedLiveMinutes":5305,"estimatedTotalMinutes":2711,"extension":1146,"meta":7890,"module":1148,"navigation":1149,"order":1144,"path":7891,"promptAssist":1152,"seo":7892,"status":1154,"stem":7893,"tags":7894,"videoDuration":7896,"videoId":7897,"videoLink":7898,"videoTitle":7899,"week":1148,"__hash__":7900},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches.md","QA And Prod Branches",{"type":8,"value":7179,"toc":7867},[7180,7214,7262,7284,7338,7403,7461,7511,7576,7617,7709,7749,7776,7834],[11,7181,7182,7184,7186],{"id":4385,"level":14},[16,7183,4388],{"id":4385},[59,7185,4391],{},[20,7187,7188,7197,7202,7206,7211],{},[23,7189,7190,7191,287,7194],{},"Understand the purpose and usage of ",[198,7192,7193],{},"qa",[198,7195,7196],{},"prod",[23,7198,7199,7200],{},"Create and push ",[198,7201,7193],{},[23,7203,7199,7204],{},[198,7205,7196],{},[23,7207,7208,7209],{},"Keep local work pointed at ",[198,7210,7193],{},[23,7212,7213],{},"Confirm GitHub has the expected branches",[11,7215,7217,7220,7255],{"id":7216,"level":14},"branch-roles",[16,7218,7219],{"id":7216},"Branch Roles",[20,7221,7222,7232,7242,7252],{},[23,7223,7224,7226,7227],{},[198,7225,2899],{},": starter baseline and shared source branch\n",[20,7228,7229],{},[23,7230,7231],{},"Most projects stick with this; we'll split ours into development lanes",[23,7233,7234,7236,7237],{},[198,7235,7193],{},": public testing and evidence branch\n",[20,7238,7239],{},[23,7240,7241],{},"Normal branch to return to before new course work",[23,7243,7244,7246,7247],{},[198,7245,7196],{},": stable grading and evaluation branch\n",[20,7248,7249],{},[23,7250,7251],{},"Protected from everyday local edits",[23,7253,7254],{},"Later deployment setup connects Render to these branches",[59,7256,7257,7258,5420,7260],{},"Course flow: feature or homework branch -> ",[198,7259,7193],{},[198,7261,7196],{},[11,7263,7264,7266,7269,7273],{"id":1762,"level":14},[16,7265,1765],{"id":1762},[59,7267,7268],{},"Run inside the course repository:",[119,7270],{"label":7271,"language":122,"src":7272},"before-you-start.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fbefore-you-start.sh",[20,7274,7275,7278,7281],{},[23,7276,7277],{},"Working tree should be clean",[23,7279,7280],{},"Starter baseline already pushed to GitHub",[23,7282,7283],{},"Stop if Git says files are modified or untracked",[11,7285,7287,7293],{"id":7286,"level":14},"step-1-sync-main",[16,7288,7290,7291],{"id":7289},"step-1-start-from-main","Step 1: Start From ",[198,7292,2899],{},[107,7294,7295,7303],{"gap":109,"left-width":110,"right-width":110},[112,7296,7297,7299],{"v-slot:left":114},[59,7298,117],{},[119,7300],{"label":7301,"language":122,"src":7302},"sync-main.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fsync-main.sh",[112,7304,7305,7307,7310],{"v-slot:right":114},[59,7306,277],{},[119,7308],{"label":131,"language":4442,"src":7309},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fsync-main-output.txt",[20,7311,7312,7319],{},[23,7313,7314,7316,7317],{},[198,7315,6712],{},": switch to ",[198,7318,2899],{},[23,7320,7321,7323,7324,7326,7327],{},[198,7322,6718],{},": get the latest ",[198,7325,2899],{}," from GitHub\n",[20,7328,7329,7333],{},[23,7330,7331,6579],{},[198,7332,4794],{},[23,7334,7335,7337],{},[198,7336,2899],{},": remote branch being pulled",[11,7339,7341,7347],{"id":7340,"level":14},"step-2-create-qa",[16,7342,7344,7345],{"id":7343},"step-2-create-and-push-qa","Step 2: Create And Push ",[198,7346,7193],{},[107,7348,7349,7357],{"gap":109,"left-width":110,"right-width":110},[112,7350,7351,7353],{"v-slot:left":114},[59,7352,117],{},[119,7354],{"label":7355,"language":122,"src":7356},"create-qa.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-qa.sh",[112,7358,7359,7361,7364],{"v-slot:right":114},[59,7360,277],{},[119,7362],{"label":131,"language":4442,"src":7363},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-qa-output.txt",[20,7365,7366,7383],{},[23,7367,7368,7371,7372,7374,7375],{},[198,7369,7370],{},"git checkout -b qa",": create ",[198,7373,7193],{}," and switch to it\n",[20,7376,7377],{},[23,7378,7379,7382],{},[198,7380,7381],{},"-b",": creates a new branch of the following name",[23,7384,7385,7388,7389,7391,7392],{},[198,7386,7387],{},"git push -u origin qa",": send ",[198,7390,7193],{}," to GitHub\n",[20,7393,7394],{},[23,7395,7396,7398,7399,7402],{},[198,7397,6584],{},": remember ",[198,7400,7401],{},"origin\u002Fqa"," as the upstream branch",[11,7404,7406,7412],{"id":7405,"level":14},"step-3-create-prod",[16,7407,7409,7410],{"id":7408},"step-3-create-and-push-prod","Step 3: Create And Push ",[198,7411,7196],{},[107,7413,7414,7422],{"gap":109,"left-width":110,"right-width":110},[112,7415,7416,7418],{"v-slot:left":114},[59,7417,117],{},[119,7419],{"label":7420,"language":122,"src":7421},"create-prod.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-prod.sh",[112,7423,7424,7426,7429],{"v-slot:right":114},[59,7425,277],{},[119,7427],{"label":131,"language":4442,"src":7428},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fcreate-prod-output.txt",[20,7430,7431,7439,7444,7456],{},[23,7432,5455,7433,7435,7436,7438],{},[198,7434,7196],{}," from the current ",[198,7437,7193],{}," branch",[23,7440,7441],{},[198,7442,7443],{},"git checkout -b prod",[23,7445,7446,7447,7391,7449],{},"Push ",[198,7448,7196],{},[20,7450,7451],{},[23,7452,7453],{},[198,7454,7455],{},"git push origin prod",[23,7457,7458,7460],{},[198,7459,7196],{}," starts from the same clean baseline",[11,7462,7464,7469],{"id":7463,"level":14},"step-4-return-to-qa",[16,7465,7466,7467],{"id":7463},"Step 4: Return To ",[198,7468,7193],{},[107,7470,7471,7479],{"gap":109,"left-width":110,"right-width":110},[112,7472,7473,7475],{"v-slot:left":114},[59,7474,117],{},[119,7476],{"label":7477,"language":122,"src":7478},"return-to-qa.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Freturn-to-qa.sh",[112,7480,7481,7483,7486],{"v-slot:right":114},[59,7482,277],{},[119,7484],{"label":131,"language":4442,"src":7485},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Freturn-to-qa-output.txt",[20,7487,7488,7493,7498],{},[23,7489,7490,7492],{},[198,7491,7193],{}," should have the asterisk",[23,7494,7495,7497],{},[198,7496,7196],{}," should still exist on GitHub",[23,7499,7500,7501,7503],{},"Do not start normal course work from ",[198,7502,7196],{},[20,7504,7505],{},[23,7506,7507,7508,7510],{},"We'll remove local ",[198,7509,7196],{}," to avoid this issue",[11,7512,7514,7520],{"id":7513,"level":14},"step-5-delete-local-prod",[16,7515,7517,7518],{"id":7516},"step-5-remove-local-prod","Step 5: Remove Local ",[198,7519,7196],{},[107,7521,7522,7530],{"gap":109,"left-width":110,"right-width":110},[112,7523,7524,7526],{"v-slot:left":114},[59,7525,117],{},[119,7527],{"label":7528,"language":122,"src":7529},"delete-local-prod.sh","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fdelete-local-prod.sh",[112,7531,7532,7534,7537],{"v-slot:right":114},[59,7533,277],{},[119,7535],{"label":131,"language":4442,"src":7536},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches\u002Fdelete-local-prod-output.txt",[20,7538,7539,7561],{},[23,7540,7541,7544,7545,7547],{},[198,7542,7543],{},"git branch -d prod",": delete local ",[198,7546,7196],{},[20,7548,7549,7555],{},[23,7550,7551,7554],{},[198,7552,7553],{},"-d",": delete only if Git considers it safe",[23,7556,7557,7560],{},[198,7558,7559],{},"-D",": can be used as a forced delete",[23,7562,7563,7566,7567],{},[198,7564,7565],{},"git branch -r",": list remote branches\n",[20,7568,7569],{},[23,7570,7571,7572,7575],{},"Confirms ",[198,7573,7574],{},"origin\u002Fprod"," still exists",[11,7577,7579,7582,7585,7588,7602,7605],{"id":7578,"level":14},"github-check",[16,7580,7581],{"id":7578},"GitHub Check",[59,7583,7584],{},"Open the branch dropdown on GitHub",[59,7586,7587],{},"You should see:",[20,7589,7590,7594,7598],{},[23,7591,7592],{},[198,7593,2899],{},[23,7595,7596],{},[198,7597,7193],{},[23,7599,7600],{},[198,7601,7196],{},[59,7603,7604],{},"Branch roles:",[20,7606,7607,7612],{},[23,7608,7609,7611],{},[198,7610,7193],{},": testing and evidence",[23,7613,7614,7616],{},[198,7615,7196],{},": stable grading target",[11,7618,7620,7624],{"id":7619,"level":14},"normal-workflow",[16,7621,7623],{"id":7622},"normal-workflow-after-setup","Normal Workflow After Setup",[909,7625,7626,7643,7651,7662,7667,7681,7684,7691,7703],{},[23,7627,7628,7629,7631],{},"Return to ",[198,7630,7193],{},[20,7632,7633,7638],{},[23,7634,7635],{},[198,7636,7637],{},"git checkout qa",[23,7639,7640],{},[198,7641,7642],{},"git pull origin qa",[23,7644,7645,7646],{},"Create a feature or homework branch\n",[20,7647,7648],{},[23,7649,7650],{},"Branch name matches the task",[23,7652,7653,7654],{},"Commit the work on that branch\n",[20,7655,7656],{},[23,7657,7658,7659,7661],{},"Check ",[198,7660,4633],{}," before each Git command",[23,7663,7664,7665],{},"Push the branch and open a pull request into ",[198,7666,7193],{},[23,7668,7669,7670,7672,7673],{},"Merge into ",[198,7671,7193],{}," after review\n",[20,7674,7675],{},[23,7676,7677,7678,7680],{},"QA deployment will update from ",[198,7679,7193],{}," after Render setup",[23,7682,7683],{},"Test the QA version",[23,7685,7686,7687,6946,7689],{},"Open a pull request from ",[198,7688,7193],{},[198,7690,7196],{},[23,7692,7669,7693,7695,7696],{},[198,7694,7196],{}," when stable\n",[20,7697,7698],{},[23,7699,7700,7701,7680],{},"Production deployment will use ",[198,7702,7196],{},[23,7704,7705,7706,7708],{},"Return locally to ",[198,7707,7193],{}," and pull before the next task",[11,7710,7711,7713],{"id":2487,"level":14},[16,7712,2490],{"id":2487},[20,7714,7715,7720,7725,7733,7741,7744],{},[23,7716,7717,7718],{},"Working directly on ",[198,7719,7196],{},[23,7721,7722,7723],{},"Forgetting to return to ",[198,7724,7193],{},[23,7726,7727,7728,7730,7731],{},"Pushing ",[198,7729,7193],{}," but not ",[198,7732,7196],{},[23,7734,7735,7736,7738,7739],{},"Deleting remote ",[198,7737,7196],{}," instead of local ",[198,7740,7196],{},[23,7742,7743],{},"Assuming GitHub has the branch without checking",[23,7745,7746,7747,5112],{},"Starting new work before ",[198,7748,4633],{},[11,7750,7751,7753,7756],{"id":951,"level":14},[16,7752,954],{"id":951},[59,7754,7755],{},"Answer before moving on:",[20,7757,7758,7761,7764,7767,7773],{},[23,7759,7760],{},"Which branch should QA deployment watch?",[23,7762,7763],{},"Which branch should production grading use?",[23,7765,7766],{},"Which branch should you return to before new work?",[23,7768,7769,7770,7772],{},"Why remove local ",[198,7771,7196],{}," after pushing it?",[23,7774,7775],{},"What future setup connects Render to these branches?",[11,7777,7778,7780],{"id":1000,"level":14},[16,7779,1004],{"id":1003},[107,7781,7782,7807],{"gap":109,"left-width":110,"right-width":110},[112,7783,7784,7786],{"v-slot:left":114},[528,7785,1012],{"id":1011},[20,7787,7788,7791,7794,7799,7804],{},[23,7789,7790],{},"Branch: named line of Git history",[23,7792,7793],{},"Upstream: remote branch Git remembers for push\u002Fpull",[23,7795,7796,7798],{},[198,7797,7193],{},": public testing branch",[23,7800,7801,7803],{},[198,7802,7196],{},": stable grading branch",[23,7805,7806],{},"Remote-only branch: exists on GitHub, not locally",[112,7808,7809,7811],{"v-slot:right":114},[528,7810,1041],{"id":1000},[20,7812,7813,7820,7827],{},[23,7814,5207,7815],{},[1047,7816,7819],{"href":7817,"rel":7818},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fget-started\u002Fusing-git\u002Fabout-git#about-branches",[1051],"About branches",[23,7821,5207,7822],{},[1047,7823,7826],{"href":7824,"rel":7825},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpull-requests\u002Fcollaborating-with-pull-requests\u002Fproposing-changes-to-your-work-with-pull-requests\u002Fabout-pull-requests",[1051],"About pull requests",[23,7828,5192,7829],{},[1047,7830,7833],{"href":7831,"rel":7832},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGit-Branching-Branches-in-a-Nutshell",[1051],"Git Branching",[11,7835,7836,7838,7840],{"id":1076,"level":14},[16,7837,1079],{"id":1076},[59,7839,1082],{},[20,7841,7842,7851,7855,7859,7864],{},[23,7843,7844,7845,1746,7847,1750,7849],{},"Explain ",[198,7846,2899],{},[198,7848,7193],{},[198,7850,7196],{},[23,7852,7199,7853],{},[198,7854,7193],{},[23,7856,7199,7857],{},[198,7858,7196],{},[23,7860,7861,7862],{},"Keep local work branched from ",[198,7863,7193],{},[23,7865,7866],{},"Verify remote branches on GitHub",{"title":114,"searchDepth":1110,"depth":1110,"links":7868},[7869,7870,7871,7872,7874,7876,7878,7880,7882,7883,7884,7885,7886,7887],{"id":4385,"depth":1110,"text":4388},{"id":7216,"depth":1110,"text":7219},{"id":1762,"depth":1110,"text":1765},{"id":7289,"depth":1110,"text":7873},"Step 1: Start From main",{"id":7343,"depth":1110,"text":7875},"Step 2: Create And Push qa",{"id":7408,"depth":1110,"text":7877},"Step 3: Create And Push prod",{"id":7463,"depth":1110,"text":7879},"Step 4: Return To qa",{"id":7516,"depth":1110,"text":7881},"Step 5: Remove Local prod",{"id":7578,"depth":1110,"text":7581},{"id":7622,"depth":1110,"text":7623},{"id":2487,"depth":1110,"text":2490},{"id":951,"depth":1110,"text":954},{"id":1003,"depth":1110,"text":1004},{"id":1076,"depth":1110,"text":1079},"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":7177,"description":7888},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F07-qa-prod-branches",[1157,5310,7193,7895],"production","10:35","32XilHQwRiY","https:\u002F\u002Fyoutu.be\u002F32XilHQwRiY","Create QA and Prod Branches","GZx1sXtI0BMbyb6Gbpj7aoBvczhhR-FV7YpFE4j4UCs",{"id":7902,"title":7903,"audience":6,"body":7904,"contentType":1139,"course":1140,"description":8711,"estimateBasis":8712,"estimatedDiscussionMinutes":1143,"estimatedLiveMinutes":2711,"estimatedTotalMinutes":1144,"extension":1146,"meta":8713,"module":1148,"navigation":1149,"order":8714,"path":8715,"promptAssist":1152,"seo":8716,"status":1154,"stem":8717,"tags":8718,"videoDuration":8721,"videoId":8722,"videoLink":8723,"videoTitle":8724,"week":1148,"__hash__":8725},"content\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup.md","Render Setup",{"type":8,"value":7905,"toc":8690},[7906,7933,7956,7985,8053,8114,8149,8185,8222,8272,8318,8353,8399,8436,8464,8496,8543,8576,8644],[11,7907,7909,7912],{"id":7908,"level":14},"render-setup-title",[16,7910,7903],{"id":7911},"render-setup",[20,7913,7914,7917,7922,7927,7930],{},[23,7915,7916],{},"Connect GitHub repo to Render",[23,7918,7919,7920],{},"Create a QA service from ",[198,7921,7193],{},[23,7923,7924,7925],{},"Create a production service from ",[198,7926,7196],{},[23,7928,7929],{},"Add the course database connection string",[23,7931,7932],{},"Verify live URLs and deploy logs",[11,7934,7935,7937,7939],{"id":13,"level":14},[16,7936,18],{"id":13},[59,7938,4391],{},[20,7940,7941,7944,7947,7950,7953],{},[23,7942,7943],{},"Explain what Render does in the course workflow",[23,7945,7946],{},"Create separate QA and production services",[23,7948,7949],{},"Connect each service to the correct branch",[23,7951,7952],{},"Read Render logs when a deploy fails",[23,7954,7955],{},"Identify which deployed URL to submit or test",[11,7957,7959,7962,7979],{"id":7958,"level":14},"what-render-does",[16,7960,7961],{"id":7958},"What Render Does",[20,7963,7964,7967,7970,7973,7976],{},[23,7965,7966],{},"Hosts your PHP app from GitHub",[23,7968,7969],{},"Watches a selected branch",[23,7971,7972],{},"Rebuilds when that branch changes",[23,7974,7975],{},"Stores secrets as environment variables",[23,7977,7978],{},"Gives each service a public URL",[59,7980,7981,7982],{},"Course loop: ",[198,7983,7984],{},"local work -> GitHub branch -> Render URL",[11,7986,7988,7990],{"id":7987,"level":14},"free-tier-and-before-start",[16,7989,1765],{"id":1762},[107,7991,7992,8021],{"gap":109,"left-width":110,"right-width":110},[112,7993,7994,7998],{"v-slot:left":114},[528,7995,7997],{"id":7996},"free-tier","Free Tier",[20,7999,8000,8010,8018],{},[23,8001,203,8002,8005],{},[198,8003,8004],{},"Free",[20,8006,8007],{},[23,8008,8009],{},"Render may default to a paid plan",[23,8011,8012,8013],{},"Free services can sleep",[20,8014,8015],{},[23,8016,8017],{},"First visit after sleep may be slow",[23,8019,8020],{},"Avoid extra services unless instructed",[112,8022,8023,8027],{"v-slot:right":114},[528,8024,8026],{"id":8025},"repo-ready","Repo Ready",[20,8028,8029,8032,8037,8046],{},[23,8030,8031],{},"Starter files committed and pushed",[23,8033,8034,8036],{},[198,8035,6401],{}," in repo root",[23,8038,8039,1746,8041,1750,8043,8045],{},[198,8040,1945],{},[198,8042,6309],{},[198,8044,6312],{}," present",[23,8047,8048,287,8050,8052],{},[198,8049,7193],{},[198,8051,7196],{}," branches exist on GitHub",[11,8054,8056,8059],{"id":8055,"level":14},"target-architecture",[16,8057,8058],{"id":8055},"Target Architecture",[107,8060,8061,8089],{"gap":109,"left-width":110,"right-width":110},[112,8062,8063,8067],{"v-slot:left":114},[528,8064,8066],{"id":8065},"qa-service","QA Service",[20,8068,8069,8075,8080,8083],{},[23,8070,8071,8072],{},"Name: ",[198,8073,8074],{},"\u003Cucid>-it202-\u003Csection>-qa",[23,8076,8077,8078],{},"Watches ",[198,8079,7193],{},[23,8081,8082],{},"Used for testing and evidence",[23,8084,8085,8086],{},"URL ends with ",[198,8087,8088],{},"-qa.onrender.com",[112,8090,8091,8095],{"v-slot:right":114},[528,8092,8094],{"id":8093},"production-service","Production Service",[20,8096,8097,8102,8106,8109],{},[23,8098,8071,8099],{},[198,8100,8101],{},"\u003Cucid>-it202-\u003Csection>-prod",[23,8103,8077,8104],{},[198,8105,7196],{},[23,8107,8108],{},"Stable version after QA checks",[23,8110,8085,8111],{},[198,8112,8113],{},"-prod.onrender.com",[11,8115,8117,8121],{"id":8116,"level":14},"step-1-sign-up",[16,8118,8120],{"id":8119},"step-1-sign-up-with-github","Step 1: Sign Up With GitHub",[107,8122,8123,8141],{"gap":109,"left-width":607,"right-width":186},[112,8124,8125],{"v-slot:left":114},[20,8126,8127,8132,8135,8138],{},[23,8128,510,8129],{},[198,8130,8131],{},"render.com",[23,8133,8134],{},"Choose GitHub sign-in",[23,8136,8137],{},"Authorize Render when prompted",[23,8139,8140],{},"Land on the Render dashboard",[112,8142,8143],{"v-slot:right":114},[59,8144,8145],{},[171,8146],{"alt":8147,"src":8148,"variant":175},"Render GitHub sign-in screen","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-01-github-signin.png",[11,8150,8152,8155],{"id":8151,"level":14},"step-2-new-web-service",[16,8153,8154],{"id":8151},"Step 2: New Web Service",[107,8156,8157,8177],{"gap":109,"left-width":607,"right-width":186},[112,8158,8159],{"v-slot:left":114},[20,8160,8161,8166,8171,8174],{},[23,8162,196,8163],{},[198,8164,8165],{},"New +",[23,8167,203,8168],{},[198,8169,8170],{},"Web Service",[23,8172,8173],{},"Do not choose a database service here",[23,8175,8176],{},"This creates the hosted PHP app",[112,8178,8179],{"v-slot:right":114},[59,8180,8181],{},[171,8182],{"alt":8183,"src":8184,"variant":175},"Render New menu with Web Service option","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-04-new-menu.png",[11,8186,8188,8192],{"id":8187,"level":14},"step-3-connect-repo",[16,8189,8191],{"id":8190},"step-3-connect-repository","Step 3: Connect Repository",[107,8193,8194,8214],{"gap":109,"left-width":534,"right-width":384},[112,8195,8196],{"v-slot:left":114},[20,8197,8198,8201,8204,8211],{},[23,8199,8200],{},"Select your student course repository",[23,8202,8203],{},"Authorize repository access if Render asks",[23,8205,8206,8207,8210],{},"Ensure it's the proper repository (format: ",[198,8208,8209],{},"ucid-course-section-semYear",")",[23,8212,8213],{},"Continue to service settings",[112,8215,8216],{"v-slot:right":114},[59,8217,8218],{},[171,8219],{"alt":8220,"src":8221,"variant":175},"Render repository selection screen","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-07-select-repo.png",[11,8223,8225,8229],{"id":8224,"level":14},"step-4-configure-qa",[16,8226,8228],{"id":8227},"step-4-configure-qa-service","Step 4: Configure QA Service",[107,8230,8231,8264],{"gap":109,"left-width":607,"right-width":186},[112,8232,8233,8236],{"v-slot:left":114},[59,8234,8235],{},"Use these settings:",[20,8237,8238,8242,8247,8253,8258,8261],{},[23,8239,8071,8240],{},[198,8241,8074],{},[23,8243,8244,8245],{},"Branch: ",[198,8246,7193],{},[23,8248,8249,8250],{},"Runtime: ",[198,8251,8252],{},"Docker",[23,8254,8255,8256],{},"Instance type: ",[198,8257,8004],{},[23,8259,8260],{},"Root directory: blank",[23,8262,8263],{},"Build\u002Fstart commands: blank",[112,8265,8266],{"v-slot:right":114},[59,8267,8268],{},[171,8269],{"alt":8270,"src":8271,"variant":175},"Render QA service configuration","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-08-qa-config-basic.png",[11,8273,8275,8279],{"id":8274,"level":14},"step-5-env-vars",[16,8276,8278],{"id":8277},"step-5-add-environment-variables","Step 5: Add Environment Variables",[107,8280,8281,8310],{"gap":109,"left-width":185,"right-width":5634},[112,8282,8283],{"v-slot:left":114},[20,8284,8285,8298,8304,8307],{},[23,8286,8287,8288,8290],{},"Add ",[198,8289,6752],{},[20,8291,8292],{},[23,8293,8294,8295],{},"Get it from ",[1047,8296,6757],{"href":5602,"rel":8297},[1051],[23,8299,8300,8301,8303],{},"Do not use \"add from ",[198,8302,6733],{},"\"",[23,8305,8306],{},"Add later API keys only when a later lesson requires them",[23,8308,8309],{},"Repeat required env vars on both QA and production",[112,8311,8312],{"v-slot:right":114},[59,8313,8314],{},[171,8315],{"alt":8316,"src":8317,"variant":175},"Render environment variables section","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-09-env-vars.png",[11,8319,8321,8324],{"id":8320,"level":14},"step-6-deploy-qa",[16,8322,8323],{"id":8320},"Step 6: Deploy QA",[107,8325,8326,8345],{"gap":109,"left-width":534,"right-width":384},[112,8327,8328],{"v-slot:left":114},[20,8329,8330,8333,8336,8339,8342],{},[23,8331,8332],{},"Create the QA service",[23,8334,8335],{},"Watch the first deploy log",[23,8337,8338],{},"Wait for a success state",[23,8340,8341],{},"Open the QA URL",[23,8343,8344],{},"Confirm the starter page loads",[112,8346,8347],{"v-slot:right":114},[59,8348,8349],{},[171,8350],{"alt":8351,"src":8352,"variant":175},"Successful Render QA deployment","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-10-qa-deployed.png",[11,8354,8356,8360],{"id":8355,"level":14},"step-7-create-prod",[16,8357,8359],{"id":8358},"step-7-create-production-service","Step 7: Create Production Service",[107,8361,8362,8391],{"gap":109,"left-width":607,"right-width":186},[112,8363,8364,8367],{"v-slot:left":114},[59,8365,8366],{},"Create a second web service:",[20,8368,8369,8372,8376,8380,8384,8388],{},[23,8370,8371],{},"Same repository",[23,8373,8071,8374],{},[198,8375,8101],{},[23,8377,8244,8378],{},[198,8379,7196],{},[23,8381,8249,8382],{},[198,8383,8252],{},[23,8385,8255,8386],{},[198,8387,8004],{},[23,8389,8390],{},"Same required env vars",[112,8392,8393],{"v-slot:right":114},[59,8394,8395],{},[171,8396],{"alt":8397,"src":8398,"variant":175},"Render production service configuration","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-11-prod-config.png",[11,8400,8401,8404],{"id":7619,"level":14},[16,8402,8403],{"id":7619},"Normal Workflow",[909,8405,8406,8409,8412,8417,8420,8423,8426,8433],{},[23,8407,8408],{},"Work locally on a feature or homework branch",[23,8410,8411],{},"Commit and push that branch to GitHub",[23,8413,8414,8415],{},"Open a pull request into ",[198,8416,7193],{},[23,8418,8419],{},"Merge after review",[23,8421,8422],{},"Render updates the QA URL",[23,8424,8425],{},"Test the QA URL",[23,8427,7686,8428,6946,8430,8432],{},[198,8429,7193],{},[198,8431,7196],{}," after evidence gathering",[23,8434,8435],{},"Render updates the production URL",[11,8437,8439,8442],{"id":8438,"level":14},"urls-and-cold-starts",[16,8440,8441],{"id":8438},"URLs And Cold Starts",[20,8443,8444,8447,8450,8453,8461],{},[23,8445,8446],{},"QA URL shows the test deployment",[23,8448,8449],{},"Production URL shows the stable deployment",[23,8451,8452],{},"Homework evidence usually starts with QA",[23,8454,8455,8456],{},"Free services may sleep after inactivity\n",[20,8457,8458],{},[23,8459,8460],{},"First visit after sleep may take extra time (2 - 5 minutes)",[23,8462,8463],{},"Do not submit before Render finishes deploying",[11,8465,8467,8470],{"id":8466,"level":14},"logs-and-status",[16,8468,8469],{"id":8466},"Logs And Status",[107,8471,8472,8488],{"gap":109,"left-width":534,"right-width":384},[112,8473,8474],{"v-slot:left":114},[20,8475,8476,8479,8482,8485],{},[23,8477,8478],{},"Logs show build and startup output",[23,8480,8481],{},"Dashboard status shows deploy progress",[23,8483,8484],{},"Failed deploys usually show the first useful clue",[23,8486,8487],{},"Read the first clear error before changing settings",[112,8489,8490],{"v-slot:right":114},[59,8491,8492],{},[171,8493],{"alt":8494,"src":8495,"variant":175},"Render deploy logs","\u002Fimages\u002Finternet-applications\u002Frender-setup\u002Frender-12-logs.png",[11,8497,8499,8502],{"id":8498,"level":14},"troubleshooting",[16,8500,8501],{"id":8498},"Troubleshooting",[20,8503,8504,8514,8522,8532],{},[23,8505,8506,8507],{},"Build fails\n",[20,8508,8509],{},[23,8510,7658,8511,8513],{},[198,8512,6401],{},", root directory, runtime, and instance type",[23,8515,8516,8517],{},"App deploys but page fails\n",[20,8518,8519],{},[23,8520,8521],{},"Check logs for PHP errors",[23,8523,8524,8525],{},"Database connection fails\n",[20,8526,8527],{},[23,8528,7658,8529,8531],{},[198,8530,6752],{}," spelling and copied value",[23,8533,8534,8535],{},"Wrong version appears\n",[20,8536,8537,8540],{},[23,8538,8539],{},"Confirm the service watches the expected branch",[23,8541,8542],{},"Clear browser cache or test in a private window",[11,8544,8545,8547],{"id":2487,"level":14},[16,8546,2490],{"id":2487},[20,8548,8549,8559,8562,8567,8570,8573],{},[23,8550,8551,8552,8554,8555,302,8557],{},"Choosing ",[198,8553,2899],{}," instead of ",[198,8556,7193],{},[198,8558,7196],{},[23,8560,8561],{},"Creating one service for both environments",[23,8563,8564,8565],{},"Forgetting ",[198,8566,6752],{},[23,8568,8569],{},"Using a paid instance type by accident",[23,8571,8572],{},"Checking GitHub but not the Render URL",[23,8574,8575],{},"Changing code locally but forgetting to push and merge",[11,8577,8578,8580],{"id":1003,"level":14},[16,8579,1004],{"id":1003},[107,8581,8582,8610],{"gap":109,"left-width":110,"right-width":110},[112,8583,8584,8586,8592,8598,8604],{"v-slot:left":114},[528,8585,1012],{"id":1011},[59,8587,8588,8591],{},[295,8589,8590],{},"Service"," - one deployed app on Render",[59,8593,8594,8597],{},[295,8595,8596],{},"Watched branch"," - Git branch Render deploys from",[59,8599,8600,8603],{},[295,8601,8602],{},"Environment variable"," - setting stored outside code",[59,8605,8606,8609],{},[295,8607,8608],{},"Deploy log"," - output from Render's build\u002Fstart process",[112,8611,8612,8614],{"v-slot:right":114},[528,8613,1041],{"id":1000},[20,8615,8616,8623,8630,8637],{},[23,8617,8618],{},[1047,8619,8622],{"href":8620,"rel":8621},"https:\u002F\u002Frender.com\u002Fdocs\u002Fweb-services",[1051],"Render Docs: Web Services",[23,8624,8625],{},[1047,8626,8629],{"href":8627,"rel":8628},"https:\u002F\u002Frender.com\u002Fdocs\u002Fdeploys",[1051],"Render Docs: Deploys",[23,8631,8632],{},[1047,8633,8636],{"href":8634,"rel":8635},"https:\u002F\u002Frender.com\u002Fdocs\u002Fconfigure-environment-variables",[1051],"Render Docs: Environment Variables",[23,8638,8639],{},[1047,8640,8643],{"href":8641,"rel":8642},"https:\u002F\u002Frender.com\u002Fdocs\u002Ffree",[1051],"Render Docs: Free Instance Types",[11,8645,8646,8648,8651],{"id":1076,"level":14},[16,8647,1079],{"id":1076},[59,8649,8650],{},"Before leaving this presentation, confirm you:",[20,8652,8653,8656,8659,8666,8669,8672],{},[23,8654,8655],{},"Created QA and production Render services",[23,8657,8658],{},"Matched each service to the correct branch",[23,8660,8661,8662,6753,8664],{},"Added ",[198,8663,6752],{},[198,8665,6757],{},[23,8667,8668],{},"Opened each deployed URL",[23,8670,8671],{},"Read logs instead of assuming it worked",[23,8673,8674,8675],{},"Understand the local -> GitHub -> Render loop\n",[20,8676,8677,8680,8685],{},[23,8678,8679],{},"Majority of your work will be done locally and tested locally",[23,8681,8682,8684],{},[198,8683,7193],{}," is just for gathering evidence for submissions",[23,8686,8687,8689],{},[198,8688,7196],{}," is what will be verified during grading",{"title":114,"searchDepth":1110,"depth":1110,"links":8691},[8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709,8710],{"id":7911,"depth":1110,"text":7903},{"id":13,"depth":1110,"text":18},{"id":7958,"depth":1110,"text":7961},{"id":1762,"depth":1110,"text":1765},{"id":8055,"depth":1110,"text":8058},{"id":8119,"depth":1110,"text":8120},{"id":8151,"depth":1110,"text":8154},{"id":8190,"depth":1110,"text":8191},{"id":8227,"depth":1110,"text":8228},{"id":8277,"depth":1110,"text":8278},{"id":8320,"depth":1110,"text":8323},{"id":8358,"depth":1110,"text":8359},{"id":7619,"depth":1110,"text":8403},{"id":8438,"depth":1110,"text":8441},{"id":8466,"depth":1110,"text":8469},{"id":8498,"depth":1110,"text":8501},{"id":2487,"depth":1110,"text":2490},{"id":1003,"depth":1110,"text":1004},{"id":1076,"depth":1110,"text":1079},"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":7903,"description":8711},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F08-render-setup",[8719,8720,7193,7895],"render","deployment","21:42","esZd5RIpqCQ","https:\u002F\u002Fyoutu.be\u002FesZd5RIpqCQ","Render.com Setup (QA and Prod)","_1jV7vdhppggQ8TAOecx_1jFvjG90__8eGGlaXbnc28",{"id":8727,"title":8728,"audience":6,"body":8729,"contentType":1139,"course":1140,"description":11403,"estimateBasis":11404,"estimatedDiscussionMinutes":11405,"estimatedLiveMinutes":11406,"estimatedTotalMinutes":11407,"extension":1146,"meta":11408,"module":1148,"navigation":1149,"order":5303,"path":11409,"promptAssist":1152,"seo":11410,"status":1154,"stem":11411,"tags":11412,"videoDuration":11417,"videoId":11418,"videoLink":11419,"videoTitle":11420,"week":1148,"__hash__":11421},"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":8730,"toc":11335},[8731,8760,8805,8841,8910,8942,8969,9001,9027,9056,9085,9112,9143,9171,9207,9272,9307,9353,9396,9440,9487,9550,9586,9621,9658,9691,9728,9761,9791,9821,9851,9881,9911,9945,9977,10009,10041,10090,10092,10135,10161,10202,10254,10333,10384,10415,10445,10475,10525,10550,10600,10648,10706,10764,10805,10835,10869,10903,10937,10988,11040,11059,11087,11135,11207,11307],[11,8732,8734,8737],{"id":8733,"level":14},"virtualbox-title",[16,8735,8728],{"id":8736},"local-ubuntu-web-server-with-virtualbox",[20,8738,8739,8742,8745,8748,8751,8757],{},[23,8740,8741],{},"Primary course path for the local Ubuntu VM",[23,8743,8744],{},"Create an Ubuntu Server VM in VirtualBox",[23,8746,8747],{},"Connect from your host terminal with SSH",[23,8749,8750],{},"Share the course repo into Ubuntu",[23,8752,8753,8754,8756],{},"Serve ",[198,8755,1945],{}," through Apache and PHP",[23,8758,8759],{},"Create a local MySQL database for testing",[11,8761,8763,8766,8769,8780,8783],{"id":8762,"level":14},"main-goal",[16,8764,8765],{"id":8762},"Main Goal",[59,8767,8768],{},"Your host computer and Ubuntu VM have different jobs:",[20,8770,8771,8774,8777],{},[23,8772,8773],{},"Host computer: edit files with VS Code and open the browser",[23,8775,8776],{},"Ubuntu VM: run Apache, PHP, MySQL, and server commands",[23,8778,8779],{},"Shared folder: lets both use the same course repo files",[59,8781,8782],{},"Target result:",[20,8784,8785,8791,8796,8799,8802],{},[23,8786,8787,8788],{},"Host browser opens ",[198,8789,8790],{},"http:\u002F\u002Flocalhost:3000",[23,8792,8793,8794],{},"Apache serves the repo's ",[198,8795,1945],{},[23,8797,8798],{},"PHP executes inside Ubuntu",[23,8800,8801],{},"Local MySQL has a database and user named after your UCID",[23,8803,8804],{},"Edits made on the host appear after browser refresh",[11,8806,8808,8811,8814,8833,8836],{"id":8807,"level":14},"virtualbox-caveat",[16,8809,8810],{"id":8807},"VirtualBox Caveat",[59,8812,8813],{},"VirtualBox is the primary local VM path for this course:",[20,8815,8816,8819,8822,8830],{},[23,8817,8818],{},"Works well on modern Windows, Linux, and Intel Mac hosts",[23,8820,8821],{},"Apple Silicon Mac requires an ARM64 Ubuntu Server ISO",[23,8823,8824,8825],{},"Windows on Arm support is experimental in VirtualBox\n",[20,8826,8827],{},[23,8828,8829],{},"Avoid unless your instructor confirms it for your machine",[23,8831,8832],{},"Arm hosts cannot run x86\u002FAMD64 guest images",[59,8834,8835],{},"VMware is the fallback path if VirtualBox is not a good fit for your machine",[737,8837,8838],{"type":739},[59,8839,8840],{},"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,8842,8843,8845],{"id":1762,"level":14},[16,8844,1765],{"id":1762},[20,8846,8847,8865,8883,8886,8889,8892,8907],{},[23,8848,8849,8850],{},"VirtualBox downloaded\n",[20,8851,8852,8859,8862],{},[23,8853,8854],{},[1047,8855,8858],{"href":8856,"rel":8857},"https:\u002F\u002Fwww.virtualbox.org\u002Fwiki\u002FDownloads",[1051],"VirtualBox downloads",[23,8860,8861],{},"Windows\u002FLinux\u002FIntel Mac: use the standard host installer",[23,8863,8864],{},"Apple Silicon Mac: use the macOS Arm64 host installer",[23,8866,8867,8868],{},"Ubuntu Server ISO downloaded\n",[20,8869,8870,8877,8880],{},[23,8871,8872],{},[1047,8873,8876],{"href":8874,"rel":8875},"https:\u002F\u002Fubuntu.com\u002Fdownload\u002Fserver#how-to-install-tab-lts",[1051],"Ubuntu Server installer",[23,8878,8879],{},"Apple Silicon Mac: use the ARM64 server ISO",[23,8881,8882],{},"Windows, Linux, and Intel Mac: use the AMD64 server ISO",[23,8884,8885],{},"Internet Applications course repo cloned on host computer",[23,8887,8888],{},"Git\u002FGitHub setup already working",[23,8890,8891],{},"Administrator access on your computer",[23,8893,8894,8895,8898,8899],{},"At least ",[198,8896,8897],{},"10 GB"," free disk space for the VM\n",[20,8900,8901],{},[23,8902,8903,8906],{},[198,8904,8905],{},"20-25 GB"," is safer if your computer has room",[23,8908,8909],{},"Stable internet for package installs",[11,8911,8913,8916],{"id":8912,"level":14},"setup-parts",[16,8914,8915],{"id":8912},"Setup Parts",[20,8917,8918,8921,8924,8927,8933,8936,8939],{},[23,8919,8920],{},"VM: Ubuntu Server running inside VirtualBox",[23,8922,8923],{},"NAT adapter: gives the VM internet access",[23,8925,8926],{},"Port forwarding: lets the host reach SSH and Apache",[23,8928,8929,8930],{},"SSH: lets the host terminal control Ubuntu through ",[198,8931,8932],{},"localhost",[23,8934,8935],{},"Shared folder: exposes the host repo inside Ubuntu",[23,8937,8938],{},"Apache\u002FPHP: serves and executes the web app",[23,8940,8941],{},"MySQL: local database server for local testing",[11,8943,8945,8949],{"id":8944,"level":14},"install-virtualbox-windows",[16,8946,8948],{"id":8947},"install-virtualbox-on-windows","Install VirtualBox On Windows",[20,8950,8951,8954,8957,8960,8963,8966],{},[23,8952,8953],{},"Download VirtualBox for Windows hosts",[23,8955,8956],{},"Run the installer as an administrator if prompted",[23,8958,8959],{},"Keep the default install path and features",[23,8961,8962],{},"Accept the network reset warning",[23,8964,8965],{},"Open VirtualBox after installation",[23,8967,8968],{},"See the slides below for the Windows installer screens",[11,8970,8972,8975],{"id":8971,"level":526},"windows-installer-start",[16,8973,8974],{"id":8971},"Windows Installer: Start",[107,8976,8977,8985],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,8978,8979],{"v-slot:left":114},[59,8980,8981],{},[171,8982],{"alt":8983,"src":8984,"variant":175},"VirtualBox Windows installer start screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step1.png",[112,8986,8987],{"v-slot:right":114},[20,8988,8989,8995,8998],{},[23,8990,8991,8992],{},"Launch the downloaded ",[198,8993,8994],{},".exe",[23,8996,8997],{},"Approve the Windows security prompt if shown",[23,8999,9000],{},"Start the setup wizard",[11,9002,9004,9007],{"id":9003,"level":526},"windows-installer-features",[16,9005,9006],{"id":9003},"Windows Installer: Features",[107,9008,9009,9017],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9010,9011],{"v-slot:left":114},[59,9012,9013],{},[171,9014],{"alt":9015,"src":9016,"variant":175},"VirtualBox Windows installer feature selection screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step2.png",[112,9018,9019],{"v-slot:right":114},[20,9020,9021,9024],{},[23,9022,9023],{},"Keep the default install location",[23,9025,9026],{},"Keep the default features selected",[11,9028,9030,9033],{"id":9029,"level":526},"windows-installer-network-warning",[16,9031,9032],{"id":9029},"Windows Installer: Network Warning",[107,9034,9035,9043],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9036,9037],{"v-slot:left":114},[59,9038,9039],{},[171,9040],{"alt":9041,"src":9042,"variant":175},"VirtualBox Windows installer network warning","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step3.png",[112,9044,9045],{"v-slot:right":114},[20,9046,9047,9050,9053],{},[23,9048,9049],{},"VirtualBox may reset network adapters briefly",[23,9051,9052],{},"This is expected during install",[23,9054,9055],{},"Save web work before continuing if needed",[11,9057,9059,9062],{"id":9058,"level":526},"windows-installer-ready",[16,9060,9061],{"id":9058},"Windows Installer: Ready",[107,9063,9064,9072],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9065,9066],{"v-slot:left":114},[59,9067,9068],{},[171,9069],{"alt":9070,"src":9071,"variant":175},"VirtualBox Windows installer ready screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step4.png",[112,9073,9074],{"v-slot:right":114},[20,9075,9076,9079,9082],{},[23,9077,9078],{},"Start the installation",[23,9080,9081],{},"Keep the default choices",[23,9083,9084],{},"Wait for the installer to request permissions if needed",[11,9086,9088,9092],{"id":9087,"level":526},"windows-installer-progress",[16,9089,9091],{"id":9090},"windows-installer-start-options","Windows Installer: Start Options",[107,9093,9094,9102],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9095,9096],{"v-slot:left":114},[59,9097,9098],{},[171,9099],{"alt":9100,"src":9101,"variant":175},"VirtualBox Windows installer progress screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step5.png",[112,9103,9104],{"v-slot:right":114},[20,9105,9106,9109],{},[23,9107,9108],{},"No need to create a Start Menu item or desktop shortcut unless desired",[23,9110,9111],{},"Third option is likely optional too since we'll be using the VirtualBox Manager",[11,9113,9115,9118],{"id":9114,"level":526},"windows-installer-permission",[16,9116,9117],{"id":9114},"Windows Installer: Permission",[107,9119,9120,9128],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9121,9122],{"v-slot:left":114},[59,9123,9124],{},[171,9125],{"alt":9126,"src":9127,"variant":175},"VirtualBox Windows installer permission prompt","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step6.png",[112,9129,9130],{"v-slot:right":114},[20,9131,9132,9135],{},[23,9133,9134],{},"Proceed with install",[23,9136,9137,9138],{},"Approve VirtualBox driver prompts\n",[20,9139,9140],{},[23,9141,9142],{},"These let VirtualBox create virtual hardware",[11,9144,9146,9149],{"id":9145,"level":526},"windows-installer-complete",[16,9147,9148],{"id":9145},"Windows Installer: Complete",[107,9150,9151,9159],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9152,9153],{"v-slot:left":114},[59,9154,9155],{},[171,9156],{"alt":9157,"src":9158,"variant":175},"VirtualBox Windows installer completion screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_step7.png",[112,9160,9161],{"v-slot:right":114},[20,9162,9163,9165,9168],{},[23,9164,3177],{},[23,9166,9167],{},"Open VirtualBox",[23,9169,9170],{},"Continue to VM creation",[11,9172,9174,9178],{"id":9173,"level":14},"install-virtualbox-macos",[16,9175,9177],{"id":9176},"install-virtualbox-on-macos","Install VirtualBox On macOS",[107,9179,9180,9199],{"gap":109,"left-width":185,"right-width":5634,"stack":535},[112,9181,9182],{"v-slot:left":114},[20,9183,9184,9187,9190,9193,9196],{},[23,9185,9186],{},"Install the VirtualBox host package for your Mac CPU type",[23,9188,9189],{},"Intel Mac: standard macOS host installer",[23,9191,9192],{},"Apple Silicon Mac: Arm64 host installer and Arm64 Ubuntu Server ISO",[23,9194,9195],{},"Approve macOS security prompts if needed",[23,9197,9198],{},"If VirtualBox is not a good fit, use the VMware fallback lesson",[112,9200,9201],{"v-slot:right":114},[59,9202,9203],{},[171,9204],{"alt":9205,"src":9206,"variant":175},"Summary of macOS VirtualBox setup notes","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvm_summary_mac.png",[11,9208,9210,9214,9217],{"id":9209,"level":14},"step-1-create-vm",[16,9211,9213],{"id":9212},"step-1-create-the-vm","Step 1: Create The VM",[59,9215,9216],{},"Create a lightweight Ubuntu Server VM:",[20,9218,9219,9222,9230,9245,9257,9263,9266,9269],{},[23,9220,9221],{},"Type: Linux",[23,9223,9224,9225],{},"Version: Ubuntu 64-bit or Ubuntu Arm64\n",[20,9226,9227],{},[23,9228,9229],{},"Match the version to the ISO you downloaded",[23,9231,9232,9233,9236,9237],{},"Memory: ",[198,9234,9235],{},"1 GB"," course target\n",[20,9238,9239],{},[23,9240,422,9241,9244],{},[198,9242,9243],{},"1.5-2 GB"," if the installer is too slow or refuses to continue (you shouldn't need to do this)",[23,9246,9247,9248,9250,9251],{},"Disk: ",[198,9249,8897],{}," course minimum\n",[20,9252,9253],{},[23,9254,9255,8906],{},[198,9256,8905],{},[23,9258,9259,9260,9262],{},"CPU: ",[198,9261,1148],{}," core is enough for this course VM",[23,9264,9265],{},"Enable OpenSSH during install if prompted",[23,9267,9268],{},"Username: use your UCID",[23,9270,9271],{},"See the slides below for VM settings and Ubuntu install screens",[11,9273,9275,9278],{"id":9274,"level":526},"vm-setup-name-and-iso",[16,9276,9277],{"id":9274},"VM Setup: Name And ISO",[107,9279,9280,9288],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9281,9282],{"v-slot:left":114},[59,9283,9284],{},[171,9285],{"alt":9286,"src":9287,"variant":175},"VirtualBox VM name and ISO setup","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_1.png",[112,9289,9290],{"v-slot:right":114},[20,9291,9292,9295,9301,9304],{},[23,9293,9294],{},"Start a new virtual machine",[23,9296,9297,9298],{},"Name it clearly, such as ",[198,9299,9300],{},"it202-vm",[23,9302,9303],{},"Choose the Ubuntu Server ISO file next",[23,9305,9306],{},"OS fields may look wrong until the ISO is selected",[11,9308,9310,9313],{"id":9309,"level":526},"vm-setup-confirm-ubuntu-iso",[16,9311,9312],{"id":9309},"VM Setup: Confirm Ubuntu ISO",[107,9314,9315,9323],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9316,9317],{"v-slot:left":114},[59,9318,9319],{},[171,9320],{"alt":9321,"src":9322,"variant":175},"VirtualBox VM name and Ubuntu ISO selected","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_2.png",[112,9324,9325],{"v-slot:right":114},[20,9326,9327,9333,9339,9342],{},[23,9328,9329,9330],{},"Confirm OS is ",[198,9331,9332],{},"Linux",[23,9334,9335,9336],{},"Confirm distribution is ",[198,9337,9338],{},"Ubuntu",[23,9340,9341],{},"Confirm version matches your ISO",[23,9343,2833,9344,9347,9348],{},[198,9345,9346],{},"Unattended Installation"," off\n",[20,9349,9350],{},[23,9351,9352],{},"The Ubuntu installer screens are easier to teach manually",[11,9354,9356,9359],{"id":9355,"level":526},"vm-setup-memory-and-cpu",[16,9357,9358],{"id":9355},"VM Setup: Memory And CPU",[107,9360,9361,9369],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9362,9363],{"v-slot:left":114},[59,9364,9365],{},[171,9366],{"alt":9367,"src":9368,"variant":175},"VirtualBox VM memory and CPU settings","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_4.png",[112,9370,9371],{"v-slot:right":114},[20,9372,9373,9386,9390,9393],{},[23,9374,9232,9375,9236,9378],{},[198,9376,9377],{},"1024 MB",[20,9379,9380,9383],{},[23,9381,9382],{},"The goal is to match free-tier cloud services",[23,9384,9385],{},"Demonstrates that small apps can run with limited resources",[23,9387,9259,9388],{},[198,9389,1148],{},[23,9391,9392],{},"Keep EFI off unless your machine requires it",[23,9394,9395],{},"This VM is for Apache, PHP, MySQL, and local development\u002Ftesting",[11,9397,9399,9402],{"id":9398,"level":526},"vm-setup-virtual-disk",[16,9400,9401],{"id":9398},"VM Setup: Virtual Disk",[107,9403,9404,9412],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9405,9406],{"v-slot:left":114},[59,9407,9408],{},[171,9409],{"alt":9410,"src":9411,"variant":175},"VirtualBox virtual hard disk settings","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_5.png",[112,9413,9414],{"v-slot:right":114},[20,9415,9416,9422,9425,9437],{},[23,9417,9418,9419],{},"Disk type: ",[198,9420,9421],{},"VDI",[23,9423,9424],{},"Storage: dynamically allocated",[23,9426,9427,9428,9430],{},"Minimum: ",[198,9429,8897],{},[20,9431,9432],{},[23,9433,9434,9436],{},[198,9435,8905],{}," is safer if you have room",[23,9438,9439],{},"Dynamic disk uses space as needed, not all at once",[11,9441,9443,9446],{"id":9442,"level":526},"vm-setup-start-with-gui",[16,9444,9445],{"id":9442},"VM Setup: Start With GUI",[107,9447,9448,9456],{"gap":109,"left-width":2815,"right-width":534,"stack":535},[112,9449,9450],{"v-slot:left":114},[59,9451,9452],{},[171,9453],{"alt":9454,"src":9455,"variant":175},"VirtualBox VM selected with the Start button visible","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_setup_6.png",[112,9457,9458],{"v-slot:right":114},[20,9459,9460,9463,9473,9476],{},[23,9461,9462],{},"Select the newly created VM",[23,9464,196,9465,9468],{},[198,9466,9467],{},"Start",[20,9469,9470],{},[23,9471,9472],{},"Choose the normal GUI start for the first boot",[23,9474,9475],{},"Complete the Ubuntu installer in the VM window",[23,9477,9478,9479],{},"After install and SSH setup, future starts can be headless\n",[20,9480,9481],{},[23,9482,9483,9484,9486],{},"You will connect with ",[198,9485,1159],{}," when you need the VM",[11,9488,9490,9494,9497],{"id":9489,"level":14},"ubuntu-installer",[16,9491,9493],{"id":9492},"step-2-ubuntu-installer","Step 2: Ubuntu Installer",[59,9495,9496],{},"Use the Ubuntu Server installer after the VM starts:",[20,9498,9499,9502,9505,9508,9511,9514,9547],{},[23,9500,9501],{},"Choose the default course options unless noted",[23,9503,9504],{},"Continue without updating the installer if instructed",[23,9506,9507],{},"Use your UCID for the Ubuntu username",[23,9509,9510],{},"Install OpenSSH server during setup",[23,9512,9513],{},"Skip optional server snaps",[23,9515,9516,9517],{},"Keyboard navigation:\n",[20,9518,9519,9526,9536,9542],{},[23,9520,9521,9525],{},[9522,9523,9524],"kbd",{},"Tab"," moves between fields and buttons",[23,9527,9528,9531,9532,9535],{},[9522,9529,9530],{},"Up"," \u002F ",[9522,9533,9534],{},"Down"," moves through lists",[23,9537,9538,9541],{},[9522,9539,9540],{},"Space"," toggles checkboxes",[23,9543,9544,9546],{},[9522,9545,2349],{}," confirms the selected option",[23,9548,9549],{},"See the slides below for the installer screens",[11,9551,9553,9557],{"id":9552,"level":526},"ubuntu-installer-boot-menu",[16,9554,9556],{"id":9555},"step-21-boot-menu","Step 2.1: Boot Menu",[107,9558,9561,9570],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},"1.75fr","0.65fr",[112,9562,9563],{"v-slot:left":114},[59,9564,9565],{},[171,9566],{"alt":9567,"src":9568,"variant":9569},"Ubuntu Server boot menu in VirtualBox","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_1.png","slide-screenshot",[112,9571,9572],{"v-slot:right":114},[20,9573,9574,9579,9583],{},[23,9575,203,9576],{},[198,9577,9578],{},"Try or Install Ubuntu Server",[23,9580,2381,9581],{},[9522,9582,2349],{},[23,9584,9585],{},"This starts the Ubuntu Server installer",[11,9587,9589,9593],{"id":9588,"level":526},"ubuntu-installer-language",[16,9590,9592],{"id":9591},"step-22-language","Step 2.2: Language",[107,9594,9595,9603],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9596,9597],{"v-slot:left":114},[59,9598,9599],{},[171,9600],{"alt":9601,"src":9602,"variant":9569},"Ubuntu Server installer language screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_2.0.png",[112,9604,9605],{"v-slot:right":114},[20,9606,9607,9610,9616],{},[23,9608,9609],{},"Choose your preferred language",[23,9611,9612,9615],{},[198,9613,9614],{},"English"," is the expected course screenshot path",[23,9617,2381,9618,9620],{},[9522,9619,2349],{}," to continue",[11,9622,9624,9628],{"id":9623,"level":526},"ubuntu-installer-update",[16,9625,9627],{"id":9626},"step-23-update-prompt","Step 2.3: Update Prompt",[107,9629,9630,9638],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9631,9632],{"v-slot:left":114},[59,9633,9634],{},[171,9635],{"alt":9636,"src":9637,"variant":9569},"Ubuntu Server installer update prompt","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_2.5.png",[112,9639,9640],{"v-slot:right":114},[20,9641,9642,9652,9655],{},[23,9643,203,9644,9647],{},[198,9645,9646],{},"Continue without updating",[20,9648,9649],{},[23,9650,9651],{},"If I forget to update the image, it's the second option",[23,9653,9654],{},"Keeps the install path consistent",[23,9656,9657],{},"Package updates happen after Ubuntu is installed",[11,9659,9661,9665],{"id":9660,"level":526},"ubuntu-installer-keyboard",[16,9662,9664],{"id":9663},"step-24-keyboard","Step 2.4: Keyboard",[107,9666,9667,9675],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9668,9669],{"v-slot:left":114},[59,9670,9671],{},[171,9672],{"alt":9673,"src":9674,"variant":9569},"Ubuntu Server installer keyboard screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_3.png",[112,9676,9677],{"v-slot:right":114},[20,9678,9679,9682,9688],{},[23,9680,9681],{},"Keep the detected keyboard layout if it matches",[23,9683,9684,9685],{},"Common setting: ",[198,9686,9687],{},"English (US)",[23,9689,9690],{},"Use Identify keyboard only if typing is wrong",[11,9692,9694,9698],{"id":9693,"level":526},"ubuntu-installer-install-type",[16,9695,9697],{"id":9696},"step-25-install-type","Step 2.5: Install Type",[107,9699,9700,9708],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9701,9702],{"v-slot:left":114},[59,9703,9704],{},[171,9705],{"alt":9706,"src":9707,"variant":9569},"Ubuntu Server installer installation type screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_4.png",[112,9709,9710],{"v-slot:right":114},[20,9711,9712,9722,9725],{},[23,9713,9714,9715,9718,9719],{},"Select ",[198,9716,9717],{},"Ubuntu Server (minimized)","; don't choose full ",[198,9720,9721],{},"Ubuntu Server",[23,9723,9724],{},"Keep third-party drivers unchecked",[23,9726,9727],{},"Minimized keeps the VM lighter and aids future lessons",[11,9729,9731,9735],{"id":9730,"level":526},"ubuntu-installer-network",[16,9732,9734],{"id":9733},"step-26-network","Step 2.6: Network",[107,9736,9737,9745],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9738,9739],{"v-slot:left":114},[59,9740,9741],{},[171,9742],{"alt":9743,"src":9744,"variant":9569},"Ubuntu Server installer network configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_5.png",[112,9746,9747],{"v-slot:right":114},[20,9748,9749,9752,9758],{},[23,9750,9751],{},"DHCP address is expected",[23,9753,9754,9757],{},[198,9755,9756],{},"10.0.2.15"," is normal for VirtualBox NAT",[23,9759,9760],{},"Leave the network settings alone",[11,9762,9764,9768],{"id":9763,"level":526},"ubuntu-installer-proxy",[16,9765,9767],{"id":9766},"step-27-proxy","Step 2.7: Proxy",[107,9769,9770,9778],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9771,9772],{"v-slot:left":114},[59,9773,9774],{},[171,9775],{"alt":9776,"src":9777,"variant":9569},"Ubuntu Server installer proxy screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_6.png",[112,9779,9780],{"v-slot:right":114},[20,9781,9782,9785,9788],{},[23,9783,9784],{},"Leave proxy blank",[23,9786,9787],{},"Only fill this in if your network requires a proxy",[23,9789,9790],{},"Most student home networks do not need one",[11,9792,9794,9798],{"id":9793,"level":526},"ubuntu-installer-mirror",[16,9795,9797],{"id":9796},"step-28-mirror","Step 2.8: Mirror",[107,9799,9800,9808],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9801,9802],{"v-slot:left":114},[59,9803,9804],{},[171,9805],{"alt":9806,"src":9807,"variant":9569},"Ubuntu Server installer archive mirror screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_7.png",[112,9809,9810],{"v-slot:right":114},[20,9811,9812,9815,9818],{},[23,9813,9814],{},"Keep the default Ubuntu archive mirror",[23,9816,9817],{},"Wait for the mirror check to finish",[23,9819,9820],{},"Continue when the installer allows it",[11,9822,9824,9828],{"id":9823,"level":526},"ubuntu-installer-storage-guided",[16,9825,9827],{"id":9826},"step-29-guided-storage","Step 2.9: Guided Storage",[107,9829,9830,9838],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9831,9832],{"v-slot:left":114},[59,9833,9834],{},[171,9835],{"alt":9836,"src":9837,"variant":9569},"Ubuntu Server installer guided storage screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_8.png",[112,9839,9840],{"v-slot:right":114},[20,9841,9842,9845,9848],{},[23,9843,9844],{},"Use the entire virtual disk",[23,9846,9847],{},"LVM is optional, not needed for this course VM",[23,9849,9850],{},"Leave encryption off",[11,9852,9854,9858],{"id":9853,"level":526},"ubuntu-installer-storage-summary",[16,9855,9857],{"id":9856},"step-210-storage-summary","Step 2.10: Storage Summary",[107,9859,9860,9868],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9861,9862],{"v-slot:left":114},[59,9863,9864],{},[171,9865],{"alt":9866,"src":9867,"variant":9569},"Ubuntu Server installer storage summary screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_9.png",[112,9869,9870],{"v-slot:right":114},[20,9871,9872,9875,9878],{},[23,9873,9874],{},"Confirm the virtual disk is selected",[23,9876,9877],{},"This only affects the VM disk file",[23,9879,9880],{},"Continue when the layout looks correct",[11,9882,9884,9888],{"id":9883,"level":526},"ubuntu-installer-confirm-storage",[16,9885,9887],{"id":9886},"step-211-confirm-storage","Step 2.11: Confirm Storage",[107,9889,9890,9898],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9891,9892],{"v-slot:left":114},[59,9893,9894],{},[171,9895],{"alt":9896,"src":9897,"variant":9569},"Ubuntu Server installer destructive action confirmation","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_10.png",[112,9899,9900],{"v-slot:right":114},[20,9901,9902,9905,9908],{},[23,9903,9904],{},"Confirm the virtual disk format",[23,9906,9907],{},"This does not erase your host computer files",[23,9909,9910],{},"It formats the VM's virtual disk",[11,9912,9914,9918],{"id":9913,"level":526},"ubuntu-installer-profile",[16,9915,9917],{"id":9916},"step-212-profile","Step 2.12: Profile",[107,9919,9920,9928],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9921,9922],{"v-slot:left":114},[59,9923,9924],{},[171,9925],{"alt":9926,"src":9927,"variant":9569},"Ubuntu Server installer profile configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_11.png",[112,9929,9930],{"v-slot:right":114},[20,9931,9932,9935,9940,9942],{},[23,9933,9934],{},"Your name: your UCID or name is fine",[23,9936,9937,9938],{},"Server name: ",[198,9939,9300],{},[23,9941,5588],{},[23,9943,9944],{},"Choose a password you can type reliably (it can be simple since it's only for local work)",[11,9946,9948,9952],{"id":9947,"level":526},"ubuntu-installer-pro",[16,9949,9951],{"id":9950},"step-213-ubuntu-pro","Step 2.13: Ubuntu Pro",[107,9953,9954,9962],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9955,9956],{"v-slot:left":114},[59,9957,9958],{},[171,9959],{"alt":9960,"src":9961,"variant":9569},"Ubuntu Server installer Ubuntu Pro screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_12.png",[112,9963,9964],{"v-slot:right":114},[20,9965,9966,9971,9974],{},[23,9967,203,9968],{},[198,9969,9970],{},"Skip for now",[23,9972,9973],{},"Ubuntu Pro is not needed for the course VM",[23,9975,9976],{},"You can continue without an Ubuntu account",[11,9978,9980,9984],{"id":9979,"level":526},"ubuntu-installer-ssh",[16,9981,9983],{"id":9982},"step-214-ssh","Step 2.14: SSH",[107,9985,9986,9994],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,9987,9988],{"v-slot:left":114},[59,9989,9990],{},[171,9991],{"alt":9992,"src":9993,"variant":9569},"Ubuntu Server installer SSH configuration screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_13.png",[112,9995,9996],{"v-slot:right":114},[20,9997,9998,10003,10006],{},[23,9999,7658,10000],{},[198,10001,10002],{},"Install OpenSSH server",[23,10004,10005],{},"Password authentication is fine for this local VM",[23,10007,10008],{},"No need to import SSH keys for this course setup",[11,10010,10012,10016],{"id":10011,"level":526},"ubuntu-installer-snaps",[16,10013,10015],{"id":10014},"step-215-featured-snaps","Step 2.15: Featured Snaps",[107,10017,10018,10026],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,10019,10020],{"v-slot:left":114},[59,10021,10022],{},[171,10023],{"alt":10024,"src":10025,"variant":9569},"Ubuntu Server installer featured server snaps screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_14.png",[112,10027,10028],{"v-slot:right":114},[20,10029,10030,10033,10038],{},[23,10031,10032],{},"Leave all featured snaps unchecked",[23,10034,10035,10036],{},"Apache, PHP, and MySQL are installed later with ",[198,10037,6868],{},[23,10039,10040],{},"Continue without selecting extra packages",[11,10042,10044,10048],{"id":10043,"level":526},"ubuntu-installer-installing",[16,10045,10047],{"id":10046},"step-216-installing","Step 2.16: Installing",[107,10049,10050,10058],{"gap":1146,"left-width":9559,"right-width":9560,"stack":535},[112,10051,10052],{"v-slot:left":114},[59,10053,10054],{},[171,10055],{"alt":10056,"src":10057,"variant":9569},"Ubuntu Server installer installing system screen","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_vm_15.png",[112,10059,10060,10085],{"v-slot:right":114},[20,10061,10062,10065,10068,10076,10082],{},[23,10063,10064],{},"Installation can take a while",[23,10066,10067],{},"High CPU during install is normal",[23,10069,10070,10071,10073,10074],{},"If install struggles at ",[198,10072,9235],{},", recreate the VM with ",[198,10075,9243],{},[23,10077,10078,10079,10081],{},"Keep the course target at ",[198,10080,9235],{}," after setup if possible",[23,10083,10084],{},"Reboot once complete",[737,10086,10087],{"type":739},[59,10088,10089],{},"These target resources stay close to common cloud free-tier VMs",[59,10091,3037],{},[11,10093,10095,10099,10102],{"id":10094,"level":14},"step-2-networking",[16,10096,10098],{"id":10097},"virtualbox-configure-networking","VirtualBox: Configure Networking",[59,10100,10101],{},"Use one NAT adapter with port forwarding:",[20,10103,10104,10110,10119,10127,10132],{},[23,10105,10106,10107],{},"VM internet: ",[198,10108,10109],{},"NAT",[23,10111,10112,10113,10116,10117],{},"Host SSH: host ",[198,10114,10115],{},"22"," -> guest ",[198,10118,10115],{},[23,10120,10121,10122,10116,10125],{},"Host browser: host ",[198,10123,10124],{},"3000",[198,10126,8714],{},[23,10128,422,10129,10131],{},[198,10130,8932],{}," from the host computer",[23,10133,10134],{},"See the slides below for adapter and port-forwarding screens",[11,10136,10138,10142,10155],{"id":10137,"level":526},"adapter-settings-screen",[16,10139,10141],{"id":10140},"adapter-settings","Adapter Settings",[20,10143,10144,10147,10152],{},[23,10145,10146],{},"Adapter 1 enabled",[23,10148,10149,10150],{},"Attached to ",[198,10151,10109],{},[23,10153,10154],{},"No second adapter needed for the baseline path",[59,10156,10157],{},[171,10158],{"alt":10159,"src":10160,"variant":9569},"VirtualBox Adapter 1 configured as NAT","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_adapter_1.png",[11,10162,10164,10168,10196],{"id":10163,"level":526},"port-forwarding-screen",[16,10165,10167],{"id":10166},"port-forwarding","Port Forwarding",[20,10169,10170,10178,10185],{},[23,10171,10172,10173,10175,10176],{},"SSH: host ",[198,10174,10115],{}," to guest ",[198,10177,10115],{},[23,10179,10180,10181,10175,10183],{},"Apache HTTP: host ",[198,10182,10124],{},[198,10184,8714],{},[23,10186,10187,10188,10190,10191,10175,10194],{},"If host ",[198,10189,10115],{}," is already busy, use host ",[198,10192,10193],{},"2222",[198,10195,10115],{},[59,10197,10198],{},[171,10199],{"alt":10200,"src":10201,"variant":9569},"VirtualBox NAT port forwarding rules","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_adapter_1_ports.png",[11,10203,10205,10209,10212,10215,10218,10221],{"id":10204,"level":14},"step-3-connect-ssh",[16,10206,10208],{"id":10207},"step-3-connect-with-ssh","Step 3: Connect With SSH",[59,10210,10211],{},"Run from your host terminal:",[119,10213],{"language":122,"src":10214},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-3-connect-with-ssh-01.sh",[59,10216,10217],{},"First connection prompt:",[119,10219],{"language":4442,"src":10220},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-3-connect-with-ssh-02.txt",[20,10222,10223,10230,10239,10242,10245],{},[23,10224,10225,10226,10229],{},"Replace ",[198,10227,10228],{},"your_ucid"," with your UCID",[23,10231,10232,10233,10235,10236,10238],{},"Type ",[198,10234,665],{}," once for this course VM on ",[198,10237,8932],{}," (if prompted like the example above)",[23,10240,10241],{},"Enter your Ubuntu password",[23,10243,10244],{},"After login, commands run inside Ubuntu",[23,10246,10247,302,10250,10253],{},[198,10248,10249],{},"exit",[198,10251,10252],{},"logout"," disconnects from the VM",[11,10255,10257,10261,10264],{"id":10256,"level":14},"step-4-confirm-network",[16,10258,10260],{"id":10259},"step-4-confirm-vm-network","Step 4: Confirm VM Network",[59,10262,10263],{},"Run inside Ubuntu through SSH:",[107,10265,10266,10308],{"gap":109,"left-width":384,"right-width":110,"stack":535},[112,10267,10268,10271,10274],{"v-slot:left":114},[59,10269,10270],{},"Network check:",[119,10272],{"language":122,"src":10273},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-4-confirm-vm-networ-03.sh",[20,10275,10276,10282,10288,10294,10300],{},[23,10277,10278,10281],{},[198,10279,10280],{},"ping",": confirms basic network access",[23,10283,10284,10287],{},[198,10285,10286],{},"-c 4",": stop after four replies",[23,10289,10290,10293],{},[198,10291,10292],{},"apt update",": refreshes package indexes",[23,10295,10296,10299],{},[198,10297,10298],{},"apt upgrade",": applies available package updates",[23,10301,938,10302,10304,10305],{},[198,10303,10280],{}," is not found, run ",[198,10306,10307],{},"sudo apt install iputils-ping",[112,10309,10310,10313,10316],{"v-slot:right":114},[59,10311,10312],{},"Port-forwarding check:",[119,10314],{"language":122,"src":10315},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fslide-id-summary-level-2-04.sh",[20,10317,10318,10323,10326,10330],{},[23,10319,10320,10321],{},"The VM may show ",[198,10322,9756],{},[23,10324,10325],{},"That is normal for VirtualBox NAT",[23,10327,422,10328,10131],{},[198,10329,8932],{},[23,10331,10332],{},"Port forwarding routes host traffic into the VM",[11,10334,10336,10340],{"id":10335,"level":14},"step-5-shared-folder",[16,10337,10339],{"id":10338},"step-5-enable-shared-folder","Step 5: Enable Shared Folder",[107,10341,10342,10376],{"gap":109,"left-width":534,"right-width":384,"stack":535},[112,10343,10344,10347],{"v-slot:left":114},[59,10345,10346],{},"In VirtualBox:",[20,10348,10349,10352,10355,10358,10361,10364,10367,10370,10373],{},[23,10350,10351],{},"Open VM settings",[23,10353,10354],{},"Choose Shared Folders",[23,10356,10357],{},"Folder Path: your cloned course repository folder",[23,10359,10360],{},"Folder Name: a simple repo name with no spaces",[23,10362,10363],{},"Mount Point: leave blank",[23,10365,10366],{},"Read-only: off",[23,10368,10369],{},"Auto-mount: on",[23,10371,10372],{},"Make Machine-permanent: on",[23,10374,10375],{},"Make Global: off",[112,10377,10378],{"v-slot:right":114},[59,10379,10380],{},[171,10381],{"alt":10382,"src":10383,"variant":175},"VirtualBox shared folder settings with the course repo selected","\u002Fimages\u002Finternet-applications\u002Fvirtualbox\u002Fvb_shared_folder.png",[11,10385,10387,10391,10394,10397],{"id":10386,"level":14},"step-6-guest-additions",[16,10388,10390],{"id":10389},"step-6-install-shared-folder-support","Step 6: Install Shared Folder Support",[59,10392,10393],{},"Run inside Ubuntu:",[119,10395],{"language":122,"src":10396},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-6-install-shared-fo-05.sh",[20,10398,10399,10406,10412],{},[23,10400,3457,10401,287,10403,10405],{},[198,10402,10292],{},[198,10404,10298],{}," first only if you skipped the Step 4 updates",[23,10407,10408,10411],{},[198,10409,10410],{},"virtualbox-guest-utils",": VirtualBox shared-folder support",[23,10413,10414],{},"Reboot after the group step on the next slide",[11,10416,10418,10422,10425,10428],{"id":10417,"level":526},"step-6b-confirm-vboxsf",[16,10419,10421],{"id":10420},"step-61-check-the-shared-folder","Step 6.1: Check The Shared Folder",[59,10423,10424],{},"Reconnect with SSH, then run inside Ubuntu:",[119,10426],{"language":122,"src":10427},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-6-1-check-the-share-06.sh",[20,10429,10430,10436,10442],{},[23,10431,10432,10435],{},[198,10433,10434],{},"ls \u002Fmedia",": shows available mounted folders",[23,10437,10438,10441],{},[198,10439,10440],{},"ls \u002Fmedia\u002F\u003Cshared-folder>",": checks your course repo share",[23,10443,10444],{},"Permission denied is common the first time",[11,10446,10448,10452,10455,10458],{"id":10447,"level":14},"step-7-locate-share",[16,10449,10451],{"id":10450},"step-7-allow-shared-folder-access","Step 7: Allow Shared Folder Access",[59,10453,10454],{},"If the shared folder exists but says permission denied:",[119,10456],{"language":122,"src":10457},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-7-allow-shared-fold-07.sh",[20,10459,10460,10466,10472],{},[23,10461,10462,10465],{},[198,10463,10464],{},"vboxsf",": group allowed to read VirtualBox shared folders",[23,10467,10468,10471],{},[198,10469,10470],{},"$USER",": your Ubuntu login user for terminal access",[23,10473,10474],{},"Reboot applies the shared-folder support and new group membership",[11,10476,10478,10482,10484,10487,10504,10507],{"id":10477,"level":526},"step-7b-locate-share",[16,10479,10481],{"id":10480},"step-71-locate-the-shared-repo","Step 7.1: Locate The Shared Repo",[59,10483,10424],{},[119,10485],{"language":122,"src":10486},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-7-1-locate-the-shar-08.sh",[20,10488,10489,10495,10501],{},[23,10490,10491,10494],{},[198,10492,10493],{},"\u002Fmedia",": VirtualBox auto-mounted shared folders",[23,10496,10497,10500],{},[198,10498,10499],{},"\u003Cshared-folder>",": your shared course repo folder name",[23,10502,10503],{},"Use the folder that points to your repository",[59,10505,10506],{},"Expected repo folders:",[20,10508,10509,10513,10517,10521],{},[23,10510,10511],{},[198,10512,1945],{},[23,10514,10515],{},[198,10516,6309],{},[23,10518,10519],{},[198,10520,6312],{},[23,10522,10523],{},[198,10524,6315],{},[11,10526,10528,10532,10547],{"id":10527,"level":526},"step-7-2-shared-folder-check",[16,10529,10531],{"id":10530},"step-72-shared-folder-check","Step 7.2: Shared Folder Check",[20,10533,10534,10537,10544],{},[23,10535,10536],{},"Edit a small file from VS Code on host",[23,10538,3457,10539,302,10541,10543],{},[198,10540,1934],{},[198,10542,2151],{}," inside Ubuntu",[23,10545,10546],{},"Confirm Ubuntu sees the same file content",[59,10548,10549],{},"If the file does not match, stop and fix the share before Apache setup",[11,10551,10553,10557,10559,10562],{"id":10552,"level":14},"step-8-install-apache-php-mysql",[16,10554,10556],{"id":10555},"step-8-install-apache-php-and-mysql","Step 8: Install Apache, PHP, And MySQL",[59,10558,10393],{},[119,10560],{"language":122,"src":10561},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-8-install-apache-ph-09.sh",[20,10563,10564,10570,10575,10581,10587,10593],{},[23,10565,10566,10569],{},[198,10567,10568],{},"apache2",": web server",[23,10571,10572,10574],{},[198,10573,6102],{},": PHP runtime",[23,10576,10577,10580],{},[198,10578,10579],{},"libapache2-mod-php",": lets Apache execute PHP files",[23,10582,10583,10586],{},[198,10584,10585],{},"mysql-server",": local MySQL database server",[23,10588,10589,10592],{},[198,10590,10591],{},"php-mysql",": lets PHP connect to MySQL",[23,10594,3457,10595,287,10597,10599],{},[198,10596,10292],{},[198,10598,10298],{}," first only if they have not been run recently",[11,10601,10603,10607,10614],{"id":10602,"level":526},"optional-swap-check",[16,10604,10606],{"id":10605},"optional-add-swap-if-swap-is-off","Optional: Add Swap If Swap Is Off",[59,10608,10609,10610,10613],{},"Ubuntu usually has swap already. Only add this if ",[198,10611,10612],{},"swapon --show"," prints nothing.",[107,10615,10616,10630],{"gap":109,"left-width":110,"right-width":110},[112,10617,10618,10621,10624,10627],{"v-slot:left":114},[59,10619,10620],{},"Check first:",[119,10622],{"language":122,"src":10623},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-add-swap-if-swa-10.sh",[59,10625,10626],{},"Add a small swap file only if swap is off:",[119,10628],{"language":122,"src":10629},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-add-swap-if-swa-11.sh",[112,10631,10632],{"v-slot:right":114},[20,10633,10634,10637,10642,10645],{},[23,10635,10636],{},"Swap gives Ubuntu emergency disk-backed memory",[23,10638,10639,10640],{},"It helps when installs or MySQL briefly need more than ",[198,10641,9235],{},[23,10643,10644],{},"It is slower than RAM, so it is not a performance upgrade",[23,10646,10647],{},"Do not run the setup again if swap already exists",[11,10649,10651,10655,10661],{"id":10650,"level":526},"optional-apache-low-memory",[16,10652,10654],{"id":10653},"optional-limit-apache-memory-use","Optional: Limit Apache Memory Use",[59,10656,10657,10658,10660],{},"Use this if the ",[198,10659,9235],{}," VM feels unstable or Apache starts too many PHP workers.",[107,10662,10663,10676],{"gap":109,"left-width":110,"right-width":110},[112,10664,10665,10668,10673],{"v-slot:left":114},[59,10666,10667],{},"Edit Apache prefork settings in:",[59,10669,10670],{},[198,10671,10672],{},"\u002Fetc\u002Fapache2\u002Fmods-available\u002Fmpm_prefork.conf",[119,10674],{"language":122,"src":10675},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-apache-me-12.sh",[112,10677,10678,10681,10685],{"v-slot:right":114},[59,10679,10680],{},"Change the existing values to:",[119,10682],{"language":10683,"src":10684},"apache","\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-apache-me-13.txt",[20,10686,10687,10693,10696,10703],{},[23,10688,10689,10690],{},"Edit the existing lines inside ",[198,10691,10692],{},"\u003CIfModule mpm_prefork_module>",[23,10694,10695],{},"If a line is missing, add it inside that same block",[23,10697,10698,10699,10702],{},"Do not paste a second ",[198,10700,10701],{},"\u003CIfModule>"," block",[23,10704,10705],{},"Restart Apache after config changes",[11,10707,10709,10713,10719],{"id":10708,"level":526},"optional-mysql-low-memory",[16,10710,10712],{"id":10711},"optional-limit-mysql-memory-use","Optional: Limit MySQL Memory Use",[59,10714,10715,10716,10718],{},"Use this only if MySQL struggles on the ",[198,10717,9235],{}," VM.",[107,10720,10721,10734],{"gap":109,"left-width":110,"right-width":110},[112,10722,10723,10726,10731],{"v-slot:left":114},[59,10724,10725],{},"Edit MySQL server settings in:",[59,10727,10728],{},[198,10729,10730],{},"\u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf",[119,10732],{"language":122,"src":10733},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-mysql-mem-14.sh",[112,10735,10736,10742,10745],{"v-slot:right":114},[59,10737,10738,10739,2373],{},"Add or edit these under ",[198,10740,10741],{},"[mysqld]",[119,10743],{"language":6909,"src":10744},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Foptional-limit-mysql-mem-15.txt",[20,10746,10747,10753,10758,10761],{},[23,10748,10749,10750,10752],{},"Keep these under the existing ",[198,10751,10741],{}," heading",[23,10754,10755,10756,10752],{},"Do not create a second ",[198,10757,10741],{},[23,10759,10760],{},"If either setting already exists, edit it instead of adding a duplicate",[23,10762,10763],{},"Restart MySQL after config changes",[11,10765,10767,10770,10773,10776],{"id":10766,"level":526},"low-memory-diagnostics",[16,10768,10769],{"id":10766},"Low Memory Diagnostics",[59,10771,10772],{},"Run these after the minor tuning checks:",[119,10774],{"language":122,"src":10775},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Flow-memory-diagnostics-10.sh",[20,10777,10778,10784,10789,10795,10802],{},[23,10779,10780,10783],{},[198,10781,10782],{},"free -h",": shows RAM and swap",[23,10785,10786,10788],{},[198,10787,10612],{},": confirms whether swap is active",[23,10790,10791,10794],{},[198,10792,10793],{},"systemctl status",": checks whether Apache and MySQL are running",[23,10796,10797,10798,10801],{},"No output from the ",[198,10799,10800],{},"grep"," line is usually good",[23,10803,10804],{},"Do not tune randomly; change one setting, restart, then retest",[11,10806,10808,10812,10814,10817,10820,10823],{"id":10807,"level":14},"step-9-create-local-mysql-db",[16,10809,10811],{"id":10810},"step-9-create-a-local-mysql-database","Step 9: Create A Local MySQL Database",[59,10813,10393],{},[119,10815],{"language":122,"src":10816},"\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",[59,10818,10819],{},"Then run in the MySQL prompt:",[119,10821],{"language":6315,"src":10822},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-9-create-a-local-my-12.sql",[20,10824,10825,10829,10832],{},[23,10826,10225,10827,10229],{},[198,10828,10228],{},[23,10830,10831],{},"Database name and username should match your UCID",[23,10833,10834],{},"Password is local-only unless your instructor says otherwise",[11,10836,10838,10841,10844,10857,10860,10866],{"id":10837,"level":14},"local-vs-remote-database",[16,10839,10840],{"id":10837},"Local Vs Remote Database",[59,10842,10843],{},"This MySQL database is only for local testing:",[20,10845,10846,10850,10852,10854],{},[23,10847,5576,10848],{},[198,10849,8932],{},[23,10851,5591],{},[23,10853,5588],{},[23,10855,10856],{},"Password: your local password",[59,10858,10859],{},"Render uses the instructor-provided remote database connection string",[59,10861,10862,10863],{},"Get that string from ",[1047,10864,5602],{"href":5602,"rel":10865},[1051],[59,10867,10868],{},"After this lesson, you may optionally point local code at that remote database for extra testing",[11,10870,10872,10876,10878,10881,10883,10886,10889],{"id":10871,"level":14},"step-10-confirm-local-mysql",[16,10873,10875],{"id":10874},"step-10-confirm-local-mysql-login","Step 10: Confirm Local MySQL Login",[59,10877,10393],{},[119,10879],{"language":122,"src":10880},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-10-confirm-local-my-13.sh",[59,10882,5088],{},[119,10884],{"language":6315,"src":10885},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-10-confirm-local-my-14.sql",[59,10887,10888],{},"Expected:",[20,10890,10891,10897],{},[23,10892,10893,10896],{},[198,10894,10895],{},"SELECT DATABASE()"," returns your UCID",[23,10898,10899,10902],{},[198,10900,10901],{},"SHOW TABLES"," is empty or shows starter tables later",[11,10904,10906,10912,10915,10918,10921],{"id":10905,"level":14},"step-11-documentroot",[16,10907,10909,10910],{"id":10908},"step-11-point-apache-at-public_html","Step 11: Point Apache At ",[198,10911,1945],{},[59,10913,10914],{},"Apache should serve:",[119,10916],{"language":4442,"src":10917},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-11-point-apache-at--15.txt",[59,10919,10920],{},"Do not serve the whole repo",[20,10922,10923,10932],{},[23,10924,10925,1746,10927,1750,10929,10931],{},[198,10926,6309],{},[198,10928,6312],{},[198,10930,6315],{}," stay outside the web root",[23,10933,10934,10936],{},[198,10935,1945],{}," is the browser-facing folder",[11,10938,10940,10944,10947,10952,10954,10959,10962,10965],{"id":10939,"level":526},"apache-site-config",[16,10941,10943],{"id":10942},"step-111-apache-site-config","Step 11.1: Apache Site Config",[59,10945,10946],{},"Create or edit this Apache site config file inside Ubuntu:",[59,10948,10949],{},[198,10950,10951],{},"\u002Fetc\u002Fapache2\u002Fsites-available\u002Fit202.conf",[59,10953,117],{},[59,10955,10956],{},[198,10957,10958],{},"sudo nano \u002Fetc\u002Fapache2\u002Fsites-available\u002Fit202.conf",[59,10960,10961],{},"Add this content to that file:",[119,10963],{"language":10683,"src":10964},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-11-1-apache-site-co-16.txt",[20,10966,10967,10972,10978,10983],{},[23,10968,10225,10969,10971],{},[198,10970,10499],{}," with the actual shared folder name",[23,10973,10974,10975],{},"Save the file as ",[198,10976,10977],{},"it202.conf",[23,10979,10980,10981],{},"Apache listens on guest port ",[198,10982,8714],{},[23,10984,10985,10986],{},"Host browser reaches it through ",[198,10987,8790],{},[11,10989,10991,10995,10997,11000],{"id":10990,"level":526},"enable-site",[16,10992,10994],{"id":10993},"step-112-enable-the-site","Step 11.2: Enable The Site",[59,10996,10393],{},[119,10998],{"language":122,"src":10999},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Fstep-11-2-enable-the-sit-17.sh",[20,11001,11002,11008,11014,11020,11028,11034],{},[23,11003,11004,11007],{},[198,11005,11006],{},"a2ensite",": enable a site config",[23,11009,11010,11013],{},[198,11011,11012],{},"a2dissite",": disable a site config",[23,11015,11016,11019],{},[198,11017,11018],{},"www-data",": Apache's user for browser requests",[23,11021,11022,11023,7062,11025,11027],{},"Adding ",[198,11024,11018],{},[198,11026,10464],{}," lets Apache read the shared folder",[23,11029,11030,11033],{},[198,11031,11032],{},"configtest",": check syntax before reload",[23,11035,11036,11039],{},[198,11037,11038],{},"restart",": applies the Apache user group change",[11,11041,11043,11047,11050,11053,11056],{"id":11042,"level":14},"step-12-php-check-page",[16,11044,11046],{"id":11045},"step-12-create-a-php-check-page","Step 12: Create A PHP Check Page",[59,11048,11049],{},"Create this file on the host:",[119,11051],{"language":4442,"src":11052},"\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",[59,11054,11055],{},"Example content:",[119,11057],{"language":6102,"src":11058},"\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,11060,11062,11065,11068,11071,11073],{"id":11061,"level":14},"final-browser-check",[16,11063,11064],{"id":11061},"Final Browser Check",[59,11066,11067],{},"Open from host browser:",[119,11069],{"language":4442,"src":11070},"\u002Fgenerated-snippets\u002Finternet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox\u002Ffinal-browser-check-20.txt",[59,11072,10888],{},[20,11074,11075,11078,11081,11084],{},[23,11076,11077],{},"Message appears",[23,11079,11080],{},"Time appears",[23,11082,11083],{},"PHP code is not shown as raw text",[23,11085,11086],{},"Editing the file on host changes output after refresh",[11,11088,11090,11093],{"id":11089,"level":14},"common-problems",[16,11091,11092],{"id":11089},"Common Problems",[20,11094,11095,11098,11101,11106,11109,11122,11132],{},[23,11096,11097],{},"Browser timeout: missing or wrong port-forwarding rule",[23,11099,11100],{},"Connection refused: Apache not running",[23,11102,11103,11104],{},"No internet in VM: check Adapter 1 is still ",[198,11105,10109],{},[23,11107,11108],{},"Shared folder missing: check Auto-mount and guest utilities",[23,11110,11111,11112,11115,11116,11118,11119,11121],{},"Browser shows ",[198,11113,11114],{},"403 Forbidden",": confirm ",[198,11117,11018],{}," is in ",[198,11120,10464],{},", then restart Apache or reboot",[23,11123,11124,11125,11128,11129,11131],{},"Permission denied on ",[198,11126,11127],{},"\u002Fmedia\u002Fsf_...",": confirm your Ubuntu user is in ",[198,11130,10464],{}," and reboot",[23,11133,11134],{},"Raw PHP code: PHP module not running through Apache",[11,11136,11138,11141,11144],{"id":11137,"level":14},"recovery-routine",[16,11139,11140],{"id":11137},"Recovery Routine",[59,11142,11143],{},"Check in this order:",[909,11145,11146,11149,11155,11161,11166,11174,11181,11187,11192,11201],{},[23,11147,11148],{},"VM is running",[23,11150,11151,11154],{},[198,11152,11153],{},"ping github.com"," works inside Ubuntu",[23,11156,11157,11160],{},[198,11158,11159],{},"ssh username@localhost"," works from host",[23,11162,11163,11165],{},[198,11164,10440],{}," shows the shared repo",[23,11167,11168,11171,11172],{},[198,11169,11170],{},"groups"," includes ",[198,11173,10464],{},[23,11175,11176,11171,11179],{},[198,11177,11178],{},"id www-data",[198,11180,10464],{},[23,11182,11183,11186],{},[198,11184,11185],{},"sudo systemctl status apache2"," is active",[23,11188,11189,11186],{},[198,11190,11191],{},"sudo systemctl status mysql",[23,11193,11194,11197,11198],{},[198,11195,11196],{},"sudo apache2ctl configtest"," says ",[198,11199,11200],{},"Syntax OK",[23,11202,11203,11206],{},[198,11204,11205],{},"http:\u002F\u002Flocalhost:3000\u002Fsystem\u002Fvm-check.php"," loads from the host browser",[11,11208,11209,11211],{"id":1003,"level":14},[16,11210,1004],{"id":1003},[107,11212,11213,11254],{"gap":109,"left-width":110,"right-width":110},[112,11214,11215,11217,11223,11232,11237,11243,11249],{"v-slot:left":114},[528,11216,1012],{"id":1011},[59,11218,11219,11222],{},[295,11220,11221],{},"VM"," - separate computer running inside your host computer",[59,11224,11225,11228,11229,11231],{},[295,11226,11227],{},"Port forwarding"," - host ",[198,11230,8932],{}," traffic routed into the VM",[59,11233,11234,11236],{},[295,11235,10464],{}," - VirtualBox shared-folder permission group",[59,11238,11239,11242],{},[295,11240,11241],{},"Guest utilities"," - VirtualBox tools that help shared folders work inside Ubuntu",[59,11244,11245,11248],{},[295,11246,11247],{},"DocumentRoot"," - folder Apache serves to browsers",[59,11250,11251,11253],{},[295,11252,10109],{}," - VM network mode that gives the VM outbound internet access",[112,11255,11256,11258],{"v-slot:right":114},[528,11257,1041],{"id":1000},[20,11259,11260,11266,11273,11280,11287,11294,11300],{},[23,11261,11262],{},[1047,11263,11265],{"href":8856,"rel":11264},[1051],"VirtualBox Downloads",[23,11267,11268],{},[1047,11269,11272],{"href":11270,"rel":11271},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002FIntroduction.html",[1051],"VirtualBox Manual: Host And Guest Combinations",[23,11274,11275],{},[1047,11276,11279],{"href":11277,"rel":11278},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Finstallation.html",[1051],"VirtualBox Manual: Installation",[23,11281,11282],{},[1047,11283,11286],{"href":11284,"rel":11285},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Fsharedfolders.html",[1051],"VirtualBox Manual: Shared Folders",[23,11288,11289],{},[1047,11290,11293],{"href":11291,"rel":11292},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fvirtualization\u002Fvirtualbox\u002F7.2\u002Fuser\u002Fnetworkingdetails.html#network_nat_service",[1051],"VirtualBox Manual: NAT Port Forwarding",[23,11295,11296],{},[1047,11297,11299],{"href":8874,"rel":11298},[1051],"Ubuntu Server: Installer",[23,11301,11302],{},[1047,11303,11306],{"href":11304,"rel":11305},"https:\u002F\u002Fdocumentation.ubuntu.com\u002Fserver\u002Fhow-to\u002Fsecurity\u002Fopenssh-server\u002F",[1051],"Ubuntu Server: OpenSSH Server",[11,11308,11309,11311,11313],{"id":1076,"level":14},[16,11310,1079],{"id":1076},[59,11312,1082],{},[20,11314,11315,11318,11321,11324,11327,11332],{},[23,11316,11317],{},"Pick the correct Ubuntu ISO for your host CPU",[23,11319,11320],{},"Configure NAT port forwarding",[23,11322,11323],{},"Connect to Ubuntu with SSH",[23,11325,11326],{},"Find the VirtualBox shared repo",[23,11328,11329,11330],{},"Configure Apache to serve ",[198,11331,1945],{},[23,11333,11334],{},"Create a local MySQL database and user named after your UCID",{"title":114,"searchDepth":1110,"depth":1110,"links":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,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11395,11396,11397,11398,11399,11400,11401,11402],{"id":8736,"depth":1110,"text":8728},{"id":8762,"depth":1110,"text":8765},{"id":8807,"depth":1110,"text":8810},{"id":1762,"depth":1110,"text":1765},{"id":8912,"depth":1110,"text":8915},{"id":8947,"depth":1110,"text":8948},{"id":8971,"depth":1110,"text":8974},{"id":9003,"depth":1110,"text":9006},{"id":9029,"depth":1110,"text":9032},{"id":9058,"depth":1110,"text":9061},{"id":9090,"depth":1110,"text":9091},{"id":9114,"depth":1110,"text":9117},{"id":9145,"depth":1110,"text":9148},{"id":9176,"depth":1110,"text":9177},{"id":9212,"depth":1110,"text":9213},{"id":9274,"depth":1110,"text":9277},{"id":9309,"depth":1110,"text":9312},{"id":9355,"depth":1110,"text":9358},{"id":9398,"depth":1110,"text":9401},{"id":9442,"depth":1110,"text":9445},{"id":9492,"depth":1110,"text":9493},{"id":9555,"depth":1110,"text":9556},{"id":9591,"depth":1110,"text":9592},{"id":9626,"depth":1110,"text":9627},{"id":9663,"depth":1110,"text":9664},{"id":9696,"depth":1110,"text":9697},{"id":9733,"depth":1110,"text":9734},{"id":9766,"depth":1110,"text":9767},{"id":9796,"depth":1110,"text":9797},{"id":9826,"depth":1110,"text":9827},{"id":9856,"depth":1110,"text":9857},{"id":9886,"depth":1110,"text":9887},{"id":9916,"depth":1110,"text":9917},{"id":9950,"depth":1110,"text":9951},{"id":9982,"depth":1110,"text":9983},{"id":10014,"depth":1110,"text":10015},{"id":10046,"depth":1110,"text":10047},{"id":10097,"depth":1110,"text":10098},{"id":10140,"depth":1110,"text":10141},{"id":10166,"depth":1110,"text":10167},{"id":10207,"depth":1110,"text":10208},{"id":10259,"depth":1110,"text":10260},{"id":10338,"depth":1110,"text":10339},{"id":10389,"depth":1110,"text":10390},{"id":10420,"depth":1110,"text":10421},{"id":10450,"depth":1110,"text":10451},{"id":10480,"depth":1110,"text":10481},{"id":10530,"depth":1110,"text":10531},{"id":10555,"depth":1110,"text":10556},{"id":10605,"depth":1110,"text":10606},{"id":10653,"depth":1110,"text":10654},{"id":10711,"depth":1110,"text":10712},{"id":10766,"depth":1110,"text":10769},{"id":10810,"depth":1110,"text":10811},{"id":10837,"depth":1110,"text":10840},{"id":10874,"depth":1110,"text":10875},{"id":10908,"depth":1110,"text":11394},"Step 11: Point Apache At public_html",{"id":10942,"depth":1110,"text":10943},{"id":10993,"depth":1110,"text":10994},{"id":11045,"depth":1110,"text":11046},{"id":11061,"depth":1110,"text":11064},{"id":11089,"depth":1110,"text":11092},{"id":11137,"depth":1110,"text":11140},{"id":1003,"depth":1110,"text":1004},{"id":1076,"depth":1110,"text":1079},"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":8728,"description":11403},"internet-applications\u002Fpresentations\u002F01-git-github-and-course-workflow\u002F09-local-ubuntu-web-server-virtualbox",[11413,11414,10683,11415,11416],"virtualbox","ubuntu","mysql","vm","1:06:16","ArTDIgihfd4","https:\u002F\u002Fyoutu.be\u002FArTDIgihfd4","IT202 VirtualBox and VM Setup","CNlzYvIiYNPSzbQ6tvCdcnJLlvvGSGmurOGWR_mSnms",[],1780581681121]