Nomtek Logic

By being a mobile development agency we probably are mostly associated with fulfilling contracts regarding apps for other companies, which is almost entirely true, we won’t deny it. But today I have the pleasure to stress the word “almost”.

We would like to present for the first time our most precious piece of fully enterprise software for efficient administrating of business processes – Nomtek Logic.


Nomtek Logic Corporate management tool

Genesis – A bit of backstory

Why did we create Nomtek Logic? Well, for the most obvious of reasons – because we needed it ourselves…

With a considerable amount of clients, subcontractors and suppliers, tangled in uncountable contracts of various nature, things tend to get messy… And they might get messy very quickly. But does it have be this way? Why do decision makers in your business have to drown in formalities which distract them? Why not make it simple? Those were the questions that made us search for a solution. The first natural reaction was to look for a ready-product that would somehow manage the issues we were starting to experience. Unfortunately we didn’t find anything that would suit our needs in an adequate manner – the found tools were either too complex or were missing particular features required in our case. Thus, we decided to create something on our own, which would be tailored to our needs, and yet simple in use.

What Nomtek Logic actually is?

It’s an online software tool which has two key ideological roles:

  • Limit bureaucracy within service companies and agencies via automation of repetitive management tasks and increased transparency.
  • Drive important processes in order to free decision makers from administrative driving and let them focus on their core function – making decisions.

Currently supported processes

Order Tracking

Supported types of Orders:

  • Fixed price with multiple milestones
  • Pay per Time, Pay per Sprint, Pay per Point, Material billing
  • Change Requests
  • Billed just once, weekly, monthly or in a custom way
  • Other:
    • Price calculation can be specified in an external spreadsheet

All active Orders within the company can be easily reviewed.

Deliverable tracking

The system ensures that responsible persons report the client’s acceptance of deliverables within Nomtek Logic and reminds them of overdue actions via notifications on either e-mail or other supported channels (e.g. Hall)

Automated invoicing

The system collects all information for all supported Order types and acceptances required for invoicing from the right people in the right time. Then it generates the invoice and sends it to the client.

Invoice Status and Vindication

  • The user can list all active invoices for a particular Client (e.g. incomplete or not covered), all unpaid invoices in the company or all invoices from a certain month.
  • The user can generate a nice e-mail with all invoices and payment details for a specific client.
  • The system can register incomplete/partial payments from clients and already paid amounts can be moved across invoices.
  • The system will remind about unpaid invoices when the due date expires and allows to define an additional payment term.


You can check your total revenue in each month and your total unpaid invoices before and after due date.

General features:

  • VAT EU support
  • Multiple currency support
  • Multiple bank account support
  • Integration with Infakt for Invoice generation
  • Notification channels:
    • e-mail
    • Hall (corporate instant messenger)
    • Possibility to integrate with other channels
  • Unlimited number of users
  • User roles with access restrictions


Nomtek Logic Screenshot client dashboard Nomtek Logic Screenshot client details editing Nomtek Logic Screenshot invoice editing


Although the product is somewhat early in development, it fully supports all of the aforementioned features and this makes it ready for public usage. However, at this stage, we would like to keep its distribution controlled to some extent, so we’re refraining from traditional “buy and sell” methods, but this does not disallow anyone from asking us on how to obtain access. On the contrary! Send us a message and we’ll talk over the integration of Nomtek Logic for your company.

Scanning rooms with an iPhone

About a month ago I worked on a prototype project which would allow users to measure their rooms using an iPhone. It was a very interesting experience and I would like to share what I have learned. First question which comes to mind is – is it even possible? Answer – yes, it’s possible and was done before (look at Roomscan app on the AppStore).

As usual with this kind of task, before writing the first line of code, I started with some research on the subject. Turns out this topic is quite often picked up by a variety of people on different sites. Almost all of them are told that it’s not possible or very hard to accomplish. Don’t be discouraged by this, just as I wasn’t. I just told myself, that there is no learning without trying and picked up the first physics book that I was able to find. Yes, physics! You will see why…


Gathering data

As most of you know, the iPhone can detect its movement. What you probably didn’t know, is that it has three sensors to do so. First and most important is the accelerometer – it measures the acceleration affecting the device in a 3D space.

iPhone accelerometer axis graph


The second one is the gyroscope which detects the rotation of the device, relative to the gravity.

iPhone Gyroscope


Last but not least is the magnetometer, detecting magnetic direction the phone is facing in relation to the real world north direction.

iPhone magnetometer



Calculating distance

The data from those sensors is easily accessible with the Core Motion framework. So where is the problem? Well, first of all we can get the acceleration, the rotation and the direction, but not the distance. So how to transform the data we have to the data we need?

At this point, we cannot proceed without some basic knowledge of physics. What is acceleration and how to derive distance from it? Acceleration is a vector (a vector is a mathematical entity which has a value and a direction in a 3D space – x, y, z coordinates) which describes velocity changes in a given time and can be described with the formula below:

acceleration = velocity change / time change

If the acceleration is constant or time change is very small we can say:

velocity = acceleration * time

Now we have the velocity which gets us one step closer to getting the distance. Velocity is also a vector – it describes the rate at which an object changes its position.

velocity = distance traveled / time of travel

Again if the velocity is constant or time of travel is very small we can say:

distance traveled = velocity * time


If the initial velocity is equal to zero then:

distance traveled = (acceleration * time) * time

And if not then:

distance traveled = initial velocity * time + (acceleration * time) * time

Simple? Maybe… But we have to remember that those formulas are 100% accurate only if time between measurements is infinitely small, which in real life isn’t possible. Core Motion maximum sampling frequency may vary between the devices but should be in a range of 50 – 100 measurements per second. It’s not much, but it’s enough to get some usable data.

Ok. We have displacement (vector of distance) but its x, y, z coordinates are in the coordinate system of the device, which changes when we rotate the device (z axis is always pointing from the screen).

This type of data is useless, unless we transform it to the world’s coordinates system. To do so we need the data from the other two sensors – gyroscope and magnetometer. To make this kind of transformation we can use a rotation matrix (you can find more information on the subject here). Fortunately, we don’t have to calculate the matrix manually, as it’s already done by the Core Motion framework. Our only job is to use it to transform the initial displacement vector.

At this point, if we were living in a perfect world, we would get a perfect displacement vector, which means we would be able to accurately reproduce the device’s movement. Unfortunately, inaccuracy of motion sensors comes into play.


Boosting data accuracy

Don’t give up yet, as there is hope! Instead of using raw data from the sensors, if we pass it through a well selected virtual filter, we can get some nice results. A low pass filter will smooth out the data we receive and a high pass filter will cut out the noise from our measurements.

Accelerometer data diagram with and without low pass filter

Accelerometer data diagram with and without low pass filter; Source.

With filtered data we get much better results – not perfect but usable. To get the best results I tried a lot of different approaches. In the end I chose LERP (a kind of a linear interpolation which takes a previous data point into account when calculating the next one) for its simplicity and rather fine results.

xValue = oldXValue * lerpFactor + newXValue * (1 – lerpFactor)

After about a week of research I was able to receive results with about 20 – 40 cm of measurement error which in my opinion is bearable. With a better filter the measurement error can be further decreased by a meaningful amount. Here are some screens from my app – the curved lines are paths I walked with the app turned on.

Basic room scanning app result

I walked through my room from corner to corner touching each one (green points). It’s clearly visible that I didn’t walk in straight lines (because I had to bypass furniture). The last two corners I touched twice in the same spot but the green points are misplaced. It happened because of the device’s inaccuracy.



So is indoor distance measurement usable for real life applications or is it just a meaningless feature? It depends on how would you like to use it and what level of accuracy you require. I’ll leave it for everyone to decide on their own.

PS. I was working on iPhone 5. iPhone 6 and 6+ have a new generation of motion sensors. Can’t say without testing, but it’s possible that distance can be measured with a much better accuracy on the new devices.

Poland scores second as the best country for education in the world!

There is a common knowledge among the Poles that our level of provided education is mostly adequate, but on a personal note, I never expected that we actually would be indexed as the nation which has the second best education on the whole globe.

According to OECD “Better Life” index, Poland is right after Finland (the undisputed leader), with the highest score in “Education”.

OECD Education Poland second best


How OECD gathers data can be found here.

I won’t deny that one of Nomtek’s key selling points was, that “we provide the best talent available” and we wrote about Wroclaw being one of the most potent Polish cities when it comes to human ingenuity, going as far as branding it the “Polish silicon valley” (whole article here), but what OECD gave us, is proof of what we believed in, and that’s, for lack of a better term, awesome!

As a marketer, it fills me with great pride and joy that I can back this claim with such strong evidence. After all, how often does one get a chance to work with people, who have the potential to become the best in something in the whole world?

Adjusting your app to iOS 8

Apps under iOS 8

I’m sure most are aware that recently Apple launched a new version of the iPhone operating system – the iOS 8. For those who did not have the chance to catch the latest news – the launch happened yesterday. ;)

Instead of simply spreading the news around, we decided to go swiftly with a step further and briefly analise what opportunities and potential problems the new OS may create for existing apps.

Our first and foremost advice before reading further:

Do a quick test of your app ASAP! If anything, it might be crashing under iOS 8.

