diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 83c5e18..c6d12ea 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -25,16 +25,55 @@ export default defineConfig({ function sidebarASPNetCore(): DefaultTheme.SidebarItem[] { return [ { - text: 'ASP.NET Core', link: 'index', + text: 'ASP.NET Core', items: [ { - text: 'Basics of CSharp', - collapsed: false, + text: '2024 Bonus Track', + collapsed: true, + base: '/paths/aspnet-core/000-2024-bonus-track/', + items: [ + { text: 'C# Fundamentals', link: '100-2024-bonus-track-01' }, + { text: 'Test Driven Development (TDD)', link: '100-2024-bonus-track-02' }, + { text: 'เริ่มต้นอีกครั้งกับ .NET 6 Web API', link: '100-2024-bonus-track-03' }, + { text: 'Clean Architecture', link: '100-2024-bonus-track-04' }, + { text: 'Beginner Playlist', link: '100-2024-bonus-track-05' }, + { text: 'Awesome .NET', link: '100-2024-bonus-track-06' }, + ] + }, + { + text: 'เรื่องพื้นฐานที่ควรรู้เกี่ยวกับ C#', + collapsed: true, base: '/paths/aspnet-core/100-basics-of-csharp/', items: [ - { text: 'CSharp', link: '100-csharp' }, - { text: 'Dotnet', link: '101-dotnet' }, - { text: 'Dotnet CLI', link: '102-dotnet-cli' }, + { text: 'ภาษา C# คืออะไร', link: '100-csharp' }, + { text: 'Dotnet คืออะไร', link: '101-dotnet' }, + { text: 'Dotnet CLI คืออะไร', link: '102-dotnet-cli' }, + ] + }, + { + text: 'ความรู้เบื้องต้นที่สำคัญที่ช่วยในการศึกษา C# ได้ดียิ่งขึ้น', + collapsed: true, + base: '/paths/aspnet-core/101-general-development-skills/', + items: [ + { text: 'ความรู้เบื้องต้นที่สำคัญที่ช่วยในการศึกษา C# ได้ดียิ่งขึ้น', link: '000-index' }, + { text: 'Git', link: '100-git' }, + { text: 'Azure Devops Services', link: '101-azure-devops-services' }, + { text: 'Repo Hosting Services', link: '102-vcs-hosting-services' }, + { text: 'HTTPS', link: '103-http-https' }, + { text: 'Data Structures', link: '104-datastructures-and-algorithms' }, + ] + }, + { + text: 'Database fundamentals', + collapsed: true, + base: '/paths/aspnet-core/102-database-fundamentals/', + items: [ + { text: 'Database fundamentals', link: '000-index' }, + { text: 'Database design basics', link: '100-database-design-basics' }, + { text: 'Sql basics', link: '101-sql-basics' }, + { text: 'Stored Procedures', link: '102-stored-procedures' }, + { text: 'Constraints', link: '103-constraints' }, + { text: 'Triggers', link: '104-triggers' }, ] }, ] @@ -45,7 +84,7 @@ function sidebarASPNetCore(): DefaultTheme.SidebarItem[] { function sidebarDevOps(): DefaultTheme.SidebarItem[] { return [ { - text: 'DevOps', link: 'index', + text: 'DevOps', items: [ { text: 'Language', @@ -66,7 +105,7 @@ function sidebarDevOps(): DefaultTheme.SidebarItem[] { function sidebarJava(): DefaultTheme.SidebarItem[] { return [ { - text: 'Java', link: 'index', + text: 'Java', items: [ { text: 'Java fundamentals', diff --git a/README.md b/README.md index 6b773bd..9339d88 100644 --- a/README.md +++ b/README.md @@ -1 +1,34 @@ -# tpa-path \ No newline at end of file +# tpa-path + +## Installation +### Prerequisites +- [Node.js](https://nodejs.org/) version 18 or higher. +- Terminal for accessing VitePress via its command line interface (CLI). +- Text Editor with [Markdown](https://en.wikipedia.org/wiki/Markdown) syntax support. + - [VSCode](https://code.visualstudio.com/) is recommended, along with the [official Vue extension](https://marketplace.visualstudio.com/items?itemName=Vue.volar). + +VitePress can be used on its own, or be installed into an existing project. In both cases, you can install it with: + +```bash +$ npm add -D vitepress +``` + +### Up and Running +The tool should have also injected the following npm scripts to your `package.json` if you allowed it to do so during the setup process: + +```json +{ + ... + "scripts": { + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" + }, + ... +} +``` +The `docs:dev` script will start a local dev server with instant hot updates. Run it with the following command: + +```bash +$ npm run docs:dev +``` \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c757336 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1675 @@ +{ + "name": "tpa-path", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "vitepress": "^1.2.3" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", + "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", + "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", + "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", + "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", + "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", + "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", + "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", + "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.24.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", + "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", + "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", + "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", + "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", + "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.6.0", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.0", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.0.tgz", + "integrity": "sha512-BZcr6FCmPfP6TXaekvujZcnkFmJHZ/Yglu97r/9VjzVndQA56/F4WjUKtJRQUnK59Wi7p/UTAOekMfCJv7jnYg==", + "dev": true + }, + "node_modules/@shikijs/transformers": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.10.0.tgz", + "integrity": "sha512-5Eu/kuJu7/CzAjFlTJkyyPoLTLSVQZ31Ps81cjIeR/3PDJ2RUuX1/R8d0qFziBKToym1LXbNiXoJQq0mg5+Cwg==", + "dev": true, + "dependencies": { + "shiki": "1.10.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", + "dev": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", + "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", + "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.31", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", + "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.4.31", + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", + "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.31", + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.10", + "postcss": "^8.4.38", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", + "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.31", + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.3.5.tgz", + "integrity": "sha512-BSdBBu5hOIv+gBJC9jzYMh5bC27FQwjWLSb8fVAniqlL9gvsqvK27xTgczMf+hgctlszMYQnRm3bpY/j8vhPqw==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.3.5" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.3.5.tgz", + "integrity": "sha512-wwfi10gJ1HMtjzcd8aIOnzBHlIRqsYDgcDyrKvkeyc0Gbcoe7UrkXRVHZUOtcxxoplHA0PwpT6wFg0uUCmi8Ww==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.3.5", + "birpc": "^0.2.17", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.1" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.3.5.tgz", + "integrity": "sha512-Rqii3VazmWTi67a86rYopi61n5Ved05EybJCwyrfoO9Ok3MaS/4yRFl706ouoISMlyrASJFEzM0/AiDA6w4f9A==", + "dev": true, + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", + "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", + "dev": true, + "dependencies": { + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", + "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.4.31", + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", + "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.4.31", + "@vue/runtime-core": "3.4.31", + "@vue/shared": "3.4.31", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", + "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31" + }, + "peerDependencies": { + "vue": "3.4.31" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", + "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.0.tgz", + "integrity": "sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.0", + "@vueuse/shared": "10.11.0", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.11.0.tgz", + "integrity": "sha512-Pp6MtWEIr+NDOccWd8j59Kpjy5YDXogXI61Kb1JxvSfVBO8NzFQkmrKmSZz47i+ZqHnIzxaT38L358yDHTncZg==", + "dev": true, + "dependencies": { + "@vueuse/core": "10.11.0", + "@vueuse/shared": "10.11.0", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^4", + "drauu": "^0.3", + "focus-trap": "^7", + "fuse.js": "^6", + "idb-keyval": "^6", + "jwt-decode": "^3", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^6" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.0.tgz", + "integrity": "sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.0.tgz", + "integrity": "sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", + "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-account": "4.24.0", + "@algolia/client-analytics": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-personalization": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/recommend": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/birpc": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz", + "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/minisearch": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.22.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.0.tgz", + "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.14.0.tgz", + "integrity": "sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==", + "dev": true, + "peer": true + }, + "node_modules/shiki": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.0.tgz", + "integrity": "sha512-YD2sXQ+TMD/F9BimV9Jn0wj35pqOvywvOG/3PB6hGHyGKlM7TJ9tyJ02jOb2kF8F0HfJwKNYrh3sW7jEcuRlXA==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superjson": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "dev": true, + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/vite": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.2.3.tgz", + "integrity": "sha512-GvEsrEeNLiDE1+fuwDAYJCYLNZDAna+EtnXlPajhv/MYeTjbNK6Bvyg6NoTdO1sbwuQJ0vuJR99bOlH53bo6lg==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.6.2", + "@shikijs/transformers": "^1.6.2", + "@types/markdown-it": "^14.1.1", + "@vitejs/plugin-vue": "^5.0.5", + "@vue/devtools-api": "^7.2.1", + "@vue/shared": "^3.4.27", + "@vueuse/core": "^10.10.0", + "@vueuse/integrations": "^10.10.0", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^6.3.0", + "shiki": "^1.6.2", + "vite": "^5.2.12", + "vue": "^3.4.27" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", + "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-sfc": "3.4.31", + "@vue/runtime-dom": "3.4.31", + "@vue/server-renderer": "3.4.31", + "@vue/shared": "3.4.31" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json index 2559f17..310eec5 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,4 @@ { - "dependencies": {}, "devDependencies": { "vitepress": "^1.2.3" }, @@ -8,4 +7,4 @@ "docs:build": "vitepress build", "docs:preview": "vitepress preview" } -} \ No newline at end of file +} diff --git a/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-01.md b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-01.md new file mode 100644 index 0000000..585c602 --- /dev/null +++ b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-01.md @@ -0,0 +1,10 @@ +# ปี 2024 แล้วมีอะไรเจ๋งๆ ป้ายยาเราโหน่ยยยย + +## C# Fundamentals +- [#1: Flow controls & Methods](https://www.youtube.com/watch?v=s7R6BcFi8Y8&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=5) +- [#2: Classes & Objects](https://www.youtube.com/watch?v=gRjeaP1FDRc&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=6) +- [#3: Object Oriented Programming](https://www.youtube.com/watch?v=tuIRXrQOgzc&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=7) +- [#4: Utilities & Tools Part1](https://www.youtube.com/watch?v=xo8a6qVUFlI&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=8) +- [#5: Utilites & Tools](https://www.youtube.com/watch?v=7LuHvZjuWJw&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=9) +- [#6: Utilities & Tools Database Design](https://www.youtube.com/watch?v=fxQpY-1d2sw&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=10) +- [#7: DB DesignNormalization Entity Framework](https://www.youtube.com/watch?v=ANcaP6JWd1Y&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=11) \ No newline at end of file diff --git a/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-02.md b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-02.md new file mode 100644 index 0000000..4069db0 --- /dev/null +++ b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-02.md @@ -0,0 +1,7 @@ +# ปี 2024 แล้วมีอะไรเจ๋งๆ ป้ายยาเราโหน่ยยยย + +## Test Driven Development (TDD) +- [#1: The World of Software Testing](https://www.youtube.com/watch?v=zpu9U3x8FYk&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=14) +- [#2: Code Refactoring](https://www.youtube.com/watch?v=Csxt45MJObE&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=15) +- [#3: Isolated Test Environment](https://www.youtube.com/watch?v=ho32DQwunu0&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=16) +- [#4: High Level Testing](https://www.youtube.com/watch?v=DJZsUM5Ev4U&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=17) \ No newline at end of file diff --git a/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-03.md b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-03.md new file mode 100644 index 0000000..0eddfee --- /dev/null +++ b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-03.md @@ -0,0 +1,4 @@ +# ปี 2024 แล้วมีอะไรเจ๋งๆ ป้ายยาเราโหน่ยยยย + +## เริ่มต้นอีกครั้งกับ .NET 6 Web API +- [เริ่มต้นอีกครั้งกับ .NET 6 Web API](https://medium.com/t-t-software-solution/%E0%B9%80%E0%B8%A3%E0%B8%B4%E0%B9%88%E0%B8%A1%E0%B8%95%E0%B9%89%E0%B8%99%E0%B8%AD%E0%B8%B5%E0%B8%81%E0%B8%84%E0%B8%A3%E0%B8%B1%E0%B9%89%E0%B8%87%E0%B8%81%E0%B8%B1%E0%B8%9A-net-6-web-api-7bd33ce2c28f) \ No newline at end of file diff --git a/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-04.md b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-04.md new file mode 100644 index 0000000..6a28031 --- /dev/null +++ b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-04.md @@ -0,0 +1,21 @@ +# ปี 2024 แล้วมีอะไรเจ๋งๆ ป้ายยาเราโหน่ยยยย + +## Clean Architecture (ภาษาไทย) +### Videos +- [Clean architecture from scratch with .NET7 - Part 1](https://www.youtube.com/watch?v=s5CqkV4VOwo&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=12) +- [Clean architecture from scratch with .NET7 - Part 2](https://www.youtube.com/watch?v=CTfW86Nz5OY&list=PLbWE6xQS47vpOcP_7BfSrfruG16ECj1cU&index=13) + +### บทความที่เกี่ยวข้องครับ + +- [#0: เกริ่นนำ](https://medium.com/@ponggun/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-0-%E0%B9%80%E0%B8%81%E0%B8%A3%E0%B8%B4%E0%B9%88%E0%B8%99%E0%B8%99%E0%B8%B3-a61b277352f9) +- [#1: ติดตั้งโปรแกรม](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-1-%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B8%B1%E0%B9%89%E0%B8%87%E0%B9%82%E0%B8%9B%E0%B8%A3%E0%B9%81%E0%B8%81%E0%B8%A3%E0%B8%A1-1ecd8d3bfb66) +- [#2: รวม Cheat Sheet](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-2-%E0%B8%A3%E0%B8%A7%E0%B8%A1-cheat-sheet-cb696ffb3eba) +- [#3: Empty Solution in GitHub](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-3-empty-solution-in-github-a6313b12d741) +- [#4: พัฒนาโครงสร้างของ Source Code](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-4-%E0%B8%9E%E0%B8%B1%E0%B8%92%E0%B8%99%E0%B8%B2%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%87%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B8%82%E0%B8%AD%E0%B8%87-source-code-8269f8dfb6f6) +- [#5: VS Code Debugging](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-5-vs-code-debugging-ff10c3abda17) +- [#6: Configuration](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-6-configuration-6ca0086971bc) +- [#7: Dependency Injection & Service Lifetime](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-7-dependency-injection-service-lifetime-c04f83324c8b) +- [#8: Domain Project](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-8-domain-project-11563b7420b5) +- [#9: Core Project](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-9-core-project-36c41b429acb) +- [#10: Infra Project](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-10-infra-project-entity-framework-315abe158f5f) +- [#11: API Project](https://ponggun.medium.com/%E0%B8%9A%E0%B8%97%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B8%E0%B8%94-net-6-%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%97%E0%B8%B3-11-api-project-72bad7acb16b) \ No newline at end of file diff --git a/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-05.md b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-05.md new file mode 100644 index 0000000..e2a0de5 --- /dev/null +++ b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-05.md @@ -0,0 +1,18 @@ +# ปี 2024 แล้วมีอะไรเจ๋งๆ ป้ายยาเราโหน่ยยยย + +## แนะนำ Beginner Playlist (ภาษาอังกฤษ) +สำหรับท่านใดที่สนใจพัฒนาโปรแกรมด้วย .NET Technology จาก Microsoft นะครับ เรียนกันช่วงปิดปีใหม่สะดวกเลย เนื้อหาครอบคลุมทั้ง AI, IoT, Cloud, Desktop App, Mobile App, Web App + +- [#1: ทำความรู้จักกับ .NET กันก่อน](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oUwBEC2bnwPtHqbU8Vmh_tj) +- [#2: เลือก Tool VS Code](https://www.youtube.com/watch?v=tFCZw-wZVtg&list=PLdo4fOcmZ0oWUrumb503vY3v6O3u3P4rW) +- [#3: หรือเลือก Tool VS Studio](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oUkJJEM_FagLkvwPQHsQ5xL) +- [#4: หัดเขียนโปรแกรมด้วยภาษา C# ที่](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oULFjxrOagaERVAMbmG20Xe) +- [#5: ศึกษา NuGet Package](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oV79rO05Nb8W9dbOn6jRQoo) +- [#6: ศึกษา .NET MAUI เพื่อพัฒนา Desktop App](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oUBAdL2NwBpDs32zwGqb9DY) +- [#7: Generative AI with .NET for Beginners](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oW_k4_eDTPWDLUVWz7A9y0M) +- [#8: .NET IoT for Beginners](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oWG4G6NxHV2yGEb42vQaFNc) +- [#9: Entity Framework Core for Beginners](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oXCPdC3fTFA3Z79-eVH3K-s) +- [#10: Web APIs for Beginners](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oVjOKgzsWqdFVvzGL2_d72v) +- [#11: ASP.NET Core for Beginners](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oW8nviYduHq7bmKode-p8Wy) +- [#12: .NET on Azure for Beginners](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oVSBX3Lde8owu6dSgZLIXfu) +- [#13: Upgrade Applications with .NET Modernization for Beginners](https://www.youtube.com/playlist?list=PLdo4fOcmZ0oWhjOqruRP3xQWOreCBjeyy) \ No newline at end of file diff --git a/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-06.md b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-06.md new file mode 100644 index 0000000..9fed831 --- /dev/null +++ b/paths/aspnet-core/000-2024-bonus-track/100-2024-bonus-track-06.md @@ -0,0 +1,8 @@ +# ปี 2024 แล้วมีอะไรเจ๋งๆ ป้ายยาเราโหน่ยยยย + +## Awesome .NET (ภาษาอังกฤษ) + +- [C# Tutorial for Beginners 2024- Teddy Smith](https://www.youtube.com/playlist?list=PL82C6-O4XrHcblXkHA4dLcnb_ipVkKHch) +- [ASP.NET Web API .NET 8 Tutorial 2024 — Teddy Smith](https://youtube.com/playlist?list=PL82C6-O4XrHfrGOCPmKmwTO7M0avXyQKc&si=dNR0-Es7r0RE5GC6) +- [ASP.NET Core Identity JWT 2024](https://youtube.com/playlist?list=PL82C6-O4XrHcjpGzpxAVqumv2PaYGIJfz&si=2UneRqUoJaWAhg3e) +- [React Typescript + .NET Core Finance Project](https://youtube.com/playlist?list=PL82C6-O4XrHcNJd4ejg8pX5fZaIDZmXyn&si=DXLMWAgrhPDRfZ_M) \ No newline at end of file diff --git a/paths/aspnet-core/100-basics-of-csharp/100-csharp.md b/paths/aspnet-core/100-basics-of-csharp/100-csharp.md index 0379532..bc31ed1 100644 --- a/paths/aspnet-core/100-basics-of-csharp/100-csharp.md +++ b/paths/aspnet-core/100-basics-of-csharp/100-csharp.md @@ -1,6 +1,10 @@ # C# -C# เป็นภาษาโปรแกรมที่ทันสมัยซึ่งถูกพัฒนาโดยไมโครซอฟท์ โดยมีจุดมุ่งหมายในการนำเสนอรูปแบบการเขียนโค้ดของ C++ ให้มีความกระชับและง่ายขึ้น ภาษานี้มีความคล้ายคลึงกับ Java ตรงที่ทั้งสองภาษาเป็นภาษาที่เข้มงวด มีความแข็งแกร่ง และแสดงลักษณะอย่างชัดเจน ทั้งคู่ใช้คลาสที่สร้างไว้ล่วงหน้าของระบบเพื่อทำบางฟีเจอร์ เช่น การพิมพ์ผลลัพธ์ออกทางหน้าจอ เป็นต้น นอกจากนี้ C# เช่นเดียวกับ Java ยังมีการจัดการหน่วยความจำอัตโนมัติ (garbage collection) ซึ่งช่วยลดภาระการเขียนโค้ดระดับ lower-level จากโปรแกรมเมอร์ลง +C# (ออกเสียงว่า "ซี-ชาร์ป") เป็นภาษาโปรแกรมมิ่งที่มีวัตถุประสงค์ทั่วไป และเป็นภาษาโปรแกรมมิ่งที่เน้นการเขียนโปรแกรมเชิงวัตถุ (object-oriented) ซึ่งได้รับการพัฒนาโดยไมโครซอฟท์ มันเป็นส่วนหนึ่งของครอบครัวภาษา .NET และถูกใช้ในการสร้างแอปพลิเคชั่นหลากหลายประเภท ตั้งแต่แอปพลิเคชั่นเว็บและมือถือไปจนถึงเกมและบริการบนคลาวด์ + +C# เป็นภาษาที่มีการกำหนดประเภทข้อมูลอย่างชัดเจน (statically-typed) ซึ่งหมายความว่าประเภทของตัวแปรจะต้องถูกระบุขณะที่มันถูกประกาศ และประเภทของค่าไม่สามารถเปลี่ยนแปลงได้หลังจากที่มันถูกกำหนด นอกจากนี้ C# ยังรองรับการเขียนโปรแกรมเชิงวัตถุ ซึ่งหมายความว่ามันมีคุณสมบัติต่างๆ เช่น การห่อหุ้ม (encapsulation), การสืบทอด (inheritance), และการพ้องรูป (polymorphism) + +C# เป็นภาษายอดนิยมสำหรับการสร้างแอปพลิเคชั่น .NET และถูกใช้โดยบริษัทและองค์กรขนาดใหญ่หลายแห่ง รวมถึงไมโครซอฟท์, เดลล์, และไอบีเอ็ม เป็นภาษาที่มีความหลากหลายและสามารถใช้เพื่อจุดประสงค์ที่กว้างขวาง ทำให้เหมาะสมกับการสร้างระบบซอฟต์แวร์ที่สามารถขยายได้และบำรุงรักษาได้ง่าย ศึกษารายละเอียดเพิ่มเติมได้ที่: @@ -9,7 +13,8 @@ C# เป็นภาษาโปรแกรมที่ทันสมัย - [OOP](https://www.saladpuk.com/beginner-1/oop) ### English -- [C# official website?](https://learn.microsoft.com/en-us/dotnet/csharp//) -- [The Beginners Guide to C#](https://www.w3schools.com/CS/index.php) -- [C# Tutorial](https://www.w3schools.com/cs/index.php) -- [C# Full Course - Learn C# 10 and .NET 6 in 7 hours](https://www.youtube.com/watch?v=q_F4PyW8GTg) \ No newline at end of file +- [C Sharp Basics](https://www.codecademy.com/catalog/language/c-sharp) +- [Introduction to C#](https://learn.microsoft.com/en-us/dotnet/csharp/tour-of-csharp/tutorials/) +- [Basics Of C#](https://www.c-sharpcorner.com/UploadFile/e9fdcd/basics-of-C-Sharp/) +- [C# Tutorials](https://dotnettutorials.net/course/csharp-dot-net-tutorials/) +- [C# tutorials - W3Schools](https://www.w3schools.com/cs/index.php) \ No newline at end of file diff --git a/paths/aspnet-core/100-basics-of-csharp/index.md b/paths/aspnet-core/100-basics-of-csharp/index.md deleted file mode 100644 index bc31ed1..0000000 --- a/paths/aspnet-core/100-basics-of-csharp/index.md +++ /dev/null @@ -1,20 +0,0 @@ -# C# - -C# (ออกเสียงว่า "ซี-ชาร์ป") เป็นภาษาโปรแกรมมิ่งที่มีวัตถุประสงค์ทั่วไป และเป็นภาษาโปรแกรมมิ่งที่เน้นการเขียนโปรแกรมเชิงวัตถุ (object-oriented) ซึ่งได้รับการพัฒนาโดยไมโครซอฟท์ มันเป็นส่วนหนึ่งของครอบครัวภาษา .NET และถูกใช้ในการสร้างแอปพลิเคชั่นหลากหลายประเภท ตั้งแต่แอปพลิเคชั่นเว็บและมือถือไปจนถึงเกมและบริการบนคลาวด์ - -C# เป็นภาษาที่มีการกำหนดประเภทข้อมูลอย่างชัดเจน (statically-typed) ซึ่งหมายความว่าประเภทของตัวแปรจะต้องถูกระบุขณะที่มันถูกประกาศ และประเภทของค่าไม่สามารถเปลี่ยนแปลงได้หลังจากที่มันถูกกำหนด นอกจากนี้ C# ยังรองรับการเขียนโปรแกรมเชิงวัตถุ ซึ่งหมายความว่ามันมีคุณสมบัติต่างๆ เช่น การห่อหุ้ม (encapsulation), การสืบทอด (inheritance), และการพ้องรูป (polymorphism) - -C# เป็นภาษายอดนิยมสำหรับการสร้างแอปพลิเคชั่น .NET และถูกใช้โดยบริษัทและองค์กรขนาดใหญ่หลายแห่ง รวมถึงไมโครซอฟท์, เดลล์, และไอบีเอ็ม เป็นภาษาที่มีความหลากหลายและสามารถใช้เพื่อจุดประสงค์ที่กว้างขวาง ทำให้เหมาะสมกับการสร้างระบบซอฟต์แวร์ที่สามารถขยายได้และบำรุงรักษาได้ง่าย - -ศึกษารายละเอียดเพิ่มเติมได้ที่: - -### ภาษาไทย -- [เขียนโค้ดด้วยภาษา C#](https://www.saladpuk.com/beginner-1/csharp101) -- [OOP](https://www.saladpuk.com/beginner-1/oop) - -### English -- [C Sharp Basics](https://www.codecademy.com/catalog/language/c-sharp) -- [Introduction to C#](https://learn.microsoft.com/en-us/dotnet/csharp/tour-of-csharp/tutorials/) -- [Basics Of C#](https://www.c-sharpcorner.com/UploadFile/e9fdcd/basics-of-C-Sharp/) -- [C# Tutorials](https://dotnettutorials.net/course/csharp-dot-net-tutorials/) -- [C# tutorials - W3Schools](https://www.w3schools.com/cs/index.php) \ No newline at end of file diff --git a/paths/aspnet-core/101-general-development-skills/000-index.md b/paths/aspnet-core/101-general-development-skills/000-index.md new file mode 100644 index 0000000..9c04d93 --- /dev/null +++ b/paths/aspnet-core/101-general-development-skills/000-index.md @@ -0,0 +1,31 @@ +# ความรู้เบื้องต้นที่สำคัญที่ช่วยในการศึกษา C# ได้ดียิ่งขึ้น + +มีทักษะหลายอย่างที่ถือว่าสำคัญสำหรับการทำงานกับ .NET และ C# + +- `การเขียนโปรแกรมเชิงวัตถุ(Object-oriented programming)`: การเข้าใจเกี่ยวกับคลาส, วัตถุ, การสืบทอด, และพหุนาม เป็นสิ่งจำเป็นสำหรับการทำงานกับ C# และเฟรมเวิร์ก .NET + +- `ภาษา C#: การมีความเข้าใจที่แข็งแกร่งเกี่ยวกับภาษา C#`, รวมถึงไวยากรณ์, คำสำคัญ, และคลาสและประเภทที่มีอยู่ในตัวภาษา, เป็นสิ่งจำเป็นสำหรับการเขียนโค้ดที่มีประสิทธิภาพและสามารถบำรุงรักษาได้ + +- `.NET Framework`: ความคุ้นเคยกับเฟรมเวิร์ก .NET, รวมถึง Common Language Runtime (CLR) และ Base Class Library (BCL), เป็นสิ่งสำคัญสำหรับการเข้าใจวิธีการทำงานของโค้ด C# และการใช้คุณสมบัติมากมายที่มีอยู่ในเฟรมเวิร์ก + +- `การพัฒนาเว็บและซอฟต์แวร์`: ความรู้เกี่ยวกับเทคโนโลยีการพัฒนาเว็บ เช่น HTML, CSS, JavaScript, และ ASP.NET เป็นสิ่งสำคัญสำหรับการสร้างแอปพลิเคชันเว็บโดยใช้ C# และเฟรมเวิร์ก .NET และความรู้เกี่ยวกับวิธีการพัฒนาซอฟต์แวร์ เช่น Agile, Scrum, หรือ Waterfall ก็มีประโยชน์ + +- `ฐานข้อมูล`: ความคุ้นเคยกับแนวคิดและเทคโนโลยีฐานข้อมูล, เช่น SQL และ ADO.NET, เป็นสิ่งสำคัญสำหรับการทำงานกับข้อมูลในแอปพลิเคชัน C# + +- `Cloud computing`: ความคุ้นเคยกับแนวคิดและเทคโนโลยีคอมพิวติ้งบนคลาวด์, เช่น Azure, กำลังกลายเป็นสิ่งสำคัญมากขึ้นสำหรับการปรับใช้และขยายแอปพลิเคชัน C# + +- `DevOps`: การทำความเข้าใจในแนวคิดและปฏิบัติการของ DevOps, เช่น การรวม Source Code เข้าด้วยกันต่อเนื่อง (continuous integration) และการติดตั้งระบบอย่างต่อเนื่อง (continuous deployment) นั้นเป็นสิ่งจำเป็นสำหรับกระบวนการพัฒนาซอฟต์แวร์อัตโนมัติ ให้เป็นไปอย่างราบรื่นและมีประสิทธิภาพมากขึ้น. + +## ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [ทำเว็บต้องรู้อะไรบ้าง? เอากันตั้งแต่คอมพิวเตอร์ทำงานยังไง ไปจนถึงการสร้างเว็บเอาขึ้นออนไลน์](https://www.spicydog.org/blog/what-is-web-application/) +- [แนะนำคำศัพท์และความรู้เบื้องต้นก่อนที่เราจะเริ่มใช้ Cloud Computing กันครับผม](https://medium.com/t-t-software-solution/introduction-to-cloud-computing-571b767a363f) +- [บทสรุปฐานข้อมูล](https://www.saladpuk.com/beginner-1/database-design) + + +### English +- [A Step-by-Step Approach to Learn OOP](https://www.geeksforgeeks.org/a-step-by-step-approach-to-learn-object-oriented-programming/) +- [Asp.net - Complete Tutorial](https://www.youtube.com/watch?v=kdPtNMb8tPw) +- [Learn Cloud Computing](https://www.youtube.com/watch?v=eWwK2FKWp0g) +- [DevOps Course for Beginners](https://www.youtube.com/watch?v=hQcFE0RD0cQ) diff --git a/paths/aspnet-core/101-general-development-skills/100-git.md b/paths/aspnet-core/101-general-development-skills/100-git.md new file mode 100644 index 0000000..bb529db --- /dev/null +++ b/paths/aspnet-core/101-general-development-skills/100-git.md @@ -0,0 +1,16 @@ +# Git + +[Git](https://git-scm.com/) เป็นเครื่องมือที่ช่วยในการจัดการดูแล Source Code Version เป็น Open source ที่สามารถใช้งานได้ฟรี +ออกแบบมาเพื่อจัดการกับโปรเจกต์ตั้งแต่ขนาดเล็กจนถึงขนาดใหญ่มากด้วยความรวดเร็วและประสิทธิภาพที่ดี + +ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [เรียนฟรี!! GitHub For Developer 2 ชั่วโมงเต็ม ตั้งแต่เริ่มต้นจนถึงระดับมือโปร](https://www.youtube.com/watch?v=fOlDcMStMXE) +- [รู้จักกับ Git (ฉบับ Full Introduction)](https://youtu.be/GgBgjvDXVfQ?si=tLnXmyISNXAzD2sa) +- [เรียนรู้การใช้งาน Git & GitHub | สำหรับผู้เริ่มต้น [FULL COURSE]](https://www.youtube.com/watch?v=X3bQzBhRMKQ) + +### English +- [Git & GitHub Crash Course For Beginners](https://www.youtube.com/watch?v=SWYqp7iY_Tc) +- [Learn Git with Tutorials, News and Tips - Atlassian](https://www.atlassian.com/git) +- [Git Cheat Sheet](https://cs.fyi/guide/git-cheatsheet) diff --git a/paths/aspnet-core/101-general-development-skills/101-azure-devops-services.md b/paths/aspnet-core/101-general-development-skills/101-azure-devops-services.md new file mode 100644 index 0000000..ce88edc --- /dev/null +++ b/paths/aspnet-core/101-general-development-skills/101-azure-devops-services.md @@ -0,0 +1,23 @@ +# Azure Devops Services + +Azure DevOps Services คือบริการจาก Microsoft ช่วยเพิ่มสามารถใช้ในการวางแผน, สร้าง, ทดสอบ, และปรับใช้แอปพลิเคชัน .NET คุณสามารถใช้บริการเหล่านี้ร่วมกันหรือแยกกันเพื่อสนับสนุนด้านต่างๆ ของกระบวนการพัฒนาซอฟต์แวร์ บางบริการหลัก ได้แก่: + +- **Azure Boards**: มีคุณสมบัติสำหรับการวางแผนและติดตามการทำงานในรูปแบบ Agile อาทิเช่น Backlogs, Boards และการวางแผนสปรินต์ +- **Azure Repos**: พื้นที่สำหรับจัดเก็บ Source Code สำหรับ Git และ Team Foundation Version Control (TFVC) +- **Azure Artifacts**: เป็นพื้นที่สำหรับดูแลเรื่องการจัดการ Package ในภาษาต่างๆ เช่น NuGet, npm และ Maven +- **Azure Test Plans**: ให้การสนับสนุนสำหรับการทดสอบด้วยตนเอง รวมถึงการทดสอบต่อเนื่องใน Production +- **Azure Pipeline**: พื้นที่ในการจัดการ การพัฒนาระบบ, ทดสอบระบบ และติดตั้งระบบโค้ดโดยอัตโนมัติ พร้อมการสนับสนุนหลายภาษาและแพลตฟอร์ม รวมถึง .NET + +บริการเหล่านี้สามารถใช้ในการสร้างสภาพแวดล้อมการพัฒนาที่ครบถ้วนซึ่งสามารถใช้ในการจัดการทุกด้านของโปรเจ็กต์การพัฒนาซอฟต์แวร์ ตั้งแต่การวางแผนและออกแบบจนถึงการทดสอบและการปรับใช้. + +ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [Azure Base Camp: EP. 1 DevOps from Zero to Hero สำหรับนักพัฒนา หรือ Developer ห้ามพลาด](https://www.youtube.com/watch?v=xfHAWVhe8WA&list=PLHJYxRaIqrLT_eday-1kHSVakubz-gvme&index=2&t=2s) + +### English +- [Part 1: Get started with Azure DevOps](https://learn.microsoft.com/en-us/training/paths/evolve-your-devops-practices/) +- [Part 2: Build applications with Azure DevOps](https://learn.microsoft.com/en-us/training/paths/build-applications-with-azure-devops/) +- [Part 3: Deploy applications with Azure DevOps](https://learn.microsoft.com/en-us/training/paths/deploy-applications-with-azure-devops/) +- [Build, test, and deploy .NET Core apps](https://learn.microsoft.com/en-us/azure/devops/pipelines/ecosystems/dotnet-core?view=azure-devops&tabs=dotnetfive) +- [Microsoft Azure DevOps for ASP .NET Core Web apps](https://techmindfactory.com/Microsoft-Azure-DevOps-for-ASP-.NET-Core-Web-apps/) diff --git a/paths/aspnet-core/101-general-development-skills/102-vcs-hosting-services.md b/paths/aspnet-core/101-general-development-skills/102-vcs-hosting-services.md new file mode 100644 index 0000000..59a17d7 --- /dev/null +++ b/paths/aspnet-core/101-general-development-skills/102-vcs-hosting-services.md @@ -0,0 +1,10 @@ +# Repo Hosting Services + +มีบริการดูแล Repository หลายรูปแบบ โดยที่มีชื่อเสียงที่สุดคือ GitHub, GitLab และ BitBucket. ส่วนตัวแนะนำให้เริ่มต้นสร้างบัญชีบน GitHub เนื่องจากนี่คือที่ที่มีการทำงาน OpenSource ส่วนใหญ่ และมีนักพัฒนาอยู่มากที่สุด. + +ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### English +- [GitHub: Where the world builds software](https://github.com) +- [GitLab: Iterate faster, innovate together](https://gitlab.com) +- [BitBucket: The Git solution for professional teams](https://bitbucket.com) diff --git a/paths/aspnet-core/101-general-development-skills/103-http-https.md b/paths/aspnet-core/101-general-development-skills/103-http-https.md new file mode 100644 index 0000000..a40054d --- /dev/null +++ b/paths/aspnet-core/101-general-development-skills/103-http-https.md @@ -0,0 +1,32 @@ +# HTTP + +HTTP เป็นโปรโตคอลการสื่อสารในระดับแอปพลิเคชันที่ใช้ `TCP/IP` เป็นฐาน ซึ่งกำหนดมาตรฐานวิธีการที่ไคลเอ็นต์และเซิร์ฟเวอร์สื่อสารกัน มันกำหนดวิธีการที่เนื้อหาถูกขอและถ่ายโอนผ่านอินเทอร์เน็ต + +# HTTPS + +HTTPS (**H**ypertext **T**ransfer **P**rotocol **S**ecure) เป็นรูปแบบที่ปลอดภัยของ `HTTP` ซึ่งเป็นโปรโตคอลหลักที่ใช้ในการส่งข้อมูลระหว่างเว็บเบราว์เซอร์และเว็บไซต์ โดยมีการทำงานร่วมกันกับโปรโตคอล `SSL/TLS` เพื่อเพิ่มความปลอดภัยให้มากขึ้นด้วยการเข้ารหัสข้อมูลที่รับส่งกันระหว่างต้นทางและปลายทาง ทำให้โอกาสที่มีผู้ไม่หวังดีนำข้อมูลไปใช้มีน้อยลง + +`HTTPS = HTTP + SSL/TLS` + + +ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [ทำเว็บต้องรู้อะไรบ้าง? เอากันตั้งแต่คอมพิวเตอร์ทำงานยังไง ไปจนถึงการสร้างเว็บเอาขึ้นออนไลน์](https://www.spicydog.org/blog/what-is-web-application/) +- [ใบรับรอง SSL/TLS คืออะไร](https://aws.amazon.com/th/what-is/ssl-certificate/#:~:text=SSL%2FTLS%20%E0%B8%A2%E0%B9%88%E0%B8%AD%E0%B8%A1%E0%B8%B2%E0%B8%88%E0%B8%B2%E0%B8%81,%E0%B9%80%E0%B8%84%E0%B8%A3%E0%B8%B7%E0%B8%AD%E0%B8%82%E0%B9%88%E0%B8%B2%E0%B8%A2%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8%B5%E0%B8%81%E0%B8%B2%E0%B8%A3) +- [HTTPS คืออะไร](https://www.ssl.com/th/%E0%B8%84%E0%B8%B3%E0%B8%96%E0%B8%B2%E0%B8%A1%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%9E%E0%B8%9A%E0%B8%9A%E0%B9%88%E0%B8%AD%E0%B8%A2/https-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3/) +- [HTTPS คือแก่นของความปลอดภัยสำหรับเว็บไซต์](https://www.admeadme.co/blog/digi-word/https-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AA%E0%B9%88%E0%B8%A7%E0%B8%99%E0%B8%AA%E0%B8%B3%E0%B8%84%E0%B8%B1%E0%B8%8D%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A%E0%B9%80%E0%B8%A7%E0%B9%87%E0%B8%9A%E0%B9%84%E0%B8%8B%E0%B8%95%E0%B9%8C%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%AB%E0%B9%89%E0%B8%B2%E0%B8%A1%E0%B8%A1%E0%B8%AD%E0%B8%87%E0%B8%82%E0%B9%89%E0%B8%B2%E0%B8%A1/) +- [HTTP และ HTTPS แตกต่างกันอย่างไร](https://aws.amazon.com/th/compare/the-difference-between-https-and-http/) +- [HTTPS คืออะไร ทำงานอย่างไร](https://www.jittagornp.me/blog/what-is-https/) + +### English + +- [Everything you need to know about HTTP](https://cs.fyi/guide/http-in-depth) +- [What is HTTP?](https://www.cloudflare.com/en-gb/learning/ddos/glossary/hypertext-transfer-protocol-http/) +- [An overview of HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview) +- [HTTP/3 From A To Z: Core Concepts](https://www.smashingmagazine.com/2021/08/http3-core-concepts-part1/) +- [HTTP Crash Course & Exploration](https://www.youtube.com/watch?v=iYM2zFP3Zn0) +- [What is HTTPS?](https://www.cloudflare.com/en-gb/learning/ssl/what-is-https/) +- [Why HTTPS Matters](https://developers.google.com/web/fundamentals/security/encrypt-in-transit/why-https) +- [Enabling HTTPS on Your Servers](https://web.dev/enable-https/) +- [How HTTPS works (comic)](https://howhttps.works/) diff --git a/paths/aspnet-core/101-general-development-skills/104-datastructures-and-algorithms.md b/paths/aspnet-core/101-general-development-skills/104-datastructures-and-algorithms.md new file mode 100644 index 0000000..5f2f375 --- /dev/null +++ b/paths/aspnet-core/101-general-development-skills/104-datastructures-and-algorithms.md @@ -0,0 +1,18 @@ +# Data Structures + +`โครงสร้างข้อมูล (Data Structure)` เป็นวิธีการจัดระเบียบข้อมูลใน `หน่วยความจำ (memory)` เพื่อให้สามารถใช้ข้อมูลได้อย่างมีประสิทธิภาพ โครงสร้างข้อมูลที่พบบ่อย ได้แก่ อาร์เรย์ (array), ลิงค์ลิสต์ (linked list), สแต็ค (stack), แฮชเทเบิล (hashtable), คิว (queue), ต้นไม้ (tree), ฮีป (heap), และกราฟ (graph). + +ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [Devlab (borntodev.com)](แล็บทำโจทย์ Algorithm ที่เริ่มปูพื้นฐานให้เราตั้งแต่ระดับง่ายจนถึงระดับยาก เรียนฟรี ดีงามพระรามแปดดดด) +- [เรียน Data Structure & Algorithm](https://learnalgorithm.com/) +- [CS for Non-Tech Part 1 — Data Structures/Algorithms Zone](https://tpbabparn.medium.com/cs-for-non-tech-part-1-data-structures-algorithms-zone-%E0%B9%84%E0%B8%97%E0%B8%A2-e0087b610602) +- [CS for Non-Tech Part 2 — Data Structures/Algorithms Zone](https://tpbabparn.medium.com/cs-for-non-tech-part-2-data-structures-algorithms-zone-%E0%B9%84%E0%B8%97%E0%B8%A2-3c8b302fe248) + +### English +- [What are Data Structures?](https://www.geeksforgeeks.org/data-structures) +- [Data Structures and Algorithms](https://www.javatpoint.com/data-structure-tutorial) +- [Data Structures Illustrated](https://www.youtube.com/watch?v=9rhT3P1MDHk&list=PLkZYeFmDuaN2-KUIv-mvbjfKszIGJ4FaY) +- [C# resources](https://dev.to/adavidoaiei/fundamental-data-structures-and-algorithms-in-c-4ocf) +- [Interview Questions about Data Structures](https://www.csharpstar.com/csharp-algorithms/) diff --git a/paths/aspnet-core/102-database-fundamentals/000-index.md b/paths/aspnet-core/102-database-fundamentals/000-index.md new file mode 100644 index 0000000..e408a3c --- /dev/null +++ b/paths/aspnet-core/102-database-fundamentals/000-index.md @@ -0,0 +1,38 @@ +# Database fundamentals + +`Database หรือ ฐานข้อมูล` คือชุดของข้อมูลที่เป็นประโยชน์ซึ่งถูกรวบรวมและจัดเรียงไว้อย่างมีโครงสร้างเพื่อให้สามารถใช้ประโยชน์จากข้อมูลได้อย่างมีประสิทธิภาพ ฐานข้อมูลมักใช้ในองค์กรต่างๆ เพื่อเก็บข้อมูลที่เกี่ยวข้องกับกิจกรรมหรือธุรกิจขององค์กรนั้นๆ โดยข้อมูลในฐานข้อมูลสามารถเรียกใช้, ปรับปรุง, จัดการ และวิเคราะห์ได้ผ่านระบบการจัดการฐานข้อมูลหรือ Database Management System (DBMS). + +`Database Management System (DBMS) หรือ ระบบการจัดการฐานข้อมูล` เป็นซอฟต์แวร์ที่ออกแบบมาเพื่อช่วยในการสร้าง, บำรุงรักษา, และใช้งานฐานข้อมูล มันช่วยให้ผู้ใช้สามารถเข้าถึงข้อมูล, ปรับปรุงข้อมูล, และจัดการข้อมูลในฐานข้อมูลได้อย่างมีประสิทธิภาพ รวมถึงการสืบค้นข้อมูลและการจัดการกับปริมาณข้อมูลที่ใหญ่โดยไม่จำเป็นต้องทราบถึงรายละเอียดในการจัดเก็บข้อมูลภายใน + +DBMS ทำหน้าที่เป็นตัวกลางระหว่างผู้ใช้และฐานข้อมูล โดยจัดการกับทุกสิ่งตั้งแต่การแปลคำสั่งให้เข้ากับระบบฐานข้อมูล, การดูแลความปลอดภัยของข้อมูล, การสำรองข้อมูลและการกู้คืน, ไปจนถึงการเพิ่มประสิทธิภาพการเข้าถึงและการจัดการข้อมูล. DBMS สามารถจำแนกตามประเภทของฐานข้อมูลที่จัดการ เช่น ระบบการจัดการฐานข้อมูลสัมพันธ์ (RDBMS) สำหรับฐานข้อมูลสัมพันธ์, หรือ NoSQL DBMS สำหรับฐานข้อมูล NoSQL. + +`Relational Database หรือ ฐานข้อมูลเชิงสัมพันธ์` คือประเภทของฐานข้อมูลที่จัดเก็บและให้การเข้าถึงข้อมูลที่เกี่ยวข้องกัน ข้อมูลในฐานข้อมูลเชิงสัมพันธ์ถูกจัดเก็บในรูปแบบของตาราง โดยแต่ละตารางประกอบด้วยแถว (rows) และคอลัมน์ (columns) ข้อมูลในแต่ละตารางสามารถเชื่อมโยงกันผ่านคีย์ (keys) ทำให้สามารถจัดเรียง ค้นหา และจัดการข้อมูลได้อย่างมีประสิทธิภาพ ฐานข้อมูลเชิงสัมพันธ์ถูกใช้กันอย่างแพร่หลายในแอปพลิเคชันต่างๆ เพื่อจัดเก็บข้อมูลที่มีโครงสร้างที่ชัดเจนและสัมพันธ์กัน. + +`NoSQL Databases หรือ ฐานข้อมูล NoSQL` เป็นประเภทของฐานข้อมูลที่ถูกออกแบบมาเพื่อจัดการกับชุดข้อมูลขนาดใหญ่และมีโครงสร้างที่ไม่เป็นระเบียบหรือเปลี่ยนแปลงได้ง่าย ซึ่งต่างจากฐานข้อมูลเชิงสัมพันธ์ที่มีโครงสร้างที่ค่อนข้างตายตัวและเข้มงวด NoSQL databases ถูกออกแบบมาเพื่อเน้นความสามารถในการขยายระบบ (scalability) ทั้งในแนวนอน (horizontal scaling) และให้ประสิทธิภาพในการเข้าถึงข้อมูลที่รวดเร็ว รองรับการทำงานกับข้อมูลขนาดใหญ่และจำนวนการเข้าถึงที่สูง (high throughput) + +NoSQL databases มีหลายประเภท รวมถึง: + +1. **Document databases**: ข้อมูลถูกจัดเก็บในรูปแบบของเอกสาร (documents), ซึ่งมักจะใช้รูปแบบ JSON หรือ BSON ตัวอย่างเช่น MongoDB และ CouchDB. +2. **Key-value stores**: ข้อมูลถูกจัดเก็บในคู่ของคีย์และค่า (key-value pairs), ทำให้การเข้าถึงข้อมูลสามารถทำได้อย่างรวดเร็วมาก ตัวอย่างเช่น Redis และ DynamoDB. +3. **Column-family stores**: ข้อมูลถูกจัดเก็บในคอลัมน์แทนที่จะเป็นแถว ซึ่งเหมาะสำหรับการจัดเก็บข้อมูลที่มีการเข้าถึงแบบคอลัมน์เป็นหลัก ตัวอย่างเช่น Cassandra และ HBase. +4. **Graph databases**: ข้อมูลถูกจัดเก็บเป็นโหนด (nodes), เอจ (edges), และ คุณสมบัติ (properties) เพื่อสะท้อนความสัมพันธ์แบบกราฟ ตัวอย่างเช่น Neo4j และ Amazon Neptune. + +NoSQL databases มักถูกใช้ในแอปพลิเคชันที่ต้องการความยืดหยุ่นในการจัดเก็บข้อมูล หรือเมื่อมีข้อมูลขนาดใหญ่และต้องการประมวลผลอย่างรวดเร็ว ทำให้เหมาะกับการใช้งานใน Big Data และ real-time analytics. + +## ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [บทสรุปฐานข้อมูล](https://www.saladpuk.com/beginner-1/database-design) +- [สอนพื้นฐาน SQL ทั้งหมดแบบจบในคลิปเดียว !! 🔥](https://www.youtube.com/watch?v=vd1qdnCX5RU) +- [ปูพื้นฐาน SQL สำหรับจัดการฐานข้อมูล 6 ชั่วโมงเต็ม [FULL COURSE]](https://www.youtube.com/watch?v=sgQiJ-8Ra8c) +- [สอน Microsoft SQL Server](https://www.youtube.com/watch?v=kh3MfhTiyQk&list=PLoTScYm9O0GH8gYuxpp-jqu5Blc7KbQVn&index=1) + + +### English + +- [Oracle: What is a Database?](https://www.oracle.com/database/what-is-database/) +- [Prisma.io: What are Databases?](https://www.prisma.io/dataguide/intro/what-are-databases) +- [Intro To Relational Databases](https://www.udacity.com/course/intro-to-relational-databases--ud197) +- [What is Relational Database](https://youtu.be/OqjJjpjDRLc) +- [NoSQL Explained](https://www.mongodb.com/nosql-explained) +- [How do NoSQL Databases work](https://www.youtube.com/watch?v=0buKQHokLK8) diff --git a/paths/aspnet-core/102-database-fundamentals/100-database-design-basics.md b/paths/aspnet-core/102-database-fundamentals/100-database-design-basics.md new file mode 100644 index 0000000..0c6725b --- /dev/null +++ b/paths/aspnet-core/102-database-fundamentals/100-database-design-basics.md @@ -0,0 +1,25 @@ +# Database design basics + +Database Design หรือ การออกแบบฐานข้อมูล เป็นกระบวนการที่เกี่ยวข้องกับการกำหนดโครงสร้างของฐานข้อมูลอย่างรอบคอบเพื่อรับประกันว่าข้อมูลจะถูกจัดเก็บในวิธีที่มีประสิทธิภาพและสามารถเข้าถึงได้ง่าย เป้าหมายคือการสร้างฐานข้อมูลที่มีโครงสร้างที่ชัดเจน ป้องกันข้อมูลซ้ำซ้อน และรองรับการเปลี่ยนแปลงของข้อมูลในอนาคตโดยไม่ทำให้เกิดปัญหา + +การออกแบบฐานข้อมูลประกอบด้วยหลายขั้นตอน เช่น: + +1. **การกำหนดข้อกำหนด**: การเข้าใจและระบุข้อมูลที่ต้องจัดเก็บ รวมถึงความสัมพันธ์ระหว่างข้อมูลต่างๆ +2. **การสร้างโมเดลข้อมูล**: การแปลข้อกำหนดเป็นโมเดล ซึ่งมักจะเริ่มต้นด้วยโมเดลแนวคิด (Conceptual Model) และแปลงเป็นโมเดลตรรกะ (Logical Model) และโมเดลกายภาพ (Physical Model) +3. **การปรับใช้โมเดล**: การแปลงโมเดลตรรกะเป็นโมเดลกายภาพและสร้างฐานข้อมูลบนระบบการจัดการฐานข้อมูล (DBMS) +4. **การทดสอบและปรับแต่ง**: การตรวจสอบและปรับแต่งฐานข้อมูลเพื่อความเหมาะสมกับการใช้งานจริงและประสิทธิภาพที่ดี + +การออกแบบฐานข้อมูลที่ดีจะช่วยให้ฐานข้อมูลนั้นสามารถรองรับการใช้งานที่หลากหลาย มีประสิทธิภาพสูง และสามารถปรับเปลี่ยนได้ง่ายในอนาคต. + +## ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [บทสรุปฐานข้อมูล](https://www.saladpuk.com/beginner-1/database-design) +- [สอนพื้นฐาน SQL ทั้งหมดแบบจบในคลิปเดียว !! 🔥](https://www.youtube.com/watch?v=vd1qdnCX5RU) +- [ปูพื้นฐาน SQL สำหรับจัดการฐานข้อมูล 6 ชั่วโมงเต็ม [FULL COURSE]](https://www.youtube.com/watch?v=sgQiJ-8Ra8c) +- [สอน Microsoft SQL Server](https://www.youtube.com/watch?v=kh3MfhTiyQk&list=PLoTScYm9O0GH8gYuxpp-jqu5Blc7KbQVn&index=1) + + +### English +- [Database design basics](https://support.microsoft.com/en-us/office/database-design-basics-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5) +- [Database Design Course](https://www.youtube.com/watch?v=ztHopE5Wnpc) diff --git a/paths/aspnet-core/102-database-fundamentals/101-sql-basics.md b/paths/aspnet-core/102-database-fundamentals/101-sql-basics.md new file mode 100644 index 0000000..de48b90 --- /dev/null +++ b/paths/aspnet-core/102-database-fundamentals/101-sql-basics.md @@ -0,0 +1,27 @@ +# Sql basics + +SQL (Structured Query Language) เป็นภาษามาตรฐานที่ใช้สำหรับการสร้าง, ดูแล, และจัดการฐานข้อมูลเชิงสัมพันธ์ (Relational Database Management Systems - RDBMS). ภาษานี้ให้ความสามารถในการสอบถามข้อมูล, แก้ไข, และจัดการโครงสร้างข้อมูลในฐานข้อมูล โดยมีคำสั่งหลักๆ ดังนี้: + +1. **SELECT**: ใช้สำหรับการค้นหาและเลือกข้อมูลจากฐานข้อมูล สามารถใช้กับเงื่อนไขต่างๆ เพื่อกรองข้อมูลที่ต้องการ. +2. **INSERT**: ใช้เพื่อเพิ่มข้อมูลใหม่เข้าไปในตารางของฐานข้อมูล. +3. **UPDATE**: ใช้สำหรับแก้ไขข้อมูลที่มีอยู่ในฐานข้อมูล. +4. **DELETE**: ใช้เพื่อลบข้อมูลจากฐานข้อมูล. +5. **CREATE DATABASE / TABLE**: ใช้สำหรับสร้างฐานข้อมูลหรือตารางใหม่. +6. **DROP DATABASE / TABLE**: ใช้สำหรับลบฐานข้อมูลหรือตาราง. +7. **ALTER TABLE**: ใช้ในการเปลี่ยนแปลงโครงสร้างของตาราง เช่น เพิ่มหรือลบคอลัมน์. +8. **JOIN**: ใช้ในการรวมข้อมูลจากสองตารางหรือมากกว่าเข้าด้วยกันตามเงื่อนไขที่กำหนด. + +SQL ช่วยให้ผู้ใช้สามารถสอบถามข้อมูลได้อย่างมีประสิทธิภาพ รวมถึงการจัดการฐานข้อมูล การตั้งค่าความปลอดภัย และการบำรุงรักษาฐานข้อมูล. การใช้งาน SQL สามารถทำได้ผ่านเครื่องมือแบบ Command Line หรือผ่านโปรแกรม GUI ที่ออกแบบมาสำหรับการจัดการฐานข้อมูล. + +## ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [บทสรุปฐานข้อมูล](https://www.saladpuk.com/beginner-1/database-design) +- [สอนพื้นฐาน SQL ทั้งหมดแบบจบในคลิปเดียว !! 🔥](https://www.youtube.com/watch?v=vd1qdnCX5RU) +- [ปูพื้นฐาน SQL สำหรับจัดการฐานข้อมูล 6 ชั่วโมงเต็ม [FULL COURSE]](https://www.youtube.com/watch?v=sgQiJ-8Ra8c) +- [สอน Microsoft SQL Server](https://www.youtube.com/watch?v=kh3MfhTiyQk&list=PLoTScYm9O0GH8gYuxpp-jqu5Blc7KbQVn&index=1) + + +### English +- [Introduction to SQL](https://www.w3schools.com/sql/sql_intro.asp) +- [SQL Tutorial - Full Database Course for Beginners](https://www.youtube.com/watch?v=HXV3zeQKqGY) diff --git a/paths/aspnet-core/102-database-fundamentals/102-stored-procedures.md b/paths/aspnet-core/102-database-fundamentals/102-stored-procedures.md new file mode 100644 index 0000000..91088ec --- /dev/null +++ b/paths/aspnet-core/102-database-fundamentals/102-stored-procedures.md @@ -0,0 +1,27 @@ +# Stored Procedures + +Stored Procedures คือกลุ่มคำสั่ง SQL ที่ได้รับการคอมไพล์และเก็บไว้ในฐานข้อมูลเชิงสัมพันธ์ ซึ่งสามารถเรียกใช้เป็นรูปแบบการดำเนินการที่กำหนดไว้ล่วงหน้าได้ โดยมีจุดมุ่งหมายเพื่อเพิ่มประสิทธิภาพ และเพื่อการจัดการฐานข้อมูลที่มีประสิทธิผล + +### ประโยชน์ของ Stored Procedures: +1. **ประสิทธิภาพ**: Stored Procedures ถูกคอมไพล์และเก็บไว้ในฐานข้อมูลเมื่อสร้างครั้งแรก ดังนั้นเมื่อเรียกใช้มันไม่จำเป็นต้องคอมไพล์ใหม่ ทำให้การเรียกใช้เร็วขึ้น +2. **ลดการใช้ทรัพยากรบนเครือข่าย**: การส่งคำสั่ง SQL ที่มีขนาดใหญ่ผ่านเครือข่ายอาจใช้ทรัพยากรมาก แต่การเรียกใช้ stored procedure เพียงแค่ส่งชื่อและพารามิเตอร์ ทำให้ใช้ทรัพยากรน้อยกว่า +3. **ซ่อนรายละเอียดการดำเนินการ**: ผู้ใช้หรือแอปพลิเคชันสามารถเรียกใช้ stored procedures โดยไม่จำเป็นต้องรู้รายละเอียดของโค้ด SQL ภายใน ช่วยให้สามารถเปลี่ยนแปลงโค้ดภายในโดยไม่กระทบกับผู้ใช้ +4. **เสริมความปลอดภัย**: สามารถจำกัดการเข้าถึงข้อมูลให้กับผู้ใช้ผ่าน stored procedures โดยไม่อนุญาตให้พวกเขาเรียกใช้คำสั่ง SQL โดยตรง +5. **การใช้งานที่เป็นระเบียบ**: สามารถใช้ stored procedures เพื่อบังคับใช้กฎ หรือเงื่อนไขเฉพาะในการเข้าถึงหรืออัปเดตข้อมูล + +### การใช้งาน: +Stored procedures สามารถรับพารามิเตอร์เข้ามา และอาจจะมีการส่งค่ากลับออกไป ซึ่งช่วยให้สามารถใช้งานได้ยืดหยุ่นมากขึ้น ผู้ใช้หรือแอปพลิเคชันสามารถเรียกใช้ stored procedures ผ่านคำสั่ง SQL ที่ง่าย เช่น `CALL` หรือ `EXECUTE` ตามด้วยชื่อของ stored procedure + +## ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [บทสรุปฐานข้อมูล](https://www.saladpuk.com/beginner-1/database-design) +- [สอนพื้นฐาน SQL ทั้งหมดแบบจบในคลิปเดียว !! 🔥](https://www.youtube.com/watch?v=vd1qdnCX5RU) +- [ปูพื้นฐาน SQL สำหรับจัดการฐานข้อมูล 6 ชั่วโมงเต็ม [FULL COURSE]](https://www.youtube.com/watch?v=sgQiJ-8Ra8c) +- [สอน Microsoft SQL Server](https://www.youtube.com/watch?v=kh3MfhTiyQk&list=PLoTScYm9O0GH8gYuxpp-jqu5Blc7KbQVn&index=1) + + +### English +- [Stored Procedure Tutorial](https://www.w3schools.com/sql/sql_stored_procedures.asp) +- [Stored Procedure in SQL: Benefits And How to Create It](https://www.simplilearn.com/tutorials/sql-tutorial/stored-procedure-in-sql) +- [SQL Server stored procedures for beginners](https://www.sqlshack.com/sql-server-stored-procedures-for-beginners/) diff --git a/paths/aspnet-core/102-database-fundamentals/103-constraints.md b/paths/aspnet-core/102-database-fundamentals/103-constraints.md new file mode 100644 index 0000000..ec10af6 --- /dev/null +++ b/paths/aspnet-core/102-database-fundamentals/103-constraints.md @@ -0,0 +1,29 @@ +# Constraints + +Database constraints หรือข้อจำกัดในฐานข้อมูล เป็นกฎที่ใช้ในการกำหนดข้อจำกัดสำหรับประเภทของข้อมูลที่สามารถเก็บไว้ในตาราง ซึ่งช่วยให้รักษาความถูกต้อง (integrity) และความสอดคล้อง (consistency) ของข้อมูลในฐานข้อมูล มีหลายประเภทของ constraints ในฐานข้อมูล: + +1. **PRIMARY KEY Constraint**: กำหนดให้คอลัมน์หนึ่งหรือหลายคอลัมน์เป็นคีย์หลักของตาราง ค่าในคอลัมน์นี้ต้องเป็นค่าที่ไม่ซ้ำกันและไม่เป็น null ตัวอย่างเช่น, ในตารางของพนักงาน, `employee_id` อาจเป็น PRIMARY KEY. + +2. **FOREIGN KEY Constraint**: สร้างความสัมพันธ์ระหว่างตารางโดยอ้างอิง PRIMARY KEY ของตารางอื่น ช่วยให้แน่ใจว่าค่าในคอลัมน์นี้ต้องมีอยู่ในตารางที่อ้างอิง ตัวอย่างเช่น, `department_id` ในตารางพนักงานอาจเป็น FOREIGN KEY ที่อ้างอิงไปยังตารางแผนก. + +3. **UNIQUE Constraint**: กำหนดให้ข้อมูลในคอลัมน์หนึ่งหรือหลายคอลัมน์ต้องเป็นค่าที่ไม่ซ้ำกัน ตัวอย่างเช่น, `email_address` ในตารางของพนักงานอาจมี UNIQUE constraint เพื่อให้แน่ใจว่าไม่มีอีเมลที่ซ้ำกัน. + +4. **CHECK Constraint**: กำหนดเงื่อนไขสำหรับค่าที่สามารถเก็บไว้ในคอลัมน์ ตัวอย่างเช่น, สามารถใช้ CHECK constraint เพื่อแน่ใจว่าอายุของพนักงานต้องมากกว่า 18. + +5. **NOT NULL Constraint**: ระบุว่าคอลัมน์ไม่สามารถมีค่า null ได้ ตัวอย่างเช่น, ในตารางของพนักงาน, `first_name` อาจมี NOT NULL constraint เพื่อบังคับว่าต้องระบุชื่อ. + +ข้อจำกัดเหล่านี้ช่วยให้ผู้ออกแบบฐานข้อมูลสามารถระบุกฎเกณฑ์และข้อกำหนดที่ชัดเจนสำหรับข้อมูลที่เก็บในฐานข้อมูล ทำให้ข้อมูลนั้นมีความน่าเชื่อถือและถูกต้องมากขึ้น. + +## ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [บทสรุปฐานข้อมูล](https://www.saladpuk.com/beginner-1/database-design) +- [สอนพื้นฐาน SQL ทั้งหมดแบบจบในคลิปเดียว !! 🔥](https://www.youtube.com/watch?v=vd1qdnCX5RU) +- [ปูพื้นฐาน SQL สำหรับจัดการฐานข้อมูล 6 ชั่วโมงเต็ม [FULL COURSE]](https://www.youtube.com/watch?v=sgQiJ-8Ra8c) +- [สอน Microsoft SQL Server](https://www.youtube.com/watch?v=kh3MfhTiyQk&list=PLoTScYm9O0GH8gYuxpp-jqu5Blc7KbQVn&index=1) + + +### English +- [SQL Constraints](https://www.w3schools.com/sql/sql_constraints.asp) +- [Constraints of SQL](https://www.educative.io/courses/database-design-fundamentals/m7JnY9Xm6Qp) +- [Constraints in DBMS](https://beginnersbook.com/2015/04/constraints-in-dbms/) diff --git a/paths/aspnet-core/102-database-fundamentals/104-triggers.md b/paths/aspnet-core/102-database-fundamentals/104-triggers.md new file mode 100644 index 0000000..c78404b --- /dev/null +++ b/paths/aspnet-core/102-database-fundamentals/104-triggers.md @@ -0,0 +1,42 @@ +# Triggers + +Database Triggers หรือทริกเกอร์ในฐานข้อมูล เป็นโปรแกรมหรือรหัสที่ถูกกำหนดให้ทำงานอัตโนมัติเมื่อเกิดเหตุการณ์ที่กำหนดไว้ในฐานข้อมูล เช่น การเพิ่ม (INSERT), การอัปเดต (UPDATE), หรือการลบ (DELETE) ข้อมูลในตารางหนึ่งหรือหลายตาราง ทริกเกอร์ช่วยให้สามารถอัตโนมัติการดำเนินการที่ซับซ้อน รักษาความสอดคล้องของข้อมูล และบังคับใช้กฎการจัดการฐานข้อมูลโดยอัตโนมัติ + +### การทำงานของ Database Triggers: + +- **BEFORE Trigger**: ทำงานก่อนการดำเนินการ (INSERT, UPDATE, DELETE) บนตาราง เหมาะสำหรับการตรวจสอบหรือเปลี่ยนแปลงข้อมูลก่อนที่ข้อมูลจะถูกเปลี่ยนแปลงในฐานข้อมูล +- **AFTER Trigger**: ทำงานหลังจากการดำเนินการบนตาราง เหมาะสำหรับการดำเนินการที่ต้องการข้อมูลที่ได้รับการอัปเดตแล้ว +- **INSTEAD OF Trigger**: ทำงานแทนการดำเนินการที่กำหนด เหมาะสำหรับการดำเนินการที่ซับซ้อนที่ต้องการควบคุมเหตุการณ์การเข้าถึงข้อมูลอย่างละเอียด + +### ตัวอย่างของ Database Trigger: + +สมมติว่ามีตาราง `employees` และตาราง `audit_log` ซึ่งใช้เก็บประวัติการอัปเดตข้อมูลของพนักงาน สามารถสร้าง AFTER UPDATE Trigger เพื่อบันทึกการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับตาราง `employees` ไปยังตาราง `audit_log` + +```sql +CREATE TRIGGER record_employee_update +AFTER UPDATE ON employees +FOR EACH ROW +BEGIN + INSERT INTO audit_log (employee_id, update_time) + VALUES (NEW.id, NOW()); +END; +``` + +ในตัวอย่างนี้, ทุกครั้งที่มีการอัปเดตข้อมูลในตาราง `employees`, Trigger `record_employee_update` จะทำงาน โดยจะเพิ่มบันทึกใหม่ในตาราง `audit_log` ที่บันทึก `employee_id` และเวลาที่มีการอัปเดต + +ทริกเกอร์เหล่านี้มีความสามารถที่มีประโยชน์มากในการรักษาความสอดคล้องของข้อมูลและอัตโนมัติกระบวนการที่ซับซ้อนในฐานข้อมูล แต่ควรใช้ด้ว + +## ศึกษารายละเอียดเพิ่มเติมได้ที่: + +### ภาษาไทย +- [บทสรุปฐานข้อมูล](https://www.saladpuk.com/beginner-1/database-design) +- [สอนพื้นฐาน SQL ทั้งหมดแบบจบในคลิปเดียว !! 🔥](https://www.youtube.com/watch?v=vd1qdnCX5RU) +- [ปูพื้นฐาน SQL สำหรับจัดการฐานข้อมูล 6 ชั่วโมงเต็ม [FULL COURSE]](https://www.youtube.com/watch?v=sgQiJ-8Ra8c) +- [สอน Microsoft SQL Server](https://www.youtube.com/watch?v=kh3MfhTiyQk&list=PLoTScYm9O0GH8gYuxpp-jqu5Blc7KbQVn&index=1) + + +### English +- [Database Triggers](https://docs.oracle.com/cd/A57673_01/DOC/server/doc/SCN73/ch15.htm) +- [Database Triggers: Examples & Overview](https://study.com/academy/lesson/database-triggers-examples-overview.html) +- [What are Triggers in SQL?](https://www.edureka.co/blog/triggers-in-sql/) +- [What is a SQL Trigger?](https://www.essentialsql.com/sql-trigger/)