Returning to Azeroth.

Tuesday, September 4, 2018

Night Elf waiting for a dungeon party near the Meeting stone.

It’s impossible to experience all the story at this point, since 2004 US release there were 7 expansions, history of the world changed a lot, you had to be there from the beginning. But not all is lost, there’s time walking events, there’s books and graphic novels. So much story can be overwhelming, so I recommend taking advantage of “Class Trials”, you can start playing at level 110. Choose your character — Honourable Horde or Righteous Alliance member, or maybe, neutral Pandaren and jump into this huge world with million of others. It feels like you part of something big.

I still remember the day when I picked my World of Warcraft box. The box felt good, thick, with colourful illustrations and beautiful characters. But that wasn’t the reason I decided to buy the original game, I only picked it up because of familiar and friendly Mac log on front. Blizzard still supports Mac and even Metal 2, so it won’t be affected with deprecation of OpenGL. Even though it’s very old game, you will be pleased with level of details in a new areas. I play on my 13-inch MacBook Pro and I get ~30-50 FPS with low graphics but native Retina resolution. Text is so sharp in quest descriptions.

How game changed since beginning? There’s a trend to make it more approachable, you don’t need to learn a lot and you don’t need to invest huge portions of time, completing single quest can take you 5 minutes. It’s genius how questing is used to advance your character and give you motivation to explore new areas. There’s always something to do, dwellers to help. It’s a very smooth experience, it gives you bits of story and landmarks peace by peace, it’s addicting and rewarding. No commitments at all. It can be a pleasant routine, an escape into different world.

There’s 2 phases — levelling and the end game. Anyone will tell you that the end game is the most fun part, but for me questing and small dungeons always were more than enough. I never even got to the end game. When Battle for Azeroth was released, I subscribed again, this time I will try to reach the end game.

There’s interesting accident happened in the game called Corrupted Blood plague which simulated chaotic deceases outbreaks from real world. It’s even studied by scientists.

How iOS Developers Lie with Photo Permissions Dialog.

Sunday, July 15, 2018

Telegram requires access to photo library to change profile picture

If you try to change your profile picture on Telegram, it’ll demand access to your entire photo library. Telegram doesn’t need it. System image picker doesn’t need user permission! But many developers intentionally lie to us, so we would think we have to give a permission. In fact permission is only needed to add new image to the library, or for custom picker UI or if you want upload all of your pictures.

Since very beginning iOS allows user to select any photo with sandboxed image picker. The app sees the only photo you picked, and you can browse through your library in private and familiar way, without leaving the app. However even apps which use system image picker ask photos permission. Is it laziness or ignorance?

Did it happened to you? You wanted to changed profile picture, or selling something and attaching a photo. You can do this easy on the web but if you use iPhone or iPad app, you have to give full access to your media. With this access app can easily upload all your photos, GPS coordinates history, or even analyse all your photos with machine learning. I’m worried about potential privacy disaster which can come at any moment now.

Not only it’s unnecessary extra step, but also often users need to navigate through custom buggy UI.

I’ve build simple proof of concept to demonstrate that native UIImagePicker can work without your permission, your photos won’t be accessible to the app.

I’ve tested it on device because I can’t believe that so many developers ask photos permission not in the right moment. Yes, you can ask me if I try to save a photo but you can’t do it when you trying to show UIImagePicker.

Go through all your apps in Settings > Privacy and disable everything you can. Often you can still get things done by pasting an image, but sometimes the only private way is using Safari.

Boycott McCafé.

Saturday, July 7, 2018

2 Starbucks plastic cups

I’m trying to reduce our impact on environment. We have 2 reusable coffee cups in our family and I am using them in Starbucks, Nero and Costa. Not only this is good for environment, but it also helps to save money, Starbucks offers £0.25 off, and Nero gives you 2 stamps for one purchase instead of one. I have also banned plastic straws in our family because straws kill sea life.

2 McCafé with plastic lids

For years I was regular customer in McCafé, collecting their loyalty stickers, their coffee is good and it doesn’t cost much. One day we went to McCafé with our Starbucks cups, here’s my conversation with McDonald’s person behind the till.

— Hi, can I use my own cup please?
— No.
— Why not, you not it’s bad for environment, I use them everywhere else.
— Sorry it’s our safety policy.
— That’s wrong, okay 2 lattes please, without lid… Without plastic lid please!
— Sorry I can’t, that’s a policy.

Not only they don’t offer benefits for bringing your own coffee cup, McDonald’s employee do not allowed accept reusable cups at all! Yes, recently, they are trying to phase out plastic straws in UK but that’s not enough.

McDonald’s must change its stupid outdated policy about not allowing us to bring our own cups. I’m not buying their coffee any more and I encourage you to do the same.