After you verified the above, which is after all the most important issue, we can continue with the subject. :) The core of our analysis was to pinpoint potential problems in our own existing apps and share the knowledge found in the process, as well as to give a bit of advice. Generally, please treat the cases we included here as “areas of required extra attention”. Here we go…

  • So far, the graphics had to be delivered in two versions – for Non-Retina (1x), and Retina (2x) display. Now the iPhone 6+ comes with a higher screen resolution than any iPhone before (iPhone6: 750×1334, iPhone6+: 1080×1920) and the highest Pixel Per Inch ratio from all portable “iDevices” – 401 PPI.
    This forced Apple to add a new standard for graphical resolution in applications – they called it “3x”. This is why we had to add new high resolution graphics to make sure that our app looks perfect on the new iPhone. It was little tricky though… Generally, before showing anything to the user, the image is rendered with a resolution of 1242×2208 (3x) and then downscaled to fit the screen. Because of this, we had to use the graphics with a resolution of 1242×2208.
    This link provides some useful information on how to prepare graphics for the new iOS:

  • The new iOS means a new iOS Compiler for developers… And all compilers differ more or less. With the new one our code couldn’t be compiled without errors or, in worst circumstances, the app crashed during run, which renders it useless.
    If you took our advice at the beginning of this article and verified that your app is indeed crashing, the case presented below might be somewhat helpful.

    The new compiler does not generate iVars automatically when overriding fields, but a fast solution to add @synthesize fixed those issues.

    @interface Foo : NSObject
    @property (strong,nonatomic,readonly) NSString *description;
    @implementation Foo
    @synthesize description = _description; //Required in iOS8
    - (instancetype)init
    	self = [super init];
    	if (self) {
       	_description = @"FooBar";
    	return self;
    //Second example
    @interface FooOperation : NSOperation
    @property (assign, nonatomic, getter = isExecuting) BOOL executing;
    @implementation FooOperation
    @synthesize executing = _executing;
    - (instancetype)init
    	self = [super init];
    	if (self) {
        	_executing = YES;
    	return self;

  • Another issue was discovered when we noticed that some of our views are not looking good when compiled with the new compiler. Sometimes the margins were wrong, and sometimes the size wasn’t correct. The reason for this was, that the custom UICollectionViewCell (created via XIB) does not have a specified ContentView (visible in e.g. UITableViewCell) in the view browser. Thus, if we wish to use AutoresizingMask in a view (when we’re not using e.g. AutoLayout) it is impossible to turn those on within Interface Builder (IB). A solution is to do it via following code:
    - (void)awakeFromNib
        [super awakeFromNib];
        self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    What is strange, is that the behavior of the view differs in iOS 7 and iOS 8. The latter has AutoresizingMask turned on and the former has not. This causes the views not to rescale properly:

There were some other, minor inconveniences the update caused to our other applications, but those seem to be specific to said apps, rather than iOS 8 itself.

But the iOS 8 isn’t all about issues and problems. It’s important to remember what the actual merit behind upgrading any system is – the novelties… Yes, each update is designed to bring something new to our phone: make it faster, more reliable, expand its functions and make more pleasurable to work with. Let’s focus on what can the new system offer.

The Looks

As with every commercial OS from Apple’s shipyard, it would be awkward to start with anything other than the aesthetics, especially with the complete redesign of the iOS 6 to iOS 7 Apple served us last time. However, this time Apple decided not to make another 180 degree turn. In fact the changes are very subtle…

  • The “Today” screen received an overhaul, mainly through the addition of Widgets and some customizability features.

While the visual novelties cannot be branded as something stellar, the support for app Widgets is definitely a great addition to have and will allow applications to serve with additional content.

New functionality

Most of the new functionality supported by the new iOS is directly interconnected with either the iPhone 6 or the Apple Watch, since those devices hold the necessary hardware to facilitate the said new features. It’s not hard to understand the reasoning behind the design – Apple has always looked more into the future, focusing most, if not all, effort in software support on products they have just shipped or are just about to ship.

  • Widgets – Although we mentioned them in “The Looks” section let’s not forget that those are a part of functionality, probably even more than a part of aesthetics. Having a widget basically provides for an additional screen which can be filled with app’s content – your content, thus providing the app with more popularity and usage time if utilised correctly. A more elaborate medical reminder, a stock auction monitor? The possibilities just improved vastly.
  • ApplePay – A service similar to PayPal with a bit extended credit card management and shared card data between different other services – e.g. all cards added to an iTunes account are instantly available for other transactions. Since the iPhone 6 will allow for NFC payments, it is only natural that its operating system has to have something more elaborate in the payment service area. We’re very positive that this will be a great addition to enhancing future apps – a unified payment solution without the need to search for additional providers, middle-man nor a requirement for users to register at a billion other services. We can’t think of an easier way to turn your app into a mobile shop.
  • Custom keyboard support – This is a groundbreaking functionality if looked at closer. The original iOS keyboard, although branded as outdated by some, was sort of iconic for the iPhone and iPad products. Since Apple is opening a new niche path for developers, we can foresee the Swipe system developed for iOS even at this point. SwiftKey already grabbed the opportunity:

To bring some perspective to the whole topic, we can say that the direction Apple is taking with the new iPhone is definitely towards functionality instead of simple riding on brand awareness. How will this pave the company’s or the product’s future is yet to be seen, although personally, we have high hopes. From our point of view, new functionality equals new challenges and paths to explore.

How channel-based IM tools optimize work efficiency

Hello fellow programmers!

In this short text I explain just one argument why is it worth to use a channel-based Instant Messaging service within a company, like HipChat, Slack or an old and good IRC. The reason is notifications.

Every day we get many notifications from ticket management systems, social networks and numerous other tools. Some of them are more interesting, others are less. Of course we should avoid receiving spam i.e. notifications that don’t bring us any value – those are expensive time eaters. We should really take care and make sure we are not receiving notifications that we don’t need.

When used properly, notifications are very helpful. Here’s a list of some interesting notifications that we have already configured within Nomtek or are going to configure them soon:

  • someone has submitted some code and continuous integration tests have failed
  • someone commented upon an issue within the issue tracker
  • a client did not pay on time – it is necessary to send a reminder
  • a particular programmer will soon have no tasks assigned and should be assigned a new project
  • someone has retweeted one of our tweets
  • there is a new big deal on our radar

Traditionally, companies would use e-mail for those things.

Emails need to be clicked to see the content. IM by nature do not require to get inside, as long as we are looking at the right channel.

Clicking an email in reality is time costly. You may say it’s a simple action but in reality, if it takes 2 seconds more than optimal time, it is a big difference, especially if we would like to deal with many notifications and communicating with others is a big part of our daily work.

With IM channels, you may not want to look at particular channel, like for example a Marketing channel, if you are not interested at the moment. Notifications can be easily directed to channels with services like It is enough if one person configures a notification and then all interested people can join the channel and take benefits.

Of course we can imitate IM channels within our e-mail clients by creating folders and filters (mark as read and move to folder). This may be a good alternative for one user but it will not be so for organizations, as it is normally too difficult to force the whole organization to use the same configuration of folders/filters.

Getting access to information faster often brings more value than we previously thought. Before purchasing my first MacBook I would never complain about my laptop’s launching time – I considered it to be pretty good. The first MacBook I’ve had was waking up much faster and then I discovered that for this simple reason the computer can be used in numerous new situations in which I would not bother with more traditional PC, for example during a car trip to my customer’s site.

Software RnD organizations exist where checking out a code repository in order to start the project takes 2 hours and no one cares about it, so why would I care about 2 seconds? That’s why:
Our short term memory has its limits. When we put additional tasks or information into our short term memory or need to keep the information for a bit longer, some part of the context that was residing there gets kicked out or fades away, even if the new task are just two additional moves of our hand. Any disruption of this form removes our ability for deeper insight and better decision making. From this perspective every time or effort improvement related to communication tools is a huge step, especially in cases when our work is brain-intensive and we communicate a lot with people and systems. We can unlock more brain power by limiting the number of clicks and time delays. Making better use of the last few parts of our short term memory should give us a lot of extra power.

This is why I would suggest to every software organization to pay more attention to communication tools that are used. In particular, I would recommend to use more sophisticated IM tools created for business and to deliver notifications as instant messages to channels within those IM services.

First impressions from Swift programming language

Hello fellow programmers!

A language for a programmer is his/her ultimate medium of expression, we are spending thousands of hours editing the code, thinking in the code (sometimes even dreaming in the code :) ). So it’s no surprise that introduction of new programming language from Apple was the most exciting event for us at the WWDC conference this year.

After spending some time on analysing this new programming language we have a few spots that we want to share with you. We are really excited about Swift. It looks like a much cleaner language then Objective-C. Below is our list where + means pros, - cons and +/- something in between ;).


+ no need for semicolons

+/- ranges – Although we really enjoy the addition of ranges, the syntax for it is a bit confusing. It is really easy to miss one additional dot character.

Error handling

+/- assertions – We are not sure about the decision of disabling them in the production code. Although you should eliminate situations like that in the production code, if you happen to forget to do that, they can provide you with a nicely formatted feedback.

- no exceptions – We don’t see any easy way to control exceptional flow of your application. Was it a design decision?

Variable and constants

+ var for declaring variables

+ let for declaring constants

+ tuples – You can use them with optionals and enums for error handling

+ type inference

+ optionals – Really good protections against nils, the motivation for such a solution has a good explanation here:


+/- == for equals, === for identity check – getting used to this change can be painful at start. Also to define your own equals you need to use operator overloading.

+/- operator overloading – you can override an operator for your types, but you do it by a global function


+ there is no visible distinction between a function, a method and closure – you can now do a lot of functional programming stuff (functions are first class citizens – you can have a function as a parameter to another function, you can return a function from another function, hooray!)

+/- functions with more than one argument – We find the new syntax of calling methods and functions a bit confusing and inconsistent. The first parameter without a label, next parameters with labels (unless it is an initializer and you haven’t specified other rules with # and _ characters)


+ automatic imports

+ default values for properties

+ is – shorter than isKindOfClass and still self-explanatory

+ as, as? – really simple and safe (because of the optional mark) type casting

+ AnyObject, Any

+ generics – welcome type safety in collections :)

+ subscripts – nice syntactic sugar

+ override annotation – the compiler can warn you about accidentally overridden methods

