<?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: HODADAK</title>
    <description>The latest articles on DEV Community by HODADAK (@hodadak_official).</description>
    <link>https://dev.to/hodadak_official</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4170138%2F274c5ccc-235c-4c8d-ac7b-2fc6e56b997e.png</url>
      <title>DEV Community: HODADAK</title>
      <link>https://dev.to/hodadak_official</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hodadak_official"/>
    <language>en</language>
    <item>
      <title>Draft a Five-Slide Outline with ChatGPT, Then Build It in PowerPoint for the Web</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Tue, 27 Oct 2026 10:30:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/draft-a-five-slide-outline-with-chatgpt-then-build-it-in-powerpoint-for-the-web-4p98</link>
      <guid>https://dev.to/hodadak_official/draft-a-five-slide-outline-with-chatgpt-then-build-it-in-powerpoint-for-the-web-4p98</guid>
      <description>&lt;p&gt;Most of the time spent on a short internal presentation goes into staring at an empty slide and deciding what the title should be. The content usually exists already, in notes or a report. What is missing is the structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Ask ChatGPT for a fixed shape (five slides, one title and three key lines each), then paste each slide's title and lines into PowerPoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Give ChatGPT your material together with a request like this (translated): &lt;em&gt;Draft an outline for a presentation called "Q3 sales results" as five slides. For each slide, only a one-line title and three key lines, no other explanation.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Copy the title line of slide 1 and paste it into the slide's title box.&lt;/li&gt;
&lt;li&gt;Copy the three key lines and paste them into the content box.&lt;/li&gt;
&lt;li&gt;If the pasted text is small, select it with &lt;code&gt;Ctrl+A&lt;/code&gt; and set the font size to 28.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl+M&lt;/code&gt; for a new slide and repeat for the rest.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In my test, one line of material produced a five-slide outline in about four seconds, and it became five slides in PowerPoint for the web.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why slide by slide
&lt;/h2&gt;

&lt;p&gt;PowerPoint for the web has no feature that splits a pasted outline into separate slides. Pasting per slide is the reliable route there. It is still faster than writing from scratch, because the titles and points are already decided.&lt;/p&gt;

&lt;h2&gt;
  
  
  Asking for a fixed shape
&lt;/h2&gt;

&lt;p&gt;"Only a title and three lines, no other explanation" is the part that saves the most time. The answer then contains just what goes on the slides, so every copy is a straight paste with nothing to trim first.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with AI assistance. The steps were tested by hand before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>powerpoint</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Uneven Line Spacing in Word Is a Setting, Not Blank Lines</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Mon, 26 Oct 2026 22:40:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/uneven-line-spacing-in-word-is-a-setting-not-blank-lines-l0a</link>
      <guid>https://dev.to/hodadak_official/uneven-line-spacing-in-word-is-a-setting-not-blank-lines-l0a</guid>
      <description>&lt;p&gt;A document assembled from several sources usually ends up with different line spacing in every paragraph. The natural reaction is to put the cursor in the gap and press Backspace, which merges the two paragraphs instead of closing the gap. That is the clue: the gap is not an empty line. It is a spacing setting on the paragraph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;code&gt;Ctrl + A&lt;/code&gt;, then Home &amp;gt; Line Spacing &amp;gt; 1.15.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl + A&lt;/code&gt; to select the whole document.&lt;/li&gt;
&lt;li&gt;On the Home tab, open the Line and Paragraph Spacing button.&lt;/li&gt;
&lt;li&gt;Choose 1.15. Every paragraph now uses the same line spacing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If there is still extra room between paragraphs, open the same button again and choose Remove Space After Paragraph. That clears the paragraph spacing that came along with pasted text.&lt;/p&gt;

&lt;p&gt;I checked this in the free Word for the web with the Korean interface. The English menu names above may be worded slightly differently in your version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why selecting everything first
&lt;/h2&gt;

&lt;p&gt;Pasted paragraphs each carry their own formatting. Fixing them one at a time works, but it is easy to miss one in a long document. Applying the setting to the whole selection resets them all in one step, and any paragraph you want to keep different can be adjusted afterwards.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with AI assistance. The steps were tested by hand before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>word</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Shrink a Scanned PDF with pypdf by Re-encoding the Page Images</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Mon, 26 Oct 2026 10:30:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/shrink-a-scanned-pdf-with-pypdf-by-re-encoding-the-page-images-1i75</link>
      <guid>https://dev.to/hodadak_official/shrink-a-scanned-pdf-with-pypdf-by-re-encoding-the-page-images-1i75</guid>
      <description>&lt;p&gt;Upload forms often cap attachments at 2 MB or 5 MB, and a scanned document blows past that after a few pages. The reason is simple: each page of a scan is a large photo, usually stored at the scanner's full resolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Open the PDF with pypdf, downscale every page image, save it as JPEG at a lower quality, and write the file back out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pypdf&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PdfReader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PdfWriter&lt;/span&gt;

