[{"data":1,"prerenderedAt":1449},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fdev\u002Fbash\u002Fbash-rc":186,"surround-\u002Fdev\u002Fbash\u002Fbash-rc":1295,"notes-index":1300},[4,62,127,138,149,160,175],{"title":5,"path":6,"stem":7,"children":8},"Dev","\u002Fdev","1.dev",[9,12,26,36,46,52],{"title":10,"path":6,"stem":11},"Development","1.dev\u002Findex",{"title":13,"path":14,"stem":15,"children":16},"Laravel","\u002Fdev\u002Flaravel","1.dev\u002F1.laravel\u002Findex",[17,18,22],{"title":13,"path":14,"stem":15},{"title":19,"path":20,"stem":21},"Eloquent Relationships","\u002Fdev\u002Flaravel\u002Feloquent-relationships","1.dev\u002F1.laravel\u002F1.eloquent-relationships",{"title":23,"path":24,"stem":25},"Laravel Homestead","\u002Fdev\u002Flaravel\u002Flaravel-homestead","1.dev\u002F1.laravel\u002F2.laravel-homestead",{"title":27,"path":28,"stem":29,"children":30},"Bash","\u002Fdev\u002Fbash","1.dev\u002F13.bash\u002Findex",[31,32],{"title":27,"path":28,"stem":29},{"title":33,"path":34,"stem":35},"My Bash RC","\u002Fdev\u002Fbash\u002Fbash-rc","1.dev\u002F13.bash\u002F2.bash-rc",{"title":37,"path":38,"stem":39,"children":40},"Clean Code","\u002Fdev\u002Fclean-code","1.dev\u002F15.clean-code\u002Findex",[41,42],{"title":37,"path":38,"stem":39},{"title":43,"path":44,"stem":45},"Naming Things","\u002Fdev\u002Fclean-code\u002Fnaming-things","1.dev\u002F15.clean-code\u002F1.naming-things",{"title":47,"path":48,"stem":49,"children":50},"AI Prompting","\u002Fdev\u002Fai-prompting","1.dev\u002F17.ai-prompting\u002Findex",[51],{"title":47,"path":48,"stem":49},{"title":53,"path":54,"stem":55,"children":56},"Git","\u002Fdev\u002Fgit","1.dev\u002F9.git\u002Findex",[57,58],{"title":53,"path":54,"stem":55},{"title":59,"path":60,"stem":61},"Git Cheat Sheet","\u002Fdev\u002Fgit\u002Fgit-cheat-sheet","1.dev\u002F9.git\u002F1.git-cheat-sheet",{"title":63,"path":64,"stem":65,"children":66},"Teaching","\u002Fteaching","2.teaching",[67,69],{"title":63,"path":64,"stem":68},"2.teaching\u002Findex",{"title":70,"path":71,"stem":72,"children":73},"AppsDev","\u002Fteaching\u002Fapps-dev","2.teaching\u002F1.apps-dev\u002Findex",[74,75,93,107,117],{"title":70,"path":71,"stem":72},{"title":76,"path":77,"stem":78,"children":79},"Lesson Plans","\u002Fteaching\u002Fapps-dev\u002Flesson-plans","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002Findex",[80,81,85,89],{"title":76,"path":77,"stem":78},{"title":82,"path":83,"stem":84},"Coding with AI","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fcoding-with-ai","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F1.coding-with-ai",{"title":86,"path":87,"stem":88},"Coding with AI: Prompts & Reading JavaScript","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fprompts-and-reading-js","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F2.prompts-and-reading-js",{"title":90,"path":91,"stem":92},"JavaScript for Beginners","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fjavascript-for-beginners","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F3.javascript-for-beginners",{"title":94,"path":95,"stem":96,"children":97},"Activities","\u002Fteaching\u002Fapps-dev\u002Factivities","2.teaching\u002F1.apps-dev\u002F2.activities\u002Findex",[98,99,103],{"title":94,"path":95,"stem":96},{"title":100,"path":101,"stem":102},"Dynamic Portfolio Website","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fdynamic-portfolio-website","2.teaching\u002F1.apps-dev\u002F2.activities\u002F2.dynamic-portfolio-website",{"title":104,"path":105,"stem":106},"Mini Product Store","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fmini-product-store","2.teaching\u002F1.apps-dev\u002F2.activities\u002F3.mini-product-store",{"title":108,"path":109,"stem":110,"children":111},"Exercises","\u002Fteaching\u002Fapps-dev\u002Fexercises","2.teaching\u002F1.apps-dev\u002F4.exercises\u002Findex",[112,113],{"title":108,"path":109,"stem":110},{"title":114,"path":115,"stem":116},"Read & Predict","\u002Fteaching\u002Fapps-dev\u002Fexercises\u002Fread-and-predict","2.teaching\u002F1.apps-dev\u002F4.exercises\u002F1.read-and-predict",{"title":118,"path":119,"stem":120,"children":121},"AI Prompts","\u002Fteaching\u002Fapps-dev\u002Fai-prompts","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002Findex",[122,123],{"title":118,"path":119,"stem":120},{"title":124,"path":125,"stem":126},"Prompt Flow","\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fbasic-prompting","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F1.basic-prompting",{"title":128,"path":129,"stem":130,"children":131},"Snippets","\u002Fsnippets","3.snippets",[132,134],{"title":128,"path":129,"stem":133},"3.snippets\u002Findex",{"title":135,"path":136,"stem":137},"Debounce and Throttle","\u002Fsnippets\u002Fdebounce-and-throttle","3.snippets\u002F1.debounce-and-throttle",{"title":139,"path":140,"stem":141,"children":142},"Cheat Sheets","\u002Fcheat-sheets","4.cheat-sheets",[143,145],{"title":139,"path":140,"stem":144},"4.cheat-sheets\u002Findex",{"title":146,"path":147,"stem":148},"Vim Cheat Sheet","\u002Fcheat-sheets\u002Fvim-cheat-sheet","4.cheat-sheets\u002F1.vim-cheat-sheet",{"title":150,"path":151,"stem":152,"children":153},"Templates","\u002Ftemplates","5.templates",[154,156],{"title":150,"path":151,"stem":155},"5.templates\u002Findex",{"title":157,"path":158,"stem":159},"Pull Request Template","\u002Ftemplates\u002Fpull-request-template","5.templates\u002F1.pull-request-template",{"title":161,"path":162,"stem":163,"children":164},"Meta","\u002Fmeta","6.meta",[165,167,171],{"title":161,"path":162,"stem":166},"6.meta\u002Findex",{"title":168,"path":169,"stem":170},"Authoring Guide","\u002Fmeta\u002Fauthoring-guide","6.meta\u002F1.authoring-guide",{"title":172,"path":173,"stem":174},"Markdown Showcase","\u002Fmeta\u002Fmarkdown-showcase","6.meta\u002F2.markdown-showcase",{"title":176,"path":177,"stem":178,"children":179},"Troubleshooting","\u002Ftroubleshooting","7.troubleshooting",[180,182],{"title":176,"path":177,"stem":181},"7.troubleshooting\u002Findex",{"title":183,"path":184,"stem":185},"Fixing CORS Errors","\u002Ftroubleshooting\u002Fcors-errors","7.troubleshooting\u002F1.cors-errors",{"id":187,"title":33,"body":188,"category":27,"createdAt":1278,"description":1279,"draft":1280,"extension":1281,"featured":1280,"keywords":1282,"links":1287,"meta":1288,"navigation":313,"path":34,"readingTime":247,"seo":1289,"stem":35,"tags":1290,"updatedAt":1278,"__hash__":1294},"docs\u002F1.dev\u002F13.bash\u002F2.bash-rc.md",{"type":189,"value":190,"toc":1260},"minimark",[191,200,205,212,217,500,504,517,529,541,544,554,560,563,567,570,591,594,613,616,618,622,625,628,690,693,702,704,708,712,715,738,741,750,752,756,759,780,782,791,793,797,800,821,823,832,834,838,841,848,869,871,880,884,1246,1256],[192,193,194,195,199],"p",{},"This page documents the custom functions and aliases I keep in my ",[196,197,198],"code",{},".bashrc","\nfor day-to-day development.",[201,202,204],"h2",{"id":203},"change-laravel-environment","Change Laravel Environment",[192,206,207,208,211],{},"Quickly update the environment inside a Laravel project's ",[196,209,210],{},".env"," file without\nopening it in a text editor.",[213,214,216],"h3",{"id":215},"function","Function",[218,219,224],"pre",{"className":220,"code":221,"language":222,"meta":223,"style":223},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","function env() {\n    if [[ -z \"$1\" ]]; then\n        echo \"Usage: env \u003Cvalue>\"\n        return 1\n    fi\n\n    if grep -q '^APP_ENV=' .env 2>\u002Fdev\u002Fnull; then\n        sed -i \"s\u002F^APP_ENV=.*\u002FAPP_ENV=$1\u002F\" .env\n        echo \".env updated: APP_ENV=$1\"\n    elif grep -q '^ENV=' .env 2>\u002Fdev\u002Fnull; then\n        sed -i \"s\u002F^ENV=.*\u002FENV=$1\u002F\" .env\n        echo \".env updated: ENV=$1\"\n    else\n        echo \"No ENV or APP_ENV found in .env, adding ENV=$1\"\n        echo \"ENV=$1\" >> .env\n    fi\n}\n","bash","",[196,225,226,245,276,292,302,308,315,351,375,389,416,436,450,456,470,489,494],{"__ignoreMap":223},[227,228,231,234,238,242],"span",{"class":229,"line":230},"line",1,[227,232,215],{"class":233},"s5Kfy",[227,235,237],{"class":236},"sljsM"," env",[227,239,241],{"class":240},"soVBu","()",[227,243,244],{"class":240}," {\n",[227,246,248,252,255,259,263,267,270,273],{"class":229,"line":247},2,[227,249,251],{"class":250},"siDh9","    if",[227,253,254],{"class":240}," [[",[227,256,258],{"class":257},"sVsLi"," -z",[227,260,262],{"class":261},"sbYkP"," \"",[227,264,266],{"class":265},"sVyVU","$1",[227,268,269],{"class":261},"\"",[227,271,272],{"class":240}," ]];",[227,274,275],{"class":250}," then\n",[227,277,279,283,285,289],{"class":229,"line":278},3,[227,280,282],{"class":281},"sJdAF","        echo",[227,284,262],{"class":261},[227,286,288],{"class":287},"sTbE_","Usage: env \u003Cvalue>",[227,290,291],{"class":261},"\"\n",[227,293,295,298],{"class":229,"line":294},4,[227,296,297],{"class":250},"        return",[227,299,301],{"class":300},"s7CZa"," 1\n",[227,303,305],{"class":229,"line":304},5,[227,306,307],{"class":250},"    fi\n",[227,309,311],{"class":229,"line":310},6,[227,312,314],{"emptyLinePlaceholder":313},true,"\n",[227,316,318,320,324,328,331,334,337,340,343,346,349],{"class":229,"line":317},7,[227,319,251],{"class":250},[227,321,323],{"class":322},"sYn-s"," grep",[227,325,327],{"class":326},"sz9Cv"," -q",[227,329,330],{"class":261}," '",[227,332,333],{"class":287},"^APP_ENV=",[227,335,336],{"class":261},"'",[227,338,339],{"class":287}," .env",[227,341,342],{"class":257}," 2>",[227,344,345],{"class":287},"\u002Fdev\u002Fnull",[227,347,348],{"class":240},";",[227,350,275],{"class":250},[227,352,354,357,360,362,365,367,370,372],{"class":229,"line":353},8,[227,355,356],{"class":322},"        sed",[227,358,359],{"class":326}," -i",[227,361,262],{"class":261},[227,363,364],{"class":287},"s\u002F^APP_ENV=.*\u002FAPP_ENV=",[227,366,266],{"class":265},[227,368,369],{"class":287},"\u002F",[227,371,269],{"class":261},[227,373,374],{"class":287}," .env\n",[227,376,378,380,382,385,387],{"class":229,"line":377},9,[227,379,282],{"class":281},[227,381,262],{"class":261},[227,383,384],{"class":287},".env updated: APP_ENV=",[227,386,266],{"class":265},[227,388,291],{"class":261},[227,390,392,395,397,399,401,404,406,408,410,412,414],{"class":229,"line":391},10,[227,393,394],{"class":250},"    elif",[227,396,323],{"class":322},[227,398,327],{"class":326},[227,400,330],{"class":261},[227,402,403],{"class":287},"^ENV=",[227,405,336],{"class":261},[227,407,339],{"class":287},[227,409,342],{"class":257},[227,411,345],{"class":287},[227,413,348],{"class":240},[227,415,275],{"class":250},[227,417,419,421,423,425,428,430,432,434],{"class":229,"line":418},11,[227,420,356],{"class":322},[227,422,359],{"class":326},[227,424,262],{"class":261},[227,426,427],{"class":287},"s\u002F^ENV=.*\u002FENV=",[227,429,266],{"class":265},[227,431,369],{"class":287},[227,433,269],{"class":261},[227,435,374],{"class":287},[227,437,439,441,443,446,448],{"class":229,"line":438},12,[227,440,282],{"class":281},[227,442,262],{"class":261},[227,444,445],{"class":287},".env updated: ENV=",[227,447,266],{"class":265},[227,449,291],{"class":261},[227,451,453],{"class":229,"line":452},13,[227,454,455],{"class":250},"    else\n",[227,457,459,461,463,466,468],{"class":229,"line":458},14,[227,460,282],{"class":281},[227,462,262],{"class":261},[227,464,465],{"class":287},"No ENV or APP_ENV found in .env, adding ENV=",[227,467,266],{"class":265},[227,469,291],{"class":261},[227,471,473,475,477,480,482,484,487],{"class":229,"line":472},15,[227,474,282],{"class":281},[227,476,262],{"class":261},[227,478,479],{"class":287},"ENV=",[227,481,266],{"class":265},[227,483,269],{"class":261},[227,485,486],{"class":257}," >>",[227,488,374],{"class":287},[227,490,492],{"class":229,"line":491},16,[227,493,307],{"class":250},[227,495,497],{"class":229,"line":496},17,[227,498,499],{"class":240},"}\n",[213,501,503],{"id":502},"usage","Usage",[218,505,507],{"className":220,"code":506,"language":222,"meta":223,"style":223},"env local\n",[196,508,509],{"__ignoreMap":223},[227,510,511,514],{"class":229,"line":230},[227,512,513],{"class":322},"env",[227,515,516],{"class":287}," local\n",[218,518,520],{"className":220,"code":519,"language":222,"meta":223,"style":223},"env production\n",[196,521,522],{"__ignoreMap":223},[227,523,524,526],{"class":229,"line":230},[227,525,513],{"class":322},[227,527,528],{"class":287}," production\n",[218,530,532],{"className":220,"code":531,"language":222,"meta":223,"style":223},"env testing\n",[196,533,534],{"__ignoreMap":223},[227,535,536,538],{"class":229,"line":230},[227,537,513],{"class":322},[227,539,540],{"class":287}," testing\n",[192,542,543],{},"This updates:",[218,545,548],{"className":546,"code":547,"language":513,"meta":223,"style":223},"language-env shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","APP_ENV=local\n",[196,549,550],{"__ignoreMap":223},[227,551,552],{"class":229,"line":230},[227,553,547],{},[192,555,556,557,559],{},"without manually editing the ",[196,558,210],{}," file.",[561,562],"hr",{},[201,564,566],{"id":565},"homestead-directory","Homestead Directory",[192,568,569],{},"Set the location of your Laravel Homestead installation.",[218,571,573],{"className":220,"code":572,"language":222,"meta":223,"style":223},"HOMESTEAD_DIR=\"\u002Fc\u002FUsers\u002Fjoshu\u002F~\u002FHomestead\"\n",[196,574,575],{"__ignoreMap":223},[227,576,577,581,584,586,589],{"class":229,"line":230},[227,578,580],{"class":579},"sSC40","HOMESTEAD_DIR",[227,582,583],{"class":240},"=",[227,585,269],{"class":261},[227,587,588],{"class":287},"\u002Fc\u002FUsers\u002Fjoshu\u002F~\u002FHomestead",[227,590,291],{"class":261},[192,592,593],{},"Workspace directory.",[218,595,597],{"className":220,"code":596,"language":222,"meta":223,"style":223},"WORKSPACE_DIR=\"\u002Fc\u002FUsers\u002Fjoshu\u002FOneDrive\u002FDesktop\"\n",[196,598,599],{"__ignoreMap":223},[227,600,601,604,606,608,611],{"class":229,"line":230},[227,602,603],{"class":579},"WORKSPACE_DIR",[227,605,583],{"class":240},[227,607,269],{"class":261},[227,609,610],{"class":287},"\u002Fc\u002FUsers\u002Fjoshu\u002FOneDrive\u002FDesktop",[227,612,291],{"class":261},[192,614,615],{},"Update these paths if your directories are different.",[561,617],{},[201,619,621],{"id":620},"navigate-to-homestead","Navigate to Homestead",[192,623,624],{},"Instead of remembering where Homestead is installed, use a helper function.",[213,626,216],{"id":627},"function-1",[218,629,631],{"className":220,"code":630,"language":222,"meta":223,"style":223},"function hm-cd() {\n    cd \"$HOMESTEAD_DIR\" || {\n        echo \"Homestead directory not found: $HOMESTEAD_DIR\"\n        return 1\n    }\n}\n",[196,632,633,644,662,675,681,686],{"__ignoreMap":223},[227,634,635,637,640,642],{"class":229,"line":230},[227,636,215],{"class":233},[227,638,639],{"class":236}," hm-cd",[227,641,241],{"class":240},[227,643,244],{"class":240},[227,645,646,649,651,655,657,660],{"class":229,"line":247},[227,647,648],{"class":281},"    cd",[227,650,262],{"class":261},[227,652,654],{"class":653},"su_V2","$HOMESTEAD_DIR",[227,656,269],{"class":261},[227,658,659],{"class":257}," ||",[227,661,244],{"class":240},[227,663,664,666,668,671,673],{"class":229,"line":278},[227,665,282],{"class":281},[227,667,262],{"class":261},[227,669,670],{"class":287},"Homestead directory not found: ",[227,672,654],{"class":653},[227,674,291],{"class":261},[227,676,677,679],{"class":229,"line":294},[227,678,297],{"class":250},[227,680,301],{"class":300},[227,682,683],{"class":229,"line":304},[227,684,685],{"class":240},"    }\n",[227,687,688],{"class":229,"line":310},[227,689,499],{"class":240},[213,691,503],{"id":692},"usage-1",[218,694,696],{"className":220,"code":695,"language":222,"meta":223,"style":223},"hm-cd\n",[196,697,698],{"__ignoreMap":223},[227,699,700],{"class":229,"line":230},[227,701,695],{"class":322},[561,703],{},[201,705,707],{"id":706},"homestead-aliases","Homestead Aliases",[213,709,711],{"id":710},"start-homestead","Start Homestead",[192,713,714],{},"Starts the virtual machine and provisions it.",[218,716,718],{"className":220,"code":717,"language":222,"meta":223,"style":223},"alias hm-start='hm-cd && vagrant up --provision'\n",[196,719,720],{"__ignoreMap":223},[227,721,722,725,728,730,732,735],{"class":229,"line":230},[227,723,724],{"class":233},"alias",[227,726,727],{"class":579}," hm-start",[227,729,583],{"class":240},[227,731,336],{"class":261},[227,733,734],{"class":287},"hm-cd && vagrant up --provision",[227,736,737],{"class":261},"'\n",[192,739,740],{},"Usage:",[218,742,744],{"className":220,"code":743,"language":222,"meta":223,"style":223},"hm-start\n",[196,745,746],{"__ignoreMap":223},[227,747,748],{"class":229,"line":230},[227,749,743],{"class":322},[561,751],{},[213,753,755],{"id":754},"ssh-into-homestead","SSH into Homestead",[192,757,758],{},"Connect to the Homestead virtual machine.",[218,760,762],{"className":220,"code":761,"language":222,"meta":223,"style":223},"alias hm-ssh='hm-cd && vagrant ssh'\n",[196,763,764],{"__ignoreMap":223},[227,765,766,768,771,773,775,778],{"class":229,"line":230},[227,767,724],{"class":233},[227,769,770],{"class":579}," hm-ssh",[227,772,583],{"class":240},[227,774,336],{"class":261},[227,776,777],{"class":287},"hm-cd && vagrant ssh",[227,779,737],{"class":261},[192,781,740],{},[218,783,785],{"className":220,"code":784,"language":222,"meta":223,"style":223},"hm-ssh\n",[196,786,787],{"__ignoreMap":223},[227,788,789],{"class":229,"line":230},[227,790,784],{"class":322},[561,792],{},[213,794,796],{"id":795},"stop-homestead","Stop Homestead",[192,798,799],{},"Gracefully shuts down the virtual machine.",[218,801,803],{"className":220,"code":802,"language":222,"meta":223,"style":223},"alias hm-stop='hm-cd && vagrant halt'\n",[196,804,805],{"__ignoreMap":223},[227,806,807,809,812,814,816,819],{"class":229,"line":230},[227,808,724],{"class":233},[227,810,811],{"class":579}," hm-stop",[227,813,583],{"class":240},[227,815,336],{"class":261},[227,817,818],{"class":287},"hm-cd && vagrant halt",[227,820,737],{"class":261},[192,822,740],{},[218,824,826],{"className":220,"code":825,"language":222,"meta":223,"style":223},"hm-stop\n",[196,827,828],{"__ignoreMap":223},[227,829,830],{"class":229,"line":230},[227,831,825],{"class":322},[561,833],{},[213,835,837],{"id":836},"reload-homestead","Reload Homestead",[192,839,840],{},"Reloads the VM and reprovisions it.",[192,842,843,844,847],{},"Useful after changing your ",[196,845,846],{},"Homestead.yaml",".",[218,849,851],{"className":220,"code":850,"language":222,"meta":223,"style":223},"alias hm-reload='hm-cd && vagrant reload --provision'\n",[196,852,853],{"__ignoreMap":223},[227,854,855,857,860,862,864,867],{"class":229,"line":230},[227,856,724],{"class":233},[227,858,859],{"class":579}," hm-reload",[227,861,583],{"class":240},[227,863,336],{"class":261},[227,865,866],{"class":287},"hm-cd && vagrant reload --provision",[227,868,737],{"class":261},[192,870,740],{},[218,872,874],{"className":220,"code":873,"language":222,"meta":223,"style":223},"hm-reload\n",[196,875,876],{"__ignoreMap":223},[227,877,878],{"class":229,"line":230},[227,879,873],{"class":322},[201,881,883],{"id":882},"complete-configuration","Complete Configuration",[218,885,887],{"className":220,"code":886,"language":222,"meta":223,"style":223},"function env() {\n    if [[ -z \"$1\" ]]; then\n        echo \"Usage: env \u003Cvalue>\"\n        return 1\n    fi\n\n    if grep -q '^APP_ENV=' .env 2>\u002Fdev\u002Fnull; then\n        sed -i \"s\u002F^APP_ENV=.*\u002FAPP_ENV=$1\u002F\" .env\n        echo \".env updated: APP_ENV=$1\"\n    elif grep -q '^ENV=' .env 2>\u002Fdev\u002Fnull; then\n        sed -i \"s\u002F^ENV=.*\u002FENV=$1\u002F\" .env\n        echo \".env updated: ENV=$1\"\n    else\n        echo \"No ENV or APP_ENV found in .env, adding ENV=$1\"\n        echo \"ENV=$1\" >> .env\n    fi\n}\n\nHOMESTEAD_DIR=\"\u002Fc\u002FUsers\u002Fjoshu\u002F~\u002FHomestead\"\nWORKSPACE_DIR=\"\u002Fc\u002FUsers\u002Fjoshu\u002FOneDrive\u002FDesktop\"\n\nfunction hm-cd() {\n    cd \"$HOMESTEAD_DIR\" || {\n        echo \"Homestead directory not found: $HOMESTEAD_DIR\"\n        return 1\n    }\n}\n\nalias hm-start='hm-cd && vagrant up --provision'\nalias hm-ssh='hm-cd && vagrant ssh'\nalias hm-stop='hm-cd && vagrant halt'\nalias hm-reload='hm-cd && vagrant reload --provision'\n",[196,888,889,899,917,927,933,937,941,965,983,995,1019,1037,1049,1053,1065,1081,1085,1089,1094,1107,1120,1125,1136,1151,1164,1171,1176,1181,1186,1201,1216,1231],{"__ignoreMap":223},[227,890,891,893,895,897],{"class":229,"line":230},[227,892,215],{"class":233},[227,894,237],{"class":236},[227,896,241],{"class":240},[227,898,244],{"class":240},[227,900,901,903,905,907,909,911,913,915],{"class":229,"line":247},[227,902,251],{"class":250},[227,904,254],{"class":240},[227,906,258],{"class":257},[227,908,262],{"class":261},[227,910,266],{"class":265},[227,912,269],{"class":261},[227,914,272],{"class":240},[227,916,275],{"class":250},[227,918,919,921,923,925],{"class":229,"line":278},[227,920,282],{"class":281},[227,922,262],{"class":261},[227,924,288],{"class":287},[227,926,291],{"class":261},[227,928,929,931],{"class":229,"line":294},[227,930,297],{"class":250},[227,932,301],{"class":300},[227,934,935],{"class":229,"line":304},[227,936,307],{"class":250},[227,938,939],{"class":229,"line":310},[227,940,314],{"emptyLinePlaceholder":313},[227,942,943,945,947,949,951,953,955,957,959,961,963],{"class":229,"line":317},[227,944,251],{"class":250},[227,946,323],{"class":322},[227,948,327],{"class":326},[227,950,330],{"class":261},[227,952,333],{"class":287},[227,954,336],{"class":261},[227,956,339],{"class":287},[227,958,342],{"class":257},[227,960,345],{"class":287},[227,962,348],{"class":240},[227,964,275],{"class":250},[227,966,967,969,971,973,975,977,979,981],{"class":229,"line":353},[227,968,356],{"class":322},[227,970,359],{"class":326},[227,972,262],{"class":261},[227,974,364],{"class":287},[227,976,266],{"class":265},[227,978,369],{"class":287},[227,980,269],{"class":261},[227,982,374],{"class":287},[227,984,985,987,989,991,993],{"class":229,"line":377},[227,986,282],{"class":281},[227,988,262],{"class":261},[227,990,384],{"class":287},[227,992,266],{"class":265},[227,994,291],{"class":261},[227,996,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1017],{"class":229,"line":391},[227,998,394],{"class":250},[227,1000,323],{"class":322},[227,1002,327],{"class":326},[227,1004,330],{"class":261},[227,1006,403],{"class":287},[227,1008,336],{"class":261},[227,1010,339],{"class":287},[227,1012,342],{"class":257},[227,1014,345],{"class":287},[227,1016,348],{"class":240},[227,1018,275],{"class":250},[227,1020,1021,1023,1025,1027,1029,1031,1033,1035],{"class":229,"line":418},[227,1022,356],{"class":322},[227,1024,359],{"class":326},[227,1026,262],{"class":261},[227,1028,427],{"class":287},[227,1030,266],{"class":265},[227,1032,369],{"class":287},[227,1034,269],{"class":261},[227,1036,374],{"class":287},[227,1038,1039,1041,1043,1045,1047],{"class":229,"line":438},[227,1040,282],{"class":281},[227,1042,262],{"class":261},[227,1044,445],{"class":287},[227,1046,266],{"class":265},[227,1048,291],{"class":261},[227,1050,1051],{"class":229,"line":452},[227,1052,455],{"class":250},[227,1054,1055,1057,1059,1061,1063],{"class":229,"line":458},[227,1056,282],{"class":281},[227,1058,262],{"class":261},[227,1060,465],{"class":287},[227,1062,266],{"class":265},[227,1064,291],{"class":261},[227,1066,1067,1069,1071,1073,1075,1077,1079],{"class":229,"line":472},[227,1068,282],{"class":281},[227,1070,262],{"class":261},[227,1072,479],{"class":287},[227,1074,266],{"class":265},[227,1076,269],{"class":261},[227,1078,486],{"class":257},[227,1080,374],{"class":287},[227,1082,1083],{"class":229,"line":491},[227,1084,307],{"class":250},[227,1086,1087],{"class":229,"line":496},[227,1088,499],{"class":240},[227,1090,1092],{"class":229,"line":1091},18,[227,1093,314],{"emptyLinePlaceholder":313},[227,1095,1097,1099,1101,1103,1105],{"class":229,"line":1096},19,[227,1098,580],{"class":579},[227,1100,583],{"class":240},[227,1102,269],{"class":261},[227,1104,588],{"class":287},[227,1106,291],{"class":261},[227,1108,1110,1112,1114,1116,1118],{"class":229,"line":1109},20,[227,1111,603],{"class":579},[227,1113,583],{"class":240},[227,1115,269],{"class":261},[227,1117,610],{"class":287},[227,1119,291],{"class":261},[227,1121,1123],{"class":229,"line":1122},21,[227,1124,314],{"emptyLinePlaceholder":313},[227,1126,1128,1130,1132,1134],{"class":229,"line":1127},22,[227,1129,215],{"class":233},[227,1131,639],{"class":236},[227,1133,241],{"class":240},[227,1135,244],{"class":240},[227,1137,1139,1141,1143,1145,1147,1149],{"class":229,"line":1138},23,[227,1140,648],{"class":281},[227,1142,262],{"class":261},[227,1144,654],{"class":653},[227,1146,269],{"class":261},[227,1148,659],{"class":257},[227,1150,244],{"class":240},[227,1152,1154,1156,1158,1160,1162],{"class":229,"line":1153},24,[227,1155,282],{"class":281},[227,1157,262],{"class":261},[227,1159,670],{"class":287},[227,1161,654],{"class":653},[227,1163,291],{"class":261},[227,1165,1167,1169],{"class":229,"line":1166},25,[227,1168,297],{"class":250},[227,1170,301],{"class":300},[227,1172,1174],{"class":229,"line":1173},26,[227,1175,685],{"class":240},[227,1177,1179],{"class":229,"line":1178},27,[227,1180,499],{"class":240},[227,1182,1184],{"class":229,"line":1183},28,[227,1185,314],{"emptyLinePlaceholder":313},[227,1187,1189,1191,1193,1195,1197,1199],{"class":229,"line":1188},29,[227,1190,724],{"class":233},[227,1192,727],{"class":579},[227,1194,583],{"class":240},[227,1196,336],{"class":261},[227,1198,734],{"class":287},[227,1200,737],{"class":261},[227,1202,1204,1206,1208,1210,1212,1214],{"class":229,"line":1203},30,[227,1205,724],{"class":233},[227,1207,770],{"class":579},[227,1209,583],{"class":240},[227,1211,336],{"class":261},[227,1213,777],{"class":287},[227,1215,737],{"class":261},[227,1217,1219,1221,1223,1225,1227,1229],{"class":229,"line":1218},31,[227,1220,724],{"class":233},[227,1222,811],{"class":579},[227,1224,583],{"class":240},[227,1226,336],{"class":261},[227,1228,818],{"class":287},[227,1230,737],{"class":261},[227,1232,1234,1236,1238,1240,1242,1244],{"class":229,"line":1233},32,[227,1235,724],{"class":233},[227,1237,859],{"class":579},[227,1239,583],{"class":240},[227,1241,336],{"class":261},[227,1243,866],{"class":287},[227,1245,737],{"class":261},[1247,1248,1249],"tip",{},[192,1250,1251,1252,1255],{},"Small Bash functions save an absurd amount of time over hundreds of development\nsessions. Typing ",[196,1253,1254],{},"hm-start"," is much nicer than navigating to the Homestead\ndirectory and remembering the exact Vagrant command every single time. Humans\nare excellent at forgetting repetitive commands, so let the shell do the\nremembering.",[1257,1258,1259],"style",{},"html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .su_V2, html code.shiki .su_V2{--shiki-light:#90A4AE;--shiki-default:#B56959;--shiki-dark:#C98A7D}",{"title":223,"searchDepth":278,"depth":278,"links":1261},[1262,1266,1267,1271,1277],{"id":203,"depth":247,"text":204,"children":1263},[1264,1265],{"id":215,"depth":278,"text":216},{"id":502,"depth":278,"text":503},{"id":565,"depth":247,"text":566},{"id":620,"depth":247,"text":621,"children":1268},[1269,1270],{"id":627,"depth":278,"text":216},{"id":692,"depth":278,"text":503},{"id":706,"depth":247,"text":707,"children":1272},[1273,1274,1275,1276],{"id":710,"depth":278,"text":711},{"id":754,"depth":278,"text":755},{"id":795,"depth":278,"text":796},{"id":836,"depth":278,"text":837},{"id":882,"depth":247,"text":883},"2026-07-17","Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",false,"md",[1283,1284,1285,1286],"bashrc","homestead aliases","laravel bash","custom bash functions",[],{},{"title":33,"description":1279},[222,1283,1291,1292,1293],"git bash","homestead","laravel","rizzsm5in5186hIuV9yEvTddL9RRzawBtNM4l5McRGA",[1296,1298],{"title":27,"path":28,"stem":29,"description":1297,"children":-1},"Shell scripting and a faster life on the command line.",{"title":37,"path":38,"stem":39,"description":1299,"children":-1},"Writing code that other people (and future you) can read.",[1301,1307,1312,1315,1317,1319,1326,1328,1331,1338,1341,1344,1351,1355,1360,1363,1371,1375,1378,1384,1387,1391,1394,1397,1399,1405,1408,1413,1416,1422,1425,1432,1437,1440,1446],{"path":20,"title":19,"description":1302,"tags":1303,"category":13,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"The core Eloquent relationship types with examples and the N+1 trap to avoid.",[1293,1304,1305,1306],"eloquent","database","orm",{"path":24,"title":23,"description":1308,"tags":1309,"category":13,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"My quick reference for setting up and using Laravel Homestead during development.",[1293,1292,1310,1311],"vagrant","virtualbox",{"path":14,"title":13,"description":1313,"tags":1314,"category":13,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"The PHP framework for web artisans — Eloquent, routing, queues and more.",[],{"path":34,"title":33,"description":1279,"tags":1316,"category":27,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":247,"draft":1280},[222,1283,1291,1292,1293],{"path":28,"title":27,"description":1297,"tags":1318,"category":27,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},[],{"path":44,"title":43,"description":1320,"tags":1321,"category":37,"featured":313,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Practical rules for naming variables, functions and types so code reads like prose.",[1322,1323,1324,1325],"clean-code","naming","readability","craft",{"path":38,"title":37,"description":1299,"tags":1327,"category":37,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},[],{"path":48,"title":47,"description":1329,"tags":1330,"category":47,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Getting reliable, useful results out of language models.",[],{"path":60,"title":59,"description":1332,"tags":1333,"category":53,"featured":313,"updatedAt":1278,"createdAt":1278,"readingTime":247,"draft":1280},"The Git commands I actually use day to day, plus how to undo things safely.",[1334,1335,1336,1337],"git","cli","version-control","cheat-sheet",{"path":54,"title":53,"description":1339,"tags":1340,"category":53,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":1342,"tags":1343,"category":10,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Languages, frameworks and the craft of building software.",[],{"path":83,"title":82,"description":1345,"tags":1346,"category":63,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":294,"draft":1280},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[1347,1348,1349,1350],"ai","software development","prompt engineering","beginners",{"path":87,"title":86,"description":1352,"tags":1353,"category":63,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":294,"draft":1280},"Learn how to write effective AI prompts and read JavaScript code confidently. This lesson teaches students how to direct AI instead of blindly copying its output.",[1347,1354,1349,1350],"javascript",{"path":91,"title":90,"description":1356,"tags":1357,"category":63,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":278,"draft":1280},"Introduction to the fundamentals of JavaScript, from variables and functions to loops, DOM manipulation, and events. This lesson prepares students for the Mini Product Store activity.",[1354,1350,1358,1359],"programming","web development",{"path":77,"title":76,"description":1361,"tags":1362,"category":76,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Session-by-session plans with objectives, timing and materials.",[],{"path":101,"title":100,"description":1364,"tags":1365,"category":94,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":278,"draft":1280},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",[1366,1367,1354,1368,1369,1370],"teaching","activity","portfolio","dom","loops",{"path":105,"title":104,"description":1372,"tags":1373,"category":94,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":278,"draft":1280},"A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",[1366,1367,1354,1369,1374,1370],"arrays",{"path":95,"title":94,"description":1376,"tags":1377,"category":94,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"In-class activities that get students doing, not just listening.",[],{"path":115,"title":114,"description":1379,"tags":1380,"category":94,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":247,"draft":1280},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[1366,1367,1354,1381,1382,1383],"functions","if-statement","debugging",{"path":109,"title":108,"description":1385,"tags":1386,"category":108,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Practice problems that build skill through repetition.",[],{"path":125,"title":124,"description":1388,"tags":1389,"category":118,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":294,"draft":1280},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",[1347,1349,1390],"workflow",{"path":119,"title":118,"description":1392,"tags":1393,"category":118,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Prompt templates for teaching with and about AI.",[],{"path":71,"title":70,"description":1395,"tags":1396,"category":63,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Lesson plans, activities, rubrics and student references.",[],{"path":64,"title":63,"description":1395,"tags":1398,"category":63,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},[],{"path":136,"title":135,"description":1400,"tags":1401,"category":128,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Two tiny functions to control how often a handler runs — with the difference explained.",[1354,1402,1403,1404],"performance","snippets","events",{"path":129,"title":128,"description":1406,"tags":1407,"category":128,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Small, copy-ready fragments you reach for again and again.",[],{"path":147,"title":146,"description":1409,"tags":1410,"category":139,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"The essential Vim motions and commands to get productive and get out.",[1411,1412,1337,1335],"vim","editor",{"path":140,"title":139,"description":1414,"tags":1415,"category":139,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Dense, scannable references for commands and syntax.",[],{"path":158,"title":157,"description":1417,"tags":1418,"category":150,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"A reusable PR description template that makes reviews faster and kinder.",[1334,1419,1420,1421],"github","template","collaboration",{"path":151,"title":150,"description":1423,"tags":1424,"category":150,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Reusable starting points for files, configs and docs.",[],{"path":169,"title":168,"description":1426,"tags":1427,"category":161,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":247,"draft":1280},"The frontmatter and markdown conventions every note in this knowledge base follows.",[1428,1429,1430,1431],"meta","conventions","markdown","authoring",{"path":173,"title":172,"description":1433,"tags":1434,"category":161,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":247,"draft":1280},"Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",[1430,1435,1436],"mdc","reference",{"path":162,"title":161,"description":1438,"tags":1439,"category":161,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"How this knowledge base itself is built and maintained.",[],{"path":184,"title":183,"description":1441,"tags":1442,"category":176,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[1443,1444,1445,1383],"cors","http","apis",{"path":177,"title":176,"description":1447,"tags":1448,"category":176,"featured":1280,"updatedAt":1278,"createdAt":1278,"readingTime":230,"draft":1280},"Symptoms, causes and fixes for problems worth remembering.",[],1784276795747]