Blog

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 ifttt.com. 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.

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 ;) .


General

+ 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: http://deanzchen.com/the-best-design-decision-apple-made-for-swift


Operators

+/- == 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


Functions

+ 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)


Classes

+ 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 (https://devforums.apple.com/thread/227288).

- 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 (http://en.wikipedia.org/wiki/Value_object)

+ 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?


Summary

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!

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 (mobile-patterns.com)



Pttrns (pttrns.com)



UX archive (uxarchive.com)



Pattern Tap by Zurb (patterntap.com)



Inspired UI (inspired-ui.com)



Android App Patterns (android-app-patterns.com)

Author: Krzysztof
Comments: 4 comments
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:

Pros:

  • 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.

Cons:

  • 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

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.

Enjoy!

Our team would like to wish everyone all the best and a happy Easter holiday!
Happy Easter!
Author: Wojtek
Comments: 1 comment
Category: Our Projects

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

Cheap mobile flying Cheap mobile flying

 

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

Map wallpapers Map wallpapers

 

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

Who killed Change Who killed Change

 

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:

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. :)

Author: Wojtek
Category: Mobile Business

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.

Author: Wojtek
Comments: 1 comment
Category: Mobile Business

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.

Author: Wojtek
Category: Mobile Business

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. ;)

Author: Adam
Category: iOS7

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”.

Author: Wojtek
Category: Our Projects

Nomtek has recently been granted a Comenius EduMedia Award by Gesellschaft für Pädagogik und Information (The Society of Pedagogy and Information) for PONS Online Dictionary application. A signed certificate with the official Comenius EduMedia seal was handed to us by representatives from PONS GmbH.

GPI_award_scan_small

Author: Kamil

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.

Author: Wojtek
Category: Mobile Business

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 @ www.itcorner.org.pl

Author: Szymon
Comments: 1 comment

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

title

Overview

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

Installation

First of all, you should go here (https://cloud.genymotion.com/page/launchpad/download/) 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 Mai, 31 Produktupdate: EaseUS hard disk repair Wizard 6. main screen will appear:

Blog1

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

Blog2

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.

Blog3

Performance

For testing purposes I used a sample Android application which can be downloaded from here (https://github.com/steveliles/dsl4xml-perf-android/downloads)

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.

real_device

Samsung Galaxy SIII Mini GT-I8190 Android 4.1.2

genymotion

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 :)

Author: Krzysztof
Category: Mobile Business

warning-cliff-edge
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 contact@nomtek.com and I will be more than happy to discuss them.

985578_15020243

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 – https://developer.apple.com/appstore/contact/?topic=expedite

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.

Author: Kamil
Category: Social Networks

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)
Facebook YES YES YES YES YES NO
Twitter YES YES (followers, followed) YES YES YES YES
LinkedIn YES YES YES YES YES YES
Instagram YES YES (followers, followed) YES NO YES NO
Google+ YES NO YES YES NO NO
Flickr YES YES YES NO YES NO
Foursquare YES YES YES YES NO 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!

Comments: 3 comments

2378867408_4cc90791d6

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.

product = Basket.getProduct(0); //we got our product

Then I could just write:

product.discount = 0.2; //applying discount

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:

setDiscount: function(discount) {
    this.discount = discount;
}

And in the basket I have written:

products.setDiscount(0.2);

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:

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') {
        this.discount = discount;
    } else if(type=='cash') {
        this.discount = 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-watch

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.

2013-01-28pebble1020-10_large_verge_super_wide

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.

VRG_4622-1

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:

pebble-prototype
 

Pretty ugly, huh? ;)

Author: Jakub

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.

AA

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.

Author: Rafal Hotlos
Comments: 1 comment
Category: Mobile Business

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.

Partnership

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.

 

 

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:

http://www.apptamin.com/ASO_Cheat_Sheet.pdf

http://techcrunch.com/2012/09/29/five-big-changes-in-the-ios-6-app-store-and-what-developers-should-do/

http://venturebeat.com/2013/05/09/here-are-5-secret-arts-of-app-store-optimization/

http://www.bluecloudsolutions.com/blog/app-store-keywords-choose-terms/

Tools for analysis:

https://searchman.com/add_app/?country_code=US&q=Instagram&header_search_device=iPhone

http://www.appcodes.com/

https://appstorerankings.net/

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 (naszaklasa.pl, transpodroid, jakdojade.pl). 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.

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

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

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:

Author: Wojtek
Category: Mobile Business

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!

Author: michal
Category: Uncategorized

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 jakoscobslugi.pl, 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 jakoscobslugi.pl, 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

Author: Wojtek
Category: Uncategorized

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.

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. -

Author: kn

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:

setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);

Let’s see the full example:

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

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

Enjoy!

Author: kn

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;
    }

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

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

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

    public String getId() {
        return mId;
    }

    public String getText() {
        return mText;
    }

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

    @Override
    public int describeContents() { // (2)
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) // (3)
    {
        out.writeString(mId);
        out.writeString(mText);
    }

    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.

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

Author: Wojtek
Category: Mobile Business

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.

Media:

Full photo gallery HERE.

Panoramic view of our stand HERE.

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:

Kamil
iOS Continous Integration (CI) for Beginners

Michał
To Understand the User – Ensuring Appropriate Application Development

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

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

Roman
Fighting back platform segmentation – introduction into Android functional testing

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 Heatma.ps 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.

Author: kn
Comments: 2 comments
Category: Mobile Business

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.

applicasa2

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_white_logo

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_Logo_HiRes-copy

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_logo

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.

Summary

“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.

Author: Paweł
Comments: 1 comment
Category: Our Projects
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 best-horoscope.com affectivity is traditionally believed to be disconcerting. swipe gesture.
While creating FlipCards we focused on simplicity and impressive graphics which make learning even more enjoyable.
FEATURES
  • simple and user-friendly interface
  • marvellous artwork
  • create your own flash cards in embedded editor
  • search and download flash cards from Quizlet.com (over 7 million flashcard sets)
  • upload your flashcards to Quizlet.com 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
SUPPORT
If you have any questions or issues with this app feel free to contact us at flipcards@nomtek.com
For any news you can follow us on Twitter: @NomtekMobile
Author: Kamil
Category: Mobile Business

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!



You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

AX4 Tracking

Author: Paweł
Comments: 12 comments

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

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;
    }
    else
    {
        // 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;
              }
             else
             {
                   v.x = p.x - N.x * (dist - halfCylinderCircumference);
                   v.y = p.y - N.y * (dist - halfCylinderCircumference);
                   v.z = 2 * R;
             }
        }
    }
}
Summary
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.
Author: Paweł
Category: Our Projects

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.
Features:
  • 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: educards@nomtek.com.

For any news you can follow us on Twitter:

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

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 http://gs.statcounter.com/ 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 http://jquerymobile.com/gbs/, 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:
      • the same device as in the previous section
  • Android
    • the same devices as in the previous section (“HTML 4.1, CSS and JavaScript support”)
    • Recommended test device:
      • the same device as in the previous section
  • Blackberry
    • v5.0
      • models: 9500, 9530, 9550
    • v6.0
      • models: 9800
    • Recommended test device:
      • one of 9500, 9530, 9550 models
  • Symbian S60
    • v5.0 (also known as Symbian^1)
      • the same devices as in the previous section (“HTML 4.1, CSS and JavaScript support”)
    • Symbian^3
      • the same devices as in the previous section (“HTML 4.1, CSS and JavaScript support”)
    • Recommended test device:
      • Nokia 5230
  • Opera Mobile 10.0
    • test on some Symbian S60 device: so again – Nokia 5230

HTML 4.1, CSS, JavaScript support with reasonable support for HTML 5

HTML 5 is not yet fully defined, so there is no such thing as a browser that fully supports HTML 5. But there are already quite a few well defined functions in this standard and they are already implemented in some browsers. If you want to go into deeper details please use this excellent tool for testing html5 compatibility: http://html5test.com or http://beta.html5test.com. In case of mobile web browsers we only have three platforms that support HTML 5: iOS from v3.1.3, Android from v2.1 and BlackBerry from v6.0. You might also consider to support Opera (please look at: http://www.opera.com/docs/specs/productspecs/), but here we assume that its HTML5 capabilities are not yet acceptable. This limits our choice of platforms/devices to the list below:

  • iOS
    • the same devices as in the previous section (“HTML 4.1, CSS and JavaScript support”)
    • Recommended test device:
      • the same device as in the previous section
  • Android
    • v2.1
      • the same devices as in the previous section (“HTML 4.1, CSS and JavaScript support”)
    • v2.2
      • the same devices as in the previous section (“HTML 4.1, CSS and JavaScript support”)
    • Recommended test device:
      • HTC Desire
    <