This media is not supported in your browser
VIEW IN TELEGRAM
6 Software ARCHITECTURAL PATTERNS
- Event Driven
- Layered
- Monolithic
- Microservice
- MVC
- Master Slave
- Event Driven
- Layered
- Monolithic
- Microservice
- MVC
- Master Slave
๐156
Explore Human Parsing Modality for Action Recognition
๐ https://arxiv.org/pdf/2401.02138.pdf
๐ป https://github.com/liujf69/EPP-Net-Action
Please open Telegram to view this post
VIEW IN TELEGRAM
๐45
This media is not supported in your browser
VIEW IN TELEGRAM
Public Static Void Main(String[] args) Explained.
โค public: An access modifier keyword that indicates the class (MainClass) is accessible from outside the package.
โค class: A keyword used to declare a class in Java.
MainClass: The name of the class. It follows the naming conventions for classes in Java.
โค { and }: Curly braces define a block of code. In this case, they enclose the body of the class.
โค public: An access modifier keyword indicating that the main method can be called from outside the class.
โค static: A keyword indicating that the main method belongs to the class itself rather than to an instance of the class.
โค void: A keyword indicating that the main method does not return any value.
โค main: The name of the method. It is the entry point for the Java program.
โค (String[] args): The method parameter list. String[] args is an array of strings that can be used to pass command-line arguments to the program.
โค System.out.println("Hello, World!");: A statement that prints the string "Hello, World!" to the console. System.out is an object representing the console output, and println is a method to print a line.
MainClass: The name of the class. It follows the naming conventions for classes in Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
๐146๐2
This media is not supported in your browser
VIEW IN TELEGRAM
18 most used Linux commands YOU MUST KNOW
- ls
- mv
- ssh
- cd
- cat
- sudo
- pwd
- grep
- top
-mkdir
- find
- wget
- rm
- chmod
- tar
- cp
- chwon
- gzip
- ls
- mv
- ssh
- cd
- cat
- sudo
- pwd
- grep
- top
-mkdir
- find
- wget
- rm
- chmod
- tar
- cp
- chwon
- gzip
๐237๐3โค1
This media is not supported in your browser
VIEW IN TELEGRAM
๐ Public vs Internal Load Balancers: Unveiling the Power of Balance! ๐
Load balancing is the unsung hero of seamless digital experiences, and choosing between public and internal load balancers can be a game-changer. Let's dive into the key differences in a nutshell! ๐
๐ Public Load Balancers:
- Audience: Everyone, Everywhere!
- Designed to distribute incoming traffic across public-facing servers.
- Ideal for applications accessible over the internet, such as websites or APIs.
- Acts as the gateway, directing external requests to the right internal resources.
๐ข Internal Load Balancers:
- Keep it in the Family:
- Tailored for distributing traffic within a private network or data center.
- Perfect for applications serving internal users or specific services behind the scenes.
- Enhances security by keeping sensitive systems shielded from the public eye.
๐ค How to Choose?
- Public:
- Opt for when your services need to be accessible from the internet.
- Ideal for handling high volumes of external traffic.
- Best suited for public-facing applications like websites or APIs.
Load balancing is the unsung hero of seamless digital experiences, and choosing between public and internal load balancers can be a game-changer. Let's dive into the key differences in a nutshell! ๐
๐ Public Load Balancers:
- Audience: Everyone, Everywhere!
- Designed to distribute incoming traffic across public-facing servers.
- Ideal for applications accessible over the internet, such as websites or APIs.
- Acts as the gateway, directing external requests to the right internal resources.
๐ข Internal Load Balancers:
- Keep it in the Family:
- Tailored for distributing traffic within a private network or data center.
- Perfect for applications serving internal users or specific services behind the scenes.
- Enhances security by keeping sensitive systems shielded from the public eye.
๐ค How to Choose?
- Public:
- Opt for when your services need to be accessible from the internet.
- Ideal for handling high volumes of external traffic.
- Best suited for public-facing applications like websites or APIs.
๐98โค1
This media is not supported in your browser
VIEW IN TELEGRAM
Ever wondered how your computer securely communicates with a remote server? ๐ค
Let's dive into the magic behind SSH and unravel its secrets. ๐๐ป
1. What is SSH? ๐คทโโ๏ธ
SSH, or Secure Shell, is a cryptographic network protocol that enables secure communication between two devices over an unsecured network. It's like a secure tunnel for your data! ๐๐
2. Key Players: Public and Private Keys ๐
SSH uses a pair of cryptographic keys โ a public key (shared with the world) and a private key (kept super-secret). ๐คซ When you connect, these keys perform a digital handshake to ensure a secure connection. ๐ค๐
3. The Handshake Dance: Authentication ๐
The handshake involves your computer proving its identity using the private key, and the server verifying it using the corresponding public key. Think of it as a secret password exchange, but way cooler! ๐๐ต๏ธ
4. Encryption Enchantment: Securing the Chat ๐ก
Once the handshake is complete, SSH wraps your data in layers of encryption, ensuring that even if someone intercepts it, they'll find nothing but gibberish. ๐ค๐ก
5. Port Perfection: Default Port 22 ๐ช
SSH communicates through port 22 by default. It's like the entrance to your secure data party! ๐๐ช But beware, changing ports adds an extra layer of security. ๐ต๏ธโโ๏ธ๐
SSH is the superhero of secure communication, ensuring your data remains confidential, and the connection is trustworthy. ๐ฆธโโ๏ธ๐ผ Next time you SSH, remember the cryptographic dance happening in the background, making it all possible! ๐บ๐
Let's dive into the magic behind SSH and unravel its secrets. ๐๐ป
1. What is SSH? ๐คทโโ๏ธ
SSH, or Secure Shell, is a cryptographic network protocol that enables secure communication between two devices over an unsecured network. It's like a secure tunnel for your data! ๐๐
2. Key Players: Public and Private Keys ๐
SSH uses a pair of cryptographic keys โ a public key (shared with the world) and a private key (kept super-secret). ๐คซ When you connect, these keys perform a digital handshake to ensure a secure connection. ๐ค๐
3. The Handshake Dance: Authentication ๐
The handshake involves your computer proving its identity using the private key, and the server verifying it using the corresponding public key. Think of it as a secret password exchange, but way cooler! ๐๐ต๏ธ
4. Encryption Enchantment: Securing the Chat ๐ก
Once the handshake is complete, SSH wraps your data in layers of encryption, ensuring that even if someone intercepts it, they'll find nothing but gibberish. ๐ค๐ก
5. Port Perfection: Default Port 22 ๐ช
SSH communicates through port 22 by default. It's like the entrance to your secure data party! ๐๐ช But beware, changing ports adds an extra layer of security. ๐ต๏ธโโ๏ธ๐
SSH is the superhero of secure communication, ensuring your data remains confidential, and the connection is trustworthy. ๐ฆธโโ๏ธ๐ผ Next time you SSH, remember the cryptographic dance happening in the background, making it all possible! ๐บ๐
๐132๐3
This media is not supported in your browser
VIEW IN TELEGRAM
Monolithic VS Microservices Architecture. Which one are you using? ๐ค
In the realm of software architecture, the choice between Monolithic and Microservices can shape the destiny of your application. Let's break down the key differences in a nutshell! ๐งฉ
1. Monolithic Architecture ๐ฐ
- One Big Castle: Monoliths are like a majestic castle, where all components (database, server, user interface) are tightly knit into a single structure.
- Unified & Simple: Easy to develop and deploy due to its unified structure. Changes are made in one place, making coordination a breeze.
- Scaling Challenges: Scaling can be a challenge. When one aspect needs upgrading, the entire application must be scaled, even if only a small part requires more resources.
2. Microservices Architecture ๐
- City of Specialized Buildings: Microservices resemble a bustling city, with each service as a specialized building handling a distinct function.
- Scalability & Flexibility: Offers scalability on a per-service basis. If one part of the application needs more resources, you can scale just that service.
- Increased Complexity: As the number of services grows, managing the communication between them can become complex. Decentralization brings its own set of challenges.
In the realm of software architecture, the choice between Monolithic and Microservices can shape the destiny of your application. Let's break down the key differences in a nutshell! ๐งฉ
1. Monolithic Architecture ๐ฐ
- One Big Castle: Monoliths are like a majestic castle, where all components (database, server, user interface) are tightly knit into a single structure.
- Unified & Simple: Easy to develop and deploy due to its unified structure. Changes are made in one place, making coordination a breeze.
- Scaling Challenges: Scaling can be a challenge. When one aspect needs upgrading, the entire application must be scaled, even if only a small part requires more resources.
2. Microservices Architecture ๐
- City of Specialized Buildings: Microservices resemble a bustling city, with each service as a specialized building handling a distinct function.
- Scalability & Flexibility: Offers scalability on a per-service basis. If one part of the application needs more resources, you can scale just that service.
- Increased Complexity: As the number of services grows, managing the communication between them can become complex. Decentralization brings its own set of challenges.
๐97โค1
Leveraging SAM for Single-Source Domain Generalization in Medical Image Segmentation
๐ https://arxiv.org/pdf/2401.02076.pdf
๐ป https://github.com/SARIHUST/SAMMed
@computer_science_and_programming
@computer_science_and_programming
Please open Telegram to view this post
VIEW IN TELEGRAM
๐42๐2
Improving API Performance with Database Connection Pooling
The diagram below shows 5 common API optimization techniques. Today, Iโll focus on number 5, connection pooling. It is not as trivial to implement as it sounds for some languages.
When fulfilling API requests, we often need to query the database. Opening a new connection for every API call adds overhead. Connection pooling helps avoid this penalty by reusing connections.
How Connection Pooling Works
1. For each API server, establish a pool of database connections at startup.
2. Workers share these connections, requesting one when needed and returning it after.
Challenges for Some Languages
However, setting up connection pooling can be more complex for languages like PHP, Python and Node.js. These languages handle scale by having multiple processes, each serving a subset of requests.
- In these languages, database connections get tied to each process.
- Connections can't be efficiently shared across processes. Each process needs its own pool, wasting resources.
In contrast, languages like Java and Go use threads within a single process to handle requests. Connections are bound at the application level, allowing easy sharing of a centralized pool.
Connection Pooling Solution
Tools like PgBouncer work around these challenges by proxying connections at the application level.
PgBouncer creates a centralized pool that all processes can access. No matter which process makes the request, PgBouncer efficiently handles the pooling.
At high scale, all languages can benefit from running PgBouncer on a dedicated server. Now the connection pool is shared over the network for all API servers. This conserves finite database connections.
Connection pooling improves efficiency, but its implementation complexity varies across languages.
The diagram below shows 5 common API optimization techniques. Today, Iโll focus on number 5, connection pooling. It is not as trivial to implement as it sounds for some languages.
When fulfilling API requests, we often need to query the database. Opening a new connection for every API call adds overhead. Connection pooling helps avoid this penalty by reusing connections.
How Connection Pooling Works
1. For each API server, establish a pool of database connections at startup.
2. Workers share these connections, requesting one when needed and returning it after.
Challenges for Some Languages
However, setting up connection pooling can be more complex for languages like PHP, Python and Node.js. These languages handle scale by having multiple processes, each serving a subset of requests.
- In these languages, database connections get tied to each process.
- Connections can't be efficiently shared across processes. Each process needs its own pool, wasting resources.
In contrast, languages like Java and Go use threads within a single process to handle requests. Connections are bound at the application level, allowing easy sharing of a centralized pool.
Connection Pooling Solution
Tools like PgBouncer work around these challenges by proxying connections at the application level.
PgBouncer creates a centralized pool that all processes can access. No matter which process makes the request, PgBouncer efficiently handles the pooling.
At high scale, all languages can benefit from running PgBouncer on a dedicated server. Now the connection pool is shared over the network for all API servers. This conserves finite database connections.
Connection pooling improves efficiency, but its implementation complexity varies across languages.
๐109โค1
If you design complex systems, you'll love sequence diagrams
Complex system architectures can quickly become tangled and hard to follow. Enter sequence diagrams! They keep your design neat and easily understandable.
For example, check out the diagram below. It depicts a client/server interaction, clearly differentiating between a cache hit and a cache miss. This is a prime example of how visual aids simplify complex interactions.
Sequence diagrams are a must when you aim to:
- ๐ Map out end-to-end system workflows.
- ๐ Clarify interactions between components.
- ๐ Produce clear and concise documentation.
- ๐ง Identify design flaws.
I have two favorites for creating sequence diagrams. WebSequenceDiagrams and Mermaid (links in comment). You can make sequence diagrams easily with just text.
Do you have a go-to tool for crafting good-looking sequence diagrams? Drop your suggestions below! ๐
Complex system architectures can quickly become tangled and hard to follow. Enter sequence diagrams! They keep your design neat and easily understandable.
For example, check out the diagram below. It depicts a client/server interaction, clearly differentiating between a cache hit and a cache miss. This is a prime example of how visual aids simplify complex interactions.
Sequence diagrams are a must when you aim to:
- ๐ Map out end-to-end system workflows.
- ๐ Clarify interactions between components.
- ๐ Produce clear and concise documentation.
- ๐ง Identify design flaws.
I have two favorites for creating sequence diagrams. WebSequenceDiagrams and Mermaid (links in comment). You can make sequence diagrams easily with just text.
Do you have a go-to tool for crafting good-looking sequence diagrams? Drop your suggestions below! ๐
๐76๐3
This media is not supported in your browser
VIEW IN TELEGRAM
Ever wondered how Docker ๐ณ works?
1. Docker Build ๐
2. Docker Push โ๏ธ
3. Docker Run ๐
4. Docker Pull ๐
5. Docker Images ๐ผ
1. Docker Build ๐
2. Docker Push โ๏ธ
3. Docker Run ๐
4. Docker Pull ๐
5. Docker Images ๐ผ
๐90๐3
This media is not supported in your browser
VIEW IN TELEGRAM
18 Most common used Java List methods
1. add(E element) - Adds the specified element to the end of the list.
2. addAll(Collection<? extends E> c) - Adds all elements of the specified collection to the end of the list.
3. remove(Object o) - Removes the first occurrence of the specified element from the list.
4. remove(int index) - Removes the element at the specified position in the list.
5. get(int index) - Returns the element at the specified position in the list.
6. set(int index, E element) - Replaces the element at the specified position in the list with the specified element.
7. indexOf(Object o) - Returns the index of the first occurrence of the specified element in the list.
8. contains(Object o) - Returns true if the list contains the specified element.
9. size() - Returns the number of elements in the list.
10. isEmpty() - Returns true if the list contains no elements.
11. clear() - Removes all elements from the list.
12. toArray() - Returns an array containing all the elements in the list.
13. subList(int fromIndex, int toIndex) - Returns a view of the portion of the list between the specified fromIndex, inclusive, and toIndex, exclusive.
14. addAll(int index, Collection<? extends E> c) - Inserts all elements of the specified collection into the list, starting at the specified position.
15. iterator() - Returns an iterator over the elements in the list.
16. sort(Comparator<? super E> c) - Sorts the elements of the list according to the specified comparator.
17. replaceAll(UnaryOperator<E> operator) - Replaces each element of the list with the result of applying the given operator.
18. forEach(Consumer<? super E> action) - Performs the given action for each element of the list until all elements have been processed or the action throws an exception.
1. add(E element) - Adds the specified element to the end of the list.
2. addAll(Collection<? extends E> c) - Adds all elements of the specified collection to the end of the list.
3. remove(Object o) - Removes the first occurrence of the specified element from the list.
4. remove(int index) - Removes the element at the specified position in the list.
5. get(int index) - Returns the element at the specified position in the list.
6. set(int index, E element) - Replaces the element at the specified position in the list with the specified element.
7. indexOf(Object o) - Returns the index of the first occurrence of the specified element in the list.
8. contains(Object o) - Returns true if the list contains the specified element.
9. size() - Returns the number of elements in the list.
10. isEmpty() - Returns true if the list contains no elements.
11. clear() - Removes all elements from the list.
12. toArray() - Returns an array containing all the elements in the list.
13. subList(int fromIndex, int toIndex) - Returns a view of the portion of the list between the specified fromIndex, inclusive, and toIndex, exclusive.
14. addAll(int index, Collection<? extends E> c) - Inserts all elements of the specified collection into the list, starting at the specified position.
15. iterator() - Returns an iterator over the elements in the list.
16. sort(Comparator<? super E> c) - Sorts the elements of the list according to the specified comparator.
17. replaceAll(UnaryOperator<E> operator) - Replaces each element of the list with the result of applying the given operator.
18. forEach(Consumer<? super E> action) - Performs the given action for each element of the list until all elements have been processed or the action throws an exception.
๐126โค3
This media is not supported in your browser
VIEW IN TELEGRAM
DevOps is a set of practices that combines software development and IT operations. It aims to shorten the software development life cycle and provide continuous delivery with high software quality. ๐
DevOps has several phases
Plan: This phase involves defining the goals, scope, and requirements of the software project. It also includes identifying the stakeholders, risks, and resources needed. ๐
Build: This phase involves writing, compiling, and packaging the code into executable units. It also includes using version control, code review, and configuration management tools. ๐ง
Test: This phase involves verifying that the software meets the quality standards and functional specifications. It also includes using automated testing, performance testing, and security testing tools. ๐งช
Deploy: This phase involves releasing the software to the production environment or to the end-users. It also includes using deployment automation, orchestration, and monitoring tools. ๐
Operate: This phase involves running and maintaining the software in the production environment. It also includes using incident management, problem management, and change management tools. ๐
Observe: This phase involves collecting and analyzing data from the software and the production environment. It also includes using logging, tracing, and metrics tools. ๐
Continuous Feedback and Discovery: This phase involves gathering feedback from the stakeholders, users, and customers. It also includes using feedback loops, surveys, and analytics tools. It also involves discovering new opportunities, challenges, and trends. ๐
DevOps is a culture that promotes collaboration, communication, and continuous improvement. It helps to deliver software faster, better, and safer. ๐
DevOps has several phases
Plan: This phase involves defining the goals, scope, and requirements of the software project. It also includes identifying the stakeholders, risks, and resources needed. ๐
Build: This phase involves writing, compiling, and packaging the code into executable units. It also includes using version control, code review, and configuration management tools. ๐ง
Test: This phase involves verifying that the software meets the quality standards and functional specifications. It also includes using automated testing, performance testing, and security testing tools. ๐งช
Deploy: This phase involves releasing the software to the production environment or to the end-users. It also includes using deployment automation, orchestration, and monitoring tools. ๐
Operate: This phase involves running and maintaining the software in the production environment. It also includes using incident management, problem management, and change management tools. ๐
Observe: This phase involves collecting and analyzing data from the software and the production environment. It also includes using logging, tracing, and metrics tools. ๐
Continuous Feedback and Discovery: This phase involves gathering feedback from the stakeholders, users, and customers. It also includes using feedback loops, surveys, and analytics tools. It also involves discovering new opportunities, challenges, and trends. ๐
DevOps is a culture that promotes collaboration, communication, and continuous improvement. It helps to deliver software faster, better, and safer. ๐
๐75
This media is not supported in your browser
VIEW IN TELEGRAM
Computer Memory Explained
Computer memory is like a workspace for your computer. It stores data and instructions that the computer needs to access quickly.
Internal Memory:
1. ROM (Read-Only Memory):
- PROM (Programmable ROM): Programmable once by the user post-manufacturing. ๐
- EPROM (Erasable Programmable ROM): Can be erased with ultraviolet light and reprogrammed. โ๏ธ๐
- EEPROM (Electrically Erasable Programmable ROM): Can be erased and reprogrammed electrically, multiple times. โก๏ธ
2. RAM (Random Access Memory):
- SRAM (Static RAM): Retains data as long as power is supplied, no need to refresh, faster than DRAM. โก๏ธ๐จ
- DRAM (Dynamic RAM): Stores data in capacitors that must be refreshed periodically, widely used. ๐
- SDRAM (Synchronous DRAM): Syncs with CPU clock speed for improved performance. โฑ
- RDRAM (Rambus DRAM): High bandwidth memory with Rambus technology. ๐
- DDR SDRAM (Double Data Rate SDRAM): Transfers data on both rising and falling clock edges.
- DDR1: First generation, higher speed and bandwidth than SDRAM. ๐
- DDR2: Improved version of DDR1 with lower power consumption and higher speeds. ๐๐จ
- DDR3: Higher speeds and reduced power consumption over DDR2. ๐โ๐จ
- DDR4: Higher module density and increased performance with reduced voltage. ๐๐๐
External Memory:
1. HDD (Hard Disk Drive): Uses spinning disks to read/write data, traditional storage device. ๐๐พ
2. SSD (Solid State Drive): Non-volatile flash memory for faster speed than HDDs. ๐๐พ
3. CD (Compact Disc): Optical disc for storing digital data, used for music and software
Computer memory is like a workspace for your computer. It stores data and instructions that the computer needs to access quickly.
Internal Memory:
1. ROM (Read-Only Memory):
- PROM (Programmable ROM): Programmable once by the user post-manufacturing. ๐
- EPROM (Erasable Programmable ROM): Can be erased with ultraviolet light and reprogrammed. โ๏ธ๐
- EEPROM (Electrically Erasable Programmable ROM): Can be erased and reprogrammed electrically, multiple times. โก๏ธ
2. RAM (Random Access Memory):
- SRAM (Static RAM): Retains data as long as power is supplied, no need to refresh, faster than DRAM. โก๏ธ๐จ
- DRAM (Dynamic RAM): Stores data in capacitors that must be refreshed periodically, widely used. ๐
- SDRAM (Synchronous DRAM): Syncs with CPU clock speed for improved performance. โฑ
- RDRAM (Rambus DRAM): High bandwidth memory with Rambus technology. ๐
- DDR SDRAM (Double Data Rate SDRAM): Transfers data on both rising and falling clock edges.
- DDR1: First generation, higher speed and bandwidth than SDRAM. ๐
- DDR2: Improved version of DDR1 with lower power consumption and higher speeds. ๐๐จ
- DDR3: Higher speeds and reduced power consumption over DDR2. ๐โ๐จ
- DDR4: Higher module density and increased performance with reduced voltage. ๐๐๐
External Memory:
1. HDD (Hard Disk Drive): Uses spinning disks to read/write data, traditional storage device. ๐๐พ
2. SSD (Solid State Drive): Non-volatile flash memory for faster speed than HDDs. ๐๐พ
3. CD (Compact Disc): Optical disc for storing digital data, used for music and software
๐168โค2
How Git Works - From Working Directory to Remote Repository
[1]. Working Directory:
Your project starts here. The working directory is where you actively make changes to your files.
[2]. Staging Area (Index):
After modifying files, use git add to stage changes. This prepares them for the next commit, acting as a checkpoint.
[3]. Local Repository:
Upon staging, execute git commit to record changes in the local repository. Commits create snapshots of your project at specific points.
[4]. Stash (Optional):
If needed, use git stash to temporarily save changes without committing. Useful when switching branches or performing other tasks.
[5]. Remote Repository:
The remote repository, hosted on platforms like GitHub, is a version of your project accessible to others. Use git push to send local commits and git pull to fetch remote changes.
[6]. Remote Branch Tracking:
Local branches can be set to track corresponding branches on the remote. This eases synchronization with git pull or git push.
[1]. Working Directory:
Your project starts here. The working directory is where you actively make changes to your files.
[2]. Staging Area (Index):
After modifying files, use git add to stage changes. This prepares them for the next commit, acting as a checkpoint.
[3]. Local Repository:
Upon staging, execute git commit to record changes in the local repository. Commits create snapshots of your project at specific points.
[4]. Stash (Optional):
If needed, use git stash to temporarily save changes without committing. Useful when switching branches or performing other tasks.
[5]. Remote Repository:
The remote repository, hosted on platforms like GitHub, is a version of your project accessible to others. Use git push to send local commits and git pull to fetch remote changes.
[6]. Remote Branch Tracking:
Local branches can be set to track corresponding branches on the remote. This eases synchronization with git pull or git push.
๐81โค1๐1
This media is not supported in your browser
VIEW IN TELEGRAM
DevOps Explained!
Plan:
- Defines project goals, scope, and requirements, identifying stakeholders and resources. ๐
Build:
- Involves coding, compiling, and packaging, emphasizing version control and code management. ๐ง
Test:
- Ensures software aligns with quality and functional standards, utilizing automated and security testing. ๐งช
Deploy:
- Releases software precisely using deployment automation and monitoring tools. ๐
Operate:
- Ensures operational stability, promptly addressing issues with management tools. ๐
Observe:
- Analyzes data from software and production using logging, tracing, and metrics tools. ๐
Continuous Feedback:
- Gathers ongoing feedback, utilizing loops, surveys, and analytics for improvement. ๐
DevOps:
- Cultivates a culture of collaboration, communication, and continuous improvement for faster, better, and safer software delivery.
Plan:
- Defines project goals, scope, and requirements, identifying stakeholders and resources. ๐
Build:
- Involves coding, compiling, and packaging, emphasizing version control and code management. ๐ง
Test:
- Ensures software aligns with quality and functional standards, utilizing automated and security testing. ๐งช
Deploy:
- Releases software precisely using deployment automation and monitoring tools. ๐
Operate:
- Ensures operational stability, promptly addressing issues with management tools. ๐
Observe:
- Analyzes data from software and production using logging, tracing, and metrics tools. ๐
Continuous Feedback:
- Gathers ongoing feedback, utilizing loops, surveys, and analytics for improvement. ๐
DevOps:
- Cultivates a culture of collaboration, communication, and continuous improvement for faster, better, and safer software delivery.
๐82โค2
This media is not supported in your browser
VIEW IN TELEGRAM
UNTANGLE Spring Security Architecture ๐
Authentication and Authorization:
- Validates user identity and orchestrates controlled resource access.
- Empowers comprehensive user authentication and nuanced authorization.
Security Filters:
- Intercepts incoming requests, meticulously enforcing security measures.
- Offers a flexible, layered security filter chain for diverse protection strategies.
Custom Authentication Providers:
- N Authentication Provider: Extends authentication capabilities beyond default configurations. Facilitates tailored authentication strategies and seamless integration.
- DaoAuthentication Provider: Adopts a database-backed approach for user authentication. Scrutinizes user credentials against stored records, heightening security.
Authentication Manager:
- Orchestrates the authentication process, coordinating various authentication providers.
- Serves as a pivotal component in managing user identity verification.
Token-based Security (JWT):
- Implements advanced token-based authentication for stateless communication.
- Facilitates secure interaction without the need for server-side storage.
Session Management:
- Efficiently manages user sessions, mitigating session-related risks.
- Provides adaptability for session creation, tracking, and invalidation.
Authentication Tokens:
- Username Password Authentication Token:Represents user credentials for authentication purposes.
- Leverages usernames and passwords for robust user verification.
Add/Remove Authentication Token:
- Dynamically enables the addition and removal of authentication tokens.
- Ensures real-time control over user authentication, promoting flexibility.
Authentication and Authorization:
- Validates user identity and orchestrates controlled resource access.
- Empowers comprehensive user authentication and nuanced authorization.
Security Filters:
- Intercepts incoming requests, meticulously enforcing security measures.
- Offers a flexible, layered security filter chain for diverse protection strategies.
Custom Authentication Providers:
- N Authentication Provider: Extends authentication capabilities beyond default configurations. Facilitates tailored authentication strategies and seamless integration.
- DaoAuthentication Provider: Adopts a database-backed approach for user authentication. Scrutinizes user credentials against stored records, heightening security.
Authentication Manager:
- Orchestrates the authentication process, coordinating various authentication providers.
- Serves as a pivotal component in managing user identity verification.
Token-based Security (JWT):
- Implements advanced token-based authentication for stateless communication.
- Facilitates secure interaction without the need for server-side storage.
Session Management:
- Efficiently manages user sessions, mitigating session-related risks.
- Provides adaptability for session creation, tracking, and invalidation.
Authentication Tokens:
- Username Password Authentication Token:Represents user credentials for authentication purposes.
- Leverages usernames and passwords for robust user verification.
Add/Remove Authentication Token:
- Dynamically enables the addition and removal of authentication tokens.
- Ensures real-time control over user authentication, promoting flexibility.
๐50โค1
๐๐ฒ๐ฎ๐ฟ๐ป ๐ณ๐๐ป๐ฑ๐ฎ๐บ๐ฒ๐ป๐๐ฎ๐น๐, ๐ป๐ผ๐ ๐ณ๐ฟ๐ฎ๐บ๐ฒ๐๐ผ๐ฟ๐ธ๐
Have you ever wondered why some technologies are still with us, and some disappeared? Here is ๐๐ต๐ฒ ๐๐ถ๐ป๐ฑ๐ ๐๐ณ๐ณ๐ฒ๐ฐ๐ to explain it. This effect tells me that ๐ฏ๐ ๐๐ต๐ฒ ๐๐ถ๐บ๐ฒ ๐ ๐ฟ๐ฒ๐๐ถ๐ฟ๐ฒ, ๐ฑ๐ฒ๐๐ฒ๐น๐ผ๐ฝ๐ฒ๐ฟ๐ ๐๐ถ๐น๐น ๐๐๐ถ๐น๐น ๐ฏ๐ฒ ๐๐๐ถ๐ป๐ด ๐# ๐ฎ๐ป๐ฑ ๐ฆ๐ค๐. It is a concept in technology and innovation that suggests that the future life expectancy of a non-perishable item is proportional to its current age. In other words, the longer an item has been in use, the longer it is likely to continue to be used.
The concept was named after Lindy's Deli in New York City, where Nassim Nicholas Taleb popularized it in his book "๐ง๐ต๐ฒ ๐๐น๐ฎ๐ฐ๐ธ ๐ฆ๐๐ฎ๐ป." According to Taleb, the Lindy effect applies to many things, including technologies, ideas, and cultures, and evaluates their potential longevity.
In software development, we see that ๐ณ๐ฟ๐ฎ๐บ๐ฒ๐๐ผ๐ฟ๐ธ๐ ๐ฐ๐ผ๐บ๐ฒ ๐ฎ๐ป๐ฑ ๐ด๐ผ, ๐ฏ๐๐ ๐น๐ฎ๐ป๐ด๐๐ฎ๐ด๐ฒ๐ ๐๐๐ฐ๐ต ๐ฎ๐ ๐ฆ๐ค๐ ๐ผ๐ฟ ๐# ๐ฎ๐ป๐ฑ ๐ฐ๐ผ๐ป๐ฐ๐ฒ๐ฝ๐๐ ๐๐๐ฐ๐ต ๐ฎ๐ ๐ข๐ฏ๐ท๐ฒ๐ฐ๐-๐ผ๐ฟ๐ถ๐ฒ๐ป๐๐ฒ๐ฑ ๐ฝ๐ฟ๐ผ๐ด๐ฟ๐ฎ๐บ๐บ๐ถ๐ป๐ด ๐ผ๐ฟ ๐ฆ๐ข๐๐๐ ๐ฝ๐ฟ๐ถ๐ป๐ฐ๐ถ๐ฝ๐น๐ฒ๐ ๐๐๐ฎ๐. All the energy I put into learning those technologies 10-15 years ago continues to support my work today. Some things changed, but the fundamentals stayed and even got better.
So, try to ๐น๐ฒ๐ฎ๐ฟ๐ป ๐๐ต๐ถ๐ป๐ด๐ ๐๐ต๐ฎ๐ ๐ฑ๐ผ๐ป'๐ ๐ฐ๐ต๐ฎ๐ป๐ด๐ฒ (quote from Jeff Bezos). Focus on foundations, not frameworks. I've been doing this for two decades now.
Have you ever wondered why some technologies are still with us, and some disappeared? Here is ๐๐ต๐ฒ ๐๐ถ๐ป๐ฑ๐ ๐๐ณ๐ณ๐ฒ๐ฐ๐ to explain it. This effect tells me that ๐ฏ๐ ๐๐ต๐ฒ ๐๐ถ๐บ๐ฒ ๐ ๐ฟ๐ฒ๐๐ถ๐ฟ๐ฒ, ๐ฑ๐ฒ๐๐ฒ๐น๐ผ๐ฝ๐ฒ๐ฟ๐ ๐๐ถ๐น๐น ๐๐๐ถ๐น๐น ๐ฏ๐ฒ ๐๐๐ถ๐ป๐ด ๐# ๐ฎ๐ป๐ฑ ๐ฆ๐ค๐. It is a concept in technology and innovation that suggests that the future life expectancy of a non-perishable item is proportional to its current age. In other words, the longer an item has been in use, the longer it is likely to continue to be used.
The concept was named after Lindy's Deli in New York City, where Nassim Nicholas Taleb popularized it in his book "๐ง๐ต๐ฒ ๐๐น๐ฎ๐ฐ๐ธ ๐ฆ๐๐ฎ๐ป." According to Taleb, the Lindy effect applies to many things, including technologies, ideas, and cultures, and evaluates their potential longevity.
In software development, we see that ๐ณ๐ฟ๐ฎ๐บ๐ฒ๐๐ผ๐ฟ๐ธ๐ ๐ฐ๐ผ๐บ๐ฒ ๐ฎ๐ป๐ฑ ๐ด๐ผ, ๐ฏ๐๐ ๐น๐ฎ๐ป๐ด๐๐ฎ๐ด๐ฒ๐ ๐๐๐ฐ๐ต ๐ฎ๐ ๐ฆ๐ค๐ ๐ผ๐ฟ ๐# ๐ฎ๐ป๐ฑ ๐ฐ๐ผ๐ป๐ฐ๐ฒ๐ฝ๐๐ ๐๐๐ฐ๐ต ๐ฎ๐ ๐ข๐ฏ๐ท๐ฒ๐ฐ๐-๐ผ๐ฟ๐ถ๐ฒ๐ป๐๐ฒ๐ฑ ๐ฝ๐ฟ๐ผ๐ด๐ฟ๐ฎ๐บ๐บ๐ถ๐ป๐ด ๐ผ๐ฟ ๐ฆ๐ข๐๐๐ ๐ฝ๐ฟ๐ถ๐ป๐ฐ๐ถ๐ฝ๐น๐ฒ๐ ๐๐๐ฎ๐. All the energy I put into learning those technologies 10-15 years ago continues to support my work today. Some things changed, but the fundamentals stayed and even got better.
So, try to ๐น๐ฒ๐ฎ๐ฟ๐ป ๐๐ต๐ถ๐ป๐ด๐ ๐๐ต๐ฎ๐ ๐ฑ๐ผ๐ป'๐ ๐ฐ๐ต๐ฎ๐ป๐ด๐ฒ (quote from Jeff Bezos). Focus on foundations, not frameworks. I've been doing this for two decades now.
๐170๐1
๐๐ถ๐ ๐ ๐ฒ๐ฟ๐ด๐ฒ ๐๐ ๐ฅ๐ฒ๐ฏ๐ฎ๐๐ฒ
One of the most powerful Git features is branching. Yet, while working with it, we must integrate changes from one branch into another. The way how to do this can be different.
We have two ways to do it:
๐ญ. ๐ ๐ฒ๐ฟ๐ด๐ฒ
When you merge Branch A into Branch B (with ๐๐๐ ๐๐๐๐๐), Git creates a new merge commit. This commit has two parents, one from each branch, symbolizing the confluence of histories. It's a non-destructive operation, preserving the exact history of your project, warts, and all. Merges are particularly useful in collaborative environments where maintaining the integrity and chronological order of changes is essential. Yet, merge commits can clutter the history, making it harder to follow specific lines of development.
๐ฎ. ๐ฅ๐ฒ๐ฏ๐ฎ๐๐ฒ
When you rebase Branch A onto Branch B (with ๐๐๐ ๐๐๐๐๐๐), you're essentially saying, "Let's pretend these changes from Branch A were made on top of the latest changes in Branch B." Rebase rewrites the project history by creating new commits for each commit in the original branch. This results in a much cleaner, straight-line history. Yet, it could be problematic if multiple people work on the same branch, as rebasing rewrites history, which can be challenging if others have pulled or pushed the original branch.
So, when to use them:
๐น ๐จ๐๐ฒ ๐บ๐ฒ๐ฟ๐ด๐ถ๐ป๐ด ๐๐ผ ๐ฝ๐ฟ๐ฒ๐๐ฒ๐ฟ๐๐ฒ ๐๐ต๐ฒ ๐ฐ๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ ๐ต๐ถ๐๐๐ผ๐ฟ๐, especially on shared branches or for collaborative work. It's ideal for feature branches to merge into a main or develop branch.
๐น ๐จ๐๐ฒ ๐ฟ๐ฒ๐ฏ๐ฎ๐๐ถ๐ป๐ด ๐ณ๐ผ๐ฟ ๐ฝ๐ฒ๐ฟ๐๐ผ๐ป๐ฎ๐น ๐ฏ๐ฟ๐ฎ๐ป๐ฐ๐ต๐ฒ๐ or when you want a clean, linear history for easier tracking of changes. Remember to rebase locally and avoid pushing rebased branches to shared repositories. Also, be aware ๐ป๐ผ๐ ๐๐ผ ๐ฟ๐ฒ๐ฏ๐ฎ๐๐ฒ ๐ฝ๐๐ฏ๐น๐ถ๐ฐ ๐ต๐ถ๐๐๐ผ๐ฟ๐. If your branch is shared with others, rebasing can rewrite history in a way that is disruptive and confusing to your collaborators.
One of the most powerful Git features is branching. Yet, while working with it, we must integrate changes from one branch into another. The way how to do this can be different.
We have two ways to do it:
๐ญ. ๐ ๐ฒ๐ฟ๐ด๐ฒ
When you merge Branch A into Branch B (with ๐๐๐ ๐๐๐๐๐), Git creates a new merge commit. This commit has two parents, one from each branch, symbolizing the confluence of histories. It's a non-destructive operation, preserving the exact history of your project, warts, and all. Merges are particularly useful in collaborative environments where maintaining the integrity and chronological order of changes is essential. Yet, merge commits can clutter the history, making it harder to follow specific lines of development.
๐ฎ. ๐ฅ๐ฒ๐ฏ๐ฎ๐๐ฒ
When you rebase Branch A onto Branch B (with ๐๐๐ ๐๐๐๐๐๐), you're essentially saying, "Let's pretend these changes from Branch A were made on top of the latest changes in Branch B." Rebase rewrites the project history by creating new commits for each commit in the original branch. This results in a much cleaner, straight-line history. Yet, it could be problematic if multiple people work on the same branch, as rebasing rewrites history, which can be challenging if others have pulled or pushed the original branch.
So, when to use them:
๐น ๐จ๐๐ฒ ๐บ๐ฒ๐ฟ๐ด๐ถ๐ป๐ด ๐๐ผ ๐ฝ๐ฟ๐ฒ๐๐ฒ๐ฟ๐๐ฒ ๐๐ต๐ฒ ๐ฐ๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ ๐ต๐ถ๐๐๐ผ๐ฟ๐, especially on shared branches or for collaborative work. It's ideal for feature branches to merge into a main or develop branch.
๐น ๐จ๐๐ฒ ๐ฟ๐ฒ๐ฏ๐ฎ๐๐ถ๐ป๐ด ๐ณ๐ผ๐ฟ ๐ฝ๐ฒ๐ฟ๐๐ผ๐ป๐ฎ๐น ๐ฏ๐ฟ๐ฎ๐ป๐ฐ๐ต๐ฒ๐ or when you want a clean, linear history for easier tracking of changes. Remember to rebase locally and avoid pushing rebased branches to shared repositories. Also, be aware ๐ป๐ผ๐ ๐๐ผ ๐ฟ๐ฒ๐ฏ๐ฎ๐๐ฒ ๐ฝ๐๐ฏ๐น๐ถ๐ฐ ๐ต๐ถ๐๐๐ผ๐ฟ๐. If your branch is shared with others, rebasing can rewrite history in a way that is disruptive and confusing to your collaborators.
๐103
๐ง๐ต๐ฒ ๐๐ฒ๐๐ ๐ฆ๐ผ๐ณ๐๐๐ฎ๐ฟ๐ฒ ๐๐ฟ๐ฐ๐ต๐ถ๐๐ฒ๐ฐ๐๐๐ฟ๐ฒ ๐๐ผ๐ผ๐ธ๐ ๐๐ป ๐๐๐ฒ๐ฟ๐ ๐๐ฎ๐๐ฒ๐ด๐ผ๐ฟ๐
Check out this list of all books tagged with software architecture. They are ranked based on Goodreads score with applied simple algorithmic rules (relevant to software architecture, content is not obsolete, it must be tech agnostic, and average rating > 3.5). Rating is based on the number of written reviews, including the average rating, the number of ratings, and the publishing date.
๐ป https://github.com/mhadidg/software-architecture-books
Check out this list of all books tagged with software architecture. They are ranked based on Goodreads score with applied simple algorithmic rules (relevant to software architecture, content is not obsolete, it must be tech agnostic, and average rating > 3.5). Rating is based on the number of written reviews, including the average rating, the number of ratings, and the publishing date.
Please open Telegram to view this post
VIEW IN TELEGRAM
๐74๐7