[{"data":1,"prerenderedAt":11657},["ShallowReactive",2],{"navigation_docs":3,"-client-server-architecture-client-server-architecture-and-go":3728,"-client-server-architecture-client-server-architecture-and-go-surround":11652},[4,1707,1912,2366,2547,2673,2880,3002,3052,3109,3143,3269,3346,3360,3495,3512,3525,3671,3724],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"C#","i-devicon-csharp","\u002Fcsharp","01.csharp",[10,13,60,90,120,202,219,253,379,404,457,650,1364,1654,1703],{"title":11,"path":7,"stem":12},"C# та .NET","01.csharp\u002Findex",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":59},"Fundamentals","i-lucide-book-open","\u002Fcsharp\u002Ffundamentals","01.csharp\u002F01.fundamentals",[19,23,27,31,35,39,43,47,51,55],{"title":20,"path":21,"stem":22},"Вступ до екосистеми .NET","\u002Fcsharp\u002Ffundamentals\u002Fintroduction-to-ecosystem","01.csharp\u002F01.fundamentals\u002F01.introduction-to-ecosystem",{"title":24,"path":25,"stem":26},"Структура програми на C#","\u002Fcsharp\u002Ffundamentals\u002Fprogram-structure","01.csharp\u002F01.fundamentals\u002F02.program-structure",{"title":28,"path":29,"stem":30},"Змінні та Типи Даних","\u002Fcsharp\u002Ffundamentals\u002Fvariables-data-types","01.csharp\u002F01.fundamentals\u002F03.variables-data-types",{"title":32,"path":33,"stem":34},"Масиви","\u002Fcsharp\u002Ffundamentals\u002Farrays","01.csharp\u002F01.fundamentals\u002F04.arrays",{"title":36,"path":37,"stem":38},"Strings & Text Handling","\u002Fcsharp\u002Ffundamentals\u002Fstrings-text-handling","01.csharp\u002F01.fundamentals\u002F05.strings-text-handling",{"title":40,"path":41,"stem":42},"Дати і Час","\u002Fcsharp\u002Ffundamentals\u002Fdates-time-handling","01.csharp\u002F01.fundamentals\u002F06.dates-time-handling",{"title":44,"path":45,"stem":46},"Потік Керування","\u002Fcsharp\u002Ffundamentals\u002Fcontrol-flow","01.csharp\u002F01.fundamentals\u002F07.control-flow",{"title":48,"path":49,"stem":50},"Методи","\u002Fcsharp\u002Ffundamentals\u002Fmethods","01.csharp\u002F01.fundamentals\u002F08.methods",{"title":52,"path":53,"stem":54},"Основи Відлагодження","\u002Fcsharp\u002Ffundamentals\u002Fdebugging-basics","01.csharp\u002F01.fundamentals\u002F09.debugging-basics",{"title":56,"path":57,"stem":58},"Інтерактивна Консоль (Classic)","\u002Fcsharp\u002Ffundamentals\u002Finteractive-console","01.csharp\u002F01.fundamentals\u002F10.interactive-console",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"OOP","i-lucide-box","\u002Fcsharp\u002Foop","01.csharp\u002F02.oop",[66,70,74,78,82,86],{"title":67,"path":68,"stem":69},"Package Management (Управління Пакетами)","\u002Fcsharp\u002Foop\u002Fpackage-management","01.csharp\u002F02.oop\u002F01.package-management",{"title":71,"path":72,"stem":73},"Класи та Об'єкти","\u002Fcsharp\u002Foop\u002Fclasses-objects","01.csharp\u002F02.oop\u002F02.classes-objects",{"title":75,"path":76,"stem":77},"Властивості та Поля","\u002Fcsharp\u002Foop\u002Fproperties-fields","01.csharp\u002F02.oop\u002F03.properties-fields",{"title":79,"path":80,"stem":81},"Стовпи ООП","\u002Fcsharp\u002Foop\u002Foop-pillars","01.csharp\u002F02.oop\u002F04.oop-pillars",{"title":83,"path":84,"stem":85},"Advanced Types","\u002Fcsharp\u002Foop\u002Fadvanced-types","01.csharp\u002F02.oop\u002F05.advanced-types",{"title":87,"path":88,"stem":89},"Namespaces (Простори Імен)","\u002Fcsharp\u002Foop\u002Fnamespaces","01.csharp\u002F02.oop\u002F06.namespaces",{"title":91,"icon":92,"path":93,"stem":94,"children":95,"page":59},"Advanced Core","i-lucide-zap","\u002Fcsharp\u002Fadvanced-core","01.csharp\u002F03.advanced-core",[96,100,104,108,112,116],{"title":97,"path":98,"stem":99},"Generics (Узагальнення)","\u002Fcsharp\u002Fadvanced-core\u002Fgenerics","01.csharp\u002F03.advanced-core\u002F01.generics",{"title":101,"path":102,"stem":103},"Делегати, Події та Лямбда-вирази","\u002Fcsharp\u002Fadvanced-core\u002Fdelegates-events-lambdas","01.csharp\u002F03.advanced-core\u002F02.delegates-events-lambdas",{"title":105,"path":106,"stem":107},"Interfaces Deep Dive (Інтерфейси: Поглиблений Розгляд)","\u002Fcsharp\u002Fadvanced-core\u002Finterfaces-deep-dive","01.csharp\u002F03.advanced-core\u002F03.interfaces-deep-dive",{"title":109,"path":110,"stem":111},"Обробка Винятків","\u002Fcsharp\u002Fadvanced-core\u002Fexception-handling","01.csharp\u002F03.advanced-core\u002F04.exception-handling",{"title":113,"path":114,"stem":115},"Pattern Matching","\u002Fcsharp\u002Fadvanced-core\u002Fpattern-matching","01.csharp\u002F03.advanced-core\u002F05.pattern-matching",{"title":117,"path":118,"stem":119},"Додаткові Можливості C#","\u002Fcsharp\u002Fadvanced-core\u002Fadditional-features","01.csharp\u002F03.advanced-core\u002F06.additional-features",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":59},"Architecture Best Practices","i-lucide-building-2","\u002Fcsharp\u002Farchitecture-best-practices","01.csharp\u002F04.architecture-best-practices",[126,130,149,153,157,161,165,169],{"title":127,"path":128,"stem":129},"Software Design Principles (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fsoftware-design-principles","01.csharp\u002F04.architecture-best-practices\u002F01.software-design-principles",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":59},"Design Patterns","i-lucide-folder","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns",[136],{"title":137,"icon":132,"path":138,"stem":139,"children":140,"page":59},"Creational","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational",[141,145],{"title":142,"path":143,"stem":144},"Singleton (Одинак)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fsingleton","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F01.singleton",{"title":146,"path":147,"stem":148},"Builder (Будівельник)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fbuilder","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F02.builder",{"title":150,"path":151,"stem":152},"Building Professional CLIs","\u002Fcsharp\u002Farchitecture-best-practices\u002Fbuilding-professional-clis","01.csharp\u002F04.architecture-best-practices\u002F03.building-professional-clis",{"title":154,"path":155,"stem":156},"Validation & Flow Control","\u002Fcsharp\u002Farchitecture-best-practices\u002Fvalidation-flow-control","01.csharp\u002F04.architecture-best-practices\u002F04.validation-flow-control",{"title":158,"path":159,"stem":160},"The Modern .NET Host (Microsoft.Extensions)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fmodern-dotnet-host","01.csharp\u002F04.architecture-best-practices\u002F05.modern-dotnet-host",{"title":162,"path":163,"stem":164},"Data Mapper: Repository та DAO патерни (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part1","01.csharp\u002F04.architecture-best-practices\u002F06.data-mapper-part1",{"title":166,"path":167,"stem":168},"Data Mapper: Repository та DAO патерни (Частина 2)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part2","01.csharp\u002F04.architecture-best-practices\u002F07.data-mapper-part2",{"title":170,"icon":132,"path":171,"stem":172,"children":173,"page":59},"Di Ioc","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc",[174,178,182,186,190,194,198],{"title":175,"path":176,"stem":177},"Проблема залежностей та Інверсія Контролю","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fthe-dependency-problem","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F01.the-dependency-problem",{"title":179,"path":180,"stem":181},"Будуємо власний Service Container","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fbuild-your-own-container","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F02.build-your-own-container",{"title":183,"path":184,"stem":185},"Service Locator: Паттерн та Анти-паттерн","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-locator-pattern","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F03.service-locator-pattern",{"title":187,"path":188,"stem":189},"Паттерни Dependency Injection","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdependency-injection-patterns","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F04.dependency-injection-patterns",{"title":191,"path":192,"stem":193},"Microsoft DI: IServiceCollection та IServiceProvider","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fmicrosoft-di-deep-dive","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F05.microsoft-di-deep-dive",{"title":195,"path":196,"stem":197},"Service Lifetimes та Scopes","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-lifetimes-and-scopes","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F06.service-lifetimes-and-scopes",{"title":199,"path":200,"stem":201},"DI Анти-паттерни та Найкращі Практики","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdi-anti-patterns-and-best-practices","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F07.di-anti-patterns-and-best-practices",{"title":203,"icon":132,"path":204,"stem":205,"children":206,"page":59},"Standard Library","\u002Fcsharp\u002Fstandard-library","01.csharp\u002F05.standard-library",[207,211,215],{"title":208,"path":209,"stem":210},"Collections (Колекції)","\u002Fcsharp\u002Fstandard-library\u002Fcollections","01.csharp\u002F05.standard-library\u002F01.collections",{"title":212,"path":213,"stem":214},"High Performance Types (Високопродуктивні Типи)","\u002Fcsharp\u002Fstandard-library\u002Fhigh-performance-types","01.csharp\u002F05.standard-library\u002F02.high-performance-types",{"title":216,"path":217,"stem":218},"LINQ (Language Integrated Query)","\u002Fcsharp\u002Fstandard-library\u002Flinq","01.csharp\u002F05.standard-library\u002F03.linq",{"title":220,"icon":221,"path":222,"stem":223,"children":224,"page":59},"System Internals Concurrency","i-lucide-server","\u002Fcsharp\u002Fsystem-internals-concurrency","01.csharp\u002F06.system-internals-concurrency",[225,229,233,237,241,245,249],{"title":226,"path":227,"stem":228},"Memory Management","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmemory-management","01.csharp\u002F06.system-internals-concurrency\u002F01.memory-management",{"title":230,"path":231,"stem":232},"Reflection API: System.Type та Метадані","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Freflection-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F02.reflection-fundamentals",{"title":234,"path":235,"stem":236},"Attributes та Dynamic Language Runtime","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fattributes-dynamic","01.csharp\u002F06.system-internals-concurrency\u002F03.attributes-dynamic",{"title":238,"path":239,"stem":240},"Expression Trees: Швидка Альтернатива Рефлексії","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fexpression-trees-compiled","01.csharp\u002F06.system-internals-concurrency\u002F04.expression-trees-compiled",{"title":242,"path":243,"stem":244},"Source Generators: Compile-Time Code Generation","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsource-generators","01.csharp\u002F06.system-internals-concurrency\u002F05.source-generators",{"title":246,"path":247,"stem":248},"Multithreading Fundamentals","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmultithreading-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F06.multithreading-fundamentals",{"title":250,"path":251,"stem":252},"Synchronization Primitives","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsynchronization-primitives","01.csharp\u002F06.system-internals-concurrency\u002F07.synchronization-primitives",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":59},"System Programming Windows","i-lucide-cpu","\u002Fcsharp\u002Fsystem-programming-windows","01.csharp\u002F07.system-programming-windows",[259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375],{"title":260,"path":261,"stem":262},"Як Працює Операційна Система","\u002Fcsharp\u002Fsystem-programming-windows\u002Fhow-os-works","01.csharp\u002F07.system-programming-windows\u002F01.how-os-works",{"title":264,"path":265,"stem":266},"Процеси в .NET — API та Запуск","\u002Fcsharp\u002Fsystem-programming-windows\u002Fprocesses-in-dotnet","01.csharp\u002F07.system-programming-windows\u002F02.processes-in-dotnet",{"title":268,"path":269,"stem":270},"Процеси в .NET — IPC та Міжпроцесна Комунікація","\u002Fcsharp\u002Fsystem-programming-windows\u002F02a.processes-ipc","01.csharp\u002F07.system-programming-windows\u002F02a.processes-ipc",{"title":272,"path":273,"stem":274},"Application Domains та Збірки — AppDomain і AssemblyLoadContext","\u002Fcsharp\u002Fsystem-programming-windows\u002Fappdomains-assemblies","01.csharp\u002F07.system-programming-windows\u002F03.appdomains-assemblies",{"title":276,"path":277,"stem":278},"Application Domains та Збірки — Plug-in Система з Hot-Reload","\u002Fcsharp\u002Fsystem-programming-windows\u002F03a.appdomains-plugin-system","01.csharp\u002F07.system-programming-windows\u002F03a.appdomains-plugin-system",{"title":280,"path":281,"stem":282},"Потоки — Основи та API Thread","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-fundamentals","01.csharp\u002F07.system-programming-windows\u002F04.thread-fundamentals",{"title":284,"path":285,"stem":286},"Потоки — Lifecycle, Пріоритети та Безпечне Завершення","\u002Fcsharp\u002Fsystem-programming-windows\u002F04a.thread-lifecycle-priorities","01.csharp\u002F07.system-programming-windows\u002F04a.thread-lifecycle-priorities",{"title":288,"path":289,"stem":290},"Проблеми Спільного Стану — Race Condition та Data Race","\u002Fcsharp\u002Fsystem-programming-windows\u002Fshared-state-problems","01.csharp\u002F07.system-programming-windows\u002F05.shared-state-problems",{"title":292,"path":293,"stem":294},"Проблеми Спільного Стану — Memory Model та volatile","\u002Fcsharp\u002Fsystem-programming-windows\u002F05a.shared-state-memory-model","01.csharp\u002F07.system-programming-windows\u002F05a.shared-state-memory-model",{"title":296,"path":297,"stem":298},"Синхронізація — Monitor, lock та еволюція примітивів","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-fundamentals","01.csharp\u002F07.system-programming-windows\u002F06.synchronization-fundamentals",{"title":300,"path":301,"stem":302},"Синхронізація — Наскрізний Приклад та Deadlock Detection","\u002Fcsharp\u002Fsystem-programming-windows\u002F06a.synchronization-walkthrough","01.csharp\u002F07.system-programming-windows\u002F06a.synchronization-walkthrough",{"title":304,"path":305,"stem":306},"Синхронізація — Mutex, Semaphore та Event-Based Primitives","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-advanced","01.csharp\u002F07.system-programming-windows\u002F07.synchronization-advanced",{"title":308,"path":309,"stem":310},"Синхронізація — Interlocked, Volatile та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002F07a.synchronization-advanced-walkthrough","01.csharp\u002F07.system-programming-windows\u002F07a.synchronization-advanced-walkthrough",{"title":312,"path":313,"stem":314},"Interlocked, CAS та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002Finterlocked-cas-lockfree","01.csharp\u002F07.system-programming-windows\u002F08.interlocked-cas-lockfree",{"title":316,"path":317,"stem":318},"Volatile, Memory Model та Spinning","\u002Fcsharp\u002Fsystem-programming-windows\u002F08a.volatile-memory-model","01.csharp\u002F07.system-programming-windows\u002F08a.volatile-memory-model",{"title":320,"path":321,"stem":322},"ThreadPool — Пул Потоків для Ефективного Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-pool","01.csharp\u002F07.system-programming-windows\u002F09.thread-pool",{"title":324,"path":325,"stem":326},"ThreadPool — Просунуті Сценарії та Внутрішня Будова","\u002Fcsharp\u002Fsystem-programming-windows\u002F09a.thread-pool-advanced","01.csharp\u002F07.system-programming-windows\u002F09a.thread-pool-advanced",{"title":328,"path":329,"stem":330},"Concurrent та Immutable Collections","\u002Fcsharp\u002Fsystem-programming-windows\u002Fconcurrent-collections","01.csharp\u002F07.system-programming-windows\u002F10.concurrent-collections",{"title":332,"path":333,"stem":334},"TPL, Task та Композиція — Від Thread до Task","\u002Fcsharp\u002Fsystem-programming-windows\u002Ftpl-parallel-plinq","01.csharp\u002F07.system-programming-windows\u002F11.tpl-parallel-plinq",{"title":336,"path":337,"stem":338},"Parallel Class та PLINQ — Data Parallelism","\u002Fcsharp\u002Fsystem-programming-windows\u002F11a.tpl-parallel-plinq-advanced","01.csharp\u002F07.system-programming-windows\u002F11a.tpl-parallel-plinq-advanced",{"title":340,"path":341,"stem":342},"Async\u002FAwait — Фундамент Асинхронного Програмування","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-fundamentals","01.csharp\u002F07.system-programming-windows\u002F12.async-fundamentals",{"title":344,"path":345,"stem":346},"SynchronizationContext та ConfigureAwait — Контекст Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-context-configureawait","01.csharp\u002F07.system-programming-windows\u002F13.async-context-configureawait",{"title":348,"path":349,"stem":350},"Async — Просунуті Паттерни","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-advanced","01.csharp\u002F07.system-programming-windows\u002F14.async-advanced",{"title":352,"path":353,"stem":354},"System.Threading.Channels — Async Producer-Consumer","\u002Fcsharp\u002Fsystem-programming-windows\u002Fchannels","01.csharp\u002F07.system-programming-windows\u002F15.channels",{"title":356,"path":357,"stem":358},"Асинхронна Синхронізація","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-synchronization","01.csharp\u002F07.system-programming-windows\u002F16.async-synchronization",{"title":360,"path":361,"stem":362},"Unsafe Code та Вказівники","\u002Fcsharp\u002Fsystem-programming-windows\u002Funsafe-code","01.csharp\u002F07.system-programming-windows\u002F17.unsafe-code",{"title":364,"path":365,"stem":366},"P\u002FInvoke та Windows API — Міст між .NET та Native Code","\u002Fcsharp\u002Fsystem-programming-windows\u002Fpinvoke-winapi","01.csharp\u002F07.system-programming-windows\u002F18.pinvoke-winapi",{"title":368,"path":369,"stem":370},"Реєстр Windows — Центральна База Конфігурації Системи","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-registry","01.csharp\u002F07.system-programming-windows\u002F19.windows-registry",{"title":372,"path":373,"stem":374},"Windows Hooks, Hotkeys та Services — Глибока Інтеграція з ОС","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-hooks-services","01.csharp\u002F07.system-programming-windows\u002F20.windows-hooks-services",{"title":376,"path":377,"stem":378},"Системне Програмування C# (Windows) — 07.system-programming-windows","\u002Fcsharp\u002Fsystem-programming-windows\u002Fimplementation_plan","01.csharp\u002F07.system-programming-windows\u002Fimplementation_plan",{"title":380,"icon":132,"path":381,"stem":382,"children":383,"page":59},"Io","\u002Fcsharp\u002Fio","01.csharp\u002F08.io",[384,388,392,396,400],{"title":385,"path":386,"stem":387},"8.1.1. Основи роботи з файловою системою","\u002Fcsharp\u002Fio\u002Ffile-system-basics","01.csharp\u002F08.io\u002F01.file-system-basics",{"title":389,"path":390,"stem":391},"8.1.2. Потоки (Streams) та Серіалізація Даних","\u002Fcsharp\u002Fio\u002Fstreams-serialization","01.csharp\u002F08.io\u002F02.streams-serialization",{"title":393,"path":394,"stem":395},"8.2.1. JSON Serialization з System.Text.Json","\u002Fcsharp\u002Fio\u002Fjson-serialization","01.csharp\u002F08.io\u002F03.json-serialization",{"title":397,"path":398,"stem":399},"8.2.2. XML Serialization та LINQ to XML","\u002Fcsharp\u002Fio\u002Fxml-serialization","01.csharp\u002F08.io\u002F04.xml-serialization",{"title":401,"path":402,"stem":403},"8.2.3. Binary Serialization: MessagePack та Protocol Buffers","\u002Fcsharp\u002Fio\u002Fbinary-serialization","01.csharp\u002F08.io\u002F05.binary-serialization",{"title":405,"icon":132,"path":406,"stem":407,"children":408,"page":59},"Ado Net","\u002Fcsharp\u002Fado-net","01.csharp\u002F09.ado-net",[409,413,417,421,425,429,433,437,441,445,449,453],{"title":410,"path":411,"stem":412},"9.1. Введення в ADO.NET","\u002Fcsharp\u002Fado-net\u002Fintroduction-to-adonet","01.csharp\u002F09.ado-net\u002F01.introduction-to-adonet",{"title":414,"path":415,"stem":416},"9.2. Клас DbConnection — з'єднання з базою даних","\u002Fcsharp\u002Fado-net\u002Fconnection","01.csharp\u002F09.ado-net\u002F02.connection",{"title":418,"path":419,"stem":420},"9.3. Клас DbCommand — виконання SQL-запитів","\u002Fcsharp\u002Fado-net\u002Fcommand-and-queries","01.csharp\u002F09.ado-net\u002F03.command-and-queries",{"title":422,"path":423,"stem":424},"9.4. Клас DbDataReader — ефективне читання даних","\u002Fcsharp\u002Fado-net\u002Fdatareader","01.csharp\u002F09.ado-net\u002F04.datareader",{"title":426,"path":427,"stem":428},"9.5. Параметризовані запити та захист від SQL Injection","\u002Fcsharp\u002Fado-net\u002Fparameters-and-sql-injection","01.csharp\u002F09.ado-net\u002F05.parameters-and-sql-injection",{"title":430,"path":431,"stem":432},"9.6. Транзакції в ADO.NET","\u002Fcsharp\u002Fado-net\u002Ftransactions","01.csharp\u002F09.ado-net\u002F06.transactions",{"title":434,"path":435,"stem":436},"9.7. DbProviderFactory — провайдер-незалежний код","\u002Fcsharp\u002Fado-net\u002Fprovider-factory","01.csharp\u002F09.ado-net\u002F07.provider-factory",{"title":438,"path":439,"stem":440},"9.8. Асинхронний доступ до даних","\u002Fcsharp\u002Fado-net\u002Fasync-data-access","01.csharp\u002F09.ado-net\u002F08.async-data-access",{"title":442,"path":443,"stem":444},"9.9. Від'єднаний режим: DataSet, DataTable, DataRow","\u002Fcsharp\u002Fado-net\u002Fdisconnected-mode-dataset","01.csharp\u002F09.ado-net\u002F09.disconnected-mode-dataset",{"title":446,"path":447,"stem":448},"9.10. DataAdapter — міст між DataSet та базою даних","\u002Fcsharp\u002Fado-net\u002Fdata-adapter","01.csharp\u002F09.ado-net\u002F10.data-adapter",{"title":450,"path":451,"stem":452},"9.11. Data Mapper та Repository: Архітектура доступу до даних","\u002Fcsharp\u002Fado-net\u002Fdata-mapper-repository","01.csharp\u002F09.ado-net\u002F11.data-mapper-repository",{"title":454,"path":455,"stem":456},"9.12. Identity Map, Unit of Work та Specification Pattern","\u002Fcsharp\u002Fado-net\u002Fadvanced-patterns","01.csharp\u002F09.ado-net\u002F12.advanced-patterns",{"title":458,"icon":255,"path":459,"stem":460,"children":461,"page":59},"Ef Core","\u002Fcsharp\u002Fef-core","01.csharp\u002F10.ef-core",[462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,532,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646],{"title":463,"path":464,"stem":465},"Що таке ORM? Від SQL до об'єктів","\u002Fcsharp\u002Fef-core\u002Fwhat-is-orm","01.csharp\u002F10.ef-core\u002F01.what-is-orm",{"title":467,"path":468,"stem":469},"Перший проєкт — від нуля до CRUD","\u002Fcsharp\u002Fef-core\u002Ffirst-project","01.csharp\u002F10.ef-core\u002F02.first-project",{"title":471,"path":472,"stem":473},"DbContext — Серце EF Core","\u002Fcsharp\u002Fef-core\u002Fdbcontext-deep-dive","01.csharp\u002F10.ef-core\u002F03.dbcontext-deep-dive",{"title":475,"path":476,"stem":477},"Провайдери баз даних — Архітектура та Вибір СУБД","\u002Fcsharp\u002Fef-core\u002Fdatabase-providers","01.csharp\u002F10.ef-core\u002F04.database-providers",{"title":479,"path":480,"stem":481},"Конвенції EF Core — Магія без конфігурації","\u002Fcsharp\u002Fef-core\u002Fconventions","01.csharp\u002F10.ef-core\u002F05.conventions",{"title":483,"path":484,"stem":485},"Fluent API та Data Annotations — Явна конфігурація моделі","\u002Fcsharp\u002Fef-core\u002Ffluent-api-vs-annotations","01.csharp\u002F10.ef-core\u002F06.fluent-api-vs-annotations",{"title":487,"path":488,"stem":489},"Зв'язки — One-to-One та One-to-Many","\u002Fcsharp\u002Fef-core\u002Frelationships-basics","01.csharp\u002F10.ef-core\u002F07.relationships-basics",{"title":491,"path":492,"stem":493},"Зв'язки Advanced — Many-to-Many та Складні Сценарії","\u002Fcsharp\u002Fef-core\u002Frelationships-advanced","01.csharp\u002F10.ef-core\u002F08.relationships-advanced",{"title":495,"path":496,"stem":497},"Властивості — Типи, Конвертери, Компаратори (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part1","01.csharp\u002F10.ef-core\u002F09.property-configuration-part1",{"title":499,"path":500,"stem":501},"Властивості — Value Comparers, Generators, Shadow Properties (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part2","01.csharp\u002F10.ef-core\u002F09.property-configuration-part2",{"title":503,"path":504,"stem":505},"Складні типи — Owned Types та Complex Types (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part1","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part1",{"title":507,"path":508,"stem":509},"Складні типи — Complex Types, Keyless Entities, Порівняння (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part2","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part2",{"title":511,"path":512,"stem":513},"JSON Columns — Складні дані у JSON (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part1","01.csharp\u002F10.ef-core\u002F11.json-columns-part1",{"title":515,"path":516,"stem":517},"JSON Columns — Value Comparers, Індекси, Провайдери (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part2","01.csharp\u002F10.ef-core\u002F11.json-columns-part2",{"title":519,"path":520,"stem":521},"Успадкування — Абстрактні класи та TPH (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finheritance-part1","01.csharp\u002F10.ef-core\u002F12.inheritance-part1",{"title":523,"path":524,"stem":525},"Успадкування — TPT, TPC та Порівняння Стратегій (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finheritance-part2","01.csharp\u002F10.ef-core\u002F12.inheritance-part2",{"title":527,"path":528,"stem":529,"children":530},"Індекси, Обмеження та Схема (Частина 1)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part1","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part1",[531],{"title":527,"path":528,"stem":529},{"title":533,"path":534,"stem":535,"children":536},"Індекси, Обмеження та Схема (Частина 2)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part2","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part2",[537],{"title":533,"path":534,"stem":535},{"title":539,"path":540,"stem":541},"Seed Data — Початкові Дані (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fseeding-part1","01.csharp\u002F10.ef-core\u002F14.seeding-part1",{"title":543,"path":544,"stem":545},"Seed Data — SQL-скрипти, Bogus та Стратегії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fseeding-part2","01.csharp\u002F10.ef-core\u002F14.seeding-part2",{"title":547,"path":548,"stem":549},"Global Query Filters — Глобальні Фільтри (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part1","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part1",{"title":551,"path":552,"stem":553},"Global Query Filters — Підводні камені та Інтеграція (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part2","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part2",{"title":555,"path":556,"stem":557},"LINQ-запити в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part1","01.csharp\u002F10.ef-core\u002F16.linq-queries-part1",{"title":559,"path":560,"stem":561},"LINQ-запити в EF Core (Частина 2)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part2","01.csharp\u002F10.ef-core\u002F16.linq-queries-part2",{"title":563,"path":564,"stem":565},"Завантаження Пов'язаних Даних (Частина 1)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part1","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part1",{"title":567,"path":568,"stem":569},"Завантаження Пов'язаних Даних (Частина 2)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part2","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part2",{"title":571,"path":572,"stem":573},"Raw SQL, Views та Stored Procedures (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part1","01.csharp\u002F10.ef-core\u002F18.raw-sql-part1",{"title":575,"path":576,"stem":577},"Raw SQL — Stored Procedures, DbFunction та Bulk Operations (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part2","01.csharp\u002F10.ef-core\u002F18.raw-sql-part2",{"title":579,"path":580,"stem":581},"Продвинуті Запити — Compiled Queries, Bulk та Оптимізація (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part1","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part1",{"title":583,"path":584,"stem":585},"Продвинуті Запити — Query Tags, Bulk та Interceptors (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part2","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part2",{"title":587,"path":588,"stem":589},"Change Tracker — Відстеження Змін (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part1","01.csharp\u002F10.ef-core\u002F20.change-tracking-part1",{"title":591,"path":592,"stem":593},"Change Tracker — Графи Об'єктів та Disconnected (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part2","01.csharp\u002F10.ef-core\u002F20.change-tracking-part2",{"title":595,"path":596,"stem":597},"Збереження Даних та Транзакції (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part1","01.csharp\u002F10.ef-core\u002F21.saving-data-part1",{"title":599,"path":600,"stem":601},"Збереження Даних — Concurrency та Outbox (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part2","01.csharp\u002F10.ef-core\u002F21.saving-data-part2",{"title":603,"path":604,"stem":605},"Конкурентність та Блокування (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part1","01.csharp\u002F10.ef-core\u002F22.concurrency-part1",{"title":607,"path":608,"stem":609},"Конкурентність — Дедлоки та Queue Processing (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part2","01.csharp\u002F10.ef-core\u002F22.concurrency-part2",{"title":611,"path":612,"stem":613},"Міграції в EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part1","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part1",{"title":615,"path":616,"stem":617},"Міграції в EF Core — Основи (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part2","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part2",{"title":619,"path":620,"stem":621},"Міграції — Просунуті Сценарії (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part1","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part1",{"title":623,"path":624,"stem":625},"Міграції — Просунуті Сценарії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part2","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part2",{"title":627,"path":628,"stem":629},"Управління Схемою та Database-First (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part1","01.csharp\u002F10.ef-core\u002F25.schema-management-part1",{"title":631,"path":632,"stem":633},"Управління Схемою та Database-First (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part2","01.csharp\u002F10.ef-core\u002F25.schema-management-part2",{"title":635,"path":636,"stem":637},"Продуктивність EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fperformance-fundamentals-part1","01.csharp\u002F10.ef-core\u002F26.performance-fundamentals-part1",{"title":639,"path":640,"stem":641},"Interceptors в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part1","01.csharp\u002F10.ef-core\u002F29.interceptors-part1",{"title":643,"path":644,"stem":645},"Interceptors в EF Core — Connection, Transaction та Materialization (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part2","01.csharp\u002F10.ef-core\u002F29.interceptors-part2",{"title":647,"path":648,"stem":649},"План вивчення Entity Framework Core — Повний курс","\u002Fcsharp\u002Fef-core\u002Fimplementation_plan","01.csharp\u002F10.ef-core\u002Fimplementation_plan",{"title":651,"icon":652,"path":653,"stem":654,"children":655,"page":59},"ASP.NET","i-devicon-dotnetcore","\u002Fcsharp\u002Faspnet","01.csharp\u002F11.aspnet",[656,730,791,869,927,941,967,1057,1111,1182,1212,1289,1346],{"title":657,"icon":658,"path":659,"stem":660,"children":661,"page":59},"Minimal API","i-lucide-network","\u002Fcsharp\u002Faspnet\u002Fminimal-api","01.csharp\u002F11.aspnet\u002F01.minimal-api",[662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726],{"title":663,"path":664,"stem":665},"Вступ до ASP.NET та еволюція фреймворку","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fintroduction","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F01.introduction",{"title":667,"path":668,"stem":669},"Перший додаток на ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Ffirst-application","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F02.first-application",{"title":671,"path":672,"stem":673},"WebApplication, Builder та Dependency Injection","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fwebapplication-builder","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F03.webapplication-builder",{"title":675,"path":676,"stem":677},"Конвеєр запитів та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frequest-pipeline-middleware","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F04.request-pipeline-middleware",{"title":679,"path":680,"stem":681},"Маршрутизація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F05.routing-basics",{"title":683,"path":684,"stem":685},"Маршрутизація в ASP.NET Core: Розширені можливості","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F06.routing-advanced",{"title":687,"path":688,"stem":689},"Статичні файли в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-files","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F07.static-files",{"title":691,"path":692,"stem":693},"Статичні Активи: MapStaticAssets (ASP.NET Core 9.0)","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-assets","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F08.static-assets",{"title":695,"path":696,"stem":697},"Конфігурація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-fundamentals","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F09.configuration-fundamentals",{"title":699,"path":700,"stem":701},"Конфігурація: Паттерн Options","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-options","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F10.configuration-options",{"title":703,"path":704,"stem":705},"Логування в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F11.logging-basics",{"title":707,"path":708,"stem":709},"Логування: Serilog та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F12.logging-advanced",{"title":711,"path":712,"stem":713},"Управління станом: HttpContext.Items та Cookies","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstate-management","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F13.state-management",{"title":715,"path":716,"stem":717},"Стан сесії: Sessions","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fsession-state","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F14.session-state",{"title":719,"path":720,"stem":721},"Структура проєкту: від хаосу до архітектури","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fproject-structure","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F15.project-structure",{"title":723,"path":724,"stem":725},"Scalar у Minimal API: повний проєкт і Fluent OpenAPI","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fscalar-openapi-fluent","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F16.scalar-openapi-fluent",{"title":727,"path":728,"stem":729},"Swagger \u002F Swashbuckle у Minimal API: окремий класичний шлях","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fswagger-swashbuckle","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F17.swagger-swashbuckle",{"title":731,"icon":658,"path":732,"stem":733,"children":734,"page":59},"API","\u002Fcsharp\u002Faspnet\u002Fapi","01.csharp\u002F11.aspnet\u002F02.api",[735,739,743,747,751,755,759,763,767,771,775,779,783,787],{"title":736,"path":737,"stem":738},"Що таке API. Клієнт-серверна архітектура","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fwhat-is-api","01.csharp\u002F11.aspnet\u002F02.api\u002F01.what-is-api",{"title":740,"path":741,"stem":742},"Формати даних: JSON, XML, TOML та бінарні формати","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fdata-formats","01.csharp\u002F11.aspnet\u002F02.api\u002F02.data-formats",{"title":744,"path":745,"stem":746},"Парадигми API та концепція REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-paradigms-rest","01.csharp\u002F11.aspnet\u002F02.api\u002F03.api-paradigms-rest",{"title":748,"path":749,"stem":750},"HTTP-методи, статус-коди та заголовки","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fhttp-methods-status-codes","01.csharp\u002F11.aspnet\u002F02.api\u002F04.http-methods-status-codes",{"title":752,"path":753,"stem":754},"Організація HTTP API за принципами REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Frest-organizing","01.csharp\u002F11.aspnet\u002F02.api\u002F05.rest-organizing",{"title":756,"path":757,"stem":758},"Номенклатура URL та CRUD-операції","\u002Fcsharp\u002Faspnet\u002Fapi\u002Furl-nomenclature-crud","01.csharp\u002F11.aspnet\u002F02.api\u002F06.url-nomenclature-crud",{"title":760,"path":761,"stem":762},"Правила дизайну: іменування та стандарти","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-naming","01.csharp\u002F11.aspnet\u002F02.api\u002F07.api-design-naming",{"title":764,"path":765,"stem":766},"Валідація, ліміти та обробка помилок","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-validation","01.csharp\u002F11.aspnet\u002F02.api\u002F08.api-design-validation",{"title":768,"path":769,"stem":770},"Обробка помилок у Minimal API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Ferror-handling-http","01.csharp\u002F11.aspnet\u002F02.api\u002F09.error-handling-http",{"title":772,"path":773,"stem":774},"Ідемпотентність та синхронізація стану","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fidempotency-sync","01.csharp\u002F11.aspnet\u002F02.api\u002F10.idempotency-sync",{"title":776,"path":777,"stem":778},"Пагінація та організація списків","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fpagination-lists","01.csharp\u002F11.aspnet\u002F02.api\u002F11.pagination-lists",{"title":780,"path":781,"stem":782},"Безпека API, кешування та інтернаціоналізація","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fsecurity-auth","01.csharp\u002F11.aspnet\u002F02.api\u002F12.security-auth",{"title":784,"path":785,"stem":786},"Процес проєктування API та документування","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-process","01.csharp\u002F11.aspnet\u002F02.api\u002F13.api-design-process",{"title":788,"path":789,"stem":790},"OpenAPI: контракт, специфікація та документація API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fopenapi","01.csharp\u002F11.aspnet\u002F02.api\u002F14.openapi",{"title":792,"icon":793,"path":794,"stem":795,"children":796,"page":59},"Auth","i-lucide-shield-check","\u002Fcsharp\u002Faspnet\u002Fauth","01.csharp\u002F11.aspnet\u002F03.auth",[797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865],{"title":798,"path":799,"stem":800},"Основи аутентифікації та авторизації","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauth-fundamentals","01.csharp\u002F11.aspnet\u002F03.auth\u002F01.auth-fundamentals",{"title":802,"path":803,"stem":804},"JWT-аутентифікація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fjwt-authentication","01.csharp\u002F11.aspnet\u002F03.auth\u002F02.jwt-authentication",{"title":806,"path":807,"stem":808},"Авторизація: ролі, політики та resource-based доступ","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauthorization-policies","01.csharp\u002F11.aspnet\u002F03.auth\u002F03.authorization-policies",{"title":810,"path":811,"stem":812},"Cookie-аутентифікація та ASP.NET Core Identity","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcookie-auth-identity","01.csharp\u002F11.aspnet\u002F03.auth\u002F04.cookie-auth-identity",{"title":814,"path":815,"stem":816},"JWT + Refresh Tokens (HttpOnly Cookie)","\u002Fcsharp\u002Faspnet\u002Fauth\u002F04b.identity-auth-jwt","01.csharp\u002F11.aspnet\u002F03.auth\u002F04b.identity-auth-jwt",{"title":818,"path":819,"stem":820},"Identity: Підтвердження Email та Скидання Пароля","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-email-confirmation","01.csharp\u002F11.aspnet\u002F03.auth\u002F05.identity-email-confirmation",{"title":822,"path":823,"stem":824},"Identity: Двофакторна Аутентифікація (2FA)","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-two-factor","01.csharp\u002F11.aspnet\u002F03.auth\u002F06.identity-two-factor",{"title":826,"path":827,"stem":828},"Identity: Внутрішня Архітектура та Кастомізація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-internals","01.csharp\u002F11.aspnet\u002F03.auth\u002F07.identity-internals",{"title":830,"path":831,"stem":832},"OAuth 2.0 та зовнішні провайдери","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-external-providers","01.csharp\u002F11.aspnet\u002F03.auth\u002F08.oauth-external-providers",{"title":834,"path":835,"stem":836},"Безпека на практиці: CORS, HTTPS та захист від атак","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fsecurity-hardening","01.csharp\u002F11.aspnet\u002F03.auth\u002F09.security-hardening",{"title":838,"path":839,"stem":840},"Теорія OAuth 2.0: Поняття, Аналогії та Флоу","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-theory","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oauth-theory",{"title":842,"path":843,"stem":844},"OIDC, OAuth 2.0 та Keycloak в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foidc-keycloak","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oidc-keycloak",{"title":846,"path":847,"stem":848},"API Keys аутентифікація в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fapi-keys","01.csharp\u002F11.aspnet\u002F03.auth\u002F11.api-keys",{"title":850,"path":851,"stem":852},"Rate Limiting та Throttling в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frate-limiting","01.csharp\u002F11.aspnet\u002F03.auth\u002F12.rate-limiting",{"title":854,"path":855,"stem":856},"Refresh Token Rotation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frefresh-token-rotation","01.csharp\u002F11.aspnet\u002F03.auth\u002F13.refresh-token-rotation",{"title":858,"path":859,"stem":860},"Certificate Authentication та mTLS в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcertificate-auth","01.csharp\u002F11.aspnet\u002F03.auth\u002F14.certificate-auth",{"title":862,"path":863,"stem":864},"RBAC, ABAC та ReBAC в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frbac-abac-rebac","01.csharp\u002F11.aspnet\u002F03.auth\u002F15.rbac-abac-rebac",{"title":866,"path":867,"stem":868},"Multi-tenancy та ізоляція даних в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fmulti-tenancy","01.csharp\u002F11.aspnet\u002F03.auth\u002F16.multi-tenancy",{"title":870,"icon":871,"path":872,"stem":873,"children":874,"page":59},"Нотифікації","i-lucide-bell","\u002Fcsharp\u002Faspnet\u002Fnotifications","01.csharp\u002F11.aspnet\u002F04.notifications",[875,879,883,887,891,895,899,903,907,911,915,919,923],{"title":876,"path":877,"stem":878},"In-App нотифікації через базу даних","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fin-app-database-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F01.in-app-database-notifications",{"title":880,"path":881,"stem":882},"Polling: Регулярний запит оновлень","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fpolling","01.csharp\u002F11.aspnet\u002F04.notifications\u002F02.polling",{"title":884,"path":885,"stem":886},"Server-Sent Events: Однострімовий push від сервера","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fserver-sent-events","01.csharp\u002F11.aspnet\u002F04.notifications\u002F03.server-sent-events",{"title":888,"path":889,"stem":890},"WebSockets: Двостороннє з'єднання в реальному часі","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fwebsockets","01.csharp\u002F11.aspnet\u002F04.notifications\u002F04.websockets",{"title":892,"path":893,"stem":894},"SignalR: Абстракція над транспортами реального часу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fsignalr","01.csharp\u002F11.aspnet\u002F04.notifications\u002F05.signalr",{"title":896,"path":897,"stem":898},"Background Services: Фонові задачі в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fbackground-services","01.csharp\u002F11.aspnet\u002F04.notifications\u002F06.background-services",{"title":900,"path":901,"stem":902},"Web Push нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fweb-push","01.csharp\u002F11.aspnet\u002F04.notifications\u002F07.web-push",{"title":904,"path":905,"stem":906},"Email нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Femail-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F08.email-notifications",{"title":908,"path":909,"stem":910},"Порівняння підходів: Як вибрати правильну технологію нотифікацій","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fchoosing-the-right-approach","01.csharp\u002F11.aspnet\u002F04.notifications\u002F09.choosing-the-right-approach",{"title":912,"path":913,"stem":914},"Hangfire: Надійне планування фонових задач","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire","01.csharp\u002F11.aspnet\u002F04.notifications\u002F10.hangfire",{"title":916,"path":917,"stem":918},"Практика: Конвертація зображень у WebP через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-image-webp","01.csharp\u002F11.aspnet\u002F04.notifications\u002F11.hangfire-image-webp",{"title":920,"path":921,"stem":922},"Практика: Підготовка відео до HLS-стрімінгу через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-video-hls","01.csharp\u002F11.aspnet\u002F04.notifications\u002F12.hangfire-video-hls",{"title":924,"path":925,"stem":926},"Telegram-нотифікації: від одного повідомлення до масових розсилок і мульти-канального підходу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Ftelegram-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F13.telegram-notifications",{"title":928,"icon":929,"path":930,"stem":931,"children":932,"page":59},"Інтернаціоналізація","i-lucide-languages","\u002Fcsharp\u002Faspnet\u002Fi18n","01.csharp\u002F11.aspnet\u002F05.i18n",[933,937],{"title":934,"path":935,"stem":936},"Інтернаціоналізація (i18n) у Minimal API: від A до Я","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Finternationalization","01.csharp\u002F11.aspnet\u002F05.i18n\u002F01.internationalization",{"title":938,"path":939,"stem":940},"Humanizer: людиномовні рядки у .NET","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Fhumanizer","01.csharp\u002F11.aspnet\u002F05.i18n\u002F02.humanizer",{"title":942,"icon":943,"path":944,"stem":945,"children":946,"page":59},"Кешування","i-lucide-layers","\u002Fcsharp\u002Faspnet\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching",[947,951,955,959,963],{"title":948,"path":949,"stem":950},"Огляд кешування: чотири рівні і коли що обирати","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching\u002F01.caching",{"title":952,"path":953,"stem":954},"IMemoryCache: кеш в оперативній пам'яті","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fmemory-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F02.memory-cache",{"title":956,"path":957,"stem":958},"IDistributedCache і Redis: розподілений кеш","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fdistributed-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F03.distributed-cache",{"title":960,"path":961,"stem":962},"Response Cache: HTTP-кешування через Cache-Control","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fresponse-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F04.response-cache",{"title":964,"path":965,"stem":966},"Output Cache: серверний кеш HTTP-відповідей (.NET 7+)","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Foutput-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F05.output-cache",{"title":968,"icon":969,"path":970,"stem":971,"children":972,"page":59},"Тестування","i-lucide-test-tube","\u002Fcsharp\u002Faspnet\u002Ftesting","01.csharp\u002F11.aspnet\u002F07.testing",[973,977,981,985,989,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053],{"title":974,"path":975,"stem":976},"Що таке тестування? Від інтуїції до науки","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-is-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F01.what-is-testing",{"title":978,"path":979,"stem":980},"Піраміда тестування — Стратегія, а не Догма","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-pyramid","01.csharp\u002F11.aspnet\u002F07.testing\u002F02.testing-pyramid",{"title":982,"path":983,"stem":984},"Дві Школи Тестування — Лондон проти Детройту","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-schools","01.csharp\u002F11.aspnet\u002F07.testing\u002F03.testing-schools",{"title":986,"path":987,"stem":988},"TDD та BDD — Тести як Дизайн-інструмент","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftdd-and-bdd","01.csharp\u002F11.aspnet\u002F07.testing\u002F04.tdd-and-bdd",{"title":990,"path":991,"stem":992},"Що саме тестувати — Техніки аналізу та Циклomatична складність","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-to-test","01.csharp\u002F11.aspnet\u002F07.testing\u002F05.what-to-test",{"title":994,"path":995,"stem":996},"Тестові Фреймворки — Навіщо вони і що всередині","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftest-frameworks","01.csharp\u002F11.aspnet\u002F07.testing\u002F06.test-frameworks",{"title":998,"path":999,"stem":1000},"xUnit — Факти, Теорії та Lifecycle тестів","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-basics","01.csharp\u002F11.aspnet\u002F07.testing\u002F07.xunit-basics",{"title":1002,"path":1003,"stem":1004},"xUnit Advanced — Fixtures, Кастомізація та Розширення","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F08.xunit-advanced",{"title":1006,"path":1007,"stem":1008},"Moq — Глибоке занурення в мокування","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fmocking-with-moq","01.csharp\u002F11.aspnet\u002F07.testing\u002F09.mocking-with-moq",{"title":1010,"path":1011,"stem":1012},"Тестування Баз Даних — EF Core, SQLite та Testcontainers","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fdatabase-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F10.database-testing",{"title":1014,"path":1015,"stem":1016},"Integration Testing — Частина 1 [Теорія та WebApplicationFactory]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F11.integration-testing",{"title":1018,"path":1019,"stem":1020},"Інтеграційне тестування — Практика","\u002Fcsharp\u002Faspnet\u002Ftesting\u002F11a.integration-testing-practice","01.csharp\u002F11.aspnet\u002F07.testing\u002F11a.integration-testing-practice",{"title":1022,"path":1023,"stem":1024},"Integration Testing — Частина 2 [Просунуті Сценарії та Testcontainers]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F12.integration-testing-advanced",{"title":1026,"path":1027,"stem":1028},"Професійний Postman: Колекції, Змінні та GitHub Інтеграція","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fpostman-professional","01.csharp\u002F11.aspnet\u002F07.testing\u002F13.postman-professional",{"title":1030,"path":1031,"stem":1032},"HttpClient у Тестах Частина 1: Архітектура та MockHttpMessageHandler","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fhttpclient-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F14.httpclient-testing",{"title":1034,"path":1035,"stem":1036},"HttpClient у Тестах Частина 2: WireMock.Net та Resilience","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwiremock-net","01.csharp\u002F11.aspnet\u002F07.testing\u002F15.wiremock-net",{"title":1038,"path":1039,"stem":1040},"Патерни та Анти-патерни Тестування: Test Smells","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-patterns","01.csharp\u002F11.aspnet\u002F07.testing\u002F16.testing-patterns",{"title":1042,"path":1043,"stem":1044},"Просунуті інструменти: Time, Snapshots та Властивості","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fadvanced-testing-tools","01.csharp\u002F11.aspnet\u002F07.testing\u002F17.advanced-testing-tools",{"title":1046,"path":1047,"stem":1048},"Тестування Архітектури з NetArchTest","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Farchitecture-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F18.architecture-testing",{"title":1050,"path":1051,"stem":1052},"Тестування Продуктивності: BenchmarkDotNet, NBomber та k6","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fperformance-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F19.performance-testing",{"title":1054,"path":1055,"stem":1056},"Залишок плану для курсу \"Тестування ASP.NET Minimal API\"","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fremaining_plan","01.csharp\u002F11.aspnet\u002F07.testing\u002Fremaining_plan",{"title":1058,"icon":1059,"path":1060,"stem":1061,"children":1062,"page":59},"Платежі","i-lucide-credit-card","\u002Fcsharp\u002Faspnet\u002Fpayments","01.csharp\u002F11.aspnet\u002F08.payments",[1063,1067,1071,1075,1079,1083,1087,1091,1095,1099,1103,1107],{"title":1064,"path":1065,"stem":1066},"Основи платіжної інфраструктури","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-fundamentals","01.csharp\u002F11.aspnet\u002F08.payments\u002F01.payment-fundamentals",{"title":1068,"path":1069,"stem":1070},"Методи оплати в Україні","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-methods-ukraine","01.csharp\u002F11.aspnet\u002F08.payments\u002F02.payment-methods-ukraine",{"title":1072,"path":1073,"stem":1074},"PCI DSS та безпека платежів","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpci-dss-security","01.csharp\u002F11.aspnet\u002F08.payments\u002F03.pci-dss-security",{"title":1076,"path":1077,"stem":1078},"Архітектура платіжної підсистеми","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-architecture","01.csharp\u002F11.aspnet\u002F08.payments\u002F04.payment-architecture",{"title":1080,"path":1081,"stem":1082},"Інтеграція LiqPay (ПриватБанк)","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fliqpay-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F05.liqpay-integration",{"title":1084,"path":1085,"stem":1086},"Інтеграція Monobank Acquiring API","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fmonobank-acquiring","01.csharp\u002F11.aspnet\u002F08.payments\u002F06.monobank-acquiring",{"title":1088,"path":1089,"stem":1090},"Інтеграція Stripe","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fstripe-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F07.stripe-integration",{"title":1092,"path":1093,"stem":1094},"Webhooks — глибоке занурення","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fwebhooks-deep-dive","01.csharp\u002F11.aspnet\u002F08.payments\u002F08.webhooks-deep-dive",{"title":1096,"path":1097,"stem":1098},"Підписки та рекурентні платежі","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fsubscriptions-recurring","01.csharp\u002F11.aspnet\u002F08.payments\u002F09.subscriptions-recurring",{"title":1100,"path":1101,"stem":1102},"Повернення коштів та диспути","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Frefunds-disputes","01.csharp\u002F11.aspnet\u002F08.payments\u002F10.refunds-disputes",{"title":1104,"path":1105,"stem":1106},"Тестування платіжних інтеграцій","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Ftesting-payments","01.csharp\u002F11.aspnet\u002F08.payments\u002F11.testing-payments",{"title":1108,"path":1109,"stem":1110},"Чекліст виходу в Production","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fproduction-checklist","01.csharp\u002F11.aspnet\u002F08.payments\u002F12.production-checklist",{"title":1112,"icon":1113,"items":1114,"path":1127,"stem":1128,"children":1129,"page":59},"Популярні бібліотеки","lucide:box",[1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126],"01.fluent-validation","02.mapster","03.erroror-result-pattern","04.serilog","05.mediatr","06.polly","07.health-checks","08.feature-management","09.fluent-email","10.quest-pdf","11.bogus","12.humanizer-guard","\u002Fcsharp\u002Faspnet\u002Flibraries","01.csharp\u002F11.aspnet\u002F09.libraries",[1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178],{"title":1131,"path":1132,"stem":1133},"Валідація з FluentValidation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-validation","01.csharp\u002F11.aspnet\u002F09.libraries\u002F01.fluent-validation",{"title":1135,"path":1136,"stem":1137},"Маппінг об","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmapster","01.csharp\u002F11.aspnet\u002F09.libraries\u002F02.mapster",{"title":1139,"path":1140,"stem":1141},"Обробка помилок з ErrorOr та Result Pattern в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ferroror-result-pattern","01.csharp\u002F11.aspnet\u002F09.libraries\u002F03.erroror-result-pattern",{"title":1143,"path":1144,"stem":1145},"Структуроване логування з Serilog в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fserilog","01.csharp\u002F11.aspnet\u002F09.libraries\u002F04.serilog",{"title":1147,"path":1148,"stem":1149},"CQRS та Mediator з MediatR в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmediatr","01.csharp\u002F11.aspnet\u002F09.libraries\u002F05.mediatr",{"title":1151,"path":1152,"stem":1153},"Відмовостійкість з Polly в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fpolly","01.csharp\u002F11.aspnet\u002F09.libraries\u002F06.polly",{"title":1155,"path":1156,"stem":1157},"Health Checks в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F09.libraries\u002F07.health-checks",{"title":1159,"path":1160,"stem":1161},"Feature Management та Feature Flags в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffeature-management","01.csharp\u002F11.aspnet\u002F09.libraries\u002F08.feature-management",{"title":1163,"path":1164,"stem":1165},"Відправка Email з FluentEmail в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-email","01.csharp\u002F11.aspnet\u002F09.libraries\u002F09.fluent-email",{"title":1167,"path":1168,"stem":1169},"Генерація PDF з QuestPDF в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fquest-pdf","01.csharp\u002F11.aspnet\u002F09.libraries\u002F10.quest-pdf",{"title":1171,"path":1172,"stem":1173},"Генерація тестових даних з Bogus в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fbogus","01.csharp\u002F11.aspnet\u002F09.libraries\u002F11.bogus",{"title":1175,"path":1176,"stem":1177},"Humanizer та Guard Clauses в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhumanizer-guard","01.csharp\u002F11.aspnet\u002F09.libraries\u002F12.humanizer-guard",{"title":1179,"path":1180,"stem":1181},"План модуля 10.libraries — Популярні бібліотеки ASP.NET","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fplan","01.csharp\u002F11.aspnet\u002F09.libraries\u002Fplan",{"title":1183,"icon":1184,"path":1185,"stem":1186,"children":1187,"page":59},"Razor Pages","i-lucide-layout-template","\u002Fcsharp\u002Faspnet\u002Frazor-pages","01.csharp\u002F11.aspnet\u002F10.razor-pages",[1188,1192,1196,1200,1204,1208],{"title":1189,"path":1190,"stem":1191},"Від Minimal API до Razor Pages: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ffrom-minimal-api","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F01.from-minimal-api",{"title":1193,"path":1194,"stem":1195},"PageModel: логіка сторінки Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fpage-model","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F02.page-model",{"title":1197,"path":1198,"stem":1199},"Razor синтаксис: шаблонізатор у .cshtml","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Frazor-syntax","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F03.razor-syntax",{"title":1201,"path":1202,"stem":1203},"Tag Helpers: типізований HTML","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ftag-helpers","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F04.tag-helpers",{"title":1205,"path":1206,"stem":1207},"Форми і валідація: повний цикл обробки даних","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fforms-validation","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F05.forms-validation",{"title":1209,"path":1210,"stem":1211},"Практичний проєкт: TaskManager на Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fproject-task-manager","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F06.project-task-manager",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":59},"ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc","01.csharp\u002F11.aspnet\u002F11.mvc",[1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1269,1273,1277,1281,1285],{"title":1218,"path":1219,"stem":1220},"Патерн MVC: архітектура, що змінила веб","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-pattern","01.csharp\u002F11.aspnet\u002F11.mvc\u002F01.mvc-pattern",{"title":1222,"path":1223,"stem":1224},"Від Razor Pages до MVC: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffrom-razor-pages","01.csharp\u002F11.aspnet\u002F11.mvc\u002F02.from-razor-pages",{"title":1226,"path":1227,"stem":1228},"Controllers та Actions: серце MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fcontrollers-actions","01.csharp\u002F11.aspnet\u002F11.mvc\u002F03.controllers-actions",{"title":1230,"path":1231,"stem":1232},"Маршрутизація в MVC: Convention vs Attribute Routing","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Frouting-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F04.routing-mvc",{"title":1234,"path":1235,"stem":1236},"Model Binding: від HTTP до C#","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmodel-binding","01.csharp\u002F11.aspnet\u002F11.mvc\u002F05.model-binding",{"title":1238,"path":1239,"stem":1240},"Views, ViewData, ViewBag, TempData і ViewModel","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fviews-viewdata-tempdata","01.csharp\u002F11.aspnet\u002F11.mvc\u002F06.views-viewdata-tempdata",{"title":1242,"path":1243,"stem":1244},"Filters: аспектно-орієнтоване програмування в MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffilters","01.csharp\u002F11.aspnet\u002F11.mvc\u002F07.filters",{"title":1246,"path":1247,"stem":1248},"Areas: структурування великих застосунків","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fareas","01.csharp\u002F11.aspnet\u002F11.mvc\u002F08.areas",{"title":1250,"path":1251,"stem":1252},"View Components: повторювані незалежні блоки UI","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fview-components","01.csharp\u002F11.aspnet\u002F11.mvc\u002F09.view-components",{"title":1254,"path":1255,"stem":1256},"Display та Editor Templates","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fdisplay-editor-templates","01.csharp\u002F11.aspnet\u002F11.mvc\u002F10.display-editor-templates",{"title":1258,"path":1259,"stem":1260},"Валідація: IValidatableObject та FluentValidation","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fvalidation-advanced","01.csharp\u002F11.aspnet\u002F11.mvc\u002F11.validation-advanced",{"title":1262,"path":1263,"stem":1264},"HTMX: інтерактивність через HTML-атрибути","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx","01.csharp\u002F11.aspnet\u002F11.mvc\u002F12.htmx",{"title":1266,"path":1267,"stem":1268},"HTMX у ASP.NET Core MVC: серверна інтеграція","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fajax-htmx-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F13.ajax-htmx-mvc",{"title":1270,"path":1271,"stem":1272},"Практичний проєкт: Каталог товарів з HTMX","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F14.htmx-project",{"title":1274,"path":1275,"stem":1276},"Завантаження та обробка файлів","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffile-upload","01.csharp\u002F11.aspnet\u002F11.mvc\u002F15.file-upload",{"title":1278,"path":1279,"stem":1280},"Глобалізація та Локалізація MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fglobalization-localization","01.csharp\u002F11.aspnet\u002F11.mvc\u002F16.globalization-localization",{"title":1282,"path":1283,"stem":1284},"Підсумковий проєкт: Блог-платформа","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F17.mvc-project",{"title":1286,"path":1287,"stem":1288},"План курсу: ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fplan","01.csharp\u002F11.aspnet\u002F11.mvc\u002Fplan",{"title":1290,"path":1291,"stem":1292,"children":1293,"page":59},"Web Api","\u002Fcsharp\u002Faspnet\u002Fweb-api","01.csharp\u002F11.aspnet\u002F12.web-api",[1294,1298,1302,1306,1310,1314,1318,1322,1326,1330,1334,1338,1342],{"title":1295,"path":1296,"stem":1297},"Від Minimal API до Controller-based API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffrom-minimal-api-to-controllers","01.csharp\u002F11.aspnet\u002F12.web-api\u002F01.from-minimal-api-to-controllers",{"title":1299,"path":1300,"stem":1301},"ControllerBase, ActionResult\u003CT> та Response Types","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontroller-base-actionresult","01.csharp\u002F11.aspnet\u002F12.web-api\u002F02.controller-base-actionresult",{"title":1303,"path":1304,"stem":1305},"Content Negotiation - JSON, XML та власні форматери","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontent-negotiation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F03.content-negotiation",{"title":1307,"path":1308,"stem":1309},"Версіонування API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-versioning","01.csharp\u002F11.aspnet\u002F12.web-api\u002F04.api-versioning",{"title":1311,"path":1312,"stem":1313},"ProblemDetails та структурована обробка помилок","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fproblemdetails-error-handling","01.csharp\u002F11.aspnet\u002F12.web-api\u002F05.problemdetails-error-handling",{"title":1315,"path":1316,"stem":1317},"Фільтри у Web API контексті","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffilters-for-api","01.csharp\u002F11.aspnet\u002F12.web-api\u002F06.filters-for-api",{"title":1319,"path":1320,"stem":1321},"Пагінація, фільтрація та сортування","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fpagination-filtering-sorting","01.csharp\u002F11.aspnet\u002F12.web-api\u002F07.pagination-filtering-sorting",{"title":1323,"path":1324,"stem":1325},"HATEOAS та Resource Expansion","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhateoas-resource-expansion","01.csharp\u002F11.aspnet\u002F12.web-api\u002F08.hateoas-resource-expansion",{"title":1327,"path":1328,"stem":1329},"Гібридна архітектура - Minimal API + Controllers","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fminimal-api-vs-controllers-hybrid","01.csharp\u002F11.aspnet\u002F12.web-api\u002F09.minimal-api-vs-controllers-hybrid",{"title":1331,"path":1332,"stem":1333},"Документація API - Swashbuckle, NSwag та генерація клієнтів","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-documentation-generation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F10.api-documentation-generation",{"title":1335,"path":1336,"stem":1337},"Health Checks та моніторинг API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhealth-checks-monitoring","01.csharp\u002F11.aspnet\u002F12.web-api\u002F11.health-checks-monitoring",{"title":1339,"path":1340,"stem":1341},"Підсумковий проєкт - Production-Ready REST API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fweb-api-project","01.csharp\u002F11.aspnet\u002F12.web-api\u002F12.web-api-project",{"title":1343,"path":1344,"stem":1345},"План курсу: ASP.NET Core Web API (Controllers)","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fplan","01.csharp\u002F11.aspnet\u002F12.web-api\u002Fplan",{"title":1347,"icon":1348,"path":1349,"stem":1350,"children":1351,"page":59},"Моніторинг","i-lucide-activity","\u002Fcsharp\u002Faspnet\u002Fmonitoring","01.csharp\u002F11.aspnet\u002F13.monitoring",[1352,1356,1360],{"title":1353,"path":1354,"stem":1355},"Спостережуваність: від console.log до production-систем","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fobservability-intro","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F01.observability-intro",{"title":1357,"path":1358,"stem":1359},"Health Checks: перший рівень observability","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F02.health-checks",{"title":1361,"path":1362,"stem":1363},"Вбудовані метрики .NET 10 та System.Diagnostics.Metrics","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fdotnet-metrics","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F03.dotnet-metrics",{"title":1365,"icon":1366,"path":1367,"stem":1368,"children":1369,"page":59},"Desktop UI","i-lucide-app-window","\u002Fcsharp\u002Fdesktop-ui","01.csharp\u002F12.desktop-ui",[1370,1374,1378,1382,1386,1390,1394,1398,1402,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454,1458,1462,1466,1470,1474,1478,1482,1486,1490,1494,1498,1502,1506,1510,1514,1518,1522,1526,1530,1534,1538,1542,1546,1550,1554,1558,1562,1566,1570,1574,1578,1582,1586,1590,1594,1598,1602,1606,1610,1614,1618,1622,1626,1630,1634,1638,1642,1646,1650],{"title":1371,"path":1372,"stem":1373},"Що таке десктопна розробка?","\u002Fcsharp\u002Fdesktop-ui\u002Fwhat-is-desktop-dev","01.csharp\u002F12.desktop-ui\u002F01.what-is-desktop-dev",{"title":1375,"path":1376,"stem":1377},"Архітектура WPF — як влаштований графічний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-architecture","01.csharp\u002F12.desktop-ui\u002F02.wpf-architecture",{"title":1379,"path":1380,"stem":1381},"Перший WPF-проєкт — від нуля до вікна","\u002Fcsharp\u002Fdesktop-ui\u002Ffirst-wpf-app","01.csharp\u002F12.desktop-ui\u002F03.first-wpf-app",{"title":1383,"path":1384,"stem":1385},"Перший Avalonia-проєкт: WPF для всіх платформ","\u002Fcsharp\u002Fdesktop-ui\u002F03a.first-avalonia-app","01.csharp\u002F12.desktop-ui\u002F03a.first-avalonia-app",{"title":1387,"path":1388,"stem":1389},"XAML: декларативний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-basics","01.csharp\u002F12.desktop-ui\u002F04.xaml-basics",{"title":1391,"path":1392,"stem":1393},"Fluent UI у WPF — сучасний дизайн Windows 11","\u002Fcsharp\u002Fdesktop-ui\u002F04a.wpf-fluent-ui","01.csharp\u002F12.desktop-ui\u002F04a.wpf-fluent-ui",{"title":1395,"path":1396,"stem":1397},"WPF UI — сучасна бібліотека Fluent контролів","\u002Fcsharp\u002Fdesktop-ui\u002F04b.wpf-ui-library","01.csharp\u002F12.desktop-ui\u002F04b.wpf-ui-library",{"title":1399,"path":1400,"stem":1401},"HandyControl — велика бібліотека UI контролів для WPF","\u002Fcsharp\u002Fdesktop-ui\u002F04c.handycontrol-library","01.csharp\u002F12.desktop-ui\u002F04c.handycontrol-library",{"title":1403,"path":1404,"stem":1405},"Простори імен та ресурси XAML","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-namespaces-resources","01.csharp\u002F12.desktop-ui\u002F05.xaml-namespaces-resources",{"title":1407,"path":1408,"stem":1409},"XAML в Avalonia: ключові відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F05a.avalonia-xaml-differences","01.csharp\u002F12.desktop-ui\u002F05a.avalonia-xaml-differences",{"title":1411,"path":1412,"stem":1413},"Розширення розмітки XAML (Markup Extensions)","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-markup-extensions","01.csharp\u002F12.desktop-ui\u002F06.xaml-markup-extensions",{"title":1415,"path":1416,"stem":1417},"Панелі Layout: StackPanel, WrapPanel, DockPanel","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part1","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part1",{"title":1419,"path":1420,"stem":1421},"Grid, Canvas, UniformGrid","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part2","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part2",{"title":1423,"path":1424,"stem":1425},"Просунуті техніки Layout","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-advanced","01.csharp\u002F12.desktop-ui\u002F08.layout-advanced",{"title":1427,"path":1428,"stem":1429},"Адаптивний Layout та найкращі практики","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-responsive","01.csharp\u002F12.desktop-ui\u002F09.layout-responsive",{"title":1431,"path":1432,"stem":1433},"Layout в Avalonia: відмінності та нові можливості","\u002Fcsharp\u002Fdesktop-ui\u002F09a.layout-avalonia","01.csharp\u002F12.desktop-ui\u002F09a.layout-avalonia",{"title":1435,"path":1436,"stem":1437},"Button, Image, ProgressBar та інші базові контроли","\u002Fcsharp\u002Fdesktop-ui\u002Fbasic-controls","01.csharp\u002F12.desktop-ui\u002F10.basic-controls",{"title":1439,"path":1440,"stem":1441},"Контроли в Avalonia: відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F10a.controls-avalonia","01.csharp\u002F12.desktop-ui\u002F10a.controls-avalonia",{"title":1443,"path":1444,"stem":1445},"Текстові контроли — TextBlock, TextBox, RichTextBox","\u002Fcsharp\u002Fdesktop-ui\u002Ftext-controls","01.csharp\u002F12.desktop-ui\u002F11.text-controls",{"title":1447,"path":1448,"stem":1449},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","\u002Fcsharp\u002Fdesktop-ui\u002Fselection-controls","01.csharp\u002F12.desktop-ui\u002F12.selection-controls",{"title":1451,"path":1452,"stem":1453},"Content Model — GroupBox, Expander, TabControl, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fcontent-controls","01.csharp\u002F12.desktop-ui\u002F13.content-controls",{"title":1455,"path":1456,"stem":1457},"UI\u002FUX принципи десктопних застосунків","\u002Fcsharp\u002Fdesktop-ui\u002F13a.ui-ux-principles","01.csharp\u002F12.desktop-ui\u002F13a.ui-ux-principles",{"title":1459,"path":1460,"stem":1461},"Dependency Properties — Концепція та Value Resolution","\u002Fcsharp\u002Fdesktop-ui\u002Fdependency-properties-part1","01.csharp\u002F12.desktop-ui\u002F14.dependency-properties-part1",{"title":1463,"path":1464,"stem":1465},"Avalonia Property System — StyledProperty та DirectProperty","\u002Fcsharp\u002Fdesktop-ui\u002F14a.avalonia-property-system","01.csharp\u002F12.desktop-ui\u002F14a.avalonia-property-system",{"title":1467,"path":1468,"stem":1469},"Attached Properties — Властивості без меж","\u002Fcsharp\u002Fdesktop-ui\u002Fattached-properties","01.csharp\u002F12.desktop-ui\u002F15.attached-properties",{"title":1471,"path":1472,"stem":1473},"Routed Events — Маршрутизація подій у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Frouted-events","01.csharp\u002F12.desktop-ui\u002F16.routed-events",{"title":1475,"path":1476,"stem":1477},"Data Binding — Від Code-Behind до Декларативності","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part1","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part1",{"title":1479,"path":1480,"stem":1481},"INotifyPropertyChanged — Живе оновлення UI","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part2","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part2",{"title":1483,"path":1484,"stem":1485},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","\u002Fcsharp\u002Fdesktop-ui\u002F17a.avalonia-compiled-bindings","01.csharp\u002F12.desktop-ui\u002F17a.avalonia-compiled-bindings",{"title":1487,"path":1488,"stem":1489},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-advanced","01.csharp\u002F12.desktop-ui\u002F18.data-binding-advanced",{"title":1491,"path":1492,"stem":1493},"Value Converters — Перетворення типів даних у Data Binding","\u002Fcsharp\u002Fdesktop-ui\u002Fvalue-converters","01.csharp\u002F12.desktop-ui\u002F19.value-converters",{"title":1495,"path":1496,"stem":1497},"Data Templates — Візуалізація об'єктів у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-templates","01.csharp\u002F12.desktop-ui\u002F20.data-templates",{"title":1499,"path":1500,"stem":1501},"Collections Binding Part 1 — ObservableCollection та ItemsControl","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part1","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part1",{"title":1503,"path":1504,"stem":1505},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part2","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part2",{"title":1507,"path":1508,"stem":1509},"MVVM Pattern — Від Spaghetti Code до архітектури","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-pattern","01.csharp\u002F12.desktop-ui\u002F22.mvvm-pattern",{"title":1511,"path":1512,"stem":1513},"ViewModel Implementation — Від BaseViewModel до валідації","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-implementation","01.csharp\u002F12.desktop-ui\u002F23.viewmodel-implementation",{"title":1515,"path":1516,"stem":1517},"Commands — Від event handlers до декларативних команд","\u002Fcsharp\u002Fdesktop-ui\u002Fcommands","01.csharp\u002F12.desktop-ui\u002F24.commands",{"title":1519,"path":1520,"stem":1521},"MVVM Toolkit — MVVM без boilerplate через Source Generators","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-toolkit","01.csharp\u002F12.desktop-ui\u002F25.mvvm-toolkit",{"title":1523,"path":1524,"stem":1525},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","\u002Fcsharp\u002Fdesktop-ui\u002Fmessenger-pattern","01.csharp\u002F12.desktop-ui\u002F26.messenger-pattern",{"title":1527,"path":1528,"stem":1529},"Стилі WPF — CSS для десктопу","\u002Fcsharp\u002Fdesktop-ui\u002Fstyles-basics","01.csharp\u002F12.desktop-ui\u002F27.styles-basics",{"title":1531,"path":1532,"stem":1533},"CSS-like стилі Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F27a.avalonia-css-styling","01.csharp\u002F12.desktop-ui\u002F27a.avalonia-css-styling",{"title":1535,"path":1536,"stem":1537},"Control Templates — Частина 1. Концепція та TemplateBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part1","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part1",{"title":1539,"path":1540,"stem":1541},"Control Templates — Частина 2. Named Parts та ContentPresenter","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part2","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part2",{"title":1543,"path":1544,"stem":1545},"Control Themes в Avalonia — нова ера стилізації","\u002Fcsharp\u002Fdesktop-ui\u002F28a.avalonia-control-themes","01.csharp\u002F12.desktop-ui\u002F28a.avalonia-control-themes",{"title":1547,"path":1548,"stem":1549},"Triggers та Visual State Manager у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Ftriggers-visual-states","01.csharp\u002F12.desktop-ui\u002F29.triggers-visual-states",{"title":1551,"path":1552,"stem":1553},"Pseudo-classes в Avalonia — замість WPF Triggers","\u002Fcsharp\u002Fdesktop-ui\u002F29a.avalonia-pseudo-classes","01.csharp\u002F12.desktop-ui\u002F29a.avalonia-pseudo-classes",{"title":1555,"path":1556,"stem":1557},"Теми та ресурсні словники у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fresources-themes","01.csharp\u002F12.desktop-ui\u002F30.resources-themes",{"title":1559,"path":1560,"stem":1561},"Avalonia Themes — Fluent Design та система тематизації","\u002Fcsharp\u002Fdesktop-ui\u002F30a.avalonia-themes-fluent","01.csharp\u002F12.desktop-ui\u002F30a.avalonia-themes-fluent",{"title":1563,"path":1564,"stem":1565},"Контроли колекцій — глибоке занурення","\u002Fcsharp\u002Fdesktop-ui\u002Fcollection-controls","01.csharp\u002F12.desktop-ui\u002F31.collection-controls",{"title":1567,"path":1568,"stem":1569},"DataGrid — колонки та базове відображення","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part1","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part1",{"title":1571,"path":1572,"stem":1573},"DataGrid — сортування, фільтрація, редагування","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part2","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part2",{"title":1575,"path":1576,"stem":1577},"TreeView та GridView","\u002Fcsharp\u002Fdesktop-ui\u002Ftreeview-listview","01.csharp\u002F12.desktop-ui\u002F33.treeview-listview",{"title":1579,"path":1580,"stem":1581},"Меню, Toolbar, ContextMenu, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fmenus-toolbars","01.csharp\u002F12.desktop-ui\u002F34.menus-toolbars",{"title":1583,"path":1584,"stem":1585},"Навігація та керування вікнами. Частина 1: вікна та сторінки","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part1","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part1",{"title":1587,"path":1588,"stem":1589},"Навігація та керування вікнами. Частина 2: MVVM-навігація","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part2","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part2",{"title":1591,"path":1592,"stem":1593},"Avalonia — Навігація та діалоги","\u002Fcsharp\u002Fdesktop-ui\u002F35a.avalonia-navigation-dialogs","01.csharp\u002F12.desktop-ui\u002F35a.avalonia-navigation-dialogs",{"title":1595,"path":1596,"stem":1597},"Діалоги та File Pickers у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdialogs-file-pickers","01.csharp\u002F12.desktop-ui\u002F36.dialogs-file-pickers",{"title":1599,"path":1600,"stem":1601},"UserControl: компонентний підхід у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fuser-controls","01.csharp\u002F12.desktop-ui\u002F37.user-controls",{"title":1603,"path":1604,"stem":1605},"Custom Controls: Lookless Controls у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fcustom-controls","01.csharp\u002F12.desktop-ui\u002F38.custom-controls",{"title":1607,"path":1608,"stem":1609},"Avalonia TemplatedControl — Lookless Controls","\u002Fcsharp\u002Fdesktop-ui\u002F38a.avalonia-templated-controls","01.csharp\u002F12.desktop-ui\u002F38a.avalonia-templated-controls",{"title":1611,"path":1612,"stem":1613},"Анімації у WPF: Storyboard та Easing Functions","\u002Fcsharp\u002Fdesktop-ui\u002Fanimations-transitions","01.csharp\u002F12.desktop-ui\u002F39.animations-transitions",{"title":1615,"path":1616,"stem":1617},"Анімації в Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F39a.avalonia-animations","01.csharp\u002F12.desktop-ui\u002F39a.avalonia-animations",{"title":1619,"path":1620,"stem":1621},"2D Графіка та Мультимедіа у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fmedia-graphics","01.csharp\u002F12.desktop-ui\u002F40.media-graphics",{"title":1623,"path":1624,"stem":1625},"Dependency Injection у WPF та Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Fdi-integration","01.csharp\u002F12.desktop-ui\u002F41.di-integration",{"title":1627,"path":1628,"stem":1629},"SQLite та EF Core у десктопних додатках","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part1","01.csharp\u002F12.desktop-ui\u002F42.data-persistence-part1",{"title":1631,"path":1632,"stem":1633},"Repository Pattern та Unit of Work","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part2","01.csharp\u002F12.desktop-ui\u002F43.data-persistence-part2",{"title":1635,"path":1636,"stem":1637},"Тестування ViewModels","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-testing","01.csharp\u002F12.desktop-ui\u002F44.viewmodel-testing",{"title":1639,"path":1640,"stem":1641},"Avalonia Headless Testing — тестування UI без вікон","\u002Fcsharp\u002Fdesktop-ui\u002F44a.avalonia-headless-testing","01.csharp\u002F12.desktop-ui\u002F44a.avalonia-headless-testing",{"title":1643,"path":1644,"stem":1645},"Кросплатформна розробка з Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-cross-platform","01.csharp\u002F12.desktop-ui\u002F45.avalonia-cross-platform",{"title":1647,"path":1648,"stem":1649},"Пакування та розгортання Avalonia додатків","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F46.avalonia-packaging-deployment",{"title":1651,"path":1652,"stem":1653},"Розгортання WPF застосунків","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F47.wpf-packaging-deployment",{"title":1655,"icon":658,"path":1656,"stem":1657,"children":1658,"page":59},"Network Programming","\u002Fcsharp\u002Fnetwork-programming","01.csharp\u002F13.network-programming",[1659,1663,1667,1671,1675,1679,1683,1687,1691,1695,1699],{"title":1660,"path":1661,"stem":1662},"Основи комп'ютерних мереж","\u002Fcsharp\u002Fnetwork-programming\u002Ffoundations","01.csharp\u002F13.network-programming\u002F01.foundations",{"title":1664,"path":1665,"stem":1666},"Модель OSI та стек TCP\u002FIP","\u002Fcsharp\u002Fnetwork-programming\u002Fosi-model","01.csharp\u002F13.network-programming\u002F02.osi-model",{"title":1668,"path":1669,"stem":1670},"IP-протокол та адресація","\u002Fcsharp\u002Fnetwork-programming\u002Fip-addressing","01.csharp\u002F13.network-programming\u002F03.ip-addressing",{"title":1672,"path":1673,"stem":1674},"UDP — протокол без з'єднання","\u002Fcsharp\u002Fnetwork-programming\u002Fudp","01.csharp\u002F13.network-programming\u002F05.udp",{"title":1676,"path":1677,"stem":1678},"UDP Broadcast та Multicast","\u002Fcsharp\u002Fnetwork-programming\u002Fudp-broadcast-multicast","01.csharp\u002F13.network-programming\u002F06.udp-broadcast-multicast",{"title":1680,"path":1681,"stem":1682},"HTTP — протокол вебу","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-fundamentals","01.csharp\u002F13.network-programming\u002F07.http-fundamentals",{"title":1684,"path":1685,"stem":1686},"HttpListener — вбудований HTTP-сервер .NET","\u002Fcsharp\u002Fnetwork-programming\u002F07a.http-listener","01.csharp\u002F13.network-programming\u002F07a.http-listener",{"title":1688,"path":1689,"stem":1690},"HTTP Advanced — cookies, аутентифікація та HTTPS","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-advanced","01.csharp\u002F13.network-programming\u002F08.http-advanced",{"title":1692,"path":1693,"stem":1694},"SMTP та протоколи електронної пошти","\u002Fcsharp\u002Fnetwork-programming\u002Fsmtp","01.csharp\u002F13.network-programming\u002F09.smtp",{"title":1696,"path":1697,"stem":1698},"WebSocket — повнодуплексний протокол реального часу","\u002Fcsharp\u002Fnetwork-programming\u002Fwebsockets","01.csharp\u002F13.network-programming\u002F10.websockets",{"title":1700,"path":1701,"stem":1702},"TLS\u002FSSL — криптографічний захист мережевих з'єднань","\u002Fcsharp\u002Fnetwork-programming\u002Ftls-ssl","01.csharp\u002F13.network-programming\u002F11.tls-ssl",{"title":1704,"path":1705,"stem":1706},"C# & .NET: The Ultimate Roadmap","\u002Fcsharp\u002Froadmap","01.csharp\u002Froadmap",{"title":1708,"icon":1709,"path":1710,"stem":1711,"children":1712,"page":59},"C++","i-devicon-cplusplus","\u002Fcpp","02.cpp",[1713,1717,1721,1725,1729,1733,1737,1741,1745,1748,1752,1756,1760,1764,1768,1772,1776,1780,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892,1896,1900,1904,1908],{"title":1714,"path":1715,"stem":1716},"Вступ у програмування та алгоритми","\u002Fcpp\u002Fintro-algorithms","02.cpp\u002F01.intro-algorithms",{"title":1718,"path":1719,"stem":1720},"Code Style: угоди про оформлення коду","\u002Fcpp\u002Fcode-style","02.cpp\u002F02.code-style",{"title":1722,"path":1723,"stem":1724},"Середовище розробки та перший проєкт","\u002Fcpp\u002Fide-setup","02.cpp\u002F03.ide-setup",{"title":1726,"path":1727,"stem":1728},"Вивід даних на екран","\u002Fcpp\u002Fdata-output","02.cpp\u002F04.data-output",{"title":1730,"path":1731,"stem":1732},"Типи даних, змінні та константи","\u002Fcpp\u002Fdata-types-variables","02.cpp\u002F05.data-types-variables",{"title":1734,"path":1735,"stem":1736},"Ввід даних з клавіатури","\u002Fcpp\u002Fdata-input","02.cpp\u002F06.data-input",{"title":1738,"path":1739,"stem":1740},"Оператори, перетворення типів та логічні операції","\u002Fcpp\u002Foperators-type-conversion","02.cpp\u002F07.operators-type-conversion",{"title":1742,"path":1743,"stem":1744},"Цикли","\u002Fcpp\u002Floops","02.cpp\u002F08.loops",{"title":32,"path":1746,"stem":1747},"\u002Fcpp\u002Farrays","02.cpp\u002F09.arrays",{"title":1749,"path":1750,"stem":1751},"Алгоритми сортування та аналіз складності","\u002Fcpp\u002Fsorting","02.cpp\u002F10.sorting",{"title":1753,"path":1754,"stem":1755},"Алгоритми пошуку","\u002Fcpp\u002Fsearching","02.cpp\u002F11.searching",{"title":1757,"path":1758,"stem":1759},"Функції: основи","\u002Fcpp\u002Ffunctions-basics","02.cpp\u002F12.functions-basics",{"title":1761,"path":1762,"stem":1763},"Функції: прототипи, область видимості та додаткові можливості","\u002Fcpp\u002Ffunctions-scope","02.cpp\u002F13.functions-scope",{"title":1765,"path":1766,"stem":1767},"Функції: перевантаження та шаблони","\u002Fcpp\u002Ffunctions-overloading-templates","02.cpp\u002F14.functions-overloading-templates",{"title":1769,"path":1770,"stem":1771},"Вказівники: основи","\u002Fcpp\u002Fpointers-basics","02.cpp\u002F15.pointers-basics",{"title":1773,"path":1774,"stem":1775},"Посилання (References)","\u002Fcpp\u002Freferences","02.cpp\u002F16.references",{"title":1777,"path":1778,"stem":1779},"Вказівники, const і масиви","\u002Fcpp\u002Fpointers-const-arrays","02.cpp\u002F17.pointers-const-arrays",{"title":1781,"path":1782,"stem":1783},"Адресна арифметика","\u002Fcpp\u002Fpointer-arithmetic","02.cpp\u002F18.pointer-arithmetic",{"title":1785,"path":1786,"stem":1787},"Динамічна пам'ять","\u002Fcpp\u002Fdynamic-memory","02.cpp\u002F19.dynamic-memory",{"title":1789,"path":1790,"stem":1791},"Вказівники типу void","\u002Fcpp\u002Fvoid-pointers","02.cpp\u002F20.void-pointers",{"title":1793,"path":1794,"stem":1795},"Вказівники на вказівники","\u002Fcpp\u002Fpointers-to-pointers","02.cpp\u002F21.pointers-to-pointers",{"title":1797,"path":1798,"stem":1799},"Оператор доступу до членів через вказівник (->)","\u002Fcpp\u002Fmember-access-operator","02.cpp\u002F22.member-access-operator",{"title":1801,"path":1802,"stem":1803},"Цикл for-each (Range-based for)","\u002Fcpp\u002Fforeach-loop","02.cpp\u002F23.foreach-loop",{"title":1805,"path":1806,"stem":1807},"Вказівники на функції","\u002Fcpp\u002Ffunction-pointers","02.cpp\u002F24.function-pointers",{"title":1809,"path":1810,"stem":1811},"Лямбда-вирази","\u002Fcpp\u002Flambdas","02.cpp\u002F25.lambdas",{"title":1813,"path":1814,"stem":1815},"Лямбда-захоплення","\u002Fcpp\u002Flambda-captures","02.cpp\u002F26.lambda-captures",{"title":1817,"path":1818,"stem":1819},"Еліпсис","\u002Fcpp\u002Fellipsis","02.cpp\u002F27.ellipsis",{"title":1821,"path":1822,"stem":1823},"Безпечні альтернативи еліпсису","\u002Fcpp\u002F27a.ellipsis","02.cpp\u002F27a.ellipsis",{"title":1825,"path":1826,"stem":1827},"Аргументи командного рядка","\u002Fcpp\u002Fcommand-line-arguments","02.cpp\u002F28.command-line-arguments",{"title":1829,"path":1830,"stem":1831},"Перерахування (enum)","\u002Fcpp\u002Fenum","02.cpp\u002F29.enum",{"title":1833,"path":1834,"stem":1835},"Класи-перерахування (enum class)","\u002Fcpp\u002Fenum-class","02.cpp\u002F30.enum-class",{"title":1837,"path":1838,"stem":1839},"Псевдоніми типів (typedef і using)","\u002Fcpp\u002Ftype-aliases","02.cpp\u002F31.type-aliases",{"title":1841,"path":1842,"stem":1843},"Системи числення та двійкова арифметика","\u002Fcpp\u002Fnumber-systems","02.cpp\u002F32.number-systems",{"title":1845,"path":1846,"stem":1847},"Структури (struct): агрегування даних","\u002Fcpp\u002Fstruct","02.cpp\u002F33.struct",{"title":1849,"path":1850,"stem":1851},"Структури у функціях","\u002Fcpp\u002Fstruct-functions","02.cpp\u002F34.struct-functions",{"title":1853,"path":1854,"stem":1855},"Масиви структур і вкладені структури","\u002Fcpp\u002Fstruct-arrays","02.cpp\u002F35.struct-arrays",{"title":1857,"path":1858,"stem":1859},"Патерни struct та межі застосування","\u002Fcpp\u002Fstruct-patterns","02.cpp\u002F36.struct-patterns",{"title":1861,"path":1862,"stem":1863},"Символи та таблиця ASCII","\u002Fcpp\u002Fascii-characters","02.cpp\u002F37.ascii-characters",{"title":1865,"path":1866,"stem":1867},"Unicode та кодування UTF","\u002Fcpp\u002Funicode-utf","02.cpp\u002F38.unicode-utf",{"title":1869,"path":1870,"stem":1871},"C-style рядки","\u002Fcpp\u002Fc-strings","02.cpp\u002F39.c-strings",{"title":1873,"path":1874,"stem":1875},"Вступ до std::string","\u002Fcpp\u002Fstd-string-intro","02.cpp\u002F40.std-string-intro",{"title":1877,"path":1878,"stem":1879},"Довжина, ємність та доступ до символів std::string","\u002Fcpp\u002Fstd-string-capacity-access","02.cpp\u002F41.std-string-capacity-access",{"title":1881,"path":1882,"stem":1883},"Модифікація std::string: присвоювання, додавання, вставка, видалення та заміна","\u002Fcpp\u002Fstd-string-modification","02.cpp\u002F42.std-string-modification",{"title":1885,"path":1886,"stem":1887},"Пошук у std::string: find, npos та практичні патерни","\u002Fcpp\u002Fstd-string-search","02.cpp\u002F43.std-string-search",{"title":1889,"path":1890,"stem":1891},"std::string_view: невласницький погляд на рядок без копіювання","\u002Fcpp\u002Fstd-string-view","02.cpp\u002F44.std-string-view",{"title":1893,"path":1894,"stem":1895},"Об'єднання (union): один блок пам'яті, кілька інтерпретацій","\u002Fcpp\u002Funion","02.cpp\u002F45.union",{"title":1897,"path":1898,"stem":1899},"Організація коду: файли, препроцесор, простори імен","\u002Fcpp\u002Fmultifile-programs","02.cpp\u002F46.multifile-programs",{"title":1901,"path":1902,"stem":1903},"Робота з файлами: C-стиль (stdio.h)","\u002Fcpp\u002Fc-style-files","02.cpp\u002F47.c-style-files",{"title":1905,"path":1906,"stem":1907},"Робота з файлами: C++-стиль (fstream)","\u002Fcpp\u002Fcpp-style-files","02.cpp\u002F48.cpp-style-files",{"title":1909,"path":1910,"stem":1911},"План навчання: Курс C++ — Продовження (Статті 29–60+)","\u002Fcpp\u002Fcurriculum-plan","02.cpp\u002Fcurriculum-plan",{"title":1913,"icon":1914,"path":1915,"stem":1916,"children":1917,"page":59},"JavaScript","i-devicon-javascript","\u002Fjavascript","03.javascript",[1918,1944,1998,2020,2324,2362],{"title":1919,"icon":1920,"path":1921,"stem":1922,"children":1923,"page":59},"Events","i-lucide-mouse-pointer-click","\u002Fjavascript\u002Fevents","03.javascript\u002F01.events",[1924,1928,1932,1936,1940],{"title":1925,"path":1926,"stem":1927},"Вступ до подій браузера","\u002Fjavascript\u002Fevents\u002Fintro","03.javascript\u002F01.events\u002F01.intro",{"title":1929,"path":1930,"stem":1931},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","\u002Fjavascript\u002Fevents\u002Fbubbling-capturing","03.javascript\u002F01.events\u002F02.bubbling-capturing",{"title":1933,"path":1934,"stem":1935},"Делегування подій (Event Delegation)","\u002Fjavascript\u002Fevents\u002Fdelegate-events","03.javascript\u002F01.events\u002F03.delegate-events",{"title":1937,"path":1938,"stem":1939},"Типові дії браузера та preventDefault()","\u002Fjavascript\u002Fevents\u002Fprevent-default","03.javascript\u002F01.events\u002F04.prevent-default",{"title":1941,"path":1942,"stem":1943},"Запуск користувацьких подій (Custom Events)","\u002Fjavascript\u002Fevents\u002Fcustom-events","03.javascript\u002F01.events\u002F05.custom-events",{"title":1945,"icon":1946,"path":1947,"stem":1948,"children":1949,"page":59},"Network","i-lucide-globe","\u002Fjavascript\u002Fnetwork","03.javascript\u002F02.network",[1950,1954,1958,1962,1966,1970,1974,1978,1982,1986,1990,1994],{"title":1951,"path":1952,"stem":1953},"Fetch API - Сучасний підхід до HTTP-запитів","\u002Fjavascript\u002Fnetwork\u002F01-fetch-api","03.javascript\u002F02.network\u002F01-fetch-api",{"title":1955,"path":1956,"stem":1957},"FormData - Робота з формами та файлами","\u002Fjavascript\u002Fnetwork\u002F02-formdata","03.javascript\u002F02.network\u002F02-formdata",{"title":1959,"path":1960,"stem":1961},"Відстеження прогресу завантаження","\u002Fjavascript\u002Fnetwork\u002F03-download-progress","03.javascript\u002F02.network\u002F03-download-progress",{"title":1963,"path":1964,"stem":1965},"Переривання fetch-запитів","\u002Fjavascript\u002Fnetwork\u002F04-abort-requests","03.javascript\u002F02.network\u002F04-abort-requests",{"title":1967,"path":1968,"stem":1969},"CORS - Запити між різними джерелами","\u002Fjavascript\u002Fnetwork\u002F05-cors","03.javascript\u002F02.network\u002F05-cors",{"title":1971,"path":1972,"stem":1973},"Fetch API - Повний довідник опцій","\u002Fjavascript\u002Fnetwork\u002F06-fetch-options","03.javascript\u002F02.network\u002F06-fetch-options",{"title":1975,"path":1976,"stem":1977},"URL Objects - Робота з посиланнями","\u002Fjavascript\u002Fnetwork\u002F07-url-objects","03.javascript\u002F02.network\u002F07-url-objects",{"title":1979,"path":1980,"stem":1981},"XMLHttpRequest - AJAX та низькорівневі запити","\u002Fjavascript\u002Fnetwork\u002F08-xmlhttprequest","03.javascript\u002F02.network\u002F08-xmlhttprequest",{"title":1983,"path":1984,"stem":1985},"Відновлюване завантаження файлів","\u002Fjavascript\u002Fnetwork\u002F09-resumable-upload","03.javascript\u002F02.network\u002F09-resumable-upload",{"title":1987,"path":1988,"stem":1989},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","\u002Fjavascript\u002Fnetwork\u002F10-cookies","03.javascript\u002F02.network\u002F10-cookies",{"title":1991,"path":1992,"stem":1993},"js-cookie: Керування Cookies без Болю","\u002Fjavascript\u002Fnetwork\u002F11-js-cookie","03.javascript\u002F02.network\u002F11-js-cookie",{"title":1995,"path":1996,"stem":1997},"Axios: Потужний HTTP-клієнт для JavaScript","\u002Fjavascript\u002Fnetwork\u002F12-axios","03.javascript\u002F02.network\u002F12-axios",{"title":1999,"icon":2000,"path":2001,"stem":2002,"children":2003,"page":59},"Bom","i-lucide-monitor","\u002Fjavascript\u002Fbom","03.javascript\u002F03.bom",[2004,2008,2012,2016],{"title":2005,"path":2006,"stem":2007},"LocalStorage, SessionStorage та patterns збереження даних","\u002Fjavascript\u002Fbom\u002F01-localstorage","03.javascript\u002F03.bom\u002F01-localstorage",{"title":2009,"path":2010,"stem":2011},"Location Object - Керування адресою сторінки","\u002Fjavascript\u002Fbom\u002F02-location-object","03.javascript\u002F03.bom\u002F02-location-object",{"title":2013,"path":2014,"stem":2015},"History API - Керування історією браузера","\u002Fjavascript\u002Fbom\u002F03-history-api","03.javascript\u002F03.bom\u002F03-history-api",{"title":2017,"path":2018,"stem":2019},"Navigator Object - Ідентифікація та Можливості Пристрою","\u002Fjavascript\u002Fbom\u002F04-navigator-object","03.javascript\u002F03.bom\u002F04-navigator-object",{"title":2021,"icon":2022,"path":2023,"stem":2024,"children":2025},"React","i-devicon-react","\u002Fjavascript\u002Freact","03.javascript\u002F04.react\u002Findex",[2026,2027,2031,2035,2039,2043,2106,2141,2293],{"title":2021,"path":2023,"stem":2024},{"title":2028,"path":2029,"stem":2030},"Робота з Формами в React","\u002Fjavascript\u002Freact\u002Freact-forms","03.javascript\u002F04.react\u002F01.react-forms",{"title":2032,"path":2033,"stem":2034},"React Hook Form: Професійна Робота з Формами","\u002Fjavascript\u002Freact\u002Freact-hook-form","03.javascript\u002F04.react\u002F02.react-hook-form",{"title":2036,"path":2037,"stem":2038},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","\u002Fjavascript\u002Freact\u002Freact-hook-form-new","03.javascript\u002F04.react\u002F02.react-hook-form-new",{"title":2040,"path":2041,"stem":2042},"Axios та React: Професійна Архітектура Запитів","\u002Fjavascript\u002Freact\u002Fdata-fetching-axios","03.javascript\u002F04.react\u002F03.data-fetching-axios",{"title":2044,"icon":132,"path":2045,"stem":2046,"children":2047},"Tanstack Query","\u002Fjavascript\u002Freact\u002Ftanstack-query","03.javascript\u002F04.react\u002F04.tanstack-query\u002Findex",[2048,2050,2054,2058,2062,2066,2070,2074,2078,2082,2086,2090,2094,2098,2102],{"title":2049,"path":2045,"stem":2046},"TanStack Query: Майстерність Керування Станом Сервера",{"title":2051,"path":2052,"stem":2053},"Парадигма Server State: Чому useEffect недостатньо","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-state-paradigm","03.javascript\u002F04.react\u002F04.tanstack-query\u002F01.server-state-paradigm",{"title":2055,"path":2056,"stem":2057},"Встановлення та Налаштування: Фундамент","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Finstallation-and-devtools","03.javascript\u002F04.react\u002F04.tanstack-query\u002F02.installation-and-devtools",{"title":2059,"path":2060,"stem":2061},"Основи Запитів та Магія Ключів","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fquery-basics-and-keys","03.javascript\u002F04.react\u002F04.tanstack-query\u002F03.query-basics-and-keys",{"title":2063,"path":2064,"stem":2065},"Синхронізація Даних: Життєвий Цикл Запиту","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fdata-synchronization","03.javascript\u002F04.react\u002F04.tanstack-query\u002F04.data-synchronization",{"title":2067,"path":2068,"stem":2069},"Мутації та Інвалідація: Зміна Даних","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fmutations-and-invalidation","03.javascript\u002F04.react\u002F04.tanstack-query\u002F05.mutations-and-invalidation",{"title":2071,"path":2072,"stem":2073},"Оптимістичні Оновлення: Швидше за Світло","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Foptimistic-updates","03.javascript\u002F04.react\u002F04.tanstack-query\u002F06.optimistic-updates",{"title":2075,"path":2076,"stem":2077},"Пагінація та Infinite Scroll","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fpagination-and-load-more","03.javascript\u002F04.react\u002F04.tanstack-query\u002F07.pagination-and-load-more",{"title":2079,"path":2080,"stem":2081},"Просунуті Патерни та Оптимізація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F04.tanstack-query\u002F08.advanced-patterns",{"title":2083,"path":2084,"stem":2085},"Архітектура та Best Practices","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Farchitecture-and-best-practices","03.javascript\u002F04.react\u002F04.tanstack-query\u002F09.architecture-and-best-practices",{"title":2087,"path":2088,"stem":2089},"Server-Side Rendering (SSR) та Гідратація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-side-rendering","03.javascript\u002F04.react\u002F04.tanstack-query\u002F10.server-side-rendering",{"title":2091,"path":2092,"stem":2093},"Стратегії Тестування","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Ftesting-strategies","03.javascript\u002F04.react\u002F04.tanstack-query\u002F11.testing-strategies",{"title":2095,"path":2096,"stem":2097},"Аутентифікація та Обробка Помилок","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fauthentication-and-errors","03.javascript\u002F04.react\u002F04.tanstack-query\u002F12.authentication-and-errors",{"title":2099,"path":2100,"stem":2101},"React Suspense та Майбутнє","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Freact-suspense","03.javascript\u002F04.react\u002F04.tanstack-query\u002F13.react-suspense",{"title":2103,"path":2104,"stem":2105},"Глибоке Занурення в Продуктивність","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fperformance-deep-dive","03.javascript\u002F04.react\u002F04.tanstack-query\u002F14.performance-deep-dive",{"title":2107,"icon":2022,"path":2108,"stem":2109,"children":2110},"React Router","\u002Fjavascript\u002Freact\u002Freact-router","03.javascript\u002F04.react\u002F05.react-router\u002Findex",[2111,2113,2117,2121,2125,2129,2133,2137],{"title":2112,"path":2108,"stem":2109},"React Router: Навігаційна система сучасного вебу",{"title":2114,"path":2115,"stem":2116},"Налаштування та Базовий Роутинг","\u002Fjavascript\u002Freact\u002Freact-router\u002Fsetup-and-basic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F01.setup-and-basic-routing",{"title":2118,"path":2119,"stem":2120},"Динамічна Навігація","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnavigation-and-links","03.javascript\u002F04.react\u002F05.react-router\u002F02.navigation-and-links",{"title":2122,"path":2123,"stem":2124},"Вкладені Маршрути та Макети","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnested-routes-and-layouts","03.javascript\u002F04.react\u002F05.react-router\u002F03.nested-routes-and-layouts",{"title":2126,"path":2127,"stem":2128},"Динамічні Маршрути та Параметри","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdynamic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F04.dynamic-routing",{"title":2130,"path":2131,"stem":2132},"Data APIs: Loaders та Actions","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdata-loading","03.javascript\u002F04.react\u002F05.react-router\u002F05.data-loading",{"title":2134,"path":2135,"stem":2136},"Просунуті Патерни","\u002Fjavascript\u002Freact\u002Freact-router\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F05.react-router\u002F06.advanced-patterns",{"title":2138,"path":2139,"stem":2140},"Legacy Routing: Компонентний підхід","\u002Fjavascript\u002Freact\u002Freact-router\u002Flegacy-routing","03.javascript\u002F04.react\u002F05.react-router\u002F07.legacy-routing",{"title":2142,"icon":132,"path":2143,"stem":2144,"children":2145},"Redux","\u002Fjavascript\u002Freact\u002Fredux","03.javascript\u002F04.react\u002F06.redux\u002Findex",[2146,2148,2164,2193,2202,2223,2239,2268],{"title":2147,"path":2143,"stem":2144},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2149,"stem":2150,"children":2151,"page":59},"\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals",[2152,2156,2160],{"title":2153,"path":2154,"stem":2155},"Вступ до State Management","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fintro-state-management","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F01.intro-state-management",{"title":2157,"path":2158,"stem":2159},"Філософія Redux та Три Принципи","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fredux-philosophy","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F02.redux-philosophy",{"title":2161,"path":2162,"stem":2163},"Чисті функції та Іммутабельність","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fpure-functions-immutability","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F03.pure-functions-immutability",{"title":2165,"icon":132,"path":2166,"stem":2167,"children":2168,"page":59},"Classic Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux",[2169,2173,2177,2181,2185,2189],{"title":2170,"path":2171,"stem":2172},"Створення Store (Classic Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fstore-setup","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F01.store-setup",{"title":2174,"path":2175,"stem":2176},"Actions, Constants та Action Creators","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Factions-constants","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F02.actions-constants",{"title":2178,"path":2179,"stem":2180},"Логіка Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freducers","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F03.reducers",{"title":2182,"path":2183,"stem":2184},"Комбінування Reducers (Root Reducer)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fdata-flow","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F04.data-flow",{"title":2186,"path":2187,"stem":2188},"Підключення до React (React-Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freact-redux-connection","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F05.react-redux-connection",{"title":2190,"path":2191,"stem":2192},"Middleware та Асинхронність (Redux Thunk)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fmiddleware-thunk","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F06.middleware-thunk",{"title":2194,"icon":132,"path":2195,"stem":2196,"children":2197,"page":59},"Transition To Rtk","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk",[2198],{"title":2199,"path":2200,"stem":2201},"Проблеми класичного Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk\u002Fproblems-with-classic","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk\u002F01.problems-with-classic",{"title":2203,"icon":132,"path":2204,"stem":2205,"children":2206,"page":59},"Redux Toolkit","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit",[2207,2211,2215,2219],{"title":2208,"path":2209,"stem":2210},"Налаштування Store з configureStore","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fconfigure-store","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F01.configure-store",{"title":2212,"path":2213,"stem":2214},"createSlice: Революція в Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fcreate-slice","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F02.create-slice",{"title":2216,"path":2217,"stem":2218},"Асинхронність з createAsyncThunk","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fasync-thunks","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F03.async-thunks",{"title":2220,"path":2221,"stem":2222},"04. Entity Adapter: Керування нормалізованим станом","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fentity-adapter","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F04.entity-adapter",{"title":2224,"icon":92,"path":2225,"stem":2226,"children":2227,"page":59},"Advanced","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced",[2228,2232,2236],{"title":2229,"path":2230,"stem":2231},"Мемоізація та Селектори: Повний Гайд по Reselect","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Fselectors-reselect","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F01.selectors-reselect",{"title":2233,"path":2234,"stem":2235},"RTK Query: Архітектура Серверного Кешу","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Frtk-query-intro","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F02.rtk-query-intro",{"title":2083,"path":2237,"stem":2238},"\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Farchitecture-best-practices","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F03.architecture-best-practices",{"title":2240,"icon":132,"path":2241,"stem":2242,"children":2243,"page":59},"Project Kanban","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban",[2244,2248,2252,2256,2260,2264],{"title":2245,"path":2246,"stem":2247},"Проєкт: Kanban Board (Trello Clone)","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fproject-overview","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F01.project-overview",{"title":2249,"path":2250,"stem":2251},"Налаштування та Типізація","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fsetup-and-types","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F02.setup-and-types",{"title":2253,"path":2254,"stem":2255},"Board Slice: Серце Дошки","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fboard-slice","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F03.board-slice",{"title":2257,"path":2258,"stem":2259},"Логіка Drag & Drop","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fdrag-and-drop-logic","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F04.drag-and-drop-logic",{"title":2261,"path":2262,"stem":2263},"Інтеграція з RTK Query","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Frtk-query-integration","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F05.rtk-query-integration",{"title":2265,"path":2266,"stem":2267},"Optimistic Updates","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Foptimistic-updates","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F06.optimistic-updates",{"title":2269,"icon":132,"path":2270,"stem":2271,"children":2272,"page":59},"Testing","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting","03.javascript\u002F04.react\u002F06.redux\u002F07.testing",[2273,2277,2281,2285,2289],{"title":2274,"path":2275,"stem":2276},"Тестування Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Fintro-testing","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F01.intro-testing",{"title":2278,"path":2279,"stem":2280},"Тестування Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-reducers","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F02.testing-reducers",{"title":2282,"path":2283,"stem":2284},"Тестування Селекторів","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-selectors","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F03.testing-selectors",{"title":2286,"path":2287,"stem":2288},"Тестування Компонентів (Integration)","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-components","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F04.testing-components",{"title":2290,"path":2291,"stem":2292},"Тестування Async Thunks","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-thunks","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F05.testing-thunks",{"title":2294,"icon":132,"path":2295,"stem":2296,"children":2297},"Ui Libraries","\u002Fjavascript\u002Freact\u002Fui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002Findex",[2298,2300,2304,2308,2312,2316,2320],{"title":2299,"path":2295,"stem":2296},"UI Бібліотеки в React",{"title":2301,"path":2302,"stem":2303},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fintroduction-to-ui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002F01.introduction-to-ui-libraries",{"title":2305,"path":2306,"stem":2307},"Філософія shadcn\u002Fui: \"Not a Component Library\"","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-philosophy","03.javascript\u002F04.react\u002F07.ui-libraries\u002F02.shadcn-philosophy",{"title":2309,"path":2310,"stem":2311},"Установка та Налаштування shadcn\u002Fui","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-installation","03.javascript\u002F04.react\u002F07.ui-libraries\u002F03.shadcn-installation",{"title":2313,"path":2314,"stem":2315},"Базові Компоненти shadcn\u002Fui: Фундамент Інтерфейсу","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-basics","03.javascript\u002F04.react\u002F07.ui-libraries\u002F04.shadcn-components-basics",{"title":2317,"path":2318,"stem":2319},"Компоненти Форм: Побудова Інтерактивних Form","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-forms","03.javascript\u002F04.react\u002F07.ui-libraries\u002F05.shadcn-components-forms",{"title":2321,"path":2322,"stem":2323},"Складні Компоненти: Dialog, Dropdown, Table та Command","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-advanced","03.javascript\u002F04.react\u002F07.ui-libraries\u002F06.shadcn-components-advanced",{"title":2325,"icon":2326,"path":2327,"stem":2328,"children":2329,"page":59},"TypeScript","i-devicon-typescript","\u002Fjavascript\u002Ftypescript","03.javascript\u002F05.typescript",[2330,2334,2338,2342,2346,2350,2354,2358],{"title":2331,"path":2332,"stem":2333},"TypeScript: Броня для вашого коду","\u002Fjavascript\u002Ftypescript\u002Fintro-and-basic-types","03.javascript\u002F05.typescript\u002F01.intro-and-basic-types",{"title":2335,"path":2336,"stem":2337},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","\u002Fjavascript\u002Ftypescript\u002Finterfaces-and-advanced-types","03.javascript\u002F05.typescript\u002F02.interfaces-and-advanced-types",{"title":2339,"path":2340,"stem":2341},"Алхімія Типів: Generics та Utility Types","\u002Fjavascript\u002Ftypescript\u002Fgenerics-and-utilities","03.javascript\u002F05.typescript\u002F03.generics-and-utilities",{"title":2343,"path":2344,"stem":2345},"Архітектура та Шаблони: Класи в TypeScript","\u002Fjavascript\u002Ftypescript\u002Fclasses-and-oop","03.javascript\u002F05.typescript\u002F04.classes-and-oop",{"title":2347,"path":2348,"stem":2349},"Продакшн та Екосистема: Advanced Config & Workflow","\u002Fjavascript\u002Ftypescript\u002Fadvanced-patterns-and-config","03.javascript\u002F05.typescript\u002F05.advanced-patterns-and-config",{"title":2351,"path":2352,"stem":2353},"TypeScript у світі React","\u002Fjavascript\u002Ftypescript\u002Freact-basics","03.javascript\u002F05.typescript\u002F06.react-basics",{"title":2355,"path":2356,"stem":2357},"React + TypeScript: Продвинуті патерни","\u002Fjavascript\u002Ftypescript\u002Freact-advanced","03.javascript\u002F05.typescript\u002F07.react-advanced",{"title":2359,"path":2360,"stem":2361},"React + TypeScript: Екосистема та бібліотеки","\u002Fjavascript\u002Ftypescript\u002Freact-ecosystem","03.javascript\u002F05.typescript\u002F08.react-ecosystem",{"title":2363,"path":2364,"stem":2365},"Atomic Design","\u002Fjavascript\u002Fatomic-design","03.javascript\u002F2.atomic-design",{"title":2367,"icon":2368,"path":2369,"stem":2370,"children":2371,"page":59},"Java","i-devicon-java","\u002Fjava","04.java",[2372,2375,2378,2382,2386,2390,2394],{"title":162,"path":2373,"stem":2374},"\u002Fjava\u002Fdata-mapper-part1","04.java\u002F01.data-mapper-part1",{"title":166,"path":2376,"stem":2377},"\u002Fjava\u002Fdata-mapper-part2","04.java\u002F02.data-mapper-part2",{"title":2379,"path":2380,"stem":2381},"Service Layer: Організація бізнес-логіки","\u002Fjava\u002Fservice-layer","04.java\u002F03.service-layer",{"title":2383,"path":2384,"stem":2385},"Rich Domain Model та State Pattern","\u002Fjava\u002Frich-domain-model","04.java\u002F04.rich-domain-model",{"title":2387,"path":2388,"stem":2389},"Патерни для складної бізнес-логіки","\u002Fjava\u002Fbusiness-logic-patterns","04.java\u002F05.business-logic-patterns",{"title":2391,"path":2392,"stem":2393},"Обробка помилок та валідація","\u002Fjava\u002Ferror-handling-validation","04.java\u002F06.error-handling-validation",{"title":2395,"path":2396,"stem":2397,"children":2398,"page":59},"Проектування баз даних","\u002Fjava\u002Fpr2","04.java\u002Fpr2",[2399,2403,2407,2411,2415,2419,2423,2427,2431,2435,2439,2443,2447,2451,2455,2459,2463,2467,2471,2475,2479,2483,2487,2491,2495,2499,2503,2507,2511,2515,2519,2523,2527,2531,2535,2539,2543],{"title":2400,"path":2401,"stem":2402},"Концептуальне моделювання: Мистецтво розуміння предметної області","\u002Fjava\u002Fpr2\u002Fconceptual-modeling","04.java\u002Fpr2\u002F01.conceptual-modeling",{"title":2404,"path":2405,"stem":2406},"Логічне моделювання: Від бізнес-ідей до структур даних","\u002Fjava\u002Fpr2\u002Flogical-modeling","04.java\u002Fpr2\u002F02.logical-modeling",{"title":2408,"path":2409,"stem":2410},"Нормалізація: Гігієна даних та боротьба з аномаліями","\u002Fjava\u002Fpr2\u002Fnormalization","04.java\u002Fpr2\u002F03.normalization",{"title":2412,"path":2413,"stem":2414},"Фізична схема: Від абстракції до DDL","\u002Fjava\u002Fpr2\u002Fphysical-schema","04.java\u002Fpr2\u002F04.physical-schema",{"title":2416,"path":2417,"stem":2418},"Архітектурна класифікація таблиць","\u002Fjava\u002Fpr2\u002Ftable-classification","04.java\u002Fpr2\u002F05.table-classification",{"title":2420,"path":2421,"stem":2422},"Database Migrations: Версіонування схеми з Flyway","\u002Fjava\u002Fpr2\u002Fdatabase-migrations","04.java\u002Fpr2\u002F06.database-migrations",{"title":2424,"path":2425,"stem":2426},"А що, якби це була не реляційна БД?","\u002Fjava\u002Fpr2\u002Fbeyond-relational","04.java\u002Fpr2\u002F07.beyond-relational",{"title":2428,"path":2429,"stem":2430},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","\u002Fjava\u002Fpr2\u002Fimpedance-mismatch","04.java\u002Fpr2\u002F09.impedance-mismatch",{"title":2432,"path":2433,"stem":2434},"JDBC: Перший контакт із базою даних","\u002Fjava\u002Fpr2\u002Fjdbc-fundamentals","04.java\u002Fpr2\u002F10.jdbc-fundamentals",{"title":2436,"path":2437,"stem":2438},"Якість коду: Spotless, SpotBugs та SonarQube","\u002Fjava\u002Fpr2\u002F10a.code-quality","04.java\u002Fpr2\u002F10a.code-quality",{"title":2440,"path":2441,"stem":2442},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","\u002Fjava\u002Fpr2\u002Fconnection-pool","04.java\u002Fpr2\u002F11.connection-pool",{"title":2444,"path":2445,"stem":2446},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","\u002Fjava\u002Fpr2\u002Frow-data-gateway","04.java\u002Fpr2\u002F12.row-data-gateway",{"title":2448,"path":2449,"stem":2450},"Table Data Gateway: Фасад таблиці як архітектурний відступ","\u002Fjava\u002Fpr2\u002Ftable-data-gateway","04.java\u002Fpr2\u002F13.table-data-gateway",{"title":2452,"path":2453,"stem":2454},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","\u002Fjava\u002Fpr2\u002Frepository-data-mapper","04.java\u002Fpr2\u002F14.repository-data-mapper",{"title":2456,"path":2457,"stem":2458},"Identity Map: Кешування сутностей у рамках сесії","\u002Fjava\u002Fpr2\u002Fidentity-map","04.java\u002Fpr2\u002F15.identity-map",{"title":2460,"path":2461,"stem":2462},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","\u002Fjava\u002Fpr2\u002Funit-of-work","04.java\u002Fpr2\u002F16.unit-of-work",{"title":2464,"path":2465,"stem":2466},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","\u002Fjava\u002Fpr2\u002Fstrategy-sql","04.java\u002Fpr2\u002F17.strategy-sql",{"title":2468,"path":2469,"stem":2470},"Proxy: Lazy Loading для One-To-Many колекцій","\u002Fjava\u002Fpr2\u002Fproxy-lazy-loading","04.java\u002Fpr2\u002F18.proxy-lazy-loading",{"title":2472,"path":2473,"stem":2474},"Generic Repository через Java Reflection: анотації та динамічний SQL","\u002Fjava\u002Fpr2\u002Fgeneric-repository-reflection","04.java\u002Fpr2\u002F19.generic-repository-reflection",{"title":2476,"path":2477,"stem":2478},"Specification Pattern: Композиція бізнес-правил для складних запитів","\u002Fjava\u002Fpr2\u002Fspecification-pattern","04.java\u002Fpr2\u002F20.specification-pattern",{"title":2480,"path":2481,"stem":2482},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","\u002Fjava\u002Fpr2\u002F20a.advanced-specifications","04.java\u002Fpr2\u002F20a.advanced-specifications",{"title":2484,"path":2485,"stem":2486},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","\u002Fjava\u002Fpr2\u002Fasynchronous-jdbc","04.java\u002Fpr2\u002F21.asynchronous-jdbc",{"title":2488,"path":2489,"stem":2490},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","\u002Fjava\u002Fpr2\u002Fintegration-testing-h2","04.java\u002Fpr2\u002F22.integration-testing-h2",{"title":2492,"path":2493,"stem":2494},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","\u002Fjava\u002Fpr2\u002Fintegration-testing-testcontainers","04.java\u002Fpr2\u002F23.integration-testing-testcontainers",{"title":2496,"path":2497,"stem":2498},"Google Guice: Впровадження залежностей у JavaFX-проєкті","\u002Fjava\u002Fpr2\u002Fdependency-injection-guice","04.java\u002Fpr2\u002F24.dependency-injection-guice",{"title":2500,"path":2501,"stem":2502},"JavaFX: Основи побудови графічних інтерфейсів","\u002Fjava\u002Fpr2\u002Fjavafx-fundamentals","04.java\u002Fpr2\u002F25.javafx-fundamentals",{"title":2504,"path":2505,"stem":2506},"Properties та Bindings: Реактивність у JavaFX","\u002Fjava\u002Fpr2\u002Fjavafx-properties-bindings","04.java\u002Fpr2\u002F26.javafx-properties-bindings",{"title":2508,"path":2509,"stem":2510},"MVC vs MVP vs MVVM: Еволюція архітектурних патернів UI","\u002Fjava\u002Fpr2\u002Fui-architecture-patterns","04.java\u002Fpr2\u002F27.ui-architecture-patterns",{"title":2512,"path":2513,"stem":2514},"MVVM на практиці: Побудова ViewModel","\u002Fjava\u002Fpr2\u002Fmvvm-viewmodel-implementation","04.java\u002Fpr2\u002F28.mvvm-viewmodel-implementation",{"title":2516,"path":2517,"stem":2518},"View та Controller: Зв'язування з ViewModel через FXML","\u002Fjava\u002Fpr2\u002Fmvvm-view-controller","04.java\u002Fpr2\u002F29.mvvm-view-controller",{"title":2520,"path":2521,"stem":2522},"Інтеграція MVVM з Guice: Автоматична ін'єкція залежностей","\u002Fjava\u002Fpr2\u002Fmvvm-guice-integration","04.java\u002Fpr2\u002F30.mvvm-guice-integration",{"title":2524,"path":2525,"stem":2526},"Валідація та обробка помилок у MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-validation-error-handling","04.java\u002Fpr2\u002F31.mvvm-validation-error-handling",{"title":2528,"path":2529,"stem":2530},"Навігація та управління екранами у JavaFX MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-navigation-screen-management","04.java\u002Fpr2\u002F32.mvvm-navigation-screen-management",{"title":2532,"path":2533,"stem":2534},"Тестування JavaFX MVVM-додатків","\u002Fjava\u002Fpr2\u002Fmvvm-testing","04.java\u002Fpr2\u002F33.mvvm-testing",{"title":2536,"path":2537,"stem":2538},"Стилізація та теми у JavaFX: CSS та User Experience","\u002Fjava\u002Fpr2\u002Fjavafx-styling-themes","04.java\u002Fpr2\u002F34.javafx-styling-themes",{"title":2540,"path":2541,"stem":2542},"AtlantaFX: Сучасні теми для JavaFX додатків","\u002Fjava\u002Fpr2\u002Fatlantafx-modern-themes","04.java\u002Fpr2\u002F35.atlantafx-modern-themes",{"title":2544,"path":2545,"stem":2546},"Пакування та розповсюдження JavaFX-додатків","\u002Fjava\u002Fpr2\u002Fjar-packaging-distribution","04.java\u002Fpr2\u002F36.jar-packaging-distribution",{"title":2548,"icon":2549,"path":2550,"stem":2551,"children":2552,"page":59},"Python","i-devicon-python","\u002Fpython","05.python",[2553,2557,2560,2564,2568,2572,2576,2580,2584,2588,2592,2596,2600,2604,2608,2669],{"title":2554,"path":2555,"stem":2556},"Модулі, Пакети та Віртуальні Середовища","\u002Fpython\u002Fmodules-packages-venv","05.python\u002F00.modules-packages-venv",{"title":71,"path":2558,"stem":2559},"\u002Fpython\u002Fclasses-objects","05.python\u002F01.classes-objects",{"title":2561,"path":2562,"stem":2563},"Інкапсуляція, Керування Доступом та Властивості","\u002Fpython\u002Fencapsulation","05.python\u002F02.encapsulation",{"title":2565,"path":2566,"stem":2567},"Наслідування, MRO та суперсила super()","\u002Fpython\u002Finheritance-mro","05.python\u002F03.inheritance-mro",{"title":2569,"path":2570,"stem":2571},"Абстракція — ABC проти Статичних Протоколів (PEP 544)","\u002Fpython\u002Fabstraction-protocols","05.python\u002F04.abstraction-protocols",{"title":2573,"path":2574,"stem":2575},"Магічні методи (Dunder) та Емуляція протоколів","\u002Fpython\u002Fdunder-methods","05.python\u002F05.dunder-methods",{"title":2577,"path":2578,"stem":2579},"Декоратори та Керування життєвим циклом методів","\u002Fpython\u002Fdecorators-static-class","05.python\u002F06.decorators-static-class",{"title":2581,"path":2582,"stem":2583},"Дескриптори — Магія доступу до атрибутів","\u002Fpython\u002Fdescriptors","05.python\u002F07.descriptors",{"title":2585,"path":2586,"stem":2587},"Метакласи — Динамічне створення класів під капотом CPython","\u002Fpython\u002Fmetaclasses","05.python\u002F08.metaclasses",{"title":2589,"path":2590,"stem":2591},"Dataclasses, NamedTuple та сучасні контейнери Python","\u002Fpython\u002Fmodern-containers","05.python\u002F09.modern-containers",{"title":2593,"path":2594,"stem":2595},"GIL та модель конкурентності CPython — фундамент перед потоками і процесами","\u002Fpython\u002Fgil-concurrency-intro","05.python\u002F11.gil-concurrency-intro",{"title":2597,"path":2598,"stem":2599},"Threading — конкурентність для I\u002FO-bound задач","\u002Fpython\u002Fthreading","05.python\u002F12.threading",{"title":2601,"path":2602,"stem":2603},"Multiprocessing — справжній паралелізм для CPU-bound задач","\u002Fpython\u002Fmultiprocessing","05.python\u002F13.multiprocessing",{"title":2605,"path":2606,"stem":2607},"asyncio — кооперативна конкурентність та event loop","\u002Fpython\u002Fasyncio","05.python\u002F14.asyncio",{"title":2609,"icon":92,"path":2610,"stem":2611,"children":2612,"page":59},"FastAPI","\u002Fpython\u002Ffastapi","05.python\u002Ffastapi",[2613,2617,2621,2625,2629,2633,2637,2641,2645,2649,2653,2657,2661,2665],{"title":2614,"path":2615,"stem":2616},"Глибокий Typing та Pydantic v2 — від анотацій до валідації","\u002Fpython\u002Ffastapi\u002Ftyping-pydantic","05.python\u002Ffastapi\u002F15.typing-pydantic",{"title":2618,"path":2619,"stem":2620},"WSGI, ASGI та Python Web-екосистема","\u002Fpython\u002Ffastapi\u002Fwsgi-asgi-ecosystem","05.python\u002Ffastapi\u002F16.wsgi-asgi-ecosystem",{"title":2622,"path":2623,"stem":2624},"FastAPI: Перший додаток, Uvicorn та OpenAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-intro","05.python\u002Ffastapi\u002F17.fastapi-intro",{"title":2626,"path":2627,"stem":2628},"Маршрутизація, параметри запитів та APIRouter","\u002Fpython\u002Ffastapi\u002Ffastapi-routing-params","05.python\u002Ffastapi\u002F18.fastapi-routing-params",{"title":2630,"path":2631,"stem":2632},"Pydantic v2 у FastAPI — схеми, валідація та серіалізація","\u002Fpython\u002Ffastapi\u002Ffastapi-pydantic-schemas","05.python\u002Ffastapi\u002F19.fastapi-pydantic-schemas",{"title":2634,"path":2635,"stem":2636},"Dependency Injection — серце архітектури FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-dependency-injection","05.python\u002Ffastapi\u002F20.fastapi-dependency-injection",{"title":2638,"path":2639,"stem":2640},"Обробка помилок, Middleware та CORS у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-errors-middleware","05.python\u002Ffastapi\u002F21.fastapi-errors-middleware",{"title":2642,"path":2643,"stem":2644},"SQLAlchemy 2.0 — ORM, Core та Async Engine","\u002Fpython\u002Ffastapi\u002Fsqlalchemy-orm","05.python\u002Ffastapi\u002F22.sqlalchemy-orm",{"title":2646,"path":2647,"stem":2648},"Alembic — міграції бази даних","\u002Fpython\u002Ffastapi\u002Falembic-migrations","05.python\u002Ffastapi\u002F23.alembic-migrations",{"title":2650,"path":2651,"stem":2652},"Repository Pattern та Clean Architecture у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-repository-clean-arch","05.python\u002Ffastapi\u002F24.fastapi-repository-clean-arch",{"title":2654,"path":2655,"stem":2656},"Автентифікація та авторизація — JWT, OAuth2, RBAC","\u002Fpython\u002Ffastapi\u002Ffastapi-auth-security","05.python\u002Ffastapi\u002F25.fastapi-auth-security",{"title":2658,"path":2659,"stem":2660},"Тестування FastAPI — pytest, httpx, fixtures","\u002Fpython\u002Ffastapi\u002Ffastapi-testing","05.python\u002Ffastapi\u002F26.fastapi-testing",{"title":2662,"path":2663,"stem":2664},"Async на повну — Background Tasks, WebSockets, SSE та Celery","\u002Fpython\u002Ffastapi\u002Ffastapi-async-advanced","05.python\u002Ffastapi\u002F27.fastapi-async-advanced",{"title":2666,"path":2667,"stem":2668},"Deployment — Docker, CI\u002FCD, Monitoring","\u002Fpython\u002Ffastapi\u002Ffastapi-deployment","05.python\u002Ffastapi\u002F28.fastapi-deployment",{"title":2670,"path":2671,"stem":2672},"[object Object]","\u002Fpython\u002Foop-plan","05.python\u002Foop-plan",{"title":2674,"icon":2675,"path":2676,"stem":2677,"children":2678,"page":59},"Бази даних","i-lucide-database","\u002Fdatabases","06.databases",[2679,2709,2732,2769,2798,2816,2850,2862,2871],{"title":2680,"icon":2681,"path":2682,"stem":2683,"children":2684,"page":59},"Intro","i-lucide-play","\u002Fdatabases\u002Fintro","06.databases\u002F01.intro",[2685,2689,2693,2697,2701,2705],{"title":2686,"path":2687,"stem":2688},"Введення в теорію баз даних","\u002Fdatabases\u002Fintro\u002Fintroduction-to-databases","06.databases\u002F01.intro\u002F01.introduction-to-databases",{"title":2690,"path":2691,"stem":2692},"Реляційна модель даних","\u002Fdatabases\u002Fintro\u002Frelational-model-theory","06.databases\u002F01.intro\u002F02.relational-model-theory",{"title":2694,"path":2695,"stem":2696},"ER-моделювання","\u002Fdatabases\u002Fintro\u002Fer-modeling","06.databases\u002F01.intro\u002F03.er-modeling",{"title":2698,"path":2699,"stem":2700},"Логічне проектування БД","\u002Fdatabases\u002Fintro\u002Flogical-schema","06.databases\u002F01.intro\u002F04.logical-schema",{"title":2702,"path":2703,"stem":2704},"Класифікація таблиць","\u002Fdatabases\u002Fintro\u002Ftable-classification","06.databases\u002F01.intro\u002F05.table-classification",{"title":2706,"path":2707,"stem":2708},"PlantUML для баз даних","\u002Fdatabases\u002Fintro\u002Fplantuml-diagrams","06.databases\u002F01.intro\u002F06.plantuml-diagrams",{"title":2710,"icon":2675,"path":2711,"stem":2712,"children":2713,"page":59},"MS SQL Server Start","\u002Fdatabases\u002Fms-sql-server-start","06.databases\u002F02.ms-sql-server-start",[2714,2718,2724,2728],{"title":2715,"path":2716,"stem":2717},"Типи даних у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fdata-types","06.databases\u002F02.ms-sql-server-start\u002F01.data-types",{"title":2719,"path":2720,"stem":2721,"children":2722},"Індекси у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-indexes","06.databases\u002F02.ms-sql-server-start\u002F02.sql-indexes",[2723],{"title":2719,"path":2720,"stem":2721},{"title":2725,"path":2726,"stem":2727},"Системні бази даних MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsystem-databases","06.databases\u002F02.ms-sql-server-start\u002F03.system-databases",{"title":2729,"path":2730,"stem":2731},"Огляд мови SQL та запитів","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-queries-overview","06.databases\u002F02.ms-sql-server-start\u002F04.sql-queries-overview",{"title":2733,"icon":2675,"path":2734,"stem":2735,"children":2736,"page":59},"SQL","\u002Fdatabases\u002Fsql","06.databases\u002F03.sql",[2737,2741,2745,2749,2753,2757,2761,2765],{"title":2738,"path":2739,"stem":2740},"Налаштування демонстраційної бази даних","\u002Fdatabases\u002Fsql\u002Fsample-database-setup","06.databases\u002F03.sql\u002F00.sample-database-setup",{"title":2742,"path":2743,"stem":2744},"DDL - Створення таблиць (CREATE TABLE)","\u002Fdatabases\u002Fsql\u002Fddl-create-table","06.databases\u002F03.sql\u002F01.ddl-create-table",{"title":2746,"path":2747,"stem":2748},"DDL - Зміна та видалення таблиць (ALTER, DROP)","\u002Fdatabases\u002Fsql\u002Fddl-alter-drop-table","06.databases\u002F03.sql\u002F02.ddl-alter-drop-table",{"title":2750,"path":2751,"stem":2752},"SELECT запити - Основи","\u002Fdatabases\u002Fsql\u002Fselect-queries-fundamentals","06.databases\u002F03.sql\u002F03.select-queries-fundamentals",{"title":2754,"path":2755,"stem":2756},"SELECT запити - Розширені можливості","\u002Fdatabases\u002Fsql\u002Fselect-queries-advanced","06.databases\u002F03.sql\u002F04.select-queries-advanced",{"title":2758,"path":2759,"stem":2760},"INSERT запити - Додавання даних","\u002Fdatabases\u002Fsql\u002Finsert-queries","06.databases\u002F03.sql\u002F05.insert-queries",{"title":2762,"path":2763,"stem":2764},"UPDATE та DELETE запити","\u002Fdatabases\u002Fsql\u002Fupdate-delete-queries","06.databases\u002F03.sql\u002F06.update-delete-queries",{"title":2766,"path":2767,"stem":2768},"Транзакції в SQL","\u002Fdatabases\u002Fsql\u002Ftransactions","06.databases\u002F03.sql\u002F07.transactions",{"title":2770,"icon":2675,"path":2771,"stem":2772,"children":2773,"page":59},"Multi Table Databases","\u002Fdatabases\u002Fmulti-table-databases","06.databases\u002F04.multi-table-databases",[2774,2778,2782,2786,2790,2794],{"title":2775,"path":2776,"stem":2777},"Зв'язки та нормалізація БД","\u002Fdatabases\u002Fmulti-table-databases\u002Frelationships-and-normalization","06.databases\u002F04.multi-table-databases\u002F00.relationships-and-normalization",{"title":2779,"path":2780,"stem":2781},"INNER JOIN - З'єднання таблиць","\u002Fdatabases\u002Fmulti-table-databases\u002Finner-join","06.databases\u002F04.multi-table-databases\u002F01.inner-join",{"title":2783,"path":2784,"stem":2785},"OUTER JOINs - LEFT, RIGHT, FULL","\u002Fdatabases\u002Fmulti-table-databases\u002Fouter-joins","06.databases\u002F04.multi-table-databases\u002F02.outer-joins",{"title":2787,"path":2788,"stem":2789},"CROSS та SELF JOINs","\u002Fdatabases\u002Fmulti-table-databases\u002Fcross-self-joins","06.databases\u002F04.multi-table-databases\u002F03.cross-self-joins",{"title":2791,"path":2792,"stem":2793},"Підзапити (Subqueries)","\u002Fdatabases\u002Fmulti-table-databases\u002Fsubqueries","06.databases\u002F04.multi-table-databases\u002F04.subqueries",{"title":2795,"path":2796,"stem":2797},"Агрегації з JOIN","\u002Fdatabases\u002Fmulti-table-databases\u002Faggregations-with-joins","06.databases\u002F04.multi-table-databases\u002F05.aggregations-with-joins",{"title":2799,"icon":2800,"path":2801,"stem":2802,"children":2803,"page":59},"Aggregate Functions","i-lucide-calculator","\u002Fdatabases\u002Faggregate-functions","06.databases\u002F05.aggregate-functions",[2804,2808,2812],{"title":2805,"path":2806,"stem":2807},"Функції агрегування в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fintroduction-aggregate-functions","06.databases\u002F05.aggregate-functions\u002F01.introduction-aggregate-functions",{"title":2809,"path":2810,"stem":2811},"Групування даних в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fgrouping-data","06.databases\u002F05.aggregate-functions\u002F02.grouping-data",{"title":2813,"path":2814,"stem":2815},"Підзапити з агрегатними функціями","\u002Fdatabases\u002Faggregate-functions\u002Fsubqueries-aggregates","06.databases\u002F05.aggregate-functions\u002F03.subqueries-aggregates",{"title":2817,"icon":2818,"path":2819,"stem":2820,"children":2821,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","\u002Fdatabases\u002Ftriggers-stored-procedures","06.databases\u002F07.triggers-stored-procedures",[2822,2826,2830,2834,2838,2842,2846],{"title":2823,"path":2824,"stem":2825},"DML-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fdml-triggers","06.databases\u002F07.triggers-stored-procedures\u002F01.dml-triggers",{"title":2827,"path":2828,"stem":2829},"DDL-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fddl-triggers","06.databases\u002F07.triggers-stored-procedures\u002F02.ddl-triggers",{"title":2831,"path":2832,"stem":2833},"Transact-SQL розширення","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransact-sql-extensions","06.databases\u002F07.triggers-stored-procedures\u002F03.transact-sql-extensions",{"title":2835,"path":2836,"stem":2837},"Транзакції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransactions","06.databases\u002F07.triggers-stored-procedures\u002F04.transactions",{"title":2839,"path":2840,"stem":2841},"Зберігаємі процедури","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fstored-procedures","06.databases\u002F07.triggers-stored-procedures\u002F05.stored-procedures",{"title":2843,"path":2844,"stem":2845},"Користувацькі функції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fuser-defined-functions","06.databases\u002F07.triggers-stored-procedures\u002F06.user-defined-functions",{"title":2847,"path":2848,"stem":2849},"Безпека баз даних","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fsecurity","06.databases\u002F07.triggers-stored-procedures\u002F08.security",{"title":2847,"icon":793,"path":2851,"stem":2852,"children":2853,"page":59},"\u002Fdatabases\u002Fsecurity","06.databases\u002F08.security",[2854,2858],{"title":2855,"path":2856,"stem":2857},"Вступ до безпеки баз даних","\u002Fdatabases\u002Fsecurity\u002Fintroduction","06.databases\u002F08.security\u002F01.introduction",{"title":2859,"path":2860,"stem":2861},"Системні представлення та метадані","\u002Fdatabases\u002Fsecurity\u002Fsystem-views","06.databases\u002F08.security\u002F02.system-views",{"title":2863,"icon":2864,"path":2865,"stem":2866,"children":2867,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","\u002Fdatabases\u002Fbackup-recovery","06.databases\u002F09.backup-recovery",[2868],{"title":2863,"path":2869,"stem":2870},"\u002Fdatabases\u002Fbackup-recovery\u002Fbackup-restore","06.databases\u002F09.backup-recovery\u002F01.backup-restore",{"title":2872,"icon":2873,"path":2874,"stem":2875,"children":2876,"page":59},"Повнотекстовий пошук","i-lucide-search","\u002Fdatabases\u002Ffull-text-search","06.databases\u002F10.full-text-search",[2877],{"title":2872,"path":2878,"stem":2879},"\u002Fdatabases\u002Ffull-text-search\u002Ffull-text-search","06.databases\u002F10.full-text-search\u002F01.full-text-search",{"title":2881,"icon":2882,"path":2883,"stem":2884,"children":2885,"page":59},"Tools","i-lucide-wrench","\u002Ftools","07.tools",[2886,2962],{"title":2887,"icon":2888,"path":2889,"stem":2890,"children":2891},"Docker","i-simple-icons-docker","\u002Ftools\u002Fdocker","07.tools\u002F01.docker\u002Findex",[2892,2894,2898,2902,2906,2910,2914,2918,2922,2926,2930,2934,2938,2942,2946,2950,2954,2958],{"title":2893,"path":2889,"stem":2890},"Docker: від нуля до production",{"title":2895,"path":2896,"stem":2897},"Контейнеризація — від проблеми до рішення","\u002Ftools\u002Fdocker\u002Fcontainerization-concept","07.tools\u002F01.docker\u002F01.containerization-concept",{"title":2899,"path":2900,"stem":2901},"Docker — що це і навіщо?","\u002Ftools\u002Fdocker\u002Fdocker-what-and-why","07.tools\u002F01.docker\u002F02.docker-what-and-why",{"title":2903,"path":2904,"stem":2905},"Архітектура Docker Engine","\u002Ftools\u002Fdocker\u002Fdocker-architecture","07.tools\u002F01.docker\u002F03.docker-architecture",{"title":2907,"path":2908,"stem":2909},"Встановлення Docker","\u002Ftools\u002Fdocker\u002Finstallation","07.tools\u002F01.docker\u002F04.installation",{"title":2911,"path":2912,"stem":2913},"Перший контейнер — docker run","\u002Ftools\u002Fdocker\u002Ffirst-container","07.tools\u002F01.docker\u002F05.first-container",{"title":2915,"path":2916,"stem":2917},"Життєвий цикл контейнера","\u002Ftools\u002Fdocker\u002Fcontainer-lifecycle","07.tools\u002F01.docker\u002F06.container-lifecycle",{"title":2919,"path":2920,"stem":2921},"Docker Images — фундаментальні концепції","\u002Ftools\u002Fdocker\u002Fdocker-images-fundamentals","07.tools\u002F01.docker\u002F07.docker-images-fundamentals",{"title":2923,"path":2924,"stem":2925},"Dockerfile — основи","\u002Ftools\u002Fdocker\u002Fdockerfile-basics","07.tools\u002F01.docker\u002F08.dockerfile-basics",{"title":2927,"path":2928,"stem":2929},"Dockerfile — просунуті техніки","\u002Ftools\u002Fdocker\u002Fdockerfile-advanced","07.tools\u002F01.docker\u002F09.dockerfile-advanced",{"title":2931,"path":2932,"stem":2933},"Build Context та кешування шарів","\u002Ftools\u002Fdocker\u002Fbuild-context-and-cache","07.tools\u002F01.docker\u002F10.build-context-and-cache",{"title":2935,"path":2936,"stem":2937},"Реєстри Docker-образів","\u002Ftools\u002Fdocker\u002Fimage-registries","07.tools\u002F01.docker\u002F11.image-registries",{"title":2939,"path":2940,"stem":2941},"Контейнеризація .NET додатків","\u002Ftools\u002Fdocker\u002Fdotnet-containerization","07.tools\u002F01.docker\u002F12.dotnet-containerization",{"title":2943,"path":2944,"stem":2945},"Томи та збереження даних","\u002Ftools\u002Fdocker\u002Fvolumes-and-data","07.tools\u002F01.docker\u002F13.volumes-and-data",{"title":2947,"path":2948,"stem":2949},"Основи мережі в Docker","\u002Ftools\u002Fdocker\u002Fnetworking-basics","07.tools\u002F01.docker\u002F14.networking-basics",{"title":2951,"path":2952,"stem":2953},"Змінні оточення та конфігурація","\u002Ftools\u002Fdocker\u002Fenvironment-and-configuration","07.tools\u002F01.docker\u002F15.environment-and-configuration",{"title":2955,"path":2956,"stem":2957},"Docker Compose — оркестрація контейнерів","\u002Ftools\u002Fdocker\u002Fdocker-compose-basics","07.tools\u002F01.docker\u002F16.docker-compose-basics",{"title":2959,"path":2960,"stem":2961},"Docker Compose — Multi-Service застосунки","\u002Ftools\u002Fdocker\u002Fcompose-multi-service","07.tools\u002F01.docker\u002F17.compose-multi-service",{"title":2963,"icon":2964,"path":2965,"stem":2966,"children":2967},"Kubernetes","simple-icons:kubernetes","\u002Ftools\u002Fkubernetes","07.tools\u002F02.kubernetes\u002Findex",[2968,2970,2974,2978,2982,2986,2990,2994,2998],{"title":2969,"path":2965,"stem":2966},"Kubernetes: від розробки до production",{"title":2971,"path":2972,"stem":2973},"Kubernetes — коли Docker Compose більше не вистачає","\u002Ftools\u002Fkubernetes\u002Fwhy-kubernetes","07.tools\u002F02.kubernetes\u002F01.why-kubernetes",{"title":2975,"path":2976,"stem":2977},"Архітектура Kubernetes — анатомія кластера","\u002Ftools\u002Fkubernetes\u002Fkubernetes-architecture","07.tools\u002F02.kubernetes\u002F02.kubernetes-architecture",{"title":2979,"path":2980,"stem":2981},"Локальне середовище — minikube, kind та k3s","\u002Ftools\u002Fkubernetes\u002Flocal-environment","07.tools\u002F02.kubernetes\u002F03.local-environment",{"title":2983,"path":2984,"stem":2985},"Pod — атомарна одиниця Kubernetes","\u002Ftools\u002Fkubernetes\u002Fpods-and-containers","07.tools\u002F02.kubernetes\u002F04.pods-and-containers",{"title":2987,"path":2988,"stem":2989},"Патерни використання Pod","\u002Ftools\u002Fkubernetes\u002Fpod-patterns","07.tools\u002F02.kubernetes\u002F05.pod-patterns",{"title":2991,"path":2992,"stem":2993},"Deployment — декларативне управління Pod","\u002Ftools\u002Fkubernetes\u002Fdeployment-basics","07.tools\u002F02.kubernetes\u002F06.deployment-basics",{"title":2995,"path":2996,"stem":2997},"Rolling Updates та управління життєвим циклом Deployment","\u002Ftools\u002Fkubernetes\u002Fdeployment-rolling-updates","07.tools\u002F02.kubernetes\u002F07.deployment-rolling-updates",{"title":2999,"path":3000,"stem":3001},"Service — мережева абстракція для Pod","\u002Ftools\u002Fkubernetes\u002Fservices-networking","07.tools\u002F02.kubernetes\u002F08.services-networking",{"title":3003,"icon":3004,"path":3005,"stem":3006,"children":3007,"page":59},"Software Engineering","i-lucide-code-2","\u002Fsoftware-engineering","09.software-engineering",[3008,3012,3016,3020,3024,3028,3032,3036,3040,3044,3048],{"title":3009,"path":3010,"stem":3011},"1. Аналіз предметної області. Експертні знання та складність","\u002Fsoftware-engineering\u002Fintro-subdomains","09.software-engineering\u002F01.intro-subdomains",{"title":3013,"path":3014,"stem":3015},"2. Обмежені контексти. Інтеграція обмежених контекстів","\u002Fsoftware-engineering\u002Fintegrating-limited-contexts","09.software-engineering\u002F02.integrating-limited-contexts",{"title":3017,"path":3018,"stem":3019},"3. Реалізація простої бізнес-логіки","\u002Fsoftware-engineering\u002Fsimple","09.software-engineering\u002F03.simple",{"title":3021,"path":3022,"stem":3023},"4. Опрацювання складної бізнес-логіки","\u002Fsoftware-engineering\u002Fcomplex-business-logic","09.software-engineering\u002F04.complex-business-logic",{"title":3025,"path":3026,"stem":3027},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","\u002Fsoftware-engineering\u002Fmodelling-the-time-factor","09.software-engineering\u002F05.modelling-the-time-factor",{"title":3029,"path":3030,"stem":3031},"6. Архітектурні патерни","\u002Fsoftware-engineering\u002Farchitectural-patterns","09.software-engineering\u002F06.architectural-patterns",{"title":3033,"path":3034,"stem":3035},"Паттерни взаємодії","\u002Fsoftware-engineering\u002Fpatterns-of-interaction","09.software-engineering\u002F07.patterns-of-interaction",{"title":3037,"path":3038,"stem":3039},"Евристика проєктування","\u002Fsoftware-engineering\u002Fdesign-heuristics","09.software-engineering\u002F08.design-heuristics",{"title":3041,"path":3042,"stem":3043},"Еволюція проєктних рішень","\u002Fsoftware-engineering\u002Fevolution-of-design-solutions","09.software-engineering\u002F09.evolution-of-design-solutions",{"title":3045,"path":3046,"stem":3047},"EventStorming","\u002Fsoftware-engineering\u002Feventstorming","09.software-engineering\u002F10.eventstorming",{"title":3049,"path":3050,"stem":3051},"DDD на практиці","\u002Fsoftware-engineering\u002Fddd-in-practice","09.software-engineering\u002F11.ddd-in-practice",{"title":3053,"icon":943,"path":3054,"stem":3055,"children":3056,"page":59},"DDD","\u002Fddd","10.ddd",[3057,3061,3065,3069,3073,3077,3081,3085,3089,3093,3097,3101,3105],{"title":3058,"path":3059,"stem":3060},"Аналіз предметної області","\u002Fddd\u002Fdomain-analysis","10.ddd\u002F01.domain-analysis",{"title":3062,"path":3063,"stem":3064},"Експертні знання про предметну область","\u002Fddd\u002Fdomain-expert-knowledge","10.ddd\u002F02.domain-expert-knowledge",{"title":3066,"path":3067,"stem":3068},"Як осмислити складність предметної області","\u002Fddd\u002Fmanaging-domain-complexity","10.ddd\u002F03.managing-domain-complexity",{"title":3070,"path":3071,"stem":3072},"Інтеграція обмежених контекстів","\u002Fddd\u002Fbounded-context-integration","10.ddd\u002F04.bounded-context-integration",{"title":3074,"path":3075,"stem":3076},"Реалізація простої бізнес-логіки","\u002Fddd\u002Fsimple-business-logic","10.ddd\u002F05.simple-business-logic",{"title":3078,"path":3079,"stem":3080},"Обробка складної бізнес-логіки","\u002Fddd\u002Fcomplex-business-logic","10.ddd\u002F06.complex-business-logic",{"title":3082,"path":3083,"stem":3084},"Моделювання фактора часу","\u002Fddd\u002Ftime-modeling","10.ddd\u002F07.time-modeling",{"title":3086,"path":3087,"stem":3088},"Глава 8. Архітектурні Патерни","\u002Fddd\u002Farchitectural-patterns","10.ddd\u002F08.architectural-patterns",{"title":3090,"path":3091,"stem":3092},"Глава 9. Патерни Взаємодії","\u002Fddd\u002Finteraction-patterns","10.ddd\u002F09.interaction-patterns",{"title":3094,"path":3095,"stem":3096},"Глава 10. Проектні Евристики","\u002Fddd\u002Fdesign-heuristics","10.ddd\u002F10.design-heuristics",{"title":3098,"path":3099,"stem":3100},"Глава 11. Еволюція Проектних Рішень","\u002Fddd\u002Fevolution-of-design-decisions","10.ddd\u002F11.evolution-of-design-decisions",{"title":3102,"path":3103,"stem":3104},"Глава 12. EventStorming","\u002Fddd\u002Fevent-storming","10.ddd\u002F12.event-storming",{"title":3106,"path":3107,"stem":3108},"Глава 13. DDD на Практиці","\u002Fddd\u002Fddd-in-practice","10.ddd\u002F13.ddd-in-practice",{"title":3110,"icon":3111,"path":3112,"stem":3113,"children":3114,"page":59},"Media Streaming","i-lucide-video","\u002Fmedia-streaming","11.media-streaming",[3115,3119,3123,3127,3131,3135,3139],{"title":3116,"path":3117,"stem":3118},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","\u002Fmedia-streaming\u002Fintroduction","11.media-streaming\u002F01.introduction",{"title":3120,"path":3121,"stem":3122},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","\u002Fmedia-streaming\u002Faudio-video-anatomy","11.media-streaming\u002F02.audio-video-anatomy",{"title":3124,"path":3125,"stem":3126},"03. The Gym: FFmpeg Deep Dive","\u002Fmedia-streaming\u002Fffmpeg-gym","11.media-streaming\u002F03.ffmpeg-gym",{"title":3128,"path":3129,"stem":3130},"04. HLS Protocol: HTTP Live Streaming у Деталях","\u002Fmedia-streaming\u002Fhls-protocol","11.media-streaming\u002F04.hls-protocol",{"title":3132,"path":3133,"stem":3134},"05. DASH Protocol: Відкритий Стандарт","\u002Fmedia-streaming\u002Fdash-protocol","11.media-streaming\u002F05.dash-protocol",{"title":3136,"path":3137,"stem":3138},"06. Масштабування: CDN та Adaptive Bitrate","\u002Fmedia-streaming\u002Fcdn-and-adaptive-bitrate","11.media-streaming\u002F06.cdn-and-adaptive-bitrate",{"title":3140,"path":3141,"stem":3142},"07. Війна із Затримкою (Latency)","\u002Fmedia-streaming\u002Frealtime-latency","11.media-streaming\u002F07.realtime-latency",{"title":3144,"icon":3145,"path":3146,"stem":3147,"children":3148,"page":59},"HTML & CSS","i-devicon-html5","\u002Fhtml-css","12.html-css",[3149,3153,3157,3161,3165,3169,3173,3177,3181,3185,3189,3193,3197,3201,3205,3209,3213,3217,3221,3225,3229,3233,3237,3241,3245,3249,3253,3257,3261,3265],{"title":3150,"path":3151,"stem":3152},"Вступ до HTML. Структура документа","\u002Fhtml-css\u002Fintro-html-structure","12.html-css\u002F01.intro-html-structure",{"title":3154,"path":3155,"stem":3156},"Форматування тексту в HTML","\u002Fhtml-css\u002Fhtml-text-formatting","12.html-css\u002F02.html-text-formatting",{"title":3158,"path":3159,"stem":3160},"Посилання та зображення в HTML","\u002Fhtml-css\u002Fhtml-links-images","12.html-css\u002F03.html-links-images",{"title":3162,"path":3163,"stem":3164},"Списки та таблиці в HTML","\u002Fhtml-css\u002Fhtml-lists-tables","12.html-css\u002F04.html-lists-tables",{"title":3166,"path":3167,"stem":3168},"Форми в HTML","\u002Fhtml-css\u002Fhtml-forms","12.html-css\u002F05.html-forms",{"title":3170,"path":3171,"stem":3172},"Семантичні елементи HTML5","\u002Fhtml-css\u002Fhtml-semantic-elements","12.html-css\u002F06.html-semantic-elements",{"title":3174,"path":3175,"stem":3176},"Мультимедіа та розширені елементи HTML","\u002Fhtml-css\u002Fhtml-multimedia-advanced","12.html-css\u002F07.html-multimedia-advanced",{"title":3178,"path":3179,"stem":3180},"Мікророзмітка та SEO в HTML","\u002Fhtml-css\u002Fhtml-microdata-seo","12.html-css\u002F08.html-microdata-seo",{"title":3182,"path":3183,"stem":3184},"Вступ до CSS. Селектори та специфічність","\u002Fhtml-css\u002Fcss-intro-selectors","12.html-css\u002F09.css-intro-selectors",{"title":3186,"path":3187,"stem":3188},"Блокова модель CSS. Відступи. Box Sizing","\u002Fhtml-css\u002Fcss-box-model","12.html-css\u002F10.css-box-model",{"title":3190,"path":3191,"stem":3192},"Розміри у CSS: повний довідник одиниць і ключових слів","\u002Fhtml-css\u002F10a.css-sizing","12.html-css\u002F10a.css-sizing",{"title":3194,"path":3195,"stem":3196},"Типографіка в CSS. Шрифти та текст","\u002Fhtml-css\u002Fcss-typography","12.html-css\u002F11.css-typography",{"title":3198,"path":3199,"stem":3200},"Кольори та фони в CSS","\u002Fhtml-css\u002Fcss-colors-backgrounds","12.html-css\u002F12.css-colors-backgrounds",{"title":3202,"path":3203,"stem":3204},"Тіні та фільтри в CSS","\u002Fhtml-css\u002F12b.css-shadows-filters","12.html-css\u002F12b.css-shadows-filters",{"title":3206,"path":3207,"stem":3208},"CSS Flexbox: Фундамент гнучких макетів","\u002Fhtml-css\u002Fcss-flexbox-fundamentals","12.html-css\u002F13.css-flexbox-fundamentals",{"title":3210,"path":3211,"stem":3212},"CSS Flexbox: Вирівнювання та Позиціонування","\u002Fhtml-css\u002Fcss-flexbox-alignment-sizing-and-patterns","12.html-css\u002F14.css-flexbox-alignment-sizing-and-patterns",{"title":3214,"path":3215,"stem":3216},"CSS Grid. Двовимірний макет. Частина 1","\u002Fhtml-css\u002Fcss-layout-grid","12.html-css\u002F15.css-layout-grid",{"title":3218,"path":3219,"stem":3220},"CSS Grid. Двовимірний макет. Частина 2","\u002Fhtml-css\u002Fcss-layout-grid-advanced","12.html-css\u002F16.css-layout-grid-advanced",{"title":3222,"path":3223,"stem":3224},"Позиціонування в CSS. Z-index. Stacking Context","\u002Fhtml-css\u002Fcss-positioning","12.html-css\u002F17.css-positioning",{"title":3226,"path":3227,"stem":3228},"CSS Анімації та Переходи","\u002Fhtml-css\u002Fcss-animations-transitions","12.html-css\u002F18.css-animations-transitions",{"title":3230,"path":3231,"stem":3232},"Адаптивний дизайн. Media Queries. Частина 1","\u002Fhtml-css\u002Fcss-responsive-media-queries","12.html-css\u002F19.css-responsive-media-queries",{"title":3234,"path":3235,"stem":3236},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","\u002Fhtml-css\u002Fcss-responsive-advanced","12.html-css\u002F20.css-responsive-advanced",{"title":3238,"path":3239,"stem":3240},"CSS Custom Properties. Методології. Сучасний CSS","\u002Fhtml-css\u002Fcss-variables-methodologies","12.html-css\u002F21.css-variables-methodologies",{"title":3242,"path":3243,"stem":3244},"Сучасний CSS 2023–2025: Нові можливості","\u002Fhtml-css\u002Fcss-modern-features","12.html-css\u002F22.css-modern-features",{"title":3246,"path":3247,"stem":3248},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","\u002Fhtml-css\u002F22a.css-nesting-modern-syntax","12.html-css\u002F22a.css-nesting-modern-syntax",{"title":3250,"path":3251,"stem":3252},"CSS для форм та інтерактивних станів","\u002Fhtml-css\u002Fcss-forms-interactive-states","12.html-css\u002F23.css-forms-interactive-states",{"title":3254,"path":3255,"stem":3256},"Доступність у CSS (CSS Accessibility)","\u002Fhtml-css\u002Fcss-accessibility","12.html-css\u002F24.css-accessibility",{"title":3258,"path":3259,"stem":3260},"CSS-функції та сучасні sizing primitives","\u002Fhtml-css\u002Fcss-functions-sizing","12.html-css\u002F25.css-functions-sizing",{"title":3262,"path":3263,"stem":3264},"Rendering Pipeline і CSS Performance","\u002Fhtml-css\u002Fcss-rendering-performance","12.html-css\u002F26.css-rendering-performance",{"title":3266,"path":3267,"stem":3268},"CSS Best Practices: типові ситуації та правильні рішення","\u002Fhtml-css\u002Fcss-best-practices","12.html-css\u002F27.css-best-practices",{"title":3270,"path":3271,"stem":3272,"children":3273,"page":59},"AWS","\u002Faws","13.aws",[3274,3278,3282,3286,3290,3294,3298,3302,3306,3310,3314,3318,3322,3326,3330,3334,3338,3342],{"title":3275,"path":3276,"stem":3277},"Реєстрація AWS акаунту та студентські програми","\u002Faws\u002Faccount-registration","13.aws\u002F00.account-registration",{"title":3279,"path":3280,"stem":3281},"Вступ до хмарних обчислень та AWS","\u002Faws\u002Fintroduction-to-cloud","13.aws\u002F01.introduction-to-cloud",{"title":3283,"path":3284,"stem":3285},"AWS IAM — Identity and Access Management","\u002Faws\u002Fiam","13.aws\u002F02.iam",{"title":3287,"path":3288,"stem":3289},"AWS IAM CLI — Довідник команд","\u002Faws\u002F02a.iam-doc","13.aws\u002F02a.iam-doc",{"title":3291,"path":3292,"stem":3293},"Docker та контейнеризація в AWS — ECR, ECS та Fargate","\u002Faws\u002Fdocker-ecs","13.aws\u002F03.docker-ecs",{"title":3295,"path":3296,"stem":3297},"AWS ECR \u002F ECS CLI — Довідник команд","\u002Faws\u002F03a.docker-ecs-doc","13.aws\u002F03a.docker-ecs-doc",{"title":3299,"path":3300,"stem":3301},"Amazon EC2 — Elastic Compute Cloud","\u002Faws\u002Fec2","13.aws\u002F04.ec2",{"title":3303,"path":3304,"stem":3305},"AWS EC2 CLI — Довідник команд","\u002Faws\u002F04a.ec2-doc","13.aws\u002F04a.ec2-doc",{"title":3307,"path":3308,"stem":3309},"Elastic Load Balancing та Auto Scaling","\u002Faws\u002Falb-asg","13.aws\u002F05.alb-asg",{"title":3311,"path":3312,"stem":3313},"Amazon S3 — Simple Storage Service","\u002Faws\u002Fs3","13.aws\u002F06.s3",{"title":3315,"path":3316,"stem":3317},"Amazon CloudFront — Content Delivery Network","\u002Faws\u002Fcloudfront","13.aws\u002F07.cloudfront",{"title":3319,"path":3320,"stem":3321},"Amazon RDS — Relational Database Service","\u002Faws\u002Frds","13.aws\u002F08.rds",{"title":3323,"path":3324,"stem":3325},"Amazon DynamoDB — NoSQL Database","\u002Faws\u002Fdynamodb","13.aws\u002F09.dynamodb",{"title":3327,"path":3328,"stem":3329},"AWS Lambda та Serverless Compute","\u002Faws\u002Flambda","13.aws\u002F10.lambda",{"title":3331,"path":3332,"stem":3333},"Amazon Bedrock - Foundation Models, RAG та Agents","\u002Faws\u002Fbedrock","13.aws\u002F22.bedrock",{"title":3335,"path":3336,"stem":3337},"Amazon Rekognition - Комп'ютерний зір","\u002Faws\u002Frekognition","13.aws\u002F23.rekognition",{"title":3339,"path":3340,"stem":3341},"Amazon Textract - Інтелектуальний аналіз документів","\u002Faws\u002Ftextract","13.aws\u002F24.textract",{"title":3343,"path":3344,"stem":3345},"Amazon Polly, Transcribe, Comprehend та Translate","\u002Faws\u002Faudio-nlp-services","13.aws\u002F25.audio-nlp-services",{"title":3347,"path":3348,"stem":3349,"children":3350,"page":59},"Ai Development","\u002Fai-development","14.ai-development",[3351],{"title":3352,"path":3353,"stem":3354,"children":3355,"page":59},"Foundations","\u002Fai-development\u002Ffoundations","14.ai-development\u002F00.foundations",[3356],{"title":3357,"path":3358,"stem":3359},"Модуль 0.1. Що таке Large Language Model (LLM)","\u002Fai-development\u002Ffoundations\u002Fwhat-is-llm","14.ai-development\u002F00.foundations\u002F01.what-is-llm",{"title":3361,"path":3362,"stem":3363,"children":3364,"page":59},"React Native","\u002Freact-native","15.react-native",[3365,3386],{"title":3366,"path":3367,"stem":3368,"children":3369,"page":59},"Version1","\u002Freact-native\u002Fversion1","15.react-native\u002Fversion1",[3370,3374,3378,3382],{"title":3371,"path":3372,"stem":3373},"Що таке React Native","\u002Freact-native\u002Fversion1\u002Fwhat-is-react-native","15.react-native\u002Fversion1\u002F01.what-is-react-native",{"title":3375,"path":3376,"stem":3377},"Як влаштований React Native «під капотом»","\u002Freact-native\u002Fversion1\u002Freact-native-architecture","15.react-native\u002Fversion1\u002F02.react-native-architecture",{"title":3379,"path":3380,"stem":3381},"Від React до React Native: ключові відмінності","\u002Freact-native\u002Fversion1\u002Freact-native-vs-react","15.react-native\u002Fversion1\u002F03.react-native-vs-react",{"title":3383,"path":3384,"stem":3385},"View та Text — фундаментальні будівельні блоки","\u002Freact-native\u002Fversion1\u002Fview-and-text","15.react-native\u002Fversion1\u002F04.view-and-text",{"title":3387,"path":3388,"stem":3389,"children":3390,"page":59},"Version2","\u002Freact-native\u002Fversion2","15.react-native\u002Fversion2",[3391,3395,3399,3403,3407,3411,3415,3419,3423,3427,3431,3435,3439,3443,3447,3451,3455,3459,3463,3467,3471,3475,3479,3483,3487,3491],{"title":3392,"path":3393,"stem":3394},"React Native — навіщо він потрібен","\u002Freact-native\u002Fversion2\u002Fwhy-react-native","15.react-native\u002Fversion2\u002F01.why-react-native",{"title":3396,"path":3397,"stem":3398},"Налаштування середовища розробки","\u002Freact-native\u002Fversion2\u002Fenvironment-setup","15.react-native\u002Fversion2\u002F02.environment-setup",{"title":3400,"path":3401,"stem":3402},"Expo і класичний React Native — два шляхи одного фреймворку","\u002Freact-native\u002Fversion2\u002Fexpo-vs-cli-landscape","15.react-native\u002Fversion2\u002F03.expo-vs-cli-landscape",{"title":3404,"path":3405,"stem":3406},"Середовище Expo — перший запуск","\u002Freact-native\u002Fversion2\u002Fexpo-setup-and-tooling","15.react-native\u002Fversion2\u002F04.expo-setup-and-tooling",{"title":3408,"path":3409,"stem":3410},"Структура проєкту та перші UI-примітиви","\u002Freact-native\u002Fversion2\u002Fproject-structure-and-conventions","15.react-native\u002Fversion2\u002F05.project-structure-and-conventions",{"title":3412,"path":3413,"stem":3414},"Базові компоненти React Native","\u002Freact-native\u002Fversion2\u002Fcore-components","15.react-native\u002Fversion2\u002F06.core-components",{"title":3416,"path":3417,"stem":3418},"Flexbox і layout у React Native","\u002Freact-native\u002Fversion2\u002Fflexbox-and-layout","15.react-native\u002Fversion2\u002F07.flexbox-and-layout",{"title":3420,"path":3421,"stem":3422},"StyleSheet і теми (light \u002F dark)","\u002Freact-native\u002Fversion2\u002Fstylesheet-and-theming","15.react-native\u002Fversion2\u002F08.stylesheet-and-theming",{"title":3424,"path":3425,"stem":3426},"Списки та віртуалізація","\u002Freact-native\u002Fversion2\u002Flists-and-virtualization","15.react-native\u002Fversion2\u002F09.lists-and-virtualization",{"title":3428,"path":3429,"stem":3430},"Форми, ввід і валідація","\u002Freact-native\u002Fversion2\u002Fforms-input-validation","15.react-native\u002Fversion2\u002F10.forms-input-validation",{"title":3432,"path":3433,"stem":3434},"Основи Expo Router","\u002Freact-native\u002Fversion2\u002Fexpo-router-basics","15.react-native\u002Fversion2\u002F11.expo-router-basics",{"title":3436,"path":3437,"stem":3438},"Вкладені навігатори та модалки","\u002Freact-native\u002Fversion2\u002Fnested-navigators-and-modals","15.react-native\u002Fversion2\u002F12.nested-navigators-and-modals",{"title":3440,"path":3441,"stem":3442},"Deep linking і параметри маршрутів","\u002Freact-native\u002Fversion2\u002Fdeep-linking-and-params","15.react-native\u002Fversion2\u002F13.deep-linking-and-params",{"title":3444,"path":3445,"stem":3446},"Робота з мережею та життєвий цикл застосунку","\u002Freact-native\u002Fversion2\u002Fnetworking-and-app-lifecycle","15.react-native\u002Fversion2\u002F14.networking-and-app-lifecycle",{"title":3448,"path":3449,"stem":3450},"Redux Toolkit на мобільних платформах","\u002Freact-native\u002Fversion2\u002Fredux-toolkit-on-mobile","15.react-native\u002Fversion2\u002F15.redux-toolkit-on-mobile",{"title":3452,"path":3453,"stem":3454},"RTK Query на мобільних платформах","\u002Freact-native\u002Fversion2\u002Frtk-query-mobile","15.react-native\u002Fversion2\u002F16.rtk-query-mobile",{"title":3456,"path":3457,"stem":3458},"Автентифікація та Безпечне Зберігання","\u002Freact-native\u002Fversion2\u002Fauth-secure-storage","15.react-native\u002Fversion2\u002F18.auth-secure-storage",{"title":3460,"path":3461,"stem":3462},"Локальне сховище — AsyncStorage, MMKV, SQLite","\u002Freact-native\u002Fversion2\u002Flocal-storage-mmkv-sqlite","15.react-native\u002Fversion2\u002F19.local-storage-mmkv-sqlite",{"title":3464,"path":3465,"stem":3466},"Офлайн-First і синхронізація","\u002Freact-native\u002Fversion2\u002Foffline-first-sync","15.react-native\u002Fversion2\u002F20.offline-first-sync",{"title":3468,"path":3469,"stem":3470},"Камера, медіа та файлова система","\u002Freact-native\u002Fversion2\u002Fcamera-media-filesystem","15.react-native\u002Fversion2\u002F21.camera-media-filesystem",{"title":3472,"path":3473,"stem":3474},"Карти та геолокація","\u002Freact-native\u002Fversion2\u002Fmaps-and-location","15.react-native\u002Fversion2\u002F22.maps-and-location",{"title":3476,"path":3477,"stem":3478},"Жести та дотики","\u002Freact-native\u002Fversion2\u002Fgestures-and-touch","15.react-native\u002Fversion2\u002F23.gestures-and-touch",{"title":3480,"path":3481,"stem":3482},"Анімації з Reanimated","\u002Freact-native\u002Fversion2\u002Freanimated-animations","15.react-native\u002Fversion2\u002F24.reanimated-animations",{"title":3484,"path":3485,"stem":3486},"Push і локальні сповіщення","\u002Freact-native\u002Fversion2\u002Fpush-and-local-notifications","15.react-native\u002Fversion2\u002F25.push-and-local-notifications",{"title":3488,"path":3489,"stem":3490},"Доступність та інтернаціоналізація","\u002Freact-native\u002Fversion2\u002Faccessibility-and-i18n","15.react-native\u002Fversion2\u002F26.accessibility-and-i18n",{"title":3492,"path":3493,"stem":3494},"EAS Build та профілі збірки","\u002Freact-native\u002Fversion2\u002Feas-build-and-profiles","15.react-native\u002Fversion2\u002F29.eas-build-and-profiles",{"title":3496,"path":3497,"stem":3498,"children":3499,"page":59},"Ai Python","\u002Fai-python","16.ai-python",[3500,3504,3508],{"title":3501,"path":3502,"stem":3503},"Вступ до штучного інтелекту та машинного навчання","\u002Fai-python\u002Fintro-to-ai","16.ai-python\u002F01.intro-to-ai",{"title":3505,"path":3506,"stem":3507},"Знайомство з Jupyter Notebook та JupyterLab","\u002Fai-python\u002Fjupyter-notebook","16.ai-python\u002F02.jupyter-notebook",{"title":3509,"path":3510,"stem":3511},"Робота з даними з використанням NumPy і pandas","\u002Fai-python\u002Fnumpy-pandas","16.ai-python\u002F03.numpy-pandas",{"title":3513,"icon":658,"path":3514,"stem":3515,"children":3516,"page":59},"Клієнт-серверна архітектура","\u002Fclient-server-architecture","17.client-server-architecture",[3517,3521],{"title":3518,"path":3519,"stem":3520},"Архітектура клієнт-серверних систем та основи Go","\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go","17.client-server-architecture\u002F01.client-server-architecture-and-go",{"title":3522,"path":3523,"stem":3524},"Система типів та модель пам’яті мови Go","\u002Fclient-server-architecture\u002Ftype-system-and-memory-model","17.client-server-architecture\u002F02.type-system-and-memory-model",{"title":3526,"icon":1946,"path":3527,"stem":3528,"children":3529,"page":59},"Розробка WEB-застосувань","\u002Fweb-development","18.web-development",[3530,3575,3613,3642],{"title":3531,"icon":658,"path":3532,"stem":3533,"children":3534,"page":59},"Архітектура комп'ютерних мереж та мережеві протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols","18.web-development\u002F01.network-architecture-and-protocols",[3535,3539,3543,3547,3551,3555,3559,3563,3567,3571],{"title":3536,"path":3537,"stem":3538},"Еволюція веброзробки та модель клієнт-сервер","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fweb-evolution-client-server","18.web-development\u002F01.network-architecture-and-protocols\u002F01.web-evolution-client-server",{"title":3540,"path":3541,"stem":3542},"Еталонна модель OSI","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fosi-model","18.web-development\u002F01.network-architecture-and-protocols\u002F02.osi-model",{"title":3544,"path":3545,"stem":3546},"Стек протоколів TCP\u002FIP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-ip-stack","18.web-development\u002F01.network-architecture-and-protocols\u002F03.tcp-ip-stack",{"title":3548,"path":3549,"stem":3550},"IP-адресація, порти та сокети","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets","18.web-development\u002F01.network-architecture-and-protocols\u002F04.ip-addressing-ports-sockets",{"title":3552,"path":3553,"stem":3554},"Протоколи TCP та UDP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-udp-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F05.tcp-udp-protocols",{"title":3556,"path":3557,"stem":3558},"Система доменних імен DNS","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fdns-system","18.web-development\u002F01.network-architecture-and-protocols\u002F06.dns-system",{"title":3560,"path":3561,"stem":3562},"Протокол SMTP та поштові протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fsmtp-email-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F07.smtp-email-protocols",{"title":3564,"path":3565,"stem":3566},"Протокол WebSocket","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fwebsocket-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F08.websocket-protocol",{"title":3568,"path":3569,"stem":3570},"Протокол SSH","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fssh-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F09.ssh-protocol",{"title":3572,"path":3573,"stem":3574},"Огляд сучасних серверних технологій","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fmodern-backend-technologies","18.web-development\u002F01.network-architecture-and-protocols\u002F10.modern-backend-technologies",{"title":3576,"icon":3577,"path":3578,"stem":3579,"children":3580,"page":59},"Протокол HTTP та захищена передача даних HTTPS","i-lucide-lock","\u002Fweb-development\u002Fhttp-and-https","18.web-development\u002F02.http-and-https",[3581,3585,3589,3593,3597,3601,3605,3609],{"title":3582,"path":3583,"stem":3584},"Вступ до протоколу HTTP та еволюція веб-технологій","\u002Fweb-development\u002Fhttp-and-https\u002Fintroduction-and-evolution","18.web-development\u002F02.http-and-https\u002F01.introduction-and-evolution",{"title":3586,"path":3587,"stem":3588},"Анатомія HTTP-запиту","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-request-structure","18.web-development\u002F02.http-and-https\u002F02.http-request-structure",{"title":3590,"path":3591,"stem":3592},"Анатомія HTTP-відповіді","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-response-structure","18.web-development\u002F02.http-and-https\u002F03.http-response-structure",{"title":3594,"path":3595,"stem":3596},"Методи HTTP та їхня семантика","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-methods","18.web-development\u002F02.http-and-https\u002F04.http-methods",{"title":3598,"path":3599,"stem":3600},"Коди статусу HTTP та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-status-codes","18.web-development\u002F02.http-and-https\u002F05.http-status-codes",{"title":3602,"path":3603,"stem":3604},"HTTP-заголовки та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-headers","18.web-development\u002F02.http-and-https\u002F06.http-headers",{"title":3606,"path":3607,"stem":3608},"CORS та механізми безпеки HTTP","\u002Fweb-development\u002Fhttp-and-https\u002Fcors-and-security","18.web-development\u002F02.http-and-https\u002F07.cors-and-security",{"title":3610,"path":3611,"stem":3612},"HTTPS та криптографічні основи TLS","\u002Fweb-development\u002Fhttp-and-https\u002Fhttps-and-tls","18.web-development\u002F02.http-and-https\u002F08.https-and-tls",{"title":3614,"icon":2326,"path":3615,"stem":3616,"children":3617,"page":59},"Система типів мови TypeScript","\u002Fweb-development\u002Ftypescript-type-system","18.web-development\u002F03.typescript-type-system",[3618,3622,3626,3630,3634,3638],{"title":3619,"path":3620,"stem":3621},"Знайомство з TypeScript Compiler","\u002Fweb-development\u002Ftypescript-type-system\u002Fintroduction-compiler-config","18.web-development\u002F03.typescript-type-system\u002F01.introduction-compiler-config",{"title":3623,"path":3624,"stem":3625},"Примітивні типи даних: string, number, boolean","\u002Fweb-development\u002Ftypescript-type-system\u002Fprimitive-special-types","18.web-development\u002F03.typescript-type-system\u002F02.primitive-special-types",{"title":3627,"path":3628,"stem":3629},"Масиви, кортежі та об","\u002Fweb-development\u002Ftypescript-type-system\u002Farrays-tuples-objects","18.web-development\u002F03.typescript-type-system\u002F03.arrays-tuples-objects",{"title":3631,"path":3632,"stem":3633},"Union типи, Intersection типи та літеральні типи","\u002Fweb-development\u002Ftypescript-type-system\u002Funion-intersection-literals","18.web-development\u002F03.typescript-type-system\u002F04.union-intersection-literals",{"title":3635,"path":3636,"stem":3637},"Type Narrowing (звуження типів)","\u002Fweb-development\u002Ftypescript-type-system\u002Ftype-narrowing","18.web-development\u002F03.typescript-type-system\u002F05.type-narrowing",{"title":3639,"path":3640,"stem":3641},"Типізація функцій","\u002Fweb-development\u002Ftypescript-type-system\u002Ffunctions-typing","18.web-development\u002F03.typescript-type-system\u002F06.functions-typing",{"title":3643,"icon":2326,"path":3644,"stem":3645,"children":3646,"page":59},"Розширені засоби мови TypeScript","\u002Fweb-development\u002Ftypescript-advanced","18.web-development\u002F04.typescript-advanced",[3647,3651,3655,3659,3663,3667],{"title":3648,"path":3649,"stem":3650},"Interfaces та Classes","\u002Fweb-development\u002Ftypescript-advanced\u002Finterfaces-classes","18.web-development\u002F04.typescript-advanced\u002F01.interfaces-classes",{"title":3652,"path":3653,"stem":3654},"Основи Generic типів","\u002Fweb-development\u002Ftypescript-advanced\u002Fgenerics-fundamentals","18.web-development\u002F04.typescript-advanced\u002F02.generics-fundamentals",{"title":3656,"path":3657,"stem":3658},"Enums та Decorators","\u002Fweb-development\u002Ftypescript-advanced\u002Fenums-decorators","18.web-development\u002F04.typescript-advanced\u002F03.enums-decorators",{"title":3660,"path":3661,"stem":3662},"Utility Types","\u002Fweb-development\u002Ftypescript-advanced\u002Futility-types","18.web-development\u002F04.typescript-advanced\u002F04.utility-types",{"title":3664,"path":3665,"stem":3666},"Mapped та Conditional Types","\u002Fweb-development\u002Ftypescript-advanced\u002Fmapped-conditional-types","18.web-development\u002F04.typescript-advanced\u002F05.mapped-conditional-types",{"title":3668,"path":3669,"stem":3670},"Модулі та Strict Mode","\u002Fweb-development\u002Ftypescript-advanced\u002Fmodules-strict-mode","18.web-development\u002F04.typescript-advanced\u002F06.modules-strict-mode",{"title":3672,"path":3673,"stem":3674,"children":3675,"page":59},"Tailwind","\u002Ftailwind","21.tailwind",[3676,3680,3684,3688,3692,3696,3700,3704,3708,3712,3716,3720],{"title":3677,"path":3678,"stem":3679},"Що таке Tailwind CSS і навіщо він потрібен","\u002Ftailwind\u002Ftailwind-intro-philosophy","21.tailwind\u002F01.tailwind-intro-philosophy",{"title":3681,"path":3682,"stem":3683},"Встановлення та налаштування Tailwind CSS v4","\u002Ftailwind\u002Ftailwind-installation-setup","21.tailwind\u002F02.tailwind-installation-setup",{"title":3685,"path":3686,"stem":3687},"Utility-класи: основи та система Tailwind","\u002Ftailwind\u002Ftailwind-utility-classes-core","21.tailwind\u002F03.tailwind-utility-classes-core",{"title":3689,"path":3690,"stem":3691},"Layout: Flexbox та Grid через Tailwind","\u002Ftailwind\u002Ftailwind-flexbox-grid","21.tailwind\u002F04.tailwind-flexbox-grid",{"title":3693,"path":3694,"stem":3695},"Кастомізація теми через @theme у Tailwind v4","\u002Ftailwind\u002Ftailwind-theme-customization","21.tailwind\u002F05.tailwind-theme-customization",{"title":3697,"path":3698,"stem":3699},"Варіанти: hover, focus, responsive, dark mode та нові v4","\u002Ftailwind\u002Ftailwind-variants-states","21.tailwind\u002F06.tailwind-variants-states",{"title":3701,"path":3702,"stem":3703},"Типографіка та система кольорів у Tailwind v4","\u002Ftailwind\u002Ftailwind-typography-colors","21.tailwind\u002F07.tailwind-typography-colors",{"title":3705,"path":3706,"stem":3707},"Компоненти та повторюваність: @apply, @utility та патерни","\u002Ftailwind\u002Ftailwind-components-patterns","21.tailwind\u002F08.tailwind-components-patterns",{"title":3709,"path":3710,"stem":3711},"Темна тема та система дизайн-токенів у Tailwind v4","\u002Ftailwind\u002Ftailwind-dark-mode-theming","21.tailwind\u002F09.tailwind-dark-mode-theming",{"title":3713,"path":3714,"stem":3715},"Довільні значення та контейнерні запити у Tailwind v4","\u002Ftailwind\u002Ftailwind-arbitrary-container-queries","21.tailwind\u002F10.tailwind-arbitrary-container-queries",{"title":3717,"path":3718,"stem":3719},"Анімації, трансформації та 3D у Tailwind v4","\u002Ftailwind\u002Ftailwind-animations-transforms","21.tailwind\u002F11.tailwind-animations-transforms",{"title":3721,"path":3722,"stem":3723},"Tailwind CLI, PostCSS та інтеграція з фреймворками","\u002Ftailwind\u002Ftailwind-cli-tooling","21.tailwind\u002F12.tailwind-cli-tooling",{"title":3725,"path":3726,"stem":3727},"Тестування компонентів діаграм","\u002Ftest-components","98.test-components",{"id":3729,"title":3518,"body":3730,"description":11646,"extension":11647,"links":11648,"meta":11649,"navigation":3963,"path":3519,"seo":11650,"stem":3520,"__hash__":11651},"docs\u002F17.client-server-architecture\u002F01.client-server-architecture-and-go.md",{"type":3731,"value":3732,"toc":11600},"minimark",[3733,3737,3797,3800,3805,3810,3827,3830,3855,3874,3881,3883,3887,3893,3902,4146,4149,4459,4487,4490,4492,4496,4499,4601,4603,4607,4610,4614,4629,4636,4748,4750,4754,4771,4778,4921,4930,4952,4954,4958,4972,4981,4995,4997,5001,5011,5018,5179,5182,5298,5300,5304,5314,5321,5414,5433,5435,5439,5445,5451,5502,5509,5715,5717,5721,5724,5751,5757,5819,5822,5824,5828,5835,5842,5897,5901,6027,6029,6033,6036,6722,6729,6731,6735,6738,6746,6748,6752,6755,6778,6780,6784,6787,6927,6934,7057,7059,7063,7066,8238,8310,8336,8338,8346,8349,8365,8368,8447,8473,8475,8479,8484,8491,8546,8549,8745,8747,8749,8753,8756,9035,9079,9340,9342,9346,9349,9356,9410,9490,9493,9610,9612,9622,9628,9635,9638,9718,9738,9740,9746,9755,9816,9819,9824,9857,9865,9874,9882,9890,9911,9918,9922,9937,9939,9943,9952,10266,10268,10274,10715,10717,10721,10727,10846,10848,10852,10855,11166,11168,11172,11178,11183,11227,11408,11428,11430,11434,11492,11494,11498,11542,11544,11548,11596],[3734,3735,3518],"h1",{"id":3736},"архітектура-клієнт-серверних-систем-та-основи-go",[3738,3739,3740,3761],"card-group",{},[3741,3742,3745],"card",{"icon":3743,"title":3744},"i-lucide-graduation-cap","🎯 Навчальні цілі",[3746,3747,3748,3752,3755,3758],"ul",{},[3749,3750,3751],"li",{},"Опанувати принципи розділення відповідальності у клієнт-серверній моделі та еволюцію від 2-Tier до N-Tier систем.",[3749,3753,3754],{},"Зрозуміти виклики гетерогенності клієнтських платформ (Desktop, Mobile, Web, CLI) та проєктування уніфікованих контрактів API.",[3749,3756,3757],{},"Дослідити стек протоколів TCP\u002FIP, механізм інкапсуляції даних та анатомію сокетного дескриптора.",[3749,3759,3760],{},"Проаналізувати архітектурні переваги мови Go (Golang) для побудови мережевих сервісів у порівнянні з класичними платформами (JVM, CLR).",[3741,3762,3764],{"icon":255,"title":3763},"🛠️ Технологічний стек",[3746,3765,3766,3773,3779],{},[3749,3767,3768,3772],{},[3769,3770,3771],"strong",{},"Мова програмування:"," Go (Golang) 1.22+",[3749,3774,3775,3778],{},[3769,3776,3777],{},"Мережеві протоколи:"," TCP, UDP, IP, HTTP\u002F1.1, HTTP\u002F2",[3749,3780,3781,3784,3785,3789,3790,3789,3793,3796],{},[3769,3782,3783],{},"Інструментарій:"," Go CLI (",[3786,3787,3788],"code",{},"go build",", ",[3786,3791,3792],{},"go mod",[3786,3794,3795],{},"go vet","), Docker, Wireshark",[3798,3799],"hr",{},[3801,3802,3804],"h2",{"id":3803},"архітектурний-контекст-та-еволюція-клієнт-серверних-систем","Архітектурний контекст та еволюція клієнт-серверних систем",[3806,3807,3809],"h3",{"id":3808},"проблема-локальних-монолітів-минулого","Проблема локальних монолітів минулого",[3811,3812,3813,3814,3818,3819,3822,3823,3826],"p",{},"На ранніх етапах розвитку обчислювальної техніки та комерційного програмного забезпечення домінуючим підходом було створення автономних локальних застосунків (",[3815,3816,3817],"em",{},"standalone applications","). У такій парадигмі графічний інтерфейс користувача (",[3815,3820,3821],{},"User Interface, UI","), бізнес-правила обробки інформації (",[3815,3824,3825],{},"Business Logic",") та файлове сховище даних знаходилися в межах одного виконуваного процесу, запущеного на конкретному персональному комп'ютері.",[3811,3828,3829],{},"Подібний підхід створював непереборні інженерні обмеження для розподілених організацій та корпоративних систем:",[3831,3832,3833,3843,3849],"ol",{},[3749,3834,3835,3842],{},[3769,3836,3837,3838,3841],{},"Відсутність єдиного джерела істини (",[3815,3839,3840],{},"Single Source of Truth","):"," Якщо кілька працівників одночасно модифікували локальні копії бази даних на різних машинах, виникав нерозв'язний конфлікт синхронізації та порушення цілісності даних.",[3749,3844,3845,3848],{},[3769,3846,3847],{},"Неможливість централізованого оновлення:"," Будь-яка зміна алгоритму (наприклад, формули нарахування податків або схеми знижок) вимагала фізичного оновлення файлів програми на кожному робочому комп'ютері підприємства.",[3749,3850,3851,3854],{},[3769,3852,3853],{},"Критичні ризики безпеки:"," Прямий доступ користувацького застосунку до фізичних файлів сховища дозволяв зловмиснику скопіювати або відредагувати конфіденційні записи в обхід будь-якої авторизації.",[3811,3856,3857,3858,3861,3862,3865,3866,3869,3870,3873],{},"Вирішенням цієї кризи стала ",[3769,3859,3860],{},"клієнт-серверна архітектура"," (",[3815,3863,3864],{},"client-server architecture",") — розподілена обчислювальна модель, у якій функціональні обов'язки чітко розмежовуються між постачальниками обчислювальних ресурсів або послуг (",[3769,3867,3868],{},"серверами",") та споживачами цих послуг (",[3769,3871,3872],{},"клієнтами",").",[3875,3876,3877,3880],"note",{},[3769,3878,3879],{},"Аналогія з реального світу:"," Уявіть сучасний комерційний банк. Клієнт не заходить безпосередньо до грошового сховища, щоб узяти готівку. Натомість він взаємодіє з касиром через стандартизоване віконце (API-інтерфейс), передаючи заповнений платіжний документ (запит). Касир (сервер) перевіряє особу клієнта (автентифікація), перевіряє залишок коштів на балансі (бізнес-логіка) і лише після цього звертається до внутрішнього сейфа (база даних), видаючи клієнту кошти (відповідь).",[3798,3882],{},[3806,3884,3886],{"id":3885},"багаторівневі-моделі-від-2-tier-до-n-tier","Багаторівневі моделі: від 2-Tier до N-Tier",[3811,3888,3889,3890,3873],{},"Еволюція клієнт-серверної парадигми супроводжувалася поступовим винесенням окремих зон відповідальності на спеціалізовані архітектурні рівні (",[3815,3891,3892],{},"tiers",[3811,3894,3895],{},[3896,3897],"img",{"alt":3898,"className":3899,"src":3901},"Еволюція клієнт-серверних архітектур: 2-Tier, 3-Tier та N-Tier",[3900],"diagram-img","\u002Fimages\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go\u002F01.png",[3903,3904,3905],"plant-uml",{"alt":3898},[3906,3907,3912],"pre",{"className":3908,"code":3909,"language":3910,"meta":3911,"style":3911},"language-plantuml shiki shiki-themes light-plus dark-plus dark-plus","@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 13\nskinparam packageFontSize 14\nskinparam rectangleFontSize 13\nskinparam sequenceMessageAlign center\n\npackage \"2-Tier Архітектура (Дворівнева)\" #F8FAFC {\n    rectangle \"Товстий клієнт (UI + Бізнес-логіка)\\n[Desktop App]\" as c2 #DBEAFE\n    database \"СУБД (PostgreSQL \u002F Oracle)\\n[Збереження даних]\" as db2 #DCFCE7\n    c2 \u003C--> db2 : Пряме SQL-з'єднання\\n(Порт 5432 \u002F 1521)\n}\n\npackage \"3-Tier Архітектура (Трирівнева)\" #F8FAFC {\n    rectangle \"Тонкий \u002F Товстий клієнт (UI)\\n[Web \u002F Mobile \u002F Desktop]\" as c3 #DBEAFE\n    rectangle \"Сервер застосунків (Application Server)\\n[Go Backend \u002F Бізнес-логіка]\" as s3 #FEF3C7\n    database \"СУБД (PostgreSQL)\\n[Збереження даних]\" as db3 #DCFCE7\n    c3 \u003C--> s3 : HTTP REST \u002F gRPC\n    s3 \u003C--> db3 : Пул з'єднань (Connection Pool)\n}\n\npackage \"N-Tier \u002F Розподілена Архітектура\" #F8FAFC {\n    rectangle \"Гетерогенні клієнти\\n(Web, iOS, Android, Desktop, CLI)\" as cn #DBEAFE\n    rectangle \"API Gateway \u002F Reverse Proxy\\n(Nginx \u002F Envoy \u002F Traefik)\" as gw #E2E8F0\n    rectangle \"Мікросервіс автентифікації\\n[Go Service]\" as ms1 #FEF3C7\n    rectangle \"Мікросервіс замовлень\\n[Go Service]\" as ms2 #FEF3C7\n    queue \"Брокер повідомлень\\n(RabbitMQ \u002F Kafka)\" as q #FCE7F3\n    database \"PostgreSQL Cluster\" as dbn #DCFCE7\n    database \"Redis Cache\" as cache #FEE2E2\n\n    cn \u003C--> gw : HTTPS \u002F WSS\n    gw --> ms1\n    gw --> ms2\n    ms2 \u003C--> cache : Швидкий кеш\n    ms2 --> q : Асинхронні події\n    ms2 \u003C--> dbn : Реляційні дані\n}\n@enduml\n","plantuml","",[3786,3913,3914,3922,3928,3934,3940,3946,3952,3958,3965,3971,3977,3983,3989,3995,4000,4006,4012,4018,4024,4030,4036,4041,4046,4052,4058,4064,4070,4076,4082,4088,4094,4099,4105,4111,4117,4123,4129,4135,4140],{"__ignoreMap":3911},[3915,3916,3919],"span",{"class":3917,"line":3918},"line",1,[3915,3920,3921],{},"@startuml\n",[3915,3923,3925],{"class":3917,"line":3924},2,[3915,3926,3927],{},"skinparam style plain\n",[3915,3929,3931],{"class":3917,"line":3930},3,[3915,3932,3933],{},"skinparam backgroundColor #FFFFFF\n",[3915,3935,3937],{"class":3917,"line":3936},4,[3915,3938,3939],{},"skinparam defaultFontSize 13\n",[3915,3941,3943],{"class":3917,"line":3942},5,[3915,3944,3945],{},"skinparam packageFontSize 14\n",[3915,3947,3949],{"class":3917,"line":3948},6,[3915,3950,3951],{},"skinparam rectangleFontSize 13\n",[3915,3953,3955],{"class":3917,"line":3954},7,[3915,3956,3957],{},"skinparam sequenceMessageAlign center\n",[3915,3959,3961],{"class":3917,"line":3960},8,[3915,3962,3964],{"emptyLinePlaceholder":3963},true,"\n",[3915,3966,3968],{"class":3917,"line":3967},9,[3915,3969,3970],{},"package \"2-Tier Архітектура (Дворівнева)\" #F8FAFC {\n",[3915,3972,3974],{"class":3917,"line":3973},10,[3915,3975,3976],{},"    rectangle \"Товстий клієнт (UI + Бізнес-логіка)\\n[Desktop App]\" as c2 #DBEAFE\n",[3915,3978,3980],{"class":3917,"line":3979},11,[3915,3981,3982],{},"    database \"СУБД (PostgreSQL \u002F Oracle)\\n[Збереження даних]\" as db2 #DCFCE7\n",[3915,3984,3986],{"class":3917,"line":3985},12,[3915,3987,3988],{},"    c2 \u003C--> db2 : Пряме SQL-з'єднання\\n(Порт 5432 \u002F 1521)\n",[3915,3990,3992],{"class":3917,"line":3991},13,[3915,3993,3994],{},"}\n",[3915,3996,3998],{"class":3917,"line":3997},14,[3915,3999,3964],{"emptyLinePlaceholder":3963},[3915,4001,4003],{"class":3917,"line":4002},15,[3915,4004,4005],{},"package \"3-Tier Архітектура (Трирівнева)\" #F8FAFC {\n",[3915,4007,4009],{"class":3917,"line":4008},16,[3915,4010,4011],{},"    rectangle \"Тонкий \u002F Товстий клієнт (UI)\\n[Web \u002F Mobile \u002F Desktop]\" as c3 #DBEAFE\n",[3915,4013,4015],{"class":3917,"line":4014},17,[3915,4016,4017],{},"    rectangle \"Сервер застосунків (Application Server)\\n[Go Backend \u002F Бізнес-логіка]\" as s3 #FEF3C7\n",[3915,4019,4021],{"class":3917,"line":4020},18,[3915,4022,4023],{},"    database \"СУБД (PostgreSQL)\\n[Збереження даних]\" as db3 #DCFCE7\n",[3915,4025,4027],{"class":3917,"line":4026},19,[3915,4028,4029],{},"    c3 \u003C--> s3 : HTTP REST \u002F gRPC\n",[3915,4031,4033],{"class":3917,"line":4032},20,[3915,4034,4035],{},"    s3 \u003C--> db3 : Пул з'єднань (Connection Pool)\n",[3915,4037,4039],{"class":3917,"line":4038},21,[3915,4040,3994],{},[3915,4042,4044],{"class":3917,"line":4043},22,[3915,4045,3964],{"emptyLinePlaceholder":3963},[3915,4047,4049],{"class":3917,"line":4048},23,[3915,4050,4051],{},"package \"N-Tier \u002F Розподілена Архітектура\" #F8FAFC {\n",[3915,4053,4055],{"class":3917,"line":4054},24,[3915,4056,4057],{},"    rectangle \"Гетерогенні клієнти\\n(Web, iOS, Android, Desktop, CLI)\" as cn #DBEAFE\n",[3915,4059,4061],{"class":3917,"line":4060},25,[3915,4062,4063],{},"    rectangle \"API Gateway \u002F Reverse Proxy\\n(Nginx \u002F Envoy \u002F Traefik)\" as gw #E2E8F0\n",[3915,4065,4067],{"class":3917,"line":4066},26,[3915,4068,4069],{},"    rectangle \"Мікросервіс автентифікації\\n[Go Service]\" as ms1 #FEF3C7\n",[3915,4071,4073],{"class":3917,"line":4072},27,[3915,4074,4075],{},"    rectangle \"Мікросервіс замовлень\\n[Go Service]\" as ms2 #FEF3C7\n",[3915,4077,4079],{"class":3917,"line":4078},28,[3915,4080,4081],{},"    queue \"Брокер повідомлень\\n(RabbitMQ \u002F Kafka)\" as q #FCE7F3\n",[3915,4083,4085],{"class":3917,"line":4084},29,[3915,4086,4087],{},"    database \"PostgreSQL Cluster\" as dbn #DCFCE7\n",[3915,4089,4091],{"class":3917,"line":4090},30,[3915,4092,4093],{},"    database \"Redis Cache\" as cache #FEE2E2\n",[3915,4095,4097],{"class":3917,"line":4096},31,[3915,4098,3964],{"emptyLinePlaceholder":3963},[3915,4100,4102],{"class":3917,"line":4101},32,[3915,4103,4104],{},"    cn \u003C--> gw : HTTPS \u002F WSS\n",[3915,4106,4108],{"class":3917,"line":4107},33,[3915,4109,4110],{},"    gw --> ms1\n",[3915,4112,4114],{"class":3917,"line":4113},34,[3915,4115,4116],{},"    gw --> ms2\n",[3915,4118,4120],{"class":3917,"line":4119},35,[3915,4121,4122],{},"    ms2 \u003C--> cache : Швидкий кеш\n",[3915,4124,4126],{"class":3917,"line":4125},36,[3915,4127,4128],{},"    ms2 --> q : Асинхронні події\n",[3915,4130,4132],{"class":3917,"line":4131},37,[3915,4133,4134],{},"    ms2 \u003C--> dbn : Реляційні дані\n",[3915,4136,4138],{"class":3917,"line":4137},38,[3915,4139,3994],{},[3915,4141,4143],{"class":3917,"line":4142},39,[3915,4144,4145],{},"@enduml\n",[3811,4147,4148],{},"Розглянемо фундаментальні характеристики кожної архітектурної моделі:",[4150,4151,4152,4178,4210,4247,4249,4253,4262,4268,4427,4431],"field-group",{},[4153,4154,4157,4164],"field",{"name":4155,"type":4156},"2-Tier (Дворівнева архітектура)","Архітектурна модель",[3811,4158,4159,4160,4163],{},"Клієнтський застосунок підключається безпосередньо до сервера бази даних через драйвер СУБД. Вся бізнес-логіка зосереджена або на клієнті, або всередині збережених процедур (",[3815,4161,4162],{},"stored procedures",") у БД.",[3746,4165,4166,4172],{},[3749,4167,4168,4171],{},[3769,4169,4170],{},"Переваги:"," Висока швидкість початкової розробки для замкнених локальних мереж підприємства.",[3749,4173,4174,4177],{},[3769,4175,4176],{},"Недоліки:"," Прямий витік облікових даних бази даних на клієнтські комп'ютери; катастрофічне вичерпання пулу з'єднань БД при збільшенні кількості користувачів (база даних не розрахована на утримання сотень тисяч одночасних відкритих сокетів).",[4153,4179,4181,4194],{"name":4180,"type":4156},"3-Tier (Трирівнева архітектура)",[3811,4182,4183,4184,3861,4187,4190,4191,3873],{},"Між клієнтом та базою даних з'являється проміжний шар — ",[3769,4185,4186],{},"сервер застосунків",[3815,4188,4189],{},"Application Server","). Клієнт звертається до сервера за стандартизованим мережевим протоколом (HTTP\u002FREST, gRPC, WebSocket), а сервер самостійно керує підключеннями до бази даних через внутрішній пул з'єднань (",[3815,4192,4193],{},"connection pool",[3746,4195,4196,4201],{},[3749,4197,4198,4200],{},[3769,4199,4170],{}," Безпека (клієнт не володіє реквізитами доступу до БД), централізована валідація, можливість масштабування обчислень окремо від збереження даних.",[3749,4202,4203,4205,4206,4209],{},[3769,4204,4176],{}," Додаткова затримка (",[3815,4207,4208],{},"network latency",") на передачу даних між рівнями.",[4153,4211,4213,4228],{"name":4212,"type":4156},"N-Tier та мікросервіси",[3811,4214,4215,4216,4219,4220,4223,4224,4227],{},"Подальша декомпозиція трирівневої моделі. Замість одного монолітного бекенду функціонують десятки незалежних сервісів, об'єднаних єдиним шлюзом (",[3815,4217,4218],{},"API Gateway","), кешуванням у пам'яті (",[3815,4221,4222],{},"Redis","), чергами асинхронних подій (",[3815,4225,4226],{},"RabbitMQ",") та розподіленими сховищами даних.",[3746,4229,4230,4238],{},[3749,4231,4232,4234,4235,3873],{},[3769,4233,4170],{}," Незалежне горизонтальне масштабування окремих компонентів системи, висока відмовостійкість (",[3815,4236,4237],{},"fault tolerance",[3749,4239,4240,4242,4243,4246],{},[3769,4241,4176],{}," Висока складність оркестрації, необхідність реалізації механізмів розподіленого трасування (",[3815,4244,4245],{},"distributed tracing",") та моніторингу.",[3798,4248],{},[3801,4250,4252],{"id":4251},"гетерогенність-клієнтських-платформ","Гетерогенність клієнтських платформ",[3811,4254,4255,4256,3861,4259,3873],{},"Сучасний бекенд-інженер ніколи не проєктує сервер виключно для одного браузера. Сервер є центральним хабом інфраструктури, до якого одночасно підключаються принципово різні за своєю природою клієнти. Здатність сервера коректно та продуктивно взаємодіяти з різними платформами називається ",[3769,4257,4258],{},"інтероперабельністю",[3815,4260,4261],{},"interoperability",[3811,4263,4264],{},[3896,4265],{"alt":4252,"className":4266,"src":4267},[3900],"\u002Fimages\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go\u002F02.png",[3903,4269,4270],{"alt":4252},[3906,4271,4273],{"className":3908,"code":4272,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 13\n\nactor \"Користувач \u002F Адміністратор\" as User\n\npackage \"Гетерогенне клієнтське оточення\" #F1F5F9 {\n    rectangle \"Desktop Client\\n(JavaFX \u002F C# Avalonia)\" as Desktop #DBEAFE\n    rectangle \"Mobile Client\\n(React Native \u002F Swift)\" as Mobile #FEF3C7\n    rectangle \"Web Client\\n(Vue \u002F Nuxt \u002F React)\" as Web #DCFCE7\n    rectangle \"CLI Утиліта\\n(Go \u002F Bash скрипти)\" as CLI #FCE7F3\n}\n\npackage \"Серверна інфраструктура (Go Backend)\" #FFFFFF {\n    rectangle \"Єдиний REST \u002F gRPC API Контракт\" as API #E2E8F0\n    rectangle \"Бізнес-логіка та сервіси\" as Core #DCFCE7\n    database \"PostgreSQL\" as DB #DBEAFE\n}\n\nUser --> Desktop\nUser --> Mobile\nUser --> Web\nUser --> CLI\n\nDesktop --> API : JSON over HTTPS \u002F TCP\nMobile --> API : Оптимізований JSON \u002F Gzip\nWeb --> API : JSON \u002F WebSocket\nCLI --> API : Token Auth \u002F JSON Streams\n\nAPI --> Core\nCore --> DB\n@enduml\n",[3786,4274,4275,4279,4283,4287,4291,4295,4300,4304,4309,4314,4319,4324,4329,4333,4337,4342,4347,4352,4357,4361,4365,4370,4375,4380,4385,4389,4394,4399,4404,4409,4413,4418,4423],{"__ignoreMap":3911},[3915,4276,4277],{"class":3917,"line":3918},[3915,4278,3921],{},[3915,4280,4281],{"class":3917,"line":3924},[3915,4282,3927],{},[3915,4284,4285],{"class":3917,"line":3930},[3915,4286,3933],{},[3915,4288,4289],{"class":3917,"line":3936},[3915,4290,3939],{},[3915,4292,4293],{"class":3917,"line":3942},[3915,4294,3964],{"emptyLinePlaceholder":3963},[3915,4296,4297],{"class":3917,"line":3948},[3915,4298,4299],{},"actor \"Користувач \u002F Адміністратор\" as User\n",[3915,4301,4302],{"class":3917,"line":3954},[3915,4303,3964],{"emptyLinePlaceholder":3963},[3915,4305,4306],{"class":3917,"line":3960},[3915,4307,4308],{},"package \"Гетерогенне клієнтське оточення\" #F1F5F9 {\n",[3915,4310,4311],{"class":3917,"line":3967},[3915,4312,4313],{},"    rectangle \"Desktop Client\\n(JavaFX \u002F C# Avalonia)\" as Desktop #DBEAFE\n",[3915,4315,4316],{"class":3917,"line":3973},[3915,4317,4318],{},"    rectangle \"Mobile Client\\n(React Native \u002F Swift)\" as Mobile #FEF3C7\n",[3915,4320,4321],{"class":3917,"line":3979},[3915,4322,4323],{},"    rectangle \"Web Client\\n(Vue \u002F Nuxt \u002F React)\" as Web #DCFCE7\n",[3915,4325,4326],{"class":3917,"line":3985},[3915,4327,4328],{},"    rectangle \"CLI Утиліта\\n(Go \u002F Bash скрипти)\" as CLI #FCE7F3\n",[3915,4330,4331],{"class":3917,"line":3991},[3915,4332,3994],{},[3915,4334,4335],{"class":3917,"line":3997},[3915,4336,3964],{"emptyLinePlaceholder":3963},[3915,4338,4339],{"class":3917,"line":4002},[3915,4340,4341],{},"package \"Серверна інфраструктура (Go Backend)\" #FFFFFF {\n",[3915,4343,4344],{"class":3917,"line":4008},[3915,4345,4346],{},"    rectangle \"Єдиний REST \u002F gRPC API Контракт\" as API #E2E8F0\n",[3915,4348,4349],{"class":3917,"line":4014},[3915,4350,4351],{},"    rectangle \"Бізнес-логіка та сервіси\" as Core #DCFCE7\n",[3915,4353,4354],{"class":3917,"line":4020},[3915,4355,4356],{},"    database \"PostgreSQL\" as DB #DBEAFE\n",[3915,4358,4359],{"class":3917,"line":4026},[3915,4360,3994],{},[3915,4362,4363],{"class":3917,"line":4032},[3915,4364,3964],{"emptyLinePlaceholder":3963},[3915,4366,4367],{"class":3917,"line":4038},[3915,4368,4369],{},"User --> Desktop\n",[3915,4371,4372],{"class":3917,"line":4043},[3915,4373,4374],{},"User --> Mobile\n",[3915,4376,4377],{"class":3917,"line":4048},[3915,4378,4379],{},"User --> Web\n",[3915,4381,4382],{"class":3917,"line":4054},[3915,4383,4384],{},"User --> CLI\n",[3915,4386,4387],{"class":3917,"line":4060},[3915,4388,3964],{"emptyLinePlaceholder":3963},[3915,4390,4391],{"class":3917,"line":4066},[3915,4392,4393],{},"Desktop --> API : JSON over HTTPS \u002F TCP\n",[3915,4395,4396],{"class":3917,"line":4072},[3915,4397,4398],{},"Mobile --> API : Оптимізований JSON \u002F Gzip\n",[3915,4400,4401],{"class":3917,"line":4078},[3915,4402,4403],{},"Web --> API : JSON \u002F WebSocket\n",[3915,4405,4406],{"class":3917,"line":4084},[3915,4407,4408],{},"CLI --> API : Token Auth \u002F JSON Streams\n",[3915,4410,4411],{"class":3917,"line":4090},[3915,4412,3964],{"emptyLinePlaceholder":3963},[3915,4414,4415],{"class":3917,"line":4096},[3915,4416,4417],{},"API --> Core\n",[3915,4419,4420],{"class":3917,"line":4101},[3915,4421,4422],{},"Core --> DB\n",[3915,4424,4425],{"class":3917,"line":4107},[3915,4426,4145],{},[3806,4428,4430],{"id":4429},"тонкі-vs-товсті-клієнти","Тонкі vs Товсті клієнти",[3738,4432,4433],{},[3741,4434,4436,4439],{"icon":2000,"title":4435},"Тонкий клієнт (Thin Client)",[3811,4437,4438],{},"Клієнтський модуль із мінімальною обчислювальною логікою. Його завдання — надіслати введені дані на сервер, отримати готовий результат і відрендерити графічний інтерфейс.",[3746,4440,4441,4447,4453],{},[3749,4442,4443,4446],{},[3769,4444,4445],{},"Типовий представник:"," Вебзастосунок у браузері (HTML\u002FCSS\u002FJS).",[3749,4448,4449,4452],{},[3769,4450,4451],{},"Плюси:"," Миттєва доставка оновлень усім користувачам, нульові вимоги до обчислювальної потужності пристрою.",[3749,4454,4455,4458],{},[3769,4456,4457],{},"Мінуси:"," Повна непрацездатність за відсутності стабільного мережевого з'єднання.",[3741,4460,4463,4466],{"icon":4461,"title":4462},"i-lucide-smartphone","Товстий \u002F Розумний клієнт (Rich \u002F Thick Client)",[3811,4464,4465],{},"Клієнтський застосунок, що виконує значну частину обробки локально (валідація, локальне кешування у SQLite, робота з апаратними датчиками пристрою).",[3746,4467,4468,4473,4482],{},[3749,4469,4470,4472],{},[3769,4471,4445],{}," Мобільні застосунки (React Native \u002F Swift), десктопні системи (JavaFX \u002F Avalonia).",[3749,4474,4475,4477,4478,4481],{},[3769,4476,4451],{}," Підтримка роботи в режимі офлайн (",[3815,4479,4480],{},"Offline-First","), плавний UI з високою частотою кадрів.",[3749,4483,4484,4486],{},[3769,4485,4457],{}," Складність версіонування — клієнти можуть місяцями не оновлювати програму в магазинах додатків.",[3811,4488,4489],{},"::",[3798,4491],{},[3806,4493,4495],{"id":4494},"спектр-платформ-та-їхні-мережеві-вимоги","Спектр платформ та їхні мережеві вимоги",[3811,4497,4498],{},"При проєктуванні архітектури серверних API необхідно враховувати фундаментальні відмінності клієнтських середовищ:",[4500,4501,4502,4522],"table",{},[4503,4504,4505],"thead",{},[4506,4507,4508,4513,4516,4519],"tr",{},[4509,4510,4512],"th",{"align":4511},"left","Платформа",[4509,4514,4515],{"align":4511},"Технологічний стек",[4509,4517,4518],{"align":4511},"Особливості мережевого каналу",[4509,4520,4521],{"align":4511},"Вимоги до бекенду на Go",[4523,4524,4525,4542,4558,4582],"tbody",{},[4506,4526,4527,4533,4536,4539],{},[4528,4529,4530],"td",{"align":4511},[3769,4531,4532],{},"Desktop",[4528,4534,4535],{"align":4511},"JavaFX, C# WPF, .NET Avalonia UI",[4528,4537,4538],{"align":4511},"Зазвичай стабільне високошвидкісне дротове або Wi-Fi з'єднання.",[4528,4540,4541],{"align":4511},"Можливість тривалого утримання TCP\u002FWebSocket сесій, передача великих пакетів даних.",[4506,4543,4544,4549,4552,4555],{},[4528,4545,4546],{"align":4511},[3769,4547,4548],{},"Mobile",[4528,4550,4551],{"align":4511},"React Native, Flutter, Kotlin, Swift",[4528,4553,4554],{"align":4511},"Нестабільне з'єднання (перехід між Wi-Fi та LTE\u002F5G, тунелі, ліфти).",[4528,4556,4557],{"align":4511},"Мінімізація розміру JSON (стиснення Gzip\u002FBrotli), підтримка ідемпотентності запитів, робота через короткоживучі токени.",[4506,4559,4560,4565,4568,4575],{},[4528,4561,4562],{"align":4511},[3769,4563,4564],{},"Web",[4528,4566,4567],{"align":4511},"React, Vue, Nuxt, Angular",[4528,4569,4570,4571,4574],{"align":4511},"Середовище пісочниці (",[3815,4572,4573],{},"Sandbox",") браузера з обмеженнями CORS.",[4528,4576,4577,4578,4581],{"align":4511},"Коректне налаштування заголовків ",[3786,4579,4580],{},"Access-Control-Allow-Origin",", оптимізація під HTTP\u002F2 Multiplexing.",[4506,4583,4584,4589,4592,4595],{},[4528,4585,4586],{"align":4511},[3769,4587,4588],{},"CLI \u002F DevOps",[4528,4590,4591],{"align":4511},"Консольні утиліти, Cron-джоби, скрипти",[4528,4593,4594],{"align":4511},"Локальні або хмарні мережі з високою швидкістю передачі.",[4528,4596,4597,4598,3873],{"align":4511},"Підтримка автентифікації через API Keys \u002F Personal Access Tokens, потоковий вивід логів без буферизації (",[3815,4599,4600],{},"chunked transfer",[3798,4602],{},[3801,4604,4606],{"id":4605},"мережевий-фундамент-модель-osi-та-стек-tcpip","Мережевий фундамент: Модель OSI та стек TCP\u002FIP",[3811,4608,4609],{},"Для побудови надійних клієнт-серверних застосунків розробник повинен чітко розуміти шлях, який долають байти інформації від користувацького інтерфейсу до операційної системи сервера.",[3806,4611,4613],{"id":4612},"зіставлення-моделі-osi-та-стеку-tcpip","Зіставлення моделі OSI та стеку TCP\u002FIP",[3811,4615,4616,4617,4620,4621,4624,4625,4628],{},"Теоретична еталонна модель взаємодії відкритих систем (",[3769,4618,4619],{},"OSI"," — ",[3815,4622,4623],{},"Open Systems Interconnection",") описує 7 рівнів абстракції. На практиці глобальна мережа Інтернет функціонує на базі більш лаконічного 4-рівневого стеку протоколів ",[3769,4626,4627],{},"TCP\u002FIP",":",[3811,4630,4631],{},[3896,4632],{"alt":4633,"className":4634,"src":4635},"Зіставлення 7 рівнів моделі OSI та 4 рівнів стеку TCP\u002FIP",[3900],"\u002Fimages\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go\u002F03.png",[3903,4637,4638],{"alt":4633},[3906,4639,4641],{"className":3908,"code":4640,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 13\n\ntitle Зіставлення моделі OSI та стеку TCP\u002FIP\n\nrectangle \"7. Прикладний (Application)\\n6. Представлення (Presentation)\\n5. Сеансовий (Session)\" as osi_app #DBEAFE\nrectangle \"4. Транспортний (Transport)\" as osi_trans #FEF3C7\nrectangle \"3. Мережевий (Network)\" as osi_net #DCFCE7\nrectangle \"2. Канальний (Data Link)\\n1. Фізичний (Physical)\" as osi_phys #F1F5F9\n\nrectangle \"Прикладний рівень (Application Layer)\\n[HTTP\u002F1.1, HTTP\u002F2, gRPC, WebSocket, DNS, SMTP]\" as tcp_app #DBEAFE\nrectangle \"Транспортний рівень (Transport Layer)\\n[TCP (Transmission Control), UDP (User Datagram)]\" as tcp_trans #FEF3C7\nrectangle \"Мережевий \u002F Міжмережевий рівень (Internet Layer)\\n[IP (IPv4, IPv6), ICMP]\" as tcp_net #DCFCE7\nrectangle \"Рівень мережевого доступу (Network Access Layer)\\n[Ethernet, Wi-Fi, Оптоволокно]\" as tcp_phys #F1F5F9\n\nosi_app .right.> tcp_app : Об'єднуються\nosi_trans .right.> tcp_trans : Пряма відповідність\nosi_net .right.> tcp_net : Пряма відповідність\nosi_phys .right.> tcp_phys : Об'єднуються\n\n@enduml\n",[3786,4642,4643,4647,4651,4655,4659,4663,4668,4672,4677,4682,4687,4692,4696,4701,4706,4711,4716,4720,4725,4730,4735,4740,4744],{"__ignoreMap":3911},[3915,4644,4645],{"class":3917,"line":3918},[3915,4646,3921],{},[3915,4648,4649],{"class":3917,"line":3924},[3915,4650,3927],{},[3915,4652,4653],{"class":3917,"line":3930},[3915,4654,3933],{},[3915,4656,4657],{"class":3917,"line":3936},[3915,4658,3939],{},[3915,4660,4661],{"class":3917,"line":3942},[3915,4662,3964],{"emptyLinePlaceholder":3963},[3915,4664,4665],{"class":3917,"line":3948},[3915,4666,4667],{},"title Зіставлення моделі OSI та стеку TCP\u002FIP\n",[3915,4669,4670],{"class":3917,"line":3954},[3915,4671,3964],{"emptyLinePlaceholder":3963},[3915,4673,4674],{"class":3917,"line":3960},[3915,4675,4676],{},"rectangle \"7. Прикладний (Application)\\n6. Представлення (Presentation)\\n5. Сеансовий (Session)\" as osi_app #DBEAFE\n",[3915,4678,4679],{"class":3917,"line":3967},[3915,4680,4681],{},"rectangle \"4. Транспортний (Transport)\" as osi_trans #FEF3C7\n",[3915,4683,4684],{"class":3917,"line":3973},[3915,4685,4686],{},"rectangle \"3. Мережевий (Network)\" as osi_net #DCFCE7\n",[3915,4688,4689],{"class":3917,"line":3979},[3915,4690,4691],{},"rectangle \"2. Канальний (Data Link)\\n1. Фізичний (Physical)\" as osi_phys #F1F5F9\n",[3915,4693,4694],{"class":3917,"line":3985},[3915,4695,3964],{"emptyLinePlaceholder":3963},[3915,4697,4698],{"class":3917,"line":3991},[3915,4699,4700],{},"rectangle \"Прикладний рівень (Application Layer)\\n[HTTP\u002F1.1, HTTP\u002F2, gRPC, WebSocket, DNS, SMTP]\" as tcp_app #DBEAFE\n",[3915,4702,4703],{"class":3917,"line":3997},[3915,4704,4705],{},"rectangle \"Транспортний рівень (Transport Layer)\\n[TCP (Transmission Control), UDP (User Datagram)]\" as tcp_trans #FEF3C7\n",[3915,4707,4708],{"class":3917,"line":4002},[3915,4709,4710],{},"rectangle \"Мережевий \u002F Міжмережевий рівень (Internet Layer)\\n[IP (IPv4, IPv6), ICMP]\" as tcp_net #DCFCE7\n",[3915,4712,4713],{"class":3917,"line":4008},[3915,4714,4715],{},"rectangle \"Рівень мережевого доступу (Network Access Layer)\\n[Ethernet, Wi-Fi, Оптоволокно]\" as tcp_phys #F1F5F9\n",[3915,4717,4718],{"class":3917,"line":4014},[3915,4719,3964],{"emptyLinePlaceholder":3963},[3915,4721,4722],{"class":3917,"line":4020},[3915,4723,4724],{},"osi_app .right.> tcp_app : Об'єднуються\n",[3915,4726,4727],{"class":3917,"line":4026},[3915,4728,4729],{},"osi_trans .right.> tcp_trans : Пряма відповідність\n",[3915,4731,4732],{"class":3917,"line":4032},[3915,4733,4734],{},"osi_net .right.> tcp_net : Пряма відповідність\n",[3915,4736,4737],{"class":3917,"line":4038},[3915,4738,4739],{},"osi_phys .right.> tcp_phys : Об'єднуються\n",[3915,4741,4742],{"class":3917,"line":4043},[3915,4743,3964],{"emptyLinePlaceholder":3963},[3915,4745,4746],{"class":3917,"line":4048},[3915,4747,4145],{},[3798,4749],{},[3806,4751,4753],{"id":4752},"механізм-інкапсуляції-та-деінкапсуляції-даних","Механізм інкапсуляції та деінкапсуляції даних",[3811,4755,4756,4757,3861,4760,4763,4764,4767,4768,3873],{},"Коли клієнт (наприклад, мобільний застосунок) надсилає JSON-документ на сервер, дані проходять через процес ",[3769,4758,4759],{},"інкапсуляції",[3815,4761,4762],{},"encapsulation","): кожен рівень стеку додає до корисного навантаження (",[3815,4765,4766],{},"payload",") свій службовий заголовок (",[3815,4769,4770],{},"header",[3811,4772,4773],{},[3896,4774],{"alt":4775,"className":4776,"src":4777},"Інкапсуляція мережевих пакетів",[3900],"\u002Fimages\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go\u002F04.png",[3903,4779,4780],{"alt":4775},[3906,4781,4783],{"className":3908,"code":4782,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 12\n\ntitle Інкапсуляція даних при передачі по мережі\n\nrectangle \"Прикладні дані (HTTP Request \u002F JSON Payload)\" as payload #E2E8F0\n\nrectangle \"TCP Сегмент\" as tcp_seg #FEF3C7 {\n    rectangle \"TCP Заголовок\\n(Source Port: 54321, Dest Port: 80, Seq, Ack)\" as tcp_h #FDE68A\n    rectangle \"HTTP Payload\" as p1 #E2E8F0\n}\n\nrectangle \"IP Пакет\" as ip_pkt #DCFCE7 {\n    rectangle \"IP Заголовок\\n(Source IP: 192.168.1.50, Dest IP: 93.184.216.34)\" as ip_h #BBF7D0\n    rectangle \"TCP Сегмент\" as p2 #FEF3C7\n}\n\nrectangle \"Ethernet Кадр (Frame)\" as eth_frame #DBEAFE {\n    rectangle \"Ethernet Заголовок\\n(MAC Source, MAC Dest)\" as eth_h #BFDBFE\n    rectangle \"IP Пакет\" as p3 #DCFCE7\n    rectangle \"FCS (CRC)\" as eth_fcs #BFDBFE\n}\n\npayload -down-> tcp_seg : Транспортний рівень\ntcp_seg -down-> ip_pkt : Мережевий рівень\nip_pkt -down-> eth_frame : Канальний рівень\n\n@enduml\n",[3786,4784,4785,4789,4793,4797,4802,4806,4811,4815,4820,4824,4829,4834,4839,4843,4847,4852,4857,4862,4866,4870,4875,4880,4885,4890,4894,4898,4903,4908,4913,4917],{"__ignoreMap":3911},[3915,4786,4787],{"class":3917,"line":3918},[3915,4788,3921],{},[3915,4790,4791],{"class":3917,"line":3924},[3915,4792,3927],{},[3915,4794,4795],{"class":3917,"line":3930},[3915,4796,3933],{},[3915,4798,4799],{"class":3917,"line":3936},[3915,4800,4801],{},"skinparam defaultFontSize 12\n",[3915,4803,4804],{"class":3917,"line":3942},[3915,4805,3964],{"emptyLinePlaceholder":3963},[3915,4807,4808],{"class":3917,"line":3948},[3915,4809,4810],{},"title Інкапсуляція даних при передачі по мережі\n",[3915,4812,4813],{"class":3917,"line":3954},[3915,4814,3964],{"emptyLinePlaceholder":3963},[3915,4816,4817],{"class":3917,"line":3960},[3915,4818,4819],{},"rectangle \"Прикладні дані (HTTP Request \u002F JSON Payload)\" as payload #E2E8F0\n",[3915,4821,4822],{"class":3917,"line":3967},[3915,4823,3964],{"emptyLinePlaceholder":3963},[3915,4825,4826],{"class":3917,"line":3973},[3915,4827,4828],{},"rectangle \"TCP Сегмент\" as tcp_seg #FEF3C7 {\n",[3915,4830,4831],{"class":3917,"line":3979},[3915,4832,4833],{},"    rectangle \"TCP Заголовок\\n(Source Port: 54321, Dest Port: 80, Seq, Ack)\" as tcp_h #FDE68A\n",[3915,4835,4836],{"class":3917,"line":3985},[3915,4837,4838],{},"    rectangle \"HTTP Payload\" as p1 #E2E8F0\n",[3915,4840,4841],{"class":3917,"line":3991},[3915,4842,3994],{},[3915,4844,4845],{"class":3917,"line":3997},[3915,4846,3964],{"emptyLinePlaceholder":3963},[3915,4848,4849],{"class":3917,"line":4002},[3915,4850,4851],{},"rectangle \"IP Пакет\" as ip_pkt #DCFCE7 {\n",[3915,4853,4854],{"class":3917,"line":4008},[3915,4855,4856],{},"    rectangle \"IP Заголовок\\n(Source IP: 192.168.1.50, Dest IP: 93.184.216.34)\" as ip_h #BBF7D0\n",[3915,4858,4859],{"class":3917,"line":4014},[3915,4860,4861],{},"    rectangle \"TCP Сегмент\" as p2 #FEF3C7\n",[3915,4863,4864],{"class":3917,"line":4020},[3915,4865,3994],{},[3915,4867,4868],{"class":3917,"line":4026},[3915,4869,3964],{"emptyLinePlaceholder":3963},[3915,4871,4872],{"class":3917,"line":4032},[3915,4873,4874],{},"rectangle \"Ethernet Кадр (Frame)\" as eth_frame #DBEAFE {\n",[3915,4876,4877],{"class":3917,"line":4038},[3915,4878,4879],{},"    rectangle \"Ethernet Заголовок\\n(MAC Source, MAC Dest)\" as eth_h #BFDBFE\n",[3915,4881,4882],{"class":3917,"line":4043},[3915,4883,4884],{},"    rectangle \"IP Пакет\" as p3 #DCFCE7\n",[3915,4886,4887],{"class":3917,"line":4048},[3915,4888,4889],{},"    rectangle \"FCS (CRC)\" as eth_fcs #BFDBFE\n",[3915,4891,4892],{"class":3917,"line":4054},[3915,4893,3994],{},[3915,4895,4896],{"class":3917,"line":4060},[3915,4897,3964],{"emptyLinePlaceholder":3963},[3915,4899,4900],{"class":3917,"line":4066},[3915,4901,4902],{},"payload -down-> tcp_seg : Транспортний рівень\n",[3915,4904,4905],{"class":3917,"line":4072},[3915,4906,4907],{},"tcp_seg -down-> ip_pkt : Мережевий рівень\n",[3915,4909,4910],{"class":3917,"line":4078},[3915,4911,4912],{},"ip_pkt -down-> eth_frame : Канальний рівень\n",[3915,4914,4915],{"class":3917,"line":4084},[3915,4916,3964],{"emptyLinePlaceholder":3963},[3915,4918,4919],{"class":3917,"line":4090},[3915,4920,4145],{},[3811,4922,4923,4924,3861,4927,3841],{},"Коли сигнал надходить на мережеву карту сервера, операційна система виконує зворотний процес — ",[3769,4925,4926],{},"деінкапсуляцію",[3815,4928,4929],{},"de-encapsulation",[3831,4931,4932,4935,4938,4949],{},[3749,4933,4934],{},"Мережева карта зчитує Ethernet-кадр, перевіряє контрольну суму (CRC) та передає вміст вище.",[3749,4936,4937],{},"Драйвер мережевого рівня знімає IP-заголовок, перевіряючи, чи збігається IP-адреса призначення з адресою хоста.",[3749,4939,4940,4941,4944,4945,4948],{},"Транспортний рівень стеку ядра ОС знімає TCP-заголовок, збирає сегменти в правильному порядку за номерами послідовності (",[3815,4942,4943],{},"sequence numbers",") та визначає цільовий сокет за ",[3769,4946,4947],{},"номером порту",".",[3749,4950,4951],{},"Програма на Go отримує чистий байтовий потік прикладних даних.",[3798,4953],{},[3806,4955,4957],{"id":4956},"анатомія-сокета-берклі-від-абстракції-ос-до-байтових-буферів","Анатомія сокета Берклі: від абстракції ОС до байтових буферів",[3811,4959,4960,4961,3861,4964,4967,4968,4971],{},"Для прикладного програміста мережа починається не з транзисторів мережевої карти, а з абстракції операційної системи, яка має назву ",[3769,4962,4963],{},"сокет Берклі",[3815,4965,4966],{},"Berkeley Sockets API"," \u002F ",[3815,4969,4970],{},"POSIX Sockets","). Цей стандарт був розроблений в Каліфорнійському університеті в Берклі у 1983 році для операційної системи BSD Unix і став загальноприйнятим стандартом для всіх сучасних операційних систем (Linux, macOS, Windows).",[3811,4973,4974,4975,3861,4978,3873],{},"Щоб зрозуміти сокет, потрібно згадати фундаментальний принцип Unix-подібних систем: ",[3769,4976,4977],{},"«Усе є файлом»",[3815,4979,4980],{},"Everything is a file",[3875,4982,4983,4986,4987,4990,4991,4994],{},[3769,4984,4985],{},"Концептуальне визначення:"," Сокет — це спеціальний кінцевий об'єкт операційної системи (файловий дескриптор), який зв'язує користувацький процес із мережевим стеком ядра. Програма взаємодіє з сокетом точно так само, як зі звичайним відкритим файлом на диску: через операції читання ",[3786,4988,4989],{},"Read()"," та запису ",[3786,4992,4993],{},"Write()",". Різниця полягає лише в тому, що байти записуються не на диск, а передаються через мережеву карту у виглядів пакетів віддаленому комп'ютеру.",[3798,4996],{},[3806,4998,5000],{"id":4999},"внутрішня-будова-сокета-в-памяті-ядра-ос","Внутрішня будова сокета в пам'яті ядра ОС",[3811,5002,5003,5004,3861,5007,5010],{},"Коли програма створює сокет, операційна система виділяє в ",[3769,5005,5006],{},"просторі ядра",[3815,5008,5009],{},"Kernel Space",") спеціальну структуру даних, яка містить системні буфери, черги та метадані з'єднання.",[3811,5012,5013],{},[3896,5014],{"alt":5015,"className":5016,"src":5017},"Внутрішня архітектура сокета в ядрі операційної системи",[3900],"\u002Fimages\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go\u002F05.png",[3903,5019,5020],{"alt":5015},[3906,5021,5023],{"className":3908,"code":5022,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 12\n\npackage \"Простір користувача (User Space)\" #F8FAFC {\n    rectangle \"Go Застосунок\\n(Серверний код)\" as App #DCFCE7\n}\n\npackage \"Простір ядра операційної системи (Kernel Space)\" #FFFFFF {\n    rectangle \"Сокетний дескриптор (File Descriptor 7)\\n---\\n• Тип: AF_INET \u002F SOCK_STREAM (TCP)\\n• Стан: ESTABLISHED\\n• 5-Tuple ідентифікатор\" as SockFD #DBEAFE\n\n    rectangle \"Буфер прийому (RX Buffer)\\n[Черга вхідних байтів від клієнта]\" as RX #FEF3C7\n    rectangle \"Буфер відправки (TX Buffer)\\n[Черга вихідних байтів до клієнта]\" as TX #FEE2E2\n\n    queue \"SYN Queue (Напіввідкриті)\" as SynQ #E2E8F0\n    queue \"Accept Queue (Готові з'єднання)\" as AccQ #DCFCE7\n}\n\npackage \"Апаратний рівень\" #F1F5F9 {\n    rectangle \"Мережева карта (NIC \u002F Ethernet \u002F Wi-Fi)\" as NIC #DBEAFE\n}\n\nApp --> SockFD : Системні виклики (read \u002F write \u002F close)\nSockFD --> RX : Читання (Read копіює дані)\nApp --> TX : Запис (Write копіює дані)\n\nNIC --> RX : Прямий доступ до пам'яті (DMA)\nTX --> NIC : Передача кадрів у мережу\n\nNIC --> SynQ : Пакет SYN\nSynQ --> AccQ : 3-Way Handshake завершено\nAccQ --> App : net.Listener.Accept()\n@enduml\n",[3786,5024,5025,5029,5033,5037,5041,5045,5050,5055,5059,5063,5068,5073,5077,5082,5087,5091,5096,5101,5105,5109,5114,5119,5123,5127,5132,5137,5142,5146,5151,5156,5160,5165,5170,5175],{"__ignoreMap":3911},[3915,5026,5027],{"class":3917,"line":3918},[3915,5028,3921],{},[3915,5030,5031],{"class":3917,"line":3924},[3915,5032,3927],{},[3915,5034,5035],{"class":3917,"line":3930},[3915,5036,3933],{},[3915,5038,5039],{"class":3917,"line":3936},[3915,5040,4801],{},[3915,5042,5043],{"class":3917,"line":3942},[3915,5044,3964],{"emptyLinePlaceholder":3963},[3915,5046,5047],{"class":3917,"line":3948},[3915,5048,5049],{},"package \"Простір користувача (User Space)\" #F8FAFC {\n",[3915,5051,5052],{"class":3917,"line":3954},[3915,5053,5054],{},"    rectangle \"Go Застосунок\\n(Серверний код)\" as App #DCFCE7\n",[3915,5056,5057],{"class":3917,"line":3960},[3915,5058,3994],{},[3915,5060,5061],{"class":3917,"line":3967},[3915,5062,3964],{"emptyLinePlaceholder":3963},[3915,5064,5065],{"class":3917,"line":3973},[3915,5066,5067],{},"package \"Простір ядра операційної системи (Kernel Space)\" #FFFFFF {\n",[3915,5069,5070],{"class":3917,"line":3979},[3915,5071,5072],{},"    rectangle \"Сокетний дескриптор (File Descriptor 7)\\n---\\n• Тип: AF_INET \u002F SOCK_STREAM (TCP)\\n• Стан: ESTABLISHED\\n• 5-Tuple ідентифікатор\" as SockFD #DBEAFE\n",[3915,5074,5075],{"class":3917,"line":3985},[3915,5076,3964],{"emptyLinePlaceholder":3963},[3915,5078,5079],{"class":3917,"line":3991},[3915,5080,5081],{},"    rectangle \"Буфер прийому (RX Buffer)\\n[Черга вхідних байтів від клієнта]\" as RX #FEF3C7\n",[3915,5083,5084],{"class":3917,"line":3997},[3915,5085,5086],{},"    rectangle \"Буфер відправки (TX Buffer)\\n[Черга вихідних байтів до клієнта]\" as TX #FEE2E2\n",[3915,5088,5089],{"class":3917,"line":4002},[3915,5090,3964],{"emptyLinePlaceholder":3963},[3915,5092,5093],{"class":3917,"line":4008},[3915,5094,5095],{},"    queue \"SYN Queue (Напіввідкриті)\" as SynQ #E2E8F0\n",[3915,5097,5098],{"class":3917,"line":4014},[3915,5099,5100],{},"    queue \"Accept Queue (Готові з'єднання)\" as AccQ #DCFCE7\n",[3915,5102,5103],{"class":3917,"line":4020},[3915,5104,3994],{},[3915,5106,5107],{"class":3917,"line":4026},[3915,5108,3964],{"emptyLinePlaceholder":3963},[3915,5110,5111],{"class":3917,"line":4032},[3915,5112,5113],{},"package \"Апаратний рівень\" #F1F5F9 {\n",[3915,5115,5116],{"class":3917,"line":4038},[3915,5117,5118],{},"    rectangle \"Мережева карта (NIC \u002F Ethernet \u002F Wi-Fi)\" as NIC #DBEAFE\n",[3915,5120,5121],{"class":3917,"line":4043},[3915,5122,3994],{},[3915,5124,5125],{"class":3917,"line":4048},[3915,5126,3964],{"emptyLinePlaceholder":3963},[3915,5128,5129],{"class":3917,"line":4054},[3915,5130,5131],{},"App --> SockFD : Системні виклики (read \u002F write \u002F close)\n",[3915,5133,5134],{"class":3917,"line":4060},[3915,5135,5136],{},"SockFD --> RX : Читання (Read копіює дані)\n",[3915,5138,5139],{"class":3917,"line":4066},[3915,5140,5141],{},"App --> TX : Запис (Write копіює дані)\n",[3915,5143,5144],{"class":3917,"line":4072},[3915,5145,3964],{"emptyLinePlaceholder":3963},[3915,5147,5148],{"class":3917,"line":4078},[3915,5149,5150],{},"NIC --> RX : Прямий доступ до пам'яті (DMA)\n",[3915,5152,5153],{"class":3917,"line":4084},[3915,5154,5155],{},"TX --> NIC : Передача кадрів у мережу\n",[3915,5157,5158],{"class":3917,"line":4090},[3915,5159,3964],{"emptyLinePlaceholder":3963},[3915,5161,5162],{"class":3917,"line":4096},[3915,5163,5164],{},"NIC --> SynQ : Пакет SYN\n",[3915,5166,5167],{"class":3917,"line":4101},[3915,5168,5169],{},"SynQ --> AccQ : 3-Way Handshake завершено\n",[3915,5171,5172],{"class":3917,"line":4107},[3915,5173,5174],{},"AccQ --> App : net.Listener.Accept()\n",[3915,5176,5177],{"class":3917,"line":4113},[3915,5178,4145],{},[3811,5180,5181],{},"Розглянемо ключові внутрішні компоненти сокета:",[4150,5183,5184,5216,5252,5262],{},[4153,5185,5188,5191],{"name":5186,"type":5187},"Буфер прийому (RX Buffer \u002F Receive Buffer)","Пам'ять ядра",[3811,5189,5190],{},"Виділена ділянка пам'яті ядра, куди мережева карта записує байти, отримані з мережі.",[3746,5192,5193,5196,5206],{},[3749,5194,5195],{},"Коли приходить TCP-сегмент, стек ядра перевіряє контрольну суму, видаляє заголовок TCP і розміщує корисні байти в RX Buffer.",[3749,5197,5198,5199,5202,5203,4948],{},"Коли програма викликає ",[3786,5200,5201],{},"conn.Read(buffer)",", дані ",[3769,5204,5205],{},"копіюються з буфера ядра у зріз пам'яті користувацького процесу",[3749,5207,5208,5209,5212,5213,3873],{},"Якщо процес читає дані повільніше, ніж вони надходять, буфер заповнюється. При досягненні 100% заповнення TCP надсилає відправнику заголовок із нульовим розміром вікна (",[3815,5210,5211],{},"Window Size = 0","), що змушує клієнта призупинити передачу (механізм ",[3815,5214,5215],{},"TCP Flow Control",[4153,5217,5219,5222],{"name":5218,"type":5187},"Буфер відправки (TX Buffer \u002F Transmit Buffer)",[3811,5220,5221],{},"Виділена ділянка пам'яті ядра, куди записуються дані, які програма хоче відправити.",[3746,5223,5224,5239],{},[3749,5225,5226,5227,5230,5231,5234,5235,5238],{},"⚠️ ",[3769,5228,5229],{},"Критичний нюанс:"," Виклик ",[3786,5232,5233],{},"conn.Write(data)"," вважається успішним і повертає керування ",[3769,5236,5237],{},"не тоді, коли дані дійшли до отримувача",", а як тільки операційна система скопіювала байти з вашої змінної у TX Buffer ядра.",[3749,5240,5241,5242,5244,5245,5248,5249,4948],{},"Якщо мережевий кабель перевантажений або клієнт повільний, TX Buffer заповнюється, і наступний виклик ",[3786,5243,4993],{}," блокується або повертає помилку ",[3786,5246,5247],{},"EAGAIN","\u002F",[3786,5250,5251],{},"EWOULDBLOCK",[4153,5253,5256,5257,4948],{"name":5254,"type":5255},"Ідентифікатор з'єднання (5-Tuple)","Адресація","Унікальний паспорт з'єднання, за яким мережевий стек ядра миттєво знаходить відповідний сокет у хеш-таблиці активних сесій: ",[5258,5259],"math-formula",{":inline":5260,"tex":5261},"true","\\text{Socket Session} = \\{\\text{Protocol}, \\text{SrcIP}, \\text{SrcPort}, \\text{DstIP}, \\text{DstPort}\\}",[4153,5263,5266,5269],{"name":5264,"type":5265},"Черги з'єднань (SYN Queue та Accept Queue)","Слухаючий сокет",[3811,5267,5268],{},"Серверний слухаючий сокет має дві внутрішні черги ядра:",[3831,5270,5271,5289],{},[3749,5272,5273,5276,5277,5280,5281,5284,5285,5288],{},[3769,5274,5275],{},"SYN Queue (Backlog напіввідкритих з'єднань):"," зберігає з'єднання, які отримали ",[3786,5278,5279],{},"SYN",", надіслали ",[3786,5282,5283],{},"SYN-ACK",", але ще чекають фінального ",[3786,5286,5287],{},"ACK"," від клієнта.",[3749,5290,5291,5294,5295,4948],{},[3769,5292,5293],{},"Accept Queue (Backlog готових з'єднань):"," зберігає повністю встановлені сесії (Handshake completed), які очікують, поки ваш код викличе ",[3786,5296,5297],{},"net.Listener.Accept()",[3798,5299],{},[3806,5301,5303],{"id":5302},"типи-сокетів-та-адресні-сімейства","Типи сокетів та адресні сімейства",[3811,5305,5306,5307,5310,5311,4948],{},"При створенні сокета в операційній системі визначаються два базові параметри: ",[3769,5308,5309],{},"сімейство адрес"," та ",[3769,5312,5313],{},"тип передачі даних",[3811,5315,5316],{},[3896,5317],{"alt":5318,"className":5319,"src":5320},"Класифікація сокетів у системі POSIX",[3900],"\u002Fimages\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go\u002F06.png",[3903,5322,5323],{"alt":5318},[3906,5324,5326],{"className":3908,"code":5325,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 13\n\npackage \"Сокети в системі POSIX\" #F8FAFC {\n    package \"Адресні сімейства (Address Family \u002F Domain)\" #DBEAFE {\n        rectangle \"AF_INET\\n(IPv4 адресація)\" as inet #BFDBFE\n        rectangle \"AF_INET6\\n(IPv6 адресація)\" as inet6 #BFDBFE\n        rectangle \"AF_UNIX \u002F AF_LOCAL\\n(Локальний IPC між процесами)\" as unix #BFDBFE\n    }\n\n    package \"Типи передачі (Socket Types)\" #DCFCE7 {\n        rectangle \"SOCK_STREAM\\n(TCP: потоковий, надійний, зі збереженням порядку)\" as stream #BBF7D0\n        rectangle \"SOCK_DGRAM\\n(UDP: датаграмний, без з'єднання, швидкий)\" as dgram #BBF7D0\n        rectangle \"SOCK_RAW\\n(Прямий доступ до мережевих IP\u002FICMP пакетів)\" as raw #BBF7D0\n    }\n}\n@enduml\n",[3786,5327,5328,5332,5336,5340,5344,5348,5353,5358,5363,5368,5373,5378,5382,5387,5392,5397,5402,5406,5410],{"__ignoreMap":3911},[3915,5329,5330],{"class":3917,"line":3918},[3915,5331,3921],{},[3915,5333,5334],{"class":3917,"line":3924},[3915,5335,3927],{},[3915,5337,5338],{"class":3917,"line":3930},[3915,5339,3933],{},[3915,5341,5342],{"class":3917,"line":3936},[3915,5343,3939],{},[3915,5345,5346],{"class":3917,"line":3942},[3915,5347,3964],{"emptyLinePlaceholder":3963},[3915,5349,5350],{"class":3917,"line":3948},[3915,5351,5352],{},"package \"Сокети в системі POSIX\" #F8FAFC {\n",[3915,5354,5355],{"class":3917,"line":3954},[3915,5356,5357],{},"    package \"Адресні сімейства (Address Family \u002F Domain)\" #DBEAFE {\n",[3915,5359,5360],{"class":3917,"line":3960},[3915,5361,5362],{},"        rectangle \"AF_INET\\n(IPv4 адресація)\" as inet #BFDBFE\n",[3915,5364,5365],{"class":3917,"line":3967},[3915,5366,5367],{},"        rectangle \"AF_INET6\\n(IPv6 адресація)\" as inet6 #BFDBFE\n",[3915,5369,5370],{"class":3917,"line":3973},[3915,5371,5372],{},"        rectangle \"AF_UNIX \u002F AF_LOCAL\\n(Локальний IPC між процесами)\" as unix #BFDBFE\n",[3915,5374,5375],{"class":3917,"line":3979},[3915,5376,5377],{},"    }\n",[3915,5379,5380],{"class":3917,"line":3985},[3915,5381,3964],{"emptyLinePlaceholder":3963},[3915,5383,5384],{"class":3917,"line":3991},[3915,5385,5386],{},"    package \"Типи передачі (Socket Types)\" #DCFCE7 {\n",[3915,5388,5389],{"class":3917,"line":3997},[3915,5390,5391],{},"        rectangle \"SOCK_STREAM\\n(TCP: потоковий, надійний, зі збереженням порядку)\" as stream #BBF7D0\n",[3915,5393,5394],{"class":3917,"line":4002},[3915,5395,5396],{},"        rectangle \"SOCK_DGRAM\\n(UDP: датаграмний, без з'єднання, швидкий)\" as dgram #BBF7D0\n",[3915,5398,5399],{"class":3917,"line":4008},[3915,5400,5401],{},"        rectangle \"SOCK_RAW\\n(Прямий доступ до мережевих IP\u002FICMP пакетів)\" as raw #BBF7D0\n",[3915,5403,5404],{"class":3917,"line":4014},[3915,5405,5377],{},[3915,5407,5408],{"class":3917,"line":4020},[3915,5409,3994],{},[3915,5411,5412],{"class":3917,"line":4026},[3915,5413,4145],{},[5415,5416,5417,5420,5421,5424,5425,5428,5429,5432],"tip",{},[3769,5418,5419],{},"Чому важливо знати про AF_UNIX (Unix Domain Sockets)?","\nЯкщо ви запускаєте два процеси на одному сервері (наприклад, Nginx як зворотний проксі та бекенд-сервер на Go), з'єднання через класичний TCP сокет ",[3786,5422,5423],{},"127.0.0.1:8080"," виконує повну інкапсуляцію в TCP\u002FIP заголовки та розрахунок контрольних сум. Використання замість цього Unix Domain Socket (",[3786,5426,5427],{},"\u002Ftmp\u002Fapp.sock",") передає байти безпосередньо через оперативну пам'ять ядра, що збільшує пропускну здатність на ",[3769,5430,5431],{},"25–40%"," і знижує затримку.",[3798,5434],{},[3806,5436,5438],{"id":5437},"життєвий-цикл-сокетів-слухаючий-сокет-проти-сокета-даних","Життєвий цикл сокетів: Слухаючий сокет проти Сокета даних",[3811,5440,5441,5442],{},"Найпоширеніша плутанина серед студентів: ",[3815,5443,5444],{},"«Якщо сервер слухає порт 8080, то всі клієнти спілкуються через цей самий сокет?»",[3811,5446,5447,5450],{},[3769,5448,5449],{},"Відповідь: Ні."," У серверному застосунку існують сокети двох принципово різних типів:",[3831,5452,5453,5472],{},[3749,5454,5455,5461],{},[3769,5456,5457,5458,3841],{},"Слухаючий сокет (",[3815,5459,5460],{},"Listening Socket \u002F Master Socket",[3746,5462,5463,5469],{},[3749,5464,5465,5466,4948],{},"Створюється викликом ",[3786,5467,5468],{},"net.Listen(\"tcp\", \":8080\")",[3749,5470,5471],{},"Не передає прикладних даних. Його єдина задача — «сидіти на порту 8080» і приймати нові запити на підключення від клієнтів.",[3749,5473,5474,5480],{},[3769,5475,5476,5477,3841],{},"Сокет даних \u002F Сокет з'єднання (",[3815,5478,5479],{},"Connected \u002F Data Socket",[3746,5481,5482,5485,5495],{},[3749,5483,5484],{},"Створюється ядром операційної системи у момент завершення 3-Way Handshake.",[3749,5486,5487,5488,5491,5492,4948],{},"Повертається викликом ",[3786,5489,5490],{},"listener.Accept()"," як об'єкт ",[3786,5493,5494],{},"net.Conn",[3749,5496,5497,5498,5501],{},"Має свій власний незалежний номер дескриптора (наприклад, ",[3786,5499,5500],{},"#7","), власні буфери RX\u002FTX і служить виключно для обміну повідомленнями з цим конкретним клієнтом.",[3811,5503,5504],{},[3896,5505],{"alt":5506,"className":5507,"src":5508},"Послідовність системних викликів Berkeley Sockets",[3900],"\u002Fimages\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go\u002F07.png",[3903,5510,5511],{"alt":5506},[3906,5512,5514],{"className":3908,"code":5513,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam sequenceMessageAlign center\nautonumber\n\nparticipant \"Клієнтський процес\" as Client #DBEAFE\nparticipant \"Ядро ОС (Kernel)\" as OS #E2E8F0\nparticipant \"Серверний процес (Go)\" as Server #DCFCE7\n\nnote over Server\n  1. Ініціалізація сервера:\n  socket(AF_INET, SOCK_STREAM) -> fd #3\n  bind(fd #3, 0.0.0.0:8080)\n  listen(fd #3, backlog=128)\nend note\n\nServer -> OS : listener.Accept() [Блокується в очікуванні]\n\nClient -> OS : socket() + connect(192.168.1.1:8080)\nOS \u003C-> Client : TCP 3-Way Handshake (SYN -> SYN-ACK -> ACK)\n\nnote over OS\n  Ядро створює НОВИЙ сокет з'єднання!\n  Client: 192.168.1.50:54321\n  Server: 192.168.1.1:8080\n  Новий дескриптор: fd #4\nend note\n\nOS --> Server : Accept() розблоковується, повертає fd #4 (net.Conn)\nServer -> Server : go handleConnection(conn) [Окрема горутина]\nServer -> OS : listener.Accept() [Знову чекає на наступного клієнта]\n\nClient -> OS : write(fd, \"GET \u002F HTTP\u002F1.1\")\nOS -> Server : conn.Read(buf) [Читання з RX буфера fd #4]\nServer -> OS : conn.Write(buf) [Запис у TX буфер fd #4]\nOS -> Client : TCP Data Segment (HTTP 200 OK)\n\nClient -> OS : close() -> FIN\nServer -> OS : conn.Close() -> FIN\nnote over OS : Звільнення fd #4 та буферів\n@enduml\n",[3786,5515,5516,5520,5524,5528,5532,5537,5541,5546,5551,5556,5560,5565,5570,5575,5580,5585,5590,5594,5599,5603,5608,5613,5617,5622,5627,5632,5637,5642,5646,5650,5655,5660,5665,5669,5674,5679,5684,5689,5693,5698,5704,5710],{"__ignoreMap":3911},[3915,5517,5518],{"class":3917,"line":3918},[3915,5519,3921],{},[3915,5521,5522],{"class":3917,"line":3924},[3915,5523,3927],{},[3915,5525,5526],{"class":3917,"line":3930},[3915,5527,3933],{},[3915,5529,5530],{"class":3917,"line":3936},[3915,5531,3957],{},[3915,5533,5534],{"class":3917,"line":3942},[3915,5535,5536],{},"autonumber\n",[3915,5538,5539],{"class":3917,"line":3948},[3915,5540,3964],{"emptyLinePlaceholder":3963},[3915,5542,5543],{"class":3917,"line":3954},[3915,5544,5545],{},"participant \"Клієнтський процес\" as Client #DBEAFE\n",[3915,5547,5548],{"class":3917,"line":3960},[3915,5549,5550],{},"participant \"Ядро ОС (Kernel)\" as OS #E2E8F0\n",[3915,5552,5553],{"class":3917,"line":3967},[3915,5554,5555],{},"participant \"Серверний процес (Go)\" as Server #DCFCE7\n",[3915,5557,5558],{"class":3917,"line":3973},[3915,5559,3964],{"emptyLinePlaceholder":3963},[3915,5561,5562],{"class":3917,"line":3979},[3915,5563,5564],{},"note over Server\n",[3915,5566,5567],{"class":3917,"line":3985},[3915,5568,5569],{},"  1. Ініціалізація сервера:\n",[3915,5571,5572],{"class":3917,"line":3991},[3915,5573,5574],{},"  socket(AF_INET, SOCK_STREAM) -> fd #3\n",[3915,5576,5577],{"class":3917,"line":3997},[3915,5578,5579],{},"  bind(fd #3, 0.0.0.0:8080)\n",[3915,5581,5582],{"class":3917,"line":4002},[3915,5583,5584],{},"  listen(fd #3, backlog=128)\n",[3915,5586,5587],{"class":3917,"line":4008},[3915,5588,5589],{},"end note\n",[3915,5591,5592],{"class":3917,"line":4014},[3915,5593,3964],{"emptyLinePlaceholder":3963},[3915,5595,5596],{"class":3917,"line":4020},[3915,5597,5598],{},"Server -> OS : listener.Accept() [Блокується в очікуванні]\n",[3915,5600,5601],{"class":3917,"line":4026},[3915,5602,3964],{"emptyLinePlaceholder":3963},[3915,5604,5605],{"class":3917,"line":4032},[3915,5606,5607],{},"Client -> OS : socket() + connect(192.168.1.1:8080)\n",[3915,5609,5610],{"class":3917,"line":4038},[3915,5611,5612],{},"OS \u003C-> Client : TCP 3-Way Handshake (SYN -> SYN-ACK -> ACK)\n",[3915,5614,5615],{"class":3917,"line":4043},[3915,5616,3964],{"emptyLinePlaceholder":3963},[3915,5618,5619],{"class":3917,"line":4048},[3915,5620,5621],{},"note over OS\n",[3915,5623,5624],{"class":3917,"line":4054},[3915,5625,5626],{},"  Ядро створює НОВИЙ сокет з'єднання!\n",[3915,5628,5629],{"class":3917,"line":4060},[3915,5630,5631],{},"  Client: 192.168.1.50:54321\n",[3915,5633,5634],{"class":3917,"line":4066},[3915,5635,5636],{},"  Server: 192.168.1.1:8080\n",[3915,5638,5639],{"class":3917,"line":4072},[3915,5640,5641],{},"  Новий дескриптор: fd #4\n",[3915,5643,5644],{"class":3917,"line":4078},[3915,5645,5589],{},[3915,5647,5648],{"class":3917,"line":4084},[3915,5649,3964],{"emptyLinePlaceholder":3963},[3915,5651,5652],{"class":3917,"line":4090},[3915,5653,5654],{},"OS --> Server : Accept() розблоковується, повертає fd #4 (net.Conn)\n",[3915,5656,5657],{"class":3917,"line":4096},[3915,5658,5659],{},"Server -> Server : go handleConnection(conn) [Окрема горутина]\n",[3915,5661,5662],{"class":3917,"line":4101},[3915,5663,5664],{},"Server -> OS : listener.Accept() [Знову чекає на наступного клієнта]\n",[3915,5666,5667],{"class":3917,"line":4107},[3915,5668,3964],{"emptyLinePlaceholder":3963},[3915,5670,5671],{"class":3917,"line":4113},[3915,5672,5673],{},"Client -> OS : write(fd, \"GET \u002F HTTP\u002F1.1\")\n",[3915,5675,5676],{"class":3917,"line":4119},[3915,5677,5678],{},"OS -> Server : conn.Read(buf) [Читання з RX буфера fd #4]\n",[3915,5680,5681],{"class":3917,"line":4125},[3915,5682,5683],{},"Server -> OS : conn.Write(buf) [Запис у TX буфер fd #4]\n",[3915,5685,5686],{"class":3917,"line":4131},[3915,5687,5688],{},"OS -> Client : TCP Data Segment (HTTP 200 OK)\n",[3915,5690,5691],{"class":3917,"line":4137},[3915,5692,3964],{"emptyLinePlaceholder":3963},[3915,5694,5695],{"class":3917,"line":4142},[3915,5696,5697],{},"Client -> OS : close() -> FIN\n",[3915,5699,5701],{"class":3917,"line":5700},40,[3915,5702,5703],{},"Server -> OS : conn.Close() -> FIN\n",[3915,5705,5707],{"class":3917,"line":5706},41,[3915,5708,5709],{},"note over OS : Звільнення fd #4 та буферів\n",[3915,5711,5713],{"class":3917,"line":5712},42,[3915,5714,4145],{},[3798,5716],{},[3806,5718,5720],{"id":5719},"як-go-працює-з-сокетами-під-капотом-магія-runtime-netpoller","Як Go працює з сокетами під капотом: Магія Runtime Netpoller",[3811,5722,5723],{},"У класичному сокетному програмуванні на C або C++ існує дилема:",[3746,5725,5726,5738],{},[3749,5727,5728,5230,5734,5737],{},[3769,5729,5730,5731,3841],{},"Блокуючі сокети (",[3815,5732,5733],{},"Blocking I\u002FO",[3786,5735,5736],{},"read()"," зупиняє весь потік ОС до приходу даних. Щоб обслужити 10 000 клієнтів, потрібно 10 000 важких потоків ОС, що призводить до вичерпання пам'яті.",[3749,5739,5740,5746,5747,5750],{},[3769,5741,5742,5743,3841],{},"Неблокуючі сокети з мультиплексуванням (",[3815,5744,5745],{},"Non-blocking I\u002FO + epoll\u002Fkqueue"," Складний асинхронний код на базі функцій зворотного виклику (",[3815,5748,5749],{},"callbacks",") або кінцевих автоматів (як у Node.js або Nginx), де дуже складно читати та налагоджувати код.",[3811,5752,5753,5756],{},[3769,5754,5755],{},"Рішення мови Go — Netpoller:","\nGo поєднує простоту синхронного блокуючого коду з надзвичайною швидкістю неблокуючого введення\u002Fвиведення.",[3831,5758,5759,5776,5786,5803,5806],{},[3749,5760,5761,5762,5765,5766,5769,5770,3861,5773,3873],{},"Коли ви пишете ",[3786,5763,5764],{},"net.Listen"," або ",[3786,5767,5768],{},"net.Dial",", Go відкриває сокет у системі ",[3769,5771,5772],{},"завжди в неблокуючому режимі",[3786,5774,5775],{},"O_NONBLOCK",[3749,5777,5778,5779,5782,5783,5785],{},"Коли горутина викликає ",[3786,5780,5781],{},"conn.Read(buf)",", а в буфері ядра RX ще немає даних, операційна система повертає статус ",[3786,5784,5247],{}," («даних немає»).",[3749,5787,5788,5789,5799,5800,4948],{},"Замість того, щоб зависнути або повернути помилку розробнику, середовище виконання Go автоматично реєструє дескриптор сокета в системному мультиплексорі ядра (",[3769,5790,5791,5794,5795,5798],{},[3786,5792,5793],{},"epoll"," у Linux, ",[3786,5796,5797],{},"kqueue"," у macOS",") і ",[3769,5801,5802],{},"присипляє поточну горутину",[3749,5804,5805],{},"Потік процесора ОС миттєво перемикається на виконання іншої корисної роботи!",[3749,5807,5808,5809,5811,5812,5815,5816,5818],{},"Як тільки мережева карта отримує байти і ",[3786,5810,5793],{}," сигналізує про готовність, внутрішній планувальник ",[3769,5813,5814],{},"Netpoller"," миттєво будить сплячу горутину, і виклик ",[3786,5817,4989],{}," прозоро повертає прочитані байти.",[3811,5820,5821],{},"Для розробника на Go код виглядає як звичайний послідовний синхронний код, але під капотом він працює з максимальною ефективністю сучасного асинхронного ядра ОС.",[3798,5823],{},[3801,5825,5827],{"id":5826},"чому-саме-go-для-бекенд-систем-інженерний-аналіз","Чому саме Go для бекенд-систем? Інженерний аналіз",[3811,5829,5830,5831,5834],{},"У сучасному ІТ-секторі існує чимало мов програмування: Java, C#, Python, JavaScript (Node.js), Rust. Чому ж компанії масштабу Google, Uber, Cloudflare, Netflix та тисячі інших обирають саме ",[3769,5832,5833],{},"Go (Golang)"," для побудови мережевої інфраструктури, мікросервісів та високонавантажених API?",[3811,5836,5837],{},[3896,5838],{"alt":5839,"className":5840,"src":5841},"Філософія та інженерні стовпи Go",[3900],"\u002Fimages\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go\u002F08.png",[3903,5843,5844],{"alt":5839},[3906,5845,5847],{"className":3908,"code":5846,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 13\n\npackage \"Філософія та сила Go\" #F8FAFC {\n    rectangle \"Надзвичайна простота\\n• 25 ключових слів\\n• Відсутність наслідування\\n• Качина типізація\" as Simplicity #DBEAFE\n    rectangle \"Висока швидкодія\\n• Нативна компіляція\\n• Холодний старт (5–20 мс)\\n• Низьколатентний GC\" as Performance #DCFCE7\n    rectangle \"CSP Конкурентність\\n• Горутини (2 КБ стек)\\n• Типізовані канали\\n• Планувальник GMP\" as Concurrency #FEF3C7\n}\n@enduml\n",[3786,5848,5849,5853,5857,5861,5865,5869,5874,5879,5884,5889,5893],{"__ignoreMap":3911},[3915,5850,5851],{"class":3917,"line":3918},[3915,5852,3921],{},[3915,5854,5855],{"class":3917,"line":3924},[3915,5856,3927],{},[3915,5858,5859],{"class":3917,"line":3930},[3915,5860,3933],{},[3915,5862,5863],{"class":3917,"line":3936},[3915,5864,3939],{},[3915,5866,5867],{"class":3917,"line":3942},[3915,5868,3964],{"emptyLinePlaceholder":3963},[3915,5870,5871],{"class":3917,"line":3948},[3915,5872,5873],{},"package \"Філософія та сила Go\" #F8FAFC {\n",[3915,5875,5876],{"class":3917,"line":3954},[3915,5877,5878],{},"    rectangle \"Надзвичайна простота\\n• 25 ключових слів\\n• Відсутність наслідування\\n• Качина типізація\" as Simplicity #DBEAFE\n",[3915,5880,5881],{"class":3917,"line":3960},[3915,5882,5883],{},"    rectangle \"Висока швидкодія\\n• Нативна компіляція\\n• Холодний старт (5–20 мс)\\n• Низьколатентний GC\" as Performance #DCFCE7\n",[3915,5885,5886],{"class":3917,"line":3967},[3915,5887,5888],{},"    rectangle \"CSP Конкурентність\\n• Горутини (2 КБ стек)\\n• Типізовані канали\\n• Планувальник GMP\" as Concurrency #FEF3C7\n",[3915,5890,5891],{"class":3917,"line":3973},[3915,5892,3994],{},[3915,5894,5895],{"class":3917,"line":3979},[3915,5896,4145],{},[3806,5898,5900],{"id":5899},"архітектурне-порівняння-go-vs-java-jvm-vs-python","Архітектурне порівняння: Go vs Java (JVM) vs Python",[4150,5902,5903,5942,5977,6007],{},[4153,5904,5907],{"name":5905,"type":5906},"Модель компіляції та виконання","Порівняння",[3746,5908,5909,5922,5932],{},[3749,5910,5911,5914,5915,5918,5919,3873],{},[3769,5912,5913],{},"Java:"," Вихідний код компілюється в проміжний байткод (",[3786,5916,5917],{},".class","), який виконується віртуальною машиною JVM через механізм JIT (",[3815,5920,5921],{},"Just-In-Time Compilation",[3749,5923,5924,5927,5928,5931],{},[3769,5925,5926],{},"Python:"," Інтерпретована мова з глобальним блокуванням інтерпретатора (",[3815,5929,5930],{},"GIL — Global Interpreter Lock","), що суттєво обмежує паралелізм на рівні потоків.",[3749,5933,5934,5937,5938,5941],{},[3769,5935,5936],{},"Go:"," Компілюється безпосередньо у ",[3769,5939,5940],{},"статично скомпільований нативний машинний код"," під цільову архітектуру процесора (x86_64, ARM64).",[4153,5943,5945],{"name":5944,"type":5906},"Споживання пам'яті та потокова модель",[3746,5946,5947,5961],{},[3749,5948,5949,5952,5953,5956,5957,5960],{},[3769,5950,5951],{},"Java \u002F C#:"," Традиційно використовують потоки операційної системи (",[3815,5954,5955],{},"OS Kernel Threads","). Кожен потік виділяє фіксований стек розміром ",[3769,5958,5959],{},"1–2 МБ",". Створення 10 000 потоків потребує ~10–20 ГБ оперативної пам'яті лише на утримання стеків.",[3749,5962,5963,5965,5966,3861,5969,5972,5973,5976],{},[3769,5964,5936],{}," Використовує ",[3769,5967,5968],{},"горутини",[3815,5970,5971],{},"Goroutines",") — легковагі користувацькі потоки під керуванням власного планувальника GMP. Початковий розмір стека горутини становить лише ",[3769,5974,5975],{},"2 КБ"," і динамічно зростає або зменшується в купі за потребою. Створення 100 000 горутин у Go займає лише ~200–300 МБ оперативної пам'яті.",[4153,5978,5980],{"name":5979,"type":5906},"Збирач сміття (Garbage Collector)",[3746,5981,5982,5994],{},[3749,5983,5984,5986,5987,5990,5991,3873],{},[3769,5985,5913],{}," Потужний, але складний GC, що оптимізує максимальну пропускну здатність (",[3815,5988,5989],{},"throughput","), проте історично страждав від тривалих пауз повної зупинки світу (",[3815,5992,5993],{},"Stop-The-World, STW",[3749,5995,5996,5998,5999,6002,6003,6006],{},[3769,5997,5936],{}," GC спроєктований спеціально для мережевих сервісів із низькою затримкою (",[3815,6000,6001],{},"low latency","). Паузи STW у сучасному Go становлять ",[3769,6004,6005],{},"менше 1 мілісекунди"," (зазвичай кілька десятків мікросекунд).",[4153,6008,6010],{"name":6009,"type":5906},"Холодний старт (Cold Start)",[3746,6011,6012,6018],{},[3749,6013,6014,6017],{},[3769,6015,6016],{},"Java (Spring Boot):"," Прогрів JVM, завантаження класів та сканування рефлексії займає від 3 до 30 секунд.",[3749,6019,6020,6022,6023,6026],{},[3769,6021,5936],{}," Запуск бінарного файлу відбувається за ",[3769,6024,6025],{},"5–20 мілісекунд",", що робить Go ідеальним для контейнеризованих середовищ Kubernetes та Serverless-функцій.",[3798,6028],{},[3806,6030,6032],{"id":6031},"порівняння-створення-мінімального-http-сервера","Порівняння створення мінімального HTTP-сервера",[3811,6034,6035],{},"Порівняємо реалізацію найпростішого HTTP-ендпоінта мовами Java та Go:",[6037,6038,6039,6484],"code-group",{},[3906,6040,6045],{"className":6041,"code":6042,"filename":6043,"language":6044,"meta":3911,"style":3911},"language-go shiki shiki-themes light-plus dark-plus dark-plus","package main\n\nimport (\n    \"encoding\u002Fjson\"\n    \"log\"\n    \"net\u002Fhttp\"\n)\n\ntype HealthResponse struct {\n    Status  string `json:\"status\"`\n    Service string `json:\"service\"`\n}\n\nfunc healthHandler(w http.ResponseWriter, r *http.Request) {\n    resp := HealthResponse{\n        Status:  \"OK\",\n        Service: \"Client-Server Demo API\",\n    }\n\n    w.Header().Set(\"Content-Type\", \"application\u002Fjson\")\n    w.WriteHeader(http.StatusOK)\n    if err := json.NewEncoder(w).Encode(resp); err != nil {\n        log.Printf(\"Помилка серіалізації: %v\", err)\n    }\n}\n\nfunc main() {\n    http.HandleFunc(\"\u002Fapi\u002Fv1\u002Fhealth\", healthHandler)\n\n    log.Println(\"Сервер запущено на порту :8080...\")\n    if err := http.ListenAndServe(\":8080\", nil); err != nil {\n        log.Fatalf(\"Помилка запуску сервера: %v\", err)\n    }\n}\n","Go: main.go","go",[3786,6046,6047,6057,6061,6071,6077,6082,6087,6092,6096,6110,6122,6133,6137,6141,6183,6197,6211,6224,6228,6232,6260,6280,6326,6353,6357,6361,6365,6375,6397,6401,6418,6452,6476,6480],{"__ignoreMap":3911},[3915,6048,6049,6053],{"class":3917,"line":3918},[3915,6050,6052],{"class":6051},"su1O8","package",[3915,6054,6056],{"class":6055},"sN1BT"," main\n",[3915,6058,6059],{"class":3917,"line":3924},[3915,6060,3964],{"emptyLinePlaceholder":3963},[3915,6062,6063,6067],{"class":3917,"line":3930},[3915,6064,6066],{"class":6065},"s8xlr","import",[3915,6068,6070],{"class":6069},"sHH4Y"," (\n",[3915,6072,6073],{"class":3917,"line":3936},[3915,6074,6076],{"class":6075},"sbdoH","    \"encoding\u002Fjson\"\n",[3915,6078,6079],{"class":3917,"line":3942},[3915,6080,6081],{"class":6075},"    \"log\"\n",[3915,6083,6084],{"class":3917,"line":3948},[3915,6085,6086],{"class":6075},"    \"net\u002Fhttp\"\n",[3915,6088,6089],{"class":3917,"line":3954},[3915,6090,6091],{"class":6069},")\n",[3915,6093,6094],{"class":3917,"line":3960},[3915,6095,3964],{"emptyLinePlaceholder":3963},[3915,6097,6098,6101,6104,6107],{"class":3917,"line":3967},[3915,6099,6100],{"class":6051},"type",[3915,6102,6103],{"class":6055}," HealthResponse",[3915,6105,6106],{"class":6051}," struct",[3915,6108,6109],{"class":6069}," {\n",[3915,6111,6112,6116,6119],{"class":3917,"line":3973},[3915,6113,6115],{"class":6114},"siwwj","    Status",[3915,6117,6118],{"class":6055},"  string",[3915,6120,6121],{"class":6075}," `json:\"status\"`\n",[3915,6123,6124,6127,6130],{"class":3917,"line":3979},[3915,6125,6126],{"class":6114},"    Service",[3915,6128,6129],{"class":6055}," string",[3915,6131,6132],{"class":6075}," `json:\"service\"`\n",[3915,6134,6135],{"class":3917,"line":3985},[3915,6136,3994],{"class":6069},[3915,6138,6139],{"class":3917,"line":3991},[3915,6140,3964],{"emptyLinePlaceholder":3963},[3915,6142,6143,6146,6150,6153,6156,6159,6161,6164,6166,6169,6172,6175,6177,6180],{"class":3917,"line":3997},[3915,6144,6145],{"class":6051},"func",[3915,6147,6149],{"class":6148},"s8Opu"," healthHandler",[3915,6151,6152],{"class":6069},"(",[3915,6154,6155],{"class":6114},"w",[3915,6157,6158],{"class":6055}," http",[3915,6160,4948],{"class":6069},[3915,6162,6163],{"class":6055},"ResponseWriter",[3915,6165,3789],{"class":6069},[3915,6167,6168],{"class":6114},"r",[3915,6170,6171],{"class":6069}," *",[3915,6173,6174],{"class":6055},"http",[3915,6176,4948],{"class":6069},[3915,6178,6179],{"class":6055},"Request",[3915,6181,6182],{"class":6069},") {\n",[3915,6184,6185,6188,6191,6194],{"class":3917,"line":4002},[3915,6186,6187],{"class":6114},"    resp",[3915,6189,6190],{"class":6069}," := ",[3915,6192,6193],{"class":6055},"HealthResponse",[3915,6195,6196],{"class":6069},"{\n",[3915,6198,6199,6202,6205,6208],{"class":3917,"line":4008},[3915,6200,6201],{"class":6114},"        Status",[3915,6203,6204],{"class":6069},":  ",[3915,6206,6207],{"class":6075},"\"OK\"",[3915,6209,6210],{"class":6069},",\n",[3915,6212,6213,6216,6219,6222],{"class":3917,"line":4014},[3915,6214,6215],{"class":6114},"        Service",[3915,6217,6218],{"class":6069},": ",[3915,6220,6221],{"class":6075},"\"Client-Server Demo API\"",[3915,6223,6210],{"class":6069},[3915,6225,6226],{"class":3917,"line":4020},[3915,6227,5377],{"class":6069},[3915,6229,6230],{"class":3917,"line":4026},[3915,6231,3964],{"emptyLinePlaceholder":3963},[3915,6233,6234,6237,6239,6242,6245,6248,6250,6253,6255,6258],{"class":3917,"line":4032},[3915,6235,6236],{"class":6114},"    w",[3915,6238,4948],{"class":6069},[3915,6240,6241],{"class":6148},"Header",[3915,6243,6244],{"class":6069},"().",[3915,6246,6247],{"class":6148},"Set",[3915,6249,6152],{"class":6069},[3915,6251,6252],{"class":6075},"\"Content-Type\"",[3915,6254,3789],{"class":6069},[3915,6256,6257],{"class":6075},"\"application\u002Fjson\"",[3915,6259,6091],{"class":6069},[3915,6261,6262,6264,6266,6269,6271,6273,6275,6278],{"class":3917,"line":4038},[3915,6263,6236],{"class":6114},[3915,6265,4948],{"class":6069},[3915,6267,6268],{"class":6148},"WriteHeader",[3915,6270,6152],{"class":6069},[3915,6272,6174],{"class":6114},[3915,6274,4948],{"class":6069},[3915,6276,6277],{"class":6114},"StatusOK",[3915,6279,6091],{"class":6069},[3915,6281,6282,6285,6288,6290,6293,6295,6298,6300,6302,6304,6307,6309,6312,6315,6318,6321,6324],{"class":3917,"line":4043},[3915,6283,6284],{"class":6065},"    if",[3915,6286,6287],{"class":6114}," err",[3915,6289,6190],{"class":6069},[3915,6291,6292],{"class":6114},"json",[3915,6294,4948],{"class":6069},[3915,6296,6297],{"class":6148},"NewEncoder",[3915,6299,6152],{"class":6069},[3915,6301,6155],{"class":6114},[3915,6303,3873],{"class":6069},[3915,6305,6306],{"class":6148},"Encode",[3915,6308,6152],{"class":6069},[3915,6310,6311],{"class":6114},"resp",[3915,6313,6314],{"class":6069},"); ",[3915,6316,6317],{"class":6114},"err",[3915,6319,6320],{"class":6069}," != ",[3915,6322,6323],{"class":6051},"nil",[3915,6325,6109],{"class":6069},[3915,6327,6328,6331,6333,6336,6338,6341,6344,6347,6349,6351],{"class":3917,"line":4048},[3915,6329,6330],{"class":6114},"        log",[3915,6332,4948],{"class":6069},[3915,6334,6335],{"class":6148},"Printf",[3915,6337,6152],{"class":6069},[3915,6339,6340],{"class":6075},"\"Помилка серіалізації: ",[3915,6342,6343],{"class":6114},"%v",[3915,6345,6346],{"class":6075},"\"",[3915,6348,3789],{"class":6069},[3915,6350,6317],{"class":6114},[3915,6352,6091],{"class":6069},[3915,6354,6355],{"class":3917,"line":4054},[3915,6356,5377],{"class":6069},[3915,6358,6359],{"class":3917,"line":4060},[3915,6360,3994],{"class":6069},[3915,6362,6363],{"class":3917,"line":4066},[3915,6364,3964],{"emptyLinePlaceholder":3963},[3915,6366,6367,6369,6372],{"class":3917,"line":4072},[3915,6368,6145],{"class":6051},[3915,6370,6371],{"class":6148}," main",[3915,6373,6374],{"class":6069},"() {\n",[3915,6376,6377,6380,6382,6385,6387,6390,6392,6395],{"class":3917,"line":4078},[3915,6378,6379],{"class":6114},"    http",[3915,6381,4948],{"class":6069},[3915,6383,6384],{"class":6148},"HandleFunc",[3915,6386,6152],{"class":6069},[3915,6388,6389],{"class":6075},"\"\u002Fapi\u002Fv1\u002Fhealth\"",[3915,6391,3789],{"class":6069},[3915,6393,6394],{"class":6114},"healthHandler",[3915,6396,6091],{"class":6069},[3915,6398,6399],{"class":3917,"line":4084},[3915,6400,3964],{"emptyLinePlaceholder":3963},[3915,6402,6403,6406,6408,6411,6413,6416],{"class":3917,"line":4090},[3915,6404,6405],{"class":6114},"    log",[3915,6407,4948],{"class":6069},[3915,6409,6410],{"class":6148},"Println",[3915,6412,6152],{"class":6069},[3915,6414,6415],{"class":6075},"\"Сервер запущено на порту :8080...\"",[3915,6417,6091],{"class":6069},[3915,6419,6420,6422,6424,6426,6428,6430,6433,6435,6438,6440,6442,6444,6446,6448,6450],{"class":3917,"line":4096},[3915,6421,6284],{"class":6065},[3915,6423,6287],{"class":6114},[3915,6425,6190],{"class":6069},[3915,6427,6174],{"class":6114},[3915,6429,4948],{"class":6069},[3915,6431,6432],{"class":6148},"ListenAndServe",[3915,6434,6152],{"class":6069},[3915,6436,6437],{"class":6075},"\":8080\"",[3915,6439,3789],{"class":6069},[3915,6441,6323],{"class":6051},[3915,6443,6314],{"class":6069},[3915,6445,6317],{"class":6114},[3915,6447,6320],{"class":6069},[3915,6449,6323],{"class":6051},[3915,6451,6109],{"class":6069},[3915,6453,6454,6456,6458,6461,6463,6466,6468,6470,6472,6474],{"class":3917,"line":4101},[3915,6455,6330],{"class":6114},[3915,6457,4948],{"class":6069},[3915,6459,6460],{"class":6148},"Fatalf",[3915,6462,6152],{"class":6069},[3915,6464,6465],{"class":6075},"\"Помилка запуску сервера: ",[3915,6467,6343],{"class":6114},[3915,6469,6346],{"class":6075},[3915,6471,3789],{"class":6069},[3915,6473,6317],{"class":6114},[3915,6475,6091],{"class":6069},[3915,6477,6478],{"class":3917,"line":4107},[3915,6479,5377],{"class":6069},[3915,6481,6482],{"class":3917,"line":4113},[3915,6483,3994],{"class":6069},[3906,6485,6490],{"className":6486,"code":6487,"filename":6488,"language":6489,"meta":3911,"style":3911},"language-java shiki shiki-themes light-plus dark-plus dark-plus","package com.college.demo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.Map;\n\n@SpringBootApplication\n@RestController\npublic class Application {\n\n    @GetMapping(\"\u002Fapi\u002Fv1\u002Fhealth\")\n    public Map\u003CString, String> health() {\n        return Map.of(\n            \"status\", \"OK\",\n            \"service\", \"Client-Server Demo API\"\n        );\n    }\n\n    public static void main(String[] args) {\n        SpringApplication.run(Application.class, args);\n    }\n}\n","Java: Application.java (Spring Boot)","java",[3786,6491,6492,6499,6503,6510,6517,6524,6531,6535,6542,6546,6554,6561,6574,6578,6592,6618,6633,6644,6654,6659,6663,6667,6691,6714,6718],{"__ignoreMap":3911},[3915,6493,6494,6496],{"class":3917,"line":3918},[3915,6495,6052],{"class":6051},[3915,6497,6498],{"class":6069}," com.college.demo;\n",[3915,6500,6501],{"class":3917,"line":3924},[3915,6502,3964],{"emptyLinePlaceholder":3963},[3915,6504,6505,6507],{"class":3917,"line":3930},[3915,6506,6066],{"class":6051},[3915,6508,6509],{"class":6069}," org.springframework.boot.SpringApplication;\n",[3915,6511,6512,6514],{"class":3917,"line":3936},[3915,6513,6066],{"class":6051},[3915,6515,6516],{"class":6069}," org.springframework.boot.autoconfigure.SpringBootApplication;\n",[3915,6518,6519,6521],{"class":3917,"line":3942},[3915,6520,6066],{"class":6051},[3915,6522,6523],{"class":6069}," org.springframework.web.bind.annotation.GetMapping;\n",[3915,6525,6526,6528],{"class":3917,"line":3948},[3915,6527,6066],{"class":6051},[3915,6529,6530],{"class":6069}," org.springframework.web.bind.annotation.RestController;\n",[3915,6532,6533],{"class":3917,"line":3954},[3915,6534,3964],{"emptyLinePlaceholder":3963},[3915,6536,6537,6539],{"class":3917,"line":3960},[3915,6538,6066],{"class":6051},[3915,6540,6541],{"class":6069}," java.util.Map;\n",[3915,6543,6544],{"class":3917,"line":3967},[3915,6545,3964],{"emptyLinePlaceholder":3963},[3915,6547,6548,6551],{"class":3917,"line":3973},[3915,6549,6550],{"class":6069},"@",[3915,6552,6553],{"class":6055},"SpringBootApplication\n",[3915,6555,6556,6558],{"class":3917,"line":3979},[3915,6557,6550],{"class":6069},[3915,6559,6560],{"class":6055},"RestController\n",[3915,6562,6563,6566,6569,6572],{"class":3917,"line":3985},[3915,6564,6565],{"class":6051},"public",[3915,6567,6568],{"class":6051}," class",[3915,6570,6571],{"class":6055}," Application",[3915,6573,6109],{"class":6069},[3915,6575,6576],{"class":3917,"line":3991},[3915,6577,3964],{"emptyLinePlaceholder":3963},[3915,6579,6580,6583,6586,6588,6590],{"class":3917,"line":3997},[3915,6581,6582],{"class":6069},"    @",[3915,6584,6585],{"class":6055},"GetMapping",[3915,6587,6152],{"class":6069},[3915,6589,6389],{"class":6075},[3915,6591,6091],{"class":6069},[3915,6593,6594,6597,6600,6603,6606,6608,6610,6613,6616],{"class":3917,"line":4002},[3915,6595,6596],{"class":6051},"    public",[3915,6598,6599],{"class":6055}," Map",[3915,6601,6602],{"class":6069},"\u003C",[3915,6604,6605],{"class":6055},"String",[3915,6607,3789],{"class":6069},[3915,6609,6605],{"class":6055},[3915,6611,6612],{"class":6069},"> ",[3915,6614,6615],{"class":6148},"health",[3915,6617,6374],{"class":6069},[3915,6619,6620,6623,6625,6627,6630],{"class":3917,"line":4008},[3915,6621,6622],{"class":6065},"        return",[3915,6624,6599],{"class":6114},[3915,6626,4948],{"class":6069},[3915,6628,6629],{"class":6148},"of",[3915,6631,6632],{"class":6069},"(\n",[3915,6634,6635,6638,6640,6642],{"class":3917,"line":4014},[3915,6636,6637],{"class":6075},"            \"status\"",[3915,6639,3789],{"class":6069},[3915,6641,6207],{"class":6075},[3915,6643,6210],{"class":6069},[3915,6645,6646,6649,6651],{"class":3917,"line":4020},[3915,6647,6648],{"class":6075},"            \"service\"",[3915,6650,3789],{"class":6069},[3915,6652,6653],{"class":6075},"\"Client-Server Demo API\"\n",[3915,6655,6656],{"class":3917,"line":4026},[3915,6657,6658],{"class":6069},"        );\n",[3915,6660,6661],{"class":3917,"line":4032},[3915,6662,5377],{"class":6069},[3915,6664,6665],{"class":3917,"line":4038},[3915,6666,3964],{"emptyLinePlaceholder":3963},[3915,6668,6669,6671,6674,6677,6679,6681,6683,6686,6689],{"class":3917,"line":4043},[3915,6670,6596],{"class":6051},[3915,6672,6673],{"class":6051}," static",[3915,6675,6676],{"class":6055}," void",[3915,6678,6371],{"class":6148},[3915,6680,6152],{"class":6069},[3915,6682,6605],{"class":6055},[3915,6684,6685],{"class":6069},"[] ",[3915,6687,6688],{"class":6114},"args",[3915,6690,6182],{"class":6069},[3915,6692,6693,6696,6698,6701,6703,6706,6708,6711],{"class":3917,"line":4048},[3915,6694,6695],{"class":6114},"        SpringApplication",[3915,6697,4948],{"class":6069},[3915,6699,6700],{"class":6148},"run",[3915,6702,6152],{"class":6069},[3915,6704,6705],{"class":6114},"Application",[3915,6707,4948],{"class":6069},[3915,6709,6710],{"class":6114},"class",[3915,6712,6713],{"class":6069},", args);\n",[3915,6715,6716],{"class":3917,"line":4054},[3915,6717,5377],{"class":6069},[3915,6719,6720],{"class":3917,"line":4060},[3915,6721,3994],{"class":6069},[3811,6723,6724,6725,6728],{},"Зверніть увагу: у прикладі на Go не використовується жодних сторонніх фреймворків чи рефлексивних анотацій — стандартна бібліотека ",[3786,6726,6727],{},"net\u002Fhttp"," є повноцінним, промисловим, високоефективним сервером із підтримкою HTTP\u002F2 «з коробки».",[3798,6730],{},[3801,6732,6734],{"id":6733},"інструментарій-go-cli-та-модульна-система","Інструментарій: Go CLI та модульна система",[3811,6736,6737],{},"Якщо ви раніше працювали з іншими мовами програмування, ви, напевно, звикли до необхідності встановлювати десятки розрізнених утиліт: збирач проєкту (Maven\u002FGradle у Java, Webpack\u002FVite у JS), менеджер пакетів (npm, pip, nuget), тестовий раннер (JUnit, pytest, Jest), лінтер (ESLint) та інструмент форматування (Prettier).",[3811,6739,6740,6741,4948],{},"У світі Go філософія інша: ",[3769,6742,6743,6744],{},"все необхідне для повного життєвого циклу розробки постачається разом із компілятором в одній-єдиній утиліті командного рядка — ",[3786,6745,6044],{},[3798,6747],{},[3806,6749,6751],{"id":6750},"еволюція-організації-коду-від-gopath-до-go-modules","Еволюція організації коду: від $GOPATH до Go Modules",[3811,6753,6754],{},"Щоб зрозуміти сучасну структуру проєктів, корисно знати, від якої проблеми відштовхувалися розробники Go:",[4150,6756,6757,6766],{},[4153,6758,6761,6762,6765],{"name":6759,"type":6760},"Минуле: Модель $GOPATH (до Go 1.11)","Історичний контекст","У ранніх версіях Go всі проєкти розробника мусили знаходитися в одній глобальній системній папці (наприклад, ",[3786,6763,6764],{},"~\u002Fgo\u002Fsrc\u002Fgithub.com\u002Fusername\u002Fproject","). Не було можливості зафіксувати різні версії однієї бібліотеки для двох різних проєктів: оновлення пакету ламало всі сусідні програми.",[4153,6767,6770,6771,6774,6775,4948],{"name":6768,"type":6769},"Сьогодення: Система Go Modules (Go 1.11+)","Сучасний стандарт","Будь-яка папка на вашому диску в будь-якому місці файлової системи може бути самостійним, ізольованим ",[3769,6772,6773],{},"модулем Go",". Усі залежності, їхні точні версії та налаштування компіляції ізольовані та зафіксовані у кореневому файлі ",[3786,6776,6777],{},"go.mod",[3798,6779],{},[3806,6781,6783],{"id":6782},"відмінність-між-пакетом-package-та-модулем-module","Відмінність між Пакетом (Package) та Модулем (Module)",[3811,6785,6786],{},"Початківці часто плутають ці два фундаментальні терміни:",[3831,6788,6789,6906],{},[3749,6790,6791,6797],{},[3769,6792,6793,6794,3841],{},"Пакет (",[3815,6795,6796],{},"Package",[3746,6798,6799,6809,6827,6862,6882],{},[3749,6800,6801,6802,6218,6805,6808],{},"Кожен файл із кодом на Go обов'язково починається з ",[3769,6803,6804],{},"першого рядка",[3786,6806,6807],{},"package \u003Cім'я>",". Цей рядок оголошує, до якої саме логічної коробки (пакета) належить цей файл.",[3749,6810,6811,6814,6815,6818,6819,6822,6823,6826],{},[3769,6812,6813],{},"Залізне правило компілятора Go:"," Усі ",[3786,6816,6817],{},".go"," файли, які лежать в ",[3769,6820,6821],{},"одній і тій самій папці",", повинні мати ",[3769,6824,6825],{},"абсолютно однакове ім'я пакету"," в першому рядку (зазвичай ім'я пакету збігається з назвою самої папки).",[3749,6828,6829,6832,6833,6836,6837,5310,6840,6843,6844,6847,6848,6851,6852,6854,6855,6857,6858,6861],{},[3815,6830,6831],{},"Як це працює на практиці:"," Уявіть, що у вас є папка ",[3786,6834,6835],{},"service\u002F",", а всередині два файли — ",[3786,6838,6839],{},"order.go",[3786,6841,6842],{},"payment.go",". Обидва файли першим рядком пишуть ",[3786,6845,6846],{},"package service",". Компілятор Go об'єднує їх в єдине ціле: функція ",[3786,6849,6850],{},"processPayment()",", написана у файлі ",[3786,6853,6842],{},", буде миттєво доступна у файлі ",[3786,6856,6839],{}," ",[3769,6859,6860],{},"без будь-яких імпортів чи підключень","!",[3749,6863,6864,6870,6871,6873,6874,6877,6878,6881],{},[3815,6865,6866,6867,4628],{},"Особливий пакет ",[3786,6868,6869],{},"package main"," Якщо папка містить ",[3786,6872,6869],{}," і функцію ",[3786,6875,6876],{},"func main()",", компілятор розуміє: «Це не просто бібліотека, це ",[3769,6879,6880],{},"виконувана програма",", яку треба скомпільувати у бінарний файл».",[3749,6883,6884,6887,6888,6891,6892,6895,6896,6898,6899,6891,6902,6905],{},[3815,6885,6886],{},"Інкапсуляція (Public vs Private):"," Якщо назва функції чи змінної починається з ",[3769,6889,6890],{},"великої літери"," (наприклад, ",[3786,6893,6894],{},"CalculateTotal","), вона є публічною і буде доступна іншим пакетам через ",[3786,6897,6066],{},". Якщо з ",[3769,6900,6901],{},"малої літери",[3786,6903,6904],{},"validateCard",") — вона є приватною і видима лише всередині файлів цього конкретного пакета.",[3749,6907,6908,6914],{},[3769,6909,6910,6911,3841],{},"Модуль (",[3815,6912,6913],{},"Module",[3746,6915,6916,6921],{},[3749,6917,6918,6919,4948],{},"Це цілий проєкт або бібліотека, яка складається з дерева багатьох таких пакетів (папок), що мають єдину версію та керуються через файл ",[3786,6920,6777],{},[3749,6922,6923,6924,6926],{},"Корінь модуля визначається наявністю файлу ",[3786,6925,6777],{},". Всі імпорти внутрішніх пакетів проєкту починаються з назви цього модуля.",[3811,6928,6929],{},[3896,6930],{"alt":6931,"className":6932,"src":6933},"Ієрархія модуля та пакетів у Go",[3900],"\u002Fimages\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go\u002F09.png",[3903,6935,6936],{"alt":6931},[3906,6937,6939],{"className":3908,"code":6938,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 13\n\npackage \"Go Модуль: github.com\u002Fstudent\u002Fecommerce\" #F8FAFC {\n    file \"go.mod [Паспорт модуля]\" as Mod #DBEAFE\n    file \"go.sum [Криптографічні хеші]\" as Sum #DBEAFE\n\n    package \"cmd\u002Fserver (Пакет main)\" #FEF3C7 {\n        file \"main.go\" as Main\n    }\n\n    package \"internal\u002Fservice (Пакет service)\" #DCFCE7 {\n        file \"order.go\" as Ord\n        file \"payment.go\" as Pay\n    }\n\n    package \"internal\u002Fdatabase (Пакет database)\" #FCE7F3 {\n        file \"postgres.go\" as DB\n    }\n}\n\nMain ..> Ord : import \"github.com\u002Fstudent\u002Fecommerce\u002Finternal\u002Fservice\"\nOrd ..> DB : import \"github.com\u002Fstudent\u002Fecommerce\u002Finternal\u002Fdatabase\"\n@enduml\n",[3786,6940,6941,6945,6949,6953,6957,6961,6966,6971,6976,6980,6985,6990,6994,6998,7003,7008,7013,7017,7021,7026,7031,7035,7039,7043,7048,7053],{"__ignoreMap":3911},[3915,6942,6943],{"class":3917,"line":3918},[3915,6944,3921],{},[3915,6946,6947],{"class":3917,"line":3924},[3915,6948,3927],{},[3915,6950,6951],{"class":3917,"line":3930},[3915,6952,3933],{},[3915,6954,6955],{"class":3917,"line":3936},[3915,6956,3939],{},[3915,6958,6959],{"class":3917,"line":3942},[3915,6960,3964],{"emptyLinePlaceholder":3963},[3915,6962,6963],{"class":3917,"line":3948},[3915,6964,6965],{},"package \"Go Модуль: github.com\u002Fstudent\u002Fecommerce\" #F8FAFC {\n",[3915,6967,6968],{"class":3917,"line":3954},[3915,6969,6970],{},"    file \"go.mod [Паспорт модуля]\" as Mod #DBEAFE\n",[3915,6972,6973],{"class":3917,"line":3960},[3915,6974,6975],{},"    file \"go.sum [Криптографічні хеші]\" as Sum #DBEAFE\n",[3915,6977,6978],{"class":3917,"line":3967},[3915,6979,3964],{"emptyLinePlaceholder":3963},[3915,6981,6982],{"class":3917,"line":3973},[3915,6983,6984],{},"    package \"cmd\u002Fserver (Пакет main)\" #FEF3C7 {\n",[3915,6986,6987],{"class":3917,"line":3979},[3915,6988,6989],{},"        file \"main.go\" as Main\n",[3915,6991,6992],{"class":3917,"line":3985},[3915,6993,5377],{},[3915,6995,6996],{"class":3917,"line":3991},[3915,6997,3964],{"emptyLinePlaceholder":3963},[3915,6999,7000],{"class":3917,"line":3997},[3915,7001,7002],{},"    package \"internal\u002Fservice (Пакет service)\" #DCFCE7 {\n",[3915,7004,7005],{"class":3917,"line":4002},[3915,7006,7007],{},"        file \"order.go\" as Ord\n",[3915,7009,7010],{"class":3917,"line":4008},[3915,7011,7012],{},"        file \"payment.go\" as Pay\n",[3915,7014,7015],{"class":3917,"line":4014},[3915,7016,5377],{},[3915,7018,7019],{"class":3917,"line":4020},[3915,7020,3964],{"emptyLinePlaceholder":3963},[3915,7022,7023],{"class":3917,"line":4026},[3915,7024,7025],{},"    package \"internal\u002Fdatabase (Пакет database)\" #FCE7F3 {\n",[3915,7027,7028],{"class":3917,"line":4032},[3915,7029,7030],{},"        file \"postgres.go\" as DB\n",[3915,7032,7033],{"class":3917,"line":4038},[3915,7034,5377],{},[3915,7036,7037],{"class":3917,"line":4043},[3915,7038,3994],{},[3915,7040,7041],{"class":3917,"line":4048},[3915,7042,3964],{"emptyLinePlaceholder":3963},[3915,7044,7045],{"class":3917,"line":4054},[3915,7046,7047],{},"Main ..> Ord : import \"github.com\u002Fstudent\u002Fecommerce\u002Finternal\u002Fservice\"\n",[3915,7049,7050],{"class":3917,"line":4060},[3915,7051,7052],{},"Ord ..> DB : import \"github.com\u002Fstudent\u002Fecommerce\u002Finternal\u002Fdatabase\"\n",[3915,7054,7055],{"class":3917,"line":4066},[3915,7056,4145],{},[3798,7058],{},[3806,7060,7062],{"id":7061},"стандартна-структура-каталогів-standard-go-project-layout","Стандартна структура каталогів (Standard Go Project Layout)",[3811,7064,7065],{},"Хоча компілятор Go не нав'язує жорсткої структури папок, інженерне співтовариство використовує загальноприйнятий стандарт організації коду для бекенд-застосунків:",[7067,7068,7069,7347,7576,7829,7990,8114,8223,8231],"code-tree",{},[3906,7070,7073],{"className":6041,"code":7071,"filename":7072,"language":6044,"meta":3911,"style":3911},"package main\n\nimport (\n    \"log\"\n    \"net\u002Fhttp\"\n\n    \"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Fconfig\"\n    \"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Fhandler\"\n    \"github.com\u002Fstudent\u002Fmy-server\u002Fpkg\u002Flogger\"\n)\n\nfunc main() {\n    \u002F\u002F 1. Завантаження конфігурації\n    cfg := config.Load()\n    logger.Info(\"Конфігурація завантажена\")\n\n    \u002F\u002F 2. Ініціалізація обробників\n    userHandler := handler.NewUserHandler()\n\n    \u002F\u002F 3. Реєстрація маршрутів\n    http.HandleFunc(\"\u002Fapi\u002Fusers\", userHandler.GetUsers)\n\n    \u002F\u002F 4. Запуск сервера\n    addr := \":\" + cfg.Port\n    logger.Info(\"Запуск HTTP сервера на порту \" + addr)\n    if err := http.ListenAndServe(addr, nil); err != nil {\n        log.Fatalf(\"Помилка запуску сервера: %v\", err)\n    }\n}\n","cmd\u002Fserver\u002Fmain.go",[3786,7074,7075,7081,7085,7091,7095,7099,7103,7108,7113,7118,7122,7126,7134,7140,7158,7175,7179,7184,7201,7205,7210,7235,7239,7244,7265,7285,7317,7339,7343],{"__ignoreMap":3911},[3915,7076,7077,7079],{"class":3917,"line":3918},[3915,7078,6052],{"class":6051},[3915,7080,6056],{"class":6055},[3915,7082,7083],{"class":3917,"line":3924},[3915,7084,3964],{"emptyLinePlaceholder":3963},[3915,7086,7087,7089],{"class":3917,"line":3930},[3915,7088,6066],{"class":6065},[3915,7090,6070],{"class":6069},[3915,7092,7093],{"class":3917,"line":3936},[3915,7094,6081],{"class":6075},[3915,7096,7097],{"class":3917,"line":3942},[3915,7098,6086],{"class":6075},[3915,7100,7101],{"class":3917,"line":3948},[3915,7102,3964],{"emptyLinePlaceholder":3963},[3915,7104,7105],{"class":3917,"line":3954},[3915,7106,7107],{"class":6075},"    \"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Fconfig\"\n",[3915,7109,7110],{"class":3917,"line":3960},[3915,7111,7112],{"class":6075},"    \"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Fhandler\"\n",[3915,7114,7115],{"class":3917,"line":3967},[3915,7116,7117],{"class":6075},"    \"github.com\u002Fstudent\u002Fmy-server\u002Fpkg\u002Flogger\"\n",[3915,7119,7120],{"class":3917,"line":3973},[3915,7121,6091],{"class":6069},[3915,7123,7124],{"class":3917,"line":3979},[3915,7125,3964],{"emptyLinePlaceholder":3963},[3915,7127,7128,7130,7132],{"class":3917,"line":3985},[3915,7129,6145],{"class":6051},[3915,7131,6371],{"class":6148},[3915,7133,6374],{"class":6069},[3915,7135,7136],{"class":3917,"line":3991},[3915,7137,7139],{"class":7138},"spJ8K","    \u002F\u002F 1. Завантаження конфігурації\n",[3915,7141,7142,7145,7147,7150,7152,7155],{"class":3917,"line":3997},[3915,7143,7144],{"class":6114},"    cfg",[3915,7146,6190],{"class":6069},[3915,7148,7149],{"class":6114},"config",[3915,7151,4948],{"class":6069},[3915,7153,7154],{"class":6148},"Load",[3915,7156,7157],{"class":6069},"()\n",[3915,7159,7160,7163,7165,7168,7170,7173],{"class":3917,"line":4002},[3915,7161,7162],{"class":6114},"    logger",[3915,7164,4948],{"class":6069},[3915,7166,7167],{"class":6148},"Info",[3915,7169,6152],{"class":6069},[3915,7171,7172],{"class":6075},"\"Конфігурація завантажена\"",[3915,7174,6091],{"class":6069},[3915,7176,7177],{"class":3917,"line":4008},[3915,7178,3964],{"emptyLinePlaceholder":3963},[3915,7180,7181],{"class":3917,"line":4014},[3915,7182,7183],{"class":7138},"    \u002F\u002F 2. Ініціалізація обробників\n",[3915,7185,7186,7189,7191,7194,7196,7199],{"class":3917,"line":4020},[3915,7187,7188],{"class":6114},"    userHandler",[3915,7190,6190],{"class":6069},[3915,7192,7193],{"class":6114},"handler",[3915,7195,4948],{"class":6069},[3915,7197,7198],{"class":6148},"NewUserHandler",[3915,7200,7157],{"class":6069},[3915,7202,7203],{"class":3917,"line":4026},[3915,7204,3964],{"emptyLinePlaceholder":3963},[3915,7206,7207],{"class":3917,"line":4032},[3915,7208,7209],{"class":7138},"    \u002F\u002F 3. Реєстрація маршрутів\n",[3915,7211,7212,7214,7216,7218,7220,7223,7225,7228,7230,7233],{"class":3917,"line":4038},[3915,7213,6379],{"class":6114},[3915,7215,4948],{"class":6069},[3915,7217,6384],{"class":6148},[3915,7219,6152],{"class":6069},[3915,7221,7222],{"class":6075},"\"\u002Fapi\u002Fusers\"",[3915,7224,3789],{"class":6069},[3915,7226,7227],{"class":6114},"userHandler",[3915,7229,4948],{"class":6069},[3915,7231,7232],{"class":6114},"GetUsers",[3915,7234,6091],{"class":6069},[3915,7236,7237],{"class":3917,"line":4043},[3915,7238,3964],{"emptyLinePlaceholder":3963},[3915,7240,7241],{"class":3917,"line":4048},[3915,7242,7243],{"class":7138},"    \u002F\u002F 4. Запуск сервера\n",[3915,7245,7246,7249,7251,7254,7257,7260,7262],{"class":3917,"line":4054},[3915,7247,7248],{"class":6114},"    addr",[3915,7250,6190],{"class":6069},[3915,7252,7253],{"class":6075},"\":\"",[3915,7255,7256],{"class":6069}," + ",[3915,7258,7259],{"class":6114},"cfg",[3915,7261,4948],{"class":6069},[3915,7263,7264],{"class":6114},"Port\n",[3915,7266,7267,7269,7271,7273,7275,7278,7280,7283],{"class":3917,"line":4060},[3915,7268,7162],{"class":6114},[3915,7270,4948],{"class":6069},[3915,7272,7167],{"class":6148},[3915,7274,6152],{"class":6069},[3915,7276,7277],{"class":6075},"\"Запуск HTTP сервера на порту \"",[3915,7279,7256],{"class":6069},[3915,7281,7282],{"class":6114},"addr",[3915,7284,6091],{"class":6069},[3915,7286,7287,7289,7291,7293,7295,7297,7299,7301,7303,7305,7307,7309,7311,7313,7315],{"class":3917,"line":4066},[3915,7288,6284],{"class":6065},[3915,7290,6287],{"class":6114},[3915,7292,6190],{"class":6069},[3915,7294,6174],{"class":6114},[3915,7296,4948],{"class":6069},[3915,7298,6432],{"class":6148},[3915,7300,6152],{"class":6069},[3915,7302,7282],{"class":6114},[3915,7304,3789],{"class":6069},[3915,7306,6323],{"class":6051},[3915,7308,6314],{"class":6069},[3915,7310,6317],{"class":6114},[3915,7312,6320],{"class":6069},[3915,7314,6323],{"class":6051},[3915,7316,6109],{"class":6069},[3915,7318,7319,7321,7323,7325,7327,7329,7331,7333,7335,7337],{"class":3917,"line":4072},[3915,7320,6330],{"class":6114},[3915,7322,4948],{"class":6069},[3915,7324,6460],{"class":6148},[3915,7326,6152],{"class":6069},[3915,7328,6465],{"class":6075},[3915,7330,6343],{"class":6114},[3915,7332,6346],{"class":6075},[3915,7334,3789],{"class":6069},[3915,7336,6317],{"class":6114},[3915,7338,6091],{"class":6069},[3915,7340,7341],{"class":3917,"line":4078},[3915,7342,5377],{"class":6069},[3915,7344,7345],{"class":3917,"line":4084},[3915,7346,3994],{"class":6069},[3906,7348,7351],{"className":6041,"code":7349,"filename":7350,"language":6044,"meta":3911,"style":3911},"package config\n\nimport \"os\"\n\ntype Config struct {\n    Port        string\n    DatabaseURL string\n}\n\nfunc Load() *Config {\n    return &Config{\n        Port:        getEnv(\"PORT\", \"8080\"),\n        DatabaseURL: getEnv(\"DATABASE_URL\", \"postgres:\u002F\u002Flocalhost\u002Fmydb\"),\n    }\n}\n\nfunc getEnv(key, defaultVal string) string {\n    if val := os.Getenv(key); val != \"\" {\n        return val\n    }\n    return defaultVal\n}\n","internal\u002Fconfig\u002Fconfig.go",[3786,7352,7353,7360,7364,7371,7375,7386,7394,7402,7406,7410,7425,7437,7461,7482,7486,7490,7494,7521,7554,7561,7565,7572],{"__ignoreMap":3911},[3915,7354,7355,7357],{"class":3917,"line":3918},[3915,7356,6052],{"class":6051},[3915,7358,7359],{"class":6055}," config\n",[3915,7361,7362],{"class":3917,"line":3924},[3915,7363,3964],{"emptyLinePlaceholder":3963},[3915,7365,7366,7368],{"class":3917,"line":3930},[3915,7367,6066],{"class":6065},[3915,7369,7370],{"class":6075}," \"os\"\n",[3915,7372,7373],{"class":3917,"line":3936},[3915,7374,3964],{"emptyLinePlaceholder":3963},[3915,7376,7377,7379,7382,7384],{"class":3917,"line":3942},[3915,7378,6100],{"class":6051},[3915,7380,7381],{"class":6055}," Config",[3915,7383,6106],{"class":6051},[3915,7385,6109],{"class":6069},[3915,7387,7388,7391],{"class":3917,"line":3948},[3915,7389,7390],{"class":6114},"    Port",[3915,7392,7393],{"class":6055},"        string\n",[3915,7395,7396,7399],{"class":3917,"line":3954},[3915,7397,7398],{"class":6114},"    DatabaseURL",[3915,7400,7401],{"class":6055}," string\n",[3915,7403,7404],{"class":3917,"line":3960},[3915,7405,3994],{"class":6069},[3915,7407,7408],{"class":3917,"line":3967},[3915,7409,3964],{"emptyLinePlaceholder":3963},[3915,7411,7412,7414,7417,7420,7423],{"class":3917,"line":3973},[3915,7413,6145],{"class":6051},[3915,7415,7416],{"class":6148}," Load",[3915,7418,7419],{"class":6069},"() *",[3915,7421,7422],{"class":6055},"Config",[3915,7424,6109],{"class":6069},[3915,7426,7427,7430,7433,7435],{"class":3917,"line":3979},[3915,7428,7429],{"class":6065},"    return",[3915,7431,7432],{"class":6069}," &",[3915,7434,7422],{"class":6055},[3915,7436,6196],{"class":6069},[3915,7438,7439,7442,7445,7448,7450,7453,7455,7458],{"class":3917,"line":3985},[3915,7440,7441],{"class":6114},"        Port",[3915,7443,7444],{"class":6069},":        ",[3915,7446,7447],{"class":6148},"getEnv",[3915,7449,6152],{"class":6069},[3915,7451,7452],{"class":6075},"\"PORT\"",[3915,7454,3789],{"class":6069},[3915,7456,7457],{"class":6075},"\"8080\"",[3915,7459,7460],{"class":6069},"),\n",[3915,7462,7463,7466,7468,7470,7472,7475,7477,7480],{"class":3917,"line":3991},[3915,7464,7465],{"class":6114},"        DatabaseURL",[3915,7467,6218],{"class":6069},[3915,7469,7447],{"class":6148},[3915,7471,6152],{"class":6069},[3915,7473,7474],{"class":6075},"\"DATABASE_URL\"",[3915,7476,3789],{"class":6069},[3915,7478,7479],{"class":6075},"\"postgres:\u002F\u002Flocalhost\u002Fmydb\"",[3915,7481,7460],{"class":6069},[3915,7483,7484],{"class":3917,"line":3997},[3915,7485,5377],{"class":6069},[3915,7487,7488],{"class":3917,"line":4002},[3915,7489,3994],{"class":6069},[3915,7491,7492],{"class":3917,"line":4008},[3915,7493,3964],{"emptyLinePlaceholder":3963},[3915,7495,7496,7498,7501,7503,7506,7508,7511,7513,7516,7519],{"class":3917,"line":4014},[3915,7497,6145],{"class":6051},[3915,7499,7500],{"class":6148}," getEnv",[3915,7502,6152],{"class":6069},[3915,7504,7505],{"class":6114},"key",[3915,7507,3789],{"class":6069},[3915,7509,7510],{"class":6114},"defaultVal",[3915,7512,6129],{"class":6055},[3915,7514,7515],{"class":6069},") ",[3915,7517,7518],{"class":6055},"string",[3915,7520,6109],{"class":6069},[3915,7522,7523,7525,7528,7530,7533,7535,7538,7540,7542,7544,7547,7549,7552],{"class":3917,"line":4020},[3915,7524,6284],{"class":6065},[3915,7526,7527],{"class":6114}," val",[3915,7529,6190],{"class":6069},[3915,7531,7532],{"class":6114},"os",[3915,7534,4948],{"class":6069},[3915,7536,7537],{"class":6148},"Getenv",[3915,7539,6152],{"class":6069},[3915,7541,7505],{"class":6114},[3915,7543,6314],{"class":6069},[3915,7545,7546],{"class":6114},"val",[3915,7548,6320],{"class":6069},[3915,7550,7551],{"class":6075},"\"\"",[3915,7553,6109],{"class":6069},[3915,7555,7556,7558],{"class":3917,"line":4026},[3915,7557,6622],{"class":6065},[3915,7559,7560],{"class":6114}," val\n",[3915,7562,7563],{"class":3917,"line":4032},[3915,7564,5377],{"class":6069},[3915,7566,7567,7569],{"class":3917,"line":4038},[3915,7568,7429],{"class":6065},[3915,7570,7571],{"class":6114}," defaultVal\n",[3915,7573,7574],{"class":3917,"line":4043},[3915,7575,3994],{"class":6069},[3906,7577,7580],{"className":6041,"code":7578,"filename":7579,"language":6044,"meta":3911,"style":3911},"package handler\n\nimport (\n    \"encoding\u002Fjson\"\n    \"net\u002Fhttp\"\n\n    \"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Fservice\"\n)\n\ntype UserHandler struct {\n    service *service.UserService\n}\n\nfunc NewUserHandler() *UserHandler {\n    return &UserHandler{\n        service: service.NewUserService(),\n    }\n}\n\nfunc (h *UserHandler) GetUsers(w http.ResponseWriter, r *http.Request) {\n    users := h.service.GetAll()\n    \n    w.Header().Set(\"Content-Type\", \"application\u002Fjson\")\n    json.NewEncoder(w).Encode(users)\n}\n","internal\u002Fhandler\u002Fuser.go",[3786,7581,7582,7589,7593,7599,7603,7607,7611,7616,7620,7624,7635,7650,7654,7658,7672,7682,7699,7703,7707,7711,7753,7774,7779,7801,7825],{"__ignoreMap":3911},[3915,7583,7584,7586],{"class":3917,"line":3918},[3915,7585,6052],{"class":6051},[3915,7587,7588],{"class":6055}," handler\n",[3915,7590,7591],{"class":3917,"line":3924},[3915,7592,3964],{"emptyLinePlaceholder":3963},[3915,7594,7595,7597],{"class":3917,"line":3930},[3915,7596,6066],{"class":6065},[3915,7598,6070],{"class":6069},[3915,7600,7601],{"class":3917,"line":3936},[3915,7602,6076],{"class":6075},[3915,7604,7605],{"class":3917,"line":3942},[3915,7606,6086],{"class":6075},[3915,7608,7609],{"class":3917,"line":3948},[3915,7610,3964],{"emptyLinePlaceholder":3963},[3915,7612,7613],{"class":3917,"line":3954},[3915,7614,7615],{"class":6075},"    \"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Fservice\"\n",[3915,7617,7618],{"class":3917,"line":3960},[3915,7619,6091],{"class":6069},[3915,7621,7622],{"class":3917,"line":3967},[3915,7623,3964],{"emptyLinePlaceholder":3963},[3915,7625,7626,7628,7631,7633],{"class":3917,"line":3973},[3915,7627,6100],{"class":6051},[3915,7629,7630],{"class":6055}," UserHandler",[3915,7632,6106],{"class":6051},[3915,7634,6109],{"class":6069},[3915,7636,7637,7640,7642,7645,7647],{"class":3917,"line":3979},[3915,7638,7639],{"class":6114},"    service",[3915,7641,6171],{"class":6069},[3915,7643,7644],{"class":6055},"service",[3915,7646,4948],{"class":6069},[3915,7648,7649],{"class":6055},"UserService\n",[3915,7651,7652],{"class":3917,"line":3985},[3915,7653,3994],{"class":6069},[3915,7655,7656],{"class":3917,"line":3991},[3915,7657,3964],{"emptyLinePlaceholder":3963},[3915,7659,7660,7662,7665,7667,7670],{"class":3917,"line":3997},[3915,7661,6145],{"class":6051},[3915,7663,7664],{"class":6148}," NewUserHandler",[3915,7666,7419],{"class":6069},[3915,7668,7669],{"class":6055},"UserHandler",[3915,7671,6109],{"class":6069},[3915,7673,7674,7676,7678,7680],{"class":3917,"line":4002},[3915,7675,7429],{"class":6065},[3915,7677,7432],{"class":6069},[3915,7679,7669],{"class":6055},[3915,7681,6196],{"class":6069},[3915,7683,7684,7687,7689,7691,7693,7696],{"class":3917,"line":4008},[3915,7685,7686],{"class":6114},"        service",[3915,7688,6218],{"class":6069},[3915,7690,7644],{"class":6114},[3915,7692,4948],{"class":6069},[3915,7694,7695],{"class":6148},"NewUserService",[3915,7697,7698],{"class":6069},"(),\n",[3915,7700,7701],{"class":3917,"line":4014},[3915,7702,5377],{"class":6069},[3915,7704,7705],{"class":3917,"line":4020},[3915,7706,3994],{"class":6069},[3915,7708,7709],{"class":3917,"line":4026},[3915,7710,3964],{"emptyLinePlaceholder":3963},[3915,7712,7713,7715,7717,7720,7723,7725,7727,7729,7731,7733,7735,7737,7739,7741,7743,7745,7747,7749,7751],{"class":3917,"line":4032},[3915,7714,6145],{"class":6051},[3915,7716,3861],{"class":6069},[3915,7718,7719],{"class":6114},"h ",[3915,7721,7722],{"class":6069},"*",[3915,7724,7669],{"class":6055},[3915,7726,7515],{"class":6069},[3915,7728,7232],{"class":6148},[3915,7730,6152],{"class":6069},[3915,7732,6155],{"class":6114},[3915,7734,6158],{"class":6055},[3915,7736,4948],{"class":6069},[3915,7738,6163],{"class":6055},[3915,7740,3789],{"class":6069},[3915,7742,6168],{"class":6114},[3915,7744,6171],{"class":6069},[3915,7746,6174],{"class":6055},[3915,7748,4948],{"class":6069},[3915,7750,6179],{"class":6055},[3915,7752,6182],{"class":6069},[3915,7754,7755,7758,7760,7763,7765,7767,7769,7772],{"class":3917,"line":4038},[3915,7756,7757],{"class":6114},"    users",[3915,7759,6190],{"class":6069},[3915,7761,7762],{"class":6114},"h",[3915,7764,4948],{"class":6069},[3915,7766,7644],{"class":6114},[3915,7768,4948],{"class":6069},[3915,7770,7771],{"class":6148},"GetAll",[3915,7773,7157],{"class":6069},[3915,7775,7776],{"class":3917,"line":4043},[3915,7777,7778],{"class":6069},"    \n",[3915,7780,7781,7783,7785,7787,7789,7791,7793,7795,7797,7799],{"class":3917,"line":4048},[3915,7782,6236],{"class":6114},[3915,7784,4948],{"class":6069},[3915,7786,6241],{"class":6148},[3915,7788,6244],{"class":6069},[3915,7790,6247],{"class":6148},[3915,7792,6152],{"class":6069},[3915,7794,6252],{"class":6075},[3915,7796,3789],{"class":6069},[3915,7798,6257],{"class":6075},[3915,7800,6091],{"class":6069},[3915,7802,7803,7806,7808,7810,7812,7814,7816,7818,7820,7823],{"class":3917,"line":4054},[3915,7804,7805],{"class":6114},"    json",[3915,7807,4948],{"class":6069},[3915,7809,6297],{"class":6148},[3915,7811,6152],{"class":6069},[3915,7813,6155],{"class":6114},[3915,7815,3873],{"class":6069},[3915,7817,6306],{"class":6148},[3915,7819,6152],{"class":6069},[3915,7821,7822],{"class":6114},"users",[3915,7824,6091],{"class":6069},[3915,7826,7827],{"class":3917,"line":4060},[3915,7828,3994],{"class":6069},[3906,7830,7833],{"className":6041,"code":7831,"filename":7832,"language":6044,"meta":3911,"style":3911},"package service\n\nimport \"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Frepository\"\n\ntype UserService struct {\n    repo *repository.UserRepository\n}\n\nfunc NewUserService() *UserService {\n    return &UserService{\n        repo: repository.NewUserRepository(),\n    }\n}\n\nfunc (s *UserService) GetAll() []string {\n    return s.repo.FindAll()\n}\n","internal\u002Fservice\u002Fuser.go",[3786,7834,7835,7842,7846,7853,7857,7868,7883,7887,7891,7905,7915,7931,7935,7939,7943,7967,7986],{"__ignoreMap":3911},[3915,7836,7837,7839],{"class":3917,"line":3918},[3915,7838,6052],{"class":6051},[3915,7840,7841],{"class":6055}," service\n",[3915,7843,7844],{"class":3917,"line":3924},[3915,7845,3964],{"emptyLinePlaceholder":3963},[3915,7847,7848,7850],{"class":3917,"line":3930},[3915,7849,6066],{"class":6065},[3915,7851,7852],{"class":6075}," \"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Frepository\"\n",[3915,7854,7855],{"class":3917,"line":3936},[3915,7856,3964],{"emptyLinePlaceholder":3963},[3915,7858,7859,7861,7864,7866],{"class":3917,"line":3942},[3915,7860,6100],{"class":6051},[3915,7862,7863],{"class":6055}," UserService",[3915,7865,6106],{"class":6051},[3915,7867,6109],{"class":6069},[3915,7869,7870,7873,7875,7878,7880],{"class":3917,"line":3948},[3915,7871,7872],{"class":6114},"    repo",[3915,7874,6171],{"class":6069},[3915,7876,7877],{"class":6055},"repository",[3915,7879,4948],{"class":6069},[3915,7881,7882],{"class":6055},"UserRepository\n",[3915,7884,7885],{"class":3917,"line":3954},[3915,7886,3994],{"class":6069},[3915,7888,7889],{"class":3917,"line":3960},[3915,7890,3964],{"emptyLinePlaceholder":3963},[3915,7892,7893,7895,7898,7900,7903],{"class":3917,"line":3967},[3915,7894,6145],{"class":6051},[3915,7896,7897],{"class":6148}," NewUserService",[3915,7899,7419],{"class":6069},[3915,7901,7902],{"class":6055},"UserService",[3915,7904,6109],{"class":6069},[3915,7906,7907,7909,7911,7913],{"class":3917,"line":3973},[3915,7908,7429],{"class":6065},[3915,7910,7432],{"class":6069},[3915,7912,7902],{"class":6055},[3915,7914,6196],{"class":6069},[3915,7916,7917,7920,7922,7924,7926,7929],{"class":3917,"line":3979},[3915,7918,7919],{"class":6114},"        repo",[3915,7921,6218],{"class":6069},[3915,7923,7877],{"class":6114},[3915,7925,4948],{"class":6069},[3915,7927,7928],{"class":6148},"NewUserRepository",[3915,7930,7698],{"class":6069},[3915,7932,7933],{"class":3917,"line":3985},[3915,7934,5377],{"class":6069},[3915,7936,7937],{"class":3917,"line":3991},[3915,7938,3994],{"class":6069},[3915,7940,7941],{"class":3917,"line":3997},[3915,7942,3964],{"emptyLinePlaceholder":3963},[3915,7944,7945,7947,7949,7952,7954,7956,7958,7960,7963,7965],{"class":3917,"line":4002},[3915,7946,6145],{"class":6051},[3915,7948,3861],{"class":6069},[3915,7950,7951],{"class":6114},"s ",[3915,7953,7722],{"class":6069},[3915,7955,7902],{"class":6055},[3915,7957,7515],{"class":6069},[3915,7959,7771],{"class":6148},[3915,7961,7962],{"class":6069},"() []",[3915,7964,7518],{"class":6055},[3915,7966,6109],{"class":6069},[3915,7968,7969,7971,7974,7976,7979,7981,7984],{"class":3917,"line":4008},[3915,7970,7429],{"class":6065},[3915,7972,7973],{"class":6114}," s",[3915,7975,4948],{"class":6069},[3915,7977,7978],{"class":6114},"repo",[3915,7980,4948],{"class":6069},[3915,7982,7983],{"class":6148},"FindAll",[3915,7985,7157],{"class":6069},[3915,7987,7988],{"class":3917,"line":4014},[3915,7989,3994],{"class":6069},[3906,7991,7994],{"className":6041,"code":7992,"filename":7993,"language":6044,"meta":3911,"style":3911},"package repository\n\ntype UserRepository struct{}\n\nfunc NewUserRepository() *UserRepository {\n    return &UserRepository{}\n}\n\nfunc (r *UserRepository) FindAll() []string {\n    \u002F\u002F TODO: Запит до PostgreSQL\n    return []string{\"Alice\", \"Bob\", \"Charlie\"}\n}\n","internal\u002Frepository\u002Fpostgres.go",[3786,7995,7996,8003,8007,8019,8023,8037,8047,8051,8055,8078,8083,8110],{"__ignoreMap":3911},[3915,7997,7998,8000],{"class":3917,"line":3918},[3915,7999,6052],{"class":6051},[3915,8001,8002],{"class":6055}," repository\n",[3915,8004,8005],{"class":3917,"line":3924},[3915,8006,3964],{"emptyLinePlaceholder":3963},[3915,8008,8009,8011,8014,8016],{"class":3917,"line":3930},[3915,8010,6100],{"class":6051},[3915,8012,8013],{"class":6055}," UserRepository",[3915,8015,6106],{"class":6051},[3915,8017,8018],{"class":6069},"{}\n",[3915,8020,8021],{"class":3917,"line":3936},[3915,8022,3964],{"emptyLinePlaceholder":3963},[3915,8024,8025,8027,8030,8032,8035],{"class":3917,"line":3942},[3915,8026,6145],{"class":6051},[3915,8028,8029],{"class":6148}," NewUserRepository",[3915,8031,7419],{"class":6069},[3915,8033,8034],{"class":6055},"UserRepository",[3915,8036,6109],{"class":6069},[3915,8038,8039,8041,8043,8045],{"class":3917,"line":3948},[3915,8040,7429],{"class":6065},[3915,8042,7432],{"class":6069},[3915,8044,8034],{"class":6055},[3915,8046,8018],{"class":6069},[3915,8048,8049],{"class":3917,"line":3954},[3915,8050,3994],{"class":6069},[3915,8052,8053],{"class":3917,"line":3960},[3915,8054,3964],{"emptyLinePlaceholder":3963},[3915,8056,8057,8059,8061,8064,8066,8068,8070,8072,8074,8076],{"class":3917,"line":3967},[3915,8058,6145],{"class":6051},[3915,8060,3861],{"class":6069},[3915,8062,8063],{"class":6114},"r ",[3915,8065,7722],{"class":6069},[3915,8067,8034],{"class":6055},[3915,8069,7515],{"class":6069},[3915,8071,7983],{"class":6148},[3915,8073,7962],{"class":6069},[3915,8075,7518],{"class":6055},[3915,8077,6109],{"class":6069},[3915,8079,8080],{"class":3917,"line":3973},[3915,8081,8082],{"class":7138},"    \u002F\u002F TODO: Запит до PostgreSQL\n",[3915,8084,8085,8087,8090,8092,8095,8098,8100,8103,8105,8108],{"class":3917,"line":3979},[3915,8086,7429],{"class":6065},[3915,8088,8089],{"class":6069}," []",[3915,8091,7518],{"class":6055},[3915,8093,8094],{"class":6069},"{",[3915,8096,8097],{"class":6075},"\"Alice\"",[3915,8099,3789],{"class":6069},[3915,8101,8102],{"class":6075},"\"Bob\"",[3915,8104,3789],{"class":6069},[3915,8106,8107],{"class":6075},"\"Charlie\"",[3915,8109,3994],{"class":6069},[3915,8111,8112],{"class":3917,"line":3985},[3915,8113,3994],{"class":6069},[3906,8115,8118],{"className":6041,"code":8116,"filename":8117,"language":6044,"meta":3911,"style":3911},"package logger\n\nimport \"log\"\n\nfunc Info(msg string) {\n    log.Println(\"[INFO]\", msg)\n}\n\nfunc Error(msg string) {\n    log.Println(\"[ERROR]\", msg)\n}\n","pkg\u002Flogger\u002Flogger.go",[3786,8119,8120,8127,8131,8138,8142,8158,8177,8181,8185,8200,8219],{"__ignoreMap":3911},[3915,8121,8122,8124],{"class":3917,"line":3918},[3915,8123,6052],{"class":6051},[3915,8125,8126],{"class":6055}," logger\n",[3915,8128,8129],{"class":3917,"line":3924},[3915,8130,3964],{"emptyLinePlaceholder":3963},[3915,8132,8133,8135],{"class":3917,"line":3930},[3915,8134,6066],{"class":6065},[3915,8136,8137],{"class":6075}," \"log\"\n",[3915,8139,8140],{"class":3917,"line":3936},[3915,8141,3964],{"emptyLinePlaceholder":3963},[3915,8143,8144,8146,8149,8151,8154,8156],{"class":3917,"line":3942},[3915,8145,6145],{"class":6051},[3915,8147,8148],{"class":6148}," Info",[3915,8150,6152],{"class":6069},[3915,8152,8153],{"class":6114},"msg",[3915,8155,6129],{"class":6055},[3915,8157,6182],{"class":6069},[3915,8159,8160,8162,8164,8166,8168,8171,8173,8175],{"class":3917,"line":3948},[3915,8161,6405],{"class":6114},[3915,8163,4948],{"class":6069},[3915,8165,6410],{"class":6148},[3915,8167,6152],{"class":6069},[3915,8169,8170],{"class":6075},"\"[INFO]\"",[3915,8172,3789],{"class":6069},[3915,8174,8153],{"class":6114},[3915,8176,6091],{"class":6069},[3915,8178,8179],{"class":3917,"line":3954},[3915,8180,3994],{"class":6069},[3915,8182,8183],{"class":3917,"line":3960},[3915,8184,3964],{"emptyLinePlaceholder":3963},[3915,8186,8187,8189,8192,8194,8196,8198],{"class":3917,"line":3967},[3915,8188,6145],{"class":6051},[3915,8190,8191],{"class":6148}," Error",[3915,8193,6152],{"class":6069},[3915,8195,8153],{"class":6114},[3915,8197,6129],{"class":6055},[3915,8199,6182],{"class":6069},[3915,8201,8202,8204,8206,8208,8210,8213,8215,8217],{"class":3917,"line":3973},[3915,8203,6405],{"class":6114},[3915,8205,4948],{"class":6069},[3915,8207,6410],{"class":6148},[3915,8209,6152],{"class":6069},[3915,8211,8212],{"class":6075},"\"[ERROR]\"",[3915,8214,3789],{"class":6069},[3915,8216,8153],{"class":6114},[3915,8218,6091],{"class":6069},[3915,8220,8221],{"class":3917,"line":3979},[3915,8222,3994],{"class":6069},[3906,8224,8229],{"className":8225,"code":8227,"filename":6777,"language":8228,"meta":3911},[8226],"language-text","module github.com\u002Fstudent\u002Fmy-server\n\ngo 1.22\n","text",[3786,8230,8227],{"__ignoreMap":3911},[3906,8232,8236],{"className":8233,"code":8234,"filename":8235,"language":8228,"meta":3911},[8226],"github.com\u002Fgoogle\u002Fuuid v1.6.0 h1:NIvaJDMOfo6...\ngithub.com\u002Fgoogle\u002Fuuid v1.6.0\u002Fgo.mod h1:TIym...\n","go.sum",[3786,8237,8234],{"__ignoreMap":3911},[5415,8239,8241,8246,8249],{"icon":8240},"i-lucide-git-branch",[3811,8242,8243],{},[3769,8244,8245],{},"Як працюють імпорти між пакетами?",[3811,8247,8248],{},"У прикладі вище зверніть увагу на структуру імпортів:",[3831,8250,8251,8278,8292,8304],{},[3749,8252,8253,8257,8258],{},[3769,8254,8255],{},[3786,8256,7072],{}," імпортує:",[3746,8259,8260,8266,8272],{},[3749,8261,8262,8265],{},[3786,8263,8264],{},"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Fconfig"," — власний внутрішній пакет",[3749,8267,8268,8271],{},[3786,8269,8270],{},"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Fhandler"," — ще один внутрішній пакет",[3749,8273,8274,8277],{},[3786,8275,8276],{},"github.com\u002Fstudent\u002Fmy-server\u002Fpkg\u002Flogger"," — публічний пакет (може використовуватися зовні)",[3749,8279,8280,8257,8284],{},[3769,8281,8282],{},[3786,8283,7579],{},[3746,8285,8286],{},[3749,8287,8288,8291],{},[3786,8289,8290],{},"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Fservice"," — пакет на тому ж рівні",[3749,8293,8294,8297,8298,3861,8300,8303],{},[3769,8295,8296],{},"Шлях імпорту завжди починається з назви модуля"," з ",[3786,8299,6777],{},[3786,8301,8302],{},"github.com\u002Fstudent\u002Fmy-server","), потім йде відносний шлях до пакету.",[3749,8305,8306,8309],{},[3769,8307,8308],{},"Компілятор автоматично знаходить пакети"," всередині вашого проєкту без додаткових налаштувань!",[8311,8312,8313,8320,8321,8324,8325,8327,8328,8331,8332,8335],"important",{},[3769,8314,8315,8316,8319],{},"Магічне правило папки ",[3786,8317,8318],{},"internal\u002F"," в Go:","\nКаталог ",[3786,8322,8323],{},"internal"," захищений безпосередньо на рівні компілятора мови Go. Жоден зовнішній сторонній проєкт або інший модуль не може імпортувати пакети з папки ",[3786,8326,8323],{},". Якщо хтось спробує написати ",[3786,8329,8330],{},"import \"github.com\u002Fstudent\u002Fmy-server\u002Finternal\u002Fservice\"",", компілятор Go зупинить збірку з помилкою безпеки ",[3786,8333,8334],{},"use of internal package not allowed",". Це дозволяє вам вільно рефакторити внутрішній код сервісу, не боячись зламати публічні контракти.",[3798,8337],{},[3806,8339,8341,8342,5310,8344],{"id":8340},"анатомія-конфігураційних-файлів-gomod-та-gosum","Анатомія конфігураційних файлів: ",[3786,8343,6777],{},[3786,8345,8235],{},[3811,8347,8348],{},"Розглянемо вміст файлів маніфесту модуля на конкретному прикладі:",[6037,8350,8351,8358],{},[3906,8352,8356],{"className":8353,"code":8354,"filename":8355,"language":8228,"meta":3911},[8226],"module github.com\u002Fstudent\u002Fmy-backend\n\ngo 1.22\n\nrequire (\n    github.com\u002Fgoogle\u002Fuuid v1.6.0\n    github.com\u002Fgorilla\u002Fmux v1.8.1 \u002F\u002F direct\n    golang.org\u002Fx\u002Fcrypto v0.21.0 \u002F\u002F indirect\n)\n","go.mod (Маніфест модуля)",[3786,8357,8354],{"__ignoreMap":3911},[3906,8359,8363],{"className":8360,"code":8361,"filename":8362,"language":8228,"meta":3911},[8226],"github.com\u002Fgoogle\u002Fuuid v1.6.0 h1:NIvaJDMOfo6...\ngithub.com\u002Fgoogle\u002Fuuid v1.6.0\u002Fgo.mod h1:TIym...\ngithub.com\u002Fgorilla\u002Fmux v1.8.1 h1:TuBL49tXwIGFiU...\ngithub.com\u002Fgorilla\u002Fmux v1.8.1\u002Fgo.mod h1:TIym...\n","go.sum (Журнал контрольних сум)",[3786,8364,8361],{"__ignoreMap":3911},[3811,8366,8367],{},"Розберемо детально призначення кожного елемента:",[3831,8369,8370,8399,8407,8433],{},[3749,8371,8372,8378,8379,8382,8383,8386,8387],{},[3769,8373,8374,8375,4628],{},"Директива ",[3786,8376,8377],{},"module"," Вказує ",[3769,8380,8381],{},"канонічний шлях імпорту",". Коли всередині вашого проєкту ви хочете підключити власний внутрішній пакет ",[3786,8384,8385],{},"internal\u002Fservice",", рядок імпорту починається саме з цього шляху:\n",[3906,8388,8390],{"className":6041,"code":8389,"language":6044,"meta":3911,"style":3911},"import \"github.com\u002Fstudent\u002Fmy-backend\u002Finternal\u002Fservice\"\n",[3786,8391,8392],{"__ignoreMap":3911},[3915,8393,8394,8396],{"class":3917,"line":3918},[3915,8395,6066],{"class":6065},[3915,8397,8398],{"class":6075}," \"github.com\u002Fstudent\u002Fmy-backend\u002Finternal\u002Fservice\"\n",[3749,8400,8401,8406],{},[3769,8402,8374,8403,4628],{},[3786,8404,8405],{},"go 1.22"," Вказує мінімальну версію синтаксису мови Go, необхідну для збірки проєкту.",[3749,8408,8409,8415,8416,8419,8420],{},[3769,8410,8411,8412,4628],{},"Блок ",[3786,8413,8414],{},"require"," Перелік зовнішніх сторонніх бібліотек із фіксованими семантичними версіями (",[3815,8417,8418],{},"Semantic Versioning: MAJOR.MINOR.PATCH",").\n",[3746,8421,8422],{},[3749,8423,8424,8425,8428,8429,8432],{},"Позначка ",[3786,8426,8427],{},"\u002F\u002F indirect"," означає ",[3769,8430,8431],{},"непряму (транзитивну) залежність"," — це пакет, який потрібен не вашому коду напряму, а потрібен одній із підключених вами бібліотек.",[3749,8434,8435,8440,8441,8444,8445,4948],{},[3769,8436,8437,8438,4628],{},"Файл ",[3786,8439,8235],{}," Для кожного стороннього пакета тут зберігаються два 256-бітні криптографічні хеші: хеш вихідного коду бібліотеки (",[3786,8442,8443],{},"h1:...",") та хеш її власного файлу ",[3786,8446,6777],{},[8448,8449,8450,8453,8454,8457,8458,3861,8461,8464,8465,8468,8469,8472],"caution",{},[3769,8451,8452],{},"Де зберігаються завантажені бібліотеки? (Чому немає папки node_modules):","\nУ Node.js залежності завантажуються в кожну папку проєкту (",[3786,8455,8456],{},"node_modules","), що займає гігабайти дубльованого простору. У Go всі бібліотеки завантажуються ",[3769,8459,8460],{},"один раз у глобальний системний кеш",[3786,8462,8463],{},"$GOPATH\u002Fpkg\u002Fmod","). Файли в цьому кеші захищені правами ",[3815,8466,8467],{},"Read-Only"," (лише для читання). Якщо п'ять ваших проєктів використовують бібліотеку ",[3786,8470,8471],{},"uuid v1.6.0",", на диску зберігається лише одна спільна копія.",[3798,8474],{},[3806,8476,8478],{"id":8477},"робота-з-go-cli-повний-довідник-інструментів","Робота з Go CLI: Повний довідник інструментів",[3811,8480,8481,8482,4948],{},"Уся розробка, тестування та компіляція здійснюється через вбудовані підкоманди утиліти ",[3786,8483,6044],{},[3811,8485,8486],{},[3896,8487],{"alt":8488,"className":8489,"src":8490},"Карта команд Go CLI",[3900],"\u002Fimages\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go\u002F10.png",[3903,8492,8493],{"alt":8488},[3906,8494,8496],{"className":3908,"code":8495,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 13\n\npackage \"Утиліта Go CLI (`go`)\" #F8FAFC {\n    rectangle \"Керування залежностями\\n• go mod init : Створити модуль\\n• go get : Додати\u002Fоновити пакет\\n• go mod tidy : Очистити залежності\" as ModCmd #DBEAFE\n    rectangle \"Розробка та налагодження\\n• go run : Запуск без створення файлу\\n• go fmt : Стандартизація форматування\\n• go vet : Статичний пошук багів\" as DevCmd #FEF3C7\n    rectangle \"Збірка та тестування\\n• go test : Автоматичні тести\\n• go build : Компіляція у бінарник\\n• go install : Встановлення у систему\" as BuildCmd #DCFCE7\n}\n@enduml\n",[3786,8497,8498,8502,8506,8510,8514,8518,8523,8528,8533,8538,8542],{"__ignoreMap":3911},[3915,8499,8500],{"class":3917,"line":3918},[3915,8501,3921],{},[3915,8503,8504],{"class":3917,"line":3924},[3915,8505,3927],{},[3915,8507,8508],{"class":3917,"line":3930},[3915,8509,3933],{},[3915,8511,8512],{"class":3917,"line":3936},[3915,8513,3939],{},[3915,8515,8516],{"class":3917,"line":3942},[3915,8517,3964],{"emptyLinePlaceholder":3963},[3915,8519,8520],{"class":3917,"line":3948},[3915,8521,8522],{},"package \"Утиліта Go CLI (`go`)\" #F8FAFC {\n",[3915,8524,8525],{"class":3917,"line":3954},[3915,8526,8527],{},"    rectangle \"Керування залежностями\\n• go mod init : Створити модуль\\n• go get : Додати\u002Fоновити пакет\\n• go mod tidy : Очистити залежності\" as ModCmd #DBEAFE\n",[3915,8529,8530],{"class":3917,"line":3960},[3915,8531,8532],{},"    rectangle \"Розробка та налагодження\\n• go run : Запуск без створення файлу\\n• go fmt : Стандартизація форматування\\n• go vet : Статичний пошук багів\" as DevCmd #FEF3C7\n",[3915,8534,8535],{"class":3917,"line":3967},[3915,8536,8537],{},"    rectangle \"Збірка та тестування\\n• go test : Автоматичні тести\\n• go build : Компіляція у бінарник\\n• go install : Встановлення у систему\" as BuildCmd #DCFCE7\n",[3915,8539,8540],{"class":3917,"line":3973},[3915,8541,3994],{},[3915,8543,8544],{"class":3917,"line":3979},[3915,8545,4145],{},[3811,8547,8548],{},"Розглянемо практичне призначення та синтаксис кожної базової команди:",[4150,8550,8551,8562,8588,8607,8642,8667,8672,8680,8689,8698,8723],{},[4153,8552,8555,8556,8558,8559,3873],{"name":8553,"type":8554},"go mod init \u003Cшлях-модуля>","Ініціалізація","Створює новий файл ",[3786,8557,6777],{}," у поточній папці. Зазвичай як шлях модуля вказують URL репозиторію на GitHub (наприклад, ",[3786,8560,8561],{},"go mod init github.com\u002Fstudent\u002Fdemo-server",[4153,8563,8566,8574],{"name":8564,"type":8565},"go get \u003Curl-пакету>","Керування бібліотеками",[3811,8567,8568,8569,8571,8572,4948],{},"Завантажує сторонню бібліотеку з інтернету, додає запис у ",[3786,8570,6777],{}," та фіксує хеш у ",[3786,8573,8235],{},[3746,8575,8576,8582],{},[3749,8577,8578,8579],{},"Встановлення останньої версії: ",[3786,8580,8581],{},"go get github.com\u002Fgoogle\u002Fuuid",[3749,8583,8584,8585],{},"Встановлення конкретної версії: ",[3786,8586,8587],{},"go get github.com\u002Fgoogle\u002Fuuid@v1.5.0",[4153,8589,8592,8593,8595,8596,8598,8599,5310,8601,8603,8604],{"name":8590,"type":8591},"go mod tidy","Золота команда підтримки","Сканує всі вихідні ",[3786,8594,6817],{}," файли у вашому проєкті. Знаходить усі бібліотеки, які ви імпортували, і автоматично докачує їх. Якщо ж ви видалили код, який використовував бібліотеку, ",[3786,8597,8590],{}," видалить зайвий рядок із ",[3786,8600,6777],{},[3786,8602,8235],{},". ",[3769,8605,8606],{},"Рекомендується запускати перед кожним комітом у Git.",[4153,8608,8611,8620],{"name":8609,"type":8610},"go mod download","Завантаження залежностей",[3811,8612,8613,8614,8616,8617,8619],{},"Завантажує всі залежності, зазначені у ",[3786,8615,6777],{},", у глобальний кеш ",[3786,8618,8463],{}," без компіляції проєкту. Корисно для CI\u002FCD pipelines або для попереднього кешування залежностей у Docker-образах.",[3746,8621,8622,8630],{},[3749,8623,8624,6857,8627,8629],{},[3769,8625,8626],{},"Приклад:",[3786,8628,8609],{}," — завантажує всі залежності",[3749,8631,8632,6857,8635,8638,8639,8641],{},[3769,8633,8634],{},"Де знаходиться кеш:",[3786,8636,8637],{},"~\u002Fgo\u002Fpkg\u002Fmod"," (або ",[3786,8640,8463],{},")",[4153,8643,8646,8652],{"name":8644,"type":8645},"go mod verify","Перевірка цілісності",[3811,8647,8648,8649,8651],{},"Перевіряє, чи криптографічні хеші завантажених модулів у кеші збігаються з хешами у ",[3786,8650,8235],{},". Захищає від підміни коду залежностей.",[3746,8653,8654,8661],{},[3749,8655,8656,6857,8658,8660],{},[3769,8657,8626],{},[3786,8659,8644],{}," — перевіряє всі модулі",[3749,8662,8663,8666],{},[3769,8664,8665],{},"Використання:"," додайте в CI\u002FCD перед збіркою для безпеки",[4153,8668,8671],{"name":8669,"type":8670},"go run \u003Cшлях-до-main.go>","Швидкий запуск","Компілює вихідний код у тимчасову пам'ять і миттєво запускає програму. Після зупинки програми тимчасовий бінарник автоматично видаляється. Ідеально підходить для швидкої розробки та налагодження.",[4153,8673,8676,8677,4948],{"name":8674,"type":8675},"go fmt .\u002F...","Форматування","Автоматично приводить увесь вихідний код проєкту до єдиного офіційного стандарту форматування Go (відступи табуляцією, вирівнювання структур, порядок імпортів). У світі Go немає суперечок щодо стилю оформлення коду: стиль визначається ",[3786,8678,8679],{},"gofmt",[4153,8681,8684,8685,8688],{"name":8682,"type":8683},"go vet .\u002F...","Статичний лінтер","Вбудований статичний аналізатор коду. Знаходить типові помилки програміста ще до запуску: неправильні специфікатори у ",[3786,8686,8687],{},"fmt.Printf",", недосяжний код, підозрілі замикання у циклах та стан гонитви.",[4153,8690,8693,8694,8697],{"name":8691,"type":8692},"go test .\u002F...","Модульне тестування","Знаходить і запускає всі файли тестів (файли із суфіксом ",[3786,8695,8696],{},"_test.go",") у всіх підпапках поточного проєкту.",[4153,8699,8702,8708],{"name":8700,"type":8701},"go clean -modcache","Очищення кешу",[3811,8703,8704,8705,8707],{},"Видаляє глобальний кеш завантажених модулів ",[3786,8706,8463],{},". Корисно для вирішення проблем з пошкодженими залежностями або для звільнення дискового простору.",[3746,8709,8710,8716],{},[3749,8711,8712,8715],{},[3769,8713,8714],{},"Увага:"," після цього доведеться заново завантажити всі залежності всіх ваших проєктів!",[3749,8717,8718,6857,8720,8722],{},[3769,8719,8626],{},[3786,8721,8700],{}," — видаляє весь кеш модулів",[4153,8724,8727,8730],{"name":8725,"type":8726},"go list -m all","Перегляд залежностей",[3811,8728,8729],{},"Виводить список усіх модулів (прямих і транзитивних), які використовує ваш проєкт, з їхніми версіями.",[3746,8731,8732,8739],{},[3749,8733,8734,6857,8736,8738],{},[3769,8735,8626],{},[3786,8737,8725],{}," — показує всі залежності",[3749,8740,8741,8744],{},[3769,8742,8743],{},"Корисно для:"," аудиту безпеки, перевірки версій, розуміння дерева залежностей",[3811,8746,4489],{},[3798,8748],{},[3806,8750,8752],{"id":8751},"порівняння-go-cli-з-іншими-екосистемами","Порівняння Go CLI з іншими екосистемами",[3811,8754,8755],{},"Для тих, хто приходить з інших мов програмування, корисно побачити аналогії команд:",[4500,8757,8758,8777],{},[4503,8759,8760],{},[4506,8761,8762,8765,8768,8771,8774],{},[4509,8763,8764],{},"Завдання",[4509,8766,8767],{},"Go",[4509,8769,8770],{},"Node.js \u002F npm",[4509,8772,8773],{},"Java \u002F Maven",[4509,8775,8776],{},"Python \u002F pip",[4523,8778,8779,8807,8835,8861,8885,8910,8931,8955,8981,9007],{},[4506,8780,8781,8786,8791,8796,8801],{},[4528,8782,8783],{},[3769,8784,8785],{},"Ініціалізація проєкту",[4528,8787,8788],{},[3786,8789,8790],{},"go mod init",[4528,8792,8793],{},[3786,8794,8795],{},"npm init",[4528,8797,8798],{},[3786,8799,8800],{},"mvn archetype:generate",[4528,8802,8803,8806],{},[3786,8804,8805],{},"pip install"," (немає init)",[4506,8808,8809,8814,8819,8824,8830],{},[4528,8810,8811],{},[3769,8812,8813],{},"Додати залежність",[4528,8815,8816],{},[3786,8817,8818],{},"go get pkg@v1.0.0",[4528,8820,8821],{},[3786,8822,8823],{},"npm install pkg@1.0.0",[4528,8825,8826,8827],{},"Редагувати ",[3786,8828,8829],{},"pom.xml",[4528,8831,8832],{},[3786,8833,8834],{},"pip install pkg==1.0.0",[4506,8836,8837,8842,8846,8851,8856],{},[4528,8838,8839],{},[3769,8840,8841],{},"Встановити всі залежності",[4528,8843,8844],{},[3786,8845,8609],{},[4528,8847,8848],{},[3786,8849,8850],{},"npm install",[4528,8852,8853],{},[3786,8854,8855],{},"mvn install",[4528,8857,8858],{},[3786,8859,8860],{},"pip install -r requirements.txt",[4506,8862,8863,8868,8872,8877,8882],{},[4528,8864,8865],{},[3769,8866,8867],{},"Видалити зайві залежності",[4528,8869,8870],{},[3786,8871,8590],{},[4528,8873,8874],{},[3786,8875,8876],{},"npm prune",[4528,8878,8879],{},[3786,8880,8881],{},"mvn dependency:purge-local-repository",[4528,8883,8884],{},"Вручну",[4506,8886,8887,8892,8897,8902,8905],{},[4528,8888,8889],{},[3769,8890,8891],{},"Запустити без збірки",[4528,8893,8894],{},[3786,8895,8896],{},"go run main.go",[4528,8898,8899],{},[3786,8900,8901],{},"node index.js",[4528,8903,8904],{},"—",[4528,8906,8907],{},[3786,8908,8909],{},"python main.py",[4506,8911,8912,8917,8921,8924,8929],{},[4528,8913,8914],{},[3769,8915,8916],{},"Скомпілювати програму",[4528,8918,8919],{},[3786,8920,3788],{},[4528,8922,8923],{},"— (немає компіляції)",[4528,8925,8926],{},[3786,8927,8928],{},"mvn package",[4528,8930,8923],{},[4506,8932,8933,8938,8943,8948,8950],{},[4528,8934,8935],{},[3769,8936,8937],{},"Форматування коду",[4528,8939,8940],{},[3786,8941,8942],{},"go fmt",[4528,8944,8945],{},[3786,8946,8947],{},"npx prettier",[4528,8949,8904],{},[4528,8951,8952],{},[3786,8953,8954],{},"black .",[4506,8956,8957,8962,8966,8971,8976],{},[4528,8958,8959],{},[3769,8960,8961],{},"Лінтер (статичний аналіз)",[4528,8963,8964],{},[3786,8965,3795],{},[4528,8967,8968],{},[3786,8969,8970],{},"npx eslint",[4528,8972,8973],{},[3786,8974,8975],{},"mvn checkstyle",[4528,8977,8978],{},[3786,8979,8980],{},"pylint",[4506,8982,8983,8988,8992,8997,9002],{},[4528,8984,8985],{},[3769,8986,8987],{},"Запустити тести",[4528,8989,8990],{},[3786,8991,8691],{},[4528,8993,8994],{},[3786,8995,8996],{},"npm test",[4528,8998,8999],{},[3786,9000,9001],{},"mvn test",[4528,9003,9004],{},[3786,9005,9006],{},"pytest",[4506,9008,9009,9014,9019,9025,9030],{},[4528,9010,9011],{},[3769,9012,9013],{},"Де зберігаються бібліотеки",[4528,9015,9016,9018],{},[3786,9017,8637],{}," (глобально)",[4528,9020,9021,9024],{},[3786,9022,9023],{},".\u002Fnode_modules"," (локально)",[4528,9026,9027],{},[3786,9028,9029],{},"~\u002F.m2\u002Frepository",[4528,9031,9032],{},[3786,9033,9034],{},"~\u002F.local\u002Flib\u002Fpython3.x\u002Fsite-packages",[5415,9036,9037,9042,9052,9072],{"icon":92},[3811,9038,9039],{},[3769,9040,9041],{},"Ключова відмінність Go від інших:",[3811,9043,9044,9045,9051],{},"У Go ",[3769,9046,9047,9048,9050],{},"одна утиліта ",[3786,9049,6044],{}," замінює 10+ окремих інструментів"," з інших екосистем:",[3746,9053,9054,9057,9060,9063,9066,9069],{},[3749,9055,9056],{},"Менеджер пакетів (npm, pip, Maven)",[3749,9058,9059],{},"Компілятор (javac, gcc)",[3749,9061,9062],{},"Раннер (node, python)",[3749,9064,9065],{},"Форматер (prettier, black)",[3749,9067,9068],{},"Лінтер (eslint, pylint)",[3749,9070,9071],{},"Тестовий фреймворк (jest, pytest, junit)",[3811,9073,9074,9075,9078],{},"Все ",[3769,9076,9077],{},"вбудовано"," і працює з коробки після встановлення Go!",[8448,9080,9081,9086],{},[3811,9082,9083],{},[3769,9084,9085],{},"Типові помилки початківців з Go CLI:",[3831,9087,9088,9152,9190,9249,9310],{},[3749,9089,9090,9095],{},[3769,9091,9092,9093],{},"Забули запустити ",[3786,9094,8790],{},[3906,9096,9100],{"className":9097,"code":9098,"language":9099,"meta":3911,"style":3911},"language-bash shiki shiki-themes light-plus dark-plus dark-plus","# ❌ Помилка\ngo run main.go\n# Error: cannot find package \"github.com\u002F...\"\n\n# ✅ Правильно\ngo mod init github.com\u002Fstudent\u002Fmy-project\ngo run main.go\n","bash",[3786,9101,9102,9107,9117,9122,9126,9131,9144],{"__ignoreMap":3911},[3915,9103,9104],{"class":3917,"line":3918},[3915,9105,9106],{"class":7138},"# ❌ Помилка\n",[3915,9108,9109,9111,9114],{"class":3917,"line":3924},[3915,9110,6044],{"class":6148},[3915,9112,9113],{"class":6075}," run",[3915,9115,9116],{"class":6075}," main.go\n",[3915,9118,9119],{"class":3917,"line":3930},[3915,9120,9121],{"class":7138},"# Error: cannot find package \"github.com\u002F...\"\n",[3915,9123,9124],{"class":3917,"line":3936},[3915,9125,3964],{"emptyLinePlaceholder":3963},[3915,9127,9128],{"class":3917,"line":3942},[3915,9129,9130],{"class":7138},"# ✅ Правильно\n",[3915,9132,9133,9135,9138,9141],{"class":3917,"line":3948},[3915,9134,6044],{"class":6148},[3915,9136,9137],{"class":6075}," mod",[3915,9139,9140],{"class":6075}," init",[3915,9142,9143],{"class":6075}," github.com\u002Fstudent\u002Fmy-project\n",[3915,9145,9146,9148,9150],{"class":3917,"line":3954},[3915,9147,6044],{"class":6148},[3915,9149,9113],{"class":6075},[3915,9151,9116],{"class":6075},[3749,9153,9154,9157],{},[3769,9155,9156],{},"Імпортують пакет, але не використовують",[3906,9158,9160],{"className":6041,"code":9159,"language":6044,"meta":3911,"style":3911},"\u002F\u002F ❌ Помилка компіляції\nimport \"fmt\"  \u002F\u002F imported and not used\n\nfunc main() {}\n",[3786,9161,9162,9167,9177,9181],{"__ignoreMap":3911},[3915,9163,9164],{"class":3917,"line":3918},[3915,9165,9166],{"class":7138},"\u002F\u002F ❌ Помилка компіляції\n",[3915,9168,9169,9171,9174],{"class":3917,"line":3924},[3915,9170,6066],{"class":6065},[3915,9172,9173],{"class":6075}," \"fmt\"",[3915,9175,9176],{"class":7138},"  \u002F\u002F imported and not used\n",[3915,9178,9179],{"class":3917,"line":3930},[3915,9180,3964],{"emptyLinePlaceholder":3963},[3915,9182,9183,9185,9187],{"class":3917,"line":3936},[3915,9184,6145],{"class":6051},[3915,9186,6371],{"class":6148},[3915,9188,9189],{"class":6069},"() {}\n",[3749,9191,9192,9198],{},[3769,9193,9194,9195,9197],{},"Забули ",[3786,9196,8590],{}," після додавання імпортів",[3906,9199,9201],{"className":9097,"code":9200,"language":9099,"meta":3911,"style":3911},"# Додали import \"github.com\u002Fgoogle\u002Fuuid\" у код\ngo run main.go\n# Error: cannot find module providing package...\n\n# ✅ Правильно\ngo mod tidy  # Автоматично додасть у go.mod\ngo run main.go\n",[3786,9202,9203,9208,9216,9221,9225,9229,9241],{"__ignoreMap":3911},[3915,9204,9205],{"class":3917,"line":3918},[3915,9206,9207],{"class":7138},"# Додали import \"github.com\u002Fgoogle\u002Fuuid\" у код\n",[3915,9209,9210,9212,9214],{"class":3917,"line":3924},[3915,9211,6044],{"class":6148},[3915,9213,9113],{"class":6075},[3915,9215,9116],{"class":6075},[3915,9217,9218],{"class":3917,"line":3930},[3915,9219,9220],{"class":7138},"# Error: cannot find module providing package...\n",[3915,9222,9223],{"class":3917,"line":3936},[3915,9224,3964],{"emptyLinePlaceholder":3963},[3915,9226,9227],{"class":3917,"line":3942},[3915,9228,9130],{"class":7138},[3915,9230,9231,9233,9235,9238],{"class":3917,"line":3948},[3915,9232,6044],{"class":6148},[3915,9234,9137],{"class":6075},[3915,9236,9237],{"class":6075}," tidy",[3915,9239,9240],{"class":7138},"  # Автоматично додасть у go.mod\n",[3915,9242,9243,9245,9247],{"class":3917,"line":3954},[3915,9244,6044],{"class":6148},[3915,9246,9113],{"class":6075},[3915,9248,9116],{"class":6075},[3749,9250,9251,9259],{},[3769,9252,9253,9254,8297,9257],{},"Плутають ",[3786,9255,9256],{},"go run",[3786,9258,3788],{},[3906,9260,9262],{"className":9097,"code":9261,"language":9099,"meta":3911,"style":3911},"# go run — НЕ створює файл, просто запускає\ngo run main.go  # Немає бінарника після виконання\n\n# go build — створює виконуваний файл\ngo build -o myapp main.go\n.\u002Fmyapp\n",[3786,9263,9264,9269,9281,9285,9290,9305],{"__ignoreMap":3911},[3915,9265,9266],{"class":3917,"line":3918},[3915,9267,9268],{"class":7138},"# go run — НЕ створює файл, просто запускає\n",[3915,9270,9271,9273,9275,9278],{"class":3917,"line":3924},[3915,9272,6044],{"class":6148},[3915,9274,9113],{"class":6075},[3915,9276,9277],{"class":6075}," main.go",[3915,9279,9280],{"class":7138},"  # Немає бінарника після виконання\n",[3915,9282,9283],{"class":3917,"line":3930},[3915,9284,3964],{"emptyLinePlaceholder":3963},[3915,9286,9287],{"class":3917,"line":3936},[3915,9288,9289],{"class":7138},"# go build — створює виконуваний файл\n",[3915,9291,9292,9294,9297,9300,9303],{"class":3917,"line":3942},[3915,9293,6044],{"class":6148},[3915,9295,9296],{"class":6075}," build",[3915,9298,9299],{"class":6051}," -o",[3915,9301,9302],{"class":6075}," myapp",[3915,9304,9116],{"class":6075},[3915,9306,9307],{"class":3917,"line":3948},[3915,9308,9309],{"class":6148},".\u002Fmyapp\n",[3749,9311,9312,9318],{},[3769,9313,9314,9315,9317],{},"Намагаються імпортувати ",[3786,9316,8318],{}," з іншого модуля",[3906,9319,9321],{"className":6041,"code":9320,"language":6044,"meta":3911,"style":3911},"\u002F\u002F ❌ Заборонено компілятором!\nimport \"github.com\u002Fother-project\u002Finternal\u002Fservice\"\n\u002F\u002F Error: use of internal package not allowed\n",[3786,9322,9323,9328,9335],{"__ignoreMap":3911},[3915,9324,9325],{"class":3917,"line":3918},[3915,9326,9327],{"class":7138},"\u002F\u002F ❌ Заборонено компілятором!\n",[3915,9329,9330,9332],{"class":3917,"line":3924},[3915,9331,6066],{"class":6065},[3915,9333,9334],{"class":6075}," \"github.com\u002Fother-project\u002Finternal\u002Fservice\"\n",[3915,9336,9337],{"class":3917,"line":3930},[3915,9338,9339],{"class":7138},"\u002F\u002F Error: use of internal package not allowed\n",[3798,9341],{},[3806,9343,9345],{"id":9344},"ваша-перша-програма-анатомічний-розбір-hello-world","Ваша перша програма: Анатомічний розбір Hello World",[3811,9347,9348],{},"Перед тим як переходити до складних багатокомпонентних сервісів, створимо та розберемо найпростішу базову програму на мові Go.",[3811,9350,9351,9352,9355],{},"Створіть файл ",[3786,9353,9354],{},"main.go"," з наступним вмістом:",[3906,9357,9359],{"className":6041,"code":9358,"filename":9354,"language":6044,"meta":3911,"style":3911},"package main\n\nimport \"fmt\"\n\nfunc main() {\n    fmt.Println(\"Привіт, клієнт-серверний світе на Go! 🚀\")\n}\n",[3786,9360,9361,9367,9371,9378,9382,9390,9406],{"__ignoreMap":3911},[3915,9362,9363,9365],{"class":3917,"line":3918},[3915,9364,6052],{"class":6051},[3915,9366,6056],{"class":6055},[3915,9368,9369],{"class":3917,"line":3924},[3915,9370,3964],{"emptyLinePlaceholder":3963},[3915,9372,9373,9375],{"class":3917,"line":3930},[3915,9374,6066],{"class":6065},[3915,9376,9377],{"class":6075}," \"fmt\"\n",[3915,9379,9380],{"class":3917,"line":3936},[3915,9381,3964],{"emptyLinePlaceholder":3963},[3915,9383,9384,9386,9388],{"class":3917,"line":3942},[3915,9385,6145],{"class":6051},[3915,9387,6371],{"class":6148},[3915,9389,6374],{"class":6069},[3915,9391,9392,9395,9397,9399,9401,9404],{"class":3917,"line":3948},[3915,9393,9394],{"class":6114},"    fmt",[3915,9396,4948],{"class":6069},[3915,9398,6410],{"class":6148},[3915,9400,6152],{"class":6069},[3915,9402,9403],{"class":6075},"\"Привіт, клієнт-серверний світе на Go! 🚀\"",[3915,9405,6091],{"class":6069},[3915,9407,9408],{"class":3917,"line":3954},[3915,9409,3994],{"class":6069},[3903,9411,9413],{"alt":9412},"Анатомія коду першої програми на Go",[3906,9414,9416],{"className":3908,"code":9415,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 13\n\npackage \"Анатомія файлу main.go\" #F8FAFC {\n    rectangle \"1. package main\\n• Оголошує пакет як виконувану точку входу\" as Pkg #DBEAFE\n    rectangle \"2. import \\\"fmt\\\"\\n• Підключає стандартний пакет форматування та вводу\u002Fвиводу\" as Imp #DCFCE7\n    rectangle \"3. func main()\\n• Головна функція, з якої операційна система починає виконання\" as Fn #FEF3C7\n    rectangle \"4. fmt.Println(...)\\n• Виводить рядок у стандартний вивід (stdout)\" as Out #FCE7F3\n}\n\nPkg -down-> Imp\nImp -down-> Fn\nFn -down-> Out\n@enduml\n",[3786,9417,9418,9422,9426,9430,9434,9438,9443,9448,9453,9458,9463,9467,9471,9476,9481,9486],{"__ignoreMap":3911},[3915,9419,9420],{"class":3917,"line":3918},[3915,9421,3921],{},[3915,9423,9424],{"class":3917,"line":3924},[3915,9425,3927],{},[3915,9427,9428],{"class":3917,"line":3930},[3915,9429,3933],{},[3915,9431,9432],{"class":3917,"line":3936},[3915,9433,3939],{},[3915,9435,9436],{"class":3917,"line":3942},[3915,9437,3964],{"emptyLinePlaceholder":3963},[3915,9439,9440],{"class":3917,"line":3948},[3915,9441,9442],{},"package \"Анатомія файлу main.go\" #F8FAFC {\n",[3915,9444,9445],{"class":3917,"line":3954},[3915,9446,9447],{},"    rectangle \"1. package main\\n• Оголошує пакет як виконувану точку входу\" as Pkg #DBEAFE\n",[3915,9449,9450],{"class":3917,"line":3960},[3915,9451,9452],{},"    rectangle \"2. import \\\"fmt\\\"\\n• Підключає стандартний пакет форматування та вводу\u002Fвиводу\" as Imp #DCFCE7\n",[3915,9454,9455],{"class":3917,"line":3967},[3915,9456,9457],{},"    rectangle \"3. func main()\\n• Головна функція, з якої операційна система починає виконання\" as Fn #FEF3C7\n",[3915,9459,9460],{"class":3917,"line":3973},[3915,9461,9462],{},"    rectangle \"4. fmt.Println(...)\\n• Виводить рядок у стандартний вивід (stdout)\" as Out #FCE7F3\n",[3915,9464,9465],{"class":3917,"line":3979},[3915,9466,3994],{},[3915,9468,9469],{"class":3917,"line":3985},[3915,9470,3964],{"emptyLinePlaceholder":3963},[3915,9472,9473],{"class":3917,"line":3991},[3915,9474,9475],{},"Pkg -down-> Imp\n",[3915,9477,9478],{"class":3917,"line":3997},[3915,9479,9480],{},"Imp -down-> Fn\n",[3915,9482,9483],{"class":3917,"line":4002},[3915,9484,9485],{},"Fn -down-> Out\n",[3915,9487,9488],{"class":3917,"line":4008},[3915,9489,4145],{},[3811,9491,9492],{},"Розберемо детально призначення кожного рядка цього коду:",[4150,9494,9495,9523,9529,9551,9553,9591],{},[4153,9496,9499,9505],{"name":9497,"type":9498},"1. Рядок 'package main'","Декларація точки входу",[3811,9500,9501,9502,9504],{},"Слово ",[3786,9503,6052],{}," вказує компілятору, до якого логічного простору належить файл.",[3746,9506,9507],{},[3749,9508,5226,9509,9516,9517,9519,9520,4948],{},[3769,9510,9511,9512,9515],{},"Чому саме ",[3786,9513,9514],{},"main","?"," Ім'я ",[3786,9518,9514],{}," є зарезервованим і магічним для компілятора Go. Воно повідомляє збирачу: ",[3815,9521,9522],{},"«Цей код не є бібліотекою, це самостійна програма, яку необхідно скомпільувати у готовий до запуску бінарний файл»",[3811,9524,9525,9526,9528],{},"::field{name=\"2. Рядок 'import \"fmt\"'\" type=\"Підключення бібліотеки\"}\nКлючове слово ",[3786,9527,6066],{}," підключає зовнішні модулі або пакети зі стандартної бібліотеки мови Go.",[3746,9530,9531,9544],{},[3749,9532,9533,9534,9539,9540,9543],{},"Пакет ",[3769,9535,9536],{},[3786,9537,9538],{},"fmt"," (скорочення від англ. ",[3815,9541,9542],{},"Format"," — «форматування») є базовим інструментом для роботи з текстом, консольним виведенням та форматуванням даних (детальний довідник функцій пакету наведено нижче).",[3749,9545,9546,9547,9550],{},"У Go діє залізне правило: ",[3769,9548,9549],{},"якщо ви імпортували пакет, але не викликали з нього жодної функції, компілятор зупинить збірку з помилкою",". Це виключає наявність «мертвого» коду та зайвих залежностей.",[3811,9552,4489],{},[4153,9554,9557,9571],{"name":9555,"type":9556},"3. Рядок 'func main()'","Головна функція",[3811,9558,9559,9560,9563,9564,9566,9567,9570],{},"Функція ",[3786,9561,9562],{},"main()"," у пакеті ",[3786,9565,9514],{}," є ",[3769,9568,9569],{},"єдиною точкою старту"," виконання програми.",[3746,9572,9573,9576,9585],{},[3749,9574,9575],{},"Вона не приймає жодних параметрів у круглих дужках і нічого не повертає.",[3749,9577,9578,9579,9582,9583,4948],{},"Якщо вам потрібно отримати аргументи командного рядка з терміналу, Go надає для цього зріз ",[3786,9580,9581],{},"os.Args"," зі стандартного пакету ",[3786,9584,7532],{},[3749,9586,9587,9588,4948],{},"Якщо програма має завершитися зі спеціальним кодом помилки, викликається функція ",[3786,9589,9590],{},"os.Exit(1)",[4153,9592,9595,9596,9598,9599,9601,9602,9605,9606,9609],{"name":9593,"type":9594},"4. Рядок 'fmt.Println(...) '","Виведення результату","Викликає функцію ",[3786,9597,6410],{}," із підключеного пакету ",[3786,9600,9538],{},". Вона записує передані аргументи у стандартний потік виведення консолі (",[3815,9603,9604],{},"Standard Output \u002F stdout",") та автоматично додає символ переносу на новий рядок ",[3786,9607,9608],{},"\\n"," наприкінці.",[3798,9611],{},[3806,9613,9615,9616,9618,9619,9621],{"id":9614},"глибоке-занурення-директива-import-та-пакет-fmt-довідник-io","Глибоке занурення: Директива ",[3786,9617,6066],{}," та пакет ",[3786,9620,9538],{}," (Довідник I\u002FO)",[3811,9623,9624,9625,9627],{},"Для інженера клієнт-серверних систем пакет ",[3786,9626,9538],{}," є одним із найбільш часто використовуваних інструментів: від логування станів сервера до динамічної генерації SQL-запитів, JSON-рядків та форматування мережевих відповідей.",[9629,9630,9632,9633],"h4",{"id":9631},"синтаксис-та-можливості-директиви-import","Синтаксис та можливості директиви ",[3786,9634,6066],{},[3811,9636,9637],{},"У Go існує кілька способів підключення пакетів:",[3906,9639,9641],{"className":6041,"code":9640,"language":6044,"meta":3911,"style":3911},"package main\n\n\u002F\u002F Спосіб 1: Груповий блок імпортів (Фабричний стандарт)\nimport (\n    \"fmt\"                    \u002F\u002F Стандартна бібліотека: форматування\n    \"net\u002Fhttp\"               \u002F\u002F Стандартна бібліотека: вебсервер\n    \"time\"                   \u002F\u002F Стандартна бібліотека: час\n\n    myjson \"encoding\u002Fjson\"   \u002F\u002F Імпорт з псевдонімом (Alias) для уникнення конфліктів імен\n    _ \"github.com\u002Flib\u002Fpq\"    \u002F\u002F Анонімний імпорт (Blank Import): запускає лише функцію init() драйвера БД\n)\n",[3786,9642,9643,9649,9653,9658,9664,9672,9680,9688,9692,9703,9714],{"__ignoreMap":3911},[3915,9644,9645,9647],{"class":3917,"line":3918},[3915,9646,6052],{"class":6051},[3915,9648,6056],{"class":6055},[3915,9650,9651],{"class":3917,"line":3924},[3915,9652,3964],{"emptyLinePlaceholder":3963},[3915,9654,9655],{"class":3917,"line":3930},[3915,9656,9657],{"class":7138},"\u002F\u002F Спосіб 1: Груповий блок імпортів (Фабричний стандарт)\n",[3915,9659,9660,9662],{"class":3917,"line":3936},[3915,9661,6066],{"class":6065},[3915,9663,6070],{"class":6069},[3915,9665,9666,9669],{"class":3917,"line":3942},[3915,9667,9668],{"class":6075},"    \"fmt\"",[3915,9670,9671],{"class":7138},"                    \u002F\u002F Стандартна бібліотека: форматування\n",[3915,9673,9674,9677],{"class":3917,"line":3948},[3915,9675,9676],{"class":6075},"    \"net\u002Fhttp\"",[3915,9678,9679],{"class":7138},"               \u002F\u002F Стандартна бібліотека: вебсервер\n",[3915,9681,9682,9685],{"class":3917,"line":3954},[3915,9683,9684],{"class":6075},"    \"time\"",[3915,9686,9687],{"class":7138},"                   \u002F\u002F Стандартна бібліотека: час\n",[3915,9689,9690],{"class":3917,"line":3960},[3915,9691,3964],{"emptyLinePlaceholder":3963},[3915,9693,9694,9697,9700],{"class":3917,"line":3967},[3915,9695,9696],{"class":6114},"    myjson",[3915,9698,9699],{"class":6075}," \"encoding\u002Fjson\"",[3915,9701,9702],{"class":7138},"   \u002F\u002F Імпорт з псевдонімом (Alias) для уникнення конфліктів імен\n",[3915,9704,9705,9708,9711],{"class":3917,"line":3973},[3915,9706,9707],{"class":6114},"    _",[3915,9709,9710],{"class":6075}," \"github.com\u002Flib\u002Fpq\"",[3915,9712,9713],{"class":7138},"    \u002F\u002F Анонімний імпорт (Blank Import): запускає лише функцію init() драйвера БД\n",[3915,9715,9716],{"class":3917,"line":3979},[3915,9717,6091],{"class":6069},[5415,9719,9720,9723,9724,3789,9727,9730,9731,9734,9735,9737],{},[3769,9721,9722],{},"Чому груповий імпорт у круглих дужках кращий?","\nЗамість багаторазового повторення слова ",[3786,9725,9726],{},"import \"a\"",[3786,9728,9729],{},"import \"b\""," використання блоку ",[3786,9732,9733],{},"import (...)"," робить секцію залежностей компактною та автоматично групується утилітою ",[3786,9736,8942],{}," (спочатку йдуть стандартні пакети Go, потім через порожній рядок — сторонні бібліотеки).",[3798,9739],{},[9629,9741,9743,9744],{"id":9742},"архітектура-та-класифікація-функцій-пакету-fmt","Архітектура та класифікація функцій пакету ",[3786,9745,9538],{},[3811,9747,9748,9749,9751,9752,4628],{},"Усі функції пакету ",[3786,9750,9538],{}," спроєктовані за чіткою та логічною префіксною системою імен. Їх можна розділити на ",[3769,9753,9754],{},"чотири головні сімейства",[3903,9756,9758],{"alt":9757},"Класифікація функцій пакету fmt",[3906,9759,9761],{"className":3908,"code":9760,"language":3910,"meta":3911,"style":3911},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\nskinparam defaultFontSize 12\n\npackage \"Стандартний пакет `fmt`\" #F8FAFC {\n    rectangle \"1. Консольне виведення (stdout)\\n• Print() : Без переносу рядка\\n• Println() : З пробілами та \\\\n\\n• Printf() : За шаблоном %v\" as StdoutGrp #DBEAFE\n    rectangle \"2. Форматування у рядок (String)\\n• Sprint() : Повертає string\\n• Sprintln() : З переносом рядка\\n• Sprintf() : Форматує рядок за шаблоном\" as StrGrp #DCFCE7\n    rectangle \"3. Запис у потік (io.Writer)\\n• Fprint(w, ...)\\n• Fprintln(w, ...)\\n• Fprintf(w, format, ...) -> До сокета\u002Fфайлу\" as FileGrp #FEF3C7\n    rectangle \"4. Створення помилок та зчитування\\n• Errorf() : Створює тип error\\n• Scan() \u002F Sscanf() \u002F Fscanf() : Парсинг\" as ErrGrp #FCE7F3\n}\n@enduml\n",[3786,9762,9763,9767,9771,9775,9779,9783,9788,9793,9798,9803,9808,9812],{"__ignoreMap":3911},[3915,9764,9765],{"class":3917,"line":3918},[3915,9766,3921],{},[3915,9768,9769],{"class":3917,"line":3924},[3915,9770,3927],{},[3915,9772,9773],{"class":3917,"line":3930},[3915,9774,3933],{},[3915,9776,9777],{"class":3917,"line":3936},[3915,9778,4801],{},[3915,9780,9781],{"class":3917,"line":3942},[3915,9782,3964],{"emptyLinePlaceholder":3963},[3915,9784,9785],{"class":3917,"line":3948},[3915,9786,9787],{},"package \"Стандартний пакет `fmt`\" #F8FAFC {\n",[3915,9789,9790],{"class":3917,"line":3954},[3915,9791,9792],{},"    rectangle \"1. Консольне виведення (stdout)\\n• Print() : Без переносу рядка\\n• Println() : З пробілами та \\\\n\\n• Printf() : За шаблоном %v\" as StdoutGrp #DBEAFE\n",[3915,9794,9795],{"class":3917,"line":3960},[3915,9796,9797],{},"    rectangle \"2. Форматування у рядок (String)\\n• Sprint() : Повертає string\\n• Sprintln() : З переносом рядка\\n• Sprintf() : Форматує рядок за шаблоном\" as StrGrp #DCFCE7\n",[3915,9799,9800],{"class":3917,"line":3967},[3915,9801,9802],{},"    rectangle \"3. Запис у потік (io.Writer)\\n• Fprint(w, ...)\\n• Fprintln(w, ...)\\n• Fprintf(w, format, ...) -> До сокета\u002Fфайлу\" as FileGrp #FEF3C7\n",[3915,9804,9805],{"class":3917,"line":3973},[3915,9806,9807],{},"    rectangle \"4. Створення помилок та зчитування\\n• Errorf() : Створює тип error\\n• Scan() \u002F Sscanf() \u002F Fscanf() : Парсинг\" as ErrGrp #FCE7F3\n",[3915,9809,9810],{"class":3917,"line":3979},[3915,9811,3994],{},[3915,9813,9814],{"class":3917,"line":3985},[3915,9815,4145],{},[3811,9817,9818],{},"Розглянемо кожну групу детально:",[9820,9821,9823],"h5",{"id":9822},"група-1-виведення-у-термінал-stdout","Група 1: Виведення у термінал (Stdout)",[3746,9825,9826,9832,9843],{},[3749,9827,9828,9831],{},[3786,9829,9830],{},"fmt.Print(...)"," — послідовно виводить аргументи у консоль без додавання переносу рядка.",[3749,9833,9834,9837,9838,4948],{},[3786,9835,9836],{},"fmt.Println(...)"," — виводить аргументи через пробіл і ",[3769,9839,9840,9841],{},"завжди завершує рядок символом ",[3786,9842,9608],{},[3749,9844,9845,9848,9849,9852,9853,9856],{},[3786,9846,9847],{},"fmt.Printf(template, ...)"," — форматує виведення відповідно до специфікаторів форматування (наприклад, ",[3786,9850,9851],{},"%d"," для чисел, ",[3786,9854,9855],{},"%s"," для рядків).",[9820,9858,9860,9861,9864],{"id":9859},"група-2-форматування-у-рядок-s-string","Група 2: Форматування у рядок (",[3786,9862,9863],{},"S"," = String)",[3811,9866,9867,9868,9871,9872,4628],{},"Функції цієї групи ",[3769,9869,9870],{},"нічого не друкують у консоль",", а повертають результат у вигляді готової змінної типу ",[3786,9873,7518],{},[3746,9875,9876],{},[3749,9877,9878,9881],{},[3786,9879,9880],{},"fmt.Sprintf(\"http:\u002F\u002F%s:%d\u002Fapi\", host, port)"," — фундаментальна функція для конструювання динамічних рядків, URL, SQL-запитів та повідомлень.",[9820,9883,9885,9886,9889],{"id":9884},"група-3-запис-у-довільний-потік-f-file-iowriter","Група 3: Запис у довільний потік (",[3786,9887,9888],{},"F"," = File \u002F io.Writer)",[3811,9891,9892,9893,9896,9897,9899,9900,9903,9904,9907,9908,3841],{},"Найважливіша група для мережевого програмування. Першим аргументом вони приймають будь-який об'єкт, що реалізує інтерфейс ",[3786,9894,9895],{},"io.Writer"," (мережевий TCP-сокет ",[3786,9898,5494],{},", HTTP-відповідь ",[3786,9901,9902],{},"http.ResponseWriter",", відкритий файл на диску ",[3786,9905,9906],{},"*os.File"," або буфер ",[3786,9909,9910],{},"bytes.Buffer",[3746,9912,9913],{},[3749,9914,9915],{},[3786,9916,9917],{},"fmt.Fprintf(w, \"HTTP\u002F1.1 200 OK\\r\\nContent-Type: text\u002Fplain\\r\\n\\r\\nHello!\")",[9820,9919,9921],{"id":9920},"група-4-створення-помилок","Група 4: Створення помилок",[3746,9923,9924],{},[3749,9925,9926,9929,9930,9933,9934,4948],{},[3786,9927,9928],{},"fmt.Errorf(\"не вдалося підключитися до хоста %s: %w\", host, err)"," — генерує новий об'єкт помилки, що реалізує стандартний інтерфейс ",[3786,9931,9932],{},"error",", із підтримкою пакування першопричин через специфікатор ",[3786,9935,9936],{},"%w",[3798,9938],{},[9629,9940,9942],{"id":9941},"довідник-специфікаторів-форматування-format-verbs","Довідник специфікаторів форматування (Format Verbs)",[3811,9944,9945,9946,4967,9948,9951],{},"Специфікатори (або «верби») вказують функції ",[3786,9947,6335],{},[3786,9949,9950],{},"Sprintf",", як саме інтерпретувати та відображати значення:",[4500,9953,9954,9967],{},[4503,9955,9956],{},[4506,9957,9958,9961,9964],{},[4509,9959,9960],{"align":4511},"Специфікатор",[4509,9962,9963],{"align":4511},"Тип даних",[4509,9965,9966],{"align":4511},"Опис та приклад виведення",[4523,9968,9969,9991,10012,10026,10053,10075,10095,10112,10136,10159,10177,10199,10220,10248],{},[4506,9970,9971,9977,9980],{},[4528,9972,9973],{"align":4511},[3769,9974,9975],{},[3786,9976,6343],{},[4528,9978,9979],{"align":4511},"Будь-який",[4528,9981,9982,9983,3789,9986,3789,9989,8641],{"align":4511},"Значення за замовчуванням у стандартному форматі (",[3786,9984,9985],{},"100",[3786,9987,9988],{},"\"text\"",[3786,9990,5260],{},[4506,9992,9993,10000,10003],{},[4528,9994,9995],{"align":4511},[3769,9996,9997],{},[3786,9998,9999],{},"%+v",[4528,10001,10002],{"align":4511},"Структури",[4528,10004,10005,10006,6218,10009],{"align":4511},"Виводить структуру разом з ",[3769,10007,10008],{},"іменами її полів",[3786,10010,10011],{},"{ID:1 Name:Admin}",[4506,10013,10014,10021,10023],{},[4528,10015,10016],{"align":4511},[3769,10017,10018],{},[3786,10019,10020],{},"%#v",[4528,10022,9979],{"align":4511},[4528,10024,10025],{"align":4511},"Виводить повний синтаксис Go, яким можна відтворити це значення в коді",[4506,10027,10028,10035,10037],{},[4528,10029,10030],{"align":4511},[3769,10031,10032],{},[3786,10033,10034],{},"%T",[4528,10036,9979],{"align":4511},[4528,10038,10039,10040,10043,10044,3789,10047,3789,10050],{"align":4511},"Виводить ",[3769,10041,10042],{},"тип даних"," змінної: ",[3786,10045,10046],{},"int64",[3786,10048,10049],{},"main.User",[3786,10051,10052],{},"*net.TCPConn",[4506,10054,10055,10062,10067],{},[4528,10056,10057],{"align":4511},[3769,10058,10059],{},[3786,10060,10061],{},"%t",[4528,10063,10064],{"align":4511},[3786,10065,10066],{},"bool",[4528,10068,10069,10070,5765,10072],{"align":4511},"Булеве значення: ",[3786,10071,5260],{},[3786,10073,10074],{},"false",[4506,10076,10077,10083,10086],{},[4528,10078,10079],{"align":4511},[3769,10080,10081],{},[3786,10082,9851],{},[4528,10084,10085],{"align":4511},"Цілі числа",[4528,10087,10088,10089,3789,10092,8641],{"align":4511},"Десяткове ціле число зі знаком (",[3786,10090,10091],{},"-42",[3786,10093,10094],{},"1024",[4506,10096,10097,10104,10106],{},[4528,10098,10099],{"align":4511},[3769,10100,10101],{},[3786,10102,10103],{},"%b",[4528,10105,10085],{"align":4511},[4528,10107,10108,10109,8641],{"align":4511},"Двійкове представлення числа (",[3786,10110,10111],{},"101010",[4506,10113,10114,10124,10127],{},[4528,10115,10116],{"align":4511},[3769,10117,10118,4967,10121],{},[3786,10119,10120],{},"%x",[3786,10122,10123],{},"%X",[4528,10125,10126],{"align":4511},"Числа \u002F байти",[4528,10128,10129,10130,3789,10133,8641],{"align":4511},"Шістнадцятковий вигляд (",[3786,10131,10132],{},"0xff",[3786,10134,10135],{},"deadbeef",[4506,10137,10138,10148,10153],{},[4528,10139,10140],{"align":4511},[3769,10141,10142,4967,10145],{},[3786,10143,10144],{},"%f",[3786,10146,10147],{},"%.2f",[4528,10149,10150],{"align":4511},[3786,10151,10152],{},"float",[4528,10154,10155,10156,10158],{"align":4511},"Дійсне число (наприклад ",[3786,10157,10147],{}," округлює рівно до 2 знаків після коми)",[4506,10160,10161,10167,10174],{},[4528,10162,10163],{"align":4511},[3769,10164,10165],{},[3786,10166,9855],{},[4528,10168,10169,4967,10171],{"align":4511},[3786,10170,7518],{},[3786,10172,10173],{},"[]byte",[4528,10175,10176],{"align":4511},"Звичайний текстовий рядок",[4506,10178,10179,10186,10193],{},[4528,10180,10181],{"align":4511},[3769,10182,10183],{},[3786,10184,10185],{},"%q",[4528,10187,10188,4967,10190],{"align":4511},[3786,10189,7518],{},[3786,10191,10192],{},"rune",[4528,10194,10195,10196],{"align":4511},"Рядок, безпечно взятий у подвійні лапки з екрануванням: ",[3786,10197,10198],{},"\"hello\\n\"",[4506,10200,10201,10208,10211],{},[4528,10202,10203],{"align":4511},[3769,10204,10205],{},[3786,10206,10207],{},"%p",[4528,10209,10210],{"align":4511},"Покажчики",[4528,10212,10213,10214,6218,10217],{"align":4511},"Шістнадцяткова ",[3769,10215,10216],{},"адреса в оперативній пам'яті",[3786,10218,10219],{},"0xc000014088",[4506,10221,10222,10229,10236],{},[4528,10223,10224],{"align":4511},[3769,10225,10226],{},[3786,10227,10228],{},"%c",[4528,10230,10231,4967,10233],{"align":4511},[3786,10232,10192],{},[3786,10234,10235],{},"int32",[4528,10237,10238,10239,3789,10242,3789,10245],{"align":4511},"Символ Unicode за його кодом: ",[3786,10240,10241],{},"'A'",[3786,10243,10244],{},"'Ї'",[3786,10246,10247],{},"'🚀'",[4506,10249,10250,10257,10260],{},[4528,10251,10252],{"align":4511},[3769,10253,10254],{},[3786,10255,10256],{},"%%",[4528,10258,10259],{"align":4511},"Немає",[4528,10261,10262,10263],{"align":4511},"Друкує буквальний знак відсотка ",[3786,10264,10265],{},"%",[3798,10267],{},[9629,10269,10271,10272],{"id":10270},"практичний-демонстраційний-лістинг-роботи-з-fmt","Практичний демонстраційний лістинг роботи з ",[3786,10273,9538],{},[3906,10275,10277],{"className":6041,"code":10276,"language":6044,"meta":3911,"style":3911},"package main\n\nimport (\n    \"fmt\"\n    \"os\"\n)\n\ntype ServerConfig struct {\n    Host string\n    Port int\n    TLS  bool\n}\n\nfunc main() {\n    cfg := ServerConfig{Host: \"127.0.0.1\", Port: 8443, TLS: true}\n\n    \u002F\u002F 1. Різниця між %v, %+v та %#v\n    fmt.Printf(\"Звичайне %%v:  %v\\n\", cfg)\n    fmt.Printf(\"З полями %%+v: %+v\\n\", cfg)\n    fmt.Printf(\"Go-код %%#v:   %#v\\n\", cfg)\n    fmt.Printf(\"Тип змінної %%T: %T\\n\\n\", cfg)\n\n    \u002F\u002F 2. Створення рядка через Sprintf (без виведення в консоль)\n    serviceURL := fmt.Sprintf(\"https:\u002F\u002F%s:%d\u002Fhealth\", cfg.Host, cfg.Port)\n    fmt.Println(\"Згенерований URL:\", serviceURL)\n\n    \u002F\u002F 3. Форматування чисел та байтів\n    latency := 0.045678\n    fmt.Printf(\"Затримка мережі: %.2f мс (Двійковий порт: %b)\\n\", latency*1000, cfg.Port)\n\n    \u002F\u002F 4. Запис у потік помилок os.Stderr через Fprintf\n    fmt.Fprintf(os.Stderr, \"[LOG WARN] Тестове повідомлення у потік помилок\\n\")\n}\n",[3786,10278,10279,10285,10289,10295,10300,10305,10309,10313,10324,10331,10338,10346,10350,10354,10362,10403,10407,10412,10443,10473,10503,10534,10538,10543,10588,10608,10612,10617,10627,10673,10677,10682,10711],{"__ignoreMap":3911},[3915,10280,10281,10283],{"class":3917,"line":3918},[3915,10282,6052],{"class":6051},[3915,10284,6056],{"class":6055},[3915,10286,10287],{"class":3917,"line":3924},[3915,10288,3964],{"emptyLinePlaceholder":3963},[3915,10290,10291,10293],{"class":3917,"line":3930},[3915,10292,6066],{"class":6065},[3915,10294,6070],{"class":6069},[3915,10296,10297],{"class":3917,"line":3936},[3915,10298,10299],{"class":6075},"    \"fmt\"\n",[3915,10301,10302],{"class":3917,"line":3942},[3915,10303,10304],{"class":6075},"    \"os\"\n",[3915,10306,10307],{"class":3917,"line":3948},[3915,10308,6091],{"class":6069},[3915,10310,10311],{"class":3917,"line":3954},[3915,10312,3964],{"emptyLinePlaceholder":3963},[3915,10314,10315,10317,10320,10322],{"class":3917,"line":3960},[3915,10316,6100],{"class":6051},[3915,10318,10319],{"class":6055}," ServerConfig",[3915,10321,6106],{"class":6051},[3915,10323,6109],{"class":6069},[3915,10325,10326,10329],{"class":3917,"line":3967},[3915,10327,10328],{"class":6114},"    Host",[3915,10330,7401],{"class":6055},[3915,10332,10333,10335],{"class":3917,"line":3973},[3915,10334,7390],{"class":6114},[3915,10336,10337],{"class":6055}," int\n",[3915,10339,10340,10343],{"class":3917,"line":3979},[3915,10341,10342],{"class":6114},"    TLS",[3915,10344,10345],{"class":6055},"  bool\n",[3915,10347,10348],{"class":3917,"line":3985},[3915,10349,3994],{"class":6069},[3915,10351,10352],{"class":3917,"line":3991},[3915,10353,3964],{"emptyLinePlaceholder":3963},[3915,10355,10356,10358,10360],{"class":3917,"line":3997},[3915,10357,6145],{"class":6051},[3915,10359,6371],{"class":6148},[3915,10361,6374],{"class":6069},[3915,10363,10364,10366,10368,10371,10373,10376,10378,10381,10383,10386,10388,10392,10394,10397,10399,10401],{"class":3917,"line":4002},[3915,10365,7144],{"class":6114},[3915,10367,6190],{"class":6069},[3915,10369,10370],{"class":6055},"ServerConfig",[3915,10372,8094],{"class":6069},[3915,10374,10375],{"class":6114},"Host",[3915,10377,6218],{"class":6069},[3915,10379,10380],{"class":6075},"\"127.0.0.1\"",[3915,10382,3789],{"class":6069},[3915,10384,10385],{"class":6114},"Port",[3915,10387,6218],{"class":6069},[3915,10389,10391],{"class":10390},"sJj4R","8443",[3915,10393,3789],{"class":6069},[3915,10395,10396],{"class":6114},"TLS",[3915,10398,6218],{"class":6069},[3915,10400,5260],{"class":6051},[3915,10402,3994],{"class":6069},[3915,10404,10405],{"class":3917,"line":4008},[3915,10406,3964],{"emptyLinePlaceholder":3963},[3915,10408,10409],{"class":3917,"line":4014},[3915,10410,10411],{"class":7138},"    \u002F\u002F 1. Різниця між %v, %+v та %#v\n",[3915,10413,10414,10416,10418,10420,10422,10425,10427,10430,10432,10435,10437,10439,10441],{"class":3917,"line":4020},[3915,10415,9394],{"class":6114},[3915,10417,4948],{"class":6069},[3915,10419,6335],{"class":6148},[3915,10421,6152],{"class":6069},[3915,10423,10424],{"class":6075},"\"Звичайне ",[3915,10426,10256],{"class":6114},[3915,10428,10429],{"class":6075},"v:  ",[3915,10431,6343],{"class":6114},[3915,10433,9608],{"class":10434},"sjcCO",[3915,10436,6346],{"class":6075},[3915,10438,3789],{"class":6069},[3915,10440,7259],{"class":6114},[3915,10442,6091],{"class":6069},[3915,10444,10445,10447,10449,10451,10453,10456,10458,10461,10463,10465,10467,10469,10471],{"class":3917,"line":4026},[3915,10446,9394],{"class":6114},[3915,10448,4948],{"class":6069},[3915,10450,6335],{"class":6148},[3915,10452,6152],{"class":6069},[3915,10454,10455],{"class":6075},"\"З полями ",[3915,10457,10256],{"class":6114},[3915,10459,10460],{"class":6075},"+v: ",[3915,10462,9999],{"class":6114},[3915,10464,9608],{"class":10434},[3915,10466,6346],{"class":6075},[3915,10468,3789],{"class":6069},[3915,10470,7259],{"class":6114},[3915,10472,6091],{"class":6069},[3915,10474,10475,10477,10479,10481,10483,10486,10488,10491,10493,10495,10497,10499,10501],{"class":3917,"line":4032},[3915,10476,9394],{"class":6114},[3915,10478,4948],{"class":6069},[3915,10480,6335],{"class":6148},[3915,10482,6152],{"class":6069},[3915,10484,10485],{"class":6075},"\"Go-код ",[3915,10487,10256],{"class":6114},[3915,10489,10490],{"class":6075},"#v:   ",[3915,10492,10020],{"class":6114},[3915,10494,9608],{"class":10434},[3915,10496,6346],{"class":6075},[3915,10498,3789],{"class":6069},[3915,10500,7259],{"class":6114},[3915,10502,6091],{"class":6069},[3915,10504,10505,10507,10509,10511,10513,10516,10518,10521,10523,10526,10528,10530,10532],{"class":3917,"line":4038},[3915,10506,9394],{"class":6114},[3915,10508,4948],{"class":6069},[3915,10510,6335],{"class":6148},[3915,10512,6152],{"class":6069},[3915,10514,10515],{"class":6075},"\"Тип змінної ",[3915,10517,10256],{"class":6114},[3915,10519,10520],{"class":6075},"T: ",[3915,10522,10034],{"class":6114},[3915,10524,10525],{"class":10434},"\\n\\n",[3915,10527,6346],{"class":6075},[3915,10529,3789],{"class":6069},[3915,10531,7259],{"class":6114},[3915,10533,6091],{"class":6069},[3915,10535,10536],{"class":3917,"line":4043},[3915,10537,3964],{"emptyLinePlaceholder":3963},[3915,10539,10540],{"class":3917,"line":4048},[3915,10541,10542],{"class":7138},"    \u002F\u002F 2. Створення рядка через Sprintf (без виведення в консоль)\n",[3915,10544,10545,10548,10550,10552,10554,10556,10558,10561,10563,10565,10567,10570,10572,10574,10576,10578,10580,10582,10584,10586],{"class":3917,"line":4054},[3915,10546,10547],{"class":6114},"    serviceURL",[3915,10549,6190],{"class":6069},[3915,10551,9538],{"class":6114},[3915,10553,4948],{"class":6069},[3915,10555,9950],{"class":6148},[3915,10557,6152],{"class":6069},[3915,10559,10560],{"class":6075},"\"https:\u002F\u002F",[3915,10562,9855],{"class":6114},[3915,10564,4628],{"class":6075},[3915,10566,9851],{"class":6114},[3915,10568,10569],{"class":6075},"\u002Fhealth\"",[3915,10571,3789],{"class":6069},[3915,10573,7259],{"class":6114},[3915,10575,4948],{"class":6069},[3915,10577,10375],{"class":6114},[3915,10579,3789],{"class":6069},[3915,10581,7259],{"class":6114},[3915,10583,4948],{"class":6069},[3915,10585,10385],{"class":6114},[3915,10587,6091],{"class":6069},[3915,10589,10590,10592,10594,10596,10598,10601,10603,10606],{"class":3917,"line":4060},[3915,10591,9394],{"class":6114},[3915,10593,4948],{"class":6069},[3915,10595,6410],{"class":6148},[3915,10597,6152],{"class":6069},[3915,10599,10600],{"class":6075},"\"Згенерований URL:\"",[3915,10602,3789],{"class":6069},[3915,10604,10605],{"class":6114},"serviceURL",[3915,10607,6091],{"class":6069},[3915,10609,10610],{"class":3917,"line":4066},[3915,10611,3964],{"emptyLinePlaceholder":3963},[3915,10613,10614],{"class":3917,"line":4072},[3915,10615,10616],{"class":7138},"    \u002F\u002F 3. Форматування чисел та байтів\n",[3915,10618,10619,10622,10624],{"class":3917,"line":4078},[3915,10620,10621],{"class":6114},"    latency",[3915,10623,6190],{"class":6069},[3915,10625,10626],{"class":10390},"0.045678\n",[3915,10628,10629,10631,10633,10635,10637,10640,10642,10645,10647,10649,10651,10653,10655,10658,10660,10663,10665,10667,10669,10671],{"class":3917,"line":4084},[3915,10630,9394],{"class":6114},[3915,10632,4948],{"class":6069},[3915,10634,6335],{"class":6148},[3915,10636,6152],{"class":6069},[3915,10638,10639],{"class":6075},"\"Затримка мережі: ",[3915,10641,10147],{"class":6114},[3915,10643,10644],{"class":6075}," мс (Двійковий порт: ",[3915,10646,10103],{"class":6114},[3915,10648,8641],{"class":6075},[3915,10650,9608],{"class":10434},[3915,10652,6346],{"class":6075},[3915,10654,3789],{"class":6069},[3915,10656,10657],{"class":6114},"latency",[3915,10659,7722],{"class":6069},[3915,10661,10662],{"class":10390},"1000",[3915,10664,3789],{"class":6069},[3915,10666,7259],{"class":6114},[3915,10668,4948],{"class":6069},[3915,10670,10385],{"class":6114},[3915,10672,6091],{"class":6069},[3915,10674,10675],{"class":3917,"line":4090},[3915,10676,3964],{"emptyLinePlaceholder":3963},[3915,10678,10679],{"class":3917,"line":4096},[3915,10680,10681],{"class":7138},"    \u002F\u002F 4. Запис у потік помилок os.Stderr через Fprintf\n",[3915,10683,10684,10686,10688,10691,10693,10695,10697,10700,10702,10705,10707,10709],{"class":3917,"line":4101},[3915,10685,9394],{"class":6114},[3915,10687,4948],{"class":6069},[3915,10689,10690],{"class":6148},"Fprintf",[3915,10692,6152],{"class":6069},[3915,10694,7532],{"class":6114},[3915,10696,4948],{"class":6069},[3915,10698,10699],{"class":6114},"Stderr",[3915,10701,3789],{"class":6069},[3915,10703,10704],{"class":6075},"\"[LOG WARN] Тестове повідомлення у потік помилок",[3915,10706,9608],{"class":10434},[3915,10708,6346],{"class":6075},[3915,10710,6091],{"class":6069},[3915,10712,10713],{"class":3917,"line":4107},[3915,10714,3994],{"class":6069},[3798,10716],{},[3806,10718,10720],{"id":10719},"два-способи-запуску-програми-через-термінал","Два способи запуску програми через термінал",[3811,10722,10723,10724,10726],{},"Після того як файл ",[3786,10725,9354],{}," збережено, розробник має два основні сценарії роботи з ним:",[10728,10729,10730,10774],"tabs",{},[10731,10732,10734,10740,10758,10763,10769],"tabs-item",{"label":10733},"Спосіб 1: Швидкий запуск під час розробки (go run)",[3811,10735,10736,10737,10739],{},"Команда ",[3786,10738,9256],{}," компілює програму в тимчасову пам'ять і миттєво виконує її без збереження бінарного файлу на диску:",[3906,10741,10743],{"className":9097,"code":10742,"language":9099,"meta":3911,"style":3911},"# Знаходимося в папці з файлом main.go\ngo run main.go\n",[3786,10744,10745,10750],{"__ignoreMap":3911},[3915,10746,10747],{"class":3917,"line":3918},[3915,10748,10749],{"class":7138},"# Знаходимося в папці з файлом main.go\n",[3915,10751,10752,10754,10756],{"class":3917,"line":3924},[3915,10753,6044],{"class":6148},[3915,10755,9113],{"class":6075},[3915,10757,9116],{"class":6075},[3811,10759,10760],{},[3769,10761,10762],{},"Результат у терміналі:",[3906,10764,10767],{"className":10765,"code":10766,"language":8228,"meta":3911},[8226],"Привіт, клієнт-серверний світе на Go! 🚀\n",[3786,10768,10766],{"__ignoreMap":3911},[3811,10770,10771],{},[3815,10772,10773],{},"Ідеально підходить для швидкої перевірки гіпотез, навчання та локального налагодження.",[10731,10775,10777,10782,10828,10832,10837],{"label":10776},"Спосіб 2: Справжня компіляція у бінарник (go build)",[3811,10778,10736,10779,10781],{},[3786,10780,3788],{}," створює повноцінний автономний нативний виконуваний файл під вашу операційну систему:",[3906,10783,10785],{"className":9097,"code":10784,"language":9099,"meta":3911,"style":3911},"# Компілюємо виконуваний файл з ім'ям 'app'\ngo build -o app main.go\n\n# Запускаємо скомпільований бінарник (на macOS \u002F Linux):\n.\u002Fapp\n\n# (На Windows виконайте: app.exe)\n",[3786,10786,10787,10792,10805,10809,10814,10819,10823],{"__ignoreMap":3911},[3915,10788,10789],{"class":3917,"line":3918},[3915,10790,10791],{"class":7138},"# Компілюємо виконуваний файл з ім'ям 'app'\n",[3915,10793,10794,10796,10798,10800,10803],{"class":3917,"line":3924},[3915,10795,6044],{"class":6148},[3915,10797,9296],{"class":6075},[3915,10799,9299],{"class":6051},[3915,10801,10802],{"class":6075}," app",[3915,10804,9116],{"class":6075},[3915,10806,10807],{"class":3917,"line":3930},[3915,10808,3964],{"emptyLinePlaceholder":3963},[3915,10810,10811],{"class":3917,"line":3936},[3915,10812,10813],{"class":7138},"# Запускаємо скомпільований бінарник (на macOS \u002F Linux):\n",[3915,10815,10816],{"class":3917,"line":3942},[3915,10817,10818],{"class":6148},".\u002Fapp\n",[3915,10820,10821],{"class":3917,"line":3948},[3915,10822,3964],{"emptyLinePlaceholder":3963},[3915,10824,10825],{"class":3917,"line":3954},[3915,10826,10827],{"class":7138},"# (На Windows виконайте: app.exe)\n",[3811,10829,10830],{},[3769,10831,10762],{},[3906,10833,10835],{"className":10834,"code":10766,"language":8228,"meta":3911},[8226],[3786,10836,10766],{"__ignoreMap":3911},[3811,10838,10839],{},[3815,10840,10841,10842,10845],{},"Отриманий бінарний файл ",[3786,10843,10844],{},"app"," можна скопіювати на будь-який інший аналогічний комп'ютер і запустити без встановлення компілятора Go!",[3798,10847],{},[3806,10849,10851],{"id":10850},"покроковий-практичний-воркфлоу-створення-бекенду","Покроковий практичний воркфлоу створення бекенду",[3811,10853,10854],{},"Погляньмо, як виглядає реальний цикл створення нового проєкту з нуля у терміналі:",[10856,10857,10858,10862,10867,10902,10906,10909,10924,10928,10934,11126,11130,11133],"steps",{},[3806,10859,10861],{"id":10860},"крок-1-створення-каталогу-та-ініціалізація-модуля","Крок 1. Створення каталогу та ініціалізація модуля",[3811,10863,10864,10865,4628],{},"Створюємо папку проєкту та ініціалізуємо модуль за допомогою ",[3786,10866,8790],{},[3906,10868,10870],{"className":9097,"code":10869,"language":9099,"meta":3911,"style":3911},"mkdir -p my-server\u002Fcmd\u002Fserver\ncd my-server\ngo mod init github.com\u002Fstudent\u002Fmy-server\n",[3786,10871,10872,10883,10891],{"__ignoreMap":3911},[3915,10873,10874,10877,10880],{"class":3917,"line":3918},[3915,10875,10876],{"class":6148},"mkdir",[3915,10878,10879],{"class":6051}," -p",[3915,10881,10882],{"class":6075}," my-server\u002Fcmd\u002Fserver\n",[3915,10884,10885,10888],{"class":3917,"line":3924},[3915,10886,10887],{"class":6148},"cd",[3915,10889,10890],{"class":6075}," my-server\n",[3915,10892,10893,10895,10897,10899],{"class":3917,"line":3930},[3915,10894,6044],{"class":6148},[3915,10896,9137],{"class":6075},[3915,10898,9140],{"class":6075},[3915,10900,10901],{"class":6075}," github.com\u002Fstudent\u002Fmy-server\n",[3806,10903,10905],{"id":10904},"крок-2-підключення-сторонньої-бібліотеки","Крок 2. Підключення сторонньої бібліотеки",[3811,10907,10908],{},"Додаємо популярну бібліотеку для генерації унікальних UUID ідентифікаторів:",[3906,10910,10912],{"className":9097,"code":10911,"language":9099,"meta":3911,"style":3911},"go get github.com\u002Fgoogle\u002Fuuid\n",[3786,10913,10914],{"__ignoreMap":3911},[3915,10915,10916,10918,10921],{"class":3917,"line":3918},[3915,10917,6044],{"class":6148},[3915,10919,10920],{"class":6075}," get",[3915,10922,10923],{"class":6075}," github.com\u002Fgoogle\u002Fuuid\n",[3806,10925,10927],{"id":10926},"крок-3-написання-коду-застосунку","Крок 3. Написання коду застосунку",[3811,10929,10930,10931,10933],{},"Створюємо файл ",[3786,10932,7072],{}," з використанням завантаженої бібліотеки:",[3906,10935,10937],{"className":6041,"code":10936,"language":6044,"meta":3911,"style":3911},"package main\n\nimport (\n    \"fmt\"\n    \"net\u002Fhttp\"\n\n    \"github.com\u002Fgoogle\u002Fuuid\"\n)\n\nfunc main() {\n    http.HandleFunc(\"\u002Fapi\u002Fv1\u002Ftoken\", func(w http.ResponseWriter, r *http.Request) {\n        newID := uuid.New().String()\n        fmt.Fprintf(w, `{\"token\": \"%s\"}`, newID)\n    })\n\n    fmt.Println(\"Сервер слухає на порту :8080...\")\n    http.ListenAndServe(\":8080\", nil)\n}\n",[3786,10938,10939,10945,10949,10955,10959,10963,10967,10972,10976,10980,10988,11029,11050,11080,11085,11089,11104,11122],{"__ignoreMap":3911},[3915,10940,10941,10943],{"class":3917,"line":3918},[3915,10942,6052],{"class":6051},[3915,10944,6056],{"class":6055},[3915,10946,10947],{"class":3917,"line":3924},[3915,10948,3964],{"emptyLinePlaceholder":3963},[3915,10950,10951,10953],{"class":3917,"line":3930},[3915,10952,6066],{"class":6065},[3915,10954,6070],{"class":6069},[3915,10956,10957],{"class":3917,"line":3936},[3915,10958,10299],{"class":6075},[3915,10960,10961],{"class":3917,"line":3942},[3915,10962,6086],{"class":6075},[3915,10964,10965],{"class":3917,"line":3948},[3915,10966,3964],{"emptyLinePlaceholder":3963},[3915,10968,10969],{"class":3917,"line":3954},[3915,10970,10971],{"class":6075},"    \"github.com\u002Fgoogle\u002Fuuid\"\n",[3915,10973,10974],{"class":3917,"line":3960},[3915,10975,6091],{"class":6069},[3915,10977,10978],{"class":3917,"line":3967},[3915,10979,3964],{"emptyLinePlaceholder":3963},[3915,10981,10982,10984,10986],{"class":3917,"line":3973},[3915,10983,6145],{"class":6051},[3915,10985,6371],{"class":6148},[3915,10987,6374],{"class":6069},[3915,10989,10990,10992,10994,10996,10998,11001,11003,11005,11007,11009,11011,11013,11015,11017,11019,11021,11023,11025,11027],{"class":3917,"line":3979},[3915,10991,6379],{"class":6114},[3915,10993,4948],{"class":6069},[3915,10995,6384],{"class":6148},[3915,10997,6152],{"class":6069},[3915,10999,11000],{"class":6075},"\"\u002Fapi\u002Fv1\u002Ftoken\"",[3915,11002,3789],{"class":6069},[3915,11004,6145],{"class":6051},[3915,11006,6152],{"class":6069},[3915,11008,6155],{"class":6114},[3915,11010,6158],{"class":6055},[3915,11012,4948],{"class":6069},[3915,11014,6163],{"class":6055},[3915,11016,3789],{"class":6069},[3915,11018,6168],{"class":6114},[3915,11020,6171],{"class":6069},[3915,11022,6174],{"class":6055},[3915,11024,4948],{"class":6069},[3915,11026,6179],{"class":6055},[3915,11028,6182],{"class":6069},[3915,11030,11031,11034,11036,11039,11041,11044,11046,11048],{"class":3917,"line":3985},[3915,11032,11033],{"class":6114},"        newID",[3915,11035,6190],{"class":6069},[3915,11037,11038],{"class":6114},"uuid",[3915,11040,4948],{"class":6069},[3915,11042,11043],{"class":6148},"New",[3915,11045,6244],{"class":6069},[3915,11047,6605],{"class":6148},[3915,11049,7157],{"class":6069},[3915,11051,11052,11055,11057,11059,11061,11063,11065,11068,11070,11073,11075,11078],{"class":3917,"line":3991},[3915,11053,11054],{"class":6114},"        fmt",[3915,11056,4948],{"class":6069},[3915,11058,10690],{"class":6148},[3915,11060,6152],{"class":6069},[3915,11062,6155],{"class":6114},[3915,11064,3789],{"class":6069},[3915,11066,11067],{"class":6075},"`{\"token\": \"",[3915,11069,9855],{"class":6114},[3915,11071,11072],{"class":6075},"\"}`",[3915,11074,3789],{"class":6069},[3915,11076,11077],{"class":6114},"newID",[3915,11079,6091],{"class":6069},[3915,11081,11082],{"class":3917,"line":3997},[3915,11083,11084],{"class":6069},"    })\n",[3915,11086,11087],{"class":3917,"line":4002},[3915,11088,3964],{"emptyLinePlaceholder":3963},[3915,11090,11091,11093,11095,11097,11099,11102],{"class":3917,"line":4008},[3915,11092,9394],{"class":6114},[3915,11094,4948],{"class":6069},[3915,11096,6410],{"class":6148},[3915,11098,6152],{"class":6069},[3915,11100,11101],{"class":6075},"\"Сервер слухає на порту :8080...\"",[3915,11103,6091],{"class":6069},[3915,11105,11106,11108,11110,11112,11114,11116,11118,11120],{"class":3917,"line":4014},[3915,11107,6379],{"class":6114},[3915,11109,4948],{"class":6069},[3915,11111,6432],{"class":6148},[3915,11113,6152],{"class":6069},[3915,11115,6437],{"class":6075},[3915,11117,3789],{"class":6069},[3915,11119,6323],{"class":6051},[3915,11121,6091],{"class":6069},[3915,11123,11124],{"class":3917,"line":4020},[3915,11125,3994],{"class":6069},[3806,11127,11129],{"id":11128},"крок-4-перевірка-цілісності-та-запуск","Крок 4. Перевірка цілісності та запуск",[3811,11131,11132],{},"Форматуємо код, синхронізуємо залежності та запускаємо сервер:",[3906,11134,11136],{"className":9097,"code":11135,"language":9099,"meta":3911,"style":3911},"go fmt .\u002F...\ngo mod tidy\ngo run cmd\u002Fserver\u002Fmain.go\n",[3786,11137,11138,11148,11157],{"__ignoreMap":3911},[3915,11139,11140,11142,11145],{"class":3917,"line":3918},[3915,11141,6044],{"class":6148},[3915,11143,11144],{"class":6075}," fmt",[3915,11146,11147],{"class":6075}," .\u002F...\n",[3915,11149,11150,11152,11154],{"class":3917,"line":3924},[3915,11151,6044],{"class":6148},[3915,11153,9137],{"class":6075},[3915,11155,11156],{"class":6075}," tidy\n",[3915,11158,11159,11161,11163],{"class":3917,"line":3930},[3915,11160,6044],{"class":6148},[3915,11162,9113],{"class":6075},[3915,11164,11165],{"class":6075}," cmd\u002Fserver\u002Fmain.go\n",[3798,11167],{},[3806,11169,11171],{"id":11170},"кроскомпіляція-cross-compilation-як-створювати-бінарники-під-будь-яку-ос","Кроскомпіляція (Cross-Compilation): як створювати бінарники під будь-яку ОС",[3811,11173,11174,11175,3873],{},"У багатьох мовах програмування (наприклад, C++) збірка програми для іншої операційної системи (наприклад, збірка під Linux на комп'ютері з macOS) є вкрай складним завданням, що вимагає налаштування спеціальних віртуальних машин або складних наборів інструментів (",[3815,11176,11177],{},"Toolchains",[3811,11179,11180,11181,4628],{},"Компілятор Go має вбудовану підтримку генерації машинного коду під будь-яку операційну систему та процесор безпосередньо з коробки. Для цього достатньо встановити дві змінні середовища перед викликом команди ",[3786,11182,3788],{},[3746,11184,11185,11206],{},[3749,11186,11187,3861,11190,11193,11194,3789,11197,3789,11200,3789,11203,3873],{},[3786,11188,11189],{},"GOOS",[3815,11191,11192],{},"Target Operating System","): цільова ОС (",[3786,11195,11196],{},"linux",[3786,11198,11199],{},"darwin",[3786,11201,11202],{},"windows",[3786,11204,11205],{},"freebsd",[3749,11207,11208,3861,11211,11214,11215,11218,11219,11222,11223,11226],{},[3786,11209,11210],{},"GOARCH",[3815,11212,11213],{},"Target Architecture","): цільова архітектура процесора (",[3786,11216,11217],{},"amd64"," для x86_64, ",[3786,11220,11221],{},"arm64"," для Apple Silicon \u002F AWS Graviton, ",[3786,11224,11225],{},"arm"," для Raspberry Pi).",[10728,11228,11229,11284,11332,11370],{},[10731,11230,11232],{"label":11231},"Збірка під Linux (Сервери AWS \u002F VPS)",[3906,11233,11235],{"className":9097,"code":11234,"language":9099,"meta":3911,"style":3911},"# Збірка під 64-бітний Linux без динамічних C-бібліотек (чистий автономний бінарник)\nGOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags=\"-s -w\" -o bin\u002Fserver-linux-amd64 cmd\u002Fserver\u002Fmain.go\n",[3786,11236,11237,11242],{"__ignoreMap":3911},[3915,11238,11239],{"class":3917,"line":3918},[3915,11240,11241],{"class":7138},"# Збірка під 64-бітний Linux без динамічних C-бібліотек (чистий автономний бінарник)\n",[3915,11243,11244,11246,11249,11251,11254,11256,11258,11261,11263,11266,11269,11271,11274,11277,11279,11282],{"class":3917,"line":3924},[3915,11245,11189],{"class":6114},[3915,11247,11248],{"class":6069},"=",[3915,11250,11196],{"class":6075},[3915,11252,11253],{"class":6114}," GOARCH",[3915,11255,11248],{"class":6069},[3915,11257,11217],{"class":6075},[3915,11259,11260],{"class":6114}," CGO_ENABLED",[3915,11262,11248],{"class":6069},[3915,11264,11265],{"class":6075},"0",[3915,11267,11268],{"class":6148}," go",[3915,11270,9296],{"class":6075},[3915,11272,11273],{"class":6051}," -ldflags=",[3915,11275,11276],{"class":6075},"\"-s -w\"",[3915,11278,9299],{"class":6051},[3915,11280,11281],{"class":6075}," bin\u002Fserver-linux-amd64",[3915,11283,11165],{"class":6075},[10731,11285,11287],{"label":11286},"Збірка під Linux ARM64 (Graviton \u002F Raspberry Pi)",[3906,11288,11290],{"className":9097,"code":11289,"language":9099,"meta":3911,"style":3911},"# Збірка під 64-бітні ARM сервери\nGOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -ldflags=\"-s -w\" -o bin\u002Fserver-linux-arm64 cmd\u002Fserver\u002Fmain.go\n",[3786,11291,11292,11297],{"__ignoreMap":3911},[3915,11293,11294],{"class":3917,"line":3918},[3915,11295,11296],{"class":7138},"# Збірка під 64-бітні ARM сервери\n",[3915,11298,11299,11301,11303,11305,11307,11309,11311,11313,11315,11317,11319,11321,11323,11325,11327,11330],{"class":3917,"line":3924},[3915,11300,11189],{"class":6114},[3915,11302,11248],{"class":6069},[3915,11304,11196],{"class":6075},[3915,11306,11253],{"class":6114},[3915,11308,11248],{"class":6069},[3915,11310,11221],{"class":6075},[3915,11312,11260],{"class":6114},[3915,11314,11248],{"class":6069},[3915,11316,11265],{"class":6075},[3915,11318,11268],{"class":6148},[3915,11320,9296],{"class":6075},[3915,11322,11273],{"class":6051},[3915,11324,11276],{"class":6075},[3915,11326,9299],{"class":6051},[3915,11328,11329],{"class":6075}," bin\u002Fserver-linux-arm64",[3915,11331,11165],{"class":6075},[10731,11333,11335],{"label":11334},"Збірка під Windows (.exe)",[3906,11336,11338],{"className":9097,"code":11337,"language":9099,"meta":3911,"style":3911},"# Збірка виконуваного файлу для ОС Windows\nGOOS=windows GOARCH=amd64 go build -o bin\u002Fserver.exe cmd\u002Fserver\u002Fmain.go\n",[3786,11339,11340,11345],{"__ignoreMap":3911},[3915,11341,11342],{"class":3917,"line":3918},[3915,11343,11344],{"class":7138},"# Збірка виконуваного файлу для ОС Windows\n",[3915,11346,11347,11349,11351,11353,11355,11357,11359,11361,11363,11365,11368],{"class":3917,"line":3924},[3915,11348,11189],{"class":6114},[3915,11350,11248],{"class":6069},[3915,11352,11202],{"class":6075},[3915,11354,11253],{"class":6114},[3915,11356,11248],{"class":6069},[3915,11358,11217],{"class":6075},[3915,11360,11268],{"class":6148},[3915,11362,9296],{"class":6075},[3915,11364,9299],{"class":6051},[3915,11366,11367],{"class":6075}," bin\u002Fserver.exe",[3915,11369,11165],{"class":6075},[10731,11371,11373],{"label":11372},"Збірка під macOS (Apple Silicon)",[3906,11374,11376],{"className":9097,"code":11375,"language":9099,"meta":3911,"style":3911},"# Збірка для процесорів Apple M1\u002FM2\u002FM3\nGOOS=darwin GOARCH=arm64 go build -o bin\u002Fserver-macos-arm64 cmd\u002Fserver\u002Fmain.go\n",[3786,11377,11378,11383],{"__ignoreMap":3911},[3915,11379,11380],{"class":3917,"line":3918},[3915,11381,11382],{"class":7138},"# Збірка для процесорів Apple M1\u002FM2\u002FM3\n",[3915,11384,11385,11387,11389,11391,11393,11395,11397,11399,11401,11403,11406],{"class":3917,"line":3924},[3915,11386,11189],{"class":6114},[3915,11388,11248],{"class":6069},[3915,11390,11199],{"class":6075},[3915,11392,11253],{"class":6114},[3915,11394,11248],{"class":6069},[3915,11396,11221],{"class":6075},[3915,11398,11268],{"class":6148},[3915,11400,9296],{"class":6075},[3915,11402,9299],{"class":6051},[3915,11404,11405],{"class":6075}," bin\u002Fserver-macos-arm64",[3915,11407,11165],{"class":6075},[5415,11409,11410,11416,11417,11419,11420,11423,11424,11427],{},[3769,11411,11412,11413,9515],{},"Чому важливий прапорець ",[3786,11414,11415],{},"CGO_ENABLED=0","\nЗа замовчуванням Go може використовувати окремі системні C-бібліотеки операційної системи хоста (наприклад, системний резолвер DNS). Встановлення ",[3786,11418,11415],{}," вмикає 100% чисту Go-імплементацію всієї стандартної бібліотеки. Скомпільований таким чином бінарний файл взагалі не має зовнішніх динамічних залежностей (",[3786,11421,11422],{},"glibc","), важить 10–15 МБ і може бути упакований у порожній Docker-контейнер ",[3786,11425,11426],{},"FROM scratch",", що є вершиною безпеки та мінімалізму в мікросервісній архітектурі.",[3798,11429],{},[3801,11431,11433],{"id":11432},"передбачення-запитань-та-аналіз-підводних-каменів-а-що-якщо","Передбачення запитань та аналіз підводних каменів («А що, якщо...?»)",[11435,11436,11437,11454,11474],"accordion",{},[11438,11439,11442,11443,5765,11446,11449,11450,11453],"accordion-item",{"icon":11440,"label":11441},"i-lucide-help-circle","❓ Чому бінарний файл Go важить 10-15 МБ навіть для простої програми Hello World?","На відміну від програм на C\u002FC++, які покладаються на динамічно встановлені системні бібліотеки (",[3786,11444,11445],{},".so",[3786,11447,11448],{},".dll","), Go створює ",[3769,11451,11452],{},"повністю статично скомпільований бінарник",". Усередину кожного виконуваного файлу вшивається весь Runtime мови Go: планувальник горутин GMP, збирач сміття, система рефлексії та мережевий полінг операційної системи. Завдяки цьому скомпільовану програму можна запустити на будь-якому цільовому сервері без встановлення будь-яких драйверів чи середовищ виконання.",[11438,11455,11457,11458,11461,11462,11465,11466,11469,11470,11473],{"icon":11440,"label":11456},"❓ Що станеться, якщо сервер і клієнт використовують різні формати представлення чисел (Endianness)?","Архітектури процесорів x86\u002FARM використовують порядок байтів ",[3815,11459,11460],{},"Little-Endian"," (молодший байт за меншою адресою), тоді як мережеві стандарти вимагають ",[3815,11463,11464],{},"Big-Endian"," (мережевий порядок байтів, ",[3815,11467,11468],{},"Network Byte Order","). Якщо здійснюється низькорівнева передача бінарних чисел через сокети, дані мають конвертуватися за допомогою пакетів ",[3786,11471,11472],{},"encoding\u002Fbinary"," у Go. При використанні текстових форматів (JSON, XML) ця проблема зникає, оскільки текст кодується в стандартизовану послідовність байтів UTF-8.",[11438,11475,11477,11478,11481,11482,11485,11486,3861,11489,3873],{"icon":11440,"label":11476},"❓ Чому в Go немає ключового слова class та наслідування?","Творці Go (Роб Пайк, Кен Томпсон, Роберт Грізмер) свідомо відмовилися від класичного ООП-наслідування через проблему «крихких базових класів» (",[3815,11479,11480],{},"fragile base class",") та надмірної складності ієрархій у великих системах. Натомість Go використовує два набагато гнучкіших механізми: ",[3769,11483,11484],{},"композицію"," (вбудовування структур) та ",[3769,11487,11488],{},"качину типізацію інтерфейсів",[3815,11490,11491],{},"duck typing",[3798,11493],{},[3801,11495,11497],{"id":11496},"підсумки-лекції-та-перевірка-знань","Підсумки лекції та перевірка знань",[3738,11499,11500,11518],{},[3741,11501,11504],{"icon":11502,"title":11503},"i-lucide-check-circle-2","📌 Ключові висновки",[3746,11505,11506,11509,11512,11515],{},[3749,11507,11508],{},"Клієнт-серверна архітектура вирішує проблему синхронізації даних, масштабування та безпеки шляхом чіткого розмежування зон відповідальності.",[3749,11510,11511],{},"Сучасний бекенд повинен проєктуватися з урахуванням гетерогенності клієнтів (Desktop, Mobile, Web, CLI).",[3749,11513,11514],{},"Стек TCP\u002FIP забезпечує інкапсуляцію прикладних даних у транспортні сегменти та мережеві пакети.",[3749,11516,11517],{},"Мова Go поєднує високу швидкість нативного коду, мілісекундний старт та надлегку модель конкурентності на базі горутин (2 КБ стеку).",[3741,11519,11522,11523,11526,11527,11530,11531,11534,11535,11541],{"icon":11520,"title":11521},"i-lucide-arrow-right-circle","🚀 Наступні кроки","У наступній лекції ми зануримося у ",[3769,11524,11525],{},"систему типів та модель пам'яті мови Go",": дослідимо роботу покажчиків, внутрішню структуру зрізів (",[3815,11528,11529],{},"slices",") та карт (",[3815,11532,11533],{},"maps","), а також розберемо механізм ",[3769,11536,11537,11538,8641],{},"аналізу втечі (",[3815,11539,11540],{},"Escape Analysis"," між стеком і купою.",[3798,11543],{},[3806,11545,11547],{"id":11546},"запитання-для-самоконтролю","Запитання для самоконтролю",[11435,11549,11550,11554,11586,11590],{},[11438,11551,11553],{"icon":11440,"label":11552},"1. У чому полягає принципова відмінність між 2-Tier та 3-Tier архітектурами?","У 2-Tier моделі клієнт напряму підключається до бази даних, що створює ризики безпеки та перевантаження пулу з'єднань БД. У 3-Tier системі між клієнтом і БД розміщується сервер застосунків, який інкапсулює бізнес-логіку та централізовано керує зверненнями до сховища.",[11438,11555,11557],{"icon":11440,"label":11556},"2. Які параметри входять до складу 5-Tuple, що ідентифікує мережевий сокет?",[3831,11558,11559,11562,11568,11574,11580],{},[3749,11560,11561],{},"Протокол зв'язку (наприклад, TCP).",[3749,11563,11564,11565,3873],{},"IP-адреса джерела (",[3815,11566,11567],{},"Source IP",[3749,11569,11570,11571,3873],{},"Порт джерела (",[3815,11572,11573],{},"Source Port",[3749,11575,11576,11577,3873],{},"IP-адреса призначення (",[3815,11578,11579],{},"Destination IP",[3749,11581,11582,11583,3873],{},"Порт призначення (",[3815,11584,11585],{},"Destination Port",[11438,11587,11589],{"icon":11440,"label":11588},"3. Чому горутина в Go потребує в сотні разів менше пам'яті, ніж потік у Java\u002FC#?","Потік ОС у Java\u002FC# резервує фіксований стек розміром 1–2 МБ. Горутина у Go керується власним планувальником GMP у просторі користувача і починає роботу зі динамічним стеком розміром лише 2 КБ.",[11438,11591,8437,11593,11595],{"icon":11440,"label":11592},"4. За що відповідає файл go.sum і чому його обов'язково зберігати в Git?",[3786,11594,8235],{}," фіксує криптографічні контрольні суми всіх завантажених залежностей, захищаючи кодову базу проєкту від атак на ланцюг постачання (підміни коду в сторонніх модулях).",[11597,11598,11599],"style",{},"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 .su1O8, html code.shiki .su1O8{--shiki-light:#0000FF;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .sN1BT, html code.shiki .sN1BT{--shiki-light:#267F99;--shiki-default:#4EC9B0;--shiki-dark:#4EC9B0}html pre.shiki code .s8xlr, html code.shiki .s8xlr{--shiki-light:#AF00DB;--shiki-default:#C586C0;--shiki-dark:#C586C0}html pre.shiki code .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .sbdoH, html code.shiki .sbdoH{--shiki-light:#A31515;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .siwwj, html code.shiki .siwwj{--shiki-light:#001080;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .s8Opu, html code.shiki .s8Opu{--shiki-light:#795E26;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .spJ8K, html code.shiki .spJ8K{--shiki-light:#008000;--shiki-default:#6A9955;--shiki-dark:#6A9955}html pre.shiki code .sJj4R, html code.shiki .sJj4R{--shiki-light:#098658;--shiki-default:#B5CEA8;--shiki-dark:#B5CEA8}html pre.shiki code .sjcCO, html code.shiki .sjcCO{--shiki-light:#EE0000;--shiki-default:#D7BA7D;--shiki-dark:#D7BA7D}",{"title":3911,"searchDepth":3924,"depth":3924,"links":11601},[11602,11606,11610,11619,11623,11642,11643],{"id":3803,"depth":3924,"text":3804,"children":11603},[11604,11605],{"id":3808,"depth":3930,"text":3809},{"id":3885,"depth":3930,"text":3886},{"id":4251,"depth":3924,"text":4252,"children":11607},[11608,11609],{"id":4429,"depth":3930,"text":4430},{"id":4494,"depth":3930,"text":4495},{"id":4605,"depth":3924,"text":4606,"children":11611},[11612,11613,11614,11615,11616,11617,11618],{"id":4612,"depth":3930,"text":4613},{"id":4752,"depth":3930,"text":4753},{"id":4956,"depth":3930,"text":4957},{"id":4999,"depth":3930,"text":5000},{"id":5302,"depth":3930,"text":5303},{"id":5437,"depth":3930,"text":5438},{"id":5719,"depth":3930,"text":5720},{"id":5826,"depth":3924,"text":5827,"children":11620},[11621,11622],{"id":5899,"depth":3930,"text":5900},{"id":6031,"depth":3930,"text":6032},{"id":6733,"depth":3924,"text":6734,"children":11624},[11625,11626,11627,11628,11630,11631,11632,11633,11635,11636,11637,11638,11639,11640,11641],{"id":6750,"depth":3930,"text":6751},{"id":6782,"depth":3930,"text":6783},{"id":7061,"depth":3930,"text":7062},{"id":8340,"depth":3930,"text":11629},"Анатомія конфігураційних файлів: go.mod та go.sum",{"id":8477,"depth":3930,"text":8478},{"id":8751,"depth":3930,"text":8752},{"id":9344,"depth":3930,"text":9345},{"id":9614,"depth":3930,"text":11634},"Глибоке занурення: Директива import та пакет fmt (Довідник I\u002FO)",{"id":10719,"depth":3930,"text":10720},{"id":10850,"depth":3930,"text":10851},{"id":10860,"depth":3930,"text":10861},{"id":10904,"depth":3930,"text":10905},{"id":10926,"depth":3930,"text":10927},{"id":11128,"depth":3930,"text":11129},{"id":11170,"depth":3930,"text":11171},{"id":11432,"depth":3924,"text":11433},{"id":11496,"depth":3924,"text":11497,"children":11644},[11645],{"id":11546,"depth":3930,"text":11547},"Фундаментальні засади клієнт-серверної парадигми, багаторівневі моделі N-Tier, гетерогенність клієнтських платформ, мережева модель OSI\u002FTCP-IP та інженерний аналіз платформи Go для побудови високонавантажених сервісів.","md",null,{},{"title":3518,"description":11646},"OUfp_9GEFHnrco26dM8tkAK-1scDaoJC_a_6vUgbWK8",[11653,11655],{"title":3509,"path":3510,"stem":3511,"description":11654,"children":-1},"Чому стандартних списків Python недостатньо для Data Science, як NumPy прискорює обчислення у 100 разів, що таке Series і DataFrame у pandas, як читати CSV і Excel та які методи потрібні для першого знайомства з датасетом",{"title":3522,"path":3523,"stem":3524,"description":11656,"children":-1},"Повний академічний курс системи типів Go: змінні, тіньове перекриття, числові типи та wrap-around, константи iota, форматування fmt, операції та складені присвоєння, керуючі конструкції, функції, замикання, покажчики, make vs new, стек\u002Fкупа та Escape Analysis, структури з вирівнюванням, композиція, анонімні структури, методи на будь-яких типах, зрізи з growslice та двовимірні зрізи, мапи hmap\u002Fbmap, помилки error та defer.",1788069884414]