My Wear OS watchface

Not long after purchasing my Huawei Watch, I got a bit obsessed about finding the perfect watchface. I was looking for a modern yet functional watchface.

I found WatchMaker quite early on, and was blown away by the vast amount of watchfaces and customization options it offers. After browsing through thousands of watchfaces, I found the ChristiaanDigital watchface which I liked a lot, but it still wasn't exactly what I was looking for.

Given the customization options of WatchMaker, I started to tweak the ChristiaanDigital watchface, and eventually ended up with my own CDM watchface.

Upgrading to a smartwatch was definitely worth it. I'm not completely satisfied with Wear OS, but it's a huge leap forward compared to my previous non-smart watch.

I wish Google didn't ditch Hangouts on Wear OS, and it'd be great if fitness tracking just worked automatically. On the hardware side, it'd be awesome if more manufacturers offered watches featuring sapphire glass, as I won't purchase anything else due to potential scratches and breaks.

Hope you found my watchface useful. Enjoy your smartwatch!

Stay away from Crowdtoolz and Nikolai Lebedovsky

TL;DR: Nikolai Lebedovsky sabotaged our marketing operation, deleted our Facebook ad campaigns, made a major alteration on a landing page to drive traffic to our direct competitor instead of our own site. If you plan to work with Crowdtoolz, then you need to read this post first.

This post is kind of a review, and it’s not pretty, but I have to publish it after what happened because I don’t want other startups to get hurt.

Getting to know Nikolai

I first met Nikolai Lebedovsky, the one-man band behind Crowdtoolz in July 2015, before launching the Ultimate Hacking Keyboard crowdfunding campaign. My business partner and I had already done most of the groundwork for the UHK campaign up to that point. We had also gathered thousands of subscribers on our mailing list. Although we may have succeeded without him, we wanted someone who could help us further.

We funded the campaign on Crowd Supply on 2015 December. We raised $246K of the $200K goal in two months. (The $688,685 sum displayed on Crowd Supply and on Crowdtoolz’s site includes the $443K after-campaign sales which Nikolai hasn’t contributed towards).

We paid Nikolai’s share, and afterward, we weren’t actively pursuing marketing, so we didn’t need Nikolai’s services for a while.

After the campaign

After a long break, Nikolai reached out to us and offered his services to boost our sales. We then reached an agreement on 2018 September. He was responsible for optimizing our webshop and running ad campaigns, and in return for his services, we paid him a substantial percentage of our monthly webshop income.

As time went by, it looked increasingly apparent this deal wouldn’t work in the long run. A one-time promotional email campaign went really well. However, despite Nikolai’s bold claims, apart from that campaign the results weren’t great. Moreover, he once claimed that his optimization on our webshop resulted in a constant 300 percent sales increase, but in reality, the change was negligible based on our long-term sales figures.

On top of the lacking results, it was evident that Nikolai wasn’t spending a lot of time on the project. We understood that he had other clients, which he was open about from the offset, but even low-effort tasks weren’t getting done in a timely fashion.

Given these issues, I reached out to a marketing agency, and granted them access to our Google Ads, Facebook Ads, and Twitter Ads accounts for them to be able to provide us an offer.

Firing Nikolai

This lack of progress plateaued in 2019 January when Nikolai was in Malaysia, as he was spending time with another client. I was following his progress closely, and concluded that in the whole month he was spending about a day’s work on our project.

Now, I’d like to put this situation into perspective. We’re a small hardware startup, we have no investors, and our cash flow is tight. We’ve worked our asses off to get where we are now, and so have our employees, contractors and suppliers who we deeply respect and admire. So, when you have a contractor like Nikolai who earns an order of magnitude more than others, but works a magnitude less than others and doesn’t deliver great results, it’s a serious problem.

I tried to explain this issue to Nikolai. He said that if sales were great, I shouldn’t complain. I explained that even if sales were great and he was the most talented marketing expert in the entire world, I would still complain because exceptional companies don’t merely succeed by having talented people. Instead, companies succeed by having talented, hard-working people who deliver great results. Therefore, talent is not a substitute for working hard, and in our case there wasn’t a shortage of work to be done.

