Category Archives: Rant

The stuff worth ranting about

Fire Tablet setup: How to skip Amazon registration

Fire tablets are great cheap Android tablets, but they’re tied to Amazon ecosystem, which sucks. You used to be able to skip Amazon registration during setup, but on newer devices you can’t anymore.

Except you still can.

During setup you’re presented with “Register your fire” screen, and “Continue” button, and no way to bypass it. Follow these steps:

  1. Tap “New to Amazon? Start here” link.
  2. “Choose Country or Region” screen appears – select any country
  3. “Create an Amazon Account” screen appears. Instead of entering name, email, and password just tap “Close” button

You’re back in the original “Register your fire” screen, but now in addition to “Continue” button you will see “Not now” that lets you skip the registration.

Now you’re free to install an appstore of your choice e.g. F-Droid or Google Play Store and use it as a regular Android tablet.

Force add file permission in git.

I was working on a Windows laptop with a repo originally created on Mac, and git arbitrary changed bash script file permission from 755 to 644.

I was able to change it back by updating git index

git update-index --chmod=+x script.sh

But I couldn’t commit this change, because as far as git was concerned nothing in the file changed. But I was able to force-add the change

git add --chmod=+x -- script.sh

After that I was able to commit and push the change.

Keep animated images after uploading to WordPress

Haven’t written in a while. Not that nothing interesting happened, but never got around to. But I finally moved my blogs to AWS Lightsail (very smooth process, by the way) and experienced only one hurdle I wanted to write about (surprisingly, not related to AWS).

After the migration, I noticed that all images on my site lost their animation. When I inspected an image – I found that it’s source goes thru some kind of a proxy “i1.wp.com”. After digging a bit I found that it is used by JetPack site acceleration service – it caches images to serve them faster. Unfortunately cached copies seem to lose some of their properties (like animation).

To fix it – go to JetPack settings and turn “Speed up image load times” off

Jetpack settings

Happy blogging!

Fling a random insult at Trump after every tweet

Ok time to get political. I hate many things that Trump tweets these days and would love to reply to each tweet personally, but have neither time not desire to read his delusions. Fortunately in these modern times robots take many of our jobs. And this looked like a perfect job for a bot. Similarly to the bot described in the previous post it will be IFTTT + Scriptr combo. But this time in reverse, here’s intended flow:

  1. Twitter service at IFTTT detects when @realDonaldTrump tweets
  2. It triggers Maker service that makes HTTP request to Scriptr code
  3. Scriptr code generates random insult and posts a reply to Trump’s tweet

Here’s what IFTTT applet looks like: Continue reading →

SSRS and HTML rendering of ordered list

Microsoft’s SQL Server Reporting Services supports rendering of HTML tags, but for some reason that support stuck in 1990s – only very limited set is supported. And even using that set is problematic.

Case in point – ordered list. While officially supported – the way it is rendered is the stuff nightmares are made off. Jumble of original tags generously intermixed with DIVs and SPANs – it’s a wonder it renders at all.

And sometimes it doesn’t. If you try to view a report in Internet Explorer (especially from older, but still actively used versions of SSRS like 2008) numbering get screwed.
Continue reading →

Pebbles, rectangles and stack overflow

UntitledWhile working on my Pebble watchface “Future Time” I have encountered persistent annoying problem – watchface would run for a while and then crash – and not only crash, but actually restart the watch. What made this even more frustrating – after 3 restarts in a row Pebble would revert to recovery mode and complete firmware reinstall was required (did I accidentally write a Pebble virus?).
When I dug into device logs I found out that every restart was given reason: “Dangerous Stack Overflow”. Which is kinda strange – I don’t have any recursions nor deeply nested function calls nor large local variables. I tried lots of things – including extreme ones like declaring all local function variables as global or static – nothing helped.
Finally Christian form Pebble developers forum shed a light. He pointed out that I use a lot of GRect constructs which is basic rectangle building block for pretty much anything from defining layers to graphics functions. I used GRect inline directly inside function calls, which I thought wasn’t a big deal, after all “everybody does that” – including Pebble in its examples. Well, as Christian pointed out those GRects are kind of local variables, and either memory is not reclaimed fast enough when they go out of scope or they spring memory leak.
Keeping this in mind I created a global GRect variable and when needed to use a GRect in local function, first I’d assign it’s value to the variable and then use variable in the function.
So something like this:

static void layer_update(Layer *layer, GContext *ctx) {
   //...
   graphics_draw_rect(ctx, GRect(10, 10, 30, 30));
   //...
   graphics_draw_bitmap_in_rect(ctx, bitmap, GRect(20, 20, 40, 40));
}

Becomes thus:

GRect temp_rect;

static void layer_update(Layer *layer, GContext *ctx) {
   //...
   temp_rect = GRect(10, 10, 30, 30);
   graphics_draw_rect(ctx, temp_rect);
   //...
   temp_rect = GRect(20, 20, 40, 40);
   graphics_draw_bitmap_in_rect(ctx, bitmap, temp_rect);
}

That’s it. This simple change cured the plague, no more crashes, restarts or recovery – just smooth sailing.

Trump wants to bring Pebble home