+/- only properties, no instance variables – if you override your getters and setters you don’t have access to the instance variable. Probably you need to declare an another property to store your value (or is it an instance variable then, like in C#?)

- class keyword for static (type) functions – why not one keyword for classes, structs and enums?

- no access modifiers – this is the most problematic issue with Swift right now. You can still use conventions (underscore in the name for private methods), but it is nice to have some mechanism to control that. We heard that it will eventually have it (

- no (or bugged) method overloading – right now you can write functions with the same names and different parameter types, but at runtime only the first one will be used (for all types)

Structs and enums

+ value types – structs seem to be excellent for little domain types (

+ enums – you can encapsulate all your switches in one place

- mutating – it seems to be really weird to have immutable structure which sometimes is mutable

- array – it is really hard to understand when two arrays are no longer the same

- static for static (type) functions – why not one keyword for classes, structs and enums?


As you can see we identified much more pros than cons. Readability and clarity of Swift is much higher than Objective-C, it looks that it will be a real joy to write applications in this new programming language. The biggest pros for us, except elegance and clarity is incorporation of functions as first class citizens. It looks that learning functional programming paradigms was not in vein – now we will be able to use at least some functional programming idioms in Swift :D. Also we love the way Apple tackled the nil problem – optional values is a bold decision that should greatly improve reliability and maintainability of iOS applications. And last but not least: let and var keywords for constancy and variable declarations, finally there is a language that doesn’t assume by default that you want a variable. In fact, the opposite is true: what you want is usually just a constant and now we have a very nice way to express this by the let word. Also there is a beautiful symmetry here: when you want a variable you have to declare it with var. So there is no default, you always have to use var or let, two 3 letter words that will indent the name of your constants or variables by exactly the same number of characters.

Kudos to language designers. Thank you!

Online resources for designing mobile UI patterns

Recently we’ve been researching to topic of GUI design. We’ve came across several services that gather impressive patterns which could prove as an invaluable inspiration when creating your mobile application, be it Android, iPhone or Windows, and we would like to spread the word about some that we find are more than worthy of mentioning:
Mobile Patterns (

Pttrns (

UX archive (

Pattern Tap by Zurb (

Inspired UI (

Android App Patterns (

Evaluation of Hall as an instant messaging tool

Hall Logo

Recently we decided to re-evaluate the idea of using Skype as an instant messaging tool within our company. Although Skype is the most popular software for most of our clients, thus we have to continue using it, we thought we might utilize something else for internal communication.

We have considered: HipChat, Slack, Hangouts, Hall and Unison and decided to go with Hall. Here are the pros and cons of Hall in comparison with other popular tools:


  • Unlike Skype, Hall supports a fully searchable chat history stored in a cloud. It does not require both sides to be online in order to pass the message. Channel history can act as project documentation for new joiners. More of company’s knowledge gets stored and stays available for future generations.
  • Unlike Skype and Hangouts, Hall supports team’s opt-in channels. This means that people can join channels when they need – they don’t have to ask anyone to add them to the channel. This means less administrative work when people switch between projects.
  • Unlike Skype, communication within Hall is fully secure and there were no big scandals related to that.
  • Unlike Slack and HipChat, Hall allows to invite collaborators from outside of the company to join the channels in a convenient way. This means that our customers can collaborate with us more closely. This is also crucial when we work with subcontractors.
  • Unike in Unison’s plans below 15USD/person/month, Hall offers API integrations with external services at reasonable price. We will add more spice to our collaboration by integrating with Jenkins, Gitlab, JIRA and CRM.
  • Hall works on mobile. Available mobile apps are still not mature, but they are already usable. Maybe we could help with improving them?
  • Reasonable pricing. Lots of features are free and a sensible paid plan starts from 3 USD / person / month. As we are mostly based in Poland and our earnings are lower, this is a big advantage for us.


  • Lack of a native client for Linux. It is sad to see, but Linux seem to be forgotten also by other providers except for the very big ones like Skype or Google. Some of our employees use Linux and they will have to stick to the Web version. Unfortunately video conferencing is not supported on Linux at all, so in most cases we will have to continue working with other tools.
  • Unlike Skype, Hall is a fully online tool. When network disappears, Hall just stops working. It may be problematic e.g. during a car trip to a client. Other tools of this type like Slack or Unison have the same disadvantage.
  • Hall has not so many integrations and most of them are one way: from an external tool to Hall. We are happy with Jenkins integration, but for other tools like JIRA or Gitlab we will have to implement integrations manually.

Other & Nice-to-have:

  • Hall supports Files, Notes and video conferencing. Alternatively to that, it might be better to use Google Drive, Hackpad and Hangouts. Hall lacks integrations with these services, but it might be not a big disadvantage if the existing implementations are good enough.
  • Better support for code snippets would be nice. Not a big problem now.
  • It would be nice to have Links support within channels.
  • A possibility to check who has actually read the message and a possibility to edit a message that was already sent would be nice.
  • Unlike Unison, Hall does not support in-channel topics. Topics seem like a very nice way to organize the information, we would be happy to see them in the future.

Instant messaging is very important as it is at the heart of swift online collaboration. By analyzing the market and switching to better tool we look forward to providing better services to our clients.

Krzysztof Choma

Learn why Vim is Awesome under Xcode in 35 seconds

Hello everyone! The recent integration trip provided a lot neat presentations so we figured why not let our developers go a bit further with all the cool ideas they have and share those on our blog!

We’ve decided to make a series of video sessions which will demonstrate various tips & tricks of the trade which is mobile app development, presented by non other than our team. You’ll be able to learn about various niche, but still excellent tools, device capabilities, business practices, etc. from future vids. We will try to post subsequent episodes in more or less steady intervals, as long as the time permits. :)

Without further ado, I’d like to show you our first episode where Stefan presents using Vim in the Xcode environment.


Nomtek Integration Trip 2014

This year’s integration party was indeed something different! Instead of standardized “pub sessions”, we decided to spend some quality time in the mountains.

Although mountain-climbing is not our first field of expertise, we did fairly well during the first day – almost reaching the top of one of the most popular peaks in our beautiful country.

Nomtek Team

However, the best part was the evening party, which included presentations done by non-other than our own members.

The theme was basically free-for-all – anyone could choose the topic of his/her presentation freely, regardless of relevance to Nomtek, our business, technology or to “mobile” in general, but since all team members are very passionate about their work, the topics of most presentations were exactly that. Guess the geekiness took the better of us :).

A quick showcase of just a few presented topics:

Cheap mobile flying” – How to find your flight when you’re mobile
by Tomasz Odrzywołek


Map wallpapers using Google Maps” – How to decorate your walls with Google Maps
by Paweł Leszkiewicz


Who killed Change” – A brief review of the book by the same title
by Mateusz Płatek


Soup: A Recipe to Nourish Your Team and Culture” – A brief review of the book by the same title
by Krzysztof Pobiarżyn

Soup: A Recipe to Nourish Your Team and Culture Soup: A Recipe to Nourish Your Team and Culture


Project’s vision: Client vs. Developer” – A summary of differences
by Wojciech Wilczyński

Project's vision Project's vision


What persuasion really is” – A lecture on ethically correct negotiations
by Piotr Mezyk

Persuasion Persuasion


The list of all presentation topics:

  • “Using VIM editor in Xcode and AppCode”
  • “Solid object-oriented programming”
  • “Who killed Change”
  • “Cheap mobile flying”
  • “Soup: A Recipe to Nourish Your Team and Culture”
  • “iOS vs. Android – sound processing”
  • “Wearables – showcase from a fair in UK”
  • “Map wallpapers using Google Maps”
  • “Project’s vision: Client vs. Developer
  • “AirCombat and airplane models”
  • “Polish sounding words in Russian vocabulary”
  • “How to manage time efficiently”
  • “Six styles of management”
  • “What persuasion really is”

Should you wish to know more about any of the topics, write to us using the form. We’ll be happy to familiarize you with what the presentation was about. :)

Both of the photo albums can be browsed here:

Core Data meeting

Since constant self-improvement is key to achieving success in the mobile business, we organize internal meetings at which our team members discuss various aspects of app development process.

This Wednesday a meeting was held by Adam regarding Core Data and its appropriate handling in multiple threads.

 Core Data Meeting

Among other things, the discussion also touched the subjects of Grand Central Dispatch (GCD) and proper application architecture.

Should you wish to know more, just ask away in the comments. :)

Apps World 2013 London and Mobile IT-Expo 2013 Paris

Apps World 2013 in London

Apps World

Same as last year, we were present at AppsWorld in London, expending our footprint on the English market. The interest in our company was even bigger than before and we had many long discussions at our stand about probably each and every aspect of “mobile” this world knows – be it mobile business, innovations in development, cross-platform solutions, usability, etc.

AppsWorld 2013 Workshops

The trade show itself seems to be gaining popularity as well, since apparently it had a lot more visitors comparing to the previous year and our team on-site reported that it was clearly visible it in terms of a huge crowd. Maybe that was the influence of Steve Wozniak being one of the main speakers in the workshop area. Who knows?

AppsWorld 2013 Nomtek CEO

From my perspective, as a the person responsible for organizing Nomtek’s presence at such events, if you’re an entrepreneur, developer, small/large IT company, a mobile geek or just a guy/girl with an idea for an app, AppsWorld is the place to be. You will definitely find something for yourself, as well as someone who you can discuss your ideas with all day long.

AppsWorld 2013 Nomtek Team

We will definitely be going next year, so if you want to “talk apps”, you will know where to find us. ;)

You can view the whole photo gallery here –> LINK

Mobile IT Expo 2013 in Paris

We usually don’t focus our marketing operations on areas further west than Germany and UK (although you can find USA in our portfolio as well), thus we treated this venture as something that can be best compared to a market expedition. I must admit I had a couple of moments of doubt that this might not work in the end, but it seems that the French market is more welcoming than I originally (and wrongfully) expected.

Mobile-IT Expo 2013

Although most of the exhibitioners were French or French-speaking companies, our stand managed to become something of an exotic business contrast. With some effort on our part, we adapted to the situation and the language barrier soon became non-existent. I noticed that the interest in our company was growing steadily during the two-day conference, during which we discussed many aspects of the domestic mobile business trends.

Mobile-IT Expo 2013 Nomtek

To say that French mobile market is different would be incorrect and correct at the same time. They follow the same processes and keep up with technology as anyone else, yet they have different preferences when it comes to choosing suppliers, working methodologies, etc. We will definitely be keeping a close eye on how this market develops during the near future.

Wroclaw – A Polish Silicon Valley

Wrocław seems to be an ideal city to become a Polish Silicon Valley. It is situated near the European centers of technology and presents a more cost-effective opportunity than countries like Germany or England. It offers the space and infrastructure as well as many well-trained young engineers to attract investors, guest conferences, or even raise new industrial centers and departments for different companies operating in diverse business areas.

Wrocław has over 100 000 students, and about a half of them study on some technical faculty – over 30 000 are educated at the Wrocław University of Technology and a few thousand at University of Wrocław, Wrocław University of Environment and Life Sciences as well as some private colleges. That gives us an immense amount of young, talented people, really passionate about science that want to have their own input into technology and are willing to bring new energy and ideas into their future companies.

We can often see the most gifted of them wining international competitions, eventually becoming better than their colleagues from foreign countries with bigger funding allocated for research. This year a mars rover which was built by Wrocław students won a second prize in an international competition in the USA (source). Our students often win international mathematical and IT competitions. This year in Hannover, on CeBIT, which is a well-known international exhibition of IT companies, Poland was a partner country and we could see some inventions of students from Wrocław – for example a robot, which can react to human moods, relate to them, and even engage in conversation.

I cannot omit to mention that for the last three years Wrocław University of Technology leads in obtaining patents, and some of them are really useful in everyday life. E.g. a driving gear for wheelchairs that can help with moving around the city and avoid obstacles.
A big boost of energy for the city are many startups that appeared in the last decade. Last year Tequila Mobile created the computer game named Fantasy Kingdom Defense that has turned out to be a hit in many countries. Taxi5 – a really successful mobile app for ordering taxis, is one the bigger venture capital investments in 2012 with a budget over two million PLN (around 480 000 EUR)

With the constantly growing number of startups, many institutions and events have emerged that offer support and organize workshops for people that have theirs brains full of ideas but often are beginning their adventure with the hard welcome of business and management and need some hints in order not to get lost in the bureaucratic complexity of running an private firm, or for those who handle themselves quite well in the world of business, but on the other hand, have a problem with stagnation and lack of creativity.

As an example, I can mention the “Akademicki Inkubator Przedsiębiorczości” (“Academic Entrepreneurship Incubator”) or “Wrocław Startup Weekend” that “(…) is a global grassroots movement of active and empowered entrepreneurs who are learning the basics of founding startups and launching successful ventures”. (source)

Within the last few years we can observe that more and more international companies are interested in having their department section in Wrocław. We have the opportunity to work with multinational corporations like IBM, Nokia, Volvo, HP, Google. According to PricewaterhouseCoopers, Wrocław has great potential to develop even further and is appreciated by foreign companies, which consider it as a very good place for investments (source). We can assume that it is just the begging of a wave of interesting projects that will take place in our city.

The “Wrocław Technology Park” already exists for over ten years and seems to work and expand pretty well. It gains many prizes and distinction in business rankings, connecting science and innovations with companies that can benefit greatly from scientific research. It provides ideal infrastructure for people that cannot afford to invest in private laboratories, computers and equipment they would need. Recently, the Wrocław Technology Park opened a kindergarten with a goal to “infect” children with passion for science and exploration of the world.

All of those factors make Wrocław an ideal labor market for technological specialists, especially in IT. Although their number is already great, employers still have the need for more programmers and other specialists in the field. Young people have a chance to start employment and gain practice already during their studies and experienced workers can earn good money and find a company that will meet their expectations.

Let’s hope all those positive trends will last for a long time and Wrocław will become more and more modernized, open for technology, well organized and a nice-to-live metropolis, being tagged officially as the “Polish Silicon Valley”, and maybe, with its rich culture and numerous initiatives, it will evolve into something even better and unique.

iOS 7 has arrived – brief summary

The new operating system for Apple devices has finally dawned. Whether it was anticipated though, seems to be debatable.

Since being an iPhone user myself, I have been regularly peeking what the Internet has on the topic. The minute first designs started leaking into public knowledge, I knew that the new image Apple has presented us with, will be found at least controversial. However, my intention is not to discuss any subjective feelings we might have regarding iOS 7, but nearly to communicate that it is here, and we all have the benefit of trying it out.

  • Most notable feature that draws the eye immediately after startup are the icons, which seem to look much more simple, almost plain even. Much less vibrant than what we were accustomed to, but I guess they get the message across.

iOS7 icons

  • The other new distinctive difference from the predecessor, is utilizing a partial transparency effect in the roll-down screen, which seems to resemble the idea of Microsoft’s Windows Areo interface.

iOS7 transaprency

  • Functionality has not been omitted, as a roll-up screen has been implemented which serves as a sort of quick-settings menu, allowing us to adjust our device’s screen brightness, operating mode, etc.

iOS7 new screen

I’ll try to refrain from revealing everything iOS 7 has brought before we change this post from an announcement to an analysis, but on a side note, I am very curious how the new set in style will influence app development trends. Will future apps share the raw and simplified feel of the operating system they are made for? Or maybe there won’t be any influence at all, meaning that Apple’s ability to direct visual standards goes as far as their own OS? Time has yet to tell. ;)

iOS7: How to check how your app will look like in iOS6

The iOS7 has whole UI redesigned from the ground with many UIKit elements looking completly diffrent.

However, you would like to see how to check how your app will look like on older iOSes. Here is how to do check it:

1) First, open up “Assistant editor” (⌘Cmd + ↵Enter + ⌥Option)

1 Assistant Editor

2) Then click on “Automatic” and select “Preview” -> “Main_iPhone.storyboard (Preview)”

2 Preview 3 Preview2

3) Now in “Assistant editor” you should be able to toggle beetween iOS 7 and iOS6.1 and below previews.

4 iOS7 5 iOS6

The coming of iOS 7… And the consequences.

iOS is comming

Apparently next year will be full of technological surprises. Apart from one… Apple has prepared something new, as usual.

Let us go back in time for a while. In 2010 we saw iPhone 4 with a new retina display for the first time. Two years later iPhone 5 pops up and it was “the biggest thing that happened to iPhone since iPhone”. In both cases, the changes were special since the user got something totally different from what he used previously.

The outcome was that in both cases developers and designers had to make some improvements to their apps in order to adapt it to the new device. When the iPhone 4 with retina was in spotlight we had to make graphical elements look sharper and in higher resolution. In the case of iPhone 5 whole UIs had to be redesigned to accommodate a larger display, so that those who wanted to see a difference between iPhone 5 and iPhone 4/4S would get their wish fulfilled.

Since almost half of our office staff are passionate iPhone users, which most of have iPhone 5, we did get a chance to see the issues first hand. We saw apps that did nothing to their UI since their first release, as well as apps that weren’t adapted to the 4-inch displays, and we saw them fail due to those reasons. It has to be kept in mind that Apple is the one who dictates standards for their system, and if you won’t follow this thought, then someone else always will, taking over your user base in the process.

