juin
17

Developing an iPhone app with my friend (part 3)

In part 1 and part 2  I detailled how the versions 1.0 and 1.1 of the iPhone application  Sharies were done (working on a small team, tools used for collaboration, problems we encountered, …) and mainly how we worked then to get the more profit of users feedback after the release of each version.

Focus on the main idea

After the version 1.0 was released, we figured out very quickly that the application was not really good (sadly… I have to admit). The user interface was not really nice and on top of that we developed too many features. The version 1.1 had for main objectives to work on those 2 items:
- remove the stuff that was not needed within the UI (buttons we though nice were kind of ugly in fact)
- remove the features that were not part of the core applications

Those actions were not enough to have the application easier to use. We then decided to give it a new lifting and a great focus on the main function.

Sharies is used to give away some stuff you own but do not use anymore

This is the focus we should have indicated right from version 1.0. Instead, we got lost in secondary functions that remove the focus from this main functionality.

The main idea: You have some stuff at home, that can be a book you have read, some kind of tools you do not use anymore, some piece of furniture you do not like anymore… you name it. The fact is that all those things could please someone else.

This is the reason to be of Sharies: to have our no more wanted stuff be used by someone else.

Modify the design, once again

Oh guys, each time I want to change something in the design, I wonder if that should be better « like this » or « like that ». I definitively need to take some design lessons (BTW if you have interesting links…). The main idea we had regarding this app’s design is to be able to make something really simple so the user does not have to struggle to understand how it works. We tough a big button, with a clear label of the main function, should be the more appropriate for that. No more needs to some we_though_fancy icons or extra blabla.

Conclusion

Once again, the new version of Sharies application is quite different from the previous one. At this stage it was quite hard to get much more feedback from our friends (they probably got fed up or something :) ). This app is now more focused on what it should do and this is something we are really happy. It’s sometimes not easy to isolate the main functionalities from what we think are the main functionalities.

mai
08

My favorite stuff

Tools I use every single day:

Favorite Languages:

  • Shell scripting
  • Ruby / Rails
  • Javascript (node.js)

My Hot topics of the moment:

mai
04

Developing an iPhone app with my friend (part 2)

In part 1 I detailled how I worked with my friend to develop our first iPhone app Sharies. I talked about several aspects of our collaboration and it’s now time to talk about what went on after the app was released…. well…. as we expected … pretty much nothing :)

First users and first feedbacks

The aim of work together was mainly to follow the process of an iOS app creation from A to Z. We managed to do the whole thing but of course this is important to have real users and a couple of feedback after the app is released. After publishing in Hacker News / Facebook / Twitter and talking about it to our friends, we managed to have some downloads but that’s pretty much all, not a lot of feedback. But… among the few feedbacks we received, one very interesting was made by one friend. The main concerns he had:

  • design is quite bad
  • several bugs
  • did not understand the main idea of what the app should do

Well… that was really negative… but the important thing is that we have someone giving his opinion on the application and helping us to improve what we did.

Negative feedback but…. very constructive and helpful feedback !

1st action: focus on the main functions

While we were building the application, we had a lot of ideas that we implemented, but we should probably have focused on the main functions before trying to develop secondary functions. We had the head too deep in the application and that was surely a problem. As I said in part 1, we tried as much as we can to make the application user friendly. Now that we have more knowledge and a couple of feedbacks we understood that we failed to do this.

We then decided to put the focus on the main functions and to postponed the secondary ones for some future releases (maybe). The main idea of the application is to enable a user to:

  • give an object he/she does not use anymore
  • organize an event to share with others

We were not able to make this simple idea easy to understand and that’s a pity. Focusing on the main functions is surely the way to go in order to have the users to understand at the first glance the purpose of the app.

2nd action: modify the design

