<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://cforcomputer.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://cforcomputer.github.io/" rel="alternate" type="text/html" /><updated>2025-11-01T17:03:58+00:00</updated><id>https://cforcomputer.github.io/feed.xml</id><title type="html">patrick o’brien</title><subtitle>patrick&apos;s projects</subtitle><entry><title type="html">who am I?</title><link href="https://cforcomputer.github.io/about-me.html" rel="alternate" type="text/html" title="who am I?" /><published>2025-06-26T00:00:00+00:00</published><updated>2025-06-26T00:00:00+00:00</updated><id>https://cforcomputer.github.io/about-me</id><content type="html" xml:base="https://cforcomputer.github.io/about-me.html"><![CDATA[<h2 id="about-patrick">about Patrick</h2>
<p><img src="assets\images\about-me\profile-shot.jpg" alt="Profile photo" />
<em>Taken in Amsterdam 2023</em></p>

<p>Patrick O’Brien is originally from the United States, where he studied subjects like writing and digital forensic security at Edmonds College, then later Computer Science and Software Engineering, along with Interaction Design at the University of Washington. During the pandemic in 2020, Patrick decided to sell his belongings and pack his bags for Europe. He briefly studied Business Administration at the University of Amsterdam, living in a university provided hostel room for five months before going on a year long backpacking adventure through 25 countries. He worked on a sail ship, volunteered at farms, and lived in multiple cities.</p>

<p>Patrick is currently residing in Groningen, where he is building a new life for himself. He’s now been working for the past two years at JC-Electronics as a Business Intelligence Analyst.</p>

<p><strong>Hell yeah.</strong></p>

<h3 id="at-patricks-latest-role-hes">At Patrick’s latest role he’s:</h3>

<p>• Developed a Python‑based bot using Playwright, scrapy, and proxies with Airflow for an AI pricing system, automating competitor data collection and price recommendations across 100,000 products. This reduced manual processing time by 91%.
• Built a Sveltekit webapp to locate desirable products to purchase using Ebay APIs &amp; scraper database, 97% improvement in sourcing speed. After further improvements Sourcing reported a 4x, 300% improvement in quantity of products sourced.
• Successfully engineered solutions to latest anti‑botting tech by applying machine vision (Tesseract) for text extraction and novel human movement replay system for captcha solving with 100% success.
• Spearheaded company‑wide adoption of git/github version control system, training employees on version control.
• Improved flow run speed and stability in Alteryx, Tableau and SQL servers by over 80% using custom python scripts, clearing data pipeline bottlenecks.
• Automated stock lists, vendor inventory sync handling company‑wide using SQL and Python, saving thousands of hours.
• Created KPIs and novel interactive Tableau dashboards for stakeholders
• Largely automated the refactoring of scrapers broken by site changes by adapting to advances in Large Language Model (LLM) workflows.
• Prototyped customer gifts using Onshape CAD, 3D printing, circuit prototyping and Arduino with esp32.</p>

<h4 id="not-only-does-patrick-have">not only does Patrick have:</h4>

<p>Experience building websites like this one for clients, from SEO optimization to E-Commerce shops</p>

<p>Business and sales experience as former <a href="https://opencorporates.com/companies/us_wa/604477197">founder and CEO of Oakhold Group LLC</a></p>

<p>A broad range of experience in design, software, and customer-client interaction</p>

<p>A coder, videographer, drone operator, video editor, and micro-electronics and 3D printing enthusiast</p>

<h3 id="he-is-also">he is also:</h3>
<ul>
  <li>
    <p>Highly indepedent and results driven, does not overpromise and always delivers</p>
  </li>
  <li>
    <p>Undeniably creative and sufficiently skilled to enact his creative visions</p>
  </li>
  <li>
    <p>A creator, blending the worlds of art, business, and technology</p>
  </li>
  <li>
    <p>A guy who loves learning from, as well as educating and giving back to his community and teammates</p>
  </li>
</ul>

<h2 id="past-web-design-clients">past web design clients</h2>
<p><strong>skills:</strong></p>
<ul>
  <li>HTML</li>
  <li>Markdown</li>
  <li>CSS + Bootstrap</li>
  <li>Python</li>
  <li>Wordpress</li>
</ul>

<p>Projects stacks are dependent on what the client is looking for. Usually they want to be able to edit posts themselves very easily. So I typically use Wordpress or other site builders, but spend extra time on custom themes. (A downside of teaching them to edit their own site is that they break things or make them look ugly later. I swear they were all originally very pretty!)</p>

<ul>
  <li><a href="https://ps4sd.eu/">PS4SD.eu</a> &lt;– This is my most recent project!</li>
  <li><a href="https://kleikolonie.nl/">Kleikolonie.nl</a></li>
  <li><a href="https://seacut.com/">Seattle Cutlery</a></li>
  <li>Optimer International</li>
  <li><a href="https://www.cvrvfd.com/">Camas Valley Fire Department</a></li>
  <li><a href="https://dollykvocalcoach.com/">Dolly Kanekuni Vocal Studios</a></li>
  <li>University of Washington (side projects for management)</li>
  <li>Additional projects for individuals</li>
</ul>

<h2 id="writing">writing</h2>
<p>Patrick is working on his first novella, which he hopes to get published. –it’s a scifi epic adventure novel for YA
More details to come.</p>

<h2 id="graphic-design">graphic design</h2>
<p><strong>skills:</strong></p>
<ul>
  <li>Adobe Photoshop</li>
  <li>Adobe Lightroom</li>
  <li>Digital painting - photoshop</li>
  <li>Adobe Illustrator</li>
  <li>GIMP</li>
  <li>Logo design</li>
  <li>Graphic design</li>
</ul>

<p>Patrick has been paid professionally for some of his graphic design work. His work includes digital paintings, logo design, and graphics for large events.</p>

<h4 id="see-all-my-graphic-design-projects"><a href="https://cforcomputer.github.io/graphic-design.html">See all my graphic design projects</a></h4>