&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;MAX_SIDE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1700&lt;/span&gt;   &lt;span class="c1"&gt;# longest side in pixels after resizing
&lt;/span&gt;&lt;span class="n"&gt;QUALITY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;      &lt;span class="c1"&gt;# JPEG quality
&lt;/span&gt;
&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PdfWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clone_from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;L&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MAX_SIDE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MAX_SIDE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
        &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;QUALITY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compress_identical_objects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;remove_duplicates&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remove_unreferenced&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getsize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KB -&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getsize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What it did on a real file
&lt;/h2&gt;

&lt;p&gt;My test file was a three-page scanned contract, 7,994,634 bytes, with each page stored as a 2481 x 3509 image. After the script, the file was 194,222 bytes, still three pages. I cropped the first page image and the body text was clearly readable at 1202 x 1700 pixels. Tested with pypdf 6.20.1 and Pillow 12.3.0 on Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tuning
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If the result is still too large, lower &lt;code&gt;MAX_SIDE&lt;/code&gt; or &lt;code&gt;QUALITY&lt;/code&gt; a step at a time and look at the page again after each change.&lt;/li&gt;
&lt;li&gt;Check small print, stamps and signatures, not just the headline.&lt;/li&gt;
&lt;li&gt;A PDF exported from Word or another editor has few images to shrink, so expect much less change there.&lt;/li&gt;
&lt;li&gt;Keep the original. Re-encoding is lossy, and you cannot get the detail back from the small copy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Written with AI assistance. The steps were tested by hand before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>pdf</category>
      <category>automation</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AI email rewrite prompt: give it the reader, goal, tone and limits</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Mon, 26 Oct 2026 03:10:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/ai-email-rewrite-prompt-give-it-the-reader-goal-tone-and-limits-9m3</link>
      <guid>https://dev.to/hodadak_official/ai-email-rewrite-prompt-give-it-the-reader-goal-tone-and-limits-9m3</guid>
      <description>&lt;p&gt;"Polish this email" is a common request to an AI assistant, and the result is often longer, stiffer and oddly enthusiastic. Worse, it sometimes "improves" a date or a figure. The model isn't being careless; it just doesn't know who you're writing to or what must stay fixed.&lt;/p&gt;

&lt;p&gt;Give it four things and the draft gets much closer to sendable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; tell it the recipient, the purpose, the tone and length, and what it must leave alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four things to include
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recipient: who's reading it.&lt;/strong&gt;&lt;br&gt;
"This is a first email to a contact at a client company." Tone depends heavily on the reader: a colleague, a manager and an external partner need different wording.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Purpose: what you want from them.&lt;/strong&gt;&lt;br&gt;
"I'm asking them to send the files by Friday." Say in one line whether it's a request, a report or an apology.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tone and length.&lt;/strong&gt;&lt;br&gt;
"Polite but short, three sentences at most." A length limit cuts most of the padding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What must not change.&lt;/strong&gt;&lt;br&gt;
"Keep dates, amounts and names exactly as they are; only rework the sentences." Without this, important numbers can drift.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Copy-paste version
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This is a first email to a contact at a client company.
I'm asking them to send the files by Friday.
Rewrite it to be polite but short, three sentences at most.
Keep dates, amounts and names exactly as they are.
Draft:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste your own draft after "Draft:".&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you send
&lt;/h2&gt;

&lt;p&gt;Check these yourself, every time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dates&lt;/li&gt;
&lt;li&gt;amounts&lt;/li&gt;
&lt;li&gt;the recipient's name&lt;/li&gt;
&lt;li&gt;attachments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also strip anything confidential or personal before pasting a draft into an AI tool, and if your company doesn't allow AI tools for work email, don't use one.&lt;/p&gt;

&lt;p&gt;We didn't include a sample answer. Output varies between runs, so the prompt structure is the useful part to copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this works
&lt;/h2&gt;

