Best resources to learn System Design
December 09, 2024
System Design
System Design resources
System design is a crucial skill for software engineers, especially in high-scale, production-level applications. Here are some of the best resources for learning system design, ranging from books to online courses and websites
Websites & Blogs
Key Topics to Focus On
As you explore these resources, here are some essential topics to focus on when learning system design:
Scalability: Horizontal vs. vertical scaling, sharding, partitioning, and load balancing.
Reliability: Fault tolerance, replication, consistency models (CAP theorem), and high availability.
Data Storage & Databases: SQL vs. NoSQL, data modeling, caching, and indexing.
Distributed Systems: Eventual consistency, distributed messaging, and microservices.
Performance: Latency, throughput, bottlenecks, and optimization techniques.
Security & Privacy: Authentication, authorization, encryption, and securing data in transit.
Design Patterns: Event-driven architecture, CQRS, and service-oriented architecture.
Following are some curated links to learn system design.
The System Design Primer is a popular open-source resource on GitHub, primarily designed to help software engineers prepare for system design interviews. It's created and maintained by Donne Martin and provides a comprehensive guide for understanding key concepts, patterns, and approaches related to designing large-scale systems.
Roadmap.sh is a popular open-source resource that provides interactive learning paths (or roadmaps) for developers and engineers. It’s designed to help people navigate the learning process and give them a clear, structured guide to becoming proficient in various areas of software development.
HelloInterview is a platform designed to help individuals prepare for technical interviews, particularly in the fields of software engineering and development. The website offers a variety of resources aimed at improving your interview skills, with a focus on coding challenges, system design, and behavioral interview questions
Another popular github repo for System design
Another very use full site to learn system design concepts. It also provides a quiz module to assert the knowledge.
ByteByteGo is an online platform created by Alex Xu, a software engineer, designed to help developers prepare for system design interviews
This site provides some example design of highly scalable systems
Summary
By leveraging these resources and focusing on core concepts like scalability, reliability, and performance, you can master system design and be well-prepared for both real-world projects and technical interviews. Please let us know if you have any other sources to be added in the article.
Cannot import xgboost in Jupyter notebook
October 16, 2024
Jupyter
Table of Content
Getting this simple problem while importing Xgboost on Jupyter notebook
Sometimes when we try to import xgboost in Jupyter notebook it does not work and throws error. This page contains the step taken to solve the issue successfully.
Issue: Cannot import xgboost in Jupyter notebook
In this case it was a Jupyter note book that was installed locally on Mac.
Error: Following error seen in Jupyter notebook
XGBoost Library ({libname}) could not be loaded.
225 Likely causes:
226 * OpenMP runtime is not installed
227 - vcomp140.dll or libgomp-1.dll for Windows
228 - libomp.dylib for Mac OSX
229 - libgomp.so for Linux and other UNIX-like OSes
230 Mac OSX users: Run `brew install libomp` to install OpenMP runtime.
231
232 * You are running 32-bit Python on a 64-bit OS
Solution
Install libomp
Go to the terminal and install libomp with following command
brew install libomp
Summary
After installing libomp the import of Xgboost worked in Jupyter notebook. Please note that if we dont have brew installed we need to install brew first.
Table of Content
npm and npx
Both npm and npx are tools that come with Node.js, but they serve different purposes.
npm
Full Form: Node Package Manager
Purpose: npm is used for managing packages in Node.js projects. It helps you install, update, and
npm Commands
- remove packages, as well as manage project dependencies.:
- npm install
: Installs a package. - npm uninstall
: Removes a package. - npm update: Updates all packages to the latest versions.
- npm list: Lists installed packages and their versions.
npx
Full Form: Node Package Executor
Purpose: npx is used to execute binaries from Node modules or packages without needing to install them globally. It's especially handy for running CLI tools that are part of your project or that you don't want to install globally.
npx Commands
- npx
: Runs a command from a package. For example, npx create-react-app my-app will run the create-react-app command without needing to install it globally.
Example Scenario
If you want to start a new React project, you could use:
This command runs create-react-app without having it installed globally.
npx create-react-app my-app
If you wanted to install create-react-app globally for repeated use, you would use:
Bellow code uses npm to install create-react-app globally
npm install -g create-react-app
Summary
To run Node.js packages without having to install them globally, npx is very helpful. We can use it to run command-line interface (CLI) tools, run scripts, and carry out other operations.
How to find hamming weight in java
May 08, 2024
Hammingweight
Table of Content
How to find hamming weight in Java
hamming weight for a number is the count of bits that are non zero. For instance for 1001 hamming weight is 2. For 100001111 hamming weight is 5. In this article we will see how to find hamming weight efficiently.
Using Simple divide and reminder
Here we are divide the number by 2 and until it becomes 0 and each step we check if the intermediate gives reminder 1 while dividing by 2.
public static int hammingWeight(int n) {
int count = 0;
while (n != 0) {
if (n % 2 == 1) {
count++;
}
n = n / 2;
}
return count;
}
Using Bit marking
In this example we are using Bit masking. Since the input is an Integer and it contains 32 bits. We do a & (bit wise and) operation for each of its digits.
public static int hammingWeightII(int n) {
int count = 0;
int mask = 1;
for (int i = 0; i <= 31; i++) {
count += (n & mask) == 0 ? 0 : 1;
//expand the mask
mask = mask << 1;
}
return count;
}
Full Example
package ic.binary;
public class NumberOf1s {
public static void main(String[] args) {
int n = 5;
System.out.println("Number of 1 bits for :" + n + " -> " + NumberOf1s.hammingWeight(n));
System.out.println("Number of 1 bits for :" + n + " -> " + NumberOf1s.hammingWeight(n));
n = 8;
System.out.println("Number of 1 bits for :" + n + " -> " + NumberOf1s.hammingWeight(n));
System.out.println("Number of 1 bits for :" + n + " -> " + NumberOf1s.hammingWeight(n));
}
public static int hammingWeight(int n) {
int count = 0;
while (n != 0) {
if (n % 2 == 1) {
count++;
}
n = n / 2;
}
return count;
}
public static int hammingWeightII(int n) {
int count = 0;
int mask = 1;
for (int i = 0; i <= 31; i++) {
count += (n & mask) == 0 ? 0 : 1;
mask = mask << 1;
}
return count;
}
}
Output of above program
Number of 1 bits for :5 -> 2 Number of 1 bits for :5 -> 2 Number of 1 bits for :8 -> 1 Number of 1 bits for :8 -> 1
</
Table of Content
Java OptionalInt example
OptionalInt allows us to create an object which may or may not contain a int value. If a value is present, isPresent() will return true and getAsInt() will return the value.
Additional methods that depend on the presence or absence of a contained value are provided, such as orElse().
Other classes similar to OptionalInt are OptionalFloat, OptionalDouble, Optional. These can help us eliminate exceptions that occur due to the absence of a value at runtime. Basically we need to first check if the Optional is carrying any value then only try to get value.
In this example we are returning an OptionalInt from Stream created from integer array and finally returning the sum using reduce method. If the Value is present then only we are trying to pring the value by calling result.getAsint()
package javaexp.blogspot.stream;
import java.util.Arrays;
import java.util.OptionalInt;
public class OptionalIntExample {
public static void main(String[] args) {
int iarray[] = {9, 10, 11, 12, 15, 15, 25};
OptionalInt result = Arrays.stream(iarray).reduce((left, right) ->left );
if (result.isPresent() ) {
System.out.println("Sum of Array " + result.getAsInt());
}
}
}
Summary
OptionalInt and other respective Optional classes helping in protecting from Nullpointer exception when we try to get value (say integer value) from and Integer object which is null.
Bucket sort implementation in Java
May 05, 2024
Sorting
Table of Content
Bucket Sort in Java
In this article we will go though a simple implementation of Bucket sort in Java
What is Bucket sort
Bucket sort is a sorting algorithm that divides the inputs into several buckets. Once the buckets are populated with input data, then all these buckets are sorted individually using a different sorting mechanism. After individual buckets are sorted they are contaminated together and returned as final result.
Following is the Pseudocode for Bucket sort