Librairie Google Analytics pour iPhone et iOS4

Google Analytics doesn’t compile in simulator in iOS4 but, works fine when compiled for iPhone. So here are 2 files the M and the H for an encapsulation that prevent compilation errors.

//
//  SGGanTracker.h
//
//  Created by Samuel Grau on 24/06/10.
//  Copyright 2010 Samuel GRAU. All rights reserved.
//
 
@interface SGGanTracker : NSObject
{
}
 
+ (void)initializeGoogleAnalyticsWithAccountID:(NSString *)accountID;
+ (void)stopTracker;
+ (void)trackPageView:(NSString *)path;
+ (void)trackEvent:(NSString *)event action:(NSString *)action label:(NSString *)label;
 
@end
//
//  SGGanTracker.m
//  Storylab_Universal
//
//  Created by Samuel Grau on 24/06/10.
//  Copyright 2010 Samuel GRAU. All rights reserved.
//
 
#import "SGGanTracker.h"
 
#if !(TARGET_IPHONE_SIMULATOR)
	#import "GANTracker.h"
#endif
 
// Dispatch period in seconds
static const NSInteger kGANDispatchPeriodSec = 40;
 
@implementation SGGanTracker
 
+ (void)initializeGoogleAnalyticsWithAccountID:(NSString *)accountID
{
#if !(TARGET_IPHONE_SIMULATOR)
    [[GANTracker sharedTracker] startTrackerWithAccountID:accountID dispatchPeriod:kGANDispatchPeriodSec delegate:nil];
#endif
}
 
+ (void)stopTracker
{
#if !(TARGET_IPHONE_SIMULATOR)
	[[GANTracker sharedTracker] stopTracker];
#endif
}
 
+ (void)trackPageView:(NSString *)path
{
#if !(TARGET_IPHONE_SIMULATOR)
	NSError *error;
	if (![[GANTracker sharedTracker] trackPageview:path withError:&error])
	{
		// Handler error there
	}
#endif
}
 
+ (void)trackEvent:(NSString *)event action:(NSString *)action label:(NSString *)label
{
#if !(TARGET_IPHONE_SIMULATOR)
	NSError *error;
	if (![[GANTracker sharedTracker] trackEvent:event action:action label:label value:0 withError:&error])
	{
		// Handler error there
	}
#endif
}
 
@end

BeMyApp – 18 juin 2010

Un week-end bien sympa qui a permit la rencontre de personnes agréables, intelligentes et pleines d’humour avec qui il fût très agréable de travailler pendant ces 48 heures.

Très drôle cette petite présentation.

Alors après le jour 1 et la présentation du projet tout le monde a de 4 à 12 heures de sommeil sur le week-end mais personne ne flanche face à la présentation imminente du projet au jury.

NSLog only for DEBUG


Using NSLog is a convenient way to print some information when you write or debug an application. But, you usually don’t want those NSLog calls to be present and called in your distribution application. So there is a simple way for that. All you have to do, is to define the -DDEBUG compilation parameter to.

#ifdef DEBUG
	NSLog(@"--- Layout layer l=%@", [self layer]);
#endif

But now, there is another problem. Using this kind of code in your application can really reduce the reading of your source code because of the formatting used to put # macros at the start of the line instead of following indentation. So, for this, you could use the following two files, that will only log if debug is activated and will follow indentation of your source code in order not to make reading something painful.

/*
 *  VSLog.h
 *  VaseltiorCommonLibrary
 *
 *  Created by Samuel Grau on 11/12/09.
 *  Copyright 2009 Samuel GRAU. All rights reserved.
 *
 */
 
void VSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2)));
/*
 *  VSLog.c
 *  VaseltiorCommonLibrary
 *
 *  Created by Samuel Grau on 11/12/09.
 *  Copyright 2009 Samuel GRAU. All rights reserved.
 *
 */
 
#import "VSLog.h"
 
void VSLog(NSString *format, ...)
{
#ifdef DEBUG
    va_list args;
    va_start(args, format);
    NSLogv(format, args);
    va_end(args);
#endif
}

Switching template language generation dynamically in eZ Publish

One of my clients asked me about sending mails in the user preferred language. And one of my interrogation, was the following one. How can I change this language since every data like current locale and eZTranslator are already loaded in memory? How could I made that.
There is the solution I found.

Creating an object that create a backup of globals variables and then switch to any wanted locale.

this is done with the following class :

< ?php
 
