How to: Key-Based SSH Logins With PuTTY

All too often I keep Googling this procedure to sign into SSH terminals with certificate keys since I’ve been switching to Linux for development. Like my previous post on how to Create a Bootable USB Drive with Windows, I felt it was time to write my own step-by-step guide for my future reference.

First, let me explain why I do this.

Why use SSH keys to login?

Everyone knows you log into Windows and Linux machines with a username and password. The obvious issue is, what happens when someone gets your username and password? Yep, they can now login.

What if there was a way to sign your specific machine, say your desktop, to only allow connections from it? Then, combine that machine signature with yet another password (called a passphrase) for an impromptu two-factor authentication to login? (Factor 1, the certificate key; Factor 2, your passphrase)

That is my take on why I use SSH keys to sign into Linux machines. You not only need my password; but, you also need my certificate.

Other Reasons to use SSH keys for logins

There are other reasons to use SSH keys for logins. I also use them for script automation across multiple Linux machines, in which the script needs to log into the remote machine to perform commands. The easiest way to do that is to not use a passphrase, then the user account that the script runs under will have the ssh keys added allowing them to remotely signin. Less secure, but also less of a headache to setup. You can still use a passphrase in your scripts, and even encrypt it so it isn’t in the clear text. That is beyond this post though.

Ok, enough with reasoning – let’s setup PuTTY now.

First, the PuTTY Quirks

PuTTY is a great app for Windows. It’s GUI though is a little odd and takes some getting used to. Specifically, it is a bit quirky around the Sessions, aka Profiles that allows you to save settings for quick connections in the future (just select it, click Open and that’s it). Unless you hit Load, Save and Delete in the right sequence, things won’t be loaded, saved or deleted.

Because of this, I recommend setting up your Session profile first before we get started with SSH keys. Nothing worse than going through all the steps to create a Session profile, and missing one step, having it all wiped out to start over.

Create and Save a PuTTY Session profile

Here’s the steps I take to create a Session profile.

  • Open PuTTY and you should be in the Session category on the left.
  • For the Host Name, enter the DNS or IP address. E.g. mylinuxvm.cloudapp.net
  • Make sure Port 22 and SSH options are set (usually the default).

  • Set a default Username to login with by clicking the category Connection then Data. Enter your username in the Auto-login username text box.

  • Finally, to save your Session profile, click back on the Session category on the left. Then under the Saved Sessions textbox, enter a name for this session. I like to call my sessions the name of my VMs, e.g. mylinuxvm.cloudapp.net.

  • Now, press the Save button.

You have now created your first Session profile in PuTTY. It’s usually during this Save process that I may inadvertently click on one of the existing Saved Sessions, in which your profile is now completed wiped out and you have to start all over.

It is now time to generate your Public and Private key pair that you will need to setup on the remote Linux box.

Generate a PuTTY Public/Private Key Pair

The next step is to generate the key pair that you’ll configure your shell to use. We do this with PuTTY’s included PUTTYGEN.EXE file in the directory of where you installed/unzipped PuTTY to.

Running PUTTYGEN.EXE opens a new window.

"Generate SSH Keys in PuTTY"

You will need to Generate a new public/private key pair and save both the public key and private key separately to continue. Start by clicking the Generate button, and move your mouse around to generate a random key.

"Generate SSH Keys in PuTTY"

Once the key pair has been generated, you have a few options. It is highly recommend to change the following:

  • Change the Key comment to be your email address, or machine name.
  • Set a passphrase, you will use this as your password when connecting each time.

Now, it is time to save the Public key file and Private key file. Click the buttons and save each file in a safe place.

"Generate SSH Keys in PuTTY"

CAUTION: If you are going to disable password logins for your box, and only allow SSH key logins, you will want to keep the private key in a very safe, and backed up, place as if you loose it you will loose access to the machine.

Take the Public key, and assign it to your Linux box

Now it is time to copy the contents of the Public key file and place it on the remote server.

Load up PuTTY again and click on your Saved Session, then click Open. Enter your normal username’s password when you setup the Linux box when prompted – do not enter your Passphrase just yet. If prompted for the security warning, click Yes as it is your first connection to the server.

You are going to create an authorized_keys2 file in your shell, and copy your public key text directly into it.

For this, I am going to assume you already have an ~/.ssh/ directory. If not, just create it:

1
2
mkdir ~/.ssh
chmod 700 ~/.ssh

Now, create the file:

1
pico ~/.ssh/authorized_keys2

You must now paste the entire Public key, all on one line, here within the editor. Again, make sure it is all on one line. It should look like this:

"Linux SSH Public Key Setup for PuTTY"

In Pico (now nano), press CTRL-X to exit. It will ask you to save, press Y and you are done.

It is recommended to set the permissions read/write for your user only. To do this, execute the following:

1
chmod 600 ~/.ssh/authorized_keys2

Type exit or close your PuTTY, you are done with the shell.

Set the Private Key in your PuTTY Session Profile

Remember that Session profile we first created at the beginning? Now it is time to set it up to use your new public/private key.

Open PuTTY yet again and when prompted for which Saved session, we have to be a little careful with the quirkiness. You will want to Load the Saved session first, before we can modify it.

Select your Saved Session you previously created, and click the Load button.

"Set SSH Private Key in PuTTY for SSH Key-Based Login"

Then on the left, click the Connection -> SSH -> Auth category.

Click the Browse button and select the previously saved Private key this time.

"Set SSH Private Key in PuTTY for SSH Key-Based Login"

Almost done, you need to go back and Save your Session profile again. Do this by clicking the Session category on the left again.

Simply press Save here. Do nothing else. Do not click on your previous Saved Session, as this will erase what you just changed. Do not reload it, as that will erase it again. Yep, PuTTY quirkiness. Just click Save and you are done.

Completed. Now, connect.

Now it is time to test it. Click on your Saved Session, and click Open. You should be created with something similar to this:

"Logging in with PuTTY SSH Key-Base Authentication"

Enter your passphrase you setup at the beginning of this guide, and that should be it.

Final Thoughts

While it is not recommended, you could skip the passphrase creation and leave it blank. This can give you a kind of auto-login when connecting. But do note, anyone who gets your private key file can log into that shell with no password as well.

You are also able to setup multiple public keys for a single shell account by adding additional lines to that authorized_keys2 file – one per line. This can help segment control to multiple parties logging into the same machine (say a dev ops team that deploys – each member gets their own public/private key pair to use). That way, you can reject a login at a later time by simply removing the line from the authorized_keys2 file.

Leave a comment

Lenovo Thinkpad End/Insert Key Swap

Lenovo Helix End/Insert Keys Swapped

I recently switched from the Dell-exclusive club of laptops over the past 15 years to a ThinkPad. Specifically, the Lenovo ThinkPad Helix. It was a unit I have been waiting years for to check all the right boxes.

I haven’t been privy to the IBM/Lenovo keyboard wars. I have always heard great things about the IBM ThinkPad keyboard. Well, it seems this Lenovo Helix came with the newer style of only one row of Function keys + hardware-specific keys (volume, brightness, etc). Fine by me as I figured out how to lock in the Function-mode-always (a BIOS option).

But now I had a serious problem when coding/writing long documents…

The End/Insert Key was Swapped

Why in the hell would the End/Insert key swap functions when I lock in the Function-key mode of the F1-F12 keys?

This was almost a deal breaker. Only after crawling the Lenovo forums (a great place to find hacks for Lenovo) did I stumble onto a Lenovo ThinkPad keyboard hack to reverse the key functions. It actually remaps the Windows keyboard layout in the registry, an age-old trick I forgot about over a decade ago!

Swapping the End/Insert key functions

Instead of supplying a download of a .reg file, which I am not even sure that GitHub supports, I’ll explain the instructions on how to create your own .reg file.

  • Right-click on your desktop, select New -> Text Document
  • Copy and Paste the following into this document, letter by letter.
lenovo-helix-end-insert-key-swap.reglink
1
2
3
4
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,52,e0,4f,e0,4f,e0,52,e0,00,00,00,00
  • Save the file as lenovo-helix-end-insert-key-swap.reg
  • Double-click it to merge it into your registry. You will need to be logged in as an Administrator.
  • Reboot and you’re done.

Now, the function of the End/Insert will be swapped.

Also, devoted fans of the previous Thinkpad keyboard: you may want to take your anger here.

Leave a comment

Buy KickStarter at MoMA

Popular KickStarter projects are available online at the MoMA

