[{"content":" I\u0026rsquo;m a Software Engineer with a strong background in Java development. I started programming in high school and now work at Turkish Airlines Technology.\nMy skills include Spring Boot, MongoDB, PostgreSQL, Kafka, Redis, and Websocket for real-time communications.\nI\u0026rsquo;m interested in programming, electronics, robotics, and aviation.\nI enjoy working with others, taking on new challenges, and making meaningful contributions to projects that matter.\nDownload CV PDF · 94 KB Experience Turkish Airlines Technology — Java Software Engineer (consultant via Experilabs) Aug 2024 – present\nBuilt applications used by 10,000+ cabin and cockpit crew, including a document assignment app, a flight destination information system and the Mobile Cabin Assistant Optimised legacy backend services, improving response times by roughly 20% Remediated critical security vulnerabilities with Fortify and TruffleHog to keep deployment pipelines clean Java, Spring Boot, OpenShift, S3 object storage, Kafka Yapı Kredi Bank — Java Software Engineer (consultant via Metasis) May 2023 – Aug 2024\nContributed to a monolith-to-microservices migration with Spring Boot and React Built an internal REST/SOAP API mocking tool plus a custom IntelliJ plugin to speed up development workflows Reached 90% unit and integration test coverage using JUnit, WireMock and RestAssured SAP PowerDesigner, Jira, Confluence and Bitbucket for lifecycle management Huawei — Software Engineering Intern Dec 2022 – Mar 2023\nMicroservice development with Spring Boot, MongoDB, PostgreSQL, Kafka and Rancher IKnow Technology — Software Engineering Intern Jun 2022 – Jul 2022\nBuilt a distributed microservice application demonstrating service discovery and API gateway patterns with Spring Cloud Gateway, Feign Client and Eureka Server Bulut MD Software — Software Engineering Intern Jun 2020 – Mar 2021\nContributed to full-stack projects — e-commerce and spare parts systems — using Spring Boot and React Education Trakya University — MSc, Computer Science 2023 – 2026 Thesis: Detection of Manufacturing Defects in Smartphones Using Deep Learning Techniques (with Samsung R\u0026amp;D)\nTrakya University — BSc, Computer Engineering 2019 – 2023 GPA 3.56 / 4.00 — ranked 2nd in class\nTools I reach for Languages Java, JavaScript, Go Frameworks Spring Boot, React, Hibernate Databases PostgreSQL, MongoDB, Redis Message brokers Kafka, RabbitMQ Cloud \u0026amp; DevOps Linux, Docker, OpenShift, AWS Storage \u0026amp; network S3 object storage, Nginx, Traefik Testing JUnit, WireMock, Postman/Newman Protocols REST, WebSockets, MQTT, WebRTC Tools Git, Jira, Fortify, SonarQube, Grafana, Copilot, Arduino Community FolksDEV — Sep 2021 – Dec 2023 Prepared tutorials, published articles on Medium and took part in team-led developer events.\nLanguages Turkish (native) · English (professional working proficiency)\nGet in touch Email is the most reliable way to reach me: ucar.gurkan@hotmail.com. I\u0026rsquo;m also on GitHub, LinkedIn and Medium.\n","permalink":"https://gurkanucar.com/about/","summary":"\u003cdiv class=\"hero-decor hero-decor--page\" aria-hidden=\"true\"\u003e\u003cdiv class=\"decor-sky\" aria-hidden=\"true\"\u003e\n  \u003csvg class=\"cloud cloud--1\" viewBox=\"20 0 140 74\" focusable=\"false\"\u003e\u003ccircle cx=\"48\" cy=\"46\" r=\"26\"/\u003e\u003ccircle cx=\"90\" cy=\"36\" r=\"36\"/\u003e\u003ccircle cx=\"134\" cy=\"48\" r=\"24\"/\u003e\u003crect x=\"48\" y=\"46\" width=\"86\" height=\"26\"/\u003e\u003c/svg\u003e\n  \u003csvg class=\"cloud cloud--2\" viewBox=\"20 0 140 74\" focusable=\"false\"\u003e\u003ccircle cx=\"48\" cy=\"46\" r=\"26\"/\u003e\u003ccircle cx=\"90\" cy=\"36\" r=\"36\"/\u003e\u003ccircle cx=\"134\" cy=\"48\" r=\"24\"/\u003e\u003crect x=\"48\" y=\"46\" width=\"86\" height=\"26\"/\u003e\u003c/svg\u003e\n  \u003csvg class=\"cloud cloud--3\" viewBox=\"20 0 140 74\" focusable=\"false\"\u003e\u003ccircle cx=\"48\" cy=\"46\" r=\"26\"/\u003e\u003ccircle cx=\"90\" cy=\"36\" r=\"36\"/\u003e\u003ccircle cx=\"134\" cy=\"48\" r=\"24\"/\u003e\u003crect x=\"48\" y=\"46\" width=\"86\" height=\"26\"/\u003e\u003c/svg\u003e\n  \u003csvg class=\"cloud cloud--4\" viewBox=\"20 0 140 74\" focusable=\"false\"\u003e\u003ccircle cx=\"48\" cy=\"46\" r=\"26\"/\u003e\u003ccircle cx=\"90\" cy=\"36\" r=\"36\"/\u003e\u003ccircle cx=\"134\" cy=\"48\" r=\"24\"/\u003e\u003crect x=\"48\" y=\"46\" width=\"86\" height=\"26\"/\u003e\u003c/svg\u003e\n  \u003csvg class=\"cloud cloud--5\" viewBox=\"20 0 140 74\" focusable=\"false\"\u003e\u003ccircle cx=\"48\" cy=\"46\" r=\"26\"/\u003e\u003ccircle cx=\"90\" cy=\"36\" r=\"36\"/\u003e\u003ccircle cx=\"134\" cy=\"48\" r=\"24\"/\u003e\u003crect x=\"48\" y=\"46\" width=\"86\" height=\"26\"/\u003e\u003c/svg\u003e\n  \u003csvg class=\"cloud cloud--6\" viewBox=\"20 0 140 74\" focusable=\"false\"\u003e\u003ccircle cx=\"48\" cy=\"46\" r=\"26\"/\u003e\u003ccircle cx=\"90\" cy=\"36\" r=\"36\"/\u003e\u003ccircle cx=\"134\" cy=\"48\" r=\"24\"/\u003e\u003crect x=\"48\" y=\"46\" width=\"86\" height=\"26\"/\u003e\u003c/svg\u003e\n  \u003csvg class=\"plane\" viewBox=\"-224 0 248 24\" focusable=\"false\"\u003e\n    \u003cdefs\u003e\u003clinearGradient id=\"plane-trail-1\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\"\u003e\n        \u003cstop offset=\"0\" stop-color=\"currentColor\" stop-opacity=\"0\"/\u003e\n        \u003cstop offset=\"0.55\" stop-color=\"currentColor\" stop-opacity=\"0.12\"/\u003e\n        \u003cstop offset=\"1\" stop-color=\"currentColor\" stop-opacity=\"0.42\"/\u003e\n      \u003c/linearGradient\u003e\n    \u003c/defs\u003e\u003cg\u003e\u003cpath d=\"M8,6.5 L8,7.0 L-220,6.85 Z\" fill=\"url(#plane-trail-1)\"/\u003e\n      \u003cpath d=\"M8,16.0 L8,16.5 L-220,16.2 Z\" fill=\"url(#plane-trail-1)\"/\u003e\n      \u003cg transform=\"rotate(90 12 12)\"\u003e\n        \u003cpath d=\"M21 16v-2l-8-5V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5l8 2.5z\"/\u003e\n      \u003c/g\u003e\n    \u003c/g\u003e\n  \u003c/svg\u003e\n  \u003csvg class=\"plane\" viewBox=\"-224 0 248 24\" focusable=\"false\"\u003e\n    \u003cdefs\u003e\u003clinearGradient id=\"plane-trail-2\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\"\u003e\n        \u003cstop offset=\"0\" stop-color=\"currentColor\" stop-opacity=\"0\"/\u003e\n        \u003cstop offset=\"0.55\" stop-color=\"currentColor\" stop-opacity=\"0.12\"/\u003e\n        \u003cstop offset=\"1\" stop-color=\"currentColor\" stop-opacity=\"0.42\"/\u003e\n      \u003c/linearGradient\u003e\n    \u003c/defs\u003e\u003cg\u003e\u003cpath d=\"M8,6.5 L8,7.0 L-220,6.85 Z\" fill=\"url(#plane-trail-2)\"/\u003e\n      \u003cpath d=\"M8,16.0 L8,16.5 L-220,16.2 Z\" fill=\"url(#plane-trail-2)\"/\u003e\n      \u003cg transform=\"rotate(90 12 12)\"\u003e\n        \u003cpath d=\"M21 16v-2l-8-5V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5l8 2.5z\"/\u003e\n      \u003c/g\u003e\n    \u003c/g\u003e\n  \u003c/svg\u003e\n\u003c/div\u003e\n\n\u003c/div\u003e\n\n\n\u003cimg class=\"about-portrait\" src=\"/images/gurkan-ucar.png\" width=\"300\" height=\"300\" alt=\"Gürkan UÇAR\"\u003e\n\u003cp\u003eI\u0026rsquo;m a Software Engineer with a strong background in Java development. I started programming in high school and now work at \u003cstrong\u003eTurkish Airlines Technology\u003c/strong\u003e.\u003c/p\u003e","title":"About"},{"content":"This guide will get you up and running with ComfyUI and the powerful Wan 2.2 text-to-video model on RunPod in just a few minutes.\njoin to runpod first: https://runpod.io?ref=94hstegb\nvideo: https://youtu.be/vnrUJKRogkM\nWhat You\u0026rsquo;re Getting One-Click Setup Script Just copy and paste this entire code block into your RunPod terminal. That\u0026rsquo;s it!\n# Navigate to workspace cd /workspace # Clone ComfyUI git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI # Create and activate virtual environment python -m venv venv source venv/bin/activate # Install ComfyUI requirements pip install -r requirements.txt # Install ComfyUI Manager cd custom_nodes git clone https://github.com/ltdrdata/ComfyUI-Manager.git cd ComfyUI-Manager pip install -r requirements.txt cd ../.. # Start ComfyUI in background (it will keep running even if you close terminal) nohup python main.py --listen 0.0.0.0 --port 8188 \u0026gt; app.log 2\u0026gt;\u0026amp;1 \u0026amp; # Show logs (press Ctrl+C to stop viewing logs, ComfyUI will continue running) tail -f app.log # Download Wan 2.2 LoRA files (these enable 4-step fast generation) cd models/loras wget -O wan2.2_t2v_lightx2v_4steps_lora_v1.1_high_noise.safetensors \u0026#34;https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/loras/wan2.2_t2v_lightx2v_4steps_lora_v1.1_high_noise.safetensors\u0026#34; wget -O wan2.2_t2v_lightx2v_4steps_lora_v1.1_low_noise.safetensors \u0026#34;https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/loras/wan2.2_t2v_lightx2v_4steps_lora_v1.1_low_noise.safetensors\u0026#34; cd ../.. # IMPORTANT: You still need to manually download these large model files: # # Download to models/text_encoders/: # - umt5_xxl_fp8_e4m3fn_scaled.safetensors # # Download to models/vae/: # - wan_2.1_vae.safetensors # # Download to models/diffusion_models/: # - wan2.2_t2v_low_noise_14B_fp8_scaled.safetensors # - wan2.2_t2v_high_noise_14B_fp8_scaled.safetensors # After Running the Script Access ComfyUI: Open your browser and go to your-pod-url:8188 Download remaining models: Get the big model files from Hugging Face (links in the script) Start creating: Type in your text prompt and generate Troubleshooting If something goes wrong, check the logs:\ncd /workspace/ComfyUI tail -f app.log Need to restart ComfyUI? Kill it and start again:\npkill -f \u0026#34;python main.py\u0026#34; nohup python main.py --listen 0.0.0.0 --port 8188 \u0026gt; app.log 2\u0026gt;\u0026amp;1 \u0026amp; ","permalink":"https://gurkanucar.com/posts/complete-comfyui-wan-2-2-setup-guide-for-runpod/","summary":"\u003cp\u003eThis guide will get you up and running with ComfyUI and the powerful Wan 2.2 text-to-video model on RunPod in just a few minutes.\u003c/p\u003e\n\u003cp\u003ejoin to runpod first: \u003ca href=\"https://runpod.io/\"\u003ehttps://runpod.io?ref=94hstegb\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003evideo: \u003ca href=\"https://youtu.be/vnrUJKRogkM\"\u003ehttps://youtu.be/vnrUJKRogkM\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"what-youre-getting\"\u003eWhat You\u0026rsquo;re Getting\u003c/h2\u003e\n\u003ch2 id=\"one-click-setup-script\"\u003eOne-Click Setup Script\u003c/h2\u003e\n\u003cp\u003eJust copy and paste this entire code block into your RunPod terminal. That\u0026rsquo;s it!\u003c/p\u003e","title":"Complete ComfyUI + Wan 2.2 Setup Guide for RunPod"},{"content":"I have collected all my usefull commands in one place.\nLinux Commands Cheatsheet A comprehensive collection of useful Linux commands for system administration, development, and everyday tasks.\nTable of Contents System Management File Operations Networking Process Management Service Management Compression and Archiving Permissions Package Management System Information Docker Java Development Maven Spring Boot Useful Aliases System Management Update and Upgrade # Update the package lists sudo apt-get update # Upgrade installed packages sudo apt upgrade -y # Update and upgrade in one command sudo apt update \u0026amp;\u0026amp; sudo apt upgrade -y Firewall Setup # Install the Uncomplicated Firewall sudo apt install ufw -y # Enable the firewall sudo ufw enable # Allow common ports sudo ufw allow 80 # HTTP sudo ufw allow 443 # HTTPS sudo ufw allow 22 # SSH sudo ufw allow ssh # SSH (alternative) Reboot and Shutdown # Reboot the system sudo reboot # Power off the system sudo poweroff # Halt the system sudo halt # Shutdown with options sudo shutdown File Operations Viewing Files # Display file contents cat file.txt # View file with pagination less file.txt # View last lines of file (follow mode) tail -f file.log # View last 1000 lines and follow updates tail -n 1000 -f file.log Creating and Modifying Files # Write to a file (overwrites existing content) echo \u0026#34;text\u0026#34; \u0026gt; file.txt # Append to a file echo \u0026#34;text\u0026#34; \u0026gt;\u0026gt; file.txt File Management # Copy a file cp source_file destination_file # Move or rename a file mv source_file destination_file # Remove a file rm file.txt File Search # Find a file by name find /path -name \u0026#34;filename\u0026#34; # Search inside files for a string grep -r \u0026#34;text_to_search\u0026#34; /path/to/search # Colorize grep output grep --color=auto \u0026#34;pattern\u0026#34; file Networking Network Information # Install network tools sudo apt install net-tools # Check IP address ip addr show # Alternative for IP address ifconfig # Ping a host ping example.com # Display routing table netstat -rn # List all TCP connections with ports and processes sudo netstat -tnlp # Find process using specific port sudo netstat -tnlp | grep :22 sudo netstat -tnlp | grep :8080 Port Management # Install lsof sudo apt-get install lsof # Find which app is using a port sudo lsof -i :PORT_NUMBER # Example: sudo lsof -i :8080 # Kill an app using a port sudo kill -9 $(sudo lsof -t -i :PORT_NUMBER) Process Management Process Monitoring # List all running processes ps aux # Interactive process viewer top # Sort processes by memory usage ps auxf | sort -nr -k 4 # Top 10 processes by memory usage ps auxf | sort -nr -k 4 | head -10 # Sort processes by CPU usage ps auxf | sort -nr -k 3 # Top 10 processes by CPU usage ps auxf | sort -nr -k 3 | head -10 # Find Java/Spring Boot processes ps aux | grep java ps aux | grep spring-boot Process Control # Kill a process by PID kill -9 PID Service Management Systemd Commands # Check status of all services service --status-all # Check status of a specific service sudo systemctl status service_name # Start a service sudo systemctl start service_name # Stop a service sudo systemctl stop service_name # Restart a service sudo systemctl restart service_name # Enable a service at boot sudo systemctl enable service_name # Disable a service at boot sudo systemctl disable service_name Nginx Commands # Test Nginx configuration nginx -t # Restart Nginx systemctl restart nginx Compression and Archiving Tar Commands # Compress files (tar.gz) tar -czvf archive.tar.gz file1 file2 # Extract tar.gz files tar -xzvf archive.tar.gz Zip Commands # Zip a file zip archive.zip file1 file2 # Unzip a file unzip archive.zip Permissions # Change permissions of a file chmod 755 file.txt # Change ownership of a file sudo chown user:user file.txt # Change permissions recursively chmod -R 755 /path/to/directory Package Management Debian/Ubuntu (apt) # Update the package list sudo apt update # Upgrade all packages sudo apt upgrade # Install a package sudo apt install package_name # Uninstall a package sudo apt remove package_name # Purge a package (completely remove config files as well) sudo apt purge package_name # Search for a package apt search package_name System Information # Check disk usage df -h # Check memory usage free -h # Free memory info free -m -l -t # Check CPU usage top # Check system uptime uptime # CPU information lscpu # GPU memory information grep -i --color memory /var/log/Xorg.0.log Docker Image Management # Pull an image from Docker Hub docker pull image_name # View all images docker images # Remove an image docker rmi image_name # Build an image from a Dockerfile docker build -t image_name . # Remove dangling/unused images docker image prune Container Management # Run a Docker container docker run image_name # Run with options docker run -d -p host_port:container_port --name container_name image_name # List running containers docker ps # List all containers (including stopped) docker ps -a # Stop a running container docker stop container_name_or_id # Start a stopped container docker start container_name_or_id # Remove a stopped container docker rm container_name_or_id # Check logs of a container docker logs container_name_or_id # Follow container logs with limited output docker logs --follow --tail=50 container_name_or_id # Exec into a running container docker exec -it container_name_or_id /bin/bash # Stop and remove all containers docker stop $(docker ps -a -q) \u0026amp;\u0026amp; docker rm $(docker ps -a -q) Java Development # Compile a Java file javac MyClass.java # Run a compiled Java class java MyClass # Run a JAR file java -jar myapp.jar # Set classpath for external libraries java -cp .:path_to_lib/library.jar MyClass # Check Java version java -version Maven # Clean the target directory mvn clean # Compile the source code mvn compile # Run unit tests mvn test # Package the project mvn package # Clean and build the project mvn clean install # analyze dependencies mvn dependency:analyze # Skip tests during build mvn clean install -DskipTests mvn clean install -DskipTests=true # Check for updates of dependencies mvn versions:display-dependency-updates Spring Boot # Run a Spring Boot application (packaged as JAR) java -jar target/myapp.jar # Run from source using Maven mvn spring-boot:run # Run in background with output to log file nohup mvn spring-boot:run \u0026gt; app.log 2\u0026gt;\u0026amp;1 \u0026amp; # Run in background with timestamped log file nohup mvn spring-boot:run \u0026gt; \u0026#34;app_$(date \u0026#39;+%Y-%m-%d_%H-%M-%S\u0026#39;).log\u0026#34; 2\u0026gt;\u0026amp;1 \u0026amp; # Skip tests during build mvn clean install -DskipTests=true # Run in background nohup mvn spring-boot:run \u0026amp; # Generate a Spring Boot project curl https://start.spring.io/starter.zip -d dependencies=web -o demo.zip # Run with active profile java -jar target/myapp.jar --spring.profiles.active=dev # Run with debugging enabled mvn spring-boot:run -Dspring-boot.run.fork=false -X Redis redis-server redis-server --service-start redis-server --service-stop redis-cli redis-cli -h 127.0.0.1 -p 6379 set mykey \u0026#34;Hello World\u0026#34; get mykey keys * del mykey flushall Useful Aliases Add these to your /etc/bash.bashrc file for system-wide aliases or ~/.bashrc for user-specific aliases:\n# File listing aliases alias ll=\u0026#39;ls -al\u0026#39; # List all files in long format alias lll=\u0026#39;ls -alh\u0026#39; # List all files with human-readable sizes alias lt=\u0026#39;ls --human-readable --size -1 -S --classify\u0026#39; # Sort by size # Navigation shortcuts alias cls=\u0026#39;clear\u0026#39; # Clear the screen alias ..=\u0026#39;cd ..\u0026#39; # Go up one directory alias ...=\u0026#39;cd ../../../\u0026#39; # Go up three directories alias ....=\u0026#39;cd ../../../../\u0026#39; # Go up four directories # Package management shortcuts alias yep=\u0026#39;sudo apt install\u0026#39; # Simplified installation alias nop=\u0026#39;sudo apt remove\u0026#39; # Simplified removal alias update=\u0026#39;sudo apt update \u0026amp;\u0026amp; sudo apt upgrade -y\u0026#39; # Update and upgrade # System commands alias reboot=\u0026#39;sudo /sbin/reboot\u0026#39; alias poweroff=\u0026#39;sudo /sbin/poweroff\u0026#39; alias halt=\u0026#39;sudo /sbin/halt\u0026#39; alias shutdown=\u0026#39;sudo /sbin/shutdown\u0026#39; # Network monitoring alias whatsup=\u0026#39;service --status-all\u0026#39; # Check all services status alias iftop=\u0026#39;iftop -i eth1\u0026#39; # System information alias meminfo=\u0026#39;free -m -l -t\u0026#39; # Memory information alias path=\u0026#39;echo -e ${PATH//:/\\\\n}\u0026#39; # Show PATH entries one per line alias now=\u0026#39;date +\u0026#34;%T\u0026#34;\u0026#39; # Current time alias nowtime=now alias nowdate=\u0026#39;date +\u0026#34;%d-%m-%Y\u0026#34;\u0026#39; # Current date # Process monitoring alias psmem=\u0026#39;ps auxf | sort -nr -k 4\u0026#39; # Sort processes by memory usage alias psmem10=\u0026#39;ps auxf | sort -nr -k 4 | head -10\u0026#39; # Top 10 by memory alias pscpu=\u0026#39;ps auxf | sort -nr -k 3\u0026#39; # Sort processes by CPU usage alias pscpu10=\u0026#39;ps auxf | sort -nr -k 3 | head -10\u0026#39; # Top 10 by CPU # System information alias cpuinfo=\u0026#39;lscpu\u0026#39; # CPU information alias gpumeminfo=\u0026#39;grep -i --color memory /var/log/Xorg.0.log\u0026#39; # GPU memory info # Enhanced command defaults alias grep=\u0026#39;grep --color=auto\u0026#39; # Colorize grep output To add these aliases and make them available immediately:\n# Add to global bashrc (requires sudo) sudo echo \u0026#34;... aliases here ...\u0026#34; \u0026gt;\u0026gt; /etc/bash.bashrc # Or add to user\u0026#39;s bashrc echo \u0026#34;... aliases here ...\u0026#34; \u0026gt;\u0026gt; ~/.bashrc # Update aliases in the current session source ~/.bashrc Shell Script Creation \u0026amp; Execution # Create and run a shell script echo \u0026#39;#!/bin/bash echo \u0026#34;Hello, World!\u0026#34;\u0026#39; \u0026gt; script.sh \u0026amp;\u0026amp; chmod +x script.sh \u0026amp;\u0026amp; ./script.sh # Make a script executable chmod +x deploy.sh Print file and folders formatted find . | sed -e \u0026#34;s/[^-][^\\/]*\\// |/g\u0026#34; -e \u0026#34;s/|\\([^ ]\\)/|-\\1/\u0026#34; ","permalink":"https://gurkanucar.com/posts/useful-commands-cheat-sheet/","summary":"\u003cp\u003eI have collected all my usefull commands in one place.\u003c/p\u003e\n\u003ch2 id=\"linux-commands-cheatsheet\"\u003eLinux Commands Cheatsheet\u003c/h2\u003e\n\u003cp\u003eA comprehensive collection of useful Linux commands for system administration, development, and everyday tasks.\u003c/p\u003e\n\u003ch3 id=\"table-of-contents\"\u003eTable of Contents\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSystem Management\u003c/li\u003e\n\u003cli\u003eFile Operations\u003c/li\u003e\n\u003cli\u003eNetworking\u003c/li\u003e\n\u003cli\u003eProcess Management\u003c/li\u003e\n\u003cli\u003eService Management\u003c/li\u003e\n\u003cli\u003eCompression and Archiving\u003c/li\u003e\n\u003cli\u003ePermissions\u003c/li\u003e\n\u003cli\u003ePackage Management\u003c/li\u003e\n\u003cli\u003eSystem Information\u003c/li\u003e\n\u003cli\u003eDocker\u003c/li\u003e\n\u003cli\u003eJava Development\u003c/li\u003e\n\u003cli\u003eMaven\u003c/li\u003e\n\u003cli\u003eSpring Boot\u003c/li\u003e\n\u003cli\u003eUseful Aliases\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"system-management\"\u003eSystem Management\u003c/h2\u003e\n\u003ch3 id=\"update-and-upgrade\"\u003eUpdate and Upgrade\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Update the package lists\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt-get update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Upgrade installed packages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt upgrade -y\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Update and upgrade in one command\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt update \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e sudo apt upgrade -y\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"firewall-setup\"\u003eFirewall Setup\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install the Uncomplicated Firewall\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install ufw -y\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Enable the firewall\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw \u003cspan class=\"nb\"\u003eenable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Allow common ports\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw allow \u003cspan class=\"m\"\u003e80\u003c/span\u003e       \u003cspan class=\"c1\"\u003e# HTTP\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw allow \u003cspan class=\"m\"\u003e443\u003c/span\u003e      \u003cspan class=\"c1\"\u003e# HTTPS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw allow \u003cspan class=\"m\"\u003e22\u003c/span\u003e       \u003cspan class=\"c1\"\u003e# SSH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ufw allow ssh      \u003cspan class=\"c1\"\u003e# SSH (alternative)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"reboot-and-shutdown\"\u003eReboot and Shutdown\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Reboot the system\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo reboot\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Power off the system\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo poweroff\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Halt the system\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo halt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Shutdown with options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo shutdown\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"file-operations\"\u003eFile Operations\u003c/h2\u003e\n\u003ch3 id=\"viewing-files\"\u003eViewing Files\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Display file contents\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat file.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View file with pagination\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eless file.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View last lines of file (follow mode)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etail -f file.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View last 1000 lines and follow updates\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etail -n \u003cspan class=\"m\"\u003e1000\u003c/span\u003e -f file.log\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"creating-and-modifying-files\"\u003eCreating and Modifying Files\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Write to a file (overwrites existing content)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e \u0026gt; file.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Append to a file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; file.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"file-management\"\u003eFile Management\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Copy a file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecp source_file destination_file\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Move or rename a file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emv source_file destination_file\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Remove a file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm file.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"file-search\"\u003eFile Search\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Find a file by name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efind /path -name \u003cspan class=\"s2\"\u003e\u0026#34;filename\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Search inside files for a string\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egrep -r \u003cspan class=\"s2\"\u003e\u0026#34;text_to_search\u0026#34;\u003c/span\u003e /path/to/search\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Colorize grep output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egrep --color\u003cspan class=\"o\"\u003e=\u003c/span\u003eauto \u003cspan class=\"s2\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e file\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"networking\"\u003eNetworking\u003c/h2\u003e\n\u003ch3 id=\"network-information\"\u003eNetwork Information\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install network tools\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install net-tools\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check IP address\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eip addr show\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Alternative for IP address\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eifconfig\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Ping a host\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eping example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Display routing table\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enetstat -rn\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List all TCP connections with ports and processes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo netstat -tnlp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Find process using specific port\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo netstat -tnlp \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep :22\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo netstat -tnlp \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep :8080\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"port-management\"\u003ePort Management\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install lsof\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt-get install lsof\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Find which app is using a port\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo lsof -i :PORT_NUMBER\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Example: sudo lsof -i :8080\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Kill an app using a port\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo \u003cspan class=\"nb\"\u003ekill\u003c/span\u003e -9 \u003cspan class=\"k\"\u003e$(\u003c/span\u003esudo lsof -t -i :PORT_NUMBER\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"process-management\"\u003eProcess Management\u003c/h2\u003e\n\u003ch3 id=\"process-monitoring\"\u003eProcess Monitoring\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List all running processes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eps aux\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Interactive process viewer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etop\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Sort processes by memory usage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eps auxf \u003cspan class=\"p\"\u003e|\u003c/span\u003e sort -nr -k \u003cspan class=\"m\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Top 10 processes by memory usage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eps auxf \u003cspan class=\"p\"\u003e|\u003c/span\u003e sort -nr -k \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e head -10\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Sort processes by CPU usage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eps auxf \u003cspan class=\"p\"\u003e|\u003c/span\u003e sort -nr -k \u003cspan class=\"m\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Top 10 processes by CPU usage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eps auxf \u003cspan class=\"p\"\u003e|\u003c/span\u003e sort -nr -k \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e head -10\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Find Java/Spring Boot processes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eps aux \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep java\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eps aux \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep spring-boot\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"process-control\"\u003eProcess Control\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Kill a process by PID\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ekill\u003c/span\u003e -9 PID\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"service-management\"\u003eService Management\u003c/h2\u003e\n\u003ch3 id=\"systemd-commands\"\u003eSystemd Commands\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check status of all services\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eservice --status-all\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check status of a specific service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl status service_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Start a service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl start service_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Stop a service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl stop service_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Restart a service\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl restart service_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Enable a service at boot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl \u003cspan class=\"nb\"\u003eenable\u003c/span\u003e service_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Disable a service at boot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo systemctl disable service_name\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"nginx-commands\"\u003eNginx Commands\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Test Nginx configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enginx -t\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Restart Nginx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esystemctl restart nginx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"compression-and-archiving\"\u003eCompression and Archiving\u003c/h2\u003e\n\u003ch3 id=\"tar-commands\"\u003eTar Commands\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Compress files (tar.gz)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etar -czvf archive.tar.gz file1 file2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Extract tar.gz files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etar -xzvf archive.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"zip-commands\"\u003eZip Commands\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Zip a file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ezip archive.zip file1 file2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Unzip a file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eunzip archive.zip\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"permissions\"\u003ePermissions\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Change permissions of a file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echmod \u003cspan class=\"m\"\u003e755\u003c/span\u003e file.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Change ownership of a file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo chown user:user file.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Change permissions recursively\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echmod -R \u003cspan class=\"m\"\u003e755\u003c/span\u003e /path/to/directory\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"package-management\"\u003ePackage Management\u003c/h2\u003e\n\u003ch3 id=\"debianubuntu-apt\"\u003eDebian/Ubuntu (apt)\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Update the package list\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Upgrade all packages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt upgrade\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Install a package\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install package_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Uninstall a package\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt remove package_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Purge a package (completely remove config files as well)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt purge package_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Search for a package\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt search package_name\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"system-information\"\u003eSystem Information\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check disk usage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edf -h\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check memory usage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efree -h\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Free memory info\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efree -m -l -t\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check CPU usage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etop\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check system uptime\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euptime\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# CPU information\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elscpu\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# GPU memory information\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egrep -i --color memory /var/log/Xorg.0.log\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"docker\"\u003eDocker\u003c/h2\u003e\n\u003ch3 id=\"image-management\"\u003eImage Management\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Pull an image from Docker Hub\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker pull image_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# View all images\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker images\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Remove an image\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker rmi image_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Build an image from a Dockerfile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker build -t image_name .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Remove dangling/unused images\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker image prune\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"container-management\"\u003eContainer Management\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run a Docker container\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run image_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run with options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -d -p host_port:container_port --name container_name image_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List running containers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker ps\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# List all containers (including stopped)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker ps -a\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Stop a running container\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker stop container_name_or_id\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Start a stopped container\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker start container_name_or_id\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Remove a stopped container\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker rm container_name_or_id\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check logs of a container\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker logs container_name_or_id\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Follow container logs with limited output\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker logs --follow --tail\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e50\u003c/span\u003e container_name_or_id\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Exec into a running container\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker \u003cspan class=\"nb\"\u003eexec\u003c/span\u003e -it container_name_or_id /bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Stop and remove all containers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker stop \u003cspan class=\"k\"\u003e$(\u003c/span\u003edocker ps -a -q\u003cspan class=\"k\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e docker rm \u003cspan class=\"k\"\u003e$(\u003c/span\u003edocker ps -a -q\u003cspan class=\"k\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"java-development\"\u003eJava Development\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Compile a Java file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejavac MyClass.java\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run a compiled Java class\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejava MyClass\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run a JAR file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejava -jar myapp.jar\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Set classpath for external libraries\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejava -cp .:path_to_lib/library.jar MyClass\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check Java version\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejava -version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"maven\"\u003eMaven\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clean the target directory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Compile the source code\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn compile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run unit tests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn \u003cspan class=\"nb\"\u003etest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Package the project\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn package\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Clean and build the project\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn clean install\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# analyze dependencies\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn dependency:analyze\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Skip tests during build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn clean install -DskipTests\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn clean install -DskipTests\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Check for updates of dependencies\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn versions:display-dependency-updates\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"spring-boot\"\u003eSpring Boot\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run a Spring Boot application (packaged as JAR)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejava -jar target/myapp.jar\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run from source using Maven\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn spring-boot:run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run in background with output to log file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enohup mvn spring-boot:run \u0026gt; app.log 2\u0026gt;\u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run in background with timestamped log file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enohup mvn spring-boot:run \u0026gt; \u003cspan class=\"s2\"\u003e\u0026#34;app_\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003edate \u003cspan class=\"s1\"\u003e\u0026#39;+%Y-%m-%d_%H-%M-%S\u0026#39;\u003c/span\u003e\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e.log\u0026#34;\u003c/span\u003e 2\u0026gt;\u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Skip tests during build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn clean install -DskipTests\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run in background\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enohup mvn spring-boot:run \u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Generate a Spring Boot project\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://start.spring.io/starter.zip -d \u003cspan class=\"nv\"\u003edependencies\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eweb -o demo.zip\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run with active profile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejava -jar target/myapp.jar --spring.profiles.active\u003cspan class=\"o\"\u003e=\u003c/span\u003edev\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Run with debugging enabled\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emvn spring-boot:run -Dspring-boot.run.fork\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003efalse\u003c/span\u003e -X\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"redis\"\u003eRedis\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eredis-server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eredis-server --service-start\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eredis-server --service-stop\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eredis-cli\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eredis-cli -h 127.0.0.1 -p 6379\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eset mykey \u0026#34;Hello World\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eget mykey\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekeys *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edel mykey\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eflushall\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"useful-aliases\"\u003eUseful Aliases\u003c/h2\u003e\n\u003cp\u003eAdd these to your \u003ccode\u003e/etc/bash.bashrc\u003c/code\u003e file for system-wide aliases or \u003ccode\u003e~/.bashrc\u003c/code\u003e for user-specific aliases:\u003c/p\u003e","title":"Useful Commands - Cheat Sheet"},{"content":"Spring Boot S3 Presigned Url Upload/Download File What is presigned url and why should we use? Presigned URLs let us upload and download files without going through our service directly. This helps save resources and reduces the load on our systems.\nIn this article I will show you traditional way to upload/download files to s3 bucket using spring boot and more effective way using presigned urls.\n# an example of presigned url https://myawesomeuniquebucket.s3.amazonaws.com /1729958037118_test.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256 \u0026amp;X-Amz-Date=20241026T155357Z\u0026amp;X-Amz-SignedHeaders=host \u0026amp;X-Amz-Credential=AKIAYMCOFGJVFLVO2AMY%2F20241026%2Fus-east-1%2Fs3%2Faws4_request \u0026amp;X-Amz-Expires=3600\u0026amp;X-Amz-Signature=b5d50eee26d24667ba9d07095965f7e12be20008488418e3cffc4f58e3590a3f upload/download using presigned url\ntraditional way\nCreate bucket and user in AWS First let’s create our aws bucket and user for acces from our application.\nCreate a bucket write an unique name\nselect ACLs enabled, because we want to upload public and private files\nuntick block all public access\nCreate a user Create access and secret key Now we are ready to go with java! First add dependency below:\n\u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;software.amazon.awssdk\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;s3\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;2.29.0\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; Then create variables in application.config file:\n#AWS credentials - aws aws.accessKey=\u0026lt;ACCESS_KEY\u0026gt; aws.secretKey=\u0026lt;SECRET_KEY\u0026gt; aws.region=us-east-1 #check it from your bucket aws.bucket=myawesomeuniquebucket To connect aws we must create beans in java. Create a class with name “S3Config”. We will add connection bean and presigned url bean to here.\n@Configuration public class S3Config { @Value(\u0026#34;${aws.accessKey}\u0026#34;) private String accessKey; @Value(\u0026#34;${aws.secretKey}\u0026#34;) private String secretKey; @Value(\u0026#34;${aws.region}\u0026#34;) private String region; @Bean public S3Client s3Client() { Region awsRegion = Region.of(region); AwsBasicCredentials awsCredentials = AwsBasicCredentials.create(accessKey, secretKey); return S3Client.builder() .region(awsRegion) .credentialsProvider(StaticCredentialsProvider.create(awsCredentials)) .build(); } @Bean public S3Presigner s3Presigner() { Region awsRegion = Region.of(region); return S3Presigner.builder() .region(awsRegion) .credentialsProvider(StaticCredentialsProvider.create( AwsBasicCredentials.create(accessKey, secretKey))) .build(); } } Now we will create endpoints for making these operations:\nUpload file over java Upload private file using s3 presigned url (that can not be accessible directly) Upload public file using s3 presigned url (that can be accessible over s3 directly) Download files over s3 using presigned url Download files over java Let’s create a controller class:\n@RestController @RequestMapping(\u0026#34;/files\u0026#34;) @RequiredArgsConstructor public class FileController { private final FileService fileService; /** * Generates a presigned GET URL for a file. */ @GetMapping(\u0026#34;/{filename}\u0026#34;) public ResponseEntity\u0026lt;String\u0026gt; getUrl(@PathVariable String filename) { String url = fileService.generatePreSignedUrl(filename, SdkHttpMethod.GET, null); return ResponseEntity.ok(url); } /** * Generates a presigned PUT URL with specified access type. */ @PostMapping(\u0026#34;/pre-signed-url\u0026#34;) public ResponseEntity\u0026lt;Map\u0026lt;String, Object\u0026gt;\u0026gt; generateUrl( @RequestParam(name = \u0026#34;filename\u0026#34;, required = false, defaultValue = \u0026#34;\u0026#34;) String filename, @RequestParam(name = \u0026#34;accessType\u0026#34;, required = false, defaultValue = \u0026#34;PRIVATE\u0026#34;) AccessType accessType) { filename = buildFilename(filename); String url = fileService.generatePreSignedUrl(filename, SdkHttpMethod.PUT, accessType); return ResponseEntity.ok(Map.of(\u0026#34;url\u0026#34;, url, \u0026#34;file\u0026#34;, filename)); } /** * Uploads a file with specified access type over java. */ @PostMapping(\u0026#34;/upload\u0026#34;) public ResponseEntity\u0026lt;String\u0026gt; uploadFile( @RequestParam(\u0026#34;file\u0026#34;) MultipartFile file, @RequestParam(name = \u0026#34;accessType\u0026#34;, required = false, defaultValue = \u0026#34;PRIVATE\u0026#34;) AccessType accessType) throws IOException { String fileName = fileService.uploadMultipartFile(file, accessType); return ResponseEntity.ok(\u0026#34;File name: \u0026#34; + fileName); } /** * Downloads a file over java. */ @GetMapping(\u0026#34;/download/{fileName}\u0026#34;) public ResponseEntity\u0026lt;StreamingResponseBody\u0026gt; downloadFile(@PathVariable(\u0026#34;fileName\u0026#34;) String fileName) throws Exception { return fileService.downloadFileResponse(fileName); } } Now we will create a service class. We have some utility methods too but i did not put them all here. You can find full code on github repo below.\n@Service @RequiredArgsConstructor public class FileService { @Value(\u0026#34;${aws.bucket}\u0026#34;) private String bucketName; private final S3Client s3Client; private final S3Presigner s3Presigner; /** * Generates a presigned URL for GET or PUT operations with specified access type. */ public String generatePreSignedUrl(String filePath, SdkHttpMethod method, AccessType accessType) { if (method == SdkHttpMethod.GET) { return generateGetPresignedUrl(filePath); } else if (method == SdkHttpMethod.PUT) { return generatePutPresignedUrl(filePath, accessType); } else { throw new UnsupportedOperationException(\u0026#34;Unsupported HTTP method: \u0026#34; + method); } } /** * Generates a presigned GET URL. */ private String generateGetPresignedUrl(String filePath) { GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(bucketName) .key(filePath) .build(); // you can change expiration time here GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() .signatureDuration(Duration.ofMinutes(60)) .getObjectRequest(getObjectRequest) .build(); PresignedGetObjectRequest presignedRequest = s3Presigner.presignGetObject(presignRequest); return presignedRequest.url().toString(); } /** * Generates a presigned PUT URL with optional ACL based on AccessType. */ private String generatePutPresignedUrl(String filePath, AccessType accessType) { PutObjectRequest.Builder putObjectRequestBuilder = PutObjectRequest.builder() .bucket(bucketName) .key(filePath); if (accessType == AccessType.PUBLIC) { putObjectRequestBuilder.acl(ObjectCannedACL.PUBLIC_READ); } PutObjectRequest putObjectRequest = putObjectRequestBuilder.build(); PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder() .signatureDuration(Duration.ofMinutes(60)) .putObjectRequest(putObjectRequest) .build(); PresignedPutObjectRequest presignedRequest = s3Presigner.presignPutObject(presignRequest); return presignedRequest.url().toString(); } /** * Uploads a MultipartFile to S3 with specified access type. */ public String uploadMultipartFile(MultipartFile file, AccessType accessType) throws IOException { String fileName = buildFilename(file.getOriginalFilename()); try (InputStream inputStream = file.getInputStream()) { PutObjectRequest.Builder putObjectRequestBuilder = PutObjectRequest.builder() .bucket(bucketName) .key(fileName); if (accessType == AccessType.PUBLIC) { putObjectRequestBuilder.acl(ObjectCannedACL.PUBLIC_READ); } PutObjectRequest putObjectRequest = putObjectRequestBuilder.build(); s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(inputStream, file.getSize())); } return fileName; } /** * Downloads a file from S3 and returns an InputStream and ETag. */ public S3ObjectInputStreamWrapper downloadFile(String fileName) { GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(bucketName) .key(fileName) .build(); ResponseInputStream\u0026lt;GetObjectResponse\u0026gt; s3ObjectResponse = s3Client.getObject(getObjectRequest); String eTag = s3ObjectResponse.response().eTag(); return new S3ObjectInputStreamWrapper(s3ObjectResponse, eTag); } Everything looks fine. We can try our services now using postman. I added postman collection to repository. You can directly import it.\nPublic Upload \u0026amp; Download over S3 using presigned-url It returns an url to us. Now we will upload our publicly accessible file using this url. Set request type to PUT and we must set X-AMZ-ACL header to public-read for publicly accessible files otherwise you will get signature error:\nselect your file in body -\u0026gt; binary input\nif we don’t set header we will get error\nNow file is uploaded to our bucket. Let’s check it:\nTo access our file directly from s3 you can use this url syntax:\nhttps://\u0026lt;bucket_name\u0026gt;.s3.\u0026lt;region\u0026gt;.amazonaws.com/\u0026lt;your_file\u0026gt; https://myawesomeuniquebucket.s3.us-east-1.amazonaws.com/1729957467694_test.pdf Private Upload Download over S3 using presigned-url Now let’s try private upload:\nWe don’t need to specify any header etc. Just set request type PUT then upload your file:\nselect your file in body -\u0026gt; binary input\nOur file is uploaded to s3 bucket:\nTo access file we must send a preseigned-url generate request.\nOur file succesfully retrieved. If we try to access file without these params we will get 403 error, because our file is not public and only accesible for given expiry date:\nFile upload / download over spring boot Finally we will look at the upload/download over spring boot example. This is not recommended way, because it brings extra load to our backend application.\nYou can find source codes in here: https://github.com/gurkanucar/java-spring-learning/tree/master/aws-s3-file-service\n","permalink":"https://gurkanucar.com/posts/spring-boot-s3-presigned-url-upload-download-f/","summary":"\u003ch3 id=\"spring-boot-s3-presigned-url-uploaddownload-file\"\u003eSpring Boot S3 Presigned Url Upload/Download File\u003c/h3\u003e\n\u003ch4 id=\"what-is-presigned-url-and-why-should-we-use\"\u003eWhat is presigned url and why should we use?\u003c/h4\u003e\n\u003cp\u003e\u003cimg alt=\"Spring Boot S3 Presigned Url Upload/Download F\" loading=\"lazy\" src=\"/images/posts/spring-boot-s3-presigned-url-upload-download-f/1-bo0mieuupjazyqk74ahcyw.png\"\u003e\u003c/p\u003e\n\u003cp\u003ePresigned URLs let us upload and download files without going through our service directly. This helps save resources and reduces the load on our systems.\u003c/p\u003e","title":"Spring Boot S3 Presigned Url Upload/Download F"},{"content":"Tomcat10 Spring Boot 3 \u0026amp; Java 17 deployment on Ubuntu Server Hello! Today we will deploy our spring boot application on a remote server. While trying to deploy my java17 spring boot app I faced some issues and there was no resource. That’s the motivation for this article :) Thanks to Erkan Yenier for their support.\nI am using Linode however you can use other alternatives.\nFirst, we need to create a server. You can choose the lowest-priced server ($5 per month).\nhttps://www.linode.com\nNow we are ready to go! Let’s connect to our server via SSH:\nssh root@\u0026lt;IP_ADDRESS\u0026gt; Then allow SSH (If you don’t allow, it may cause errors sometime after connecting) and update\nsudo ufw allow ssh sudo apt update We will install Java 17 on our machine and set JAVA_HOME path\nsudo apt-get install openjdk-17-jdk sudo update-java-alternatives --list sudo update-java-alternatives --set java-1.17.0-openjdk-amd64 java -version export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 echo $JAVA_HOME Now install Tomcat and give permissions\nsudo groupadd tomcat sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat cd /tmp wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.15/bin/apache-tomcat-10.1.15.tar.gz sudo mkdir /opt/tomcat cd /opt/tomcat sudo tar xzvf /tmp/apache-tomcat-10.*tar.gz -C /opt/tomcat --strip-components=1 sudo chown -R tomcat:tomcat /opt/tomcat sudo chmod -R u+x /opt/tomcat/bin sudo chown -R tomcat webapps/ work/ temp/ logs/ We have to configure Tomcat. Don’t forget to set java 17. Just copy and paste the config below:\nsudo nano /etc/systemd/system/tomcat.service [Unit] Description=Apache Tomcat Web Application Container After=network.target [Service] Type=forking WorkingDirectory=/opt/tomcat/webapps Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid Environment=CATALINA_HOME=/opt/tomcat Environment=CATALINA_BASE=/opt/tomcat Environment=CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC Environment=JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/v/urandom ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/opt/tomcat/bin/shutdown.sh User=tomcat Group=tomcat UMask=0007 RestartSec=10 Restart=always [Install] WantedBy=multi-user.target Let\u0026rsquo;s start Tomcat server:\nsudo systemctl daemon-reload sudo systemctl start tomcat sudo systemctl status tomcat sudo systemctl enable tomcat sudo ufw allow 8080 open \u0026lt;IP_ADDRESS\u0026gt;:8080 from your browser it\u0026rsquo;s working\nNow we have to add roles and users to manage our Tomcat application:\nsudo nano /opt/tomcat/conf/tomcat-users.xml copy and paste the config below:\n\u0026lt;role rolename=\u0026#34;tomcat\u0026#34;/\u0026gt; \u0026lt;role rolename=\u0026#34;admin-gui\u0026#34;/\u0026gt; \u0026lt;role rolename=\u0026#34;manager\u0026#34;/\u0026gt; \u0026lt;role rolename=\u0026#34;manager-gui\u0026#34;/\u0026gt; \u0026lt;role rolename=\u0026#34;manager-script\u0026#34;/\u0026gt; \u0026lt;role rolename=\u0026#34;manager-jmx\u0026#34;/\u0026gt; \u0026lt;role rolename=\u0026#34;manager-status\u0026#34;/\u0026gt; \u0026lt;user username=\u0026#34;admin\u0026#34; password=\u0026#34;pass123\u0026#34; roles=\u0026#34;tomcat,admin-gui,manager,manager-gui,manager-script,manager-jmx,manager-status\u0026#34;/\u0026gt; Now allow remote access to Tomcat for each one. \u0026lt;Valve className=\u0026quot;org.apache.catalina.valves.RemoteAddrValve\u0026quot; allow=\u0026quot;^.*$\u0026quot; /\u0026gt; comment it using \u0026lt;!-- \u0026lt;something\u0026gt; --\u0026gt;\nsudo nano /opt/tomcat/webapps/manager/META-INF/context.xml sudo nano /opt/tomcat/webapps/host-manager/META-INF/context.xml Restart Tomcat:\nsudo systemctl daemon-reload sudo systemctl restart tomcat Deploy Java 17 Spring Boot 3 Application To deploy our spring boot application we have to extend SpringBootServletInitializer. Extending it in Spring Boot allows the application to be deployed as a WAR on external servlet containers.\n@SpringBootApplication public class SpringBootDemoApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(SpringBootDemoApplication.class, args); } } Update packaging type to war and specify build final name.\n\u0026lt;name\u0026gt;spring-boot-demo\u0026lt;/name\u0026gt; \u0026lt;description\u0026gt;spring-boot-demo\u0026lt;/description\u0026gt; \u0026lt;!-- here --\u0026gt; \u0026lt;packaging\u0026gt;war\u0026lt;/packaging\u0026gt; \u0026lt;properties\u0026gt; \u0026lt;java.version\u0026gt;17\u0026lt;/java.version\u0026gt; \u0026lt;/properties\u0026gt; .......... \u0026lt;build\u0026gt; \u0026lt;finalName\u0026gt;spring-boot-demo\u0026lt;/finalName\u0026gt; \u0026lt;plugins\u0026gt; ......... Run the following command to build your project:\nmvn clean package Open tomcat manager :8080/manager/html and deploy your war file\nCongrats GitHub:\nGitHub - gurkanucar/tomcat10-spring-boot-deployment\nresources https://phoenixnap.com/kb/install-tomcat-ubuntu https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-10-on-ubuntu-20-04 ","permalink":"https://gurkanucar.com/posts/tomcat10-spring-boot-3-java-17-deployment-on-ubuntu-server/","summary":"\u003ch3 id=\"tomcat10-spring-boot-3--java-17-deployment-on-ubuntu-server\"\u003eTomcat10 Spring Boot 3 \u0026amp; Java 17 deployment on Ubuntu Server\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Tomcat10 Spring Boot 3\\u200a—\\u200aJava 17 deployment on Ubuntu Server\" loading=\"lazy\" src=\"/images/posts/tomcat10-spring-boot-3-java-17-deployment-on-ubuntu-server/0-1qbcfkp6t6dtnn06.png\"\u003e\u003c/p\u003e\n\u003cp\u003eHello! Today we will deploy our spring boot application on a remote server. While trying to deploy my java17 spring boot app I faced some issues and there was no resource. That’s the motivation for this article :) Thanks to Erkan Yenier for their support.\u003c/p\u003e","title":"Tomcat10 Spring Boot 3 — Java 17 deployment on Ubuntu Server"},{"content":"We’re familiar with access modifiers however, have you ever heard of Java’s non-access modifiers?\nabstract— This modifier is used to create an abstract class or method that cannot be instantiated directly. An abstract class must be extended by a subclass that provides concrete implementations of its abstract methods.\nfinal: This modifier is used to create a constant variable, method, or class. If a variable is defined as final, it cannot be changed after initialization. If a method is final, it cannot be overridden, also final classes cannot be extended by any subclass.\nstatic— This modifier is used to create a class-level variable or method. Static members can be accessed without creating an object of the class.\nsynchronized: This modifier is used to make a method thread-safe by ensuring that only one thread can access it at a time.\nvolatile: This modifier is used to indicate that a variable is stored in main memory, so it’s read and written from/to main memory instead of the CPU cache.\ntransient: If you don’t want to serialize a variable you should use this. Transient variables are typically used for temporary or non-persistent data.\nstrictfp— This modifier guarantees the same floating-point calculations in any environment. Useful for precise calculations in financial or scientific applications.\nnative— This modifier indicates that a method will be implemented in languages other than Java (e.g., C, C++).\nresource:\nhttps://javagyansite.com/2020/03/21/non-access-modifiers\nhttps://www.educba.com/non-access-modifiers-in-java\n","permalink":"https://gurkanucar.com/posts/java-non-access-modifiers/","summary":"\u003cp\u003eWe’re familiar with access modifiers however, have you ever heard of Java’s non-access modifiers?\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eabstract\u003c/strong\u003e— This modifier is used to create an abstract class or method that cannot be instantiated directly. An abstract class must be extended by a subclass that provides concrete implementations of its abstract methods.\u003c/p\u003e","title":"Java Non-Access Modifiers"},{"content":"What is the GraphQL? GraphQL is a query language for APIs and is similar to REST. GraphQL is developed by Facebook and is open source. GraphQL uses a single endpoint for receiving requests. You have to write your controller name to your query. And also you can select specific fields for your response. Your response will be in JSON format.\nThere are three basic operations of GraphQL (like GET, POST, PUT…)\nQuery Mutation Subscriptions Query If you want to get something, you can use “query”.\nMutation If you want to mutate/change/update your data or create a new one, you can use “mutation”.\nSubscription “Subscription” can be used for real-time operations. This operation usually implementing with WebSockets.\nGraphQL Scheme Schemas include your models, queries, mutations and etc. You have to define all related things in your .graphqls file. For instance, you can define a model using type keyword.\nSome other keywords:\ninput : input parameter models enum scalar : for custom types *For more information check the resources\nExample GraphQL Scheme ( .graphqls file ) scalar DateTime type Query { getAllUsers : [UserDTO] getByID(id: ID!) : UserDTO } type Mutation { createUser(user: UserCreateRequest): UserDTO updateUser(user: UserUpdateRequest): UserDTO deleteUser(id: ID!): Boolean } type UserDTO { id: ID username: String createdAt: DateTime updatedAt: DateTime email: String name: String surname: String role: Role } enum Role { ADMIN USER } input UserUpdateRequest{ id:ID! username: String! email: String! name: String surname: String role: Role } input UserCreateRequest{ username: String! email: String! name: String surname: String role: Role } Pros and Cons of GraphQL Pros\nSingle endpoint Fetch specific fields from data (Reduce response size) Cons\nComplex queries Caching implementation Testing — Graphiql You can use Graphiql console for execute queries.\n*In spring boot, you have to enable it before:\nspring.graphql.graphiql.enabled=true Testing — Postman Select POST request and send your query in graphql section.\nSpring Boot Kotlin implementation Add these dependencies to your pom.xml file:\n\u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.springframework.graphql\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;spring-graphql-test\u0026lt;/artifactId\u0026gt; \u0026lt;scope\u0026gt;test\u0026lt;/scope\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;com.graphql-java\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;graphql-java-extended-scalars\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;19.0\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;spring-boot-starter-graphql\u0026lt;/artifactId\u0026gt; \u0026lt;/dependency\u0026gt; Controller *Must be the same name with query and mutation definitions in .graphqls file\n@Controller class UserController(private val userService: UserService) { @QueryMapping fun getAllUsers() = userService.getAllUsers().map { it.toDTO() } @QueryMapping fun getByID(@Argument id: Long) = userService.getUserByID(id).toDTO() @MutationMapping fun updateUser(@Argument user: UserUpdateRequest) = userService.updateUser(user).toDTO() @MutationMapping fun createUser(@Argument user: UserCreateRequest) = userService.createUser(user).toDTO() @MutationMapping fun deleteUser(@Argument id: Long) = userService.deleteUser(id) } type Query { getAllUsers : [UserDTO] getByID(id: ID!) : UserDTO } type Mutation { createUser(user: UserCreateRequest): UserDTO updateUser(user: UserUpdateRequest): UserDTO deleteUser(id: ID!): Boolean } Error Handling @Component class GlobalExceptionHandler : DataFetcherExceptionResolverAdapter() { override fun resolveToSingleError(e: Throwable, env: DataFetchingEnvironment): GraphQLError? { return when (e) { is UserNotFoundException -\u0026gt; toGraphQLError(e) is Exception -\u0026gt; toGraphQLError(e) else -\u0026gt; super.resolveToSingleError(e, env) } } private fun toGraphQLError(e: Throwable): GraphQLError? { return GraphqlErrorBuilder.newError() .message(e.message) .errorType(ErrorType.DataFetchingException).build() } } Tests / /other annotations @AutoConfigureGraphQlTester internal class UserControllerTest( @Autowired private val graphQlTester: GraphQlTester ) { @Test fun `should return all users`() { val query: String = \u0026#34;\u0026#34;\u0026#34; Query{ getAllUsers { id username email role name surname createdAt updatedAt } } \u0026#34;\u0026#34;\u0026#34; graphQlTester.document(query) .execute() .path(\u0026#34;getAllUsers\u0026#34;) .entityList(UserDTO::class.java) .hasSize(2) } } Resources: https://graphql.org https://www.baeldung.com/spring-graphql https://www.javatpoint.com/graphql-advantages-and-disadvantages https://docs.spring.io/spring-graphql/docs/current/reference/html https://dzone.com/articles/error-handling-in-spring-for-graphql https://medium.com/supercharges-mobile-product-guide/graphql-server-using-spring-boot-part-i-722bdd715779 https://refactorfirst.com/spring-boot-with-graphql Repository: kotlin: GitHub - gurkanucar/spring-boot-kotlin-graphql: GraphQL example using kotlin and spring boot\njava example: GitHub - folksdev/spring-boot-graphql\n","permalink":"https://gurkanucar.com/posts/kotlin-spring-boot-graphql/","summary":"\u003ch3 id=\"what-is-the-graphql\"\u003e\u003cstrong\u003eWhat is the GraphQL?\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Kotlin Spring Boot \u0026amp; GraphQL\" loading=\"lazy\" src=\"/images/posts/kotlin-spring-boot-graphql/1-dypqozo9vu3_blgwnzuwnq.png\"\u003e\u003c/p\u003e\n\u003cp\u003eGraphQL is a \u003cstrong\u003equery language\u003c/strong\u003e for APIs and is similar to REST. GraphQL is developed by \u003cstrong\u003eFacebook\u003c/strong\u003e and is \u003cstrong\u003eopen source\u003c/strong\u003e. GraphQL uses a \u003cstrong\u003esingle endpoint\u003c/strong\u003e for receiving requests. You have to write your \u003cstrong\u003econtroller name\u003c/strong\u003e to your query. And also you can select specific fields for your response. Your \u003cstrong\u003eresponse\u003c/strong\u003e will be in \u003cstrong\u003eJSON format.\u003c/strong\u003e\u003c/p\u003e","title":"Kotlin Spring Boot \u0026 GraphQL"},{"content":"Java Shell \u0026amp; REPL | no more public static void main What is REPL? R(ead) E(val) P(rint) L(oop), is an interactive programming environment that allows you to enter code snippets or expressions and immediately see the results of their evaluation.\nThis makes it easy to experiment and test out ideas by scripts.\nREPLs are commonly used for scripting languages like Python, and JavaScript, but they can be used for any language that supports interactive evaluation of code such as Java, Kotlin, Clojure.\nREPL in Java With the release of Java 9, the Java development community was introduced to JShell, an official REPL tool that provides a streamlined and interactive way to write, test, and experiment with code snippets.\nHow to run JShell? To start JShell, enter the jshell command on the command line.\nUseful JShell commands Enter the /help command on the command line to see details.\n/list =\u0026gt; list the source you have typed\njshell\u0026gt; /list 1 : import java.lang.String; 2 : \u0026#34;Hello world!\u0026#34;.toUpperCase().split(\u0026#34; \u0026#34;); 3 : var a=5; 4 : String name = \u0026#34;gurkan\u0026#34;; /vars =\u0026gt; list the declared variables and their values\njshell\u0026gt; /vars | String[] $3 = String[2] { \u0026#34;HELLO\u0026#34;, \u0026#34;WORLD!\u0026#34; } | int a = 5 | String name = \u0026#34;gurkan\u0026#34; /methods =\u0026gt; list the declared methods and their signatures\njshell\u0026gt; int sum(int x,int y){ return x+y;} | created method sum(int,int) jshell\u0026gt; sum(10,20); $9 ==\u0026gt; 30 jshell\u0026gt; /methods | int sum(int,int) /imports =\u0026gt; list the imported items\njshell\u0026gt; /imports | import java.io.* | import java.math.* | import java.lang.String | import java.util.* /exit =\u0026gt; to exit the jshell tool, ctrl+c won’t work!\njshell\u0026gt; /exit | Goodbye Examples Date-Time functions example\nClass example\nStreams example\nResources https://www.digitalocean.com/community/tutorials/java-repl-jshell\nhttps://www.tutorialspoint.com/how-to-implement-java-time-localdate-using-jshell-in-java-9\nhttps://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop\nhttps://docs.oracle.com/javase/10/jshell/introduction-jshell.htm\nhttps://www.infoworld.com/article/2971152/what-repl-means-for-java.html\nMy Github: gurkanucar - Overview\n","permalink":"https://gurkanucar.com/posts/repl-java-shell-no-more-public-static-void-main/","summary":"\u003ch3 id=\"java-shell--repl--no-more-public-static-void-main\"\u003eJava Shell \u0026amp; REPL | no more public static void main\u003c/h3\u003e\n\u003ch3 id=\"what-is-repl\"\u003e\u003cstrong\u003eWhat is REPL?\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"REPL \u0026amp; Java Shell | no more public static void main\" loading=\"lazy\" src=\"/images/posts/repl-java-shell-no-more-public-static-void-main/1-yfzjaged1my_8nr8gcflaq.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eR\u003c/strong\u003e(ead) \u003cstrong\u003eE\u003c/strong\u003e(val) \u003cstrong\u003eP\u003c/strong\u003e(rint) \u003cstrong\u003eL\u003c/strong\u003e(oop), is an interactive programming environment that allows you to enter code snippets or expressions and immediately see the results of their evaluation.\u003c/p\u003e","title":"REPL \u0026 Java Shell | no more public static void main"},{"content":"Imagine that, you want to make a chat application for communicating with your friend. You will send and receive messages. But there is a problem. When you send a new message to your friend how will you inform him?\nA -) Your friend will refresh the page every x seconds for checking new messages. B -) Something must be to listen to data and then get and show messages automatically in real-time. I think B is a better choice. Of course, we have some other alternatives. I mentioned before here: WebSockets\nThis is where WebSocket comes into play. WebSocket is a bi-directional communication protocol. Communication provides over a single TCP connection.\nThanks to the WebSocket protocol server and client can communicate in real-time.\nIn this article, I will show you how can we implement Socket.IO to spring boot. Let’s get started!\nCreate a new spring-boot project Add this dependency to the pom.xml file\ncom.corundumstudio.socketio\nnetty-socketio\n1.7.17\nNote That! The version is very important while working on netty-socket.io. If you do not choose the correct version, you may encounter some problems.\nAdditionally, if you want to connect to the socket from React or HTML website you have to select socket-io. client 2. x.x version.\nConfigure the application.properties filesocket-server.port=8085\nsocket-server.host=192.168.0.10 192.168.0.10 =\u0026gt; write your “IP address” not “localhost ” for connecting to socket from other devices\nCreate SocketIOConfig class under the “config” package.\nCreate ServerCommandLineRunner class under the “config” package@Component\n@Slf4j\n@RequiredArgsConstructor\npublic class ServerCommandLineRunner implements CommandLineRunner {private final SocketIOServer server;@Override\npublic void run(String\u0026hellip; args) throws Exception {\nserver.start();\n}\n}\nCreate a Message class and MessageType enum@Data\npublic class Message {\nprivate MessageType type;\nprivate String message;\nprivate String room;\npublic Message() {\n}\npublic Message(MessageType type, String message) {\nthis.type = type;\nthis.message = message;\n}\n}public enum MessageType {\nSERVER, CLIENT\n}\nCreate SocketModule class\nserver.addConnectListener(onConnected()) =\u0026gt; triggering when someone connect to the socket\nserver.addDisconnectListener(onDisconnected()) =\u0026gt; triggering when someone disconnect from the socket\nserver.addEventListener(“send_message”, Message.class, onChatReceived()) =\u0026gt; it’s corresponding socket.on(“send_message”), which means you can handle events by given event name and object class.\nsenderClient.getNamespace().getBroadcastOperations().sendEvent(“get_message”, data.getMessage()) =\u0026gt; sending data to all of the clients, includes yourself\nWe have a problem! If you want to send a message to any specific room or any client, you can not use broadcast operations. You have to implement room logic or you can send a private message by socketID of user.\nLet’s implement room logic\nFirstly I will add a parameter to the connection URL whose name is “room”.\nURL will look like this =\u0026gt; ws://192.168.0.10:8085/socket.io/?room=room_name And then I will get this room parameter in SocketModule =\u0026gt; socket onConnected method. Please update this method by given code 👇private ConnectListener onConnected() {\nreturn (client) -\u0026gt; {\nString room = client.getHandshakeData().getSingleUrlParam(\u0026ldquo;room\u0026rdquo;);\nclient.joinRoom(room);\nlog.info(\u0026ldquo;Socket ID[{}] Connected to socket\u0026rdquo;, client.getSessionId().toString());\n};\nclient.joinRoom(“room”) =\u0026gt; this code will join you to the room by given room name.\nWe have to update SocketModule =\u0026gt; onChatReceived method too 👇private DataListener onChatReceived() {\nreturn (senderClient, data, ackSender) -\u0026gt; {\nlog.info(data.toString());\nsocketService.sendMessage(data.getRoom(),\u0026ldquo;get_message\u0026rdquo;, senderClient, data.getMessage());\n};\n}\nAnd don’t forget to add:private final SocketService socketService;\nSocketModule final Code will look like this:\nI separated the sendMessage function from SocketModule and I created a SocketService class. Let’s look at this.\nIn sendMessage method, I am passing some parameters:\nString room =\u0026gt; which room will get the message String eventName =\u0026gt; which event will get the message SocketIOClient sendeClient =\u0026gt; who is wanting to send a message (except this while sending a message to room) String message =\u0026gt; message In the for loop, we are getting all the users in a given room. Then if the person is not equal to the sender, we are sending the message to each person.\nHow Can We Test?? We will use postman for testing our socket.\nFirst, you have to login to the postman to access the WebSocket tester module.\nClick to the WebSocket Request option Select the Socket.IO Write the connection URL and add params (if you have params in URL, you will see the params under the params tab automatically). ws://[YOUR_LOCAL_IP]:8085?room=a Click the Settings tab and select v2 for client Click the events tab and write your event name for getting messages. Must be the same with: Write your message class model and don’t forget to add room field Write the socket handler event name and press sent button for sending messages Duplicate tabs for testing and click to connect! Video Configure postman:\nWorking example:\nYou can find the codes here:\nGitHub - gurkanucar/demo-socketio: Spring boot netty socket io example for medium article\nBONUS Spring Boot \u0026amp; SocketIO \u0026amp; Reactjs — Chat application\ngithub.com/gurkanucar/socketio-simple-chat\nRes: https://github.com/mrniko/netty-socketio ","permalink":"https://gurkanucar.com/posts/spring-boot-netty-socket-io-example/","summary":"\u003cp\u003eImagine that, you want to make a chat application for communicating with your friend. You will send and receive messages. But there is a problem. When you send a new message to your friend how will you inform him?\u003c/p\u003e","title":"Spring Boot Netty Socket.IO Example"},{"content":"What is the WebSocket? WebSocket is a bi-directional communication protocol. Communication provides over a single TCP connection.\nThanks to the WebSocket protocol server and client can communicate in real-time.\nWhere can we use WebSockets? There are many cases to use WebSocket\nChat Applications Location Tracking Game Development Collaborative Apps Trade and Cryptocurrency Apps What is the difference between HTTP and WebSocket Connection? HTTP is unidirectional, and WebSocket is bi-directional. When you send an HTTP request connection will close after getting a response but when you connect over WebSocket and send data to the server, the connection will still be alive. WebSocket is faster than HTTP. HTTP is stateless and opens a new connection for each request, but WebSocket can communicate over a single connection. Some WebSocket Libraries SocketIO : Very popular socket library =\u0026gt; github.com/socketio\nWS: github.com/websockets/ws\nSockJS : github.com/sockjs/sockjs-client\nFeathers: github.com/feathersjs/feathers\nSocketCluster: github.com/SocketCluster/socketcluster\nWebSocket Alternatives Short Polling: send and receive requests at specific time intervals (every x seconds)\nLong Polling: send and receive requests at specific time intervals but the server will keep the requests open until the timeout. If the server finds something it will respond (timeout 5 seconds, server found something in 2 seconds. It will respond).\nServer-Sent Events: SSE is a uni-directional communication channel from server to client only. Server-Sent Events allow receiving data without polling. A client subscribes to a “stream” from a server and the server will send messages to the “event stream”. Mostly used for push notifications.\nBONUS Spring Boot \u0026amp; SocketIO \u0026amp; Reactjs — Chat application\ngithub.com/gurkanucar/socketio-simple-chat\nRes: https://en.wikipedia.org/wiki/WebSocket https://www.wallarm.com/what/a-simple-explanation-of-what-a-websocket-is https://www.geeksforgeeks.org/what-is-web-socket-and-how-it-is-different-from-the-http/ https://socket.io/ https://blog.bitsrc.io/8-node-js-web-socket-libraries-for-2018-818e7e5b67cf https://nexocode.com/blog/posts/websockets-friend-or-foe/ ","permalink":"https://gurkanucar.com/posts/build-real-time-web-applications-using-websockets/","summary":"\u003ch3 id=\"what-is-the-websocket\"\u003e\u003cstrong\u003eWhat is the WebSocket?\u003c/strong\u003e\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Build real-time web applications using WebSockets!\" loading=\"lazy\" src=\"/images/posts/build-real-time-web-applications-using-websockets/1-jh0m9ckisi75e1icccbmrq.png\"\u003e\u003c/p\u003e\n\u003cp\u003eWebSocket is a bi-directional communication protocol. Communication provides over a single TCP connection.\u003c/p\u003e\n\u003cp\u003eThanks to the WebSocket protocol server and client can communicate in real-time.\u003c/p\u003e","title":"Build real-time web applications using WebSockets!"},{"content":"Scalability is basically the proficiency of the system. It can be measured by the number of requests to our system. There are many scaling options such as Memory or CPU adjustments, storage types, network, etc. If you have good scalability, this ensures that you can protect your system from downtime and your services can work more effectively.\nWhen we want to implement scaling, will face it with two words which are Vertical and Horizontal scalability.\nVertical Scaling (Scale-Up) By the vertical scaling, our infrastructure will keep but we will increase computing power. This means buying more powerful devices and changing old ones. So you can upgrade the hardware such as memory, CPU, storage, and network speed improvements.\nHorizontal Scaling (Scale-Out) On the other hand, horizontal scaling aims to share workload and balance across multiple machines. That means simply adding more machines side by side. Distributed systems can be an example of this strategy.\nVertical VS Horizontal What should I consider when making a decision? Cost Reliability Upgradability and flexibility Complexity Performance resources:\nhttps://touchstonesecurity.com/horizontal-vs-vertical-scaling-what-you-need-to-know/\nhttps://www.section.io/blog/scaling-horizontally-vs-vertically\nhttps://www.cloudzero.com/blog/horizontal-vs-vertical-scaling\n","permalink":"https://gurkanucar.com/posts/horizontal-vs-vertical-scalability/","summary":"\u003cp\u003eScalability is basically the proficiency of the system. It can be measured by the number of requests to our system. There are many scaling options such as Memory or CPU adjustments, storage types, network, etc. If you have good scalability, this ensures that you can protect your system from downtime and your services can work more effectively.\u003c/p\u003e","title":"Horizontal vs Vertical Scalability"}]