/**
 * Class used to switch to another locale used by eZPublish
 * for a given time.
 *
 * @author Samuel Grau
 *
 */
class SGLocaleSwitcher
{
	protected $originalLocale = null;
	protected $originalLocaleString = null;
 
	/**
	 * Constructor
	 * @return SGLocaleSwitcher
	 */
	public function __construct()
	{
		$this->loadOriginalLocaleString();
		$this->loadOriginalLocale();
 
		eZTranslatorManager::enableDynamicTranslations( true );
		eZTranslatorManager::resetGlobals();
	}
 
	/**
	 * Destructor - Do a reset to the original locale when unset
	 * @return void
	 */
	public function __destruct()
	{
		$this->resetToOriginalLocale();
	}
 
	/**
	 * Load the original local string from globals if set or from the ini
	 * configuration file else.
	 * @return void
	 */
	private function loadOriginalLocaleString()
	{
		$this->originalLocaleString = $GLOBALS["eZLocaleStringDefault"];
		if ( !isset( $this->originalLocaleString ) )
		{
			$ini = eZINI::instance();
			$this->localeStringDefault = $ini->variable( 'RegionalSettings', 'Locale' );
		}
	}
 
	/**
	 * Keep a reference of the current locale set in the globals
	 * for future reset
	 * @return void
	 */
	private function loadOriginalLocale()
    {
    	$sGlobalsKey = "eZLocaleInstance_" . $this->originalLocaleString;
 
    	if ( !isset( $GLOBALS[$sGlobalsKey] ) || !( $GLOBALS[$sGlobalsKey] instanceof eZLocale ) )
    	{
    		$GLOBALS[$sGlobalsKey] = new eZLocale( $this->originalLocaleString );
    	}
    	$this->originalLocale = $GLOBALS[$sGlobalsKey];
	}
 
	/**
	 * Reset the original global variable from the reference values we kept
	 * at construction
	 * @return void
	 */
	private function resetToOriginalLocale()
	{
		$GLOBALS["eZLocaleInstance_" . $this->originalLocaleString] = $this->originalLocale;
		eZTranslatorManager::resetGlobals();
	}
 
	public function switchToLocale( $sLocaleString )
	{
		$sGlobalsKey = "eZLocaleInstance_" . $this->originalLocaleString;
		$GLOBALS[$sGlobalsKey] = new eZLocale( $sLocaleString );
 
		eZTranslatorManager::resetGlobals();
		eZTranslatorManager::setActiveTranslation( $sLocaleString, false );
 
		echo "SWITCHED TO $sLocaleString\n";
	}
}

Télé7 pour iPhone

L’application télé7 pour iphone fait elle aussi son entrée sur l’AppStore avec une petite vidéo de présentation assez bien réalisée.

Outils de gestion de projet

assembla.com

Voici un site assez bien penser pour gérer les projets. Il était autrefois totalement gratuit, mais devient aujourd’hui payant. Il reste encore la possibilité d’en profiter pour de petits projets en mode totalement gratuit. Il faudra dans ce cas, accepter l’idée que vos sources sont visibles et que vous ne dépasserez pas les 100Mo de données.

Par contre, le fait que tout soit intégré facilite énormément la conduite du projet :

  • gestion des versions (svn, git, track)
  • timeline
  • milestones
  • scrum
  • agile planner
  • burndown charts et metriques

Voici un tas d’outils bien pratiques pour la conduite de projets. L’offre payante est quand à elle bien attrayante également avec possibilité de déclencher des mises en production et maintenir automatiquement les builds de vos applications.

30 ans! How to deal with it?

Que faire quand notre âge avance sans que nous ne puissions rien y faire? La réponse étant elle-même dans la question, il va falloir la préciser un petit peu.

Comment réagir correctement lorsque ni notre esprit ni notre physique ne correspond à notre âge? Ou plus simplement que signifie l’âge que nous avons?

Nous savons, malgré toutes les interprétations que nous pouvons avoir de nous même, ou de celle que nous retourne les autres qui nous entourent, qu’ils soient des individus proches ou inconnus, que notre âge est défini par le nombre d’année calendaires écoulées depuis la date de notre naissance dans ce même calendrier. Il en va ainsi! Notre corps est composé de cellules, lesquelles, par mitose se dupliquent. Le seul hic dans cette histoire c’est que la mitose se réalise toujours par rapport à la cellule d’une mitose parente et non par la celle d’une cellule mère. La conséquence directe est que la copie se fait à partir de copies et pas d’originaux. Mais qu’est-ce que ça peut bien vouloir dire? Tout simplement que comme avec une photocopieuse, si vous photocopiez en permanence la photocopie et on pas l’original, et bien, au bout d’un certain nombre de copies, les traits continus que vous aviez sur l’original sont transformés en lignes avec des imperfections à certains endroits et que plus vous photocopiez, plus les imperfections deviennent visibles. Il en va de même pour nos cellules et ainsi nous vieillissons.

