Merge branch 'master' into feat/changelog

feat/changelog
Kamran Ahmed 2 months ago committed by GitHub
commit 113434a647
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      package.json
  2. 1591
      pnpm-lock.yaml
  3. BIN
      public/pdfs/roadmaps/redis.pdf
  4. 25
      public/roadmap-content/android.json
  5. 32
      public/roadmap-content/angular.json
  6. 1263
      public/roadmap-content/backend.json
  7. 10
      public/roadmap-content/blockchain.json
  8. 6
      public/roadmap-content/computer-science.json
  9. 1944
      public/roadmap-content/cyber-security.json
  10. 2
      public/roadmap-content/data-analyst.json
  11. 1445
      public/roadmap-content/devops.json
  12. 19
      public/roadmap-content/frontend.json
  13. 6
      public/roadmap-content/full-stack.json
  14. 24
      public/roadmap-content/git-github.json
  15. 5
      public/roadmap-content/ios.json
  16. 12
      public/roadmap-content/javascript.json
  17. 16
      public/roadmap-content/mlops.json
  18. 55
      public/roadmap-content/nodejs.json
  19. 14
      public/roadmap-content/postgresql-dba.json
  20. 2
      public/roadmap-content/python.json
  21. 812
      public/roadmap-content/redis.json
  22. 10
      public/roadmap-content/software-architect.json
  23. 2
      public/roadmap-content/sql.json
  24. 20
      public/roadmap-content/terraform.json
  25. 6
      public/roadmap-content/ux-design.json
  26. 102
      public/roadmap-content/vue.json
  27. BIN
      public/roadmaps/redis.png
  28. 1
      readme.md
  29. 7
      src/components/AccountStreak/AccountStreak.tsx
  30. 13
      src/components/AuthenticationFlow/EmailLoginForm.tsx
  31. 17
      src/components/CreateTeam/ContentConfirmationModal.tsx
  32. 36
      src/components/CustomRoadmap/CustomRoadmapAlert.tsx
  33. 29
      src/components/Dashboard/DashboardAiRoadmaps.tsx
  34. 1
      src/components/Dashboard/DashboardCardLink.tsx
  35. 3
      src/components/Dashboard/DashboardPage.tsx
  36. 15
      src/components/Dashboard/EmptyStackMessage.tsx
  37. 21
      src/components/Dashboard/ListDashboardCustomProgress.tsx
  38. 69
      src/components/Dashboard/PersonalDashboard.tsx
  39. 129
      src/components/Dashboard/ProgressStack.tsx
  40. 7
      src/components/FrameRenderer/ProgressNudge.tsx
  41. 53
      src/components/GenerateRoadmap/AIRoadmapAlert.tsx
  42. 70
      src/components/RoadmapAlert.tsx
  43. 31
      src/components/Roadmaps/RoadmapCard.tsx
  44. 51
      src/components/Roadmaps/RoadmapsPage.tsx
  45. 8
      src/components/UpdateProfile/ProfileUsername.tsx
  46. 38
      src/components/UpdateProfile/UpdatePublicProfileForm.tsx
  47. 18
      src/components/UserPublicProfile/UserPublicProfileHeader.tsx
  48. 4
      src/components/UserPublicProfile/UserPublicProjects.tsx
  49. 6
      src/data/guides/devops-engineer.md
  50. 5
      src/data/roadmaps/android/content/cloud-messaging@e3vHFaFFMV7kI9q6yf5e9.md
  51. 5
      src/data/roadmaps/android/content/crashlytics@xB4evbD07n1VrHOIpowV4.md
  52. 5
      src/data/roadmaps/android/content/remote-config@1Tz-Shj_Tuz2U8llEAcLr.md
  53. 8
      src/data/roadmaps/angular/content/angular-architecture@DE3cMpeRYuUPw2ADtfS-3.md
  54. 2
      src/data/roadmaps/api-design/content/grpc-apis@Wwd-0PjrtViMFWxRGaQey.md
  55. 2
      src/data/roadmaps/backend/content/git@_I1E__wCIVrhjMk6IMieE.md
  56. 2
      src/data/roadmaps/backend/content/github@ptD8EVqwFUYr4W5A_tABY.md
  57. 2
      src/data/roadmaps/backend/content/go@BdXbcz4-ar3XOX0wIKzBp.md
  58. 2
      src/data/roadmaps/backend/content/graphql@zp3bq38tMnutT2N0tktOW.md
  59. 2
      src/data/roadmaps/backend/content/java@ANeSwxJDJyQ-49pO2-CCI.md
  60. 2
      src/data/roadmaps/backend/content/javascript@8-lO-v6jCYYoklEJXULxN.md
  61. 2
      src/data/roadmaps/backend/content/mongodb@28U6q_X-NTYf7OSKHjoWH.md
  62. 2
      src/data/roadmaps/backend/content/ms-sql@dEsTje8kfHwWjCI3zcgLC.md
  63. 2
      src/data/roadmaps/backend/content/postgresql@FihTrMO56kj9jT8O_pO2T.md
  64. 2
      src/data/roadmaps/backend/content/python@J_sVHsD72Yzyqb9KCIvAY.md
  65. 4
      src/data/roadmaps/backend/content/real-time-data@5XGvep2qoti31bsyqNzrU.md
  66. 2
      src/data/roadmaps/backend/content/version-control-systems@ezdqQW9wTUw93F6kjOzku.md
  67. 2
      src/data/roadmaps/blockchain/content/angular@UY_vAsixTyocvo8zvAF4b.md
  68. 2
      src/data/roadmaps/blockchain/content/go@jxlQ1ibcCv6ZlcEvobZ_G.md
  69. 2
      src/data/roadmaps/blockchain/content/python@pVG7bGqVGCeSBlZxRNHJs.md
  70. 2
      src/data/roadmaps/blockchain/content/react@0DUYS40_-BTpk2rLQ1a0e.md
  71. 2
      src/data/roadmaps/blockchain/content/vue@Ke97bMHGfb-8hB_xSwMbk.md
  72. 2
      src/data/roadmaps/computer-science/content/go@mWW88VnkqWgDz02qw5zU-.md
  73. 2
      src/data/roadmaps/computer-science/content/java@1lQSUFrrIGq19nUnM92-I.md
  74. 2
      src/data/roadmaps/computer-science/content/python@RlKZzs44biQPgxD0tK1qx.md
  75. 7
      src/data/roadmaps/cyber-security/content/arp@M52V7hmG4ORf4TIVw3W3J.md
  76. 6
      src/data/roadmaps/cyber-security/content/arp@fzdZF-nzIL69kaA7kwOCn.md
  77. 6
      src/data/roadmaps/cyber-security/content/arp@hkO3Ga6KctKODr4gos6qX.md
  78. 8
      src/data/roadmaps/cyber-security/content/attck@auR7fNyd77W2UA-PjXeJS.md
  79. 4
      src/data/roadmaps/cyber-security/content/aws@0LztOTc3NG3OujCVwlcVU.md
  80. 38
      src/data/roadmaps/cyber-security/content/azure@GklBi7Qx1akN_cS9UMrha.md
  81. 5
      src/data/roadmaps/cyber-security/content/basics-and-concepts-of-threat-hunting@_x3BgX93N-Pt1_JK7wk0p.md
  82. 10
      src/data/roadmaps/cyber-security/content/basics-of-computer-networking@T0aU8ZQGShmF9uXhWY4sD.md
  83. 4
      src/data/roadmaps/cyber-security/content/basics-of-reverse-engineering@uoGA4T_-c-2ip_zfEUcJJ.md
  84. 4
      src/data/roadmaps/cyber-security/content/basics-of-subnetting@E8Z7qFFW-I9ivr0HzoXCq.md
  85. 4
      src/data/roadmaps/cyber-security/content/basics-of-threat-intel-osint@wN5x5pY53B8d0yopa1z8F.md
  86. 3
      src/data/roadmaps/cyber-security/content/basics-of-vulnerability-management@lcxAXtO6LoGd85nOFnLo8.md
  87. 4
      src/data/roadmaps/cyber-security/content/blue--red--purple-teams@7tDxTcKJNAUxbHLPCnPFO.md
  88. 1
      src/data/roadmaps/cyber-security/content/box@4Man3Bd-ySLFlAdxbLOHw.md
  89. 4
      src/data/roadmaps/cyber-security/content/ip@FdoqB2---uDAyz6xZjk_u.md
  90. 39
      src/data/roadmaps/cyber-security/content/lan@xWxusBtMEWnd-6n7oqjHz.md
  91. 27
      src/data/roadmaps/cyber-security/content/ldap@lV3swvD6QGLmD9iVfbKIF.md
  92. 4
      src/data/roadmaps/cyber-security/content/ldaps@z_fDvTgKw51Uepo6eMQd9.md
  93. 37
      src/data/roadmaps/cyber-security/content/linux@4frVcjYI1VlVU9hQgpwcT.md
  94. 41
      src/data/roadmaps/cyber-security/content/local-auth@vYvFuz7lAJXZ1vK_4999a.md
  95. 25
      src/data/roadmaps/cyber-security/content/localhost@0TWwox-4pSwuXojI8ixFO.md
  96. 49
      src/data/roadmaps/cyber-security/content/lolbas@10qbxX8DCrfyH7tgYexxQ.md
  97. 22
      src/data/roadmaps/cyber-security/content/loopback@W_oloLu2Euz5zRSy7v_T8.md
  98. 35
      src/data/roadmaps/cyber-security/content/mac-based@OAukNfV5T0KTnIF9jKYRF.md
  99. 28
      src/data/roadmaps/cyber-security/content/macos@dztwr-DSckggQbcNIi4_2.md
  100. 32
      src/data/roadmaps/cyber-security/content/man@LrwTMH_1fTd8iB9wJg-0t.md
  101. Some files were not shown because too many files have changed in this diff Show More

@ -55,7 +55,7 @@
"nanostores": "^0.10.3", "nanostores": "^0.10.3",
"node-html-parser": "^6.1.13", "node-html-parser": "^6.1.13",
"npm-check-updates": "^17.0.0", "npm-check-updates": "^17.0.0",
"playwright": "^1.45.3", "playwright": "^1.47.1",
"prismjs": "^1.29.0", "prismjs": "^1.29.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-calendar-heatmap": "^1.9.0", "react-calendar-heatmap": "^1.9.0",

File diff suppressed because it is too large Load Diff

Binary file not shown.

@ -412,8 +412,14 @@
}, },
"Bz-BkfzsDHAbAw3HD7WCd": { "Bz-BkfzsDHAbAw3HD7WCd": {
"title": "MVI", "title": "MVI",
"description": "", "description": "The **MVI** `Model-View-Intent` pattern is a reactive architectural pattern, similar to **MVVM** and **MVP**, focusing on immutability and handling states in unidirectional cycles. The data flow is unidirectional: Intents update the Model's state through the `ViewModel`, and then the View reacts to the new state. This ensures a clear and predictable cycle between logic and the interface.\n\n* Model: Represents the UI state. It is immutable and contains all the necessary information to represent a screen.\n* View: Displays the UI state and receives the user's intentions.\n* Intent: The user's intentions trigger state updates, managed by the `ViewModel`.\n\nVisit the following resources to learn more:",
"links": [] "links": [
{
"title": "MVI with Kotlin",
"url": "https://proandroiddev.com/mvi-architecture-with-kotlin-flows-and-channels-d36820b2028d",
"type": "article"
}
]
}, },
"pSU-NZtjBh-u0WKTYfjk_": { "pSU-NZtjBh-u0WKTYfjk_": {
"title": "MVVM", "title": "MVVM",
@ -614,8 +620,19 @@
}, },
"e3vHFaFFMV7kI9q6yf5e9": { "e3vHFaFFMV7kI9q6yf5e9": {
"title": "Cloud Messaging", "title": "Cloud Messaging",
"description": "Firebase Cloud Messaging (FCM) is a powerful, battery-efficient messaging service that enables you to send messages reliably and securely to your Android applications. It enables you to send two types of messages: \"notification messages\" and \"data messages\". Notification messages are primarily meant for user notifications and will only be delivered when the application is in the foreground. On the other hand, data messages can handle even when the app is in the background or killed and can be used to send custom key-value pairs. FCM also supports various additional features, such as topic messaging to send messages to multiple devices subscribed to a common topic, device group messaging for sending messages to groups of user devices, and upstream messaging for sending messages from the client application to the FCM server.", "description": "Firebase Cloud Messaging (FCM) is a powerful, battery-efficient messaging service that enables you to send messages reliably and securely to your Android applications. It enables you to send two types of messages: \"notification messages\" and \"data messages\". Notification messages are primarily meant for user notifications and will only be delivered when the application is in the foreground. On the other hand, data messages can handle even when the app is in the background or killed and can be used to send custom key-value pairs. FCM also supports various additional features, such as topic messaging to send messages to multiple devices subscribed to a common topic, device group messaging for sending messages to groups of user devices, and upstream messaging for sending messages from the client application to the FCM server.\n\nVisit the following resources to learn more:",
"links": [] "links": [
{
"title": "Documentation",
"url": "https://firebase.google.com/docs/cloud-messaging/android/client",
"type": "article"
},
{
"title": "Firebase Cloud Messaging",
"url": "https://www.youtube.com/watch?v=sioEY4tWmLI&list=PLl-K7zZEsYLkuHRCtHTpi6JYHka8oHLft",
"type": "video"
}
]
}, },
"3EEfKAd-ppIQpdQSEhbA1": { "3EEfKAd-ppIQpdQSEhbA1": {
"title": "FireStore", "title": "FireStore",

@ -12,12 +12,42 @@
}, },
"DE3cMpeRYuUPw2ADtfS-3": { "DE3cMpeRYuUPw2ADtfS-3": {
"title": "Angular Architecture", "title": "Angular Architecture",
"description": "Visit the following resources to learn more:", "description": "Angular follows a modular architecture pattern, dividing the application into distinct modules, components, services, and other elements, which enhances code organization and maintainability. The key building blocks include modules, which are containers grouping related components, services, directives, and other elements to ensure proper encapsulation and reusability. Components are the building blocks of Angular applications, representing parts of the user interface with associated logic, consisting of templates, styles, and a class defining behavior. Services encapsulate reusable business logic, data manipulation, and API communication, enabling data and functionality sharing across components. Directives are HTML attributes or elements that extend HTML functionality, allowing reusable behaviors across the application. Lastly, pipes transform data before displaying it in templates, providing convenient ways to format, filter, and sort data.\n\nVisit the following resources to learn more:",
"links": [ "links": [
{ {
"title": "Angular coding style guide", "title": "Angular coding style guide",
"url": "https://angular.dev/style-guide", "url": "https://angular.dev/style-guide",
"type": "article" "type": "article"
},
{
"title": "The Ultimate Guide to Angular Architecture: Best Practices for efficient coding with Angular Framework",
"url": "https://angulardive.com/blog/the-ultimate-guide-to-angular-architecture-best-practices-for-efficient-coding-with-angular-framework/",
"type": "article"
},
{
"title": "Modern Architectures with Angular Part 1: Strategic design with Sheriff and Standalone Components",
"url": "https://www.angulararchitects.io/en/blog/modern-architectures-with-angular-part-1-strategic-design-with-sheriff-and-standalone-components/",
"type": "article"
},
{
"title": "Optimizing the architecture of large web applications with Angular",
"url": "https://albertobasalo.medium.com/optimizing-the-architecture-of-large-web-applications-with-angular-79d03b01a92b",
"type": "article"
},
{
"title": "Angular Architecture Concepts and Patterns",
"url": "https://www.bigscal.com/blogs/frontend/angular-architecture-concepts-and-patterns/",
"type": "article"
},
{
"title": "Top 10 Angular Architecture Mistakes",
"url": "https://angularexperts.io/blog/top-10-angular-architecture-mistakes",
"type": "article"
},
{
"title": "Architecting Angular: A Guide to effective project structure",
"url": "https://medium.com/@nile.bits/architecting-angular-a-guide-to-effective-project-structure-9756bae92262",
"type": "article"
} }
] ]
}, },

File diff suppressed because it is too large Load Diff

