<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kazutora Hattori</title>
    <description>The latest articles on DEV Community by Kazutora Hattori (@kazutora_hattori_66972c88).</description>
    <link>https://dev.to/kazutora_hattori_66972c88</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3420967%2F6dbde1c2-c753-455c-a76d-aa1e248ba7af.png</url>
      <title>DEV Community: Kazutora Hattori</title>
      <link>https://dev.to/kazutora_hattori_66972c88</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kazutora_hattori_66972c88"/>
    <language>en</language>
    <item>
      <title>How to fix the problem of the right side being completely black when creating a function to convert a web page to PDF</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Thu, 25 Dec 2025 09:19:46 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/how-to-fix-the-problem-of-the-right-side-being-completely-black-when-creating-a-function-to-convert-56d8</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/how-to-fix-the-problem-of-the-right-side-being-completely-black-when-creating-a-function-to-convert-56d8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I'm personally developing a web app using the Qiita API to download Qiita articles. While implementing an article that allows downloading Qiita articles as PDFs, I encountered an issue where the right side of the generated PDF was completely black.&lt;br&gt;
I couldn't figure out the cause and it was quite stumping.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause
&lt;/h2&gt;

&lt;p&gt;The problem was that I was using CSS designed for web screen display to generate the PDF (A4 size) as well.&lt;/p&gt;

&lt;p&gt;Web page CSS is designed to stretch and shrink the layout to fit the browser screen size (a wide horizontal display area).&lt;/p&gt;

&lt;p&gt;PDF, on the other hand, is a "paper" with fixed width and height, like A4 size.&lt;/p&gt;

&lt;p&gt;As a result, when converting HTML displayed wide using CSS for screens to PDF,&lt;br&gt;
the horizontal portions that did not fit within the A4 size were not handled correctly,&lt;br&gt;
resulting in a problem where the right side of the PDF was black.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;The solution was simple:&lt;br&gt;
&lt;strong&gt;Create separate CSS for PDF generation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Specifically, we created a separate CSS for PDFs,&lt;br&gt;
assuming A4 size, in addition to the CSS for screen display.&lt;/p&gt;