Pfff, c’est la vie diraient les américains! (Nous aussi on dirait ça).

Comment différencier notre âge réel de celui qui nous est présenté au jour le jour?

Ouais! comment réagiriez-vous si on vous donnait pas l’âge que vous avez? Que se passerait-il si les gens que vous croisez dans la rue vous regardaient comme si vous aviez 10 ans de moins? Si les femmes qui vous lancent des sourires sont celles qui ont 10 ans de moins? Si votre père pensait toujours que vous avez 10 ans de moins?

N’auriez-vous pas envie de tout changer? De faire tout basculer? Imaginez qu’en plus vous vous amusiez à jouer de cette image? Que se passerait-il si vous arrêtiez de jouer? Que se passerait-il si vous vous engagiez? Que se passerait-il si vous vous accordiez à avoir votre âge? Serait-ce plaisant? Que perdriez-vous et qu’auriez-vous à y gagner? N’existe-t-il pas un compromis ou vous ne perdriez pas ce qui vous est cher en vous accordant à cet âge, qui au final est le vôtre? Cet âge qui fait que dans des discussions de tous les jours vous vous retrouvez ou vous écartez simplement de discussions parce que celles-ci sont en décalage? A partir de quel moment ne peut-on plus se mentir et ne peut-on plus mentir aux autres? Dois-je attendre ce moment pour effectuer le calage? Quand viendra-t-il? Est-ce maintenant?

Est-ce le moment ou la chenille devient Papillon?

Le seul problème avec l’image de la chenille qui devient papillon c’est que même si la métamorphose offre un résultat impressionnant de part la beauté de la forme atteinte, de part les couleurs chatoyantes qu’elle offre et de part la prouesse accomplie, il n’en reste pas moins que l’espérance de vie du papillon est très faible…

How to deal with it?

And what if on s’en fout? And what if you were afraid of the power you could gain by being the age you are. Why am I telling this? Perhaps that, instead of being fully what I am, I just experimented some part of what I could be leaving what I am because this experience was proving me that I would have no limit. And being without any limit is the worst thing you could live. Imagine you can have everything you’re dreaming about. In that case, there is no need for your dreams to still exist since they’re achieved. If I permit myself to be what I am, then I have no need to live further… And that is a sad thing, because behind this feeling there is no better experience.

Il est temps je pense de consulter ;-)

Non mais plus sérieusement, je pense qu’il y a énormément de questions qui se profilent tout le long de notre vie. Ce que je trouve le plus amusant au final est de me rendre compte que plus je vieillis, plus les questions se posent et que plus rares et inexistantes se font les personnes qui seraient les plus aptes et délivrantes à y répondre. Ce qui au final me réconforte!

Même si les réponses ne sont pas présentes, les questions sont bien présentes et bien sans réponses et me poussent vers cette quête du savoir qui m’anime depuis ma plus tendre enfance. Même si je n’arrive pas à coller une réponse à chacune de mes questions, chaque question se profilant à l’horizon reste une étape, un cap, un challenge à relever! Ma seule motivation réside dans le challenge, car défier la vie est ma plus grande obsession.

Mais voilà, où en est-on à 30 ans? Avons-nous atteint les objectifs que notre société moderne nous « force » à atteindre? L’image que nous offrons de nous-même est-elle celle que nous inculque ce vingt et unième siècle? Sommes-nous en adéquation avec, par obligation majoritaire, le reste de la populace qui ne vit que par l’assouvissement de règles apprises ces dernières décennies? Car s’est ainsi que tout un chacun se doit de vivre, selon notre époque…

J’ai envie de crier merde!

Réveillez-vous! Ou tout simplement… éveillez-vous! Open your fucking mind to what life is and what it could brings you to!

Il faut absolument que tout change… Nous en avons encore la possibilité, nous en avons encore la faculté. N’attendez pas que le monde atteigne ce point de non retour qui vous poussera dans vos derniers retranchements. N’attendez pas que tout bascule pour prendre conscience.