"Buy Kickerstart on the MoMA"

In honor of NYCxDESIGN—New York City’s official citywide celebration of design—the MoMA Design Store is pleased to present a suite of products brought to life by Kickstarter. By involving the public in the creative process, Kickstarter uses the power of community to help designers take great ideas from concept to reality. MoMA Design Store is proud to honor these individuals and their designs as examples of how everyone is capable of making incredible things.

This came across in my inbox today and immediately jumped in.

3D Doodler, come to me! The book lamp and recyclable USB sticks, 4x 8 GB, are also on my list.

Leave a comment

Best Cloud Computing and Security Talk EVAR

James Mickens on distributed computing at PDX 2014

This showed up in my twitter feed; so, I gave it 30m of my life and I am glad I did.

#HatTip Xander Sherry

Leave a comment

58 Facts You Probably Didn’t Know About the Star Wars Movies

58 Facts You Probably Didn’t Know About The Star Wars Movies

1. The actor who played Obi-Wan Kenobi, Alec Guiness, thought of the Star Wars films as “fairy-tale rubbish”.

2. Despite this, he negotiated a deal to earn 2% of the gross box office receipts for the movies he appeared in, earning him over $95 million.

3. Harrison Ford was paid $10,000 for his performance in Star Wars: Episode IV - A New Hope.

4. Peter Cushing, who played Grand Moff Tarkin, found his costume boots so uncomfortable that he wore slippers during many of his scenes, and insisted his feet just never be in the shots.

5. The sound of the TIE Fighter engines is actually the sound of an elephant call mixed with the sounds of a car driving on wet pavement.

6. Steven Spielberg made a bet with George Lucas for a percentage of the Star Wars films, which has earned him millions of dollars since.

7. While shooting the scene in the trash compactor, Mark Hamill held his breath for so long that he burst a blood vessel in the side of his face. They had to adjust framing while shooting the rest of the scene to avoid showing the blemish.

8. Many of the buildings constructed to be used in shots of Tatooine are still standing in Tunisia. In fact, some of them are still used by locals.

9. Denis Lawson, who played Wedge Antilles, is Ewan McGregor’s uncle.

10. Luke Skywalker was originally going to be named Luke Starkiller, and retained the name up until the film begin shooting. Luckily, the name was never mentioned, so it was changed to Skywalker with little effort.

11. The starship that became the Blockade Runner seen at the beginning of Star Wars: Episode IV - A New Hope was the original design for the Millennium Falcon.

12. The Jawa language is based on a sped-up version of the Zulu language.

13. The language Greedo speaks is a South American language called Quechua.

14. The bounty hunter Bossk’s clothing is a recycled spacesuit from Doctor Who.

15. Yoda’s species has never been named.

16. Mark Hamill was in a bad car accident before filming started on Star Wars: Episode V - The Empire Strikes Back, causing severe facial trauma. The scene in which Luke Skywalker is mauled by a Wampa was added to account for the scarring on his face.

17. Yoda was originally going to played by a monkey carrying a cane and wearing a mask.

18. During the evacuation of Cloud City, you can see an extra running with what appears to be an ice cream maker. The extra has since been given an elaborate backstory, and the supposed ice cream maker is meant to be a database of contacts within the Rebellion.

19. The word “ewok” is never said out loud in the Star Wars movies.

20. Luke’s lightsaber in Star Wars: Episode VI - Return of the Jedi was originally going to be blue to match the lightsaber he lost in the previous film, but George Lucas was worried that it would confuse audiences, and thought a green lightsaber would look better, so he made the change.

21. At one point, Star Wars: Episode VI - Return of the Jedi was going to be called “Revenge of the Jedi” and there were actually trailers and posters produced with the original title.

22. In fact, the producers of Star Trek II: The Wrath of Khan changed the name of their film from “Revenge of Khan” to avoid confusion between the two films.

23. The bounty hunter droid IG-88 was actually built from recycled film props. His head is the drink dispenser from the cantina scene in Star Wars: Episode IV - A New Hope.

24. Three of the aliens seen on Jabba’s barge in Star Wars: Episode VI - Return of the Jedi are named Klaatu, Barada, and Nikto. Their names are a referenced in Army Of Darkness as the words one must say to destroy the book of the dead. The names themselves are a reference to the words that must be spoken to shut down the robot in The Day the Earth Stood Still.

25. While filming Star Wars: Episode VI - Return of the Jedi, the codename for the project was Blue Harvest, which was supposed to be a horror film with the tagline “horror beyond imagination.”

26. The cast actually seriously considered making Blue Harvest when a series of sandstorms halted filming for several days.

27. Blue Harvest is a reference to the 1929 novel “Red Harvest,” which was the inspiration for the film Yojimbo, which itself was inspiration for the Star Wars films.

28. In one draft of Star Wars: Episode VI - Return of the Jedi, Obi Wan Kenobi and Yoda were going to leave the Force, and return to their physical bodies again to either assist Luke in his confrontation with Darth Vader and the Emperor, or to join him during the celebration on Endor.

29. Star Wars: Episode I - The Phantom Menace was labelled as “The Doll House” when it shipped to theaters.

30. No physical clone trooper outfits were actually produced for the films. Every clone trooper seen in the Star Wars films was created with CGI.

31. The communicator Qui-Gon Jinn uses is actually an altered Gillete Sensor Excel women’s razor.

32. Samuel L. Jackson claims that the words “bad motherfucker” were engraved on the lightsaber he used in the Star Wars films.

33. While filming lightsaber fight scenes, Ewan McGregor kept getting carried away and making the sounds of the weapon himself, which had to be removed in post-production.

34. Tupac Shakur auditioned for the role of Mace Windu.

35. An early draft of the Star Wars saga began with “This is the story of Mace Windu, a revered Jedi-bendu of Opuchi who was related to Usby C.J. Thape, a padawan learner of the famed Jedi.” It wasn’t until Star Wars: Episode I - The Phantom Menace that Mace Windu and Padawans first made an appearance.

36. The waterfalls cascading around the capital city of Naboo was actually salt.

37. Star Wars: Episode II - Attack of the Clones was labelled as “Cue Ball” when it shipped to theaters.

38. The cow-like creature seen grazing in the fields behind Anakin and Padmé in Star Wars: Episode II - Attack of the Clones can be seen again as an asteroid later in the film.

39. The members of NSYNC made a cameo in Star Wars: Episode II - Attack of the Clones to appease George Lucas’ daughters, but the scene was cut from the final version of the film.

40. Ahmed Best, the actor that plays Jar Jar Binks, makes an appearance out of costume in the background of one scene.

41. So does Anthony Daniels, who plays C-3PO.

42. George Lucas’ daughter Katie Lucas appears as a Twi’lek dancer in Star Wars: Episode II - Attack of the Clones.

43. Her sister, Amanda Lucas, appears as a background extra.

44. Their brother, Jett Lucas, appears as a young Padawan in the Jedi archives.

45. Star Wars: Episode III - Revenge of the Sith was labelled as “The Bridge” when it shipped to theaters.

46. While standing in on the Galactic Senate, Jar Jar Binks votes in favor of Order 66, leading to the destruction of the Jedi and the rise of the Galactic Empire. Even more reason to hate him.

47. The top-down shot of a severely burned Anakin Skywalker near the end of Star Wars: Episode III - Revenge of the Sith has the character framed within the symbol of the Galactic Empire.

48. The in-universe name for the genre of music heard during the cantina scene is “jizz.”

49. Anakin Skywalker/Darth Vader meets six of the nine diagnostic criteria for Borderline Personality Disorder, which is one more than is required to make the diagnosis.

50. Lucasfilm has someone on staff whose job is just to maintain Star Wars canon.

51. E.T.’s alien species are part of the Star Wars universe. A delegation of the aliens can be seen in the Galactic Senate.

52. In an early draft of the Star Wars story, R2-D2 speaks standard English, and is actually kind of a jerk.

53. George Lucas came up with the name R2-D2 while filming American Graffiti. A member of the sound crew asked him to retrieve reel #2 of the second dialogue track, which in the parlance would be, “Could you get R2-D2 for me?”

54. The phrase “I have a bad feeling about this” is said in every film.

55. There’s an island nation called Niue that accepts collectible Star Wars coins.

56. Every Star Wars film has been released the week after George Lucas’ birthday on May 14.

57. Anakin Skywalker/Darth Vader has been played by six different people: David Prowse, James Earl Jones, Bob Anderson, Sebastian Shaw, Jake Lloyd, and Hayden Christensen.

