Thursday, May 7, 2015

Reading Digest 05

Sharing what impressed, inspired and made me think this week, even if to thank the authors for taking the time for putting their thoughts and experiences together.

Friday, May 1, 2015

Double Trouble: Two risky features come together for a conflict in JavaScript

On the value of being careful with modifying global scope. There is a code conflict I encountered recently when combining somebody else's JavaScript code with a 3rd party library. It didn't go well, and took time code-digging / stepping-through / debugging / tracing, until finally the cause became apparent.

JavaScript in general is very flexible (beyond loose), which is reason to both love it (“With great power…”) and hate it (“…comes great responsibility”). But blaming one's tools isn't helpful when you need to get a job done.

Tuesday, April 21, 2015

Micro-solution: Automatic Value Axes Offset in amCharts

Working with amCharts library for visualizing various report's data in I-Plan Supply Chart Planning software, I came across a difficulty configuring multiple value axes for our specific case.

amCharts is very flexible, allowing to set several axes, define their position (“left” or “right”), title, colour, min/max values, tick formatting etc. It even allows defining an offset (in pixels) to avoid overlap of axes.

Yet in our case the reports are built by the users, various values assigned to different axes based on units, and can be aligned left or right at will. This means that a constant offset value simply doesn't cut it—if you have report values that are too wide they'll overlap, and if they're narrow—they will leave a gap.

Tuesday, April 14, 2015

JavaScript Unit Testing in Crossrider Browser Extensions

Here's the approach I found looking for a way to implement unit tests for my JavaScript browser extension (written using Crossrider framework). The method is quite straightforward, yet still required me to do some research and testing. This approach in theory is agnostic of the testing library you use, or at least it should be. I will demonstrate it with both QUnit and Jasmine.

Wednesday, March 11, 2015

Developing browser extensions using JavaScript with Crossrider framework

As developers (or humans) we need to balance our skills. Sharp focus is valuable, yet tunnel-visioning oneself is not a good idea — there's so much to learn!

While honing my HTML/CSS/JS kung-fu, I was unexpectedly tasked with something new. We needed to create a browser extension to go with Roadmap, a product our company works on.

A completely new area — or so I thought. Some searching showed a simpler path. I could create extensions with my existing experience. Even more — those extensions could share a (more or less) common code base across all mainstream browsers.

Thursday, November 13, 2014

UX is about organization

Google Inbox is certainly not complete.

I miss being able to simply paste images from clipboard. I do want to have more text-formatting options (being especially fond of "quotation" formatting in any kind of software). Speaking of quotes, their detection in replies and forwards is still somewhat wonky in Inbox. And I am scared by a barren "Settings" screen — almost no tweaks or configs. What, Google is becoming like Apple? What a dreadful thought…

But! I love what Google Inbox is, and, even if it makes some things less convenient, I am sticking to it, amazed at the fact that it just "works".

Friday, September 5, 2014

Micro-solution: Preserving input values against all odds (JavaScript)

The problem: How do you keep the already entered values of HTML inputs if you can't control when the containing document is closed or reopened?

In my case, I am developing a browser extension which requires a configuration popup with some input fields. The user is expected to enter several values into the fields and there is a specific “Save” action, which performs an authentication check etc. I can process button presses etc — yet the popup itself (with all of its HTML, CSS and JavaScript) may be brutally closed by the browser without any prior notifications.