[{"data":1,"prerenderedAt":1662},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fdev\u002Fcsharp\u002Fcsharp-basics":229,"surround-\u002Fdev\u002Fcsharp\u002Fcsharp-basics":1460,"notes-index":1465},[4,88,171,182,192,203,218],{"title":5,"path":6,"stem":7,"children":8},"Dev","\u002Fdev","1.dev",[9,12,26,36,50,56,78],{"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,46],{"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},"Services Return, Callers Present","\u002Fdev\u002Fclean-code\u002Fservices-return-callers-present","1.dev\u002F15.clean-code\u002F2.services-return-callers-present",{"title":51,"path":52,"stem":53,"children":54},"AI Prompting","\u002Fdev\u002Fai-prompting","1.dev\u002F17.ai-prompting\u002Findex",[55],{"title":51,"path":52,"stem":53},{"title":57,"path":58,"stem":59,"children":60},"C#","\u002Fdev\u002Fcsharp","1.dev\u002F2.csharp\u002Findex",[61,62,66,70,74],{"title":57,"path":58,"stem":59},{"title":63,"path":64,"stem":65},"C# Basics","\u002Fdev\u002Fcsharp\u002Fcsharp-basics","1.dev\u002F2.csharp\u002F1.csharp-basics",{"title":67,"path":68,"stem":69},"Classes & Models","\u002Fdev\u002Fcsharp\u002Fclasses-and-models","1.dev\u002F2.csharp\u002F2.classes-and-models",{"title":71,"path":72,"stem":73},"Services & Helpers","\u002Fdev\u002Fcsharp\u002Fservices-and-helpers","1.dev\u002F2.csharp\u002F3.services-and-helpers",{"title":75,"path":76,"stem":77},"Project Structure","\u002Fdev\u002Fcsharp\u002Fproject-structure","1.dev\u002F2.csharp\u002F4.project-structure",{"title":79,"path":80,"stem":81,"children":82},"Git","\u002Fdev\u002Fgit","1.dev\u002F9.git\u002Findex",[83,84],{"title":79,"path":80,"stem":81},{"title":85,"path":86,"stem":87},"Git Cheat Sheet","\u002Fdev\u002Fgit\u002Fgit-cheat-sheet","1.dev\u002F9.git\u002F1.git-cheat-sheet",{"title":89,"path":90,"stem":91,"children":92},"Teaching","\u002Fteaching","2.teaching",[93,95],{"title":89,"path":90,"stem":94},"2.teaching\u002Findex",{"title":96,"path":97,"stem":98,"children":99},"AppsDev","\u002Fteaching\u002Fapps-dev","2.teaching\u002F1.apps-dev\u002Findex",[100,101,119,137,147,161],{"title":96,"path":97,"stem":98},{"title":102,"path":103,"stem":104,"children":105},"Lesson Plans","\u002Fteaching\u002Fapps-dev\u002Flesson-plans","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002Findex",[106,107,111,115],{"title":102,"path":103,"stem":104},{"title":108,"path":109,"stem":110},"Coding with AI","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fcoding-with-ai","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F1.coding-with-ai",{"title":112,"path":113,"stem":114},"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":116,"path":117,"stem":118},"JavaScript for Beginners","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fjavascript-for-beginners","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F3.javascript-for-beginners",{"title":120,"path":121,"stem":122,"children":123},"Activities","\u002Fteaching\u002Fapps-dev\u002Factivities","2.teaching\u002F1.apps-dev\u002F2.activities\u002Findex",[124,125,129,133],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},"Dynamic Portfolio Website","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fdynamic-portfolio-website","2.teaching\u002F1.apps-dev\u002F2.activities\u002F2.dynamic-portfolio-website",{"title":130,"path":131,"stem":132},"Mini Product Store","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fmini-product-store","2.teaching\u002F1.apps-dev\u002F2.activities\u002F3.mini-product-store",{"title":134,"path":135,"stem":136},"Semester Project","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fsemester-project","2.teaching\u002F1.apps-dev\u002F2.activities\u002F4.semester-project",{"title":138,"path":139,"stem":140,"children":141},"Exercises","\u002Fteaching\u002Fapps-dev\u002Fexercises","2.teaching\u002F1.apps-dev\u002F4.exercises\u002Findex",[142,143],{"title":138,"path":139,"stem":140},{"title":144,"path":145,"stem":146},"Read & Predict","\u002Fteaching\u002Fapps-dev\u002Fexercises\u002Fread-and-predict","2.teaching\u002F1.apps-dev\u002F4.exercises\u002F1.read-and-predict",{"title":148,"path":149,"stem":150,"children":151},"AI Prompts","\u002Fteaching\u002Fapps-dev\u002Fai-prompts","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002Findex",[152,153,157],{"title":148,"path":149,"stem":150},{"title":154,"path":155,"stem":156},"Prompt Flow","\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fbasic-prompting","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F1.basic-prompting",{"title":158,"path":159,"stem":160},"Using OpenCode CLI Instead of Copy-Pasting from ChatGPT","\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fopencode-cli","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F2.opencode-cli",{"title":162,"path":163,"stem":164,"children":165},"Cheat Sheets","\u002Fteaching\u002Fapps-dev\u002Fcheat-sheets","2.teaching\u002F1.apps-dev\u002F8.cheat-sheets\u002Findex",[166,167],{"title":162,"path":163,"stem":164},{"title":168,"path":169,"stem":170},"How to Collaborate on GitHub","\u002Fteaching\u002Fapps-dev\u002Fcheat-sheets\u002Fgithub-collaboration","2.teaching\u002F1.apps-dev\u002F8.cheat-sheets\u002F1.github-collaboration",{"title":172,"path":173,"stem":174,"children":175},"Snippets","\u002Fsnippets","3.snippets",[176,178],{"title":172,"path":173,"stem":177},"3.snippets\u002Findex",{"title":179,"path":180,"stem":181},"Debounce and Throttle","\u002Fsnippets\u002Fdebounce-and-throttle","3.snippets\u002F1.debounce-and-throttle",{"title":162,"path":183,"stem":184,"children":185},"\u002Fcheat-sheets","4.cheat-sheets",[186,188],{"title":162,"path":183,"stem":187},"4.cheat-sheets\u002Findex",{"title":189,"path":190,"stem":191},"Vim Cheat Sheet","\u002Fcheat-sheets\u002Fvim-cheat-sheet","4.cheat-sheets\u002F1.vim-cheat-sheet",{"title":193,"path":194,"stem":195,"children":196},"Templates","\u002Ftemplates","5.templates",[197,199],{"title":193,"path":194,"stem":198},"5.templates\u002Findex",{"title":200,"path":201,"stem":202},"Pull Request Template","\u002Ftemplates\u002Fpull-request-template","5.templates\u002F1.pull-request-template",{"title":204,"path":205,"stem":206,"children":207},"Meta","\u002Fmeta","6.meta",[208,210,214],{"title":204,"path":205,"stem":209},"6.meta\u002Findex",{"title":211,"path":212,"stem":213},"Authoring Guide","\u002Fmeta\u002Fauthoring-guide","6.meta\u002F1.authoring-guide",{"title":215,"path":216,"stem":217},"Markdown Showcase","\u002Fmeta\u002Fmarkdown-showcase","6.meta\u002F2.markdown-showcase",{"title":219,"path":220,"stem":221,"children":222},"Troubleshooting","\u002Ftroubleshooting","7.troubleshooting",[223,225],{"title":219,"path":220,"stem":224},"7.troubleshooting\u002Findex",{"title":226,"path":227,"stem":228},"Fixing CORS Errors","\u002Ftroubleshooting\u002Fcors-errors","7.troubleshooting\u002F1.cors-errors",{"id":230,"title":63,"body":231,"category":1442,"createdAt":1443,"description":1444,"draft":1445,"extension":1446,"featured":1445,"keywords":1447,"links":1452,"meta":1453,"navigation":712,"path":64,"readingTime":322,"seo":1454,"stem":65,"tags":1455,"updatedAt":1443,"__hash__":1459},"docs\u002F1.dev\u002F2.csharp\u002F1.csharp-basics.md",{"type":232,"value":233,"toc":1434},"minimark",[234,238,243,264,390,409,420,461,465,546,560,608,612,617,833,839,930,934,949,1114,1117,1188,1212,1216,1222,1339,1346,1419,1423,1430],[235,236,237],"p",{},"The everyday syntax you'll reach for, framed against PHP.",[239,240,242],"h2",{"id":241},"variables-types","Variables & types",[235,244,245,246,250,251,255,256,259,260,263],{},"Unlike PHP's ",[247,248,249],"code",{},"$var",", C# variables have ",[252,253,254],"strong",{},"types"," and no ",[247,257,258],{},"$",". You either name the\ntype or let the compiler infer it with ",[247,261,262],{},"var",".",[265,266,271],"pre",{"className":267,"code":268,"language":269,"meta":270,"style":270},"language-csharp shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","int age = 25;              \u002F\u002F whole number\ndouble price = 19.99;      \u002F\u002F decimal number\nstring name = \"Ada\";       \u002F\u002F text — double quotes only\nbool isActive = true;      \u002F\u002F boolean\nvar city = \"Manila\";       \u002F\u002F compiler infers `string` — same as writing `string city`\n","csharp","",[247,272,273,301,320,347,367],{"__ignoreMap":270},[274,275,278,282,286,290,294,297],"span",{"class":276,"line":277},"line",1,[274,279,281],{"class":280},"s8XtY","int",[274,283,285],{"class":284},"sYn-s"," age",[274,287,289],{"class":288},"soVBu"," =",[274,291,293],{"class":292},"s7CZa"," 25",[274,295,296],{"class":288},";",[274,298,300],{"class":299},"s9Tkl","              \u002F\u002F whole number\n",[274,302,304,307,310,312,315,317],{"class":276,"line":303},2,[274,305,306],{"class":280},"double",[274,308,309],{"class":284}," price",[274,311,289],{"class":288},[274,313,314],{"class":292}," 19.99",[274,316,296],{"class":288},[274,318,319],{"class":299},"      \u002F\u002F decimal number\n",[274,321,323,326,329,331,335,339,342,344],{"class":276,"line":322},3,[274,324,325],{"class":280},"string",[274,327,328],{"class":284}," name",[274,330,289],{"class":288},[274,332,334],{"class":333},"sbYkP"," \"",[274,336,338],{"class":337},"sTbE_","Ada",[274,340,341],{"class":333},"\"",[274,343,296],{"class":288},[274,345,346],{"class":299},"       \u002F\u002F text — double quotes only\n",[274,348,350,353,356,358,362,364],{"class":276,"line":349},4,[274,351,352],{"class":280},"bool",[274,354,355],{"class":284}," isActive",[274,357,289],{"class":288},[274,359,361],{"class":360},"sq3J1"," true",[274,363,296],{"class":288},[274,365,366],{"class":299},"      \u002F\u002F boolean\n",[274,368,370,373,376,378,380,383,385,387],{"class":276,"line":369},5,[274,371,262],{"class":372},"s23sZ",[274,374,375],{"class":284}," city",[274,377,289],{"class":288},[274,379,334],{"class":333},[274,381,382],{"class":337},"Manila",[274,384,341],{"class":333},[274,386,296],{"class":288},[274,388,389],{"class":299},"       \u002F\u002F compiler infers `string` — same as writing `string city`\n",[391,392,393],"note",{},[235,394,395,397,398,401,402,405,406,408],{},[247,396,262],{}," is inference, ",[252,399,400],{},"not"," PHP's dynamic typing. ",[247,403,404],{},"var city = \"Manila\""," is\npermanently a ",[247,407,325],{}," — you can't later assign a number to it. It's a shortcut\nfor the type, not an escape from types.",[235,410,411,412,415,416,419],{},"A type followed by ",[247,413,414],{},"?"," means the value is allowed to be ",[247,417,418],{},"null",":",[265,421,423],{"className":267,"code":422,"language":269,"meta":270,"style":270},"string? middleName = null;  \u002F\u002F nullable — this is fine\nstring lastName = null;     \u002F\u002F warning: not marked nullable\n",[247,424,425,445],{"__ignoreMap":270},[274,426,427,429,431,434,436,440,442],{"class":276,"line":277},[274,428,325],{"class":280},[274,430,414],{"class":288},[274,432,433],{"class":284}," middleName",[274,435,289],{"class":288},[274,437,439],{"class":438},"sVsLi"," null",[274,441,296],{"class":288},[274,443,444],{"class":299},"  \u002F\u002F nullable — this is fine\n",[274,446,447,449,452,454,456,458],{"class":276,"line":303},[274,448,325],{"class":280},[274,450,451],{"class":284}," lastName",[274,453,289],{"class":288},[274,455,439],{"class":438},[274,457,296],{"class":288},[274,459,460],{"class":299},"     \u002F\u002F warning: not marked nullable\n",[239,462,464],{"id":463},"output-input-console-apps","Output & input (console apps)",[265,466,468],{"className":267,"code":467,"language":269,"meta":270,"style":270},"Console.WriteLine(\"Hello\");        \u002F\u002F print + newline  (like echo + \"\\n\")\nConsole.Write(\"No newline\");       \u002F\u002F print, no newline\nstring? input = Console.ReadLine(); \u002F\u002F read a line of input from the user\n",[247,469,470,498,521],{"__ignoreMap":270},[274,471,472,476,478,482,485,487,490,492,495],{"class":276,"line":277},[274,473,475],{"class":474},"sSC40","Console",[274,477,263],{"class":288},[274,479,481],{"class":480},"sljsM","WriteLine",[274,483,484],{"class":288},"(",[274,486,341],{"class":333},[274,488,489],{"class":337},"Hello",[274,491,341],{"class":333},[274,493,494],{"class":288},");",[274,496,497],{"class":299},"        \u002F\u002F print + newline  (like echo + \"\\n\")\n",[274,499,500,502,504,507,509,511,514,516,518],{"class":276,"line":303},[274,501,475],{"class":474},[274,503,263],{"class":288},[274,505,506],{"class":480},"Write",[274,508,484],{"class":288},[274,510,341],{"class":333},[274,512,513],{"class":337},"No newline",[274,515,341],{"class":333},[274,517,494],{"class":288},[274,519,520],{"class":299},"       \u002F\u002F print, no newline\n",[274,522,523,525,527,530,532,535,537,540,543],{"class":276,"line":322},[274,524,325],{"class":280},[274,526,414],{"class":288},[274,528,529],{"class":284}," input",[274,531,289],{"class":288},[274,533,534],{"class":474}," Console",[274,536,263],{"class":288},[274,538,539],{"class":480},"ReadLine",[274,541,542],{"class":288},"();",[274,544,545],{"class":299}," \u002F\u002F read a line of input from the user\n",[235,547,548,549,552,553,556,557,419],{},"String interpolation uses ",[247,550,551],{},"$\"...\""," with ",[247,554,555],{},"{}"," — same idea as PHP's ",[247,558,559],{},"\"{$var}\"",[265,561,563],{"className":267,"code":562,"language":269,"meta":270,"style":270},"Console.WriteLine($\"Welcome, {name}! You are {age}.\");\n",[247,564,565],{"__ignoreMap":270},[274,566,567,569,571,573,575,578,581,584,588,591,594,596,599,601,603,605],{"class":276,"line":277},[274,568,475],{"class":474},[274,570,263],{"class":288},[274,572,481],{"class":480},[274,574,484],{"class":288},[274,576,577],{"class":333},"$\"",[274,579,580],{"class":337},"Welcome, ",[274,582,583],{"class":288},"{",[274,585,587],{"class":586},"su_V2","name",[274,589,590],{"class":288},"}",[274,592,593],{"class":337},"! You are ",[274,595,583],{"class":288},[274,597,598],{"class":586},"age",[274,600,590],{"class":288},[274,602,263],{"class":337},[274,604,341],{"class":333},[274,606,607],{"class":288},");\n",[239,609,611],{"id":610},"control-flow","Control flow",[235,613,614,615,419],{},"Almost identical to PHP, minus the ",[247,616,258],{},[265,618,620],{"className":267,"code":619,"language":269,"meta":270,"style":270},"if (age >= 18)\n{\n    Console.WriteLine(\"Adult\");\n}\nelse\n{\n    Console.WriteLine(\"Minor\");\n}\n\nforeach (var item in items)   \u002F\u002F like foreach ($items as $item)\n{\n    Console.WriteLine(item);\n}\n\nfor (int i = 0; i \u003C 5; i++)\n{\n    Console.WriteLine(i);\n}\n",[247,621,622,642,647,667,672,677,682,702,707,714,739,744,760,765,770,807,812,828],{"__ignoreMap":270},[274,623,624,628,631,633,636,639],{"class":276,"line":277},[274,625,627],{"class":626},"siDh9","if",[274,629,630],{"class":288}," (",[274,632,598],{"class":474},[274,634,635],{"class":288}," >=",[274,637,638],{"class":292}," 18",[274,640,641],{"class":288},")\n",[274,643,644],{"class":276,"line":303},[274,645,646],{"class":288},"{\n",[274,648,649,652,654,656,658,660,663,665],{"class":276,"line":322},[274,650,651],{"class":474},"    Console",[274,653,263],{"class":288},[274,655,481],{"class":480},[274,657,484],{"class":288},[274,659,341],{"class":333},[274,661,662],{"class":337},"Adult",[274,664,341],{"class":333},[274,666,607],{"class":288},[274,668,669],{"class":276,"line":349},[274,670,671],{"class":288},"}\n",[274,673,674],{"class":276,"line":369},[274,675,676],{"class":626},"else\n",[274,678,680],{"class":276,"line":679},6,[274,681,646],{"class":288},[274,683,685,687,689,691,693,695,698,700],{"class":276,"line":684},7,[274,686,651],{"class":474},[274,688,263],{"class":288},[274,690,481],{"class":480},[274,692,484],{"class":288},[274,694,341],{"class":333},[274,696,697],{"class":337},"Minor",[274,699,341],{"class":333},[274,701,607],{"class":288},[274,703,705],{"class":276,"line":704},8,[274,706,671],{"class":288},[274,708,710],{"class":276,"line":709},9,[274,711,713],{"emptyLinePlaceholder":712},true,"\n",[274,715,717,720,722,724,727,730,733,736],{"class":276,"line":716},10,[274,718,719],{"class":626},"foreach",[274,721,630],{"class":288},[274,723,262],{"class":372},[274,725,726],{"class":284}," item",[274,728,729],{"class":626}," in",[274,731,732],{"class":474}," items",[274,734,735],{"class":288},")",[274,737,738],{"class":299},"   \u002F\u002F like foreach ($items as $item)\n",[274,740,742],{"class":276,"line":741},11,[274,743,646],{"class":288},[274,745,747,749,751,753,755,758],{"class":276,"line":746},12,[274,748,651],{"class":474},[274,750,263],{"class":288},[274,752,481],{"class":480},[274,754,484],{"class":288},[274,756,757],{"class":474},"item",[274,759,607],{"class":288},[274,761,763],{"class":276,"line":762},13,[274,764,671],{"class":288},[274,766,768],{"class":276,"line":767},14,[274,769,713],{"emptyLinePlaceholder":712},[274,771,773,776,778,780,783,785,788,790,792,795,798,800,802,805],{"class":276,"line":772},15,[274,774,775],{"class":626},"for",[274,777,630],{"class":288},[274,779,281],{"class":280},[274,781,782],{"class":284}," i",[274,784,289],{"class":288},[274,786,787],{"class":292}," 0",[274,789,296],{"class":288},[274,791,782],{"class":474},[274,793,794],{"class":288}," \u003C",[274,796,797],{"class":292}," 5",[274,799,296],{"class":288},[274,801,782],{"class":474},[274,803,804],{"class":438},"++",[274,806,641],{"class":288},[274,808,810],{"class":276,"line":809},16,[274,811,646],{"class":288},[274,813,815,817,819,821,823,826],{"class":276,"line":814},17,[274,816,651],{"class":474},[274,818,263],{"class":288},[274,820,481],{"class":480},[274,822,484],{"class":288},[274,824,825],{"class":474},"i",[274,827,607],{"class":288},[274,829,831],{"class":276,"line":830},18,[274,832,671],{"class":288},[235,834,835,838],{},[247,836,837],{},"switch"," has a modern expression form worth knowing:",[265,840,842],{"className":267,"code":841,"language":269,"meta":270,"style":270},"string label = status switch\n{\n    \"A\" => \"Active\",\n    \"I\" => \"Inactive\",\n    _   => \"Unknown\"   \u002F\u002F _ is the default case\n};\n",[247,843,844,859,863,886,906,925],{"__ignoreMap":270},[274,845,846,848,851,853,856],{"class":276,"line":277},[274,847,325],{"class":280},[274,849,850],{"class":284}," label",[274,852,289],{"class":288},[274,854,855],{"class":474}," status",[274,857,858],{"class":626}," switch\n",[274,860,861],{"class":276,"line":303},[274,862,646],{"class":288},[274,864,865,868,871,873,876,878,881,883],{"class":276,"line":322},[274,866,867],{"class":333},"    \"",[274,869,870],{"class":337},"A",[274,872,341],{"class":333},[274,874,875],{"class":438}," =>",[274,877,334],{"class":333},[274,879,880],{"class":337},"Active",[274,882,341],{"class":333},[274,884,885],{"class":288},",\n",[274,887,888,890,893,895,897,899,902,904],{"class":276,"line":349},[274,889,867],{"class":333},[274,891,892],{"class":337},"I",[274,894,341],{"class":333},[274,896,875],{"class":438},[274,898,334],{"class":333},[274,900,901],{"class":337},"Inactive",[274,903,341],{"class":333},[274,905,885],{"class":288},[274,907,908,912,915,917,920,922],{"class":276,"line":369},[274,909,911],{"class":910},"se3Ec","    _",[274,913,914],{"class":438},"   =>",[274,916,334],{"class":333},[274,918,919],{"class":337},"Unknown",[274,921,341],{"class":333},[274,923,924],{"class":299},"   \u002F\u002F _ is the default case\n",[274,926,927],{"class":276,"line":679},[274,928,929],{"class":288},"};\n",[239,931,933],{"id":932},"functions-methods","Functions (methods)",[235,935,936,937,940,941,944,945,948],{},"In C# a function is called a ",[252,938,939],{},"method",", and it always lives inside a class. The\nbig difference from PHP: you declare the ",[252,942,943],{},"return type"," before the name (or\n",[247,946,947],{},"void"," if it returns nothing), and each parameter has a type.",[265,950,952],{"className":267,"code":951,"language":269,"meta":270,"style":270},"\u002F\u002F void = returns nothing (like a PHP function with no return)\nvoid Greet(string name)\n{\n    Console.WriteLine($\"Hi, {name}\");\n}\n\n\u002F\u002F returns an int\nint Add(int a, int b)\n{\n    return a + b;\n}\n\n\u002F\u002F call them\nGreet(\"Ada\");\nint total = Add(2, 3);   \u002F\u002F 5\n",[247,953,954,959,974,978,1003,1007,1011,1016,1041,1045,1060,1064,1068,1073,1088],{"__ignoreMap":270},[274,955,956],{"class":276,"line":277},[274,957,958],{"class":299},"\u002F\u002F void = returns nothing (like a PHP function with no return)\n",[274,960,961,963,966,968,970,972],{"class":276,"line":303},[274,962,947],{"class":280},[274,964,965],{"class":480}," Greet",[274,967,484],{"class":288},[274,969,325],{"class":280},[274,971,328],{"class":284},[274,973,641],{"class":288},[274,975,976],{"class":276,"line":322},[274,977,646],{"class":288},[274,979,980,982,984,986,988,990,993,995,997,999,1001],{"class":276,"line":349},[274,981,651],{"class":474},[274,983,263],{"class":288},[274,985,481],{"class":480},[274,987,484],{"class":288},[274,989,577],{"class":333},[274,991,992],{"class":337},"Hi, ",[274,994,583],{"class":288},[274,996,587],{"class":586},[274,998,590],{"class":288},[274,1000,341],{"class":333},[274,1002,607],{"class":288},[274,1004,1005],{"class":276,"line":369},[274,1006,671],{"class":288},[274,1008,1009],{"class":276,"line":679},[274,1010,713],{"emptyLinePlaceholder":712},[274,1012,1013],{"class":276,"line":684},[274,1014,1015],{"class":299},"\u002F\u002F returns an int\n",[274,1017,1018,1020,1023,1025,1027,1030,1033,1036,1039],{"class":276,"line":704},[274,1019,281],{"class":280},[274,1021,1022],{"class":480}," Add",[274,1024,484],{"class":288},[274,1026,281],{"class":280},[274,1028,1029],{"class":284}," a",[274,1031,1032],{"class":288},",",[274,1034,1035],{"class":280}," int",[274,1037,1038],{"class":284}," b",[274,1040,641],{"class":288},[274,1042,1043],{"class":276,"line":709},[274,1044,646],{"class":288},[274,1046,1047,1050,1052,1055,1057],{"class":276,"line":716},[274,1048,1049],{"class":626},"    return",[274,1051,1029],{"class":474},[274,1053,1054],{"class":438}," +",[274,1056,1038],{"class":474},[274,1058,1059],{"class":288},";\n",[274,1061,1062],{"class":276,"line":741},[274,1063,671],{"class":288},[274,1065,1066],{"class":276,"line":746},[274,1067,713],{"emptyLinePlaceholder":712},[274,1069,1070],{"class":276,"line":762},[274,1071,1072],{"class":299},"\u002F\u002F call them\n",[274,1074,1075,1078,1080,1082,1084,1086],{"class":276,"line":767},[274,1076,1077],{"class":480},"Greet",[274,1079,484],{"class":288},[274,1081,341],{"class":333},[274,1083,338],{"class":337},[274,1085,341],{"class":333},[274,1087,607],{"class":288},[274,1089,1090,1092,1095,1097,1099,1101,1104,1106,1109,1111],{"class":276,"line":772},[274,1091,281],{"class":280},[274,1093,1094],{"class":284}," total",[274,1096,289],{"class":288},[274,1098,1022],{"class":480},[274,1100,484],{"class":288},[274,1102,1103],{"class":292},"2",[274,1105,1032],{"class":288},[274,1107,1108],{"class":292}," 3",[274,1110,494],{"class":288},[274,1112,1113],{"class":299},"   \u002F\u002F 5\n",[235,1115,1116],{},"Comparison at a glance:",[1118,1119,1120,1132],"table",{},[1121,1122,1123],"thead",{},[1124,1125,1126,1130],"tr",{},[1127,1128,1129],"th",{},"PHP",[1127,1131,57],{},[1133,1134,1135,1148,1164,1176],"tbody",{},[1124,1136,1137,1143],{},[1138,1139,1140],"td",{},[247,1141,1142],{},"function add($a, $b) { return $a + $b; }",[1138,1144,1145],{},[247,1146,1147],{},"int Add(int a, int b) { return a + b; }",[1124,1149,1150,1155],{},[1138,1151,1152],{},[247,1153,1154],{},"$x = \"text\";",[1138,1156,1157,1160,1161],{},[247,1158,1159],{},"string x = \"text\";"," or ",[247,1162,1163],{},"var x = \"text\";",[1124,1165,1166,1171],{},[1138,1167,1168],{},[247,1169,1170],{},"echo \"hi\";",[1138,1172,1173],{},[247,1174,1175],{},"Console.WriteLine(\"hi\");",[1124,1177,1178,1181],{},[1138,1179,1180],{},"no return type",[1138,1182,1183,1184,1187],{},"return type is ",[252,1185,1186],{},"required"," before the name",[1189,1190,1191],"tip",{},[235,1192,1193,1194,1197,1198,1201,1202,1205,1206,1209,1210,263],{},"Method names in C# are ",[252,1195,1196],{},"PascalCase"," by convention (",[247,1199,1200],{},"GetUser",", ",[247,1203,1204],{},"Login","), not\n",[247,1207,1208],{},"camelCase"," like PHP methods. Local variables and parameters stay ",[247,1211,1208],{},[239,1213,1215],{"id":1214},"collections-quick-look","Collections quick look",[235,1217,1218,1219,419],{},"PHP arrays split into a few typed things in C#. The one you'll use most is ",[247,1220,1221],{},"List\u003CT>",[265,1223,1225],{"className":267,"code":1224,"language":269,"meta":270,"style":270},"var names = new List\u003Cstring> { \"Ada\", \"Alan\" };\nnames.Add(\"Grace\");\nConsole.WriteLine(names.Count);      \u002F\u002F 3\nConsole.WriteLine(names[0]);         \u002F\u002F \"Ada\"\n",[247,1226,1227,1272,1293,1315],{"__ignoreMap":270},[274,1228,1229,1231,1234,1236,1239,1243,1246,1248,1251,1254,1256,1258,1260,1262,1264,1267,1269],{"class":276,"line":277},[274,1230,262],{"class":372},[274,1232,1233],{"class":284}," names",[274,1235,289],{"class":288},[274,1237,1238],{"class":438}," new",[274,1240,1242],{"class":1241},"sD-vU"," List",[274,1244,1245],{"class":288},"\u003C",[274,1247,325],{"class":280},[274,1249,1250],{"class":288},">",[274,1252,1253],{"class":288}," {",[274,1255,334],{"class":333},[274,1257,338],{"class":337},[274,1259,341],{"class":333},[274,1261,1032],{"class":288},[274,1263,334],{"class":333},[274,1265,1266],{"class":337},"Alan",[274,1268,341],{"class":333},[274,1270,1271],{"class":288}," };\n",[274,1273,1274,1277,1279,1282,1284,1286,1289,1291],{"class":276,"line":303},[274,1275,1276],{"class":474},"names",[274,1278,263],{"class":288},[274,1280,1281],{"class":480},"Add",[274,1283,484],{"class":288},[274,1285,341],{"class":333},[274,1287,1288],{"class":337},"Grace",[274,1290,341],{"class":333},[274,1292,607],{"class":288},[274,1294,1295,1297,1299,1301,1303,1305,1307,1310,1312],{"class":276,"line":322},[274,1296,475],{"class":474},[274,1298,263],{"class":288},[274,1300,481],{"class":480},[274,1302,484],{"class":288},[274,1304,1276],{"class":474},[274,1306,263],{"class":288},[274,1308,1309],{"class":474},"Count",[274,1311,494],{"class":288},[274,1313,1314],{"class":299},"      \u002F\u002F 3\n",[274,1316,1317,1319,1321,1323,1325,1327,1330,1333,1336],{"class":276,"line":349},[274,1318,475],{"class":474},[274,1320,263],{"class":288},[274,1322,481],{"class":480},[274,1324,484],{"class":288},[274,1326,1276],{"class":474},[274,1328,1329],{"class":288},"[",[274,1331,1332],{"class":292},"0",[274,1334,1335],{"class":288},"]);",[274,1337,1338],{"class":299},"         \u002F\u002F \"Ada\"\n",[235,1340,1341,1342,1345],{},"Filtering and mapping is done with ",[252,1343,1344],{},"LINQ"," — this is your Eloquent Collections\nequivalent, and it's worth its own note once you're comfortable with the basics.",[265,1347,1349],{"className":267,"code":1348,"language":269,"meta":270,"style":270},"using System.Linq;\n\nvar adults = users.Where(u => u.Age >= 18).ToList();   \u002F\u002F like ->filter()\n",[247,1350,1351,1368,1372],{"__ignoreMap":270},[274,1352,1353,1357,1361,1363,1366],{"class":276,"line":277},[274,1354,1356],{"class":1355},"scgAs","using",[274,1358,1360],{"class":1359},"sbc-P"," System",[274,1362,263],{"class":288},[274,1364,1365],{"class":1359},"Linq",[274,1367,1059],{"class":288},[274,1369,1370],{"class":276,"line":303},[274,1371,713],{"emptyLinePlaceholder":712},[274,1373,1374,1376,1379,1381,1384,1386,1389,1391,1394,1396,1399,1401,1404,1406,1408,1411,1414,1416],{"class":276,"line":322},[274,1375,262],{"class":372},[274,1377,1378],{"class":284}," adults",[274,1380,289],{"class":288},[274,1382,1383],{"class":474}," users",[274,1385,263],{"class":288},[274,1387,1388],{"class":480},"Where",[274,1390,484],{"class":288},[274,1392,1393],{"class":284},"u",[274,1395,875],{"class":438},[274,1397,1398],{"class":474}," u",[274,1400,263],{"class":288},[274,1402,1403],{"class":474},"Age",[274,1405,635],{"class":288},[274,1407,638],{"class":292},[274,1409,1410],{"class":288},").",[274,1412,1413],{"class":480},"ToList",[274,1415,542],{"class":288},[274,1417,1418],{"class":299},"   \u002F\u002F like ->filter()\n",[239,1420,1422],{"id":1421},"next","Next",[235,1424,1425,1426,263],{},"Now that you can write methods, put them on your own types → ",[1427,1428,1429],"a",{"href":68},"Classes & models",[1431,1432,1433],"style",{},"html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--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 .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sq3J1, html code.shiki .sq3J1{--shiki-light:#FF5370;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s23sZ, html code.shiki .s23sZ{--shiki-light:#E2931D;--shiki-default:#AB5959;--shiki-dark:#CB7676}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 .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .su_V2, html code.shiki .su_V2{--shiki-light:#90A4AE;--shiki-default:#B56959;--shiki-dark:#C98A7D}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 .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .scgAs, html code.shiki .scgAs{--shiki-light:#F76D47;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sbc-P, html code.shiki .sbc-P{--shiki-light:#90A4AE;--shiki-default:#2E8F82;--shiki-dark:#5DA994}",{"title":270,"searchDepth":322,"depth":322,"links":1435},[1436,1437,1438,1439,1440,1441],{"id":241,"depth":303,"text":242},{"id":463,"depth":303,"text":464},{"id":610,"depth":303,"text":611},{"id":932,"depth":303,"text":933},{"id":1214,"depth":303,"text":1215},{"id":1421,"depth":303,"text":1422},null,"2026-07-19","Types, variables, control flow and how to write a function (method) in C#, mapped from PHP.",false,"md",[1448,1449,1450,1451,262,325,281,352],"c# variables","c# types","c# method","c# function",[],{},{"title":63,"description":1444},[269,1456,1457,1458],"dotnet","basics","functions","VR2jBRWzXRdNkosOo_fUwQpbsEFZkCoqV21jqpnqLsA",[1461,1463],{"title":57,"path":58,"stem":59,"description":1462,"children":-1},"Learning C# and .NET from a Laravel\u002FPHP background — the fundamentals, mapped to what you already know.",{"title":67,"path":68,"stem":69,"description":1464,"children":-1},"Create a class, give it properties and a constructor, and use it — the C# version of a Laravel model.",[1466,1476,1483,1486,1494,1501,1503,1507,1510,1513,1515,1523,1529,1532,1538,1541,1547,1550,1553,1558,1561,1564,1570,1574,1579,1582,1588,1592,1595,1600,1603,1606,1609,1612,1614,1620,1623,1628,1631,1635,1638,1645,1650,1653,1659],{"path":135,"title":134,"description":1467,"tags":1468,"category":120,"featured":1445,"updatedAt":1475,"createdAt":1475,"readingTime":746,"draft":1445},"Teams of four build one frontend application over the whole semester using AI, in a single shared GitHub repository where everyone contributes.",[1469,1470,1471,1472,1473,1474],"teaching","activity","capstone","github","ai","frontend","2026-08-01",{"path":169,"title":168,"description":1477,"tags":1478,"category":162,"featured":1445,"updatedAt":1475,"createdAt":1475,"readingTime":349,"draft":1445},"Create one repository, push your project, and add your teammates as collaborators so the whole team can work on the same code.",[1472,1479,1480,1481,1482],"git","collaboration","teamwork","setup",{"path":163,"title":162,"description":1484,"tags":1485,"category":162,"featured":1445,"updatedAt":1475,"createdAt":1475,"readingTime":277,"draft":1445},"Step-by-step references students can follow on their own during class.",[],{"path":159,"title":158,"description":1487,"tags":1488,"category":148,"featured":1445,"updatedAt":1493,"createdAt":1493,"readingTime":322,"draft":1445},"Install and configure the OpenCode CLI so AI writes code directly into your project folder instead of you copying it from a chat window.",[1473,1489,1490,1491,1492],"opencode","cli","tooling","workflow","2026-07-25",{"path":48,"title":47,"description":1495,"tags":1496,"category":37,"featured":1445,"updatedAt":1443,"createdAt":1443,"readingTime":303,"draft":1445},"A service should return a result and let the caller decide how to show it — the single most useful separation-of-concerns rule.",[1497,1498,1499,1500],"clean-code","architecture","separation-of-concerns","services",{"path":64,"title":63,"description":1444,"tags":1502,"category":1442,"featured":1445,"updatedAt":1443,"createdAt":1443,"readingTime":322,"draft":1445},[269,1456,1457,1458],{"path":68,"title":67,"description":1464,"tags":1504,"category":1442,"featured":1445,"updatedAt":1443,"createdAt":1443,"readingTime":322,"draft":1445},[269,1456,1505,1506],"classes","models",{"path":72,"title":71,"description":1508,"tags":1509,"category":1442,"featured":1445,"updatedAt":1443,"createdAt":1443,"readingTime":322,"draft":1445},"Put code in another file — a service or a static helper — and call it from anywhere, the C# way.",[269,1456,1500,1498],{"path":76,"title":75,"description":1511,"tags":1512,"category":1442,"featured":1445,"updatedAt":1443,"createdAt":1443,"readingTime":322,"draft":1445},"How C# files, namespaces, folders and the dotnet CLI fit together into a running app.",[269,1456,1491,1498],{"path":58,"title":57,"description":1462,"tags":1514,"category":1442,"featured":1445,"updatedAt":1443,"createdAt":1443,"readingTime":277,"draft":1445},[269,1456,1457],{"path":20,"title":19,"description":1516,"tags":1517,"category":13,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"The core Eloquent relationship types with examples and the N+1 trap to avoid.",[1518,1519,1520,1521],"laravel","eloquent","database","orm","2026-07-17",{"path":24,"title":23,"description":1524,"tags":1525,"category":13,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"My quick reference for setting up and using Laravel Homestead during development.",[1518,1526,1527,1528],"homestead","vagrant","virtualbox",{"path":14,"title":13,"description":1530,"tags":1531,"category":13,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"The PHP framework for web artisans — Eloquent, routing, queues and more.",[],{"path":34,"title":33,"description":1533,"tags":1534,"category":27,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":303,"draft":1445},"Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",[1535,1536,1537,1526,1518],"bash","bashrc","git bash",{"path":28,"title":27,"description":1539,"tags":1540,"category":27,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Shell scripting and a faster life on the command line.",[],{"path":44,"title":43,"description":1542,"tags":1543,"category":37,"featured":712,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Practical rules for naming variables, functions and types so code reads like prose.",[1497,1544,1545,1546],"naming","readability","craft",{"path":38,"title":37,"description":1548,"tags":1549,"category":37,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Writing code that other people (and future you) can read.",[],{"path":52,"title":51,"description":1551,"tags":1552,"category":51,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Getting reliable, useful results out of language models.",[],{"path":86,"title":85,"description":1554,"tags":1555,"category":79,"featured":712,"updatedAt":1522,"createdAt":1522,"readingTime":303,"draft":1445},"The Git commands I actually use day to day, plus how to undo things safely.",[1479,1490,1556,1557],"version-control","cheat-sheet",{"path":80,"title":79,"description":1559,"tags":1560,"category":79,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":1562,"tags":1563,"category":10,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Languages, frameworks and the craft of building software.",[],{"path":109,"title":108,"description":1565,"tags":1566,"category":89,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":349,"draft":1445},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[1473,1567,1568,1569],"software development","prompt engineering","beginners",{"path":113,"title":112,"description":1571,"tags":1572,"category":89,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":349,"draft":1445},"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.",[1473,1573,1568,1569],"javascript",{"path":117,"title":116,"description":1575,"tags":1576,"category":89,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":322,"draft":1445},"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.",[1573,1569,1577,1578],"programming","web development",{"path":103,"title":102,"description":1580,"tags":1581,"category":102,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Session-by-session plans with objectives, timing and materials.",[],{"path":127,"title":126,"description":1583,"tags":1584,"category":120,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":322,"draft":1445},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",[1469,1470,1573,1585,1586,1587],"portfolio","dom","loops",{"path":131,"title":130,"description":1589,"tags":1590,"category":120,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":322,"draft":1445},"A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",[1469,1470,1573,1586,1591,1587],"arrays",{"path":121,"title":120,"description":1593,"tags":1594,"category":120,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"In-class activities that get students doing, not just listening.",[],{"path":145,"title":144,"description":1596,"tags":1597,"category":120,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":303,"draft":1445},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[1469,1470,1573,1458,1598,1599],"if-statement","debugging",{"path":139,"title":138,"description":1601,"tags":1602,"category":138,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Practice problems that build skill through repetition.",[],{"path":155,"title":154,"description":1604,"tags":1605,"category":148,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":349,"draft":1445},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",[1473,1568,1492],{"path":149,"title":148,"description":1607,"tags":1608,"category":148,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Prompt templates for teaching with and about AI.",[],{"path":97,"title":96,"description":1610,"tags":1611,"category":89,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Lesson plans, activities, rubrics and student references.",[],{"path":90,"title":89,"description":1610,"tags":1613,"category":89,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},[],{"path":180,"title":179,"description":1615,"tags":1616,"category":172,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Two tiny functions to control how often a handler runs — with the difference explained.",[1573,1617,1618,1619],"performance","snippets","events",{"path":173,"title":172,"description":1621,"tags":1622,"category":172,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Small, copy-ready fragments you reach for again and again.",[],{"path":190,"title":189,"description":1624,"tags":1625,"category":162,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"The essential Vim motions and commands to get productive and get out.",[1626,1627,1557,1490],"vim","editor",{"path":183,"title":162,"description":1629,"tags":1630,"category":162,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Dense, scannable references for commands and syntax.",[],{"path":201,"title":200,"description":1632,"tags":1633,"category":193,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"A reusable PR description template that makes reviews faster and kinder.",[1479,1472,1634,1480],"template",{"path":194,"title":193,"description":1636,"tags":1637,"category":193,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Reusable starting points for files, configs and docs.",[],{"path":212,"title":211,"description":1639,"tags":1640,"category":204,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":303,"draft":1445},"The frontmatter and markdown conventions every note in this knowledge base follows.",[1641,1642,1643,1644],"meta","conventions","markdown","authoring",{"path":216,"title":215,"description":1646,"tags":1647,"category":204,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":303,"draft":1445},"Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",[1643,1648,1649],"mdc","reference",{"path":205,"title":204,"description":1651,"tags":1652,"category":204,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"How this knowledge base itself is built and maintained.",[],{"path":227,"title":226,"description":1654,"tags":1655,"category":219,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[1656,1657,1658,1599],"cors","http","apis",{"path":220,"title":219,"description":1660,"tags":1661,"category":219,"featured":1445,"updatedAt":1522,"createdAt":1522,"readingTime":277,"draft":1445},"Symptoms, causes and fixes for problems worth remembering.",[],1785598840935]