I expected some changes, but nothing had changed. So, during our next meeting, I brought up the issue again. I expected him to lower his fee for January substantially given his lack of progress, but he didn’t. He told us it doesn’t matter how much he works because he bills us based on the income of our webshop. However, the thing was that the sale kept coming, even if he doesn’t work at all. By the end of the meeting, he was fired.

I told him to bill us for January, and we’re done. I also told him that we’ll settle the payment after our new marketing contractor completely takes over all the ad campaigns. I didn’t trust him to be available when any question arises regarding knowledge transfer, so this was an assurance on our behalf.

The sabotage

Shortly afterward, we realized that our Facebook ad campaigns had vanished. I also noticed that Nikolai had made a major alteration to a significant landing page to drive traffic to our direct competitor instead of our own site.

When Nikolai sent me an email about his pending invoice, which displayed thousands of dollars, I asked him about the missing Facebook ad campaigns and the altered landing page.

He told me he noticed earlier that we had added a marketing agency to our ad accounts, and the moment he noticed it, he deleted the ads to “protect them from getting into the wrong hands” because they’re “his intellectual property”.

Imagine your contractors sabotaging your operation behind your back at the moment they get the slightest hint of getting replaced. Sysadmins would bring down servers and developers would delete the code they’ve written.

Then when they are questioned about the sabotage, they would respond by telling you that their actions are completely justified because the work they were doing while being paid by you is “their intellectual property”.

Regarding the altered landing page, his reply was: “any reason why I should not do that?”

Lastly, he threw in some projected sales figures to make us think that we had made a colossal mistake by firing him. However, his formula is simple: next month income = current month income + $5,000. He never hit such goals, and always had to readjust his projections.

Closing words

Nikolai could have simply acknowledged that he was replaced, get paid, and move on. Instead, he opted to sabotage our operation, which also resulted in this review and not getting paid for January given that his invoice doesn’t cover the losses that he had caused.

This experience has been sorely disappointing. Nikolai is a person who I once considered a friend and I also looked up to him. However, his recent actions speak volumes about who he really is at his core. I think trust is the basis of every relationship, both personal and business, and he’s broken our trust on every level and it is now beyond repair.

I hope this is a warning sign for everyone who wants to do business with Crowdtoolz. A person who has such poor ethics should not be employed. If I knew Nikolai’s true colors, I would have never done any business with him in the first place. However, I’m also glad that he eventually showed his true colors because things tend to go downhill over time for with people like him.

As a closing word, in case you have any doubts about the truthfulness of the information above, it can be confirmed by András Völgyi, my business partner who is a person with exceptional ethics.

How to update to Android 4.3 on your rooted Nexus 4

A while ago upon applying the freshly received Android 4.3 OTA update on my Nexus 4 the following happened:

android-update-fail

Although the error message looked rather troubling after rebooting Android got successfully updated to 4.3 to my surprise.

Even though my phone got updated some days later the update re-appeared among my notifications. This time I went over the same process just to make the nofication disappear. Some days later when the update notification popped again I really wanted to get rid of it on the long term so I delved deeper. As it turns out the solution is surprisingly easy.

1) Unroot your phone in SuperSU.

android-update-unroot

2) Apply the update.

android-update-apply

3) Reinstall SuperSU through CWM.

That's it, enjoy!

DXF to SVG to KICAD_PCB converter

Recently, I've written dxf2svg2kicad, a highly polished online DXF to SVG to KICAD_PCB converter which I'm very proud of. To be explicit this tool converts:

  • DXF to SVG
  • SVG to KICAD_PCB (used by KiCad EDA)
  • DXF to KICAD_PCB

Speaking to the technical-minded, my tool runs 100% on the client side and I used lots of cutting-edge web technologies to make it happen. You're welcome to check out the code on GitHub.

Nowadays I simply publish my work on GitHub and rarely blog - I've created this post solely for SEO purposes because given the usability of my tool Google should rank it higher.

Wifi is not designed for seamless switchover

A while ago I embarked on the quest of extending wifi coverage to our whole backyard.

Having a venerable ASUS WL-500GPv2 sitting at the front side of the house, my natural approach was to place another access point (AP) near the back side of the house which would cover our whole backyard. That is, in theory. As it turns out in reality things are a little bit more complex.