<h2 id="creator-and-videographer">creator and videographer</h2>
<p><strong>skills:</strong></p>
<ul>
  <li>Adobe premiere pro</li>
  <li>Adobe After effects</li>
  <li>Digital Photography</li>
  <li>OBS/Streaming</li>
  <li>Mirrorless videography</li>
</ul>

<p>Patrick has been paid for his creative work on Youtube, where he has over a thousand followers who love his content.</p>

<h2 id="resume-design">resume design</h2>
<p>Resume assistance helped lead to interviews and later break-in roles at:</p>

<ul>
  <li>T-Mobile</li>
  <li>Amazon</li>
  <li>Microsoft</li>
  <li>Google</li>
</ul>

<p>Assisted in compensation negotation resulting in over $1,000,000+ combined salary compensation packages.</p>

<p>Directly negotiated through writing for an additional $200,000+ per annum compensation for friends and acquaintances.</p>

<p><strong>additional skills</strong></p>
<ul>
  <li>Git/github/gitlab</li>
  <li>java</li>
  <li>soldering</li>
  <li>web scraping
    <ul>
      <li>beautifulsoup</li>
      <li>selenium</li>
    </ul>
  </li>
  <li>economics concepts</li>
  <li>investment banking concepts</li>
  <li>C#</li>
  <li>vbasic</li>
  <li>arduino</li>
  <li>Blender</li>
  <li>Autodesk Fusion360</li>
  <li>3D printer setup and staging</li>
  <li>Hardware electronics prototyping</li>
  <li>and more</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[about Patrick Taken in Amsterdam 2023]]></summary></entry><entry><title type="html">internet radio</title><link href="https://cforcomputer.github.io/internet-radio.html" rel="alternate" type="text/html" title="internet radio" /><published>2025-02-03T00:00:00+00:00</published><updated>2025-02-03T00:00:00+00:00</updated><id>https://cforcomputer.github.io/internet-radio</id><content type="html" xml:base="https://cforcomputer.github.io/internet-radio.html"><![CDATA[<p>skills used:</p>
<ul>
  <li>Arduino (C++)</li>
  <li>Prompt Engineering</li>
  <li>3D CAD (Onshape)</li>
  <li>3D Printing</li>
  <li>Electrical</li>
</ul>

<p><a href="https://github.com/cforcomputer/TTGOInternetRadio">view project code</a></p>

<h3 id="internet-radio-project">Internet radio project</h3>

<h4 id="my-introduction-to-hardware-prototyping">My introduction to hardware prototyping</h4>

<p><a href=""><img src="assets/images/projects/radio-prototypes.jpg" alt="Internet radio demo" /></a>
<em>Click the image to watch a demo video.</em> (has not been created yet)</p>

<p>The internet radio was one of my first serious CAD projects where I attempted to build a fun enclosure for a full featured internet radio.
It uses a TTGO V1 display which is a modified ESP32. It looked like a fun board to mess with, but if I were to do the project over I’d have 
gone with the newest ESP32 chip. (just for the sake of being able to use all the up-to-date libraries).</p>

<p>The radio can:</p>
<ol>
  <li>Act as a bluetooth speaker or BT to 3.5mm adapter</li>
  <li>Create a wifi configuration portal</li>
  <li>Allow the user to add any internet radio station</li>
  <li>Act as a visualizer for music</li>
</ol>

<p>I was surprised by how few working internet radio project there were. Most of the examples that I found were no longer functional or too limited. 
I forked a project that I found on youtube, but it was non-functional and I ended up redoing the entire thing with a different audio library.</p>

<p><img src="assets/images/projects/radio3d.png" alt="CAD drawing in Onshape" />
I used Onshape for the 3D component of this project, and went through many iterations of the enclosure before I landed on one that was fully usable. 
I was surprised by how long it takes to find the perfect positioning for all the buttons. I have a newfound respect for simple builds, it takes a lot
of time investment to get it right.</p>

<p>The bluetooth pairing to my phone and pc works flawlessly. 
<img src="assets/images/projects/radio-bluetooth.jpg" alt="Internet radio bluetooth mode" /></p>

<p>WIP post. more TBA</p>]]></content><author><name></name></author><summary type="html"><![CDATA[skills used: Arduino (C++) Prompt Engineering 3D CAD (Onshape) 3D Printing Electrical]]></summary></entry><entry><title type="html">the itemfinder</title><link href="https://cforcomputer.github.io/the-itemfinder.html" rel="alternate" type="text/html" title="the itemfinder" /><published>2024-01-14T00:00:00+00:00</published><updated>2024-01-14T00:00:00+00:00</updated><id>https://cforcomputer.github.io/the-itemfinder</id><content type="html" xml:base="https://cforcomputer.github.io/the-itemfinder.html"><![CDATA[<p>skills used:</p>
<ul>
  <li>python</li>
  <li>apis</li>
  <li>sql</li>
  <li>sveltekit</li>
</ul>

<p><em>Project code is private (sorry)</em></p>

<p><img src="assets/images/projects/itemfinder.png" alt="Itemfinder tool picture" />
<em>The original itemfinder tool built in Python</em></p>

<h3 id="the-problem">The problem</h3>

<p>The company that I work manually searches Ebay for item listings, in order to source and restock inventory. Since listings are not the same on every ebay site (DE, US, IT, etc.), the sourcing team has to check every site. Furthermore, many of these items have different SKU codes, these slight variations are all the same item. However, they must search for each SKU code invdividually.</p>

<p>It can take days to search through all the sku codes for a set of items. It is labor intensive and an employee must click through every page to find the best deals.</p>

<h3 id="the-solution">The solution</h3>

<h4 id="i-present-the-itemfinder">I present! The itemfinder!</h4>

<p><a href="assets\videos\itemfinder\itemfinder.mp4"><img src="assets/images/projects/itemfinder-svelte.png" alt="itemfinder demo" /></a>
<em>Click the image to watch a demo video.</em></p>

