<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Mohammed Paqer on Medium]]></title>
        <description><![CDATA[Stories by Mohammed Paqer on Medium]]></description>
        <link>https://medium.com/@losefor?source=rss-f5ee9b40226d------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*7fmAtCxBglhwk_7Z0hxtbA.jpeg</url>
            <title>Stories by Mohammed Paqer on Medium</title>
            <link>https://medium.com/@losefor?source=rss-f5ee9b40226d------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 17:27:26 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@losefor/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[I Fine-Tuned a Local LLM on Mac to Find Security Bugs. It Got Worse. Why?]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://losefor.medium.com/i-fine-tuned-a-local-llm-on-mac-to-find-security-bugs-it-got-worse-why-66ab41878e20?source=rss-f5ee9b40226d------2"><img src="https://cdn-images-1.medium.com/max/1600/1*lyLY2C_t09tJMIEweEr7tw.png" width="1600"></a></p><p class="medium-feed-snippet">A post-mortem of a LoRA run on a 16 GB MacBook: GPU watchdog crashes, two silent export bugs, and the training data that taught the model&#x2026;</p><p class="medium-feed-link"><a href="https://losefor.medium.com/i-fine-tuned-a-local-llm-on-mac-to-find-security-bugs-it-got-worse-why-66ab41878e20?source=rss-f5ee9b40226d------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://losefor.medium.com/i-fine-tuned-a-local-llm-on-mac-to-find-security-bugs-it-got-worse-why-66ab41878e20?source=rss-f5ee9b40226d------2</link>
            <guid isPermaLink="false">https://medium.com/p/66ab41878e20</guid>
            <dc:creator><![CDATA[Mohammed Paqer]]></dc:creator>
            <pubDate>Sun, 04 Oct 2026 08:45:53 GMT</pubDate>
            <atom:updated>2026-10-04T08:45:53.410Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[What’s the Difference Between Ollama, vLLM, and VRAM Management?]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://losefor.medium.com/whats-the-difference-between-ollama-vllm-and-vram-management-3f1650ad5808?source=rss-f5ee9b40226d------2"><img src="https://cdn-images-1.medium.com/max/2600/1*iJbFGu_yXXy29ZInN8eiIQ.png" width="2816"></a></p><p class="medium-feed-snippet">A lot of people run LLMs locally and hit &#x201C;Out of Memory&#x201D; errors or experience incredibly high latency, even though their GPU seemingly has&#x2026;</p><p class="medium-feed-link"><a href="https://losefor.medium.com/whats-the-difference-between-ollama-vllm-and-vram-management-3f1650ad5808?source=rss-f5ee9b40226d------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://losefor.medium.com/whats-the-difference-between-ollama-vllm-and-vram-management-3f1650ad5808?source=rss-f5ee9b40226d------2</link>
            <guid isPermaLink="false">https://medium.com/p/3f1650ad5808</guid>
            <dc:creator><![CDATA[Mohammed Paqer]]></dc:creator>
            <pubDate>Mon, 18 May 2026 07:58:24 GMT</pubDate>
            <atom:updated>2026-05-18T07:58:24.499Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Why does AI need VRAM instead of RAM?]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://losefor.medium.com/why-does-ai-need-vram-instead-of-ram-9f973573dc43?source=rss-f5ee9b40226d------2"><img src="https://cdn-images-1.medium.com/max/2600/1*kkzh8LY08fXGb81vaftxqg.png" width="2760"></a></p><p class="medium-feed-snippet">First, what is RAM?</p><p class="medium-feed-link"><a href="https://losefor.medium.com/why-does-ai-need-vram-instead-of-ram-9f973573dc43?source=rss-f5ee9b40226d------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://losefor.medium.com/why-does-ai-need-vram-instead-of-ram-9f973573dc43?source=rss-f5ee9b40226d------2</link>
            <guid isPermaLink="false">https://medium.com/p/9f973573dc43</guid>
            <category><![CDATA[large-language-models]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[vram]]></category>
            <category><![CDATA[gpu]]></category>
            <category><![CDATA[rams]]></category>
            <dc:creator><![CDATA[Mohammed Paqer]]></dc:creator>
            <pubDate>Fri, 03 Apr 2026 09:04:04 GMT</pubDate>
            <atom:updated>2026-04-03T09:04:04.764Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to resolve vercel blocking by the iraqi government]]></title>
            <link>https://losefor.medium.com/how-to-resolve-vercel-blocking-by-the-iraqi-government-f97ba2f66115?source=rss-f5ee9b40226d------2</link>
            <guid isPermaLink="false">https://medium.com/p/f97ba2f66115</guid>
            <category><![CDATA[block]]></category>
            <category><![CDATA[vercel]]></category>
            <category><![CDATA[iraq]]></category>
            <dc:creator><![CDATA[Mohammed Paqer]]></dc:creator>
            <pubDate>Sat, 23 Dec 2023 13:18:57 GMT</pubDate>
            <atom:updated>2023-12-23T13:18:57.193Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u1IkXnSmr4RR4_I6XaSrHg.jpeg" /></figure><p>In recent months, the Iraqi government implemented a block on the Vercel IP A Record (76.76.21.21). To address this issue, it is essential to adjust the way you connect your domain. Avoid using the blocked IP (76.76.21.21) and opt for an alternative solution involving NS (Name servers).</p><h4>what is NS (Name servers):</h4><p>Nameservers are pivotal servers on the network responsible for translating domain names into IP addresses, indicating where your website is hosted. Major domain registrars, including Vercel, offer their own nameservers, such as ns1.vercel-dns.com.</p><h3>Here’s a step-by-step guide to resolving the issue:</h3><h4>1- Remove the A Record (@) from your dns</h4><h4>2- Add the following name servers to your DNS registrar (e.g., GoDaddy):</h4><pre>ns1.vercel-dns.com<br>ns2.vercel-dns.com</pre><h4>3- Add the following record</h4><pre>type: CNAME<br>subdomain: www<br>points to: example.com</pre><p>Don’t forget to replace example.com with <strong>yourdomain.com</strong></p><p>Ensure these adjustments are made to effectively navigate around the blocked IP issue in Iraq. By implementing the recommended nameservers and CNAME record, your domain should function seamlessly.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f97ba2f66115" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Revolutionizing Online Payments in Iraq: The Future is Here?!]]></title>
            <link>https://losefor.medium.com/revolutionizing-online-payments-in-iraq-the-future-is-here-1607ad0cb076?source=rss-f5ee9b40226d------2</link>
            <guid isPermaLink="false">https://medium.com/p/1607ad0cb076</guid>
            <category><![CDATA[online-payments]]></category>
            <category><![CDATA[stripe]]></category>
            <category><![CDATA[payments]]></category>
            <category><![CDATA[ecommerce]]></category>
            <category><![CDATA[iraq]]></category>
            <dc:creator><![CDATA[Mohammed Paqer]]></dc:creator>
            <pubDate>Sun, 12 Nov 2023 10:17:47 GMT</pubDate>
            <atom:updated>2023-11-12T10:17:47.417Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D4u-WIDdRq7FBdWTqQLrWA.jpeg" /></figure><p>Online payments have revolutionized the way we shop, transfer money, and conduct business. However, in Iraq, the adoption of online payments has been slow and somewhat hesitant due to a combination of economic and societal factors. The Iraqi society is accustomed to withdrawing their salaries in cash, rather than using credit cards, making it harder for online payment systems to take root. Additionally, the infrastructure required to support online payments is still in its infancy, making it difficult to implement such systems. In this blog, we will explore the challenges that are currently impeding the widespread adoption of online payments in Iraq and the steps that need to be taken to overcome these hurdles.</p><h3>Challenges and Roadblocks to Online Payments in Iraq: Exploring the Reasons Behind Slow Adoption</h3><p>Iraq is a country that has experienced significant economic challenges in recent years, including inflation, unemployment, and political instability. This has contributed to a general lack of trust in financial institutions, including banks and credit card companies. Additionally, a large portion of the population remains unbanked, with many people preferring to rely on cash transactions.</p><h3>Revitalizing Online Payments in Iraq: Strategies and Solutions for Overcoming the Challenges</h3><p>To overcome these challenges and promote the adoption of online payments in Iraq, several steps need to be taken. First and foremost, there needs to be an increased focus on financial literacy and education to help people better understand the benefits and risks of using online payment systems. This can include initiatives such as workshops, seminars, and public awareness campaigns.</p><p>Secondly, there needs to be an expansion of the infrastructure required to support online payments, including the establishment of secure online payment gateways and the development of robust mobile payment solutions. This will require investment in both technology and training, as well as close collaboration between government agencies, financial institutions, and technology companies.</p><p>Finally, there needs to be a concerted effort to build trust and confidence in online payment systems among the general public. This can be achieved through measures such as improved security features, better customer support, and transparent fee structures.</p><p>One of the key solutions to promoting the adoption of online payments in Iraq is to provide a more stable, reliable, and developer-friendly payment gateway experience. This requires the active involvement and engagement of payment gateway providers such as Switch company, APS, QI CARD, and Amwal, as well as collaboration with the broader developer community.</p><p>To achieve this, payment gateway providers must prioritize the needs of developers, making it easy for them to integrate payment gateways into their applications and websites. This can include providing clear and concise documentation, offering robust APIs and SDKs, and providing access to testing environments and sandbox accounts.</p><p>In addition, payment gateway providers must also focus on ensuring the stability and reliability of their payment systems. This requires ongoing investment in technology infrastructure, security measures, and 24/7 technical support.</p><p>By providing a more stable and developer-friendly payment gateway experience, payment gateway providers can help to remove one of the major barriers to the adoption of online payments in Iraq. This will enable developers to more easily integrate payment systems into their applications and websites, ultimately leading to increased adoption of online payments and a more efficient and secure financial system for all.</p><p>By taking these steps, it is possible to overcome the challenges currently impeding the widespread adoption of online payments in Iraq and to create a more efficient, secure, and inclusive financial system for all.</p><h3>The High Cost of Entry: How Initial Setup Fees Are Hindering the Adoption of Online Payments in Iraq</h3><p>Another significant challenge to the widespread adoption of online payments in Iraq is the high cost of initial setup fees. For many startups and small businesses, the cost of setting up an online payment gateway can be prohibitively expensive.</p><p>This is a major roadblock, as it can discourage many businesses from even considering implementing online payments, especially those with limited financial resources. Payment gateway providers can take steps to address this challenge by reducing or eliminating these initial setup fees, or by offering more flexible payment options that are more accessible to startups and small businesses.</p><p>By reducing the cost of initial setup fees, payment gateway providers can help to promote the adoption of online payments in Iraq, particularly among startups and small businesses. This will not only lead to increased usage of payment gateways, but it can also help to stimulate economic growth and encourage the development of new businesses and industries in Iraq.</p><p>In conclusion, while there are many challenges to the adoption of online payments in Iraq, there are also many potential solutions. By prioritizing the needs of developers, investing in technology infrastructure and security measures, and reducing the cost of initial setup fees, payment gateway providers can help to encourage the adoption of online payments in Iraq, ultimately leading to a more efficient and secure financial system for all.</p><h3>Improving Customer Support in Payment Gateway Providers for Seamless Online Payments in Iraq</h3><p>Another challenge that has impeded the widespread adoption of online payments in Iraq is the lack of support from the people working for payment gateway providers. Many businesses that have attempted to implement online payments have reported slow response times from customer support teams, which can be frustrating and time-consuming.</p><p>In some cases, the application process can be complex and confusing, leading to delays and misunderstandings that can further hinder the adoption of online payments. Some businesses have reported that they are required to provide extensive documentation and information as part of the application process, which can be difficult to gather and submit in a timely manner.</p><p>Additionally, there have been cases where businesses have submitted their application and then heard nothing for days or even weeks, leading to uncertainty about the status of their application and frustration about the lack of communication. This can be particularly problematic if a business has already invested time and resources into preparing for online payments and is waiting for approval to move forward.</p><p>To overcome this challenge, payment gateway providers need to prioritize customer support and ensure that they have adequate resources in place to respond to inquiries and resolve issues in a timely manner. This can include providing clear and concise documentation about the application process, offering online support and training materials, and assigning dedicated support representatives to assist with the onboarding process.</p><p>By providing better support and communication, payment gateway providers can help to streamline the adoption of online payments in Iraq and create a more positive experience for businesses looking to implement these services. This will not only benefit individual businesses, but it will also help to promote the growth of the online payment industry as a whole in Iraq.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1607ad0cb076" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Navigating an Old Code Project: Top Things to Do — Part 1]]></title>
            <link>https://losefor.medium.com/navigating-an-old-code-project-top-things-to-do-part-1-a46884d64532?source=rss-f5ee9b40226d------2</link>
            <guid isPermaLink="false">https://medium.com/p/a46884d64532</guid>
            <category><![CDATA[software-architecture]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[clean-code]]></category>
            <category><![CDATA[developer]]></category>
            <dc:creator><![CDATA[Mohammed Paqer]]></dc:creator>
            <pubDate>Sun, 12 Nov 2023 10:04:14 GMT</pubDate>
            <atom:updated>2023-11-12T10:04:14.056Z</atom:updated>
            <content:encoded><![CDATA[<h3>Navigating an Old Code Project: Top Things to Do — Part 1</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*H1NSYe43O5w-D8UYCkP8rQ.jpeg" /></figure><p>When you step into an old code project, whether it’s a legacy system, an open-source project, or an application developed by another team member, you are often faced with a mix of emotions. The package includes excitement, curiosity, and sometimes even dread. However, by following a systematic approach and a set of best practices, you can effectively navigate through the codebase, understand its structure, and contribute positively to its maintenance or enhancement. In this article, we will outline the top things you should do when you get into an old code project.</p><h3>contents of this article:</h3><h4>Part1</h4><ul><li>Read the Documentation</li><li>Identify the Main Entry Points</li><li>Interview Team Members (if applicable)</li></ul><h4>Other parts</h4><ul><li>Set Up a Version Control System</li><li>Analyze the Code Structure</li><li>Compile and Test the Application</li><li>Run a Code Linter and Formatter</li><li>Identify and Document Dependencies</li><li>Review Existing Issues and Bug Reports</li><li>Communicate with the Previous Developers</li><li>Incremental Refactoring</li><li>Implement Version Control Best Practices</li><li>Exploring projects ERD</li></ul><h3>Read the Documentation (If Available):</h3><p>The first step is to look for any available documentation. This could include high-level architectural diagrams, README files, or any inline code comments. Documentation can provide valuable insights into the project’s purpose, key components, and any peculiarities you need to be aware of.</p><p><strong>See if there is a documentation for the project. There are various ways to document a project:</strong></p><ul><li><a href="https://www.markdownguide.org/"><strong>README.MD</strong>:</a> it’s a file written in markdown language and most of the time it’s in the root directory of the project. <strong>For large projects</strong>, you will find a README.MD file with each folder that describes the functionality</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nx31WqYO2Y99Bm3FzUgSQA.jpeg" /></figure><ul><li><a href="https://insomnia.rest/"><strong>Insomnia:</strong></a><strong> </strong>is a collaborative open-source API development platform that makes it easy to build high-quality APIs — without the bloat and clutter of other tools.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lhRb4bIN6KwO-nXosklQ1A.jpeg" /></figure><ul><li><a href="https://www.postman.com/"><strong>Postman:</strong></a> is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs — faster.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*C0Sg3m9JMCtUWyA1F3sohg.jpeg" /></figure><ul><li><a href="https://swagger.io/"><strong>Swagger:</strong></a> API Development for Everyone. Simplify API development for users, teams, and enterprises with the <strong>Swagger</strong> open source and professional toolset.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YUQ81iNxthGE3cgtEb5fJg.jpeg" /></figure><ul><li><a href="https://jsdoc.app/"><strong>JsDoc</strong></a>: JSDoc is a documentation standard for JavaScript code, enabling developers to provide clear and structured documentation comments to improve code understanding and maintainability. It helps in generating documentation, providing valuable insights for both code consumers and collaborators.</li><li><a href="https://tsdoc.org/"><strong>TsDoc</strong></a>: TSDoc is a proposal to standardize the doc comments used in <a href="http://www.typescriptlang.org/">TypeScript</a> code so that different tools can extract content without getting confused by each other’s markup.</li></ul><figure><img alt="Example about jsdocs and ts docs" src="https://cdn-images-1.medium.com/max/1024/1*VTT9CeR_AX_IYAZxVMDfDA.png" /></figure><ul><li><a href="https://www.geeksforgeeks.org/python-docstrings/"><strong>Doc string</strong></a>: When it comes to writing clean, well-documented code, Python developers have a secret weapon at their disposal — docstrings. Docstrings, short for documentation strings, are vital in conveying the purpose and functionality of<a href="https://www.geeksforgeeks.org/python-programming-language/"> Python</a> functions, modules, and classes.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ayn5kTdTu500Mp-t37P4KA.png" /></figure><ul><li><strong>Comments</strong>: Comments in code serve as explanatory notes that are not executed but help developers understand the code’s logic, purpose, and functionality. They enhance code readability and facilitate collaboration, making it easier to maintain and debug software.</li><li><strong>Issue and Task Tracking</strong>: Many development teams use issue tracking systems (e.g., Jira, GitHub Issues) to document and manage tasks, bugs, and feature requests. These systems provide a centralized place to document project-related discussions and decisions.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WMVNJB1kGZIUTXSYEz_gRQ.jpeg" /></figure><ul><li><strong>Code Comments for Design Patterns</strong>: If your code uses specific design patterns, document them in code comments to explain why and how the patterns are implemented because juniors or even mid-developers will find it hard to identify the implemented design pattern from the code. Telling them explicitly will make it easier for them to grasp the code faster.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A_QkHLjQdUi0AdgARUsdJg.png" /></figure><ul><li><strong>Changelogs and releases</strong>: Maintaining a changelog helps users and developers keep track of what has been added, changed, or fixed in each version of the project. Changelogs typically include version numbers, release dates, and descriptions of changes.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Y49AltFJ0-jWx85rW5Iu1w.jpeg" /></figure><ul><li><strong>Wiki Pages</strong>: Some code hosting platforms, like GitHub, provide built-in wikis where you can create detailed documentation pages for your project. These pages can include project descriptions, architecture overviews, and usage guides.</li></ul><figure><img alt="wiki page for go lang" src="https://cdn-images-1.medium.com/max/1024/1*2nCLJZO9VsRk857tpZg_hg.jpeg" /></figure><ul><li>If you don’t find any of these options then you should try to refactor the project and start by adding comments to the project this will help future developers to understand the project and it’s a plus to you since you will understand the project</li></ul><h3>Identify the Main Entry Points</h3><p>Start by identifying the main entry points of the application, such as the main method or the first page that loads. Understanding how the application starts can help you trace its execution flow.</p><h3>Interview Team Members (if applicable)</h3><p>If you’re not the sole developer, talk to team members who have worked on the project. They can provide valuable context and insights.</p><p>Part 2 is coming soon😇</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a46884d64532" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Boosting Node.js Development: Embracing Vite Over Nodemon]]></title>
            <link>https://losefor.medium.com/boosting-node-js-development-embracing-vite-over-nodemon-c5af78a476b1?source=rss-f5ee9b40226d------2</link>
            <guid isPermaLink="false">https://medium.com/p/c5af78a476b1</guid>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[vitejs]]></category>
            <category><![CDATA[nestjs]]></category>
            <category><![CDATA[expressjs]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Mohammed Paqer]]></dc:creator>
            <pubDate>Thu, 19 Oct 2023 11:44:04 GMT</pubDate>
            <atom:updated>2023-10-19T11:44:43.559Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NduKYYVNNaW4DoAvEwRcZA.jpeg" /></figure><p>In the ever-evolving landscape of web development, choosing the right tools can significantly impact the efficiency and speed of your project. While Nodemon has long been a reliable companion for Node.js developers, a new contender, Vite, has emerged with compelling features that can revolutionize the development experience. In this article, we will explore why embracing Vite over Nodemon can bring about substantial improvements to your Node.js application development workflow.</p><h4>1. Lightning-Fast Development with Vite:</h4><p>One of the standout features of Vite is its lightning-fast development server. Unlike traditional bundlers, Vite leverages native ES module imports, resulting in near-instantaneous hot module replacement (HMR). This translates to a development experience where changes reflect in the browser almost as soon as you hit save. The speed at which Vite handles module replacement can significantly reduce development cycles, leading to increased productivity and a more enjoyable coding experience.</p><h4>2. Optimized Builds for Production:</h4><p>While Nodemon is primarily focused on runtime file monitoring and automatic server restarts, Vite goes a step further by offering optimized builds for production. Vite’s build process is designed to be fast and efficient, taking advantage of modern bundling techniques. By embracing Vite, you not only enhance your <strong>development experience</strong> but also ensure that your production builds are <strong>optimized for performance.</strong></p><h4>3. Modern Plugin System:</h4><p>Vite has a powerful plugin system that allows developers to extend its functionality. This flexibility enables you to tailor Vite to suit the specific requirements of your project. Whether you need custom build processes, integration with other tools, or specialized features, Vite’s plugin system provides a robust foundation for customization.</p><h4>5. Community Support and Active Development:</h4><p>Vite benefits from a growing community and active development. With contributors continually improving and expanding its capabilities, Vite is poised to remain at the forefront of modern web development tools. Being part of a vibrant community ensures that you have access to resources, plugins, and solutions to challenges that may arise during development.</p><h3>How to use Vite with node js</h3><p>To integrate vite with node js we need a plugin called vite-plugin-node which supports <strong>Express</strong>, <strong>Fastify</strong>, <strong>Koa</strong>, and <strong>Nest</strong> out of the box</p><h4>How to integrate Vite</h4><ol><li>Install Vite and this plugin with your favorite package manager, use npm as an example:</li></ol><pre>npm install vite vite-plugin-node -D</pre><p>2. Create a vite.config.ts file in your project root to config vite to use this plugin:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Iy10uCL7W8YnuBqe3XB-iQ.png" /></figure><h4>Integrate Vite with express</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BgUxNME1JPcIcvee2snZdQ.png" /></figure><h4>Integrate Vite with Nest</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wudb3FesV5sU_RBrWOBQCQ.png" /></figure><h4>Other recipes:</h4><p><a href="https://www.npmjs.com/package/vite-plugin-node/v/3.0.2#more-examples">recipes link on NPM</a></p><h3>Conclusion:</h3><p>In the dynamic world of web development, choosing the right tools can make all the difference. While Nodemon has served as a stalwart companion for Node.js developers, the advent of Vite brings a new level of speed, efficiency, and modernity to the table. By adapting Vite over Nodemon, you not only supercharge your development experience but also position your project to take advantage of the latest advancements in the ecosystem. As the web development landscape continues to evolve, embracing tools like Vite becomes not just a choice but a strategic move towards a more streamlined and efficient development process.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c5af78a476b1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Limitations of Prisma as an ORM for Analytics]]></title>
            <link>https://losefor.medium.com/the-limitations-of-prisma-as-an-orm-for-analytics-228cb91d9eed?source=rss-f5ee9b40226d------2</link>
            <guid isPermaLink="false">https://medium.com/p/228cb91d9eed</guid>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[sql]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[prisma]]></category>
            <dc:creator><![CDATA[Mohammed Paqer]]></dc:creator>
            <pubDate>Sun, 15 Oct 2023 14:00:17 GMT</pubDate>
            <atom:updated>2023-10-16T05:20:08.747Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bIXDG5ZcvTCtjQ5HCNo5vA.png" /></figure><p>In recent years, Prisma has gained popularity as an Object-Relational Mapping (ORM) tool, providing developers an efficient and intuitive way to interact with databases. While Prisma is well-suited for many applications, there may be better choices when creating analytics solutions. In this article, we will explore the limitations of Prisma in the context of analytics and highlight why alternative solutions may be more appropriate.</p><p>While Prisma’s engine is crafted in <strong>Rust</strong>, a language lauded for its performance and safety features, the efficiency and speed of queries are not solely determined by the underlying language. The crux lies in the <strong>implementation of the process that translates Object-Relational Mapping (ORM) queries into SQL statements</strong>. Prisma, despite its Rust foundation, faces challenges in this crucial aspect. Proficiency in transforming queries is pivotal for optimizing database interactions. If Prisma falters in this transition from ORM to SQL, it can undermine the overall performance, rendering the touted advantages of Rust less impactful in practice. Therefore, the success of a database engine is contingent not only on the choice of language but also on the adeptness in query transformation, an area where <strong>Prisma may need refinement.</strong></p><h3>Performance Concerns</h3><p>Prisma excels in generating optimized queries for common CRUD operations. For straightforward database interactions, the generated SQL queries are often efficient. <strong>However, the optimization might vary when dealing with complex queries or large datasets.</strong></p><h3>Lack of basic SQL features when it comes to analytics</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SN-HL6vpLUeBW2xk3j6YIQ.png" /></figure><p>In the above example, I group by the order state to aggregate info about the order in a specific state what makes Prisma stupid is that it does not support <strong>include</strong> or <strong>select</strong> to get the name of the state id</p><h4>Bad and fast solution</h4><p>To solve this problem I need to make requests on the DB to fetch the state&#39;s name which will be pricy if the DB provider accounts the IO to the DB. Reducing the IO to the DB could result in fewer monthly payments by thousands of dollars</p><h4>Good but time-consuming solution (MUST)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*e6e0BLrTN8aZ5pHYWPCMAw.png" /></figure><p>the best solution is to rewrite the function in raw SQL. which will be very efficient and in one call to the DB.</p><blockquote>Badly even Prisma client <strong>$queryRaw </strong>is not optimized and dummy sometimes you write valid SQL queries but they don&#39;t execute</blockquote><blockquote>the best solution is to rewrite everything in raw SQL and <strong>not use Prisma </strong>you could use the pg library for interacting with PostgreSQL DB for example</blockquote><h3>Fake type safety</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*H8ZqeWzgIpZfo98N9_YJCA.png" /></figure><p>Prisma may support a lot of type safety but this kind of type safety is misleading and make you encounter a lot of problems at the run time.</p><p>even if the file is written in 1TS and all the required interfaces and types are generated the TS compiler wouldn&#39;t complain about the distinct argument not existing on the <strong>count function </strong>And an exception will be thrown at the run time</p><h3>The caveats lot of include and select statements</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sHrPeelhJWORzh_gxOHePg.png" /></figure><p>Prisma’s approach to database interactions can have ramifications on the Input/Output (IO) performance of the underlying database provider. Unlike some database engines that optimize queries for efficiency, Prisma may make multiple calls to the database for join operations, rather than executing a single comprehensive query. This choice can potentially lead to increased IO demands, particularly when dealing with numerous requests simultaneously. In scenarios where tens or hundreds of requests are made concurrently, the cumulative effect of multiple individual queries can strain the database’s resources, resulting in slower response times and a potential increase in costs for the database provider. The challenge lies not only in the volume of queries but also in the fragmented nature of these requests. Optimizing the orchestration of joins and refining the query execution strategy could be areas where Prisma might benefit from improvement to mitigate the impact on database IO and enhance overall performance.</p><h3>Conclusion</h3><p>In conclusion, while Prisma presents itself as a promising database toolkit with the efficiency of Rust underpinning its engine, caution is advised when considering its integration into substantial projects. The potential IO strain caused by multiple database calls, especially in scenarios involving intricate join operations and concurrent requests, may pose challenges for scalability and performance optimization. In more extensive and resource-intensive projects, where database efficiency is paramount, alternative solutions with a proven track record of handling complex queries and large-scale operations might be more prudent. It’s essential to weigh the advantages of Prisma against the specific demands of a project and consider alternatives that align more seamlessly with the scalability and performance requirements of substantial endeavors.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=228cb91d9eed" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Streamlining Agile: Enhancing Sprint Management with the .sprint File]]></title>
            <link>https://losefor.medium.com/streamlining-agile-enhancing-sprint-management-with-the-sprint-file-7e8b36cb378a?source=rss-f5ee9b40226d------2</link>
            <guid isPermaLink="false">https://medium.com/p/7e8b36cb378a</guid>
            <category><![CDATA[github]]></category>
            <category><![CDATA[scrum]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[git]]></category>
            <dc:creator><![CDATA[Mohammed Paqer]]></dc:creator>
            <pubDate>Sat, 09 Sep 2023 09:29:30 GMT</pubDate>
            <atom:updated>2023-09-09T11:34:45.254Z</atom:updated>
            <content:encoded><![CDATA[<h3>Streamlining Agile: Enhancing Sprint Management with the .sprint File</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5pRNKVif38u5kt0dOGdoAw.png" /></figure><p>Effective project management in software development relies on clear and well-defined processes. One of these processes is sprint planning, which plays a crucial role in Agile methodologies like Scrum. To enhance sprint management and improve the organization of your development cycle, you can create a .sprint file to mark the start of each new sprint. In this article, we&#39;ll explore the benefits of using a .sprint file and guide you through its creation and usage.</p><h3>Why Use a .sprint File?</h3><ol><li><strong>Visibility and Clarity: </strong>A .sprint file serves as a clear indicator of when a new sprint begins. Team members can easily identify the start of a sprint by checking the file&#39;s timestamp or content.</li><li><strong>Automation: </strong>You can automate various processes based on the presence or content of the .sprint file. For example, you could trigger notifications, initiate automated testing, or update project management tools like JIRA or Trello.</li><li><strong>Documentation:</strong> The .sprint file acts as documentation for your project&#39;s sprint history. It provides a record of when each sprint started, helping you analyze past performance and identify trends.</li></ol><h3>Creating the .sprint File</h3><p>To create a .sprint file, follow these steps:</p><ol><li><strong>Choose a Naming Convention:</strong> Decide on a naming convention for your .sprint file. For example, you might use .sprint-01, .sprint-02, or .sprint-september-2023.</li><li><strong>Select a File Format:</strong> You can create the .sprint file in various formats, such as plain text, JSON, or YAML. The choice depends on your team&#39;s preferences and the tools you plan to integrate.</li><li><strong>Determine File Location:</strong> Decide where the .sprint file should reside within your project repository. A common location is the project&#39;s <strong>root directory</strong>.</li><li><strong>Populate the File:</strong> Add relevant information to the .sprint file, such as the start date, end date, sprint goals, and any additional notes. Here&#39;s an example in YAML format (For me I use YAML because it’s easier to read):</li></ol><pre>start_date: &quot;2023-09-01&quot;<br>end_date: &quot;2023-09-14&quot;<br>goals: &quot;Complete user authentication module, refactor database schema, and optimize API endpoints.&quot;<br>notes: &quot;Team members are encouraged to focus on code quality and conduct code reviews during this sprint.&quot;</pre><blockquote>something that needs to be considered is that this file should only be edited at the start of a <strong>new sprint</strong></blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7e8b36cb378a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Advanced Typescript: Mastering Exhaustive Checks in TS Ensuring Robust Code Coverage]]></title>
            <link>https://blog.stackademic.com/advanced-typescript-mastering-exhaustive-checks-in-ts-ensuring-robust-code-coverage-14a8bd9ea9e3?source=rss-f5ee9b40226d------2</link>
            <guid isPermaLink="false">https://medium.com/p/14a8bd9ea9e3</guid>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[Mohammed Paqer]]></dc:creator>
            <pubDate>Wed, 06 Sep 2023 16:49:37 GMT</pubDate>
            <atom:updated>2023-09-10T13:27:45.556Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jOQgsC3HMEQ7pNiWCmeE0A.png" /></figure><h3>What are Exhaustive Checks?</h3><p>In TypeScript, “exhaustive checks” refer to ensuring that you’ve covered all possible cases or values when working with data. Imagine you have a variable that can have different values, like the days of the week. An exhaustive check would mean you’ve accounted for every day (Monday, Tuesday, Wednesday, etc.) in your code, leaving no possibility unhandled.</p><p>For example, if you’re using a switch statement to handle different cases based on a variable&#39;s value, TypeScript wants you to make sure you&#39;ve covered every potential value that variable can take. If you miss a case, TypeScript will warn you because your check isn&#39;t exhaustive – there&#39;s a possibility you haven&#39;t considered.</p><p>So, in TypeScript, an exhaustive check means you’ve accounted for all possible values of a variable to avoid unexpected and unhandled scenarios in your code. It’s like making sure you’ve covered all the bases to prevent surprises.</p><h3>Why I’m writing this article?</h3><p>Because Typescript doesn’t have this feature be default and it’s tricky to implement for now <strong>TS</strong> does not show any error at compile time and doesn’t tell us if we missed catching a value only at run time. So lets see how to implement this trick.</p><h4>1- You will need to create a function we will call it “assertNever”</h4><pre>export const assertNever = (value: never): never =&gt; {<br>  throw new Error(`Unexpected value ${value}`);<br>};</pre><p>this function expects no value will reach it if any value passes to it’s argument TS will fire an error at compile time telling us that that value is not assignable to type never like this error</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ffL011c30zuMAoWeHE8OSg.png" /></figure><h4>2- How to use this function?</h4><p>In one of the use cases we need to make sure that we catch all the possible cases and we will use the <strong>assertNever </strong>in the default part of our switch statement</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*70eiPrYOrQQtSXCqnmBTyQ.png" /></figure><p>Of course, this is not only for switch statements it’s for any where in your project that you need to check if you used all possible values of a variable</p><h4>3- Finally test our implementation</h4><p>If we don’t catch on of the cases an error will be thrown at compile time Thanks to our <strong>assertNever</strong> function without it no error will be shown and we might have unexpected behavior at run time</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*plcl2iZ1YQ1Mlv8WgKl4xQ.png" /></figure><p>Thanks for reading 😇</p><h3>Stackademic</h3><p><em>Thank you for reading until the end. Before you go:</em></p><ul><li><em>Please consider </em><strong><em>clapping</em></strong><em> and </em><strong><em>following</em></strong><em> the writer! 👏</em></li><li><em>Following us on </em><a href="https://twitter.com/stackademichq"><strong><em>Twitter(X</em></strong>)</a>, <a href="https://www.linkedin.com/company/stackademic"><strong><em>LinkedIn</em></strong></a>, and <a href="https://www.youtube.com/c/stackademic"><strong><em>YouTube</em></strong></a><strong><em>.</em></strong></li><li><em>Visiting </em><a href="http://stackademic.com/"><strong><em>Stackademic.com</em></strong></a><em> to find out more about how we are democratizing free programming education around the world.</em></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=14a8bd9ea9e3" width="1" height="1" alt=""><hr><p><a href="https://blog.stackademic.com/advanced-typescript-mastering-exhaustive-checks-in-ts-ensuring-robust-code-coverage-14a8bd9ea9e3">Advanced Typescript: Mastering Exhaustive Checks in TS Ensuring Robust Code Coverage</a> was originally published in <a href="https://blog.stackademic.com/">Stackademic</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>