After installing the AP I was getting complaints from my sizeable user base (my sister and my mother) that the connectivity of their smartphones and tablets got shitty beyond imagination. After investigating this problem I realized that upon entering the house from the backyard wifi devices connected to the AP and as they moved towards the front of the house this connection stayed alive despite the router having a much stronger signal level at this point than the AP did. I even set up a multiple-AP (roaming) network configuration as suggested but the same thing was happening, only that I couldn't see right away which AP I was connected to.

wifi-switchover-fail

I was dumbfounded by what I saw. I assumed that wifi devices always (re)connect to the AP with the strongest signal level. Wouldn't this be the Right Thing to do, after all? Well, not so much.

The first problem is switchover lag. Wifi is not GSM. With GSM you can travel through the country, move across dozens of cell towers without noticing a thing. With wifi, switchover lag is noticable and is highly unwanted when using streaming applications, especially VoIP.

The second problem is deciding when to switch over. The hardcoded client policy is to switch over when the current AP becomes totally unreachable. Another policy could be switching over as soon as there's another AP in the vicinity with a slightly stronger signal level. This wouldn't be optimal either, however. Just imagine being located right between two APs and taking some steps back and forth and back and forth. That'd result in lots of unwanted switchovers. I guess manufacturers could put two wifi transceiver into each device to solve this issue but it probably wouldn't justify the price and this method would draw excess battery power.

Given that clients implement a hardcoded switchover policy let's see what could we do on the server side. A buddy of mine who worked as an admin at an ISP suggested using RouterBOARD appliances with which one can specify a dB treshold below which the appliance disconnects the relevant clients so those clients can switch over to another AP in the vicinity. Unfortunately, such uber feature is out of reach for most and I don't know about any other devices implemeting this feature, not even OpenWrt.

So what did I end up with? My buddy also suggested placing my router to the attic and ditching the AP. Now the overall coverage is better than it used to be. It's not perfect but the signal is almost always within reach on our property. As a rule of thumb one should place the wifi router to the highest and most central location. I'm pretty happy overall, althought a wireless-N MIMO router would probably boost signal levels like crazy but I'm in savings mode right now and I don't wanna spend a ton of money on an ASUS RT-N66U Dark Knight until it's totally justified.

My case for a portable desktop

About two and half years before I invested in a heavily capable laptop, an Acer Aspire 8935G.  After having spent all this time using my laptop I finally reached the conclusion that I'll avoid laptops like plague in the future.  I understand that it's quite a harsh stance, especially given a laptop of this caliber but there are too many reasons against them from my perspective.

My first reason of not buying a laptop ever again: Neither suspend nor hibernate works on Linux

Just tell me a more essential feature that you expect from your laptop.  When I go to sleep I wanna suspend my laptop to have a silent environment and to be able to continue my work from where I left off.  When I leave home for some hours I'd also like to suspend my laptop just to save some power.  Hibernate could also work (in a suboptimal fashion) in such situations except that it doesn't.  Upon resuming my laptop it freezes in no time. Let's also take into consideration that I use a really complex session with lots of applications spread across multiple workspaces and lots of passwords to type upon startup. This shit costs me about a boring quarter an hour every time I wake up.  It may not seem much but I despise this ritual and I cannot forgive for such an essential feature not working.

So far I've surely spent more than 100 hours trying to make resume work with no success.  I've tried a number of distributions, fiddled with various parameters of s2ram, tried to suspend from console, switched the graphics card and did pretty much everything under the Sun. According to my understand the major problem is that the iGPU gets resumed instead of the eGPU and the BIOS provides no options to disable the iGPU.  In general this BIOS is dumbed down crap, providing only a handful of options at most.  I'm not in the mood of elaborating in detail about this but it's been a sickening experience which I couldn't solve despite having a strong Linux background and spending a *lots* of time on this issue.

The major problem the way I see it is that most laptop manufacturers (Acer surely included) don't give a shit about Linux support.  I can't really blame them considing the 1% market share of Linux but it's sure as hell that I won't give them a fucking cent ever again for not being able to suspend such a crazy-expensive laptop.