Me with collection of reusable coffee cups

If you do have any cups laying around, don’t throw them in recycling bins please. Common coffee cups is paper combined with plastic. Costa and Starbucks can accept your cups from coffee and soft drinks and send them to a special place.

I Left Glance.

Thursday, May 10, 2018

I should’ve write about this earlier but couldn’t find time. I still want to, because this is big step in my life. I left Glance Creative, app agency where I worked for almost 3 years. 1 All this time together with great CEO, amazing people and doing my best work. Glance has big portfolio, it was fun to work on different projects and ship one app after another.

Me on background with app icon frames built by Glance and Locassa.

I left Glance so I can start new role at IG. I was flattered to receive offer from them, it’s hard to find good place to work in my situation 2, even in London. I’m fortunate to be able to continue to earn money from doing something I love.

  1. 2 years at Locassa, and 1 year at Glance. I usually combine this periods, because 2 companies share same people. 

  2. I don’t have British or EU passport, I can only work in UK under special visa called Tier-2. Visa can be sponsored not by every company and it requires special certificate. On top of extra expenses and paper work, sponsor needs to do market search for 30 days and try to find another candidate from UK or EU before it can hire Tier-2 immigrant. 

Sky Remote With Voice Control.

Monday, April 2, 2018

Sky remote

Spotted this on the Tube. The ad says “My mon is obsessed with Voice Control.” Can you see where is voice control button?

I couldn’t find it so I made this picture. I found full remote picture and still could not find the button. Turns out, the voice control button is on the side. They couldn’t find space to put it on the front? I don’t think my mon would ever be able to find voice button on this remote.

While Apple TV remote has many flaws, at least it has obvious voice control button. It embraces voice for everything, so there’s no search button because you can search with voice. If I would have to design this remote, I would remove most of the buttons and replace search button with voice control.

When I bought my first MacBook Pro, I fell in love with white Apple remote because it had almost no buttons and was so inviting. I am glad modern Apple TV remote inhereted this simplicity.

What's Like To Use Cheap Android.

Wednesday, February 14, 2018

In past 2 days my friend asked me to help with her smartphone.1 That’s the only computer device she uses and she said she “can’t contact my husband any more because of ads”.

Device has to be charged from the top, which was very uncomfortable to use and cable was constantly disconnecting. The battery was old, we could use it only when charging.

First thing I noticed, is how big screen was, compared to my iPhone 6s. It was easy to read, with larger touch targets. That’s a plus, considering affordable cost of the device. Of course with such a low cost,2 there’s many compromises.

She started to show me dozen of apps she didn’t installed, games and gambling apps. While I navigated the phone ads popped up, I saw 4 kind of ads which could appear even on the Home Screen.

  1. Banner in the bottom.
  2. Ads which look like Facebook bubble.
  3. Google Play redirects. When I was using Google Play app, it would show me page with random game.
  4. Full screen ads, some of them even faked lock screen UI.

I was bombarded with notifications and alerts from “antivirus” and “cleaner” which I was canceling, I was sure it will go away after I reset the phone. How naive.

First thing I did is backed up her notes from third-party app. I could log in into Google and sync it. Then I installed Google Photos. Device didn’t have enough space and it offered to delete some apps right from the modal alert, which was nice. However then I run out of space again, and the modal alert offered to delete apps which I didn’t want to get rid of. There was no button to jump into Settings, I had to find storage manager on my own.

We uploaded all her photos and videos to Google. I even liked the experience, because Google offers free unlimited storage. I installed Google Contacts and Chrome. She had almost 2,000 contacts on her SIM card, Contacts app offered to back it up and it’s even cleaned SIM card automatically.

Ignorantly, I didn’t backed up WhatsApp conversations, which is possible to do with Google Drive. I though I could restore them logging in into her account but because her account was linked to her another oversea phone number, we couldn’t receive the text. So I had to create new account for her and we lost all conversations.

I reset her phone from the settings, surprised how many bloatware it had as part of the system. It wasn’t possible to remove system “antivirus” and “app cleaner”, Opera Mini and many other not wanted apps. All I could do is to disable notifications and disable constant monitoring. I didn’t trust it.

My biggest disappointment was the lack of OS update option. The device was sold with 5.1 and it is the only Android version it supports. I couldn’t even find this model on Lenovo website.

Another surprise was lack of Chinese keyboard from the OS. And this is device which specially made for China and sold by Chinese manufacturer. I installed Gboard but it also didn’t have Chinese. In despair, I searched Play Store for “Chinese keyboard” and found another keyboard from Google which did the job, it had only 1 Chinese language option which was poor because iOS has 2: traditional and simplified.