&lt;p&gt;The PDF CSS takes into consideration the following points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specify the width in &lt;code&gt;mm&lt;/code&gt; units&lt;/li&gt;
&lt;li&gt;Fix the background color to white&lt;/li&gt;
&lt;li&gt;Avoid using &lt;code&gt;flex&lt;/code&gt; or &lt;code&gt;100vw&lt;/code&gt; for screens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;css&lt;br&gt;
.qiita-preview {&lt;br&gt;
width: 190mm; /* Fit to A4 size */&lt;br&gt;
background: #fff;&lt;br&gt;
color: #000;&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;As a result, the layout, which had been overflowing horizontally,&lt;br&gt;
fitted properly to A4 size,&lt;br&gt;
and the issue of the black right side of the PDF was resolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The problem was solved by separating the CSS for screens and PDFs,&lt;br&gt;
and preparing a layout assuming A4 size.&lt;br&gt;
When generating PDFs, it's important to consider "screen display" and "paper display" separately.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>help</category>
    </item>
    <item>
      <title>Cause and solution for "Module 'markdown-it' not found" in TypeScript (@types/markdown-it)</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Sun, 21 Dec 2025 09:34:42 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/cause-and-solution-for-module-markdown-it-not-found-in-typescript-typesmarkdown-it-2ap3</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/cause-and-solution-for-module-markdown-it-not-found-in-typescript-typesmarkdown-it-2ap3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;While developing an app with TypeScript, I received the error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Cannot&lt;/span&gt; &lt;span class="nx"&gt;find&lt;/span&gt; &lt;span class="kr"&gt;module&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;markdown-it&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="nx"&gt;its&lt;/span&gt; &lt;span class="nx"&gt;corresponding&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;declarations&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This article briefly summarizes how to resolve this issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cause
&lt;/h3&gt;

&lt;p&gt;Because markdown-it is a JavaScript library, it did not include the type definition file (.d.ts) required by TypeScript.&lt;br&gt;
In other words, the error occurred because &lt;code&gt;markdown-it&lt;/code&gt; is a JavaScript library and does not contain type definitions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution (This is all you need)
&lt;/h2&gt;

&lt;p&gt;Install the type definition package.&lt;br&gt;
&lt;code&gt;tsx&lt;br&gt;
npm install -D @types/markdown-it&lt;br&gt;
&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;This will allow TypeScript to recognize type information, and the error will be resolved immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The cause of the error was not the implementation, but simply a lack of type definitions for TypeScript. When using JavaScript libraries with TypeScript, type definitions may not be included.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>help</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>[Personal Development] Developed a tech blog that can integrate Qiita articles with internal blogs</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Sun, 07 Dec 2025 09:02:58 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/personal-development-developed-a-tech-blog-that-can-integrate-qiita-articles-with-internal-blogs-5aj1</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/personal-development-developed-a-tech-blog-that-can-integrate-qiita-articles-with-internal-blogs-5aj1</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this personal development project, I integrated the Qiita API and MicroCMS to build a tech blog that automatically collects and displays Qiita and internal technical articles.&lt;/p&gt;

&lt;h2&gt;
  
  
  App Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0vs2qi8nkiqvi96u2fj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0vs2qi8nkiqvi96u2fj.gif" alt="kadai6 (1).gif" width="900" height="436"&gt;&lt;/a&gt;&lt;br&gt;
On the home page, Qiita and MicroCMS articles are displayed in a card UI.&lt;br&gt;
Clicking the "See More" button takes you to the list pages for personal articles and blog articles, respectively.&lt;br&gt;
Clicking on an article card takes you to the Qiita article page or blog details page, where you can read the article directly.&lt;/p&gt;

&lt;p&gt;The app we created uses Next.js (Turbopack + TypeScript), TailwindCSS, DaisyUI, MicroCMS, and the Qiita API to automatically retrieve Qiita articles, retrieve MicroCMS articles, display them as a list using a card UI, create a blog detail page, use CI/CD (GitHub Actions), and even automatically deploy to Firebase/Vercel.&lt;/p&gt;
&lt;h2&gt;
  
  
  Technologies Used
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Next.js (Turbopack) + TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;tailwindCSS + DaisyUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Acquisition&lt;/td&gt;
&lt;td&gt;Qiita API / MicroCMS API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server Processing&lt;/td&gt;
&lt;td&gt;React Handler / API Routes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Firebase Hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;Jest + React Testing Library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation&lt;/td&gt;
&lt;td&gt;Makefile (dev / test / deploy)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Development Difficulties and Solutions
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Unifying the Data Structures of Qiita and MicroCMS Was Difficult
&lt;/h3&gt;

&lt;p&gt;Qiita and MicroCMS differ significantly in the data formats and field names they can acquire, making it impossible to use common UI components as is.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Qiita&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Introduction to React&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;created_at&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-01-02&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://qiita.com/xxx/items/abc123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nl"&gt;Example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MicroCMS&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blog01&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Building a blog with Next.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;publishedAt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-02-10&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;thumbnail&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Date formats, URLs, thumbnails, etc. were all inconsistent, making it extremely difficult to unify and handle them on the front end.&lt;br&gt;
So, as shown below, we reformatted the articles into a uniform format on the API Route side before returning them to the front end.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="na"&gt;thumbnail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;thumbnail&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;DEFAULT_IMAGE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publishedAt&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;`/blogs/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  It was difficult to unify the card UI between DaisyUI and TailwindCSS.
&lt;/h3&gt;

&lt;p&gt;Qiita and MicroCMS differ in the presence or absence of thumbnails and image size,&lt;br&gt;
which easily disrupted the card height and layout.&lt;/p&gt;

&lt;p&gt;In addition, responsive support and grid adjustments were required, making it surprisingly difficult to create a card design that looked consistent across all posts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Points I learned and grew from
&lt;/h2&gt;

&lt;h3&gt;
  
  
  I gained a deeper understanding of API design and data formatting.
&lt;/h3&gt;

&lt;p&gt;I was able to understand the process of data acquisition → formatting → return using API Route.&lt;/p&gt;

&lt;h2&gt;
  
  
  I gained a practical understanding of Next.js server-side processing.
&lt;/h2&gt;

&lt;p&gt;I gained experience using Next.js's server functions, including route handlers, environment variables, and asynchronous processing.&lt;/p&gt;

&lt;p&gt;In particular, I believe I gained practical knowledge essential for production development, such as calling external APIs and designing JSON responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This development project involved a wide range of technologies, including Qiita, MicroCMS, Next.js, and CI/CD.&lt;br&gt;
However, by breaking down the MVP into smaller parts, I was able to implement it without any hesitation.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Differences between DaisyUI's "btn", "btn-primary" and "button-primary"</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Thu, 04 Dec 2025 08:41:21 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/differences-between-daisyuis-btn-btn-primary-and-button-primary-4enf</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/differences-between-daisyuis-btn-btn-primary-and-button-primary-4enf</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When I was creating buttons using Next.js + TailwindCSS + DaisyUI,&lt;br&gt;
I ran into an issue where one button was blue and the other was purple, resulting in mixed colors.&lt;/p&gt;

&lt;p&gt;Here, I'd like to summarize DaisyUI's notation method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: These three are completely different
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;btn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;→ Create only the button shape&lt;br&gt;
→ Almost no color (gray)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;btn-primary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;→ The blue main button provided by DaisyUI&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;button-primary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;→ The color is determined by the theme (light/corporate, etc.)&lt;br&gt;
→ The button is purple in the Light theme.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"btn"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Shape Only&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Blue&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"btn button-primary"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Theme Color (light = purple)&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why purple?
&lt;/h2&gt;

&lt;p&gt;Because the primary color in DaisyUI's default theme (light) is purple (#570DF8).&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The only difference in color is the class used (btn-primary/button-primary).&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>daisyui</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Summary of the error "Cannot find module 'function qt(e={})...'" that occurs when using Tailwind CSS v4 + Vite</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Wed, 03 Dec 2025 07:13:34 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/summary-of-the-error-cannot-find-module-function-qte-that-occurs-when-using-tailwind-20ch</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/summary-of-the-error-cannot-find-module-function-qte-that-occurs-when-using-tailwind-20ch</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When installing Tailwind CSS v4 in a React + Vite environment,&lt;br&gt;
the following error occurred immediately after starting the development server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Cannot&lt;/span&gt; &lt;span class="nx"&gt;find&lt;/span&gt; &lt;span class="kr"&gt;module&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;function qt(e={}){...}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;Require&lt;/span&gt; &lt;span class="nx"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;postcss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This article summarizes how to fix this error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause
&lt;/h2&gt;

&lt;p&gt;The Tailwind v3 configuration is being used for Tailwind v4.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Doesn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;t work with Tailwind v4.
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Place index.css in the correct location.
&lt;/h3&gt;

&lt;p&gt;Create (or modify) src/index.css.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Rewrite PostCSS configuration for Tailwind v4.
&lt;/h3&gt;

&lt;p&gt;Change postcss.config.js to the v4-specific syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;tailwindcss&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tailwindcss/postcss&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="nf"&gt;tailwindcss&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary of results after restoration
&lt;/h2&gt;

&lt;p&gt;Tailwind styles are back, and the layout is back to normal.&lt;/p&gt;

</description>
      <category>css</category>
      <category>help</category>
      <category>javascript</category>
      <category>tooling</category>
    </item>
    <item>
      <title>[React] How I fixed the bug that prevented multiple Qiita articles from being downloaded as .md</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Fri, 28 Nov 2025 08:45:08 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/react-how-i-fixed-the-bug-that-prevented-multiple-qiita-articles-from-being-downloaded-as-md-756</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/react-how-i-fixed-the-bug-that-prevented-multiple-qiita-articles-from-being-downloaded-as-md-756</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I was developing an app using React to download Qiita posts retrieved from the Qiita API as .md files.&lt;br&gt;
However, I ran into a problem: "Even though I checked multiple posts and attempted to download them all at once, only one was downloaded."&lt;/p&gt;

&lt;p&gt;In this article, I'll explain the actual symptoms and share the root cause of why only one post was downloaded.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cause
&lt;/h2&gt;

&lt;p&gt;In conclusion, the problem was caused by calling URL.revokeObjectURL(url) too quickly.&lt;/p&gt;

&lt;p&gt;The bulk download process can be summarized as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a Blob from the article text (a Blob is a container for storing data, a mechanism for manipulating file contents with JavaScript).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a "temporary URL" using URL.createObjectURL(blob). (URL.createObjectURL(blob) is a function that automatically generates a temporary URL for accessing a Blob.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start the download using a.href = url → click().&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you're done using it, destroy it using URL.revokeObjectURL(url).&lt;br&gt;
(URL.revokeObjectURL(url) is a function that deletes the temporary URL.)&lt;/p&gt;

&lt;p&gt;The problem lies in the following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;revokeObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ← This was called immediately.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the browser discarded the URL before the download had finished,&lt;br&gt;
the first URL worked, but the second and subsequent URLs became invalid, resulting in only one URL crashing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;I fixed the issue by calling URL.revokeObjectURL(url) with a slight delay.&lt;/p&gt;

&lt;h2&gt;
  
  
  The final code that worked reliably
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleDownload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Blob&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/markdown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;download&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.md`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="sr"&gt;/ Immediately abandoning the download will break → Wait a bi&lt;/span&gt;&lt;span class="err"&gt;t
&lt;/span&gt;&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;revokeObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even when checking multiple articles and downloading them all at once, they are all saved correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Multiple downloads work reliably with appropriate delays.&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>October 2025: Review of learning records</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Sun, 16 Nov 2025 06:46:57 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/october-2025-review-of-learning-records-381b</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/october-2025-review-of-learning-records-381b</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello everyone. My name is K.H. and I'm currently studying at a university in Vancouver, Canada.&lt;br&gt;
In this article, I'll look back on what I learned and what I've become able to do in October.&lt;/p&gt;

&lt;h2&gt;
  
  
  October Progress
&lt;/h2&gt;

&lt;p&gt;Personally developed a map app to solve the problem of not being able to find a place to concentrate on studying.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Accomplished in October
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I became self-sufficient from planning to design, implementation, and deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Front-end development using React / TypeScript&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Back-end and database integration using Supabase / MongoDB / Node.js / Express&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Utilizing the Google Maps API and external APIs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deployment using Firebase Hosting / Vercel / EC2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Building CI/CD using GitHub Actions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test creation using Jest + React Testing Library&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Establishing the habit of publishing technical articles (Qiita)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned at My Current University
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Deploying a web app using AWS (EC2 / Auto Scaling / Load Balancer)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linux Operations (File Operations, Process Management, Service Management)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Web Server (Apache / Nginx) Basics and Publishing a Static Site&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Networking Basics (OSI Model, IPv4, Subnetting, DHCP)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Packet Network Building Exercises with Tracer&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Continue to thoroughly study the output and solidify your knowledge&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>[Solo Development] Finding a place to study in Vancouver! Creating a map app with React and Supabase</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Tue, 28 Oct 2025 08:22:10 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/solo-development-finding-a-place-to-study-in-vancouver-creating-a-map-app-with-react-and-supabase-3ka4</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/solo-development-finding-a-place-to-study-in-vancouver-creating-a-map-app-with-react-and-supabase-3ka4</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello!&lt;br&gt;
For this assignment, we developed a self-study spot search app called "Study Spot Vancouver."&lt;br&gt;
Using React, TypeScript, Supabase, Google Maps API, and Chakra UI,&lt;br&gt;
we implemented a system that displays pins on a map, filters by criteria, and transitions to a details page.&lt;/p&gt;

&lt;p&gt;This assignment allowed me to experience the entire process of API integration, state management, and UI design,&lt;br&gt;
and it was a great opportunity to gain a deeper understanding of how a map app works.&lt;/p&gt;
&lt;h2&gt;
  
  
  Reason for Creating the App
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Solving a Personal Challenge
When searching for a place to study in Vancouver,
Google Maps only offers broad categories like "cafes" and "libraries."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, when it comes to actually studying, important information is available only on-site, such as quietness, availability of power outlets, and Wi-Fi.&lt;/p&gt;

&lt;p&gt;In particular, there was very little information available about "places where you can study aloud," such as for reading aloud or practicing presentations, so I had to check locally each time.&lt;/p&gt;

&lt;p&gt;To address this inconvenience, I decided to create a map app that allows users to search for study spots based on their criteria.&lt;/p&gt;
&lt;h2&gt;
  
  
  App Overview
&lt;/h2&gt;

&lt;p&gt;GitHub Repository:&lt;br&gt;
&lt;a href="https://github.com/kazukashima/kadai5.git" rel="noopener noreferrer"&gt;https://github.com/kazukashima/kadai5.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This app displays study spots within Vancouver on a map, allowing users to easily filter their search by Wi-Fi, power, and voice access.&lt;/p&gt;

&lt;p&gt;I also personally defined and implemented the following MVPs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MVP1: Built a development environment using React, TypeScript, and Vite. Deployed to Firebase Hosting. Automated with make deploy.&lt;/li&gt;
&lt;li&gt;MVP2: Built CI/CD with GitHub Actions. Executed automatic testing and deployment upon push.&lt;/li&gt;
&lt;li&gt;MVP3: Incorporated the Google Maps API and displayed data retrieved from Supabase as pins on the map.&lt;/li&gt;
&lt;li&gt;MVP4: Implemented a filter function that allows users to filter by Wi-Fi, power, and voice access.&lt;/li&gt;
&lt;li&gt;MVP5: Clicking on a pin takes users to a detailed page displaying photos, addresses, and business hours. Add a link that opens in Google Maps.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Home Screen&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pvlqtc32jyp02kj68it.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pvlqtc32jyp02kj68it.png" alt="Screenshot 2025-10-28 002647.png" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By toggling the WiFi, Power, and Talking buttons in the upper left,&lt;br&gt;
you can narrow your search by whether each spot offers WiFi, has a power outlet, and allows private conversation (out loud).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fongpbif9y8eudjsv2pzq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fongpbif9y8eudjsv2pzq.png" alt="Screenshot 2025-10-28 002811.png" width="800" height="382"&gt;&lt;/a&gt;&lt;br&gt;
Clicking on a pin on the map&lt;br&gt;
will display a pop-up with the facility name and basic information such as "WiFi, power, and voice-over availability."&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3576n29mcfl3wezgqmv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3576n29mcfl3wezgqmv.png" alt="Screenshot 2025-10-28 004907.png" width="787" height="519"&gt;&lt;/a&gt;&lt;br&gt;
Clicking the "View Details" button will take you to the spot's details page, where you can view information such as the address and photos.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6ag023fsedevvcli2id.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6ag023fsedevvcli2id.png" alt="Screenshot 2025-10-28 004919.png" width="548" height="302"&gt;&lt;/a&gt;&lt;br&gt;
Click the "Open" link on the details page to open the actual Google Maps page, search for routes, and view the surrounding area.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F863nz1kvxuti123vdfgi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F863nz1kvxuti123vdfgi.png" alt="Screenshot 2025-10-28 004933.png" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Technologies Used
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Technologies Used / Contents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;React + TypeScript + Vite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI Library&lt;/td&gt;
&lt;td&gt;Chakra UI (toggle buttons, responsive design)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Supabase (cloud management of self-study spot information)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Map Drawing&lt;/td&gt;
&lt;td&gt;Displaying pins using the Google Maps API (&lt;a class="mentioned-user" href="https://dev.to/vis"&gt;@vis&lt;/a&gt;.gl/react-google-maps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Firebase Hosting (automatic update to production environment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;GitHub Actions (testing and automatic deployment on push)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation&lt;/td&gt;
&lt;td&gt;Makefile (simple execution with &lt;code&gt;make deploy&lt;/code&gt; / &lt;code&gt;make test&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Development Difficulties and Solutions
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Google Maps API and React Re-rendering Issues
&lt;/h3&gt;

&lt;p&gt;Even when React re-rendered, the Google Maps display did not update,&lt;br&gt;
and pins did not change even when switching filters.&lt;/p&gt;

&lt;p&gt;The cause was that React's Virtual DOM and Google Maps rendering were running on separate systems.&lt;br&gt;
To solve this, we adopted a method of changing the key and re-rendering, such as &lt;code&gt;&amp;lt;Map key={JSON.stringify(filters)}&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Filter State Management (Handling Boolean Types)
&lt;/h3&gt;

&lt;p&gt;When switching between three conditions (WiFi, power, and voice output),&lt;br&gt;
we managed them all together using useState, allowing for dynamic updates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFilters&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="na"&gt;wifi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="na"&gt;power&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="na"&gt;talking&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By using toggleFilters to toggle specific keys each time a button is pressed,&lt;br&gt;
multiple conditions can be easily switched.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Transition to Details Page and Google Maps Link Generation
&lt;/h3&gt;

&lt;p&gt;Clicking a pin on the map transitions to a details page, where a "Open in Google Maps" link is dynamically generated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
&lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`https://www.google.com/maps?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;
&lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"noopener noreferrer"&lt;/span&gt;
&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
Open in Google Maps
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We learned that by using template literals (&lt;code&gt;...&lt;/code&gt;),&lt;br&gt;
we can dynamically construct a URL from latitude and longitude.&lt;/p&gt;

&lt;h2&gt;
  
  
  Points of Growth/Lessons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. I gained the ability to integrate with external APIs.
&lt;/h3&gt;

&lt;p&gt;I was able to experience the process of integrating external services, such as the Google Maps API and Supabase, into my own app.&lt;br&gt;
The biggest benefit was understanding API key management, asynchronous processing, and handling environment variables.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. I learned to design with an awareness of data structure.
&lt;/h3&gt;

&lt;p&gt;By considering the Supabase table design (id, name, latitude, longitude, wifi, power, talking) in conjunction with UI behavior, I gained the ability to be aware of the relationship between data and UI.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. I understood the relationship between state and rendering.
&lt;/h3&gt;

&lt;p&gt;Through the issue of pins not updating when switching filters, I learned that React re-rendering and external library (Google Maps) rendering operate separately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Impressions/Conclusion
&lt;/h2&gt;

&lt;p&gt;There are still challenges remaining, such as improving the UI/UX and adding data to Supabase.&lt;br&gt;
However, through the experience of designing my own MVP and completing the app in stages, I feel I have acquired the ability to proceed with development with a purpose.&lt;/p&gt;

&lt;p&gt;Going forward, I would like to further increase data, improve the UI/UX, and develop the app into one that can actually provide value.&lt;/p&gt;

&lt;blockquote&gt;
&lt;/blockquote&gt;

</description>
      <category>react</category>
      <category>supabase</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>[JavaScript] How to Dynamically Create a URL to Open a Latitude and Longitude Location on Google Maps</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Mon, 27 Oct 2025 07:25:40 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/javascript-how-to-dynamically-create-a-url-to-open-a-latitude-and-longitude-location-on-google-3ppi</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/javascript-how-to-dynamically-create-a-url-to-open-a-latitude-and-longitude-location-on-google-3ppi</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;While building a map app using React and Superbase, I encountered a situation where I wanted to create a link to open a specific spot on Google Maps.&lt;/p&gt;

&lt;p&gt;The Google Maps coordinate link format is useful for this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic URL Structure
&lt;/h2&gt;

&lt;p&gt;In Google Maps, you can open a location by specifying a latitude and longitude using the following syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//www.google.com/maps?q=&amp;lt;lat&amp;gt;,&amp;lt;lng&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, if you want to display&lt;/p&gt;

&lt;p&gt;Latitude: 49.2827&lt;/p&gt;

&lt;p&gt;Longitude: -123.1207&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.google.com/maps?q=49.2827,-123.1207" rel="noopener noreferrer"&gt;https://www.google.com/maps?q=49.2827,-123.1207&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Opening this link in a browser will display that location with a pin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamic Creation with JavaScript
&lt;/h2&gt;

&lt;p&gt;When using variables in React, etc.,&lt;br&gt;
construct the URL using a template literal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;49.2827&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lng&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;123.1207&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;googleMapUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://www.google.com/maps?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;googleMapUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// → https://www.google.com/maps?q=49.2827,-123.1207&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using a template literal (&lt;code&gt;...&lt;/code&gt;),&lt;br&gt;
you can embed the variable ${} within a string.&lt;/p&gt;
&lt;h2&gt;
  
  
  Example using React
&lt;/h2&gt;

&lt;p&gt;For example, retrieving spot information from Supabase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
&lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`https://www.google.com/maps?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;
&lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"noopener noreferrer"&lt;/span&gt;
&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
Open in Google Maps
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Writing it like this, clicking will open the location of the spot in Google Maps.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Understanding the difference between &lt;a&gt; and &lt;Link&gt; in React Router</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Sun, 26 Oct 2025 08:33:21 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/understanding-the-difference-between-and-in-react-router-4og3</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/understanding-the-difference-between-and-in-react-router-4og3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When building apps with React, I often wonder whether to use &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; for page transitions.&lt;/p&gt;

&lt;p&gt;In this article, I'll briefly summarize the differences between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when you use &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;The standard HTML &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tag commands the browser to "open a new page."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/map"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Go to Map&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case:&lt;/p&gt;

&lt;p&gt;The entire page is reloaded.&lt;/p&gt;

&lt;p&gt;The React app's state is reset.&lt;/p&gt;

&lt;p&gt;It's like the app is restarting.&lt;/p&gt;

&lt;p&gt;In other words, the "speed" and "fluidity" of a SPA (Single Page Application) are lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when you use &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;The  component provided by React Router&lt;br&gt;
"handles page transitions on the JavaScript side."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/map"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Go to Map&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case:&lt;/p&gt;

&lt;p&gt;The component switches without reloading the page.&lt;/p&gt;

&lt;p&gt;React state is preserved.&lt;/p&gt;

&lt;p&gt;Transitions are fast and smooth.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://reactrouter.com/en/main/components/link" rel="noopener noreferrer"&gt;React Router Docs - Link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/tushar_pal/why-we-use-link-tag-instead-of-in-reactjs-8h3"&gt;Why we use Link tag instead of anchor in React (dev.to)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jeevanhenrydsouza.hashnode.dev/link-to-vs-anchor-tag" rel="noopener noreferrer"&gt;Hashnode: Link vs. Anchor tag in React Router&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactrouter</category>
      <category>react</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>I've summarized the differences between terminal and shell</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Sat, 25 Oct 2025 07:48:22 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/ive-summarized-the-differences-between-terminal-and-shell-5aem</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/ive-summarized-the-differences-between-terminal-and-shell-5aem</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I didn't fully understand the difference between a terminal and a shell, so I'd like to summarize it again.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a terminal?
&lt;/h2&gt;

&lt;p&gt;A terminal refers to the hardware, such as a keyboard (input) and a display (output), through which users input and output characters.&lt;/p&gt;

&lt;p&gt;A software version of a terminal is called a "terminal emulator."&lt;/p&gt;

&lt;p&gt;Examples: GNOME Terminal, Windows Terminal, iTerm2, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a shell?
&lt;/h2&gt;

&lt;p&gt;A shell is software that interprets and executes commands entered by the user.&lt;/p&gt;

&lt;p&gt;Examples: bash, zsh, fish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;A terminal is a place to type.&lt;br&gt;
A shell is a program that understands and executes commands.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Explaining JSON.stringify() - The basics of converting objects to strings</title>
      <dc:creator>Kazutora Hattori</dc:creator>
      <pubDate>Fri, 24 Oct 2025 07:07:12 +0000</pubDate>
      <link>https://dev.to/kazutora_hattori_66972c88/explaining-jsonstringify-the-basics-of-converting-objects-to-strings-5g3g</link>
      <guid>https://dev.to/kazutora_hattori_66972c88/explaining-jsonstringify-the-basics-of-converting-objects-to-strings-5g3g</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;While developing React, I had the opportunity to use key={JSON.stringify(filters)} in a component, so I'd like to summarize it here.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is JSON.stringify()?
&lt;/h2&gt;

&lt;p&gt;JSON.stringify() is a JavaScript function that converts objects and arrays to strings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;calros&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// → '{"name":"calros","age":20}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The object is converted to a JSON-formatted string.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;JSON.stringify() is a function for safely handling objects as strings.&lt;br&gt;
In JavaScript, it's often not possible to store or send data as is. Converting data to a string using JSON.stringify() can be useful in a variety of situations.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
