Revit Rich Text Editor

Designed and developed a rich text editor extension for Autodesk Revit to supplement the basic built-in text editing. Features include:

  • Lists with indentation levels
  • Customizable bullet points
  • Tables
  • Columns
  • Headings
  • Bold, underline, italics
  • Images
  • Superscript and subscript

TL;DR: Euromaidan and the Ukrainian Crisis

An Absurdly Brief Intro to Ukraine

Ukraine is, by area, the largest country located entirely in Europe. It has thousands of years of history, and the capital city predates Moscow by hundreds of years.

Ukraine spent most of the last few hundred years under other nations, and historically it was usually split east-west, with the western portions under nations like Poland, Lithuania, and Austria, and the east under Moscow. This, along with massive ethnic cleansing and repopulation campaigns conducted by Russia in the 1930s, has resulted in an eastern population which often speaks Russian, has a large ethnically Russian minority, and tends to align itself closely with Russia in many ways. On the other hand, western Ukrainians usually speak Ukrainian and tend to align themselves with Europe.

I could talk for days about Ukraine’s history, but this is basically the minimum context you need to learn about the revolution.

The Orange Revolution

To discuss the 2014 revolution we need some more recent background, going back to the 2004 presidential election. The main candidates were Victor Yuschenko and Victor Yanukovych (I know, that’ll be easy to remember on the test – try remembering that “Yanukovych” almost has the word “anus” in it and he was the anus of the two). Yuschenko was generally favored in more progressive, Ukrainian areas in the west while Yanukovych was more popular in more conservative, Russified areas in the east. The election was marred with widespread voter intimidation and fraud, with exit polls giving Yuschenko the win by 3% but the official tally having Yanukovych as the winner by 11%.

This sparked the Orange Revolution, with massive protests across the country, but especially in the capital city of Kyiv. Ultimately the Supreme Court invalidated the election results and in the re-run Yuschenko won 52% – 44%.

“Together we are many” became the “official theme song” of the Orange Revolution, and the music video shows what it was like:

The Yuschenko Presidency

Yuschenko had run with a main campaign platform of fighting corruption. In late 2004, however, he was poisoned with what should have been a fatal amount of dioxin. The picture below shows his change in appearance as a result of the attempted murder:

Poisoned ex-Ukrainian president: 'I know what Putin fears' | UK News | Sky News

After this moment, he seemed to lose a lot of the “fight” in him and ultimately accomplished very little during his presidency. His approval ratings plummeted so much that he wasn’t even considered a realistic candidate in the next election.

In the 2010 election, Yuschenko ran again but only received 5% of the vote. The two main contenders were Victor Yanukovych and Yulia Tymoshenko. Yanukovych won 49% – 46%, and this is considered to have been a relatively fair election. Yanukovych had largely retained his earlier base while also winning over people who felt disenfranchised by Yuschenko’s failure to make progress in improving people’s lives.

The Yanukovych Presidency

Once in the presidential chair, Yanukovych began consolidating power for himself and acted very controversially. For instance, he declared that the Soviet genocide of millions of Ukrainians in 1933 was not actually a genocide. This would be similar to the president of Israel claiming that the Holocaust was not a genocide.

Furthermore, he took steps toward making Russian an official language, which would have further endangered the preservation of the Ukrainian language. He imprisoned Yulia Tymoshenko, his main political opponent, on trumped-up charges. He allowed the Russian Navy to keep its base on the Crimean peninsula despite the post-Soviet transitional period expiring. He even reverted the constitution to an older version which gave himself much more power. This was accomplished by declaring the newer constitution unconstitutional.

The last straw was when Yanukovych cancelled preparations for the European Union Association Agreement in November of 2013. Ukraine was working toward integration into the European Union, and this process has stiff requirements for anti-corruption and government transparency. Ukrainians tolerated many of Yanukovych’s actions simply because they believed things would get better so long as steps continued to be taken toward joining the European Union.

Once preparations were halted, people, especially young, west-looking students, were very upset. Mustafa Nayem, a Russian-speaking Ukrainian journalist of Afghan origin, posted on Facebook asking people to come out to the Independence Square in Kyiv to protest.