@ -1953,7 +1953,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Python Roadmap", "title": "Visit Dedicated Python Roadmap",
"url": "/python", "url": "https://roadmap.sh/python",
"type": "article" "type": "article"
}, },
{ {
@ -1994,7 +1994,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Go Roadmap", "title": "Visit Dedicated Go Roadmap",
"url": "/golang", "url": "https://roadmap.sh/golang",
"type": "article" "type": "article"
}, },
{ {
@ -2056,7 +2056,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated React Roadmap", "title": "Visit Dedicated React Roadmap",
"url": "/react", "url": "https://roadmap.sh/react",
"type": "article" "type": "article"
}, },
{ {
@ -2097,7 +2097,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Angular Roadmap", "title": "Visit Dedicated Angular Roadmap",
"url": "/angular", "url": "https://roadmap.sh/angular",
"type": "article" "type": "article"
}, },
{ {
@ -2118,7 +2118,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Vue Roadmap", "title": "Visit Dedicated Vue Roadmap",
"url": "/vue", "url": "https://roadmap.sh/vue",
"type": "article" "type": "article"
}, },
{ {

@ -51,7 +51,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Python Roadmap", "title": "Visit Dedicated Python Roadmap",
"url": "/python", "url": "https://roadmap.sh/python",
"type": "article" "type": "article"
}, },
{ {
@ -107,7 +107,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Go Roadmap", "title": "Visit Dedicated Go Roadmap",
"url": "/golang", "url": "https://roadmap.sh/golang",
"type": "article" "type": "article"
}, },
{ {
@ -292,7 +292,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Java Roadmap", "title": "Visit Dedicated Java Roadmap",
"url": "/java", "url": "https://roadmap.sh/java",
"type": "article" "type": "article"
}, },
{ {

File diff suppressed because it is too large Load Diff

@ -84,7 +84,7 @@
] ]
}, },
"DFMR-0MbmVCCrJu0I9JWG": { "DFMR-0MbmVCCrJu0I9JWG": {
"title": "Prespective Analytics", "title": "Prescriptive Analytics",
"description": "Prescriptive analytics, a crucial type of data analytics, is essential for making data-driven decisions in business and organizational contexts. As a data analyst, the goal of prescriptive analytics is to recommend various actions using predictions on the basis of known parameters to help decision makers understand likely outcomes. Prescriptive analytics employs a blend of techniques and tools such as algorithms, machine learning, computational modelling procedures, and decision-tree structures to enable automated decision making. Therefore, prescriptive analytics not only anticipates what will happen and when it will happen, but also explains why it will happen, contributing to the significance of a data analyst’s role in an organization.\n\nLearn more from the following resources:", "description": "Prescriptive analytics, a crucial type of data analytics, is essential for making data-driven decisions in business and organizational contexts. As a data analyst, the goal of prescriptive analytics is to recommend various actions using predictions on the basis of known parameters to help decision makers understand likely outcomes. Prescriptive analytics employs a blend of techniques and tools such as algorithms, machine learning, computational modelling procedures, and decision-tree structures to enable automated decision making. Therefore, prescriptive analytics not only anticipates what will happen and when it will happen, but also explains why it will happen, contributing to the significance of a data analyst’s role in an organization.\n\nLearn more from the following resources:",
"links": [ "links": [
{ {

File diff suppressed because one or more lines are too long

@ -137,6 +137,11 @@
"title": "What is hosting?", "title": "What is hosting?",
"description": "Web hosting is an online service that allows you to publish your website files onto the internet. So, anyone who has access to the internet has access to your website.\n\nVisit the following resources to learn more:", "description": "Web hosting is an online service that allows you to publish your website files onto the internet. So, anyone who has access to the internet has access to your website.\n\nVisit the following resources to learn more:",
"links": [ "links": [
{
"title": "Web Hosting Explained for Beginners",
"url": "https://www.hostinger.com/tutorials/what-is-web-hosting/",
"type": "article"
},
{ {
"title": "What Is Web Hosting? Explained", "title": "What Is Web Hosting? Explained",
"url": "https://www.youtube.com/watch?v=htbY9-yggB0", "url": "https://www.youtube.com/watch?v=htbY9-yggB0",
@ -542,7 +547,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated JavaScript Roadmap", "title": "Visit Dedicated JavaScript Roadmap",
"url": "/javascript", "url": "https://roadmap.sh/javascript",
"type": "article" "type": "article"
}, },
{ {
@ -972,7 +977,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Angular Roadmap", "title": "Visit Dedicated Angular Roadmap",
"url": "/angular", "url": "https://roadmap.sh/angular",
"type": "article" "type": "article"
}, },
{ {
@ -998,7 +1003,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Vue Roadmap", "title": "Visit Dedicated Vue Roadmap",
"url": "/vue", "url": "https://roadmap.sh/vue",
"type": "article" "type": "article"
}, },
{ {
@ -1039,7 +1044,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated React Roadmap", "title": "Visit Dedicated React Roadmap",
"url": "/react", "url": "https://roadmap.sh/react",
"type": "article" "type": "article"
}, },
{ {
@ -2063,7 +2068,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated React Roadmap", "title": "Visit Dedicated React Roadmap",
"url": "/react", "url": "https://roadmap.sh/react",
"type": "article" "type": "article"
}, },
{ {
@ -2545,7 +2550,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Flutter Roadmap", "title": "Visit Dedicated Flutter Roadmap",
"url": "/flutter", "url": "https://roadmap.sh/flutter",
"type": "article" "type": "article"
}, },
{ {
@ -2680,7 +2685,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Flutter Roadmap", "title": "Visit Dedicated Flutter Roadmap",
"url": "/flutter", "url": "https://roadmap.sh/flutter",
"type": "article" "type": "article"
}, },
{ {

@ -62,7 +62,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated JavaScript Roadmap", "title": "Visit Dedicated JavaScript Roadmap",
"url": "/javascript", "url": "https://roadmap.sh/javascript",
"type": "article" "type": "article"
}, },
{ {
@ -257,7 +257,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated React Roadmap", "title": "Visit Dedicated React Roadmap",
"url": "/react", "url": "https://roadmap.sh/react",
"type": "article" "type": "article"
}, },
{ {
@ -650,7 +650,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated PostgreSQL DBA Roadmap", "title": "Visit Dedicated PostgreSQL DBA Roadmap",
"url": "/postgresql-dba", "url": "https://roadmap.sh/postgresql-dba",
"type": "article" "type": "article"
}, },
{ {

@ -13,6 +13,11 @@
"url": "https://www.datacamp.com/blog/all-about-git", "url": "https://www.datacamp.com/blog/all-about-git",
"type": "article" "type": "article"
}, },
{
"title": "Version Control (Git) - The Missing Semester of Your CS Education",
"url": "https://missing.csail.mit.edu/2020/version-control/",
"type": "article"
},
{ {
"title": "GUI Clients", "title": "GUI Clients",
"url": "https://git-scm.com/downloads/guis", "url": "https://git-scm.com/downloads/guis",
@ -215,6 +220,11 @@
"title": ".gitignore", "title": ".gitignore",
"description": "Ignored files are tracked in a special file named `.gitignore` that is checked in at the root of your repository. There is no explicit git ignore command: instead the `.gitignore` file must be edited and committed by hand when you have new files that you wish to ignore. `.gitignore` files contain patterns that are matched against file names in your repository to determine whether or not they should be ignored.\n\nVisit the following resources to learn more:", "description": "Ignored files are tracked in a special file named `.gitignore` that is checked in at the root of your repository. There is no explicit git ignore command: instead the `.gitignore` file must be edited and committed by hand when you have new files that you wish to ignore. `.gitignore` files contain patterns that are matched against file names in your repository to determine whether or not they should be ignored.\n\nVisit the following resources to learn more:",
"links": [ "links": [
{
"title": "gitignore - A collection of useful .gitignore templates",
"url": "https://github.com/github/gitignore",
"type": "opensource"
},
{ {
"title": "gitignore Documentation", "title": "gitignore Documentation",
"url": "https://git-scm.com/docs/gitignore/en", "url": "https://git-scm.com/docs/gitignore/en",
@ -1427,12 +1437,22 @@
}, },
"BKVA6Q7DXemAYjyQOA0nh": { "BKVA6Q7DXemAYjyQOA0nh": {
"title": "git filter-branch", "title": "git filter-branch",
"description": "You can use `git filter-branch` to rewrite Git revision history by applying custom filters on each revision.\n\n* Filter types: You can modify trees (e.g., removing a file or running a Perl script) or information about each commit.\n* Preserving original data: The command preserves all original commit times, merge information, and other details unless specified otherwise.\n* Rewriting specific branches: Only the positive refs mentioned in the command line are rewritten; if no filters are specified, commits are recommitted without changes.\n\nVisit the following resources to learn more:", "description": "You can use `git filter-branch` to rewrite Git revision history by applying custom filters on each revision.\n\n* Filter types: You can modify trees (e.g., removing a file or running a Perl script) or information about each commit.\n* Preserving original data: The command preserves all original commit times, merge information, and other details unless specified otherwise.\n* Rewriting specific branches: Only the positive refs mentioned in the command line are rewritten; if no filters are specified, commits are recommitted without changes.\n\nNotably, there exists a simpler, safer, and more powerful alternative: `git filter-repo`. This tool is actively promoted by Git and offers a streamlined approach to filtering revisions, making it a preferred choice for rewriting your Git history, especially when managing large repositories.\n\nVisit the following resources to learn more:",
"links": [ "links": [
{ {
"title": "git filter-branch", "title": "git filter-branch",
"url": "https://git-scm.com/docs/git-filter-branch", "url": "https://git-scm.com/docs/git-filter-branch",
"type": "article" "type": "article"
},
{
"title": "git filter-repo",
"url": "https://github.com/newren/git-filter-repo",
"type": "article"
},
{
"title": "Removing sensitive data from a repository",
"url": "https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository",
"type": "article"
} }
] ]
}, },
@ -2199,7 +2219,7 @@
}, },
"qrdOARfqGPF9xhF6snbAn": { "qrdOARfqGPF9xhF6snbAn": {
"title": "OAuth Apps", "title": "OAuth Apps",
"description": "GitHub OAuth Apps are a way to integrate with the GitHub platform using OAuth authentication. They allow developers to create custom integrations that can automate tasks, provide real-time notifications, and build custom workflows.\n\nVisit the following resources to learn more:", "description": "GitHub OAuth Apps allow developers to integrate with GitHub using OAuth 2.0 authentication. They enable secure, token-based access to specific GitHub resources like repositories, issues, and pull requests. OAuth Apps can automate tasks, personalize interactions, and provide real-time notifications through webhooks, all while allowing users to approve only the necessary permissions without sharing their credentials.\n\nVisit the following resources to learn more:",
"links": [ "links": [
{ {
"title": "Creating an OAuth app", "title": "Creating an OAuth app",

@ -965,6 +965,11 @@
"title": "SwiftUI", "title": "SwiftUI",
"description": "SwiftUI is Apple's modern declarative framework for building user interfaces across all Apple platforms. Introduced in 2019, it allows developers to create UIs using Swift code, describing the desired layout and behavior rather than implementing them imperatively. SwiftUI offers a more concise and intuitive approach to UI development, with features like automatic support for Dark Mode, dynamic type, and localization. It uses a state-driven approach, automatically updating the UI when underlying data changes. While newer than UIKit, SwiftUI is rapidly evolving and gaining adoption, offering seamless integration with UIKit when needed.\n\nLearn more from the following resources:", "description": "SwiftUI is Apple's modern declarative framework for building user interfaces across all Apple platforms. Introduced in 2019, it allows developers to create UIs using Swift code, describing the desired layout and behavior rather than implementing them imperatively. SwiftUI offers a more concise and intuitive approach to UI development, with features like automatic support for Dark Mode, dynamic type, and localization. It uses a state-driven approach, automatically updating the UI when underlying data changes. While newer than UIKit, SwiftUI is rapidly evolving and gaining adoption, offering seamless integration with UIKit when needed.\n\nLearn more from the following resources:",
"links": [ "links": [
{
"title": "HackingWithSwift - 100 Days of SwiftUI",
"url": "https://www.hackingwithswift.com/100/swiftui",
"type": "course"
},
{ {
"title": "SwiftUI Documentation", "title": "SwiftUI Documentation",
"url": "https://developer.apple.com/xcode/swiftui/", "url": "https://developer.apple.com/xcode/swiftui/",

@ -503,7 +503,7 @@
}, },
"R6ICrk6vjoBxx5nRGo4Jg": { "R6ICrk6vjoBxx5nRGo4Jg": {
"title": "Symbol", "title": "Symbol",
"description": "Symbols are a unique and immutable primitive data type in JavaScript, introduced in ECMAScript 6 (ES6). They are often used to create unique property keys for objects, ensuring that no property key collisions occur. Each Symbol value is unique, even if created with the same description. Symbols can be created using the Symbol() function, and their primary use case is to add hidden or special properties to objects that won’t interfere with other properties or methods.\n\nLearn more from the following resources:", "description": "Symbols are a unique and immutable primitive data type in JavaScript, introduced in ECMAScript 6 (ES6). They are often used to create unique property keys for objects, ensuring no property key collisions occur. Each Symbol value is distinct, even when multiple are created with the same description. Symbols can be created using the Symbol() function, and their primary use case is to add hidden or special properties to objects that won’t interfere with other properties or methods.\n\nLearn more from the following resources:",
"links": [ "links": [
{ {
"title": "Symbol data type in JavaScript", "title": "Symbol data type in JavaScript",
@ -514,6 +514,16 @@
"title": "Symbol type", "title": "Symbol type",
"url": "https://javascript.info/symbol", "url": "https://javascript.info/symbol",
"type": "article" "type": "article"
},
{
"title": "Symbol",
"url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol",
"type": "article"
},
{
"title": "Symbols in Javascript",
"url": "https://www.youtube.com/watch?v=E5Bblr-SFbA",
"type": "video"
} }
] ]
}, },

@ -36,7 +36,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Go Roadmap", "title": "Visit Dedicated Go Roadmap",
"url": "/golang", "url": "https://roadmap.sh/golang",
"type": "article" "type": "article"
}, },
{ {
@ -351,8 +351,13 @@
}, },
"UljuqA89_SlCSDWWMD_C_": { "UljuqA89_SlCSDWWMD_C_": {
"title": "Spark", "title": "Spark",
"description": "Apache Spark is an open-source distributed computing system used for big data processing and analytics. It provides an interface for programming entire clusters with implicit data parallelism and fault tolerance.\n\nVisit the following resources to learn more:", "description": "Apache Spark is an open-source distributed computing system designed for big data processing and analytics. It offers a unified interface for programming entire clusters, enabling efficient handling of large-scale data with built-in support for data parallelism and fault tolerance. Spark excels in processing tasks like batch processing, real-time data streaming, machine learning, and graph processing. It’s known for its speed, ease of use, and ability to process data in-memory, significantly outperforming traditional MapReduce systems. Spark is widely used in big data ecosystems for its scalability and versatility across various data processing tasks.\n\nVisit the following resources to learn more:",
"links": [ "links": [
{
"title": "ApacheSpark",
"url": "https://spark.apache.org/documentation.html",
"type": "article"
},
{ {
"title": "Spark By Examples", "title": "Spark By Examples",
"url": "https://sparkbyexamples.com", "url": "https://sparkbyexamples.com",
@ -388,7 +393,7 @@
}, },
"o6GQ3-8DgDtHzdX6yeg1w": { "o6GQ3-8DgDtHzdX6yeg1w": {
"title": "Flink", "title": "Flink",
"description": "Apache Flink is a distributed stream processing framework that is used to process large amounts of data in real-time. It is designed to be highly scalable and fault-tolerant. Flink is built on top of the Apache Kafka messaging system and is used to process data streams in real-time.\n\nVisit the following resources to learn more:", "description": "Apache Flink is an open-source stream processing framework designed for real-time and batch data processing with low latency and high throughput. It supports event time processing, fault tolerance, and stateful operations, making it ideal for applications like real-time analytics, fraud detection, and event-driven systems. Flink is highly scalable, integrates with various data systems, and is widely used in industries for large-scale, real-time data processing tasks.\n\nVisit the following resources to learn more:",
"links": [ "links": [
{ {
"title": "Apache Flink Documentation", "title": "Apache Flink Documentation",
@ -399,6 +404,11 @@
"title": "Explore top posts about Apache Flink", "title": "Explore top posts about Apache Flink",
"url": "https://app.daily.dev/tags/apache-flink?ref=roadmapsh", "url": "https://app.daily.dev/tags/apache-flink?ref=roadmapsh",
"type": "article" "type": "article"
},
{
"title": "Apache Flink Tutorialpoint",
"url": "https://www.tutorialspoint.com/apache_flink/apache_flink_introduction.htm",
"type": "article"
} }
] ]
}, },

@ -2085,7 +2085,58 @@
}, },
"M62lAWBOrTe99TfpFOQ-Y": { "M62lAWBOrTe99TfpFOQ-Y": {
"title": "Common Built-in Modules", "title": "Common Built-in Modules",
"description": "These are the common modules that come with `Node.js` out of the box. This module provides tools or APIs for performing out certain standard `Node.js` operations. like interacting with the file system, url parsing, or logging information to the console.", "description": "These are the core modules that come with `Node.js` out of the box. This module provides tools or APIs for performing out certain standard `Node.js` operations. like interacting with the file system, url parsing, or logging information to the console.\n\nLearn more from the following resources:",
"links": [] "links": [
{
"title": "Nodejs fs module",
"url": "https://nodejs.org/api/fs.html",
"type": "article"
},
{
"title": "Nodejs url module",
"url": "https://nodejs.org/api/url.html",
"type": "article"
},
{
"title": "Nodejs console module",
"url": "https://nodejs.org/api/console.html",
"type": "article"
},
{
"title": "Nodejs util module",
"url": "https://nodejs.org/api/util.html",
"type": "article"
},
{
"title": "Nodejs events module",
"url": "https://nodejs.org/api/events.html",
"type": "article"
},
{
"title": "Nodejs os module",
"url": "https://nodejs.org/api/os.html",
"type": "article"
},
{
"title": "Nodejs worker threads module",
"url": "https://nodejs.org/api/worker_threads.html",
"type": "article"
},
{
"title": "Nodejs child process module",
"url": "https://nodejs.org/api/child_process.html",
"type": "article"
},
{
"title": "Nodejs process object",
"url": "https://nodejs.org/api/process.html",
"type": "article"
},
{
"title": "Nodejs crypto module",
"url": "https://nodejs.org/api/crypto.html",
"type": "article"
}
]
} }
} }

@ -550,7 +550,7 @@
"description": "PostgreSQL offers a comprehensive set of data types to cater to diverse data needs, including numeric types like `INTEGER`, `FLOAT`, and `SERIAL` for auto-incrementing fields; character types such as `VARCHAR` and `TEXT` for variable-length text; and temporal types like `DATE`, `TIME`, and `TIMESTAMP` for handling date and time data. Additionally, PostgreSQL supports `BOOLEAN` for true/false values, `ENUM` for enumerated lists, and composite types for complex structures. It also excels with `JSON` and `JSONB` for storing and querying semi-structured data, arrays for storing multiple values in a single field, and geometric types for spatial data. These data types ensure flexibility and robust data management for various applications.\n\nLearn more from the following resources:", "description": "PostgreSQL offers a comprehensive set of data types to cater to diverse data needs, including numeric types like `INTEGER`, `FLOAT`, and `SERIAL` for auto-incrementing fields; character types such as `VARCHAR` and `TEXT` for variable-length text; and temporal types like `DATE`, `TIME`, and `TIMESTAMP` for handling date and time data. Additionally, PostgreSQL supports `BOOLEAN` for true/false values, `ENUM` for enumerated lists, and composite types for complex structures. It also excels with `JSON` and `JSONB` for storing and querying semi-structured data, arrays for storing multiple values in a single field, and geometric types for spatial data. These data types ensure flexibility and robust data management for various applications.\n\nLearn more from the following resources:",
"links": [ "links": [
{ {
"title": "", "title": "PostgreSQL® Data Types: Mappings to SQL, JDBC, and Java Data Types",
"url": "https://www.instaclustr.com/blog/postgresql-data-types-mappings-to-sql-jdbc-and-java-data-types/", "url": "https://www.instaclustr.com/blog/postgresql-data-types-mappings-to-sql-jdbc-and-java-data-types/",
"type": "article" "type": "article"
}, },
@ -866,7 +866,7 @@
"type": "article" "type": "article"
}, },
{ {
"title": "Query Planning@", "title": "Query Planning",
"url": "https://www.postgresql.org/docs/current/runtime-config-query.html", "url": "https://www.postgresql.org/docs/current/runtime-config-query.html",
"type": "article" "type": "article"
} }
@ -2091,6 +2091,16 @@
"url": "https://www.postgresql.org/docs/8.1/triggers.html", "url": "https://www.postgresql.org/docs/8.1/triggers.html",
"type": "article" "type": "article"
}, },
{
"title": "PostgreSQL Triggers",
"url": "https://www.postgresqltutorial.com/postgresql-triggers/",
"type": "article"
},
{
"title": "Understanding PostgreSQL Triggers",
"url": "https://hevodata.com/learn/postgresql-triggers/",
"type": "article"
},
{ {
"title": "Using PostgreSQL triggers to automate processes with Supabase", "title": "Using PostgreSQL triggers to automate processes with Supabase",
"url": "https://www.youtube.com/watch?v=0N6M5BBe9AE", "url": "https://www.youtube.com/watch?v=0N6M5BBe9AE",

@ -1120,7 +1120,7 @@
] ]
}, },
"_IXXTSwQOgYzYIUuKVWNE": { "_IXXTSwQOgYzYIUuKVWNE": {
"title": "virutalenv", "title": "virtualenv",
"description": "`virtualenv` is a tool to create isolated Python environments. It creates a folder which contains all the necessary executables to use the packages that a Python project would need.\n\nLearn more about `virtualenv` by visiting the following resources:", "description": "`virtualenv` is a tool to create isolated Python environments. It creates a folder which contains all the necessary executables to use the packages that a Python project would need.\n\nLearn more about `virtualenv` by visiting the following resources:",
"links": [ "links": [
{ {

@ -0,0 +1,812 @@
{
"-3pADOHMDQ0H6ZKNjURyn": {
"title": "What is Redis?",
"description": "",
"links": []
},
"M-EXrTDeAEMz_IkEi-ab4": {
"title": "In-memory Data Structure Store",
"description": "",
"links": []
},
"l2aXyO3STnhbFjvUXPpm2": {
"title": "Key-value Database",
"description": "",
"links": []
},
"eHuBz_zSZK3rubn7nkd7g": {
"title": "Cache",
"description": "",
"links": []
},
"mgGJTBU8ofvOzl9gYWhnG": {
"title": "Message Broker",
"description": "",
"links": []
},
"-TjnSOY8txYrhhxRV1OIl": {
"title": "Caching",
"description": "",
"links": []
},
"bVJASI7bfSYqYnNhX83ng": {
"title": "Real-time Analytics",
"description": "",
"links": []
},
"URxGmhZHr0Y8nyrYj0gJl": {
"title": "Session Management",
"description": "",
"links": []
},
"ZCyId3aIoLv3duxoJdk2P": {
"title": "Pub/Sub Messaging",
"description": "",
"links": []
},
"Fv1iGX22sApIEifM2IpJz": {
"title": "Leaderboards and Counters",
"description": "",
"links": []
},
"8uRpPJ0iD4XnQPKruQc8P": {
"title": "Data Persistence Options",
"description": "",
"links": []
},
"uVewcyaFi1Pt2Gs0KrkfA": {
"title": "Rich Data Structures",
"description": "",
"links": []
},
"5-3pd4rLDqRzMzSRVLdXh": {
"title": "High Performance and Scalability",
"description": "",
"links": []
},
"EvWiEx_AoxAht6sKxzW2l": {
"title": "Redis vs SQL/NoSQL DBs",
"description": "",
"links": []
},
"1Af5H0BgdAsRdBCNdHz5v": {
"title": "When to choose Redis?",
"description": "",
"links": []
},
"Bf_kLfmy7_uflqC9N0-jt": {
"title": "Using Package Managers",
"description": "",
"links": []
},
"yBZ79s6mzGdj5AnX2H_Hy": {
"title": "Pre-compiled Binaries",
"description": "",
"links": []
},
"TDxv0q7jlZ26uZYYlneem": {
"title": "Using Docker",
"description": "",
"links": []
},
"43LvShQhmoWQ8Nye7fLkz": {
"title": "Starting the Server",
"description": "",
"links": []
},
"BOGXTjmCLo6WI6mYDsqRu": {
"title": "Connecting using Redis CLI",
"description": "",
"links": []
},
"NhcZM4nUQoSBBf_1qXi6l": {
"title": "Basic Commands / SET, GET",
"description": "",
"links": []
},
"DOdNkTY1yIMipWA2CD9xH": {
"title": "Settings and Getting Keys",
"description": "",
"links": []
},
"lV_MnUNTB2h925idX0YWk": {
"title": "DEL",
"description": "",
"links": []
},
"U84XgBFPyIbY0W5afH4cx": {
"title": "Overview of Data Types",
"description": "",
"links": []
},
"ltF4vCT9ZA2XuUuHnuGnN": {
"title": "SET",
"description": "",
"links": []
},
"mQc4H2ZMMSVjh33LJY8mK": {
"title": "GET",
"description": "",
"links": []
},
"5K9qyC4mrhXYWOC8WSq8C": {
"title": "INCR",
"description": "",
"links": []
},
"t4BXPofF8OCqH5KHwdYVh": {
"title": "DECR",
"description": "",
"links": []
},
"cPWd53BO6tm-uy4gqLdtZ": {
"title": "APPEND",
"description": "",
"links": []
},
"eJQW986HM4Wf1o1i2FnXs": {
"title": "STRLEN",
"description": "",
"links": []
},
"0v8uLWRCbAqEmKKdYaRQW": {
"title": "More Commands",
"description": "",
"links": []
},
"2_E2VwbjTgk4xxTFWfHuV": {
"title": "Usecases",
"description": "",
"links": []
},
"nS0DHhfy4wxHItgOFhulA": {
"title": "EXPR",
"description": "",
"links": []
},
"Vll7VMmGWSI5XGZ9JpHyl": {
"title": "TTL",
"description": "",
"links": []
},
"Kq7G89KaZZMFkrH-9WZoS": {
"title": "LPUSH",
"description": "",
"links": []
},
"jC8G1o7yFj7D_PGmOIgcD": {
"title": "RPUSH",
"description": "",
"links": []
},
"voa61RTWMJD3Sk8DNJoVQ": {
"title": "LPOP",
"description": "",
"links": []
},
"brUGqWZ287EWtvl9uUbNt": {
"title": "RPOP",
"description": "",
"links": []
},
"8JTtBy6oD2wFYDizVkcVa": {
"title": "LRANGE",
"description": "",
"links": []
},
"hBFEUXtuzUTzWZKp2qWaZ": {
"title": "LINDEX",
"description": "",
"links": []
},
"4oCcP9FxDJSDMHCEVBCNa": {
"title": "LLEN",
"description": "",
"links": []
},
"9KvHcS5F4Jj5ZXgIAdOQY": {
"title": "LMOVE",
"description": "",
"links": []
},
"eBeEUYY-IL_CMkcm31lUL": {
"title": "More Commands",
"description": "",
"links": []
},
"XTwNCCtzXvZMdaex4gZEh": {
"title": "Usecases",
"description": "",
"links": []
},
"Qgkpr9vf9d6-vUg1o8XFj": {
"title": "Sets",
"description": "",
"links": []
},
"xUKoQps69FFQrJeuhD1pz": {
"title": "SADD",
"description": "",
"links": []
},
"mQ0ILns53n1By0Tq6xSZI": {
"title": "SMEMBERS",
"description": "",
"links": []
},
"WQWVL5GT_scHdgfCtI7WT": {
"title": "SREM",
"description": "",
"links": []
},
"Ji5ghlcGJtlmErHFqVf3d": {
"title": "SISMEMBER",
"description": "",
"links": []
},
"5aLfNBewK4Dx017qVNO3T": {
"title": "SINTER",
"description": "",
"links": []
},
"2gZL4a9aWGKWLa89iyHTc": {
"title": "SCARD",
"description": "",
"links": []
},
"6QoYa-N2BKNBaRtvNeVNm": {
"title": "SUNION",
"description": "",
"links": []
},
"JX5ajmcUmkshTO-mLF8lH": {
"title": "SDIFF",
"description": "",
"links": []
},
"2SG4Hr9Tuv6cxmGkrKjYZ": {
"title": "More Commands",
"description": "",
"links": []
},
"3hayYoSZepw7pppBubotg": {
"title": "Usecases",
"description": "",
"links": []
},
"b48EUyFGUeSjtT5fOa_m6": {
"title": "More Commands",
"description": "",
"links": []
},
"Wl23Jh-ASJOQ850yjaTIU": {
"title": "Strings",
"description": "",
"links": []
},
"4-C4XqACUp4nvcMIj6djF": {
"title": "Lists",
"description": "",
"links": []
},
"wY46Qj5Inw_ClBNI9PB_2": {
"title": "Hashes",
"description": "",
"links": []
},
"BOJzn9SWad9oRRdY_ub01": {
"title": "HSET",
"description": "",
"links": []
},
"MsKg9m5jFwHM2Bzjf-vdu": {
"title": "HGET",
"description": "",
"links": []
},
"TpR33sJ-tAjeG3jpGTvYR": {
"title": "HGETALL",
"description": "",
"links": []
},
"E7xFZkqqbzokD5KGTn9zJ": {
"title": "HDEL",
"description": "",
"links": []
},
"adhLMuSmfYMRyWTwIgnyE": {
"title": "HEXISTS",
"description": "",
"links": []
},
"jtVnUD-na-WffMaS8qYfu": {
"title": "Usecases",
"description": "",
"links": []
},
"QTbkWZ7BpqYmBhUivccPu": {
"title": "Sorted Sets",
"description": "",
"links": []
},
"0swsBD0sOY-o5lzibT999": {
"title": "ZADD",
"description": "",
"links": []
},
"3pFChX6YIItrBz9lxu4XM": {
"title": "ZRANGE",
"description": "",
"links": []
},
"OlbixGa5RmdqEt7snY04j": {
"title": "ZRANGEBYSCORE",
"description": "",
"links": []
},
"m0FZDPwNE71zcwM_gUwz0": {
"title": "ZREM",
"description": "",
"links": []
},
"W4v7FIQr2k-Vbm-HdfKog": {
"title": "ZINCRBY",
"description": "",
"links": []
},
"AF_kWM4V8n5Ux06IgEVTl": {
"title": "ZRANK",
"description": "",
"links": []
},
"O-fZM_U-tW0pYtNzN_8Ax": {
"title": "ZCOUNT",
"description": "",
"links": []
},
"P6TDUCroLlEI7qePBFHIH": {
"title": "More Commands",
"description": "",
"links": []
},
"lxevY15ZyP43s_JrEqMX7": {
"title": "Usecases",
"description": "",
"links": []
},
"o6e_CwxfPoU6qkfWkwKwj": {
"title": "More Commands",
"description": "",
"links": []
},
"jCaVx5wvsvuyqtwh6m8si": {
"title": "Naming Conventions",
"description": "",
"links": []
},
"UlQHqw1dbxZnAKbsWsOgU": {
"title": "Retrieval by Pattern",
"description": "",
"links": []
},
"OSIYDYPGz8Vgo9SU9GGH9": {
"title": "Expiration",
"description": "",
"links": []
},
"jrgaoDnt_RxTu79hk4hCD": {
"title": "Atomicity in Redis",
"description": "",
"links": []
},
"LHlwjN3WHYUBUafzzwsWQ": {
"title": "Pipelining",
"description": "",
"links": []
},
"7JzeyTrkZ_1_yxMVrqvZU": {
"title": "Batch Operations",
"description": "",
"links": []
},
"0Q3AkE8leWAyYsww3-BHX": {
"title": "Bitmaps",
"description": "",
"links": []
},
"B-YUFhPQNdr1KZNupmR5N": {
"title": "SETBIT",
"description": "",
"links": []
},
"0HFLJfcrcSnAVTecG3P8W": {
"title": "GETBIT",
"description": "",
"links": []
},
"jpcyXSSib7q4WBPmpgnXA": {
"title": "BITCOUNT",
"description": "",
"links": []
},
"tkrxArg_oYH0aQfM8NkD2": {
"title": "BITOP",
"description": "",
"links": []
},
"Df1Eu7CuA-ARYii9JVvnm": {
"title": "BITPOS",
"description": "",
"links": []
},
"s7PEr-5TAm5EGJm0RSjPJ": {
"title": "Usecases",
"description": "",
"links": []
},
"cszjT3YK8oyhGpqLTQzwX": {
"title": "HyperLogLog",
"description": "",
"links": []
},
"8a4DmPZrX2xGZ7zdWxS63": {
"title": "PFADD",
"description": "",
"links": []
},
"JWT30KIJQHVw0MXI5sGR6": {
"title": "PFCOUNT",
"description": "",
"links": []
},
"s50jr_XOUcxh65-tGCKf5": {
"title": "PFMERGE",
"description": "",
"links": []
},
"XPeCvikPuu6EJ8UcOLGPh": {
"title": "Usecases",
"description": "",
"links": []
},
"zXs_9n2yEb_eVi0WuOQKH": {
"title": "Streams",
"description": "",
"links": []
},
"7isWhgrUA6M5IGM2U2tm4": {
"title": "XADD",
"description": "",
"links": []
},
"4sKiAtX5aIL4NDsQkilNC": {
"title": "XREAD",
"description": "",
"links": []
},
"CiYFuYE8XudZkR6AW2NQ7": {
"title": "XRANGE",
"description": "",
"links": []
},
"DQJCMEw13lELcw_AwLfrT": {
"title": "XLEN",
"description": "",
"links": []
},
"zXlSBfa-Gi9_GhSYEzre3": {
"title": "Usecases",
"description": "",
"links": []
},
"4-z4hDKm86qQatYnmE21R": {
"title": "More Commands",
"description": "",
"links": []
},
"_NiUdVQ85qnvryI38k_vQ": {
"title": "Geospatial Indexes",
"description": "",
"links": []
},
"U3N1EgHFs1-YUaB_VrJfw": {
"title": "GEOADD",
"description": "",
"links": []
},
"OWWDLuGTbdNwME7v2jxVP": {
"title": "GEOSEARCH",
"description": "",
"links": []
},
"GNMjrLPkpTphneoQ0GoZF": {
"title": "Usecases",
"description": "",
"links": []
},
"FCbdKnkI1ZHGekT6yiGua": {
"title": "More Commands",
"description": "",
"links": []
},
"9W_jaK1DSEZHRKdPcUM7h": {
"title": "Pub/Sub",
"description": "",
"links": []
},
"55BCntuWlaQiLPqNtb-2i": {
"title": "SUBSCRIBE",
"description": "",
"links": []
},
"5gkZzm2F4vu6IxUoJLYbK": {
"title": "UNSUBSCRIBE",
"description": "",
"links": []
},
"gIPo-2CNqE1BsOaDzmkCU": {
"title": "PUBLISH",
"description": "",
"links": []
},
"V-d6q-3Sf0dl5v8xiCQwl": {
"title": "More Commands",
"description": "",
"links": []
},
"MvyE_JUJej0UB9xe8Anfj": {
"title": "Usecases",
"description": "",
"links": []
},
"YHbWlKrQqptUDbaQVy0_A": {
"title": "Transactions",
"description": "",
"links": []
},
"c-y5Eck8VtSyIf8RAW9p7": {
"title": "WATCH",
"description": "",
"links": []
},
"Ljy-Mc0EBBX4_vXfYZ5-4": {
"title": "EXEC",
"description": "",
"links": []
},
"U6hST1MkS16T2CHV3-Ise": {
"title": "MULTI",
"description": "",
"links": []
},
"msW0Wd2H-6FFNDnjC64t-": {
"title": "Optimistic Locking",
"description": "",
"links": []
},
"Veb30QrPYNjUn13dtGbUr": {
"title": "Lua Scripting",
"description": "",
"links": []
},
"rjeq3i9oX8IGyQzo--L3c": {
"title": "EVAL",
"description": "",
"links": []
},
"3X0x_PcJGWBVPL-LSVAln": {
"title": "EVALSHA",
"description": "",
"links": []
},
"kF_nGo845XDwLkwcQt008": {
"title": "Usecases",
"description": "",
"links": []
},
"bQaek7f3dAaZfSUhwovm1": {
"title": "Persistence Options",
"description": "",
"links": []
},
"D3pZdAjwPFMRxX1-iyu5-": {
"title": "How RDB Works?",
"description": "",
"links": []
},
"_pb2DPrFUUZabKxWsuFUo": {
"title": "Configuring Save Interval",
"description": "",
"links": []
},
"Z6yJwUkcDX08HoMyf1LwX": {
"title": "Usecases / Best Practices",
"description": "",
"links": []
},
"PTj6oxvpw8vP295WvAI80": {
"title": "How AOF Works?",
"description": "",
"links": []
},
"ibaZ34-laQtUyxAsERi7o": {
"title": "AOF rewrite & compaction",
"description": "",
"links": []
},
"9ToKTUqbi-NV5Wcwb21PT": {
"title": "Truncation / Corruption",
"description": "",
"links": []
},
"VvOQUO22ZF8VvDSqHENNU": {
"title": "Usecases",
"description": "",
"links": []
},
"vzp7DUpjklzIA0E9WxJQA": {
"title": "Usecases / Best Practices",
"description": "",
"links": []
},
"80035BzcB-fKCvD_3N8zE": {
"title": "No Persistence Option",
"description": "",
"links": []
},
"3S-qqOlfr60HR4VvDr4He": {
"title": "RDB vs AOF Tradeoffs",
"description": "",
"links": []
},
"S5Y26m1oHCQpB-oLCdtac": {
"title": "Hybrid Persistence",
"description": "",
"links": []
},
"rSD8nJ-uNpHJVe5Hn66h7": {
"title": "Replication Basics",
"description": "",
"links": []
},
"nci3OB1NE1zJHUPfZCOpT": {
"title": "Redis Sentinel",
"description": "",
"links": []
},
"AQiCcHS6dBAAAPloxiXub": {
"title": "Clustering",
"description": "",
"links": []
},
"Qy42paiTUsO8HIwbWTMui": {
"title": "Authentication",
"description": "",
"links": []
},
"wsuKH7YwGDV6GYQbdhA4o": {
"title": "Network Security",
"description": "",
"links": []
},
"gdiWwTQg6A-BFHdQBmgmH": {
"title": "SSL/TLS Encryption",
"description": "",
"links": []
},
"q2Jw49QUWCUGIfcEC1bZI": {
"title": "INFO",
"description": "",
"links": []
},
"jBtEiylcedtaE6E20Uk4V": {
"title": "MONITOR",
"description": "",
"links": []
},
"XBPwHgIsXupMsyoOFkJZ0": {
"title": "RedisInsight",
"description": "",
"links": []
},
"y5FPSAi6T-5X9SUfR58_-": {
"title": "RedisCommander",
"description": "",
"links": []
},
"xF0wQYmtwXYkrzvWg5gOO": {
"title": "Memory Management",
"description": "",
"links": []
},
"Sd1ENOXSFCz1YqccXjr2A": {
"title": "Max Memory Policy",
"description": "",
"links": []
},
"yaCWw2KjX58SaPajUAb0d": {
"title": "Slow Log Analysis",
"description": "",
"links": []
},
"kgHwK4N-sfh6dHjd_D_me": {
"title": "redis-benchmark",
"description": "",
"links": []
},
"2p5RF4lVYfRvYTo1Ofm-a": {
"title": "Monitoring",
"description": "",
"links": []
},
"hLIT00Iz7rV56ZBIUhWYn": {
"title": "Redis Modules",
"description": "",
"links": []
},
"jicsfYw56VrbRUt7M8c85": {
"title": "RedisJSON",
"description": "",
"links": []
},
"_GdTXcJO8uJlhPdfrmeXG": {
"title": "Search",
"description": "",
"links": []
},
"RBr8opWSh2TKXC8Fmdg0j": {
"title": "RedisTimeSeries",
"description": "",
"links": []
},
"GwVL5CvbnHsiWb1hVh7lK": {
"title": "RedisBloom",
"description": "",
"links": []
},
"giyKPtQ-pziA064P8OQD-": {
"title": "redis.conf",
"description": "",
"links": []
},
"wXRDsNGFckXV_CSiit5sN": {
"title": "Backup and Recovery",
"description": "",
"links": []
},
"Cb-KazR4PuR86VX5oT0zi": {
"title": "Upgrading Redis",
"description": "",
"links": []
},
"nUIfTkgm3PlSiqgun1BS7": {
"title": "Disaster Recovery",
"description": "",
"links": []
},
"8lyXDuZJ-KHl4v2_8Ew1h": {
"title": "Redis Enterprise",
"description": "",
"links": []
},
"cybF72wlJyJbHLUjitLvn": {
"title": "Active-Active geo Distribution",
"description": "",
"links": []
},
"sWOFnbh2EyaHRzquz1UeF": {
"title": "Redis on Flash",
"description": "",
"links": []
},
"ujs77bV8g8-FOm5hBtZFd": {
"title": "Security and Compliance",
"description": "",
"links": []
},
"JlLwy69eQ1bPHAOOJNqjo": {
"title": "When to consider enterprise?",
"description": "",
"links": []
}
}

@ -148,7 +148,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Java Roadmap", "title": "Visit Dedicated Java Roadmap",
"url": "/java", "url": "https://roadmap.sh/java",
"type": "article" "type": "article"
}, },
{ {
@ -184,7 +184,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Python Roadmap", "title": "Visit Dedicated Python Roadmap",
"url": "/python", "url": "https://roadmap.sh/python",
"type": "article" "type": "article"
}, },
{ {
@ -246,7 +246,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated Go Roadmap", "title": "Visit Dedicated Go Roadmap",
"url": "/golang", "url": "https://roadmap.sh/golang",
"type": "article" "type": "article"
}, },
{ {
@ -282,7 +282,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated JavaScript Roadmap", "title": "Visit Dedicated JavaScript Roadmap",
"url": "/javascript", "url": "https://roadmap.sh/javascript",
"type": "article" "type": "article"
}, },
{ {
@ -1177,7 +1177,7 @@
"links": [ "links": [
{ {
"title": "Visit Dedicated React Roadmap", "title": "Visit Dedicated React Roadmap",
"url": "/react", "url": "https://roadmap.sh/react",
"type": "article" "type": "article"
}, },
{ {

@ -1258,7 +1258,7 @@
"links": [ "links": [
{ {
"title": "SQL Server Indexes", "title": "SQL Server Indexes",
"url": "https://www.sqlservercentral.com/articles/sql-server-indexes", "url": "https://www.sqlservercentral.com/articles/introduction-to-indexes",
"type": "article" "type": "article"
}, },
{ {

@ -449,8 +449,14 @@
}, },
"fm8oUyNvfdGWTgLsYANUr": { "fm8oUyNvfdGWTgLsYANUr": {
"title": "Environment Variables", "title": "Environment Variables",
"description": "", "description": "Environment variables can be used to customize various aspects of Terraform. You can set these variables to change the default behaviour of terraform such as increase verbosity, update log file path, set workspace, etc. Envrionment variables are optional and terraform does not need them by default.\n\nLearn more from the following resources:",
"links": [] "links": [
{
"title": "Environment Variables",
"url": "https://developer.hashicorp.com/terraform/cli/config/environment-variables",
"type": "article"
}
]
}, },
"rdphcVd-Vq972y4H8CxIj": { "rdphcVd-Vq972y4H8CxIj": {
"title": "Variable Definition File", "title": "Variable Definition File",
@ -470,8 +476,14 @@
}, },
"U2n2BtyUrOFLnw9SZYV_w": { "U2n2BtyUrOFLnw9SZYV_w": {
"title": "Validation Rules", "title": "Validation Rules",
"description": "", "description": "Validation rules can be used to specify custom validations to a variable. The motive of adding validation rules is to make the variable comply with the rules. The validation rules can be added using a `validation` block.\n\nLearn more from the following resources:",
"links": [] "links": [
{
"title": "Custom Validation Rules",
"url": "https://developer.hashicorp.com/terraform/language/values/variables#custom-validation-rules",
"type": "article"
}
]
}, },
"1mFih8uFs3Lc-1PLgwiAU": { "1mFih8uFs3Lc-1PLgwiAU": {
"title": "Local Values", "title": "Local Values",

@ -53,7 +53,7 @@
}, },
"2NlgbLeLBYwZX2u2rKkIO": { "2NlgbLeLBYwZX2u2rKkIO": {
"title": "BJ Fogg's Behavior Model", "title": "BJ Fogg's Behavior Model",
"description": "B.J. Fogg, a renowned psychologist, and researcher at Stanford University, proposed the [Fogg Behavior Model (FBM)](https://www.behaviormodel.org/). This insightful model helps UX designers understand and influence user behavior by focusing on three core elements. These key factors are motivation, ability, and triggers.\n\n* **Motivation**: This element emphasizes the user's desire to perform a certain action or attain specific outcomes. Motivation can be linked to three core elements specified as sensation (pleasure/pain), anticipation (hope/fear), and social cohesion (belonging/rejection).\n \n* **Ability**: Ability refers to the user's capacity, both physical and mental, to perform desired actions. To enhance the ability of users, UX designers should follow the principle of simplicity. The easier it is to perform an action, the more likely users will engage with the product. Some factors to consider are time, financial resources, physical efforts, and cognitive load.\n \n* **Triggers**: Triggers are the cues, notifications, or prompts that signal users to take an action. For an action to occur, triggers should be presented at the right time when the user has adequate motivation and ability.\n \n\nUX designers should strive to find the balance between these three factors to facilitate the desired user behavior. By understanding your audience and their needs, implementing clear and concise triggers, and minimizing the effort required for action, the FBM can be an effective tool for designing user-centered products.", "description": "B.J. Fogg, a renowned psychologist, and researcher at Stanford University, proposed the [Fogg Behavior Model (FBM)](https://www.behaviormodel.org/). This insightful model helps UX designers understand and influence user behavior by focusing on three core elements. These key factors are motivation, ability, and prompts.\n\n* **Motivation**: This element emphasizes the user's desire to perform a certain action or attain specific outcomes. Motivation can be linked to three core elements specified as sensation (pleasure/pain), anticipation (hope/fear), and social cohesion (belonging/rejection).\n \n* **Ability**: Ability refers to the user's capacity, both physical and mental, to perform desired actions. To enhance the ability of users, UX designers should follow the principle of simplicity. The easier it is to perform an action, the more likely users will engage with the product. Some factors to consider are time, financial resources, physical efforts, and cognitive load.\n \n* **Prompts**: Prompts are the cues, notifications, or triggers that signal users to take an action. For an action to occur, prompts should be presented at the right time when the user has adequate motivation and ability.\n \n\nUX designers should strive to find the balance between these three factors to facilitate the desired user behavior. By understanding your audience and their needs, implementing clear and concise prompts, and minimizing the effort required for action, the FBM can be an effective tool for designing user-centered products.",
"links": [ "links": [
{ {
"title": "meaning of BJ fogg's behavior model", "title": "meaning of BJ fogg's behavior model",
@ -64,7 +64,7 @@
}, },
"kcG4IpneJzA6di0uqTiwb": { "kcG4IpneJzA6di0uqTiwb": {
"title": "CREATE Action Funnel", "title": "CREATE Action Funnel",
"description": "Stephen Wendell's Create Action Funnel is a UX design framework focused on converting website visitors into active customers through a systematic and engaging process. The approach emphasizes on understanding user behavior, catering to their needs, and directing them towards specific actions. The Action Funnel consists of four major steps:\n\n* **Establish the Objectives:** Before diving into the design, clearly define the goals you want to achieve through the website or app. Determine what actions you want the users to take (e.g., sign up, make a purchase, share content) and what constitutes a successful conversion.\n \n* **Understand User Mindsets:** Identify your target audience and recognize their needs, preferences, emotions, and pain points. Accomplishing this requires user research, creating personas, storyboarding, and empathy mapping, among other methods.\n \n* **Design the Optimal User Flow:** Craft a seamless and intuitive user journey by designing a clear path from the landing page to the desired action. Prioritize simplicity, usability, and efficiency. Make sure to include meaningful touchpoints and interactions to engage the users and make it easy for them to complete the intended action.\n \n* **Refine and Test the Experience:** Use wireframes and prototypes to test and iteratively refine the user experience. Employ user testing, A/B testing, and analytics to gather insight on user behavior, preferences, and engagement. Continuously use feedback to make improvements, ensuring that the design effectively leads visitors down the action funnel.\n \n\nBy implementing Stephen Wendell's `Create Action Funnel`, you can effectively guide users through an engaging journey that motivates them to become active customers, ultimately increasing conversion rates and overall satisfaction.", "description": "Stephen Wendel's CREATE Action Funnel is a behavioral design framework aimed at helping individuals or organizations encourage specific behaviors in others, especially in the context of product design. It breaks down the process of motivating action into six key stages. Each stage helps identify where users might drop off or face barriers, allowing designers or strategists to address these pain points effectively. These stages are:\n\n* **CUE:** The user must notice a cue or prompt that tells them to act. This could be a notification, a visual element, or any kind of reminder.\n \n* **REACTION:** The user must react positively to the cue. This stage involves emotional and cognitive processing, where the individual decides if the action is relevant or attractive.\n \n* **EVALUATION:** The user evaluates whether the action is worth their time, energy, or resources. They assess the benefits versus the effort required.\n \n* **ABILITY:** The user must feel capable of taking the action. This involves ensuring that the action is easy enough to do and aligns with their skills and resources.\n \n* **TIMING:** The action needs to happen at the right time. Users need to have the opportunity and be in the right context to act.\n \n* **EXECUTION:** Finally, the action must be carried out successfully. This is the stage where the behavior is completed.\n \n\nThe CREATE Action Funnel is helpful for product designers, marketers, or behavior change professionals, as it provides a structured way to understand user actions and design interventions to improve completion rates. It identifies and solves the gaps that occur between intention and action.",
"links": [ "links": [
{ {
"title": "Behavioral Science Crash Course: Steve Wendel's CREATE Action Funnel", "title": "Behavioral Science Crash Course: Steve Wendel's CREATE Action Funnel",
@ -75,7 +75,7 @@
}, },
"0Df110GZcDw5wbAe1eKoA": { "0Df110GZcDw5wbAe1eKoA": {
"title": "Spectrum of Thinking Interventions", "title": "Spectrum of Thinking Interventions",
"description": "The _Spectrum of Thinking Interventions_ provides a structure to guide your UX design process, helping you identify the types and range of thinking interventions that the user may require. This spectrum encompasses four primary categories: guidance, explanation, exploration, and creation.\n\nGuidance\n--------\n\nGuidance-based interventions are designed to help users navigate through a digital product or service with minimal effort. They may be aimed at full-fledged beginners, casual users, or experts in their respective domains. Such interventions may include signposts, tooltips, and clearly articulated labels.\n\n_Examples:_\n\n* Visual cues (e.g., icons, colors)\n* Signposting (e.g., breadcrumbs)\n* In-context information (e.g., tool tips, hints)\n\nExplanation\n-----------\n\nExplanation-based interventions provide users with detailed narratives, overviews, or background information that helps them make informed decisions. This may include tutorials, articles, videos, or any other mediums that help explain complex concepts or instructions.\n\n_Examples:_\n\n* Multimedia tutorials\n* Articles or blog posts\n* Infographics or diagrams\n\nExploration\n-----------\n\nExploration-based interventions encourage users to understand and interact with the product by investigating, asking questions, or searching for solutions on their own. This can be done by providing interactive elements, multiple pathways, and opportunities for discovery.\n\n_Examples:_\n\n* Interactive simulations or models\n* Advanced search capabilities\n* Multiple UI paths for task completion\n\nCreation\n--------\n\nCreation-based interventions engage users by offering them the tools and resources to co-create or customize their experience. This type of intervention often involves a more extensive level of input and involvement from the user as they become active participants in the design process.\n\n_Examples:_\n\n* Customizable user interfaces\n* Allowing users to create their content\n* Enabling users to manage their preferences, settings, and configurations\n\nWith this spectrum in mind, it is essential as a UX designer to analyze which types of thinking interventions are most relevant to your target users and design the most accessible and effective solutions. Always consider how these interventions will influence users' decision-making processes and their overall satisfaction with your digital product or service.", "description": "The _Spectrum of Thinking Interventions_ provides a structure for understanding the different types of decision-making processes by illustrating how our minds would respond in a _default, lowest energy way_, if we didn't consciously do something different. This spectrum ranges from situations requiring minimal thought to those demanding intensive thinking, and includes the mechanisms (\"interventions\") that our minds will likely use.\n\n* **Habits:** Triggering a learned routine based on familiar cues\n* **Other intuitive responses:** Used in familiar or semi-familiar situations, with responses based on past experiences\n* **Active mindset or self-concept:** Used in ambiguous scenarios with multiple possible interpretations\n* **Heuristics:** Used in situations requiring conscious attention, but where decisions can be made more easily\n* **Focused, conscious calculation:** Used in unfamiliar scenarios or crucial decisions where deliberate focus is needed\n\nWith this spectrum in mind, it is essential as a UX designer to leverage on the mind's decision-making process, analyze which mechanisms are most applicable to your target users and design the most accessible and effective solutions.",
"links": [] "links": []
}, },
"kWA8CvocP1pkom2N7O4gb": { "kWA8CvocP1pkom2N7O4gb": {

@ -242,13 +242,25 @@
}, },
"NCIzs3jbQTv1xXhAaGfZN": { "NCIzs3jbQTv1xXhAaGfZN": {
"title": "v-text", "title": "v-text",
"description": "", "description": "The `v-text` directive is used to set the textContent property of an element. It's important to note that when using this directive it will overwrite the HTML content inside the element. The expected input is a string, so it's important to wrap any text in single quotes.\n\nExample:\n\n <template>\n <p v-text=\"'I am some text'\"></p>\n </template>\n \n\nVisit the following resources to learn more:",
"links": [] "links": [
{
"title": "v-text documentation",
"url": "https://vuejs.org/api/built-in-directives.html#v-text",
"type": "article"
}
]
}, },
"bZxtIBeIfeUcR32LZWrPW": { "bZxtIBeIfeUcR32LZWrPW": {
"title": "v-html", "title": "v-html",
"description": "", "description": "The `v-thml` directive is similar to the `v-text` directive, but the difference is that `v-html` renders its content as HTML. This means that if you pass an HTML element it will be rendered as an element and not plain text. Since the content is render as HTMl, it can pose a security risk if the content contains malicius JavaScript code. For this reason you should never use this directive in combination with user input, unless the input is first properly sanitized.\n\nExample:\n\n <template>\n <p v-html=\"'<h1>Text</h1>'\"></p>\n </template>\n \n\nVisit the following resources to learn more:",
"links": [] "links": [
{
"title": "v-html documentation",
"url": "https://vuejs.org/api/built-in-directives.html#v-html",
"type": "article"
}
]
}, },
"_TlbGTKFCMO0wdLbC6xHX": { "_TlbGTKFCMO0wdLbC6xHX": {
"title": "v-show", "title": "v-show",
@ -285,13 +297,25 @@
}, },
"a9caVhderJaVo0v14w8WB": { "a9caVhderJaVo0v14w8WB": {
"title": "v-else-if", "title": "v-else-if",
"description": "", "description": "This directive is used to add additional conditions to a v-if and v-else block.\n\nVisit the following resources to learn more:",
"links": [] "links": [
{
"title": "v-else-if Documentation",
"url": "https://vuejs.org/api/built-in-directives.html#v-else-if",
"type": "article"
}
]
}, },
"3ftwRjQ9e1-qDT9BV53zr": { "3ftwRjQ9e1-qDT9BV53zr": {
"title": "v-for", "title": "v-for",
"description": "", "description": "The `v-for` directive is used to render an HTML element, a block of elements, or even a component based on an array, an object, or a set number of times. When using this directive it is important to assign a unique key to each item to avoid issues and improve perfomance. This directive follows the `item in items` syntax.\n\nExample:\n\n <script setup>\n import { ref } from 'vue';\n const foods = ref([\n {id: 1, name: \"apple\"},\n {id: 2, name: \"pear\"},\n {id: 3, name: \"pizza\"}\n ]);\n </script>\n \n <template>\n <p v-for=\"food in foods\" :key=\"food.id\">{{ food.name }}</p>\n </template>\n \n\nVisit the following resources to learn more:",
"links": [] "links": [
{
"title": "v-for documentation",
"url": "https://vuejs.org/guide/essentials/list#v-for",
"type": "article"
}
]
}, },
"hVuRmhXVP65IPtuHTORjJ": { "hVuRmhXVP65IPtuHTORjJ": {
"title": "v-on", "title": "v-on",
@ -300,12 +324,18 @@
}, },
"cuM9q9vYy8JpZPGeBffd1": { "cuM9q9vYy8JpZPGeBffd1": {
"title": "v-bind", "title": "v-bind",
"description": "", "description": "The `v-bind` directive dynamically binds an HTML attribute to data.\n\nThe shorthand for this directive is `:`\n\nExample:\n\n <script setup>\n import { ref } from 'vue';\n const image_url = ref(\"path/to/image.png\")\n </script>\n \n <template>\n <img :src=\"image_url\" />\n </template>\n \n\nVisit the following resources for more information:",
"links": [] "links": [
{
"title": "v-bind documentation",
"url": "https://vuejs.org/api/built-in-directives.html#v-bind",
"type": "article"
}
]
}, },
"cxu2Wbt306SxM4JKQQqnL": { "cxu2Wbt306SxM4JKQQqnL": {
"title": "v-model", "title": "v-model",
"description": "The v-model directive in Vue.js is used for creating two-way data bindings on form input elements, such as , , and . This means that the data can be updated in the component when the user inputs something, and the UI will update if the data in the component changes.", "description": "The v-model directive in Vue.js is used for creating two-way data bindings on form input elements, such as `<input>`, `<textarea>`, and `<select>`. This means that the data can be updated in the component when the user inputs something, and the UI will update if the data in the component changes.",
"links": [ "links": [
{ {
"title": "Form Input Bindings", "title": "Form Input Bindings",
@ -316,28 +346,58 @@
}, },
"m9pQ3daR3KiwRATcQysHA": { "m9pQ3daR3KiwRATcQysHA": {
"title": "v-slot", "title": "v-slot",
"description": "", "description": "The v-slot directive to define slots in components, allowing you to pass and render content dynamically inside a component.\n\nFor named slots, you use v-slot with a specific slot name. This lets you pass different content to different parts of a component:\n\n <template>\n <custom-component>\n <template v-slot:header>\n <h1>Header Content</h1>\n </template>\n <template v-slot:footer>\n <p>Footer Content</p>\n </template>\n </custom-component>\n </template>\n \n\nThe shorthand for `v-slot` is `#`, for example `v-slot:header` becomes `#header`.\n\nVisit the following resources to learn more:",
"links": [] "links": [
{
"title": "v-slot documentation",
"url": "https://vuejs.org/api/built-in-directives.html#v-slot",
"type": "article"
}
]
}, },
"5k9CrbzhNy9iiS6ez2UE6": { "5k9CrbzhNy9iiS6ez2UE6": {
"title": "v-once", "title": "v-once",
"description": "", "description": "The `v-once` directive makes an HTML element render only once, skipping every future update.\n\nExample:\n\n <script setup>\n import { ref } from 'vue';\n const input = ref(\"Some Text\");\n </script>\n \n <template>\n <input v-model=\"input\">\n <p v-once>{{ input }}</p>\n </template>\n \n\nIn this example the **p** element will not change its text even if the input variable is changed through the **input** element.\n\nVisit the following resources to learn more:",
"links": [] "links": [
{
"title": "v-once documentation",
"url": "https://vuejs.org/api/built-in-directives.html#v-once",
"type": "article"
}
]
}, },
"mlsrhioiEkqnRIL6O3hNa": { "mlsrhioiEkqnRIL6O3hNa": {
"title": "v-pre", "title": "v-pre",
"description": "", "description": "The `v-pre` directive makes an element render its content as-is, skipping its compilation. The most common use case is when displaying raw mustache syntax.\n\nExample:\n\n <script setup>\n import { ref } from 'vue';\n const text = ref(\"Some Text\")\n </script>\n \n <template>\n <p v-pre >{{ text }}</p>\n </template>\n \n\nThe **p** element will display: `{{ text }}` and not `Some Text` because the compilation is skipped.\n\nVisit the following resources to learn more:",
"links": [] "links": [
{
"title": "v-pre Documentation",
"url": "https://vuejs.org/api/built-in-directives.html#v-pre",
"type": "article"
}
]
}, },
"RrSekP8Ub01coegMwLP6a": { "RrSekP8Ub01coegMwLP6a": {
"title": "v-cloak", "title": "v-cloak",
"description": "", "description": "The v-cloak directive is used to prevent the uncompiled Vue template from being visible while the Vue instance is still loading. It temporarily hides the content until Vue has finished compiling the template\n\nThe v-cloak directive remains until the component instance is mounted.\n\n <div v-cloak>\n {{ message }}\n </div>\n \n\nCombined with CSS, you can hide elements with v-cloak until they are ready.\n\n [v-cloak] {\n display: none;\n }\n \n\nThe `<div>` will not be visible until the compilation is done.\n\nVisit the following resources to learn more:",
"links": [] "links": [
{
"title": "v-cloak documentation",
"url": "https://vuejs.org/api/built-in-directives.html#v-cloak",
"type": "article"
}
]
}, },
"RRPhAxIqvAcjZIcLe_N8-": { "RRPhAxIqvAcjZIcLe_N8-": {
"title": "Optimizing Renders", "title": "Optimizing Renders",
"description": "", "description": "Optimizing rendering is crucial for ensuring a smooth and efficient user experience across all your frontend projects. Sluggish webpages can lead to frustration for users, and potentially cause them to entirely abandon your web application. This issue comes up most often in single-page applications (SPAs), where the entirety of your application is loaded within a single webpage, and updates to it are handled dynamically without needing a full reload of the webpage.\n\nLearn more from the following resources:",
"links": [] "links": [
{
"title": "Optimizing rendering in Vue",
"url": "https://blog.logrocket.com/optimizing-rendering-vue/",
"type": "article"
}
]
}, },
"dxwKfBxd5KYVkfEPMdHp-": { "dxwKfBxd5KYVkfEPMdHp-": {
"title": "Debugging", "title": "Debugging",

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

@ -71,6 +71,7 @@ Here is the list of available roadmaps with more being actively worked upon.
- [Design System Roadmap](https://roadmap.sh/design-system) - [Design System Roadmap](https://roadmap.sh/design-system)
- [PostgreSQL Roadmap](https://roadmap.sh/postgresql-dba) - [PostgreSQL Roadmap](https://roadmap.sh/postgresql-dba)
- [SQL Roadmap](https://roadmap.sh/sql) - [SQL Roadmap](https://roadmap.sh/sql)
- [Redis Roadmap](https://roadmap.sh/redis)
- [Blockchain Roadmap](https://roadmap.sh/blockchain) - [Blockchain Roadmap](https://roadmap.sh/blockchain)
- [ASP.NET Core Roadmap](https://roadmap.sh/aspnet-core) - [ASP.NET Core Roadmap](https://roadmap.sh/aspnet-core)
- [System Design Roadmap](https://roadmap.sh/system-design) - [System Design Roadmap](https://roadmap.sh/system-design)

@ -182,7 +182,12 @@ export function AccountStreak(props: AccountStreakProps) {
</div> </div>
<p className="-mt-[0px] mb-[1.75px] text-center text-xs tracking-wide text-slate-600"> <p className="-mt-[0px] mb-[1.75px] text-center text-xs tracking-wide text-slate-600">
Visit every day to keep your streak alive! Visit every day to keep your streak going!
</p>
<p className='text-xs mt-1.5 text-center'>
<a href="/leaderboard" className="text-purple-400 hover:underline underline-offset-2">
See how you compare to others
</a>
</p> </p>
</div> </div>
</div> </div>

@ -1,6 +1,6 @@
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import type { FormEvent } from 'react'; import type { FormEvent } from 'react';
import { useState } from 'react'; import { useId, useState } from 'react';
import { httpPost } from '../../lib/http'; import { httpPost } from '../../lib/http';
import { TOKEN_COOKIE_NAME, setAuthToken } from '../../lib/jwt'; import { TOKEN_COOKIE_NAME, setAuthToken } from '../../lib/jwt';
@ -53,13 +53,16 @@ export function EmailLoginForm(props: EmailLoginFormProps) {
setError(error?.message || 'Something went wrong. Please try again later.'); setError(error?.message || 'Something went wrong. Please try again later.');
}; };
const emailFieldId = `form:${useId()}`;
const passwordFieldId = `form:${useId()}`;
return ( return (
<form className="w-full" onSubmit={handleFormSubmit}> <form className="w-full" onSubmit={handleFormSubmit}>
<label htmlFor="email" className="sr-only"> <label htmlFor={emailFieldId} className="sr-only">
Email address Email address
</label> </label>
<input <input
id="email" id={emailFieldId}
name="email" name="email"
type="email" type="email"
autoComplete="email" autoComplete="email"
@ -69,11 +72,11 @@ export function EmailLoginForm(props: EmailLoginFormProps) {
value={email} value={email}
onInput={(e) => setEmail(String((e.target as any).value))} onInput={(e) => setEmail(String((e.target as any).value))}
/> />
<label htmlFor="password" className="sr-only"> <label htmlFor={passwordFieldId} className="sr-only">
Password Password
</label> </label>
<input <input
id="password" id={passwordFieldId}
name="password" name="password"
type="password" type="password"
autoComplete="current-password" autoComplete="current-password"

@ -9,28 +9,31 @@ export function ContentConfirmationModal(props: ContentConfirmationModalProps) {
const { onClose, onClick } = props; const { onClose, onClick } = props;
return ( return (
<Modal onClose={onClose}> <Modal onClose={onClose} wrapperClassName="max-w-lg">
<div className="p-4"> <div className="p-4">
<h2 className="text-lg font-semibold">Roadmap Content</h2> <h2 className="text-lg font-semibold">
Copy Node Details and Resources?
</h2>
<p className="balanc text-gray-600"> <p className="balanc text-gray-600">
Do you want to copy the content of this roadmap? This will just copy the roadmap in your team. Would you like to copy
the resource links and node details as well?
</p> </p>
<div className="mt-4 grid grid-cols-2 gap-2"> <div className="mt-4 grid grid-cols-2 gap-2">
<button <button
className="rounded-lg border p-2.5 font-medium" className="rounded-lg border p-2.5 font-normal"
onClick={() => { onClick={() => {
onClick(false); onClick(false);
}} }}
> >
No No, copy roadmap only
</button> </button>
<button <button
className="rounded-lg border bg-black p-2.5 font-medium text-white hover:opacity-80" className="rounded-lg border bg-black p-2.5 font-normal text-white hover:opacity-80"
onClick={() => { onClick={() => {
onClick(true); onClick(true);
}} }}
> >
Yes Yes, also copy resources
</button> </button>
</div> </div>
</div> </div>

@ -10,6 +10,7 @@ import { showLoginPopup } from '../../lib/popup.ts';
import { isLoggedIn } from '../../lib/jwt.ts'; import { isLoggedIn } from '../../lib/jwt.ts';
import { useState } from 'react'; import { useState } from 'react';
import { CreateRoadmapModal } from './CreateRoadmap/CreateRoadmapModal.tsx'; import { CreateRoadmapModal } from './CreateRoadmap/CreateRoadmapModal.tsx';
import { RoadmapAlert } from '../RoadmapAlert.tsx';
export function CustomRoadmapAlert() { export function CustomRoadmapAlert() {
const [isCreatingRoadmap, setIsCreatingRoadmap] = useState(false); const [isCreatingRoadmap, setIsCreatingRoadmap] = useState(false);
@ -23,33 +24,18 @@ export function CustomRoadmapAlert() {
}} }}
/> />
)} )}
<div className="relative mb-5 mt-0 rounded-md border border-yellow-500 bg-yellow-100 p-2 sm:-mt-6 sm:mb-7 sm:p-2.5">
<p className="mb-2.5 mt-2 text-sm text-yellow-800 sm:mb-1.5 sm:mt-1 sm:text-base"> <RoadmapAlert
title="Community Roadmaps"
description={
<>
This is a custom roadmap made by a community member and is not This is a custom roadmap made by a community member and is not
verified by <span className="font-semibold">roadmap.sh</span> verified by <span className="font-semibold">roadmap.sh</span>
</p> </>
<div className="flex flex-col items-start gap-2 sm:flex-row sm:items-center"> }
<a floatingIcon={MessageCircleHeart}
href="/roadmaps" className="mb-5 mt-0 sm:-mt-6 sm:mb-7"
className="inline-flex items-center gap-1.5 text-sm font-semibold text-yellow-700 underline-offset-2 hover:underline" />
>
<BadgeCheck className="h-4 w-4 stroke-[2.5]" />
Visit Official Roadmaps
</a>
<span className="hidden font-black text-yellow-700 sm:block">
&middot;
</span>
<a
href="/community"
className="inline-flex items-center gap-1.5 text-sm font-semibold text-yellow-700 underline-offset-2 hover:underline"
>
<HeartHandshake className="h-4 w-4 stroke-[2.5]" />
More Community Roadmaps
</a>
</div>
<MessageCircleHeart className="absolute bottom-2 right-2 hidden h-12 w-12 text-yellow-500 opacity-50 sm:block" />
</div>
</> </>
); );
} }

@ -4,7 +4,13 @@ import { DashboardCardLink } from './DashboardCardLink';
import { useState } from 'react'; import { useState } from 'react';
import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal'; import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal';
import { Simulate } from 'react-dom/test-utils'; import { Simulate } from 'react-dom/test-utils';
import { Bot, BrainCircuit, Map, PencilRuler } from 'lucide-react'; import {
ArrowUpRight,
Bot,
BrainCircuit,
Map,
PencilRuler,
} from 'lucide-react';
type DashboardAiRoadmapsProps = { type DashboardAiRoadmapsProps = {
roadmaps: { roadmaps: {
@ -20,10 +26,19 @@ export function DashboardAiRoadmaps(props: DashboardAiRoadmapsProps) {
return ( return (
<> <>
<h2 className="mb-2 mt-6 text-xs uppercase text-gray-400"> <div className="mb-2 mt-6 flex items-center justify-between gap-2">
AI Generated Roadmaps <h2 className="text-xs uppercase text-gray-400">
My AI Roadmaps
</h2> </h2>
<a
href="/ai/explore"
className="rounded-full bg-gray-200 px-2.5 py-0.5 text-xs font-medium text-gray-700 hover:bg-gray-300 hover:text-black"
>
AI Generated Roadmaps
</a>
</div>
{!isLoading && roadmaps.length === 0 && ( {!isLoading && roadmaps.length === 0 && (
<DashboardCardLink <DashboardCardLink
className="mt-0" className="mt-0"
@ -47,8 +62,8 @@ export function DashboardAiRoadmaps(props: DashboardAiRoadmapsProps) {
<> <>
{roadmaps.map((roadmap) => ( {roadmaps.map((roadmap) => (
<a <a
href={`/r/${roadmap.slug}`} href={`/ai/${roadmap.slug}`}
className="relative rounded-md border bg-white p-2.5 text-left text-sm shadow-sm truncate hover:border-gray-400 hover:bg-gray-50" className="relative truncate rounded-md border bg-white p-2.5 text-left text-sm shadow-sm hover:border-gray-400 hover:bg-gray-50"
> >
{roadmap.title} {roadmap.title}
</a> </a>
@ -69,9 +84,7 @@ export function DashboardAiRoadmaps(props: DashboardAiRoadmapsProps) {
type CustomProgressCardSkeletonProps = {}; type CustomProgressCardSkeletonProps = {};
function RoadmapCardSkeleton( function RoadmapCardSkeleton(props: CustomProgressCardSkeletonProps) {
props: CustomProgressCardSkeletonProps,
) {
return ( return (
<div className="h-[42px] w-full animate-pulse rounded-md bg-gray-200" /> <div className="h-[42px] w-full animate-pulse rounded-md bg-gray-200" />
); );

@ -19,7 +19,6 @@ export function DashboardCardLink(props: DashboardCardLinkProps) {
className, className,
)} )}
href={href} href={href}
target="_blank"
> >
<Icon className="mb-4 size-10 text-gray-300" strokeWidth={1.25} /> <Icon className="mb-4 size-10 text-gray-300" strokeWidth={1.25} />
<h4 className="text-xl font-semibold tracking-wide">{title}</h4> <h4 className="text-xl font-semibold tracking-wide">{title}</h4>

@ -54,13 +54,14 @@ export function DashboardPage(props: DashboardPageProps) {
return ( return (
<div className="min-h-screen bg-gray-50 pb-20 pt-8"> <div className="min-h-screen bg-gray-50 pb-20 pt-8">
<div className="container"> <div className="container">
<div className="mb-8 flex flex-wrap items-center gap-1.5"> <div className="mb-6 flex flex-wrap items-center gap-1.5 sm:mb-8">
<DashboardTab <DashboardTab
label="Personal" label="Personal"
isActive={!selectedTeamId} isActive={!selectedTeamId}
onClick={() => setSelectedTeamId(undefined)} onClick={() => setSelectedTeamId(undefined)}
avatar={userAvatar} avatar={userAvatar}
/> />
{isLoading && ( {isLoading && (
<> <>
<DashboardTabSkeleton /> <DashboardTabSkeleton />

@ -1,17 +1,26 @@
import { cn } from '../../lib/classname';
type EmptyStackMessageProps = { type EmptyStackMessageProps = {
number: number; number: number | string;
title: string; title: string;
description: string; description: string;
buttonText: string; buttonText: string;
buttonLink: string; buttonLink: string;
bodyClassName?: string;
}; };
export function EmptyStackMessage(props: EmptyStackMessageProps) { export function EmptyStackMessage(props: EmptyStackMessageProps) {
const { number, title, description, buttonText, buttonLink } = props; const { number, title, description, buttonText, buttonLink, bodyClassName } =
props;
return ( return (
<div className="absolute inset-0 flex items-center justify-center rounded-md bg-black/50"> <div className="absolute inset-0 flex items-center justify-center rounded-md bg-black/50">
<div className="flex max-w-[200px] flex-col items-center justify-center rounded-md bg-white p-4 shadow-sm"> <div
className={cn(
'flex max-w-[200px] flex-col items-center justify-center rounded-md bg-white p-4 shadow-sm',
bodyClassName,
)}
>
<span className="flex h-8 w-8 items-center justify-center rounded-full bg-gray-300 text-white"> <span className="flex h-8 w-8 items-center justify-center rounded-full bg-gray-300 text-white">
{number} {number}
</span> </span>

@ -4,7 +4,13 @@ import { DashboardCardLink } from './DashboardCardLink';
import { useState } from 'react'; import { useState } from 'react';
import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal'; import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal';
import { Simulate } from 'react-dom/test-utils'; import { Simulate } from 'react-dom/test-utils';
import {Bot, BrainCircuit, Map, PencilRuler} from 'lucide-react'; import {
ArrowUpRight,
Bot,
BrainCircuit,
Map,
PencilRuler,
} from 'lucide-react';
type ListDashboardCustomProgressProps = { type ListDashboardCustomProgressProps = {
progresses: UserProgress[]; progresses: UserProgress[];
@ -40,10 +46,19 @@ export function ListDashboardCustomProgress(
<> <>
{customRoadmapModal} {customRoadmapModal}
<h2 className="mb-2 mt-6 text-xs uppercase text-gray-400"> <div className="mb-2 mt-6 flex items-center justify-between gap-2">
{isAIGeneratedRoadmaps ? 'AI Generated Roadmaps' : 'Custom Roadmaps'} <h2 className="text-xs uppercase text-gray-400">
{isAIGeneratedRoadmaps ? 'My AI Roadmaps' : 'My Custom Roadmaps'}
</h2> </h2>
<a
href="/community"
className="rounded-full bg-gray-200 px-2.5 py-0.5 text-xs font-medium text-gray-700 hover:bg-gray-300 hover:text-black"
>
Community Roadmaps
</a>
</div>
{!isLoading && progresses.length === 0 && isAIGeneratedRoadmaps && ( {!isLoading && progresses.length === 0 && isAIGeneratedRoadmaps && (
<DashboardCardLink <DashboardCardLink
className="mt-0" className="mt-0"

@ -14,6 +14,9 @@ import { CheckEmoji } from '../ReactIcons/CheckEmoji.tsx';
import { ConstructionEmoji } from '../ReactIcons/ConstructionEmoji.tsx'; import { ConstructionEmoji } from '../ReactIcons/ConstructionEmoji.tsx';
import { BookEmoji } from '../ReactIcons/BookEmoji.tsx'; import { BookEmoji } from '../ReactIcons/BookEmoji.tsx';
import { DashboardAiRoadmaps } from './DashboardAiRoadmaps.tsx'; import { DashboardAiRoadmaps } from './DashboardAiRoadmaps.tsx';
import type { AllowedProfileVisibility } from '../../api/user.ts';
import { PencilIcon, type LucideIcon } from 'lucide-react';
import { cn } from '../../lib/classname.ts';
type UserDashboardResponse = { type UserDashboardResponse = {
name: string; name: string;
@ -21,6 +24,7 @@ type UserDashboardResponse = {
avatar: string; avatar: string;
headline: string; headline: string;
username: string; username: string;
profileVisibility: AllowedProfileVisibility;
progresses: UserProgress[]; progresses: UserProgress[];
projects: ProjectStatusDocument[]; projects: ProjectStatusDocument[];
aiRoadmaps: { aiRoadmaps: {
@ -222,14 +226,24 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
return 0; return 0;
}); });
const { username } = personalDashboardDetails || {};
return ( return (
<section> <section>
{isLoading ? ( {isLoading ? (
<div className="h-7 w-1/4 animate-pulse rounded-lg bg-gray-200"></div> <div className="h-7 w-1/4 animate-pulse rounded-lg bg-gray-200"></div>
) : ( ) : (
<div className="flex flex-col items-start justify-between gap-1 sm:flex-row sm:items-center">
<h2 className="text-lg font-medium"> <h2 className="text-lg font-medium">
Hi {name}, good {getCurrentPeriod()}! Hi {name}, good {getCurrentPeriod()}!
</h2> </h2>
<a
href="/home"
className="rounded-full bg-gray-200 px-2.5 py-1 text-xs font-medium text-gray-700 hover:bg-gray-300 hover:text-black"
>
Visit Homepage
</a>
</div>
)} )}
<div className="mt-4 grid grid-cols-1 gap-2 sm:grid-cols-2 md:grid-cols-4"> <div className="mt-4 grid grid-cols-1 gap-2 sm:grid-cols-2 md:grid-cols-4">
@ -245,8 +259,20 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
<DashboardCard <DashboardCard
imgUrl={avatarLink} imgUrl={avatarLink}
title={name!} title={name!}
description="Setup your profile" description={
href="/account/update-profile" username ? 'View your profile' : 'Setup your profile'
}
href={username ? `/u/${username}` : '/account/update-profile'}
{...(username && {
externalLinkIcon: PencilIcon,
externalLinkHref: '/account/update-profile',
externalLinkText: 'Edit',
})}
className={
!username
? 'border-dashed border-gray-500 bg-gray-100 hover:border-gray-500 hover:bg-gray-200'
: ''
}
/> />
<DashboardCard <DashboardCard
@ -265,7 +291,7 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
<DashboardCard <DashboardCard
icon={CheckEmoji} icon={CheckEmoji}
title="Best Practices" title="Best Practices"
description="Do things right way" description="Do things the right way"
href="/best-practices" href="/best-practices"
/> />
</> </>
@ -304,17 +330,33 @@ type DashboardCardProps = {
title: string; title: string;
description: string; description: string;
href: string; href: string;
externalLinkIcon?: LucideIcon;
externalLinkText?: string;
externalLinkHref?: string;
className?: string;
}; };
function DashboardCard(props: DashboardCardProps) { function DashboardCard(props: DashboardCardProps) {
const { icon: Icon, imgUrl, title, description, href } = props; const {
icon: Icon,
imgUrl,
title,
description,
href,
externalLinkHref,
externalLinkIcon: ExternalLinkIcon,
externalLinkText,
className,
} = props;
return ( return (
<a <div
href={href} className={cn(
target="_blank" 'relative overflow-hidden',
className="flex flex-col overflow-hidden rounded-lg border border-gray-300 bg-white hover:border-gray-400 hover:bg-gray-50" className,
)}
> >
<a href={href} className="flex flex-col rounded-lg border border-gray-300 bg-white hover:border-gray-400 hover:bg-gray-50">
{Icon && ( {Icon && (
<div className="px-4 pb-3 pt-4"> <div className="px-4 pb-3 pt-4">
<Icon className="size-6" /> <Icon className="size-6" />
@ -332,6 +374,17 @@ function DashboardCard(props: DashboardCardProps) {
<p className="text-xs text-black">{description}</p> <p className="text-xs text-black">{description}</p>
</div> </div>
</a> </a>
{externalLinkHref && (
<a
href={externalLinkHref}
className="absolute right-1 top-1 flex items-center gap-1.5 rounded-md bg-gray-200 p-1 px-2 text-xs text-gray-600 hover:bg-gray-300 hover:text-black"
>
{ExternalLinkIcon && <ExternalLinkIcon className="size-3" />}
{externalLinkText}
</a>
)}
</div>
); );
} }

@ -26,8 +26,7 @@ type ProgressStackProps = {
topicDoneToday: number; topicDoneToday: number;
}; };
const MAX_PROGRESS_TO_SHOW = 5; const MAX_PROGRESS_TO_SHOW = 11;
const MAX_BOOKMARKS_TO_SHOW = 5;
const MAX_PROJECTS_TO_SHOW = 8; const MAX_PROJECTS_TO_SHOW = 8;
type ProgressLaneProps = { type ProgressLaneProps = {
@ -36,6 +35,7 @@ type ProgressLaneProps = {
linkHref?: string; linkHref?: string;
isLoading?: boolean; isLoading?: boolean;
isEmpty?: boolean; isEmpty?: boolean;
loadingWrapperClassName?: string;
loadingSkeletonCount?: number; loadingSkeletonCount?: number;
loadingSkeletonClassName?: string; loadingSkeletonClassName?: string;
children: React.ReactNode; children: React.ReactNode;
@ -43,6 +43,7 @@ type ProgressLaneProps = {
emptyIcon?: LucideIcon; emptyIcon?: LucideIcon;
emptyLinkText?: string; emptyLinkText?: string;
emptyLinkHref?: string; emptyLinkHref?: string;
className?: string;
}; };
function ProgressLane(props: ProgressLaneProps) { function ProgressLane(props: ProgressLaneProps) {
@ -51,6 +52,7 @@ function ProgressLane(props: ProgressLaneProps) {
linkText, linkText,
linkHref, linkHref,
isLoading = false, isLoading = false,
loadingWrapperClassName = '',
loadingSkeletonCount = 4, loadingSkeletonCount = 4,
loadingSkeletonClassName = '', loadingSkeletonClassName = '',
children, children,
@ -59,10 +61,16 @@ function ProgressLane(props: ProgressLaneProps) {
emptyMessage = `No ${title.toLowerCase()} to show`, emptyMessage = `No ${title.toLowerCase()} to show`,
emptyLinkHref = '/roadmaps', emptyLinkHref = '/roadmaps',
emptyLinkText = 'Explore', emptyLinkText = 'Explore',
className,
} = props; } = props;
return ( return (
<div className="flex h-full flex-col rounded-md border bg-white px-4 py-3 shadow-sm"> <div
className={cn(
'flex h-full flex-col rounded-md border bg-white px-4 py-3 shadow-sm',
className,
)}
>
{isLoading && ( {isLoading && (
<div className={'flex flex-row justify-between'}> <div className={'flex flex-row justify-between'}>
<div className="h-[16px] w-[75px] animate-pulse rounded-md bg-gray-100"></div> <div className="h-[16px] w-[75px] animate-pulse rounded-md bg-gray-100"></div>
@ -86,11 +94,13 @@ function ProgressLane(props: ProgressLaneProps) {
<div className="mt-4 flex flex-grow flex-col gap-1.5"> <div className="mt-4 flex flex-grow flex-col gap-1.5">
{isLoading && ( {isLoading && (
<> <div
className={cn('grid grid-cols-2 gap-2', loadingWrapperClassName)}
>
{Array.from({ length: loadingSkeletonCount }).map((_, index) => ( {Array.from({ length: loadingSkeletonCount }).map((_, index) => (
<CardSkeleton key={index} className={loadingSkeletonClassName} /> <CardSkeleton key={index} className={loadingSkeletonClassName} />
))} ))}
</> </div>
)} )}
{!isLoading && children} {!isLoading && children}
@ -119,29 +129,27 @@ export function ProgressStack(props: ProgressStackProps) {
const { progresses, projects, isLoading, accountStreak, topicDoneToday } = const { progresses, projects, isLoading, accountStreak, topicDoneToday } =
props; props;
const bookmarkedProgresses = progresses.filter( const [showAllProgresses, setShowAllProgresses] = useState(false);
(progress) => progress?.isFavorite, const sortedProgresses = progresses.sort((a, b) => {
); if (a.isFavorite && !b.isFavorite) {
return 1;
}
const userProgresses = progresses.filter( if (!a.isFavorite && b.isFavorite) {
(progress) => !progress?.isFavorite || progress?.done > 0, return -1;
); }
const [showAllProgresses, setShowAllProgresses] = useState(false); return 0;
});
const userProgressesToShow = showAllProgresses const userProgressesToShow = showAllProgresses
? userProgresses ? sortedProgresses
: userProgresses.slice(0, MAX_PROGRESS_TO_SHOW); : sortedProgresses.slice(0, MAX_PROGRESS_TO_SHOW);
const [showAllProjects, setShowAllProjects] = useState(false); const [showAllProjects, setShowAllProjects] = useState(false);
const projectsToShow = showAllProjects const projectsToShow = showAllProjects
? projects ? projects
: projects.slice(0, MAX_PROJECTS_TO_SHOW); : projects.slice(0, MAX_PROJECTS_TO_SHOW);
const [showAllBookmarks, setShowAllBookmarks] = useState(false);
const bookmarksToShow = showAllBookmarks
? bookmarkedProgresses
: bookmarkedProgresses.slice(0, MAX_BOOKMARKS_TO_SHOW);
const totalProjectFinished = projects.filter( const totalProjectFinished = projects.filter(
(project) => project.repositoryUrl, (project) => project.repositoryUrl,
).length; ).length;
@ -167,73 +175,50 @@ export function ProgressStack(props: ProgressStackProps) {
</div> </div>
<div className="mt-2 grid min-h-[330px] grid-cols-1 gap-2 sm:grid-cols-2 md:grid-cols-3"> <div className="mt-2 grid min-h-[330px] grid-cols-1 gap-2 sm:grid-cols-2 md:grid-cols-3">
<div className="relative"> <div className="relative col-span-2">
{!isLoading && bookmarksToShow.length === 0 && ( {!isLoading && userProgressesToShow.length === 0 && (
<EmptyStackMessage <EmptyStackMessage
number={1} number={1}
title={'Bookmark Roadmaps'} title={'Bookmark some Roadmaps'}
description={'Bookmark some roadmaps to access them quickly'} description={
'Bookmark some roadmaps to access them quickly and start updating your progress'
}
buttonText={'Explore Roadmaps'} buttonText={'Explore Roadmaps'}
buttonLink={'/roadmaps'} buttonLink={'/roadmaps'}
bodyClassName="max-w-[280px]"
/> />
)} )}
<ProgressLane <ProgressLane
title={'Bookmarks'} title="Progress & Bookmarks"
isLoading={isLoading} isLoading={isLoading}
loadingSkeletonCount={5} loadingSkeletonCount={MAX_PROGRESS_TO_SHOW}
linkHref={'/roadmaps'} linkHref="/roadmaps"
linkText={'Roadmaps'} linkText="Roadmaps"
isEmpty={bookmarksToShow.length === 0} isEmpty={userProgressesToShow.length === 0}
emptyIcon={Bookmark} emptyIcon={Bookmark}
emptyMessage={'No bookmarks to show'} emptyMessage={'No bookmarks to show'}
emptyLinkHref={'/roadmaps'} emptyLinkHref={'/roadmaps'}
emptyLinkText={'Explore Roadmaps'} emptyLinkText={'Explore Roadmaps'}
> >
{bookmarksToShow.map((progress) => { <div className="grid grid-cols-2 gap-2">
{userProgressesToShow.length > 0 && (
<>
{userProgressesToShow.map((progress) => {
const isFavorite =
progress.isFavorite &&
!progress.done &&
!progress.skipped;
if (isFavorite) {
return ( return (
<DashboardBookmarkCard <DashboardBookmarkCard
key={progress.resourceId} key={progress.resourceId}
bookmark={progress} bookmark={progress}
/> />
); );
})} }
{bookmarkedProgresses.length > MAX_BOOKMARKS_TO_SHOW && (
<ShowAllButton
showAll={showAllBookmarks}
setShowAll={setShowAllBookmarks}
count={bookmarkedProgresses.length}
maxCount={MAX_BOOKMARKS_TO_SHOW}
className="mb-0.5 mt-3"
/>
)}
</ProgressLane>
</div>
<div className="relative">
{!isLoading && userProgressesToShow.length === 0 && (
<EmptyStackMessage
number={2}
title={'Track Progress'}
description={'Pick your first roadmap and start learning'}
buttonText={'Explore roadmaps'}
buttonLink={'/roadmaps'}
/>
)}
<ProgressLane
title={'Progress'}
linkHref={'/roadmaps'}
linkText={'Roadmaps'}
isLoading={isLoading}
loadingSkeletonCount={5}
isEmpty={userProgressesToShow.length === 0}
emptyMessage={'Update your Progress'}
emptyIcon={Map}
emptyLinkText={'Explore Roadmaps'}
>
{userProgressesToShow.length > 0 && (
<>
{userProgressesToShow.map((progress) => {
return ( return (
<DashboardProgressCard <DashboardProgressCard
key={progress.resourceId} key={progress.resourceId}
@ -244,15 +229,16 @@ export function ProgressStack(props: ProgressStackProps) {
</> </>
)} )}
{userProgresses.length > MAX_PROGRESS_TO_SHOW && ( {sortedProgresses.length > MAX_PROGRESS_TO_SHOW && (
<ShowAllButton <ShowAllButton
showAll={showAllProgresses} showAll={showAllProgresses}
setShowAll={setShowAllProgresses} setShowAll={setShowAllProgresses}
count={userProgresses.length} count={sortedProgresses.length}
maxCount={MAX_PROGRESS_TO_SHOW} maxCount={MAX_PROGRESS_TO_SHOW}
className="mb-0.5 mt-3" className="min-h-[38px] rounded-md border border-dashed leading-none"
/> />
)} )}
</div>
</ProgressLane> </ProgressLane>
</div> </div>
@ -262,6 +248,7 @@ export function ProgressStack(props: ProgressStackProps) {
linkHref={'/projects'} linkHref={'/projects'}
linkText={'Projects'} linkText={'Projects'}
isLoading={isLoading} isLoading={isLoading}
loadingWrapperClassName="grid-cols-1"
loadingSkeletonClassName={'h-5'} loadingSkeletonClassName={'h-5'}
loadingSkeletonCount={8} loadingSkeletonCount={8}
isEmpty={projectsToShow.length === 0} isEmpty={projectsToShow.length === 0}
@ -272,7 +259,7 @@ export function ProgressStack(props: ProgressStackProps) {
> >
{!isLoading && projectsToShow.length === 0 && ( {!isLoading && projectsToShow.length === 0 && (
<EmptyStackMessage <EmptyStackMessage
number={3} number={2}
title={'Build your first project'} title={'Build your first project'}
description={'Pick a project to practice and start building'} description={'Pick a project to practice and start building'}
buttonText={'Explore Projects'} buttonText={'Explore Projects'}
@ -317,7 +304,6 @@ function ShowAllButton(props: ShowAllButtonProps) {
const { showAll, setShowAll, count, maxCount, className } = props; const { showAll, setShowAll, count, maxCount, className } = props;
return ( return (
<span className="flex flex-grow items-end">
<button <button
className={cn( className={cn(
'flex w-full items-center justify-center text-sm text-gray-500 hover:text-gray-700', 'flex w-full items-center justify-center text-sm text-gray-500 hover:text-gray-700',
@ -327,7 +313,6 @@ function ShowAllButton(props: ShowAllButtonProps) {
> >
{!showAll ? <>+ show {count - maxCount} more</> : <>- show less</>} {!showAll ? <>+ show {count - maxCount} more</> : <>- show less</>}
</button> </button>
</span>
); );
} }
@ -341,7 +326,7 @@ function CardSkeleton(props: CardSkeletonProps) {
return ( return (
<div <div
className={cn( className={cn(
'h-10 w-full animate-pulse rounded-md bg-gray-100', 'h-[38px] w-full animate-pulse rounded-md bg-gray-100',
className, className,
)} )}
/> />

@ -11,7 +11,9 @@ export function ProgressNudge(props: ProgressNudgeProps) {
const $totalRoadmapNodes = useStore(totalRoadmapNodes); const $totalRoadmapNodes = useStore(totalRoadmapNodes);
const $roadmapProgress = useStore(roadmapProgress); const $roadmapProgress = useStore(roadmapProgress);
const done = $roadmapProgress?.done?.length || 0; const done =
($roadmapProgress?.done?.length || 0) +
($roadmapProgress?.skipped?.length || 0);
const hasProgress = done > 0; const hasProgress = done > 0;
@ -51,7 +53,8 @@ export function ProgressNudge(props: ProgressNudgeProps) {
<span className="relative -top-[0.45px] mr-2 text-xs font-medium uppercase text-yellow-400"> <span className="relative -top-[0.45px] mr-2 text-xs font-medium uppercase text-yellow-400">
Progress Progress
</span> </span>
<span>{done > $totalRoadmapNodes ? $totalRoadmapNodes : done}</span> of <span>{$totalRoadmapNodes}</span> Done <span>{done > $totalRoadmapNodes ? $totalRoadmapNodes : done}</span> of{' '}
<span>{$totalRoadmapNodes}</span> Done
</span> </span>
<span <span

@ -1,4 +1,5 @@
import { BadgeCheck, Telescope, Wand } from 'lucide-react'; import { BadgeCheck, Bot, Telescope, Wand } from 'lucide-react';
import { RoadmapAlert } from '../RoadmapAlert';
type AIRoadmapAlertProps = { type AIRoadmapAlertProps = {
isListing?: boolean; isListing?: boolean;
@ -8,46 +9,20 @@ export function AIRoadmapAlert(props: AIRoadmapAlertProps) {
const { isListing = false } = props; const { isListing = false } = props;
return ( return (
<div className="mb-3 w-full rounded-xl bg-yellow-100 px-4 py-3 text-yellow-800"> <RoadmapAlert
<h2 className="flex items-center text-base font-semibold text-yellow-800 sm:text-lg"> title={`AI Generated Roadmap${isListing ? 's' : ''}`}
AI Generated Roadmap{isListing ? 's' : ''}{' '} badgeText="Beta"
<span className="ml-1.5 rounded-md border border-yellow-500 bg-yellow-200 px-1.5 text-xs uppercase tracking-wide text-yellow-800"> description={
Beta <>
</span>
</h2>
<p className="mb-2 mt-1">
{isListing {isListing
? 'These are AI generated roadmaps and are not verified by' ? 'These are AI generated roadmaps and are not verified by'
: 'This is an AI generated roadmap and is not verified by'}{' '} : 'This is an AI generated roadmap and is not verified by'}{' '}
<span className={'font-semibold'}>roadmap.sh</span>. We are currently in <span className={'font-semibold'}>roadmap.sh</span>. We are currently
beta and working hard to improve the quality of the generated roadmaps. in beta and working hard to improve the quality of the generated
</p> roadmaps.
<p className="mb-1.5 mt-2 flex flex-col gap-2 text-sm sm:flex-row"> </>
{isListing ? ( }
<a floatingIcon={Bot}
href="/ai" />
className="flex items-center gap-1.5 rounded-md border border-yellow-600 px-2 py-1 text-yellow-700 transition-colors hover:bg-yellow-300 hover:text-yellow-800"
>
<Wand size={15} />
Create your own Roadmap with AI
</a>
) : (
<a
href="/ai/explore"
className="flex items-center gap-1.5 rounded-md border border-yellow-600 px-2 py-1 text-yellow-700 transition-colors hover:bg-yellow-300 hover:text-yellow-800"
>
<Telescope size={15} />
Explore other AI Roadmaps
</a>
)}
<a
href="/roadmaps"
className="flex items-center gap-1.5 rounded-md border border-yellow-600 bg-yellow-200 px-2 py-1 text-yellow-800 transition-colors hover:bg-yellow-300"
>
<BadgeCheck size={15} />
Visit Official Roadmaps
</a>
</p>
</div>
); );
} }

@ -0,0 +1,70 @@
import {
BadgeCheck,
HeartHandshake,
Telescope,
type LucideIcon,
} from 'lucide-react';
import type { ReactNode } from 'react';
import { cn } from '../lib/classname';
type RoadmapAlertProps = {
title: string;
badgeText?: string;
description: string | ReactNode;
floatingIcon: LucideIcon;
className?: string;
};
export function RoadmapAlert(props: RoadmapAlertProps) {
const {
title,
badgeText,
description,
floatingIcon: FloatingIcon,
className,
} = props;
return (
<div
className={cn(
'relative mb-3 w-full rounded-xl bg-yellow-100 px-4 py-3 text-yellow-800',
className,
)}
>
<h2 className="flex items-center text-base font-semibold text-yellow-800 sm:text-lg">
{title}{' '}
{badgeText && (
<span className="ml-1.5 rounded-md border border-yellow-500 bg-yellow-200 px-1.5 text-xs uppercase tracking-wide text-yellow-800">
{badgeText}
</span>
)}
</h2>
<p className="mb-2 mt-1 text-balance">{description}</p>
<p className="mb-1.5 mt-2 flex flex-col gap-2 text-sm md:flex-row">
<a
href="/roadmaps"
className="flex items-center gap-1.5 rounded-md border border-yellow-600 bg-yellow-200 px-2 py-1 text-yellow-800 transition-colors hover:bg-yellow-300"
>
<BadgeCheck size={15} />
Visit Official Roadmaps
</a>
<a
href="/community"
className="flex items-center gap-1.5 rounded-md border border-yellow-600 px-2 py-1 text-yellow-700 transition-colors hover:bg-yellow-300 hover:text-yellow-800"
>
<HeartHandshake size={15} />
Explore Community Roadmaps
</a>
<a
href="/ai/explore"
className="flex items-center gap-1.5 rounded-md border border-yellow-600 px-2 py-1 text-yellow-700 transition-colors hover:bg-yellow-300 hover:text-yellow-800"
>
<Telescope size={15} />
Explore other AI Roadmaps
</a>
</p>
<FloatingIcon className="pointer-events-none absolute right-2 top-2 hidden h-12 w-12 text-yellow-500 opacity-50 sm:block md:bottom-2 md:top-auto" />
</div>
);
}

@ -0,0 +1,31 @@
import { useIsMounted } from '../../hooks/use-is-mounted';
import { MarkFavorite } from '../FeaturedItems/MarkFavorite';
import type { GroupType } from './RoadmapsPage';
type RoadmapCardProps = {
roadmap: GroupType['roadmaps'][number];
};
export function RoadmapCard(props: RoadmapCardProps) {
const { roadmap } = props;
const isMounted = useIsMounted();
return (
<a
key={roadmap.link}
className="relative rounded-md border bg-white px-3 py-2 text-left text-sm shadow-sm transition-all hover:border-gray-300 hover:bg-gray-50"
href={roadmap.link}
>
{roadmap.title}
{isMounted && (
<MarkFavorite
resourceId={roadmap.link.split('/').pop()!}
resourceType="roadmap"
className="data-[is-favorite=true]:opacity-35"
/>
)}
</a>
);
}

@ -8,6 +8,10 @@ import {
getUrlParams, getUrlParams,
setUrlParams, setUrlParams,
} from '../../lib/browser.ts'; } from '../../lib/browser.ts';
import { RoadmapCard } from './RoadmapCard.tsx';
import { httpGet } from '../../lib/http.ts';
import type { UserProgressResponse } from '../HeroSection/FavoriteRoadmaps.tsx';
import { isLoggedIn } from '../../lib/jwt.ts';
const groupNames = [ const groupNames = [
'Absolute Beginners', 'Absolute Beginners',
@ -27,7 +31,7 @@ const groupNames = [
type AllowGroupNames = (typeof groupNames)[number]; type AllowGroupNames = (typeof groupNames)[number];
type GroupType = { export type GroupType = {
group: AllowGroupNames; group: AllowGroupNames;
roadmaps: { roadmaps: {
title: string; title: string;
@ -281,6 +285,12 @@ const groups: GroupType[] = [
type: 'skill', type: 'skill',
otherGroups: ['Web Development'], otherGroups: ['Web Development'],
}, },
{
title: 'Redis',
link: '/redis',
type: 'skill',
otherGroups: ['Web Development'],
},
], ],
}, },
{ {
@ -473,6 +483,37 @@ export function RoadmapsPage() {
]); ]);
}, [activeGroup]); }, [activeGroup]);
async function loadProgress() {
const { response: progressList, error } =
await httpGet<UserProgressResponse>(
`${import.meta.env.PUBLIC_API_URL}/v1-get-hero-roadmaps`,
);
if (error || !progressList) {
return;
}
progressList?.forEach((progress) => {
window.dispatchEvent(
new CustomEvent('mark-favorite', {
detail: {
resourceId: progress.resourceId,
resourceType: progress.resourceType,
isFavorite: progress.isFavorite,
},
}),
);
});
}
useEffect(() => {
if (!isLoggedIn()) {
return;
}
loadProgress().finally(() => {});
}, []);
useEffect(() => { useEffect(() => {
const { g } = getUrlParams() as { g: AllowGroupNames }; const { g } = getUrlParams() as { g: AllowGroupNames };
if (!g) { if (!g) {
@ -547,13 +588,7 @@ export function RoadmapsPage() {
<div className="grid grid-cols-1 gap-1.5 sm:grid-cols-2 md:grid-cols-3"> <div className="grid grid-cols-1 gap-1.5 sm:grid-cols-2 md:grid-cols-3">
{group.roadmaps.map((roadmap) => ( {group.roadmaps.map((roadmap) => (
<a <RoadmapCard roadmap={roadmap} key={roadmap.link} />
key={roadmap.link}
className="rounded-md border bg-white px-3 py-2 text-left text-sm shadow-sm transition-all hover:border-gray-300 hover:bg-gray-50"
href={roadmap.link}
>
{roadmap.title}
</a>
))} ))}
</div> </div>
</div> </div>

@ -87,15 +87,13 @@ export function ProfileUsername(props: ProfileUsernameProps) {
{currentUsername !== username && username && isUnique && ( {currentUsername !== username && username && isUnique && (
<span className="text-xs text-green-600"> <span className="text-xs text-green-600">
URL after update{' '} URL after update{' '}
<a <span
href={`${import.meta.env.DEV ? 'http://localhost:3000' : 'https://roadmap.sh'}/u/${username}`}
target="_blank"
className={ className={
'ml-0.5 rounded-md border border-purple-500 px-1.5 py-0.5 text-xs font-medium text-purple-700 transition-colors hover:bg-purple-500 hover:text-white' 'ml-0.5 rounded-md border border-purple-500 px-1.5 py-0.5 text-xs font-medium text-purple-700 transition-colors'
} }
> >
roadmap.sh/u/{username} roadmap.sh/u/{username}
</a> </span>
</span> </span>
)} )}
</span> </span>

@ -71,6 +71,7 @@ export function UpdatePublicProfileForm() {
const [profileRoadmaps, setProfileRoadmaps] = useState<RoadmapType[]>([]); const [profileRoadmaps, setProfileRoadmaps] = useState<RoadmapType[]>([]);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const [isProfileUpdated, setIsProfileUpdated] = useState(false);
const { isCopied, copyText } = useCopyText(); const { isCopied, copyText } = useCopyText();
@ -109,6 +110,7 @@ export function UpdatePublicProfileForm() {
await loadProfileSettings(); await loadProfileSettings();
toast.success('Profile updated successfully'); toast.success('Profile updated successfully');
setIsProfileUpdated(true);
}; };
const loadProfileSettings = async () => { const loadProfileSettings = async () => {
@ -593,6 +595,42 @@ export function UpdatePublicProfileForm() {
> >
{isLoading ? 'Please wait..' : 'Save Profile'} {isLoading ? 'Please wait..' : 'Save Profile'}
</button> </button>
{isProfileUpdated && publicProfileUrl && (
<div className="flex items-center gap-2">
<button
type="button"
className={cn(
'flex shrink-0 flex-row items-center gap-1 rounded-lg border border-black py-1.5 pl-2.5 pr-3.5 text-xs uppercase text-black transition-colors hover:bg-black hover:text-white',
isCopied
? 'border-green-600 bg-green-600 text-white hover:bg-green-600 hover:text-white'
: '',
)}
onClick={() => {
copyText(`${window.location.origin}${publicProfileUrl}`);
}}
>
{isCopied ? (
<>
<CheckCircle className="size-4" />
Copied Profile URL
</>
) : (
<>
<Copy className="size-4" />
Copy Profile URL
</>
)}
</button>
<a
className='flex shrink-0 flex-row items-center gap-1 rounded-lg border border-black py-1.5 pl-2.5 pr-3.5 text-xs uppercase text-black transition-colors hover:bg-black hover:text-white'
href={publicProfileUrl}
target="_blank"
>
<ArrowUpRight className="size-4" />
View Profile
</a>
</div>
)}
</form> </form>
</div> </div>
); );

@ -3,6 +3,7 @@ import {
Globe, Globe,
LinkedinIcon, LinkedinIcon,
Mail, Mail,
Pencil,
Twitter, Twitter,
} from 'lucide-react'; } from 'lucide-react';
import type { GetPublicProfileResponse } from '../../api/user'; import type { GetPublicProfileResponse } from '../../api/user';
@ -15,11 +16,12 @@ type UserPublicProfileHeaderProps = {
export function UserPublicProfileHeader(props: UserPublicProfileHeaderProps) { export function UserPublicProfileHeader(props: UserPublicProfileHeaderProps) {
const { userDetails } = props; const { userDetails } = props;
const { name, links, publicConfig, avatar, email } = userDetails; const { name, links, publicConfig, avatar, email, isOwnProfile } =
userDetails;
const { headline, isAvailableForHire, isEmailVisible } = publicConfig!; const { headline, isAvailableForHire, isEmailVisible } = publicConfig!;
return ( return (
<div className="container flex items-center gap-6 rounded-xl border bg-white p-8"> <div className="container relative flex items-center gap-6 rounded-xl border bg-white p-8">
<img <img
src={ src={
avatar avatar
@ -27,7 +29,7 @@ export function UserPublicProfileHeader(props: UserPublicProfileHeaderProps) {
: '/images/default-avatar.png' : '/images/default-avatar.png'
} }
alt={name} alt={name}
className="h-32 w-32 object-cover rounded-full" className="h-32 w-32 rounded-full object-cover"
/> />
<div> <div>
@ -51,6 +53,16 @@ export function UserPublicProfileHeader(props: UserPublicProfileHeaderProps) {
{isEmailVisible && <UserLink href={`mailto:${email}`} icon={Mail} />} {isEmailVisible && <UserLink href={`mailto:${email}`} icon={Mail} />}
</div> </div>
</div> </div>
{isOwnProfile && (
<a
href="/account/update-profile"
className="absolute right-4 top-4 flex items-center gap-1.5 text-sm text-gray-500 hover:text-black"
>
<Pencil className="h-3 w-3 stroke-2" />
Edit Profile
</a>
)}
</div> </div>
); );
} }

@ -38,6 +38,10 @@ export function UserPublicProjects(props: UserPublicProjectsProps) {
return 0; return 0;
}) || []; }) || [];
if (!enrichedProjects.length) {
return null;
}
return ( return (
<div className="mt-5"> <div className="mt-5">
<h2 className="mb-2 text-xs uppercase tracking-wide text-gray-400"> <h2 className="mb-2 text-xs uppercase tracking-wide text-gray-400">

@ -1,5 +1,5 @@
--- ---
title: 'What is a DevOps Engineer? Responsbilities & Roles in @currentYear@' title: 'What is a DevOps Engineer? Responsibilities & Roles in @currentYear@'
description: 'Explore the responsibilities and roles of a DevOps Engineer in @currentYear@. Gain insights into the evolving field of DevOps and what it takes to succeed.' description: 'Explore the responsibilities and roles of a DevOps Engineer in @currentYear@. Gain insights into the evolving field of DevOps and what it takes to succeed.'
authorId: ekene authorId: ekene
excludedBySlug: '/devops/devops-engineer' excludedBySlug: '/devops/devops-engineer'
@ -21,13 +21,13 @@ tags:
![What is a DevOps engineer and what are their responsibilities?](https://assets.roadmap.sh/guest/what-is-devops-engineer-jort4.jpg) ![What is a DevOps engineer and what are their responsibilities?](https://assets.roadmap.sh/guest/what-is-devops-engineer-jort4.jpg)
Are you a developer monitoring recent changes in the ecosystem, looking to change careers or pick up new skills in 2024? If your choice is DevOps, you might be wondering what it entails, what it will take to become one in 2024, and how it is affected by the recent changes in the tech ecosystem. Are you a developer monitoring recent changes in the ecosystem, looking to change careers or pick up new skills in 2024? If your choice is [DevOps](https://roadmap.sh/devops), you might be wondering what it entails, what it will take to become one in 2024, and how it is affected by the recent changes in the tech ecosystem.
In recent years, the technology ecosystem has experienced a constant shift in the way hiring managers reach out, companies hire, and the roles and responsibilities described in job postings. Particularly, 2023 proved to be a challenging year as layoffs in the technology sector grew significantly, with more than [262,000 employees laid off across 1,180 firms](https://www.statista.com/statistics/199999/worldwide-tech-layoffs-covid-19/). In recent years, the technology ecosystem has experienced a constant shift in the way hiring managers reach out, companies hire, and the roles and responsibilities described in job postings. Particularly, 2023 proved to be a challenging year as layoffs in the technology sector grew significantly, with more than [262,000 employees laid off across 1,180 firms](https://www.statista.com/statistics/199999/worldwide-tech-layoffs-covid-19/).
Despite this change, DevOps, a field within the same ecosystem, has experienced continuous growth. In fact, the DevOps market size is expected to grow to [25.5 billion USD by 2028](https://www.marketsandmarkets.com/Market-Reports/devops-market-824.html#:~:text=The%20global%20DevOps%20market%20size,USD%2010.4%20billion%20in%202023.). This indicates that the roles and responsibilities of a DevOps engineer in the modern technology environment will evolve alongside this increasing demand. Despite this change, DevOps, a field within the same ecosystem, has experienced continuous growth. In fact, the DevOps market size is expected to grow to [25.5 billion USD by 2028](https://www.marketsandmarkets.com/Market-Reports/devops-market-824.html#:~:text=The%20global%20DevOps%20market%20size,USD%2010.4%20billion%20in%202023.). This indicates that the roles and responsibilities of a DevOps engineer in the modern technology environment will evolve alongside this increasing demand.
In this guide, we'll discuss the roles and responsibilities of a [DevOps engineer](https://roadmap.sh/devops), the importance of DevOps in teams, common roles within a DevOps team, and best practices for DevOps teams. Finally, the guide will offer roadmaps for your DevOps journey. In this guide, we'll discuss the roles and responsibilities of a DevOps engineer, the importance of DevOps in teams, common roles within a DevOps team, and best practices for DevOps teams. Finally, the guide will offer roadmaps for your DevOps journey.
A DevOps engineer's roles and responsibilities include: A DevOps engineer's roles and responsibilities include:

@ -1,3 +1,8 @@
# Cloud Messaging # Cloud Messaging
Firebase Cloud Messaging (FCM) is a powerful, battery-efficient messaging service that enables you to send messages reliably and securely to your Android applications. It enables you to send two types of messages: "notification messages" and "data messages". Notification messages are primarily meant for user notifications and will only be delivered when the application is in the foreground. On the other hand, data messages can handle even when the app is in the background or killed and can be used to send custom key-value pairs. FCM also supports various additional features, such as topic messaging to send messages to multiple devices subscribed to a common topic, device group messaging for sending messages to groups of user devices, and upstream messaging for sending messages from the client application to the FCM server. Firebase Cloud Messaging (FCM) is a powerful, battery-efficient messaging service that enables you to send messages reliably and securely to your Android applications. It enables you to send two types of messages: "notification messages" and "data messages". Notification messages are primarily meant for user notifications and will only be delivered when the application is in the foreground. On the other hand, data messages can handle even when the app is in the background or killed and can be used to send custom key-value pairs. FCM also supports various additional features, such as topic messaging to send messages to multiple devices subscribed to a common topic, device group messaging for sending messages to groups of user devices, and upstream messaging for sending messages from the client application to the FCM server.
Visit the following resources to learn more:
- [@official@Documentation](https://firebase.google.com/docs/cloud-messaging/android/client)
- [@video@Firebase Cloud Messaging](https://www.youtube.com/watch?v=sioEY4tWmLI&list=PLl-K7zZEsYLkuHRCtHTpi6JYHka8oHLft)

@ -1,3 +1,8 @@
# Crashlytics # Crashlytics
`Crashlytics` is a lightweight, real-time crash reporter that helps you track, prioritize, and fix stability issues that dismantle your app's quality. It delivers fast and precise information about crashes and helps you gain insights into your app's performance so you can pinpoint the exact line of code your app crashed on. Crashlytics offers a comprehensive suite of features like crash analysis, issue aggregation, and tracking user activities that led to a crash. This tool is now a part of Google's `Firebase` platform but can also be used independently. `Crashlytics` is a lightweight, real-time crash reporter that helps you track, prioritize, and fix stability issues that dismantle your app's quality. It delivers fast and precise information about crashes and helps you gain insights into your app's performance so you can pinpoint the exact line of code your app crashed on. Crashlytics offers a comprehensive suite of features like crash analysis, issue aggregation, and tracking user activities that led to a crash. This tool is now a part of Google's `Firebase` platform but can also be used independently.
Visit the following resources to learn more:
- [@official@Documentation](https://firebase.google.com/docs/crashlytics/get-started?platform=android)
- [@video@Firebase: Crashlytics](https://www.youtube.com/watch?v=LhjTAkifr6g)

@ -1,3 +1,8 @@
# Remote Config # Remote Config
Firebase Remote Config is a cloud service offered by Firebase. It lets you change the behavior and appearance of your app without requiring a new app release. By using Firebase Remote config, you can customize your app for different user segments, manage the core aspects of your app by modifying parameters externally, and conduct A/B tests to improve your app. It works efficiently by using default values that control the behavior and appearance of your app. When your app needs configuration information, it makes a request to the Firebase Remote Config server. If the server has updated values, these values replace the default ones, hence modifying the app's behavior or appearance according to your needs. Firebase Remote Config is a cloud service offered by Firebase. It lets you change the behavior and appearance of your app without requiring a new app release. By using Firebase Remote config, you can customize your app for different user segments, manage the core aspects of your app by modifying parameters externally, and conduct A/B tests to improve your app. It works efficiently by using default values that control the behavior and appearance of your app. When your app needs configuration information, it makes a request to the Firebase Remote Config server. If the server has updated values, these values replace the default ones, hence modifying the app's behavior or appearance according to your needs.
Visit the following resources to learn more:
- [@official@Documentation](https://firebase.google.com/docs/remote-config/get-started?platform=android)
- [@video@Firebase: Remote config](https://www.youtube.com/watch?v=pcnnbjAAIkI)

@ -1,5 +1,13 @@
# Angular Architecture # Angular Architecture
Angular follows a modular architecture pattern, dividing the application into distinct modules, components, services, and other elements, which enhances code organization and maintainability. The key building blocks include modules, which are containers grouping related components, services, directives, and other elements to ensure proper encapsulation and reusability. Components are the building blocks of Angular applications, representing parts of the user interface with associated logic, consisting of templates, styles, and a class defining behavior. Services encapsulate reusable business logic, data manipulation, and API communication, enabling data and functionality sharing across components. Directives are HTML attributes or elements that extend HTML functionality, allowing reusable behaviors across the application. Lastly, pipes transform data before displaying it in templates, providing convenient ways to format, filter, and sort data.
Visit the following resources to learn more: Visit the following resources to learn more:
- [@official@Angular coding style guide](https://angular.dev/style-guide) - [@official@Angular coding style guide](https://angular.dev/style-guide)
- [@article@The Ultimate Guide to Angular Architecture: Best Practices for efficient coding with Angular Framework](https://angulardive.com/blog/the-ultimate-guide-to-angular-architecture-best-practices-for-efficient-coding-with-angular-framework/)
- [@article@Modern Architectures with Angular Part 1: Strategic design with Sheriff and Standalone Components](https://www.angulararchitects.io/en/blog/modern-architectures-with-angular-part-1-strategic-design-with-sheriff-and-standalone-components/)
- [@article@Optimizing the architecture of large web applications with Angular](https://albertobasalo.medium.com/optimizing-the-architecture-of-large-web-applications-with-angular-79d03b01a92b)
- [@article@Angular Architecture Concepts and Patterns](https://www.bigscal.com/blogs/frontend/angular-architecture-concepts-and-patterns/)
- [@article@Top 10 Angular Architecture Mistakes](https://angularexperts.io/blog/top-10-angular-architecture-mistakes)
- [@article@Architecting Angular: A Guide to effective project structure](https://medium.com/@nile.bits/architecting-angular-a-guide-to-effective-project-structure-9756bae92262)

@ -1,4 +1,4 @@
# gPRC # gRPC
gRPC is a platform agnostic serialization protocol that is used to communicate between services. Designed by Google in 2015, it is a modern alternative to REST APIs. It is a binary protocol that uses HTTP/2 as a transport layer. It is a high performance, open source, general-purpose RPC framework that puts mobile and HTTP/2 first. gRPC is a platform agnostic serialization protocol that is used to communicate between services. Designed by Google in 2015, it is a modern alternative to REST APIs. It is a binary protocol that uses HTTP/2 as a transport layer. It is a high performance, open source, general-purpose RPC framework that puts mobile and HTTP/2 first.

@ -4,7 +4,7 @@ Git is a distributed version control system designed to handle projects of any s
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Learn Git & GitHub](/git-github) - [@roadmap@Learn Git & GitHub](https://roadmap.sh/git-github)
- [@video@Git & GitHub Crash Course For Beginners](https://www.youtube.com/watch?v=SWYqp7iY_Tc) - [@video@Git & GitHub Crash Course For Beginners](https://www.youtube.com/watch?v=SWYqp7iY_Tc)
- [@article@Learn Git with Tutorials, News and Tips - Atlassian](https://www.atlassian.com/git) - [@article@Learn Git with Tutorials, News and Tips - Atlassian](https://www.atlassian.com/git)
- [@article@Git Cheat Sheet](https://cs.fyi/guide/git-cheatsheet) - [@article@Git Cheat Sheet](https://cs.fyi/guide/git-cheatsheet)

@ -4,7 +4,7 @@ GitHub is a web-based platform for version control and collaboration using Git.
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Learn Git & GitHub](/git-github) - [@roadmap@Learn Git & GitHub](https://roadmap.sh/git-github)
- [@official@GitHub Website](https://github.com) - [@official@GitHub Website](https://github.com)
- [@video@What is GitHub?](https://www.youtube.com/watch?v=w3jLJU7DT5E) - [@video@What is GitHub?](https://www.youtube.com/watch?v=w3jLJU7DT5E)
- [@video@Git vs. GitHub: Whats the difference?](https://www.youtube.com/watch?v=wpISo9TNjfU) - [@video@Git vs. GitHub: Whats the difference?](https://www.youtube.com/watch?v=wpISo9TNjfU)

@ -4,7 +4,7 @@ Go, also known as Golang, is a statically typed, compiled programming language d
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated Go Roadmap](/golang) - [@roadmap@Visit Dedicated Go Roadmap](https://roadmap.sh/golang)
- [@official@Go Reference Documentation](https://go.dev/doc/) - [@official@Go Reference Documentation](https://go.dev/doc/)
- [@article@Go by Example - annotated example programs](https://gobyexample.com/) - [@article@Go by Example - annotated example programs](https://gobyexample.com/)
- [@article@Go, the Programming Language of the Cloud](https://thenewstack.io/go-the-programming-language-of-the-cloud/) - [@article@Go, the Programming Language of the Cloud](https://thenewstack.io/go-the-programming-language-of-the-cloud/)

@ -4,7 +4,7 @@ GraphQL is a query language for APIs and a runtime for executing those queries,
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@GraphQL Roadmap](/graphql) - [@roadmap@GraphQL Roadmap](https://roadmap.sh/graphql)
- [@official@GraphQL Official Website](https://graphql.org/) - [@official@GraphQL Official Website](https://graphql.org/)
- [@video@Tutorial - GraphQL Explained in 100 Seconds](https://www.youtube.com/watch?v=eIQh02xuVw4) - [@video@Tutorial - GraphQL Explained in 100 Seconds](https://www.youtube.com/watch?v=eIQh02xuVw4)
- [@feed@Explore top posts about GraphQL](https://app.daily.dev/tags/graphql?ref=roadmapsh) - [@feed@Explore top posts about GraphQL](https://app.daily.dev/tags/graphql?ref=roadmapsh)

@ -4,7 +4,7 @@ Java is a high-level, object-oriented programming language known for its portabi
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated Java Roadmap](/java) - [@roadmap@Visit Dedicated Java Roadmap](https://roadmap.sh/java)
- [@official@Java Website](https://www.java.com/) - [@official@Java Website](https://www.java.com/)
- [@article@W3 Schools Tutorials](https://www.w3schools.com/java/) - [@article@W3 Schools Tutorials](https://www.w3schools.com/java/)
- [@video@Complete Java course](https://www.youtube.com/watch?v=xk4_1vDrzzo) - [@video@Complete Java course](https://www.youtube.com/watch?v=xk4_1vDrzzo)

@ -4,7 +4,7 @@ JavaScript is a versatile, high-level programming language primarily used for ad
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated JavaScript Roadmap](/javascript) - [@roadmap@Visit Dedicated JavaScript Roadmap](https://roadmap.sh/javascript)
- [@article@The Modern JavaScript Tutorial](https://javascript.info/) - [@article@The Modern JavaScript Tutorial](https://javascript.info/)
- [@article@Build 30 Javascript projects in 30 days](https://javascript30.com/) - [@article@Build 30 Javascript projects in 30 days](https://javascript30.com/)
- [@video@JavaScript Crash Course for Beginners](https://youtu.be/hdI2bqOjy3c?t=2) - [@video@JavaScript Crash Course for Beginners](https://youtu.be/hdI2bqOjy3c?t=2)

@ -4,7 +4,7 @@ MongoDB is a NoSQL, open-source database designed for storing and managing large
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated MongoDB Roadmap](/mongodb) - [@roadmap@Visit Dedicated MongoDB Roadmap](https://roadmap.sh/mongodb)
- [@official@MongoDB Website](https://www.mongodb.com/) - [@official@MongoDB Website](https://www.mongodb.com/)
- [@official@Learning Path for MongoDB Developers](https://learn.mongodb.com/catalog) - [@official@Learning Path for MongoDB Developers](https://learn.mongodb.com/catalog)
- [@article@MongoDB Online Sandbox](https://mongoplayground.net/) - [@article@MongoDB Online Sandbox](https://mongoplayground.net/)

@ -4,7 +4,7 @@ Microsoft SQL Server (MS SQL) is a relational database management system develop
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@SQL Roadmap](/sql) - [@roadmap@SQL Roadmap](https://roadmap.sh/sql)
- [@article@MS SQL website](https://www.microsoft.com/en-ca/sql-server/) - [@article@MS SQL website](https://www.microsoft.com/en-ca/sql-server/)
- [@article@Tutorials for SQL Server](https://docs.microsoft.com/en-us/sql/sql-server/tutorials-for-sql-server-2016?view=sql-server-ver15) - [@article@Tutorials for SQL Server](https://docs.microsoft.com/en-us/sql/sql-server/tutorials-for-sql-server-2016?view=sql-server-ver15)
- [@video@SQL Server tutorial for beginners](https://www.youtube.com/watch?v=-EPMOaV7h_Q) - [@video@SQL Server tutorial for beginners](https://www.youtube.com/watch?v=-EPMOaV7h_Q)

@ -4,7 +4,7 @@ PostgreSQL is an advanced, open-source relational database management system (RD
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated PostgreSQL DBA Roadmap](/postgresql-dba) - [@roadmap@Visit Dedicated PostgreSQL DBA Roadmap](https://roadmap.sh/postgresql-dba)
- [@official@Official Website](https://www.postgresql.org/) - [@official@Official Website](https://www.postgresql.org/)
- [@article@Learn PostgreSQL - Full Tutorial for Beginners](https://www.postgresqltutorial.com/) - [@article@Learn PostgreSQL - Full Tutorial for Beginners](https://www.postgresqltutorial.com/)
- [@video@PostgreSQL in 100 Seconds](https://www.youtube.com/watch?v=n2Fluyr3lbc) - [@video@PostgreSQL in 100 Seconds](https://www.youtube.com/watch?v=n2Fluyr3lbc)

@ -4,7 +4,7 @@ Python is a high-level, interpreted programming language known for its readabili
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated Python Roadmap](/python) - [@roadmap@Visit Dedicated Python Roadmap](https://roadmap.sh/python)
- [@official@Python Website](https://www.python.org/) - [@official@Python Website](https://www.python.org/)
- [@article@Automate the Boring Stuff](https://automatetheboringstuff.com/) - [@article@Automate the Boring Stuff](https://automatetheboringstuff.com/)
- [@course@Python Full Course for free](https://www.youtube.com/watch?v=ix9cRaBkVe0) - [@course@Python Full Course for free](https://www.youtube.com/watch?v=ix9cRaBkVe0)

@ -1,3 +1,7 @@
# Real Time Data # Real Time Data
Real-time data refers to information that is processed and made available immediately or with minimal delay, allowing users or systems to react promptly to current conditions. This type of data is essential in applications requiring immediate updates and responses, such as financial trading platforms, online gaming, real-time analytics, and monitoring systems. Real-time data processing involves capturing, analyzing, and delivering information as it is generated, often using technologies like stream processing frameworks (e.g., Apache Kafka, Apache Flink) and low-latency databases. Effective real-time data systems can handle high-speed data flows, ensuring timely and accurate decision-making. Real-time data refers to information that is processed and made available immediately or with minimal delay, allowing users or systems to react promptly to current conditions. This type of data is essential in applications requiring immediate updates and responses, such as financial trading platforms, online gaming, real-time analytics, and monitoring systems. Real-time data processing involves capturing, analyzing, and delivering information as it is generated, often using technologies like stream processing frameworks (e.g., Apache Kafka, Apache Flink) and low-latency databases. Effective real-time data systems can handle high-speed data flows, ensuring timely and accurate decision-making.
Learn more from the following resources:
- [@article@Real-time data - Wiki](https://en.wikipedia.org/wiki/Real-time_data)
- [@article@What is Real-time Data?](https://www.qlik.com/us/streaming-data/real-time-data)

@ -4,7 +4,7 @@ Version Control Systems (VCS) are tools that manage and track changes to code or
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Learn Git & GitHub](/git-github) - [@roadmap@Learn Git & GitHub](https://roadmap.sh/git-github)
- [@article@Git](https://git-scm.com/) - [@article@Git](https://git-scm.com/)
- [@article@What is Version Control?](https://www.atlassian.com/git/tutorials/what-is-version-control) - [@article@What is Version Control?](https://www.atlassian.com/git/tutorials/what-is-version-control)
- [@video@Version Control System (VCS) - Everything you need to know](https://www.youtube.com/watch?v=SVkuliabq4g) - [@video@Version Control System (VCS) - Everything you need to know](https://www.youtube.com/watch?v=SVkuliabq4g)

@ -4,6 +4,6 @@ Angular is a component based front-end development framework built on TypeScript
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated Angular Roadmap](/angular) - [@roadmap@Visit Dedicated Angular Roadmap](https://roadmap.sh/angular)
- [@official@Official - Getting started with Angular](https://angular.io/start) - [@official@Official - Getting started with Angular](https://angular.io/start)
- [@feed@Explore top posts about Angular](https://app.daily.dev/tags/angular?ref=roadmapsh) - [@feed@Explore top posts about Angular](https://app.daily.dev/tags/angular?ref=roadmapsh)

@ -4,7 +4,7 @@ Go is an open source programming language supported by Google. Go can be used to
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated Go Roadmap](/golang) - [@roadmap@Visit Dedicated Go Roadmap](https://roadmap.sh/golang)
- [@official@A Tour of Go – Go Basics](https://go.dev/tour/welcome/1) - [@official@A Tour of Go – Go Basics](https://go.dev/tour/welcome/1)
- [@official@Go Reference Documentation](https://go.dev/doc/) - [@official@Go Reference Documentation](https://go.dev/doc/)
- [@article@Go by Example - annotated example programs](https://gobyexample.com/) - [@article@Go by Example - annotated example programs](https://gobyexample.com/)

@ -4,7 +4,7 @@ Python is a well known programming language which is both a strongly typed and a
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated Python Roadmap](/python) - [@roadmap@Visit Dedicated Python Roadmap](https://roadmap.sh/python)
- [@official@Python Website](https://www.python.org/) - [@official@Python Website](https://www.python.org/)
- [@official@Python Getting Started](https://www.python.org/about/gettingstarted/) - [@official@Python Getting Started](https://www.python.org/about/gettingstarted/)
- [@article@W3Schools - Python Tutorial ](https://www.w3schools.com/python/) - [@article@W3Schools - Python Tutorial ](https://www.w3schools.com/python/)

@ -4,7 +4,7 @@ React is the most popular front-end JavaScript library for building user interfa
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated React Roadmap](/react) - [@roadmap@Visit Dedicated React Roadmap](https://roadmap.sh/react)
- [@article@React Website](https://reactjs.org/) - [@article@React Website](https://reactjs.org/)
- [@article@Official Getting Started](https://reactjs.org/tutorial/tutorial.html) - [@article@Official Getting Started](https://reactjs.org/tutorial/tutorial.html)
- [@video@React JS Course for Beginners](https://www.youtube.com/watch?v=nTeuhbP7wdE) - [@video@React JS Course for Beginners](https://www.youtube.com/watch?v=nTeuhbP7wdE)

@ -4,7 +4,7 @@ Vue.js is an open-source JavaScript framework for building user interfaces and s
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated Vue Roadmap](/vue) - [@roadmap@Visit Dedicated Vue Roadmap](https://roadmap.sh/vue)
- [@article@Vue.js Website](https://vuejs.org/) - [@article@Vue.js Website](https://vuejs.org/)
- [@article@Official Getting Started](https://vuejs.org/v2/guide/) - [@article@Official Getting Started](https://vuejs.org/v2/guide/)
- [@video@Vue.js Course for Beginners](https://www.youtube.com/watch?v=FXpIoQ_rT_c) - [@video@Vue.js Course for Beginners](https://www.youtube.com/watch?v=FXpIoQ_rT_c)

@ -4,7 +4,7 @@ Go is an open source programming language supported by Google. Go can be used to
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated Go Roadmap](/golang) - [@roadmap@Visit Dedicated Go Roadmap](https://roadmap.sh/golang)
- [@official@A Tour of Go – Go Basics](https://go.dev/tour/welcome/1) - [@official@A Tour of Go – Go Basics](https://go.dev/tour/welcome/1)
- [@official@Go Reference Documentation](https://go.dev/doc/) - [@official@Go Reference Documentation](https://go.dev/doc/)
- [@article@Go by Example - annotated example programs](https://gobyexample.com/) - [@article@Go by Example - annotated example programs](https://gobyexample.com/)

@ -5,7 +5,7 @@ It was created in 1995 by James Gosling at Sun Microsystems and is one of the mo
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated Java Roadmap](/java) - [@roadmap@Visit Dedicated Java Roadmap](https://roadmap.sh/java)
- [@official@Java Website](https://www.java.com/) - [@official@Java Website](https://www.java.com/)
- [@article@W3 Schools Tutorials](https://www.w3schools.com/java/) - [@article@W3 Schools Tutorials](https://www.w3schools.com/java/)
- [@video@Java Crash Course](https://www.youtube.com/watch?v=eIrMbAQSU34) - [@video@Java Crash Course](https://www.youtube.com/watch?v=eIrMbAQSU34)

@ -4,7 +4,7 @@ Python is a well known programming language which is both a strongly typed and a
Visit the following resources to learn more: Visit the following resources to learn more:
- [@roadmap@Visit Dedicated Python Roadmap](/python) - [@roadmap@Visit Dedicated Python Roadmap](https://roadmap.sh/python)
- [@official@Python Website](https://www.python.org/) - [@official@Python Website](https://www.python.org/)
- [@official@Python Getting Started](https://www.python.org/about/gettingstarted/) - [@official@Python Getting Started](https://www.python.org/about/gettingstarted/)
- [@article@Automate the Boring Stuff](https://automatetheboringstuff.com/) - [@article@Automate the Boring Stuff](https://automatetheboringstuff.com/)

@ -1,10 +1,11 @@
# ARP # ARP
ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network. Address Resolution Protocol (ARP) is a crucial mechanism used in networking that allows the Internet Protocol (IP) to map an IP address to a corresponding physical address, commonly known as a Media Access Control (MAC) address. This protocol is essential for enabling devices within a Local Area Network (LAN) to communicate by translating IP addresses into specific hardware addresses.
When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address. When one device on a LAN wants to communicate with another, it needs to know the MAC address associated with the target device’s IP address. ARP facilitates this by sending out an ARP request, which broadcasts the target IP to all devices in the network. Each device checks the requested IP against its own. The device that recognizes the IP as its own responds with an ARP reply, which includes its MAC address.
Once the requesting device receives the MAC address, it updates its ARP cache—a table that stores IP-to-MAC address mappings—allowing it to send data directly to the correct hardware address.
The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address.
Learn more from the following resources: Learn more from the following resources:

@ -1,10 +1,6 @@
# ARP # ARP
ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network. ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network. When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address. The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address.
When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address.
The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address.
Learn more from the following resources: Learn more from the following resources:

@ -1,10 +1,6 @@
# ARP # ARP
ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network. ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network. When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address. The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address.
When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address.
The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address.
Learn more from the following resources: Learn more from the following resources:

@ -1,12 +1,6 @@
# ATT&CK # ATT&CK
MITRE ATT&CK® stands for Adversarial Tactics, Techniques & Common Knowledge. MITRE ATT&CK (Adversarial Tactics, Techniques, and Common Knowledge) is a globally-accessible knowledge base of adversary tactics and techniques based on real-world observations. It provides a comprehensive matrix of attack methods used by threat actors, organized into tactics like initial access, execution, persistence, and exfiltration. This framework is widely used by cybersecurity professionals for threat modeling, improving defensive capabilities, and developing more effective security strategies. ATT&CK helps organizations understand attacker behavior, assess their security posture, and prioritize defenses against the most relevant threats.
MITRE ATT&CK documents various strategies, methods, and processes employed by adversaries at every stage of a cybersecurity incident, from the reconnaissance and strategizing phase to the final implementation of the attack.
The insights provided by MITRE ATT&CK can empower security professionals and teams to enhance their defensive strategies and responses against potential threats.
This framework was created by the non-profit organization MITRE Corporation and is continuously updated with contributions from cybersecurity experts worldwide.
Learn more from the following resources: Learn more from the following resources:

@ -4,4 +4,8 @@ Amazon Web Services (AWS) is a leading cloud computing platform provided by Amaz
Learn more from the following resources: Learn more from the following resources:
- [@roadmap@AWS Roadmap](https://roadmap.sh/aws)
- [@official@AWS Website](https://aws.amazon.com)
- [@article@How to create an AWS account](https://grapplingdev.com/tutorials/how-to-create-aws-account)
- [@video@AWS Overview](https://www.youtube.com/watch?v=a9__D53WsUs)
- [@course@AWS Complete Tutorial](https://www.youtube.com/watch?v=B8i49C8fC3E) - [@course@AWS Complete Tutorial](https://www.youtube.com/watch?v=B8i49C8fC3E)

@ -1,37 +1,9 @@
# Azure # Azure
Microsoft Azure, often referred to simply as "Azure", is a cloud computing platform and service offered by Microsoft. Azure provides a wide range of cloud services, tools, and resources for organizations and developers to build, deploy, and manage applications on a global scale. With support for multiple programming languages and frameworks, Azure makes it easier to move existing applications or create new ones for the cloud environment. Azure is Microsoft's comprehensive cloud computing platform that offers a wide range of services for building, deploying, and managing applications. It provides infrastructure as a service (IaaS), platform as a service (PaaS), and software as a service (SaaS) solutions, supporting various programming languages, tools, and frameworks. Azure's services include virtual machines, storage, databases, AI and machine learning, IoT, and more. It offers global data center coverage, integrated DevOps tools, and robust security features, making it a versatile platform for businesses of all sizes to innovate, scale, and transform their operations in the cloud.
## Key Features Learn more from the following resources:
- **Compute Power**: Azure offers a variety of virtual machines, containers, and serverless computing options to execute and scale applications. - [@official@Azure Website](https://azure.microsoft.com)
- [@video@Azure DevOps Tutorial for Beginners](https://www.youtube.com/watch?v=4BibQ69MD8c)
- **Storage**: Azure provides several storage options - Blob Storage for unstructured data, File Storage for file shares, and Disk Storage for block storage. - [@feed@daily.dev Azure Feed](https://app.daily.dev/tags/azure)
- **Databases**: Azure offers managed relational databases, NoSQL databases, and in-memory databases for different needs and workloads.
- **Analytics**: Azure provides tools and services for big data and advanced analytics, including Azure Data Lake, Azure Machine Learning, and Power BI.
- **Networking**: Azure supports various networking services, such as Virtual Networks, Load Balancers, and Content Delivery Networks, to ensure secure and reliable connectivity to applications.
- **Security**: Azure provides a range of security services and features to help protect your applications and data, including Advanced Threat Protection, Azure Active Directory, and Azure Firewall.
- **Identity & Access Management**: Azure Active Directory (AD) provides identity and access management services, enabling secure sign-on and multi-factor authentication for applications and users.
- **Hybrid Cloud**: Azure supports hybrid cloud deployment, meaning you can run some parts of your infrastructure on-premises and some on Azure.
## Pros and Cons
**Pros**:
- Wide range of services and features
- Integration with other Microsoft products
- Strong support for hybrid cloud
- Good for large enterprises already using Microsoft technologies
**Cons**:
- Can be complex to navigate and manage
- Potentially costly depending on usage and services
Azure is an excellent choice for those looking to leverage a vast array of cloud services, particularly if you're already invested in the Microsoft ecosystem. It's important to keep in mind, though, that the platform's complexity can lead to a steeper learning curve, and managing costs can be challenging as usage scales.

@ -1,10 +1,7 @@
# Basics and Concepts of Threat Hunting # Basics and Concepts of Threat Hunting
Threat hunting is a proactive approach to cybersecurity where security professionals actively search for hidden threats or adversaries that may have bypassed traditional security measures, such as firewalls and intrusion detection systems. Rather than waiting for automated tools to flag suspicious activity, threat hunters use a combination of human intuition, threat intelligence, and advanced analysis techniques to identify indicators of compromise (IoCs) and potential threats within a network or system. Threat hunting is a proactive approach to cybersecurity where security professionals actively search for hidden threats or adversaries that may have bypassed traditional security measures, such as firewalls and intrusion detection systems. Rather than waiting for automated tools to flag suspicious activity, threat hunters use a combination of human intuition, threat intelligence, and advanced analysis techniques to identify indicators of compromise (IoCs) and potential threats within a network or system. The process involves several key concepts, starting with a **hypothesis**, where a hunter develops a theory about potential vulnerabilities or attack vectors that could be exploited. They then conduct a **search** through logs, traffic data, or endpoint activity to look for anomalies or patterns that may indicate malicious behavior. **Data analysis** is central to threat hunting, as hunters analyze vast amounts of network and system data to uncover subtle signs of attacks or compromises. If threats are found, the findings lead to **detection and mitigation**, allowing the security team to contain the threat, remove malicious entities, and prevent similar incidents in the future.
The process involves several key concepts, starting with a **hypothesis**, where a hunter develops a theory about potential vulnerabilities or attack vectors that could be exploited. They then conduct a **search** through logs, traffic data, or endpoint activity to look for anomalies or patterns that may indicate malicious behavior. **Data analysis** is central to threat hunting, as hunters analyze vast amounts of network and system data to uncover subtle signs of attacks or compromises. If threats are found, the findings lead to **detection and mitigation**, allowing the security team to contain the threat, remove malicious entities, and prevent similar incidents in the future.
Threat hunting also involves **continuous learning** and adapting, as hunters refine their techniques based on evolving attack methods and the latest threat intelligence. This approach improves an organization’s overall security posture by identifying sophisticated or previously unknown threats that might evade conventional security measures.
Learn more from the following resources: Learn more from the following resources:

@ -1,14 +1,6 @@
# Basics of Computer Networking # Basics of Computer Networking
Computer networking involves connecting multiple computers and devices to share resources, such as data, applications, and internet connections. Networks can range from small local area networks (LANs) to large-scale wide area networks (WANs), such as the internet. The basic components of a network include devices (computers, servers, routers), transmission media (wired or wireless), and network protocols, which govern communication between devices. Computer networking is the practice of connecting computers and devices to share data and resources. It involves the use of protocols like TCP/IP for communication, hardware such as routers and switches for directing traffic, and various network topologies (e.g., star, mesh, bus) for organizing connections. Networks can be categorized by size and scope, from small local area networks (LANs) to wide area networks (WANs) that span large geographical areas. Key concepts include IP addressing, subnetting, DNS for name resolution, and network security measures. Understanding networking basics is crucial for managing data flow, troubleshooting connectivity issues, and ensuring efficient communication in modern computing environments.
Key concepts in networking include:
1. **IP Addressing**: Every device on a network has a unique Internet Protocol (IP) address, which allows it to be identified and communicate with other devices.
2. **Subnetting**: This involves dividing a network into smaller, manageable sections to optimize performance and security.
3. **Routing**: Routers are used to forward data between different networks, ensuring that information reaches the correct destination.
4. **DNS**: The Domain Name System translates human-readable domain names into IP addresses, enabling easier navigation and communication on the internet.
5. **TCP/IP Protocol**: The Transmission Control Protocol/Internet Protocol (TCP/IP) suite is the foundation of most networks, handling how data is broken into packets, transmitted, and reassembled.
Learn more from the following resources: Learn more from the following resources:

@ -1,8 +1,6 @@
# Basics of Reverse Engineering # Basics of Reverse Engineering
Reverse engineering is the process of deconstructing a system, software, or hardware to understand its internal workings, design, and functionality without having access to its source code or original documentation. In cybersecurity, reverse engineering is often used to analyze malware or software vulnerabilities to uncover how they operate, allowing security professionals to develop defenses, patches, or detection methods. This involves breaking down the binary code, disassembling it into machine code, and then interpreting it to understand the logic, behavior, and intent behind the program. Reverse engineering is the process of deconstructing a system, software, or hardware to understand its internal workings, design, and functionality without having access to its source code or original documentation. In cybersecurity, reverse engineering is often used to analyze malware or software vulnerabilities to uncover how they operate, allowing security professionals to develop defenses, patches, or detection methods. This involves breaking down the binary code, disassembling it into machine code, and then interpreting it to understand the logic, behavior, and intent behind the program. Reverse engineering can also be used in hardware to investigate a device's design or performance, or in software development for compatibility, debugging, or enhancing legacy systems. The process typically includes static analysis, where the code is examined without execution, and dynamic analysis, where the program is executed in a controlled environment to observe its runtime behavior. The insights gained through reverse engineering are valuable for improving security, fixing bugs, or adapting systems for different uses. However, it’s important to be aware of the legal and ethical boundaries, as reverse engineering certain software or hardware can violate intellectual property rights.
Reverse engineering can also be used in hardware to investigate a device's design or performance, or in software development for compatibility, debugging, or enhancing legacy systems. The process typically includes static analysis, where the code is examined without execution, and dynamic analysis, where the program is executed in a controlled environment to observe its runtime behavior. The insights gained through reverse engineering are valuable for improving security, fixing bugs, or adapting systems for different uses. However, it’s important to be aware of the legal and ethical boundaries, as reverse engineering certain software or hardware can violate intellectual property rights.
Learn more from the following resources: Learn more from the following resources:

@ -1,8 +1,6 @@
# Basics of Subnetting # Basics of Subnetting
Subnetting is a technique used in computer networking to divide a large network into smaller, more manageable sub-networks, or "subnets." It enhances network performance and security by reducing broadcast traffic and enabling better control over IP address allocation. Each subnet has its own range of IP addresses, which allows network administrators to optimize network traffic and reduce congestion by isolating different sections of a network. Subnetting is a technique used in computer networking to divide a large network into smaller, more manageable sub-networks, or "subnets." It enhances network performance and security by reducing broadcast traffic and enabling better control over IP address allocation. Each subnet has its own range of IP addresses, which allows network administrators to optimize network traffic and reduce congestion by isolating different sections of a network. In subnetting, an IP address is split into two parts: the network portion and the host portion. The network portion identifies the overall network, while the host portion identifies individual devices within that network. Subnet masks are used to define how much of the IP address belongs to the network and how much is reserved for hosts. By adjusting the subnet mask, administrators can create multiple subnets from a single network, with each subnet having a limited number of devices. Subnetting is particularly useful for large organizations, allowing them to efficiently manage IP addresses, improve security by segmenting different parts of the network, and control traffic flow by minimizing unnecessary data transmissions between segments.
In subnetting, an IP address is split into two parts: the network portion and the host portion. The network portion identifies the overall network, while the host portion identifies individual devices within that network. Subnet masks are used to define how much of the IP address belongs to the network and how much is reserved for hosts. By adjusting the subnet mask, administrators can create multiple subnets from a single network, with each subnet having a limited number of devices. Subnetting is particularly useful for large organizations, allowing them to efficiently manage IP addresses, improve security by segmenting different parts of the network, and control traffic flow by minimizing unnecessary data transmissions between segments.
Learn more from the following resources: Learn more from the following resources:

@ -1,8 +1,6 @@
# Basics of Threat Intel, OSINT # Basics of Threat Intel, OSINT
Threat Intelligence (Threat Intel) and Open-Source Intelligence (OSINT) are both critical components in cybersecurity that help organizations stay ahead of potential threats. Threat Intelligence refers to the collection, analysis, and dissemination of information about potential or current attacks targeting an organization. This intelligence typically includes details on emerging threats, attack patterns, malicious IP addresses, and indicators of compromise (IoCs), helping security teams anticipate, prevent, or mitigate cyberattacks. Threat Intel can be sourced from both internal data (such as logs or past incidents) and external feeds, and it helps in understanding the tactics, techniques, and procedures (TTPs) of adversaries. Threat Intelligence (Threat Intel) and Open-Source Intelligence (OSINT) are both critical components in cybersecurity that help organizations stay ahead of potential threats. Threat Intelligence refers to the collection, analysis, and dissemination of information about potential or current attacks targeting an organization. This intelligence typically includes details on emerging threats, attack patterns, malicious IP addresses, and indicators of compromise (IoCs), helping security teams anticipate, prevent, or mitigate cyberattacks. Threat Intel can be sourced from both internal data (such as logs or past incidents) and external feeds, and it helps in understanding the tactics, techniques, and procedures (TTPs) of adversaries. OSINT, a subset of Threat Intel, involves gathering publicly available information from open sources to assess and monitor threats. These sources include websites, social media, forums, news articles, and other publicly accessible platforms. OSINT is often used for reconnaissance to identify potential attack vectors, compromised credentials, or leaks of sensitive data. It’s also a valuable tool in tracking threat actors, as they may leave traces in forums or other public spaces. Both Threat Intel and OSINT enable organizations to be more proactive in their cybersecurity strategies by identifying vulnerabilities, understanding attacker behavior, and implementing timely defenses based on actionable insights.
OSINT, a subset of Threat Intel, involves gathering publicly available information from open sources to assess and monitor threats. These sources include websites, social media, forums, news articles, and other publicly accessible platforms. OSINT is often used for reconnaissance to identify potential attack vectors, compromised credentials, or leaks of sensitive data. It’s also a valuable tool in tracking threat actors, as they may leave traces in forums or other public spaces. Both Threat Intel and OSINT enable organizations to be more proactive in their cybersecurity strategies by identifying vulnerabilities, understanding attacker behavior, and implementing timely defenses based on actionable insights.
Learn more from the following resources: Learn more from the following resources:

@ -8,5 +8,6 @@ Next, **remediation** is carried out through patching, configuration changes, or
Learn more from the following resources: Learn more from the following resources:
- [@article@What is vulnerability management?](https://www.rapid7.com/fundamentals/vulnerability-management-and-scanning/) - [@article@What is vulnerability management? - Rapid7](https://www.rapid7.com/fundamentals/vulnerability-management-and-scanning/)
- [@article@What is Vulnerability Management? - CrowdStrike](https://www.crowdstrike.com/cybersecurity-101/vulnerability-management/)
- [@video@Vulnerability Management explained by experts](https://www.youtube.com/watch?v=RE6_Lo2wSIg) - [@video@Vulnerability Management explained by experts](https://www.youtube.com/watch?v=RE6_Lo2wSIg)

@ -1,8 +1,6 @@
# Blue Team vs Red Team vs Purple Team # Blue Team vs Red Team vs Purple Team
In the context of cybersecurity, Blue Team, Red Team, and Purple Team are terms used to describe different roles and methodologies employed to ensure the security of an organization or system. Let's explore each one in detail. In the context of cybersecurity, Blue Team, Red Team, and Purple Team are terms used to describe different roles and methodologies employed to ensure the security of an organization or system. Let's explore each one in detail. In cybersecurity, Blue Team and Red Team refer to opposing groups that work together to improve an organization's security posture. The Blue Team represents defensive security personnel who protect systems and networks from attacks, while the Red Team simulates real-world adversaries to test the Blue Team's defenses. Purple Team bridges the gap between the two, facilitating collaboration and knowledge sharing to enhance overall security effectiveness. This approach combines the defensive strategies of the Blue Team with the offensive tactics of the Red Team, creating a more comprehensive and dynamic security framework that continuously evolves to address emerging threats and vulnerabilities.
In cybersecurity, Blue Team and Red Team refer to opposing groups that work together to improve an organization's security posture. The Blue Team represents defensive security personnel who protect systems and networks from attacks, while the Red Team simulates real-world adversaries to test the Blue Team's defenses. Purple Team bridges the gap between the two, facilitating collaboration and knowledge sharing to enhance overall security effectiveness. This approach combines the defensive strategies of the Blue Team with the offensive tactics of the Red Team, creating a more comprehensive and dynamic security framework that continuously evolves to address emerging threats and vulnerabilities.
Learn more from the following resources: Learn more from the following resources:

@ -5,3 +5,4 @@ Box is a popular cloud storage service that provides individuals and businesses
Learn more from the following resources: Learn more from the following resources:
- [@official@Box Website](https://www.box.com/en-gb/home) - [@official@Box Website](https://www.box.com/en-gb/home)
- [@video@Box Cloud Storage Review 2024](https://www.youtube.com/watch?v=ktNDLO1T96c)

@ -1,8 +1,6 @@
# IP # IP
IP, or Internet Protocol, is a fundamental concept in cybersecurity that refers to the way data is transferred across networks, specifically the internet. It is a core component of the internet's architecture and serves as the primary building block for communication between devices connected to the network. IP, or Internet Protocol, is a fundamental concept in cybersecurity that refers to the way data is transferred across networks, specifically the internet. It is a core component of the internet's architecture and serves as the primary building block for communication between devices connected to the network. An IP address is a unique identifier assigned to each device connected to a network, like a computer or smartphone. It comprises a series of numbers separated by dots (e.g., 192.168.1.1). IP addresses can be either IPv4 (32-bit) or the newer IPv6 (128-bit) format, which provides more available addresses. They allow devices to send and receive data packets to and from other devices on the internet.
An IP address is a unique identifier assigned to each device connected to a network, like a computer or smartphone. It comprises a series of numbers separated by dots (e.g., 192.168.1.1). IP addresses can be either IPv4 (32-bit) or the newer IPv6 (128-bit) format, which provides more available addresses. They allow devices to send and receive data packets to and from other devices on the internet.
Learn more from the following resources: Learn more from the following resources:

@ -1,39 +1,8 @@
# LAN # LAN
A **Local Area Network (LAN)** is a vital component of cyber security that you must understand. This chapter covers a brief introduction to LAN, its basic functionalities and importance in maintaining a secure network environment. A Local Area Network (LAN) is a computer network that interconnects computers and devices within a limited area, such as a home, office, school, or small group of buildings. LANs typically use Ethernet or Wi-Fi technologies to enable high-speed data communication among connected devices. They allow for resource sharing, including files, printers, and internet connections. LANs are characterized by higher data transfer rates, lower latency, and more direct control over network configuration and security compared to wide area networks (WANs). Common LAN applications include file sharing, collaborative work, local hosting of websites or services, and networked gaming. The advent of software-defined networking and cloud technologies has expanded LAN capabilities, enabling more flexible and scalable local network infrastructures.
## What is LAN? Learn more from the following resources:
LAN stands for Local Area Network, which is a group of computers and other devices interconnected within a limited geographical area, like an office, school campus or even a home. These networks facilitate sharing of resources, data and applications among connected devices. They can be wired (Ethernet) or wireless (Wi-Fi). - [@article@What is a LAN?](https://www.cisco.com/c/en_uk/products/switches/what-is-a-lan-local-area-network.html)
- [@video@LAN vs. WAN: What's the Difference?](https://www.youtube.com/watch?v=5OoX_cRLaNM)
## Key Components of LAN
LAN comprises several key components, including:
- **Workstations**: End user devices like computers, laptops or smartphones connected to the network.
- **Servers**: Computers that provide resources and services to the workstations.
- **Switches**: Networking devices that connect workstations and servers, and distribute network traffic efficiently.
- **Routers**: Devices that connect the LAN to the internet or other networks (e.g., Wide Area Networks or WANs).
## Importance of LAN
LANs play a fundamental role in modern organizations, providing:
- **Resource Sharing**: They allow sharing of resources such as printers, scanners, storage drives and software applications across multiple users.
- **Communication**: They enable faster communication between connected devices and allow users to collaborate effectively using email, chat or VoIP services.
- **Data Centralization**: They allow data storage and retrieval from central servers rather than individual devices, which simplifies data management and backups.
- **Scalability**: LANs can be easily expanded to accommodate more users and resources to support business growth.
## LAN Security
Understanding LAN is crucial for maintaining a secure network environment. Since a LAN connects multiple devices, it forms the central point of various security vulnerabilities. Implementing effective security measures is vital to prevent unauthorized access, data leaks, and malware infections. Some best practices for securing your LAN include:
- **Firewalls**: Deploy hardware-based and software-based firewalls to protect your network from external and internal threats.
- **Antivirus Software**: Use antivirus applications on workstations and servers to prevent malware infections.
- **Wireless Security**: Implement robust Wi-Fi security measures like WPA2 encryption and strong passwords to prevent unauthorized access.
- **Access Controls**: Implement network access controls to grant authorized users access to specific resources and data.
- **Network Segmentation**: Divide the network into separate zones based on required access levels and functions to contain potential threats.
- **Regular Updates**: Keep your workstations, servers and network devices up-to-date with security patches and updates to fix vulnerabilities.
- **Network Monitoring**: Use network monitoring tools to keep track of network traffic and identify potential threats or anomalies.
By understanding the components and importance of LAN, you can effectively contribute to improving your organization's cyber security posture. In the next chapter, we will discuss additional cyber security topics that you need to be familiar with.

@ -1,27 +1,8 @@
# LDAP # LDAP
LDAP is a protocol used to access directory services, i.e., a hierarchical database that holds information about various objects, such as users, groups, computer accounts, and more. In the context of cybersecurity, it's essential in storing information related to authentication, authorization, and user profiles. LDAP is primarily utilized in enterprise environments as a centralized system for managing user accounts and their permissions. LDAP (Lightweight Directory Access Protocol) is a standardized application protocol for accessing and maintaining distributed directory information services over an IP network. It's primarily used for querying and modifying directory services, such as user authentication and information lookup. LDAP organizes data in a hierarchical tree structure and is commonly used in enterprise environments for centralized user management, authentication, and authorization. It supports features like single sign-on and can integrate with various applications and services. LDAP is widely used in conjunction with Active Directory and other directory services to provide a centralized repository for user accounts, groups, and other organizational data, facilitating efficient user and resource management in networked environments.
**How LDAP works** Learn more from the following resources:
- It is based on a client-server model, where the client sends a request to the server (usually an LDAP directory server), and the server responds accordingly. - [@article@What Is LDAP & How Does It Work?](https://www.okta.com/uk/identity-101/what-is-ldap/)
- LDAP servers store directory entries in a hierarchical (tree-like) structure, starting from the root (known as the "base DN") and following a series of branches down to individual entries. - [@video@](https://www.youtube.com/watch?v=vy3e6ekuqqg)
- Each entry in the LDAP directory has a distinguished name (DN), which uniquely identifies the entry in the hierarchy.
**LDAP in Cyber Security**
In cybersecurity, LDAP servers are often used for the following purposes:
- **Authentication**: LDAP stores user account and password information, which can be used to authenticate users to access specific applications or resources.
- **Authorization**: Using LDAP directory groups, you can manage access controls for users and grant or deny permissions based on their role or membership.
- **User Management**: LDAP provides a single, centralized repository for managing user account information, making it easier to maintain consistent user data across multiple systems or applications.
**LDAP Security Best Practices**
To enhance the security of your LDAP implementation, consider adopting these best practices:
- Use secure protocols like LDAPS (LDAP over SSL) or StartTLS to encrypt the data transmitted between the client and the LDAP server.
- Implement strong access control rules to ensure that only authorized clients can access the LDAP directory.
- Regularly update and patch both client-side and server-side LDAP software to protect against known vulnerabilities.
- Limit the searchable scope on the client-side, to minimize the risk of information disclosure.
- Use strong authentication methods, such as multi-factor authentication (MFA), to secure access to the LDAP directory.
In conclusion, LDAP is a critical component in many enterprise-level cybersecurity architectures, as it plays a vital role in handling authentication and authorization processes. To ensure the security of your LDAP implementation, it's crucial to follow best practices and carefully manage access to directory services.

@ -1,8 +1,6 @@
# Lightweight Directory Access Protocol Secure (LDAPS) # Lightweight Directory Access Protocol Secure (LDAPS)
LDAPS (Lightweight Directory Access Protocol Secure) is a secure version of the Lightweight Directory Access Protocol (LDAP), which is used to access and manage directory services over a network. LDAP is commonly employed for user authentication, authorization, and management in environments like Active Directory, where it helps manage access to resources such as applications and systems. LDAPS (Lightweight Directory Access Protocol Secure) is a secure version of the Lightweight Directory Access Protocol (LDAP), which is used to access and manage directory services over a network. LDAP is commonly employed for user authentication, authorization, and management in environments like Active Directory, where it helps manage access to resources such as applications and systems. LDAPS adds security by encrypting LDAP traffic using SSL/TLS (Secure Sockets Layer/Transport Layer Security) protocols, protecting sensitive information like usernames, passwords, and directory data from being intercepted or tampered with during transmission. This encryption ensures data confidentiality and integrity, making LDAPS a preferred choice for organizations that require secure directory communication.
LDAPS adds security by encrypting LDAP traffic using SSL/TLS (Secure Sockets Layer/Transport Layer Security) protocols, protecting sensitive information like usernames, passwords, and directory data from being intercepted or tampered with during transmission. This encryption ensures data confidentiality and integrity, making LDAPS a preferred choice for organizations that require secure directory communication.
By using LDAPS, organizations can maintain the benefits of LDAP while ensuring that sensitive directory operations are protected from potential eavesdropping or man-in-the-middle attacks on the network. By using LDAPS, organizations can maintain the benefits of LDAP while ensuring that sensitive directory operations are protected from potential eavesdropping or man-in-the-middle attacks on the network.

@ -1,43 +1,12 @@
# Linux # Linux
Linux is an open-source operating system (OS) that is widely popular due to its flexibility, stability, and security features. As a Unix-based OS, Linux has a command-line interface, which allows users to perform various tasks through text commands. However, graphical user interfaces (GUIs) can also be installed for ease of use. Linux is an open-source, Unix-like operating system kernel first released by Linus Torvalds in 1991. It forms the core of various operating systems known as Linux distributions. Linux is known for its stability, security, and flexibility, making it popular for servers, embedded systems, and increasingly for desktop use. It supports a wide range of hardware and offers powerful command-line interfaces alongside graphical user interfaces. Linux adheres to Unix principles, emphasizing modularity and the philosophy of "do one thing and do it well." Its open-source nature allows for community-driven development and customization. Linux is widely used in cloud computing, supercomputers, and Android devices, and is a fundamental component of the LAMP (Linux, Apache, MySQL, PHP) web server stack.
## Key Features
- **Open-source**: Anyone can view, modify, and distribute the Linux source code, promoting collaboration and continuous improvement within the OS community.
- **Modular design**: Linux can be customized for various computing environments, such as desktops, servers, and embedded systems.
- **Stability and performance**: Linux is well-known for its ability to handle heavy loads without crashing, making it an ideal choice for servers.
- **Strong Security**: Linux has robust security mechanisms, such as file permissions, a built-in firewall, and an extensive user privilege system.
- **Large Community**: Linux has a vast, active user community that offers a wealth of knowledge, user-contributed software, and support forums.
## Popular Linux Distributions
There are numerous Linux distributions available, catering to specific user needs and preferences. Some popular distributions include:
- **Ubuntu**: A user-friendly distribution suitable for beginners, often used for desktop environments.
- **Fedora**: A cutting-edge distribution with frequent updates and innovative features, ideal for developers and advanced users.
- **Debian**: A very stable distribution that prioritizes free software and benefits from a large, active community.
- **Arch Linux**: A highly customizable distribution that allows users to build their system from the ground up, suited for experienced users.
- **CentOS**: A distribution focused on stability, security, and manageability, making it a popular choice for server environments.
## Security Best Practices for Linux
While Linux is inherently secure, there are best practices to enhance your system's security further:
- Keep your system updated: Regularly update your kernel, OS packages, and installed software to ensure you have the latest security patches.
- Enable a firewall: Configure and enable a firewall, such as `iptables`, to control incoming and outgoing network traffic.
- Use strong passwords and user accounts: Create separate accounts with strong passwords for different users and grant them only the required privileges.
- Disable unused services: Unnecessary services can be potential security risks; ensure only required services are running on your system.
- Implement a Security-Enhanced Linux (SELinux) policy: SELinux provides a mandatory access control (MAC) system that restricts user and process access to system resources.
By understanding Linux's features and best practices, you can leverage its powerful capabilities and robust security features to enhance your computing environment's performance and safety.
Learn more from the following resources: Learn more from the following resources:
- [@roadmap@Linux Roadmap](https://roadmap.sh/linux) - [@roadmap@Linux Roadmap](https://roadmap.sh/linux)
- [@article@Learn Linux](https://linuxjourney.com/)
- [@video@Linux in 100 Seconds](https://www.youtube.com/watch?v=rrB13utjYV4)
- [@video@Introduction to Linux](https://youtu.be/sWbUDq4S6Y8)
- [@article@Linux Commands Cheat Sheet](https://cdn.hostinger.com/tutorials/pdf/Linux-Commands-Cheat-Sheet.pdf) - [@article@Linux Commands Cheat Sheet](https://cdn.hostinger.com/tutorials/pdf/Linux-Commands-Cheat-Sheet.pdf)
- [@course@Linux from scratch - Cisco](https://www.netacad.com/courses/os-it/ndg-linux-unhatched) - [@course@Linux from scratch - Cisco](https://www.netacad.com/courses/os-it/ndg-linux-unhatched)
- [@video@Linux in 100 Seconds](https://www.youtube.com/watch?v=rrB13utjYV4)
- [@video@Introduction to Linux](https://youtu.be/sWbUDq4S6Y8)
- [@feed@Explore top posts about Linux](https://app.daily.dev/tags/linux?ref=roadmapsh) - [@feed@Explore top posts about Linux](https://app.daily.dev/tags/linux?ref=roadmapsh)

@ -1,43 +1,4 @@
# Local Auth # Local Auth
In this section, we will discuss local authentication, which is a crucial aspect of ensuring the security of your computer systems and networks. Local authentication refers to the process of verifying a user's identity on a specific device or system without relying on external servers or networks. It typically involves storing and checking credentials directly on the device itself. Common methods include username/password combinations, biometrics (fingerprint, face recognition), or PIN codes. Local authentication is often used for device access, offline applications, or as a fallback when network-based authentication is unavailable. While it offers quick access and works without internet connectivity, it can be less secure than centralized authentication systems and more challenging to manage across multiple devices. Local authentication is commonly used in personal devices, standalone systems, and scenarios where network-based authentication is impractical or unnecessary.
## What is Local Authentication?
Local authentication is the process of verifying a user's identity on a single, isolated system, such as a computer or a server. It refers to the direct checking of user credentials (such as username and password) against a locally stored database, instead of relying on a centralized authentication service.
## How Does Local Authentication Work?
In a local authentication setup, user and password information is stored on the same system where authentication takes place. When a user attempts to log in, the system checks the provided credentials against the stored data. If they match, access is granted, otherwise, it is denied.
Here is a high-level overview of how local authentication works:
- User attempts to log in by entering their credentials, typically a username and password.
- System checks the provided credentials against a local database.
- If the credentials match an entry in the database, access is granted to the user.
- If the credentials do not match any entries in the database, access is denied and an error message is displayed.
## Advantages and Disadvantages of Local Authentication
## Advantages
- **Simplicity**: Local authentication is simple to set up, as it doesn't require any external authentication services or additional infrastructure.
- **No Dependency on Internet Connectivity**: Since user credentials are stored locally, users can still authenticate even if there is no internet connection.
## Disadvantages
- **Scalability**: Managing and maintaining user accounts on individual systems becomes difficult when the number of systems and users increases.
- **Increased Risk**: Information about user accounts, including passwords, may be stored in plain text, making them vulnerable to unauthorized access.
- **Incomplete Security**: Local authentication alone may not provide sufficient security to protect sensitive information, necessitating the use of additional security measures such as secure socket layer (SSL) and two-factor authentication (2FA).
## Best Practices for Local Authentication
To ensure the security of your system while using local authentication:
- Always use strong, unique passwords for each user account.
- Regularly update and patch the system to keep it secure against known vulnerabilities.
- Consider implementing additional security measures, such as encryption, to protect sensitive data.
- Periodically review user accounts to ensure they have the appropriate access privileges and are no longer needed.
- Implement logs and monitoring to detect any suspicious activity on your system relating to user authentication.
In conclusion, local authentication can be an effective method for authenticating users on a single system. However, it is important to be aware of its limitations and make sure to implement additional security measures when necessary to keep your data safe.

@ -1,25 +1,8 @@
# localhost # localhost
Localhost (also known as loopback address) is a term used to define a network address that is used by a device (usually a computer or a server) to refer to itself. In other words, it's a way for your device to establish a network connection to itself. The most commonly used IP address for localhost is `127.0.0.1`, which is reserved as a loopback address in IPv4 networks. For IPv6 networks, it's represented by `::1`. **Localhost** refers to the standard hostname used to access the local computer on which a network service or application is running. It resolves to the loopback IP address `127.0.0.1` for IPv4 or `::1` for IPv6. When you connect to `localhost`, you're effectively communicating with your own machine, allowing you to test and debug network services or applications locally without accessing external networks.
## Purpose and Usage of Localhost Learn more from the following resources:
Localhost is useful for a variety of reasons, such as: - [@article@What is localhost?](https://www.freecodecamp.org/news/what-is-localhost/)
- [@video@What is localhost? | Explained](https://www.youtube.com/watch?v=m98GX51T5dI)
- **Testing and Development**: Developers can use localhost to develop and test web applications or software without the need for connecting to external network resources.
- **Network Services**: Some applications and servers use localhost to provide network services to the local system only, optimizing performance and security.
- **Troubleshooting**: Localhost can be used as a diagnostic tool to test if the network stack on the device is functioning correctly.
## Connecting to Localhost
To connect to localhost, you can use several methods depending on the tasks you want to accomplish:
- **Web Browser**: If you're running a local web server, you can simply enter `http://127.0.0.1` or `http://localhost` in your browser's address bar and access the locally hosted web application.
- **Command Line**: You can use utilities like `ping`, `traceroute`, or `telnet` at the command prompt to verify connectivity and network functionality using localhost.
- **Application Settings**: Some applications, such as web servers or database servers, may have configuration settings that allow you to bind them to the loopback address (`127.0.0.1` or `::1`). This will restrict the services to the local system and prevent them from being accessed by external sources.
Remember, connections to localhost do not pass through your computer's physical network interfaces, and as such, they're not subject to the same security risks or performance limitations that a real network connection might have.

@ -1,48 +1,9 @@
# LOLBAS # LOLBAS
**LoLBAS** stands for **Living off the Land Binaries and Scripts**. It is a collection of tools, utilities, and scripts, often built-in within an operating system, that attackers exploit for unintended purposes. These tools can assist the adversaries in achieving their objectives without the need to install any additional software, thus avoiding detection by many security solutions. **LOLBAS** (Living Off the Land Binaries and Scripts) refers to a collection of legitimate system binaries and scripts that can be abused by attackers to perform malicious actions while evading detection. These tools, which are often part of the operating system or installed software, can be leveraged for various purposes, such as executing commands, accessing data, or modifying system configurations, thereby allowing attackers to carry out their activities without deploying custom malware. The use of LOLBAS techniques makes it harder for traditional security solutions to detect and prevent malicious activities since the binaries and scripts used are typically trusted and deemed legitimate.
In this section, we will explore the concept and significance of LoLBAS, and the challenges they present in the context of cyber security. Learn more from the following resources:
## What is LoLBAS? - [@official@LOLBAS project](https://lolbas-project.github.io/#)
- [@article@Understanding the risks of LOLBAS in security](https://pentera.io/blog/the-lol-isnt-so-funny-when-it-bites-you-in-the-bas/)
LoLBAS are legitimate tools, binaries, and scripts that are already present in a system. These may be default OS utilities, like PowerShell or Command Prompt, or commonly installed applications, such as Java or Python. Adversaries utilize these tools to perform malicious activities, as they blend into the environment and are less likely to raise any alarms. - [@video@LOLBAS T1105, MS Process Abuse](https://www.youtube.com/watch?v=fq2_VvAU29g)
Some examples of LoLBAS include:
- PowerShell: Used for executing commands and scripts for various administrative functions.
- Cscript and Wscript: Used for executing VBScript and JScript files.
- Certutil: Used for updating certificate store but can also be leveraged to download files from the internet.
## Why LoLBAS are popular among adversaries?
There are several reasons why adversaries choose to use LoLBAS for their malicious purposes:
- **No additional software required**: As these tools are already a part of the target system, there is no need to install new software that could potentially be detected.
- **Ease of use**: Many LoLBAS provide powerful capabilities without requiring complex coding. As a result, adversaries can swiftly implement and execute tasks using them.
- **Masquerading as legitimate actions**: Since LoLBAS are typically used for legitimate purposes, suspicious activities using these tools can blend in with regular traffic, making it difficult to identify and detect.
## Challenges posed by LoLBAS
Utilizing LoLBAS presents unique challenges in cyber security due to the following reasons:
- **Difficulty in detection**: Identifying and differentiating between malicious and legitimate uses of these tools is a challenging task.
- **False positives**: Blocking, limiting, or monitoring the usage of LoLBAS frequently leads to false positives, as legitimate users might also rely on these tools.
## Securing against LoLBAS attacks
To protect against LoLBAS-based attacks, organizations should consider taking the following steps:
- **Monitor behavior**: Establish baselines of normal system behavior and monitor for deviations, which could suggest malicious use of LoLBAS.
- **Least privilege principle**: Apply the principle of least privilege by limiting user permissions, reducing the potential attack surface.
- **Harden systems**: Remove or disable unnecessary tools and applications that could be exploited by adversaries.
- **Educate users**: Train users on the risks and signs of LoLBAS usage and encourage them to report suspicious activity.
- **Employ advanced security solutions**: Use technologies like Endpoint Detection and Response (EDR) and behavioral analytics to detect abnormal patterns that could be associated with LoLBAS abuse.
## Conclusion
LoLBAS present a significant challenge to cyber security, as they blend in with legitimate system activities. However, overcoming this challenge is possible through a combination of proactive monitoring, system hardening, and user education.
Ensure you are well prepared to identify and mitigate LoLBAS attacks by following the recommendations provided in this guide. Stay vigilant and stay secure!
- [@article@LOLBAS project](https://lolbas-project.github.io/#)

@ -1,22 +1,8 @@
# loopback # loopback
Loopback is an essential concept in IP terminology that refers to a test mechanism used to validate the operation of various network protocols, and software or hardware components. The primary function of the loopback feature is to enable a device to send a data packet to itself to verify if the device's network stack is functioning correctly. **Loopback** refers to a special network interface used to send traffic back to the same device for testing and diagnostic purposes. The loopback address for IPv4 is `127.0.0.1`, while for IPv6 it is `::1`. When a device sends a request to the loopback address, the network data does not leave the local machine; instead, it is processed internally, allowing developers to test applications or network services without requiring external network access. Loopback is commonly used to simulate network traffic, check local services, or debug issues locally.
## Importance of Loopback Learn more from the following resources:
The concept of loopback is critical for the following reasons: - [@article@What is a loopback address?](https://www.geeksforgeeks.org/what-is-a-loopback-address/)
- [@article@Understanding the loopback address and loopback interfaces](https://study-ccna.com/loopback-interface-loopback-address/)
- **Troubleshooting**: Loopback helps in diagnosing and detecting network connectivity issues. It can also help ascertain whether an application or device is correctly processing and responding to incoming network traffic.
- **Testing**: Loopback can be used extensively by developers to test software applications or components without external network access. This ensures that the software behaves as expected even without a working network connection.
## Loopback Address
In IP terminology, there's a pre-allocated IP address for loopback. For IPv4, the reserved address is `127.0.0.1`. For IPv6, the loopback address is `::1`. When a device sends a packet to either of these addresses, the packet is rerouted to the local device, making it the source and destination simultaneously.
## Loopback Interface
Apart from loopback addresses, there's also a network device known as the "loopback interface." This interface is a virtual network interface implemented in software. The loopback interface is assigned a loopback address and can be used to emulate network connections for various purposes, such as local services or inter-process communications.
## Summary
Loopback plays a crucial role in IP technology by enabling devices to run diagnostic tests and validate the correct functioning of software and hardware components. Using the loopback addresses for IPv4 (`127.0.0.1`) and IPv6 (`::1`), it allows network packets to circulate internally within the local device, facilitating developers to test and verify network operations.

@ -1,35 +1,8 @@
# MAC-based # MAC-based
_Mandatory Access Control (MAC)_ is a robust security model when it comes to hardening, as it enforces strict policies on operating systems and applications regarding system access. In MAC-based hardening, the end-users are not allowed to modify access controls on your system. **Mandatory Access Control (MAC)** is a security model in which access to resources is governed by predefined policies set by the system or organization, rather than by individual users. In MAC, access decisions are based on security labels or classifications assigned to both users and resources, such as sensitivity levels or clearance levels. Users cannot change these access controls; they are enforced by the system to maintain strict security standards and prevent unauthorized access. MAC is often used in high-security environments, such as government or military systems, to ensure that data and resources are accessed only by individuals with appropriate authorization.
## How MAC-based Hardening Works Learn more from the following resources:
Typical MAC mechanisms work based on predefined security attributes or labels. These labels determine access permissions and are integrated within the system to classify data, resources, and users. Once these labels are in place, the operating system or a trusted security kernel rigorously enforces the constraints on how they access data. - [@video@Mandatory Access Control (MAC) Models](https://www.youtube.com/watch?v=mNN-fEboRAA)
- [@article@What is Mandatory Access Control?](https://nordlayer.com/learn/access-control/mandatory-access-control/)
## Benefits of MAC-Based Hardening
MAC-based hardening offers numerous benefits for organizations seeking to improve their cybersecurity posture:
- **Enforced Security Policies**: MAC policies can be pre-configured in accordance with your organization's security requirements, ensuring consistency on all systems.
- **Limited Access**: Users have limited access to resources, which reduces the potential for insider threats and accidental leaks of sensitive data.
- **Protection of Sensitive Data**: By preventing unauthorized users from accessing sensitive data, MAC-based hardening helps protect against data breaches and other cybersecurity risks.
- **Auditing and Compliance**: MAC-based hardening mechanisms help facilitate audits and compliance with industry regulations.
## Popular MAC-based Models
There are various MAC models implemented in modern software systems. Some of the most popular models include:
- **Bell-LaPadula (BLP) Model**: Designed for confidentiality, the BLP Model enforces the "no read up, no write down" rule, meaning that users may only read data at the same or lower levels of sensitivity, while only allowing data to be written to the same or higher levels of sensitivity.
- **Biba Model**: Focusing on integrity, the Biba Model enforces the "no write up, no read down" rule, which works opposite to BLP Model.
- **Clark-Wilson Model**: The Clark-Wilson Model emphasizes well-formed transactions, separation of duties, and certification processes to maintain data integrity and confidentiality.
## Implementing MAC-Based Hardening
To implement MAC-based hardening, it's important to follow these general steps:
- **Establish Security Policies**: Define clear policies and guidelines, including security labels, for the various data classifications, users, and resources.
- **Select an Appropriate MAC Model**: Choose a MAC model suitable for your organization's needs and implement it across your systems.
- **Train Staff**: Provide training to your staff to ensure understanding and adherence to your organization's MAC-based policies.
- **Monitor and Audit**: Continually monitor the system for deviations from the MAC policies and perform periodic audits to verify their enforcement.
In summary, MAC-based hardening offers robust access controls by enforcing strict policies in accordance with your organization's security requirements. In doing so, it reduces the potential for unauthorized access to data and resources, ultimately enhancing your cybersecurity posture.

@ -1,29 +1,9 @@
# MacOS # MacOS
**macOS** is a series of proprietary graphical operating systems developed and marketed by Apple Inc. It is the primary operating system for Apple's Mac computers. macOS is widely recognized for its sleek design, robust performance, and innovative features, making it one of the most popular operating systems globally. **macOS** is an operating system developed by Apple Inc. for its line of Mac computers. Known for its user-friendly interface and integration with other Apple products, macOS features a Unix-based architecture, offering stability, security, and performance. It includes a suite of built-in applications, such as Safari, Mail, and Finder, and supports a wide range of third-party software. macOS provides seamless integration with services like iCloud, Continuity, and Handoff, enhancing productivity and connectivity across Apple devices. Regular updates and a focus on design and usability make macOS a popular choice for both personal and professional use.
## Key Features Learn more from the following resources:
- **User-friendly interface**: macOS is known for its simple and intuitive user interface, which makes it easy for users to navigate and use the system efficiently. - [@official@MacOS Website](https://www.apple.com/uk/macos/macos-sequoia/)
- [@video@Mac Tutorial for Beginners 2024](https://www.youtube.com/watch?v=3jeeFc2Vo1U)
- **Security**: macOS has several built-in security features, such as XProtect, Gatekeeper, and FileVault, to provide a secure computing environment. Additionally, macOS is based on UNIX, which is known for its strong security and stability.
- **Integration with Apple ecosystem**: macOS is seamlessly integrated with Apple's software and hardware ecosystem, including iOS, iCloud, and other Apple devices, providing a consistent and well-connected user experience.
- **App Store**: Apple's App Store offers a large and diverse selection of applications for macOS, ensuring easy and secure software downloads and installations.
- **Time Machine**: macOS's Time Machine feature provides an easy and automatic way to back up your data, ensuring you never lose important files and can recover from system crashes.
## Security Tips
- **Keep your macOS up-to-date**: Always ensure that your macOS is running the latest version and security updates, as Apple regularly releases patches to fix potential vulnerabilities.
- **Enable the Firewall**: Make sure to enable macOS's built-in firewall to protect your system from unauthorized access and potential intrusions.
- **Use strong, unique passwords**: Ensure that your macOS user account is protected with a strong, unique password and enable two-factor authentication for your Apple ID.
- **Be cautious with downloads**: Be careful when downloading and installing software from unknown sources. Use the macOS App Store whenever possible, and avoid downloading from third-party websites.
- **Install antivirus software**: To add an extra layer of security, consider installing a reputable antivirus program on your Mac to protect against malware and other threats.
By following these security tips and staying vigilant, users can ensure their Mac remains a secure and enjoyable computing environment.

@ -1,32 +1,8 @@
# MAN # MAN
A Metropolitan Area Network **(MAN)** is a type of computer network that spans across a metropolitan area or a large geographical area, typically covering a city or a region. It is designed to interconnect various local area networks **(LANs)** and wide area networks **(WANs)** to enable communication and data exchange between different locations within the metropolitan area. A **Metropolitan Area Network (MAN)** is a type of network that spans a city or large campus, connecting multiple local area networks (LANs) within that geographic area. MANs are designed to provide high-speed data transfer and communication services to organizations, institutions, or businesses across a city. They support a variety of applications, including internet access, intranet connectivity, and data sharing among multiple locations. Typically, MANs are faster and cover a broader area than LANs but are smaller in scope compared to wide area networks (WANs).
## Examples of MAN Learn more from the following resources:
Some examples of Metropolitan Area Networks **(MANs)** include: - [@article@What is a Metropolitan Area Network?](https://www.cloudflare.com/en-gb/learning/network-layer/what-is-a-metropolitan-area-network/)
- [@video@Network Types: MAN](https://youtu.be/4_zSIXb7tLQ?si=1jTQ5C9PT4WUOztP&t=183)
1. **Cable TV Networks:** Many cable TV networks also offer internet services to their subscribers, creating a MAN that covers a specific metropolitan area.
2. **Educational Institutions:** Universities, colleges, and research institutions often have their own MANs to interconnect their campuses and facilities spread across a metropolitan area.
3. **City-Wide Wi-Fi Networks:** Some cities have established their own Wi-Fi networks to provide internet access to residents and businesses, creating a MAN that covers the entire city.
4. **Public Transportation Networks:** Some metropolitan areas have implemented MANs to provide internet connectivity on public transportation networks such as buses and trains.
## Advantages of MAN
- **Improved Connectivity:** MANs provide a high-speed and reliable means of communication between different locations within a metropolitan area, facilitating efficient data exchange and collaboration among organizations, businesses, and individuals.
- **Cost-Effective:** Compared to establishing multiple separate networks for each location, implementing a MAN can be more cost-effective as it allows for shared infrastructure and resources, reducing overall costs of networking equipment and maintenance.
- **Scalability:** MANs are highly scalable and can be expanded to accommodate new locations or increased network traffic as the metropolitan area grows, making it a flexible solution for evolving connectivity needs.
- **Centralized Management:** A MAN allows for centralized management of the network, making it easier to monitor and control network operations, troubleshoot issues, and implement security measures.
## Disadvantages of MAN
- **Complexity:** MANs can be complex to design, implement, and maintain due to their large scale and geographical spread. They require skilled network administrators and engineers to manage and troubleshoot the network effectively.
- **Cost of Implementation:** Establishing a MAN requires significant upfront investment in networking infrastructure and equipment, which can be a barrier to entry for smaller organizations or municipalities.
- **Limited Coverage:** MANs are typically limited to metropolitan areas, and their coverage may not extend to remote or rural areas outside the metropolitan region, which can pose connectivity challenges for organizations located in those areas.
- **Vulnerability to Single Point of Failure:** Since MANs are centralized networks, they are susceptible to a single point of failure, such as a failure in the main network node, which can disrupt the entire network and impact communication and data exchange among connected locations.

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save