As said in part 1, we are not good designers. The feedbacks we received reinforced this knowledge :) .  We then decided to review our « design » and give it a fresh lifting. We then:

  • removed some of the « kinda fun » images we used for the buttons (that was not a good idea and it’s much better to stick to some more traditional buttons
  • used a button only for each of the 2 main functions listed above
  • hide the secondary functions
  • made the overall application look less fun

Conclusion

The new version of Shary is now really different from the first release and that is a good thing. When we asked our friends to test the application before the first release we probably did not go deep enough. Real world testing through the AppStore was great and enabled us to have more visibility and then more possible feedbacks.

avr
22

One liners

Too often I remember having already searched and used some useful commands but also too often I do not manage to quickly find them again. This is the place I will save them for future use and not forget them this time.

Copy a public key onto the remote server
ssh user@remote-server 'cat >> .ssh/authorized_keys' < .ssh/id_dsa.pub

Save a file in vi when you made a lot of changes and did not notice it was read-only
:w !sudo tee %

List all IPs connected to a LAN
nmap -sP 192.168.1.*

List all IPs of LAN running a server on port 8080
nmap -p 8080 192.168.1.*

Version of Linux running
cat /etc/issue

avr
17

Cas d’utilisation de l’application Sharies

L’application Sharies est disponible sur l’App Store depuis quelques jours.

Cette application permet de partager des objets ou bien des évènements. En voici les cas d’utilisation les plus simples:

J’ai un objet dont je ne me sers plus. Je l’ajoute sur le réseau Sharies et les personnes qui sont interessées peuvent me contacter (directement au travers de l’application) et venir le chercher. Cela pourrait être:

  • un livre qui m’a beaucoup plu et que je souhaiterais partager avec d’autres amateur de lecture
  • un outils que je n’ai utilisé qu’une fois et qui ne me sert plus
  • des pièces d’ordinateurs qui pourrait intéresser un passionné d’informatique

Il ne s’agit pas de vendre des objets mais de donner des choses que l’on utilise plus et qui pourrait dénéficier à d’autres personnes.

L’autre utilisation principales est de pouvoir partager un évènement. Qu’est ce que cela veut dire ? Bien, il y a plusieurs cas de figure:

  • Je suis dans un endroit que je ne connais pas (lors d’un déplacement professionnel par exemple). Je peux créer un évènement depuis l’application (« boire un verre », « sortie au cinéma », « diner au restaurant », …) et permettre à d’autres personnes de partager ce moment avec moi.
  • Je souhaite faire un footing sur la Promenade des Anglais (Nice), au Parc de la tête d’Or (Lyon), … pourquoi ne pas proposer à d’autres personnes de se joindre à moi ?

Les cas d’utilisation sont relativement nombreux mais fonctionne tous sur la même logique:

  1. J’ai quelques chose que je souhaite partager
  2. Je crée ce Shary depuis l’application iPhone. Celui ci est alors affiché sur une carte
  3. D’autres utilisateurs pourront le voir et choisir d’y participer en me contactant par l’application

avr
09

package.json in node.js

When starting working with nodejs, I installed nodejs and the libraries globally. I’m always reluctant to doing so as some part of the installation might be in different locations without knowing exactly where (well… that’s my view :) ).

In this previous article I talked about nave for handling several nodejs version. This allow for each user to have a pool of nodejs releases he can switch between.

Concerning the library, it’s a little bit more complicated (not that much don’t worry). When installing nodejs library with npm (for instance « npm install express »), the module installation is done in a node_modules folder in the current folder the installation command is ran. I found it quite messy as several modules could be used by the same app but installed in different foders/subfolders.

I came across package.json file not long ago and really stick to it ever since. Basically, a package.json file is located at the root dir of the application and contains the list of modules (among some other information) used by an application.

A package.json file can be as simple as:


{
"name": "myproject",
"version": "0.0.1",
"author": "",
"description": "",
"dependencies": {
"express": "2.5.x",
"http-proxy": "0.8.x"
},
"engine": {
"node": "0.6.12"
}
}

Before running the application, running the « npm install » command will check all the modules used by this application (reading the package.json file) and will create the node_modules folders containing all those modules. The newly created node_modules folder will then be in the root folder of the application and enable to have all the modules installed at the same location.

 

The important thing to note is that each application can have it’s own modules and version of modules without impacting the other applications. Then there is no need to install the modules globally. I think adding a package.json file for each application, event those you do not attend to release to the world, is a good practice.

 

avr
09

Une utilisation sans besoin de s’enregistrer

Lorsque nous avons commencé à développer l’application Sharies, nous nous sommes projeté à la place d’un utilisateur (nous avons essayé en tout cas) afin de rendre l’application simple à utiliser (plus de détails sur la réalisation de cette application).

Nous voulions éviter de solliciter l’utilisateur en lui demandant de rentrer ces informations personnelles et finalement nous avons opté pour un usage anonyme. Lorsqu’un utilisateur installe l’application sur son iPhone, il n’a pas besoin de choisir son login, son mot de passe, de renseigner son adresse email, … En fait, il n’a rien à faire, car un pseudo lui est automatiquement attribué au premier lancement de l’application.

Cela lui permet d’avoir access dès le départ à la totalité des Sharies existant, de pouvoir interagir avec les autres utilisateurs, et de pouvoir créer ses propres Sharies. Nous ne cherchons pas à recueillir des adresses emails et des données utilisateurs, nous souhaitons simplement que n’importe quel utilisateur désirant essayer l’application puisse le faire le plus simplement possible.

avr
09

Handling several version of node.js with nave

A couple of months ago I decided to give node.js a try and I honestly really enjoyed it since then.

The first version I used was 0.4.8. In my application I used several modules:

  • expressjs (you can make an API server in no time with this guy)
  • node-proxy (very usefull to make cross-domain AJAX request)
  • cluster (to use the power of a multi-core CPU)
  • … plus a couple of others

Everything went fine but with the node.js community releasing new version quite often it then comes time to upgrade to the latest stable version (0.6.12 at that time). Installing the new version, while keeping the previous one (just in case) was not easy… Then nave come into the picture.

This is a very handy tool that enable to handle several nodejs version and to switch between them. Once you have downloaded the nave.sh script (from the link above), it’s a easy as:

  1. ./nave.sh install 0.6.12
  2. ./nave.sh use 0.6.12

to have a new version of nodejs installed an a shell to use it.

The important thing to note is that nave install the nodejs releases on a per user basis: any user can have the nodejs releases he selected and easily switch between them. As nave  installs nodejs releases within .nvm folder in the user’s directory, there are no chunk of it installed globally.

avr
05

Developing an iPhone app with my friend

Context

One year ago we decided, my friend and I, to work together during our spare time and to develop something (did no really know what by that time). As we did not have any experience on the development on the Apple ecosystem, we decided to build an iPhone application. Of course we knew that it would not be a revolutionary app, but we wanted to test some fancy technology and, most of all, we wanted to build something from A to Z (iPhone app and server part). Well, it took use one year (oh dude, that was long) but we really enjoyed that.

The project environment

- git for the collaboration (I love this tool). Obviously we used github to host the code.
- iOS for the client part (we though of HTML5 also but well we did not really catch this one)
- node.js for the application server side
- Redis: we wanted to give a try to a nosql db and redis seemed really cool (it actually is)
- and we took a « dedicated » VPS to install all those stuff (we used nodester.com and redistogo.com at the beginning but quickly decided to rent a VPS so we could do whatever we wanted on this guy).

The basic architecture

We decided to build an API server from which the iPhone app will send/get some data in json format. The server only sends data, it does not serve views. Doing that this way allow any kind of client to issue REST HTTP requests and perform its own interface. HTML5 and Android might come to the picture sometime maybe.

Sharing code

At the beginning my friend was dedicated to the iOS part, I was working on the server part.
Then, we both worked on the iOS client, the server was almost set and did not require much development at that time.
For the server part development, code sharing was really neat, not hard to set up.
Regarding the iOS code, it was not that easy mainly because of a bad .gitignore settings to which we did not give much importance at the beginning (we were wrong, it was an important part). Several times we had to change our project settings because it was over written by the other developer one’s. Well, it was just some stuff we keep for a too long time before realizing it was a pain in the ass not having set the stuff correctly from the start. For other projects, I now put the emphasize on the initial config as it really saves some time and troubles (and fight) during the development.

Our advice: spend some time right from the beginning to set those things up correctly, that is some time saved for the future.

Development process

Very early we put some friends in the testing process. The Build – Measure – Learn loop (from Eric Ries Lean’s startup movement) was something we really wanted to put in place so we can have user’s feedback really soon (it was our basic understanding of the lean movement by that time :) ). That was great doing it this way as it helped us to learn a lot and to work on making an user interface more user friendly and intuitive. Oh boy, I’m too bad at building something that looks good (it’s very hard to be a developer and a designer, well…. hard for me at least). My friend was better at that, it’s a relief. Adding our friends into the loop from the beginning was very helpful as they pointed fingers to really ugly stuff and unfriendly function, stuff that we did not notice ourselves.
http://testflightapp.com/ is such a great tool to share iOS application and have testers very early into the loop.

Our advice: add some good friends in the loop quite soon so they can prevent you from making ugly stuff that you do not even realize :)

Our fights

There were not many, that’s a good point (and no real fight though). It was sometimes complicated for each of us to have the other agreement to develop a new functionality or to rebuild a big trunk of the code. Negotiations were pretty smooth and we usually agreed on some stuff that could satisfy the other. We were quite new to iOS design, and we figured out quite late that our global design needed some big changes to be cleaner (sometimes I was upset when I realized we made big mistakes in the conception phase and I was really pushing to rebuild a really big part, I mean pushing really hard). I talked about conception phase… hmmm… there was no real conception phase, and that was a mistake because we worked on that when we had already done too much dev.

Our advice: take some time at the beginning to figure out some best practices (mainly if you’r using a techno that you do not know) before going fingers first on the keyboard and start coding.

Our application

As already said, we wanted to build something entirely and discover some new stuff. Well…. we succeed at that at least and we are happy.
Today we will go into a real test and that’s great. The support part (for the few user will have, if any :) , will certainly be interesting).
If you want to give it a look (small personal advertisement), the application is named Sharies (http://sharies.net). It is dedicated to the sharing of things that users does not use anymore. You have a book you like, but you’ve already read it, so why not give it to someone that would appreciate to discover it ? It works for things but also for events that one would like to share.

Additional item: The AppStore approval process, first submission first rejection  :(

I was pretty sure, after 7 days (that is the average validation delay of an application http://reviewtimes.shinydevelopment.com/), the app would be available this week-end but… I got the rejected status. Too bad. The reason was because the Google logo was not visible on the Google Map used in the app. We obviously did not hide it on purpose, but it was in fact hidden behind the tab bar. After a quick fix, the app was resubmitted. Dunno if it will take one whole week or if some kind of track records exist. BTW, I was quite surprised that the review process consists of running each app and manually testing it (to detail the rejection reason, I was send some screenshot of my app) where the logo was missing.

After 7 days, the second submission of the application is now available on the App Store.

juil
26

Node.js server controlling node.js clients

During the last few months I’ve been working with node.js and I really liked it.  I’ve mainly developed  servers offering API to the external world (no GUI needed).

I came to a point where I wanted to go a little bit further and study how the server can trigger actions on the client side. Several libraries are available for doing so but I focused on nowjs which is a really great one, clean, and easy to understand. The online documentation is very good and provide an overall view of nowjs, and the fondamental aspects in no time.

Basically, I wanted to achieve the following stuff:

- Develop a node.js server exposing API to the external world

- Develop a node.js client that would connect to the server (several instances of this client should be connected at the same time)

- And the main thing was to be able to call the server API to trigger action on a given client (or on all the clients if needed).

 

I read several articles on nowjs and figure out the client connecting to the server were only web clients (though a browser).

I asked on nowjs irc channel if it was possible to have a node.js client also and Steve Wang pointed me to a great project he is working on: https://github.com/Flotype/nowclient. Thanks a lot to Steve for his help, he explained me a lot of stuff regarding nowjs and how to use the library he has written.

 

I have then created a client based on Steve’s one and a server that:

- uses expressjs to receive action from the outside world

- uses nowjs to send this action to the targeted client.

 

The code (still in early beta) can be found on github

Articles plus anciens «