And yet here we are in 2013 waiting for iOS 7 to bring simplicity to our phones. As Apple says “simplicity is about bringing order to complexity”. The truth is that it will be chaos. Every app has its own defining style, which is usually designed to fit with the old system’s UI. Unfortunately, with the upcoming changes, it will, to put it bluntly, just look bad… The design will seem to be old, and most users will switch to alternative apps which supply similar functionality just for the sake of having a new UI.

Many producers and developers will try to justify the decision not to act by claiming that the case will only reflect on iOS 7 users, however, to be perfectly frank, everyone with iPhone 4/4S and iPhone 5 will be affected, which probably includes your user base as well. It is estimated that just in two weeks after the release of iOS 7 80% of devices will have that system. Now seems to be the best chance for going ahead of competition and upgrade apps to a new look and feel.

P.S. Be vigilant, don’t get crushed by the next “Big Thing”.

HTML-based vs. Native App – How to choose the right option?

HTML vs Native

From time to time we have to face the following situation: a potential customer wants us to develop an application so that it works on all devices, on all platforms (iOS, Android, Windows Phone, etc.). So far so good. The only problem is that the customer obviously doesn’t want to cover the costs of implementation for each separately. Well, he saw some websites or e-shops before and they worked “fine” on his Blackberry, iPhone, Nokia, desktops and tablets. He might have even heard of PhoneGap, Appcelerator, jQuery Mobile or Sencha Touch. Long story short – when we recommend separate solutions for all the supported platforms, he simply thinks we are trying to rip him off. Why pay three times for something that could be done just once? Or maybe it couldn’t?

Trust me, we tried this before, so we have experience in the matter. Let me just list the problems with HTML-based “universal” solutions:

  • Performance (in general): let’s say that an app is a game and it needs a stable frame rate (24 fps). It’s almost impossible to achieve this in a “universal” app. HTML performance is really poor when compared to native apps. This is especially true on older Android “feature phones”. Actually the app doesn’t have to be a game – it’s hard enough if it needs to show a lot of data on a single view, for example: a long table or grid view. This may freeze the app completely for some time.
  • Smooth animations: native apps can take advantage of the built-in core animation systems accelerated by GPUs. Full screen rotations, custom animations or shadows are smoothly rendered even by old devices, e.g. iPhone 3GS (it’s CPU – only 400 MHz). It’s not possible to achieve equally good results with HTML-based solutions.
  • Native APIs: does the app needs to access the accelerometer, GPS or camera? It’s not directly accessible from HTML and all platforms (or even different devices) may have slightly different APIs for native functionalities. We end up writing a bunch of plugins to unify the results.
  • Maturity: HTML-based universal solutions are often made by some 3rd party companies that are definitely not as mature as Apple or Google. The results? Poor documentation, major changes between consecutive framework versions… It can get really hard if at some point you must update your app, and in most cases – you do, for example to adjust it to the new iOS version.
  • Maintenance: this is related to the previous point. While it may be easy to provide the first working version of the app (MVP – minimum viable product) using a “universal” solution, extending it can turn into a real nightmare. When this happens, the situation is really bad – so much effort is already invested, but the only right decision appears to be abandoning it completely and… go back to the native solutions. Here you can find an interesting article on this subject; take a look into the comments as well.

So are the universal HTML-based solutions entirely wrong? Or maybe there is something positive about them? When could we advise you to make use of them?

  • For simple, static apps. You need a glossary app for some niche domain, you need it to work on all platforms, you need it cheap? Sencha would be a wise choice in this case.
  • You don’t need nice animations or interface rotations – for example you know your target customers are mature professionals in some domain e.g. doctors.
  • You already have most of the work done in HTML (e.g. you have a working online shop adjusted to mobile resolutions) and you want to launch an app on AppStore just to make use of one more sales channel. This is where we talk about a website wrapper app and you probably are fully aware of it’s limitations.

While it seems that there are some good uses of HTML-based solutions, my personal advice is to avoid them. The truth is you can never get as smooth animations as native ones, even if you are just scrolling some list of items in your mobile shop. There will be some flickering, some weird user interface glitches. Consider the fact that smartphone users are now used to very high quality standards and responsiveness of apps. They like cute user interfaces, they appreciate additional “special FX” animations. Even if they find your application useful, they may give it a one-star rating just because they had to wait 5 seconds too long before the page was fully loaded. All this may ruin the reputation of your brand. You need perfection. Your business is doing well, so it’s better not to develop any mobile applications than to develop a poor one and sign it with your company’s name.

IT Corner

Nomtek proudly announces that we’ve just became a part of a bigger whole!

We co-founded a technological hub called IT Corner that groups together 15 companies from our beautiful city, totally employing 257 people.

We decided to join forces because we truly believe that we share the same DNA and promote similar mindset.

How can we describe IT Corner?

1. It’s a cluster of companies that know each other well and together are able to cover virtually every IT issue from the following fields:

  • Mobile software (iOS, Android, Windows Phone, HTML 5)
  • Java
  • .Net
  • PHP
  • Ruby on Rails
  • Python
  • ERP

2. It’s a local ecosystem in which people strive to share knowledge, learn from each other and benefit crossing the boarders together

3. It’s a great place to work in for somebody who doesn’t like dull  routine and prefers  work with people who prefer to see challenges instead of problemsJ

Interested? Find more @

An alternative to the Android Emulator

Are you tired of using the official Android emulator? If so, then Genymotion comes with a rescue!



The story begins when I forgot to take my Android device from work. I still wanted to do some development at home but when I thought about the android emulator, I simply turned my computer off and went out.

Yes, the official android’s emulator is a nightmare. There’s no practical use for this tool. In comparison with the iOS simulator, Google’s emulator is on the far end and nothing from the Google’s Android Team hints that it will change in the near future.

But there is a light in a tunnel. Well… Someone called it Genymotion.

It’s a free, cross platform (Windows32/64 bits, Linux 32/64 bits, MacOS X 10.5+) tool for running Android apps on your computer. The main advantage of Genymotion is that it runs Android on a virtual machine, unlike the stock emulation, which is a long process of translating the execution to different architectures.

Main features of Genymotion:

- OpenGL acceleration

- Full screen option

- Manageable sensors (Battery level/status, GPS, Accelerator)

- Fully compatible with ADB

- Configurable virtual devices

- Eclipse, IntelliJ IDEA Plugins


First of all, you should go here ( and download latest Genymotion build for your platform. Genymotion requires VirtualBox installed – you can download it independently or in one bundle form the site above. Using and downloading Genymotion require user registration. Double click on downloaded bundle and installation wizard will guide you through a few simple steps.

Running the simulator

If you open up an application, the main screen will appear:


After clicking “Yes”, the “Create a new virtual device” screen will appear:


If you are connected to Genymotion Cloud (with credentials provided for registration), you can choose a virtual device to run from a list in that screen.

In the next step the downloading will proceed and after it is complete, you can run your virtual device.



For testing purposes I used a sample Android application which can be downloaded from here (

Basically, the application tests performance of XML file parsers for Android. The XML file being parsed is 500 lines in length, and the test measures how many XML files could be parsed in the time of one second.

The test crashes on the official Android emulator (on various Android versions) which means…

Please see results below and make your own conclusion :)

Here are the results.


Samsung Galaxy SIII Mini GT-I8190 Android 4.1.2


Genymotion Virtual Device Android 4.1.1

If you look at the graphs again, you will see that all dependencies between parsers are kept.

So, in both cases SAX is the best one and W3C DOM’s performance is still poor which means tests are trustworthy.

The performance of the virtual device is almost two times better than the real device.

I know that you are trying to pull yourself together, but don’t waste your time and install Genymotion :)

De-risking IT start-up finance

I would like to share an idea on how to build your IT team in a way that would protect your company’s financial stability.

So, you are building a product and software is an important part of it. It is complex and will probably require lots of money, effort and various skills. In order to be successful in the first place, you have to work with great people who will be helping you throughout your journey. You need to build a team.

With each new team member your financial obligations are growing rapidly. You keep the team not too large and focused on core value you produce. Some sort of crisis takes place sooner or later in every company. Naturally, in startup stage you don’t have much sales in the beginning. You prepare predictions and carry high risk. What will really happen – no one knows. Having a large cost center you are at risk of financial illiquidity if your sales come too late. IT services are not cheap and probably your programmers burn most of your cash. What do you do if you get financial hiccough at some point? It would be very bad to dismantle a part of the team you’ve been working so hard to create, loose the team morale and knowledge.

A better way is to turn your cost center into a profit center. It can be done by devoting a part of your team to consulting. By doing so you win in two ways: not only you don’t have to fire your excellent people, but their work starts paying salaries of some of your other RnD guys, until the crisis is over.

How do you do this? It should be easy by having the team outsourced to Poland. You know your team very well as you are working with them every day. It was built carefully, one by one, with no rush. You only work with people who you really trust and who clearly bring you a lot of value. As you work in a startup environment, close to investors, entrepreneurs and various startup funds, you have a network of people with software development needs. Here you can monetize on providing a chain of trust – involve your trusted team in work for your trusted contacts. Again, you can use price difference to generate profit and sustain the rest of your team until the crisis is over.

Does this advice sounds reasonable? If it brings interesting thoughts, please write at and I will be more than happy to discuss them.

How to request an expedited review in AppStore


When you submit an application to AppStore it still has to undergo a review. It usually takes one or two weeks before Apple starts reviewing your application. Fortunately, a developer has the possibility to request an expedited review when special circumstances occur and time pressure is a notable factor. However, in order to request it, you have to have good grounds to base the request upon. Apple usually considers two possibilities: a critical bug or a time-sensitive event.

Critical bug is the best cause to ask for an expedited review. When an application is available on AppStore and users are complaining about being unable to use some functionalities you don’t have to wait 2 weeks for review. After submitting a new version with bug fixes you can request an expedited review and reduce the waiting time to 2 or 3 days.

Another justifiable reason to request an expedited review can be a time-sensitive event, but from our experience, it might be harder to achieve a satisfying result in this case. However, if your huge advertisement campaign starts in a few days or there is a big event promoting your application, it can be a good reason to request an expedited review nonetheless.

Before sending the request, your application has to be already in „Waiting for review” status, so don’t forget to upload its newest version. Also, don’t forget to save the Apple ID of your application somewhere.

Last part is to fill the request available at this address –

Once more, I stress that a good description is essential so provide as many details as possible. Set a reason and don’t forget to include the date, type and name of the event (for time-sensitive event case) or steps to reproduce the bug (critical bug fix).

Although requesting an expedited review is a great way to speed up the publication of your application, it can’t be used endlessly, and there is also a possibility that Apple will reject your request.

An expedited review should be used as last resort.

Social Networks’ API features – what is possible and what is not?

Hello dear developers from all over the world!

Recently I had to investigate some major Social Networks’ APIs to find out which features can be implemented, especially in context of mobile applications. Let’s start with the results and I’ll go into details below the table.

Get Profile Info Get Contacts Get News Feed Post Text Post Picture Visibility (public, private)
Twitter YES YES (followers, followed) YES YES YES YES
Instagram YES YES (followers, followed) YES NO YES NO

*visibility – ability to restrict target audience of the posts sent via API

The table above is mostly based on:

  • answers from the Stackoverflow
  • reading source code of ShareKit 2 - by the way, it’s a great iOS library to simplify and unify your “social” code. It’s author says it keeps you DRY – “Don’t repeat yourself” – and I appreciate this approach very much!
  • finally, some direct answers from Google, mostly leading to the specific Social Network’s API doc

As you expect I didn’t implement all these features above for all the networks – this would be great overhead to do it just for the evaluation. When there is “YES” in the table, I’m 99% convinced that the related functionality is possible, but when there is “NO”, I might just miss the right answer or ask a wrong question. So let’s rather treat “NO” as “not confirmed”.

I encourage You to share your thoughts and results in the comments!

Why having either few or many lines in the code is bad – code refactoring


Having a lot of lines of code means you probably have something which can be re-factored. Maybe you have the same functionality in different files with the exactly same code?