<p>Now instead of 5 hours, the average search takes less than 20 minutes. The time savings are approximately 74% for single SKU item searches, and over 93% for multi-SKU searches.</p>

<p>The Itemfinder started out as a barebones python application, but over time the purchase team continously asked for tweaks and updates. After installation and admin rights were restricted as a part of an IT update, I had visitors at my desk every few days asking for updates on when it would work again. The purchase team said that they didn’t want to work anymore without it!</p>

<p>The best solution that I found was porting the Python program into a webapp. I’d heard a lot of good things about Sveltekit, so I decided to learn how to use it for this project. This way nobody would have to download and install software, they could just access the tool from their browser, and all updates would be handled remotely.</p>

<p>The original python application would only use the Ebay API to retrieve live listings. With the API search it is very specific and sometimes is missing local listings, so in order to be absolutely sure all listings are retrieved, it combines the results from over a dozen different webscraping bots. The bots collect data from all major competitor websites.</p>

<p>The bots I’ve built up over my two years at JC-Electronics and the most important ones like Ebay run multiple times per day. These bots collections over 20 million different product listings PER DAY. The results are run through the scraper’s parsers and the data is prepared inside multiple Alteryx workflows. The final data is uploaded to a central datawarehouse running MySQL.</p>

<p>The most valuable improvement that I made was the ability for the purchase team to make a combination search for products with multiple SKUs. They can create a list for a product, then click search, and if the title matches a “convert code” then it will search for every item in the convert code list and combine the results, filtering and sorting by price. Some items have over a hundred potential combinations (convert codes), and before this tool they would have to search each one individually, checking every competitor website and ebay site for the best prices. All of this now is done automatically.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[skills used: python apis sql sveltekit]]></summary></entry><entry><title type="html">zcamp</title><link href="https://cforcomputer.github.io/zcamp.html" rel="alternate" type="text/html" title="zcamp" /><published>2023-10-16T00:00:00+00:00</published><updated>2023-10-16T00:00:00+00:00</updated><id>https://cforcomputer.github.io/zcamp</id><content type="html" xml:base="https://cforcomputer.github.io/zcamp.html"><![CDATA[<p>skills used:</p>
<ul>
  <li>python</li>
  <li>javascript</li>
  <li>svelte</li>
  <li>webhooks</li>
  <li>sql</li>
</ul>

<p><a href="https://github.com/cforcomputer/eve-online-killmail-hunter">Project code (original python tool)</a></p>

<p><a href="https://github.com/cforcomputer/zcamp">Project code for Zcamp</a></p>

<p><img src="assets/images/projects/zcamp/zcamp.png" alt="Zcamp picture showing the detected camps" /></p>

<h3 id="zcamp-for-eve-online">Zcamp for Eve Online</h3>

<p>The zCamp project started as a way to create an alarm to locate officer NPCs that killed players. An officer NPC in EVE Online is the rarest enemy, and their
item drops can be some of the most valuable items in the game universe. The goal was to hopefully reach these unsuspecting players before they had realized what had happened.
They are also quite difficult to defeat, so it was not unreasonable to assume that they may still be at the location long after the player had died.</p>

<p>Firstly, I took the available websocket provided by the player run service zkillboard.com. Then I created my own filter rules with Python and a Tkinter GUI,
allowing for more fine grained control like item type and ship grouping for the live feed. Zkillboard allows you to filter on past results,
but the live feed of results was not able to be filtered on, furthmore there was no way to set a notification if a new player loss
appeared. My tool achieved both these aims, and I was shocked to find not one, but two officer NPC losses the next morning.</p>

<p>After several days of analysis and multiple officer NPCs destroying players, I realized that there was a connection. The ships were all the
same, and the their loadouts were nearly identical. They were drone boats, which are one of the few weapon systems in the game that will
automatically attack targets without cheating. I realized that there was a large, organized effort to farm the rarest NPCs in the game,
which up until that point I’d thought were purely random.</p>

<p>Coincidentally, around the same time, a Russian youtuber began posting videos about farming officer NPCs in EVE Online. He found that the probability for an
officer to spawn was exactly 0.001% and not based on random factors. This means that if a player destroys 1000 waves of NPCs (which respawn every 30 minutes),
there is a guarantee that an officer NPC will spawn. This took away a bit of the mystery for me surrounding officer NPCs in general, and led to be seeing what
other usescases I could create using the killmail data from zKillboard.</p>

<hr />

<p>I noticed that every killmail has an exact coordinate point in the system that determines the nearby celestials. After doing some digging I was able to find
a file that CCP games provides to the community that has the exact coordinate points of every celestial and object in the game. This got me excited, as I realized
then that I could completely rebuild the universe’s game map in my application, which has a lot of implications!</p>

<ul>
  <li>I can track paths for groups of players as they transition from system to system</li>
  <li>I can warn players when systems that are about to travel into have specific hostile activity, essentially creating a tool that allows you to travel through the game without worrying about gate camps (blockades set up by other players to kill players when they enter a new region).</li>
  <li>I can make a sick visualization that shows live activity through the game</li>
  <li>I can calculate routes and display them in my version of the game map, and use the CCP Games API to set that destination in the game for player, along with waypoints. This way the player can create a risk-free route ingame through my application, avoiding all active gate camps.</li>
</ul>

<p>I mentioned what I could do to the creator of zKillboard, and was a bit surprised by the lack of interest. In particular, the ability track gangs as they traveling and the route warning tool seemed particularily valuable.
He did give me a useful bit of advice regarding the application itself. He said that players don’t trust software that you have to download, so it would be best if I turned it into a web application. That’s exactly what I did next.</p>

<p>Not having a solid grasp of typescript yet, I decided to keep this as simple as possibly and just use JavaScript, which I was most familiar with. For the frontend, I’d heard a lot of good things about Svelte recently, so I decided to use that.</p>

<p>I tested a couple of different hosting providers, but I was doing a ton of pulling and pushing, so I burned right through the trial period of Railway, which was a great app and dev service, just way too expensive!
I ended up picking Hetnzer for the cloud hosting because of its excellent pricing (better than AWS, Azure, all these other ones), it was also located nearby in Germany and had a discount with the trial for the service I was setting up, Coolify.
Coolify made it effortless to constantly fetch and deploy my docker containers and allowed me host multiple web services and databases on a single shared instance for only $10 per month. On top of that all, Coolify was free and open source. 
I highly recommend it for quick prototyping as an alternative to tools like Firebase that require vendor lock in and high prices. As far as I know, there is no better budget option.</p>

<p>After several months of development work, I had several new features working in my tool</p>

<p><img src="assets/images/projects/zcamp/campcrushers.png" alt="Zcamp picture showing the detected camps" /></p>
<ol>
  <li>A minigame called “campcrushers” to get rewards for attempting to or succeeding in the destruction of gatecamps</li>
</ol>

<ul>
  <li>Players earn points for having their kill id appear on the killmail of the gatecampers</li>
  <li>Points are permanently recorded in the Postgresl database and used to generate a leaderboard</li>
  <li>Users can share their points counter in their eve profile using a unique profile page in zCamp created with an autogenerated, permanent url.</li>
</ul>

<p><img src="assets/images/projects/zcamp/campcrushers-selection.png" alt="Campcrushers minigame" />
<img src="assets/images/projects/zcamp/campcrushers-selected.png" alt="Campcrushers minigame" /></p>

<p><img src="assets/images/projects/zcamp/live-filter-feed.png" alt="The live filter feed" /></p>
<ol>
  <li>A live feed of the parsed killmails that allow the user to filter in real time against all the killmails in the last 24 hours as the feed continues to update.</li>
</ol>

<ul>
  <li>Users can set alerts for audio notifications when a kill makes it past their filters</li>
  <li>Users can set a discord webhook, if a kill makes it past their filters it will notify them in discord.</li>
  <li>Users can create and save permanent profiles of their settings to quickly load them next time they log in.</li>
</ul>

<p><img src="assets/images/projects/zcamp/active-battles.png" alt="Zcamp picture showing active battles bubbles" /></p>
<ol>
  <li>A bubble map where bubbles appear to inflate based on kills in the last 5 minutes, showing all active battles as they happen and die out in the game. The bubbles change color based on whether they are about to pop.</li>
</ol>

<p><img src="assets/images/projects/zcamp/salvage-fields.png" alt="Zcamp picture showing the detected camps" /></p>
<ol>
  <li>Salvage fields. Filters are applied to show the user where kills have occurred in the last two hours (before a wreck expires) with ships that are tech level 2, meaning they drop extra loot when salvaged, where T1 drop next to nothing.</li>
</ol>

<p><img src="assets/images/projects/zcamp/npc-hunter.png" alt="Zcamp picture showing the detected camps" /></p>
<ol>
  <li>An officers, belt commanders, and mordus legion detector that notifies the user if a player dies to these unique, rare npcs.</li>
</ol>

<p><img src="assets/images/projects/zcamp/system-map.png" alt="Zcamp picture showing the system map with triangulation." /></p>
<ol>
  <li>
    <p>The solar system map that allows the user to see the point of the kill in relation to all the celestials in the star system, rendered in beautiful 3D with their orbit paths using ThreeJS.</p>
  </li>
  <li>
    <p>Triangulator minigame: A way to find the player wrecks without a bookmark.</p>
    <ul>
      <li>Using several mathematical calculations we determine whether the point of a killmark exists within four celestial bodies. If the point exists, then we enrich the killmail data with the coordinate points of the closest celestials it exists between. Based on this information, the user can warp between the four points placing bookmarks at closer and closer intervals until eventually they reach the wreck itself and can loot or salvage it. My friends and I had a lot of fun doing this and made several billion isk pretty quickly. If you message the person in advance, a lot of times they will tell you if they can’t reach the wreck.</li>
      <li>Players often don’t expect someone to be able to reach the wreck at all, so if you are quick you could also steal it from them while the site is still active.</li>
    </ul>
  </li>
</ol>

<p><img src="assets/images/projects/zcamp/full-galactic.png" alt="The full galactic map" /></p>
<ol>
  <li>The real time global activity map showing live fights, active roam paths, and a lot more! The map is rendered in full 3D using ThreeJs, then flattened into regions for easier viewing. It was a bit difficult to tell where things were happening otherwise.
    <ul>
      <li>The user can set the destination in the map and add waypoints</li>
      <li>If there is hostile activity along the route, it will notify them.</li>
    </ul>
  </li>
</ol>

<p><img src="assets/images/projects/zcamp/ingame-threats-checker.png" alt="Zcamp picture showing the detected camps" /></p>
<ol>
  <li>Live tracking of the user as they traverse though the game world.
    <ul>
      <li>For each system change, we can ping the EVE Online API to retrieve the user’s live location in the game world. We can compare the user’s current system against our rendered map to determine all possible gates they could be jumping into and warn them if there is an enemy on the other side.</li>
    </ul>
  </li>
</ol>

<p><img src="assets/images/projects/zcamp/log-in.png" alt="Zcamp picture showing the detected camps" /></p>
<ol>
  <li>Naturally, for these features to work we had to find a way to bind it all to the player Oauth login with EVE Online
    <ul>
      <li>Each login is paired with a unique code that is used for API calls and to keep track of the player account in our local database.</li>
      <li>Features like minigames and profiles only start working after you’ve logged in.</li>
    </ul>
  </li>
</ol>

<p>To reduce the potential of bot spam I added a cloudflare check screen that appears when you first visit the application. I intend to remove this because it adds too much of a wait when users first try to visit the application.</p>

<p>[wip]</p>]]></content><author><name></name></author><summary type="html"><![CDATA[skills used: python javascript svelte webhooks sql]]></summary></entry><entry><title type="html">graphic design portfolio</title><link href="https://cforcomputer.github.io/graphic-design.html" rel="alternate" type="text/html" title="graphic design portfolio" /><published>2023-06-25T00:00:00+00:00</published><updated>2023-06-25T00:00:00+00:00</updated><id>https://cforcomputer.github.io/graphic-design</id><content type="html" xml:base="https://cforcomputer.github.io/graphic-design.html"><![CDATA[<p>skills used:</p>
<ul>
  <li>adobe photoshop</li>
  <li>adobe illustrator</li>
  <li>photography</li>
  <li>digital painting</li>
</ul>

<h3 id="optimer-international">Optimer International</h3>
<p>I created product logos for their new line of kitchen products, one of which was selected.</p>
<details><summary>View logo prototypes for "Nakiyo" brand</summary>
    <img src="assets\images\graphics\weekend1-8.png" alt="nakiyo images 1" height="200" />
    <img src="assets\images\graphics\weekend2-8.png" alt="nakiyo images 2" height="200" />
    <img src="assets\images\graphics\weekend3-8.png" alt="nakiyo images 3" height="200" />
    <img src="assets\images\graphics\weekend4-8.png" alt="nakiyo images 4" height="200" />
    <img src="assets\images\graphics\weekend5-8.png" alt="nakiyo images 5" height="200" />
    <img src="assets\images\graphics\weekend6-8.png" alt="nakiyo images 6" height="200" />
</details>

<details><summary>View final "Nakiyo" products</summary>
Dozens of Nakiyo brand products are now for sale on Chef's depot, Seattle Cutlery, and numerous stores.
    <img src="assets\images\graphics\nakiyo1.png" alt="Black nakiyo knife" />
    <img src="assets\images\graphics\set1a.webp" alt="wood japan nakiyo set" />
</details>

<h3 id="concept-art">Concept Art</h3>
<p>During high school, I had dreams of becoming a concept artist for big studios, for both film and videogames. I spent thousands of hours drawing, creating new designs, and watching tutorial videos online. I am entirely self taught.</p>
<details><summary>Concept Art</summary>
Concept art created in 2013-2014 for Muse Games New York, RSI, and CCP Games and on commission.
Additional artworks on are on my artstation account. patrickobrien.artstation.com
<img src="assets\images\graphics\character-concept.jpg" alt="character concept art" />
<img src="assets\images\graphics\robot.jpg" alt="character concept art" />
<img src="assets\images\graphics\star-citizen.jpg" alt="character concept art" />
<img src="assets\images\graphics\tank.jpg" alt="character concept art" />
<img src="assets\images\graphics\hl3.webp" alt="half life fanart" />
</details>

<h3 id="association-for-computing-machinery">Association for Computing Machinery</h3>
<p>While I was an officer for the UWB ACM, I designed posters, stickers, magnets, t-shirts, and websites for events.</p>
<details><summary>UWBHacks Event</summary>
A magnet that I designed for the event.
<img src="assets\images\graphics\event-magnet.jpg" alt="uwbhacks magnet retro 80s" />
</details>
<p>Additional projects to be added</p>]]></content><author><name></name></author><summary type="html"><![CDATA[skills used: adobe photoshop adobe illustrator photography digital painting]]></summary></entry><entry><title type="html">catching a thief</title><link href="https://cforcomputer.github.io/the-spycam.html" rel="alternate" type="text/html" title="catching a thief" /><published>2021-12-30T00:00:00+00:00</published><updated>2021-12-30T00:00:00+00:00</updated><id>https://cforcomputer.github.io/the-spycam</id><content type="html" xml:base="https://cforcomputer.github.io/the-spycam.html"><![CDATA[<p>skills used:</p>
<ul>
  <li>networking (server config)</li>
  <li>PCB wiring</li>
  <li>arduino coding</li>
  <li>out-of-the-box thinking</li>
</ul>

<p><img src="assets/images/projects/hacked-min.jpg" alt="The original spy camera prototype" /></p>

<h3 id="the-oatmeal-had-vanished">The oatmeal had vanished.</h3>

<p>Nothing was off limits, the bag was less than a euro and the invisible thief had struck again. For months things had been going missing. From expensive meats, to yoghurt, to half eaten sandwiches. You couldn’t buy food, put it in the fridge or your box and expect it to still be there in the morning.</p>

<p>Was it one person? Multiple? Nobody could be sure, and mistrust had fouled the usually jubilant atmosphere of the StayOkay Hostel. We had been tolerating the theft for months, but as time progressed the thief grew increasingly emboldened in their success. Food was vanishing during the day a few hours after it had been bought.</p>

<p>The oatmeal was their final mistake. That seemingly inconsequential bit of food was what gave me the motivation to bust the traitor.</p>

<h3 id="working-the-problem">Working the problem</h3>

<p>I had to rapidly find a way to catch the thief, and the simplest way I could think of was with a hidden camera. Enter the all-in-one wonder-child the ESP32 microcontroller. After reaching out to my friends that specialize in electrical engineering, I was able to discover that this particular, $10 microcontroller had a built-in webcam, bluetooth, AND Wi-Fi.</p>

<p>I ordered the controller, along with a power adapter for USB type-A to TTL Serial UART adapter, jumper cables, and a 20,000 mAh powerbank. The total cost was under $30.</p>

<p>After it arrived, I connected the microcontroller to the serial adapter and then flashed open source facial recognition AI project files to the microcontroller using the Arduino IDE. I used this particular code because it included a webserver that would stream the live video over the hostel Wi-Fi.</p>

<p>It was then a simple matter of obtaining the credentials of the hostel network. I could then view the camera feed from my laptop and record it from there. I didn’t have to deal with checking local storage. That way, if the camera was discovered and stolen as well, I would see their face.</p>

<p>I placed the setup in an empty egg carton with a small hole in the front for the camera. Then I placed it in my food box and left it overnight.</p>

<p>I dialed in the IP, the camera feed was grainy, but it was enough. The operation was a go. I hit the record button and went to sleep.</p>

<p>The next day, I giddily opened the save file on my computer.</p>

<h3 id="results">Results</h3>

<p>The video had been corrupted. I was devastated. Then I remembered that I had woken up early in the morning, around 3:30 am to get a drink of water. I had paused and restarted the stream recording then.</p>

<p>I opened the broadcast software I was using to record called OBS, and saw with relief that the recording was still going. I crossed sweaty fingers and hit the stop button. The video file was nearly six hours long, but it successfully compiled.</p>

<p>The very first day, the very first test, and just ten minutes into the recording, I had him.</p>

<p>To be absolutely sure I had the right person, I dropped the bombshell that evening when everyone was eating dinner. “I may or may have footage of the thief taking everyone’s food.” I said slyly over a plate of chicken stirfry.</p>

<p>The reaction was instantaneous as the other students did a double take. Then they started to ask me in excitement if they could see the video. By the time I returned, everyone in the hostel was gathered around a table.</p>

<p>“I’m not absolutely sure it’s him,” I said cautiously, “but I want you guy’s to see if he’s taking your food or not.”</p>

<p>“That’s my chicken!” A girl cried out.</p>

<p>“Is that our box? That’s our box!”</p>

<p>“I’m gonna go show this man some Irish love.” A student said in a thick accent.</p>

<p>I had caught the thief. Or at least one of them.</p>

<p>Over the next few days, the manager of the hostel confronted the man and got him to admit that he had stolen our food, and that he wouldn’t steal anymore. It was a victory, seeing that without the bluff, the footage could never be used legally. In a week he was gone.</p>

<p>The mood had shifted, and I was met with glowing smiles and happy conversation. I sat and ate my oatmeal in peace.</p>

<p>Nobody’s food was ever stolen again.</p>

<h3 id="photos">photos</h3>
<p><img src="assets/images/projects/food-thief.webp" alt="The thief captured on camera" /></p>]]></content><author><name></name></author><summary type="html"><![CDATA[skills used: networking (server config) PCB wiring arduino coding out-of-the-box thinking]]></summary></entry><entry><title type="html">Building keyboard from scratch</title><link href="https://cforcomputer.github.io/keyboard.html" rel="alternate" type="text/html" title="Building keyboard from scratch" /><published>2020-10-22T00:00:00+00:00</published><updated>2020-10-22T00:00:00+00:00</updated><id>https://cforcomputer.github.io/keyboard</id><content type="html" xml:base="https://cforcomputer.github.io/keyboard.html"><![CDATA[<p>skills used:</p>
<ul>
  <li>soldering</li>
  <li><a href="https://github.com/cforcomputer/patkey">coding in C (flashing firmware, QMK)</a></li>
  <li>creative</li>
  <li>PCB design</li>
</ul>

<p><img src="assets/images/projects/desk-extractor.jpeg" alt="My desk at home" /></p>

<p>For this project I selected an ergonomic design from a niche keyboard maker in Japan called Foostan. Rather than building the keyboard from a kit, I decided to assemble it completely from scratch, even to the extent of having the Printed Circuit Board (PCB) manufactured and shipped from overseas.</p>

<p>The first step was to order the Printed Circuit Boards (PCBs). I decided to use the PCB manufacturer JLCPCB, a Chinese company specializing in low quantity prototyping. I found a blueprint for Foostan’s Corne keyboard freely available on Github. This particular keyboard was the most appealing to me for its cyberpunk aesthetic. My next step was to convert the PCB blueprint to a GERBER format using KiCad and submit my order to JLC. I also ordered the plates to hold the keycaps from JLC, using blank PCB boards with sized holes and no circuits.</p>

<p>Then it was time to order the backplates. I wanted them to be transparent so that the RGB LEDs would shine through and illuminate the desk. For this, I opted for simple laser cut acrylic panels. I submitted the order specifications to a company called Ponoko.</p>

<p>I identified the screws and spacers that would fit the holes in the PCB and plates, and ordered them from Aliexpress, along with the LED screens and necessary microcontrollers (one for each half of the keyboard). I also used LCSC, a sister company to JLCPCB that sells electronic components direct from Shenzen.</p>

<p><img src="assets/images/projects/sealed-pcb.jpeg" alt="My PCB arrives from China" />
Finally, the packages arrived over several months and I was able to start building. I bought a duct fan and ran it out of my window to make sure my bedroom remained free of fumes. A bit overkill, but I thought it was fun it make.</p>

<p>After soldering and final assembly, I flashed a custom configuration package to the microcontrollers using an open source software called QMK Toolbox. I created a custom cyberpunk logo with Japanese text in photoshop to display on the keyboard LED.</p>

<p>For the switches and keycaps, I recycled the cherry reds from an old, gifted corsair K65. I drastically underestimated the amount of desoldering required, I do not recommend anyone do this. I did not have a solder vacuum -_-</p>

<p>The final product was connected together with a simple aux cord, the same you’d use for connecting a pair of headphones.</p>

<p>Because the keyboard did not have the standard number of keys, there were multiple layers accessed by pre-programmed key combinations. For this reason, the keyboard had quite the learning curve, it was like touch typing, but with three new mini-keyboards to memorize.</p>

<h3 id="photos">photos</h3>
<p><img src="assets/images/projects/laser-cut.jpeg" alt="Laser cut acrylic for the frame" />
<img src="assets/images/projects/keycaps.jpeg" alt="Keycaps retrieved." />
<img src="assets/images/projects/split-kb-final.jpeg" alt="The final result" /></p>]]></content><author><name></name></author><summary type="html"><![CDATA[skills used: soldering coding in C (flashing firmware, QMK) creative PCB design]]></summary></entry><entry><title type="html">oakhold group llc</title><link href="https://cforcomputer.github.io/oakhold.html" rel="alternate" type="text/html" title="oakhold group llc" /><published>2019-06-20T00:00:00+00:00</published><updated>2019-06-20T00:00:00+00:00</updated><id>https://cforcomputer.github.io/oakhold</id><content type="html" xml:base="https://cforcomputer.github.io/oakhold.html"><![CDATA[<h2 id="oakhold-group-llc-project">oakhold group llc project</h2>
<p><img src="assets\images\projects\oakhold-logo.jpeg" alt="oakhold group logo" /></p>

