Il y a quelques mois j’ai pu récupérer en test un kit bluetooth pour la voiture Jabra. Je souhaitais tester ce type de produit car téléphoner en voiture même avec un casque risque de certainement être interdit dans un futur proche, alors l’utilisation d’un kit seconde monte en bluetooth devra certainement permettre de téléphoner légalement.
Jabra m’a donc prêté un de leur appareil le Jabra Freeway, ce dernier est compact et permet de connecter plusieurs téléphones en même temps. Voici un retour de mon utilisation de ce kit bluetooth pour voiture.
Comme vous pouvez le voir sur l’image, l’appareil est élégant (il a eut un Reddot Design Award en 2011) et est très discret, ce qui est essentiel pour le laisser dans un véhicule. Ce Jabra Freeway se fixe au pare-soleil et finalement je trouve cela pas mal du tout car on voit moins de la rue que vous avez un kit voiture d’installé versus les kits qui se fixent sur les grilles de ventilation qui sont plus facilement identifiables par les voleurs.
Pour la configuration, il suffit d’appareiller en bluetooth votre téléphone (qui doit être bluetooth bien entendu) au kit et c’est tout. Cela fonctionne vraiment bien, en revanche j’ai eu plus de soucis pour connecter deux téléphones et faire en sorte qu’ils soient tous les deux connectables sur le kit. En effet, le fait d’avoir défini deux téléphones rendait instable la détection des appareils et leur connection au kit main libre. Donc au final, je recommande de ne connecter qu’un seul téléphone car là c’est vraiment stable.
En utilisation, là aussi c’est ultra simple, il suffit d’accrocher le kit au pare-soleil et de l’allumer. Le téléphone se connecte automatiquement et réveille le kit (qui a une fonction sommeil pour éviter de se décharger inutilement). Lorsque l’on reçoit un appel, le kit annonce le numéro appellant, il suffit d’appuyer sur une touche pour prendre l’appel, le tout sans regarder son téléphone qui peut rester dans son sac ou sa poche. La batterie est suffisante (une charge par semaine pour mon utilisation), l’appareil se recharge via un port mini-usb qui est la norme principale de chargement des téléphones, donc si vous avez un chargeur de voiture, cela permettra aussi de recharger le kit main libre tout en roulant.
En terme de son, la conversation est diffusée soit via les hauts parleurs du module, avec une qualité vraiment bonne, néanmoins si vous souhaitez diffuser le son sur le système audio de la voiture c’est possible de le faire via un transmetteur FM intégré qui diffusera le son sur votre poste. Une fonctionnalité pratique mais au final j’ai préféré la simplicité de l’utilisation uniquement du système audio du kit bluetooth. Le truc intéressant c’est que vous pouvez décider si le kit doit diffuser d’autres informations issues du téléphone comme le guidage GPS si vous utilisez votre téléphone comme navigateur GPS ou encore si vous souhaitez écouter de la musique et que vous n’avez pas de prise auxiliaire dans la voiture.
Pour la petite histoire, au déballage, j’ai configuré et installé ce module bluetooth tout en étant au bureau et lors d’un appel le Jabra c’est transformé en ampli et haut parleur sur le bureau, pratique aussi comme utilisation!
Bref, le Jabra FreeWay est un très bon module main libre pour voiture, le tout à un prix acceptable (130€ en prix officiel mais moins de 100€ sur Amazon par exemple).
Klout est un service qui a pour objectif de « mesurer » l’influence d’une personne, ce calcul d’influence est fait sur la base d’une formule (magique) permettant de déterminer si telle ou telle personne a un pouvoir de recommandation auprès de sa communauté.
Certains adorent le principe de Klout mais au bout d’un certain temps on peut souhaiter ne plus avoir de note Klout. Sur le principe c’est un peu comme le retargeting, il faut donc informer que vous ne souhaitez pas avoir de score sur Klout et cela se fait sur cette page : http://klout.com/#/edit-settings/optout. Après quelques clics et la lecture de quelques messages comme quoi Klout va effacer votre compte, etc…
Vous aurez définitivement quitté Klout.
02-12-2011|Commentaires fermés sur Marre de Klout, voici comment effacer votre compte
Comme vous le savez déjà Google va déployer une nouvelle interface pour son moteur de recherche avec notamment un nouveau design de la barre supérieure (la fameuse barre noire). Pour l’instant cette nouvelle navigation n’est pas encore déployée mais comme pour le nouveau design de Youtube il est possible de l’activer très simplement grâce à l’ajout d’un cookie.
Mettez vous sur la page Google.fr puis :
Sous Google Chrome ouvrer : « Afficher/Options pour les développeurs/Console Javascript » et coller le code ci-dessous :
Notez que si vous avez un compte google apps de connecté cela ne marchera pas, il faut soit se déconnecter soit utiliser un compte gmail classique. Et voilà vous avez la nouvelle barre!
Voilà il ne manquait plus que cette fonctionnalité à Google Maps pour être un vrai service global de cartographie et de navigation. Depuis la mise à jour de l’application mobile de Google Maps (la version 6.0 pour être précis disponible uniquement pour les terminaux android), il est possible de se repérer dans des bâtiments comme des aéroports, des gares ou encore des centres commerciaux.
Si vous voulez tester cette nouvelle version de Google maps sans avoir de téléphone android rendez vous ici.
Pour ceux qui se demandent comment Google va faire pour proposer des plans intérieurs des bâtiments, et bien c’est très simple ils vont demander aux utilisateurs et propriétaires de les rentrer eux-même dans google maps! On appelle cela du crowdsourcing… La procédure est présentée sur cette page.
Find the building on the map.
Upload pictures of your floor plans, blueprints, or directories of a floor.
Line up your floor plan with satellite images in Google Maps.
Submit! This will help us improve Google Maps.
Aller zou Google vient de tuer l’application « Gare360 » de la SNCF et tous ceux qui proposent des services aux musées pour faire de la localisation indoors, j’en connais qui doivent rire jaune ce matin…
30-11-2011|Commentaires fermés sur Google maps en mode indoor maintenant
Voilà les choses se précisent au sujet de l’introduction en bourse de facebook, la dernière rumeur en date donne une date d’introduction en bourse entre avril et juin 2012 à une valorisation de 100 milliards de dollars…
Et oui vous avez bien lu, 100 milliards de dollars, cela sera très certainement l’une des plus grosses introduction sur le marché de ces dernières années. Facebook a eu pour stratégie d’attendre le dernier moment pour faire appel au marché pour financer son activité, ce qui au final n’aura pas été un mauvais choix. Le seul problème est qu’actuellement les marchés ne sont pas dans leur meilleur forme, la faute au contexte économique très difficile.
Selon le WSJ, Facebook chercherait à lever autour de 10 milliards de dollars, soit une mise sur le marché de seulement 10% de son capital, un montant relativement faible si l’on regarde les équivalents et les récentes introduction dans le secteur des nouvelles technologies. Habituellement les sociétés regardent l’option d’une introduction une fois le chiffre d’affaires autour de 100 millions de dollars, facebook aura attendu 4 milliards de CA pour aller sur le marché!
29-11-2011|Commentaires fermés sur Facebook devrait s’introduire en bourse entre avril et juin 2012
Volkswagen vient de lancer une opération marketing sur sa page facebook intitulée fanwagen (la voiture des fans). Le principe est de premièrement de voter pour le véhicule qui sera réalisé en un seul exemplaire. Aujourd’hui les fans hollandais de la marque peuvent choisir entre une cox ou bien un T1 (le fameux combi VW).
Là où la marque va plus loin que tous les concours que l’on peut croiser sur facebook c’est que les voitures sont customisées intégralement aux couleurs et codes de facebook comme vous pouvez le voir sur les images ci-dessous. Ainsi un coup de klaxon s’apparente à un « poke », la fermeture des rideaux du T1 vous permet de gérer votre « privacy »….
Volkswagen propose même des modes d’emplois des deux voitures, mode d’emploi facebooké bien entendu, l’univers est donc vraiment celui de facebook, de vrais véhicules pour les fans!
Le manuel de la coccinelle et celui du combi sont consultables juste en dessous.
Après le 18 décembre, la marque va faire gagner le véhicule qui aura été sélectionné par les fans par le biais d’un concours plus traditionnel. Cette opération marketing est intéressante, car la marque adapte son produit au support, fait choisir le lot aux participants et enfin fait gagner le lot. J’ai pour ma part voté pour le combi!
Après l’euforie des introductions des dernières sociétés internet au Nasdaq : Groupon, Linkedin, Demand Media… L’heure est maintenant à la chute pour la majorité de ces dernières. Des explications peuvent être trouvées pour certains cas, voici une revue des positions actuelles des cours de bourse :
Demand Media
Offering price: $17
Tuesday’s closing price: $6.85
Current market value: $574 million
Demand Media chute de 60% par rapport à son cours d’introduction on peut imaginer que la mise à jour de Google avec Panda doit y être pour quelque chose.
Groupon est à -15% depuis son introduction, la faiblesse du business model de la société est certainement une explication du replis des investisseurs sur ce titre. Groupon a du mal à recruter de nouveaux clients (marchands et acheteurs) et ce recrutement impacte fortement la trésorerie de la société.
Pandora est à -34% de son cours d’introduction, la marché de la musique en ligne est vraiment complexe, et l’arrivée de Spotify sur le sol américain n’a pas du améliorer la position de Pandora.
Yandex, le moteur de recherche russe, chute lui aussi à -19,8%
Ce qu’il faut retenir c’est que les valeurs IT introduites cette années perdent en moyenne une vingtaine de pourcents depuis leur introduction. Facebook et Zinga doivent donc prendre du recul sur ce contexte qui n’est pas du tout favorable à une IPO.
25-11-2011|Commentaires fermés sur Lourdes chutes pour les récentes introductions en bourse des starts up internet
Je ne sais pas vous mais google analytics peut avoir des limites dans la génération de certains tableaux de bord. Prenons par exemple un site donc le CA n’est pas identifié dans Google Analytics, ce dernier ne pourra pas avoir une vue simple et unique de son trafic et de son chiffre d’affaires.
Si vous utilisez Google Docs voici une solution testée et approuvée pour récupérer les données de votre profil analytics pour les manipuler dans Google Docs.
Premièrement il faut utiliser le template Google Docs de SEOMOZ qui va vous permettre de vous connecter à votre compte GA (Google Analytics). Pour utiliser ce dernier il faut faire « make a copy ». Ensuite vous avez deux possibilités, soit vous utilisez le template et vous construisez votre tableau de bord dedans soit vous avez déjà un tableau de bord et dans ce cas il va falloir ajouter le script de connection (Google Apps Script) : Tools/Script editor/ puis copié/coller de qui suit :
function getGAauthenticationToken(email, password) {
//Fetches GA authentication token, which can then be used to fetch data with the getGAdata function
//Created by Mikael Thuneberg
try {
if (typeof email == "undefined") {
return "Email address missing";
}
if (typeof password == "undefined") {
return "Password missing";
}
if (email.length == 0) {
return "Email address missing";
}
if (password.length == 0) {
return "Password missing";
}
password = encodeURIComponent(password);
var responseStr
var randnumber = Math.random()*5000;
Utilities.sleep(randnumber);
Utilities.sleep(randnumber);
var response = UrlFetchApp.fetch("https://www.google.com/accounts/ClientLogin", {
method: "post",
payload: "accountType=GOOGLE&Email=" + email + "&Passwd=" + password + "&service=analytics&Source=Mikael Thuneberg-GA Google Docs functions-1.0"
});
responseStr = response.getContentText();
responseStr = responseStr.slice(responseStr.search("Auth=") + 5, responseStr.length);
return responseStr;
} catch (e) {
if (e.message.indexOf("CaptchaRequired") != -1) {
return "Complete CAPTCHA at http://www.google.com/accounts/" + e.message.slice(e.message.indexOf("CaptchaUrl=") + 11, e.message.length);
} else {
return "Authentication failed (" + e.message + ")";
}
}
}
function getGAaccountData(authToken, dataType, includeHeaders, maxRows, startFromRow) {
//Fetches account data for the authenticated user
//Input authentication token produced by the getGAauthenticationToken function
//If dataType parameter is omitted, the functions fetches a list profiles to which the user has access
//By specifying the dataType parameters as "goals", the functions will fetch a list of goals by profile
//By specifying the dataType parameters as "segments", the functions will fetch a list of advanced segments
//Created by Mikael Thuneberg
if (typeof authToken == "undefined") {
return "Authentication token missing";
}
dataType = (typeof dataType == "undefined") ? "profiles" : dataType;
maxRows = (typeof maxRows == "undefined") ? 200 : maxRows;
maxRows = (typeof maxRows == "string") ? 200 : maxRows;
startFromRow = (typeof startFromRow == "undefined") ? 1 : startFromRow;
startFromRow = (typeof startFromRow == "string") ? 1 : startFromRow;
if (authToken.length == 0) {
return "Authentication token missing";
}
if (dataType.length == 0) {
dataType = "profiles";
}
if (authToken.indexOf("Authentication failed") != -1) {
return "Authentication failed";
}
try {
authToken = authToken.replace(/\n/g, "");
dataType = dataType.toLowerCase();
var URL = "https://www.google.com/analytics/feeds/accounts/default?max-results=" + maxRows + "&start-index=" + startFromRow
var responseStr;
var response = UrlFetchApp.fetch(URL, {
method: "get",
headers: {
"Authorization": "GoogleLogin auth=" + authToken,
"GData-Version": "2"
}
});
responseStr = response.getContentText();
var XMLdoc = Xml.parse(responseStr);
var lapset2;
var TempArray = [];
var RowArray = [];
var HeaderArray = [];
if (includeHeaders == true) {
var rivi = 1;
if (dataType == "segments") {
HeaderArray[0] = "Segment ID";
HeaderArray[1] = "Segment Name";
HeaderArray[2] = "Segment Definition";
} else {
HeaderArray[0] = "Account Name";
HeaderArray[1] = "Profile Title";
HeaderArray[2] = "Profile Number";
}
TempArray[0] = HeaderArray;
} else {
var rivi = 0;
}
var sar = 0;
var lapset;
var dataFound = false;
if (dataType == "segments") {
lapset = XMLdoc.getElement().getElements();
for (i = 0; i < lapset.length; i++) {
if (lapset[i].getName().getLocalName() == "segment") {
sar = 0;
RowArray[0] = lapset[i].getAttribute("id").getValue();
RowArray[1] = lapset[i].getAttribute("name").getValue();
lapset2 = lapset[i].getElements();
for (j = 0; j < lapset2.length; j++) {
if (lapset2[j].getName().getLocalName() == "definition") {
RowArray[2] = lapset2[j].getText();
}
}
TempArray[rivi] = RowArray;
RowArray = [];
dataFound = true;
rivi++;
if (rivi == maxRows) {
return TempArray;
}
} else {
if (lapset[i].getName().getLocalName() == "entry") {
break;
}
}
}
} else { // datatype = profiles
lapset = XMLdoc.getElement().getElements("entry");
for (i = 0; i < lapset.length; i++) {
sar = 0;
lapset2 = lapset[i].getElements();
for (j = 0; j < lapset2.length; j++) {
if (lapset2[j].getName().getLocalName() == "title") {
RowArray[1] = " " + lapset2[j].getText();
dataFound = true;
} else {
if (lapset2[j].getName().getLocalName() == "property") {
if (lapset2[j].getAttribute("name").getValue() == "ga:accountName") {
RowArray[0] = lapset2[j].getAttribute("value").getValue();
}
if (lapset2[j].getAttribute("name").getValue() == "ga:profileId") {
RowArray[2] = lapset2[j].getAttribute("value").getValue();
break;
}
}
}
}
TempArray[rivi] = RowArray;
RowArray = [];
dataFound = true;
rivi++;
if (rivi == maxRows) {
return TempArray;
}
}
}
if (dataFound == false) {
//return "No data found";
}
return TempArray;
} catch (e) {
return "0";
}
}
function getGAdata(authToken, profileNumber, metrics, startDate, endDate, filters, dimensions, segment, sort, includeHeaders, maxRows, startFromRow) {
//Fetches data from the GA profile specified, using the authentication token generated by the getGAauthenticationToken function
//For instructions on the parameters, see http://bit.ly/bUYMDs
//Created by Mikael Thuneberg
try {
startDate.getYear();
} catch (e) {
return "Invalid start date";
}
try {
endDate.getYear();
} catch (e) {
return "Invalid end date";
}
try {
if (typeof authToken == "undefined") {
return "Authentication token missing";
}
if (typeof profileNumber == "undefined") {
return "Profile number missing";
}
if (typeof metrics == "undefined") {
return "Specify at least one metric";
}
if (profileNumber != parseInt(profileNumber)) {
return "Invalid profile number";
}
filters = (typeof filters == "undefined") ? "" : filters;
dimensions = (typeof dimensions == "undefined") ? "" : dimensions;
segment = (typeof segment == "undefined") ? "" : segment;
maxRows = (typeof maxRows == "undefined") ? 100 : maxRows;
maxRows = (typeof maxRows == "string") ? 100 : maxRows;
startFromRow = (typeof startFromRow == "undefined") ? 1 : startFromRow;
startFromRow = (typeof startFromRow == "string") ? 1 : startFromRow;
if (authToken.length == 0) {
return "Authentication token missing";
}
if (profileNumber.length == 0) {
return "Profile number missing";
}
if (metrics.length == 0) {
return "Specify at least one metric";
}
if (authToken.indexOf("Authentication failed") != -1) {
return "Authentication failed";
}
authToken = authToken.replace(/\n/g, "");
var startDateString
var endDateString
var dMonth
var dDay
if (startDate.getMonth() + 1 < 10) {
dMonth = "0" + (startDate.getMonth() + 1);
} else {
dMonth = startDate.getMonth() + 1;
}
if (startDate.getDate() < 10) {
dDay = "0" + startDate.getDate();
} else {
dDay = startDate.getDate();
}
startDateString = startDate.getYear() + "-" + dMonth + "-" + dDay
if (endDate.getMonth() + 1 < 10) {
dMonth = "0" + (endDate.getMonth() + 1);
} else {
dMonth = endDate.getMonth() + 1;
}
if (endDate.getDate() < 10) {
dDay = "0" + endDate.getDate();
} else {
dDay = endDate.getDate();
}
endDateString = endDate.getYear() + "-" + dMonth + "-" + dDay
if (startDateString > endDateString) {
return "Start date should be before end date";
}
var URL = "https://www.google.com/analytics/feeds/data?ids=ga:" + profileNumber + "&start-date=" + startDateString + "&end-date=" + endDateString + "&max-results=" + maxRows + "&start-index=" + startFromRow;
if (metrics.slice(0, 3) != "ga:") {
metrics = "ga:" + metrics;
}
metrics = metrics.replace(/&/g, "&ga:");
metrics = metrics.replace(/ga:ga:/g, "ga:");
metrics = metrics.replace(/&/g, "%2C");
URL = URL + "&metrics=" + metrics
if (dimensions.length > 0) {
if (dimensions.slice(0, 3) != "ga:") {
dimensions = "ga:" + dimensions;
}
dimensions = dimensions.replace(/&/g, "&ga:");
dimensions = dimensions.replace(/ga:ga:/g, "ga:");
dimensions = dimensions.replace(/&/g, "%2C");
URL = URL + "&dimensions=" + dimensions;
}
if (filters.length > 0) {
if (filters.slice(0, 3) != "ga:") {
filters = "ga:" + filters;
}
filters = filters.replace(/,/g, ",ga:");
filters = filters.replace(/;/g, ";ga:");
filters = filters.replace(/ga:ga:/g, "ga:");
filters = encodeURIComponent(filters);
URL = URL + "&filters=" + filters;
}
if (typeof(segment) == "number") {
segment = "gaid::" + segment;
}
if (segment.length > 0) {
if (segment.indexOf("gaid::") == -1 && segment.indexOf("dynamic::") == -1) {
if (segment.slice(0, 3) != "ga:") {
segment = "ga:" + segment;
}
segment = "dynamic::" + segment;
}
segment = encodeURIComponent(segment);
URL = URL + "&segment=" + segment;
}
if (sort == true) {
URL = URL + "&sort=-" + metrics;
}
}
catch (e) {
return "0";
}
try {
var response = UrlFetchApp.fetch(URL, {
method: "get",
headers: {
"Authorization": "GoogleLogin auth=" + authToken,
"GData-Version": "2"
}
});
} catch (e) {
if (e.message.indexOf("Timeout") != -1) {
response = UrlFetchApp.fetch(URL, {
method: "get",
headers: {
"Authorization": "GoogleLogin auth=" + authToken,
"GData-Version": "2"
}
});
} else {
return "0";
}
}
try {
var responseStr = response.getContentText();
var XMLdoc = Xml.parse(responseStr);
var lapset = XMLdoc.getElement().getElements("entry");
var lapset2;
var TempArray = [];
var RowArray = [];
var HeaderArray = [];
if (includeHeaders == true) {
var rivi = 1;
} else {
var rivi = 0;
}
var sar = 0;
var dataFound = false;
for (i = 0; i < lapset.length; i++) {
sar = 0;
lapset2 = lapset[i].getElements();
for (j = 0; j < lapset2.length; j++) {
if (lapset2[j].getName().getLocalName() == "dimension") {
RowArray[sar] = lapset2[j].getAttribute("value").getValue();
if (rivi == 1) {
HeaderArray[sar] = lapset2[j].getAttribute("name").getValue();
}
sar++;
}
if (lapset2[j].getName().getLocalName() == "metric") {
RowArray[sar] = Number(lapset2[j].getAttribute("value").getValue());
if (rivi == 1) {
HeaderArray[sar] = lapset2[j].getAttribute("name").getValue();
}
sar++;
}
}
TempArray[rivi] = RowArray;
RowArray = [];
dataFound = true;
rivi++;
}
if (dataFound == false) {
//return "No data found";
}
if (includeHeaders == true) {
TempArray[0] = HeaderArray;
}
return TempArray;
} catch (e) {
return "0";
}
}
J’ai volontairement modifié les messages d’erreurs pour afficher des « 0 » afin de pouvoir tout de même faire des graphiques (même avec des erreurs de connection).
Pour vous connecter vous avez besoin de votre email de compte GA, de votre mot de passe (vous pouvez en faire un spécifique pour cet outil c’est un peu plus secure il me semble) et du profil GA pour lequel vous souhaitez avoir les données. Cet id de profil se trouve dans l’url de votre compte GA soit après « id » pour l’ancienne version de GA ou après le « p » pour la nouvelle interface.
Voilà donc pour la partie connection à GA et script à intégrer. Ensuite il faut copier/coller la page du template de SEOMOZ ou alors se faire sa propre page de récupération de données ce qui est finalement assez simple en utilisant les formules du template. De mon côté ce qui m’intéressait c’était d’avoir des données quotidiennes et non mensuelles, j’ai donc modifié la formule en conséquence.
Attention lors de la récupération des données si vous demandez beaucoup d’information GA va vous retourner des erreurs de connection (des « 0 » avec mon script modifié), il faut donc y aller doucement, je dirai que 30 données à chaque fois c’est un max. Il suffit de faire copié/collé sur 30 cellules.
Et voilà le travail (données issues d’un autre site que 2803.fr), on retrouve des données en provenance de GA et d’autres données comme le total sur ce graphique :