Things orbital and not
My name is Artem, and Orbital Designs is what i call my little corner of the internet. While having a web site might sound old-fashioned these days, i prefer to have a place where i can keep track of all the things i made.
Since you are here, i probably bragged about something of mine somewhere and you liked it. In that case, you can find more of my cool stuff on the left, or more of my recent stuff below.
Professionally, i'm a programmer.
I've made things ranging from operating systems,
frameworks and programming languages to
games, universe sims and
A little of it can be found here, some of it was made for money, the rest of it is rarely seen by many eyes.
By hobby, i'm a hardware and electronics guy.
There i made things ranging from digital cameras,
molten salt batteries
and sound vision systems
e-book readers and tesla coils.
Best of that is open source or documented and can be found here, current projects are often posted about on Instagram.
I also like to write down random thoughts and occasionally dabbled at writing stories.
Comments here are a losing battle against spam, so the best way to reliably contact me is by e-mail.
Anyway, i hope you enjoy your time here and find something useful in the archives i collected.
-Artem "Artlav" Litvinovich
29.07.2018 - Years later, 4 years in 16 seconds
Today the camera has died.
More precisely, i opened it up for the yearly battery replacement and photo download, and once it was put back together the error light kept lighting up.
Turns out the card in it was no longer writeable.
Gonna try to replace it some time this week, meanwhile i feel like it's the right time to post the footage collected so far.
Here is it a noon every day. The best part of it i how the trees poof in blossom suddenly.
|Timelapse: 4 years of apples, centered at noon|
| Poof, blossom|
And here is the same closer to evening. You can actually see how the sun's elevation change as the times of the year go by.
The jitter in the sun represents the jitter in the camera's onboard clock.
|Timelapse: 4 years of apples, sun motion|
| Sun bobs up, sun bobs down|
So, how was it performing?
The batteries tend to last about 9 months, after which it starts losing frames at night.
The clock on it is a bit erratic and have drifted almost a full day over 4 years. Fortunately the drift is consistent so i can correct for it in post processing.
The sensor shows it's age, being 640x480 in the days of 4K being the norm and HD being the expected minimum.
All in all, i'm facing with a hard choice: Add more batteries so it'll last 5 years, or add a better sensor as well, and have to keep replacing the batteries every year...?
19.07.2018 - Summer cleanup
Finally cleaned up this place...
It's like digging through a memory attic.
Over 13 years:
-5 coding styles and formatting methods were used as the code evolved. You can date articles by them, the older the crutchier.
-8 design changes, with bits of old ones scattered around. Here and there pieces expected dark background.
-2.2 Gb of images and files. Back before image hosting this was the only way to share photos.
-4.6 Mb of apps. Really have to get that pascal->JS compilation working again.
-48 Mb of logs, since i last cleaned them in 2015. So many bots and auto-hackers...
-100 Kb of text. Articles and stuff.
-32 Kb of comments (after purging all the spambots). Not sure if i keep them open - i'd have to find a better captcha solution.
The last one is interesting - "people wrote back at me 30% as much as i wrote at them" sounds way better than "one comment per 50k visitors".
Got 30k visits since the start of the year, btw. So a comment should appear some time before the end of 2018. :)
TL;DR: For the first time in 10+ years this place is uniform in both code, formatting and design. Expect new stuff to appear!
26.04.2018 - The leaky sieve of the internet
So today i came across RFC 7858, which describes how to do DNS over TLS (aka HTTPS).
Since DNS is one of the last major protocols without a secure version of itself (meaning all your requests and responses are in plain text and not authenticated), i found it rather interesting. Turns out it's as simple as connecting to the resolver's port 853 with TLS and sending a TCP mode DNS request.
Naturally, i quickly put together a proxy-like thingy that listens to UDP port 53 on localhost, takes the DNS requests, converts the modes and forwards it over to Cloudflare's brand sparking new secure resolver, then converts and returns back the result.
For a total of a few minutes it looked awesome, as i stared at the output of the traffic analyses and saw nothing but encrypted mush. Then the euphoria worn off, and the reality took it's revenge.
You see, the internet was built on the basics of friendship and collaboration, so it's lower levels are all still a septic cesspool held together by trust and twisted wire cuttings, and whatever secure protocols are there still leak like a sieve.
So the secured DNS added almost no extra privacy - the domain names you are so cleverly trying to hide are still sent in plain text in the *handshake* part of HTTPS...
This problem, in turn, is being solved in TLS version 1.3, which is still a draft and by itself bangs against a lot of internet's thoughtful features that got rusted shut and had tunnels cut through them.
Still, a progress is being made, step by little step, of making this damn sieve waterproof one privacy-leaking hole at a time.
TL;DR: You tap your screen and stuff appears. A horrifying amount of scarily complex stuff is behind making that magic happen.
10.07.2017 - Bitcoin`s wave
What would happen if you were to graph the amount of Bitcoin left in every block over time as it evolve?
What if you also treat the graph as a sound spectrum?
I present to you the Bitcoin`s Wave and Bitcoin`s scream:
21.04.2017 - Winter way
Concrete road stretching to the horizon.
Trees along the edges. Twisted, dead.
Clouds, clouds, hanging low, grey and suffocating.
Sun above shining through alpine air
Enchanting silence rings between bluish sea grey plains
Barely interrupted by puffs of a hot air balloon's burner.
On the ground but off the road
Appears an abandoned uranium mine: ghost city.
A solitary sentinel with burning eyes tells stories 'round a fire
Stories of lost greatness, of lost years.
On the track but off to the other side
Are trees, forest, & grove, and then: a clearing.
In the clearing there are tanks, long forgotten
E'en longer lost, but still intact with diesel still inside.
The rocks crumble under the tracks,
Tank crests another hill,
Rushing along the concrete road stretching to the horizon.
Looping road, should have been cut straight.
Cracking dead trees, more shattering and cracking,
Clear snowfield ahead
Cracking once again, suddenly.
The tank lurches down a river,
Ice of limited strength.
Leaving the still-bubbling hole behind, hiking down the river.
The landscape changes gradually:
The snow, compacted along the middle of the river,
Tire tracks, short cliffs on the right, village ahead.
Wooden houses on the waving half-a-hill,
Delimited with tree-trunk fences, speckled with rare bushes.
Near them blocks of ice, cut out, and snow mounds.
There is life.
There is no living.
There is no road after the village,
Only the former tundra waving with snow dunes.
Twisty snow snakes, casting weird shadows
With the slowly rolling sun, circling along the horizon.
A herd of deer walk in the distance.
Nightfall. Cold dispels all cloud remnants.
Stars shining through frosty-clear air,
Stardust scattered across the sky,
Infinite sharpness blurred by atmosphere, blinking friendily.
The air itself glows, slightly phosphorecent.
Closer to the horizon, a faint halo rises--
Sunshine reflected straight back by interplanetary dust,
Like the car's headlights reflected on road signs.
They say there should be auroras in these latitudes.
They say there should be auroras in these latitudes:
Green arrows piercing the heights of the sky,
Green arrows piercing the veil of the night's sky
Joining into strips from horizon to horizon,
But no...the night was empty:
Show no concern.
Polar night lies ahead,
To be seen more than once.
"Ahead," the legend says, "are forgotten lands, the frozen El Dorado."
Somewhere over there are cities that glitter with all the colours,
Where dreams manifest.
Somewhere over there, behind the cold and the frost,
Behind the snowstorms and the darkness,
The tundra, the ice, and the axis of the Earth
Form the path to the brighter future.
Maybe you can reach it, some day,
Or maybe you cannot.
But there is always the Road
Always, at least, the Road.
01.04.2017 - Time
Digital stuff does not age, they say...
And yet, i start to notice the aging. Most of my software is getting old, and does so faster and faster. I have so many projects that these days it takes years to go full circle in the hopping rotation between them, and often the thing i hop to is out of date, out of it's time, not compatible with the current interfaces, look out of place and so on.
Instead of moving it ahead, i end up dragging it across the time to be up to date, and hop on to the next project. Like falling into a software black hole, complete with time dilation.
Not sure what the future holds - either i keep working in futility on making programs that can do programming for me until i drop below the event horizon, or one day i let it all go and launch away into some new field.
In any case, it's a scary realization that it's been a while since you had much more ideas than time to work on them...
25.08.2016 - Night. city. Roof.
Night. City. Roof.
You climb the ladder and poke your head over the edge.
It isn't really dark, and nothing hides inside the shadows.
The ringing in the ears fade away, replaced by the ticks and drips and creaks of the world.
One creak, one itch of nerves. There shouldn't be anyone up there, but anxiety doesn't care.
Covering the eyes from the glare of the lights below allows the far parts of the roof to be seen clearly.
The drips and creaks no longer twitch the nerves, the apprehension and the sense of danger fade.
Rough surfacing is rather creaky, and there is no way to sneak up without being heard.
With that, the sense of danger slowly dissipates and yields to the serenity.
A vent pillar is just the right size to lean around.
Too quiet for the city, and yet it isn't really quiet.
There is a rolling rumbling, the wind-like hum that comes and ebbs away, poked and punctuated.
The clouds race above, light-orange, dark-gray, black holes revealing the sky behind, shaded from the city lights.
It looks almost like the proverbial red Mars - the orange glow of city lights reflected back.
Martian sky above the city, dark sky over the forest to the west, another spot of orange in the distance.
The waves of color with rips in them.
Drip, ping, click, clang.
The stars are showing in the holes. The Earth is spinning really fast, or so the racing clouds make it look like.
Half-eaten Moon pokes through a hole, it's light too dim to really matter in the sodium glow.
Quiet roar, somewhat more louder squeal. Someone is drifting in the empty streets.
No one is in sight below, the bus station empty, the roads clear.
On the other side, the light pick out patches of the landscape. An orange tree, a piece of a pond, the cars set here and there.
Playground, orange grass.
The quiet murmur comes and goes in waves, dry sound of so many things being mixed together that only shhhh remain.
The roof is dark, it's edges sharp.
Red lights on distant towers look like the eyes of giant humanoid robots that stand vigil over the stilled city.
A baby starts to cry somewhere far away, black window becomes white.
Shadows move across that light, and soon it's back to the tides and ebbs of quietness.
Slight gusts of wind make the skin crawl.
It's cold up here, in the clear and somewhat moist air under the orange fog that used to have holes in it.
Time to climb back down.
30.07.2016 - How to split your ETC and ETH using MyEtherWallet
Let's split the ETH you have into clean ETH and clean ETC, each on it's own wallet.
This guide is for people who use MyEtherWallet (MEW) and don't want to bother with the complexities of having a "real" wallet and gigabytes of blockchain on their system.
(All the keys and passwords in this guide are fake, you should use good passwords and encrypted JSON versions!)
1. Have a wallet from before the fork.
2. Didn't receive any ETH into it after the fork (complicates things)
First, generate and secure the new wallets by going to MEW and using the "Generate wallet" function.
One for ETH, that we would call H ( 0x6F8B01Bf060d8C112A1056653a93c1Ace14f7feE for examples), and one for ETC - C ( 0xA8eDfF761E9B0Ae0e5307f3C270c2aa70dE1115a ).
The next steps are best performed with a small amout first, just in case you made any errors (this is a common sense wisdom of working with any crypto).
Go to the MEW's Send Ether function with your original ETH wallet.
It would show that you still have both ETH and ETC.
Use the ETH Only function to send all but a little of ETH to the H wallet.
You should leave a little ETH behind for gas, since the ETC transaction would have a ETH side of the contract.
Observe the funds on https://etherscan.io (ETH) and https://gastracker.io (ETC)
The ETH should go to the H wallet, and the old wallet should show almost empty.
The ETC should go out and back in, with nothing showing up on the C wallet.
Now, repeat the same steps for the C wallet.
Only this time chose the "Only ETC" option.
On getting back to MEW, you should see that your ETH balance is near zero, but ETC is still all there.
Once that transaction is sent, the old wallet will be near-empty on both chains, and you should observe the ETC on the C wallet.
Be aware that the "Only *" send the ether through a split contract, which would produce an output that most sites like exchanges don't recognize.
So, if you want to send the ETC to an exchange, for example, you should use the "ETH (Standard Transaction)" function.
You might observe that doing so with MEW from your ETC wallet would produce an error message.
MEW's code checks for error conditions and does not let the transaction thru.
You see the field named "Signed Transaction"? That is the code that should be transmitted to the blockchain.
One option is to transmit it manually, i.e. using https://classicetherwallet.com (CEW).
Go to CEW's "Offline transaction" page, paste the above hex from MEW into the "Step 3: Send / Publish Transaction (Online Computer)" field, and transmit.
Alternatively, you can use CEW just like MEW, and "Send transaction" from there, but at the moment that site is not even HTTPS and i'm wary of it.
Using a pre-signed transaction in there mitigates any flaws it might have.
If you liked this guide, feel free to donate.
28.06.2016 - Crash and burn
How peculiar is it to go fly a quadrocopter?
This set of parts that would take months to reach you from the far east, put together into a machine that can fly.
This set of parts, that will, inevitably, crash and burn.
When all the work you put in it might have to be repeated.
And yet, you go out to the open field.
You set it on the ground, you turn the power on, the cameras are rolling.
Into the sky it goes, majestically and with a little wobble.
To give some pretty pictures back.
But in the end, it crashed and burned, as these things always do.
Someone might wonder, why not order a real drone?
A Phantom, something shiny, stable, with no chances of phase lag crossing the 360 when over a swamp?
| Not a drone i made or own|
But for every drone it's destination death.
What would it be when this shiny thing encounters it one day?
Not much that i could fix. A pretty thing, but only single-use.
However, with my butterfly it wouldn't be the same.
It's built to crash.
It's flexible, it falls apart where i designed it to.
Sometimes i need to change a prop, of which i got a box.
Sometimes it only needs it's guts to be secured back inside.
Retie the straps, reprint the legs.
And fly, to crash and burn again.
16.05.2016 - Static motion
On static motion:
Or read below if that visual page does not work for you.
Contemplate this line.
The line is a moving slice of the Mandelbrot set.
Finite numbers make it look continuous and produce frames that seem consequential.
Things are happening on it, events unfold.
Objects move, interact, collide, appear and disappear.
It seems to be in motion, and yet it is only a static mathematical pattern.
But if all the motion is already pre-written by the pattern,
Then does it matter if it is computed at all?
The pattern, being a mathematical object, simply exists.
Regardless of whether someone computed it or not.
Our universe is a mathematical object too.
Think about it.
06.05.2016 - On hoarding ideas
To speak an idea aloud means certain death.
Is that a familiar feeling? Does that sound absurd? - Don't close the tab.
There is a choice - to hoard ideas or to spread them.
To keep your secrets to yourself or to talk them out at every opportunity.
It's a choice between a high chance of low benefit to everyone at certainty of zero benefit to yourself and tiny chance of high benefit to yourself at almost no benefit to everyone.
An idea is like a seed.
You can try to grow it yourself, but you can only grow a few at a time and won't know the outcome for years.
Or you can send it out, to be duplicated a hundred times by spoken word and digital magic.
Each then might be tried many times by many people.
Each might scatter against someone's head and turn into more ideas.
Imagine a billiard ball hitting the wall and turning into a dozen balls.
Net benefit to everyone would be higher.
You don't see it that way.
All you see is an idea lost.
Permanently less available.
Not spent on something good, but spent on something like a new iPhone - something you play with for a few hours, and then put into the drawer forever.
You get a few `wow`s and `awesome`s, and it's never heard of again, whether it rings across the world, annoys or vanishes without a trace.
It's unnatural for a human to feel the benefit from long-term investments.
All you can feel is that personal benefit would be certain zero.
If you spread ideas, you stay a nobody, you die.
So you hoard them, to have a chance of making one work at a benefit to yourself, to avoid certain death.
Just something to think about.
03.05.2016 - Bits
Not every lesson was fun during school. Sometimes you just had to doodle. Eventually, the doodling turned into a game of pencil and eraser enabling things to fight on paper.
It's this game that i implemented one day, since it looked like something that can be turned into a computer game.
Tentatively named "Bits", the game puts you in control of a single ship against a death star and it's escort, fighting over a notebook page.
Should be a fun one-time thing.
If anyone is interested, here it is (100 Kb):
Linux 64 bit: https://orbides.org/etc/bits_160503_lin64.tar.gz
Controls are WS or up/down arrows for accelerating and decellerating, mouse button fires, space pauses.
Goal is to hit the centre of the big ship.
Hint: the weapons are lasers, they heat instead of destroying. You have to keep the beam focused on a target for a second to melt and damage it.
25.04.2016 - Rocket Land
There is a game (tentatively named "Rocket Land") i made quite a while ago but never bothered to continue or release before now.
It's a 2D rocket physics kind of game, but instead of magical "this point makes thrust" engines and "this thing does torque" rotators you actually have to make a mass ejector of some sort. Rocket science, not orbital mechanics (but that is in there too).
Ideally, you'll be drawing your rockets, but at the moment there is only a set of pre-drawn ones, since UI is 99% of the effort.
Anyway, if anyone is interested, here it is (300 Kb):
Linux 64 bit: https://orbides.org/etc/rland_160424_lin64.tar.gz
Controls are WASD for the steering and engine, q activates engines, tab drops stages, space pauses.
If the mouse wheel scroll does not work, then use up and down arrows (can happen on a Mac). Held mouse key scrolls.
There are 4 scenarios, A to D, loadable by the buttons on the bottom left.
Both moons should be reachable, especially with the big lander in D, if you could navigate the debris belt and use the fuel sparingly. :)
| At some point in the past there was a kessler syndrome (to make things interesting)|
12.04.2016 - The Banshee, prelude
With the eyes closed, it felt almost like home - the gentle warmth of sunshine on the skin, the light seeping through the eyelids. The colour was off a bit, the warmth was spread across too much skin.
He opened the eyes, and a white hot metal ball hung in front of his face. Bright enough to leave spots in the eyes, yet cold enough to see the bands of clouds if you squirm a little.
He reached for it, the outstretched palm just big enough to cover the whole thing, the liquid metal sticking in-between the fingers of the closed fist. Somehow the brown dwarf always felt like it was within arm's reach, even when it really was almost a million kilometers away, behind the rad-hard glass of the improvised habitat.
This 10 million years old failure of a star was screaming like an infant banshee. It's scream was radiation - unseen, unheard and deadly in minutes on the surface of the moon.
Or should it be called a planet? Radiation notwithstanding, the Banshee wasn't really a star - at 8 times the mass of Jupiter it was too small to sustain nuclear fusion, and it's heat was just the remnants of it's birth.
Somehow it ended up the larges body within several lightyears. The expedition was supposed to determine which theory was right - was it formed from too small a cloud of gas, or was it a planet, ejected from a nearby star? Most peculiarly, why was there one cold moon around it, when the rest of them were still glowing from the heat of their creation?
A moon. Technically wrong, but he didn't feel it right to call the rock below a planet.
07.04.2016 - You've got mail
The user pressed the "Get e-mail" button.
What happens next?
The mail server is a name, the network talks in numbers.
The DNS will a call, and tells the number for the name.
The TCP connection gets established, data split into packets encoded into frames turned into electric signals... There be dragons for another raid.
Over that TCP connection, a plain text hello is sent.
The other side replies with a matching set of algorithms.
It sends a certificate and an invitation.
The certificate is a blob of data in the DER subformat of ASN.1 - type, size, data, type, size, data. In there hides the public key and the signature.
SHA-256 is the hashing algorithm. It takes as many bytes as you have and turns them into a 32 byte string.
We compute it over the certificate.
We then fetch the public key of the authority which granted it and take the signature to it's Dth power modulo N.
The answer is PCKS#1 - a padded SHA256 hash of the certificate.
The two match. Good, the server is genuine!
Now we send our shared secret to it, taken to the Eth power modulo N of it's public key.
The shared secret is a random string.
To get the encryption and hashing keys, we mix the words 'master secret' with the set of random numbers exchanged previously in the hello and invitation.
Just hash is unsecure, and so HMAC was invented after a battle lost and won decades ago.
The mix is the key to HMAC, taken over a recursive set of MD5 and SHA1 hashes to produce a string of bytes.
The string is split into two pairs of 20 bytes for the MAC, then 2x16 bytes for the crypto key and 2x16 more bytes of the initial vectors.
All the prior messages were saved, with the SHA1 and MD5 hashes being taken over them.
Now, we signal the server to begin the coded exchange.
As a confirmation we send the hash above, the 'client finished' string fed to the PRF function with the hash as a key, padded in the PCKS#1, and encoded with the keys above by AES.
Add the protocol version, or someone will fake us into talking on an older, insecure one. Every weird step have a history. A battle lost or won.
The server will reply with the same courtesy, only the 'server finished' line is used.
After the niceties are done, in comes the actual data.
The application data - blocks of AES containing the whatever apps would say.
The signs of ancient battles are seen in them as well - the first block message is just random to confuse potential decoders that figured an in before.
The data follows, completed by a hash.
The MAC, a SHA256 HMAC of the number of the packets sent, the data, it's size and it's purpose.
The end is ceremonially padded, so as not to leave any predictable text that might assist the hackers.
The data goes in and out of a buffer, read and written by the layers over them engaging in further ceremonies.
Ready, says the POP3.
+OK i know you.
+OK You may proceed.
Now, for the actual mail.
LIST, the client asks, +OK the server responds. RECV, RECV, RECV, RECV, DELE, DELE, DELE, DELE...
The client sends a coded ALERT to make the server know not to wait for it at dinner and breaks the TCP connection.
We now have the dumps of data made out of lines with tag: value in them, then the data terminated by two new lines.
What do it say? Where did it came from?
The mess is indescribable, the standards lax, a guess after guess on standard named fields containing data in a free-for-all format.
Americans say Feb 02 2016, the europeans - 02 02 16. Some say +0400, some say PST and EDT.
And that's just the date.
The subject line can be some text. Can be =?UTF-8?B?SGVsbG8ga2l0dHkhCg==?=, can be something even worse. All this must be decoded.
Every language have it's code page, which may not even be provided. We have to guess, to try them all and look for meaning.
The message itself, you might expect, is only text?
Nope, it's MIME. A set of parts, separated by whatever-i-want lines.
In there is a recursive mix of HTML, text versions of it, the files being attached, some signatures, some stuff embedded and some missed never to be seen.
BASE64, QP code, "plain" text in myriads of codepages.
As this final mess is waded through, the status bar approaches 100%...
You've got mail.