<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Admin Panel</title>
	<atom:link href="https://wpadmin.nankov.mk/feed/" rel="self" type="application/rss+xml" />
	<link>https://wpadmin.nankov.mk</link>
	<description>nankov.mk nothing more</description>
	<lastBuildDate>Sat, 23 Dec 2023 00:51:47 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.2</generator>
	<item>
		<title>Unveiling the Power of Hypervisors with VirtualBox</title>
		<link>https://wpadmin.nankov.mk/unveiling-the-power-of-hypervisors-with-virtualbox/</link>
		
		<dc:creator><![CDATA[andrejnankov@gmail.com]]></dc:creator>
		<pubDate>Sat, 23 Dec 2023 00:36:51 +0000</pubDate>
				<category><![CDATA[DEVOPS]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[virtualbox]]></category>
		<guid isPermaLink="false">https://wpadmin.nankov.mk/?p=511</guid>

					<description><![CDATA[In this insightful exploration, we&#8217;ll delve into the realm of hypervisors with a special emphasis on VirtualBox. While other alternatives such as Parallels Desktop, VMware Workstation, and Proxmox VE tread similar paths, each brings its own unique nuances. Some delve into more advanced concepts, while others offer a streamlined approach. Notably, several of these alternatives&#8230; <a class="more-link" href="https://wpadmin.nankov.mk/unveiling-the-power-of-hypervisors-with-virtualbox/">Continue reading <span class="screen-reader-text">Unveiling the Power of Hypervisors with VirtualBox</span></a>]]></description>
										<content:encoded><![CDATA[<p>In this insightful exploration, we&#8217;ll delve into the realm of hypervisors with a special emphasis on VirtualBox. While other alternatives such as Parallels Desktop, VMware Workstation, and Proxmox VE tread similar paths, each brings its own unique nuances. Some delve into more advanced concepts, while others offer a streamlined approach. Notably, several of these alternatives come with associated costs or embrace open-source principles.</p>
<p>Drawing from my personal experiences, this blog post will shine a spotlight on VirtualBox, offering a nuanced perspective on its capabilities and features. Throughout, we&#8217;ll unravel related topics that complement and enhance the understanding of this powerful hypervisor. Join me on this journey as we navigate the diverse landscape of virtualization and uncover the distinct advantages that VirtualBox brings to the table.</p>
<p>Theoretical<br />
○ Personal experience<br />
○ So, what was the solution, and how did Virtuabox save the day?<br />
○ What else can VirtualBox do?<br />
○ Internet &amp; web world<br />
○ Is there a difference between today&#8217;s dedicated servers by the popular providers?</p>
<p>Practical<br />
○ Dirty hands<br />
■ Let’s start</p>
<h3>Personal experience</h3>
<p>With a robust 5+ years&#8217; tenure in the IT domain, currently serving as a Senior Technical Consultant for nearly 3+ years, my role revolves around steering product-oriented solutions. Working with a team of +11 engineers, including 8 dedicated developers, our work landscape revolves around harnessing the potential of VirtualBox within our projects.</p>
<p>In the context of our dynamic environment, we rely heavily on Docker and Docker Compose to shape our development landscape. Embracing cutting-edge technologies such as Kubernetes, Terraform, and AWS, our core technology stack centers around PHP, complemented by the robust LEMP stack. Operating within a Windows-centric infrastructure due to our partnership with Microsoft, our journey has been marked by the evolution of our projects.</p>
<p>As our initiatives expanded over time, we faced challenges with container performance, particularly within the growing number of services. Despite progressing toward a successful microservices architecture, the performance between containers became a notable bottleneck affecting overall project efficiency. Seeking solutions within the Docker community, we experimented with disabling Windows Hyper-V and transitioning to subsystem Linux. While this yielded a modest performance boost, it fell short of meeting our needs for replicating staging or production environments.</p>
<p>In our quest for answers, we engaged with the Docker community, sharing our challenges. The resounding response was succinct but illuminating: Docker on Windows, due to inherent compatibility issues, may not be the optimal choice for our specific setup. This realization prompted further exploration and adjustments to our technological landscape, ultimately steering us towards a more tailored and efficient infrastructure for our evolving project requirements.</p>
<h3>So, what was the solution and how did Virtuabox save the day?</h3>
<p>In our AWS environment, precision is paramount. To align with this principle, we opted for dedicated Ubuntu Linux servers, each tailored to meet the unique memory and performance demands of its corresponding environment. Echoing this strategy locally, we replicated this approach within VirtualBox, fashioning Ubuntu virtual machines that seamlessly integrate with our development workflow.</p>
<p>Armed with our preferred IDE and the dynamic duo of Docker and Docker Compose, our containerized setup delivers on its promise: a smooth, high-performance development experience. Notably, the transition for new team members has become a breeze, thanks to the simplicity of VM import and export. The onboarding ritual involves configuring Git profiles and pulling the latest changes—effortlessly facilitated by our standardized virtual environment.</p>
<p>Consistency reigns supreme in our development ecosystem. Through the use of VM snapshots, every team member enjoys uniformity in CodeStyle formatters, development tools, and even the choice of wallpaper (a touch of humor included!). Accountability extends to individual developers managing their snapshots and cloned VMs in case of unforeseen issues.</p>
<p>A personal favorite feature of VirtualBox is its ability to halt and save the state of a VM. Resuming work the next day feels like picking up right where we left off, with the IDE retaining the selected file and Docker configurations from the previous session—a productivity boon.</p>
<p>While occasional challenges arise, such as the rare occurrence of a corrupted VM, we&#8217;ve fortified our defenses with snapshots and a handy troubleshooting reference. The codebase, residing on GitLab, serves as an impervious fortress against the loss of crucial code. Our synchronized commands and Code First Approach, coupled with migrations and seeders, ensure that database repopulation is swift and seamless.</p>
<p>In the dynamic landscape of development, VirtualBox emerges as a cornerstone, empowering our team with a reliable and flexible infrastructure that not only meets but exceeds our expectations.</p>
<h3>What else can VirtualBox do?</h3>
<p>Before we tackle the question at hand, let&#8217;s first acquaint ourselves with VirtualBox. This versatile hypervisor stands as a full virtualizer designed for x86 hardware, with applications spanning server, desktop, and embedded usage. Notably, it distinguishes itself as the sole professional solution available as Open Source Software under the GNU General Public License. Both Solarius OS and VirtualBox share the umbrella of maintenance by Oracle, adding a layer of assurance to their reliability.</p>
<p>With a longstanding presence in the market, VirtualBox has dedicated itself to supporting a diverse array of operating systems for the creation of virtual machines. Its compatibility extends across various host operating systems, encompassing Windows, Mac, Linux, and Solarius. This flexibility lends itself well to a multitude of scenarios, where the most common installations often involve a Windows host running a virtual machine for Linux, or a Mac with an x86 host hosting a virtual machine running Windows. The permutations depend on specific needs, be it testing, development environments, or experimental checks.</p>
<p>Upon delving into the user manual, one discovers an intriguing capability—the option to utilize a created virtual machine as a component of the Oracle Cloud. The manual provides a comprehensive specification, guiding users through a step-by-step integration process. This integration feature not only extends the utility of VirtualBox but also underscores its adaptability to diverse and evolving computing environments.</p>
<h3>Creating home workstation</h3>
<p>Creating a home workstation with VirtualBox offers a fascinating avenue for crafting a personalized computing environment. Here&#8217;s a step-by-step guide to set up your own bare-metal server:</p>
<p>1. **Hardware Assembly:**<br />
Select the computer components that align with your requirements and assemble them to create a bare-metal server. Opt for a Debian-based operating system for optimal performance.</p>
<p>2. **Virtualization with VirtualBox:**<br />
Install VirtualBox on your server to enable the creation and management of virtual machines, accommodating various operating systems such as Windows and Linux distributions.</p>
<p>3. **Network Configuration:**<br />
Connect your bare-metal server to the LAN with an Ethernet cable. Configure your router to allocate a static IP address to the server, ensuring consistent accessibility.</p>
<p>4. **Port Forwarding for VMs:**<br />
If needed, configure port forwarding on the router to direct specific services from the virtual machines (e.g., HTTP on port 80, SSH on port 22) to the server.</p>
<p>5. **Web-Based Management with phpVirtualBox:**<br />
Optionally, enhance your setup by installing phpVirtualBox on the server. This web service facilitates convenient access to all virtual machines through a browser using the static IP address. This feature is particularly useful within a home private network.</p>
<p>6. **Alternative Docker Installation:**<br />
For a streamlined approach, consider installing Docker on your server and deploying the phpVirtualBox image available at <a href="https://hub.docker.com/r/jazzdd/phpvirtualbox/">https://hub.docker.com/r/jazzdd/phpvirtualbox/</a>.</p>
<p>Now, the question arises about public access. Here are two options:</p>
<p>&#8211; **Static IP Address with Router Port Forwarding:**<br />
If your network provider offers a static IP address for your router, you can configure router port forwarding to enable external access to your VirtualBox setup.</p>
<p>&#8211; **Dynamic DNS Support:**<br />
Alternatively, you can leverage Dynamic DNS support. Configure your router to support Dynamic DNS, and through port forwarding, enable external access to your VirtualBox environment. This option is particularly useful when your home network&#8217;s IP address dynamically changes.</p>
<p>By following these steps, you can transform your home workstation into a versatile and accessible computing hub, whether for personal use or experimentation with various virtualized environments.</p>
<h3>Internet &amp; web world</h3>
<p>For comprehensive information about VirtualBox, a wealth of resources is available on the internet. Some key documents that provide essential insights include:</p>
<p>&#8211; **End Users Documentation:**<br />
Access the end users&#8217; documentation at [<a href="https://www.VirtualBox.org/wiki/End-user_documentation">VirtualBox End-user Documentation</a>]. This resource is tailored to users seeking practical information and guidance on VirtualBox usage.</p>
<p>&#8211; **Technical Documentation:**<br />
Explore the technical documentation, an invaluable resource for users interested in deeper insights into the inner workings of VirtualBox. You can find this documentation at [<a href="https://www.VirtualBox.org/wiki/Technical_documentation">VirtualBox Technical Documentation</a>].</p>
<p>&#8211; **User Manual:**<br />
The user manual serves as a comprehensive guide to VirtualBox, offering detailed instructions and explanations. Navigate through the user manual at [<a href="https://www.VirtualBox.org/manual/UserManual.html">VirtualBox User Manual</a>] to gain a thorough understanding of the features and functionalities.</p>
<p>Additionally, Oracle provides pre-built virtual machines, available for download at [<a href="https://www.oracle.com/downloads/developer-vm/community-downloads.html">Oracle Developer VM Community Downloads</a>]. These VMs offer a convenient starting point for various development and testing purposes.</p>
<p>By exploring these resources, users can access a wealth of knowledge and documentation, ensuring a robust understanding of VirtualBox and its applications. Whether you&#8217;re a novice or an advanced user, these references provide valuable insights to enhance your experience with VirtualBox.</p>
<h3>Is there a difference between today&#8217;s dedicated servers by the popular providers?</h3>
<p>The succinct response is no. I perceive VirtualBox as a viable option for hosting a dedicated server within your personal computer. In the current landscape, VirtualBox serves as an excellent entry point for anyone delving into the realm of virtualization.</p>
<p>However, considering contemporary trends, there&#8217;s a notable shift towards cloud solutions. Clients commonly express a preference for cloud-based architectures, while developers lean towards technologies like Docker and Kubernetes for efficient orchestration. Although the fundamental concept of isolation remains, the trend now involves pre-configured projects and image settings, orchestrated within pods—a true gem in the landscape of an engineer&#8217;s future.</p>
<p>In this evolving scenario, the emphasis is on efficiency—less memory consumption, simplified setup processes, and leveraging popular platforms like Docker Hub and GitHub for community collaboration. The integration of Docker and Docker Compose, along with the Kubernetes Command Line Interface (CLI), has become a hallmark of modern development practices.</p>
<p>In my own contributions, such as the project found at [<a href="https://github.com/sports-match-maker/docker-pnmamhes">https://github.com/sports-match-maker/docker-pnmamhes</a>], I actively engage with these technologies. It&#8217;s an exciting space to be in, with the dynamic ecosystem of Docker and Kubernetes offering a rich and flexible environment for development and deployment.</p>
<p>As we navigate the present and future of technology, the landscape is shaped by these contemporary tools and practices. It&#8217;s a thrilling prospect to witness their integration into educational programs and lectures, anticipating the pivotal role they will play in shaping the next generation of engineers and developers.</p>
<h3>Dirty hands</h3>
<p>As an avid supporter of Linux distributions, VirtualBox stands out as an invaluable tool for exploring and comparing different flavors across various distributions. Two key resources that I frequently turn to are:</p>
<p>&#8211; [<a href="https://distrowatch.com/dwres.php?resource=popularity">DistroWatch</a>]: A comprehensive platform providing information and statistics on the popularity of different Linux distributions.</p>
<p>&#8211; [<a href="https://www.youtube.com/@Itsfoss">It&#8217;s FOSS YouTube Channel</a>]: A rich source of video content covering various aspects of Linux, offering practical insights and tutorials.</p>
<p>For the sake of efficiency and a hands-on approach, I&#8217;ve chosen Ubuntu Server for our VirtualBox installation. Throughout the installation process, we&#8217;ll incorporate Docker and Docker Compose into the VM, hosting essential components such as Adminer (a web UI multi-purpose database client), MySQL as the database, and WordPress as the CMS. The Docker setup will be derived from the repository at [https://github.com/starter-nanorocks/wp-dockerized-app], a project I&#8217;ve created as a fervent supporter of Free and Open Source Software (FOSS). I look forward to delving into this repository in more detail shortly.</p>
<p>As we progress, we&#8217;ll implement port forwarding, configuring the host PC to reflect WordPress on port 8888 (both guest and host), Adminer on port 3306 (both guest and host), and SSH on guest port 22 redirected to host port 222. This setup ensures accessibility and interaction with the services from both within the VM and externally.</p>
<p>To maintain a consistent and static IP address, I&#8217;ll configure my router to allocate the necessary IP, enabling any device connected to my private network, such as my phone with a browser, to seamlessly access the WordPress site, Adminer, and establish an SSH connection.</p>
<p>Toward the end of our exploration, we&#8217;ll take a snapshot, perform an OS deletion, and create a clone of the VM. This process encapsulates the versatility of VirtualBox, allowing for experimentation, efficient management, and seamless replication of virtual environments.</p>
<p><span style="font-weight: 400;">Let’s start</span></p>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Download Ubuntu Server ISO from: </span><a href="https://ubuntu.com/download/server"><span style="font-weight: 400;">https://ubuntu.com/download/server</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Download VirtualBox for your OS: </span><a href="https://www.virtualbox.org/wiki/Downloads"><span style="font-weight: 400;">https://www.virtualbox.org/wiki/Downloads</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Install the virtual box and open it</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Click on the Icon new where you will see a wizard </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Add virtual machine name (FINKI) and pick the type of OS (Ubuntu 64bit), pick ISO location, click Next</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Set hardware power ( I will pick 12GB RAM + 3 CPU cores) **It&#8217;s not min requested but I have resources. More Info (</span><a href="https://linuxconfig.org/ubuntu-22-04-minimum-requirements"><span style="font-weight: 400;">here</span></a><span style="font-weight: 400;">) </span><a href="https://prnt.sc/e6O9INVidOGe"><span style="font-weight: 400;">SCREENSHOT_1 </span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">The disk will be 30GB </span><a href="https://prnt.sc/CpalkyJF1Ejl"><span style="font-weight: 400;">SCREENSHOT_2 </span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Go next and finish. </span><a href="https://prnt.sc/vjzRARLydIoQ"><span style="font-weight: 400;">SCREENSHOT_3</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Double-click on FINKI. It will open a new window where the ISO will need to be installed. </span><a href="https://prnt.sc/fB8rKVmkxj9K"><span style="font-weight: 400;">SCREENSHOT_4</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">We will continue without updates </span><a href="https://prnt.sc/Ftw713_x43Hq"><span style="font-weight: 400;">SCREENSHOT_5</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Same for the keyboard </span><a href="https://prnt.sc/-tK-4Sgv_bVi"><span style="font-weight: 400;">SCREENSHOT_6</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Next, we will pick Ubutu Server </span><a href="https://prnt.sc/bCnwbnubal3j"><span style="font-weight: 400;">SCREENSHOT_7</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">And defaults for network connections </span><a href="https://prnt.sc/5A00NYfnnTQd"><span style="font-weight: 400;">SCREENSHOT_8</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Because there is now a proxy that will be used we will just continue </span><a href="https://prnt.sc/D3PzdlVDtuwY"><span style="font-weight: 400;">SCREENSHOT_9</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Configuration on Ubuntu achieve mirrors will be default </span><a href="https://prnt.sc/e2FnVYvLsvFO"><span style="font-weight: 400;">SCREENSHOT_10</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">For Storage configuration, we will pick </span><a href="https://prnt.sc/wCxW3OG-UdVB"><span style="font-weight: 400;">SCREENSHOT_11</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Same for storage configuration </span><a href="https://prnt.sc/CnBVc8RDB1h7"><span style="font-weight: 400;">SCREENSHOT_12</span></a><span style="font-weight: 400;"> the prompt will popup and we will continue the process because this is the first time installation.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">For profile setup I will pick the next names and for password </span><b>secret </b><a href="https://prnt.sc/HWVbcHC9mn0p"><span style="font-weight: 400;">SCREENSHOT_13</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">For the upgrade, we will skip the process for now </span><a href="https://prnt.sc/RraUaJ_uzL2f"><span style="font-weight: 400;">SCREENSHOT_14</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">We will enable SSH setup so latter we can connect </span><a href="https://prnt.sc/kUeW3Lf257dJ"><span style="font-weight: 400;">SCREENSHOT_15</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Next from the snap list, we will pick docker </span><a href="https://prnt.sc/Ks6l9IaIqPor"><span style="font-weight: 400;">SCREENSHOT_16</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Now the installation process is started, click reboot now when is finished. </span><a href="https://prnt.sc/4a8Ou8zG6Ekl"><span style="font-weight: 400;">SCREENSHOT_17</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Next, you will see the screen for login where you will need to set a login (nanorocks) for the user and password (secret) </span><a href="https://prnt.sc/Zp5QFyIjFboI"><span style="font-weight: 400;">SCREENSHOT_18</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">To have better manipulation over your terminal and to access it from your host PC we will go to the vm finki window in </span><b>machine &gt; settings &gt;  network &gt; port forwarding</b><span style="font-weight: 400;"> to enable SSH connection. </span><a href="https://prnt.sc/17dutLMyQvXx"><span style="font-weight: 400;">SCREENSHOT_19</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Now I can close the virtual machine while saving the state </span><a href="https://prnt.sc/WXUUAS-MAEAP"><span style="font-weight: 400;">SCREENSHOT_20</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">I am able to run the VM in headline mode while I am connected from the host terminal. </span><a href="https://prnt.sc/9nl1pPMtkDSm"><span style="font-weight: 400;">SCREENSHOT_21</span></a> <a href="https://prnt.sc/x0QRSDe_P6ca"><span style="font-weight: 400;">SCREENSHOT_22</span></a> <a href="https://prnt.sc/Ri8T1shLpUNg"><span style="font-weight: 400;">SCREENSHOT_23</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Now let’s generate a new ssh-key and place it inside my GitHub profile </span><a href="https://prnt.sc/Ol23iy5gymEJ"><span style="font-weight: 400;">SCREENSHOT_24</span></a> <a href="https://prnt.sc/14MEpA0bf7Sa"><span style="font-weight: 400;">SCREENSHOT_25</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Now let&#8217;s check we have docker, docker-composer, and git </span><a href="https://prnt.sc/1VOXmsxZKoyN"><span style="font-weight: 400;">SCREENSHOT_26</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Now we can clone the repository and write in the terminal writing </span><b>git clone git@github.com:starter-nanorocks/wp-dockerized-app.git </b><span style="font-weight: 400;"> </span><a href="https://prnt.sc/gM8-ejldlfvL"><span style="font-weight: 400;">SCREENSHOT_27</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">The repo will be downloaded and we can do `cd` inside the project </span><a href="https://prnt.sc/r2UUpwXD1PtU"><span style="font-weight: 400;">SCREENSHOT_28</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Now we can run the commands from the README.md </span><a href="https://prnt.sc/vYMNCX1RBUZ-"><span style="font-weight: 400;">SCREENSHOT_29</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Now all the containers are started and we need to do port forwarding for wordpress and adminer. </span><a href="https://prnt.sc/AWqvOq6NKMcI"><span style="font-weight: 400;">SCREENSHOT_30</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Access from host machine </span><a href="https://prnt.sc/UAUdx1xTz555"><span style="font-weight: 400;">SCREENSHOT_31</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Setup router for static IP address </span><a href="https://prnt.sc/AqLmup4yaBvc"><span style="font-weight: 400;">SCREENSHOT_32</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Mobile phone access the host IP address with ports </span><a href="https://prnt.sc/BGWfGTXcGUfr"><span style="font-weight: 400;">SCREENSHOT_33</span></a> <a href="https://prnt.sc/q7--MXkPk8r2"><span style="font-weight: 400;">SCREENSHOT_34</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Now, we will stop the VM with the saved state and make a clone of it. </span><a href="https://prnt.sc/mxirRhJCk4d7"><span style="font-weight: 400;">SCREENSHOT_35</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">We will clone all network adapters and we will do a full clone</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">While the FINKI VM is halted we will check again the ssh access, WordPress and admirer</span>
<ol>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">As we can see everything is working as expected as we have in the FINKI VM </span><a href="https://prnt.sc/BGWfGTXcGUfr"><span style="font-weight: 400;">SCREENSHOT_36</span></a> <a href="https://prnt.sc/q7--MXkPk8r2"><span style="font-weight: 400;">SCREENSHOT_37</span></a></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">We will halt the VM</span></li>
</ol>
</li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">We will create a snapshot on FINKI VM, we will try to delete the entire system (</span><a href="https://superuser.com/questions/313804/how-to-delete-entire-system-using-terminal"><span style="font-weight: 400;">https://superuser.com/questions/313804/how-to-delete-entire-system-using-terminal</span></a><span style="font-weight: 400;">), and restore the created snapshot </span><a href="https://prnt.sc/bGYZ8upcFmhb"><span style="font-weight: 400;">SCREENSHOT_38</span></a> <a href="https://prnt.sc/9Wr1WOackVyR"><span style="font-weight: 400;">SCREENSHOT_39</span></a> <a href="https://prnt.sc/gye0XD6qEN-d"><span style="font-weight: 400;">SCREENSHOT_40</span></a></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">We will continue with creating new snapshots for the current state.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">As it was expected the entire OS is restored and we can log in with ssh, check the WordPress and adminer.</span></li>
</ol>
<h3>Last words</h3>
<p>VirtualBox stands out as a versatile and user-friendly hypervisor solution, demonstrating its prowess in addressing real-world challenges through a combination of practical insights and theoretical exploration.</p>
<p>As a general-purpose virtualizer, VirtualBox showcases compatibility with a diverse range of operating systems, extending its reach to cloud platforms such as Oracle Cloud. The practical application of VirtualBox was illuminated through a hands-on guide, showcasing the seamless setup of an Ubuntu Server, deployment of Dockerized applications, and strategic use of snapshots for robust backup and recovery processes.</p>
<p>The user-friendly interface, cross-platform compatibility, and the robust functionality of snapshots position VirtualBox as a valuable asset for developers, administrators, and enthusiasts alike. Its ability to bridge the gap between traditional virtualization and modern, cloud-centric techniques further underscores its significance in the dynamic landscape of technology.</p>
<p>VirtualBox emerges as a powerful tool that continues to showcase its dependability in generating applications for development, testing, and educational purposes. Its adaptability and comprehensive feature set make it a preferred choice for those seeking a reliable and efficient virtualization solution. As technology evolves, VirtualBox remains at the forefront, demonstrating its enduring relevance in meeting the diverse needs of users across different domains.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Unlocking the Secrets: Combining Techniques for Effective Handling of Huge Datasets in Complex Business Domains</title>
		<link>https://wpadmin.nankov.mk/unlocking-the-secrets-combining-techniques-for-effective-handling-of-huge-datasets-in-complex-business-domains/</link>
		
		<dc:creator><![CDATA[andrejnankov@gmail.com]]></dc:creator>
		<pubDate>Mon, 17 Jul 2023 12:17:24 +0000</pubDate>
				<category><![CDATA[Grow]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[domain]]></category>
		<guid isPermaLink="false">https://wpadmin.nankov.mk/?p=500</guid>

					<description><![CDATA[Intro: Managing massive datasets in complex business domains requires a strategic and comprehensive approach. As data grows in size and complexity, developers face the challenge of efficiently handling, processing and extracting meaningful insights from the data. In this blog post, we will delve into the details of combining various techniques to achieve effective data management&#8230; <a class="more-link" href="https://wpadmin.nankov.mk/unlocking-the-secrets-combining-techniques-for-effective-handling-of-huge-datasets-in-complex-business-domains/">Continue reading <span class="screen-reader-text">Unlocking the Secrets: Combining Techniques for Effective Handling of Huge Datasets in Complex Business Domains</span></a>]]></description>
										<content:encoded><![CDATA[<h4><span style="font-weight: 400;">Intro:</span></h4>
<p><span style="font-weight: 400;">Managing massive datasets in complex business domains requires a strategic and comprehensive approach. As data grows in size and complexity, developers face the challenge of efficiently handling, processing and extracting meaningful insights from the data. In this blog post, we will delve into the details of combining various techniques to achieve effective data management for large datasets within intricate business domains. By leveraging a combination of powerful techniques, developers can optimize data processing, ensure data integrity, and unlock valuable insights from complex datasets.</span></p>
<p>&nbsp;</p>
<h5><span style="font-weight: 400;">Data Modeling and Domain-Driven Design:</span></h5>
<p><span style="font-weight: 400;">In complex business domains, a solid data modeling approach is crucial. Domain-Driven Design (DDD) principles can guide developers in modeling the domain entities, aggregates, and relationships. By aligning the data model with the business domain, developers can create a robust foundation for managing complex datasets effectively.</span></p>
<p>&nbsp;</p>
<h5><span style="font-weight: 400;">Distributed Computing and Parallel Processing:</span></h5>
<p><span style="font-weight: 400;">When dealing with huge datasets, distributed computing and parallel processing techniques provide significant benefits. Utilize frameworks and technologies like Apache Hadoop, Apache Spark, or distributed databases to divide data processing tasks into smaller partitions that can be processed concurrently. This approach allows for efficient utilization of resources and accelerates data processing speed.</span></p>
<p>&nbsp;</p>
<h5><span style="font-weight: 400;">Data Partitioning and Sharding:</span></h5>
<p><span style="font-weight: 400;">In scenarios where datasets become too large to be handled by a single server, consider partitioning and sharding the data. Partitioning involves dividing the dataset into smaller logical segments based on specific criteria, such as time ranges or geographical regions. Sharding distributes these partitions across multiple servers, enabling parallel processing and improved scalability.</span></p>
<p>&nbsp;</p>
<h5><span style="font-weight: 400;">Stream Processing and Real-time Analytics:</span></h5>
<p><span style="font-weight: 400;">For complex business domains that require real-time insights from streaming data, stream processing frameworks like Apache Kafka or Apache Flink offer solutions. Stream processing allows developers to analyze and derive valuable insights from continuous data streams, facilitating real-time decision-making and enabling timely actions based on evolving business conditions.</span></p>
<p>&nbsp;</p>
<h5><span style="font-weight: 400;">Data Compression and Storage Optimization:</span></h5>
<p><span style="font-weight: 400;">Optimizing storage and reducing data footprint are critical for handling huge datasets efficiently. Consider applying compression techniques to minimize storage requirements without compromising data integrity. Compressed file formats like Parquet or ORC can significantly reduce storage space while enabling efficient querying and data retrieval.</span></p>
<p>&nbsp;</p>
<h5><span style="font-weight: 400;">Advanced Indexing and Query Optimization:</span></h5>
<p><span style="font-weight: 400;">As datasets grow larger, optimizing queries becomes paramount. Implementing advanced indexing techniques, such as composite indexes, bitmap indexes, or inverted indexes, can significantly enhance query performance. By analyzing query patterns and optimizing queries accordingly, developers can achieve faster and more efficient data retrieval.</span></p>
<p>&nbsp;</p>
<h5><span style="font-weight: 400;">Big Data Ecosystem Integration:</span></h5>
<p><span style="font-weight: 400;">Leverage the power of the Big Data ecosystem by integrating complementary tools and technologies. Utilize distributed file systems like Hadoop Distributed File System (HDFS) for storing and managing large datasets. Combine it with data processing frameworks like Apache Spark or Apache Hive for scalable data processing and analytics.</span></p>
<h5></h5>
<p>&nbsp;</p>
<h5><span style="font-weight: 400;">Machine Learning and Artificial Intelligence:</span></h5>
<p><span style="font-weight: 400;">Harness the potential of machine learning and artificial intelligence techniques to extract valuable insights from complex datasets. Implement algorithms for predictive modeling, anomaly detection, or clustering to uncover patterns and generate actionable insights that can drive business decisions.</span></p>
<h5></h5>
<h4></h4>
<p>&nbsp;</p>
<h4><span style="font-weight: 400;">Common combinations of tools and technologies</span></h4>
<p><span style="font-weight: 400;">After some research here are some common combinations of tools and technologies that can be used for effective data management in complex business domains with huge datasets:</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><strong>Apache Spark + Hadoop:</strong> Leveraging the power of Apache Spark for distributed data processing and analytics, combined with Hadoop&#8217;s HDFS for storing and managing large datasets, provides a comprehensive solution for scalable data management.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><strong>Apache Kafka + Apache Flink:</strong> Utilizing Apache Kafka for high-throughput, fault-tolerant streaming data ingestion and Apache Flink for real-time stream processing enables efficient handling and analysis of continuous data streams in complex business domains.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><strong>Elasticsearch + Kibana:</strong> Employing Elasticsearch as a distributed search and analytics engine, along with Kibana for data visualization and exploration, facilitates effective indexing, querying, and visualization of large datasets.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><strong>Apache Hive + Apache Tez:</strong> Integrating Apache Hive, a data warehousing and SQL querying tool, with Apache Tez for high-performance query execution enables efficient data retrieval and analysis in complex business domains.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><strong>TensorFlow + Apache Hadoop:</strong> Combining TensorFlow, a powerful machine learning framework, with Apache Hadoop&#8217;s distributed computing capabilities allows for large-scale training and deployment of machine learning models on massive datasets.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><strong>Apache Cassandra + Apache Solr:</strong> Utilizing Apache Cassandra for distributed and highly available NoSQL database storage, along with Apache Solr for scalable search and indexing, offers a powerful solution for managing and querying large datasets.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><strong>Amazon S3 + AWS Athena:</strong> Leveraging Amazon S3 for cost-effective and scalable object storage, and AWS Athena for serverless interactive querying, enables efficient and on-demand analysis of large datasets in the cloud.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><strong>Snowflake + Looker:</strong> Utilizing Snowflake&#8217;s cloud data platform for scalable data storage and processing, coupled with Looker&#8217;s business intelligence and data visualization capabilities, provides a comprehensive solution for data management and analytics in complex business domains.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">These combinations of tools and technologies offer powerful capabilities for managing and analyzing large datasets in complex business domains. Depending on specific requirements, data volumes, and desired functionalities, developers can choose the most suitable combination to address their data management needs effectively.</span></p>
<p>&nbsp;</p>
<h4><span style="font-weight: 400;">Summary:</span></h4>
<p><span style="font-weight: 400;">Effectively managing huge datasets in complex business domains requires a holistic approach that combines multiple techniques. By leveraging data modeling, distributed computing, stream processing, storage optimization, advanced indexing, Big Data ecosystem integration, and machine learning, developers can overcome the challenges posed by large and intricate datasets. Through a thoughtful combination of these techniques, businesses can unlock the full potential of their data, gaining valuable insights and driving innovation in complex domains. Embracing these strategies empowers developers to build scalable, efficient, and intelligent systems that facilitate effective data </span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Unlocking the Secrets: Embrace Personal Growth and Exploration over the Summer</title>
		<link>https://wpadmin.nankov.mk/unlocking-the-secrets-embrace-personal-growth-and-exploration-over-the-summer/</link>
		
		<dc:creator><![CDATA[andrejnankov@gmail.com]]></dc:creator>
		<pubDate>Sat, 24 Jun 2023 18:23:51 +0000</pubDate>
				<category><![CDATA[Grow]]></category>
		<category><![CDATA[grow]]></category>
		<category><![CDATA[summer]]></category>
		<guid isPermaLink="false">https://wpadmin.nankov.mk/?p=496</guid>

					<description><![CDATA[Intro: Summer is a wonderful season for software engineers to step back, unwind, and focus on self-improvement. While relaxation is essential, it&#8217;s also an ideal time to dive into new technologies, broaden your knowledge, and enhance your skills. In this blog post, we&#8217;ll explore how you can make the most of your summer as a&#8230; <a class="more-link" href="https://wpadmin.nankov.mk/unlocking-the-secrets-embrace-personal-growth-and-exploration-over-the-summer/">Continue reading <span class="screen-reader-text">Unlocking the Secrets: Embrace Personal Growth and Exploration over the Summer</span></a>]]></description>
										<content:encoded><![CDATA[<h4><strong>Intro:</strong></h4>
<p>Summer is a wonderful season for software engineers to step back, unwind, and focus on self-improvement. While relaxation is essential, it&#8217;s also an ideal time to dive into new technologies, broaden your knowledge, and enhance your skills. In this blog post, we&#8217;ll explore how you can make the most of your summer as a software engineer by embracing personal growth, relaxation, and immersing yourself in the world of documentation.</p>
<p>&nbsp;</p>
<h4><strong>Dive into Documentation:</strong></h4>
<p>Documentation forms the backbone of any software project. It provides valuable insights into frameworks, libraries, and languages, enabling developers to leverage their full potential. During the summer, set aside dedicated time to immerse yourself in the documentation related to your favorite programming languages or frameworks. Explore new features, dive deeper into the intricacies of the tools you already use, and learn about best practices. This exercise will strengthen your foundation and equip you with the knowledge to tackle complex challenges.</p>
<p>&nbsp;</p>
<h4><strong>Explore New Technologies:</strong></h4>
<p>The summer break offers the perfect opportunity to explore and experiment with new technologies. Step outside your comfort zone and venture into uncharted territories. Research emerging programming languages, frameworks, or tools that pique your interest. Reading their documentation and trying out sample projects will help you understand their potential and evaluate their applicability to your work. This exploration can lead to exciting breakthroughs and fresh perspectives, keeping you ahead of the curve in an ever-evolving industry.</p>
<p>&nbsp;</p>
<h4><strong>Relax and Recharge:</strong></h4>
<p>Software engineering can be demanding, both mentally and emotionally. It&#8217;s crucial to find time to relax and recharge during the summer. Engage in activities that bring you joy and allow you to unwind. Spend quality time with loved ones, pursue hobbies, immerse yourself in nature, or simply enjoy moments of solitude. By rejuvenating your mind and body, you&#8217;ll return to your coding projects with renewed energy and creativity.</p>
<p>&nbsp;</p>
<h4><strong>Set Personal Goals:</strong></h4>
<p>Summer is an excellent time to reflect on your professional journey and set personal goals for the future. Identify areas where you want to improve, whether it&#8217;s enhancing your problem-solving skills, mastering a particular technology, or becoming more proficient in a specific programming language. With a clear vision and goals in mind, you can structure your learning and allocate time for focused practice. Consider creating a roadmap that outlines the steps needed to achieve your objectives and track your progress along the way.</p>
<p>&nbsp;</p>
<h4><strong>Connect with the Developer Community:</strong></h4>
<p>While summer is a time for personal growth, it doesn&#8217;t mean you have to go it alone. Engage with the vibrant developer community through online forums, discussion boards, and social media platforms. Participate in conversations, share your experiences, and seek advice from fellow developers. Connecting with like-minded individuals can inspire fresh ideas, provide valuable insights, and foster meaningful connections that last beyond the summer season.</p>
<p>&nbsp;</p>
<h4><strong>Summary:</strong></h4>
<p>This summer, take the opportunity to invest in your personal growth as a software engineer. Dive into documentation, explore new technologies, relax and recharge, set personal goals, and connect with the developer community. By focusing on self-improvement and exploration, you&#8217;ll enhance your skills, expand your knowledge, and position yourself for success in the ever-evolving world of software engineering. Remember, the journey of self-improvement is ongoing, and each summer presents an opportunity to take significant strides toward becoming an even better software engineer.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Unlocking the Secrets: Effective Strategies for Meeting Deadlines</title>
		<link>https://wpadmin.nankov.mk/unlocking-the-secrets-effective-strategies-for-meeting-deadlines/</link>
		
		<dc:creator><![CDATA[andrejnankov@gmail.com]]></dc:creator>
		<pubDate>Tue, 06 Jun 2023 14:46:24 +0000</pubDate>
				<category><![CDATA[Grow]]></category>
		<category><![CDATA[grow]]></category>
		<guid isPermaLink="false">https://wpadmin.nankov.mk/?p=491</guid>

					<description><![CDATA[Intro: As a professional, encountering tight deadlines is inevitable. However, when a deadline is looming and it seems you may miss it, panic and stress can quickly set in. The good news is that there are practical strategies and actions you can take to regain control and increase your chances of meeting those critical deadlines.&#8230; <a class="more-link" href="https://wpadmin.nankov.mk/unlocking-the-secrets-effective-strategies-for-meeting-deadlines/">Continue reading <span class="screen-reader-text">Unlocking the Secrets: Effective Strategies for Meeting Deadlines</span></a>]]></description>
										<content:encoded><![CDATA[<h4>Intro:</h4>
<p>As a professional, encountering tight deadlines is inevitable. However, when a deadline is looming and it seems you may miss it, panic and stress can quickly set in. The good news is that there are practical strategies and actions you can take to regain control and increase your chances of meeting those critical deadlines. In this blog post, we will explore a list of advice on how to handle approaching deadlines, plan your time effectively, manage stress, and deliver your work successfully.</p>
<p>&nbsp;</p>
<h4>Assess the Situation:</h4>
<p>Begin by assessing the situation objectively. Take a moment to analyze the remaining time, the scope of work required, and any potential roadblocks. Understanding the magnitude of the task and the time available will allow you to make informed decisions moving forward.</p>
<p>&nbsp;</p>
<h4>Prioritize and Plan:</h4>
<p>Break down the project or task into smaller, manageable parts. Prioritize these tasks based on their importance and urgency. Create a detailed plan with specific deadlines for each subtask, ensuring that you allocate sufficient time for completion. A visual representation, such as a chart or a to-do list, can be helpful in keeping you organized and focused.</p>
<p>&nbsp;</p>
<h4>Communicate and Negotiate:</h4>
<p>If you foresee that meeting the original deadline is unrealistic, it&#8217;s essential to communicate with stakeholders as soon as possible. Openly discuss the situation, present your plan, and negotiate a new deadline if necessary. Most stakeholders appreciate transparency and are willing to work with you if they understand the challenges you face.</p>
<p>&nbsp;</p>
<h4>Time Management Techniques:</h4>
<p>Implement effective time management techniques to maximize your productivity. Consider using any technique for time management, where you work in focused bursts of time followed by short breaks. Avoid multitasking and instead concentrate on one task at a time, dedicating your full attention to each. Set aside distractions and create a conducive work environment to optimize your efficiency.</p>
<p>&nbsp;</p>
<h4>Seek Assistance:</h4>
<p>Don&#8217;t be afraid to ask for help when needed. If feasible, delegate certain tasks to colleagues or team members who can assist you in meeting the deadline. Collaboration and support can significantly alleviate the workload and allow for more efficient progress.</p>
<h4></h4>
<h4>Manage Stress and Self-Care:</h4>
<p>High-stress levels can hinder productivity and decision-making. Take care of your well-being by managing stress effectively. Engage in stress-reducing activities such as exercise, meditation, or hobbies. Prioritize self-care, including sufficient sleep, a balanced diet, and regular breaks to recharge. Taking care of your physical and mental health will enhance your focus and overall performance.</p>
<p>&nbsp;</p>
<h4>Avoid Perfectionism:</h4>
<p>Strive for excellence, but be mindful of perfectionism. Sometimes, the pursuit of perfection can lead to unnecessary delays. Set realistic expectations for yourself and focus on delivering quality work within the given time constraints. Remember that perfection is often subjective, and meeting the deadline with a well-executed task is more valuable than endlessly seeking flawlessness. Trust me on this.</p>
<h4>Learn from the Experience:</h4>
<p>After successfully meeting the deadline, take the opportunity to reflect on the experience. Evaluate what worked well and what could be improved for future deadlines. Use the lessons learned to refine your time management skills, planning strategies, and stress management techniques.</p>
<h4>Summary:</h4>
<p>Facing imminent deadlines can be overwhelming, but with the right approach, you can navigate through them successfully. By assessing the situation, prioritizing tasks, effective time management, seeking assistance when needed, managing stress, and practicing self-care, you can increase your chances of meeting deadlines while maintaining your well-being. Remember, it&#8217;s not about perfection but rather about delivering quality work within the given time frame. Embrace the challenge, stay focused, and celebrate your accomplishments when you meet those deadlines head-on.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Unlocking the Secrets: How to Avoid Fatigue and Improve Decision-Making</title>
		<link>https://wpadmin.nankov.mk/unlocking-the-secrets-how-to-avoid-fatigue-and-improve-decision-making/</link>
		
		<dc:creator><![CDATA[andrejnankov@gmail.com]]></dc:creator>
		<pubDate>Mon, 05 Jun 2023 11:55:53 +0000</pubDate>
				<category><![CDATA[Grow]]></category>
		<category><![CDATA[grow]]></category>
		<guid isPermaLink="false">https://wpadmin.nankov.mk/?p=469</guid>

					<description><![CDATA[Intro: As software developers, we face numerous challenges daily, from complex code debugging to tight project deadlines. Amidst these pressures, it&#8217;s easy to overlook the importance of mental and physical well-being. The truth is, tired developers are more prone to making bad decisions that can have detrimental effects on their work and overall productivity. In&#8230; <a class="more-link" href="https://wpadmin.nankov.mk/unlocking-the-secrets-how-to-avoid-fatigue-and-improve-decision-making/">Continue reading <span class="screen-reader-text">Unlocking the Secrets: How to Avoid Fatigue and Improve Decision-Making</span></a>]]></description>
										<content:encoded><![CDATA[<h4>Intro:</h4>
<p>As software developers, we face numerous challenges daily, from complex code debugging to tight project deadlines. Amidst these pressures, it&#8217;s easy to overlook the importance of mental and physical well-being. The truth is, tired developers are more prone to making bad decisions that can have detrimental effects on their work and overall productivity. In this blog post, we will explore the impact of fatigue on decision-making and provide actionable steps to help developers combat exhaustion and improve their ability to make choices.</p>
<p>&nbsp;</p>
<h4>Understanding the Link Between Fatigue and Decision-Making:</h4>
<p>Fatigue affects cognitive function, impairing our ability to think clearly, solve problems efficiently, and make well-informed decisions. When developers are exhausted, they may struggle with logical reasoning, attention to detail, and the ability to assess risks accurately. Recognizing this connection is crucial for addressing the issue and taking proactive steps to mitigate the negative impact of fatigue on decision-making.</p>
<p>&nbsp;</p>
<h4>Prioritize Rest and Recovery:</h4>
<p>To combat fatigue, it&#8217;s essential to prioritize rest and recovery. Adequate sleep is the foundation of a well-rested mind and body. Strive for a consistent sleep schedule, aiming for 6-8 hours of quality sleep each night. Additionally, encourage breaks during the workday to recharge. Short walks, mindfulness exercises, or power naps can help alleviate mental fatigue and improve decision-making capabilities.</p>
<p>&nbsp;</p>
<h4>Create a Sustainable Work Environment:</h4>
<p>Developers often work in high-pressure environments with tight deadlines and long hours. However, a sustainable work environment is crucial for maintaining productivity and making informed decisions. Encourage open communication within your team to address workload concerns and ensure realistic expectations. Avoid excessive multitasking, as it can lead to mental exhaustion and decreased decision-making abilities. Instead, prioritize focus and deep work on a single task at a time.</p>
<p>&nbsp;</p>
<h4>Practice Mindfulness and Self-Awareness:</h4>
<p>Mindfulness techniques can help developers cultivate self-awareness and mitigate the impact of fatigue on decision-making. Take short breaks throughout the day to engage in mindful practices such as deep breathing exercises, meditation, or stretching. These practices can increase self-awareness, reduce stress, and improve clarity of thought, enabling better decision-making.</p>
<p>&nbsp;</p>
<h4>Seek Support and Collaboration:</h4>
<p>Recognize that you don&#8217;t have to shoulder the burden alone. Reach out to your colleagues, mentors, or support networks when you feel overwhelmed or fatigued. Collaborative problem-solving and discussions can help generate fresh perspectives and lead to better decisions. Additionally, delegating tasks or seeking assistance when necessary can alleviate stress and prevent decision-making errors due to exhaustion.</p>
<p>&nbsp;</p>
<h4>Continuous Learning and Skill Development:</h4>
<p>Invest in continuous learning and skill development to improve your decision-making abilities. Stay up-to-date with industry best practices, new technologies, and methodologies. By enhancing your technical knowledge and expertise, you can make more informed decisions based on solid foundations. Additionally, seek out resources on decision-making frameworks and strategies to strengthen your analytical skills.</p>
<p>&nbsp;</p>
<h4>Summary:</h4>
<p>As developers, we must recognize the impact of fatigue on decision-making and take proactive steps to combat it. By prioritizing rest, creating a sustainable work environment, practicing mindfulness, seeking support, and continuously learning, we can improve our ability to make sound decisions even during challenging times. Remember, your mental and physical well-being are essential for your success as a developer. By taking care of yourself, you&#8217;ll not only make better decisions, but you&#8217;ll also enhance your overall productivity and enjoy a more fulfilling career.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Unlocking the Secrets: How to Find Time for Side Projects</title>
		<link>https://wpadmin.nankov.mk/unlocking-the-secrets-how-to-find-time-for-side-projects/</link>
		
		<dc:creator><![CDATA[andrejnankov@gmail.com]]></dc:creator>
		<pubDate>Mon, 05 Jun 2023 11:28:48 +0000</pubDate>
				<category><![CDATA[Grow]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[open-source]]></category>
		<guid isPermaLink="false">https://wpadmin.nankov.mk/?p=465</guid>

					<description><![CDATA[Intro: In today&#8217;s fast-paced world, finding time for personal projects and passions can often feel like an elusive goal. With work, family commitments, and various responsibilities demanding our attention, it&#8217;s easy for side projects to take a backseat. However, with a strategic approach and a few practical tips, it is possible to carve out time&#8230; <a class="more-link" href="https://wpadmin.nankov.mk/unlocking-the-secrets-how-to-find-time-for-side-projects/">Continue reading <span class="screen-reader-text">Unlocking the Secrets: How to Find Time for Side Projects</span></a>]]></description>
										<content:encoded><![CDATA[<h4><strong>Intro:</strong></h4>
<p><span style="font-weight: 400;">In today&#8217;s fast-paced world, finding time for personal projects and passions can often feel like an elusive goal. With work, family commitments, and various responsibilities demanding our attention, it&#8217;s easy for side projects to take a backseat. However, with a strategic approach and a few practical tips, it is possible to carve out time for your side projects and bring your creative aspirations to life. In this blog post, we&#8217;ll explore effective strategies to help us find the time and space needed to pursue our side projects.</span></p>
<p>&nbsp;</p>
<h4><strong>Prioritize and Define Your Goals:</strong></h4>
<p><span style="font-weight: 400;">To make time for your side projects, start by setting clear priorities and defining your goals. Determine what is truly important to you and which projects align with your values and aspirations. By identifying your top priorities, you can allocate your time and energy accordingly, ensuring that your side projects receive the attention they deserve.</span></p>
<p>&nbsp;</p>
<h4><strong>Time Management Techniques:</strong></h4>
<p><span style="font-weight: 400;">Effective time management is key to finding time for side projects. Explore different time management techniques, such as the Pomodoro Technique or time blocking, to optimize your productivity. Break your day into focused blocks of time, and dedicate specific slots to work on your side projects. By committing to these scheduled sessions, you create a structured environment that promotes progress on your creative endeavors.</span></p>
<p>&nbsp;</p>
<h4><strong>Embrace Small Steps and Consistency:</strong></h4>
<p><span style="font-weight: 400;">Consistency is crucial when it comes to side projects. Even if you can only dedicate a small amount of time each day or week, consistently working on your project will lead to significant progress over time. Embrace the idea of taking small steps, knowing that they add up to substantial achievements. Whether it&#8217;s dedicating 30 minutes every morning or a few hours on weekends, regularity and consistency will help you make consistent progress on your side projects.</span></p>
<p>&nbsp;</p>
<h4><strong>Identify Time-Wasting Activities:</strong></h4>
<p><span style="font-weight: 400;">We often underestimate the amount of time we spend on activities that don&#8217;t contribute significantly to our well-being or personal growth. Identify any time-wasting habits or activities that can be minimized or eliminated to free up time for your side projects. It could be reducing excessive social media scrolling, limiting TV time, or reprioritizing less important commitments. By consciously redirecting your time and energy towards your side projects, you&#8217;ll create more space for creative pursuits.</span></p>
<p>&nbsp;</p>
<h4><strong>Seek Support and Accountability:</strong></h4>
<p><span style="font-weight: 400;">Finding time for side projects can be challenging, especially when juggling multiple responsibilities. Seek support and accountability from friends, family, or like-minded individuals who understand the importance of your creative endeavors. Share your goals with them and consider forming a support network or joining a community of individuals pursuing similar passions. Being surrounded by supportive people who encourage and hold you accountable can make a significant difference in finding time and staying motivated for your side projects.</span></p>
<p>&nbsp;</p>
<h4><strong>Embrace Flexibility and Adaptability:</strong></h4>
<p><span style="font-weight: 400;">Life is unpredictable, and it&#8217;s essential to embrace flexibility and adaptability when it comes to your side projects. Recognize that there may be periods when other commitments take precedence, and that&#8217;s okay. Be kind to yourself and find ways to incorporate your side projects into your routine, even during busy times. Look for opportunities to multitask or integrate your passion projects into other aspects of your life.</span></p>
<p>&nbsp;</p>
<h4><strong>Summary:</strong></h4>
<p><span style="font-weight: 400;">Finding time for side projects requires deliberate planning, commitment, and a proactive mindset. By prioritizing your goals, managing your time effectively, embracing consistency, eliminating time-wasting activities, seeking support, and staying adaptable, you can create a harmonious balance between your responsibilities and your creative aspirations. Remember, your side projects are an expression of your passions and personal growth, and investing time in them can bring immense fulfillment and a sense of achievement to your life. So, take the leap, make the time, and watch your side projects flourish.</span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Combine TDD with N-layered architecture</title>
		<link>https://wpadmin.nankov.mk/combine-tdd-with-n-layered-architecture/</link>
		
		<dc:creator><![CDATA[andrejnankov@gmail.com]]></dc:creator>
		<pubDate>Tue, 18 Apr 2023 18:01:19 +0000</pubDate>
				<category><![CDATA[LARAVEL]]></category>
		<category><![CDATA[SOFTWARE ARHITECTURE]]></category>
		<category><![CDATA[TDD]]></category>
		<guid isPermaLink="false">https://wpadmin.nankov.mk/?p=458</guid>

					<description><![CDATA[Let’s see … Test-Driven Development (TDD) is a software development methodology that emphasizes writing automated tests before writing the actual code. It ensures that the code is reliable, maintainable, and meets the requirements of the business.  N-layer architecture is an approach to software design that involves separating the system into multiple layers, each with a&#8230; <a class="more-link" href="https://wpadmin.nankov.mk/combine-tdd-with-n-layered-architecture/">Continue reading <span class="screen-reader-text">Combine TDD with N-layered architecture</span></a>]]></description>
										<content:encoded><![CDATA[<h2><b>Let’s see …</b></h2>
<p><b>Test-Driven Development</b><span style="font-weight: 400;"> (TDD) is a software development methodology that emphasizes writing automated tests before writing the actual code. It ensures that the code is reliable, maintainable, and meets the requirements of the business. </span></p>
<p><b>N-layer architecture</b><span style="font-weight: 400;"> is an approach to software design that involves separating the system into multiple layers, each with a specific responsibility. Typically, these layers include a presentation layer, an application layer, a domain layer, and a data layer. Each layer is responsible for a specific set of tasks and communicates with the other layers through well-defined interfaces.</span></p>
<p><span style="font-weight: 400;">This technology combo approach can help you to ensure that your code is well-structured and properly encapsulated and that each layer of your application behaves correctly meeting its intended requirements. </span></p>
<p><span style="font-weight: 400;">For example, tests for the domain layer should focus on the business logic of the application, while tests for the presentation layer should focus on the user interface and user interactions. By writing tests at the appropriate level, you can ensure that your tests are effective and that your code is well-designed.</span></p>
<p>&nbsp;</p>
<h2><b>What are the benefits of TDD?</b></h2>
<p><span style="font-weight: 400;">TDD has many benefits, including:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><b>Early detection of defects</b><span style="font-weight: 400;">: Writing tests before writing the code helps identify defects early in the development cycle, reducing the cost of fixing them.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Better code quality</b><span style="font-weight: 400;">: TDD encourages developers to write modular and reusable code, leading to better code quality and easier maintenance.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Faster development cycles</b><span style="font-weight: 400;">: TDD helps developers catch defects early, which reduces the amount of time required for testing and debugging.</span></li>
<li style="font-weight: 400;" aria-level="1"><b style="background-color: var(--global--color-background); color: var(--global--color-primary); font-family: var(--global--font-secondary); font-size: var(--global--font-size-base);">Improved collaboration:</b><span style="font-weight: 400;"> TDD encourages collaboration between developers and other stakeholders, leading to better communication and a shared understanding of the requirements.</span></li>
</ul>
<p>&nbsp;</p>
<h2><b>What are the benefits of N-layered Architecture? </b></h2>
<p><span style="font-weight: 400;">N-layered architecture offers:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><b>Separation of concerns: </b><span style="font-weight: 400;">Separating the different layers of an application into distinct modules allows for better separation of concerns, making the application more modular and easier to maintain.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Scalability:</b><span style="font-weight: 400;"> N-layered architecture makes it easier to scale different parts of an application independently, allowing developers to focus on specific areas of the application that need improvement.</span></li>
<li style="font-weight: 400;" aria-level="1"><b style="background-color: var(--global--color-background); color: var(--global--color-primary); font-family: var(--global--font-secondary); font-size: var(--global--font-size-base);">Code reusability:</b><span style="font-weight: 400;"> N-layered architecture promotes the use of reusable code, leading to faster development cycles and easier maintenance.</span></li>
</ul>
<h2><b>Implementation</b></h2>
<p><span style="font-weight: 400;">Now let&#8217;s dive into the implementation details. Here is a step-by-step guide on how to combine </span><b>TDD</b><span style="font-weight: 400;"> with </span><b>N-layered architecture</b><span style="font-weight: 400;"> in your software development process:</span></p>
<ul>
<li><b>Define the requirements of the system:</b><span style="font-weight: 400;"> Before starting any coding, define the requirements of the system. This will help you to identify the different layers required in the system.</span></li>
<li><b>Create the layers:</b><span style="font-weight: 400;"> Based on the requirements, create the different layers required in the system. The most common layers are the presentation layer, business logic layer, and data access layer. You can add additional layers depending on the complexity of the system.</span></li>
<li><b>Write unit tests for each layer:</b><span style="font-weight: 400;"> Once you have created the layers, start by writing unit tests for each layer. This will ensure that each layer of the system is working as expected. It is important to write tests that cover both positive and negative scenarios.</span></li>
<li><b>Write code for each layer:</b><span style="font-weight: 400;"> After writing the tests for each layer, start writing the code for each layer. Ensure that the code follows the SOLID principles and is well-structured.</span></li>
<li><b>Run the tests: </b><span style="font-weight: 400;">After writing the code, run the tests to ensure that the code is working as expected. If any tests fail, debug the code and fix the issues.</span></li>
<li><b>Refactor the code:</b><span style="font-weight: 400;"> After the tests have passed, refactor the code to ensure that it is clean, well-structured, and follows best practices.</span></li>
<li><b>Repeat the process for each layer:</b><span style="font-weight: 400;"> Repeat the process for each layer of the system until all layers have been tested and implemented.</span></li>
<li><b>Integrate the layers:</b><span style="font-weight: 400;"> Once all layers have been implemented and tested, integrate the layers to ensure that they work together seamlessly.</span></li>
<li><b>Write integration tests:</b><span style="font-weight: 400;"> After integrating the layers, write integration tests to ensure that the system is working as expected. These tests should cover both positive and negative scenarios.</span></li>
<li><b>Deploy the system:</b><span style="font-weight: 400;"> Once the tests have passed, deploy the system to the stage environment.</span></li>
</ul>
<h2><b>Last words &amp; code details</b></h2>
<p><span style="font-weight: 400;">My next focus will be to set up a repo on GitHub and you can find it </span><a href="https://github.com/nanorocks"><span style="font-weight: 400;">here</span></a><span style="font-weight: 400;">. For code implementation, I found a nice resource where you can follow </span><a href="https://5balloons.info/laravel-tdd-beginner-crud-example"><span style="font-weight: 400;">code details</span></a><span style="font-weight: 400;">. It’s basically a CRUD operation developed with the Laravel framework which follows TDD. Although, Laravel by its nature follows the N-layer architecture of the development. </span></p>
<p><b>Andrej Nankov</b></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>N-tier or N-layer is that the same?</title>
		<link>https://wpadmin.nankov.mk/n-tier-or-n-layer-is-that-the-same/</link>
		
		<dc:creator><![CDATA[andrejnankov@gmail.com]]></dc:creator>
		<pubDate>Fri, 17 Mar 2023 13:21:45 +0000</pubDate>
				<category><![CDATA[software architecture]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[software]]></category>
		<guid isPermaLink="false">https://wpadmin.nankov.mk/?p=435</guid>

					<description><![CDATA[N-tier or N-layer is that the same? Most developers can say that there is not much difference. I say there is. &#160; We use the N-tier terminology when we like to explain the high-level implementation of the system divided into tiers. Here, every tier has the possibility to be on a different machine, to be&#8230; <a class="more-link" href="https://wpadmin.nankov.mk/n-tier-or-n-layer-is-that-the-same/">Continue reading <span class="screen-reader-text">N-tier or N-layer is that the same?</span></a>]]></description>
										<content:encoded><![CDATA[<h4><span style="font-weight: 400;">N-tier or N-layer is that the same? Most developers can say that there is not much difference. I say there is.</span></h4>
<p>&nbsp;</p>
<h5><strong>We use the N-tier terminology when we like to explain the high-level implementation of the system divided into tiers. Here, every tier has the possibility to be on a different machine, to be physically separated.</strong></h5>
<p><strong>For example.  If we are building a system that holds: Mobile/Frontend App, an API, and DB we have three-tier architecture. The mobile/fronted app holds the Presentation tier. Therefore, the data need to be processed so they communicate with the API. The API holds the Business tier although connections to third-party systems, databases, mail, etc. And we have a Data-tier where we have the database (usually SQL/NoSQL database). Three-tier architecture is a commonly used architecture and most developers are familiar with it. I believe is great, it offers to have a variety of different technologies, independent teams, and easy maintenance, easy to scale.</strong></p>
<p><strong>The two-tier architecture is used mostly for web apps where Presentation &amp; Business tire are together. It doesn&#8217;t give us the possibility to have a replaceable Presentation tire but sometimes that is okay for fast delivery where clients will use only browsers. However, if there is a possibility to have non-consistent data or fewer error handlers, or no testable code the web app will be broken. The technology stack is the same, mostly full-stack development, and probably the dev team will use some templating engines like razor, blade, twig, ejs, pug to render the HTML.</strong></p>
<h5><strong>Conclusion</strong></h5>
<p><strong>Go with three-tier architecture. Three-tier architecture can extend to n-tire when we need more data transformation, communication with third-party API, and a non single API gateway.</strong></p>
<p><b>N-Tier Architecture covers</b></p>
<ul>
<li><b>Scalability |</b><span style="font-weight: 400;"> You can separate tiers without affecting the other tiers and then scale each one properly.</span></li>
<li><b>Data Integrity |</b><span style="font-weight: 400;"> Cascading effects are prevented, and maintenance becomes easier. One may change the code without affecting the data.</span></li>
<li><b>Reusability |</b><span style="font-weight: 400;"> Different layers could be used in different projects or in the same project you may use the same layer in different places. For instance, you might want to write extensions to your projects, and if you want to use them in another project</span></li>
<li><b>Secure |</b><span style="font-weight: 400;"> You can secure the layers without affecting the other layers.</span></li>
</ul>
<p><strong>Use tiers to explain the high-level implementation of the system.</strong></p>
<p>&nbsp;</p>
<h5><b>N-layered in the web world it is used for API and Web applications. It describes the layering of the app, the API, the separation of concern in the non-first and non-last tire usually the business tire.</b></h5>
<p><span style="font-weight: 400;">Let’s explain these by defining layers inside of a REST API.</span></p>
<ul>
<li><b>Models or Entities |</b><span style="font-weight: 400;"> Define the tables of the database and relations by using the ORM.</span></li>
<li><b>Repositories |</b><span style="font-weight: 400;"> Usually hides the operations of the models and can hold complex DB queries that are not supported or optimized by the ORM. Repositories encapsulate the logic required to access data sources</span></li>
<li><b>Form Validation |</b><span style="font-weight: 400;"> In some frameworks are part of the entity but there are also frameworks that separate the validation into different classes.</span></li>
<li><b>Services |</b><span style="font-weight: 400;"> Usually hold the business logic, and calculations and work together closely with other services like dependencies or repositories.</span></li>
<li><b>Controllers |</b><span style="font-weight: 400;"> They control what are the requests and what kind of response we will serve to the client. </span></li>
<li><b>Resources |</b><span style="font-weight: 400;"> They are responsible to handle the data resources as a response. Mostly is used by the controllers. Java web uses &#8220;the resources&#8221; like POJO classes. You return only what you need.</span></li>
<li><em><b>Data Transfer Objects |</b></em><span style="font-weight: 400;"> Mostly known as a pattern that helps to have clear data sets between the layers. It helps with testing, validating, and to have the purity of the data between layers.</span></li>
</ul>
<p><span style="font-weight: 400;"> By adding an additional layer: The <strong>Views layer</strong> this approach can be used for building Web apps. </span><span style="font-weight: 400;">Some web apps by default use </span><b>Model–view–controller</b><span style="font-weight: 400;"> architectural pattern which is commonly for developing user interfaces that divide the related program logic into three interconnected elements.</span></p>
<ul>
<li><em><b>Controllers |</b></em><span style="font-weight: 400;"> usually hold the business logic, form validation, redirects, and call render template</span></li>
<li><em><b>Models |</b></em><span style="font-weight: 400;"> Are used by the controller to query the database, for crud operation, etc.</span></li>
<li><em><b>Views |</b></em><span style="font-weight: 400;"> If it is a web app templating engine is responsible here. It will be returned from the controller.  </span></li>
</ul>
<h6><strong>Layering principle</strong></h6>
<p><span style="font-weight: 400;">Layering as a concept is defined in many software architectures. Clean, Onion, Screaming, Hexagonal it’s all, quite the same. The main difference is the naming convention and how engineers understand and organize the code by the layering principle. </span></p>
<p>&nbsp;</p>
<h5><strong>Conclusion</strong></h5>
<p><strong>N-layered It describes how the API/APP is organized. For web apps, we can use MVC and can extend it. In APIs, we miss that views layer. Popular software architectures use Layering principle.</strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tight coupling and loose coupling implementations</title>
		<link>https://wpadmin.nankov.mk/tight-coupling-and-loose-coupling-implementations/</link>
		
		<dc:creator><![CDATA[andrejnankov@gmail.com]]></dc:creator>
		<pubDate>Mon, 07 Nov 2022 23:26:57 +0000</pubDate>
				<category><![CDATA[SYSTEM DESIGN]]></category>
		<category><![CDATA[arhitecture]]></category>
		<category><![CDATA[coding]]></category>
		<guid isPermaLink="false">https://wpadmin.nankov.mk/?p=424</guid>

					<description><![CDATA[Welcome This terminology is mostly used in the software architecture world when we try to describe how the system works by the implementation. In the beginning, the most popular worldwide apps (Facebook, Netflix, Spotify … )  started small, overtime they scaled their system and its complexity. They overcome the problems by slowly moving from tightly&#8230; <a class="more-link" href="https://wpadmin.nankov.mk/tight-coupling-and-loose-coupling-implementations/">Continue reading <span class="screen-reader-text">Tight coupling and loose coupling implementations</span></a>]]></description>
										<content:encoded><![CDATA[<h4><strong>Welcome</strong></h4>
<p><span style="font-weight: 400;">This terminology is mostly used in the software architecture world when we try to describe how the system works by the implementation. In the beginning, the most popular worldwide apps (Facebook, Netflix, Spotify … )  started small, overtime they scaled their system and its complexity. They overcome the problems by slowly moving from tightly coupled to loosely coupled systems.</span></p>
<p><span style="font-weight: 400;">Tight and loose coupling can be described over</span></p>
<ul>
<li aria-level="1"><b>Code implementation (low-level implementation)</b></li>
</ul>
<ul>
<li aria-level="1"><b>System diagrams &#8211; how the system works, the big picture (high-level implementation)</b></li>
</ul>
<p>&nbsp;</p>
<h4><b>Low-level implementation</b></h4>
<p><span style="font-weight: 400;">In the OOP world as we know we mostly use classes, interfaces, objects, methods, and the principles like inheritance, encapsulation, polymorphism, and abstraction. In some projects, we use only a couple of them </span><span style="font-weight: 400;">but they offer us the possibility to express real-life objects, scenarios, and connections. </span></p>
<p><span style="font-weight: 400;">However, coding is a process that relies on constantly making mistakes, resolving, and writing tests. Engineers can’t always see the big picture and predict the scale of the system. What about the clients? They usually don’t know what they like but want quick results. And there is a possibility of Tightly coupled code. </span></p>
<p><span style="font-weight: 400;">For short-term projects, probably small projects with tightly coupled code can drive the business. But also the business owners must know that if they like to grow the system will need to grow too. We need solutions. Here I am pointing to the previous blog post about the triangle of time, money, and quality </span><a href="https://andrej.nankov.mk/posts/how-to-build-one-good-habit-on-top-of-your-projects-by-using-best-practices"><span style="font-weight: 400;">here</span></a><span style="font-weight: 400;">. I am seeing a situation where from one side are the dev team and from the other side are the clients and they both are holding the same rope. So, in one manner of time whoever holds the bigger part of the rope is the winner. It means one feature will be implemented as expected or we will use a workaround to satisfy client needs.</span></p>
<p><span style="font-weight: 400;">Okay, how to build a loosely coupled codebase? Literally, you need </span><b>abstraction </b><span style="font-weight: 400;">and you can do that by using abstract classes and interfaces. And what about dependencies? How to organize the dependencies of the classes? Today we have Dependency Injection containers … they can be manually </span><span style="font-weight: 400;">configured or auto-wired. It can be a stand-alone package, part of the framework, or vanilla implementation. Also, some full-featured frameworks like (Laravel, Symphony, Spring, NestJS, AdonisJS …) already follow some universal standards for development by providing simple tooling, layered skeleton architecture, and design patterns. Generally speaking, they all follow the separation of concern principle that can lead you to loosely coupled code, a clean architecture. SOLID principles are good guides for heavy &#8211; enterprise systems.  </span></p>
<h4><b>High-level implementation</b></h4>
<p><span style="font-weight: 400;">When I think of a tight coupling </span><b>system</b><span style="font-weight: 400;"> here I mean on a </span><b>Monolith</b><span style="font-weight: 400;">. Database, querying, parsing data, business logic, and views in one place. It means a team of people can work on a single codebase and,  if some part of the whole system (DB, view, business logic) is broken, the whole system is broken. There is one possibility to scale, only vertical (memory and CPU power) and it has fewer opportunities for fallback alternatives. Even if we say that Monolith is bad, it’s here and will be here for small companies, simple websites, apps, and start-ups. </span></p>
<p><span style="font-weight: 400;">Monoliths as tightly coupled systems are good for simplicity, easy testing, simple pipelines, debugging and development, new features because the data is already there, easy upgrades, onboarding new members to the team, and low cost at the start.</span></p>
<p><span style="font-weight: 400;">So what are the alternatives? How to move from tight coupe to loosely coupled systems?</span></p>
<p><b>Hybrid implementation</b><span style="font-weight: 400;"> I will call it a period where developers are trying to move from monolith to </span><b>microservice architecture</b><span style="font-weight: 400;">. It can be a long or short period but it depends on a lot of stuff. These projects are interesting because of the challenges that we can have with the communication between the services and the first separations of business logic. Maybe, totally new features to the project. This hybrid implementation offers us some loosely coupled systems but in a way, that part of the services will depend on one to another and some of them to live decoupled.  </span></p>
<p><b>Microservice architecture</b><span style="font-weight: 400;"> is totally the opposite of the monolith. It solves the problem that the monolith has and it grows in complexity. It is more popular in the enterprise world and has huge teams. Also, it solves the problem of <strong>tight coupling teams</strong> by separating the teams into smaller groups for example frontend-devs, mobile, dev-ops, dba, and every team has its own responsibility, own codebase, own code dependencies, own system relations even own database if needed. </span></p>
<p><span style="font-weight: 400;">This architecture definitely solves problems from many perspectives whenever we talk about loosely cooped systems. In the future, we can cover the microservice architecture in dept.</span></p>
<h4><strong>The final word will be</strong></h4>
<p><span style="font-weight: 400;">if you are able to implement good practices on a low level by making the code loosely coupled in a monolith world you can migrate easily to microservice. Cloud providers offer us lighting speed web services, autoscale, zero downtime, and good benchmark so pick always what suit your needs, your client, and the business.</span></p>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Life tips and learning process</title>
		<link>https://wpadmin.nankov.mk/life-tips-and-learning-process/</link>
		
		<dc:creator><![CDATA[andrejnankov@gmail.com]]></dc:creator>
		<pubDate>Mon, 03 Oct 2022 14:40:54 +0000</pubDate>
				<category><![CDATA[Grow]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[success]]></category>
		<guid isPermaLink="false">https://wpadmin.nankov.mk/?p=402</guid>

					<description><![CDATA[Recently I read an article about learning different languages and how that one guy made it all easy. I feel so inspired to extend that knowledge with my life experience and share my thoughts about it. Generally speaking, these tips can help you whenever there are milestones or a huge mountain that you need to&#8230; <a class="more-link" href="https://wpadmin.nankov.mk/life-tips-and-learning-process/">Continue reading <span class="screen-reader-text">Life tips and learning process</span></a>]]></description>
										<content:encoded><![CDATA[<h6><span style="font-weight: 400;">Recently I read an article about learning different languages and how that one guy made it all easy. I feel so inspired to extend that knowledge with my life experience and share my thoughts about it. Generally speaking, these tips can help you whenever there are milestones or a huge mountain that you need to concur.</span></h6>
<p>&nbsp;</p>
<h6><span style="font-weight: 400;">The first tip will be to be </span><em><strong>Relaxed</strong></em><b>.</b><span style="font-weight: 400;"> It’s proven that the brain better makes decisions when you’re relaxed. Extra panic, adrenaline will only throw improvised solution but not the best one, not the most appropriate like you were relaxed. By human nature, this is natural because your body is in self-defense mode and triggers outdoor reactions. Not being relaxed, won’t help you learn better or faster.</span></h6>
<p>&nbsp;</p>
<h6><span style="font-weight: 400;">The second tip will be to be </span><em><strong>Confident</strong></em><span style="font-weight: 400;">. Because you’re already in the learning process it doesn’t mean you’re not intelligent or smart. It means that you only need time to develop the skills and nothing more. I am saying to myself that: there is no perfection in life and to be great at something you constantly need to improve yourself. That makes me very confident and sure that I know what am I doing. However, there is only one person who can judge you here. And that’s you, so be confident.</span></h6>
<p>&nbsp;</p>
<h6><span style="font-weight: 400;">I believe that if you are able to explain something simply then you know it well. But sometimes in life, there are several paths you can pick to achieve your goal. It’s totally okay to ask for opinions from other people. Some of them already completed your goal or know tips on how you can complete it faster. But not everyone wants to be helpful. So my third tip will be to </span><em><strong>Know your audience.</strong></em> <span style="font-weight: 400;">It means don’t give focus or energy to people that are selfish. Instead find people that will help you to grow, people that know to respect others&#8217; thinking, and people that know cross-collaboration is always more than one-man-show.</span></h6>
<p>&nbsp;</p>
<h6><span style="font-weight: 400;">The Fourth tip will be to </span><em><strong>don&#8217;t assume anything.</strong></em> <span style="font-weight: 400;">In some cases, there are rules that need to be followed but you can always rely on what you have learned.</span></h6>
<p>&nbsp;</p>
<h6><span style="font-weight: 400;">The Fifth tip it’s kinda close to the Forth tip, and that is </span><em><strong>don’t fear of mistakes</strong></em><span style="font-weight: 400;"><em><strong>.</strong></em> If you are able to build a skill that can help you to stand up quickly after a fall then you already know this lesson. Any entrepreneur or successful man did a mistake and that&#8217;s okay. The drill is mostly to solve problems and provide solutions while not putting on the heart the problem and your fall.</span></h6>
<p>&nbsp;</p>
<h6><span style="font-weight: 400;">The Sixth tip will be to give </span><em><strong>focus on the core steps</strong></em><span style="font-weight: 400;"><em>.</em> As a developer the hardest part is to develop the solution in your head, writing the code can be less than 5 minutes. Also, you can always go back and refactor that solution. Even if you need to build a house instead of buying the needed materials try to find an architect to design everything on paper. My solution here is to build a list of tasks, make priorities and try to give yourself an estimation. </span></h6>
<p>&nbsp;</p>
<h6><span style="font-weight: 400;">The seventh tip will be to </span><em><strong>practice</strong></em><span style="font-weight: 400;"><em>.</em> Before you learned to ride a bike you practiced. Almost everything in life is tightly coupled to practice. How often you do it, you become even better and better. IT carrier is also something that requires a lot of practice, and learning, so if you find yourself here you probably know what you will do for the rest of your life. It’s a non-stop learning process.</span></h6>
<p>&nbsp;</p>
<h6><span style="font-weight: 400;">To tighten all these together last tip will be </span><em><strong>to be adventurous</strong></em><span style="font-weight: 400;"><em>.</em> Life is an adventure. Because if you constantly follow some steps or push all the way up, there is no fun in that. Give yourself space, fall in the mad, get up, continue to walk, be confident, and relax. </span></h6>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
