<?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: John Ding</title>
    <description>The latest articles on DEV Community by John Ding (@dingzhanjun).</description>
    <link>https://dev.to/dingzhanjun</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%2F687813%2F0cdc4a24-f27d-4253-9985-1ed045da833f.jpeg</url>
      <title>DEV Community: John Ding</title>
      <link>https://dev.to/dingzhanjun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dingzhanjun"/>
    <language>en</language>
    <item>
      <title>Personal voice Agent</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Wed, 10 Sep 2025 18:05:36 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/personal-voice-agent-3ooi</link>
      <guid>https://dev.to/dingzhanjun/personal-voice-agent-3ooi</guid>
      <description>&lt;p&gt;&lt;a href="https://blog.csdn.net/2401_87189860/article/details/143156502" rel="noopener noreferrer"&gt;https://blog.csdn.net/2401_87189860/article/details/143156502&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.csdn.net/u010522887/article/details/139668478" rel="noopener noreferrer"&gt;https://blog.csdn.net/u010522887/article/details/139668478&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.csdn.net/weixin_41793707/article/details/88357571?spm=1001.2101.3001.6650.12&amp;amp;utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-12-88357571-blog-147092809.235%5Ev43%5Epc_blog_bottom_relevance_base1&amp;amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-12-88357571-blog-147092809.235%5Ev43%5Epc_blog_bottom_relevance_base1&amp;amp;utm_relevant_index=14" rel="noopener noreferrer"&gt;https://blog.csdn.net/weixin_41793707/article/details/88357571?spm=1001.2101.3001.6650.12&amp;amp;utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-12-88357571-blog-147092809.235%5Ev43%5Epc_blog_bottom_relevance_base1&amp;amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-12-88357571-blog-147092809.235%5Ev43%5Epc_blog_bottom_relevance_base1&amp;amp;utm_relevant_index=14&lt;/a&gt;&lt;/p&gt;

</description>
      <category>voice</category>
      <category>agents</category>
      <category>ai</category>
    </item>
    <item>
      <title>Good font</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Wed, 10 Sep 2025 13:21:45 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/good-font-51el</link>
      <guid>https://dev.to/dingzhanjun/good-font-51el</guid>
      <description>&lt;p&gt;&lt;a href="https://websitedemos.net/love-nature-02/about/?customize=template" rel="noopener noreferrer"&gt;https://websitedemos.net/love-nature-02/about/?customize=template&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Forum, Displauy, SangBleu Versailles&lt;/p&gt;

</description>
      <category>font</category>
    </item>
    <item>
      <title>SVG tools</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Mon, 08 Sep 2025 20:28:34 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/svg-tools-5eo3</link>
      <guid>https://dev.to/dingzhanjun/svg-tools-5eo3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Text 2 SVG&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://text-to-svg.com/dynapuff-font-to-svg" rel="noopener noreferrer"&gt;https://text-to-svg.com/dynapuff-font-to-svg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SVG 2 data URI&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.svgviewer.dev/svg-to-data-uri" rel="noopener noreferrer"&gt;https://www.svgviewer.dev/svg-to-data-uri&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>install curl 8 on ubuntu</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Sat, 23 Aug 2025 03:34:50 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/install-curl-8-on-ubuntu-53p8</link>
      <guid>https://dev.to/dingzhanjun/install-curl-8-on-ubuntu-53p8</guid>
      <description>&lt;p&gt;sudo snap install curl&lt;/p&gt;

&lt;p&gt;/snap/bin/curl --version&lt;/p&gt;

</description>
      <category>curl</category>
    </item>
    <item>
      <title>Go web framework</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Wed, 20 Aug 2025 15:13:33 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/go-web-framework-1p4o</link>
      <guid>https://dev.to/dingzhanjun/go-web-framework-1p4o</guid>
      <description>&lt;p&gt;Iris, Gin&lt;/p&gt;

</description>
      <category>go</category>
      <category>gin</category>
      <category>iris</category>
    </item>
    <item>
      <title>VPN Zero Tier vs Tailscale</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Thu, 14 Aug 2025 14:33:23 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/vpn-zero-tier-vs-tailscale-23e1</link>
      <guid>https://dev.to/dingzhanjun/vpn-zero-tier-vs-tailscale-23e1</guid>
      <description>&lt;p&gt;2 good vpn options&lt;/p&gt;

</description>
      <category>vpn</category>
    </item>
    <item>
      <title>Get the last response in React</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Wed, 30 Jul 2025 14:16:20 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/get-the-last-response-in-react-4fjp</link>
      <guid>https://dev.to/dingzhanjun/get-the-last-response-in-react-4fjp</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import ReactDOM from "react-dom";