Eveillez-vous!

Vos rêves sont bien réels. Les seules limites à vos rêves sont celles que vous vous définissez!

Category: Non classé  One Comment

Mac OS X Snow Leopard + XCode Developer Preview 2009

Bon la première journée de présentation se termine. C’est cette journée qui nous à fait un peu basculer dans un autre monde avec l’arrivée de nouvelles technologies et de nouveaux appareils directement sortis des usines Apple. Et oui y’a quand même quelques nouveautés! Certaines sont simples et évidentes; c’est le case de l’ensemble des améliorations de performances des différent OS d’Apple, à savoir ceux des macs et celui de l’iPhone. D’autres sont plus importants et pour le coup inattendus.

Bon, si on essaye de faire simple dans un premier temps, voici donc les éléments à retenir pour cette journée :

  • De nouveaux Macs sont disponibles à petits prix : Ceux-ci peuvent monter jusqu’à 8GB pour les configurations un peu évoluées des macbook pro. Ils offrent en plus des macbooks actuels, un lecteur de carte SD et un port Firewire 800.
  • Le nouveau système d’exploitation « Snow Leopard » qui vous coûtera la modique somme de 129$ à la rentrée de septembre. (29$ pour une mise à jour et 49$ pour un pack familial). Ce système est donc beaucoup plus rapide car il utilise, entre autres la technologie GCD (Global Charge Dispatcher) qui est un peu l’équivalent d’une couche d’abstraction de gestion des threads. Il profite également d’une autre technologie, qui fait usage des opérations laissées libre ou offerte par les GPU des cartes graphiques afin de les combiner à celles des processeurs multi-core. Résultat, vous passez d’une calculatrice à un DeepBlue. Non je déconne! mais les résultats sont très bons.
  • Ensuite!!! le voili, le voilou, le tout nouvel iPhone 3GS (S is for Speed). Celui-ci est lui aussi 2 à 3 fois plus rapide que son frère le 3G. La version 16Go de cet iPhone sera disponible le 19 juin en france pour seulement 199$. Avec un appareil photo 3Mo Pixels avec auto-focus et « touch to focus », enregistrement de vidéo, boussole, OpenGL ES version 2.0 et 3G HSDPA.

Enfin donc voici les nouvelles petites choses, qui ne sont pas des moindres, collectées aujourd’hui. Encore une petite demi-heure avant que je ne rejoigne mes compatriotes français dans un pub irlandais à quelques pas de mon hôtel. En attendant, je vous laisse regarder la photo suivante :

 

Cette photo montre une floppée de moniteurs qui trace en temps réel l’ensemble des applications iPhone présentent sur l’iPhone et qui sont téléchargées en temps réel. J’ai pas encore trouvé les nôtres parmi les 50000. Mais je passerai quelques minutes à les chercher demain pour vous faire une belle petite photo. Espérons que les nôtres clignottent ;-)

WorldWide Developer Conference 2009 (WWDC 2009)

Et oui, aujourd’hui je quitte la France pour une petite excursion californienne à San Francisco afin de participer à la conférence mondiale des développeurs Apple. Certains l’appelle la WWDC, mais chut! It’s a secret!

Mon premier saut en parachute!

Le 1er mai 2009, nous avons rendez-vous, des amis et moi pour un saut en parachute. Nous effectuerons ensemble ce baptême de chute libre à 11h00. Bon! Nous sommes arrivés avec un peu de retard et avons loupé notre avion. Nous patientons pour prendre le prochain et là c’est le drame. Un manteau nuageux venant de nulle part opacifie le ciel, empêchant alors tout décollage et nous enlève alors tout espoir de saut.

Nous patientons alors 1h, puis 2, puis 3… Dans le hangar, les gens présents qui depuis 3 heures semblaient plus proches d’une photographie que d’une vidéo, s’animent à nouveau. Les moniteurs reprennent les briefings de sauts pour les initiés, et un avion décolle. La classe nous allons bientôt pouvoir décoller. Quelques minutes se passent et l’avion atterrit, avec à son bord, l’équipage… et les passagers. Merde! ils n’ont pas pu sauter.

TODO

Quand tu sautes, l’espace de chute libre paraît sans limite, le ciel est à toi. Quand tu lèves les yeux, où que tu sois, tu es chez toi. Le ciel t’appelle et la chute libre est euphorisante, pareille à une drogue de bonheur.

TODO

Category: Non classé  One Comment