Translation: “Okay, let’s be serious. Who here would be ready to go to Maidan today by midnight? Party-poopers will not be taken into consideration. Only comments on this post with the words ‘I’m ready.’ Once there are over a thousand, we will organize ourselves.”

Early Days

These first protests were on November 21, 2013. This was the start of Euromaidan, which earned its name from a hashtag used on Twitter on that first day. The name stems from ‘Euro,’ as in Europe, and ‘Maidan,’ the Ukrainian word for ‘square.’ These early protests were quite small:

Just over a week later, on November 30, Berkut, the Ukrainian riot police, violently dispersed protesters on the square:

This use of violence on protests was unprecedented in independent Ukraine and never occurred during the Orange Revolution.

The Euromaidan protests had primarily consisted of students up until this point, but suddenly older generations came out onto the square in order to protect the rights of their children. While Euromaidan retained its original name, the actual goal of the revolution began to shift from fighting for European integration to fighting for the protection of fundamental rights. Riots broke out the next day, on December 1, and Berkut responded with an even more brutal crackdown:

The protesters, no longer feeling safe on the square, constructed barricades in a very Les Mis turn to the protests, occupying a large chunk of the center of the city for weeks.

Here are some pictures of the square during this period (many more here):

Here’s a translation of “Do you hear the people sing?” into Ukrainian showing what things were like during this period:

Even at night the protest area was often packed solid:

Dictatorship Laws and Hrushevskoho Riots


On January 16, what quickly became known as the dictatorship laws were “passed” in the Ukrainian parliament. In reality, the vote occurred much too quickly (in about 3 seconds) to actually be counted and was done with a raise of hands, despite Ukrainian law mandating the use of electronic voting machines. Many of the laws were not even made public until after the vote.

The laws were essentially clones of Russian anti-protest laws. They included a ban on distribution of “extremist materials”, which were broadly defined. The government also claimed permission to censor or shut off the internet altogether, and could now find people guilty without them being present in court. Most notably, all mass disruptions became illegal, effectively rendering the Euromaidan illegal.

Three days later, on January 19, the Hrushevskoho Street Riots broke out between protesters and riot police. The first deaths of the revolution occurred as violence intensified on both sides. Improvised weapons were used, including Molotov Cocktails and fireworks. The Berkut riot police often wrapped noise grenades with bolts and duct tape to create shrapnel.


Starting on January 23, Ukrainians began taking over Regional State Administration buildings in many oblasts (provinces), effectively ending central government control over many of them. In three of the regions, Volyn, Lviv, and Ternopil, a new government structure called Narodna Rada, or the People’s Council, came into power. Sergii Gorbachov chronicled the takeovers as they occurred by posting maps on Facebook. (Note for the graphic: The Party of Regions was the ruling party under then-President Viktor Yanukovych)

Revolution of Dignity

On February 18, there was a peaceful march toward parliament. Unbeknownst  to the protestors, snipers were positioned on rooftops. They fired at the crowds in what was to become the largest bloodbath Kyiv had seen since the second World War. Riot police closed in on the square in an attempt to squeeze the protesters out. However, instead of running away, protesters held their ground and fought back with whatever they could find, going so far as to tear up the road and hurl hunks of it as police with guns closed in.

During the calmer moments of the revolution, ordinary people reinforced the barricades, replenished food stocks, and broke apart hunks of the road to be ready to use as projectiles:

One protestor played piano as the city burned:

The following video is an extremely intense and gory video from the revolution but does an incredible job of showing what it was like:

After 3 days of violence, the riot police retreated from the unyielding crowd.

Yanukovych fled the country and was impeached. The revolution succeeded. Those 100 people who died were immortalized with the name “Nebesna Sotnya,” which translates both to “Heavenly Hundred” and “Heavenly Battalion.”

The interim government was left with a destroyed city center and mess of a country, economically destroyed, greatly in debt, and filled with corruption in all ranks. They had a massive task of rebuilding before them.

Less than a week later, Russia would invade Crimea and create the artificial Pro-Russian Crisis in Ukraine.


On February 26, less than a week after the revolution, Russian troops invaded Crimea, a large Ukrainian peninsula. While Russia originally claimed these forces were Crimean natives, it is now well known that they were regular Russian troops, albeit without any identifying insignia. The Ukrainian military, which had been systematically destroyed under the Yanukovych regime, proved unable to cope and gave up the peninsula with little resistance.