<p><a href="https://opencorporates.com/companies/us_wa/604477197">view company registration record</a></p>

<p><strong>skills used:</strong></p>
<ul>
  <li>accounting</li>
  <li>client scouting</li>
  <li>creativity</li>
  <li>engineering</li>
  <li>marketing</li>
  <li>web design</li>
  <li>packing/shipping</li>
  <li>customer service</li>
  <li>banking</li>
  <li>us llc taxation</li>
</ul>

<p>When I was 21, I was inspired to start my own company, such as other unicorn founders had done at a similar age: Mark Zuckerberg, Bill Gates, Steve Jobs to name a few. Of course, the stars had not aligned to provide a genius coworker, an incredible idea, nor was I born into a time a new technology had just begun to change the face of the world (the internet). I was a bit late to the party, but I wasn’t about to let that stop me from trying.</p>

<p>After my registration was processed and I had my license, I spent all day riding my bike on the ferry from my home, and through the city to reach the bank. “What’s the special occasion?!” A man cried out as I barreled past, my freshly ironed black pants and white shirt flapping in the wind. I was about to open my first corporate bank account, and I was thrilled.</p>

<p><img src="assets\images\projects\license.png" alt="my business license" />
My first few projects with Oakhold were web design related. I continued to work for Optimer International, the company behind Seattle Cutlery, where I had worked as a business strategist. This time as a contractor. I also began to work for the University of Washington at the same time. I would work on websites in the evening, and then finish my homework. On top of scholarships and the money I made from my other job, I was actually able to save money after paying tuition, instead of going into debt like many other students.</p>

<p><img src="assets\images\projects\office-seattle.jpg" alt="My office where I worked for seattle cutlery" /></p>
<blockquote>
  <p>My Seattle office where I worked for Optimer International.</p>
</blockquote>

<p>COVID-19 disrupted my flow, and I decided to shift strategies as the global pandemic came into full effect. I built a few more websites for family friends during this time, but continued to brainstorm potential new business ideas. I landed on the idea of refurbishing and reselling used electronics. Living on the island, there wasn’t any similar competitor, and there were plenty of wealthy people with too much stuff.</p>

<p>After posting advertisements on the local version of craigslist (called drewslist), people quickly began to respond. The respondees wanted to give away everything from old macbooks to vintage record players. People had old phones, old CRT televisions, speakers, you name it. I made a deal with my friend Quinn, whose dad would drive us around in his van to pick up the larger items. In return Quinn could keep a share. I also occassionally would buy used computers from people. Someone had been using one of the original macintosh kits as a doorstop for their business for over 20 years, and I made a deal to give them a percentage of what I sold it for. I would also buy items from people outright.</p>

<p>I didn’t drive, and it was a big limitation for me in rural America. The bus that used to run past my house had been removed from the schedule years before due to budget cuts. However, around this time my mom decided to buy an e-bike. It had just enough battery charge to get me to the post office and back to the house. I started strapping boxes to the back and riding off to the post office several times per week.</p>

<p><img src="assets\images\projects\loaded-bike.jpg" alt="the bike loaded up with boxes for post office run" /></p>

<p>In order to save time, I rented a space in a pirate-themed thrift store called <a href="https://goo.gl/maps/JxpfVZazajBzjp3R6">Second Hand Booty</a>, and I would keep my boxes there and take them out the back, the post office was just across the street.</p>

<p>During the pandemic, I also spent a signficant amount of time working on my idea for a mechanical keyboard startup. I spent hours in my room learning how to build a keyboard from scratch. You can read more about my keyboard assembly project <a href="https://cforcomputer.github.io/keyboard.html">in this post</a>.</p>

<p>Using the parts that I had built, I began to sell the PCBs and other components in kits on my Ebay store. I would buy PCBs for ~$0.50 in bulk and then sell them for $10+ each. This business, combined with the electronics resale, became the outsized part of my income during 2020. I also experimented with silicon moulding keycaps, which is what the vacuum chamber on my desk was for. I also had created a web store called openkeyboard.com, which I wanted to be the Amazon equivalent for anyone to sell parts for their custom mechanical keyboard builds. I planned to move my entire business to the website.</p>

<p><img src="assets\images\projects\office-space.jpg" alt="my bedroom became an lab space in 2020" /></p>

<p>Ultimately, after I obtained my Italian passport in 2021 after several years of collecting documents, and waiting over a year for an appointment, I fell in love with the idea of moving to Europe. I put my business plans on hold, bought a plane ticket, and moved to Amsterdam to begin my classes at the University of Amsterdam. There is a lengthy and seemingly expensive process for registering a foreign business in The Netherlands, so I put my plans on hold. Perhaps, I reasoned, when I am settled again I will try giving the business another shot. For now, I want to see the world, and experience everything I never tried as a teenager, developing myself to be more confident, well rounded, independent, and healthy. It was time to leave my island for good, and see what the world had in store for me.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[oakhold group llc project]]></summary></entry><entry><title type="html">hackathons</title><link href="https://cforcomputer.github.io/hackathons.html" rel="alternate" type="text/html" title="hackathons" /><published>2019-04-20T00:00:00+00:00</published><updated>2019-04-20T00:00:00+00:00</updated><id>https://cforcomputer.github.io/hackathons</id><content type="html" xml:base="https://cforcomputer.github.io/hackathons.html"><![CDATA[<p>skills used:</p>
<ul>
  <li>python</li>
  <li>C#</li>
  <li>html</li>
  <li>css</li>
  <li>javascript</li>
  <li>java</li>
  <li>graphic design</li>
  <li>virtual reality (unity)</li>
  <li>cloud infrastructure
    <ul>
      <li>AWS</li>
      <li>GCP</li>
      <li>Azure</li>
      <li>DigitalOcean</li>
    </ul>
  </li>
  <li>project management</li>
