<?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: Shoichi Okaniwa</title>
    <description>The latest articles on DEV Community by Shoichi Okaniwa (@segur).</description>
    <link>https://dev.to/segur</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%2F705759%2F09c59154-e398-4141-b9b6-6107d3f64aaa.jpeg</url>
      <title>DEV Community: Shoichi Okaniwa</title>
      <link>https://dev.to/segur</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/segur"/>
    <language>en</language>
    <item>
      <title>Removing Only the First Line of a Multi-Line String in JavaScript</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Tue, 14 Apr 2026 15:18:22 +0000</pubDate>
      <link>https://dev.to/segur/removing-only-the-first-line-of-a-multi-line-string-in-javascript-29jd</link>
      <guid>https://dev.to/segur/removing-only-the-first-line-of-a-multi-line-string-in-javascript-29jd</guid>
      <description>&lt;h1&gt;
  
  
  Encountering a CSV File with an Unusual First Line
&lt;/h1&gt;

&lt;p&gt;I came across a CSV file like the one below. (This is not actual business data.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hogehoge
name,value,count
りんご,100,2
バナナ,150,4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this scenario, there's an unwanted string in the first line that isn't in CSV format. I needed to remove it before processing the CSV data. Let's assume the line breaks are &lt;code&gt;LF&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Removing Only the First Line of a Multi-Line String
&lt;/h1&gt;

&lt;p&gt;Surprisingly, I couldn't find many articles on this topic, so I'm documenting it before I forget.&lt;/p&gt;

&lt;p&gt;This can be achieved with a combination of &lt;code&gt;indexOf&lt;/code&gt; and &lt;code&gt;substr&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Define a multi-line string (In reality, this would be read from a file)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inputString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`hogehoge
name,value,count
りんご,100,2
バナナ,150,4`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Find the position of the first line break&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstRowEndPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inputString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&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="c1"&gt;// Extract the string starting from the position after the first line break&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inputString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstRowEndPos&lt;/span&gt; &lt;span class="o"&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;// Display the result&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;outputString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  In Conclusion
&lt;/h1&gt;

&lt;p&gt;It was relatively simple to implement. If you also need to consider &lt;code&gt;CR&lt;/code&gt;, it might become a bit more complex.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Copy Firebase Environment Variables to Bash</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Mon, 13 Apr 2026 15:21:07 +0000</pubDate>
      <link>https://dev.to/segur/copy-firebase-environment-variables-to-bash-1pbb</link>
      <guid>https://dev.to/segur/copy-firebase-environment-variables-to-bash-1pbb</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Firebase functions allow you to set environment variables. For an easy-to-understand guide on setting them, please refer to this article: &lt;a href="https://qiita.com/nerdyboy_cool/items/695c8af7ca8d22761927" rel="noopener noreferrer"&gt;How to Set Environment Variables in Firebase&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I wanted to use these environment variables in Bash as well, so I devised a command to copy them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example of Environment Variables
&lt;/h2&gt;

&lt;p&gt;Assume the following environment variables are registered in Firebase functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hoge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"client_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fuga"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"client_secret"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"piyo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal here is to copy the &lt;code&gt;client_id&lt;/code&gt; and &lt;code&gt;client_secret&lt;/code&gt; into Bash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing jq
&lt;/h2&gt;

&lt;p&gt;To parse JSON, we need the command-line tool &lt;code&gt;jq&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mac&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;jq

&lt;span class="c"&gt;# Windows&lt;/span&gt;
choco &lt;span class="nb"&gt;install &lt;/span&gt;jq

&lt;span class="c"&gt;# Ubuntu&lt;/span&gt;
apt-get &lt;span class="nb"&gt;install &lt;/span&gt;jq

&lt;span class="c"&gt;# CentOS&lt;/span&gt;
yum &lt;span class="nb"&gt;install &lt;/span&gt;jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Registering in Bash Environment Variables
&lt;/h2&gt;

&lt;p&gt;You can register them with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;firebase functions:config:get | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.hoge'&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'keys[] as $k | "export \($k)=\(.[$k])"'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;hoge&lt;/code&gt; with the appropriate value as needed.&lt;/p&gt;

&lt;p&gt;This method was inspired by the article &lt;a href="https://qiita.com/arc279/items/3e88bc668987927c03d6" rel="noopener noreferrer"&gt;Export JSON key:value to environment variables&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying Bash Environment Variables
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;client_id&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
fuga

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;client_secret&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
piyo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The variables were successfully copied.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;The following articles were invaluable references. Thank you for the clear guidance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/nerdyboy_cool/items/695c8af7ca8d22761927" rel="noopener noreferrer"&gt;How to Set Environment Variables in Firebase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/arc279/items/3e88bc668987927c03d6" rel="noopener noreferrer"&gt;Export JSON key:value to environment variables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>bash</category>
      <category>firebase</category>
      <category>json</category>
    </item>
    <item>
      <title>IoT Setup in My Home</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Sun, 12 Apr 2026 14:46:55 +0000</pubDate>
      <link>https://dev.to/segur/iot-setup-in-my-home-3ie6</link>
      <guid>https://dev.to/segur/iot-setup-in-my-home-3ie6</guid>
      <description>&lt;h1&gt;
  
  
  IoT Setup in My Home
&lt;/h1&gt;

&lt;p&gt;I often get asked about the configuration of IoT devices in my home, so I've created a diagram to illustrate it.&lt;/p&gt;

&lt;p&gt;The diagram shows two instances of Wi-Fi, though they represent the same device. I structured it this way to depict the flow of data from left to right.&lt;/p&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%2Fsy5t0rdx62hlvq1b8zbr.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%2Fsy5t0rdx62hlvq1b8zbr.png" alt="image.png" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Nature Remo
&lt;/h1&gt;

&lt;p&gt;Thanks to Nature Remo, I can control devices like projectors and air conditioners that are not IoT-compatible via infrared. I highly recommend it!&lt;/p&gt;

&lt;h1&gt;
  
  
  IFTTT
&lt;/h1&gt;

&lt;p&gt;Most IoT products come with their own smartphone apps for precise control. However, to manage multiple IoT products collectively, I've consolidated all controls using IFTTT.&lt;/p&gt;

&lt;p&gt;By setting up scenarios like leaving home, returning home, or bedtime within IFTTT, and registering the control actions for various IoT products there, it becomes incredibly convenient.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>smarthome</category>
      <category>automation</category>
      <category>integration</category>
    </item>
    <item>
      <title>Voice Chat on Discord with VOICEROID Transformed Speech</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Sat, 11 Apr 2026 14:41:16 +0000</pubDate>
      <link>https://dev.to/segur/voice-chat-on-discord-with-voiceroid-transformed-speech-4201</link>
      <guid>https://dev.to/segur/voice-chat-on-discord-with-voiceroid-transformed-speech-4201</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;I experimented with converting my voice using VOICEROID while chatting on Discord. Initially, I couldn't hear the transformed voice myself, so I researched how to enable this. I hope this is helpful for those starting as machine-voiced VTubers.&lt;/p&gt;

&lt;h1&gt;
  
  
  Setup Overview
&lt;/h1&gt;

&lt;p&gt;The setup process involves the following steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Record your voice via a microphone&lt;/li&gt;
&lt;li&gt;Convert the voice to text using Yukari-net&lt;/li&gt;
&lt;li&gt;Use VOICEROID to generate audio from the text&lt;/li&gt;
&lt;li&gt;Input the audio into VB-AUDIO&lt;/li&gt;
&lt;li&gt;Set this as the input device on Discord&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Preparations
&lt;/h1&gt;

&lt;p&gt;It's assumed that you have set up the flow from Microphone to Yukari-net to VOICEROID.&lt;/p&gt;

&lt;p&gt;This article was extremely helpful:&lt;br&gt;&lt;br&gt;
&lt;a href="https://ariemonn.net/entry/2018/01/22/131410" rel="noopener noreferrer"&gt;https://ariemonn.net/entry/2018/01/22/131410&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Installing Virtual Audio Device
&lt;/h1&gt;

&lt;p&gt;Install the virtual audio device &lt;strong&gt;VB-CABLE&lt;/strong&gt; from:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.vb-audio.com/Cable/" rel="noopener noreferrer"&gt;https://www.vb-audio.com/Cable/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This guide was beneficial:&lt;br&gt;&lt;br&gt;
&lt;a href="https://arutora.com/archives/20180516223000/" rel="noopener noreferrer"&gt;https://arutora.com/archives/20180516223000/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Configuring Virtual Audio Device
&lt;/h1&gt;

&lt;p&gt;Next, in VOICEROID, go to &lt;code&gt;Options&lt;/code&gt; → &lt;code&gt;Others&lt;/code&gt; → &lt;code&gt;Audio Device&lt;/code&gt; and select &lt;code&gt;CABLE Input (VB-Audio Virtual Cable)&lt;/code&gt;.&lt;/p&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%2Fl1kiemwd9om3lcxq6635.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%2Fl1kiemwd9om3lcxq6635.png" alt="image.png" width="530" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, in Discord, click the gear icon → &lt;code&gt;App Settings&lt;/code&gt; → &lt;code&gt;Voice &amp;amp; Video&lt;/code&gt; → &lt;code&gt;Input Device&lt;/code&gt; and choose &lt;code&gt;CABLE Output (VB-Audio Virtual Cable)&lt;/code&gt;.&lt;/p&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%2Fczwwu7f5gwsi1yrc4z5d.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%2Fczwwu7f5gwsi1yrc4z5d.png" alt="image.png" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This allows you to converse with the VOICEROID voice on Discord. However, you still can't hear the transformed voice yourself yet.&lt;/p&gt;

&lt;h1&gt;
  
  
  Listening to Your Transformed Voice
&lt;/h1&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%2Fzqpyqcgyr3fjhxx41h7n.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%2Fzqpyqcgyr3fjhxx41h7n.png" alt="image.png" width="352" height="39"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Windows 10, right-click the &lt;strong&gt;speaker icon&lt;/strong&gt; 🔈 in the notification area (task tray) → &lt;code&gt;Sound&lt;/code&gt; → &lt;code&gt;Recording&lt;/code&gt; tab → right-click on &lt;code&gt;CABLE Output&lt;/code&gt; → &lt;code&gt;Properties&lt;/code&gt; → &lt;code&gt;Listen&lt;/code&gt; tab → check &lt;code&gt;Listen to this device&lt;/code&gt;.&lt;/p&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%2F3eqit0arcrxlq3b6vfzo.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%2F3eqit0arcrxlq3b6vfzo.png" alt="image.png" width="465" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you can hear the transformed voice.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;By substituting the Discord setting with VRChat, you can also converse in VR worlds!&lt;/p&gt;

</description>
      <category>discord</category>
      <category>vtuber</category>
      <category>voiceroid</category>
    </item>
    <item>
      <title>How to Install Corretto 8 on Windows</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Fri, 10 Apr 2026 14:54:54 +0000</pubDate>
      <link>https://dev.to/segur/how-to-install-corretto-8-on-windows-4bal</link>
      <guid>https://dev.to/segur/how-to-install-corretto-8-on-windows-4bal</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;I might transition from OracleJDK to Amazon Corretto, so I documented the steps for installing Corretto 8 on Windows 10. This method likely works for Windows 7 as well.&lt;/p&gt;

&lt;p&gt;For Mac installations, this article was helpful: &lt;a href="https://qiita.com/lc-tsuchiya/items/3776e1c1ecadb4dc5b99" rel="noopener noreferrer"&gt;[Java] Installing Amazon Corretto 8&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Corretto?
&lt;/h1&gt;

&lt;p&gt;Corretto is a JDK implemented by Amazon, verified by the Java community and compatible with the Java SE standard. It can be used on Amazon Linux 2, Windows, and Mac, with more OS support on the way.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Corretto 8?
&lt;/h1&gt;

&lt;p&gt;Amazon Corretto 8 is a JDK for Java 8, with free support expected until at least June 2023.&lt;/p&gt;

&lt;h1&gt;
  
  
  Downloading the Installer
&lt;/h1&gt;

&lt;p&gt;The Corretto 8 installer is available &lt;a href="https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-8-ug/downloads-list.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&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%2Fhsxkxxlmtqwr68c8i2u6.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%2Fhsxkxxlmtqwr68c8i2u6.png" alt="image.png" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For my Windows 64bit environment, I downloaded &lt;strong&gt;amazon-corretto-8.202.08.2-windows-x64.msi&lt;/strong&gt;. For Windows 32bit, download from &lt;strong&gt;Windows x86&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The JRE version lacks a compiler, so the JDK version is necessary for development (though JRE includes the JVM and API).&lt;/p&gt;

&lt;h1&gt;
  
  
  Running the Installer
&lt;/h1&gt;

&lt;p&gt;Double-click the installer to start the wizard and follow the on-screen instructions.&lt;/p&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%2Fgiam5t4q9e4whpo5pl8q.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%2Fgiam5t4q9e4whpo5pl8q.png" alt="Corretto01.PNG" width="495" height="387"&gt;&lt;/a&gt;&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%2Fwekpexyofh69kiav3ixt.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%2Fwekpexyofh69kiav3ixt.png" alt="Corretto02.PNG" width="495" height="387"&gt;&lt;/a&gt;&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%2Fkocxvfdjwt9tz9492um6.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%2Fkocxvfdjwt9tz9492um6.png" alt="Corretto03.PNG" width="495" height="387"&gt;&lt;/a&gt;&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%2Fszi257vmkpfs48xymt1y.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%2Fszi257vmkpfs48xymt1y.png" alt="Corretto04.PNG" width="495" height="387"&gt;&lt;/a&gt;&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%2F9wiod2opi6nyoc4x43n6.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%2F9wiod2opi6nyoc4x43n6.png" alt="Corretto05.PNG" width="495" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, the installation is complete. By default, it's installed at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Program Files\Amazon Corretto\jdk1.8.0_202
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Setting Environment Variables
&lt;/h1&gt;

&lt;h2&gt;
  
  
  For Command Prompt
&lt;/h2&gt;

&lt;p&gt;First, check &lt;code&gt;JAVA_HOME&lt;/code&gt;. It should be automatically added to your system environment variables by the installation. If &lt;code&gt;JAVA_HOME&lt;/code&gt; existed before, its value gets overwritten.&lt;/p&gt;

&lt;p&gt;Verify the setup with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo %JAVA_HOME%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should display &lt;code&gt;C:\Program Files\Amazon Corretto\jdk1.8.0_202&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Add the following to the start of the &lt;code&gt;Path&lt;/code&gt; system environment variable:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;%JAVA_HOME%\bin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Skip this if you had previously added another JDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  For Git Bash
&lt;/h2&gt;

&lt;p&gt;If using Git Bash, manually set its environment variables. Open &lt;code&gt;%USERPROFILE%\.bash_profile&lt;/code&gt; in a text editor (create it if absent).&lt;/p&gt;

&lt;p&gt;Add these at the end and save:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Java
export JAVA_HOME='/c/Program Files/Amazon Corretto/jdk1.8.0_202'
export PATH=$PATH:${JAVA_HOME}/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Git Bash and verify by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo $JAVA_HOME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should display &lt;code&gt;/c/Program Files/Amazon Corretto/jdk1.8.0_202&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Checking the Java Version
&lt;/h1&gt;

&lt;p&gt;Check your Java version in Command Prompt or Git Bash with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java -version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this displays correctly, your installation was successful. Congratulations!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openjdk version "1.8.0_202"
OpenJDK Runtime Environment Corretto-8.202.08.2 (build 1.8.0_202-b08)
OpenJDK 64-Bit Server VM Corretto-8.202.08.2 (build 25.202-b08, mixed mode)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Switching to Another JDK
&lt;/h1&gt;

&lt;p&gt;To switch, change the &lt;code&gt;JAVA_HOME&lt;/code&gt; system environment variable to the path of another JDK.&lt;/p&gt;

&lt;p&gt;For example, if OracleJDK is installed at &lt;code&gt;C:\Program Files\Java\jdk1.8.0_172&lt;/code&gt;, set &lt;code&gt;JAVA_HOME&lt;/code&gt; to this path to enable OracleJDK over Corretto.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Installation was straightforward, and tests on existing Java projects ran without issues.&lt;/p&gt;

</description>
      <category>java</category>
      <category>openjdk</category>
      <category>corretto</category>
    </item>
    <item>
      <title>Resolving Unknown Errors When Changing Device Mode in OpenVR Input Emulator</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Thu, 09 Apr 2026 15:27:25 +0000</pubDate>
      <link>https://dev.to/segur/resolving-unknown-errors-when-changing-device-mode-in-openvr-input-emulator-2p2g</link>
      <guid>https://dev.to/segur/resolving-unknown-errors-when-changing-device-mode-in-openvr-input-emulator-2p2g</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;OpenVR Input Emulator is a tool that extends SteamVR's input system. I encountered an error when attempting to assign the movement of a VIVE tracker to a VIVE controller.&lt;/p&gt;

&lt;p&gt;First, I opened the settings page of &lt;strong&gt;OpenVR-InputEmulator&lt;/strong&gt; in SteamVR.&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2019-02-27_resolving-unknown-errors-when-changing-device-mode-in-openvr-input-emulator%2F6ca4fec6-c259-2b8b-bf10-95138aab7bf0.png" class="article-body-image-wrapper"&gt;&lt;img width="800" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2019-02-27_resolving-unknown-errors-when-changing-device-mode-in-openvr-input-emulator%2F6ca4fec6-c259-2b8b-bf10-95138aab7bf0.png" height="551"&gt;&lt;/a&gt;&lt;br&gt;
Here, when I set &lt;strong&gt;Device Mode&lt;/strong&gt; to &lt;strong&gt;Swap with&lt;/strong&gt; and clicked &lt;strong&gt;Apply&lt;/strong&gt;, the following message appeared:&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2019-02-27_resolving-unknown-errors-when-changing-device-mode-in-openvr-input-emulator%2Fca42ff30-4b19-e23a-ebc6-2d52f687cbc1.png" class="article-body-image-wrapper"&gt;&lt;img width="800" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2019-02-27_resolving-unknown-errors-when-changing-device-mode-in-openvr-input-emulator%2Fca42ff30-4b19-e23a-ebc6-2d52f687cbc1.png" height="551"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set Device Mode
Could not set device mode: Unknown error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Operating Environment
&lt;/h1&gt;

&lt;p&gt;The error occurred under the following conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows 10 64bit&lt;/li&gt;
&lt;li&gt;SteamVR 1.2.10&lt;/li&gt;
&lt;li&gt;OpenVR Input Emulator 1.3&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Investigation
&lt;/h1&gt;

&lt;p&gt;I found a report of the same issue here:&lt;br&gt;
&lt;a href="https://github.com/matzman666/OpenVR-InputEmulator/issues/134" rel="noopener noreferrer"&gt;https://github.com/matzman666/OpenVR-InputEmulator/issues/134&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Following the link leads to this pull request:&lt;br&gt;
&lt;a href="https://github.com/matzman666/OpenVR-InputEmulator/pull/130" rel="noopener noreferrer"&gt;https://github.com/matzman666/OpenVR-InputEmulator/pull/130&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apparently, applying a patch developed by volunteers to SteamVR resolves the issue. Note: This patch seems to be for Windows 10 64bit only.&lt;/p&gt;
&lt;h1&gt;
  
  
  Solution
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Stop SteamVR
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First, stop SteamVR if it's running!&lt;/strong&gt; This is crucial!&lt;/p&gt;
&lt;h2&gt;
  
  
  Apply the Patch to SteamVR
&lt;/h2&gt;

&lt;p&gt;Next, download and unzip &lt;strong&gt;driver_vrinputemulator_release_hopefully.zip&lt;/strong&gt; mentioned in the pull request conversation.&lt;/p&gt;

&lt;p&gt;Inside, there is a folder named &lt;strong&gt;driver_vrinputemulator&lt;/strong&gt;, which should be placed in &lt;code&gt;C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers\driver_vrinputemulator&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: If you have changed the default installation location of SteamVR, adjust the placement accordingly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you have a folder named &lt;code&gt;00vrinputemulator&lt;/code&gt; directly under &lt;code&gt;drivers&lt;/code&gt;, it should be removed. (Ensure to back it up just in case.)&lt;/p&gt;
&lt;h2&gt;
  
  
  Disable Safe Mode
&lt;/h2&gt;

&lt;p&gt;Then, launch SteamVR. An alert appeared for me:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SteamVR in Safe Mode
Due to a recent crash, SteamVR is currently operating in safe mode. In this mode it will only load trusted drivers to avoid compatibility issues.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This indicates SteamVR started in safe mode because of a recent crash and is loading only trusted drivers to avoid issues.&lt;/p&gt;

&lt;p&gt;In this state, the newly placed &lt;strong&gt;driver_vrinputemulator&lt;/strong&gt; may not load correctly. Disable safe mode by clicking &lt;strong&gt;Disable Safe Mode&lt;/strong&gt; in the dialog. This restarts SteamVR.&lt;/p&gt;

&lt;p&gt;That's it for the process!&lt;/p&gt;

&lt;h1&gt;
  
  
  If It's Still Not Working...
&lt;/h1&gt;

&lt;p&gt;It's possible that OpenVR-InputEmulator isn't installed correctly. In my case, keeping SteamVR running while installing OpenVR-InputEmulator caused it not to work properly.&lt;/p&gt;

&lt;p&gt;After uninstalling OpenVR-InputEmulator, restarting my PC, stopping SteamVR, and reinstalling OpenVR-InputEmulator, it worked on my PC.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Thanks to the volunteers who created the patch, I was saved.&lt;/p&gt;

</description>
      <category>vr</category>
      <category>steamvr</category>
      <category>openvr</category>
    </item>
    <item>
      <title>Trace Modeling in VRoid with Transparent Windows</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Wed, 08 Apr 2026 15:17:25 +0000</pubDate>
      <link>https://dev.to/segur/trace-modeling-in-vroid-with-transparent-windows-3ml4</link>
      <guid>https://dev.to/segur/trace-modeling-in-vroid-with-transparent-windows-3ml4</guid>
      <description>&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2Fded01cfa-34ca-1de5-80cb-cb9b4ef50ea5.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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2Fded01cfa-34ca-1de5-80cb-cb9b4ef50ea5.png" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article is the 21st entry for the &lt;a href="https://qiita.com/advent-calendar/2018/vtuber" rel="noopener noreferrer"&gt;VTuber Tech #1 Advent Calendar 2018&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;If you are creating 3D avatars for VTuber or VRChat, you might be using VRoid Studio. I've started learning it myself and found this tutorial helpful: &lt;a href="https://sleepfreaks-dtm.com/movie/category/vroid-studio/" rel="noopener noreferrer"&gt;sleepfreaks Movie Site | How to Use VRoid Studio&lt;/a&gt;. They mention using Fluid Browser for image transparency on Mac, so I looked for a Windows alternative.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is VRoid Studio?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;VRoid Studio&lt;/strong&gt; is a PC application for creating humanoid 3D character models. Even without artistic skill, I can make cute characters with it. It's offered for free by pixiv. Check it out here: &lt;a href="https://vroid.pixiv.net/" rel="noopener noreferrer"&gt;pixiv | VRoid Studio&lt;/a&gt;. For detailed tutorials, this article might be helpful: &lt;a href="https://qiita.com/konightich/items/d76e12eee79a9e0d6043" rel="noopener noreferrer"&gt;Creating Characters with VRoid&lt;/a&gt;. The official site also provides many resources: &lt;a href="https://vroid.pixiv.help/hc/ja/categories/360001168133-VRoid-Studio%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9-%E4%BE%BF%E5%88%A9%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E9%9B%86" rel="noopener noreferrer"&gt;VRoid Studio Tips and Techniques&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Making Windows Transparent
&lt;/h1&gt;

&lt;p&gt;Suppose you want to model a face using reference images. Open a face image in Windows 10's &lt;strong&gt;Photos&lt;/strong&gt; app.&lt;/p&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F3ea5e404-3012-5ee2-78bb-12a1f515a6e5.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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F3ea5e404-3012-5ee2-78bb-12a1f515a6e5.png" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then open &lt;strong&gt;VRoid Studio&lt;/strong&gt; in another window.&lt;/p&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F0b62a20f-e57b-63d7-3c9a-7641ce5c6e14.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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F0b62a20f-e57b-63d7-3c9a-7641ce5c6e14.png" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By setting the transparency of VRoid Studio to 50%, it looks like this:&lt;/p&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2Fded01cfa-34ca-1de5-80cb-cb9b4ef50ea5.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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2Fded01cfa-34ca-1de5-80cb-cb9b4ef50ea5.png" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With layered reference images, you can trace the model, making the task easier, a technique known as &lt;strong&gt;trace modeling&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Using Glass2k for Transparency
&lt;/h1&gt;

&lt;p&gt;There are various ways to create transparent windows, but I'll introduce &lt;strong&gt;Glass2k&lt;/strong&gt;, the only free software I found for Windows 10. On Mac, you could use &lt;strong&gt;Afloat&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Visit the official site: &lt;a href="http://chime.tv/products/glass2k.shtml" rel="noopener noreferrer"&gt;Glass2k : Chime Softwares&lt;/a&gt; (English site). Click &lt;strong&gt;Glass2k - Beta Version 0.9.2: 54 kb&lt;/strong&gt; under the &lt;strong&gt;Download &amp;gt;&amp;gt;&lt;/strong&gt; section to get &lt;strong&gt;Glass2k.exe&lt;/strong&gt;.&lt;/p&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F77cd78b9-6156-434b-d0da-2756fd3987a1.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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F77cd78b9-6156-434b-d0da-2756fd3987a1.png" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since it's an EXE file, run a virus scan to be safe. Double-click &lt;strong&gt;Glass2k.exe&lt;/strong&gt; to open this window:&lt;/p&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2Fb0d11e60-1549-588e-cd6c-6ab568d162ac.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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2Fb0d11e60-1549-588e-cd6c-6ab568d162ac.png" width="403" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ensure &lt;strong&gt;Transparency Popup: Right Click:&lt;/strong&gt; is set to &lt;strong&gt;+ Alt&lt;/strong&gt;, save, and close.&lt;/p&gt;

&lt;p&gt;Launch &lt;strong&gt;VRoid Studio&lt;/strong&gt;. With its window active, press &lt;strong&gt;Alt + right-click&lt;/strong&gt;.&lt;/p&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F7edb5fe8-5017-1341-9c6c-a00586100e93.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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F7edb5fe8-5017-1341-9c6c-a00586100e93.png" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll see this dialog:&lt;/p&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F4aed1c30-ed3f-0abf-52b2-56ff8dbaaf75.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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F4aed1c30-ed3f-0abf-52b2-56ff8dbaaf75.png" width="115" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select a transparency level like 50%, and the &lt;strong&gt;Photos&lt;/strong&gt; app behind becomes visible. You've successfully made the &lt;strong&gt;VRoid Studio&lt;/strong&gt; window transparent!&lt;/p&gt;

&lt;h1&gt;
  
  
  Disabling Window Transparency
&lt;/h1&gt;

&lt;p&gt;To disable, repeat &lt;strong&gt;Alt + right-click&lt;/strong&gt; and select &lt;strong&gt;No Glass-Effect&lt;/strong&gt; from the dialog.&lt;/p&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F4aed1c30-ed3f-0abf-52b2-56ff8dbaaf75.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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2F4aed1c30-ed3f-0abf-52b2-56ff8dbaaf75.png" width="115" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Auto-Starting Glass2k
&lt;/h1&gt;

&lt;p&gt;Closing Glass2k with a PC shutdown requires a startup entry for auto-start on next boot.&lt;/p&gt;

&lt;p&gt;Copy &lt;strong&gt;Glass2k.exe&lt;/strong&gt; to this folder for automatic startup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;After a few tweaks, here’s what I've achieved. I've aligned facial contours and eye positions more closely.&lt;/p&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2Ff11ed7f2-43fb-964c-84cf-168593cd05f6.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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-12-18_trace-modeling-in-vroid-with-transparent-windows%2Ff11ed7f2-43fb-964c-84cf-168593cd05f6.png" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I plan to fine-tune the eye shapes and more.&lt;/p&gt;

&lt;h1&gt;
  
  
  Reference Sites
&lt;/h1&gt;

&lt;p&gt;These sites were helpful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sleepfreaks-dtm.com/movie/category/vroid-studio/" rel="noopener noreferrer"&gt;sleepfreaks Movie Site | How to Use VRoid Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vroid.pixiv.net/" rel="noopener noreferrer"&gt;pixiv | VRoid Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dwDl-9Rafz4" rel="noopener noreferrer"&gt;How To Make Windows 10 Transparent - Enable Transparent windows Xp,7,8,10!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vr</category>
      <category>vtuber</category>
      <category>vroid</category>
    </item>
    <item>
      <title>Four Strategies to Integrate Markdown into a Word-Centric Workplace</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Tue, 07 Apr 2026 15:16:09 +0000</pubDate>
      <link>https://dev.to/segur/four-strategies-to-integrate-markdown-into-a-word-centric-workplace-2h6o</link>
      <guid>https://dev.to/segur/four-strategies-to-integrate-markdown-into-a-word-centric-workplace-2h6o</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;How do you handle documentation at work? If you're a Qiita user, you might frequently use Markdown. At my workplace, the norm was to write documents in Word. Recently, we've switched to using Markdown, and I'd like to share what steps we took in this process.&lt;/p&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%2Fov5butn8x9td6b3d19u5.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%2Fov5butn8x9td6b3d19u5.png" alt="image.png" width="208" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This article does not intend to criticize Microsoft Word or claim Markdown is superior. The workplace described is a software engineering department dealing with technical documents. Please read with this context in mind.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Strategy 1: Taking Meeting Minutes in Markdown
&lt;/h1&gt;

&lt;p&gt;Initially, our workplace didn't have a habit of recording meeting minutes. I started taking notes on my own and distributing them post-meeting, which was well-received, leading me to continue as the meeting scribe. I initially used plain text files but later switched to Markdown. When distributing these notes, I included:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The file extension is .md, but it’s just a text file. You can view it with your preferred text editor. However, if you use a Markdown-compatible editor, it’s easier to read. Feel free to try it.&lt;/p&gt;
&lt;/blockquote&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%2Fbp3c1isxxl3oypcreq3u.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%2Fbp3c1isxxl3oypcreq3u.png" alt="Example with text editor" width="800" height="770"&gt;&lt;/a&gt;&lt;/p&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%2Friccf081obmeyf0mdkzr.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%2Friccf081obmeyf0mdkzr.png" alt="Example with Markdown editor" width="800" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Strategy 2: Creating Allies
&lt;/h1&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%2F2skm2z6px2ve2eptuobq.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%2F2skm2z6px2ve2eptuobq.png" alt="image.png" width="400" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to my efforts with the meeting minutes, a colleague became interested in Markdown. We pledged to promote its usage together. Now, they are even more enthusiastic than I am.&lt;/p&gt;

&lt;h1&gt;
  
  
  Strategy 3: Finding a User-Friendly Editor
&lt;/h1&gt;

&lt;p&gt;Initially, I recommended various extensions for editors like Atom, VSCode, and Eclipse to colleagues. However, they voiced concerns such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Editing and viewing split-screen was cumbersome&lt;/li&gt;
&lt;li&gt;Vertical monitors made viewing difficult&lt;/li&gt;
&lt;li&gt;Styles messed up when exporting to PDF/HTML&lt;/li&gt;
&lt;li&gt;Difficulty remembering syntax for creating tables or inserting images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To solve these issues, we found the perfect editor—&lt;strong&gt;Typora&lt;/strong&gt;. Here's a helpful article about it: &lt;a href="https://qiita.com/AnchorBlues/items/532dba54cd2f0465af97" rel="noopener noreferrer"&gt;Why Doesn't Everyone Use Typora for Markdown Writing?&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When opened in Typora, the Markdown file looks like this:&lt;/p&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%2F5dt24hh8fol1u1j0tm7w.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%2F5dt24hh8fol1u1j0tm7w.png" alt="Example with Typora" width="800" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Strategy 4: Conducting a Markdown Workshop
&lt;/h1&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%2Fc62072wnw0rg0os4esyx.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%2Fc62072wnw0rg0os4esyx.png" alt="image.png" width="450" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After gradually using Markdown for various documents such as README files over a year, all members acknowledged its existence. We conducted a workshop to introduce Markdown. It was well-received with positive comments like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"It's lighter than Word."&lt;/li&gt;
&lt;li&gt;"Useful for PCs without Office installed."&lt;/li&gt;
&lt;li&gt;"We can deliver PDFs to clients after conversion."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The workshop successfully integrated Markdown into our documentation culture. I'm glad we persevered!&lt;/p&gt;

&lt;h1&gt;
  
  
  Bonus
&lt;/h1&gt;

&lt;p&gt;Recently, we adopted &lt;strong&gt;HackMD&lt;/strong&gt;, which allows collaborative editing for meeting notes.&lt;/p&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%2Fi5lvt8tcfr0oytykruuk.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%2Fi5lvt8tcfr0oytykruuk.png" alt="HackMD example" width="800" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's a useful article about HackMD: &lt;a href="https://qiita.com/norinity1103/items/85aa990dbe6582b6d701" rel="noopener noreferrer"&gt;HackMD: A Revolutionary and User-Friendly Markdown Editor&lt;/a&gt;. The colleague who first joined me in promoting Markdown set up the HackMD environment, greatly enhancing our note-taking efficiency.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The goal was to reduce lengthy document creation times in Word, due to manual syntax highlighting, page adjusting, and change logging. Markdown's features like automatic code block coloring, lack of page concepts, and version control with Git made it an appealing alternative. However, for rich document expressions or external documentation, we still use Word and include change logs when necessary.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>markdown</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Customizing a Thumbturn Holder for Qrio Smart Lock</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Mon, 06 Apr 2026 14:55:36 +0000</pubDate>
      <link>https://dev.to/segur/customizing-a-thumbturn-holder-for-qrio-smart-lock-1c29</link>
      <guid>https://dev.to/segur/customizing-a-thumbturn-holder-for-qrio-smart-lock-1c29</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Yearning for a life with auto-locking doors, I bought a smart lock, &lt;strong&gt;Qrio Lock (Q-SL2)&lt;/strong&gt;. It can be purchased &lt;a href="http://amzn.asia/d/9gv7RJR" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Unfortunately, my home's thumbturn (a lock knob on the door's inside) was slightly atypical, and the stock thumbturn holder provided with the Qrio Lock did not fit.&lt;/p&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%2Fe6pgyxp24rtvha8nmjm7.jpeg" 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%2Fe6pgyxp24rtvha8nmjm7.jpeg" alt="Thumbturn.jpg" width="400" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, I decided to craft my own thumbturn holder.&lt;/p&gt;

&lt;h1&gt;
  
  
  Qrio Lock Design
&lt;/h1&gt;

&lt;p&gt;The Qrio Lock features four protrusions on its rotating component, which are intended to fit into the thumbturn holder.&lt;/p&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%2Fpiesgmbk6tlmpbjxashb.jpeg" 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%2Fpiesgmbk6tlmpbjxashb.jpeg" alt="Qrio.jpg" width="400" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Understanding the Thumbturn Holder
&lt;/h1&gt;

&lt;p&gt;First, I examined the mechanics of the included thumbturn holder. Three sizes are provided: S, M, and L. The surface that attaches to the door looks like this:&lt;/p&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%2Fi91wloc6bodt79lp9e79.jpeg" 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%2Fi91wloc6bodt79lp9e79.jpeg" alt="Surface.jpg" width="400" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are gaps to accommodate the lock knob. S has the smallest gap, and L the largest. The reverse side, which attaches to the Qrio Lock, appears as follows:&lt;/p&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%2Fti6njqj9j0xv5zpp5unl.jpeg" 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%2Fti6njqj9j0xv5zpp5unl.jpeg" alt="Reverse.jpg" width="400" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are four holes where the Qrio Lock's protrusions fit. The dimensions are straightforward, suggesting the feasibility of creating a custom thumbturn holder.&lt;/p&gt;

&lt;h1&gt;
  
  
  Creation
&lt;/h1&gt;

&lt;p&gt;Here is the final product! ... Admittedly, not the most stylish.&lt;/p&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%2Faau3cm40zededmgvrft3.jpeg" 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%2Faau3cm40zededmgvrft3.jpeg" alt="Completed Product.jpg" width="270" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The black component is the thumbturn (door knob), with the wood piece serving as the custom holder. Surprisingly, it functions efficiently.&lt;/p&gt;

&lt;h1&gt;
  
  
  Materials
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Wood
&lt;/h2&gt;

&lt;p&gt;I calculated that a 30x30x15mm wood piece was necessary (adjust according to your lock's shape and install location). I found a 60x30x15mm piece at a dollar store, which I halved for use.&lt;/p&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%2Ff0wh8fxccpvslat1lfny.jpeg" 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%2Ff0wh8fxccpvslat1lfny.jpeg" alt="Materials.jpg" width="400" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Zip Ties
&lt;/h2&gt;

&lt;p&gt;To hold the thumbturn securely, a zip tie is used around the wood’s perimeter, easily purchased at dollar stores.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tools
&lt;/h1&gt;

&lt;p&gt;Here's a list of the tools I used:&lt;/p&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%2Fhlg7bkfwupu1wqmhxisw.jpeg" 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%2Fhlg7bkfwupu1wqmhxisw.jpeg" alt="Tools.jpg" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Saw
&lt;/h2&gt;

&lt;p&gt;Used for cutting the wood. A reasonably large saw simplifies the task. In the photo, the saw is rather small, which made the cutting more time-consuming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drill
&lt;/h2&gt;

&lt;p&gt;To create holes for the Qrio Lock’s protrusions. I used a 5mm manual hand drill. It can be purchased &lt;a href="https://www.monotaro.com/p/7581/2834/" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Electric drills are also suitable.&lt;/p&gt;

&lt;h1&gt;
  
  
  Crafting Process
&lt;/h1&gt;

&lt;p&gt;Here's the crafting sequence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cut the wood into two pieces using a saw&lt;/li&gt;
&lt;li&gt;Sandwich the thumbturn between the two wood pieces&lt;/li&gt;
&lt;li&gt;Secure with zip ties&lt;/li&gt;
&lt;li&gt;Drill holes as necessary&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Installation
&lt;/h1&gt;

&lt;p&gt;Sandwich the thumbturn with the wood, secure with zip ties, and insert the Qrio Lock into the pre-drilled holes to complete the installation.&lt;/p&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%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-09-24_customizing-a-thumbturn-holder-for-qrio-smart-lock%2F90ca4a11-0fde-4604-45b1-ebabf6e06ca3.jpeg" class="article-body-image-wrapper"&gt;&lt;img width="400" alt="Installed 2.jpg" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fsegurvita%2Fsegur-article-assets%40main%2F2018-09-24_customizing-a-thumbturn-holder-for-qrio-smart-lock%2F90ca4a11-0fde-4604-45b1-ebabf6e06ca3.jpeg" height="400"&gt;&lt;/a&gt;&lt;/p&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%2Fbrnkj8imhcgq82r52a34.jpeg" 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%2Fbrnkj8imhcgq82r52a34.jpeg" alt="Installed.jpg" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Despite its unattractive appearance, the holder functioned perfectly as intended. I'm pleased to have once again made an IoT-inspired post.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>smarthome</category>
    </item>
    <item>
      <title>Differences Between pScene and lScene in FBX SDK</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Sun, 05 Apr 2026 14:41:11 +0000</pubDate>
      <link>https://dev.to/segur/differences-between-pscene-and-lscene-in-fbx-sdk-3c4j</link>
      <guid>https://dev.to/segur/differences-between-pscene-and-lscene-in-fbx-sdk-3c4j</guid>
      <description>&lt;h1&gt;
  
  
  Differences Between pScene and lScene in FBX SDK
&lt;/h1&gt;

&lt;p&gt;When examining sample code for the FBX SDK, whether in C++ or Python, you often encounter variables named &lt;code&gt;pScene&lt;/code&gt; and &lt;code&gt;lScene&lt;/code&gt;. Both are instances of the &lt;code&gt;FbxScene&lt;/code&gt; class, but the difference between the &lt;code&gt;p&lt;/code&gt; and &lt;code&gt;l&lt;/code&gt; prefixes piqued my interest, so I investigated further.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;pScene&lt;/code&gt; Is an Argument and &lt;code&gt;lScene&lt;/code&gt; Is a Local Variable
&lt;/h1&gt;

&lt;p&gt;The explanation can be found on the following page from the official documentation: &lt;a href="https://help.autodesk.com/view/FBX/2019/ENU/?guid=FBX_Developer_Help_welcome_to_the_fbx_sdk_technical_support_html" rel="noopener noreferrer"&gt;Autodesk FBX / Information and technical support&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Surprisingly, &lt;code&gt;pScene&lt;/code&gt; is an argument while &lt;code&gt;lScene&lt;/code&gt; is a local variable!&lt;/p&gt;

&lt;p&gt;In summary, the prefixes mean the following:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Fbx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prefix for classes provided by FBX SDK&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FbxScene&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prefix for function/method arguments&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pScene&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;l&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prefix for local variables&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lScene&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prefix for global variables&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gScene&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;m&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prefix for member variables of a class&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mScene&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dividing naming so precisely feels quite C++-like.&lt;/p&gt;

&lt;h1&gt;
  
  
  In Conclusion
&lt;/h1&gt;

&lt;p&gt;Understanding this difference clarified a lot for me!&lt;/p&gt;

&lt;p&gt;Incidentally, before investigating, I had mistakenly assumed they were using Systems Hungarian notation. In Systems Hungarian, &lt;code&gt;p&lt;/code&gt; typically indicates a pointer and &lt;code&gt;l&lt;/code&gt; indicates a &lt;code&gt;long&lt;/code&gt; type. I'm glad I took the time to research it!&lt;/p&gt;

</description>
      <category>fbx</category>
      <category>python</category>
      <category>c</category>
      <category>fbxsdk</category>
    </item>
    <item>
      <title>Outputting FBX in ASCII Format Using FBX SDK Python</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Sat, 04 Apr 2026 14:39:48 +0000</pubDate>
      <link>https://dev.to/segur/outputting-fbx-in-ascii-format-using-fbx-sdk-python-4egm</link>
      <guid>https://dev.to/segur/outputting-fbx-in-ascii-format-using-fbx-sdk-python-4egm</guid>
      <description>&lt;h1&gt;
  
  
  Exporting FBX in ASCII Format Instead of Binary
&lt;/h1&gt;

&lt;p&gt;When exporting FBX files using the Python version of the FBX SDK, the default output is in binary format. I wanted to output in ASCII format, so I researched how to do this.&lt;/p&gt;

&lt;p&gt;I have placed the sample project here:&lt;br&gt;
&lt;a href="https://github.com/segurvita/fbx_sdk_python_sample" rel="noopener noreferrer"&gt;https://github.com/segurvita/fbx_sdk_python_sample&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Referenced the Official C++ Sample Code
&lt;/h1&gt;

&lt;p&gt;I found a sample code on the following page of the official C++ documentation for saving scenes in ASCII format:&lt;br&gt;
&lt;a href="https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref__common_2_common_8cxx_example_html" rel="noopener noreferrer"&gt;Autodesk FBX 2017 HELP / C++ API Reference / Examples / Common/Common.cxx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is an excerpt from the relevant C++ code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;lFormatIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lFormatCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetIOPluginRegistry&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;GetWriterFormatCount&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lFormatIndex&lt;/span&gt;&lt;span class="o"&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;lFormatIndex&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;lFormatCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;lFormatIndex&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetIOPluginRegistry&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;WriterIsFBX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lFormatIndex&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;FbxString&lt;/span&gt; &lt;span class="n"&gt;lDesc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetIOPluginRegistry&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;GetWriterFormatDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lFormatIndex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;lASCII&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ascii"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lDesc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lASCII&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;pFileFormat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lFormatIndex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;break&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reading this code suggests that you should specify a format ID representing ASCII when outputting the file. However, it seems this format ID is not defined as a constant and must be searched dynamically. (If anyone knows a more efficient method, please let me know.)&lt;/p&gt;

&lt;h1&gt;
  
  
  Searching for the Format ID
&lt;/h1&gt;

&lt;p&gt;Using the official C++ code as a reference, here is the corresponding Python code.&lt;/p&gt;

&lt;p&gt;The process of searching for the ASCII format ID is encapsulated in the following function:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_ascii_format_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Loop through the number of writable formats
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;formatId&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GetIOPluginRegistry&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nc"&gt;GetWriterFormatCount&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
        &lt;span class="c1"&gt;# Check if it's an FBX format
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GetIOPluginRegistry&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nc"&gt;WriterIsFBX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="c1"&gt;# Check if it's in ASCII format
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ascii&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GetIOPluginRegistry&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nc"&gt;GetWriterFormatDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatId&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="c1"&gt;# Return the format ID
&lt;/span&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;formatId&lt;/span&gt;

    &lt;span class="c1"&gt;# Return auto if the ASCII format is not found
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;    
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should input an instance created with &lt;code&gt;FbxManager.Create()&lt;/code&gt; as the &lt;code&gt;manager&lt;/code&gt; argument. The return value is the format ID for the ASCII format.&lt;/p&gt;

&lt;h1&gt;
  
  
  File Exporting Process
&lt;/h1&gt;

&lt;p&gt;Specify the function from earlier as the second argument in &lt;code&gt;exporter.Initialize()&lt;/code&gt; as shown below:&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="n"&gt;exporter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FbxExporter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&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;exporter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./test.fbx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;get_ascii_format_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;exporter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this, I was able to successfully output the FBX in ASCII format.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;The syntax differs significantly between C++ and Python, such as with loop statements, making the writing process interesting.&lt;/p&gt;

&lt;p&gt;The sample project is placed here:&lt;br&gt;
&lt;a href="https://github.com/segurvita/fbx_sdk_python_sample" rel="noopener noreferrer"&gt;https://github.com/segurvita/fbx_sdk_python_sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additionally, I referred to the following sites while creating this article. Thank you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref__common_2_common_8cxx_example_html" rel="noopener noreferrer"&gt;Autodesk FBX 2017 HELP / C++ API Reference / Examples / Common/Common.cxx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/35549348/how-to-fbx-sdk-export-binary-fbx-file-with-python" rel="noopener noreferrer"&gt;how to fbx sdk export binary fbx file with python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>cpp</category>
      <category>fbx</category>
      <category>fbxsdk</category>
    </item>
    <item>
      <title>Differences Between Python and C++ Versions of the FBX SDK</title>
      <dc:creator>Shoichi Okaniwa</dc:creator>
      <pubDate>Fri, 03 Apr 2026 14:52:26 +0000</pubDate>
      <link>https://dev.to/segur/differences-between-python-and-c-versions-of-the-fbx-sdk-55h2</link>
      <guid>https://dev.to/segur/differences-between-python-and-c-versions-of-the-fbx-sdk-55h2</guid>
      <description>&lt;h1&gt;
  
  
  Differences Between Python and C++ Versions of the FBX SDK
&lt;/h1&gt;

&lt;p&gt;I read this official document and noted down my understanding. &lt;a href="https://help.autodesk.com/view/FBX/2017/ENU/?guid=__files_GUID_363E55D8_6EDB_40F8_8F58_E42F8D525D3D_htm" rel="noopener noreferrer"&gt;Differences between FBX SDK and Python FBX&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Python version includes most of the functions from the C++ version, but the following differences exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template Functions and Template Classes in C++ Are Not Available in Python
&lt;/h2&gt;

&lt;p&gt;Template functions are a C++ syntax, and they look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&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;The &lt;code&gt;T&lt;/code&gt; can accept various types.&lt;/p&gt;

&lt;p&gt;Since Python does not have a template function syntax, it provides separate functions for each type.&lt;/p&gt;

&lt;h2&gt;
  
  
  Array Outputs: Pointers in C++ vs. Lists in Python
&lt;/h2&gt;

&lt;p&gt;When a function outputs data similar to an array, the differences are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In C++, output is handled via pointers.&lt;/li&gt;
&lt;li&gt;In Python, output is handled via lists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, in the C++ version, there is a function called &lt;code&gt;GetPolygonVertices&lt;/code&gt;. (Reference: &lt;a href="https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_class_fbx_mesh_html" rel="noopener noreferrer"&gt;FbxMesh Class Reference&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Here is a function example (contents are illustrative):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;GetPolygonVertices&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="c1"&gt;// Some processing&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;array&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;In the Python version, the equivalent function is:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;GetPolygonVertices&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="c1"&gt;# Some processing
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passing Pointers in C++ Becomes Tuples in Python
&lt;/h2&gt;

&lt;p&gt;In cases where a function outputs multiple values, the differences are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C++ outputs to arguments passed by pointer.&lt;/li&gt;
&lt;li&gt;Python outputs as a tuple (multiple return values).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, in the C++ version, there is a function called &lt;code&gt;KeyAdd&lt;/code&gt;. (Reference: &lt;a href="https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_class_fbx_anim_curve_html" rel="noopener noreferrer"&gt;FbxAnimCurve Class Reference&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Here's an example (contents are illustrative):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;KeyAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KTime&lt;/span&gt; &lt;span class="n"&gt;pTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pLast&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="c1"&gt;// Some processing&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;index&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;The function outputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;index&lt;/code&gt;: return value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pLast&lt;/code&gt;: argument passed by pointer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the Python version, the function becomes:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;KeyAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KTime&lt;/span&gt; &lt;span class="n"&gt;pTime&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Some processing
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pLast&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first return value is &lt;code&gt;index&lt;/code&gt;, and the second is &lt;code&gt;pLast&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;It's interesting to compare the differences in syntax between C++ and Python.&lt;/p&gt;

</description>
      <category>python</category>
      <category>cpp</category>
      <category>fbx</category>
      <category>fbxsdk</category>
    </item>
  </channel>
</rss>