function fetchResults(page) {
  return new Promise((resolve, reject) =&amp;gt; {
    const t = Math.floor(Math.random() * 5) + 1;
    setTimeout(() =&amp;gt; {
      resolve(page+ '-' + t);
    }, t*1000);
  });
}

export default function App() {
  const [results, setResults] = React.useState([]);
  const [page, setPage] = React.useState(1);

  React.useEffect(() =&amp;gt; {
    let ignore = false;
    fetchResults(page).then((res) =&amp;gt; {
      if (ignore) {
        setResults([res]);
      }
    });
    return () =&amp;gt; {
      // reset ignore before next button click(effect re-run)
      ignore = true;
    };
  }, [page]);

  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; setPage(page + 1)}&amp;gt;Test #{page}&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>https://stable-diffusion-art.com/beginners-guide/</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Thu, 17 Jul 2025 13:22:13 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/httpsstable-diffusion-artcombeginners-guide-3683</link>
      <guid>https://dev.to/dingzhanjun/httpsstable-diffusion-artcombeginners-guide-3683</guid>
      <description>&lt;p&gt;&lt;a href="https://stable-diffusion-art.com/beginners-guide/" rel="noopener noreferrer"&gt;https://stable-diffusion-art.com/beginners-guide/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>stable</category>
      <category>diffusion</category>
    </item>
    <item>
      <title>Build Python QT5 application for Windos and macOS</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Wed, 16 Jul 2025 13:24:00 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/build-python-qt5-application-for-windos-and-macos-bkh</link>
      <guid>https://dev.to/dingzhanjun/build-python-qt5-application-for-windos-and-macos-bkh</guid>
      <description>&lt;p&gt;&lt;a href="https://www.pythonguis.com/tutorials/packaging-pyqt5-applications-pyinstaller-macos-dmg/" rel="noopener noreferrer"&gt;https://www.pythonguis.com/tutorials/packaging-pyqt5-applications-pyinstaller-macos-dmg/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Understanding of Options Equity</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Thu, 03 Jul 2025 03:58:44 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/knowing-options-3bf4</link>
      <guid>https://dev.to/dingzhanjun/knowing-options-3bf4</guid>
      <description>&lt;p&gt;&lt;a href="https://jamie-wong.com/post/valley-equity/" rel="noopener noreferrer"&gt;https://jamie-wong.com/post/valley-equity/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dlapiperaccelerate.com/knowledge/2017/stock-options-101.html" rel="noopener noreferrer"&gt;https://www.dlapiperaccelerate.com/knowledge/2017/stock-options-101.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>options</category>
      <category>equity</category>
    </item>
    <item>
      <title>VBA to replace a word in multiple MS word files</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Thu, 05 Jun 2025 13:17:34 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/vba-to-replace-a-word-in-multiple-ms-word-files-2fak</link>
      <guid>https://dev.to/dingzhanjun/vba-to-replace-a-word-in-multiple-ms-word-files-2fak</guid>
      <description>&lt;p&gt;&lt;a href="https://www.msofficeforums.com/word-vba/16209-run-macro-multiple-docx-files.html#post47785" rel="noopener noreferrer"&gt;https://www.msofficeforums.com/word-vba/16209-run-macro-multiple-docx-files.html#post47785&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;`Sub RunMacroOnAllFilesInFolder() &lt;br&gt;
Dim flpath As String, fl As String &lt;br&gt;
flpath = InputBox("Please enter the path to the folder you want to run the macro on.") &lt;br&gt;
If flpath = "" Then Exit Sub &lt;/p&gt;

&lt;p&gt;If Right(flpath, 1) &amp;lt;&amp;gt; Application.PathSeparator Then flpath = flpath &amp;amp; Application.PathSeparator &lt;br&gt;
fl = Dir(flpath &amp;amp; "*.docx") &lt;br&gt;
Application.ScreenUpdating = False &lt;br&gt;
Do Until fl = "" &lt;br&gt;
    MyMacro flpath, fl &lt;br&gt;
    fl = Dir &lt;br&gt;
Loop &lt;br&gt;
End Sub &lt;/p&gt;

&lt;p&gt;Sub MyMacro(flpath As String, fl As String) &lt;br&gt;
Dim doc As Document &lt;br&gt;
Set doc = Documents.Open(flpath &amp;amp; fl) &lt;br&gt;
'Do stuff &lt;br&gt;
doc.Save &lt;br&gt;
doc.Close SaveChanges:=False &lt;/p&gt;

&lt;h2&gt;
  
  
  End Sub `
&lt;/h2&gt;

&lt;p&gt;Sub GlobalTextReplacement()&lt;br&gt;
' Root under which all manuals are stored&lt;br&gt;
Dim rootPath As String&lt;br&gt;
rootPath = "c:\Data\Manuals\"&lt;/p&gt;

&lt;p&gt;' Find and replace text for wildcard replacement. Performed first.&lt;br&gt;
Dim findTextsWild() As Variant, replaceTextsWild() As Variant&lt;br&gt;
findTextsWild = Array("[ ]{2;}", "[cC]onfiguration[/ ]@[pP]olicy [rR]epository", "[sS]ervlet[- ]@[fF]ilter")&lt;br&gt;
replaceTextsWild = Array(" ", "Configuration/Policy Repository", "Servlet-Filter")&lt;/p&gt;

&lt;p&gt;' Find and replace text for normal case insensitive replacement. Performed second.&lt;br&gt;
Dim findTexts() As Variant, replaceTexts() As Variant&lt;br&gt;
findTexts = Array("DirX Access", "Policy Repository", "User Repository", "Servlet", "servletfilter", "SAML assertion", "DirX Access Server", "DirX Access Manager", "Deployment Manager", "Policy Manager", "Client SDK", "^p ", " ^p")&lt;br&gt;
replaceTexts = Array("DirX Access", "Policy Repository", "User Repository", "Servlet", "Servlet-Filter", "SAML assertion", "DirX Access Server", "DirX Access Manager", "Deployment Manager", "Policy Manager", "Client SDK", "^p", "^p")&lt;/p&gt;

&lt;p&gt;' Main code&lt;br&gt;
Application.ScreenUpdating = False&lt;/p&gt;

&lt;p&gt;Dim dirNames(20) As String&lt;br&gt;
Dim dirNamesCount As Integer&lt;br&gt;
dirNamesCount = 0&lt;/p&gt;

&lt;p&gt;Dim dirName As String&lt;br&gt;
dirName = Dir$(rootPath &amp;amp; "*", vbDirectory)&lt;br&gt;
Do Until LenB(dirName) = 0&lt;br&gt;
    Dim dirPath As String&lt;br&gt;
    dirPath = rootPath &amp;amp; dirName&lt;br&gt;
    If ((GetAttr(dirPath) And vbDirectory) = vbDirectory) And (dirName &amp;lt;&amp;gt; ".") And (dirName &amp;lt;&amp;gt; "..") Then&lt;br&gt;
        dirNamesCount = dirNamesCount + 1&lt;br&gt;
        dirNames(dirNamesCount) = dirPath &amp;amp; "\"&lt;br&gt;
    End If&lt;br&gt;
    dirName = Dir$&lt;br&gt;
Loop&lt;/p&gt;

&lt;p&gt;Do While dirNamesCount &amp;gt; 0&lt;br&gt;
    Dim fileName As String&lt;br&gt;
    dirName = dirNames(dirNamesCount)&lt;br&gt;
    dirNamesCount = dirNamesCount - 1&lt;br&gt;
    fileName = Dir$(dirName &amp;amp; "*.doc", vbDirectory)&lt;br&gt;
    Do Until LenB(fileName) = 0&lt;br&gt;
        Dim filePath As String&lt;br&gt;
        filePath = dirName &amp;amp; fileName&lt;br&gt;
        fileName = Dir$&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Dim document As document
    Set document = Documents.Open(filePath)
    document.TrackRevisions = True

    document.Select

    Dim i As Integer, maxIndex As Integer
    maxIndex = UBound(findTextsWild)
    For i = LBound(findTextsWild) To maxIndex
        With Selection.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = findTextsWild(i)
            .Replacement.Text = replaceTextsWild(i)
            .Execute Replace:=wdReplaceAll, Forward:=True, _
                Wrap:=wdFindContinue, MatchWildcards:=True
        End With
    Next

    maxIndex = UBound(findTexts)
    For i = LBound(findTexts) To maxIndex
        With Selection.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = findTexts(i)
            .Replacement.Text = replaceTexts(i)
            .Execute Replace:=wdReplaceAll, Forward:=True, _
                Wrap:=wdFindContinue, MatchCase:=False, MatchWildcards:=False
        End With
    Next

    document.Save
    document.Close
Loop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Loop&lt;/p&gt;

&lt;p&gt;Application.ScreenUpdating = True&lt;br&gt;
End Sub&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Nuxt 2 axios settings</title>
      <dc:creator>John Ding</dc:creator>
      <pubDate>Fri, 30 May 2025 02:33:07 +0000</pubDate>
      <link>https://dev.to/dingzhanjun/nuxt-2-axios-settings-3oa2</link>
      <guid>https://dev.to/dingzhanjun/nuxt-2-axios-settings-3oa2</guid>
      <description>&lt;p&gt;&lt;a href="https://axios.nuxtjs.org/options/" rel="noopener noreferrer"&gt;https://axios.nuxtjs.org/options/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nuxt2</category>
      <category>axios</category>
      <category>api</category>
      <category>access</category>
    </item>
  </channel>
</rss>