58. A disco version of the Star Wars theme became a No. 1 hit in 1977, and held the spot for two weeks.

And as a bonus, #32 …

#HatTip Todd Major

Leave a comment

FiveFingers Maker Vibram Agrees to Settle Class Action Lawsuit

Vibram Agrees to Settle Class Action Lawsuit Claiming Company Deceived Consumers

Vibram USA, the company that makes FiveFingers running shoes, has agreed to settle a lawsuit that alleged the company made false and unsubstantiated claims about the health benefits of its glove-like footwear. According to the court filings, Vibram settled to put the matter to rest and avoid any additional legal expenses. “Vibram expressly denied and continues to deny any wrongdoing alleged in the Actions, and neither admits nor concedes any actual or potential fault, wrongdoing or liability,” read the court brief.

Valerie Bezdek brought the class action suit against Vibram in March 2012. She filed her complaint in Massachusetts, the state where Vibram’s U.S. headquarters are located. Bezdek alleged that Vibram deceived consumers by advertising that the footwear could reduce foot injuries and strengthen foot muscles, without basing those assertions on any scientific merit. “The gist of her claim is that Vibram illegally obtained an economic windfall from her because it was only by making false health claims that Vibram induced consumers to buy FiveFingers shoes, and to pay more for them than they would have otherwise[.]”

I get the whole false claims thing that it could reduce foot injuries which wasn’t based on any facts. Just seems silly to see lawsuits like this after all this time based on mis-representation in advertising. America, the land of the litigated.

A quick Google for Valerie Bezdek shows someone proud of her FiveFingers shoes.

Personally, I cannot live without my FiveFingers shoes. I’ve had them for a little over 2 years now and keep using them (I got the extra durable ones). Before getting them I was already running barefooted on the balls of my feet, for proper technique. I got these and they have allowed me to run in more places – again, on the balls of my feet, not my heel.

I can easily see those that don’t run on the balls of their feet getting injuries.

In the end, if you want to submit a claim the url will be:

http://www.fivefingerssettlement.com

In addition, it seems people who wear these shoes are thought of as snobs? Give me a break.

#HatTip Todd Major

Leave a comment

Look Up

It’s not very likely you’ll make “World’s Greatest Dad”
If you can’t entertain a child without using an iPad.

When I was a child I’d never be home.
Be out with my friends on our bikes and we’d roam.
And wear holes in my trainers and graze up my knees
And build our own clubhouse high up in the trees.

Now the park is so quiet it gives me a chill.
See no children outside and the swings hanging still.
There’s no skipping, no hopscotch, no church and no steeple.
We’re a generation of idiots, smartphones and dumb people.

I remember an NPR segment from around ~2008 when I moved to New York hot on the heels of the 2nd generation iPhone, the 3G. It talked about our society was already significantly affected by the 1st gen iPhone in that we were becoming a race of robots, always starring down at our smartphone.

It went as far as to say how rude it is to look down at your phone at dinner, or while someone was talking to you. It made a good case about social interactions > your email, to the point of branding you a jackass if you did it.

That segment (sorry, can’t find it) changed my view entirely on social interactions and made me overly conscience on my “mobile use”, along with observing others and their “mobile habits.”

I tried not to be the asshole that said, “Hey, put down your phone and look at me.” Instead, I used other hints that were in the NPR segment such as when noticing someone is paying attention to their mobile device and not looking at you while you are talking, just pause your sentence. You’ll find out that on average 5 seconds go by until they “Look Up.” Or, you could simply offer a visual clue that they have to focus on.

I am happy to report that after 6 years of this, I find myself placing my smartphone on the table yes; but, I do not do this to monitor it or look at it. I do this to get the huge 5” screen bulk + bumper cover out of my pocket so I can sit down. I place it face down so not to disturb me and to give complete focus to the person(s) I am sitting with. I am happy to report that some even have had taken notice and started to do the same, even coming back to report to me how it changed their social interactions.

Fast forward to my nearly 3 year old daughter I have now, and this video. I’ve reviewed the results of quite a lot of studies on child raising and these tablets and smartphones. It basically came down to one thing:

Make it a learning experience for the child and learn together with them. Do not use as an entertainment device and do not leave them alone with it.

