<?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>Programming - Software Developer's Tour</title>
	<atom:link href="https://pawelmajewski.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>https://pawelmajewski.com</link>
	<description>Website about programming, news in IT and more</description>
	<lastBuildDate>Sun, 29 Jun 2025 22:30:49 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>

<image>
	<url>https://pawelmajewski.com/wp-content/uploads/2024/02/logo_normal.png</url>
	<title>Programming - Software Developer's Tour</title>
	<link>https://pawelmajewski.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Understanding K-Nearest-Neighbors (KNN) &#8211; Essential Machine Learning Algorithm</title>
		<link>https://pawelmajewski.com/understanding-k-nearest-neighbors-knn-essential-machine-learning-algorithm/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=understanding-k-nearest-neighbors-knn-essential-machine-learning-algorithm</link>
					<comments>https://pawelmajewski.com/understanding-k-nearest-neighbors-knn-essential-machine-learning-algorithm/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Sun, 29 Jun 2025 01:21:34 +0000</pubDate>
				<category><![CDATA[Data Science]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Machine learning]]></category>
		<category><![CDATA[Science of Data]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8875</guid>

					<description><![CDATA[<p>A quick introduction to this algorithm KNN is used to determine the class of our sample data. To understand this more clearly, please take a look at the plot below. We have two groups of samples: blue ones and red ones. We know a priori which samples are blue and which are red. Now, however, [&#8230;]</p>
<p>The post <a href="https://pawelmajewski.com/understanding-k-nearest-neighbors-knn-essential-machine-learning-algorithm/">Understanding K-Nearest-Neighbors (KNN) – Essential Machine Learning Algorithm</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8875" class="elementor elementor-8875">
				<div class="elementor-element elementor-element-f7b3b04 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="f7b3b04" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-55e1baa elementor-widget elementor-widget-heading" data-id="55e1baa" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.21.0 - 08-05-2024 */
.elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}</style><h2 class="elementor-heading-title elementor-size-default">A quick introduction to this algorithm</h2>		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-c0b1357 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="c0b1357" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-2c150bb elementor-widget elementor-widget-text-editor" data-id="2c150bb" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.21.0 - 08-05-2024 */
.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}</style>				<p>KNN is used to determine the class of our sample data. To understand this more clearly, please take a look at the plot below. We have two groups of samples: <strong>blue</strong> ones and <strong>red</strong> ones. We know a priori which samples are blue and which are red. Now, however, a new sample has arrived &#8211; a green one. Our task is to determine whether this sample better fits with the reds or the blues.</p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-42c4d11 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="42c4d11" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-aab2dba elementor-widget elementor-widget-image" data-id="aab2dba" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.21.0 - 08-05-2024 */
.elementor-widget-image{text-align:center}.elementor-widget-image a{display:inline-block}.elementor-widget-image a img[src$=".svg"]{width:48px}.elementor-widget-image img{vertical-align:middle;display:inline-block}</style>										<img loading="lazy" decoding="async" loading="lazy" width="549" height="413" src="https://pawelmajewski.com/wp-content/uploads/2024/10/plot1.png" class="attachment-large size-large wp-image-8877" alt="plot1" srcset="https://pawelmajewski.com/wp-content/uploads/2024/10/plot1.png 549w, https://pawelmajewski.com/wp-content/uploads/2024/10/plot1-300x226.png 300w" sizes="auto, (max-width: 549px) 100vw, 549px" />													</div>
				</div>
				<div class="elementor-element elementor-element-92b4dba elementor-widget elementor-widget-text-editor" data-id="92b4dba" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>As you might guess, the simplest way to assign class A or B to a new sample is to calculate the distance between our sample and other points. Why does KNN have a &#8216;<strong>K</strong>&#8216; in its name? The &#8216;<strong>K</strong>&#8216; represents the number of nearest neighbors used to predict a classification.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-953199e elementor-widget elementor-widget-heading" data-id="953199e" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">How do we calculate distance between samples?</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-cf04ff3 elementor-widget elementor-widget-text-editor" data-id="cf04ff3" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The easiest way to calculate the distance is to use a formula we all know from primary school, called the <a title="Euclidean distance" href="https://en.wikipedia.org/wiki/Euclidean_distance" target="_blank" rel="noopener"><strong>Euclidean distance</strong></a>. Of course, there are other algorithms that are better depending on the distribution of our data.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-4608017 elementor-widget elementor-widget-html" data-id="4608017" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			    <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
        <msqrt>
            <mrow>
                <msup>
                    <mrow>
                        <mo>(</mo>
                        <mi>x</mi><mo>₂</mo> <mo>-</mo> <mi>x</mi><mo>₁</mo>
                        <mo>)</mo>
                    </mrow>
                    <mn>2</mn>
                </msup>
                <mo>+</mo>
                <msup>
                    <mrow>
                        <mo>(</mo>
                        <mi>y</mi><mo>₂</mo> <mo>-</mo> <mi>y</mi><mo>₁</mo>
                        <mo>)</mo>
                    </mrow>
                    <mn>2</mn>
                </msup>
            </mrow>
        </msqrt>
    </math>		</div>
				</div>
				<div class="elementor-element elementor-element-9af9130 elementor-widget elementor-widget-text-editor" data-id="9af9130" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Just code this function</p>						</div>
				</div>
				<div class="elementor-element elementor-element-68b2c7f elementor-widget elementor-widget-code-block-for-elementor" data-id="68b2c7f" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-python'>def euclidean_distance(a, b):
  return np.sqrt(np.sum(a - b) ** 2)</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-3a36398 elementor-widget elementor-widget-text-editor" data-id="3a36398" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Now, we need to find the K nearest neighbors. First, we need to calculate the distance between each point and the test point.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-70385a8 elementor-widget elementor-widget-code-block-for-elementor" data-id="70385a8" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>def get_neighbors(X, y, test_point, k):
    distances = []
    for i in range(len(X)):
        distance = euclidean_distance(X[i], test_point)
        distances.append((X[i], y[i], distance))
    distances.sort(key=lambda x: x[2])
    neighbors = distances[:k]
    return neighbors</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-d553057 elementor-widget elementor-widget-text-editor" data-id="d553057" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>In this step, we will calculate class for our test point.</p><p>This is the result of <strong>get_neighbors</strong> function.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-91e193a elementor-widget elementor-widget-image" data-id="91e193a" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="671" height="259" src="https://pawelmajewski.com/wp-content/uploads/2024/10/neighbors.png" class="attachment-large size-large wp-image-8881" alt="neighbors" srcset="https://pawelmajewski.com/wp-content/uploads/2024/10/neighbors.png 671w, https://pawelmajewski.com/wp-content/uploads/2024/10/neighbors-300x116.png 300w" sizes="auto, (max-width: 671px) 100vw, 671px" />													</div>
				</div>
				<div class="elementor-element elementor-element-d66cf33 elementor-widget elementor-widget-text-editor" data-id="d66cf33" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>As you can see, we have three instances of class 0 and two instances of class 1. Therefore, when the KNN algorithm is run on this data with <strong>K</strong> equal to 5, it will classify the test point as class 0, since it is nearest to this class.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-b9d16a6 elementor-widget elementor-widget-text-editor" data-id="b9d16a6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>This is how it looks like</p>						</div>
				</div>
				<div class="elementor-element elementor-element-49f0611 elementor-widget elementor-widget-image" data-id="49f0611" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="555" height="455" src="https://pawelmajewski.com/wp-content/uploads/2024/10/pobrane-1.png" class="attachment-large size-large wp-image-8882" alt="final plot" srcset="https://pawelmajewski.com/wp-content/uploads/2024/10/pobrane-1.png 555w, https://pawelmajewski.com/wp-content/uploads/2024/10/pobrane-1-300x246.png 300w" sizes="auto, (max-width: 555px) 100vw, 555px" />													</div>
				</div>
				<div class="elementor-element elementor-element-80d39b3 elementor-widget elementor-widget-text-editor" data-id="80d39b3" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Our test point has three connections with the blue ones and only two connections with the red ones.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-59ae042 elementor-widget elementor-widget-html" data-id="59ae042" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			    <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
        <mrow>
            <mo>d(P, Q) =</mo>
            <msqrt>
                <mrow>
                    <mo>&#x2211;</mo>
                    <msub>
                        <mi>i</mi>
                        <mn>1</mn>
                    </msub>
                    <mo>^</mo>
                    <mi>n</mi>
                    <mo>(</mo>
                    <mo>(</mo>
                    <mi>p</mi>
                    <mo>_</mo>
                    <mi>i</mi>
                    <mo>-</mo>
                    <mi>q</mi>
                    <mo>_</mo>
                    <mi>i</mi>
                    <mo>)</mo>
                    <mo>^</mo>
                    <mn>2</mn>
                    <mo>)</mo>
                </mrow>
            </msqrt>
        </mrow>
    </math>		</div>
				</div>
				<div class="elementor-element elementor-element-dcd7e76 elementor-widget elementor-widget-text-editor" data-id="dcd7e76" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Our function for calculating the <strong>Euclidean distance</strong>, called <strong><code>euclidean_distance</code></strong>, is designed to solve real-life problems that are not limited to two dimensions but can also handle n-dimensional scenarios.</p>						</div>
				</div>
					</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/understanding-k-nearest-neighbors-knn-essential-machine-learning-algorithm/">Understanding K-Nearest-Neighbors (KNN) – Essential Machine Learning Algorithm</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/understanding-k-nearest-neighbors-knn-essential-machine-learning-algorithm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A Step-by-Step Guide to Web Scraping for Beginners</title>
		<link>https://pawelmajewski.com/a-step-by-step-guide-to-web-scraping-for-beginners/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-step-by-step-guide-to-web-scraping-for-beginners</link>
					<comments>https://pawelmajewski.com/a-step-by-step-guide-to-web-scraping-for-beginners/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Sat, 21 Jun 2025 08:38:00 +0000</pubDate>
				<category><![CDATA[Data Science]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web Scraping]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8855</guid>

					<description><![CDATA[<p>In this article, I would like to raise the subject of web scraping. Before we start, we have to consider web scraping on several layers: legal and ethical.  Let&#8217;s tackle the topic of the legality of web scraping first. Fundamentally, the law depends on the country you live in. You should remember about: Authors&#8217; right [&#8230;]</p>
<p>The post <a href="https://pawelmajewski.com/a-step-by-step-guide-to-web-scraping-for-beginners/">A Step-by-Step Guide to Web Scraping for Beginners</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8855" class="elementor elementor-8855">
				<div class="elementor-element elementor-element-4d1f27a e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="4d1f27a" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-5063eac elementor-widget elementor-widget-text-editor" data-id="5063eac" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>In this article, I would like to raise the subject of <strong>web scraping</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-163ebe3 elementor-widget elementor-widget-text-editor" data-id="163ebe3" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Before we start, we have to consider web scraping on several layers: legal and ethical.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-7775128 elementor-widget elementor-widget-text-editor" data-id="7775128" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<div class="flex max-w-full flex-col flex-grow"><div class="min-h-[20px] text-message flex w-full flex-col items-end gap-2 whitespace-pre-wrap break-words [.text-message+&amp;]:mt-5 overflow-x-auto" dir="auto" data-message-author-role="assistant" data-message-id="59ca1973-cf4a-4b35-aa6b-9a89f1ea3639"><div class="flex w-full flex-col gap-1 empty:hidden first:pt-[3px]"><div class="markdown prose w-full break-words dark:prose-invert dark"><p><strong> Let&#8217;s tackle the topic of the legality of web scraping first.</strong></p></div></div></div></div>						</div>
				</div>
				<div class="elementor-element elementor-element-26264d9 elementor-widget elementor-widget-text-editor" data-id="26264d9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Fundamentally, the law depends on the country you live in. You should remember about:</p><p><strong>Authors&#8217; right</strong></p><p><strong>Terms of Service</strong></p><p><strong>General Data Protection Regulation (GDPR, European Union)</strong></p><p><strong>Computer Fraud and Abuse Act (CFAA, USA)</strong></p><p>Outside the regulations you have to make sure that you are not affecting on target&#8217;s infrastructure by for example <strong>DDOSing</strong> target&#8217;s site.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-b54eae8 elementor-widget elementor-widget-text-editor" data-id="b54eae8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Let&#8217;s get to practice</strong></p>						</div>
				</div>
				<div class="elementor-element elementor-element-2f03c68 elementor-widget elementor-widget-image" data-id="2f03c68" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="682" src="https://pawelmajewski.com/wp-content/uploads/2024/09/website_pawel_majewski-1024x682.png" class="attachment-large size-large wp-image-8865" alt="website" srcset="https://pawelmajewski.com/wp-content/uploads/2024/09/website_pawel_majewski-1024x682.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/09/website_pawel_majewski-300x200.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/09/website_pawel_majewski-768x511.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/09/website_pawel_majewski-1536x1022.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/09/website_pawel_majewski.png 1974w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-5573aa9 elementor-widget elementor-widget-text-editor" data-id="5573aa9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>We want to get all titles from the blog section.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-223f0ab elementor-widget elementor-widget-text-editor" data-id="223f0ab" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>When we analyze the blog section, we can see that the title is an <code>a</code> tag inside a <code>div</code> with the class <code>blog-page-title</code>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-e4be852 elementor-widget elementor-widget-image" data-id="e4be852" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="552" src="https://pawelmajewski.com/wp-content/uploads/2024/09/Screenshot_19-1024x552.png" class="attachment-large size-large wp-image-8867" alt="web browser code inspector" srcset="https://pawelmajewski.com/wp-content/uploads/2024/09/Screenshot_19-1024x552.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/09/Screenshot_19-300x162.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/09/Screenshot_19-768x414.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/09/Screenshot_19-1536x828.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/09/Screenshot_19-2048x1104.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-d3b9198 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="d3b9198" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-b2235ac elementor-widget elementor-widget-text-editor" data-id="b2235ac" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The steps we need to take to accomplish our task:</p><ul><li>1. Go to the website.</li><li>2. Wait for the page to load until there is a <code>div</code> with the class &#8220;blog-page-title&#8221; and an <code>a</code> tag inside it.</li><li>3. Find the <code>a</code> tag inside the <code>div</code> with the class mentioned above.</li><li>4. Print the text of these <code>a</code> tags.</li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-93a0690 elementor-widget elementor-widget-code-block-for-elementor" data-id="93a0690" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = &quot;https://pawelmajewski.com/blog&quot;
driver = webdriver.Chrome()
driver.get(url)
div_class = &quot;blog-page-title&quot;
wait = WebDriverWait(driver, 3)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, f&quot;div.{div_class} a&quot;)))
a_tags = driver.find_elements(By.CSS_SELECTOR, f&quot;div.{div_class} a&quot;)

for a_tag in a_tags:
    print(a_tag.text)

driver.quit()</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-6d48a4e elementor-widget elementor-widget-text-editor" data-id="6d48a4e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I recommend using the Selenium library both for writing your own web scrapers as well as for writing, for example, integration tests.</p>						</div>
				</div>
					</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/a-step-by-step-guide-to-web-scraping-for-beginners/">A Step-by-Step Guide to Web Scraping for Beginners</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/a-step-by-step-guide-to-web-scraping-for-beginners/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Effortless API Testing with Visual Studio Code: Quick and Easy Guide</title>
		<link>https://pawelmajewski.com/effortless-api-testing-with-visual-studio-code-quick-and-easy-guide/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=effortless-api-testing-with-visual-studio-code-quick-and-easy-guide</link>
					<comments>https://pawelmajewski.com/effortless-api-testing-with-visual-studio-code-quick-and-easy-guide/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Tue, 10 Jun 2025 20:15:10 +0000</pubDate>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio Code]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8828</guid>

					<description><![CDATA[<p>Have you ever wondered how to test your API endpoints? There are many options to do so. You can use: Swagger Postman Insomnia (other less known software) or our star for today&#8230; Visual Studio Code Visual Studio Code (VSC) is a really powerful tool. Calling VSC an IDE wouldn&#8217;t be entirely accurate, as its functionality [&#8230;]</p>
<p>The post <a href="https://pawelmajewski.com/effortless-api-testing-with-visual-studio-code-quick-and-easy-guide/">Effortless API Testing with Visual Studio Code: Quick and Easy Guide</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8828" class="elementor elementor-8828">
				<div class="elementor-element elementor-element-c396595 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="c396595" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-a908654 elementor-widget elementor-widget-text-editor" data-id="a908654" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Have you ever wondered how to test your API endpoints? There are many options to do so. You can use:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-905982a elementor-widget elementor-widget-text-editor" data-id="905982a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><a href="https://swagger.io/" target="_blank" rel="noopener">Swagger</a></p><p><a href="https://www.postman.com/" target="_blank" rel="noopener">Postman</a></p><p><a href="https://insomnia.rest/" target="_blank" rel="noopener">Insomnia</a></p><p>(other less known software)</p><p>or our star for today&#8230;</p><p><strong><a href="https://code.visualstudio.com/" target="_blank" rel="noopener">Visual Studio Code</a></strong></p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-da82bf2 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="da82bf2" data-element_type="container">
				<div class="elementor-element elementor-element-c6e75a1 elementor-widget elementor-widget-text-editor" data-id="c6e75a1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Visual Studio Code (VSC) is a really powerful tool. Calling VSC an IDE wouldn&#8217;t be entirely accurate, as its functionality largely depends on extensions.</p><p>One time VSC can be typical text editor, and the other time you can use VSC to manage your Linux server files over SSH using <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh" target="_blank" rel="noopener">https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh</a>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-590ef17 elementor-widget elementor-widget-text-editor" data-id="590ef17" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Firstly, let&#8217;s create a new Web API project and modify the default <code>WeatherForecastController</code> with the code below.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-1fcc116 elementor-widget elementor-widget-code-block-for-elementor" data-id="1fcc116" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>using Microsoft.AspNetCore.Mvc;
using Microsoft.Net.Http.Headers;

namespace TestApi.Controllers;
[ApiController]
[Route(&quot;[controller]&quot;)]
public class WeatherForecastController : ControllerBase
{
    [HttpGet(&quot;get&quot;)]
    public IActionResult Get()
    {
        return Ok(Enumerable.Range(1, 5));
    }

    [HttpGet(&quot;get-protected&quot;)]
    public IActionResult GetProtected()
    {
        if (!Request.Headers.ContainsKey(HeaderNames.Authorization) || Request.Headers[HeaderNames.Authorization] != &quot;Bearer testKey&quot;)
            return Unauthorized();

        return Ok(Enumerable.Range(1, 5));
    }

    [HttpPost(&quot;post&quot;)]
    public IActionResult Post([FromBody] TestRequest request)
    {
        return Ok(request);
    }

    public class TestRequest
    {
        public required string Name { get; set; }
        public int Age { get; set; }
    }
}
</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-735719f elementor-widget elementor-widget-text-editor" data-id="735719f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>As you can see, there are three endpoints that we will test today:</p><p><code>Get</code></p><p><code></code><code>GetProtected</code></p><p>and <code>Post</code></p><p>These three endpoints will cover all our base cases, so let&#8217;s get started!</p>						</div>
				</div>
				<div class="elementor-element elementor-element-d689a87 elementor-widget elementor-widget-heading" data-id="d689a87" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Install REST Client extension</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-21b23dd elementor-widget elementor-widget-text-editor" data-id="21b23dd" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><a href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client" target="_blank" rel="noopener">https://marketplace.visualstudio.com/items?itemName=humao.rest-client</a></p>						</div>
				</div>
				<div class="elementor-element elementor-element-5a2a431 elementor-widget elementor-widget-image" data-id="5a2a431" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="637" height="249" src="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_4.png" class="attachment-large size-large wp-image-8836" alt="Rest client installed" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_4.png 637w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_4-300x117.png 300w" sizes="auto, (max-width: 637px) 100vw, 637px" />													</div>
				</div>
				<div class="elementor-element elementor-element-2824385 elementor-widget elementor-widget-heading" data-id="2824385" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Create file with .http extension</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-0d36e35 elementor-alert-warning elementor-widget elementor-widget-alert" data-id="0d36e35" data-element_type="widget" data-widget_type="alert.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.21.0 - 08-05-2024 */
.elementor-alert{padding:15px;border-left:5px solid transparent;position:relative;text-align:start}.elementor-alert .elementor-alert-title{display:block;font-weight:700}.elementor-alert .elementor-alert-description{font-size:13px}.elementor-alert button.elementor-alert-dismiss{position:absolute;right:var(--dismiss-icon-horizontal-position,10px);top:var(--dismiss-icon-vertical-position,10px);padding:3px;font-size:var(--dismiss-icon-size,20px);line-height:1;background:transparent;color:var(--dismiss-icon-normal-color,inherit);border:none;cursor:pointer;transition-duration:var(--dismiss-icon-hover-transition-duration,.3s)}.elementor-alert button.elementor-alert-dismiss:hover{color:var(--dismiss-icon-hover-color,inherit)}.elementor-alert button.elementor-alert-dismiss svg{width:var(--dismiss-icon-size,20px);height:var(--dismiss-icon-size,20px);fill:var(--dismiss-icon-normal-color,currentColor);transition-duration:var(--dismiss-icon-hover-transition-duration,.3s)}.elementor-alert button.elementor-alert-dismiss svg:hover{fill:var(--dismiss-icon-hover-color,currentColor)}.elementor-alert-info .elementor-alert{color:#31708f;background-color:#d9edf7;border-color:#bcdff1}.elementor-alert-success .elementor-alert{color:#3c763d;background-color:#dff0d8;border-color:#cae6be}.elementor-alert-warning .elementor-alert{color:#8a6d3b;background-color:#fcf8e3;border-color:#f9f0c3}.elementor-alert-danger .elementor-alert{color:#a94442;background-color:#f2dede;border-color:#e8c4c4}@media (max-width:767px){.elementor-alert{padding:10px}.elementor-alert button.elementor-alert-dismiss{right:7px;top:7px}}</style>		<div class="elementor-alert" role="alert">

						<span class="elementor-alert-title">Naming convention</span>
			
						<span class="elementor-alert-description">It's a good practice to name your files with words that clearly describe their purpose. Today, I'll test the endpoints in WeatherForecastController, so I've named the file WeatherForecastControllerTests.http.</span>
			
			
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-827540d elementor-widget elementor-widget-heading" data-id="827540d" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">First sending of the request</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-e5cd7ab elementor-widget elementor-widget-image" data-id="e5cd7ab" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="257" src="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_5-1024x257.png" class="attachment-large size-large wp-image-8837" alt="request" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_5-1024x257.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_5-300x75.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_5-768x193.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_5-1536x385.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_5-2048x514.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-117508f elementor-widget elementor-widget-text-editor" data-id="117508f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The arrow points to the button which sends the request, and on the right panel, you can see the response from the server.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-7d40b42 elementor-widget elementor-widget-code-block-for-elementor" data-id="7d40b42" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-http'>GET https://localhost:7081/WeatherForecast/get</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-e94bd16 elementor-widget elementor-widget-heading" data-id="e94bd16" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Let's make authorized request</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-3c2a2d2 elementor-widget elementor-widget-image" data-id="3c2a2d2" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="269" src="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_6-1024x269.png" class="attachment-large size-large wp-image-8839" alt="unauthorized request" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_6-1024x269.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_6-300x79.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_6-768x201.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_6-1536x403.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_6-2048x537.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-2dabf38 elementor-widget elementor-widget-text-editor" data-id="2dabf38" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>We&#8217;ve received a 401 Unauthorized error. I&#8217;ve created a fake authentication based on a Bearer token. If you are not familiar with Bearer tokens, read more <a href="https://docs.github.com/en/rest/authentication/authenticating-to-the-rest-api?apiVersion=2022-11-28" target="_blank" rel="noopener">https://docs.github.com/en/rest/authentication/authenticating-to-the-rest-api?apiVersion=2022-11-28</a></p>						</div>
				</div>
				<div class="elementor-element elementor-element-3cb3d99 elementor-widget elementor-widget-text-editor" data-id="3cb3d99" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>What should we do? Just add an <code>Authorization</code> header</p>						</div>
				</div>
				<div class="elementor-element elementor-element-259b910 elementor-widget elementor-widget-image" data-id="259b910" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="261" src="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_7-1024x261.png" class="attachment-large size-large wp-image-8840" alt="Auth header request" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_7-1024x261.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_7-300x76.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_7-768x196.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_7-1536x391.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_7-2048x522.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-354d8d8 elementor-widget elementor-widget-code-block-for-elementor" data-id="354d8d8" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-http'>GET https://localhost:7081/WeatherForecast/get-protected
Authorization: Bearer testKey</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-e789639 elementor-widget elementor-widget-heading" data-id="e789639" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">How about POST http method?</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-904d195 elementor-widget elementor-widget-text-editor" data-id="904d195" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Nothing easier!</strong></p>						</div>
				</div>
				<div class="elementor-element elementor-element-8c44d8d elementor-widget elementor-widget-text-editor" data-id="8c44d8d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>What is worth highlighting is that VSC automatically suggests possible HTTP MIME types.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0c4fc97 elementor-widget elementor-widget-image" data-id="0c4fc97" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="771" height="326" src="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_10.png" class="attachment-large size-large wp-image-8842" alt="http mimes" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_10.png 771w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_10-300x127.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_10-768x325.png 768w" sizes="auto, (max-width: 771px) 100vw, 771px" />													</div>
				</div>
				<div class="elementor-element elementor-element-7a664d8 elementor-widget elementor-widget-text-editor" data-id="7a664d8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The full request</p>						</div>
				</div>
				<div class="elementor-element elementor-element-90d6e1a elementor-widget elementor-widget-image" data-id="90d6e1a" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="287" src="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_9-1024x287.png" class="attachment-large size-large wp-image-8843" alt="POST request" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_9-1024x287.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_9-300x84.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_9-768x215.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_9-1536x430.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_9-2048x573.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-fd8b640 elementor-widget elementor-widget-code-block-for-elementor" data-id="fd8b640" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>POST https://localhost:7081/WeatherForecast/post
Content-Type: application/json

{
    &quot;name&quot;: &quot;pawelmajewski.com&quot;,
    &quot;Age&quot;: 22
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-a07f06f elementor-widget elementor-widget-heading" data-id="a07f06f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Improvements</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-e7fa1a4 elementor-widget elementor-widget-text-editor" data-id="e7fa1a4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>We&#8217;ve got this. Our tests work perfectly, but&#8230; what if the base URL changes?</p>						</div>
				</div>
				<div class="elementor-element elementor-element-c99d722 elementor-widget elementor-widget-heading" data-id="c99d722" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Variables</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-dd95e11 elementor-widget elementor-widget-text-editor" data-id="dd95e11" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Yes!</strong>We will replace repetitive elements with variables.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-4f538ba elementor-widget elementor-widget-image" data-id="4f538ba" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="782" height="682" src="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_11.png" class="attachment-large size-large wp-image-8844" alt="file after refactor" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_11.png 782w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_11-300x262.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/06/Screenshot_11-768x670.png 768w" sizes="auto, (max-width: 782px) 100vw, 782px" />													</div>
				</div>
				<div class="elementor-element elementor-element-904e673 elementor-widget elementor-widget-code-block-for-elementor" data-id="904e673" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-http'>@baseUrl = https://localhost:7081
@apiToken = Bearer testKey
@contentTypeApplicationJson = application/json

GET {{baseUrl}}/WeatherForecast/get

###

GET {{baseUrl}}/WeatherForecast/get-protected
Authorization: {{apiToken}}

###

POST {{baseUrl}}/WeatherForecast/post
Content-Type: {{contentTypeApplicationJson}}

{
    &quot;name&quot;: &quot;pawelmajewski.com&quot;,
    &quot;Age&quot;: 22
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-43f4529 elementor-widget elementor-widget-text-editor" data-id="43f4529" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Now, I&#8217;m happy with this code. As you can see, VSC is a very powerful tool with an enormous number of extensions that make VSC a multitool.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-480a06b elementor-widget elementor-widget-text-editor" data-id="480a06b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Additionally, what makes this tool very simple and fast to use for programmers is that here you simply write code, without needing to learn a new UI to do anything.</p>						</div>
				</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/effortless-api-testing-with-visual-studio-code-quick-and-easy-guide/">Effortless API Testing with Visual Studio Code: Quick and Easy Guide</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/effortless-api-testing-with-visual-studio-code-quick-and-easy-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Simplify Your React Forms with React Hook Form and Yup</title>
		<link>https://pawelmajewski.com/simplify-your-react-forms-with-react-hook-form-and-yup/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=simplify-your-react-forms-with-react-hook-form-and-yup</link>
					<comments>https://pawelmajewski.com/simplify-your-react-forms-with-react-hook-form-and-yup/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Mon, 12 May 2025 09:52:00 +0000</pubDate>
				<category><![CDATA[ReactJS]]></category>
		<category><![CDATA[Custom forms]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[React hook form]]></category>
		<category><![CDATA[ReactJs]]></category>
		<category><![CDATA[Validation]]></category>
		<category><![CDATA[Yup]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8788</guid>

					<description><![CDATA[<p>Here we are! The first post about frontend technology has been written. Until now, only backend and DevOps topics have been covered. Today I want to show you one of the top libraries that allows us to manage forms easily. React Hook Form and Yup What is React Hook Form? It&#8217;s one of the most frequently [&#8230;]</p>
<p>The post <a href="https://pawelmajewski.com/simplify-your-react-forms-with-react-hook-form-and-yup/">Simplify Your React Forms with React Hook Form and Yup</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8788" class="elementor elementor-8788">
				<div class="elementor-element elementor-element-eb501a8 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="eb501a8" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-24353a1 elementor-widget elementor-widget-text-editor" data-id="24353a1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Here we are! The first post about frontend technology has been written. Until now, only backend and DevOps topics have been covered.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-6a9add3 elementor-widget elementor-widget-text-editor" data-id="6a9add3" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Today I want to show you one of the top libraries that allows us to manage forms easily.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-29205e5 elementor-widget elementor-widget-heading" data-id="29205e5" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">React Hook Form and Yup</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-a9b34d4 elementor-widget elementor-widget-text-editor" data-id="a9b34d4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>What is <strong>React Hook Form?</strong></p><p>It&#8217;s one of the most frequently used library to manage forms with <strong>React</strong>. As we can read on the project&#8217;s site </p>						</div>
				</div>
				<div class="elementor-element elementor-element-32c6ed5 elementor-widget elementor-widget-eael-testimonial" data-id="32c6ed5" data-element_type="widget" data-widget_type="eael-testimonial.default">
				<div class="elementor-widget-container">
			
	<div id="eael-testimonial-32c6ed5" class="eael-testimonial-item clearfix  default-style">

		
		
								<div class="eael-testimonial-content">
				<div class="eael-testimonial-text"><p>Performance is one of the primary reasons why this library was created.</p>
<p><a href="https://react-hook-form.com/faqs" target="_blank" rel="noopener">https://react-hook-form.com/faqs</a></p>
</div>			</div>
		
		
		
		
		
		<span class="eael-testimonial-quote"></span>
	</div>

			</div>
				</div>
				<div class="elementor-element elementor-element-1a3ea45 elementor-widget elementor-widget-text-editor" data-id="1a3ea45" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>What is <strong>Yup?</strong></p><p>Yup is a library used for creating schemas that help in parsing and validating values at runtime.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-b732a55 elementor-widget elementor-widget-code-block-for-elementor" data-id="b732a55" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-cil'>npm install react-hook-form
npm install @hookform/resolvers yup</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-dc49f8b elementor-widget elementor-widget-text-editor" data-id="dc49f8b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I have created simple form using <a href="https://getbootstrap.com/" target="_blank" rel="noopener">bootstrap</a>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-e29a66b elementor-widget elementor-widget-image" data-id="e29a66b" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="442" src="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_22h12_07-1024x442.png" class="attachment-large size-large wp-image-8795" alt="simple form" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_22h12_07-1024x442.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_22h12_07-300x129.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_22h12_07-768x331.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_22h12_07.png 1370w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-9420c74 elementor-widget elementor-widget-text-editor" data-id="9420c74" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>In a standard case, we would create a <strong>useState </strong>or <strong>useRef</strong> for each field. It would result in a massive amount of code. However, it&#8217;s a good approach when you are new to <strong>React</strong> and still learning. By implementing it yourself, you will learn how <strong>React</strong> works and how to solve basic problems that surprise beginners. Okay, let&#8217;s get back to the main thread.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-79259ee elementor-widget elementor-widget-text-editor" data-id="79259ee" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I have created <strong>React</strong> with typescript, so let&#8217;s create a type that defines our form.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-195a85a elementor-widget elementor-widget-code-block-for-elementor" data-id="195a85a" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-typescript'>type FormData = {
    firstName: string;
    lastName: string;
    age: number;
    email: string;
    password: string;
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-d4f8828 elementor-widget elementor-widget-text-editor" data-id="d4f8828" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Then is good time to define our validation schema for this model.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-57c22fc elementor-widget elementor-widget-code-block-for-elementor" data-id="57c22fc" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-typescript'>const schema: ObjectSchema&lt;FormData&gt; = yup
    .object({
        firstName: yup.string().required(&quot;FirstName cannot be empty&quot;),
        lastName: yup.string().required(&quot;LastName cannot be empty&quot;),
        age: yup.number().positive(&quot;Age must be positive number&quot;).integer().required(&quot;Age cannot be empty&quot;).typeError(&quot;Age must be a number&quot;),
        email: yup.string().required(&quot;Email cannot be empty&quot;).matches(RegexConsts.email, &quot;Email must contain @ and . characters&quot;),
        password: yup.string().required(&quot;Password cannot be empty&quot;),
    });</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-18bbc8a elementor-widget elementor-widget-text-editor" data-id="18bbc8a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Yup provides many validation methods. I won&#8217;t waste your time, so here I will only touch on the <code>matches</code> method.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-6ed6ceb elementor-widget elementor-widget-text-editor" data-id="6ed6ceb" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><code>Matches</code> method allows us to define regex pattern to validate this field. The second parameters means failed validation message.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-97bdf71 elementor-widget elementor-widget-code-block-for-elementor" data-id="97bdf71" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>export const RegexConsts = {
    email: /.*[@].*[.][a-zA-Z]{2,}/
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-5874aaa elementor-widget elementor-widget-text-editor" data-id="5874aaa" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>React Hook Form validates forms based on configuration, in this case after submitting the form.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-82204ba elementor-widget elementor-widget-image" data-id="82204ba" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="505" src="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h00_49-1024x505.png" class="attachment-large size-large wp-image-8808" alt="validation failed" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h00_49-1024x505.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h00_49-300x148.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h00_49-768x379.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h00_49.png 1339w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-df05710 elementor-widget elementor-widget-text-editor" data-id="df05710" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Custom validation for age</p>						</div>
				</div>
				<div class="elementor-element elementor-element-e972c28 elementor-widget elementor-widget-code-block-for-elementor" data-id="e972c28" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-typescript'>yup.number().positive(&quot;Age must be positive number&quot;).integer().required(&quot;Age cannot be empty&quot;).typeError(&quot;Age must be a number&quot;)</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-307ad31 elementor-widget elementor-widget-image" data-id="307ad31" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="678" height="96" src="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h04_30.png" class="attachment-large size-large wp-image-8809" alt="type validation" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h04_30.png 678w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h04_30-300x42.png 300w" sizes="auto, (max-width: 678px) 100vw, 678px" />													</div>
				</div>
				<div class="elementor-element elementor-element-67898fe elementor-widget elementor-widget-image" data-id="67898fe" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="658" height="93" src="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h01_09.png" class="attachment-large size-large wp-image-8810" alt="positive error validation" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h01_09.png 658w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h01_09-300x42.png 300w" sizes="auto, (max-width: 658px) 100vw, 658px" />													</div>
				</div>
				<div class="elementor-element elementor-element-bc9140d elementor-widget elementor-widget-text-editor" data-id="bc9140d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>When validation is successfully completed, the submit method returns our form object with the filled fields.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f3c2de6 elementor-widget elementor-widget-image" data-id="f3c2de6" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="512" src="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h01_30-1024x512.png" class="attachment-large size-large wp-image-8811" alt="validation success" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h01_30-1024x512.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h01_30-300x150.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h01_30-768x384.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h01_30-1536x767.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_23h01_30-2048x1023.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-cda05ce elementor-widget elementor-widget-text-editor" data-id="cda05ce" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The full file looks as presented below</p>						</div>
				</div>
				<div class="elementor-element elementor-element-6724d21 elementor-widget elementor-widget-code-block-for-elementor" data-id="6724d21" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-typescript'>import { useForm } from &quot;react-hook-form&quot;
import { yupResolver } from &quot;@hookform/resolvers/yup&quot;
import * as yup from &quot;yup&quot;
import { RegexConsts } from &quot;../consts/regexConsts&quot;
import { ObjectSchema } from &quot;yup&quot;

type FormData = {
    firstName: string;
    lastName: string;
    age: number;
    email: string;
    password: string;
}

const schema: ObjectSchema&lt;FormData&gt; = yup
    .object({
        firstName: yup.string().required(&quot;FirstName cannot be empty&quot;),
        lastName: yup.string().required(&quot;LastName cannot be empty&quot;),
        age: yup.number().positive(&quot;Age must be positive number&quot;).integer().required(&quot;Age cannot be empty&quot;).typeError(&quot;Age must be a number&quot;),
        email: yup.string().required(&quot;Email cannot be empty&quot;).matches(RegexConsts.email, &quot;Email must contain @ and . characters&quot;),
        password: yup.string().required(&quot;Password cannot be empty&quot;),
    });


export default function RegisterForm() {
    const {
        register,
        handleSubmit,
        formState: { errors },
    } = useForm&lt;FormData&gt;({
        resolver: yupResolver(schema),
    })

    const onSubmit = (data: FormData) =&gt; console.log(data)

    return (
        &lt;&gt;
            &lt;form className=&quot;card p-2&quot; onSubmit={handleSubmit(onSubmit)}&gt;
                &lt;div className=&quot;row&quot;&gt;
                    &lt;div className=&quot;col-md-6 mb-6&quot;&gt;
                        &lt;div className=&quot;input-group&quot;&gt;
                            &lt;label className=&quot;w-100&quot;&gt;First name
                                &lt;input type=&quot;text&quot; className=&quot;form-control&quot; {...register(&quot;firstName&quot;)} /&gt;
                            &lt;/label&gt;
                            &lt;div className=&quot;invalid-feedback d-block&quot;&gt;
                                {errors.firstName?.message}
                            &lt;/div&gt;
                        &lt;/div&gt;
                        &lt;div className=&quot;input-group&quot;&gt;
                            &lt;label className=&quot;w-100&quot;&gt;Last name
                                &lt;input type=&quot;text&quot; className=&quot;form-control&quot; {...register(&quot;lastName&quot;)} /&gt;
                            &lt;/label&gt;
                            &lt;div className=&quot;invalid-feedback d-block&quot;&gt;
                                {errors.lastName?.message}
                            &lt;/div&gt;
                        &lt;/div&gt;
                        &lt;div className=&quot;input-group&quot;&gt;
                            &lt;label className=&quot;w-100&quot;&gt;Age
                                &lt;input type=&quot;text&quot; className=&quot;form-control&quot; {...register(&quot;age&quot;)} /&gt;
                            &lt;/label&gt;
                            &lt;div className=&quot;invalid-feedback d-block&quot;&gt;
                                {errors.age?.message}
                            &lt;/div&gt;
                        &lt;/div&gt;
                        &lt;div className=&quot;input-group&quot;&gt;
                            &lt;label className=&quot;w-100&quot;&gt;Email
                                &lt;input type=&quot;text&quot; className=&quot;form-control&quot; {...register(&quot;email&quot;)} /&gt;
                            &lt;/label&gt;
                            &lt;div className=&quot;invalid-feedback d-block&quot;&gt;
                                {errors.email?.message}
                            &lt;/div&gt;
                        &lt;/div&gt;
                        &lt;div className=&quot;input-group&quot;&gt;
                            &lt;label className=&quot;w-100&quot;&gt;Password
                                &lt;input type=&quot;password&quot; className=&quot;form-control&quot; {...register(&quot;password&quot;)} /&gt;
                            &lt;/label&gt;
                            &lt;div className=&quot;invalid-feedback d-block&quot;&gt;
                                {errors.password?.message}
                            &lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                    &lt;div className=&quot;col-md-6 mb-6&quot;&gt;
                        &lt;button type=&quot;submit&quot; className=&quot;btn btn-outline-success w-100&quot;&gt;Send&lt;/button&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/form&gt;
        &lt;/&gt;
    )
}
</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-085804e elementor-widget elementor-widget-text-editor" data-id="085804e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I highly recommend using <strong>React Hook Form</strong> combined with <strong>Yup</strong> validation in your daily work with <strong>React</strong>.</p>						</div>
				</div>
					</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/simplify-your-react-forms-with-react-hook-form-and-yup/">Simplify Your React Forms with React Hook Form and Yup</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/simplify-your-react-forms-with-react-hook-form-and-yup/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A Comprehensive Guide to Preventing SQL Injection</title>
		<link>https://pawelmajewski.com/a-comprehensive-guide-to-preventing-sql-injection/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-comprehensive-guide-to-preventing-sql-injection</link>
					<comments>https://pawelmajewski.com/a-comprehensive-guide-to-preventing-sql-injection/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Sun, 04 May 2025 10:30:14 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Sql injection]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8767</guid>

					<description><![CDATA[<p>I recently wrote an article which is the first part about SQL Injection SQL Injection in C# Application: An Example. Today, we will continue this topic answering the question asked in the previous post &#8220;How can we avoid SQL Injection?&#8220; Entity Framework The first option is to use Entity Framework as ORM in our application. [&#8230;]</p>
<p>The post <a href="https://pawelmajewski.com/a-comprehensive-guide-to-preventing-sql-injection/">A Comprehensive Guide to Preventing SQL Injection</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8767" class="elementor elementor-8767">
				<div class="elementor-element elementor-element-89a0dd9 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="89a0dd9" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-0aa5274 elementor-widget elementor-widget-text-editor" data-id="0aa5274" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I recently wrote an article which is the first part about SQL Injection <a title="SQL Injection in C# Application: An Example" href="https://pawelmajewski.com/sql-injection-in-c-application-an-example/" target="_blank" rel="noopener">SQL Injection in C# Application: An Example</a>.</p><p>Today, we will continue this topic answering the question asked in the previous post &#8220;<strong>How can we avoid SQL Injection?</strong>&#8220;</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f44a421 elementor-widget elementor-widget-heading" data-id="f44a421" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Entity Framework</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-38452f6 elementor-widget elementor-widget-text-editor" data-id="38452f6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The first option is to use <a title="Entity Framework" href="https://learn.microsoft.com/en-us/ef/" target="_blank" rel="noopener">Entity Framework</a> as ORM in our application. Entity Framework uses LINQ-to-Entities parametrized queries preventing SQL Injection attacks. </p>						</div>
				</div>
				<div class="elementor-element elementor-element-0a77e1d elementor-widget elementor-widget-text-editor" data-id="0a77e1d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I&#8217;m using here the same database form previous post created with <a title="Scaffolding (Reverse Engineering)" href="https://learn.microsoft.com/en-us/ef/core/managing-schemas/scaffolding/?tabs=dotnet-core-cli" target="_blank" rel="noopener">Scaffolding (Reverse Engineering)</a></p>						</div>
				</div>
				<div class="elementor-element elementor-element-1e5102e elementor-widget elementor-widget-code-block-for-elementor" data-id="1e5102e" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-cil'>dotnet ef dbcontext scaffold &quot;Data Source=localhost;Initial Catalog=TestSqlInjection;Trusted_Connection=yes;Integrated Security=true;TrustServerCertificate=True;&quot; Microsoft.EntityFrameworkCore.SqlServer</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-6fb2ec8 elementor-widget elementor-widget-image" data-id="6fb2ec8" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="391" src="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_03h22_48-1024x391.png" class="attachment-large size-large wp-image-8774" alt="query" srcset="https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_03h22_48-1024x391.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_03h22_48-300x114.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_03h22_48-768x293.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/06/2024-06-01_03h22_48.png 1033w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-c6bfde7 elementor-widget elementor-widget-text-editor" data-id="c6bfde7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>As you can see, we have 3 users in database. Let&#8217;s try to select user wtih email &#8220;<strong>test@example.com</strong>&#8220;.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-bcadc96 elementor-widget elementor-widget-code-block-for-elementor" data-id="bcadc96" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>using Sql_Injection;

var context = new TestSqlInjectionContext();
var email = &quot;test@example.com&quot;;
var password = &quot;qwe&quot;;
var user = context.Users
    .Where(x =&gt; x.Email == email &amp;&amp; x.Password == password)
    .FirstOrDefault();

Console.WriteLine($&quot;User: {user?.Email}&quot;);</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-20e8bde elementor-widget elementor-widget-text-editor" data-id="20e8bde" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The result of this code will be</p><p>&#8220;User: test@example.com&#8221;</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0d69fa9 elementor-widget elementor-widget-text-editor" data-id="0d69fa9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Let&#8217;s use it and try SQL Injection on this query</p>						</div>
				</div>
				<div class="elementor-element elementor-element-2e5643d elementor-widget elementor-widget-code-block-for-elementor" data-id="2e5643d" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>using Sql_Injection;

var context = new TestSqlInjectionContext();
var email = &quot;test@example.com&quot;;
var password = &quot;&#039; or 1 =1--&quot;;
var userSqlInjection = context.Users
    .Where(x =&gt; x.Email == email &amp;&amp; x.Password == password)
    .FirstOrDefault();

Console.WriteLine($&quot;SqlInjectionUser: {userSqlInjection?.Email}&quot;);</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-84c398d elementor-widget elementor-widget-text-editor" data-id="84c398d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The result:</p><p>SqlInjectionUser:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-d450d59 elementor-widget elementor-widget-text-editor" data-id="d450d59" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>It&#8217;s because <strong>userSqlInjection</strong> has not been found. SQL injection won&#8217;t work when we use an ORM like Entity Framework because the inputs are automatically sanitized. Furthermore Entity Framework restricts direct SQL execution, developers are advised to use parametrized queries or LINQ in order to meet the security requirements.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-95e0f10 elementor-widget elementor-widget-text-editor" data-id="95e0f10" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Is this the only way to prevent SQL injection? Of course not, more methods will be presented on the blog soon.</strong></p>						</div>
				</div>
					</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/a-comprehensive-guide-to-preventing-sql-injection/">A Comprehensive Guide to Preventing SQL Injection</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/a-comprehensive-guide-to-preventing-sql-injection/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Unlocking the Power of LINQ: 7 Rarely Used Queries You Should Know</title>
		<link>https://pawelmajewski.com/unlocking-the-power-of-linq-7-rarely-used-queries-you-should-know/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=unlocking-the-power-of-linq-7-rarely-used-queries-you-should-know</link>
					<comments>https://pawelmajewski.com/unlocking-the-power-of-linq-7-rarely-used-queries-you-should-know/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Wed, 16 Apr 2025 15:47:08 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8690</guid>

					<description><![CDATA[<p>Today, I would like to talk about LINQ. LINQ queries are ubiquitous in the C# world, whether you&#8217;re working with WebAPI, MVC, or Windows Forms applications. But honestly, we are using only a small part of the LINQ methods. Where, Select, OrderBy, ThenBy / ThenByDescending, GroupBy, Join, First, FirstOrDefault, Single, SingleOrDefault, Count, Any, All and some [&#8230;]</p>
<p>The post <a href="https://pawelmajewski.com/unlocking-the-power-of-linq-7-rarely-used-queries-you-should-know/">Unlocking the Power of LINQ: 7 Rarely Used Queries You Should Know</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8690" class="elementor elementor-8690">
				<div class="elementor-element elementor-element-af58197 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="af58197" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-154bc4d elementor-widget elementor-widget-text-editor" data-id="154bc4d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Today, I would like to talk about LINQ. LINQ queries are ubiquitous in the C# world, whether you&#8217;re working with WebAPI, MVC, or Windows Forms applications.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-430f004 elementor-widget elementor-widget-text-editor" data-id="430f004" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>But honestly, we are using only a small part of the LINQ methods.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-bef632a elementor-widget elementor-widget-text-editor" data-id="bef632a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Where</strong><strong>,</strong> <strong>Select, OrderBy, ThenBy / ThenByDescending, GroupBy, Join, First, FirstOrDefault, Single, SingleOrDefault, Count, Any, All </strong>and some aggregate functions for sequence of numeric values like <strong>Sum, Min, Max, Average</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-171f846 elementor-widget elementor-widget-heading" data-id="171f846" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Rarely used queries</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-8121169 elementor-widget elementor-widget-text-editor" data-id="8121169" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Let&#8217;s look on less known methods.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-7254db5 elementor-widget elementor-widget-heading" data-id="7254db5" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">1. Distinct</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-af7b99b elementor-widget elementor-widget-text-editor" data-id="af7b99b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Distinct</strong> exactly like in SQL selects unique elements</p>						</div>
				</div>
				<div class="elementor-element elementor-element-358c1ba elementor-widget elementor-widget-code-block-for-elementor" data-id="358c1ba" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>int[] array = [1, 2, 3, 1, 2];

foreach(int i in array.Distinct())
{
    Console.Write($&quot;{i}, &quot;);
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-5c1d24e elementor-widget elementor-widget-text-editor" data-id="5c1d24e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And the output is: 1, 2, 3,</p>						</div>
				</div>
				<div class="elementor-element elementor-element-c19504e elementor-widget elementor-widget-heading" data-id="c19504e" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">2. Intersect</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-b4e168b elementor-widget elementor-widget-text-editor" data-id="b4e168b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><b>Intersect</b> returns elements existing in both collections</p>						</div>
				</div>
				<div class="elementor-element elementor-element-b527ca6 elementor-widget elementor-widget-code-block-for-elementor" data-id="b527ca6" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>int[] array1 = [1, 2, 3, 4];
int[] array2 = [1, 2];

foreach (int i in array1.Intersect(array2))
{
    Console.Write($&quot;{i}, &quot;);
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-a4753fc elementor-widget elementor-widget-text-editor" data-id="a4753fc" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And the output is: 1, 2,</p>						</div>
				</div>
				<div class="elementor-element elementor-element-ada217b elementor-widget elementor-widget-heading" data-id="ada217b" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">3. Except</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-1496266 elementor-widget elementor-widget-text-editor" data-id="1496266" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><b>Except </b>returns elements from first collection, not existing in the second one</p>						</div>
				</div>
				<div class="elementor-element elementor-element-63cf74e elementor-widget elementor-widget-code-block-for-elementor" data-id="63cf74e" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>int[] array1 = [1, 2, 3, 4];
int[] array2 = [1, 2];

foreach (int i in array1.Except(array2))
{
    Console.Write($&quot;{i}, &quot;);
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-6cf74c3 elementor-widget elementor-widget-text-editor" data-id="6cf74c3" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And the output is: 3, 4,</p>						</div>
				</div>
				<div class="elementor-element elementor-element-ad44786 elementor-widget elementor-widget-heading" data-id="ad44786" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">4. SkipWhile</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-e41351f elementor-widget elementor-widget-text-editor" data-id="e41351f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>SkipWhile</strong> checks the condition for each element in the sequence. When element does not match this predicate, filtering stops, and the rest of the sequence is returned.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-6e380ad elementor-widget elementor-widget-code-block-for-elementor" data-id="6e380ad" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>int[] array1 = [1, 2, 3, 4, 1, 2];

foreach (int i in array1.SkipWhile(x =&gt; x &lt; 3))
{
    Console.Write($&quot;{i}, &quot;);
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-021ad14 elementor-widget elementor-widget-text-editor" data-id="021ad14" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And the output is: 3, 4, 1, 2,</p>						</div>
				</div>
				<div class="elementor-element elementor-element-c3dd5fc elementor-widget elementor-widget-text-editor" data-id="c3dd5fc" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>but</strong></p>						</div>
				</div>
				<div class="elementor-element elementor-element-df73e0e elementor-widget elementor-widget-code-block-for-elementor" data-id="df73e0e" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>int[] array1 = [5, 1, 2, 3, 4, 1, 2];

foreach (int i in array1.SkipWhile(x =&gt; x &lt; 3))
{
    Console.Write($&quot;{i}, &quot;);
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-6a7dd98 elementor-widget elementor-widget-text-editor" data-id="6a7dd98" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And the output is: 5, 1, 2, 3, 4, 1, 2,</p>						</div>
				</div>
				<div class="elementor-element elementor-element-b00ebd5 elementor-widget elementor-widget-text-editor" data-id="b00ebd5" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Because 5 doesn&#8217;t match condition &#8220;x &lt; 3&#8221; and filtering has stopped.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-5d91734 elementor-widget elementor-widget-heading" data-id="5d91734" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">5. Zip</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-52eb8ca elementor-widget elementor-widget-text-editor" data-id="52eb8ca" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Zip</strong> Combines two or more sequences into a single one, output collection length will be the smallest input collection.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-85e45f0 elementor-widget elementor-widget-code-block-for-elementor" data-id="85e45f0" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>int[] array1 = [5, 1, 2, 3, 4, 1, 2];
int[] array2 = [0, 1, 2];

foreach (var i in array1.Zip(array2, (x, y) =&gt; $&quot;[{x}] = {y}&quot;))
{
    Console.Write($&quot;{i}, &quot;);
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-4fc0edb elementor-widget elementor-widget-text-editor" data-id="4fc0edb" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And the output is: [5] = 0, [1] = 1, [2] = 2,</p>						</div>
				</div>
				<div class="elementor-element elementor-element-7104454 elementor-widget elementor-widget-heading" data-id="7104454" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">6. Prepend</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-c48711e elementor-widget elementor-widget-text-editor" data-id="c48711e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Prepend</strong> is similar to <em>Append</em>, but it adds an element at the beginning.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-9233163 elementor-widget elementor-widget-code-block-for-elementor" data-id="9233163" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>int[] array1 = [1, 2];

foreach (var i in array1.Prepend(3))
{
    Console.Write($&quot;{i}, &quot;);
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-e912fd8 elementor-widget elementor-widget-text-editor" data-id="e912fd8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And the output is: 3, 1, 2,</p>						</div>
				</div>
				<div class="elementor-element elementor-element-7460f65 elementor-widget elementor-widget-heading" data-id="7460f65" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">7. ToLookup</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-85f6f14 elementor-widget elementor-widget-text-editor" data-id="85f6f14" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>ToLookup</strong> is one of the most interesting LINQ method <span style="text-align: var(--text-align);">for me</span><span style="text-align: var(--text-align);">. It allows us to create groups just like <em>GroupBy</em>, but with immediate execution.</span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-f8b2d8c elementor-widget elementor-widget-code-block-for-elementor" data-id="f8b2d8c" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>Car[] array1 = [new Car(&quot;Name1&quot;, &quot;AwesomeBrand&quot;), new Car(&quot;Name2&quot;, &quot;AwesomeBrand&quot;), new Car(&quot;Name3&quot;, &quot;AwesomeBrand&quot;), new Car(&quot;Name4&quot;, &quot;NormalBrand&quot;)];

foreach (var i in array1.ToLookup(x =&gt; x.Brand))
{
    Console.WriteLine($&quot;{i.Key}: {string.Join(&#039;,&#039;, i.Select(x =&gt; x.Name))}&quot;);
}

record Car(string Name, string Brand);</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-a41bb71 elementor-widget elementor-widget-text-editor" data-id="a41bb71" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And the output is:</p><p>AwesomeBrand: Name1,Name2,Name3<br />NormalBrand: Name4</p>						</div>
				</div>
				<div class="elementor-element elementor-element-175fe80 elementor-widget elementor-widget-text-editor" data-id="175fe80" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>I wanted highlight these seven useful yet often forgotten methods in LINQ, even though there are many more worth exploring.</strong></p>						</div>
				</div>
					</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/unlocking-the-power-of-linq-7-rarely-used-queries-you-should-know/">Unlocking the Power of LINQ: 7 Rarely Used Queries You Should Know</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/unlocking-the-power-of-linq-7-rarely-used-queries-you-should-know/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Chat GPT and refactor?</title>
		<link>https://pawelmajewski.com/chat-gpt-and-refactor/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=chat-gpt-and-refactor</link>
					<comments>https://pawelmajewski.com/chat-gpt-and-refactor/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Tue, 08 Apr 2025 19:56:00 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[refactor]]></category>
		<category><![CDATA[simplify]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8667</guid>

					<description><![CDATA[<p>In this post How to generate website using Chat GPT I checked how ChatGPT is doing with generating the layout. Today, we will see how it copes with the refactoring. Variables chain var x = 5; var a = x; var b = a; var c = b; Console.WriteLine(c); var d = c; var e = [&#8230;]</p>
<p>The post <a href="https://pawelmajewski.com/chat-gpt-and-refactor/">Chat GPT and refactor?</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8667" class="elementor elementor-8667">
				<div class="elementor-element elementor-element-6820572 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="6820572" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-e94ecda elementor-widget elementor-widget-text-editor" data-id="e94ecda" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>In this post <a title="How to generate website using Chat GPT" href="https://pawelmajewski.com/how-to-generate-website-using-chat-gpt/" target="_blank" rel="noopener">How to generate website using Chat GPT</a> I checked how <a href="https://chat.openai.com/" target="_blank" rel="noopener">ChatGPT</a> is doing with generating the layout.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-097b4a7 elementor-widget elementor-widget-text-editor" data-id="097b4a7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Today, we will see how it copes with the refactoring.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f5cea40 elementor-widget elementor-widget-heading" data-id="f5cea40" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Variables chain</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-69c2cc4 elementor-widget elementor-widget-code-block-for-elementor" data-id="69c2cc4" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>var x = 5;
var a = x;
var b = a;
var c = b;
Console.WriteLine(c);
var d = c;
var e = d;
var f = e + 1;
var g = f;
var h = g;
Console.WriteLine(g);</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-babd9a5 elementor-widget elementor-widget-image" data-id="babd9a5" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="767" height="1024" src="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h22_11-767x1024.png" class="attachment-large size-large wp-image-8669" alt="chat gpt refactor" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h22_11-767x1024.png 767w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h22_11-225x300.png 225w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h22_11-768x1025.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h22_11.png 845w" sizes="auto, (max-width: 767px) 100vw, 767px" />													</div>
				</div>
				<div class="elementor-element elementor-element-caf5521 elementor-widget elementor-widget-text-editor" data-id="caf5521" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>That&#8217;s not exactly what I meant.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-6cbbd97 elementor-widget elementor-widget-text-editor" data-id="6cbbd97" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Let&#8217;s try it differently.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f134df7 elementor-widget elementor-widget-image" data-id="f134df7" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="747" height="642" src="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h24_46.png" class="attachment-large size-large wp-image-8670" alt="chat gpt simplify" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h24_46.png 747w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h24_46-300x258.png 300w" sizes="auto, (max-width: 747px) 100vw, 747px" />													</div>
				</div>
				<div class="elementor-element elementor-element-f4e47b4 elementor-widget elementor-widget-text-editor" data-id="f4e47b4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Much better.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-6959667 elementor-widget elementor-widget-heading" data-id="6959667" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Complicated LINQ</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-fa39279 elementor-widget elementor-widget-code-block-for-elementor" data-id="fa39279" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>int[] numbers = { 1, 2, 3, 4, 5 };

var result = numbers
    .Where(n =&gt; n % 2 == 0)
    .Select(n =&gt; n * n)
    .OrderByDescending(n =&gt; n)
    .Skip(1)
    .TakeWhile((n, index) =&gt; index &lt; 2 || n &gt; 10)
    .Sum();

Console.WriteLine(result);</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-600e150 elementor-widget elementor-widget-text-editor" data-id="600e150" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Okay, time to ask ChatGPT what can we do with this piece of code.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-bb118f3 elementor-widget elementor-widget-image" data-id="bb118f3" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="797" height="897" src="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h34_12.png" class="attachment-large size-large wp-image-8674" alt="chat gpt attempt 4" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h34_12.png 797w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h34_12-267x300.png 267w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h34_12-768x864.png 768w" sizes="auto, (max-width: 797px) 100vw, 797px" />													</div>
				</div>
				<div class="elementor-element elementor-element-c058728 elementor-widget elementor-widget-text-editor" data-id="c058728" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I&#8217;m pasting here the code provided by ChatGPT, which allows you to verify that I&#8217;m not lying.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-ef3c5a4 elementor-widget elementor-widget-code-block-for-elementor" data-id="ef3c5a4" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>int[] numbers = { 1, 2, 3, 4, 5 };

var result = numbers
    .Where(n =&gt; n % 2 == 0)
    .Select(n =&gt; n * n)
    .OrderByDescending(n =&gt; n)
    .TakeWhile((n, index) =&gt; index &lt; 2 || (index == 2 &amp;&amp; n &gt; 10))
    .Sum();

Console.WriteLine(result);
</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-e538db0 elementor-widget elementor-widget-text-editor" data-id="e538db0" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>This code changes the result. The original code returned 4, but now it&#8217;s 20. Tell that to ChatGPT and watch how it will react.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-8e7832e elementor-widget elementor-widget-image" data-id="8e7832e" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="776" height="616" src="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h38_02.png" class="attachment-large size-large wp-image-8675" alt="chat gpt failure" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h38_02.png 776w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h38_02-300x238.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h38_02-768x610.png 768w" sizes="auto, (max-width: 776px) 100vw, 776px" />													</div>
				</div>
				<div class="elementor-element elementor-element-ca30fb6 elementor-widget elementor-widget-code-block-for-elementor" data-id="ca30fb6" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>int[] numbers = { 1, 2, 3, 4, 5 };

var result = numbers
    .Where(n =&gt; n % 2 == 0)
    .Select(n =&gt; n * n)
    .OrderByDescending(n =&gt; n)
    .TakeWhile((n, index) =&gt; index &lt; 2 || (index == 2 &amp;&amp; n &gt; 10))
    .Sum();

Console.WriteLine(result);
</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-296da9b elementor-widget elementor-widget-text-editor" data-id="296da9b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ok, let&#8217;s see.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-1989617 elementor-widget elementor-widget-image" data-id="1989617" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="354" src="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h41_49-1024x354.png" class="attachment-large size-large wp-image-8676" alt="Chat gpt wrong answer" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h41_49-1024x354.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h41_49-300x104.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h41_49-768x266.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h41_49.png 1142w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-ac269f4 elementor-widget elementor-widget-text-editor" data-id="ac269f4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>ChatGPT said that this code would now return 4 as a result, but as you can see, it&#8217;s still 20.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0b83305 elementor-widget elementor-widget-text-editor" data-id="0b83305" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>My answer for this is</p>						</div>
				</div>
				<div class="elementor-element elementor-element-cd4cc14 elementor-widget elementor-widget-image" data-id="cd4cc14" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
										<figure class="wp-caption">
										<img loading="lazy" decoding="async" loading="lazy" width="1024" height="512" src="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h43_55-1024x512.png" class="attachment-large size-large wp-image-8677" alt="something went wrong" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h43_55-1024x512.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h43_55-300x150.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h43_55-768x384.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h43_55-1536x767.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/05/2024-05-06_20h43_55-2048x1023.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />											<figcaption class="widget-image-caption wp-caption-text">something went wrong</figcaption>
										</figure>
							</div>
				</div>
				<div class="elementor-element elementor-element-f486484 elementor-widget elementor-widget-text-editor" data-id="f486484" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Yes, I know ChatGPT is capable of performing good refactoring, but we still need to double-check everything based on ChatGPT&#8217;s answer.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-d51dadc elementor-widget elementor-widget-text-editor" data-id="d51dadc" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>ChatGPT is wonderful tool, but again &#8211; it&#8217;s not medicine for every problem.</p>						</div>
				</div>
					</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/chat-gpt-and-refactor/">Chat GPT and refactor?</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/chat-gpt-and-refactor/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Using Visual Studio Code to create .NET application</title>
		<link>https://pawelmajewski.com/using-visual-studio-code-to-create-net-application/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-visual-studio-code-to-create-net-application</link>
					<comments>https://pawelmajewski.com/using-visual-studio-code-to-create-net-application/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Wed, 02 Apr 2025 17:21:33 +0000</pubDate>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Comparison]]></category>
		<category><![CDATA[Visual Studio Code]]></category>
		<category><![CDATA[VSC]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8607</guid>

					<description><![CDATA[<p>Many of us use Visual Studio Code for frontend purposes, but how about using it to develop an .NET Applications? I always use Visual Studio or Rider to develop .NET apps, but today, I&#8217;ll create a simple TODO application using Visual Studio Code to check if I&#8217;m able to create the application in a convenient [&#8230;]</p>
<p>The post <a href="https://pawelmajewski.com/using-visual-studio-code-to-create-net-application/">Using Visual Studio Code to create .NET application</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8607" class="elementor elementor-8607">
				<div class="elementor-element elementor-element-bd9a7f3 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="bd9a7f3" data-element_type="container">
				<div class="elementor-element elementor-element-25bf6fa elementor-widget elementor-widget-text-editor" data-id="25bf6fa" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Many of us use Visual Studio Code for frontend purposes, but how about using it to develop an .NET Applications?</p>						</div>
				</div>
				<div class="elementor-element elementor-element-99e481f elementor-widget elementor-widget-text-editor" data-id="99e481f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I always use Visual Studio or Rider to develop .NET apps, but today, I&#8217;ll create a simple TODO application using Visual Studio Code to check if I&#8217;m able to create the application in a convenient way.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-3bb76d3 elementor-widget elementor-widget-image" data-id="3bb76d3" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="614" src="https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.01.38-1024x614.png" class="attachment-large size-large wp-image-8614" alt="visual studio code main window" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.01.38-1024x614.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.01.38-300x180.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.01.38-768x461.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.01.38-1536x921.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.01.38-2048x1229.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-fd6c92e elementor-widget elementor-widget-text-editor" data-id="fd6c92e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>As first glance, we can see the &#8220;Create .NET Project&#8221; button which allows us to create an application with a few clicks.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-ab96d49 elementor-widget elementor-widget-image" data-id="ab96d49" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="614" src="https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.04.09-1024x614.png" class="attachment-large size-large wp-image-8615" alt="create .NET application menu" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.04.09-1024x614.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.04.09-300x180.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.04.09-768x461.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.04.09-1536x921.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-17.04.09-2048x1229.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-7e98f09 elementor-widget elementor-widget-text-editor" data-id="7e98f09" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I&#8217;ll choose standard MVC application as easiest way to test VSC in real application.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-1cf9b9d elementor-widget elementor-widget-code-block-for-elementor" data-id="1cf9b9d" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>public class TodoItem
{
    public string Title { get; set; }
    public string Description { get; set; }
    public TodoItemStatus Status { get; set; }
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-7c83a1b elementor-widget elementor-widget-text-editor" data-id="7c83a1b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I&#8217;ve modified HomeController and added TodoItems storage as static list</p>						</div>
				</div>
				<div class="elementor-element elementor-element-69c0356 elementor-widget elementor-widget-code-block-for-elementor" data-id="69c0356" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>    public static List&lt;TodoItem&gt; TodoItems = [
        new() {
            Title = &quot;Write new post&quot;,
            Description = &quot;Go to the pawelmajewski.com and add a new post&quot;,
            Status = TodoItemStatus.New
        }
    ];</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-9fcfbf4 elementor-widget elementor-widget-text-editor" data-id="9fcfbf4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And the result</p>						</div>
				</div>
				<div class="elementor-element elementor-element-3a598d8 elementor-widget elementor-widget-image" data-id="3a598d8" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="585" src="https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.15.37-1024x585.png" class="attachment-large size-large wp-image-8622" alt="" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.15.37-1024x585.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.15.37-300x171.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.15.37-768x439.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.15.37-1536x878.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.15.37-2048x1170.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-a5ad819 elementor-widget elementor-widget-text-editor" data-id="a5ad819" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ok, let&#8217;s stop at this moment. I&#8217;ll write something about using Visual Studio Code and the feeling of using it instead of a dedicated IDE created for .NET applications.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-5f2a4cf elementor-widget elementor-widget-image" data-id="5f2a4cf" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="533" src="https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.26.09-1024x533.png" class="attachment-large size-large wp-image-8623" alt="TodoItem class" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.26.09-1024x533.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.26.09-300x156.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.26.09-768x399.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.26.09.png 1242w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-6f70e00 elementor-widget elementor-widget-text-editor" data-id="6f70e00" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>As you can see, VSC doesn&#8217;t add namespace by default.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-21d5c6d elementor-widget elementor-widget-image" data-id="21d5c6d" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="618" src="https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.29.11-1024x618.png" class="attachment-large size-large wp-image-8624" alt="add namespace" srcset="https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.29.11-1024x618.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.29.11-300x181.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.29.11-768x464.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/05/Screenshot-2024-05-03-at-18.29.11.png 1176w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-83fbfb7 elementor-widget elementor-widget-text-editor" data-id="83fbfb7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>None of these options generate correct namespace automatically. The first option ends word to full &#8220;namespace&#8221; and the second one creates new namespace scope. Too bad I couldn&#8217;t find such an option to generate correct namespace with consideration for the folder structure.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-ccb8065 elementor-alert-info elementor-widget elementor-widget-alert" data-id="ccb8065" data-element_type="widget" data-widget_type="alert.default">
				<div class="elementor-widget-container">
					<div class="elementor-alert" role="alert">

						<span class="elementor-alert-title">I've found solution</span>
			
						<span class="elementor-alert-description">There are several extensions allowing create class with namespace automatically. You can read more about it <a target="_blank" href="https://stackoverflow.com/questions/33485643/vscode-snippet-for-creating-new-c-sharp-class-with-namespace-declaration">Stack overflow</a></span>
			
			
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-5db7acb elementor-widget elementor-widget-heading" data-id="5db7acb" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Summary</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-dfe5adc elementor-widget elementor-widget-text-editor" data-id="dfe5adc" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Visual Studio Code is amazing software with a vast amount of extensions. We can easily develop .NET applications using Visual Studio Code. There are many extensions available that make our job faster and more convenient. However, in my opinion, the usage of dedicated IDEs is a better option. I&#8217;ll stay with Rider / Visual Studio for .NET and Visual Studio Code for frontend 🙂</p>						</div>
				</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/using-visual-studio-code-to-create-net-application/">Using Visual Studio Code to create .NET application</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/using-visual-studio-code-to-create-net-application/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Injection in C# Application: An Example</title>
		<link>https://pawelmajewski.com/sql-injection-in-c-application-an-example/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sql-injection-in-c-application-an-example</link>
					<comments>https://pawelmajewski.com/sql-injection-in-c-application-an-example/#comments</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Sat, 22 Mar 2025 19:18:38 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Sql injection]]></category>
		<category><![CDATA[Vulnerabilities]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8524</guid>

					<description><![CDATA[<p>Today, I&#8217;ll show you some code vulnerable to SQL Injection. We will talk about good and bad practices. At the end I&#8217;ll tell you which option is in my opinion the best one and why. So&#8230; Let&#8217;s get started&#8230; Remember! Do not do anything that has been shown here in real applications; you may face [&#8230;]</p>
<p>The post <a href="https://pawelmajewski.com/sql-injection-in-c-application-an-example/">SQL Injection in C# Application: An Example</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8524" class="elementor elementor-8524">
				<div class="elementor-element elementor-element-8b23987 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="8b23987" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-946045e elementor-widget elementor-widget-heading" data-id="946045e" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Today, I'll show you some code vulnerable to SQL Injection. We will talk about good and bad practices. At the end I'll tell you which option is in my opinion the best one and why.<br><br><br>So... Let's get started...</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-c504a06 elementor-alert-danger elementor-widget elementor-widget-alert" data-id="c504a06" data-element_type="widget" data-widget_type="alert.default">
				<div class="elementor-widget-container">
					<div class="elementor-alert" role="alert">

						<span class="elementor-alert-title">Remember!</span>
			
						<span class="elementor-alert-description">Do not do anything that has been shown here in real applications; you may face legal and financial consequences.</span>
			
			
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-50d9a95 elementor-widget elementor-widget-text-editor" data-id="50d9a95" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>To try to do something with SQL, we need a new table in our fake database.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-790ca10 elementor-widget elementor-widget-image" data-id="790ca10" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="396" height="162" src="https://pawelmajewski.com/wp-content/uploads/2024/04/users.png" class="attachment-large size-large wp-image-8526" alt="users table" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/users.png 396w, https://pawelmajewski.com/wp-content/uploads/2024/04/users-300x123.png 300w" sizes="auto, (max-width: 396px) 100vw, 396px" />													</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-14bcc78 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="14bcc78" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-47d2f81 elementor-widget elementor-widget-text-editor" data-id="47d2f81" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Now, have a look at this ugly code&#8230;</p><p>What do we have here?</p><p>We have a POST endpoint /login which receives two strings, email and password.</p><p> </p><p>This endpoint connects to the database and executes a command to select the first match of a user where the email and password (in plain text for testing purposes 🙃) match the provided data.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-a1744f4 elementor-widget elementor-widget-code-block-for-elementor" data-id="a1744f4" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>app.MapPost(&quot;/login&quot;, (string email, string password) =&gt;
{
    const string connectionString = &quot;Data Source=localhost;Initial Catalog=TestSqlInjection;Integrated Security=true;TrustServerCertificate=true;&quot;;
    using var connection = new SqlConnection(connectionString);
    using var command = connection.CreateCommand();
    command.CommandText = $&quot;SELECT * FROM USERS WHERE Email = &#039;{email}&#039; AND Password = &#039;{password}&#039;;&quot;;
    connection.Open();
    using var reader = command.ExecuteReader();
    reader.Read();
    
    return new User(Convert.ToInt32(reader[&quot;Id&quot;]), reader[&quot;Email&quot;].ToString()!);
})
.WithName(&quot;Login&quot;)
.WithOpenApi();</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-316b5ce elementor-widget elementor-widget-text-editor" data-id="316b5ce" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>This code has couple of minor errors.</p><p>Command is concatenated from user&#8217;s data without any validation or using sql parameters.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-27d9cb6 elementor-widget elementor-widget-text-editor" data-id="27d9cb6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Okay, let&#8217;s add some users</p>						</div>
				</div>
				<div class="elementor-element elementor-element-bceaf42 elementor-widget elementor-widget-code-block-for-elementor" data-id="bceaf42" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-sql'>SELECT TOP (1000) [Id]
      ,[Email]
      ,[Password]
  FROM [TestSqlInjection].[dbo].[Users]</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-ad967b9 elementor-widget elementor-widget-image" data-id="ad967b9" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="300" height="156" src="https://pawelmajewski.com/wp-content/uploads/2024/04/users_in_db_2.png" class="attachment-large size-large wp-image-8534" alt="users_in_db_2" />													</div>
				</div>
				<div class="elementor-element elementor-element-dff591e elementor-widget elementor-widget-text-editor" data-id="dff591e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>okay, there we have it. Let&#8217;s try to log in to our application with email &#8220;<strong>tester@example.com</strong>&#8221; and password &#8220;<strong>qwe</strong>&#8220;.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-5c57408 elementor-widget elementor-widget-image" data-id="5c57408" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="700" src="https://pawelmajewski.com/wp-content/uploads/2024/04/response_ok-1024x700.png" class="attachment-large size-large wp-image-8535" alt="" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/response_ok-1024x700.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/response_ok-300x205.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/response_ok-768x525.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/response_ok-1536x1050.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/response_ok.png 1794w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-3372fb4 elementor-widget elementor-widget-text-editor" data-id="3372fb4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>It looks like it&#8217;s working, doesn&#8217;t it? Don&#8217;t fall for it.</p><p> </p>						</div>
				</div>
				<div class="elementor-element elementor-element-74b3cd4 elementor-widget elementor-widget-text-editor" data-id="74b3cd4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>There are many things that can be done with our dirty backend code. Try logging in as &#8220;<a target="_new"><strong>tester@example.com</strong>&#8220;</a> without knowing its password.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-648d321 elementor-widget elementor-widget-image" data-id="648d321" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="629" src="https://pawelmajewski.com/wp-content/uploads/2024/04/login_without_knowing_password-1-1024x629.png" class="attachment-large size-large wp-image-8537" alt="login_without_knowing_password" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/login_without_knowing_password-1-1024x629.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/login_without_knowing_password-1-300x184.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/login_without_knowing_password-1-768x472.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/login_without_knowing_password-1-1536x944.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/login_without_knowing_password-1-570x350.png 570w, https://pawelmajewski.com/wp-content/uploads/2024/04/login_without_knowing_password-1.png 1811w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-ea0f647 elementor-widget elementor-widget-text-editor" data-id="ea0f647" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Let&#8217;s enter the following code as the password.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-08eb17e elementor-widget elementor-widget-code-block-for-elementor" data-id="08eb17e" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-sql'>&#039; or 1=1--</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-8db4894 elementor-widget elementor-widget-text-editor" data-id="8db4894" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Explanation:</p><p>SELECT * FROM USERS WHERE Email = &#8216;{email}&#8217; AND Password = &#8216;<strong>{password}</strong>&#8216;;</p><p>The bolded part will be replaced with the password provided by the user. So, we are using a <strong>&#8216; </strong>(single quote) as the end of the string. Do you see it? In the SQL clause, we have:</p><p>AND Password = &#8216;<strong>{password}</strong>&#8216;;</p><p>When we use a single quote as the first character, we end this clause. Then we start a new clause, <strong>OR 1 = 1</strong>, which is always true.</p><p>What is the role of the <b>&#8212;</b> (SQL comment syntax) at the end?</p><p>Without this, our query would end with a single quote character, which is invalid SQL. We have to comment out the rest of the code after the password to ensure that our query will end with <b>OR 1 = 1</b>. Without this, we would get the following error:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-97f4823 elementor-widget elementor-widget-text-editor" data-id="97f4823" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Unclosed quotation mark after the character string &#8216;;<br />&#8216;.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-50f185e elementor-widget elementor-widget-text-editor" data-id="50f185e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>So the final clause is</p>						</div>
				</div>
				<div class="elementor-element elementor-element-3774c91 elementor-widget elementor-widget-code-block-for-elementor" data-id="3774c91" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-sql'>SELECT * FROM USERS WHERE Email = &#039;tester@example.com&#039; AND Password = &#039;&#039; or 1=1--&#039;;</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-7ff58ee elementor-widget elementor-widget-text-editor" data-id="7ff58ee" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Without security measures, someone could steal sensitive data. We can log in as any registered user.</p><p>If what we just did happened in a real application, it would definitely be a breach of GDPR in Europe.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f05faef elementor-widget elementor-widget-text-editor" data-id="f05faef" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Let&#8217;s get back on topic, though. Is that all we can do?</p>						</div>
				</div>
				<div class="elementor-element elementor-element-1899b7f elementor-widget elementor-widget-text-editor" data-id="1899b7f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>How about destroying data?</p><p>Of course system hacker can use that trick to destroy our data. Have a look:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-c59a99e elementor-widget elementor-widget-code-block-for-elementor" data-id="c59a99e" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-sql'>&#039;; update users set password = &#039;newpass&#039;--</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-551414f elementor-widget elementor-widget-text-editor" data-id="551414f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The final clause is</p>						</div>
				</div>
				<div class="elementor-element elementor-element-10c7f16 elementor-widget elementor-widget-code-block-for-elementor" data-id="10c7f16" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-sql'>SELECT * FROM USERS WHERE Email = &#039;tester@example.com&#039; AND Password = &#039;&#039;; update users set password = &#039;newpass&#039;--&#039;;</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-31fc5ca elementor-widget elementor-widget-text-editor" data-id="31fc5ca" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And the result? Please</p>						</div>
				</div>
				<div class="elementor-element elementor-element-83173ab elementor-widget elementor-widget-image" data-id="83173ab" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="322" height="158" src="https://pawelmajewski.com/wp-content/uploads/2024/04/updated-users.png" class="attachment-large size-large wp-image-8541" alt="updated users" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/updated-users.png 322w, https://pawelmajewski.com/wp-content/uploads/2024/04/updated-users-300x147.png 300w" sizes="auto, (max-width: 322px) 100vw, 322px" />													</div>
				</div>
				<div class="elementor-element elementor-element-4eaf53a elementor-widget elementor-widget-text-editor" data-id="4eaf53a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Our application has a bug. When no user has been found, we&#8217;re getting an exception,  but that doesn&#8217;t matter because I wanted this application to have nothing but the essentials for testing our SQL.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0ae081b elementor-widget elementor-widget-image" data-id="0ae081b" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="337" src="https://pawelmajewski.com/wp-content/uploads/2024/04/exception-1024x337.png" class="attachment-large size-large wp-image-8545" alt="exception" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/exception-1024x337.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/exception-300x99.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/exception-768x253.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/exception-1536x506.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/exception.png 1658w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-267562b elementor-widget elementor-widget-text-editor" data-id="267562b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Okay, what&#8217;s stopping us from clearing our table? Nothing.</p><p>Let&#8217;s check the following password</p>						</div>
				</div>
				<div class="elementor-element elementor-element-235460c elementor-widget elementor-widget-code-block-for-elementor" data-id="235460c" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-sql'>&#039;; delete from users--</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-8fdcfe6 elementor-widget elementor-widget-text-editor" data-id="8fdcfe6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The final clause</p>						</div>
				</div>
				<div class="elementor-element elementor-element-a866a1a elementor-widget elementor-widget-code-block-for-elementor" data-id="a866a1a" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-sql'>SELECT * FROM USERS WHERE Email = &#039;tester@example.com&#039; AND Password = &#039;&#039;; delete from users--&#039;;</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-63d7c41 elementor-widget elementor-widget-text-editor" data-id="63d7c41" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Of course there&#8217;s an exception in our application but what&#8217;s happened in our database?</p>						</div>
				</div>
				<div class="elementor-element elementor-element-18a649a elementor-widget elementor-widget-image" data-id="18a649a" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="1024" height="370" src="https://pawelmajewski.com/wp-content/uploads/2024/04/select-query-1024x370.png" class="attachment-large size-large wp-image-8546" alt="" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/select-query-1024x370.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/select-query-300x108.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/select-query-768x277.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/select-query.png 1033w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />													</div>
				</div>
				<div class="elementor-element elementor-element-6801376 elementor-widget elementor-widget-text-editor" data-id="6801376" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>We lost all of them.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-6a19180 elementor-widget elementor-widget-heading" data-id="6a19180" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">How can we avoid SQL Injection? That will be in the next post.</h3>		</div>
				</div>
					</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/sql-injection-in-c-application-an-example/">SQL Injection in C# Application: An Example</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/sql-injection-in-c-application-an-example/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>How to create simple healthcheck in 5 minutes</title>
		<link>https://pawelmajewski.com/how-to-create-simple-healthcheck-in-5-minutes/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-create-simple-healthcheck-in-5-minutes</link>
					<comments>https://pawelmajewski.com/how-to-create-simple-healthcheck-in-5-minutes/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Tue, 04 Mar 2025 17:07:00 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[downtime]]></category>
		<category><![CDATA[Healthcheck]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[Website]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8648</guid>

					<description><![CDATA[<p>In the past, when I used a different hosting provider than I do now, I often encountered situations where the website was unavailable. How can we check if a website is accessible without constantly refreshing it in the browser? Just write your own app! First, let&#8217;s think about what we want to do. Application requirements [&#8230;]</p>
<p>The post <a href="https://pawelmajewski.com/how-to-create-simple-healthcheck-in-5-minutes/">How to create simple healthcheck in 5 minutes</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8648" class="elementor elementor-8648">
				<div class="elementor-element elementor-element-0171db9 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent" data-id="0171db9" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-fa1f027 elementor-widget elementor-widget-text-editor" data-id="fa1f027" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>In the past, when I used a different hosting provider than I do now, I often encountered situations where the website was unavailable.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-8bfb469 elementor-widget elementor-widget-heading" data-id="8bfb469" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">How can we check if a website is accessible without constantly refreshing it in the browser?</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-b857a05 elementor-widget elementor-widget-heading" data-id="b857a05" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Just write your own app!</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-cf7f752 elementor-widget elementor-widget-text-editor" data-id="cf7f752" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>First, let&#8217;s think about what we want to do.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-89581b2 poket-star-rating--align-center elementor-widget elementor-widget-witr_section_list" data-id="89581b2" data-element_type="widget" data-widget_type="witr_section_list.default">
				<div class="elementor-widget-container">
					
			<div class="departmentList all_list_color">
				<!-- title -->
								<h3>Application requirements </h3>
				
					<ul>
																		<li>
																<span>
																			<i class="fas fa-angle-double-right"></i>
									We want the ability to pass multiple URLs to the application								</span>
							</li>
													<li>
																<span>
																			<i class="fas fa-angle-double-right"></i>
									We haven't time, so our choice will be Console application😊								</span>
							</li>
													<li>
																<span>
																			<i class="fas fa-angle-double-right"></i>
									The application should inform us whether the request has returned a success status code or has failed.								</span>
							</li>
													<li>
																<span>
																			<i class="fas fa-angle-double-right"></i>
									To avoid being banned for DDoS, the application should incorporate a delay.between requests								</span>
							</li>
											
					</ul>					
				<!-- button -->
								
			</div>		

				</div>
				</div>
				<div class="elementor-element elementor-element-0c58aaf elementor-widget elementor-widget-text-editor" data-id="0c58aaf" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>You can read more about <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack" target="_blank" rel="noopener">DDoS attack here</a>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0ea7e6c elementor-alert-danger elementor-widget elementor-widget-alert" data-id="0ea7e6c" data-element_type="widget" data-widget_type="alert.default">
				<div class="elementor-widget-container">
					<div class="elementor-alert" role="alert">

						<span class="elementor-alert-title">Possibility of being banned</span>
			
						<span class="elementor-alert-description">You have to handle the given code very carefully, as placing the delay incorrectly could result in your application unintentionally launching DDoS attacks on the provided websites.</span>
			
						<button type="button" class="elementor-alert-dismiss">
									<span aria-hidden="true">&times;</span>
								<span class="elementor-screen-only">Dismiss this alert.</span>
			</button>
			
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-a2b9181 elementor-widget elementor-widget-text-editor" data-id="a2b9181" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I will paste here entire code and then we&#8217;ll talk about it closer.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f061941 elementor-widget elementor-widget-code-block-for-elementor" data-id="f061941" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>class Program
{
    static async Task Main(string[] args)
    {
        const string fileName = &quot;sites.txt&quot;;
        TimeSpan delay = TimeSpan.FromSeconds(10);
        var fileContent = await ValidateFileAsync(fileName);
        var urlsWithClients = PrepareUrls(fileContent);

        await RunInfinity(urlsWithClients, delay);
    }

    static async Task&lt;bool&gt; IsAliveAsync(HttpClient httpClient)
    {
        try
        {
            var result = await httpClient.GetAsync(string.Empty);

            return result.IsSuccessStatusCode;
        } catch
        {

        }

        return false;
    }

    static async Task&lt;string[]&gt; ValidateFileAsync(string filePath)
    {
        var doesFileExist = File.Exists(filePath);

        if (!doesFileExist)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(&quot;Couldn&#039;t find file&quot;);
            Console.ResetColor();

            return [];
        }

        var fileContent = await File.ReadAllLinesAsync(filePath);

        if(!fileContent.Any())
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(&quot;There is no url in file&quot;);
            Console.ResetColor();
        }

        return fileContent;
    }

    static (string Url, HttpClient httpClient)[] PrepareUrls(IEnumerable&lt;string&gt; urls)
    {
        return urls.Select(x =&gt; {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri(x)
            };

            return (x, httpClient);
        }).ToArray();
    }

    static Task RunInfinity(IEnumerable&lt;(string Url, HttpClient httpClient)&gt; urls, TimeSpan delay)
    {
        return Task.Run(async () =&gt;
        {
            while (true)
            {
                foreach (var (x, httpClient) in urls)
                {
                    var isAlive = await IsAliveAsync(httpClient);

                    Console.Write($&quot;{DateTime.Now:dd-MM HH:mm:ss}\tUrl: {x}\t&quot;);
                    if (isAlive)
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine(&quot;OK&quot;);
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine(&quot;FAILED&quot;);
                    }
                    Console.ResetColor();

                }

                await Task.Delay(delay);
            }
        });
    }
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-5ab100c elementor-widget elementor-widget-text-editor" data-id="5ab100c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Let&#8217;s start analyzing 🙂</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f9b869a elementor-widget elementor-widget-text-editor" data-id="f9b869a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>The main function</p>						</div>
				</div>
				<div class="elementor-element elementor-element-4d8737c elementor-widget elementor-widget-code-block-for-elementor" data-id="4d8737c" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>        const string fileName = &quot;sites.txt&quot;;
        TimeSpan delay = TimeSpan.FromSeconds(10);
        var fileContent = await ValidateFileAsync(fileName);
        var urlsWithClients = PrepareUrls(fileContent);

        await RunInfinity(urlsWithClients, delay);</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-0bb7bdf elementor-widget elementor-widget-text-editor" data-id="0bb7bdf" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>First two lines are our configuration. When creating this application, I assumed that the user will provide urls to check in file named sites.txt and this file will be next to .exe file. I aimed to keep it as straightforward as I could.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-dbfc2ae elementor-widget elementor-widget-text-editor" data-id="dbfc2ae" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Then we have simple validation, I think we can just skip it. I added it only because I got an exception during development 😁</p>						</div>
				</div>
				<div class="elementor-element elementor-element-d1f437c elementor-widget elementor-widget-text-editor" data-id="d1f437c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I didn&#8217;t want to read the file twice, so the validation function immediately passes on the read data.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-d876165 elementor-widget elementor-widget-code-block-for-elementor" data-id="d876165" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>    static (string Url, HttpClient httpClient)[] PrepareUrls(IEnumerable&lt;string&gt; urls)
    {
        return urls.Select(x =&gt; {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri(x)
            };

            return (x, httpClient);
        }).ToArray();
    }</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-73aecbe elementor-widget elementor-widget-text-editor" data-id="73aecbe" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I think this is a good place to refactor. We don&#8217;t need a <strong>tuple</strong> with a <strong>string</strong> and <strong>HttpClient</strong> here. Since <strong>HttpClient</strong> already contains <strong>BaseAddress</strong> itself, we could retrieve this information directly from it.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-5562e61 elementor-widget elementor-widget-text-editor" data-id="5562e61" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Function <strong>IsAliveAsync</strong> is only wrapper for <strong>GetAsync</strong> method.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-48ea889 elementor-widget elementor-widget-text-editor" data-id="48ea889" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>And last our system&#8217;s core, our heart beating method</p>						</div>
				</div>
				<div class="elementor-element elementor-element-9fc7dee elementor-widget elementor-widget-code-block-for-elementor" data-id="9fc7dee" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>        return Task.Run(async () =&gt;
        {
            while (true)
            {
                foreach (var (x, httpClient) in urls)
                {
                    var isAlive = await IsAliveAsync(httpClient);

                    Console.Write($&quot;{DateTime.Now:dd-MM HH:mm:ss}\tUrl: {x}\t&quot;);
                    if (isAlive)
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine(&quot;OK&quot;);
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine(&quot;FAILED&quot;);
                    }
                    Console.ResetColor();

                }

                await Task.Delay(delay);
            }
        });</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-7c7c972 elementor-widget elementor-widget-text-editor" data-id="7c7c972" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>What are we doing here? There are just two loops, one while loop, which with Task.Delay (line 24) will be our beating heart.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-ab65c67 elementor-widget elementor-widget-text-editor" data-id="ab65c67" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Inside while loop is loop over our urls and and that&#8217;s it, no philosophy involved.</p><p>Additionally, one &#8220;if&#8221; statement to check whether the request was successful or not.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-259e9a5 elementor-widget elementor-widget-heading" data-id="259e9a5" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">How it works?</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-26480f9 elementor-widget elementor-widget-text-editor" data-id="26480f9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Create file with urls</p>						</div>
				</div>
				<div class="elementor-element elementor-element-34c115c elementor-widget elementor-widget-image" data-id="34c115c" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="288" height="150" src="https://pawelmajewski.com/wp-content/uploads/2024/03/2024-05-06_19h54_07.png" class="attachment-large size-large wp-image-8663" alt="file with urls" />													</div>
				</div>
				<div class="elementor-element elementor-element-7e2a670 elementor-widget elementor-widget-text-editor" data-id="7e2a670" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Start application</p>						</div>
				</div>
				<div class="elementor-element elementor-element-36b6193 elementor-widget elementor-widget-image" data-id="36b6193" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" loading="lazy" width="979" height="512" src="https://pawelmajewski.com/wp-content/uploads/2024/03/2024-05-06_18h56_02.png" class="attachment-large size-large wp-image-8662" alt="application result" srcset="https://pawelmajewski.com/wp-content/uploads/2024/03/2024-05-06_18h56_02.png 979w, https://pawelmajewski.com/wp-content/uploads/2024/03/2024-05-06_18h56_02-300x157.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/03/2024-05-06_18h56_02-768x402.png 768w" sizes="auto, (max-width: 979px) 100vw, 979px" />													</div>
				</div>
				<div class="elementor-element elementor-element-7073ea9 elementor-widget elementor-widget-heading" data-id="7073ea9" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">At the end</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-2e5198f elementor-widget elementor-widget-text-editor" data-id="2e5198f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>I strongly encourage you to write simple applications. Writing one can take as much time as finding the right one online.</p>						</div>
				</div>
					</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/how-to-create-simple-healthcheck-in-5-minutes/">How to create simple healthcheck in 5 minutes</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/how-to-create-simple-healthcheck-in-5-minutes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
