Help
RSS
API
Feed
Maltego
Contact
Domain > darkain.com
×
Welcome!
Right click nodes and scroll the mouse to navigate the graph.
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2012-08-17
209.147.125.210
(
ClassC
)
2013-09-12
131.191.45.137
(
ClassC
)
2024-09-25
67.40.5.51
(
ClassC
)
Port 80
HTTP/1.1 200 OKServer: nginx/1.27.0Date: Wed, 25 Sep 2024 02:35:15 GMTContent-Type: text/htmlContent-Length: 102713Connection: keep-aliveETag: 3248138023Last-Modified: Thu, 06 Jun 2024 01:00:12 GMT !DOCTYPE html>html langen>head>title>A History of Vince/title>meta charsetUTF-8>meta nameviewport contentwidthdevice-width,initial-scale1 />meta nametheme-color content#252730 />!--2019: Initial Creation of This PortfolioYes, in case you were wondering, I wrote all of this by hand. That includes the HTML, CSS, and JavaScript. It is all in this one single file, with the only dependency being Google Fonts. Thank you for taking the time to read the source code to see this secret note! Youre the best. :)Also, if youre wondering about the positioning of this note: Some browsers have a compatibility quirk where they need to read the meta charset> tag within X number of bytes, which is why I always keep that near the very top of all documents. There are other small subtle compatibilities in this document too. Everything here is clean and designed for easy reading/editing, with support for some very old legacy browsers!And yes, Im aware of the line length. When writing normal code (such as C/C++, PHP, JavaScript, CSS), I try to keep my lines at or under 80 columns. Because this is English human text though, going through and changing a single word due to a typo can throw all of that off. Once I feel this document is more complete, I may go through and run it through a line-ending tool to wrap these long lines, but until then, please rely on your IDEs!2023: UPDATES!Google Fonts is no longer in use. Updated site to only use two non-standard fonts, and both are now embedded at the bottom of this document.NOTE: This page is still incompleteTODO list has been moved to:https://github.com/darkain/resume/issues/-->meta namedescription contentA history of Vince; Software Engineer, Database Administrator, System Administrator, Network Administrator, Technical Writer, and Electronics Hobbyist />script>use strict;// EASY METHOD FOR TRIMMING ALL STRINGS WITHIN AN ARRAYif (!Array.prototype.trim) { Array.prototype.trim function() { return this.map(function(s) { return s.trim() }); }}// FLATTEN A MULTI-DIMENSIONAL ARRAY INTO A SINGLE DIMENSIONif (!Array.prototype.flat) { Array.prototype.flat function() { var output this; for (var i0; ioutput.length; i++) { if (typeof outputi object) { output output.concat(outputi); output.splice(i, 1); i--; } } return output; }}// EASY METHOD FOR GETTING UNIQUE ARRAY ELEMENTS// YES, THIS IS SLOW, BUT WERE DEALING WITH ~200 ITEMS TOTAL// PERFORMANCE IS A NON-ISSUE IN THIS PARTICULAR CASEif (!Array.prototype.unique) { Array.prototype.unique function() { var that this; return this.filter(function(item, pos) { return that.indexOf(item) pos; }); }}// QUERY SELECTOR ITERATORfunction query(selector, callback) { var items document.querySelectorAll(selector); var ret ; for (var i0; iitems.length; i++) { var cbr callback(itemsi, i, items); if (typeof cbr ! undefined && cbr ! null) { ret.push(cbr); } } return ret;}// SHOW/HIDE ALL YEARSfunction display_years(display) { display (typeof display ! undefined) ? display : block; query(li.event, function(item) { item.style.display display; });}// SHOW/HIDE ALL YEARS AND SECTIONSfunction display_all(display) { display (typeof display ! undefined) ? display : block; display_years(display); query(section, function(item) { item.style.display display; });}// LOOP THROUGH TAGS, HIDING ONES WE DONT WANTfunction show_tags(tag) { if (!tag) return; display_years(none); query(section, function(item) { var tags item.dataset.tags; tags tags ? tags.split(,).trim() : ; if (tags.indexOf(tag) -1) { item.style.display none; } else { item.style.display block; item.parentElement.style.display block; } });}// CREATE BUTTONS DYNAMICALLYfunction make_buttons(hash) { var found false; var list query(section, function(item) { var tags item.dataset.tags; return tags ? tags.split(,).trim() : ; }).flat().unique().sort() for (var i0; ilist.length; i++) { var button document.createElement(BUTTON); button.appendChild(document.createTextNode(listi)); document.querySelector(#buttons).appendChild(button); if (listi hash) { button.classList.add(selected); found hash; } button.addEventListener(click, function() { if (this.classList.contains(selected)) { this.classList.remove(selected); display_all(); } else { var selected document.querySelector(button.selected); if (selected) selected.classList.remove(selected); this.classList.add(selected); show_tags(this.textContent); } }); } return found;};// INITIALIZE CONTENTwindow.onload function() { show_tags( make_buttons( window.location.hash.replace(#, ) ) );};/script>style>body { background: #252730; font-size: 16px;}p { font-weight: 300;}strong { font-weight: 600;}h1 { font-family: Saira, sans-serif; letter-spacing: 1.5px; color: #fff; font-weight: 400; font-size: 2.4em;}a { color:lightgoldenrodyellow; text-decoration:none;}a:hover, a:active { text-decoration:underline;}#content { margin-top: 50px; text-align: center;}/* Timeline */.timeline { border-left: 5px solid #004ffc; border-bottom-right-radius: 4px; border-top-right-radius: 4px; background: #2C2E36; color: #D5D5D7; font-family: Chivo, sans-serif; font-weight: 100; letter-spacing: 0.5px; line-height: 1.4em; font-size: 1.03em; text-align: left; list-style: none; position: relative; margin: 50px auto 50px 120px; padding: 1px 50px 50px 50px;}.timeline h2,.timeline h3 { font-family: Saira, sans-serif; letter-spacing: 1.5px; font-weight: 400; font-size: 1.4em; margin-top:2.5em;}.timeline .event { border-bottom: 1px dashed #404249; border-bottom: 1px dashed rgba(255, 255, 255, 0.1); padding-bottom: 25px; margin-bottom: 50px; position: relative;}.timeline .event:last-of-type { padding-bottom: 0; margin-bottom: 0; border: none;}.timeline .event:before,.timeline .event:after { position: absolute; display: block; top: 0;}.timeline .event:before { left: -217px; color: #6F6E76; color: rgba(255, 255, 255, 0.4); content: attr(data-date); text-align: right; font-weight: 400; font-size: 0.9em; min-width: 120px; font-family: Saira, sans-serif;}.timeline .event:after { box-shadow: 0 0 0 4px cornflowerblue; left: -58px; background: #313534; border-radius: 50%; height: 11px; width: 11px; content: ; top: 5px;}aside ol { list-style: none; counter-reset: li;}aside ol li::before { content: counter(li); margin: 0 0.5em 0 -3em; font-size:0.75em; opacity:0.5;}aside ol li em { font-size:0.7em;}li {counter-increment: li}aside ul li { margin-top:1em; margin-left:-1em; margin-bottom:1em;}#buttons { margin:20px auto; max-width:1000px; user-select:none;}#buttons button { font-size:1em; padding: 0.3em 0.7em; margin:0.2em; outline:none; border: 2px solid #08080A; background:#1A1B22; color:#B1BBBD; border: 2px solid rgba(0,0,0,0.7); background:rgba(0,0,0,0.3); color:rgba(255,255,255,0.7);}#buttons button:hover { background-color:#cc4c00; cursor:pointer;}#buttons button.selected { background-color:#004ffc; cursor:pointer;}@media (max-width: 800px) { body { font-size:0.8em; } .timeline { margin-left:50px; padding:20px; border-left:2px solid #004ffc; } .timeline .event:before { left:-87px; min-width:50px; font-size:0.8em; margin-top:-2px; } .timeline .event:after { left:-25px; width:8px; height:8px; box-shadow: 0 0 0 2px cornflowerblue; }}/style>/head>body>div idcontent> h1>A History of Vince/h1> div idbuttons>/div> ul classtimeline> li classevent data-dateIntro> section data-tagsother> h2>Introduction/h2> p>Hi, Im strong>Vince/strong>! Some may know me by my full name strong>Vincent Milum Jr/strong>, or possibly by my online handle strong>Darkain/strong>. More recently also creating video content under the brand strong>Circuit Rewind/strong>./p> p>Who am I? A nomadic developer! This page details a chronological list of projects Ive worked on over the years, along with many external references. Over the years Ive had to assume the many roles of strong>Software Engineer/strong>, strong>Database Administrator/strong>, strong>System Administrator/strong>, strong>Network Administrator/strong>, strong>Technical Writer/strong>, and strong>Electronics Hobbyist/strong> to accomplish the tasks required for each of these projects./p> aside>ol> li>a target_blank relnoopener hrefhttps://www.linkedin.com/in/darkainmx/>My personal profile/a> via LinkedIn/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/resume>The source repository for this very page/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://gist.github.com/darkain/260d168d59b6e1561366349df635e6aa>Detailed list of open source contributions/a> via GitHub Gist/li> li>a target_blank relnoopener hrefhttps://youtube.com/@circuitrewind>Circuit Rewind YouTube Channel/a>/li> li>a target_blank relnoopener me hrefhttps://mastodon.bsd.cafe/@vince>@vince@bsd.cafe on Mastodon/a>/li> /ol>/aside> /section> /li> li classevent data-date2023> section data-tagsgames, electronics, arduino, c/c++> h2>SFC to JAMMA Adapter/h2> p>Designed the schematics, PCB, and Arduino based source code from scratch to allow a Super Famicom em>(SFC)/em> or Super Nintendo em>(SNES)/em> controller to interface with standard JAMMA based arcade cabinets, including 6-button kick harness systems. In my particular case, Im using it with my Street Fighter II cabinet from 1991./p> p>Additionally, this board also features a USB interface, allowing both SNES/SFC and the arcade cabinets controls to register as a gamepad on a PC. This allows a traditional PC to output a display to the arcade cabinet while retaining the main arcade control interface./p> p>Schematics and PCB design done in Autodesk Eagle CAD. PCB printing done by JLCPCB. Component assemble done by hand myself./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/sfc-jamma>SFC to JAMMA source code and schematics files/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://www.tiktok.com/@vincerants/video/7230315835842170155>SFC controller working on a JAMMA cabinet/a> via TikTok/li> li>a target_blank relnoopener hrefhttps://www.tiktok.com/@vincerants/video/7229858727111888174>JAMMA adapter sending input data to a PC for Street Fighter 6/a> via TikTok/li> /ol>/aside> /section> /li> li classevent data-date2022> section data-tagsfreebsd, games> h2>FreeBSD on the Steam Deck/h2> p>Worked on getting FreeBSD bootable on the Valve Steam Deck, all the way to the point of having a functional desktop interface with web browser access./p> aside>ol> li>a target_blank relnoopener hrefhttps://twitter.com/DarkainMX/status/1568365945676263424>FreeBSD XFCE Desktop running on the Steam Deck/a> via Twitter/li> li>a target_blank relnoopener hrefhttps://wiki.freebsd.org/Laptops/Steam_Deck>FreeBSD Wiki documentation on the Steam Deck/a>/li> /ol>/aside> /section> /li> li classevent data-date2021> section data-tagsfreebsd, virtualization, arm> h2>FreeBSD ARM64 / Aarch64 Virtualization Status Update/h2> p>Wrote the report on FreeBSD ARM guest support for the FreeBSD 2020-Q4 quarterly report./p> p>Hosted a panel discussing the current status of FreeBSD running under VMware ESXi-ARM Fling and Parallels Desktop for Apple M1. Presented information on status of virtual hardware support in the FreeBSD kernel, development status of guest tools, and performance metrics of bare metal vs ARM VM benchmarks./p> aside>ol> li>a target_blank relnoopener hrefhttps://www.freebsd.org/status/report-2020-10-2020-12.html#FreeBSD-Aarch64-under-VMWare-ESXi-ARM-Fling>FreeBSD Aarch64 under VMWare ESXi-ARM Fling/a> via FreeBSD Quarterly Report 2020-Q4/li> li>a target_blank relnoopener hrefhttps://youtu.be/3SUKJye54aI>FreeBSD Developer Summit June 2021/a> via YouTube/li> /ol>/aside> /section> section data-tagsfreebsd, linux, arm> h2>CentOS 7 Userland/h2> p>Ported the CentOS 7 Linux userland binaries to FreeBSD on ARM/Aarch64./p> p>Over 100 packages from the FreeBSD Ports collection updated to support this work./p> p>This work is the basis for all Linuxulator packages on FreeBSD to work going forward./p> aside>ol> li>a target_blank relnoopener hrefhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id256008>Mk/Uses/linux.mk: Add support for arm64/aarch64/a> via FreeBSD Bugzilla/li> /ol>/aside> /section> /li> li classevent data-date2020> section data-tagsfreebsd, community> h2>FreeBSD Discord Server/h2> p>Helped launch, promote, and act as administrator for The FreeBSD Projects Discord Server, which has gained over 1,000 members in its first year of activity. Weve built an active and engaging community of experts, novicies, hobbyist, and more to discuss FreeBSD, Free / Open-Source Software, and technology as a whole./p> p>em>July 2023 Update:/em> The FreeBSD Discord server is now at over 3,600 members!/p> aside>ol> li>a target_blank relnoopener hrefhttps://discord.gg/n2wshsy>The FreeBSD Project Discord Server/a>/li> /ol>/aside> /section> section data-tagsfreebsd, virtualization, arm> h2>FreeBSD ARM64 / Aarch64 Virtualization/h2> p>Lead the testing and patching efforts to get FreeBSD as a guest operating system supporting the virtual hardware on VMware ESXi-ARM Fling hypervisor./p> aside>ol> li>a target_blank relnoopener hrefhttps://flings.vmware.com/esxi-arm-edition>VMware ESXi Arm Edition/a>/li> li>a target_blank relnoopener hrefhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id250308>patch Add support for VMware ESXi ARM Fling guest VM/a> via FreeBSD Bugzilla/li> /ol>/aside> /section> section data-tagsfreebsd, virtualization, arm> h2>VMware open-vm-tools and Parallels Desktop parallels-tools/h2> p>Ported open-vm-tools and parallels-tools to ARM64 / Aarch64. While the code updates focused on FreeBSD, the majority of the changes were platform agnostic so they should work on Linux and other guest OSes. These changes were accepted and merged upstream into open-vm-tools 11.3.0./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/vmware/open-vm-tools/releases/tag/stable-11.3.0>open-vm-tools 11.3.0/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id256282>emulators/open-vm-tools: Update to 11.3.0 for Aarch64 support/a> via FreeBSD Bugzilla/li> li>a target_blank relnoopener hrefhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id256279>emulators/parallels-tools: add Aarch64 support/a> via FreeBSD Bugzilla/li> /ol>/aside> /section> section data-tagssql, zfs> h2>MariaDB Galera Cluster ZFS Compatibility/h2> p>Developed the fix for MariaDB Galera Cluster to work correctly when using rsync WSREP SST replication on ZFS based file systems where the snapdir is visible to the operating system./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/MariaDB/server/pull/1445>MDEV-21709 ZFS snapdirvisible breaks Galera rsync SST replication/a> via GitHub/li> /ol>/aside> /section> section data-tagsfreebsd, arm, networking> h2>ZeroTier on FreeBSD/h2> p>Discovered and fixed several regression issues with ZeroTier on ARMv6, ARMv7, and ARMv8. These patches were tested and fixed under FreeBSD, but also apply to other ARM based operating systems./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/pull/1288>FreeBSD ARMv6, ARMv7, and Aarch64 support/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/pull/1294>Add ZT_NO_UNALIGNED_ACCESS for ARMv6/7 on FreeBSD/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/pull/1306>Fixing regression in AES for ARM targets/a> via GitHub/li> /ol>/aside> /section> /li> li classevent data-date2019> section data-tagsfreebsd, raspberry-pi, php, web, irc, zfs> h2>FreeBSD on Raspberry Pi/h2> p>Created a Twitch Chat logging system using PHP in a daemon configuration (similar to Node.js for Javascript) that can log to either MariaDB or Sqlite./p> p>As of this writing, over 100,000 unique users and 1,500,000 messages have been logged to a Raspberry Pi 3B+ on a 3x 16GB USB ZFS Raid-Z1 array./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/php-twitch-bot>PHP Twitch Bot/a> via GitHub/li> /ol>/aside> /section> section data-tagsdocumentation, sql, php> h2>PUDL Documentation/h2> p>Launched a web site dedicated to the documentation of the PHP Universal Database Library (PUDL). As of this writing. PUDL-Docs is still a very early work in progress with many missing pages./p> aside>ol> li>a target_blank relnoopener hrefhttps://pudl.dev/>PUDL.dev/a> hosted by Github Pages/li> /ol>/aside> /section> /li> li classevent data-date2018> section data-tagssql, php, web> h2>phpMyAdmin with System-Versioned Table support/h2> p>MariaDB 10.3 added System-Versioned Table support, the ability for the database to automatically track historical change to records. This support altered some of the reporting features for MariaDB tables which broke phpMyAdmin in several different ways./p> p>As an early adopter of System-Versioned Tables and heavily using phpMyAdmin in my workflows, I wrote the patches for phpMyAdmin to handle these new features in MariaDB./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/phpmyadmin/phpmyadmin/pull/14536>Fix for SYSTEM VERSIONED tables #14514, #14515, and #14516/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://mariadb.com/kb/en/system-versioned-tables/>System-Versioned Tables/a> via mariadb.com/li> /ol>/aside> /section> section data-tagselectronics, c/c++, freebsd, raspberry-pi, zfs> h2>FreeBSD on Raspberry Pi/h2> p>Custom tuned ZFS for Raid-Z1 (3x USB thumbdrives) on Pi 3B+ to be used with a FEMP stack./p> /section> section data-tagsnetworking, c/c++, raspberry-pi, freebsd, zfs> h2>ZeroTier/h2> p>I fixed em>IPv6-to-Text/em>, and em>Text-to-IPv6/em> conversions to be RFC-5952 compliant by converting to standard em>inet/em> functions./p> p>I also fixed the ZeroTier port for the Raspberry Pi 1, 1A, 1B and Zero on FreeBSD by adding proper ARM NEON detection./p> p>I use ZeroTier as a strong>SD-WAN/strong> service to create a virtual multi-premise network. Each node connected to this network is a OPNsense router running OSPF. This enables any device connected to any private LAN at any location to be able to talk directly to any other device in any other location. This is the backbone for my MariaDB Galera cluster and ZFS multi-site replication. aside>ol> li>a target_blank relnoopener hrefhttps://tools.ietf.org/html/rfc5952>RFC-5952/a> via IETF.org/li> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/issues/850>IPv6 issue/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/pull/853>IPv6 pull request/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id231335>ARM NEON issue/a> via FreeBSD Bugzilla/li> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/pull/848>ARM NEON pull request/a> via GitHub/li> /ol>/aside> /section> section data-tagslua, c/c++, electronics, arduino> h2>Lua on Microcontrollers/h2> p>Ported the Lua programming language to ESP8266 and ESP32. I used this to create LED animation libraries for the SpiderBoard./p> aside>ul> li>When compiling C/C++ binaries, string literals are copied to RAM for direct addressing and execution. On the ESP8266, there is only 80KiB RAM, which fills up too quickly from these strings. I solved this by moving all strings from RAM to ROM. The stings included in the Lua library are only used for debugging purposes, so having slower access to them has no real effect on normal execution performance./li> /ul>/aside> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/IoT-Lua>IoT Lua/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/lua-scripts>Animation Scripts/a> via GitHub/li> /ol>/aside> /section> section data-tagsc/c++, electronics, arduino, web, lua> h2>ESP8266 Web Server/h2> p>Entirely rewrote the ESP8266 Web Server class. The initial server class by the ESP8266 community had countless stability issues that I fixed with my rewrite. This enhanced web server was built for the strong>Spider 2/strong> LED board to support an embedded strong>Lua/strong> script editor and uploader./p> aside>ul> li>The initial web server used the Arduino string class for parsing HTTP requests, such as header data, URL, and URL parameters. Each item increased RAM usage substantially. I solved this by writing an inline memory tokenizer. This also had the side effect of significantly decreasing the time required to process a request. Both very critical for embedded systems./li> li>Memory exhaustion is now handled gracefully. Previously, when new would fail due to insufficient memory, it would potentially crash the software on the board, forcing a watchdog reset. With the change to malloc, there are additional checks for failed memory allocations which will now clear all memory allocation for the current HTTP request, and return an error code to the client./li> /ul>/aside> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/Arduino/tree/master/libraries/ESP8266WebServer/src>ESP8266 Web Server/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/esp8266/Arduino/pull/5636>ESP8266/Arduino Pull Request/a> via GitHub/li> /ol>/aside> /section> section data-tagsexploits> h2>Physical address from IP address lookup/h2> p>The Tacoma WA based ISP Click-Network was using customers routers MAC address for the reverse-DNS name lookup on their public IP address. Most consumer routers use sequential MAC addresses for their WAN, LAN, and Wi-Fi ports. There are publicly available databases of Wi-Fi MAC addresses tied to physical locations as a geolocation lookup service. By combining the reverse-DNS information containing MAC address, checking the two address above/below the WAN MAC, and comparing it to the Wi-fi GEO DNS database, it was possible to pinpoint where someone physically lived to within about 100ft just by knowing their IP address./p> p>After discovering this information and validating it against known IP addresses and physical locations I was aware of, I reported this information to Click-Network for them to update their reverse-DNS information to no longer be physical location deterministic. This has since been fixed, so I am now sharing it publicly!/p> /section> /li> li classevent data-date2017> section data-tagsarm, c/c++, electronics, arduino> h2>Microcontrollers and Custom PCB Design/h2> p>Designed and created a prototype portable power supply with an ARM CPU paired with two ATTiny85 microcontrollers for controlling four independent LED arrays. Board is controlled remotely using Bluetooth game controllers. I ported the Bluetooth stack from AVR to ARM. The entire system was debuted at BlizzCon 2017./p> p>After initial prototype, I modeled an improved circuit design using strong>Autodesk Eagle CAD/strong>, had the PCB printed, and then I assembled by them by hand. I also changed the design to use Wi-Fi with a custom web server with access via a cell phone instead of accessed by Bluetooth game controllers./p> aside>ol> li>a target_blank relnoopener hrefhttps://www.youtube.com/watch?vwCLp0OPOcpI>Video of LED board in action/a> via Youtube/li> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/spider>Spider BlizzCon 2017 Demo/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/spider2>Spider 2 Demo/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://pcbs.io/share/4Q2bK>Spider 2 PCB Design/a> via PCBs.io/li> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/led>LED Rendering Library/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/Arduino/tree/master/libraries/ESP8266WebServer/src>Embedded Web Server/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/usb-stable>Arduino Bluetooth Driver/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://gist.github.com/darkain/23da34f00ebf3f1572322df3605be51f>URL Decoder written in C/a> via GitHub Gist/li> /ol>/aside> /section> /li> li classevent data-date2016> section data-tagsphotography, web, freebsd, sql, virtualization> h2>Cospix/h2> p>Rewrote entire Cospix front-end for a responsive design, mobile friendliness, new image presentation, and infinite scrolling on the homepage. This is the design that is currently live today. Also migrated back-end infrastructure./p> p>strong>Major Updates:/strong>/p> aside>ul> li>strong>Flex-Box:/strong> Changed legacy square crop thumbnails to thumbnails that retain their aspect ratio. Created dynamic image scaler that changes dynamically based on the current viewport or browser window size./li> li>strong>Discover:/strong> Created a content recommendation system based on trending viewership and personal historical browsing. This information is partially built from the graph model explained below, as well as pull from other internal content and analytics sources. I also created an infinite scrolling content loading system for the Discover page. Each new page chunk renders HTML server side in about 25-75ms time and is under 3KiB in size, keeping both bandwidth and latency as low as possible./li> li>strong>Graph Model:/strong> Built a custom graph database and data model representing pop culture media hierarchies. Content is organized into either Universe em>(eg: Square Enix)/em>, Series em>(eg: Final Fantasy 4)/em>, Characters em>(eg: Kain)/em>, and Outfit em>(eg: Dragoon)/em>. These items are then linked through graph relationships, in that other characters from other series may be Dragoons. These tags are generated by users tagging their photos, and then automatically linking using an AI system by using heuristics from that user input./li> li>strong>FreeBSD:/strong> Migrated hosting infrastructure from a VMWare vSphere 5.5 host with Debian 7 Virtual Machine to a FreeBSD 10 host with Jails. Switching from Debian VM to FreeBSD Jails cut MariaDB network latency in half./li> /ul>/aside> aside>ol> li>a target_blank relnoopener hrefhttps://cospix.net/>The Cospix.net Homepage/a>/li> li>a target_blank relnoopener hrefhttps://cospix.net/darkain/galleries>My personal galleries/a> via Cospix.net/li> /ol>/aside> /section> section data-tagsphp, sql> h2>PHP persistent connections to MariaDB/h2> p>While working on Cospix and PUDL em>(PHP Universal Database Library)/em>, I noticed connection error codes did not match the connection state between PHP and MariaDB Galera Cluster. This turned out to be an edge case with how PHPs MySQLi connector handled persistent connections./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/php/php-src/pull/2195>Fix Bug #73462 - Persistent connections dont set $connect_errno/a> via GitHub/li> /ol>/aside> /section> section data-tagsother, networking, linux> h2>Open Source Advocate/h2> p>To help promote various open source projects, I set up a 24/7 torrent seeding machine on a 1gbps WAN connection. I use this machine to host archives of Linux distributions and other open source projects. One example is the entirety of the Debian 7 CD and DVD archives for i386 and AMD64 platforms (70 ISOs in total). I also use host security focused ISOs such as Kali Linux and Tails. Beyond software, I also seed the complete Overclocked ReMix collection from their official torrents archive, featuring over 4000 original video game music remixes./p> p>Not every organization that produces large software, operating systems, music collections, or other large data sets have the financial means to support the bandwidth to distribute their content. I help these projects out by donating my own bandwidth to their causes. Not all open source contributions are strictly code, and I believe this is a good way to me to help this open source and open content creators to share their works with the world freely./p> /section> /li> li classevent data-date2015> section data-tagsphotography> h2>Cospix Photo Studio/h2> p>Founded the Cospix Photo Studio at Anime Expo (AX). Recruited and lead a team of 20 volunteers to help run the photo booth, including Photographers, Photo Editors, and Social Media Specialist. Anime Expo handles over 100,000 unique attendees over five days and our team captures over 10,000 photos each AX./p> p>I created a distributed file storage system to synchronize photographs between camera tethered laptops, photo editing workstations, and printing/sales workstations./p> aside>ol> li>a target_blank relnoopener hrefhttp://www.anime-expo.org/2015/05/28/partnering-with-cospix-to-provide-photo-area-at-ax-2015-in-the-entertainment-hall/>Announcement of Cospix Partnership/a> via Anime-Expo.org/li> /ol>/aside> /section> section data-tagssql, linux> h2>MariaDB Galera Cluster on SmartOS/h2> p>SmartOS is an illumos kernel based operating system specializing in containerization and virtual machine workloads. One contain format it supports is a Linux compatibility layer known as LX Zones. Under LX Zones, I fixed the MariaDB Galera initialization code to properly support the way SmartOS with ZFS handles file size pre-allocation./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/codership/galera/pull/253>Fix for ENOSYS error on posix_fallocate/a> via GitHub/li> /ol>/aside> /section> /li> li classevent data-date2014> section data-tagsphp, library> h2>Altaform/h2> p>Launched my high performance and scalable PHP framework. The Altaform framework is built on top of the PHP Universal Database Library, Getvar, and TinyButXtreme./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/altaform>Altaform/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/altaform-core>Altaform-Core/a> via GitHub/li> /ol>/aside> /section> section data-tagsphp, library, web> h2>TinyButXtreme/h2> p>Forked the TinyButStrong (TBS) HTML template processor by Skrol29 as TinyButXtreme (TBX). Initial fork was due to dispute over a bug that the initial developer refused to fix. Afterwards, I reorganized all source code and simplified the entire library API. Legacy and insecure features were removed. Fixed several other bugs that persisted in the original code base. New code is now extended with countless new functionality. Code updated for PHP 5.x and modern PHP 7.x support./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/Skrol29/tinybutstrong>Original TinyButStrong/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/TinyButXtreme>Forked TinyButXtreme/a> via GitHub/li> /ol>/aside> /section> section data-tagsweb, php, sql, javascript, photography, zfs> h2>Launched Cospix/h2> p>Developed and launched the web site a target_blank relnoopener hrefhttps://cospix.net>Cospix.net/a> as a high quality photo hosting web site for the global cosplay community. Cospix uses the Altaform framework, runs on both PHP and HHVM, uses MariaDB Galera Clustering, Redis caching, and ZFS Raid file storage across multiple systems in a cluster and across multiple data centers./p> p>strong>Technology Used:/strong>/p> aside>ul> li>strong>ZFS File Storage:/strong> User photo storage is handled by a local ZFS Raid-Z pool. Temporary ZFS snapshots are taken every 5 minutes. Snapshots are then sent via SSH ZFS SEND + ZFS RECV to remote servers. Each server runs Lighttpd for serving photos. If a slave is missing a photo (uploaded in the last 5 minutes but not synced yet), Lighttpd automatically reverts to a NFS share back to the central master server to ensure any Lighttpd instance can serve any photo regardless of freshness./li> li>strong>MariaDB Galera Database:/strong> Relational and graph data is stored in MariaDB with Galera clustering. Every node in the cluster handles read and write operations, to prevent worry about master delegation in case of node maintenance. The cluster is broken up into smaller sub-clusters in each data center. At least one node in each data center is backed by ZFS storage with snapshots taken on regular intervals as a method of keeping historical information and backups in case recovery is required./li> li>strong>PHP Application:/strong> Main web site programmed in PHP with support for both the PHP and HHVM interpreter./li> li>strong>Deployment:/strong> New versions of PHP code are deployed using a GitHub Web Hook which initiates a call back to the Cospix web site. This call on the local server then forwards a sync call on all PHP nodes to pull latest git code from a GitHub live branch. After code is synced on all systems, all static assets (JS, CSS) are rebuilt, compressed, and stored on Lighttpd servers./li> /ul>/aside> /section> /li> li classevent data-date2012> section data-tagsphp, library, sql> h2>PHP Universal Database Library (PUDL)/h2> p>Open-sourced my PHP library for connecting to and interacting with SQL databases. Created a SQL query generator that transparently works with strong>MySQL/strong>, strong>MariaDB/strong>, strong>PerconaDB/strong>, strong>PosgreSQL/strong>, strong>SQLite/strong>, strong>Microsoft SQL Server/strong>, and general strong>ODBC/strong> servers. Unlike PDO bundled with PHP, the PUDL library works virtually identical with all engines with just a simple connection configuration change./p> p>PUDL also has direct support for strong>Galera/strong> multi-master clustering, including load balancing, high-availability, and multi-datacenter awareness./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/pudl>PHP Universal Database Library/a> via GitHub/li> /ol>/aside> /section> section data-tagsnetworking> h2>IPv6 Certified Sage/h2> p>Completed the Hurricane Electric IPv6 Certification course with a perfect score of 1500 earning the rank of Sage./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20121017203056/http://ipv6.he.net/certification/scoresheet.php?pass_namedarkain>IPv6 Certification/a> via Archive.org/li> /ol>/aside> /section> /li> li classevent data-date2011> section data-tagswindows, c/c++> h2>vmem/h2> p>Forked and updated bmem by Brennen Underwood as vmem. Added support cleaner true-type font rendering and for real-time CPU clock speed display on systems with Intel SpeedStep (or AMD equivalent). Entire application written in C/C++./p> aside>ol> li>a target_blank relnoopener hrefhttp://web.archive.org/web/20111214175457/http://badmofo.org/bmem/>Original bmem on badmofo.org/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/vmem>Updated vmem/a> via GitHub/li> /ol>/aside> /section> /li> li classevent data-date2010> section data-tagswindows, virtualization, networking> h2>Disaster Recovery/h2> p>Lead data recovery efforts after a 100% total loss of all on premise computer equipment after a devastating warehouse fire. By previously instituting a combination of online cloud backup and off site tape backup rotation, virtually no data was lost./p> p>After data recover, lead the effort in designing new on premise infrastructure, including all equipment in server and networking room, client workstations, and building wiring for networking./p> aside>ol> li>a target_blank relnoopener hrefhttps://www.king5.com/article/news/local/fire-destroys-puyallup-auto-parts-store/332823100>Hagens Auto Parts Fire/a> via King5 News, Seattle/li> /ol>/aside> /section> section data-tagsrmx, winamp, c/c++, networking> h2>RMX Remote/h2> p>Created an strong>Android/strong> app that allows basic playback control of either strong>Winamp/strong> or strong>foobar2000/strong> media players on a desktop through LAN UDP broadcast messages. RMX Automation received a beta update at the same time to act as the RMX Server component./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/rmx-remote-android>RMX Remote Android App/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://www.apkmonk.com/app/com.darkain.rmx.remote/>RMX Remote Android App/a> via APK Monk/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20170504203731/http://darkain.com/rmx-automation/>RMX Remote Release Announcement on Darkain.com/a> via Archive.org/li> /ol>/aside> /section> /li> li classevent data-date2009> section> h2>Remote Work/h2> p>Spent the year working 100% remote from the middle of the Rocky Mountains in Montana./p> /section> /li> li classevent data-date2008> section data-tagsweb, php, sql, javascript> h2>Launched CosplayMeetup.com/h2> p>Created a conceptual cosplay oriented social network. Code based on the Image Metabase project./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20080209141704/http://www.cosplaymeetup.com/>CosplayMeetup.com/a> via Archive.org/li> /ol>/aside> /section> section data-tagsweb, php, sql, javascript> h2>Launched Repost.Me/h2> p>Created a public URL shortening service that also included analytics tracking./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/repost.me>Repost.Me/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20090328113222/http://repost.me/>Repost.Me at launch/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20100609184801/http://repost.me/>Repost.Me with analytics/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://wordpress.org/plugins/repostme-social-icon-links/>Repost.Me plugin/a> via WordPress.org/li> li>a target_blank relnoopener hrefhttps://twitter.com/repostme>Repost.Me Bot/a> via Twitter/li> /ol>/aside> /section> /li> li classevent data-date2007> section data-tagsrmx, c/c++, lua, winamp, web, networking> h2>RMX Automation/h2> p>Renamed RM-X General Purpose Control to RMX Automation and released it as open source software under the BSD license./p> p>The public release of RMX supports strong>Windows Media Player 7/strong>, strong>Winamp 2/strong>, strong>Winamp 3/strong>, strong>Winamp 5/strong>, strong>foobar2000/strong>, strong>Radlight Player/strong>, strong>BSPlayer/strong>, and as a stand-alone strong>Win32 Application/strong> all from a single binary binary file by exposing multiple DLL entry points plus a WinMain entry point./p> p>RMX Automation includes LuaPlus, an object oriented version of the Lua interpreter to make RMX fully scriptable. This release also includes 30 RMX Plugins which include support for integration with many more hardware and software platforms, such as X-10 home automation and several methods of TCP/IP network access. By writing a plugin once for RMX, it instantly works with all softare and systems listed above that RMX can communicate with, without the plugin needing any knowledge of those systems whatsoever./p> p>I also launched a MediaWiki instance to act as the homepage, changelog, and general resource information center for all of RMX Automation./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/RMX-Automation>RMX Automation (2012-03-09)/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://sourceforge.net/projects/rmx/>RMX Automation (2007-01-18)/a> via SourceForge/li> li>a target_blank relnoopener hrefhttp://forums.winamp.com/showthread.php?threadid184347>RM-X Back from the dead/a> via Winamp Forums/li> li>a target_blank relnoopener hrefhttp://web.archive.org/web/20070203094729/http://wiki.darkain.com/wiki/Main_Page>RMX Automation Homepage/a> via Archive.org/li> li>a target_blank relnoopener hrefhttp://web.archive.org/web/20070207044647/http://wiki.darkain.com/wiki/Plugin>List of RMX Plugins/a> via Archive.org/li> li>a target_blank relnoopener hrefhttp://web.archive.org/web/20060517230827/http://www.darkain.com/forums/viewtopic.php?t20>2005 RMX Changelog/a> via Archive.org/li> li>a target_blank relnoopener hrefhttp://web.archive.org/web/20070328193745/http://wiki.darkain.com/wiki/ChangeLog>2006 RMX Changelog Wiki/a> via Archive.org/li> /ol>/aside> /section> section data-tagsweb, php, sql, javascript, photography> h2>Released Image Metabase/h2> p>Created a tool for indexing, searching, tagging, and previewing images from the internet. Image Metabase utilized the LAMP stack./p> aside>ol> li>a target_blank relnoopener hrefhttps://sourceforge.net/projects/imagemetabase/>Image Metabase/a> via SourceForge/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/image-metabase>Image Metabase/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/image-metabase/blob/master/todo.txt>Discussion theorizing content and user meta-moderation system/a> via GitHub/li> /ol>/aside> /section> section data-tagsphp, library, web> h2>GetVar/h2> p>Released a simple PHP library in a single class for easier access of HTTP GET and POST data. GetVar supports automatic data normalization, UTF-8 safety, and the ability to decode JSON./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/getvar>GetVar/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070731131826/http://tools.darkain.com/getvar.php>GetVar on Darkain.com/a> via Archive.org/li> /ol>/aside> /section> /li> li classevent data-date2006> section data-tagsweb, games> h2>Nintendo Wii Virtual Console Notification Service/h2> p>Created a script that would poll and scrape content from the Nintendo Wii Virtual Console e-shop, and then publish those results on the Darkain.com web site, as an RSS feed, and push notifications directly to registered users Wii consoles messaging service./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070218092132/http://www.darkain.com/vc/>Nintendo Wii Virtual Console Notification Service on Darkain.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070204075031/http://www.darkain.com/vc/games.php?regionUS>Nintendo Wii Virtual Console Games in North America/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070206005025/http://www.darkain.com/vc/games.php?regionJP>Nintendo Wii Virtual Console Games in Japan/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070204075048/http://www.darkain.com/vc/games.php?regionGB>Nintendo Wii Virtual Console Games in Europe/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070204075048/http://www.darkain.com/vc/games.php?regionAU>Nintendo Wii Virtual Console Games in Australia/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070206145154/http://www.darkain.com/vc/vcUS.rss>Nintendo Wii Virtual Console RSS Feed/a> via Archive.org/li> /ol>/aside> /section> section data-tagsweb, php, games> h2>Wii Media Player/h2> p>Created a simple MP3 media player for the Nintendo Wii by utilizing its embedded web browser to load and display content./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wii-media>Wii Media Player/a> via GitHub.com/li> /ol>/aside> /section> section data-tagsweb, php> h2>PodKisser/h2> p>Wrote a simple basic podcast hosting script that would auto-generate the RSS feed based off of the contents of the folder the script lived in. This enabled simple publication of podcast content by authors as all they needed to do was to FTP a file into the folder, and it would automatically update the RSS feed/p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070208185755/http://podkiss.darkain.com/>PodKisser on Darkain.com/a> via Archive.org/li> /ol>/aside> /section> section data-tagsweb, php, games> h2>Battle Game MMonster/h2> p>Created a simple web-based multiplayer turn based click-fest online game. Players can select their race, class, and weapon, and then attack each other for various in-game points. Ultimately the game is a complex rock-paper-scissors idea expanded out to thousands of simultaneous players acting asynchronously./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070106233410/http://battle.darkain.com/about.php>Battle Game MMonster Homepage/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/battle-game-mmonster>Battle Game MMonster Source Code/a> via GitHub.org/li> /ol>/aside> /section> /li> li classevent data-date2005> section data-tagscommunity, games, c/c++, arm> h2>Homebrew / Indie Video Game Developer & Advocate/h2> p>Acted as moderator and community leader for the unofficial strong>Nintendo DS/strong> community on strong>LiveJournal/strong> with nearly 2,000 members. I used this and other online platforms to advocate for Homebrew video game developers, which eventually went on to become the modern Indie Video Game development community. During this era, homebrew game developers were not seen as part of the industry, but instead were treated like outcasts that did not belong. The big-three console gaming platforms at the time only wanted large AAA $60+ titles. By developing homebrew games and advocating for other developers using public internet channels, this helped shaped the indie gaming community and industry we have today on platforms such as Steam and the Nintendo Switch./p> p>Beyond advocacy, I also developed a micro-kernel, user interface, application loader, and several demo applications within the Nintendo DS homebrew community as an operating system under the title strong>DarkStar/strong> em>(wordplay on my handle, Darkain)/em>. I built basic clones of Tic-Tac-Toe, Minespeepers, and Lights Out and a Paint Program as demo applications to show how the multi-application loader functioned. Other developers used it as a way to distribute their homebrew games and applications in larger bundles./p> p> I created the DS-Paint demo to illustrate some of the rendering API available within DarkStar. These features included full touch screen support, a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160849/http://ds.darkain.com/hack/dspaint6.jpg>15-bit RGB color/a>, a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160530/http://ds.darkain.com/hack/pacmands.jpg>brush drawing/a>, a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160746/http://ds.darkain.com/hack/dspaint3.jpg>shape drawing/a>, a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160406/http://ds.darkain.com/hack/dspaint7.jpg>gradient drawing/a>, a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160818/http://ds.darkain.com/hack/dspaint4.jpg>anti-aliasing/a>, and a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160627/http://ds.darkain.com/hack/dspaint2.jpg>alpha blending/a> em>(on Darkain.com via Archive.org)/em>. /p> aside>ol> li>a target_blank relnoopener hrefhttps://nintendo-ds.livejournal.com/profile>Nintendo DS community/a> via LiveJournal/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20051107012513/http://ds.darkain.com/hack/>Homebrew Nintendo DS Game Releases/a> via Archive.org em>(2005, working links, less content)/em>/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20060715083142/http://ds.darkain.com/hack/>Homebrew Nintendo DS Game Releases/a> via Archive.org em>(2006, broken links, more content)/em>/li> li>a target_blank relnoopener hrefhttps://www.deviantart.com/dragonalloy/art/FoxFire-DS-17459124>Example DS-Paint Artwork/a>/li> /ol>/aside> /section> /li> li classevent data-date2004> section data-tagsexcel, exploits, basic, sql> h2>Microsoft Excel/h2> p>Discovered an exploit in Microsoft Excel that allowed for full SQL access through VBA instead of the intended support of only SELECT statements. I then used this exploit to write a full SQL INSERT data entry front end and SELECT data reporting system using VBA in Excel 2003. Those scripts have since been ported to Excel 2007. To date, Ive yet to publish knowledge of this bug and as far as I know it is still fully exploitable. However, Microsoft has significantly locked down running VBA scripts, so risk is extremely minimal./p> p>em>2023 Update:/em> So here is the disclosure of the bug. With Excels VBA, you can run SQL reports via ODBC. However, if you try to run anything other than a SELECT statement, a VBA error is thrown. I discovered that if you simple use em>ON ERROR RESUME NEXT/em> that whatever SQL query was entered would be forwarded through the ODBC driver unmodified. This allowed for INSERT, UPDATE, and any other query to execute./p> /section> section data-tagsweb, exploits, javascript> h2>LiveJournal JavaScript Worm/h2> p>By combining some self-contained, self-replicating JavaScript code with a payload to automatically make a post on LiveJournal, I created one of the very first social media worms. This exploit only worked in Internet Explorer by wrapping the JavaScript code in custom XML that IE also supported for executing scripts separately from the main <script> HTML tag. LiveJournal used a tag deny-list rather than an allow-list, so this XML tag was not filtered, allowing the malicious JavaScript code to be ran in the browser. This code was then locked down requiring user interaction to click an HTML button rather than running automatically, and presented as a Proof-of-Concept to LiveJournal staff, for which they acted swiftly to patch the vulnerability within 24 hours./p> p>The full exploit XML + JavaScript code was never published otherwise and has since been lost, all that remains is the sniplet of the self-replication part without the exploit payload./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20090508135921/http://www.darkain.com/tools/JavaScript_Self_Replicator/>JavaScript Self Replicator/a> via Archive.org/li> /ol>/aside> /section> /li> li classevent data-date2003> section data-tagswasabi, c/c++, irc> h2>Wasabi - Internet Relay Chat Client/h2> p>Created a full featured IRC client using the Wasabi SDK. This IRC client is fully stand-alone, not requiring Winamp3 to run, possibly the only Wasabi application ever released that wasnt Winamp3 itself./p> p>The Wasabi IRC client supported full skinning and scripting, the same as Winamp3. I also created a full rich-text viewer to support formatted text from IRC, such as bold, italics, and color changing. The user interface also works similarly to how modern web browsers work, it is a tabbed interface where tabs can be pulled out of the parent container into new containers, and then later rejoined into the original container./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wasabi-irc>Wasabi - IRC Client/a> via GitHub/li> li>a target_blank relnoopener hrefhttp://forums.shoutcast.com/showthread.php?t132787>Wasabi - IRC Release Announcement/a> via Winamp Forums/li> /ol>/aside> /section> section data-tagsarm, games, c/c++> h2>Matrix Advance/h2> p>Created a homebrew clone of the PC game Matrix Attack as the GameBoy Advance game Matrix Advance. Entire game written in C/C++ and some ARM ASM. Matrix Advance is a hexagon board based puzzle game featuring two simultaneous boards. Match five continuous gems of the same color on the active board to clear them. Gems can also be flipped between the active and passive boards./p> aside>ol> li>a target_blank relnoopener hrefhttps://students.digipen.edu/~eemerson/projects_ma.htm>Original Matrix Attack/a> via DiGiPen/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/matrix-advance>Matrix Advance for GBA/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/matrix-advance/raw/master/compo/Matrix%20Advance.gba>Playable GBA ROM/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://gbatemp.net/download/matrix-advance.5087/>Matrix Advance/a> via GBAtemp/li> li>a target_blank relnoopener hrefhttps://games.slashdot.org/story/03/09/19/0010241/gba-homebrew-game-contenders-released>Announcement of GBA Homebrew Game Contenders 2003/a> via Slashdot/li> /ol>/aside> /section> /li> li classevent data-date2002> section data-tagswinamp, wasabi, rmx, c/c++> h2>RM-X General Purpose Control/h2> p>Following the success of RM-900 and DX-Joystick, I merged these two plugins into a single plugin, RM-X General Purpose Control. I added a third module to this plugin known as API-KB which allowed global keyboard shortcuts and multimedia keys to control Winamp while the application is out of focus or minimized./p> p>RM-X was awarded strong>Feature Component/strong> by Winamp.com on August 8th, 2002 with the staff comment em>a plethora of remote controlling/em>./p> aside>ol> li>a target_blank relnoopener hrefhttp://forums.winamp.com/showthread.php?t82554>RM-X Release Announcement/a> via Winamp Forums/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20031213161802/http://classic.winamp.com/plugins/detail.jhtml?componentId112397>RM-X General Purpose Control for Winamp 2 on Winamp.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20030627232841/http://winamp.com/components3/detail.jhtml?componentId125421>RM-X 0.8.4 for Winamp3 on Winamp.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20030503222248/http://darkain.skin-zone.net/RMX/index.shtml>RM-X 0.8.4 for Winamp 3 on Skin-Zone.net/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20020826101501/http://www.deskmod.com/?showshowskin&skin_id14271>RM-X 0.6.4 for Winamp3 on DeskMod.com/a> via Archive.org/li> /ol>/aside> /section> section data-tagswasabi, c/c++> h2>Wasabi Development/h2> p>Contributor to the Wasabi Development platform. Wasabi is a cross-platform application development SDK targeting Windows, Linux, and Mac./p> aside>ol> li>a target_blank relnoopener hrefhttps://sourceforge.net/projects/wasabidev/>Wasabi Development/a> via SourceForge/li> /ol>/aside> /section> section data-tagswasabi, c/c++, winamp> h2>Wasabi - DeJaVU Meter/h2> p>Created a simple volume meter, spectrum analyzer, and oscilloscope visualizer component for Winamp3 using the Wasabi SDK./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wasabi-dejavu-meter>Wasabi - DeJaVU Meter/a> via GitHub/li> li>a target_blank relnoopener hrefhttp://forums.winamp.com/showthread.php?&threadid137748>DeJaVU Meter Release Announcement/a> via Winamp Forums/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20020814054348/http://www.winamp.com/components3/browse.jhtml?categoryNameVisualizations>DeJaVU Meter on Winamp.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20030701234021/http://www.deskmod.com/?showshowskin&skin_id13884>DeJaVU Meter on DeskMod.com/a> via Archive.org/li> /ol>/aside> /section> section data-tagswasabi, c/c++, winamp> h2>Wasabi - Playlist Script Object/h2> p>Created a wrapper object to allow the Maki scripting engine to interface directly with Winamp3s playlist. This component allowed other developers to embed custom playlist layouts directly into their application skins./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wasabi-playlist-script>Wasabi - Playlist Script/a> via GitHub/li> li>a target_blank relnoopener hrefhttp://forums.winamp.com/showthread.php?threadid115009>Playlist Script Object Release Announcement/a> via Winamp Forums/li> li>a target_blank relnoopener hrefhttp://wiki.winamp.com/wiki/Modern_Skin:_Maki_Overview>Maki Scripting Overview/a> via Winamp Developer Wiki/li> /ol>/aside> /section> section data-tagswasabi, winamp, c/c++, web> h2>Wasabi - Web Server/h2> p>Created a web interface for interacting with Winamp3. This allowed playback control and playlist access remotely from anywhere in the world./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wasabi-playlist-script>Wasabi - WebServer/a> via GitHub/li> li>a target_blank relnoopener hrefhttp://forums.winamp.com/showthread.php?t110116>Wasabi WebServer Release Announcement/a> via Winamp Forums/li> /ol>/aside> /section> section data-tagswasabi, games, c/c++> h2>Wasabi - Games/h2> p>Created a minesweepers clone as Llama Sweepers using the Wasabi SDK, playable within Winamp3./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wasabi-games>Wasabi - Games/a> via GitHub/li> /ol>/aside> /section> section data-tagsvirtualization> h2>Virtualization/h2> p>Started utilizing VMWare Workstation for multiple operation system testing of software I was developing. I actively tested RM-X on Windows NT4, 95, 98, 2000, ME, and XP through virtualization on a single workstation./p> /section> /li> li classevent data-date2001> section data-tagswinamp, basic, rmx, directx> h2>Winamp Plugins/h2> p>Created the initial RM-900 infrared remote control plugin for Winamp using Visual Basic to interact with the Creative Labs driver. Support was later expanded to include support for the RM-1000 remote as well./p> p>Due to the success of the RM-900 plugin, friends asked me to make a plugin for Winamp which would allow their gamepads to change songs, control playback, and change volume. Using DirectInput once again, this plugin was known as DX-Joystick./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20011008002036/http://www.8op.com/darkain/>Winamp Plugin download links on 8op.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20011205040601/http://www.winamp.com/plugins/browse.jhtml?categoryNameGeneral>RM900 Remote Control Plug-In for Winamp 2 on Winamp.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/RM-900>RM-900 Plugin for Winamp/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/dxjoy>DX-Joystick Plugin for Winamp/a> via GitHub/li> /ol>/aside> /section> /li> li classevent data-date2000> section data-tagsgames, basic> h2>Visual Basic Games/h2> p>Created a Tic-Tac-Toe game a Lights Out game using Visual Basic form controls./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/vb-games>VB Games/a> via GitHub/li> /ol>/aside> /section> section data-tagsgames, basic, directx> h2>Alpha Game Engine/h2> p>Created the Darkain Alpha Enigne, a tile based RPG game engine written in strong>Visual Basic 6.0/strong> and strong>DirectX 7/strong> (em>DirectDraw/em>, em>DirectInput/em>, em>DirectSound/em>). The Darkain Alpha engine includes a basic game editor which uses Win32 GDI API for painting tiles on the canvas./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20110429170052/http://www.darkain.com/programming/visual-basic/>Alpha Engine Release Announcement on Darkain.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/alpha>Alpha Engine/a> via GitHub/li> /ol>/aside> /section> section data-tagsbasic, games> h2>Dreamcast VMS/VMI Editors/h2> p>Created simple editors to edit VMS and VMI content for the Sega Dreamcast. VMS is the hand-held game system that doubles as a memory card. VMI is an animated icon format to display on the VMS while not running a game. Editors are written in Visual Basic 5.0/p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/dreamcast>Dreamcast VMS/VMI Editors/a> via GitHub/li> /ol>/aside> /section> section data-tagsbasic, irc> h2>Freak-Z / DooVoo IRC/h2> p>Created an IRC chat client in Visual Basic 5.0 that was released under the names Freak-Z IRC and DooVoo IRC./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/freakz-irc>Freak-Z IRC Client/a> via GitHub/li> /ol>/aside> /section> /li> li classevent data-date1997> section data-tagsnetworking, windows> h2>Networking/h2> p>At age 13, I built my first LAN using systems donated from a target_blank relnoopener hrefhttps://commons.wikimedia.org/wiki/Category:Boeing_surplus>Boeing Surplus/a> using a target_blank relnoopener hrefhttps://en.wikipedia.org/wiki/10BASE2>10-BASE2/a> networking hardware on a pair of Intel 386sx 16MHz computers running Windows 3.11 for Workgroups. First successful networked application was a target_blank relnoopener hrefhttps://en.wikipedia.org/wiki/Microsoft_Hearts>Microsoft Hearts/a> multiplayer. Later in the year, helped build networks for a computer lab and library for Gault Middle School, which I was attending at the time./p> /section> section data-tagsmsdos, basic, basic> h2>Programming/h2> p>Started learning computer programming using a target_blank relnoopener hrefhttps://en.wikipedia.org/wiki/QBasic>QBasic/a> for a target_blank relnoopener hrefhttps://en.wikipedia.org/wiki/MS-DOS>MS-DOS/a>. Later in the year, I transitioned to Visual Basic 3.0 and 4.0./p> /section> /li> li classevent data-date1996> section data-tagselectronics> h2>Electronics/h2> p>At age 12, I started learning electronics, creating simple digital and analog circuits on a solderless breadboard./p> /section> /li> li classevent data-date1995> section data-tagsother> h2>Chess/h2> p>At age 11, I placed 25th in the K-12 Chess National Championships./p> /section> /li> li classevent data-dateTODO> section data-tagsother> h2>Things To Improve/h2> p>There are still references to old source code released that are mentioned on the Archive.org Wayback Machine. I still have these source code archives in the exact state they were published and uploaded in many years ago. These archives, however, are now spread all over the place. It is time to start locating all of these archives and combine them into a single repository hosted on the Darkain.com web site./p> p>At this time, there are still about 20 code repositories that have not been uploaded that have been successfully found. These are all early works in Visual Basic and C/C++. The more recent code has been managed through GitHub since 2012./p> /section> /li> /ul>/div>style>@font-face { font-family: Chivo; src: url(data:font/woff2;base64,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) format(woff2);}@font-face { font-family: Saira; src: url(data:font/woff2;base64,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) format(woff2);}/style>/body>/html>
Port 443
HTTP/1.1 200 OKServer: nginx/1.27.0Date: Wed, 25 Sep 2024 02:35:15 GMTContent-Type: text/htmlContent-Length: 102713Connection: keep-aliveETag: 3248138023Last-Modified: Thu, 06 Jun 2024 01:00:12 GMT !DOCTYPE html>html langen>head>title>A History of Vince/title>meta charsetUTF-8>meta nameviewport contentwidthdevice-width,initial-scale1 />meta nametheme-color content#252730 />!--2019: Initial Creation of This PortfolioYes, in case you were wondering, I wrote all of this by hand. That includes the HTML, CSS, and JavaScript. It is all in this one single file, with the only dependency being Google Fonts. Thank you for taking the time to read the source code to see this secret note! Youre the best. :)Also, if youre wondering about the positioning of this note: Some browsers have a compatibility quirk where they need to read the meta charset> tag within X number of bytes, which is why I always keep that near the very top of all documents. There are other small subtle compatibilities in this document too. Everything here is clean and designed for easy reading/editing, with support for some very old legacy browsers!And yes, Im aware of the line length. When writing normal code (such as C/C++, PHP, JavaScript, CSS), I try to keep my lines at or under 80 columns. Because this is English human text though, going through and changing a single word due to a typo can throw all of that off. Once I feel this document is more complete, I may go through and run it through a line-ending tool to wrap these long lines, but until then, please rely on your IDEs!2023: UPDATES!Google Fonts is no longer in use. Updated site to only use two non-standard fonts, and both are now embedded at the bottom of this document.NOTE: This page is still incompleteTODO list has been moved to:https://github.com/darkain/resume/issues/-->meta namedescription contentA history of Vince; Software Engineer, Database Administrator, System Administrator, Network Administrator, Technical Writer, and Electronics Hobbyist />script>use strict;// EASY METHOD FOR TRIMMING ALL STRINGS WITHIN AN ARRAYif (!Array.prototype.trim) { Array.prototype.trim function() { return this.map(function(s) { return s.trim() }); }}// FLATTEN A MULTI-DIMENSIONAL ARRAY INTO A SINGLE DIMENSIONif (!Array.prototype.flat) { Array.prototype.flat function() { var output this; for (var i0; ioutput.length; i++) { if (typeof outputi object) { output output.concat(outputi); output.splice(i, 1); i--; } } return output; }}// EASY METHOD FOR GETTING UNIQUE ARRAY ELEMENTS// YES, THIS IS SLOW, BUT WERE DEALING WITH ~200 ITEMS TOTAL// PERFORMANCE IS A NON-ISSUE IN THIS PARTICULAR CASEif (!Array.prototype.unique) { Array.prototype.unique function() { var that this; return this.filter(function(item, pos) { return that.indexOf(item) pos; }); }}// QUERY SELECTOR ITERATORfunction query(selector, callback) { var items document.querySelectorAll(selector); var ret ; for (var i0; iitems.length; i++) { var cbr callback(itemsi, i, items); if (typeof cbr ! undefined && cbr ! null) { ret.push(cbr); } } return ret;}// SHOW/HIDE ALL YEARSfunction display_years(display) { display (typeof display ! undefined) ? display : block; query(li.event, function(item) { item.style.display display; });}// SHOW/HIDE ALL YEARS AND SECTIONSfunction display_all(display) { display (typeof display ! undefined) ? display : block; display_years(display); query(section, function(item) { item.style.display display; });}// LOOP THROUGH TAGS, HIDING ONES WE DONT WANTfunction show_tags(tag) { if (!tag) return; display_years(none); query(section, function(item) { var tags item.dataset.tags; tags tags ? tags.split(,).trim() : ; if (tags.indexOf(tag) -1) { item.style.display none; } else { item.style.display block; item.parentElement.style.display block; } });}// CREATE BUTTONS DYNAMICALLYfunction make_buttons(hash) { var found false; var list query(section, function(item) { var tags item.dataset.tags; return tags ? tags.split(,).trim() : ; }).flat().unique().sort() for (var i0; ilist.length; i++) { var button document.createElement(BUTTON); button.appendChild(document.createTextNode(listi)); document.querySelector(#buttons).appendChild(button); if (listi hash) { button.classList.add(selected); found hash; } button.addEventListener(click, function() { if (this.classList.contains(selected)) { this.classList.remove(selected); display_all(); } else { var selected document.querySelector(button.selected); if (selected) selected.classList.remove(selected); this.classList.add(selected); show_tags(this.textContent); } }); } return found;};// INITIALIZE CONTENTwindow.onload function() { show_tags( make_buttons( window.location.hash.replace(#, ) ) );};/script>style>body { background: #252730; font-size: 16px;}p { font-weight: 300;}strong { font-weight: 600;}h1 { font-family: Saira, sans-serif; letter-spacing: 1.5px; color: #fff; font-weight: 400; font-size: 2.4em;}a { color:lightgoldenrodyellow; text-decoration:none;}a:hover, a:active { text-decoration:underline;}#content { margin-top: 50px; text-align: center;}/* Timeline */.timeline { border-left: 5px solid #004ffc; border-bottom-right-radius: 4px; border-top-right-radius: 4px; background: #2C2E36; color: #D5D5D7; font-family: Chivo, sans-serif; font-weight: 100; letter-spacing: 0.5px; line-height: 1.4em; font-size: 1.03em; text-align: left; list-style: none; position: relative; margin: 50px auto 50px 120px; padding: 1px 50px 50px 50px;}.timeline h2,.timeline h3 { font-family: Saira, sans-serif; letter-spacing: 1.5px; font-weight: 400; font-size: 1.4em; margin-top:2.5em;}.timeline .event { border-bottom: 1px dashed #404249; border-bottom: 1px dashed rgba(255, 255, 255, 0.1); padding-bottom: 25px; margin-bottom: 50px; position: relative;}.timeline .event:last-of-type { padding-bottom: 0; margin-bottom: 0; border: none;}.timeline .event:before,.timeline .event:after { position: absolute; display: block; top: 0;}.timeline .event:before { left: -217px; color: #6F6E76; color: rgba(255, 255, 255, 0.4); content: attr(data-date); text-align: right; font-weight: 400; font-size: 0.9em; min-width: 120px; font-family: Saira, sans-serif;}.timeline .event:after { box-shadow: 0 0 0 4px cornflowerblue; left: -58px; background: #313534; border-radius: 50%; height: 11px; width: 11px; content: ; top: 5px;}aside ol { list-style: none; counter-reset: li;}aside ol li::before { content: counter(li); margin: 0 0.5em 0 -3em; font-size:0.75em; opacity:0.5;}aside ol li em { font-size:0.7em;}li {counter-increment: li}aside ul li { margin-top:1em; margin-left:-1em; margin-bottom:1em;}#buttons { margin:20px auto; max-width:1000px; user-select:none;}#buttons button { font-size:1em; padding: 0.3em 0.7em; margin:0.2em; outline:none; border: 2px solid #08080A; background:#1A1B22; color:#B1BBBD; border: 2px solid rgba(0,0,0,0.7); background:rgba(0,0,0,0.3); color:rgba(255,255,255,0.7);}#buttons button:hover { background-color:#cc4c00; cursor:pointer;}#buttons button.selected { background-color:#004ffc; cursor:pointer;}@media (max-width: 800px) { body { font-size:0.8em; } .timeline { margin-left:50px; padding:20px; border-left:2px solid #004ffc; } .timeline .event:before { left:-87px; min-width:50px; font-size:0.8em; margin-top:-2px; } .timeline .event:after { left:-25px; width:8px; height:8px; box-shadow: 0 0 0 2px cornflowerblue; }}/style>/head>body>div idcontent> h1>A History of Vince/h1> div idbuttons>/div> ul classtimeline> li classevent data-dateIntro> section data-tagsother> h2>Introduction/h2> p>Hi, Im strong>Vince/strong>! Some may know me by my full name strong>Vincent Milum Jr/strong>, or possibly by my online handle strong>Darkain/strong>. More recently also creating video content under the brand strong>Circuit Rewind/strong>./p> p>Who am I? A nomadic developer! This page details a chronological list of projects Ive worked on over the years, along with many external references. Over the years Ive had to assume the many roles of strong>Software Engineer/strong>, strong>Database Administrator/strong>, strong>System Administrator/strong>, strong>Network Administrator/strong>, strong>Technical Writer/strong>, and strong>Electronics Hobbyist/strong> to accomplish the tasks required for each of these projects./p> aside>ol> li>a target_blank relnoopener hrefhttps://www.linkedin.com/in/darkainmx/>My personal profile/a> via LinkedIn/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/resume>The source repository for this very page/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://gist.github.com/darkain/260d168d59b6e1561366349df635e6aa>Detailed list of open source contributions/a> via GitHub Gist/li> li>a target_blank relnoopener hrefhttps://youtube.com/@circuitrewind>Circuit Rewind YouTube Channel/a>/li> li>a target_blank relnoopener me hrefhttps://mastodon.bsd.cafe/@vince>@vince@bsd.cafe on Mastodon/a>/li> /ol>/aside> /section> /li> li classevent data-date2023> section data-tagsgames, electronics, arduino, c/c++> h2>SFC to JAMMA Adapter/h2> p>Designed the schematics, PCB, and Arduino based source code from scratch to allow a Super Famicom em>(SFC)/em> or Super Nintendo em>(SNES)/em> controller to interface with standard JAMMA based arcade cabinets, including 6-button kick harness systems. In my particular case, Im using it with my Street Fighter II cabinet from 1991./p> p>Additionally, this board also features a USB interface, allowing both SNES/SFC and the arcade cabinets controls to register as a gamepad on a PC. This allows a traditional PC to output a display to the arcade cabinet while retaining the main arcade control interface./p> p>Schematics and PCB design done in Autodesk Eagle CAD. PCB printing done by JLCPCB. Component assemble done by hand myself./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/sfc-jamma>SFC to JAMMA source code and schematics files/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://www.tiktok.com/@vincerants/video/7230315835842170155>SFC controller working on a JAMMA cabinet/a> via TikTok/li> li>a target_blank relnoopener hrefhttps://www.tiktok.com/@vincerants/video/7229858727111888174>JAMMA adapter sending input data to a PC for Street Fighter 6/a> via TikTok/li> /ol>/aside> /section> /li> li classevent data-date2022> section data-tagsfreebsd, games> h2>FreeBSD on the Steam Deck/h2> p>Worked on getting FreeBSD bootable on the Valve Steam Deck, all the way to the point of having a functional desktop interface with web browser access./p> aside>ol> li>a target_blank relnoopener hrefhttps://twitter.com/DarkainMX/status/1568365945676263424>FreeBSD XFCE Desktop running on the Steam Deck/a> via Twitter/li> li>a target_blank relnoopener hrefhttps://wiki.freebsd.org/Laptops/Steam_Deck>FreeBSD Wiki documentation on the Steam Deck/a>/li> /ol>/aside> /section> /li> li classevent data-date2021> section data-tagsfreebsd, virtualization, arm> h2>FreeBSD ARM64 / Aarch64 Virtualization Status Update/h2> p>Wrote the report on FreeBSD ARM guest support for the FreeBSD 2020-Q4 quarterly report./p> p>Hosted a panel discussing the current status of FreeBSD running under VMware ESXi-ARM Fling and Parallels Desktop for Apple M1. Presented information on status of virtual hardware support in the FreeBSD kernel, development status of guest tools, and performance metrics of bare metal vs ARM VM benchmarks./p> aside>ol> li>a target_blank relnoopener hrefhttps://www.freebsd.org/status/report-2020-10-2020-12.html#FreeBSD-Aarch64-under-VMWare-ESXi-ARM-Fling>FreeBSD Aarch64 under VMWare ESXi-ARM Fling/a> via FreeBSD Quarterly Report 2020-Q4/li> li>a target_blank relnoopener hrefhttps://youtu.be/3SUKJye54aI>FreeBSD Developer Summit June 2021/a> via YouTube/li> /ol>/aside> /section> section data-tagsfreebsd, linux, arm> h2>CentOS 7 Userland/h2> p>Ported the CentOS 7 Linux userland binaries to FreeBSD on ARM/Aarch64./p> p>Over 100 packages from the FreeBSD Ports collection updated to support this work./p> p>This work is the basis for all Linuxulator packages on FreeBSD to work going forward./p> aside>ol> li>a target_blank relnoopener hrefhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id256008>Mk/Uses/linux.mk: Add support for arm64/aarch64/a> via FreeBSD Bugzilla/li> /ol>/aside> /section> /li> li classevent data-date2020> section data-tagsfreebsd, community> h2>FreeBSD Discord Server/h2> p>Helped launch, promote, and act as administrator for The FreeBSD Projects Discord Server, which has gained over 1,000 members in its first year of activity. Weve built an active and engaging community of experts, novicies, hobbyist, and more to discuss FreeBSD, Free / Open-Source Software, and technology as a whole./p> p>em>July 2023 Update:/em> The FreeBSD Discord server is now at over 3,600 members!/p> aside>ol> li>a target_blank relnoopener hrefhttps://discord.gg/n2wshsy>The FreeBSD Project Discord Server/a>/li> /ol>/aside> /section> section data-tagsfreebsd, virtualization, arm> h2>FreeBSD ARM64 / Aarch64 Virtualization/h2> p>Lead the testing and patching efforts to get FreeBSD as a guest operating system supporting the virtual hardware on VMware ESXi-ARM Fling hypervisor./p> aside>ol> li>a target_blank relnoopener hrefhttps://flings.vmware.com/esxi-arm-edition>VMware ESXi Arm Edition/a>/li> li>a target_blank relnoopener hrefhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id250308>patch Add support for VMware ESXi ARM Fling guest VM/a> via FreeBSD Bugzilla/li> /ol>/aside> /section> section data-tagsfreebsd, virtualization, arm> h2>VMware open-vm-tools and Parallels Desktop parallels-tools/h2> p>Ported open-vm-tools and parallels-tools to ARM64 / Aarch64. While the code updates focused on FreeBSD, the majority of the changes were platform agnostic so they should work on Linux and other guest OSes. These changes were accepted and merged upstream into open-vm-tools 11.3.0./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/vmware/open-vm-tools/releases/tag/stable-11.3.0>open-vm-tools 11.3.0/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id256282>emulators/open-vm-tools: Update to 11.3.0 for Aarch64 support/a> via FreeBSD Bugzilla/li> li>a target_blank relnoopener hrefhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id256279>emulators/parallels-tools: add Aarch64 support/a> via FreeBSD Bugzilla/li> /ol>/aside> /section> section data-tagssql, zfs> h2>MariaDB Galera Cluster ZFS Compatibility/h2> p>Developed the fix for MariaDB Galera Cluster to work correctly when using rsync WSREP SST replication on ZFS based file systems where the snapdir is visible to the operating system./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/MariaDB/server/pull/1445>MDEV-21709 ZFS snapdirvisible breaks Galera rsync SST replication/a> via GitHub/li> /ol>/aside> /section> section data-tagsfreebsd, arm, networking> h2>ZeroTier on FreeBSD/h2> p>Discovered and fixed several regression issues with ZeroTier on ARMv6, ARMv7, and ARMv8. These patches were tested and fixed under FreeBSD, but also apply to other ARM based operating systems./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/pull/1288>FreeBSD ARMv6, ARMv7, and Aarch64 support/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/pull/1294>Add ZT_NO_UNALIGNED_ACCESS for ARMv6/7 on FreeBSD/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/pull/1306>Fixing regression in AES for ARM targets/a> via GitHub/li> /ol>/aside> /section> /li> li classevent data-date2019> section data-tagsfreebsd, raspberry-pi, php, web, irc, zfs> h2>FreeBSD on Raspberry Pi/h2> p>Created a Twitch Chat logging system using PHP in a daemon configuration (similar to Node.js for Javascript) that can log to either MariaDB or Sqlite./p> p>As of this writing, over 100,000 unique users and 1,500,000 messages have been logged to a Raspberry Pi 3B+ on a 3x 16GB USB ZFS Raid-Z1 array./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/php-twitch-bot>PHP Twitch Bot/a> via GitHub/li> /ol>/aside> /section> section data-tagsdocumentation, sql, php> h2>PUDL Documentation/h2> p>Launched a web site dedicated to the documentation of the PHP Universal Database Library (PUDL). As of this writing. PUDL-Docs is still a very early work in progress with many missing pages./p> aside>ol> li>a target_blank relnoopener hrefhttps://pudl.dev/>PUDL.dev/a> hosted by Github Pages/li> /ol>/aside> /section> /li> li classevent data-date2018> section data-tagssql, php, web> h2>phpMyAdmin with System-Versioned Table support/h2> p>MariaDB 10.3 added System-Versioned Table support, the ability for the database to automatically track historical change to records. This support altered some of the reporting features for MariaDB tables which broke phpMyAdmin in several different ways./p> p>As an early adopter of System-Versioned Tables and heavily using phpMyAdmin in my workflows, I wrote the patches for phpMyAdmin to handle these new features in MariaDB./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/phpmyadmin/phpmyadmin/pull/14536>Fix for SYSTEM VERSIONED tables #14514, #14515, and #14516/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://mariadb.com/kb/en/system-versioned-tables/>System-Versioned Tables/a> via mariadb.com/li> /ol>/aside> /section> section data-tagselectronics, c/c++, freebsd, raspberry-pi, zfs> h2>FreeBSD on Raspberry Pi/h2> p>Custom tuned ZFS for Raid-Z1 (3x USB thumbdrives) on Pi 3B+ to be used with a FEMP stack./p> /section> section data-tagsnetworking, c/c++, raspberry-pi, freebsd, zfs> h2>ZeroTier/h2> p>I fixed em>IPv6-to-Text/em>, and em>Text-to-IPv6/em> conversions to be RFC-5952 compliant by converting to standard em>inet/em> functions./p> p>I also fixed the ZeroTier port for the Raspberry Pi 1, 1A, 1B and Zero on FreeBSD by adding proper ARM NEON detection./p> p>I use ZeroTier as a strong>SD-WAN/strong> service to create a virtual multi-premise network. Each node connected to this network is a OPNsense router running OSPF. This enables any device connected to any private LAN at any location to be able to talk directly to any other device in any other location. This is the backbone for my MariaDB Galera cluster and ZFS multi-site replication. aside>ol> li>a target_blank relnoopener hrefhttps://tools.ietf.org/html/rfc5952>RFC-5952/a> via IETF.org/li> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/issues/850>IPv6 issue/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/pull/853>IPv6 pull request/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://bugs.freebsd.org/bugzilla/show_bug.cgi?id231335>ARM NEON issue/a> via FreeBSD Bugzilla/li> li>a target_blank relnoopener hrefhttps://github.com/zerotier/ZeroTierOne/pull/848>ARM NEON pull request/a> via GitHub/li> /ol>/aside> /section> section data-tagslua, c/c++, electronics, arduino> h2>Lua on Microcontrollers/h2> p>Ported the Lua programming language to ESP8266 and ESP32. I used this to create LED animation libraries for the SpiderBoard./p> aside>ul> li>When compiling C/C++ binaries, string literals are copied to RAM for direct addressing and execution. On the ESP8266, there is only 80KiB RAM, which fills up too quickly from these strings. I solved this by moving all strings from RAM to ROM. The stings included in the Lua library are only used for debugging purposes, so having slower access to them has no real effect on normal execution performance./li> /ul>/aside> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/IoT-Lua>IoT Lua/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/lua-scripts>Animation Scripts/a> via GitHub/li> /ol>/aside> /section> section data-tagsc/c++, electronics, arduino, web, lua> h2>ESP8266 Web Server/h2> p>Entirely rewrote the ESP8266 Web Server class. The initial server class by the ESP8266 community had countless stability issues that I fixed with my rewrite. This enhanced web server was built for the strong>Spider 2/strong> LED board to support an embedded strong>Lua/strong> script editor and uploader./p> aside>ul> li>The initial web server used the Arduino string class for parsing HTTP requests, such as header data, URL, and URL parameters. Each item increased RAM usage substantially. I solved this by writing an inline memory tokenizer. This also had the side effect of significantly decreasing the time required to process a request. Both very critical for embedded systems./li> li>Memory exhaustion is now handled gracefully. Previously, when new would fail due to insufficient memory, it would potentially crash the software on the board, forcing a watchdog reset. With the change to malloc, there are additional checks for failed memory allocations which will now clear all memory allocation for the current HTTP request, and return an error code to the client./li> /ul>/aside> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/Arduino/tree/master/libraries/ESP8266WebServer/src>ESP8266 Web Server/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/esp8266/Arduino/pull/5636>ESP8266/Arduino Pull Request/a> via GitHub/li> /ol>/aside> /section> section data-tagsexploits> h2>Physical address from IP address lookup/h2> p>The Tacoma WA based ISP Click-Network was using customers routers MAC address for the reverse-DNS name lookup on their public IP address. Most consumer routers use sequential MAC addresses for their WAN, LAN, and Wi-Fi ports. There are publicly available databases of Wi-Fi MAC addresses tied to physical locations as a geolocation lookup service. By combining the reverse-DNS information containing MAC address, checking the two address above/below the WAN MAC, and comparing it to the Wi-fi GEO DNS database, it was possible to pinpoint where someone physically lived to within about 100ft just by knowing their IP address./p> p>After discovering this information and validating it against known IP addresses and physical locations I was aware of, I reported this information to Click-Network for them to update their reverse-DNS information to no longer be physical location deterministic. This has since been fixed, so I am now sharing it publicly!/p> /section> /li> li classevent data-date2017> section data-tagsarm, c/c++, electronics, arduino> h2>Microcontrollers and Custom PCB Design/h2> p>Designed and created a prototype portable power supply with an ARM CPU paired with two ATTiny85 microcontrollers for controlling four independent LED arrays. Board is controlled remotely using Bluetooth game controllers. I ported the Bluetooth stack from AVR to ARM. The entire system was debuted at BlizzCon 2017./p> p>After initial prototype, I modeled an improved circuit design using strong>Autodesk Eagle CAD/strong>, had the PCB printed, and then I assembled by them by hand. I also changed the design to use Wi-Fi with a custom web server with access via a cell phone instead of accessed by Bluetooth game controllers./p> aside>ol> li>a target_blank relnoopener hrefhttps://www.youtube.com/watch?vwCLp0OPOcpI>Video of LED board in action/a> via Youtube/li> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/spider>Spider BlizzCon 2017 Demo/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/spider2>Spider 2 Demo/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://pcbs.io/share/4Q2bK>Spider 2 PCB Design/a> via PCBs.io/li> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/led>LED Rendering Library/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/circuitrewind/Arduino/tree/master/libraries/ESP8266WebServer/src>Embedded Web Server/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/usb-stable>Arduino Bluetooth Driver/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://gist.github.com/darkain/23da34f00ebf3f1572322df3605be51f>URL Decoder written in C/a> via GitHub Gist/li> /ol>/aside> /section> /li> li classevent data-date2016> section data-tagsphotography, web, freebsd, sql, virtualization> h2>Cospix/h2> p>Rewrote entire Cospix front-end for a responsive design, mobile friendliness, new image presentation, and infinite scrolling on the homepage. This is the design that is currently live today. Also migrated back-end infrastructure./p> p>strong>Major Updates:/strong>/p> aside>ul> li>strong>Flex-Box:/strong> Changed legacy square crop thumbnails to thumbnails that retain their aspect ratio. Created dynamic image scaler that changes dynamically based on the current viewport or browser window size./li> li>strong>Discover:/strong> Created a content recommendation system based on trending viewership and personal historical browsing. This information is partially built from the graph model explained below, as well as pull from other internal content and analytics sources. I also created an infinite scrolling content loading system for the Discover page. Each new page chunk renders HTML server side in about 25-75ms time and is under 3KiB in size, keeping both bandwidth and latency as low as possible./li> li>strong>Graph Model:/strong> Built a custom graph database and data model representing pop culture media hierarchies. Content is organized into either Universe em>(eg: Square Enix)/em>, Series em>(eg: Final Fantasy 4)/em>, Characters em>(eg: Kain)/em>, and Outfit em>(eg: Dragoon)/em>. These items are then linked through graph relationships, in that other characters from other series may be Dragoons. These tags are generated by users tagging their photos, and then automatically linking using an AI system by using heuristics from that user input./li> li>strong>FreeBSD:/strong> Migrated hosting infrastructure from a VMWare vSphere 5.5 host with Debian 7 Virtual Machine to a FreeBSD 10 host with Jails. Switching from Debian VM to FreeBSD Jails cut MariaDB network latency in half./li> /ul>/aside> aside>ol> li>a target_blank relnoopener hrefhttps://cospix.net/>The Cospix.net Homepage/a>/li> li>a target_blank relnoopener hrefhttps://cospix.net/darkain/galleries>My personal galleries/a> via Cospix.net/li> /ol>/aside> /section> section data-tagsphp, sql> h2>PHP persistent connections to MariaDB/h2> p>While working on Cospix and PUDL em>(PHP Universal Database Library)/em>, I noticed connection error codes did not match the connection state between PHP and MariaDB Galera Cluster. This turned out to be an edge case with how PHPs MySQLi connector handled persistent connections./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/php/php-src/pull/2195>Fix Bug #73462 - Persistent connections dont set $connect_errno/a> via GitHub/li> /ol>/aside> /section> section data-tagsother, networking, linux> h2>Open Source Advocate/h2> p>To help promote various open source projects, I set up a 24/7 torrent seeding machine on a 1gbps WAN connection. I use this machine to host archives of Linux distributions and other open source projects. One example is the entirety of the Debian 7 CD and DVD archives for i386 and AMD64 platforms (70 ISOs in total). I also use host security focused ISOs such as Kali Linux and Tails. Beyond software, I also seed the complete Overclocked ReMix collection from their official torrents archive, featuring over 4000 original video game music remixes./p> p>Not every organization that produces large software, operating systems, music collections, or other large data sets have the financial means to support the bandwidth to distribute their content. I help these projects out by donating my own bandwidth to their causes. Not all open source contributions are strictly code, and I believe this is a good way to me to help this open source and open content creators to share their works with the world freely./p> /section> /li> li classevent data-date2015> section data-tagsphotography> h2>Cospix Photo Studio/h2> p>Founded the Cospix Photo Studio at Anime Expo (AX). Recruited and lead a team of 20 volunteers to help run the photo booth, including Photographers, Photo Editors, and Social Media Specialist. Anime Expo handles over 100,000 unique attendees over five days and our team captures over 10,000 photos each AX./p> p>I created a distributed file storage system to synchronize photographs between camera tethered laptops, photo editing workstations, and printing/sales workstations./p> aside>ol> li>a target_blank relnoopener hrefhttp://www.anime-expo.org/2015/05/28/partnering-with-cospix-to-provide-photo-area-at-ax-2015-in-the-entertainment-hall/>Announcement of Cospix Partnership/a> via Anime-Expo.org/li> /ol>/aside> /section> section data-tagssql, linux> h2>MariaDB Galera Cluster on SmartOS/h2> p>SmartOS is an illumos kernel based operating system specializing in containerization and virtual machine workloads. One contain format it supports is a Linux compatibility layer known as LX Zones. Under LX Zones, I fixed the MariaDB Galera initialization code to properly support the way SmartOS with ZFS handles file size pre-allocation./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/codership/galera/pull/253>Fix for ENOSYS error on posix_fallocate/a> via GitHub/li> /ol>/aside> /section> /li> li classevent data-date2014> section data-tagsphp, library> h2>Altaform/h2> p>Launched my high performance and scalable PHP framework. The Altaform framework is built on top of the PHP Universal Database Library, Getvar, and TinyButXtreme./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/altaform>Altaform/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/altaform-core>Altaform-Core/a> via GitHub/li> /ol>/aside> /section> section data-tagsphp, library, web> h2>TinyButXtreme/h2> p>Forked the TinyButStrong (TBS) HTML template processor by Skrol29 as TinyButXtreme (TBX). Initial fork was due to dispute over a bug that the initial developer refused to fix. Afterwards, I reorganized all source code and simplified the entire library API. Legacy and insecure features were removed. Fixed several other bugs that persisted in the original code base. New code is now extended with countless new functionality. Code updated for PHP 5.x and modern PHP 7.x support./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/Skrol29/tinybutstrong>Original TinyButStrong/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/TinyButXtreme>Forked TinyButXtreme/a> via GitHub/li> /ol>/aside> /section> section data-tagsweb, php, sql, javascript, photography, zfs> h2>Launched Cospix/h2> p>Developed and launched the web site a target_blank relnoopener hrefhttps://cospix.net>Cospix.net/a> as a high quality photo hosting web site for the global cosplay community. Cospix uses the Altaform framework, runs on both PHP and HHVM, uses MariaDB Galera Clustering, Redis caching, and ZFS Raid file storage across multiple systems in a cluster and across multiple data centers./p> p>strong>Technology Used:/strong>/p> aside>ul> li>strong>ZFS File Storage:/strong> User photo storage is handled by a local ZFS Raid-Z pool. Temporary ZFS snapshots are taken every 5 minutes. Snapshots are then sent via SSH ZFS SEND + ZFS RECV to remote servers. Each server runs Lighttpd for serving photos. If a slave is missing a photo (uploaded in the last 5 minutes but not synced yet), Lighttpd automatically reverts to a NFS share back to the central master server to ensure any Lighttpd instance can serve any photo regardless of freshness./li> li>strong>MariaDB Galera Database:/strong> Relational and graph data is stored in MariaDB with Galera clustering. Every node in the cluster handles read and write operations, to prevent worry about master delegation in case of node maintenance. The cluster is broken up into smaller sub-clusters in each data center. At least one node in each data center is backed by ZFS storage with snapshots taken on regular intervals as a method of keeping historical information and backups in case recovery is required./li> li>strong>PHP Application:/strong> Main web site programmed in PHP with support for both the PHP and HHVM interpreter./li> li>strong>Deployment:/strong> New versions of PHP code are deployed using a GitHub Web Hook which initiates a call back to the Cospix web site. This call on the local server then forwards a sync call on all PHP nodes to pull latest git code from a GitHub live branch. After code is synced on all systems, all static assets (JS, CSS) are rebuilt, compressed, and stored on Lighttpd servers./li> /ul>/aside> /section> /li> li classevent data-date2012> section data-tagsphp, library, sql> h2>PHP Universal Database Library (PUDL)/h2> p>Open-sourced my PHP library for connecting to and interacting with SQL databases. Created a SQL query generator that transparently works with strong>MySQL/strong>, strong>MariaDB/strong>, strong>PerconaDB/strong>, strong>PosgreSQL/strong>, strong>SQLite/strong>, strong>Microsoft SQL Server/strong>, and general strong>ODBC/strong> servers. Unlike PDO bundled with PHP, the PUDL library works virtually identical with all engines with just a simple connection configuration change./p> p>PUDL also has direct support for strong>Galera/strong> multi-master clustering, including load balancing, high-availability, and multi-datacenter awareness./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/pudl>PHP Universal Database Library/a> via GitHub/li> /ol>/aside> /section> section data-tagsnetworking> h2>IPv6 Certified Sage/h2> p>Completed the Hurricane Electric IPv6 Certification course with a perfect score of 1500 earning the rank of Sage./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20121017203056/http://ipv6.he.net/certification/scoresheet.php?pass_namedarkain>IPv6 Certification/a> via Archive.org/li> /ol>/aside> /section> /li> li classevent data-date2011> section data-tagswindows, c/c++> h2>vmem/h2> p>Forked and updated bmem by Brennen Underwood as vmem. Added support cleaner true-type font rendering and for real-time CPU clock speed display on systems with Intel SpeedStep (or AMD equivalent). Entire application written in C/C++./p> aside>ol> li>a target_blank relnoopener hrefhttp://web.archive.org/web/20111214175457/http://badmofo.org/bmem/>Original bmem on badmofo.org/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/vmem>Updated vmem/a> via GitHub/li> /ol>/aside> /section> /li> li classevent data-date2010> section data-tagswindows, virtualization, networking> h2>Disaster Recovery/h2> p>Lead data recovery efforts after a 100% total loss of all on premise computer equipment after a devastating warehouse fire. By previously instituting a combination of online cloud backup and off site tape backup rotation, virtually no data was lost./p> p>After data recover, lead the effort in designing new on premise infrastructure, including all equipment in server and networking room, client workstations, and building wiring for networking./p> aside>ol> li>a target_blank relnoopener hrefhttps://www.king5.com/article/news/local/fire-destroys-puyallup-auto-parts-store/332823100>Hagens Auto Parts Fire/a> via King5 News, Seattle/li> /ol>/aside> /section> section data-tagsrmx, winamp, c/c++, networking> h2>RMX Remote/h2> p>Created an strong>Android/strong> app that allows basic playback control of either strong>Winamp/strong> or strong>foobar2000/strong> media players on a desktop through LAN UDP broadcast messages. RMX Automation received a beta update at the same time to act as the RMX Server component./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/rmx-remote-android>RMX Remote Android App/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://www.apkmonk.com/app/com.darkain.rmx.remote/>RMX Remote Android App/a> via APK Monk/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20170504203731/http://darkain.com/rmx-automation/>RMX Remote Release Announcement on Darkain.com/a> via Archive.org/li> /ol>/aside> /section> /li> li classevent data-date2009> section> h2>Remote Work/h2> p>Spent the year working 100% remote from the middle of the Rocky Mountains in Montana./p> /section> /li> li classevent data-date2008> section data-tagsweb, php, sql, javascript> h2>Launched CosplayMeetup.com/h2> p>Created a conceptual cosplay oriented social network. Code based on the Image Metabase project./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20080209141704/http://www.cosplaymeetup.com/>CosplayMeetup.com/a> via Archive.org/li> /ol>/aside> /section> section data-tagsweb, php, sql, javascript> h2>Launched Repost.Me/h2> p>Created a public URL shortening service that also included analytics tracking./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/repost.me>Repost.Me/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20090328113222/http://repost.me/>Repost.Me at launch/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20100609184801/http://repost.me/>Repost.Me with analytics/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://wordpress.org/plugins/repostme-social-icon-links/>Repost.Me plugin/a> via WordPress.org/li> li>a target_blank relnoopener hrefhttps://twitter.com/repostme>Repost.Me Bot/a> via Twitter/li> /ol>/aside> /section> /li> li classevent data-date2007> section data-tagsrmx, c/c++, lua, winamp, web, networking> h2>RMX Automation/h2> p>Renamed RM-X General Purpose Control to RMX Automation and released it as open source software under the BSD license./p> p>The public release of RMX supports strong>Windows Media Player 7/strong>, strong>Winamp 2/strong>, strong>Winamp 3/strong>, strong>Winamp 5/strong>, strong>foobar2000/strong>, strong>Radlight Player/strong>, strong>BSPlayer/strong>, and as a stand-alone strong>Win32 Application/strong> all from a single binary binary file by exposing multiple DLL entry points plus a WinMain entry point./p> p>RMX Automation includes LuaPlus, an object oriented version of the Lua interpreter to make RMX fully scriptable. This release also includes 30 RMX Plugins which include support for integration with many more hardware and software platforms, such as X-10 home automation and several methods of TCP/IP network access. By writing a plugin once for RMX, it instantly works with all softare and systems listed above that RMX can communicate with, without the plugin needing any knowledge of those systems whatsoever./p> p>I also launched a MediaWiki instance to act as the homepage, changelog, and general resource information center for all of RMX Automation./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/RMX-Automation>RMX Automation (2012-03-09)/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://sourceforge.net/projects/rmx/>RMX Automation (2007-01-18)/a> via SourceForge/li> li>a target_blank relnoopener hrefhttp://forums.winamp.com/showthread.php?threadid184347>RM-X Back from the dead/a> via Winamp Forums/li> li>a target_blank relnoopener hrefhttp://web.archive.org/web/20070203094729/http://wiki.darkain.com/wiki/Main_Page>RMX Automation Homepage/a> via Archive.org/li> li>a target_blank relnoopener hrefhttp://web.archive.org/web/20070207044647/http://wiki.darkain.com/wiki/Plugin>List of RMX Plugins/a> via Archive.org/li> li>a target_blank relnoopener hrefhttp://web.archive.org/web/20060517230827/http://www.darkain.com/forums/viewtopic.php?t20>2005 RMX Changelog/a> via Archive.org/li> li>a target_blank relnoopener hrefhttp://web.archive.org/web/20070328193745/http://wiki.darkain.com/wiki/ChangeLog>2006 RMX Changelog Wiki/a> via Archive.org/li> /ol>/aside> /section> section data-tagsweb, php, sql, javascript, photography> h2>Released Image Metabase/h2> p>Created a tool for indexing, searching, tagging, and previewing images from the internet. Image Metabase utilized the LAMP stack./p> aside>ol> li>a target_blank relnoopener hrefhttps://sourceforge.net/projects/imagemetabase/>Image Metabase/a> via SourceForge/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/image-metabase>Image Metabase/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/image-metabase/blob/master/todo.txt>Discussion theorizing content and user meta-moderation system/a> via GitHub/li> /ol>/aside> /section> section data-tagsphp, library, web> h2>GetVar/h2> p>Released a simple PHP library in a single class for easier access of HTTP GET and POST data. GetVar supports automatic data normalization, UTF-8 safety, and the ability to decode JSON./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/getvar>GetVar/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070731131826/http://tools.darkain.com/getvar.php>GetVar on Darkain.com/a> via Archive.org/li> /ol>/aside> /section> /li> li classevent data-date2006> section data-tagsweb, games> h2>Nintendo Wii Virtual Console Notification Service/h2> p>Created a script that would poll and scrape content from the Nintendo Wii Virtual Console e-shop, and then publish those results on the Darkain.com web site, as an RSS feed, and push notifications directly to registered users Wii consoles messaging service./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070218092132/http://www.darkain.com/vc/>Nintendo Wii Virtual Console Notification Service on Darkain.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070204075031/http://www.darkain.com/vc/games.php?regionUS>Nintendo Wii Virtual Console Games in North America/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070206005025/http://www.darkain.com/vc/games.php?regionJP>Nintendo Wii Virtual Console Games in Japan/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070204075048/http://www.darkain.com/vc/games.php?regionGB>Nintendo Wii Virtual Console Games in Europe/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070204075048/http://www.darkain.com/vc/games.php?regionAU>Nintendo Wii Virtual Console Games in Australia/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070206145154/http://www.darkain.com/vc/vcUS.rss>Nintendo Wii Virtual Console RSS Feed/a> via Archive.org/li> /ol>/aside> /section> section data-tagsweb, php, games> h2>Wii Media Player/h2> p>Created a simple MP3 media player for the Nintendo Wii by utilizing its embedded web browser to load and display content./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wii-media>Wii Media Player/a> via GitHub.com/li> /ol>/aside> /section> section data-tagsweb, php> h2>PodKisser/h2> p>Wrote a simple basic podcast hosting script that would auto-generate the RSS feed based off of the contents of the folder the script lived in. This enabled simple publication of podcast content by authors as all they needed to do was to FTP a file into the folder, and it would automatically update the RSS feed/p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070208185755/http://podkiss.darkain.com/>PodKisser on Darkain.com/a> via Archive.org/li> /ol>/aside> /section> section data-tagsweb, php, games> h2>Battle Game MMonster/h2> p>Created a simple web-based multiplayer turn based click-fest online game. Players can select their race, class, and weapon, and then attack each other for various in-game points. Ultimately the game is a complex rock-paper-scissors idea expanded out to thousands of simultaneous players acting asynchronously./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20070106233410/http://battle.darkain.com/about.php>Battle Game MMonster Homepage/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/battle-game-mmonster>Battle Game MMonster Source Code/a> via GitHub.org/li> /ol>/aside> /section> /li> li classevent data-date2005> section data-tagscommunity, games, c/c++, arm> h2>Homebrew / Indie Video Game Developer & Advocate/h2> p>Acted as moderator and community leader for the unofficial strong>Nintendo DS/strong> community on strong>LiveJournal/strong> with nearly 2,000 members. I used this and other online platforms to advocate for Homebrew video game developers, which eventually went on to become the modern Indie Video Game development community. During this era, homebrew game developers were not seen as part of the industry, but instead were treated like outcasts that did not belong. The big-three console gaming platforms at the time only wanted large AAA $60+ titles. By developing homebrew games and advocating for other developers using public internet channels, this helped shaped the indie gaming community and industry we have today on platforms such as Steam and the Nintendo Switch./p> p>Beyond advocacy, I also developed a micro-kernel, user interface, application loader, and several demo applications within the Nintendo DS homebrew community as an operating system under the title strong>DarkStar/strong> em>(wordplay on my handle, Darkain)/em>. I built basic clones of Tic-Tac-Toe, Minespeepers, and Lights Out and a Paint Program as demo applications to show how the multi-application loader functioned. Other developers used it as a way to distribute their homebrew games and applications in larger bundles./p> p> I created the DS-Paint demo to illustrate some of the rendering API available within DarkStar. These features included full touch screen support, a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160849/http://ds.darkain.com/hack/dspaint6.jpg>15-bit RGB color/a>, a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160530/http://ds.darkain.com/hack/pacmands.jpg>brush drawing/a>, a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160746/http://ds.darkain.com/hack/dspaint3.jpg>shape drawing/a>, a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160406/http://ds.darkain.com/hack/dspaint7.jpg>gradient drawing/a>, a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160818/http://ds.darkain.com/hack/dspaint4.jpg>anti-aliasing/a>, and a target_blank relnoopener hrefhttps://web.archive.org/web/20060510160627/http://ds.darkain.com/hack/dspaint2.jpg>alpha blending/a> em>(on Darkain.com via Archive.org)/em>. /p> aside>ol> li>a target_blank relnoopener hrefhttps://nintendo-ds.livejournal.com/profile>Nintendo DS community/a> via LiveJournal/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20051107012513/http://ds.darkain.com/hack/>Homebrew Nintendo DS Game Releases/a> via Archive.org em>(2005, working links, less content)/em>/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20060715083142/http://ds.darkain.com/hack/>Homebrew Nintendo DS Game Releases/a> via Archive.org em>(2006, broken links, more content)/em>/li> li>a target_blank relnoopener hrefhttps://www.deviantart.com/dragonalloy/art/FoxFire-DS-17459124>Example DS-Paint Artwork/a>/li> /ol>/aside> /section> /li> li classevent data-date2004> section data-tagsexcel, exploits, basic, sql> h2>Microsoft Excel/h2> p>Discovered an exploit in Microsoft Excel that allowed for full SQL access through VBA instead of the intended support of only SELECT statements. I then used this exploit to write a full SQL INSERT data entry front end and SELECT data reporting system using VBA in Excel 2003. Those scripts have since been ported to Excel 2007. To date, Ive yet to publish knowledge of this bug and as far as I know it is still fully exploitable. However, Microsoft has significantly locked down running VBA scripts, so risk is extremely minimal./p> p>em>2023 Update:/em> So here is the disclosure of the bug. With Excels VBA, you can run SQL reports via ODBC. However, if you try to run anything other than a SELECT statement, a VBA error is thrown. I discovered that if you simple use em>ON ERROR RESUME NEXT/em> that whatever SQL query was entered would be forwarded through the ODBC driver unmodified. This allowed for INSERT, UPDATE, and any other query to execute./p> /section> section data-tagsweb, exploits, javascript> h2>LiveJournal JavaScript Worm/h2> p>By combining some self-contained, self-replicating JavaScript code with a payload to automatically make a post on LiveJournal, I created one of the very first social media worms. This exploit only worked in Internet Explorer by wrapping the JavaScript code in custom XML that IE also supported for executing scripts separately from the main <script> HTML tag. LiveJournal used a tag deny-list rather than an allow-list, so this XML tag was not filtered, allowing the malicious JavaScript code to be ran in the browser. This code was then locked down requiring user interaction to click an HTML button rather than running automatically, and presented as a Proof-of-Concept to LiveJournal staff, for which they acted swiftly to patch the vulnerability within 24 hours./p> p>The full exploit XML + JavaScript code was never published otherwise and has since been lost, all that remains is the sniplet of the self-replication part without the exploit payload./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20090508135921/http://www.darkain.com/tools/JavaScript_Self_Replicator/>JavaScript Self Replicator/a> via Archive.org/li> /ol>/aside> /section> /li> li classevent data-date2003> section data-tagswasabi, c/c++, irc> h2>Wasabi - Internet Relay Chat Client/h2> p>Created a full featured IRC client using the Wasabi SDK. This IRC client is fully stand-alone, not requiring Winamp3 to run, possibly the only Wasabi application ever released that wasnt Winamp3 itself./p> p>The Wasabi IRC client supported full skinning and scripting, the same as Winamp3. I also created a full rich-text viewer to support formatted text from IRC, such as bold, italics, and color changing. The user interface also works similarly to how modern web browsers work, it is a tabbed interface where tabs can be pulled out of the parent container into new containers, and then later rejoined into the original container./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wasabi-irc>Wasabi - IRC Client/a> via GitHub/li> li>a target_blank relnoopener hrefhttp://forums.shoutcast.com/showthread.php?t132787>Wasabi - IRC Release Announcement/a> via Winamp Forums/li> /ol>/aside> /section> section data-tagsarm, games, c/c++> h2>Matrix Advance/h2> p>Created a homebrew clone of the PC game Matrix Attack as the GameBoy Advance game Matrix Advance. Entire game written in C/C++ and some ARM ASM. Matrix Advance is a hexagon board based puzzle game featuring two simultaneous boards. Match five continuous gems of the same color on the active board to clear them. Gems can also be flipped between the active and passive boards./p> aside>ol> li>a target_blank relnoopener hrefhttps://students.digipen.edu/~eemerson/projects_ma.htm>Original Matrix Attack/a> via DiGiPen/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/matrix-advance>Matrix Advance for GBA/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/matrix-advance/raw/master/compo/Matrix%20Advance.gba>Playable GBA ROM/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://gbatemp.net/download/matrix-advance.5087/>Matrix Advance/a> via GBAtemp/li> li>a target_blank relnoopener hrefhttps://games.slashdot.org/story/03/09/19/0010241/gba-homebrew-game-contenders-released>Announcement of GBA Homebrew Game Contenders 2003/a> via Slashdot/li> /ol>/aside> /section> /li> li classevent data-date2002> section data-tagswinamp, wasabi, rmx, c/c++> h2>RM-X General Purpose Control/h2> p>Following the success of RM-900 and DX-Joystick, I merged these two plugins into a single plugin, RM-X General Purpose Control. I added a third module to this plugin known as API-KB which allowed global keyboard shortcuts and multimedia keys to control Winamp while the application is out of focus or minimized./p> p>RM-X was awarded strong>Feature Component/strong> by Winamp.com on August 8th, 2002 with the staff comment em>a plethora of remote controlling/em>./p> aside>ol> li>a target_blank relnoopener hrefhttp://forums.winamp.com/showthread.php?t82554>RM-X Release Announcement/a> via Winamp Forums/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20031213161802/http://classic.winamp.com/plugins/detail.jhtml?componentId112397>RM-X General Purpose Control for Winamp 2 on Winamp.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20030627232841/http://winamp.com/components3/detail.jhtml?componentId125421>RM-X 0.8.4 for Winamp3 on Winamp.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20030503222248/http://darkain.skin-zone.net/RMX/index.shtml>RM-X 0.8.4 for Winamp 3 on Skin-Zone.net/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20020826101501/http://www.deskmod.com/?showshowskin&skin_id14271>RM-X 0.6.4 for Winamp3 on DeskMod.com/a> via Archive.org/li> /ol>/aside> /section> section data-tagswasabi, c/c++> h2>Wasabi Development/h2> p>Contributor to the Wasabi Development platform. Wasabi is a cross-platform application development SDK targeting Windows, Linux, and Mac./p> aside>ol> li>a target_blank relnoopener hrefhttps://sourceforge.net/projects/wasabidev/>Wasabi Development/a> via SourceForge/li> /ol>/aside> /section> section data-tagswasabi, c/c++, winamp> h2>Wasabi - DeJaVU Meter/h2> p>Created a simple volume meter, spectrum analyzer, and oscilloscope visualizer component for Winamp3 using the Wasabi SDK./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wasabi-dejavu-meter>Wasabi - DeJaVU Meter/a> via GitHub/li> li>a target_blank relnoopener hrefhttp://forums.winamp.com/showthread.php?&threadid137748>DeJaVU Meter Release Announcement/a> via Winamp Forums/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20020814054348/http://www.winamp.com/components3/browse.jhtml?categoryNameVisualizations>DeJaVU Meter on Winamp.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20030701234021/http://www.deskmod.com/?showshowskin&skin_id13884>DeJaVU Meter on DeskMod.com/a> via Archive.org/li> /ol>/aside> /section> section data-tagswasabi, c/c++, winamp> h2>Wasabi - Playlist Script Object/h2> p>Created a wrapper object to allow the Maki scripting engine to interface directly with Winamp3s playlist. This component allowed other developers to embed custom playlist layouts directly into their application skins./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wasabi-playlist-script>Wasabi - Playlist Script/a> via GitHub/li> li>a target_blank relnoopener hrefhttp://forums.winamp.com/showthread.php?threadid115009>Playlist Script Object Release Announcement/a> via Winamp Forums/li> li>a target_blank relnoopener hrefhttp://wiki.winamp.com/wiki/Modern_Skin:_Maki_Overview>Maki Scripting Overview/a> via Winamp Developer Wiki/li> /ol>/aside> /section> section data-tagswasabi, winamp, c/c++, web> h2>Wasabi - Web Server/h2> p>Created a web interface for interacting with Winamp3. This allowed playback control and playlist access remotely from anywhere in the world./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wasabi-playlist-script>Wasabi - WebServer/a> via GitHub/li> li>a target_blank relnoopener hrefhttp://forums.winamp.com/showthread.php?t110116>Wasabi WebServer Release Announcement/a> via Winamp Forums/li> /ol>/aside> /section> section data-tagswasabi, games, c/c++> h2>Wasabi - Games/h2> p>Created a minesweepers clone as Llama Sweepers using the Wasabi SDK, playable within Winamp3./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/wasabi-games>Wasabi - Games/a> via GitHub/li> /ol>/aside> /section> section data-tagsvirtualization> h2>Virtualization/h2> p>Started utilizing VMWare Workstation for multiple operation system testing of software I was developing. I actively tested RM-X on Windows NT4, 95, 98, 2000, ME, and XP through virtualization on a single workstation./p> /section> /li> li classevent data-date2001> section data-tagswinamp, basic, rmx, directx> h2>Winamp Plugins/h2> p>Created the initial RM-900 infrared remote control plugin for Winamp using Visual Basic to interact with the Creative Labs driver. Support was later expanded to include support for the RM-1000 remote as well./p> p>Due to the success of the RM-900 plugin, friends asked me to make a plugin for Winamp which would allow their gamepads to change songs, control playback, and change volume. Using DirectInput once again, this plugin was known as DX-Joystick./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20011008002036/http://www.8op.com/darkain/>Winamp Plugin download links on 8op.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20011205040601/http://www.winamp.com/plugins/browse.jhtml?categoryNameGeneral>RM900 Remote Control Plug-In for Winamp 2 on Winamp.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/RM-900>RM-900 Plugin for Winamp/a> via GitHub/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/dxjoy>DX-Joystick Plugin for Winamp/a> via GitHub/li> /ol>/aside> /section> /li> li classevent data-date2000> section data-tagsgames, basic> h2>Visual Basic Games/h2> p>Created a Tic-Tac-Toe game a Lights Out game using Visual Basic form controls./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/vb-games>VB Games/a> via GitHub/li> /ol>/aside> /section> section data-tagsgames, basic, directx> h2>Alpha Game Engine/h2> p>Created the Darkain Alpha Enigne, a tile based RPG game engine written in strong>Visual Basic 6.0/strong> and strong>DirectX 7/strong> (em>DirectDraw/em>, em>DirectInput/em>, em>DirectSound/em>). The Darkain Alpha engine includes a basic game editor which uses Win32 GDI API for painting tiles on the canvas./p> aside>ol> li>a target_blank relnoopener hrefhttps://web.archive.org/web/20110429170052/http://www.darkain.com/programming/visual-basic/>Alpha Engine Release Announcement on Darkain.com/a> via Archive.org/li> li>a target_blank relnoopener hrefhttps://github.com/darkain/alpha>Alpha Engine/a> via GitHub/li> /ol>/aside> /section> section data-tagsbasic, games> h2>Dreamcast VMS/VMI Editors/h2> p>Created simple editors to edit VMS and VMI content for the Sega Dreamcast. VMS is the hand-held game system that doubles as a memory card. VMI is an animated icon format to display on the VMS while not running a game. Editors are written in Visual Basic 5.0/p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/dreamcast>Dreamcast VMS/VMI Editors/a> via GitHub/li> /ol>/aside> /section> section data-tagsbasic, irc> h2>Freak-Z / DooVoo IRC/h2> p>Created an IRC chat client in Visual Basic 5.0 that was released under the names Freak-Z IRC and DooVoo IRC./p> aside>ol> li>a target_blank relnoopener hrefhttps://github.com/darkain/freakz-irc>Freak-Z IRC Client/a> via GitHub/li> /ol>/aside> /section> /li> li classevent data-date1997> section data-tagsnetworking, windows> h2>Networking/h2> p>At age 13, I built my first LAN using systems donated from a target_blank relnoopener hrefhttps://commons.wikimedia.org/wiki/Category:Boeing_surplus>Boeing Surplus/a> using a target_blank relnoopener hrefhttps://en.wikipedia.org/wiki/10BASE2>10-BASE2/a> networking hardware on a pair of Intel 386sx 16MHz computers running Windows 3.11 for Workgroups. First successful networked application was a target_blank relnoopener hrefhttps://en.wikipedia.org/wiki/Microsoft_Hearts>Microsoft Hearts/a> multiplayer. Later in the year, helped build networks for a computer lab and library for Gault Middle School, which I was attending at the time./p> /section> section data-tagsmsdos, basic, basic> h2>Programming/h2> p>Started learning computer programming using a target_blank relnoopener hrefhttps://en.wikipedia.org/wiki/QBasic>QBasic/a> for a target_blank relnoopener hrefhttps://en.wikipedia.org/wiki/MS-DOS>MS-DOS/a>. Later in the year, I transitioned to Visual Basic 3.0 and 4.0./p> /section> /li> li classevent data-date1996> section data-tagselectronics> h2>Electronics/h2> p>At age 12, I started learning electronics, creating simple digital and analog circuits on a solderless breadboard./p> /section> /li> li classevent data-date1995> section data-tagsother> h2>Chess/h2> p>At age 11, I placed 25th in the K-12 Chess National Championships./p> /section> /li> li classevent data-dateTODO> section data-tagsother> h2>Things To Improve/h2> p>There are still references to old source code released that are mentioned on the Archive.org Wayback Machine. I still have these source code archives in the exact state they were published and uploaded in many years ago. These archives, however, are now spread all over the place. It is time to start locating all of these archives and combine them into a single repository hosted on the Darkain.com web site./p> p>At this time, there are still about 20 code repositories that have not been uploaded that have been successfully found. These are all early works in Visual Basic and C/C++. The more recent code has been managed through GitHub since 2012./p> /section> /li> /ul>/div>style>@font-face { font-family: Chivo; src: url(data:font/woff2;base64,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) format(woff2);}@font-face { font-family: Saira; src: url(data:font/woff2;base64,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) format(woff2);}/style>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]