<?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>Imthiaz Blog</title>
	<atom:link href="https://www.imthi.com/feed" rel="self" type="application/rss+xml" />
	<link>https://www.imthi.com</link>
	<description>me and stupid works....!!!</description>
	<lastBuildDate>Sat, 11 Jan 2025 06:51:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>

<image>
	<url>https://www.imthi.com/wp-content/uploads/2024/12/cropped-IRLogo-Small-32x32.jpg</url>
	<title>Imthiaz Blog</title>
	<link>https://www.imthi.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>“From Domains to Dreams: My Quest to Build Something Real”</title>
		<link>https://www.imthi.com/blog/personal/from-domains-to-dreams-my-quest-to-build-something-real.php</link>
					<comments>https://www.imthi.com/blog/personal/from-domains-to-dreams-my-quest-to-build-something-real.php#respond</comments>
		
		<dc:creator><![CDATA[Imthiaz]]></dc:creator>
		<pubDate>Sat, 11 Jan 2025 06:43:18 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[Desert Dreams]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[strapi]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[website]]></category>
		<guid isPermaLink="false">https://www.imthi.com/?p=3935</guid>

					<description><![CDATA[For years, I’ve nurtured a peculiar habit. I’d get struck by a brilliant flash of an idea, and&#8230;]]></description>
										<content:encoded><![CDATA[
<p>For years, I’ve nurtured a peculiar habit. I’d get struck by a brilliant flash of an idea, and my immediate reaction would be, “I need a domain name for this!” So, off I’d go, diving headfirst into hours (sometimes days) of searching for the <em>perfect</em> domain. To me, a domain name isn’t just a name—it’s the essence of the project, the digital equivalent of naming your child. </p>



<p>Once I bag the domain, the next phase begins: <em>The Tech Stack Dilemma<img src="https://s.w.org/images/core/emoji/16.0.1/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /></em>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading"><strong>The Tech Stack Tug-of-War</strong></h4>



<p><strong>PHP – Symfony / Laravel</strong></p>



<p>I’m a PHP loyalist at heart, having been around these frameworks since their inception. They’re like old friends—reliable, comfortable, and always there to welcome you back with open arms.</p>



<p><strong>Node.js – Too Many Choices, Too Little Patience</strong></p>



<p>Enter Node.js, and suddenly, it’s like walking into an ice cream parlor with 500 flavors. Every framework promises to be “the best.” After Googling for what feels like a geological epoch, I finally settle on one, only to realize I need a crash course because I haven’t touched it in ages. And let’s be honest, learning a framework at 40+ isn’t the same as binge-watching <em>Stranger Things</em>. Those tutorial videos? They’re the real sleeping pills.</p>



<p><strong>GoLang, Rust, Python &#8230;.. Ruby – I don&#8217;t even want to talk about it </strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading"><strong>The Database Drama</strong></h4>



<p>Now comes the database conundrum: MySQL? PostgreSQL? Or should I venture into the mystical land of object databases? Sure, I want scalability, performance, and low cost, but why does it feel like choosing between a Honda, a Tesla, and a spaceship?</p>



<p>And don’t get me started on scaling databases. It’s expensive, and the last thing I want is a system that folds like a lawn chair the moment it faces heavy traffic.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading"><strong>The Architectural Chaos</strong></h4>



<p>Microservices or monolith?</p>



<p>CDN or local storage?</p>



<p>RabbitMQ, SQS, or a good ol’ prayer?</p>



<p>The options are endless, and my head feels like it’s running AWS EventBridge 24/7. Over the years, I’ve leaned heavily on AWS—it’s my comfort zone, even if my wallet winces every time I say “S3.” These services <em>just work</em>. But the endless possibilities often paralyze me, leaving my “brilliant idea” stuck in a mental loop.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading"><strong>The Sad Truth: Dream Domains, Dormant Ideas</strong></h4>



<p>By now, you’ve probably guessed the outcome. I end up buying a domain, planning the architecture in my head, and… that’s it. The project gets buried under the weight of day-to-day work, only to resurface as a fleeting thought months later. Meanwhile, the domain renews like clockwork, adding to my graveyard of unused URLs.</p>



<p>Typical Pisces behavior, right? Big dreams, minimal execution.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading"><strong>A New Year, A New Approach</strong></h4>



<p>But this year, I’ve decided to dig up one of those long-forgotten ideas. Of course, the cycle began again—domain bought, tech stack debated, paralysis ensued. After 10 days of spinning my wheels, frustration hit, and I finally had an epiphany:</p>



<h2 class="wp-block-heading has-text-align-center"><strong>KISS—Keep It Simple, Stupid.</strong></h2>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="896" height="512" src="https://www.imthi.com/wp-content/uploads/2025/01/Keep-It-Simple.jpg" alt="" class="wp-image-3940" srcset="https://www.imthi.com/wp-content/uploads/2025/01/Keep-It-Simple.jpg 896w, https://www.imthi.com/wp-content/uploads/2025/01/Keep-It-Simple-300x171.jpg 300w, https://www.imthi.com/wp-content/uploads/2025/01/Keep-It-Simple-768x439.jpg 768w, https://www.imthi.com/wp-content/uploads/2025/01/Keep-It-Simple-400x229.jpg 400w, https://www.imthi.com/wp-content/uploads/2025/01/Keep-It-Simple-800x457.jpg 800w, https://www.imthi.com/wp-content/uploads/2025/01/Keep-It-Simple-832x475.jpg 832w" sizes="(max-width: 896px) 100vw, 896px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading"><strong>Enter Strapi: The Chosen One</strong></h4>



<p>Lately, I’ve been working with Strapi, a headless CMS that feels like it was designed just for procrastinators like me. It’s intuitive, comes with prebuilt content management features, and lets me focus on the fun stuff without reinventing the wheel. With proper caching and scaling, Strapi can handle serious data loads, but I’ll cross that bridge when (if) I get there.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading"><strong>Learning to Let Go</strong></h4>



<p>Historically, I’ve been a control freak—every line of code, every feature had to be <em>mine</em>. But this obsession has been a massive roadblock. Recently, a conversation with someone inspiring shifted my perspective. Sometimes, you don’t need to control everything; you just need to start.</p>



<p>So here I am, starting again. This time, I’m letting go of perfectionism and focusing on progress.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>The Plan</strong></h3>



<p>As part of this journey, I’m committing to keeping this blog alive with updates every two weeks. This is my way of holding myself accountable. Even if I can only work on the project during my free time, I’ll share what I learn, the mistakes I make, and (hopefully) the wins I achieve.</p>



<p>Because at the end of the day, unfinished projects and dormant domains are part of the creative process. And who knows? Maybe one of these ideas will finally take flight.</p>



<p>The new projects first version I am planning call it &#8220;Desert Dreams&#8221;. You can follow the tag if you are interested.</p>



<p>Stay tuned. Or don’t. The domain’s already renewed, so it’s not going anywhere. <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f605.png" alt="😅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.imthi.com/blog/personal/from-domains-to-dreams-my-quest-to-build-something-real.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ScraperAPI: Effortlessly Scrape Websites Without Getting Blocked</title>
		<link>https://www.imthi.com/blog/products/scraperapi-effortlessly-scrape-websites-without-getting-blocked.php</link>
					<comments>https://www.imthi.com/blog/products/scraperapi-effortlessly-scrape-websites-without-getting-blocked.php#respond</comments>
		
		<dc:creator><![CDATA[Imthiaz]]></dc:creator>
		<pubDate>Thu, 02 Jan 2025 18:14:56 +0000</pubDate>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[website]]></category>
		<guid isPermaLink="false">https://www.imthi.com/?p=3929</guid>

					<description><![CDATA[When I was tasked with scraping data from a website with thousands of pages for training an AI&#8230;]]></description>
										<content:encoded><![CDATA[
<p>When I was tasked with scraping data from a website with thousands of pages for training an AI bot, I quickly realized the challenges of large-scale web scraping. Initially, I attempted to manually download the HTML pages, saving them locally and using DOM parsers to clean and extract the data. However, I soon hit a major roadblock: <strong>getting blocked by the website after scraping just a few pages</strong>.</p>



<p><strong>Initial Attempts and Challenges</strong></p>



<p>To bypass the blocks, I tried using a VPN with delays between requests. While this approach worked to some extent, the process was painfully slow and inefficient—it would’ve taken me an eternity to scrape all the required pages. Frustrated, I began exploring alternatives that could streamline the process without compromising results.</p>



<p><strong>Discovering ScraperAPI</strong></p>



<p>After testing several solutions, I found <strong><a href="https://www.scraperapi.com/?fp_ref=irafiq" target="_blank" rel="noreferrer noopener nofollow">ScraperAPI</a></strong>, and it was a game-changer! ScraperAPI simplifies web scraping by handling the complexities of proxies, IP rotation, and CAPTCHA-solving, ensuring uninterrupted access to the data.</p>



<p>I started with a <strong><a href="https://www.scraperapi.com/?fp_ref=irafiq" target="_blank" rel="noreferrer noopener nofollow">free ScraperAPI account</a></strong>, which offers 5,000 free units. The cost per unit varies based on the complexity of the request:</p>



<ul class="wp-block-list">
<li><strong>1 unit</strong> for basic requests.</li>



<li>Higher unit costs for advanced requests involving CAPTCHAs and bot protection.</li>
</ul>



<p>The free account allowed me to test its features thoroughly, and I was impressed with the results.</p>



<p><strong>Documentation and Support</strong></p>



<p>One standout feature of <a href="https://www.scraperapi.com/documentation?fp_ref=irafiq" target="_blank" rel="noreferrer noopener nofollow">ScraperAPI is its <strong>extensive documentation</strong></a>. The API is well-documented and includes scripts for multiple programming languages, making it easy for developers to integrate it into their workflows regardless of their preferred language or framework.</p>



<p><strong>Scaling Up: From Testing to Production</strong></p>



<p>Once satisfied with its performance, I <a href="https://www.scraperapi.com/pricing?fp_ref=irafiq" target="_blank" rel="noreferrer noopener nofollow">upgraded to a paid plan</a>. Using ScraperAPI, I successfully scraped over <strong>100,000 pages</strong> without a hitch. While the tool handles most anti-scraping measures automatically, I still implemented slight delays between requests as an extra precaution.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="623" src="https://www.imthi.com/wp-content/uploads/2025/01/ScraperAPIStats-1024x623.jpg" alt="" class="wp-image-3932" srcset="https://www.imthi.com/wp-content/uploads/2025/01/ScraperAPIStats-1024x623.jpg 1024w, https://www.imthi.com/wp-content/uploads/2025/01/ScraperAPIStats-300x183.jpg 300w, https://www.imthi.com/wp-content/uploads/2025/01/ScraperAPIStats-768x467.jpg 768w, https://www.imthi.com/wp-content/uploads/2025/01/ScraperAPIStats-400x243.jpg 400w, https://www.imthi.com/wp-content/uploads/2025/01/ScraperAPIStats-800x487.jpg 800w, https://www.imthi.com/wp-content/uploads/2025/01/ScraperAPIStats-832x506.jpg 832w, https://www.imthi.com/wp-content/uploads/2025/01/ScraperAPIStats.jpg 1160w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Why Choose ScraperAPI?</strong></p>



<p>Here’s why I recommend ScraperAPI for your scraping needs:</p>



<ul class="wp-block-list">
<li>1. <strong>Ease of Use</strong>: No need to manage proxies, IPs, or custom scripts—ScraperAPI does it all for you.</li>



<li><strong>Scalability</strong>: It’s perfect for projects ranging from small tasks to large-scale scraping operations.</li>



<li><strong>Reliability</strong>: With its robust infrastructure, it ensures minimal downtime and maximum efficiency.</li>



<li><strong>Documentation</strong>: The API is well-documented, with scripts available in multiple programming languages for seamless integration.</li>
</ul>



<p><strong>Start Your Scraping Journey</strong></p>



<p>If you’re struggling with web scraping or facing roadblocks like I did, <a href="https://www.scraperapi.com/signup?fp_ref=irafiq" target="_blank" rel="noreferrer noopener nofollow">give ScraperAPI a try</a>. It’s beginner-friendly, and the free units let you test it risk-free. If you decide to sign up using the links in this post, I’ll also receive a small referral bonus—a win-win for both of us!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.imthi.com/blog/products/scraperapi-effortlessly-scrape-websites-without-getting-blocked.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Simple Policy to Protect Your AWS SES SMTP User</title>
		<link>https://www.imthi.com/blog/cloud/simple-policy-to-protect-your-aws-ses-smtp-user.php</link>
					<comments>https://www.imthi.com/blog/cloud/simple-policy-to-protect-your-aws-ses-smtp-user.php#respond</comments>
		
		<dc:creator><![CDATA[Imthiaz]]></dc:creator>
		<pubDate>Thu, 02 Jan 2025 07:17:11 +0000</pubDate>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[Programming]]></category>
		<guid isPermaLink="false">https://www.imthi.com/?p=3925</guid>

					<description><![CDATA[AWS Simple Email Service (SES) is a powerful tool for sending emails, but it comes with a significant&#8230;]]></description>
										<content:encoded><![CDATA[
<p><br />AWS Simple Email Service (SES) is a powerful tool for sending emails, but it comes with a significant responsibility to secure your SES SMTP credentials. A compromised SMTP user can lead to misuse, such as sending spam or phishing emails, severely damaging your reputation and potentially getting your account flagged or banned.</p>



<p>Here are <strong>three common ways SES keys can be compromised</strong>, especially in team environments:</p>



<ul class="wp-block-list">
<li><strong>Poor protection of development devices</strong> – A compromised developer computer can expose sensitive credentials.</li>



<li><strong>Inadequate server hardening</strong> – Unsecured servers are prime targets for attackers.</li>



<li><strong>Accidental commits to version control</strong> – Sensitive .env files can inadvertently be pushed to repositories.</li>
</ul>



<p><br />To mitigate these risks, implement the following <strong>three simple policies</strong> to improve the security of your AWS SES SMTP user:</p>



<p><strong>1. Restrict Access to Specific Identities</strong></p>



<p>If your AWS account manages multiple identities (domains or email addresses), restrict the SES SMTP user to access only the required identity.</p>



<p><strong>Why?</strong> This ensures that even if the credentials are compromised, they cannot be used to send emails from other domains or addresses under your account.</p>



<p><strong>How to Implement:</strong></p>



<p>Use an IAM policy with the ses:SendEmail or ses:SendRawEmail actions, specifying the allowed identity:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: &#x5B;
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: &quot;ses:SendEmail&quot;,
            &quot;Resource&quot;: &quot;arn:aws:ses:us-east-1:123456789012:identity/example.com&quot;
        }
    ]
}
</pre></div>


<p><strong>2. Enforce a Specific “From” Address</strong></p>



<p>By default, if your identity is domain-validated, emails can be sent from any address within that domain. While flexible, this opens the door for abuse, such as spam or identity theft. Restricting the SES user to a single verified “From” address prevents misuse.</p>



<p><strong>How to Implement:</strong></p>



<p>Extend the IAM policy to include the ses:FromAddress condition key:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
{
    &quot;Effect&quot;: &quot;Allow&quot;,
    &quot;Action&quot;: &quot;ses:SendEmail&quot;,
    &quot;Resource&quot;: &quot;arn:aws:ses:us-east-1:123456789012:identity/example.com&quot;,
    &quot;Condition&quot;: {
        &quot;StringEquals&quot;: {
            &quot;ses:FromAddress&quot;: &quot;noreply@example.com&quot;
        }
    }
}
</pre></div>


<p><strong>3. Restrict Access to Trusted IPs</strong></p>



<p>Limit SES SMTP user access to the specific IP address(es) of your sending server. Even if the credentials are exposed, they cannot be used from unauthorized locations.</p>



<p><strong>Why?</strong> This adds an additional layer of security, ensuring the credentials work only from your trusted infrastructure.</p>



<p><strong>How to Implement:</strong></p>



<p>Use an IAM policy with the aws:SourceIp condition:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
{
    &quot;Effect&quot;: &quot;Allow&quot;,
    &quot;Action&quot;: &quot;ses:SendEmail&quot;,
    &quot;Resource&quot;: &quot;arn:aws:ses:us-east-1:123456789012:identity/example.com&quot;,
    &quot;Condition&quot;: {
        &quot;IpAddress&quot;: {
            &quot;aws:SourceIp&quot;: &quot;203.0.113.0/24&quot;
        }
    }
}
</pre></div>


<p><br />This policy combines restrictions for <strong>identity access</strong>, <strong>specific “From” address</strong>, and <strong>trusted IPs</strong> into one comprehensive configuration:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: &#x5B;
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: &quot;ses:SendEmail&quot;,
            &quot;Resource&quot;: &quot;arn:aws:ses:us-east-1:123456789012:identity/example.com&quot;,
            &quot;Condition&quot;: {
                &quot;StringEquals&quot;: {
                    &quot;ses:FromAddress&quot;: &quot;noreply@example.com&quot;
                },
                &quot;IpAddress&quot;: {
                    &quot;aws:SourceIp&quot;: &quot;203.0.113.0/24&quot;
                }
            }
        }
    ]
}
</pre></div>


<p><strong>How to Use</strong></p>



<p>1. Replace 123456789012 with your AWS account ID.</p>



<p>2. Replace example.com with your verified identity (domain or email address).</p>



<p>3. Replace noreply@example.com with your desired “From” email address.</p>



<p>4. Replace 203.0.113.0/24 with the IP address or CIDR block of your trusted servers.</p>



<p><strong>In Conclusion</strong></p>



<p>By implementing these policies, you can significantly reduce the risk of your SES SMTP credentials being misused. Regularly review and update your security practices to stay ahead of potential vulnerabilities. AWS provides powerful tools to safeguard your account – use them to your advantage.</p>



<p>Stay secure and email responsibly!</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.imthi.com/blog/cloud/simple-policy-to-protect-your-aws-ses-smtp-user.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>What Next? Enough with the Procrastination</title>
		<link>https://www.imthi.com/blog/personal/what-next-enough-with-the-procrastination.php</link>
					<comments>https://www.imthi.com/blog/personal/what-next-enough-with-the-procrastination.php#respond</comments>
		
		<dc:creator><![CDATA[Imthiaz]]></dc:creator>
		<pubDate>Tue, 31 Dec 2024 16:40:38 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[blog update]]></category>
		<category><![CDATA[travel]]></category>
		<guid isPermaLink="false">https://www.imthi.com/?p=3905</guid>

					<description><![CDATA[Since Covid-19 hit in 2020, life for most people has changed drastically. I’m no exception. My lifestyle has&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Since Covid-19 hit in 2020, life for most people has changed drastically. I’m no exception. My lifestyle has shifted, the way I work has evolved, and, honestly, I’ve become a 100% pure lazy bum.</p>



<p>I’ve reached the point where I feel like I’ve been slogging away in my comfort zone for far too long. Too much Netflix, endless social media scrolling, following crappy YouTube channels—it’s all piled up to a lifestyle that’s doing me no favors.</p>



<p>This year, I had the privilege of performing Umrah, and it was a wake-up call. It opened my eyes to just how much my health has deteriorated. I started to notice how many things I used to be excited about have faded away. It’s not that I’ve lost my spark—I haven’t—but I’ve been stuck in this cycle of pure, unproductive laziness.</p>



<p>Here are some of the changes I want to make (or force myself to make) this year:</p>



<ul class="wp-block-list">
<li><strong>Healthy Living</strong> – Be mindful of what I eat and start moving—whether it’s walking or hitting the gym.</li>



<li> <strong>Reading More</strong> – Rediscover the joy of books and meaningful learning.</li>



<li><strong>Exploring Business Intelligence</strong> – Dive deeper into BI and build expertise in this area.</li>



<li><strong>Harnessing the Power of AI</strong> – Learn some hardcore skills and truly understand what AI can do.</li>



<li><strong>Blogging Weekly</strong> – Post one article per week on my blog. I know blogs might not be as relevant anymore with GPT dominating the scene, but this is about keeping myself accountable and sharing the hacks and insights I come across in my work.</li>



<li><strong>Getting Back into IoT &amp; Low-Powered AI Engines</strong> – Reignite my passion for IoT and explore its integration with lightweight AI. </li>
</ul>



<p><br />Currently, I’m exploring Elastic Search, revisiting the platform after a long time. This is for one of our clients, where search plays an important role. I’ll be sharing some of my findings and insights in the coming weeks.</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.imthi.com/blog/personal/what-next-enough-with-the-procrastination.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Let&#8217;s Encrypt &#8211; Certbot 1.12 Manual DNS Verification</title>
		<link>https://www.imthi.com/blog/linux/lets-encrypt-certbot-1-12-manual-dns-verification.php</link>
		
		<dc:creator><![CDATA[Imthiaz]]></dc:creator>
		<pubDate>Wed, 03 Feb 2021 08:37:51 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://www.imthi.com/?p=3827</guid>

					<description><![CDATA[The new version of certbot have specific plugin for different DNS provider if want to validate your domain&#8230;]]></description>
										<content:encoded><![CDATA[
<p>The new version of certbot have specific plugin for different DNS provider if want to validate your domain based on DNS.  The only issues plugins are available only for popular dns managers and not for all of them. If you want to isssue a certficate you or other dns provides you can use the following command</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
certbot certonly --manual --preferred-challenges=dns -d example.com -d www.example.com

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Requesting a certificate for example.com and www.example.com
Performing the following challenges:
dns-01 challenge for example.com
dns-01 challenge for www.example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

KK8hK6K5nDW3tb3k0snA7457Nw5LJMk33-HQL3ITYNY

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.www.example.com with the following value:

0amX-L_XeiBAU2jCGj9UY0NKCgEJZOaa8mw3M1friHk

Before continuing, verify the record is deployed.
(This must be set up in addition to the previous challenges; do not remove,
replace, or undo the previous challenge tasks yet. Note that you might be
asked to create multiple distinct TXT records with the same name. This is
permitted by DNS standards.)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your certificate will expire on 2021-05-04. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run &quot;certbot renew&quot;
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let&#039;s Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

</pre></div>


<p>Please make sure you create those TXT records with the values given by the certbot. Once you make the dns update you will be able to generate the SSL certficates. </p>



<p>You can use the SSL private and certifcate in your vhost and configure it manually.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
&amp;lt;IfModule mod_ssl.c&gt;
&amp;lt;VirtualHost *:443&gt;
	ServerName example.com
	ServerAlias www.example.com

	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
	Include /etc/letsencrypt/options-ssl-apache.conf
&amp;lt;/VirtualHost&gt;
&amp;lt;/IfModule&gt;
</pre></div>


<p>Hope this helps <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Symfony 3.4 Cache Example</title>
		<link>https://www.imthi.com/blog/programming/symfony-3-4-cache-example.php</link>
		
		<dc:creator><![CDATA[Imthiaz]]></dc:creator>
		<pubDate>Fri, 07 Feb 2020 06:53:54 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[website]]></category>
		<guid isPermaLink="false">https://www.imthi.com/?p=3804</guid>

					<description><![CDATA[Symfony has a very powerful built-in caching. You can use it directly by calling the default app cache&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Symfony has a very powerful built-in caching. You can use it directly by calling the default app cache and use it.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
use Symfony\Component\Cache\Adapter\FilesystemAdapter;

//....

function getCachedData()
{

    /**
     * @var FilesystemAdapter $cache
     */
    $cache = $this-&gt;get(&#039;cache.app&#039;);

    //Define a key for the item
    $cacheKey = &#039;SOME_UNIQUE_KEY&#039;;

    //Fetch the cached item from the cache
    $cacheItem = $cache-&gt;getItem($cacheKey);

    //Check if the cache is present and is still valid.
    if ($cacheItem-&gt;isHit()) {
        //Get the cached value and return
        $data = $cache-&gt;getItem($cacheKey)-&gt;get();
        return $data;
    }

    //Since there is no cache available you can prepare the data
    $data = &#x5B;10,20,30];

    //Set the data to cache object
    $cacheItem-&gt;set($data);

    //You can set an expire time if you need.
    //Below I have set the cache to 1 hour.
    $cacheItem-&gt;expiresAfter(60 * 60);

    //Save the cache
    $cache-&gt;save($cacheItem);

    //Return the data
    return $data;
}

//....
</pre></div>


<p>You can use this a lot in your application in places where you access databases or accessing the web services. </p>



<p>Have a great day 😊</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A perfect website with a perfect page score.</title>
		<link>https://www.imthi.com/blog/web/a-perfect-website-with-a-perfect-page-score.php</link>
		
		<dc:creator><![CDATA[Imthiaz]]></dc:creator>
		<pubDate>Sat, 19 Oct 2019 08:14:28 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[website]]></category>
		<guid isPermaLink="false">https://www.imthi.com/?p=3794</guid>

					<description><![CDATA[Yesterday my colleague Dominick shared this website. I totally understand the frustration of the author of the website.&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Yesterday my colleague Dominick shared this website. I totally understand the frustration of the author of the website. </p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-13 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image"><a href="https://cdn.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Mobile.jpg"><img decoding="async" width="1024" height="584" data-id="3797" src="https://cdn.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Mobile-1024x584.jpg" alt="" class="wp-image-3797" srcset="https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Mobile-1024x584.jpg 1024w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Mobile-300x171.jpg 300w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Mobile-768x438.jpg 768w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Mobile-100x57.jpg 100w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Mobile-700x399.jpg 700w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Mobile.jpg 1438w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image"><a href="https://cdn.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Desktop.jpg"><img loading="lazy" decoding="async" width="1024" height="588" data-id="3798" src="https://cdn.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Desktop-1024x588.jpg" alt="" class="wp-image-3798" srcset="https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Desktop-1024x588.jpg 1024w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Desktop-300x172.jpg 300w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Desktop-768x441.jpg 768w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Desktop-100x57.jpg 100w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Desktop-700x402.jpg 700w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-Google-Page-Speed-Desktop.jpg 1432w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image"><a href="https://cdn.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-GTMetrix.jpg"><img loading="lazy" decoding="async" width="940" height="1024" data-id="3796" src="https://cdn.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-GTMetrix-940x1024.jpg" alt="" class="wp-image-3796" srcset="https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-GTMetrix-940x1024.jpg 940w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-GTMetrix-275x300.jpg 275w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-GTMetrix-768x836.jpg 768w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-GTMetrix-92x100.jpg 92w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-GTMetrix-413x450.jpg 413w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-GTMetrix-1102x1200.jpg 1102w, https://www.imthi.com/wp-content/uploads/2019/10/Perfect-Score-on-GTMetrix.jpg 1324w" sizes="auto, (max-width: 940px) 100vw, 940px" /></a></figure>
</figure>



<p>This website is dedicated to all the developers who struggle to achieve the best score for their website. The best line I love about the site is below.. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8220;Good design is as little design as possible.&#8221;</p>
<cite>&#8211; some German motherfucker</cite></blockquote>



<p>Please visit the website <a href="https://motherfuckingwebsite.com/.">https://motherfuckingwebsite.com/</a> and post your comments if you agree with me. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Yislamoo &#8211; Modern Arabic Art Gallery</title>
		<link>https://www.imthi.com/blog/dubai/yislamoo-modern-arabic-art-gallery.php</link>
		
		<dc:creator><![CDATA[Imthiaz]]></dc:creator>
		<pubDate>Mon, 01 Oct 2018 07:57:38 +0000</pubDate>
				<category><![CDATA[Dubai]]></category>
		<category><![CDATA[UAE]]></category>
		<guid isPermaLink="false">https://www.imthi.com/?p=3730</guid>

					<description><![CDATA[Yislamoo celebrates beautiful Arabia. Yislamoo brings you Modern Art Prints Designed by Some of the Best Artists and&#8230;]]></description>
										<content:encoded><![CDATA[
<p></p>



<p>Yislamoo celebrates beautiful Arabia. Yislamoo brings you Modern Art Prints Designed by Some of the Best Artists and Calligraphers. Memorable pieces you won&#8217;t find anywhere else! Yislamoo hopes to reach every home and heart in this region and beyond.</p>



<p>Check out their <a href="https://yislamoo.com/collections/arabic-art" target="_blank" rel="noopener">Modern Arabic Art Gallery</a> today and order your favourite one!</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Thanks to GDPR companies are too smart these days</title>
		<link>https://www.imthi.com/blog/dubai/thanks-to-gdpr-companies-are-too-smart-these-days.php</link>
		
		<dc:creator><![CDATA[Imthiaz]]></dc:creator>
		<pubDate>Sun, 15 Jul 2018 09:35:55 +0000</pubDate>
				<category><![CDATA[Dubai]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[Real Estate]]></category>
		<guid isPermaLink="false">https://www.imthi.com/?p=3705</guid>

					<description><![CDATA[Today I received a newsletter from a real estate company based in Dubai. They are sending about a&#8230;]]></description>
										<content:encoded><![CDATA[<p>Today I received a newsletter from a real estate company based in Dubai. They are sending about a property in the UK for sale.</p>
<p>As I was not interested in the newsletter so I want to remove myself from the subscription and in the footer I read this note.</p>
<blockquote><p>This email is intended only for international investors outside of the UK.</p></blockquote>
<p>What does this mean? People, who are outside UK cannot get unsubscription link? People outside UK does not care about privacy?</p>
<p>I don&#8217;t remember visiting this company website or their office to inquire about property&#8230; So how did they get my email address? How did they add me to a newsletter subscription?</p>
<p>Email Campaign Online Link &#8211; https://www.selectproperty.com/emx/3rd-parties/cs2/launch/gcc/july/bayt/</p>
<p>In case they delete the change the contents <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><a class="lightbox" href="https://www.imthi.com/wp-content/uploads/2018/07/screencapture-selectproperty-emx-3rd-parties-cs2-launch-gcc-july-bayt-2018-07-15-13_26_19.jpg"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-3706" src="https://www.imthi.com/wp-content/uploads/2018/07/screencapture-selectproperty-emx-3rd-parties-cs2-launch-gcc-july-bayt-2018-07-15-13_26_19-113x300.jpg" alt="" width="113" height="300" srcset="https://www.imthi.com/wp-content/uploads/2018/07/screencapture-selectproperty-emx-3rd-parties-cs2-launch-gcc-july-bayt-2018-07-15-13_26_19-113x300.jpg 113w, https://www.imthi.com/wp-content/uploads/2018/07/screencapture-selectproperty-emx-3rd-parties-cs2-launch-gcc-july-bayt-2018-07-15-13_26_19-387x1024.jpg 387w, https://www.imthi.com/wp-content/uploads/2018/07/screencapture-selectproperty-emx-3rd-parties-cs2-launch-gcc-july-bayt-2018-07-15-13_26_19.jpg 655w" sizes="auto, (max-width: 113px) 100vw, 113px" /></a></p>
<p>Very rude <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f621.png" alt="😡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Symfony Doctrine Many to Many Relationship (ManyToMany)</title>
		<link>https://www.imthi.com/blog/programming/symfony-doctrine-many-to-many-relationship-manytomany.php</link>
		
		<dc:creator><![CDATA[Imthiaz]]></dc:creator>
		<pubDate>Tue, 24 Apr 2018 09:33:59 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://www.imthi.com/?p=3696</guid>

					<description><![CDATA[Many to many relations are one of the mostly used relations in the relational database. It took a&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Many to many relations are one of the mostly used relations in the relational database. It took a while for me to figure how to properly configure this relation in Symfony Doctrine. I am sharing this so it might be useful for someone.</p>



<p>Used very simple example students and course. A student can opt for multiple courses and a single course can be opted by multiple students.</p>



<p>And Entity class should be like this&#8230;</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
namespace AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Student
 *
 * @ORM\Table(name=&quot;ab_student&quot;)
 * @ORM\Entity(repositoryClass=&quot;AppBundle\Repository\StudentRepository&quot;)
 */
class Student
{
    /**
     * @var int
     *
     * @ORM\Column(name=&quot;id&quot;, type=&quot;integer&quot;)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy=&quot;AUTO&quot;)
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name=&quot;name&quot;, type=&quot;string&quot;, length=255)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name=&quot;email&quot;, type=&quot;string&quot;, length=255)
     */
    private $email;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name=&quot;dob&quot;, type=&quot;datetime&quot;)
     */
    private $dob;

    /**
     * @var ArrayCollection
     * @ORM\ManyToMany(targetEntity=&quot;AppBundle\Entity\Course&quot;, inversedBy=&quot;students&quot;, fetch=&quot;EAGER&quot;)
     * @ORM\JoinTable(
     *     name=&quot;ab_student_2_course&quot;,
     *     joinColumns={@ORM\JoinColumn(name=&quot;course_id&quot;, referencedColumnName=&quot;id&quot;, nullable=false, onDelete=&quot;cascade&quot;)},
     *     inverseJoinColumns={@ORM\JoinColumn(name=&quot;student_id&quot;, referencedColumnName=&quot;id&quot;, nullable=false, onDelete=&quot;cascade&quot;)}
     * )
     */
    private $courses;

    public function __construct()
    {
        $this-&gt;courses = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this-&gt;id;
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return Student
     */
    public function setName($name)
    {
        $this-&gt;name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this-&gt;name;
    }

    /**
     * Set email
     *
     * @param string $email
     *
     * @return Student
     */
    public function setEmail($email)
    {
        $this-&gt;email = $email;

        return $this;
    }

    /**
     * Get email
     *
     * @return string
     */
    public function getEmail()
    {
        return $this-&gt;email;
    }

    /**
     * Set dob
     *
     * @param \DateTime $dob
     *
     * @return Student
     */
    public function setDob($dob)
    {
        $this-&gt;dob = $dob;

        return $this;
    }

    /**
     * Get dob
     *
     * @return \DateTime
     */
    public function getDob()
    {
        return $this-&gt;dob;
    }

    /**
     * @return ArrayCollection
     */
    public function getCourses()
    {
        return $this-&gt;courses;
    }

    /**
     * @param ArrayCollection $courses
     */
    public function setCourses($courses)
    {
        $this-&gt;courses = $courses;
    }

}

</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
namespace AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Course
 *
 * @ORM\Table(name=&quot;ab_course&quot;)
 * @ORM\Entity(repositoryClass=&quot;AppBundle\Repository\CourseRepository&quot;)
 */
class Course
{
    /**
     * @var int
     *
     * @ORM\Column(name=&quot;id&quot;, type=&quot;integer&quot;)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy=&quot;AUTO&quot;)
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name=&quot;name&quot;, type=&quot;string&quot;, length=255)
     */
    private $name;


    /**
     * @var ArrayCollection
     * @ORM\ManyToMany(targetEntity=&quot;AppBundle\Entity\Student&quot;, mappedBy=&quot;courses&quot;, cascade={&quot;all&quot;})
     */
    private $students;

    public function __construct()
    {
        $this-&gt;students = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this-&gt;id;
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return Course
     */
    public function setName($name)
    {
        $this-&gt;name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this-&gt;name;
    }

    /**
     * @return ArrayCollection
     */
    public function getStudents()
    {
        return $this-&gt;students;
    }

    /**
     * @param ArrayCollection $students
     */
    public function setStudents($students)
    {
        $this-&gt;students = $students;
    }

}

</pre></div>


<p>The above entities will create the following SQL and it will also create the cross-reference table.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
CREATE TABLE ab_student 
  ( 
     id    INT auto_increment NOT NULL, 
     name  VARCHAR(255) NOT NULL, 
     email VARCHAR(255) NOT NULL, 
     dob   DATETIME NOT NULL, 
     PRIMARY KEY(id) 
  ) 
DEFAULT CHARACTER SET utf8 
COLLATE utf8_unicode_ci 
engine = innodb; 

CREATE TABLE ab_student_2_course 
  ( 
     course_id  INT NOT NULL, 
     student_id INT NOT NULL, 
     INDEX idx_87d76467591cc992 (course_id), 
     INDEX idx_87d76467cb944f1a (student_id), 
     PRIMARY KEY(course_id, student_id) 
  ) 
DEFAULT CHARACTER SET utf8 
COLLATE utf8_unicode_ci 
engine = innodb; 

CREATE TABLE ab_course 
  ( 
     id   INT auto_increment NOT NULL, 
     name VARCHAR(255) NOT NULL, 
     PRIMARY KEY(id) 
  ) 
DEFAULT CHARACTER SET utf8 
COLLATE utf8_unicode_ci 
engine = innodb; 

ALTER TABLE ab_student_2_course 
  ADD CONSTRAINT fk_87d76467591cc992 FOREIGN KEY (course_id) REFERENCES 
  ab_student (id) ON DELETE CASCADE; 

ALTER TABLE ab_student_2_course 
  ADD CONSTRAINT fk_87d76467cb944f1a FOREIGN KEY (student_id) REFERENCES 
  ab_course (id) ON DELETE CASCADE; 
</pre></div>


<p>Hope this helps <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