My second reason of not buying a laptop ever again: I have to pay for the sub-optimal hardware and software configuration most of which I already have

Let's suppose that one already owns a laptop and is about to buy a new one.  Let's just go over of what hardware components could be used from the old laptop:

  • Screen
  • HDDs, SSDs
  • Keyboard
  • Wifi module
  • Bluetooth module
  • Case

(I didn't list the motherboard, the CPU and the graphics card because Moore's law ruthlessly obsoletes these components.)

Some of these components (HDDs, SSDs, Wifi module, Bluetooth module) could be easily reused in a new laptop, but manufacturers provide no means to order a laptop without these components.  Other components (Screen, Keyboard, Case) could also be theoretically reused in a new laptop but manufacturers couldn't care less about designing according to the need of reusability. As a result customers have to pay for all components every time when buying a new laptop.  This is the opposite of the PC world.

And let's not even mention that nowadays almost every laptop come with glossy screens which I utterly hate because of their reflection, hence my journey of searching for a replacement matte screen begins, making me spend a hundred-something extra bucks but only if I get lucky enough to find a replacement matte screen.

On the software side of things given that I dislike Microsoft as much as I do and I don't even use Windows my first thing to do is to send back the laptop to Acer for them to remove Windows which takes about two weeks and I almost don't get any money back because I have to pay for my laptop to be shipped to the Acer service center. Fail!

The portable desktop

My approach involves using 1 main station and N dock stations, N being the number of places that I frequently spend time at doing heavy computing. If you're like most people then you only heavily use computers at home and at work.  That's two places.  I personally work from home but I have two locations between which I travel on a frequent basis and spend some time every time, leaving me with two places, too.

The main station is a Mini-ITX box composed of:

  • Case
  • PicoPSU power supply
  • Mainboard
  • CPU
  • RAM
  • Graphics card
  • Optionally Wifi and/or Bluetooth depending on the motherboard and on your needs

A dock station is composed of:

  • Monitor
  • Keyboard
  • Mouse
  • USB hub
  • DC power supply

Price comparison

Let's pick a super-capable desktop-like laptop like the Acer Aspire 8950G which will set you back with about $1,600 and will be replaced in every few years. (So far I could only see laptops with 18.4" screens which I consider desktop-like from Acer.)

Versus...

The permament parts of the main station cost $216 and composed of:

The soon-to-be-obsoleted parts of the main station cost $474 and composed of:

A dock station costs $400 and composed of:

You surely won't get the parts for these exact prices but the numbers are in the ballpark. That's $1600 recurring cost vs. $1016 one-time cost + $474 recurring cost.

Conclusion

I personally never needed a laptop, I needed a portable desktop.  The pros of these solutions are fairly apparent but I list them for completeness' sake:

Laptop:

  • Portability

Portable desktop:

  • Cost
  • Having the exact hardware configuration that you want
  • Better compatibility allowing you to suspend, resume on Linux

Right now I'm not sure when will I ditch my laptop. So far I'm satisfied with its performance but the time will come eventually, inevitably.

Given the lack of portability my approach is not for everyone but I think it's thought-provoking because many people don't even think about the possible advantages of such a configuration in this laptop-centric world.

EDA tools going online

According to Atwood's law this was a predictable happening. These are the ones that I know about but I'll be keeping this list up-to-date in the future:

Although the above webapps are schematic drawing tools I can foresee fully-fledged online EDA solutions getting implemented in the future.

Launchpad feature set proposal: Bounties

Abstract

The objective of this post is to propose a new feature set for Launchpad to provide a way for users to create monetary incentives for developers to fix specific bugs or to implement new features.

The problem

The latest and greatest release of Ubuntu, Natty contains more than ten thousand packages.  The sheer number of packages inevitably contain an even larger number of bugs.  At the time of writing there are 90198 open bugs in Launchpad.

Many times Free Software developers work on a project for the reputation of their peers and for the challenge involved but often they cannot devote enough time to their project because they have to make a living.  As a result their project suffers which manifests itself in a large number of bugs and / or missing features.

Millions of users of Ubuntu have to deal with these bugs on a daily basis, usually by working them around or tolerating them.  Sometimes bugs get fixed quickly but many times they don't get fixed for a long time.  In the latter case users cannot do anything to make a bug fixed apart from reporting the bug or fixing it by themselves, the latter being very time consuming and requires lots of expertise.