After cutting off access to Ukrainian television, Russian television became the only source of news in Crimea. It became flooded with propaganda claiming “Nazis” and “fascists” had taken over in Kyiv and were killing all the Russians in Ukraine. The troops then took over the Crimean Rada, or parliament, and held a referendum on the status of Crimea. The referendum offered two choices: to declare independence from Ukraine, or to join the Russian Federation. There was no option to maintain the status quo as part of Ukraine.

The official results indicated that the vast majority, 96%, of Crimeans wished to join the Russian Federation. The referendum was almost certainly falsified, as polls of the peninsula indicated the actual result to be between 30-40%, even at the height of the hysteria caused by propaganda. Furthermore, no international observers were permitted to monitor the election.

Crimea was officially annexed by Russia on March 21, and the annexation is only recognized by Russia and a handful of other countries, while it remains unrecognized by the European Union and United States. Since the takeover, massive human rights violations have taken place. The Ukrainian language has been de facto banned, and dissidents are welcomed with either a damp jail cell or removal from the peninsula. It was one of the most blatant landgrabs in Europe since the German takeover of Sudetenland in 1938.


Donbas (Eastern Ukraine)

Donbas is the most Eastern region of Ukraine and consists of the Donetsk and Luhansk oblasts. Following the Crimean annexation, rebels stormed the Regional State Administration buildings in Donetsk and Luhansk demanding that a similar referendum be held in their cities.

The Donetsk People’s Republic was declared April 7, 2014, and the Luhansk People’s Republic was declared on April 27, 2014. On May 11, a referendum was held in both. They reported a large majority believing in the legitimacy of the self-declared republics. Irregularities were rampant including allowing people not on the voter lists to vote, allowing ballot stuffing, and having far fewer voting stations open than necessary. This created long lines and ergo the illusion of popularity for the media. There was no international observation.

On May 24, the two republics formed a de jure union known as Novorossiya, or “New Russia,” an aged term for the region used when it was conquered by the Russian Empire in the late 1700s.

War in Donbas

The terrorists then took over major cities in the region: Donetsk, Luhansk, Sloviansk, Kramatorsk, Horlivka, Mariupol, and others.

In response, the Ukrainian government began to organize an ATO (Anti-Terrorist Operation). Many volunteer battalions also sprung up, motivated by seeing the pitiful shape the Ukrainian military was in. The most well known of these is the Donbas Battalion, which, at the time of this writing, had roughly 900 volunteers.

The Russian terrorists held their ground at first, but the Ukrainian army quickly organized itself and began to make progress into the rebel-held territory. The Russian Federation continued to secretly provide weapons and “volunteers” to the terrorists, but the lack of local support allowed the Ukrainian soldiers to gradually reclaim territory.

One of the first major skirmishes was the Battle of Donetsk Airport, which ended in a Ukrainian victory and a destroyed airport.

On 17 July, flight MH17 was shot down over eastern Ukraine. It was shot down by rebels who had been discretely given an anti-aircraft missile by Russia. The rebels believed the flight was a Ukrainian military target and actually bragged online about having shot it down before it became clear that they had killed nearly 300 innocent civilians.


Since then very little has changed. Russia retains control of Crimea. Eastern Ukraine continues to be occupied and Russia keeps it destabilized just enough that Ukraine needs to keep pouring troops and money into the region, but is not so overtly aggressive that the international community intervenes. Ukraine also remains heavily reliant on Russia economically resulting in a strange situation where the two countries are de facto at war but both are pretending they’re not.

Additional Resources


This article was adapted and updated from an article I wrote in 2014.

My PHP Dev Environment


Most of the sites I build are in PHP, built on top of WordPress or MediaWiki, as I can build these fairly quickly and host them cheaply, requiring minimal maintenance.

It took me a while to come up with a comprehensive setup, so I hope this helps someone in the future!

  • CodeAnywhere (Starting at $8/month)
    • Online IDE with included online dev server
    • No need to fiddle with a local dev server and it’s easy to edit any old projects even after getting a new laptop
  • CloudWays (Starting at $8/month)
    • Managed PHP Cloud Hosting with staging and tons of other great features
  • Github
    • Online Git repo. I use this both for backing up and as part of the deployment process.
    • Free for open source
    • $7/month for unlimited private repositories

How to configure these to work together. This tutorial is specifically for WordPress, but can be adapted for any PHP application, although DB and content migration might be more manual.

  • Cloudways:
    • Create a WordPress application
    • Create a staging application for the application
    • Connect your Cloudways Application to a Github repository
      • Follow step 1 of this guide on the STAGING application
      • Follow step 2 of the guide but READ THE MODIFICATION BELOW FIRST
      • Follow step 3 of the guide
      • Screen Shot 2019-10-19 at 11.20.46 PM
    • If necessary, enable elastic SMTP on your cloudways server
      Screen Shot 2019-10-19 at 11.58.37 PM
  • CodeAnywhere
    • File –> New Connection –> Github
    • Select the repo. UNCHECK “Autodetect Stack” before clicking next
    • Select “PHP Development Stack” (I use the Ubuntu one, but it’s your preference)
    • Right Click Project –> “Open SSH Terminal”
      • wget
      • tar –strip-components=1 -zkxf latest.tar.gz
        • It is expected that you will get “Cannot open: File exists” and “Exiting with failure status due to previous errors” errors
    • Right Click Project –> “Info” –> Open phpmyadmin
      • User: root, Pass: empty
      • Create a database for wordpress
    • Load the sandbox ON HTTPS and go thru the install process
    • Add define( 'FS_METHOD', 'direct' ); to wp-config.php (needed for plugin updates to work)
    • Fix SSL issues: “Really Simple SSL” plugin
      • You will get a fucked up page while getting it set up
    • Install WP Sync
      • And wp-sync-db-media-files
    • Install Better Search Replace
    • Submit any updates to git
      git add . && git commit -m “progress” && git push
  • Cloudways
    • Click “Start Deployment” then “Pull” on the staging server
    • Open the staging server site
    • Enable WP Sync DB and WP Sync DB Media Files
    • Migrate the DB to staging
      • Backup the existing DB
      • Migrate media too
      • Save the profile
    • Migrate DB and Save
    • Confirm the site is working correctly
    • Use the staging application tools in the prod app to migrate
      Screen Shot 2019-10-19 at 11.53.39 PM

Raid on the North Pole

The Raid 0n the North Pole game series was originally conceived by Mark Zawadiwsky at a summer camp in Vovcha Tropa many, many years ago.

Raid on the North Pole

Screen Shot 2019-06-28 at 2.14.01 AM

This is the original Raid on the North Pole, completed in Wildwood Ukie Week 2007. It was built using YoYoGames GameMaker. It was presumed lost for years, including throughout the creation of both RONP II and III, until Diko Stasiuk found an old CD of the software among his old things. Due to a bug, it no longer worked on modern computers and required 32-bit Windows XP to run, an increasingly rare OS to have. In 2019, Danylo found this sketchy software which repaired legacy GameMaker games, preserving the magic of this original game for the future.

Note: The last two levels are impossible to beat. Santa’s health just goes negative and you can’t advance. You can press ‘n’ to skip any level.

Installation Instructions

  • Downloads
  • Mac or Linux
    • Download BOTH the original installer and the FIXED version
    • Install PlayOnMac or PlayOnLinux
    • Locate PlayOnMac in your Applications folder
    • Right Click –> Open
    • Screen Shot 2019-06-28 at 12.11.14 AM
    • Install a program
    • Screen Shot 2019-06-28 at 12.11.21 AM
    • Install a non-listed program
    • Screen Shot 2019-06-28 at 12.11.49 AM
    • Just keep clicking “Next” on the defaults
    • Screen Shot 2019-06-28 at 12.12.00 AM
    • Screen Shot 2019-06-28 at 12.12.12 AM
    • Screen Shot 2019-06-28 at 12.12.28 AM
    • Click “Install”
    • Screen Shot 2019-06-28 at 12.12.56 AM
    • Browse to the extracted Installer (not the zip file)
    • Screen Shot 2019-06-28 at 12.15.41 AM
    • Screen Shot 2019-06-28 at 12.15.47 AM
    • Screen Shot 2019-06-28 at 12.15.56 AM
    • Screen Shot 2019-06-28 at 12.16.12 AM
    • It might crash. That’s OK. Just click “Close”.
    • Screen Shot 2019-06-28 at 12.16.25 AM
    • It might crash. That’s OK. Just click “Next”.
    • Screen Shot 2019-06-28 at 12.16.40 AM
    • Choose “Raid on the North Pole.exe” for the shortcut
    • Screen Shot 2019-06-28 at 12.17.05 AM
    • “I don’t want to make another shortcut” –> Next
    • Screen Shot 2019-06-28 at 12.17.12 AM
    • Click “Open the directory”
    • Delete all the files in the “Raid on the North Pole” directory
    • Replace them with the files from the FIXED version
    • Go back to PlayOnMac
    • Double click “Raid on the North Pole”
    • If this still has issues, you might need to switch to another version of Wine (Confirmed working: 4.11).
  • Windows
    • Download the FIXED version
    • Extract the files
    • Run “Raid on the North Pole.exe”


Screen Shot 2019-06-28 at 12.33.34 AM Screen Shot 2019-06-28 at 12.33.59 AM

The second edition, completed in Wildwood Ukie Week 2010 (bugfix1, which made it work on computers with multiple cores, in April 2011) is known for its stunning graphics, smooth gameplay, and coherent plotline. It was written completely from scratch in Java, with graphics created in MSPaint. Yes, really.

Installation Instructions

  • Download
  • Extract the contents of the file
  • Open the extracted folder
  • Mac
    • Double-click ‘RONPII.jar’
    • You might need to install Java first if this doesn’t work
  • Windows
    • Double-click ‘run.bat’
    • TO EXIT PRESS ALT+F4 (possibly FN+ALT+F4)
    • You might need to install Java first if this doesn’t work
  • Linux
    • If you’re using Linux I’m sure you can figure it out


Screen Shot 2019-06-28 at 12.30.53 AM

In the third and final (for now) installation of the RONP series, written in Wildwood Ukie Week 2011, Victor Yanukovych tries to take over the world using a time machine and you need to stop him. Yes, we basically predicted Euromaidan.

Installation Instructions

  • Download RONPIII Beta
  • Extract the contents of the file
  • Open the extracted folder
  • Mac
    • Double-click ‘mac.jar’
    • You might need to install Java first if this doesn’t work
  • Windows
    • Double-click ‘windows.bat’
    • You might need to install Java first if this doesn’t work
  • Linux
    • If you’re using Linux I’m sure you can figure it out


I’m frequently asked about pysankarstvo resources. I’ve tried a number of suppliers and outlined my recommendations below:

  • Traditional Kistky
  • Electric Kistky
    • Most comfortable: Ukrainian Gift Shop – Luba’s Electric
      • Note: UGS Kistka tips have a tendency to deform. The WAS tips are compatible with it and I recommend using those instead.
    • Best tips: Wax Art Supply
      • I almost always use tips #1, #2, and #3. These are the “must-haves”.
      • I rarely use #0 for extremely fine lines on chicken eggs, but it becomes clogged easily.
      • I never use smaller than #0
  • Kistka Tip Cleaning
  • Dyes
    • Ukrainian Eggcessories: These are my favorite dyes. I use the 28-pack, but they have smaller packs available too.
      • EXCEPTION:  The UE black dye is weak due to Canadian environmental laws, which prohibit Acid Black 1. I buy UGS Black instead. The UGS Black should not be flushed down the drain.
    • Ukrainian Gift Shop: These can work well if you’re using the UGS books, as the colors will match up exactly and you can be sure that the dyes will work well in the recommended orders.
  • Dye Jars
    • 16oz Clear Plastic Wide Mouth
      • Note: Because these are plastic, you cannot pour hot water in them or they will melt. I mix in a Pyrex container, wait for it to cool, and then pour into the jar.
  • Ping-pong balls: Any brand works fine, I use them to hold blown eggs under the surface of the dye
  • Books
  • Gloves
    • White Cotton Gloves – I use a single glove on my left hand for manipulating the egg so I don’t smudge the dye
  • Paper Towels
    • Any brand is fine, but if possible the Viva Signature Cloth ones do the best job of not leaving residue
  • Wax
    • Sheet Wax
      • Ukrainian Eggcessories – These are great and typically what I use now. Typically don’t clog even the extra fine electric tips. The variety of colors is nice for complex designs
    • String Wax — Much easier to use than blocks
      • Wax Art Supply – Well filtered; Don’t clog. Black or Clear
      • PUSA, UGS – These clog the kistky. DO NOT USE.
    • Wax blocks
      • I use these for classes because they’re cheap. Any brand will do, as long is it’s definitely beeswax (some brands lie and give you paraffin, so stick with a pysanka-specific brands)
    • White Wax
      • Mix ~10 clear WAS strings to one white crayola crayon for use on black pysanky
  • Egg Blowing
    • Best: Ukrainian Gift Shop – Electric Egg Blowing Kit
      • Unfortunately these seem to have been discontinued after Luba Perchyshyn’s passing in 2020
    • Budget: Better Than Blas-Fix
  • Acid
    • ACID Magic: To etch the egg or clean it back to white as the last step, dip the egg into Acid Magic while wearing gloves. Remove every 10 seconds and wipe to check progress. When complete, rinse with water to remove residual acid.
  • White Pencil
    • Bohin Extra-Fine Mechanical Chalk Pencil
  • Egg Cleaning
    • 1 drop Ivory Soap + 600mL water: Clean the egg with a toothbrush, then rinse with water
    • Vinegar: Soak the egg in vinegar for 30 seconds, dry, then begin working
  • Egg Cleaning – Wash Back
    • 1/3 Ivory Dish Soap + 2/3 Water
    • Use for washing the egg back to white with a soft-bristle toothbrush. Used for switching color families (e.g. red to blue)
  • Help

Major Suppliers:

  • Ukrainian Gift Shop (UGS)
    • The “standard” supplier. Most people are familiar with their dyes and frequently refer to them as standard shades (e.g. “UGS Orange”). They are nothing special but there is also nothing wrong with them and they are very reliable.
  • Ukrainian Eggcessories (UE)
    • Some of the best dyes, however their standard orange does not behave as a rinse and will not work with many of the diaspora resources, so be sure to buy their cleansing orange as a substitute for UGS Orange.
  • Best Pysanky (BP)
  • WaxArtSupply (WAS)
    • Formerly Folk Impressions (FI). Many people continue to use the old name, and lots of their products are still labeled with it.
  • EggstrArt
    • They have supplies for Polish and Lemko style drop-pull pysanky
  • JustEggsquisite
    • They have great scratch tools for scratched pysanky (“shkrobanki” or “drapanki”)
  • BabasBeeswax
  • Pysanky USA (PUSA) – Reopened as of January 2022 (have not looked through their new catalogue yet) Closed Indefinitely (owner Jim Hollock passed away in early 2021)
    Here are a few options for equivalents for some of the more popular equipment they sold:

    • “Setting Powder”: This is just granular citric acid. Buy it on Amazon and add a few granules to each of your dyes.
    • Waxmelter Tray: I would email them and ask for a custom order with extra cups.
    • Drapanki scratch tools: JustEggsquisite on Etsy for the manual tool, and a Dremel with flex shaft and engraving bits for everything else (WEAR A MASK WHILE DOING THIS, YOU WILL DESTROY YOUR LUNGS OTHERWISE)
    • Wax scratch tools: Use Pottery sculpting tools of your choice
    • Dyes: PUSA is famous for selling tons and tons of different shades, but I found that I end up not using most of them. Ukrainian Eggcessories or WaxArtSupply have plenty of variety without going overboard, and when you need something custom it’s usually easier to just mix a few dyes together to get the exact shade you’re looking for.

Digitizing Kodachrome Slides

My Nonna had some old Kodachrome slides she asked me to “develop at CVS”. Obviously CVS couldn’t do this so I tried scanning them, but because light needs to be shining through them from the other side, so they just come out black instead. Other guides suggested making contraptions on top of your scanner to reflect the light back down, but these did not work well for me.

There are expensive scanners you can buy for this purpose, or remote services you can send the slides to, but for just 2 slides I wanted to see if I could do something cheaply myself.

I ended up building this contraption, where I made my computer screen almost completely white (fullscreen TextEdit), hung the card a bit in front of it, and then took a picture with a nice camera.


The results were excellent!