Trump on PebbleDonald Trump’s plan to “Make America great again!” would have you spending a whole lot more dough on your next Pebble smartwatch.

Not surprisingly, that would be the logical consequence of the Republican presidential front-runner’s latest ambitious promise: Getting Pebble to start manufacturing their products in the US instead of China.

“We’re going to get Pebble to build their damn watches in this country instead of in other countries” Trump said in a speech at a rally in Supai, Arizona.

The Donald’s claims are made to appeal to a voters having difficulties finding jobs in the US. Pebble, the world’s most innovative company with cult of followers, designs its best-selling Pebble Time, Pebble Time Steel and Pebble Time Round in the US but relies on partners in China and Chinese factory workers to assemble all of them. But what would be the price to build those “damn watches” in the US? Even a rough estimate of the basic costs shows it’s an unrealistic option, leading to a Pebble smartwatch with a potentially jaw-dropping price tag.

To keep things easy, let’s just observe salaries of workers occupied with assembling a Pebble. A labourer at Chinese manufacturing factory gets paid roughly $400 a month before overtime, according to the New York Post.

Now assume Pebble goes the cheaper route and utilizes a factory in Wyoming or Georgia, which happen to have the country’s lowest minimum wage at $5.75 an hour. Working 8 hours a day, 5 days a week, a US worker will earn $824 a month, or more than double the Chinese labourer. And if Pebble were to utilize someone in its home state of California, where the minimum wage is $9 an hour, the monthly pay is $1,400, or more than triple of the chineese.

And that’s ssuming you have number of workers with enough technological skills to do the job (and you don’t) and also assuming those workers will work for minimum wage (they will not). After awhile, things don’t add up.

While there are a number of other factors that go into a Pebble, including the components, shipping, marketing and research and development, doubling the labor costs could significantly hike up the price of a Pebble. Current price of Pebble Time is $150 — will you pay for the same smartwatch $300? $400? Or more?

“Twice the price is a very modet estimate” says Clara Mileshti, an analyst at Dumas CostEff, about the price hike of a Pebble if it were manufactured in the US.

In another speech, Trump proposed a 35 percent tax on products built outside of the US. So at a minimum, that would mean your next Pebble Time’s price could start at over $200.

Pebble declined to comment on Trump’s comments and didn’t want to get into the potential math of bringing watch manufacturing back the US.

Trump’s comments ignore the fact that Pebble does buy some of its components from US companies, including LEG’s Cortex-MI5 processors. The company said earlier that it believes it affects jobs creation in the US throug encouraging developers to learn and and create software for their appstore ecosystem. And by the way, creating and submitting an app to Pebble appstore is free for developers.

Pebble couldn’t afford to build a watch in the US at a reasonable price. Making a more costly, “Made in the USA” product is not an option, especially as consumers start to wise up about how much they’re spending on their smartwatches. Today Pebble is the leader in low-cost efficient watches. But alternatives are cropping up.

So strike it up as another crazy, wild claim by Trump. Or is it?

Unblock my heart, i mean, iPhone for Pebble geocoding

Cobblestyle I’ve recently updated code for Cobblestyle Pebble Watchface to take advantage of very cool geocoding service called Nominatim by Open Street Maps.

Nominatim is used in two places: Direct lookup is used in watchface’s config page to lookup coordinates of a place by its name for custom location setting; reverse lookup is used to lookup location name by its coordinates to display name on actual watchface.

It was working fine – on Pebble watches connected to Android phones. It was failing miserably on iOS, so iPhone Pebble users were getting neither location nor weather updates. And it was pretty puzzling for a while until I obtained logs from running watchface thanks to invaluable help from Robin.

Turned out iPhone Pebble app was plain simple blocked by Nominatim service, every attempt to retreive location resulted in message being sent back “You have violated acceptable policy”. Which was kinda surprising since I just started using the service. When I contacted Nominatim support, they told me that apparently some Pebble app running from iPhone abused the service pretty badly, running hundreds of requests per second. And since the only way they can detect requesting app is by it’s User Agent string – all apps spotting iPhone Pebble UA were blocked.

Support suggested to set UA string specific to the app so it could be easily identifiable. Standard approach to set headers on xmlHttpRequest object is .setRequestHeader(..). Unfortunately by many browsers and clients it is considered unsafe to spoof UA via request headers. Fortunately iOS allows that, so all I have to do is catch and ignore erros in other clients. Basically this line of code solved the issue:

try {xhr.setRequestHeader("User-Agent", "Cobblestyle Pebble Watchface");} catch(e){}

Thanks to this as of version 2.19 Cobblestyle watchface correctly displays weather and location information. Yay.

TSQL ISNUMERIC and “String or binary data would be truncated” error

If you’re using TSQL ISNUMERIC function in a query, e.g.

select * from MYTABLE WHERE ISNUMERIC(MYSTRING) = 1

You may receive unexpected error:

String or binary data would be truncated.

ISNUMERIC must truncate string data, and if you experienced the above error, some of your data is over the limit. But you can augment the above query:

select * from MYTABLE WHERE ISNUMERIC(LEFT(MYSTRING, 8000)) = 1

But cutting only 8000 chars you will avoid the error, and I seriously doubt you will have number over 8000 digits long so it’s a safe bet as well