Posts

WeatherSense

Image
WeatherSense's revamped UI was inspired by MerrySky, which itself was inspired by the OG: DarkSky. Every five years or so, I’ve been rebuilding the same weather web app. It’s interesting to see how it has evolved. WeatherSense is the latest version of my weather app: Try it out: https://weather-sense.leftium.com Source code: https://github.com/Leftium/weather-sense What’s stayed the same Displays historical weather data next to forecast (Attempts to) automatically infer your location Simple toggle between between C/F units Unique format for nearby dates. “Su-11” for Su nday (May) 11 th What’s new I started to prefer other weather apps because UltraWeather wasn’t fine-grained enough. In addition, I wanted more data like air quality and dew point. So I added the missing information: More granular data: hourly instead of daily Air Quality Index: AQI (both EU and US scales) Dew point (and relative humidity) Precipitation amount + probability Sunrise, sunset...

WMO Codes

Image
Periodic Table of WMO Weather Condition Codes Unlike some other " periodic tables ," this one uncovers several patterns in the WMO weather condition codes. How can you express the 28 (Open Meteo) WMO weather condition codes as distinct icons and colors? The Open Meteo documentation gives a short description of each code, but the best way to graphically visualize this information in a weather app is not obvious. Open Weather, another weather API, simply hands you everything on a single page . The previous version of my weather app used Open Weather. (My app’s icons were actually from DarkSky, one of the best weather API’s until they were acquired by Apple.) However I was not satisfied with just mapping the 9 icons onto Open Meteo’s 28 different conditions . Open Meteo provides more information, and I wanted to expose it all! Organizing the Codes There are actually 100 unique WMO codes , but Open Meteo only reports a subset of these. Open Meteo groups the codes ...

Automatic Inbox Cleanup with Two Simple Filters/Rules

Image
Automatic Inbox Cleanup with Two Simple Filters/Rules Only 47 important emails reached my inbox out of 1,236 total emails received in October 2023. Last month I received 1,236 emails, but only 47 emails reached my inbox. These were the truly important emails I wanted to see, mostly sent from real people. These are the only emails that triggered a notification on my phone as soon as they hit my inbox. The other 96% of the emails were silently and automatically filed into other categories/labels without a single notification. About once a day, I take a few seconds to check them in bulk. I just scan the subjects and senders to mark a few bulk/automated emails that interest me. Then two keystrokes marks all of them as read. Ten, twenty, a hundred at a time! How can you have your email sorted like this? You just have to add a few custom email filters/rules. Instructions and downloadable Gmail filter files are at the end of this article! TL;DR (Quick Instructions) Instruction...

More Performant, Testable Code with Functional Programming. (FP language optional!)

Image
Valve Software , CC BY-SA 4.0 , via Wikimedia Commons Is functional programming worth learning? Functional programming can make code in your favorite language more succinct, testable, performant, and maintainable. (Functional programming language optional!) First, let’s quickly define functional programming (FP): A programming paradigm that avoids mutation and side effects. Notice FP does not require a functional programming language. FP is a way of thinking: you can do FP in your favorite languages like Python, JavaScript, Java, C, etc… (Of course, languages designed for FP make it easier with built-ins like first-class functions and immutable data structures.) So how does avoiding mutation and side-effects improve your code? FP results in more performant code. Functions without side-effects (interactions with external mutable state) are trivial to parallelize. Reading/writing to a global variable results in side-effects. So does all I/O: logging to the ...

Applying to the Recurse Center: Things I Wish I Knew Beforehand

Image
  The Recurse Center application process is well-documented and implemented well. However there were some undocumented details I wish I had been aware of before applying. These are notes for myself before I re-apply. It may help other hopeful Recursers, too~ Written Application The text area form inputs are automatically linkified. Markdown formatting is not supported and probably better to avoid. You may view/edit your application after submitting. Keep a log of "fascinating things" if you have trouble remembering, like me. (Or pick an "evergreen" thing.) The Conversational Interview Some questions I was not prepared for: Describe a time you had trouble programming. How did you overcome it? What is your greatest programming strength? What is your greatest programming weakness? Describe the ideal fellow Recurse batch member; someone you'd want to pair program with. The Pairing Interview For some reason Zoom screen sharing introduced a lag where there was a sign...

UltraWeather (Development of 2021 version)

Image
Quick note: my tech stack of choice has evolved since I wrote this draft in 2021. UltraWeather 2023 will be developed with the following technology: Development/hosting platform: Vercel JS framework: SvelteKit Language: TypeScript Templates: Vanilla HTML Chart library: ChartJS JS package manager: PNPM UltraWeather was originally named HyperWeather after HyperDev, the platform it was developed on. (Now known as  Glitch ). I had a certain way I wanted to see the weather forecast that no weather service provided. Glitch helped me implement my vision by providing: A simple (and free) method of hosting server-side code Motivation with a contest Server-side code was needed to proxy API calls;  DarkSky did not allow direct calls from the browser . So, I figured out how to used the Express server on HyperDev. Along the way, I also discovered some other nifty tech based on the Glitch samples I started with. I renamed HyperWeather to UltraWeather as I ported it to a new platform....

UltraWeather (Original HyperWeather Post)

Image
Screenshots of HyperWeather (previous version of UltraWeather). What is UltraWeather? UltraWeather (formerly HyperWeather) gives user-friendly, actionable weather forecasts. At a glance, you can quickly decide: "Is it warm enough for short sleeves?" "Do I need sunscreen? An umbrella?" UltraWeather also helps you get an intuitive sense of the temperature. Numerical temperatures are difficult to judge especially if you travel to a country with a different climate and/or different unit of temperature (Fahrenheit/Celsius). Why another weather app? Most weather apps jam as much information as possible onto the screen. UltraWeather takes a different approach and gives you the executive summary: Current conditions and temperature Forecast for the next few days (highs & lows + conditions) Historical weather for the past few days (highs & low + conditions) If you need more details than this, a link at the top leads to the full DarkSky forecas...

How to Display the Temperature Properly

Image
Naver has one of the best graphical temperature visualizations. Simple, clean, with the right amount of information. You can probably figure it out even if you can't read Korean or don't use Celsius. Web sites in Korea are usually usability disasters, but every so often I come across a true UX gem. Take Naver's visualization of temperature over time , f or example.  I've seen many other temperature graphs, but Naver adds one tiny feature that makes theirs immensely more usable: the temperature from yesterday and the day before. That extra little bit of historical information makes the current temperature and forecast temperature much easier to read.

Open Letter to Wells Fargo: Farewell~

Image
Dear Wells Fargo, The fragment of my Wells Fargo debit card taped to this letter attests to the fact I was your customer for 24 years. Today I closed my Wells Fargo accounts. Let me explain why you are losing customers like me. Who knows how many hundreds or thousands of other dissatisfied Wells Fargo customers simply switch away from your bank without even explaining. Like my brother did. I closed my accounts due to the atrocious Wells Fargo banking experience. For example: one day, with neither warning nor explanation, my checking account just vanished from the Wells Fargo site. If that wasn't frustrating (and scary) enough, what should have been a simple fix with a single phone call was drawn into an agonizing month of repeatedly contacting various incompetent representatives. From my experience, it seemed like the representatives were paid by the number of cases they handled per hour. Their responses looked copy-pasted from generic boilerplate templates and often, in the...

Add Dojo Toolkit to any website with this bookmarklet

To commemorate the release of  Dojo Toolkit 1.8.0 , I'm sharing my bookmarklet to inject Dojo into any web site from the browser. My Dojo-fy bookmarklet is based on this  jQuerify bookmarklet . Besides the obvious change, I've made a few improvements: Works over both HTTPS and HTTP The status message is removed on mouse over Some aesthetic changes To use the bookmarklet, drag the following link to your bookmark/favorites list: »  Dojo-fy  « Full source code after the jump:

My Personal Branding Part II: Leftium

Image
"The Element of Creativity!" Inspired by Adobe's CS3 icons , I designed my logo to resemble a cell from the periodic table of elements. The Leftium logo features an over-sized "Le" that pops out and forms a leftward arrow. lef·ti·um n. Symbol Le The element of creativity! John-Kim Murphy's online identity/username. Yes, in a moment of sheer brilliance I combined the word "left" with "-ium", a suffix commonly used to form the names of chemical elements (think " Titanium ", " Einsteinium ", or " Adamantium ".) The result is a personal online ID that I am very proud of because "Leftium" is: Short—only seven letters long. Yet the domain leftium.com was still available (obviously!) Relatively easy to convey over the phone. Most people know how to spell "left" and can guess the rest from the sound. Much easier to explain than "wonsungi", anyways! Unique. Before I star...

My Personal Branding Part I: Wonsungi

Image
A few of the monkeys I started drawing and collecting to go with my username. I initiated my quest for a personal online ID over sixteen years ago. While teaching myself computer programming, I discovered the demoscene . Mesmerizing pieces of audio-visual digital art, demos were often signed by their authors with "handles", or pseudonyms. As an aspiring programmer, I desired a cool handle like "Abyss" or "Psi". My real name, "John", was too common. In fact, once there were four John’s in my grade school class of twenty-four students. Even "John Murphy" was fairly common. There were at least six other students named John Murphy enrolled at my university. Later, while employed at both Lockheed Martin and Microsoft, I got numerous e-mails and some phone calls that were intended for some other John Murphy. Also at airport security I was inevitably always delayed due to some naughty John Murphy from Ireland.

Happy Easter (egg)

Image
Bunnies . Pencil on construction paper. 1999. Pulled from my high school Drawing III sketchbook. Based on a figurine from my house. A quick post to celebrate Easter and the fresh spring weather. I wouldn't have realized it was Easter if my Mom hadn't mentioned it in an email. In Korea, Easter is not marked on most calendars (although Christmas is). Instead, Koreans recognize other holidays like the upcoming Buddha's birthday . Can you find the Easter egg hidden in this post?

October Update: What's Good in Korea

Image
Mad Pumpkin. Marker on construction paper. 1996. I drew this freshman year of high school (Drawing I). Perhaps if this pumpkin focused on the positive aspects of life he wouldn't be so angry! October's been a busy month! I've been juggling four business partners and just as many different projects. I've also been making minor contributions to various open source projects. It's far too easy to pick out the bad things in our lives and complain about them. For instance, I have many more ideas for the UX Hall of Shame than the UX Hall of Fame . We usually take the good stuff for granted until it's gone, then complain about its disappearance. It's much easier to highlight bad experiences, especially in Korea. So, bucking this trend, here's a run-down of good things that happened to me in October:

How to eat Korean food

Image
Han eagerly anticipating some of the best meat in Korea. It comes to the table raw. I tried to avoid Korean food on my visit to Minnesota because it's so much tastier and less expensive in Korea. However, my mom wanted to get Korean food, so I broke down and took her to Dong Yang Oriental Food . This is the only place in Minnesota that serves Korean dishes on par with Korea herself. While very delicious and healthful, Korean food is very user-unfriendly. It is no wonder "Have you tried eating X?" is literally translated from Korean as "Do you know how to eat X?" (X를 먹을줄 알아요?) Many Korean dishes should be served with an instruction manual. For example, the first time I ordered Bibimbab I proceeded to eat it incorrectly. Bibimbab is a bowl of rice topped with various seasoned vegetables. There is a special sauce that goes with it, often served on the side. The correct way to eat Bibimbab, or literally "mixed rice," is to add the sauce, and mix ever...

What do BBQ sauce, coffee, and CPU's have in common?

Image
Delicious pizza, fresh from the wood-burning oven. Did the sausage really cost $1.50? The other day, my friend Eddy introduced me to a really tasty family-owned barbecue joint. While enjoying our delicious beef brisket he commented how expensive barbecue cuisine is, considering this style of cooking uses cheaper cuts of meat. He conjectured the price was raised by the lengthy preparation time needed to get the meat so tender. I actually blame Eddy (and all the other regular customers) for the bloated price of my barbecue dinner. Prices are set by what consumers are willing to pay, not the cost of materials/production.

Dragon Flies and Praying Mantises

Image
Can you spot the dragonfly? Recently I went for a hike up Mount Bukhan , just north of Seoul. While pausing for a rest, I noticed this dragon fly hiding in plain sight. This stirred some memories of a few notable insects from my childhood:

The Comeback Post

Image
The last time I tried growing my hair out was over ten years ago! My mom and me at the beach. When a Korean (pop) artist returns after being inactive for a prolonged period, Koreans call it a "comeback" album/concert. Often they remake their artistic style at the same time. I was sure "comeback" was a bit of Konglish because I never really heard it used outside of Korea, where I hear it all the time. However, a Google search indicates that the term "comeback" is indeed used outside of Korea/Asia. Anyhow, this is my blog's comeback post. I have made some major changes:

Blogging Again!

Image
Taken with my Fuji F100fd digital camera. Well, this blog has lain fallow for over three years... time for an update! So what's changed since then? The super-short summary: Completed level 3 of Sogang University’s Korean language program Was involuntarily relieved of over $15,000 Interviewed and hired at Microsoft Korea Resigned from Microsoft Korea Started working part-time at a college prep academy Found two awesome business partners

My Life: Chapter I

Image
My mom and me in front of our old house. I was born May 25th, 1980 in Seoul, South Korea. My family was made up of a mom, a dad, and this person who might have been either a grandma or aunt. We also had a dog. They named me Jung Su Kim. I lived in a two room house. One room was the kitchen, the other the main room. The main room was a empty, except a TV, wardrobes, and a fold-up table. The kitchen was made of concrete. Concrete floor, concrete walls, and concrete ceilings. There was nothing like a electric mixer or microwave, the tools we used were all simple. We had a big concrete block for a stove. It had about five holes big enough for big coal cylinders to fit in. There was another room across the main house. On one side of the house there was a high brick wall, on the other there was cliff. We used the entrance to our yard as a garage for our motorcycle. Source: My Life. An Autobiography by John Murphy. My Korean mom doesn't know any English, so I translated my...