&lt;p&gt;All four items reduce guessing. The model can't see your relationship with the recipient or your deadline, so it fills those gaps with safe, generic choices. Spelling them out replaces the guesses with your actual situation, and the "keep exactly" line marks which tokens are off limits.&lt;/p&gt;

&lt;p&gt;If you send many similar emails, save the prompt as a template with blanks for recipient and purpose. It takes less time to fill in four short lines than to edit an over-polished reply back into something that sounds like you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;AI-assisted article. I checked the prompt structure against the original Korean card before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>productivity</category>
      <category>writing</category>
    </item>
    <item>
      <title>Paste Messy Text into Excel as a Real Table, Using ChatGPT as the Parser</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Sun, 25 Oct 2026 10:30:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/paste-messy-text-into-excel-as-a-real-table-using-chatgpt-as-the-parser-2hpn</link>
      <guid>https://dev.to/hodadak_official/paste-messy-text-into-excel-as-a-real-table-using-chatgpt-as-the-parser-2hpn</guid>
      <description>&lt;p&gt;Trip expenses often arrive as a few sentences in an email: who went where, when, and how much it cost. Paste that into Excel and the whole thing lands in cell A1. Splitting it by hand means retyping every value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Ask ChatGPT to turn the text into a table with the columns you name, copy the answer, and paste it into A1. Each value gets its own cell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Paste the text into ChatGPT and add one line (translated): &lt;em&gt;Put the content below into a table. Columns, in order: name, department, destination, departure date, expenses (KRW).&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Press Enter and use the copy button under the answer.&lt;/li&gt;
&lt;li&gt;Click A1 in Excel and paste.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Name through expenses go into separate columns, and the expense values arrive as numbers, so you can calculate with them right away.&lt;/p&gt;

&lt;h2&gt;
  
  
  The total row is not a formula
&lt;/h2&gt;

&lt;p&gt;ChatGPT sometimes adds a total row on its own. That row is a typed number, not a formula. If someone later corrects one expense, the total will be wrong and nothing will warn you.&lt;/p&gt;

&lt;p&gt;Click the total cell and press &lt;code&gt;Alt+=&lt;/code&gt;. Excel inserts a &lt;code&gt;SUM&lt;/code&gt; over the column above, and from then on the total follows any edit.&lt;/p&gt;

&lt;p&gt;In my test, four people's trip notes became a five-column table in about four seconds. The total was 497,000 KRW before and after switching to the &lt;code&gt;Alt+=&lt;/code&gt; formula.&lt;/p&gt;

&lt;h2&gt;
  
  
  Naming the columns is the real trick
&lt;/h2&gt;

&lt;p&gt;Listing the columns fixes both the headers and their order. That matters when the table has to sit under last month's rows: the new data lines up without rearranging anything.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with AI assistance. The steps were tested by hand before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>excel</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>ChatGPT meeting notes prompt: 4 parts that stop invented details</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Sun, 25 Oct 2026 03:10:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/chatgpt-meeting-notes-prompt-4-parts-that-stop-invented-details-19id</link>
      <guid>https://dev.to/hodadak_official/chatgpt-meeting-notes-prompt-4-parts-that-stop-invented-details-19id</guid>
      <description>&lt;p&gt;Pasting rough meeting notes into ChatGPT with "summarize this" usually gets you something that reads well and is hard to use. Action items are buried in paragraphs, owners and deadlines go missing, and occasionally the model fills a gap with something nobody said.&lt;/p&gt;

&lt;p&gt;The fix is to tell it what you want in four parts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; state the task, the output format, the rules about what it may not add, and the length.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four parts
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Task: say what you want made.&lt;/strong&gt;&lt;br&gt;
"Turn the meeting notes below into meeting minutes." Saying "minutes" instead of "summary" already changes the result, because minutes have a known structure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Format: name the sections.&lt;/strong&gt;&lt;br&gt;
"Use three sections in this order: Decisions / Action items (owner, due date) / Next meeting. Put action items in a table." When the column names are fixed, you can copy the table straight into a tracker or a ticket.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Constraints: stop it from inventing.&lt;/strong&gt;&lt;br&gt;
"Don't add anything that isn't in the notes. If an owner or date is missing, write 'To confirm'." This one matters most. Without it, a model will often guess a plausible name or deadline to fill the table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Length: set a limit.&lt;/strong&gt;&lt;br&gt;
"One line per decision, ten lines in total." Short minutes get read and forwarded; long ones don't.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Copy-paste version
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Turn the meeting notes below into meeting minutes.
Use these sections in order: Decisions / Action items (owner, due date) / Next meeting. Put action items in a table.
Don't add anything that isn't in the notes. If an owner or date is missing, write "To confirm".
One line per decision, ten lines in total.