In addition, I take my daughter to the playground in the park often. The vast majority of the time, there are no kids – we are the only ones there. We experience the swings hanging still all too often – until we jump into them.

~E

#HatTip ForgetFoo

Leave a comment

Responsive Design Begins With the URL

Responsive Design Begins with the URL

"Responsive Design URL Schema"

The core principle in creating a potentially enormous website that will last forever is to get the information architecture right in the first place. This involves knowing your data objects and how they fit together. It should also determine the URL structure, which for Programmes is the most important aspect. Take the URL for Top Gear’s home page:

http://www.bbc.co.uk/programmes/b006mj59

After the domain name comes the word “programmes,” which is a simple, unchanging English word. It is intended to describe the object, and is not a brand or product name. Plurals are used so that the URL can be hacked backwards to retrieve an index.

Next is the programme identifier. Note the lack of hierarchy and the lack of a title. Titles change over time, and many programmes do not have a unique title, which would cause a clash. Hierarchies also change — a one-off pilot could be commissioned for a full series. Understanding your objects allows you to recognize what is permanent. In this case, nothing is particularly guaranteed to be permanent, so a simple ID is used instead. Users aren’t expected to type these URLs, though. They will usually arrive through a search engine or by typing in a friendly redirect that has been read out on air, such as bbc.co.uk/topgear. But the key principle of a permanent URL is that inward links are trusted to be shareable and work forever. Cool URIs don’t change.

A clear information architecture defines the URL scheme. A piece of content is given a clear canonical home, where appropriate. Links and aggregations between them then clearly appear.

For a decade I have spent a considerable amount of time getting the URLs right for what the user was looking at. I must have gone through 20 different iterations over the years trying out all sorts of designs, deep linking, “walk the url backwards” and so on.

You can see on my static site blog here that I paid close attention as well, trying out yet another theme. I am on my 4th iteration of a url schema for my blog and it has become a PITA when having to keep redirects working of old urls, especially on this static site with no URL rewrite module.

I almost went the post_id route here on this iteration; but, Jekyll (and therefore Octopress) makes the title url-safe already so I kept it. Besides that, I agree that urls should play a role in your web architecture.

As long as we are talking about it, ASP.NET MVC’s default /Controller/Action/Id has always pissed me off since I first started using it back in 2007. Coming from a pure-RESTful background, the pure REST urls are more similar to /Controller/Id/Action so you end up with urls like this:

1
2
3
4
/product/2832/
/product/2832/edit
/product/2832/clips
/product/2832/videos

And so on. Which, actually, falls inline with what the BBC article above was saying.

#HatTip ForgetFoo

Leave a comment

Google Glass Distracting Drivers

Does Google Glass Distract Drivers? The Debate Is On

I have several friends, CEOs, CTOs and even strangers tell me they can talk and drive, they can text and drive, they are good drivers, etc.

I’ve always rebuttaled that the human brain can only focus on a single context, at any given time.

A quote in this story summed it up quite well:

Earl Miller, a professor of neuroscience at MIT who specializes in multitasking, says this sounds like wishful thinking.

“You think you’re monitoring the road at the same time, when actually what you’re doing [is] you’re relying on your brain’s prediction that nothing was there before, half a second ago — that nothing is there now,” he says. “But that’s an illusion. It can often lead to disastrous results.”

In other words, the brain fills in the gaps in what you see with memories of what you saw a half-second ago. Among scientists, that statement is not controversial. The politics of Google Glass — and where it’s worn — clearly is.

Bingo. And this includes “hands-free” conversations as well as GPS.

Then again, in 30 years we may evolve to actually have our brains multi-task.

#HatTip ForgetFoo

Leave a comment

Avocode

The bridge between designers and developers

ALWAYS BE IN SYNC
Share with a link and instantly get updates from your designer.
No more e-mail attachments or huge PSD uploads.

WEB & NATIVE APP
Preview and inspect PSDs on the web or use the native app
on any platform - Mac, Windows or even Linux.

EVERYTHING FROM A PSD
Choose anything from a PSD and get exactly what
you need – CSS, SVG, images, fonts or colors…

You know, I am starting to get that “designer” itch again. I am not a designer; but, I can pull something outta my ass every once in a while. Going to try to get a private beta to see if I can use this for some projects as well.

#HatTip ForgetFoo

Leave a comment