{
  "about" : "[Extrawdw Blog](https://i.extrawdw.net) on IPFS",
  "acceptsDonation" : false,
  "articles" : [
    {
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

      },
      "content" : "Powered by [giscus](https://giscus.app).\n",
      "contentRendered" : "<p>Powered by <a href=\"https://giscus.app\">giscus</a>.</p>\n",
      "created" : 757412114.233182,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "EE31A4EB-821A-43A0-B597-E7B22EE98DDD",
      "link" : "/EE31A4EB-821A-43A0-B597-E7B22EE98DDD/",
      "slug" : "",
      "tags" : {

      },
      "title" : "Commenting is Live!"
    },
    {
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

      },
      "content" : "This post documents some of my commonly used WSL configurations.\n\n## Install Common Packages\n\n**Ubuntu:**\n```sh\nsudo apt install build-essential\n```\n\n**Debian:**\n```sh\nsudo apt install gcc g++\n```\n**Debian Common:**\n```sh\nsudo apt install gdb valgrind git gpg curl wget zip unzip zsh\n```\n\n## Configure Zsh\n\nSet `/bin/zsh` as the default shell:\n```bash\nchsh -s /bin/zsh\n```\nInstall `oh-my-zsh` and commonly used plugins:\n```bash\nwget https://gist.githubusercontent.com/dingwen07/1261eac531f7f080d72b78f931a8ca01/raw/omz-setup.sh\nchmod +x ./omz-setup.sh\n./omz-setup.sh\n```\nEdit `~/.zshrc` to enable plugins:\n```sh\nplugins=(\n    git\n    zsh-autosuggestions\n    zsh-syntax-highlighting\n)\n```\n\n## Java Environment\n\nJava environments are generally managed using [SDKMAN!](https://sdkman.io/). Make sure the `unzip` package is installed:\n```sh\ncurl -s \"https://get.sdkman.io\" | bash\n```\n\n## Configure Windows Terminal for WSL\n\n### Enable Mouse Scrolling for CLI Programs\n\nBy default, CLI programs in WSL, such as `less` and `nano`, do not support mouse scrolling. After configuration, mouse operations will default to being received by the application. To select content, hold the **Shift** key while selecting.\n\n#### **`less` (Including `man`)**\n\nSave the following content as a text file:\n```\n#env\nLESS = --mouse\n```\nThen run `lesskey <filename>` (for newer distributions, save the text directly to `~/.lesskey`).\n\n#### **`nano`**\n\nAdd the following to `~/.nanorc`:\n```\nset mouse\n```\n\n#### **`vi[m]`**\n\nAdd the following to `~/.vi[m]rc`:\n```\nset mouse=a\n```\n\n## SSH Agent\n\nUse `npiperelay.exe` to forward the Windows socket `//./pipe/openssh-ssh-agent` to WSL [^1][^2].\n\nMake sure `npiperelay.exe` is in the Windows `PATH`. This allows WSL to directly access it. It can be installed via WinGet. Then install `socat` in WSL:\n```sh\nsudo apt install socat\n```\nNext, put the following script into `~/.win-ssh-agent/agent-bridge.sh`:\n```sh\n# Code extracted from https://stuartleeks.com/posts/wsl-ssh-key-forward-to-windows/ with minor modifications\n\n# Configure ssh forwarding\nexport SSH_AUTH_SOCK=$HOME/.win-ssh-agent/agent.sock\n# need `ps -ww` to get non-truncated command for matching\n# use square brackets to generate a regex match for the process we want but that doesn't match the grep command running it!\nALREADY_RUNNING=$(ps -auxww | grep -q \"[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent\"; echo $?)\nif [[ $ALREADY_RUNNING != \"0\" ]]; then\n    if [[ -S $SSH_AUTH_SOCK ]]; then\n        # not expecting the socket to exist as the forwarding command isn't running (http://www.tldp.org/LDP/abs/html/fto.html)\n        echo \"removing previous socket...\"\n        rm $SSH_AUTH_SOCK\n    fi\n    echo \"Starting SSH-Agent relay...\"\n    # setsid to force new session to keep running\n    # set socat to listen on $SSH_AUTH_SOCK and forward to npiperelay which then forwards to openssh-ssh-agent on windows\n    (setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:\"npiperelay.exe -ei -s //./pipe/openssh-ssh-agent\",nofork &) >/dev/null 2>&1\nfi\n```\nAdd the following to `.bashrc` or `.zshrc`:\n```sh\nsource $HOME/.win-ssh-agent/agent-bridge.sh\n```\n## GnuPG\n\nRefer to [Using GPG Command-Line Tools in WSL2 and Signing Git Commits](./E8F6E4D8-A27B-4869-BD85-022DFE2D0168/)[^3].\n\n## 1Password CLI\n\nUse the `op` command-line tool for convenient and secure credential access. First, install it on Windows:\n```powershell\nwinget install AgileBits.1Password.CLI\n```\nThen add the following to `.bashrc` or `.zshrc`:\n```sh\n# Aliases\nalias op=\"op.exe\"\n# alias sudo=\"sudo -S <<< $(op read \"op://Personal/Account Password/password\")\"\n\n# Completions\neval \"$(op completion zsh)\"; compdef _op op.exe\n```\n\n## References\n\n[^1]: [Use 1Password SSH Agent in WSL - DEV Community](https://dev.to/d4vsanchez/use-1password-ssh-agent-in-wsl-2j6m)\n[^2]: [Forwarding SSH Agent requests from WSL to Windows - stuartleeks.com](https://stuartleeks.com/posts/wsl-ssh-key-forward-to-windows/)\n[^3]: [Using GPG Command-Line Tools in WSL2 and Signing Git Commits](./E8F6E4D8-A27B-4869-BD85-022DFE2D0168/)\n",
      "contentRendered" : "<p>This post documents some of my commonly used WSL configurations.</p>\n<h2>Install Common Packages</h2>\n<p><strong>Ubuntu:</strong></p>\n<pre><code class=\"language-sh\">sudo apt install build-essential\n</code></pre>\n<p><strong>Debian:</strong></p>\n<pre><code class=\"language-sh\">sudo apt install gcc g++\n</code></pre>\n<p><strong>Debian Common:</strong></p>\n<pre><code class=\"language-sh\">sudo apt install gdb valgrind git gpg curl wget zip unzip zsh\n</code></pre>\n<h2>Configure Zsh</h2>\n<p>Set <code>/bin/zsh</code> as the default shell:</p>\n<pre><code class=\"language-bash\">chsh -s /bin/zsh\n</code></pre>\n<p>Install <code>oh-my-zsh</code> and commonly used plugins:</p>\n<pre><code class=\"language-bash\">wget https://gist.githubusercontent.com/dingwen07/1261eac531f7f080d72b78f931a8ca01/raw/omz-setup.sh\nchmod +x ./omz-setup.sh\n./omz-setup.sh\n</code></pre>\n<p>Edit <code>~/.zshrc</code> to enable plugins:</p>\n<pre><code class=\"language-sh\">plugins=(\n    git\n    zsh-autosuggestions\n    zsh-syntax-highlighting\n)\n</code></pre>\n<h2>Java Environment</h2>\n<p>Java environments are generally managed using <a href=\"https://sdkman.io/\">SDKMAN!</a>. Make sure the <code>unzip</code> package is installed:</p>\n<pre><code class=\"language-sh\">curl -s &quot;https://get.sdkman.io&quot; | bash\n</code></pre>\n<h2>Configure Windows Terminal for WSL</h2>\n<h3>Enable Mouse Scrolling for CLI Programs</h3>\n<p>By default, CLI programs in WSL, such as <code>less</code> and <code>nano</code>, do not support mouse scrolling. After configuration, mouse operations will default to being received by the application. To select content, hold the <strong>Shift</strong> key while selecting.</p>\n<h4><strong><code>less</code> (Including <code>man</code>)</strong></h4>\n<p>Save the following content as a text file:</p>\n<pre><code>#env\nLESS = --mouse\n</code></pre>\n<p>Then run <code>lesskey &lt;filename&gt;</code> (for newer distributions, save the text directly to <code>~/.lesskey</code>).</p>\n<h4><strong><code>nano</code></strong></h4>\n<p>Add the following to <code>~/.nanorc</code>:</p>\n<pre><code>set mouse\n</code></pre>\n<h4><strong><code>vi[m]</code></strong></h4>\n<p>Add the following to <code>~/.vi[m]rc</code>:</p>\n<pre><code>set mouse=a\n</code></pre>\n<h2>SSH Agent</h2>\n<p>Use <code>npiperelay.exe</code> to forward the Windows socket <code>//./pipe/openssh-ssh-agent</code> to WSL <sup class=\"footnote-ref\"><a href=\"#fn-1\" id=\"fnref-1\" data-footnote-ref>1</a></sup><sup class=\"footnote-ref\"><a href=\"#fn-2\" id=\"fnref-2\" data-footnote-ref>2</a></sup>.</p>\n<p>Make sure <code>npiperelay.exe</code> is in the Windows <code>PATH</code>. This allows WSL to directly access it. It can be installed via WinGet. Then install <code>socat</code> in WSL:</p>\n<pre><code class=\"language-sh\">sudo apt install socat\n</code></pre>\n<p>Next, put the following script into <code>~/.win-ssh-agent/agent-bridge.sh</code>:</p>\n<pre><code class=\"language-sh\"># Code extracted from https://stuartleeks.com/posts/wsl-ssh-key-forward-to-windows/ with minor modifications\n\n# Configure ssh forwarding\nexport SSH_AUTH_SOCK=$HOME/.win-ssh-agent/agent.sock\n# need `ps -ww` to get non-truncated command for matching\n# use square brackets to generate a regex match for the process we want but that doesn't match the grep command running it!\nALREADY_RUNNING=$(ps -auxww | grep -q &quot;[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent&quot;; echo $?)\nif [[ $ALREADY_RUNNING != &quot;0&quot; ]]; then\n    if [[ -S $SSH_AUTH_SOCK ]]; then\n        # not expecting the socket to exist as the forwarding command isn't running (http://www.tldp.org/LDP/abs/html/fto.html)\n        echo &quot;removing previous socket...&quot;\n        rm $SSH_AUTH_SOCK\n    fi\n    echo &quot;Starting SSH-Agent relay...&quot;\n    # setsid to force new session to keep running\n    # set socat to listen on $SSH_AUTH_SOCK and forward to npiperelay which then forwards to openssh-ssh-agent on windows\n    (setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:&quot;npiperelay.exe -ei -s //./pipe/openssh-ssh-agent&quot;,nofork &amp;) &gt;/dev/null 2&gt;&amp;1\nfi\n</code></pre>\n<p>Add the following to <code>.bashrc</code> or <code>.zshrc</code>:</p>\n<pre><code class=\"language-sh\">source $HOME/.win-ssh-agent/agent-bridge.sh\n</code></pre>\n<h2>GnuPG</h2>\n<p>Refer to <a href=\"./E8F6E4D8-A27B-4869-BD85-022DFE2D0168/\">Using GPG Command-Line Tools in WSL2 and Signing Git Commits</a><sup class=\"footnote-ref\"><a href=\"#fn-3\" id=\"fnref-3\" data-footnote-ref>3</a></sup>.</p>\n<h2>1Password CLI</h2>\n<p>Use the <code>op</code> command-line tool for convenient and secure credential access. First, install it on Windows:</p>\n<pre><code class=\"language-powershell\">winget install AgileBits.1Password.CLI\n</code></pre>\n<p>Then add the following to <code>.bashrc</code> or <code>.zshrc</code>:</p>\n<pre><code class=\"language-sh\"># Aliases\nalias op=&quot;op.exe&quot;\n# alias sudo=&quot;sudo -S &lt;&lt;&lt; $(op read &quot;op://Personal/Account Password/password&quot;)&quot;\n\n# Completions\neval &quot;$(op completion zsh)&quot;; compdef _op op.exe\n</code></pre>\n<h2>References</h2>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p><a href=\"https://dev.to/d4vsanchez/use-1password-ssh-agent-in-wsl-2j6m\">Use 1Password SSH Agent in WSL - DEV Community</a> <a href=\"#fnref-1\" class=\"footnote-backref\" data-footnote-backref aria-label=\"Back to content\">↩</a></p>\n</li>\n<li id=\"fn-2\">\n<p><a href=\"https://stuartleeks.com/posts/wsl-ssh-key-forward-to-windows/\">Forwarding SSH Agent requests from WSL to Windows - stuartleeks.com</a> <a href=\"#fnref-2\" class=\"footnote-backref\" data-footnote-backref aria-label=\"Back to content\">↩</a></p>\n</li>\n<li id=\"fn-3\">\n<p><a href=\"./E8F6E4D8-A27B-4869-BD85-022DFE2D0168/\">Using GPG Command-Line Tools in WSL2 and Signing Git Commits</a> <a href=\"#fnref-3\" class=\"footnote-backref\" data-footnote-backref aria-label=\"Back to content\">↩</a></p>\n</li>\n</ol>\n</section>\n",
      "created" : 757399281.490556,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "C05539DF-8C63-474E-BB62-90DBBD0F06AD",
      "link" : "/C05539DF-8C63-474E-BB62-90DBBD0F06AD/",
      "slug" : "",
      "tags" : {
        "developer" : "Developer",
        "linux" : "Linux",
        "ssh" : "SSH",
        "windows" : "Windows",
        "wsl" : "WSL",
        "wsl2" : "WSL2"
      },
      "title" : "Setting Up WSL for Development"
    },
    {
      "articleType" : 0,
      "attachments" : [
        "IMG_3843.png",
        "Screenshot 2024-12-12 at 13.49.01.png",
        "Screenshot-2024-12-12-at-13.51.36.png",
        "Screenshot-2024-12-12-at-13.53.07.png"
      ],
      "cids" : {
        "IMG_3843.png" : "QmVgyNm9qZbV1BQ4vBunN2Uubq7FszProW9nRriaoeYST8",
        "Screenshot 2024-12-12 at 13.49.01.png" : "QmcJUwoFKzpcpoVxEQ4Djzyk3pwBkKVJJsqLpA2c8wiTq4",
        "Screenshot-2024-12-12-at-13.51.36.png" : "QmPLZfmRFXK2gdmmSibm8fPX99Vyyj4quoebmKYdziLQ7i",
        "Screenshot-2024-12-12-at-13.53.07.png" : "QmXufei6QD9Ea9YWJkp5LmQT1qLgc25HCTPmryEEGqbH4C"
      },
      "content" : "Recently, my MacBook's Time Machine backup to a network disk (on a Mac mini) gives following error:\n\n<img width=\"358\" alt=\"IMG_3843\" src=\"IMG_3843.png\">\n\nThe exact error message was:\n\n> Time Machine detected that your backups on “destination” can not be reliably restored. Time Machine must erase your existing backup history and start a new backup to correct this.\n\nThis happens after a kernel panic.\n\nAfter some digging, it does not necessarily mean the backup disk image is corrupted, but in some cases, Time Machine will 'mark' a backup disk image as 'bad' and refuse further backups to it.\n\nTo bypass this issue without erasing the backup history, locate the backup disk image (`sparsebundle`) in the network share. The disk image file might be in a \"locked\" state. Use <kbd>⌘ + I</kbd> to open the info panel and unlock it.  \n\n<img width=\"377\" alt=\"Screenshot 2024-12-12 at 13.49.01\" src=\"Screenshot 2024-12-12 at 13.49.01.png\">\n\nThen right-click → **Show Package Contents**, where the `token` file might also be locked. Unlock it similarly.  \n\n<img width=\"979\" alt=\"Screenshot-2024-12-12-at-13.51.36\" src=\"Screenshot-2024-12-12-at-13.51.36.png\">\n\nNext, use Xcode to open file `com.apple.TimeMachine.MachineID.plist`. Change the value of the key `VerificationState` from `2` to `1` and save the file.  \n\n<img width=\"962\" alt=\"Screenshot-2024-12-12-at-13.53.07\" src=\"Screenshot-2024-12-12-at-13.53.07.png\">\n\nNow we should be able to complete backups, but make sure to verify the backup after the first completed backup. If the verification succeeds, then the backup disk image is not corrupted.\n\n---\n\nTranslated from my Chinese blog post: [Mac 时间机器“检测到备份无法可靠恢复”的解决方法](https://cn.extrawdw.eth.limo/BF15E650-41F6-4F5E-8610-1DDCBDFBE34D/)\n",
      "contentRendered" : "<p>Recently, my MacBook's Time Machine backup to a network disk (on a Mac mini) gives following error:</p>\n<img width=\"358\" alt=\"IMG_3843\" src=\"IMG_3843.png\">\n<p>The exact error message was:</p>\n<blockquote>\n<p>Time Machine detected that your backups on “destination” can not be reliably restored. Time Machine must erase your existing backup history and start a new backup to correct this.</p>\n</blockquote>\n<p>This happens after a kernel panic.</p>\n<p>After some digging, it does not necessarily mean the backup disk image is corrupted, but in some cases, Time Machine will 'mark' a backup disk image as 'bad' and refuse further backups to it.</p>\n<p>To bypass this issue without erasing the backup history, locate the backup disk image (<code>sparsebundle</code>) in the network share. The disk image file might be in a &quot;locked&quot; state. Use <kbd>⌘ + I</kbd> to open the info panel and unlock it.</p>\n<img width=\"377\" alt=\"Screenshot 2024-12-12 at 13.49.01\" src=\"Screenshot 2024-12-12 at 13.49.01.png\">\n<p>Then right-click → <strong>Show Package Contents</strong>, where the <code>token</code> file might also be locked. Unlock it similarly.</p>\n<img width=\"979\" alt=\"Screenshot-2024-12-12-at-13.51.36\" src=\"Screenshot-2024-12-12-at-13.51.36.png\">\n<p>Next, use Xcode to open file <code>com.apple.TimeMachine.MachineID.plist</code>. Change the value of the key <code>VerificationState</code> from <code>2</code> to <code>1</code> and save the file.</p>\n<img width=\"962\" alt=\"Screenshot-2024-12-12-at-13.53.07\" src=\"Screenshot-2024-12-12-at-13.53.07.png\">\n<p>Now we should be able to complete backups, but make sure to verify the backup after the first completed backup. If the verification succeeds, then the backup disk image is not corrupted.</p>\n<hr />\n<p>Translated from my Chinese blog post: <a href=\"https://cn.extrawdw.eth.limo/BF15E650-41F6-4F5E-8610-1DDCBDFBE34D/\">Mac 时间机器“检测到备份无法可靠恢复”的解决方法</a></p>\n",
      "created" : 757327599.881062,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "heroImage" : "https://blog.extrawdw.eth.limo/E9D02EA8-784F-4291-A736-4FA185E68EE3/IMG_3843.png",
      "heroImageFilename" : "IMG_3843.png",
      "heroImageHeight" : 748,
      "heroImageURL" : "https://blog.extrawdw.eth.limo/E9D02EA8-784F-4291-A736-4FA185E68EE3/IMG_3843.png",
      "heroImageWidth" : 716,
      "id" : "E9D02EA8-784F-4291-A736-4FA185E68EE3",
      "link" : "/E9D02EA8-784F-4291-A736-4FA185E68EE3/",
      "slug" : "",
      "tags" : {
        "mac" : "Mac",
        "macos" : "macOS",
        "time-machine" : "Time Machine"
      },
      "title" : "Solution to \"Time Machine detected that your backups can not be reliably restored\""
    },
    {
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

      },
      "content" : "\nMost of the methods found online involve using `npiperelay` to map the Gpg4win GPG Agent's socket into WSL2. However, a simpler approach is to use `gpg.exe` directly within WSL2.\n\nIf you want to sign Git commits but your private key is stored on a smart card, you can directly set it with:  \n`git config --global gpg.program gpg.exe`  \n(If GPG is not in Windows' PATH, you need to use the absolute path, which is usually `/mnt/c/Program Files (x86)/GnuPG/bin/gpg.exe`. For convenience, it's better to add it to PATH. After doing so, open a new terminal.)\n\nUnless a program requires direct GPG Agent access or does not support custom GPG binaries, this approach is far more convenient than mapping the GPG Agent socket.\n\n---\n\nTranslated from my Chinese blog post: [在 WSL2 中使用 GPG 命令行工具以及对 Git commit 进行签名](https://cn.extrawdw.eth.limo/E866F5DA-F9C4-4137-9D7F-60A1F68FC0AD/)\n",
      "contentRendered" : "<p>Most of the methods found online involve using <code>npiperelay</code> to map the Gpg4win GPG Agent's socket into WSL2. However, a simpler approach is to use <code>gpg.exe</code> directly within WSL2.</p>\n<p>If you want to sign Git commits but your private key is stored on a smart card, you can directly set it with:<br />\n<code>git config --global gpg.program gpg.exe</code><br />\n(If GPG is not in Windows' PATH, you need to use the absolute path, which is usually <code>/mnt/c/Program Files (x86)/GnuPG/bin/gpg.exe</code>. For convenience, it's better to add it to PATH. After doing so, open a new terminal.)</p>\n<p>Unless a program requires direct GPG Agent access or does not support custom GPG binaries, this approach is far more convenient than mapping the GPG Agent socket.</p>\n<hr />\n<p>Translated from my Chinese blog post: <a href=\"https://cn.extrawdw.eth.limo/E866F5DA-F9C4-4137-9D7F-60A1F68FC0AD/\">在 WSL2 中使用 GPG 命令行工具以及对 Git commit 进行签名</a></p>\n",
      "created" : 757325339.477323,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "E8F6E4D8-A27B-4869-BD85-022DFE2D0168",
      "link" : "/E8F6E4D8-A27B-4869-BD85-022DFE2D0168/",
      "slug" : "",
      "tags" : {
        "git" : "Git",
        "gnupg" : "GnuPG",
        "wsl" : "WSL",
        "wsl2" : "WSL2"
      },
      "title" : "Using GPG Command-Line Tools in WSL2 and Signing Git Commits"
    },
    {
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

      },
      "content" : "First, make sure there is IPNS Key in local IPFS keystore:\n\n```\nipfs key list\n```\n\nIf the key is not present, import with:\n\n```\nipfs key import <name> <key>\n```\n\nThen, update IPNS record with:\n\n```\nipfs name publish --key=<key name> /ipfs/...\n```\n",
      "contentRendered" : "<p>First, make sure there is IPNS Key in local IPFS keystore:</p>\n<pre><code>ipfs key list\n</code></pre>\n<p>If the key is not present, import with:</p>\n<pre><code>ipfs key import &lt;name&gt; &lt;key&gt;\n</code></pre>\n<p>Then, update IPNS record with:</p>\n<pre><code>ipfs name publish --key=&lt;key name&gt; /ipfs/...\n</code></pre>\n",
      "created" : 689016910.612862,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "70DF291A-1AE9-4058-8CB6-D2DC7E9FBF38",
      "link" : "/70DF291A-1AE9-4058-8CB6-D2DC7E9FBF38/",
      "slug" : "",
      "tags" : {
        "ipfs" : "IPFS",
        "ipns" : "IPNS",
        "web3" : "Web3"
      },
      "title" : "Update IPNS record"
    },
    {
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

      },
      "content" : "Extrawdw Blog will also be accessible on [extrawdw.bit](https://extrawdw.bit.cc) from now on.\n\nThe .bit is another blockchain domain name that can be registered here:\n\n[.bit](https://app.did.id/explorer?inviter=extrawdw.bit)\n\nNote: The above is the referral link, if you register through the above link then I will receive a pay back, feel free to delete and replace the referrer. The registration fee will be reduced by 5% if there is a referrer.\n\nOne advantage of .bit addresses over .eth is that updating domain records is free: you don't need to pay gas (network fee) for it.\n\n",
      "contentRendered" : "<p>Extrawdw Blog will also be accessible on <a href=\"https://extrawdw.bit.cc\">extrawdw.bit</a> from now on.</p>\n<p>The .bit is another blockchain domain name that can be registered here:</p>\n<p><a href=\"https://app.did.id/explorer?inviter=extrawdw.bit\">.bit</a></p>\n<p>Note: The above is the referral link, if you register through the above link then I will receive a pay back, feel free to delete and replace the referrer. The registration fee will be reduced by 5% if there is a referrer.</p>\n<p>One advantage of .bit addresses over .eth is that updating domain records is free: you don't need to pay gas (network fee) for it.</p>\n",
      "created" : 686730660,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "F1A42BFB-4222-45C3-86FA-983D95724071",
      "link" : "/F1A42BFB-4222-45C3-86FA-983D95724071/",
      "slug" : "",
      "tags" : {
        "ipns" : "IPNS",
        "web3" : "Web3"
      },
      "title" : ".bit address"
    },
    {
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

      },
      "content" : "Welcome visitor,\n\nThis is Extrawdw Blog ([blog.extrawdw.net](https://blog.extrawdw.net) and [i.extrawdw.net](https://i.extrawdw.net)) on IPFS.\n\nArchives of obsolete/deleted articles are available at [`/ipns/k51qzi5uqu5dk04xxfqzcfc2ya5dhoer3xy1i4ppo9u1r4cilcxhih6fpbvfg0/`](https://ipfs.io/ipns/k51qzi5uqu5dk04xxfqzcfc2ya5dhoer3xy1i4ppo9u1r4cilcxhih6fpbvfg0/). It might contain posts in Chinese.\n\n\nArticles will start being posted here soon.\n\nEnjoy!\n",
      "contentRendered" : "<p>Welcome visitor,</p>\n<p>This is Extrawdw Blog (<a href=\"https://blog.extrawdw.net\">blog.extrawdw.net</a> and <a href=\"https://i.extrawdw.net\">i.extrawdw.net</a>) on IPFS.</p>\n<p>Archives of obsolete/deleted articles are available at <a href=\"https://ipfs.io/ipns/k51qzi5uqu5dk04xxfqzcfc2ya5dhoer3xy1i4ppo9u1r4cilcxhih6fpbvfg0/\"><code>/ipns/k51qzi5uqu5dk04xxfqzcfc2ya5dhoer3xy1i4ppo9u1r4cilcxhih6fpbvfg0/</code></a>. It might contain posts in Chinese.</p>\n<p>Articles will start being posted here soon.</p>\n<p>Enjoy!</p>\n",
      "created" : 683621280,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "58EE7099-4A3F-428B-832D-EE2C6E2B07F2",
      "link" : "/58EE7099-4A3F-428B-832D-EE2C6E2B07F2/",
      "slug" : "",
      "tags" : {
        "ipfs" : "IPFS",
        "ipns" : "IPNS",
        "web3" : "Web3"
      },
      "title" : "Welcome to Extrawdw Blog on IPFS"
    }
  ],
  "created" : 683664449.740886,
  "discordLink" : "",
  "githubUsername" : "dingwen07",
  "id" : "EC4DF131-066C-4FB9-8837-69E015AEDAEE",
  "ipns" : "k51qzi5uqu5dh11cyqktyw5m9ilymx50a3n8oxng6uer77wzpz69v98dv9f4ul",
  "juiceboxEnabled" : false,
  "mastodonUsername" : "",
  "name" : "Extrawdw Blog",
  "plausibleAPIServer" : "plausible.io",
  "plausibleDomain" : "",
  "plausibleEnabled" : false,
  "podcastCategories" : {

  },
  "podcastExplicit" : false,
  "podcastLanguage" : "en",
  "tags" : {
    "developer" : "Developer",
    "git" : "Git",
    "gnupg" : "GnuPG",
    "ipfs" : "IPFS",
    "ipns" : "IPNS",
    "linux" : "Linux",
    "mac" : "Mac",
    "macos" : "macOS",
    "ssh" : "SSH",
    "time-machine" : "Time Machine",
    "web3" : "Web3",
    "windows" : "Windows",
    "wsl" : "WSL",
    "wsl2" : "WSL2"
  },
  "telegramUsername" : "extrawdw",
  "twitterUsername" : "realExtrawdw",
  "updated" : 758586323.346231
}