Having low number of lines means you are doing good, but not great. In Nomtek, we want to be perfect. The best approach to have a robust and scalable code is when you are somewhere in between.

Sometimes it is better to make 4 lines of code instead of 1 line to make it more legible. It only makes a negligible difference to a computer, as it will follow the instructions regardless of complexity. For a human, the difference will definitely have an impact on how fast he can understand code.

Lets say we have a basket with random products inside. I want to add a 20% discount to the first product.

[code lang="js"]
product = Basket.getProduct(0); //we got our product

Then I could just write:

[code lang="js"] = 0.2; //applying discount[/code]

One line of code, pretty simple, right?

I followed another path… Instead I have written a new method in the product model which is responsible for applying discount:

[code lang="js"]setDiscount: function(discount) { = discount;

And in the basket I have written:

[code lang="js"]products.setDiscount(0.2);[/code]

In early stage of our app development this could be reduced from 4 lines to 1 line (first example). But (and there is always a “but”) the logic of doing something should always stay in objects it is connected to.

This makes it easier to make changes in further stages of the development – improving the app or adding new functionality.

Being afraid of changing your code should hint that you have done something wrong. Todays world is changing fast and we have to adapt to it.

Basing on the earlier example, in next weeks of creating my app I had to add cash discounts. We wanted to make 10 Euro discount instead of calculating in head how many percent it is. (10Euro from 89,99Euro?)

I only changed setDiscount in the product model to this:

[code lang="js"]
setDiscount: function(discount, type) {
type = type || 'percent';
//if we dont specify type, lets treat it as percent
//it will make method compatible with earlier versions
if(type=='percent') { = discount;
} else if(type=='cash') { = discount/this.getPrice();

The important thing is that old code was still supported and worked the same way as earlier, but we can implement new discount type easily now. All changes to discount will propagate all over the project, because the product logic stayed in the product logic.

The main reason behind all of this is:

  1. It reduces (a lot) of time needed to implement changes
  2. It is easier and safer to make all kind of changes in your app

Below is a great video describing what good code refactoring should look like.

Refactoring from Good to Great by Ben Orenstein

Pebble & Developers: the first really smart, smartwatch


Pebble was designed by Eric Migicovsky and later posted on Kickstarter – a crowd funding site. Eric had an idea to make a watch which will be “smart” and won’t need to search for a compromise in regards to functionality. The main idea behind this watch was: it has to be an accessory to your smartphone and not a replacement.

Pebble has a similar display to what you can find in modern e-book readers. It is fully readable in sun and has a low power usage. It is even better than the display in the Kindle, because it is not e-ink, but memory LCD, therefore  Pebble can display smooth animations.


There is a lot of other things on-board: electronic compass, accelerometer, ambient sensor and most important, Bluetooth which allows to connect your watch with a smartphone.

Pebble supports Bluetooth 2.3 and 4.0. It presents the possibility to check your SMSes just from your wrist and much more!

So why we are so excited about Pebble?

In our opinion it is “an iPhone among smartwatches”. It can run 7 days (yes, days!) on the battery, is water-proof and has it’s own SDK. For us, developers, it means we can improve our apps by adding support of Pebble.


Just imagine: you are giving a Powerpoint presentation through your iPad and you are changing slides by shaking your hand in front of your audience (as mentioned before, Pebble has accelerometer – it knows when you are moving).

You are hiking in the mountains, and you are given directions where to go without even looking on your phone which is almost unreadable in the sun.

What if you are classy?

You can grab a paper map and navigate with compass in your Pebble.

You are riding a bike – check your pace, your speed, your time.

Even if you lost your phone, you will know immediately because Pebble will tell you when your phone has disconnected.

The possibilities are unlimited and can deliver a lot of great user experience. It is up to developers of Pebble applications and watchfaces what they will do.

Pebblis_1_610x458screenshot smartscorer1

What we present here is not only what we are thinking, but what society is actually saying – Pebble was estimated by Eric to collect $10 000 to produce 1000 watches. It exceeded expectations and collected over $10 000 000, breaking Kickstarter records.

80 000 people has given money to Eric and waited for this watch for over a year. Now it is here and there are still queues.

We were one of the first ones who has bought Pebble as a preorder one year ago and today we got information that our Pebble was shipped. We are very excited to play around with Pebble and cannot wait until we can start develop on Pebble.

And this is how Pebble’s first prototype looked like:


Pretty ugly, huh? ;)

Agile Addicted – after hour manager meetings

Managing projects is a very hard task – many perceive management as art, not as craft. A good manager has to develop abilities from a broad variety of knowledge domains. Beginning with economics and accounting, moving on to technical matters (development), work planning, an ending with psychology. It is a job that requires a huge amount of stress resistance – despite any arising obstacles, it is the manager that has to play the support role in time of crisis.
His responsibility is to ensure that the team’s goals are accomplished within acceptable budget and time-frame. His responsibility is to ensure that the team’s goals are accomplished within acceptable budget and time-frame, he cannot interfere with the project works too much, as the team members may lose the sense of responsibility.


Taking into account all types of projects, managing IT ones is one of the toughest challenges. Furthermore, each IT project is completely different and requires a different approach. E.g. solutions used with big enterprise projects will not be sufficient with ultra-small mobile projects.

There is an uncountable amount of books on the subject of management, and as many educational courses and trainings. It cannot be denied that a good manager should possess a large theoretical knowledge, however it will be of little use without practice. This is why the “Agile Addicted” initiative was created. Once in every two weeks managers from Nomtek meet with other managers from different IT companies after working hours. Usually the meeting starts with a lecture during which the participants discuss mentioned subjects with the lecturer. Subsequently, problems which have been encountered in other companies are analyzed in groups. The meeting ends with a brief retrospective, during which issues that can be adjusted are determined, and decisions concerning further actions are made.

The members of Agile Addicted include Scrum trainers, lecturers from higher education institutions connected with management, experts of the Theory of Constraints (TOC), project managers, Scrum Masters and Product Owners with years of experience.

How to find a mobile app development partner

Mobile is changing the world but many organizations lack the in-house expertise to develop their own mobile apps. Fortunately, the market is full of agencies, freelancers, outsourcing centers and other companies potentially capable of building your killer app.

In this post I’ll give you some hints and thoughts on how to choose the partner to realize your vision. There are some questions you should ask yourself before starting the search (we’ll get to those) and some things you should demand from any developer you’re going to work with.


First and most important point is to focus on looking for a partner, not a contractor. What’s the difference, you ask? The contractor will do what he’s paid for (hopefully) and then move on to another project/client. But you should expect more. Whether you’re a big company or a small startup (with aim to grow) you need a partner to help and participate in growing your business. Someone experienced who can deliver not only the requested code, but also the consulting, innovativeness, support and many other qualities that I’ll touch on later.

Maybe you don’t realize it at the beginning, but you’re potentially building a long term relationship here. If everythings goes well you’ll be building next versions of your product, you’ll target new markets and platforms and you need someone who’ll be there with you and who can grow together with you.

Clear communication

The quality of the cooperation with your partner depends on the communication. Hence, the quality of your business depends on it – it’s so simple.

The communication is most effective if both sides speak the same language – the business language in this case. I may assure you that best developers will be eager to learn your business and at the same time they will introduce you to some technical details of their work, just enough that you know where are the current boundaries of the technologies you build on, what’s feasible and in which directions you can innovate.

Good, proactive communication also gives you one really important advantage – a peace of mind. If your partner is reliable, responds precisely and promptly to your questions, communicates problems early then you don’t have to worry if you don’t hear back from him every few hours. It just means that everything is running smoothly :)

Project management

You don’t want to be bothered with every small project detail, problem or decision to be made. You already agreed with your partner on what’s your business goal. Your partner is committed to the project and you have a good communication channel, so it’s natural that he will take some responsibility from your shoulders and let you focus on your business. The best development companies out there will not only deliver the technical but also project management skills. They’ll solve the easy problems by themselves and come back to you only with the harder, strategic ones. And even then, they will present you a bunch of options and a recommended solution.

Technical and operational versatility

If you have a choice to cooperate with a few companies (for example one doing the wireframes and design, the other the mobile client development and another doing the server side) or to cooperate with only one, providing all the services, you should prefer the latter. This way you have a single point of responsibility, so you avoid the situations when the contractors blame each other for potential problems. The communication is obviously easier in this case. From my experience, I saw many cases when client side developers were blocked by the server side development. Of course, it’s all about the deadlines and schedules. It’s always easier for one company to organize work efficiently and avoid the bottlenecks.

Having said that, it may be hard to find a developer that has capabilities to do a usability analysis, graphics design, client and server development and whatever you imagine. But for sure there are companies that manage their ecosystem of linked partners with diversified skills and that can organise the whole project. So even if they don’t do the server or mobile development by themselves they’ll organize everything for you and provide a single point of responsibility. By the way, there is a growing business for helping smaller companies do more – you may want to check the Backend As A Service post published earlier on our blog.

Pricing model

There are basically two pricing models to choose from: ‘fixed price’ and ‘time and material’. Which one you choose depends on your situation, but basically you should choose fixed price when you know exactly what you want to build and you don’t envision any changes throughout the project. You just want to get a price from the developer, maybe to compare it with other prices and choose the lower one. I must however warn you that this is probably the bad approach as the IT industry and it’s clients has already learned the hard way many times. The key reason is that the requirements almost always change, so why would you like to put yourself in a position, where you already have signed a contract with fixed content and fixed price? The changes can be really expensive in this situation.

Ok, so let’s talk about ‘time and material’ – it just means that you pay as you go. You agree on some iterations, for example one or two weeks long and pay for them. You may change your mind after any iteration, as the content is fixed only for the current iteration. I will not go into details here, you will find more information by searching for ‘agile software development’. But what does it really mean for you? You may start with something small, develop an MVP and then decide where you want to go further. You may do some experiments and prototypes along the way, you may speed up, slow down after each iteration. This flexibility is really important in today’s world. If you don’t want (or can’t) plan upfront for next few months or years, or you would like to be able to quickly adapt your business to changing conditions then this is the way to go.

The choice really depends on your needs, just make sure that your partner supports the required pricing model and operational mode.

So should I hire a freelancer or an agency?

If you are from a software company then a freelancer may be a good fit for you, as you probably have many of the agency capabilities inside your company and you just need some additional manpower for a limited period of time or some missing technical skills. However if you lack expertise in software development you probably would like to go with the agency.

Good agency will give you more stability in case of long term cooperation. It can find substitutes for absent developers, something that you would need to deal by yourself if working with individuals. Partnering with an organization gives you also more time and schedule flexibility. What I mean by that, is: you should demand availability from your partner, but as already mentioned, there are times when you want to go faster and times when you want to slow down. It’s hard to require such an availability from an individual developer. If you don’t provide enough work for him, he’ll be forced to look for another project and may not be available when needed. On the other hand, an organization providing development services for many clients can deal with it pretty easy, as it is able to switch people between projects if needed. It can also easily add new developers to the project if you want to accelerate.

You should also note that a company has probably greater knowledge than any individual working alone. This relates to my previous remark about technical versatility, but it also goes further than that – it can provide you with technical knowledge in the fields that you don’t require when the project commences, but which will turn out to be indispensable after releasing first version, pivoting your business, etc.

In my career I’ve also met clients who were left by their developers with the application in the app store and no source code or possibilities to continue the project whatsoever. This is of course no argument in freelancer vs company discussion, just keep in mind that the project does not end when the app is released in the app store. Even if you don’t plan to release new versions, you should always be able to get some support from your developer when you need it.

This post by no means exhausts the topic. I’d be really happy to see and discuss your comments.

How to optimise your application’s description on the AppStore

Making a good application doesn’t mean that it will be successful. After the release of the new iOS App Store’s design and looks, a good choice of keywords, description and screenshots may have a very big influence on the chance of the app’s success. To organize such materials is not an easy task, but can be very profitable. There are some basic rules which can help promote your application on the AppStore.

Choosing good keywords is the main key to success. If those keywords are too generic, the application will be at the end of the search results and probably nobody will even notice it. Very specific and targeted keywords should be carefully chosen. In the end, it helps the application, because more and more users learn how to type keywords which reflect their needs. All allotted characters should be used and keywords shouldn’t be long. It should be kept in mind that words in the title of the application are also keywords, so there is no need to type them again. To test if keywords are good, just type them into the AppStore search field. The less results, the higher chance to achieve success.

Screenshots are the second most important thing which can promote your application. The first screenshot should be the best view that the developer can provide. It will be displayed with the title after searching keywords on the AppStore. Quality of it will determine, how many users will enter the application’s “details” view. If there is more than one version of application, it should also help the user to find the desired one. A good practice might be to add a “ribbon” to a screenshot stating that the app is e.g. free. All other screenshots should show what the application looks like and a good rule of thumb is to add as many as possible.

After the user finds your application and becomes charmed by your screenshots, it’s time for the description. First three lines are the key. They will be visible for the user after entering the details view, so they should be convincing enough to read the rest. The initially wrapped text should somewhat supplement the short part after the viewer decides to read it, and contain as much information as possible.

A resubmitted application has an additional field „What is new?”. Information provided there ought to inform user what new features should be expected, and what was improved. Simple statements like „Bug fixed” are unfortunately not good enough.

In the case where your application supports many languages, it’s good practice to localize all your AppStore data. Localized keywords, description and screenshots can increase the traffic around your product. A lot of people would be pleased with reading a description in their own language.

Before submitting to the AppStore, doing a research about competitive applications is suggested. Checking their descriptions and screenshots can help to find appropriate ones for your own. There are also some applications (see links below) on the Web that can provide keywords used in others applications. Some of them can also make complex analysis of keywords and calculate the chances for finding your application. Most of them are paid, but have trial versions.

Making an application’s detail page is not an easy job, but as mention at the beginning, it can be very profitable. The more time and effort you will spend on it, the more you will get. I hope that reading this short guide will help you in achieving success.

Useful links:

Tools for analysis:

iOS and Android – Why iOS is better for developers, and Android for users – University of Wroclaw ICT lecture review

A lecture took place at the 10’th of May for students of the IT Institute of Wrocław University, which was led by Nomtek as a guest. The aim of the lecture was to familiarize the listeners with the characteristics of the iOS platform from the developer’s point of view. Among the mentioned issues, were: platform differences occurring between Android and iOS, working tools, which the developers can use while programming for the Apple platform, and potential challenges, which we can encounter in everyday work.

This lecture attracted much interest, as did the previous lectures and meetings organized in cooperation with, among others, Wrocław University of Technology.

Wrocław is a place, where the most prominent polish IT specialists begin their career, and projects known across the country are conducted (, transpodroid, This is exactly why Nomtek takes so much joy form the possibility to undertake cooperation with young graduates from technical education colleges in Wrocław.


How to install and use Injection Plugin for XCode

This video shows an example on how to easily install and use the XCode Plugin: Injection. It allows developers of mobile applications for iPhone and iPad (iPod Touch as well) to inject changes in the code “live”.

Thanks to this functionality, our developers were able to improve their skills and reduce time needed to make design tweaks.

Now, we don’t have to rebuild and restart an application every time a small change is made, which saves us a lot of time to get to a certain view in the app. We simply hit CMD =  and check results immediately.

The plugin is available for download here: InjectionPlugin for XCode download

Mobile market share and statistics for iOS, Android and other

General mobile market statistics:
Last year shows, that there is domination for two platforms. As you probably know, those are iOS and Android. Android’s market share grew really fast during last few years while iOS saw a decline. The chart below shows that Apple and Samsung dominate in sales of the smartphone market. From last quarter of 2011 Nokia lost 1st place, and stopped being the leader.
Last year shows, that without good R&D and planed updates few vendors dramatically lost their market parts, for example Nokia and RIM (Blackberry phones).


Top Smartphone Operating Systems, Shipments, and Market Share, 4Q12


OS statistics and versions:
iOS is a mostly updated mobile system, because around 98.1% of the market has an iOS version that’s not much older than one year and include iOS 5.1, which was released on March 2012.
Basing on that, you’d be quite okay targeting just version 5.1 and up, or even iOS 6.x, which is 87.1% of the market right now. It allows you to use many futures of these versions, which reduce development time and costs.


IOS version stats (updated Apr 3, 2013)


Android uptake is much more different. Around 36% of the market is still on Android 2.3, which is quite buggy and is almost two and a half years old, because it was released on December 2010. We can say that the dedicated for tablets Android 3.x practically does not exist, because it was updated for most devices to Android 4.x.


Android version stats (updated Apr 10, 2013)


Base on android fragmentation problems the cost of implementation can be bigger than for iOS, if we include the most popular android versions, 2.3.x and 4.x, in our app requirements.

Devices statistics:
For Android the undisputed leader is Samsung, which controls around 55% of the market. The most popular family is Samsung Galaxy, with Samsung Galaxy S3 (9.7%) and Samsung Galaxy S2 (7.4%) on top.
For iOS there’s no clear leader in device models: iPhone 4S (18.5%), iPhone 5 (16.5%), iPad 2 (16%), iPhone 4 (14%), iPod Touch 4 (10%). The interesting fact is, that the first iPad can be ignored now (less than 1.5%), whereas iPad 2 is still more popular than any of other iPad model.

References and sources:

Nomtek exhibits at Connecting Healthcare IT, Berlin 9-11.04.2013

During 9-11.04.2013, a large scale “medicine meets IT” conference called Connecting Healthcare IT is held in the Berlin Trade Grounds, at which many first league businesses will exhibit their innovations in the field.

Nomtek doesn’t intend to stay behind the curtain on the IT scene, and will be present on site too. Since we’re quite experienced with mHealth apps, and have cooperated with various companies that operate in the medical business, we might have a trick or two to show at the exhibition.

We’ll be delighted to meet in person during the event. Our stand is E-111, Hall 1.2.
You can check out our conference profile under this link.

I will be keeping this profile page updated, should anything regarding our location at the conference change.

Everyone can expect a review of how everything went, and a few words about conhIT, right here, after the event.

Wish us luck! application

Today is the World Consumer Rights Day, and from this occasion we would like to present our new application, created by request of Vision SecretClient, called Premia 360. By using it, consumers are able to recommend or advise against offices of many recognizable companies, as well as: shops, restaurants, pizzerias, cafes, flower shops, clubs, movie theaters, bowling clubs, supermarkets, hypermarkets, local stores, pharmacies, banks, etc.

Each consumer can state his/hers opinion by just rotating a circle representing a general rating of the company, choosing the place/office in the vicinity, and rating details, such as personnel, knowledge and counseling, efficiency, offer and pricing, place’s esthetics. The application is directly connected with a popular portal, used for rating of service quality.

The application also supports discounts for popular credit cards.

The application is available in Google Play and App Store.

Google Play

App Store

Dziś jest Światowy Dzień Konsumenta, i z tej okazji chcielibyśmy zaprezentować stworzoną przez nas na życzenie Vision SecretClient aplikację Premia 360. Za jej pomocą konsumenci mogą polecać lub odradzać placówki wielu znanych firm a także: sklepy, restauracje, pizzerie, kawiarnie, kluby, kina, kręgielnie, supermarkety, hipermarkety, delikatesy, apteki, banki, itp.

Każdy konsument może wyrazić swoją opinie poprzez zakręcenie kółkiem umożliwiającym ogólną ocenę firmy, wybranie miejsca/placówki z okolicy oraz ocenę detali, takich jak personel, wiedza i doradztwo, sprawność obsługi, oferta i cena, wygląd miejsca. Aplikacja jest bezpośrednio połączona z popularnym portalem, służącym do oceny jakości obsługi.

W aplikacji są też dostępne rabaty dla popularnych kart kredytowych.

Aplikację można pobrać dla platformy iOS oraz Android.

Google Play

App Store

Nomtek integration party

As our tradition goes, each February we organize some kind of celebration for our team in Nomtek. This year was no different. Yesterday we had a great time at the Laser Tag arena!

Although Nomtek usually works as one mind, this time we were divided into Blues and Reds. I’m not quite sure why, but blue seemed to be a better color, since they won two times in a row… And I happened to be with the Reds.

Anyway, after the whole thing, a snack and a drink was good end to the game.

Nomtek Warsaw Office

Our office in Warsaw is officially up and running. We had plans to move into Polish capital for some time now and officially managed to succeed in this endeavour!

The plan is to have a wider window of communication with our domestic market, and there is no better place than Warsaw, which might be called a national trading hub. Our new office can represent Nomtek in Warsaw at any given time, should the need arise, without any logistical boundaries.

We are especially proud of this step, since it is a tangible proof, that our family is growing, and that there is a need for our services in various regions.

Our office can be found at Zurawia 43 street, near the very center of Warsaw. Check out the Google Maps link below:

- Our office from birds view. -

ListView items containing interactive controls

Android delivers 2 interfaces for handling click events on list items:

  • AdapterView.OnItemClickListener
  • AdapterView.OnItemLongClickListener

Tapping for those events is simple – you just set a listener object like this:

mListView.setOnItemClickListener( new AdapterView.OnItemClickListener(...) {...} );

This will work as long as you don’t put any interactive controls into your layout (like Button object). In such case ListView will change its behavior and click/long click event outside button will be blocked/consumed.

The result can be confusing. For example after adding Button to your list item layout your ListView context menu will stop working. Despite it being reported as a bug (Issue 3414) Android developers refuse to change this. They probably have a reason for this…

We can workaround this problem simply by adding one line to our ViewGroup inherited object’s constructor:


Let’s see the full example:

public class ListItemView extends LinearLayout
   public ListItemView(Context context)
       LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       inflater.inflate(R.layout.list_item_view, this);

Now, if you click list item, click event will be passed further and everything should work as expected.


Parcelable – sending arbitrary objects using Intent in Android

Using Parcelable

Parcelable is an interface for serialization/deserialization of Java objects used in Android. Parcelable object can be sent in Intent’s extras same as any other base type. Parcelable serialization/deserialization works faster than Java’s Serializable, but is a bit more complicated to implement. Nevertheless, you still need two functions to be defined and one static class with two simple methods. Not a big price for speed…

Let’s start from an example implementation. We have a simple class containing two member fields:

public class CustomData implements Parcelable
    private final String mId;
    private final String mText;

    public CustomData(String id, String text) {
        mId = id;
        mText = text;

    public String toString() {
        return "CustomData [mId=" + mId + ", mText=" + mText + "]";

    public boolean equals(Object o) // (1)
        if( o instanceof CustomData )
            CustomData d = (CustomData)o;
            return d.getId().equals( getId() ) &&
                   d.getText().equals( getText() );
            return false;

    /********** Getters/setters **********/

    public String getId() {
        return mId;

    public String getText() {
        return mText;

    /********** Parcelable interface **********/

    public int describeContents() { // (2)
        return 0;

    public void writeToParcel(Parcel out, int flags) // (3)

    private static CustomData readFromParcel(Parcel in) { // (4)
        String id = in.readString();
        String text = in.readString();
        return new CustomData(id, text);

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() // (5)
        public CustomData createFromParcel(Parcel in) // (6)
            return readFromParcel(in);

        public CustomData[] newArray(int size) { // (7)
            return new CustomData[size];

Let’s go through the class code:

  1. equals(Object o) – not really needed by Parcelable, but we’ll use this method to compare objects in our test case later.
  2. describeContents() – Parcelable’s method; for most use cases it can be left as it is, ie. returning 0.
  3. writeToParcel(Parcel out, int flags) – Parcelable’s method; here we perform serialization by writing all member fields as basic data types to out object. Second argument (flags) can be ignored for most cases.
  4. readFromParcel(Parcel in) – just a helper; it builds CustomData object using data contained in Parcel. Some prefer too use a private constructor, like private CustomData(Parcel in) {…} instead of helper. The key thing is, you have to read all fields in the same order you’ve wrote them into the Parcel in writeToParcel() method. This is the only error-prone part of the process.
  5. CREATOR is a special object used to deserialize our object from Parcel. All Parceable classes must provide this object and it must be declared as public static final.
  6. Actual deserialization is done by calling this method. My implementation uses helper method readFromParcel(), some will prefer to use private constructor, others will deserialize object in place without the helper – whichever you like.
  7. Create an array of Parcelable objects when we deserialize arrays.

Once Parcelable is implemented, we can send it using Intents like any other base type (inside Bundle):

CustomData data = new CustomData("id", "text");
Intent i = new Intent();
i.putExtra("key", data);

Object deserialization is also dead simple:

Intent i = ...; // Intent containing  Bundle with key "key" and our CustomData object;
CustomData data = i.getExtras().getParcelable("key");

Test cases

Serialization code, contained in writeToParcel(Parcel out, int flags) method, and deserialization code – in our example: readFromParcel(Parcel in) – must be kept in sync. It sounds simple, but in reality things get more complicated as your objects grow new members, especially when you create some complex types needing more logic (as excersise, try to serialize Map object using Parcel – you’ll immediately get an idea). To make life simpler I advice everybody to write test cases for every Parcelable object, even if the initial implementation is trivial. This will greatly help maintaining and developing Parcelable objects. What seems to be a waste of time in practice have important consequence: any developer or maintainer will be MUCH LESS reluctant to avoid his changes to be tested if provided with bootstrapped test case, just to be filled or modified to match new implementation. Chance that a test case will be created later falls exponentially with object’s size and complication.

This is a simple test case tamplate that can be used without much hassle:

We test two elements:

  1. Test of boolean equal(Object o): we must compare objects later, so having this method working right is a key prerequisite for the next test.
  2. Serialization/deserialization: test critical parts of Parcelable by writing object to Parcel, creating it’s copy and comparing them using equal().

Having this small template around should save anybody working with Parcelable objects tons of time during development.

Template for Eclipse

Writing this repetable block of code can by annoying, so here’s a small template to make our life easier. Just put it in Window -> Preferences -> Java -> Editor -> Templates under any name you want – I prefer “parcelable”. Then just type parcelable and press Ctrl+Space to get a preliminary implementation of Parcelable interface, modify writeToParcel(), readFromParcel() and you’re set.

Continuous Integration (CI) for mobile devices

CI allows for a safe development of software through regular tests of any recent changes in the code. Thanks to this, each developer can verify the correctness of made changes in real environment. A properly conducted integration substantially reduces costs and labor time required to join the works carried out by different people, as well as enables detection of potential errors in early stages of implementation.

In the case of mobile devices, CI requires testing on several devices simultaneously. E.g. Android supports more than 500 different devices and has multiple OS versions. This causes a serious fragmentation problem. In case of iOS, this issue also does not remain unnoticed by developers.

Learn how to benefit from existing tools, get familiar with the possibilities of Continuous Integration and increase the quality of your applications.
We invite you to an open seminar organized by specialists from Nomtek.

20.11.2012, 19:00
Building C-13, room 2.17

Apps World 2012 in London

Last week Nomtek took a big step in presenting itself to the mobile market. We have been preparing to show our face to the world, putting it bluntly, in person for some time, but the decision was not an ordinary one. There is little point to introduce oneself when no audience is present, so an occasion was needed as well, and what could be a better event than a global mobile conference – AppsWorld 2012 in London.

Nomtek as a fairly young entity has never before participated in an event of this scale, therefore it is easy to imagine the excitement of our team when everyone heard the news that we will be exhibiting this year.

The exhibition was hosted for two days, 2-3.10.2012. During this time, participants had a chance to meet with representatives of various companies operating in the mobile business, ranging from startups to globally known brands, as well as participate in organized workshops, which we as an exhibitor unfortunately didn’t have the time to see. Nonetheless, if someone wishes to witness the global mobile business operate with their own eyes, there is hardly a better place.

The interest with Nomtek happened to be much bigger than we originally expected. We had four delegates at our stand and frankly, at times it was quite difficult to attend to everyone who wanted to know more about us. I remember one particular person mentioning that this is due to our marketing banner saying “Tailor-made apps for smart devices”. Apparently we were one of the few exhibitors bluntly informing about what it is, that we actually do. Regardless, all the commotion at our stand gave me a firm impression, that the demand for apps is still growing, and probably will continue to grow for a bit longer.

We will be exhibiting at AppsWorld 2013 in London next year as well, so if anyone wishes to pop in for a chat, we will be more than happy to meet.


Full photo gallery HERE.

Panoramic view of our stand HERE.

Mobilization 2012

This post will be somewhat different from the usual strictly technical ones we tend to host here. Today we won’t be describing any innovative solutions or coding techniques, but will rather focus on another aspect of the mobile business – community events.

One particular event we wish to describe, is the recent Mobilization 2 conference that took place in Łódź on the 22.09.2012. One of the main reasons why we wish to share our thoughts about this community event, is because almost whole of Nomtek’s team was present and some of us even took upon themselves an active role, giving speeches and presentations.

The conference was organized rather neatly, divided into 45min blocks of lecture sessions separated by quarterly breaks. Each block had four lectures, covering different topics, so participants were able to choose which topic interests them most and attend only that particular one. It was a bit problematic when there was more than one desired lecture in the same block, but personally I doubt that any other solution would be better when dealing with such a large scale event. The lectures were provided by different figures involved in the mobile business, from developers to corporate representatives, and the topics ranged from strictly technical, such as coding methods, utilities or plugins, usability and user experience, all the way to app marketing and design tips.

Apart from the whole Nomtek team being on site, two of us decided to be a bit more active in the community, giving lectures on the following topics:


iOS Continous Integration (CI) for Beginners


To Understand the User – Ensuring Appropriate Application Development

Also Roman from BitBar presented his own speech, and although he is from our partner company, we treat him like family. ;)


Fighting back platform segmentation – introduction into Android functional testing

To Understand the User – Ensuring Appropriate Application Development

Release of your application is only a starting point, after that you still need to focus on further development and fixing potential bugs. We can show which tools Nomtek sometimes uses for analyzing user interaction with applications.

The first tool is Flurry which allows you to get user’s metadata, app usage statistics and other technical data. Thanks to Flurry it is possible to obtain social data about your users, like gender, age, geographical location, language and interests. This data is available even if your app does not collect it, because if your user is using a different app that sends this data to Flurry, then you can see it in your statistics as well. Technical information like device model or OS version is available too without any special coding requirements. The best functionality of Flurry is its event recorder. Using just one line of code you can set event information in each place of usage path that is important for you, like “open screen”, “click on button”, etc. Users’ events are presented as a path which shows the frequency of use per event. There are also event logs which show details about previous sessions. Flurry allows for logging errors, but unfortunately there is char limit per log. The great thing is that Flurry can also send information about crashes which happen during application start, or just after. Flurry SDK has adverts and an option to create a campaign in which you pay just per download (min. cost is 0.75$) and not per click. Integration of this SDK gives us access to a number of really great utilities.

The second tool is in which you can see heat maps which represent places on the screen where users touch your app. This allows getting more information about gestures they make and discover their interaction preferences. This is a really good tool for the first phase of your project, when you design a UI for it. It is also very useful when you plan to redesign your UI for new platform trends.

The last tool called Crittercism is totally different than the previously mentioned ones, because it was created for mobile application performance monitoring and crash reporting. You can monitor crashes and apps running in real time, as well as get alarms or email messages about them (Enterprise version only). Using breadcrumbs (Enterprise version only) you can get an event path which allows you to reproduce a particular bug. You have free access to fully functional implementations of “rate this app” mechanism and an option to send information about bug fix only to those users for whom a particular bug has occurred. Just with one line of code you can easily integrate a special support forum which allows your users to submit feedback, ideas, bug reports, and ask questions.

To get a really helpful feedback from users, you can use two of these tools in your app: one for user experience and second for crash reporting. Provided that you take this feedback into consideration, desirable results in the popularity of your app should appear promptly.

Backend as a Service (BaaS)

Many mobile applications require a server, which provides some kind of services to the application. The development of a mobile application carries a necessity of writing an appropriate backend, that ensures functionalities necessary for proper operation, and in turn, brings more consequences: code expansion, which requires care and costs.

Functionality of a backend mostly boils down to storing user data, authorization and synchronization of data. In a large number of cases, a backend will have a very similar role, varying only by the details of implementation.

Developers love such problems and immediately try to find common solutions.

Following this affection, companies have appeared on the market, offering universal backend systems: standard functions, necessary in most applications, together with a comfortable API. The difference between them are mostly additions, which are offered by particular systems, but the idea in every case is the same:

  1. To offer a universal backend system for data storage.
  2. To draw clients with special conveniences, unavailable to competitors: easy integration with social services, push notifications, CMS, etc.
  3. To bill for the amount of API calls or the amount of registered users.

The fees are diverse, but most providers offer free services, allowing for completion of a project and acquisition of the first users that bring revenue, charging (reasonable sums) only after system requires larger resources.

Almost every BaaS system offers three basic types of API:

  1. Android
  2. iOS
  3. REST – through HTTP calls (POST, GET, PUT, DELETE)

Some offer additional API for JavaScript and more niche systems.

This allows for using backends on every mobile platform – many clients wish their applications in versions for both Android and iOS, and their needs are fully satisfied. On more niche platforms we make use of the HTTP library.

The data format, which we use in communication with BaaS systems, is also in accordance with expectations – the undisputable king, is the known-to-every-mobile-application-developer, JSON.

The BaaS market is relatively young – small and medium-sized companies dominate, there is a continuous process of merging, establishing cooperation between service providers. For that reason, the choice of an appropriate provider can have a strong influence on the development of our business in later period.

We have put some of the popular BaaS systems under the microscope.


Applicasa is a young project, nonetheless aims at acquiring the market through offering some interesting conveniences. One peculiar aspect, is an extensive CMS, allowing for quick edition and viewing of data. Due to this, our backend can be used instantly by people who are not programmers by definition – e.g. The client.


Kinvey left a very good impression on us. It has a very expended functionality. Apart from standard functions of data storage, it offers the possibility of deploying own code, statistics, storing large amounts of data (content delivery network). The documentation is very good – libraries can be used almost instantly, especially since the amount of classes required to become familiar with is rather small.

Kinvey recently established cooperation with Urban Airship – a multiplatform library for push notification transfer.


Parse is yet another popular BaaS system. Not so long ago, it has been granted a data editor function (But is way behind Applicasa in this regard). Starting work with it is fairly easy – Predetermined templates with projects are available for download and the documentation is very user-friendly.


StackMob allows for deploying own code, versionizing of API and integration with Ruby on Rails applications. It is a good choice for those, who desire more control over the backend and are ready to settle for greater complexity.


“Backend as a Service” providers offer us a substantial facilitation in the process of software development – they allow us to run our applications practically on-the-spot, without the need to wait until the long process of server development is over. They take on themselves the keeping of the infrastructure, implementation and the upkeep of core functions of the backend. All of this for a very appealing price.

Yet, BaaS services are not meant for everyone. They will not be favored by those, who want to have complete control over the data stored on the server (E.g. Sensitive data). BaaS is not the answer for companies, which backend systems go way beyond the database model, e.g. Those, that offer Instant Messaging services – BaaS can be an extension, but will not fully substitute own solutions.

Not all BaaS systems offer a comfortable data export – this may lead to concerns, especially when facing the fact, that the market is still in the phase of development, and companies are based on venture capital. Together with market growth, fusions and bankruptcies are to be expected. However, it is not a huge risk – a large share of users from a bankrupting provider will certainly be a tasty treat for the competition, which will surely take care of the orphaned clients, served on a silver plate.

Flipcards – Flashcard app for training memory

Flipcards – Flashcard app for training memory, is an educational application for everyone. The idea is based on flashcards – a set of pairs of words or pictures which are somehow related to each other. Each pair is exposed on both sides of a card. User can flip cards by tapping the screen, and browse them by simple swipe gesture.
While creating FlipCards we focused on simplicity and impressive graphics which make learning even more enjoyable.
  • simple and user-friendly interface
  • marvellous artwork
  • create your own flash cards in embedded editor
  • search and download flash cards from (over 7 million flashcard sets)
  • upload your flashcards to and share with other users
  • post your newly created sets on Facebook’s Wall
  • support for text and images
  • share your sets with friends via email
  • shuffle cards by shaking device
  • tap and swipe to interact with cards
If you have any questions or issues with this app feel free to contact us at
For any news you can follow us on Twitter: @NomtekMobile

AX4 Tracking application for AXIT AG released on AppStore!

AX4 is a logistics IT-platform which improves, automates and controls the logistical chain across companies and simply and flexibly integrates all parties involved. It is used by over 52.000 users, available in 92 countries and 12 languages. Major customers are DHL, BMW, Ford, DB Schenker, BASF and alike.

We are very proud to announce that Nomtek has developed the mobile AX4 application for all iOS-based devices: iPhone, iPad and iPod. With our application it is possible to track statuses of AX4 shipments anywhere and anytime – just enter the shipment reference number and get detailed tracking information within seconds. Application automatically stores the list of recent shipments for future reference and provides useful bookmarking system called “Watchlist”. With push notifications user is instantly informed about tracking status updates for all shipments that he “watches”.

From the developer’s perspective, AX4 Tracking application introduces some advanced features. We have designed special table views that are made of native iOS UI components to achieve high performance (avoiding pitfalls of UIWebView), yet they are extremely flexible. Dedicated protocol that describes each table cell separately allows definition of font sizes, text and background colors, number of rows and columns, borders, images, buttons and much more!

Read about the application on iTunes, or see AX4 Tracking in action!

AX4 Tracking

Adding 3rd dimension to the Page Flip effect on iPhone OS

3d page flip animation created using cocos2d framework.
My 3d concept of flipping a page is based on its 2d version. We will still reflect points that are in front of the symmetry axis but we will also modify the z coordinate of these points (see picture 5).
Pic.5. 3d version of page flip effect.
To understand the concept, imagine a cylinder with a large radius which is running on the same path as the symmetry axis. When the cylinder touches the paper, it begins to wrap around the cylinder until it reaches the cylinder’s top edge. After that, the piece of paper which has passed the cylinder’s top edge (actually the grid’s vertices that represent that piece of paper) should behave as if they were reflected across the symmetry axis. So the z value of the moveable points should be between 0 and 2*R (R is a radius of the cylinder).
Pic. 6. Cross section of the page wrapped around the cylinder.
The radius of the cylinder decreases in time.
To make the whole effect even more realistic the radius of the cylinder should decrease from its maximum value to zero in time. Below is a piece of code which does all mentioned stuff. In the code I use Vertex and Point data structures. I did an assumption that Vertex and Point represent points in 3d and 2d space respectively. But it’s fair to treat points as vertices with z = 0. So if you see p = 5 * v; it means that only x and y coordinates take part in calculation.
// time is a value from 0 to 1;
// 0 - begin of the effect,
// 1 - whole page has been flipped
void update(float time)
    const Point A, B', C, D;  // corners of the animated page (except B')
    const float t = sqrt(time);
    const Point P1 = lerp(B', A, t);
    const Point P2 = lerp(C, D, t);
    const Line line = CreateLineFromPoints(P1, P2);
    const Point N = GetNormalVectorFromLine(line);
    const float maxRadius = 0.5 * pageWidth * pi;
    float R;
    if (time <= 0.5)
        // for the first half of the effect keep a fixed value of radius
        R = maxRadius;
        // in the second half decrease the radius from its max value to 0
        const float s = sqrt( 2 * (1 - time) );
        // note that "2 * (1 - time)" is between 0 and 1, so is "s"

        R = (0, maxRadius, s);      // <=>  R = maxRadius * s;

    const float invR = 1 / R;
    const float halfCylinderCircumference = π * R;    // π ≈ 3.14159
    Vertex v;
    for v in grid.vertices
        const float dist = distance(v, line);
         if (dist > 0)
               const Point p = v - N * dist;
              if (dist <= halfCylinderCircumference)
                     const float alpha = dist * invR;
                     const float sinAlpha = R * sin(alpha);
                     v.x = p.x + N.x * sinAlpha;
                     v.y = p.y + N.y * sinAlpha;
                     v.z = (1 - cos(alpha)) * R;
                   v.x = p.x - N.x * (dist - halfCylinderCircumference);
                   v.y = p.y - N.y * (dist - halfCylinderCircumference);
                   v.z = 2 * R;
This is the easiest 3d version of page flip algorithm I can imagine. It's not perfect. It's still have artefacts when viewing in slow motion but when animation is fast enough it looks realistic. The best approach to the page curl simulation is to use cone instead of cylinder (see W. Dana Nuon blog for details). But no matter what solid you use, the idea is the same, only equations may vary.


EduCards is an educational application which can be used to study foreign languages, remember difficult words and meanings, etc. Educational cards (also known as flash cards) are pairs of words or pictures which are somehow related to each other. Each pair is exposed on both sides of each card. By tapping the card user flips the card and see the other side. While creating EduCards we focused on simplicity and impressive graphics which make learning even more enjoyable.
  • simple and learn-friendly interface
  • beautiful graphics
  • embedded editor for creating own EduCards packages
  • easy import and export via e-mail or iTunes
  • support for text and images
  • shaking device shuffles cards
  • tap and swipe to interact with cards
  • support for unicode characters

For any comments or questions regarding EduCards app please contact us at:

For any news you can follow us on Twitter:

Testing Mobile Web – phones and platforms to focus on

Decision on what mobile phones/browsers to support for mobile web page project is not a trivial task. There are quite a lot of mobile platforms, each one with its own default mobile web browser, additionally there exist also third party browsers. The first thing you need to do is to look at some statistics as you have to decide on what platforms to focus on. StatCounter at gathers web page statistics – we recommend to look in there. It is worth not only to look at worldwide statistics, but also regional statistics where your mobile web page will be mainly targeted – there are huge differences between different parts of the world. We will focus on European region, the results for USA will be similar. We also recommend to use rather line type of stats then bar type, because it gives information about trends, not only about current usage statistics (and you have to remember that you develop for some time in future not for now). So let’s see how it looks in case of mobile web browsers in Europe for September 2010 :

Stat Counter Global mobile browsers in Europe

We can see two things: there are a few platforms that we should focus on and that generally web browsers usage is generated by platforms’ default browsers, with exception of third party Opera web browser, which is quite popular. In case of Opera we have two browsers: Opera Mini and Opera Mobile. Opera Mini displays web pages first processed in data centers (to make web page more tolerable for mobile phones and to reduce net bandwidth) thus its support for JavaScript is limited, whereas Opera Mobile is standard web browser and supports JavaScript, Ajax and Html5. We recommend to focus on Opera Mobile in case of more powerful web projects that need good support for those technologies. Summing it up we can define following recommendations:

Platforms that we recommend to focus on

  • iPhone/iPod (for Europe and North America)
  • Android (for Europe and North America)
  • Blackberry (for Europe and North America)
  • SymbianOS (for Europe only)
  • Opera Mobile web browser (for Europe only)

Test Phone Recommendations

Here we restrict ourselves to platforms listed above. Selection of platforms/phones to support depends on web technologies and phone’s functionalities you need during development. Thus we propose test recommendations for three categories (each one more restrictive then previous):

  • HTML 4.1, CSS and JavaScript support
  • HTML 4.1, CSS, JavaScript support with focus on phones with touchable screens
  • HTML 4.1, CSS, JavaScript support with reasonable support for HTML 5

Our general test recommendation is to perform the daily development tests on oldest acceptable version of each platform. Acceptable version means such version of given platform whose default browser supports all technologies required for your project. Also we recommend that for critical projects strong (deep) before release tests should be done not only on oldest acceptable version, but also on each available simulator/device. If your project requires lots of phone’s resources, then you should also consider testing on oldest device running newest available version of the platform (for example iPhone 3G with iOS 4) – this is device/platform configuration with worst performance and it might be helpful to assure that your project runs fine on it. Now lets turn our attention to each of the categories.

HTML 4.1, CSS and JavaScript support

Finding and recognizing oldest acceptable version is quite hard and we recommend to use results gathered by John Resig, who needed to recognize supported platforms for JQuery Mobile project. We propose to focus on native column from his table, as its represents default web browser for each platform. Definitely you need to support A-grade platforms from this table: iOS v3.1.3, v3.2 and v4.0 (and newest v4.1); Symbian S60 v5.0; Blackberry OS v5.0, v6.0; Android v1.5, v1.6, v2.1, v2.2. In case of iOS and Android the situation is clear: all A-grade versions run on majority of those platforms devices. In case of Blackberry OS v6.0 runs only on few latest phones so we recommend to support also v5.0 that runs on lot of Blackberry devices that are currently in use. In case of Symbian S60 it is worth to support version 5.0 that runs on touchscreen devices and if you want to support also non touchable devices then you should suport Symbian S60 version 3.2 as well. Additionally you need of course to support latest Symbian^3 platform. As to Opera Mobile you can see from John’s table that latest version 10.0 of Opera Mobile should be supported, previous versions might gave you some trouble. Below is list of all recommended platforms and devices to consider:

  • iOS
    • v3.1.3 :
      • iPhone 3G, iPod Touch 3rd generation
    • v3.2 :
      • iPad
    • v4.0, v4.1 :
      • iPhone 3GS, iPhone 4
    • Recommended test device:
      • iPhone 3G
  • Android
    • v1.5:
      • HTC: Dream (android dev phone 1 is htc dream also), Hero, Magic
      • Motorola: DEXT, ME600, MB300, i1, MB501
      • Huawei: U8230, U8220
      • Other: Acer beTouch E110, Sciphone N19, Dell Mini 3, Samsung M900 Moment, LG-GW620
    • v1.6:
      • LG: GT540 Swift, LKH5200 Andro-1G, LU2300 Optimus Q;
      • Samsung: Behold II, i7500 Galaxy, i5700 Spica;
      • Sony Ericsson: XPERIA X10 Mini, Xperia X10;
      • Other: Acer: Liquid A1, SciPhone N21, CSL Spice, Garminfone, HTC Tattoo, ZTE Link
    • v2.1:
      • Acer: Liquid E, Liquid Stream S110;
      • HTC: Aria, Desire, Droid Incredible, Legend, myTouch 3G Slide, Wildfire, Google Nexus One;
      • LG: VS740 Ally, KU9500,
      • Motorola: Charm, Droid X, Milestone XT701, XT720, Defy, Flipout;
      • Pantech: Sirius Sky, Sirius Izar, Sirius Vega;
      • Samsung: i5800 Teos, Galaxy A, i9000 Galaxy S, Acclaim, M910 Intercept
    • v2.2:
      • HTC: Evo 4G, Desire HD;
      • Motorola Droid 2
    • Recommended test device:
      • HTC: Dream (android dev phone 1 if available)
  • Blackberry
    • v5.0
      • models: 8330, 8900, 9000, 9630, 9650, 9700, 9100, 9300, 8530, 9500, 9530, 9550
    • v6.0
      • models: 9670, 9780, 9800
    • Recommended test device:
      • 8520 – (its not listed above but should have upgrade to v5.0 available)
  • Symbian S60
    • v3.2
      • Nokia: 5320 XpressMusic, 5630 XpressMusic, 5730 XpressMusic, 6210 Navigator, 6220 Classic, 6650 fold, 6710 Navigator, 6720 Classic, 6730 Classic, 6760 Slide, 6790 Surge, C5, E5-00, E52, E55, E71x, E72, E75, N78, N79, N85, N86 8MP, N96
      • Samsung: GT-i8510 (INNOV8), GT-I7110, SGH-L870
    • v5.0 (also known as Symbian^1)
      • Nokia: 5230, 5233, 5235, 5250, 5530 XpressMusic, 5800 XpressMusic, 5800 Navigation Edition, C6-00, N97, N97 mini, X6
      • Samsung: i8910 Omnia HD
      • Sony Ericsson: Satio, Viva, Vivaz Pro
    • Symbian^3
      • Nokia: C6-01, C7-00, E7-00, N8
    • Recommended test device:
      • Nokia C5
  • Opera Mobile 10.0
    • Recommended test device:
      • test on some Symbian S60 device: so again – Nokia C5

HTML 4.1, CSS, JavaScript support with focus on phones with touchable screens

In that case we have to narrow selection of supported platforms/devices. All iOS and Android platforms/devices uses touchscreen so for them the list is the same, in case of Blackberry the list of platforms doesn’t change but list of supported devices shrinks to 4 models. In case of Symbian S60 we have to remove v3.2 completely as it doesn’t run on any device with touchscreen. So below you can see list for supported devices with touchscreen:

  • iOS
    • the same devices as in the previous section (“HTML 4.1, CSS and JavaScript support”)
    • Recommended test device: