Dabbling with pixel art for a game concept.
Xuebing Du
art blog(derogatory)

roma★

Jar Jar Binks Fan Club
Sweet Seals For You, Always
untitled
Misplaced Lens Cap
h

gracie abrams
d e v o n

Discoholic 🪩
Mike Driver

Love Begins
almost home
YOU ARE THE REASON

bliss lane

shark vs the universe

seen from United States
seen from Malaysia
seen from Israel

seen from Brazil
seen from China
seen from United States
seen from Germany

seen from Germany

seen from United States

seen from Norway

seen from United States
seen from Switzerland
seen from Sweden

seen from Laos
seen from Uruguay

seen from Türkiye
seen from Oman
seen from Vietnam

seen from United States
seen from Indonesia
@ebzlo-blog
Dabbling with pixel art for a game concept.

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
The Case of the Truncated HTTP Requests
I just got done with a support email for one of our customers at Taurus. He was having trouble with logging in. I checked all the usuals: there were no errors in console, he wasn't blocking our site data, resetting his password yielded no problems on our end, and he was still locked out.
We started diving into the site logs to see what kinds of entries we were seeing from him; that's where we found the culprit. All of his requests include a truncated form of his email, some with a missing password, some missing email and password entirely. Now we knew what the problem was, we just didn't know what caused it.
Parameters came after the email, so it couldn't have been a URL size limit (and even then it was pretty short).
The length of the truncated email held nothing of any significance.
Certainly, he couldn't be making that many typos.
Maybe his autocomplete saved a truncated form of his email and he was accidentally submitting that? Nope. He verified that he was, in fact, using his email address in its entirety.
It's worth noting that we had just released the new version of Taurus that uses AngularJS. The controller that handles login looks like this:
$scope.login = (email, password) -> Manager.api "/login/create.js", data: email: email password: password
That's when I realized something in Angular must not be triggering when autocomplete fills out a form (we grab the email from its model rather than pulling the value out of the DOM element). So when the user attempts to login, rather than sending over what's actually in the text field, we're getting what was physically typed into the keyboard (so partial email addresses, or in some cases, nothing at all).
A quick search reveals that this is, in fact, a known issue: https://github.com/angular/angular.js/issues/1460
No problem. I quickly fixed it by pulling in the data using regular old Javascript instead and pushed it live so our autofill users could get on with their lives.
Converting snake_case to CamelCase in CoffeeScript
Quickly googling it didn't turn anything up so I took some time to hash this out, thought it might be useful to someone else.
"snake_case".replace /((^|_)[a-z])/g, (match) -> match.toUpperCase().replace("_","") # output is SnakeCase
How a useless dashboard panel helped us boost usage by 200%
When we first introduced [Taurus](https://taurus.io) to [Hacker News](http://news.ycombinator.com), we were elated by the amount of attention and praise it received. Which is why we were surprised to see our first batch of about 100 beta users mostly flop out and do absolutely nothing. There aren't very many steps you have to take after creating an account on our site. In fact, we kept our dashboard lightweight on purpose. After logging in, the user was greeted with a barebones account-settings page where you could change your password or update billing information. And, of course, a link to the installation guide. But people were signing up, only to bounce immediately on our account-settings page. We didn't even see very many people click through to even try and figure out how to install the thing. After a couple emails asking how much it cost to get set up ($0, which was noted), and some time in my [mind palace](http://www.youtube.com/watch?v=yKFMV0S5L44#t=22), I realized we were seeing the effects of a paywall, but without actually having a paywall. In an effort to keep our account-settings page simple, we had been inadvertently telling our users, "thanks for signing up, now let's see some plastic." The mere presence of billing information was apparently enough to jump ship, regardless of captions and callouts indicating that payment wasn't necessary. To remedy this, the first thing we did was install a worthless dashboard (which still exists and is only slightly less worthless). It consists of a bar graph that measures how many tooltips have been created and a link to our installation guide. More importantly however, it's the first thing you see after creating an account. The account-settings page (thus billing information) was hidden away in another tab for until it was necessary. Later that week, we released another batch of invites and, like magic, watched usage rise.
A neat CSS trick
I apologize for the title, but I really couldn't think of a better name for this post. I'm also making a fairly big gamble that I will never discover another CSS trick again worth writing about. Anyway, I just wanted to share a tag I just had the pleasure of meeting. But before I introduce you, please take note of the following examples.  # What's going on here? While example A is simply expected behavior, example B might throw some new designers for a loop. As we all eventually come to realize, an HTML element's width is exclusive of it's padding, border, and margin. By setting an element to 100% and a padding of 5px (example B), you actually set the element to take up 5 pixels + 100% + 5 pixels worth of space. **The goal here is to create a padded element that fits snugly into its parent** (example C). You *could* set the padding to use a small percentage and just appropriately deduct that from the width, but that lacks consistency at extreme resolutions and feels like "hacky" responsive design. # Okay, okay, so how do I do it? Set the element's [box-sizing](https://developer.mozilla.org/en-US/docs/CSS/box-sizing) to "border-box". This CSS tag forces the browser render the width inclusive of the padding *and* border. The final CSS for example C ends up being as follows: width: 100%; padding: 5px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; Neat. :)

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
How we allowed users to customize the look & feel of our application with only 4 options
We just launched customizable colors for [Taurus](https://taurus.io). Our users can now change the way their tooltips appear to their visitors. One of the challenges we faced in testing was having too many attributes to define. If you're going to have a customizable product, let your users go crazy, but for the love of God, let's keep the interface sane. We had assembled an uncomfortably long list of colors that *should be* customizable. Note that "should be" is not the same as "user wants," several of these options existed to avoid a situation where dark text might show up on a dark background. A button alone could potentially have the following attributes: * Background color * Text color * Hover background color * Hover text color Yucky. So while we wanted to allow the user to go all Burger King on the tooltips, we didn't want to discourage them with some monstrosity of a control panel. We needed to find a way to consolidate these options. We figured that several of these could be defined programmatically. For example, if a user defines a dark background for a button, the text color should not be dark. This was nothing a few if-statements couldn't solve, but how do we determine whether a color is light or dark? It turns out that simply averaging the color's RGB values isn't enough, in fact, there is a specific formula to determine a color's [luminance](http://en.wikipedia.org/wiki/Luminance_(relative)). Blues are actually perceived by humans to be darker than reds or greens. So if a color is heavy in blue, it actually ends up looking much darker. If a user defines a **dark red** for a **button** in Taurus, we now automatically define the following attributes using the luminance calculation: * Set the text and hover-state text to white. * If the **tooltip** background is dark, the **button**'s hover-state background will be pink, and vice versa. This drastically reduces the number of things a user has to think about, behaves as expected, and will appropriately go unnoticed for the most part (except for the few people who will have read this). [Check out the Taurus demo in action here.](https://taurus.io)
Feedback bruises egos and builds businesses
A Vietnamese place just opened up near me and I decided to give it a shot. When the owner came around to ask how the food was, I replied, without missing a beat, that it was great.
My response came out of habit, or probably courtesy. It's not really a question I typically put thought into. But because Taurus has been in closed beta for a couple weeks now, I feel like I can relate to the guy and realized he probably wanted some genuine feedback.
I know I definitely would for my business.
I could have told him how fantastic my meal was and how disappointing my co-founder's noodles turned out. My feedback would have told him what they were doing right and what they needed to work on. I could have been the reason for a slightly better restaurant next week, but instead, I ignored my opportunity on the off chance that I might offend somebody.
But honestly, who cares? Ten people might ask me how the restaurant was over the next week and I will give them my candid review, but for the one guy who could actually do something about it?
"It's great." -- completely worthless.