I installed Google Photos, Contacts and Chrome again but at some actions I was presented with option which include system app, there was no way to make OS remember my choice even when I ticked specific “do not ask again” option. This duplication felt through entire OS, there’s 2 settings app and many system apps can be find with alternatives from Google — Clock app, messages app. I tried to install messages app but it didn’t work properly, it didn’t show SMS messages.

Because Lollipop doesn’t have privacy permissions controls, when denying permission and then changing my mind, I had to reinstall an app. App would say “I can’t access camera, restart your phone” — which is ill-advised.

  1. She has Lenovo K50-t3s with 5.1 Lollipop. 

  2. About $106.99 on this day. 

Horrible Custom Smart App Banner Collection.

Tuesday, January 23, 2018

Apple has simple manual for web developers how to make Smart App Banner. It looks like this: Picture from Apple website.

Over past years I was collecting different custom implementations from all over the web. You will be surprised how creative some developers are.

eBay Glassdoor Tastemade Cnet Daily Mail Adobe Peak Telegraph

And still it remains secret to me why would anyone wants custom solution for this problem? Is this blunt ignorance or might be it is designers who think their design is better than standard solution? Or perhaps it’s greed and website owner wants have more tracking? Anyway, this custom banners look worth and don’t work well. They have worth privacy as well, so don’t tap on them.

Screenshots edited in Altershot.

How Electron Made GitHub Desktop Worse.

Monday, January 22, 2018

Not long ago GitHub released new version of their Mac app. Big update which is actually rewrite. New version uses Electron. We know Electron from Slack. I decided to compare 2 versions to demonstrate difference between native and not native.
Website presents new version of GitHub Desktop

The fact that new version is presented as “The new native” offenses me. GitHub Desktop at farthest point from native it ever was.

Let’s look at App size.
2 app sizes

Old app is 63.7 MB and new is 168 MB. Not surprised as web app need to include all dependencies and custom frameworks. Native apps can use powerful system frameworks which is already included into OS once.

Let’s open application. First thing I noticed, minimum window size for Electron app is much larger. Look how many white space is wasted. Old native app could be resizes to much smaller size which makes it’s superior for those who keep many windows on screen and value space.

Native version of GitHub Desktop Electron version of GitHub Desktop

Now let’s focus on the title bar. Electron app missing title. Not only title shows what item selected but is also possible to click on it and navigate file hierarchy. Right Click on the drop down menu and select item, this opens Finder. Title Bar options

New app has black top and white content area. That’s not a good look, usually Mac apps have main color scheme, dark apps dark everywhere, iMovie is perfect example, and apps like Finder and Safari have light background.

On the screenshots you can see how basic “Add Local Repository” interface differs. Pay attention on the buttons styles, old GitHub apps has familiar buttons looks which is the same as any other Mac app, while new Electron app has its own style. Not only it looks out of place, this also adds additional cognitive load. The same is true for apps font, old app uses excellent system font. At least Cancel button is on the left.

Last let’s click on the File menu. Menu bar is important on Mac. Everything that’s app does can be accesses from menu bar, it allows user to study what app can do, it also displays shortcut commands.
Menu comparison

Now here, I have to say, new GitHub Desktop does not a bad job, some web apps don’t have menu commands at all. However particularly in the File menu I noticed that old app had more options. One of most important changes is ability to open multiple windows. This core function is lacking from Electron version.

Another subtle benefit using native app is lack of need to click twice when window not active. Any web site or web app can recognize click only in active mode. Normal Mac apps can receive click events even when window not active. For example, you can click on the + button in top right corner of GitHub Desktop even when window is not active. Any web application will require 2 clicks in this situation.


Web apps never going to feel native. You can call it “React native” but it will not make code more native. You can call it “Electron” but it will not make app size smaller and efficient.

Native GitHub Desktop app is no longer available but you can download my copy. I still use it to this day and I will continue until it stopps working.

Auto Layout Scroll View with footer.

Wednesday, November 1, 2017

iOS simulator screenshot with blue content area and yellow footer

The goal of this Auto Layout exercise is to build scroll view with dynamic content height and footer. There’s 2 challenges here.

  1. Sticking footer to the bottom even when there’s very little content.
  2. Allowing scroll view to scroll even though content height is unknown.

First, read “iOS: How To Make AutoLayout Work On A ScrollView” from Natasha as it’s very practical and saved me many hours.

The fastest and easiest way to get started is Storyboard and Interface Builder. Download sample project from GitHub.

  1. Add Scroll View to your root view and add pin it with 4 constraints. Your root view should have only 1 child which is the scroll view.
  2. Create new “container” view and add it to the scroll view. Scroll view can have only one child view. This was mentioned by Natasha and I always follow this rule since, I lost many hours when I didn’t know about this.
  3. Add constraint for container view width to be equal with root view width.
  4. Add footer view and pin it to the bottom.
  5. Scroll view can’t function when content height is unknown. Add height constraint outlet. In this example for my content I have single label, I don’t set container view height because it will change depending on label height. I pinned label to its superview. Make sure your Storyboard file doesn’t have error messages and layout conflicts resolved.

Interface Builder with footer sticking to the top

At this point you should get something like this in your Interface Builder. We still have some work to do. Open view controller and add following code.

labelHeightConstraint.constant = view.bounds.height - footerView.bounds.height

So far I have no content and we had to increase label heigh so footer sticks to the bottom as design required. If I set text for the label it will truncate which I don’t want. I had to disable this constraint and allow scrolling.

labelHeightConstraint.isActive = false

2 screens with text taking all the space.

iPhone X

I thought I was done but when I run the code I realised it was broken on new iPhone X. Here’s code snippet that helped me.

override func viewDidAppear(_ animated: Bool) {
	labelHeightConstraint.constant = (view.frame.height - - footerView.bounds.height

The key is viewDidAppear because safe area insets equal to zero in viewDidLoad. I also had to disable landscape layout.

I noticed that iPhone X screen is very tall so all my text was visible and footer was in the middle of the screen, I had to activate constraint again. Only disable height constraint when you have many pages of content, iPhone X can fit surprising amount of information.

iPhone X screenshot

State of Mobile Gaming.

Monday, October 30, 2017

Black iPhone and Nintendo 3DS on the white desk.

I carry my Nintendo 3DS almost every day. Completing one game after another, surprised how good and memorable Nintendo games are. I try to play on iPhone sometimes but it always disappointment, ether game requires internet connection or it is too plain, too simple, without a story and characters, repetitive. Generic sense I’m getting from mobile studios is maximising revenue from each player with tracking, dirty psychological tricks, micro transactions and cool-off timers. Sadly neither developers or consumers care about gameplay and story aspects. Yes, there’s a Monument Valley but the game is short and very simple, it’s not comparable to Super Mario 3D Land (recently discounted) or Legend of Zelda.

Is it because price raise to the bottom or short playing sessions or lack of physical controls included with every device, or, more likely, combination of all? I wonder can this market be sustainable in a long run? Classic video game industry always relied on creating something special, experience which is art form more immersive than TV and movies. To play best games you have to own dedicated console. For a long time you had to own MP3 player and photo and video camera separately but now all this markets cannibalised by iPhone. Gaming industry is still separate. Hardware is not longer an issue, even last year iPhone 7 are more powerful than Nintendo Switch, has much better screen as well. So why no one makes exclusive iOS games with big budget and controller support? I am not talking about ports or multi platform games. Nowadays tools like Unity and Unreal makes it easy to deploy game on each platform but this approach doesn’t take advantage of unique hardware aspects like 3D Touch and Haptic Feedback. Or why there’s no iPad exclusive games which take advantage of a larger screen? There’s ports but that’s all.

Nintendo is very smart by releasing Switch which can be used in commute and games which can be played together with all necessary controllers included, games which use consoles unique features (HD Rumble). It’s a natural evolution for 3DS. I am very happy about progress they made and have a lot of hope that people who experienced game on Nintendo console will never look towards Rovio, King again.

Apps Should Work Offline, with Visible Status Bar.

Saturday, September 16, 2017

We have not expensive data plan, and I disable mobile data for most of my apps. I have a problem with “Internet Wall” appearing in even one of the best apps like Carrot Weather (iOS or Mac) or Super Mario Run (iOS). Just today I opened Carrot Weather while on vacation to have white screen of nothing telling me there’s connection problem.

Apple Wather on left and Carrot on the right. Apple app has visible status bar and shows all data even though both apps don't have immidiate internet acces.

And not only I can’t check the weather but I can’t see time, battery level and most important, connection status. I guess developer decided their custom made artistic interface is more important than Status Bar.

I use Carrot Weather for their great Apple Watch app. On iPhone I prefer Weather but I launch Carrot from time to time. Recently Carrot Weather had big 2.0 update with new UI. I am sure developer very proud of all extra features and personality added into Carrot Weather but I don’t care. I even turned off all “fun” features. And this is why I continue to use Weather, it shows me the weather in any conditions, especially when I am trying to manage my data plan usage. It also shows me Status Bar at any screen.

Recently we shipped goEvo (iOS), app with daily planner for meals and exercises, and function to log emotional state and even have 2 way conversations with virtual coach. I am proud that all of its features work without internet connection.

Every non-web software developer should understand that application they develop should not require immediate internet connection. It’s not hard to do, and it’s good for performance and energy efficiency. Otherwise what’s point of making native app? If Carrot Weather can’t do data persistence, they should’ve focus their development building web application instead.

Page 3 of 9