If users could create monetary incentives for developers to fix specific bugs or to implement specific features then it would be more likely for those bugs to get fixed or those features to get implemented.

Proposed solution

The model to be proposed works like the online marketplaces designed for freelancers to be employed.  In particular, I'd like to highlight Guru.com because they're on the top of their game and they've implemented various practices that make sure that the job actually gets done and all parties are satisfied.

The actors involved are:

  • Donor: A user is a donor from the point on he/she deposited a bounty for a bug.
  • Developer: Can be an upstream or third-party developer who's about to fix a bug for a given bounty.
  • Judge: An independent and competent third-party who has to make justice if donors have any objections about the completeness or quality of the fix after the developer has claimed the bounty.

The process could work like this:

  1. If a user chooses to provide a bounty for a bug, a deposit gets created for the specific bug and the desired amount gets added to it using PayPal or credit card transfer.
  2. Other users can also add funds to this deposit.
  3. At this point any donor can withdraw his/her bounty at any time.
  4. As soon as the bug gets assigned to a developer the deposit gets frozen and donors won't be able to add or remove funds to it.
  5. The developer should deliver the fix within an approved timeframe and claim the deposited bounty.
  6. The bounty gets transferred to the account of the developer if none of the donors have any objections within a week or so.
  7. If any objection occurs then related parties can discuss it or eventually they can raise the issue to the arbitration phase where a judge is involved.

Some further thoughts:

Because of their dedication, familiarity with the given codebase and proven track record, upstream developers could be given the privilege of being able to exclusively work for a bounty for a specific amount of time.  This exclusivity period could last about one week from the creation of the deposit, for example.

It should be made sure that no developer is able to block the resolution of a given bug.  This could be either done by defining close deadlines or by allowing for any bug to be assigned to multiple developers.  In the latter case whoever resolved the bug first could claim the bounty.

It may make sense for such a system to automatically notify upstream in advance and ask them to agree to merge the upcoming fix and also request the developer to provide a fix in a format requested by upstream.

Canonical should get some portion of the bounty for developing and operating Launchpad and they could also provide judges.

Why Launchpad?

Launchpad is the ultimate umbrella project of the Free Software Universe.  As such, it relates and highlights every upstream project in a consistent manner.  Mark Shuttleworth said at UDS-O that "For most Free Software projects I wouldn't be surprised to find if there are more bugs filed against that piece of Free Software in Ubuntu than upstream."

According to the above it makes sense to implement this feature set on top of the existing, state-of-the-art and proven infrastructure instead of creating a whole new site for it.

Conclusion

There are many details left to be answered and nothing is written in stone, but I hope that this post is thought-provoking enough to start further discussions about the viability and towards the implementation of this idea.

I have witnessed online marketplaces working both as a freelancer and as an employer, but this idea could be so much cooler in regards of Free Software where everyone benefits from the work of developers and everything happens openly.

I'm looking forward to talk more about this issue, so if you have anything to say, please don't hesitate to let me know in the comments.

Tabs vs Spaces

Ok, this is some serious shit that drives me crazy. The reason why you should never, and I mean never and let me emphasize NEVER in your entire life use tabs for indentation is because:

  • We use spaces in the code to separate words anyways.  Why do you wanna introduce yet another character?
  • Tabs will be displayed differently depending on the editor in question.
  • People are gonna mix tabs and spaces in surprisingly novel (or just plain random) ways which will screw indentation even more than before because it's harder for editors to figure out the correct indentation in this case.
  • The mixture of tabs and spaces will produce lots of redundant lines in your {SVN / Git / whatever VCS} diffs because developers will (un)intentionally change them which is gonna be a lot of fun during code reviews.
  • Tabs are evil!  They're evil, evil, evil!  Don't use 'em! (Except for Makefiles (which as you may suspect are EVIL!))

As a last word, it's not possible to avoid using spaces for indentation in such scenarios:

<tab><tab><tab>function_call(arg1, arg2, arg3,
<tab><tab><tab>              arg4, arg5, arg6);

Long life to spaces!