<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Yet Another Boring Development Blog]]></title><description><![CDATA[Life experiences, rants about tech, and other cliche happenings.]]></description><link>https://blog.colind.me/</link><image><url>https://blog.colind.me/favicon.png</url><title>Yet Another Boring Development Blog</title><link>https://blog.colind.me/</link></image><generator>Ghost 5.33</generator><lastBuildDate>Tue, 07 Apr 2026 20:00:50 GMT</lastBuildDate><atom:link href="https://blog.colind.me/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Adding Basic Japanese Visemes to Avatars for VRChat]]></title><description><![CDATA[<p>A lot of avatar bases are sold primarily to English speaking audiences, and may not support Japanese visemes for natural things like speech using the JA locale, or worlds that rely on these blendshapes to animate your character for you (such as MMD worlds.)</p><!--kg-card-begin: markdown--><h2 id="gettingstartedwhatyouwillneed">Getting Started: What You Will Need</h2>]]></description><link>https://blog.colind.me/adding-japanese-visemes-to-avatars-for-vrchat/</link><guid isPermaLink="false">62928bdf24f5d00001a04ed6</guid><dc:creator><![CDATA[Colin]]></dc:creator><pubDate>Sat, 28 May 2022 22:15:03 GMT</pubDate><content:encoded><![CDATA[<p>A lot of avatar bases are sold primarily to English speaking audiences, and may not support Japanese visemes for natural things like speech using the JA locale, or worlds that rely on these blendshapes to animate your character for you (such as MMD worlds.)</p><!--kg-card-begin: markdown--><h2 id="gettingstartedwhatyouwillneed">Getting Started: What You Will Need</h2>
<ul>
<li>A fully rigged 3D model or premade avatar base ready for VRChat</li>
<li>Blender 2.93</li>
<li><a href="https://github.com/absolute-quantum/cats-blender-plugin/releases">CATS plugin for Blender</a></li>
<li><a href="https://github.com/rurre/PumkinsAvatarTools">PumkinsAvatarTools for Unity</a></li>
<li>The proper version of Unity for your avatar/VRChat</li>
<li>Roughly 30 minutes</li>
</ul>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: markdown--><h2 id="whyblender293">Why Blender 2.93?</h2>
<p>Blender version 2.93 is a LTS release of Blender that still uses Python 3.9 which does not contain some regression bugs that break CATS&apos;s FBX exporting tools. If you downloaded Blender via Steam, you can right click on it in your Game Library and select <code>Properties</code> and then <code>Betas</code>. From here you can specify which release to use (<code>2.93 - Stable - LTS</code>)</p>
<p>If you have a different version that you know works with CATS&apos;s FBX exporting tooling, feel free to use that instead. I&apos;m not a cop.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="installingtheplugins">Installing the Plugins</h2>
<h3 id="cats">CATS</h3>
<p>Open Blender and navigate to the <code>Edit</code> menu, and then click <code>Preferences</code>. Once your preferences window opens, navigate to <code>Add-ons</code> and click <code>Install</code>. Point Blender to your downloaded <code>.zip</code> file. Once installed, ensure that CATS is enabled. It should pop up on the right hand menu of the default scene view (with the cube.) If it doesn&apos;t appear, look for an arrow to click to expand it.</p>
<h3 id="pumkinsavatartools">PumkinsAvatarTools</h3>
<p>Download the <code>.unitypackage</code> and import it into your project. You&apos;re done! If you have an older copy from before PhysBones, you&apos;ll probably want to update it.</p>
<!--kg-card-end: markdown--><hr><h2 id="editing-the-model">Editing the Model</h2><p>Once you&apos;ve got your environment set up, you&apos;re ready to begin. Import your model&apos;s mesh (probably in the form of an <code>.fbx</code> file) into Blender. If it&apos;s an FBX, it will look something like <code>File &gt; Import &gt; FBX</code>. You can delete the default cube, light, and camera.<br>You&apos;ll need to navigate through the <strong>Armature </strong>(located at the top right of the default view), and into the <strong>Body </strong>in order to expose the <strong>Object Data Properties</strong> menu (the green upside-down triangle.) Once you&apos;re there, expand the <strong>Shape Keys</strong>.</p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://blog.colind.me/content/images/2023/02/1.png" class="kg-image" alt loading="lazy" width="1920" height="1040" srcset="https://blog.colind.me/content/images/size/w600/2023/02/1.png 600w, https://blog.colind.me/content/images/size/w1000/2023/02/1.png 1000w, https://blog.colind.me/content/images/size/w1600/2023/02/1.png 1600w, https://blog.colind.me/content/images/2023/02/1.png 1920w"><figcaption>An imported model and its <strong>Shape Keys</strong></figcaption></figure><p>All of your <strong>Shape Keys</strong> should have their value set to <code>0</code> before proceeding. If you&apos;re familiar with <strong>Blend Shapes</strong>, we&apos;re duplicating the standard vowel <strong>Blend Shapes</strong> into new ones that the game can recognize. Select the <strong>Shape Key</strong> you wish to duplicate and set the value to <code>1</code> so that it&apos;s &quot;on&quot;. Once you&apos;ve done that, click the downward arrow below the minus button. This will open a menu where you can select <code>New Shape from Mix</code>. Refer to the following table for a list of what to duplicate, and what to name them. <u>Remember! Once you make a new <strong>Shape Key</strong>, ensure you set the values back to <code>0</code>!</u></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.colind.me/content/images/2023/02/3-1.png" class="kg-image" alt loading="lazy" width="355" height="537"><figcaption>As someone who doesn&apos;t regularly use Blender, finding the <strong>New Shape from Mix</strong> button took a little more time than I would have liked, so I&apos;m including it here as well.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.colind.me/content/images/2023/02/2.png" class="kg-image" alt loading="lazy" width="761" height="546" srcset="https://blog.colind.me/content/images/size/w600/2023/02/2.png 600w, https://blog.colind.me/content/images/2023/02/2.png 761w" sizes="(min-width: 720px) 720px"><figcaption>Setting the weight of a <strong>Shape Key</strong> to 1</figcaption></figure><hr><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Shape Key to Duplicate</th>
<th>New Name</th>
</tr>
</thead>
<tbody>
<tr>
<td>vrc.v_aa</td>
<td>&#x3042;</td>
</tr>
<tr>
<td>vrc.v_ih</td>
<td>&#x3048;</td>
</tr>
<tr>
<td>vrc.v_oh</td>
<td>&#x304A;</td>
</tr>
<tr>
<td>vrc.v_ou</td>
<td>&#x3046;</td>
</tr>
<tr>
<td>vrc.v_nn</td>
<td>&#x3093;</td>
</tr>
<tr>
<td>vrc.v_ee (optional)</td>
<td>&#x3044;</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>You may have noticed that this is not nearly all of the visemes that are available. We&apos;re being lazy in this because the Japanese language mostly follows the <strong>Consonant, Vowel</strong> pattern for its letters. Why put in <code>ra ri re ro rou</code> when <code>a i e o ou</code> works the same? I&apos;m sure there&apos;s a good reason to, I just don&apos;t know enough to tell you with confidence in a random blog post.</p><h2 id="exporting">Exporting</h2><p>CATS makes exporting easy. Just expand the CATS menu, click &quot;Export Model&quot; (if it complains about material slots, just click &quot;Continue to Export&quot;), and save it somewhere. That&apos;s it! You&apos;re done!</p><h2 id="unity-applying-your-new-mesh">Unity &#x2013; Applying Your New Mesh</h2><p>If you&apos;re feeling cozy with your model, you can just drag in the new Mesh to your project and set it up as normal.<br><br>For those of us who aren&apos;t super comfy, there&apos;s PumkinsAvatarTools. <br>The first step is to show the PumkinsAvatarTools menu which can be done by clicking <code>Pumkin</code> up at the top bar, <code>Tools</code>, and then <code>Avatar Tools</code>. Go ahead and dock this where it&apos;s comfy for you. Drag in your new mesh into the world, and then into where it says &quot;Avatar&quot; in Pumkin&apos;s Tools. Expand the &quot;Copy Components&quot; accordion, and drag your working avatar (the one that&apos;s using your old mesh, the one without the new visemes) into the <strong>Copy From</strong> field.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.colind.me/content/images/2023/02/4.png" class="kg-image" alt loading="lazy" width="543" height="670"><figcaption>Pumkin&apos;s Avatar Tools</figcaption></figure><p>It&apos;s up to your discretion to make sure that everything transfers over properly. I&apos;ve personally had problems where it&apos;s added a duplicate FX layer to the avatar, but it&apos;s a simple fix. Make sure that you hit &quot;Select All&quot; (or whatever&apos;s appropriate) and that if you have complex PhysBones interactions that you ensure that that transfers properly. Once your avatar is back up and running and ready to go with your new mesh, congratulations! You&apos;re all set to test in an MMD world. If It worked, you&apos;re all set :)</p>]]></content:encoded></item><item><title><![CDATA[My Server]]></title><description><![CDATA[<p>On November 3, 2019, at about 11:34PM, I did something difficult that by &#xA0;all accounts should have been easy. I shut down a server one last time. &#xA0;It&apos;s uptime was over 2 years strong, and had been in service for over &#xA0;4. It didn&</p>]]></description><link>https://blog.colind.me/my-server/</link><guid isPermaLink="false">5dc0c8e1d992dd00019de71a</guid><category><![CDATA[personal experiences]]></category><dc:creator><![CDATA[Colin]]></dc:creator><pubDate>Tue, 05 Nov 2019 01:13:32 GMT</pubDate><content:encoded><![CDATA[<p>On November 3, 2019, at about 11:34PM, I did something difficult that by &#xA0;all accounts should have been easy. I shut down a server one last time. &#xA0;It&apos;s uptime was over 2 years strong, and had been in service for over &#xA0;4. It didn&apos;t have a name.</p><p>It&apos;s tradition with ships to give them a &#xA0;name. Usually it&apos;s something poetic or meaningful. The Nora II was the &#xA0;name of a childhood friend&apos;s dad&apos;s boat. When I asked him about it, he &#xA0;just shrugged and said that he had named her after his wife. Something &#xA0;poetic, so that he could be with his wife even when he was out at sea. I &#xA0;imagine with servers, though not exactly seafaring, there is a similar &#xA0;sentiment.</p><p>My friend Eric named his server NACL, to go with his &#xA0;elements naming scheme. He hosts projects and gaming servers on there. &#xA0;Something poetic, where the server is the salt it provides.</p><p>My &#xA0;current server hosting this document is named Driftmetal, after Astral &#xA0;Driftmetal from Dungeons and Dragons lore. Astral Driftmetal is said to &#xA0;be completely effective against incorporeal attacks. Something poetic, &#xA0;to represent its hardened nature.</p><p>This server did not have a &#xA0;name. It&apos;s hostname was the site it was serving at the time, and I &#xA0;always referred to it as just &quot;my server&quot;. Because that&apos;s what it was. My server.</p><p>It was the first time that I had set one up myself. &#xA0;Initially I was using some random free web hosting. You would connect &#xA0;via ftp and upload your document, after a five minute delay your site &#xA0;was live. Eric found out about this and let me borrow some space on his &#xA0;server. He did it as payment for a joke article about why cake is better &#xA0;than pie, but I&apos;m pretty sure the real reason was that he felt sorry &#xA0;for me. </p><p>It wasn&apos;t long until I was hosting my content on a Shared &#xA0;Hosting plan from Cloud9. It was something simple, and exactly what I &#xA0;needed at the time to start my journey proper into web development. They &#xA0;were great to host with, as long as I only needed cPanel and &#xA0;phpMyAdmin. The customer service was always quick and friendly, and they &#xA0;gave me access to set up my own MySQL databases. I later &#xA0;found out that this was a paid feature that they had just tacked onto &#xA0;my account for free, because I had asked nicely. </p><p>But I wanted more. </p><p>I &#xA0;thought it would be impressive if I set up my own server from the &#xA0;ground up, and that it would be an excellent learning opportunity. So I did. </p><p>It started its service without fanfare. I signed up for a VPS &#xA0;with a whopping 25gb storage and 1gb ram, sporting 1 virtual core cpu in some random datacenter in New York. I didn&apos;t christen it with a name; &#xA0;after all it was my server. I set up nginx (at the time, not realizing &#xA0;the benefits over Apache, I just didn&apos;t want to use Apache again...) and &#xA0;moved all my content over. And so began its work.</p><p>It hosted my &#xA0;website through several iterations, my stupid projects like tracking &#xA0;where I was at any given point in time on a map (yeah, who thought this was a good idea? Oh...) or an icecast for hosting D&amp;D, hosting files I wanted to send to friends, compiling &#xA0;C++ code for school projects and assignments, chat servers, my &#xA0;mail and my calendars... Hell, it even hosted a self encrypting diary at &#xA0;one point. There was no sense of segregation. There was no sense of set purpose. After all, it was my server.</p><p>Time progressed and I &#xA0;started needing more than that 1GB/1 core beast. I moved across the country, and location started impacting latency. Not by much, mind you, but having a server that&apos;s 3,000 miles away won&apos;t do. The song and dance started &#xA0;again, and a fancy new server named Driftmetal in San Francisco would be &#xA0;my workhorse. Services were slowly moved from NY to SF, until &#xA0;eventually only one remained. Yesterday that service was &#xA0;transferred away from me, and the NY server sat, for the first time in &#xA0;four years, idle. </p><p>It was finally time to take a rest.</p><p>I poked &#xA0;around the contents of the filesystem one last time. I found old &#xA0;projects, emails, notes to myself about how to update certificates and what commands to use to start what services. There was a program to find &#xA0;the greatest common denominator in a file &quot;assignment3.cpp&quot; in a random &#xA0;directory where it most certainly shouldn&apos;t have been. I found the first iteration of my website, where I introduced myself and was still a bright-eyed not-yet-clinically-depressed high schooler who was ready to compose video game music and work for a game company, or make websites for people. Projects I made in classes when I should have been paying &#xA0;attention. Files I remember writing in Latin class, outside the band &#xA0;room, and in English class... My server was a time capsule, containing memories of slacking off and doing the things I loved doing in places I shouldn&apos;t have been doing them. </p><p>It&apos;s kind of spooky looking into your past. A lot changes in ten years. I had wondered what I was going to do, what kind of &#xA0;jobs I would have &#x2013; I had no idea then that I would write contracts and develop websites for other businesses on freelance, or &#xA0;that I would be hired somewhere far away for my programming skills, or that I would become an experienced service technician, or that I could even sustain myself &#xA0;financially by making websites. Little Colin, trying to make some text &#xA0;scroll in an element it shouldn&apos;t while not listening about Robert Frost, had no idea.</p><p>I got a lot from that low-powered virtual machine. Depending on your worldview, it&apos;s either comforting or concerning that somewhere, deep in a world of server racks, sits who we were and who we dreamed we&apos;d be.</p><p>I never gave it a name, and it may seem silly to write an retrospective for a QEMU instance, but it was important to me and I&apos;m glad that it gave me the opportunities that it did.</p><p>Wherever those 1&apos;s and 0&apos;s are now... Thank you, take a rest &#x2013; You&apos;ve more than earned it.</p>]]></content:encoded></item><item><title><![CDATA[Pretty Good Privacy]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h4 id="aquicklookintotheworldofpgp"><em>A quick look into the world of PGP</em></h4>
<hr>
<h2 id="publickeys">Public Keys</h2>
<p>You can think of public keys like a jewellery box with an automatic lock that you can share with your friends. You give your friends this box and, after confirming with you and only you that you are the owner</p>]]></description><link>https://blog.colind.me/pretty-good-privacy/</link><guid isPermaLink="false">5c50ecd4097bb10001db4e5f</guid><category><![CDATA[security]]></category><category><![CDATA[quick explanation]]></category><dc:creator><![CDATA[Colin]]></dc:creator><pubDate>Fri, 21 Oct 2016 12:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1531417666976-ed2bdbeb043b?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h4 id="aquicklookintotheworldofpgp"><em>A quick look into the world of PGP</em></h4>
<hr>
<h2 id="publickeys">Public Keys</h2>
<img src="https://images.unsplash.com/photo-1531417666976-ed2bdbeb043b?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Pretty Good Privacy"><p>You can think of public keys like a jewellery box with an automatic lock that you can share with your friends. You give your friends this box and, after confirming with you and only you that you are the owner of that box, they begin to put things in it. This is basically what is happening with PGP encryption. Your public key is the key you give out to everyone. People encrypt files using your public key (placing files in the box), and send you those encrypted files. Once they encrypt the files using your public key (closing the lid on the box), only the person with the associated private key can decrypt that file, or open the box. You can upload your keys to a public &quot;keyserver&quot; which will allow others to &quot;sign&quot; and verify the integrity of your key.</p>
<h2 id="privatekeys">Private Keys</h2>
<p>Private keys go hand in hand with public keys. For every public key, there is at least one associated private key. Never hand out your private key. Ever. To anyone. Your private key is yours and yours alone as it is associated with your person and your person only. When you create your public key, your private key is generated. You should keep this file in a safe place, away from any online sources. Make backups of your private key on flash drives and/or compact disks. A common practice is to print out a QR code of your private key, however this is unadvised due to the legal technicalities that can ensue resulting in the seizure or spread of your private key. If your private key is compromised in any way, you may generate a revocation certificate that, when uploaded to a keyserver, will inform any user attempting to encrypt using your public key that your key is no longer secure. Only your private key can generate this certificate.</p>
<h2 id="history">History</h2>
<p>PGP actually had kind of a dark past. It was essentially born when Zimmermann discovered that most people had all their files out in the open - it wasn&apos;t safe. There was no real way of knowing if who you were talking to was really that person. In 1991 he created a system that did just that. Thus we have &quot;Pretty Good Privacy&quot;, a method of encryption that&apos;s based mostly on trust and backed by reliability. It worked off of an algorithm he had designed himself, &quot;BassOmatic&quot;, and each non-commercial copy of PGP shipped with a complete copy of the source code.</p>
<p>Everything was going well for a while. PGP left the US borders, gaining worldwide popularity - which was a problem. Cryptography was (and still is) a grey area in US law, and having a key that was larger than 40 bits was considered illegal by the United States. PGP uses keys that are larger than 128 bits. Zimmermann was put on trial for &quot;munitions export without a license&quot;. Munitions being defined as guns, explosives, other weapons, and software. After years of trials, the case was finally closed with no charges.</p>
<p>Funny enough, Zimmermann thought of a way around getting charged with violating anything &quot;munitions&quot; again by publishing the source code. For $60 you can buy the source to PGP in a hardcover book, shipped anywhere around the world. This made his work protected under the United State&apos;s first amendment.</p>
<h2 id="usesandpracticality">Uses and Practicality</h2>
<p>There are many uses for PGP. Whether you just want to ensure your safety amongst friends and family, or if you&apos;re hiding yourself from third parties peeking over your shoulder, PGP is a good way to keep yourself safe. Some very common mediums for PGP include emails, instant messaging, message boards, and even pen and paper! No matter how you&apos;re sharing, you can have peace of mind that what you&apos;re making is only going to be seen by you and its intended recipient.</p>
<p>With the use of GUI applications such as Cryptophane (for Windows), PGP has become easier than ever to use. It&apos;s as simple as selecting the name of the person, and typing in your message. Many popular mail applications, such as Mozilla Thunderbird and Flipdog&apos;s MailDroid will automatically use your keys to protect your messages from being intercepted.<br>
<img src="https://blog.colind.me/content/images/2019/01/cryptophane.png" alt="Pretty Good Privacy" loading="lazy"></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[It's Summer, So Don't Forget That SPF!]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Summer, the slow season for many administrative offices, leaves little to do for the general tech-support employees. Some might argue that we&apos;re really working at all. Now, when I say this, I don&apos;t mean it as an across the board comment. Of course there are many</p>]]></description><link>https://blog.colind.me/its-summer-so-dont-forget-that-spf/</link><guid isPermaLink="false">5c50e72b097bb10001db4e57</guid><category><![CDATA[web]]></category><category><![CDATA[dns]]></category><category><![CDATA[security]]></category><dc:creator><![CDATA[Colin]]></dc:creator><pubDate>Sat, 22 Aug 2015 16:23:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1462045504115-6c1d931f07d1?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1462045504115-6c1d931f07d1?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" alt="It&apos;s Summer, So Don&apos;t Forget That SPF!"><p>Summer, the slow season for many administrative offices, leaves little to do for the general tech-support employees. Some might argue that we&apos;re really working at all. Now, when I say this, I don&apos;t mean it as an across the board comment. Of course there are many IT professionals working their asses off as you read this, making sure that everything works smoothly the first time. Though for me personally, summer means waiting for the next user error to pop up in our ticket feed. Exciting, right?</p>
<p>It being so slow I started to really think about what I had done with my professional career and how it could be expanded upon. Trying out the whole system admin thing has been fun, but it&apos;s not like I really have much to monitor. With that in mind, I started reading about other admins, which lead to reading about other systems, which lead to reading about Google, which lead to reading about security, which lead to reading about how we don&apos;t really have all that much control over what we use on a daily basis. It suddenly clicked why so many corporations use in-house services instead of just pre-setup services like Gmail and Comcast mail.</p>
<p>The thing is, we don&apos;t have control over what we use. We don&apos;t own our email. If someone acquires your email password and reads your mail, you&apos;re not protected under the federal law that says it&apos;s a felony to open others mail without express permission. If you house your email in-house and someone hacks in, you can still legally protect yourself because hacking into an unauthorized system is itself illegal. (Disclaimer- I am not a lawyer, take everything I say with three grains of salt)</p>
<p>This whole time I&apos;ve been using other people&apos;s systems. These were free services, such as Gmail and cpanel (which, to be fair, was forced unto me by my old server hoster, which I no longer use (we good!)). I figured, if I encrypted my emails using PGP that that would be enough. What if, though, they got hacked?</p>
<p>Don&apos;t get me wrong, there&apos;s no one I trust more to keep my data safe than Google. A company that big could not afford to get hacked, because they&apos;re seen as the giant in the industry, the biggest. They could make companies disappear overnight if they wanted to, and I&apos;m convinced that the only reason they&apos;re not evil is because they&apos;re already making so much money. But what if they did? What if Google was compromised and my data leaked and placed out on the web like you see with minecraft accounts every other week? What could I do about that?</p>
<p>Nothing.</p>
<p>I&apos;m not trying to say that free email accounts are insecure and you shouldn&apos;t use them. Am I going to stop using my three gmail accounts? No. No I am not. I love my gmail accounts and they are my babies. What I&apos;m saying is, maybe it wouldn&apos;t be too bad to have my own mail server. One I set up and have complete control over.</p>
<p>So with the help of a few reference here and there, and a lot of help from my good friend Eric, I set out to do what many have so fervently claimed to be &quot;the worst part.&quot; And you know what? It wasn&apos;t so bad. Eric explained to me that you can&apos;t just set up a server and call it a day. In fact, he got on my ass about my SPF records on my other domains &#x2013; to which I asked &#x2013; &quot;SPF, like the sunscreen?&quot;</p>
<p>This is the part of the post where I take a step back and say that without my friends I would be nowhere. Eric has taught me so much about numerous different fields of computers. He got me into researching PGP, secure web development, preventing SQL injection, in-house solutions which lead me to researching more and eventually contributing to FOSS - he really is one intelligent guy and if you have a minute go check out his stuff.</p>
<p>To my understanding, there are four parts of having a secure mail server in terms of not becoming susceptible to spam, and to my surprise they all have to do with DNS. You have your <code>SPF</code>, your <code>DKIM</code>, and your <code>DMARC</code>; all of these are <code>TXT</code> records in your zone file. Then you have your <code>MX</code> record, which just lists the mail server address on the domain. Still with me? Good, let&apos;s break it down some more.</p>
<h2 id="mx">MX</h2>
<p>If I send an email to &quot;<a href="mailto:colin@colind.me">colin@colind.me</a>&quot;, my mail server will reach out and look at the DNS records for colind.me. From there it will check the <em>Mail Exchange</em> (MX) record to see where exactly it should be sending the mail. In my case, the MX record was just <code>colind.me. 1800 IN MX 10 mail.colind.me.</code>, and was definitely the easiest and fastest part of the setup. Breaking that down further, it&apos;s the domain, the <code>TTL</code> is 30 minutes (1800 seconds), and the MX is located at mail.colind.me with the priority of 10.</p>
<h2 id="spf">SPF</h2>
<p>The <em>Sender Policy Framework</em> record is there to specify who can send mail from that domain. The best policy if you only have one domain is probably <code>&quot;v=spf1 mx -all&quot;</code>. <code>v=spf1</code> just means it&apos;s declaring the TXT record as an SPF record. <code>mx</code> is taking the place of a server &#x2013; it&apos;s saying that only the MX record holders can send out mail. Alternatively, you can declare a server using <code>ipv4:40.50.60.70</code> replacing the IP with your own server address, of course. <code>ipv6:</code> also works here. The <code>-all</code> just means that no one else can send mail from this domain.</p>
<h2 id="dkim">DKIM</h2>
<p><em>DomainKeys Identified Mail</em> are how your recipients know that what you&apos;re sending them is legitimate. The DKIM record is there to provide authenticity and verification that the mail being sent out is actually from you. Your outgoing mail is signed using keys that are also placed in your DNS via a TXT record. They look something like <code>mail._domainkey.colind.me 1800 IN TXT &quot;v=DKIM1; k=rsa; p=reallylongkey&quot;</code> in your zone file. It&apos;s similar to how PGP works; mail gets signed, dns checks it &#x2013; if it passes, it says so in the header, if it fails, it says <code>dkim=failed</code> in the header. This is important, but it doesn&apos;t really do anything without probably the most important record...</p>
<h2 id="dmarc">DMARC</h2>
<p>Setting up DMARC (<em>Domain Message Authentication Reporting &amp; Conformance</em>) was the part that gave me the most trouble solely because of lack of extensive documentation and full examples. I recommend using a <a href="https://www.unlocktheinbox.com/dmarcwizard/">DMARC generator</a> instead of writing one yourself. DMARC tells your mail client what to do with the email if it has failed the previous checks. It absolutely needs SPF and DKIM set in order to work. If you have your DMARC policy (<code>p</code>) set to <code>quarantine</code> (for a total of <code>p=quarantine</code>), then your receiver is going to put that forged message into their Spam folder. I think that <a href="https://dmarc.org">dmarc.org</a> explains it easily in their overview flowmap. Using DMARC, you can have reports sent to you, the postmaster, using <code>rua=mailto:</code>. The difference between <code>rua</code> and <code>ruf</code> (both standard switches) is that rua is reporting uri aggregates and ruf is reporting aggregate forensics. What confused me the most about DMARC though is the name. In the end, I ended up getting it to work by setting it to <code>_dmarc.colind.me. IN TXT ...</code> - it&apos;s seriously easier and faster to use a generator for this one.</p>
<p>By now I&apos;ve explained what everything does and how it works as far as setting up the DNS end of the mail server. As far as the software went, I used postfix to host the actual mail server itself, and dovecot is working with it to actually integrate with mail clients such as Thunderbird and Outlook etc. Postfix itself is working with linux&apos;s accounts (<code>/etc/passwd</code>) to provide an inbox to every user that hosts an account on that machine - in my case, my server. In addition to this, it uses the machine&apos;s aliases (<code>/etc/aliases</code>) to set up &quot;fake&quot; email addresses that will get forwarded to another address. For example, one of the required addresses is &quot;postmaster&quot;, which will get forwarded to &quot;root&quot; by default. I don&apos;t have a postmaster account on the server, and it&apos;s bad practice to use the root email. What you do in this case is forward your root email to you. So at the end of the day your server&apos;s aliases might end up looking like mine and having:</p>
<pre><code>postmaster:root
root:colin
</code></pre>
<p>Adding aliases is as easy as editing this file and running sudo newaliases. Dovecot on the other hand was a little bit more of a headache for me, which is odd because it&apos;s supposedly the other way around. The lesson I learned that way is that sometimes you shouldn&apos;t copy the documentation word for word. Every system is different and should be configured to work best with that setup.</p>
<p>After I added in all the proper elements - email was finally working. I could send it, but my test emails still weren&apos;t being recieved. Something wasn&apos;t right. I was wondering what it was until I finally gave up and asked for help. Glitch (again, see how helpful he is?) said it might have something to do with the fact that I&apos;m not being fully authenticated. Lo-and-behold, I wasn&apos;t being marked as an &quot;authenticated&quot; sender. This was patched up with an SSL certificate, which was probably the easiest part to install. All that needed to be done was to change the reference in the dovecot and postfix config files and restart the services with <code>sudo service postfix reload &amp;&amp; service dovecot reload</code>. With that, everything was working.</p>
<hr>
<p><em>Update 1/29/2019:</em></p>
<p>I still recommend that everyone at least try to set up a mail server at least once. It&apos;s a really informative process that takes a lot of the mystery out of how email works. However, if it&apos;s an email address you plan to be using for important contacts, bills, or any other kind of communique that requires consistency, I recommend having either a dedicated server with a failover policy for it, or entrusting the hosting and setup to a third party with a fleshed-out contract and a plan in place for if the worst occurs.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[VTHacks: 2014]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>After a twelve hour drive, we finally made it to Virginia Tech. The way up was riddled with chats about what hack we were going to do and how we would incorporate what technologies into it.</p>
<p>My teammate and I decided to make an Android app while we were there.</p>]]></description><link>https://blog.colind.me/vthacks-2014/</link><guid isPermaLink="false">5c50e54b097bb10001db4e53</guid><category><![CDATA[hackathon]]></category><category><![CDATA[personal experiences]]></category><dc:creator><![CDATA[Colin]]></dc:creator><pubDate>Tue, 22 Apr 2014 13:53:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>After a twelve hour drive, we finally made it to Virginia Tech. The way up was riddled with chats about what hack we were going to do and how we would incorporate what technologies into it.</p>
<p>My teammate and I decided to make an Android app while we were there. It would be weather-based, and it would be a small daily tool. Thus the idea for Weather Squid was born.</p>
<p><img src="https://blog.colind.me/content/images/2019/01/Blr6R6zIQAEgBHD.jpg" alt="Wendell the Weather Squid" loading="lazy"></p>
<p>When we actually got to Virginia Tech, there was a lot of issues with the Wifi which halted our development process by a full two hours. They promised that we would have gigabit wifi and would be among &quot;600+ hackers&quot;, neither of which was the case. I&apos;d wager that there was a maximum of 200 people (that&apos;s me being generous with numbers, there) in that room with us. That&apos;s counting the people that left, too.</p>
<p>In the end, the award ceremony consisted of a team that made a product called &quot;LockBox&quot; that won literally every award. Oh, and two middle-school students got a pat on the back for &quot;never giving up once during the entire hackathon&quot;. They weren&apos;t even allowed to be there because high school students were allowed on a case-by-case with special exceptions... A lot of us were perplexed and/or disappointed. We had seen them playing LoL, and a lot of us worked non-stop, with out only breaks being short and to keep our sanity or while our code was compiling.</p>
<p>Overall the experience was enjoyable and I would consider going back again. Plus I got to see one of my good friends again. I like going to hackathons. They&apos;re tons of fun.</p>
<p>Information about WeatherSquid will be posted, and we plan to move forward with the development process. Just... maybe after a little break from programming for 36 hours straight.</p>
<p>Update:<br>
We never did move forward with development, and the team eventually drifted our separate ways. Unfortunately, this means the end of Weather Squid.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Hack FSU: 2014]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I had never been to a &quot;hackathon&quot;, so I didn&apos;t really know what to expect. To say the least, I was surprised at how well put together it was and how much fun the event as a whole was. It was my first hackathon, and it</p>]]></description><link>https://blog.colind.me/hack-fsu-2014/</link><guid isPermaLink="false">5c50e47e097bb10001db4e4d</guid><category><![CDATA[hackathon]]></category><category><![CDATA[personal experiences]]></category><dc:creator><![CDATA[Colin]]></dc:creator><pubDate>Fri, 11 Apr 2014 08:03:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I had never been to a &quot;hackathon&quot;, so I didn&apos;t really know what to expect. To say the least, I was surprised at how well put together it was and how much fun the event as a whole was. It was my first hackathon, and it definitely won&apos;t be my last.</p>
<p>When I walked into the Dirac Science Library to participate, there was an Oculus Rift dev-kit and a 3D printer just chilling there. I mean, come on - I could hardly contain my excitement. Almost immediately I was approached by a man I would later come to know as Yuhui, and was asked if I was interested in joining their team. Him, Eric, and Neely helped me have one of the most intense and unforgettable nights of my life.</p>
<p>In just twenty-four hours, we came together and pooled our resources to make a working prototype of a website called Learn In Groups, a social media for studying. We joked and worked together, and we made a presentable product in just a day. It was amazing.</p>
<p>I hope to continue development on this site with the rest of the team, as I&apos;m sure it can turn into something big with all the love that we&apos;ve put into it. We can do it - we&apos;ve come this far, so what&apos;s stopping us?</p>
<p>It was my first time at a hackathon, specifically at Hack FSU, but it certainly won&apos;t be my last. I think I found my new favourite social thing to do.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>