Notes:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste your raw notes after "Notes:".&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you paste anything
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Remove company details first.&lt;/strong&gt; Replace names, amounts and client names with placeholders: "Person A", "XX dollars", "Company B".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the output against your notes&lt;/strong&gt; before you send it to anyone. The constraint line reduces invented details; it doesn't guarantee there are none.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow your company's AI policy.&lt;/strong&gt; If your organisation doesn't allow these tools, don't use them for work notes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We haven't included sample output here. AI answers change from run to run, so a screenshot of one answer wouldn't tell you much. The structure of the prompt is the part that carries over.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're building this into a tool
&lt;/h2&gt;

&lt;p&gt;The same four parts map neatly onto a system prompt plus a structured output schema: format becomes the schema (an array of action items with &lt;code&gt;owner&lt;/code&gt; and &lt;code&gt;due&lt;/code&gt; fields), and "To confirm" becomes an allowed value instead of a free-text guess. That makes missing information visible in the data rather than hidden in prose.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was drafted with the help of an AI assistant and reviewed before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>productivity</category>
      <category>promptengineering</category>
    </item>
    <item>
      <title>A Task Board in Notion Where Dragging the Card Is the Status Update</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Sat, 24 Oct 2026 22:40:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/a-task-board-in-notion-where-dragging-the-card-is-the-status-update-104k</link>
      <guid>https://dev.to/hodadak_official/a-task-board-in-notion-where-dragging-the-card-is-the-status-update-104k</guid>
      <description>&lt;p&gt;A plain to-do list in a document has one annoying habit: every time a task moves forward, you delete "in progress" and type "done". With more than a handful of tasks, it also gets hard to see what is still open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; In Notion, type &lt;code&gt;/board&lt;/code&gt; on an empty line and pick the board view. Each column is a status, so moving a card is the update.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;On an empty line in a Notion page, type &lt;code&gt;/board&lt;/code&gt; and choose the board view.&lt;/li&gt;
&lt;li&gt;Three columns appear straight away: Not started, In progress, Done.&lt;/li&gt;
&lt;li&gt;Click New page in a column and write the task.&lt;/li&gt;
&lt;li&gt;When you start the task, drag the card to In progress. When it is finished, drag it to Done.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is no status text to retype, because the column the card sits in is the status.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same data, table layout
&lt;/h2&gt;

&lt;p&gt;Open the view settings at the top right and switch the layout to Table. The same tasks appear as rows, and the Status column already shows whatever you set by dragging. In my test, a card called "Weekly report" moved from Not started to In progress to Done on the board, and the table showed Done for it without any extra step.&lt;/p&gt;

&lt;p&gt;I checked this in Notion on the web with a free account. Menu labels above are translated from the Korean interface, so the English wording may differ slightly.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want it automated
&lt;/h2&gt;

&lt;p&gt;Notion has a public API, so cards can also be created or moved from another tool. For a personal list or a small team, the built-in board is usually enough and needs no setup at all.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with AI assistance. The steps were tested by hand before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>notion</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Korean spelling check before sending a report: 6 common mix-ups</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Sat, 24 Oct 2026 03:10:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/korean-spelling-check-before-sending-a-report-6-common-mix-ups-1igp</link>
      <guid>https://dev.to/hodadak_official/korean-spelling-check-before-sending-a-report-6-common-mix-ups-1igp</guid>
      <description>&lt;p&gt;This one is for people who write reports and emails in Korean: Korean colleagues, learners working at Korean companies, and developers who review Korean UI text or documentation. A handful of spelling pairs come up again and again in workplace writing, and they are exactly the kind of mistake a reader spots in the first line.&lt;/p&gt;

&lt;p&gt;The point isn't to memorise grammar. It's to have a short list you scan for before you hit send, the same way English writers check "its/it's" or "affect/effect".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; check these six before sending: 되/돼, 안/않, 로서/로써, 결재/결제, 금세, 며칠.&lt;/p&gt;

&lt;p&gt;Each rule below was checked against the National Institute of Korean Language's Standard Korean Dictionary and the official Korean spelling rules (한글 맞춤법).&lt;/p&gt;

&lt;h2&gt;
  
  
  The six pairs
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;되 / 돼.&lt;/strong&gt; Try replacing it with 되어. If 되어 fits, write 돼.&lt;br&gt;
이대로 진행하면 &lt;strong&gt;돼요&lt;/strong&gt; works because 되어요 also works. 돼 is just the contraction of 되어; 되었다 → 됐다 follows the same rule.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;안 / 않.&lt;/strong&gt; If you can expand it to 아니, use 안. If it expands to 아니하, use 않.&lt;br&gt;
회의에 &lt;strong&gt;안&lt;/strong&gt; 갔다 ("didn't go to the meeting") vs. 회의에 가지 &lt;strong&gt;않았다&lt;/strong&gt;. 안 is short for 아니; 않다 is short for 아니하다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;로서 / 로써.&lt;/strong&gt; 로서 marks a role or status, 로써 marks a means or tool.&lt;br&gt;
팀장&lt;strong&gt;으로서&lt;/strong&gt; 말씀드리면 ("speaking as team lead") vs. 대화&lt;strong&gt;로써&lt;/strong&gt; 풀었다 ("solved it through conversation").&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;결재 / 결제.&lt;/strong&gt; 결재 is approval of a document by a superior; 결제 is payment.&lt;br&gt;
부장님 &lt;strong&gt;결재&lt;/strong&gt;를 받았다 ("got the manager's sign-off") vs. 법인 카드로 &lt;strong&gt;결제&lt;/strong&gt;했다 ("paid with the company card"). In an office, mixing these up changes the meaning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;금세, not 금새.&lt;/strong&gt; It's a contraction of 금시에 ("right away"), so it ends in 세.&lt;br&gt;
자료는 &lt;strong&gt;금세&lt;/strong&gt; 보내 드릴게요.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;며칠, not 몇일.&lt;/strong&gt; Article 27 of the spelling rules says to write it as it sounds: 며칠.&lt;br&gt;
&lt;strong&gt;며칠&lt;/strong&gt;까지 보내 드리면 될까요?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to use the list
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep it in your notes app and read through for these pairs before sending anything important. Two of them can be found with a plain search (Ctrl + F): 금새 and 몇일 are always wrong.&lt;/li&gt;
&lt;li&gt;Spell checkers catch some of these but not all, because both spellings of a pair are real words. 결재 and 결제 are both correct Korean; only the context tells you which one you meant.&lt;/li&gt;
&lt;li&gt;If you're reviewing Korean strings in a codebase, the same list works as a checklist for UI copy and error messages.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Written with AI assistance. The spelling rules were checked against the National Institute of Korean Language's dictionary and spelling rules.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>korean</category>
      <category>writing</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Merge PDFs with One Bookmark per File in a Few Lines of Python</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Fri, 23 Oct 2026 10:30:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/merge-pdfs-with-one-bookmark-per-file-in-a-few-lines-of-python-2dek</link>
      <guid>https://dev.to/hodadak_official/merge-pdfs-with-one-bookmark-per-file-in-a-few-lines-of-python-2dek</guid>
      <description>&lt;p&gt;Sending a quote, a spec sheet and a company profile as three separate PDFs means the reader opens three files. Merging them is easy. Keeping them navigable after the merge is the part people skip: once everything is one file, nobody can tell where the spec sheet starts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;code&gt;PdfWriter.append(path, outline_item=name)&lt;/code&gt; in pypdf merges each file and adds a bookmark for it in the same call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pypdf&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PdfWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PdfReader&lt;/span&gt;

&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;   &lt;span class="c1"&gt;# folder with the PDFs
&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;   &lt;span class="c1"&gt;# merged file
&lt;/span&gt;
&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PdfWriter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;outline_item&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PdfReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bookmarks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it as &lt;code&gt;python merge.py ./parts merged.pdf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I tested it with pypdf 6.20.1 on Windows, using three one-page PDFs named &lt;code&gt;1_quote.pdf&lt;/code&gt;, &lt;code&gt;2_spec.pdf&lt;/code&gt; and &lt;code&gt;3_profile.pdf&lt;/code&gt; (Korean names in the original test). The output had 3 pages and 3 bookmarks, each titled with the file name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controlling the order
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;sorted()&lt;/code&gt; orders the files by name, so a numeric prefix is the simplest way to set the page order. If you would rather pass the order explicitly, replace the glob with a list of paths from the command line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things to check
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Everything runs locally. Nothing is uploaded, which matters when the files are contracts or quotes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a one-off merge, a desktop viewer or browser tool is fine. The script pays off when the same set of documents has to be bundled every week.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with AI assistance. The steps were tested by hand before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>pdf</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Word table basics: add rows, insert columns, merge cells, delete rows</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Fri, 23 Oct 2026 03:10:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/word-table-basics-add-rows-insert-columns-merge-cells-delete-rows-48kn</link>
      <guid>https://dev.to/hodadak_official/word-table-basics-add-rows-insert-columns-merge-cells-delete-rows-48kn</guid>
      <description>&lt;p&gt;Word tables have a reputation for breaking the moment you try to change them. You want one more row, you press Enter in the wrong place, and suddenly a cell is twice as tall and the layout has shifted. Most of that goes away once you use the table commands instead of improvising with Enter and the space bar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Tab in the last cell adds a row; everything else lives on the &lt;strong&gt;Table Layout&lt;/strong&gt; tab under Insert, Merge and Delete.&lt;/p&gt;

&lt;p&gt;We tried each step in Word for the web.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four moves
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tab in the last cell adds a row.&lt;/strong&gt;&lt;br&gt;
Put the cursor in the bottom-right cell and press Tab. A new empty row appears underneath, with the same column widths. This is the fastest way to extend a list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Insert rows and columns where you need them.&lt;/strong&gt;&lt;br&gt;
Click a cell, go to the &lt;strong&gt;Table Layout&lt;/strong&gt; tab and open &lt;strong&gt;Insert&lt;/strong&gt;. You can add a row above or below, or a column to the left or right. In our sample we used it to add a "March" column next to the existing months.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Merge cells into one heading cell.&lt;/strong&gt;&lt;br&gt;
Select the cells you want to combine (selecting the whole row is easiest: use the Select drop-down on the Table Layout tab and choose the row), then use the merge command on the same tab. The cells become one, which suits a title row that spans the table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Delete a row cleanly.&lt;/strong&gt;&lt;br&gt;
Put the cursor in the row, then on &lt;strong&gt;Table Layout&lt;/strong&gt; open &lt;strong&gt;Delete&lt;/strong&gt; and choose to delete the row. In our sample the "Daegu" row disappeared and the rest of the table closed up.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why not just press Delete?
&lt;/h2&gt;

&lt;p&gt;Selecting a row and pressing the Delete key clears the text but leaves the empty row behind. Backspace behaves differently depending on the selection. The Delete command on the Table Layout tab removes the row itself, which is usually what you meant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pressing Enter to "add a row".&lt;/strong&gt; Enter adds a new line inside the current cell, which makes the row taller instead of adding a new one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merging before the data is final.&lt;/strong&gt; Merged cells make later sorting and copying harder. Merge headings at the end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Putting data tables in Word that belong in Excel.&lt;/strong&gt; If you need totals or sorting, build the table in Excel and paste or link it. Word tables are best for layout and short reference tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  In code
&lt;/h2&gt;

&lt;p&gt;If you generate reports with python-docx, adding a row looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;docx&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Document&lt;/span&gt;

&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report.docx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tables&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;cells&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_row&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt;
&lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Busan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report.docx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;python-docx also has &lt;code&gt;cell.merge(other_cell)&lt;/code&gt; for merging. Deleting a row has no one-line helper, which is one more reason to get the table structure right in the template.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;An AI assistant helped draft this article. The steps were tried in Word for the web.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>word</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Turn a Prose Report into Bullet Points with One ChatGPT Prompt</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Thu, 22 Oct 2026 10:30:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/turn-a-prose-report-into-bullet-points-with-one-chatgpt-prompt-1bp8</link>
      <guid>https://dev.to/hodadak_official/turn-a-prose-report-into-bullet-points-with-one-chatgpt-prompt-1bp8</guid>
      <description>&lt;p&gt;In many Korean offices, internal reports are written in a clipped bullet style called &lt;em&gt;gaejosik&lt;/em&gt;: one point per line, short noun-like endings, no connecting sentences. Converting a paragraph-style draft into that format by hand means deleting sentence endings, breaking lines and re-reading every number. It takes longer than it should.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Paste the report into ChatGPT, put one instruction line above it, then copy the answer into Word.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Paste the full report into the ChatGPT input box.&lt;/li&gt;