</ul>

<h3 id="uwbhacks-2020-uwbhacks-the-cloud---unemployer">uwbhacks 2020 (uwbhacks the cloud) - “Unemployer”</h3>
<p><a href="https://devpost.com/software/unemployer">view project</a></p>

<p>I was the organizer for this campus hackathon. I ran a team of over 20 people, learning valuable lessons in how to manage and organize individuals for a large project. We had weekly meetings for 6 months, along with additional specialized team meetings to address specific problems.</p>

<p>2020 was the first year that UWB ACM received official sponsorships for the event. We were able to receive prizes for participants (free credits, physical prizes, and more) from DigitalOCean, Microsoft, and Google. We had employee volunteers attend from Microsoft and Google.</p>

<p>The event received over $12,000 in funding allocation from the University of Washington events committee, and we were allocated two buildings and an auditorium venue. We had over 300 attendee registrations, typically in the past we had seen upwards of 200 attendees. However, the event took place in May 2020, just after the start of the pandemic, so all physical events had to be canceled.</p>

<p>The final event was held online, much of the plans had to be modified or scraped. We built a special website for the hackathon for user registrations. It was a moderate success, with around 150 attendees at its peak. I look forwards to applying the skills that I learned in other large projects, and now understand in depth the importance of involved and exceptional leadership to the success of a team project.</p>

<h3 id="defhacks-2019---simblu">defhacks 2019 - “Simblu”</h3>
<p><a href="https://devpost.com/software/simblu">view project</a></p>

<p>For this project we had to use a REST API from the event sponsor company Even. We decided to build a VR application that would replace the traditional Bloomberg terminal used in stock trading. The virtual Bloomberg terminal would allow users to view and sort the REST API data. I had the idea that websites could be monetized like an app store. You would purchase the VR version of a website within VR environment, allowing for increased functionality.</p>

<h3 id="dubhacks-2019">dubhacks 2019</h3>
<p>For dubhacks 2019 my group worked with artificial intelligence neural networks and computer vision to recognize doorframes in images using python, training our own model.</p>

<h3 id="uwbhacks-2019---crobber">uwbhacks 2019 - “Crobber”</h3>
<p><a href="https://github.com/Chris-Johnston/CROBBER">view project</a> | <a href="https://youtu.be/9xEMs7dKtNo">watch video presentation</a></p>

<p>I was a volunteer mentor for this event, helping other students complete their projects. With the other volunteer mentors, I helped to create a fun social media website for “crobs”, which is a funny name for a crow. The common nesting ground for all of Seattle’s crows is the University of Washington Bothell campus. Every night the skies run black with crows, and they cover everything, so we thought why not make them a social media platform?</p>

<h3 id="dubhacks-2018">dubhacks 2018</h3>
<p><a href="https://github.com/mkhsu/PanoPro-Transcriber">view project</a></p>

<p>I worked on a team to develop Panopro. It’s an application that would take the audio from live lectures and transcribe them to a text file. Once transcribed, it summarizes the key points of the lecture, writing the notes for you, whether you actually attended the lecture or not. I worked with a team of 5 people to complete the project during the two day event.</p>

<h3 id="uwbhacks-2018">uwbhacks 2018</h3>
<p>I also volunteered for this event, helping out around the hackathon.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[skills used: python C# html css javascript java graphic design virtual reality (unity) cloud infrastructure AWS GCP Azure DigitalOcean project management]]></summary></entry><entry><title type="html">building a wiki</title><link href="https://cforcomputer.github.io/evelopedia.html" rel="alternate" type="text/html" title="building a wiki" /><published>2018-05-09T00:00:00+00:00</published><updated>2018-05-09T00:00:00+00:00</updated><id>https://cforcomputer.github.io/evelopedia</id><content type="html" xml:base="https://cforcomputer.github.io/evelopedia.html"><![CDATA[<p>skills used:</p>
<ul>
  <li>PHP</li>
  <li>CSS</li>
  <li>HTML/XML</li>
  <li>REST APIs</li>
  <li>SQL</li>
  <li>marketing</li>
  <li>apache</li>
  <li>SSO</li>
  <li>animation design</li>
  <li>graphic design</li>
  <li>open source</li>
  <li>javascript</li>
  <li>python (web crawling)</li>
</ul>

<p><img src="assets/images/projects/moving-banner.gif" alt="Evelopedia homepage animation" /></p>

<p>EVElopedia was my first large-scale, persistent website project, created in 2018. EVElopedia is an open source wiki project that I built using Mediawiki, the foundation of Wikipedia. I designed my own skin, closely modeled from pictures of a defunct game forum with strong nostalgic appeal.</p>

<p>The skin is available on <a href="https://www.mediawiki.org/wiki/Skin:Eveskin">MediaWiki.org</a> as an official release.</p>

<p>You can see the sourcecode for the skin <a href="https://github.com/cforcomputer/eveskin">on my Github.</a></p>

<p>The hosting was through a Google Cloud – Linux, Apache, MySQL, PHP (LAMP) tech stack. EVElopedia was a deep dive into the finer elements of HTML, CSS, and the inns and outs of databases, SSO, user verification, and managing my first open source project, with over 15 individual contributors on my Discord Server at its peak.</p>

<p>I created all the graphics for the website, and built a web crawler to move posts from the <a href="https://archive.org/">archive.org</a> version to the new, fresh site database.</p>

<p>The project was discontinued in 2019.</p>

<h3 id="photos">photos</h3>
<p><img src="assets/images/projects/Evelo.png" alt="Evelopedia website" /></p>]]></content><author><name></name></author><summary type="html"><![CDATA[skills used: PHP CSS HTML/XML REST APIs SQL marketing apache SSO animation design graphic design open source javascript python (web crawling)]]></summary></entry></feed>