&lt;li&gt;Add one line at the very top. The one I used was (translated): &lt;em&gt;Rewrite the report below as bullet points. Conditions: one line per item, end each line with a short noun-style ending, keep every number exactly as it is.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Press Enter, then use the copy button under the answer.&lt;/li&gt;
&lt;li&gt;Paste into Word.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The bullets come across as a real list, so there is almost nothing to tidy up afterwards.&lt;/p&gt;

&lt;p&gt;In my test, a four-sentence report became five bullet lines, and the full answer appeared in about three seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number rule matters
&lt;/h2&gt;

&lt;p&gt;Without the "keep every number" condition, a model may round or merge figures while it shortens sentences. With it, values such as 12% and 8 cases came through unchanged in my test. Still, compare the numbers against the original once before you send the report anywhere. That check takes less time than the rewrite you just skipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a script makes more sense
&lt;/h2&gt;

&lt;p&gt;If you have dozens of reports to convert, the same instruction can be sent through the OpenAI API in a loop, with the condition line as the system prompt. For a single report in the middle of the day, the chat window is quicker because there is nothing to set up.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with AI assistance. The steps were tested by hand before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>productivity</category>
      <category>writing</category>
      <category>beginners</category>
    </item>
    <item>
      <title>PowerPoint for the web slideshow shortcuts that actually work</title>
      <dc:creator>HODADAK</dc:creator>
      <pubDate>Thu, 22 Oct 2026 03:10:00 +0000</pubDate>
      <link>https://dev.to/hodadak_official/powerpoint-for-the-web-slideshow-shortcuts-that-actually-work-2mcg</link>
      <guid>https://dev.to/hodadak_official/powerpoint-for-the-web-slideshow-shortcuts-that-actually-work-2mcg</guid>
      <description>&lt;p&gt;The awkward moment in many meetings comes before the first slide: the presenter hunts through the ribbon for the slideshow button while everyone watches. A handful of keys removes that pause. The catch is that PowerPoint in the browser doesn't behave exactly like the desktop app, so muscle memory from one can fail in the other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;strong&gt;Ctrl + F5&lt;/strong&gt; starts from the beginning, &lt;strong&gt;Ctrl + Shift + F5&lt;/strong&gt; starts from the current slide, arrows move, &lt;strong&gt;Esc&lt;/strong&gt; ends.&lt;/p&gt;

&lt;p&gt;We pressed each of these one by one in PowerPoint for the web.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five shortcuts
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + F5: start from the first slide.&lt;/strong&gt; Even if you're editing slide 4, the show opens full screen on slide 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl + Shift + F5: start from the current slide.&lt;/strong&gt; Handy when you only need to present one section, or you're rehearsing a single slide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right arrow: next slide.&lt;/strong&gt; N and the space bar do the same.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Left arrow: previous slide.&lt;/strong&gt; P and Backspace do the same.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Esc: end the show.&lt;/strong&gt; You're back in the editing view straight away.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What didn't work in the browser
&lt;/h2&gt;

&lt;p&gt;Two shortcuts that desktop users rely on did nothing in our test, so we left them off the list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Typing a slide number and pressing Enter&lt;/strong&gt; to jump to that slide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B and W&lt;/strong&gt; to blank the screen to black or white.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you depend on either during a talk (for example, blanking the screen while you take questions), present from the desktop app or plan another way to do it.&lt;/p&gt;

&lt;p&gt;It's also worth knowing that plain &lt;strong&gt;F5&lt;/strong&gt; in a browser usually reloads the page. That is a likely reason the web version uses Ctrl + F5 instead, so make sure your fingers hit the right combination before you go live.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this saves the most
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Back-to-back meetings where you open someone else's deck and need to start cleanly.&lt;/li&gt;
&lt;li&gt;Rehearsing: Ctrl + Shift + F5 on the slide you're working on, check it, Esc, keep editing.&lt;/li&gt;
&lt;li&gt;Q&amp;amp;A, when someone asks about "the chart two slides back" and the left arrow gets you there without leaving full screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clicking to advance.&lt;/strong&gt; It works, but a stray click on a link or a video starts something you didn't intend. The arrow keys don't have that problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing shortcuts on a different setup.&lt;/strong&gt; Remote-control clickers, laptops with Fn-locked F keys and some keyboard layouts change what "F5" sends. Try the combination on the machine you'll present from.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Written with AI assistance. Each shortcut was pressed and checked in PowerPoint for the web.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powerpoint</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
