La procrastination du lundi matin : Wreck-it Ralph est un jeu vidéo avant tout

Bonjour, bonjour ! L’été vient de commencer et vous êtes encore coincé dans votre bureau à boucler les dossiers de la semaine passée ? Accordez vous un peu de temps, quitte à remettre votre travail pour plus tard … si si !

Wreck-it Ralph (le monde de Ralph en français) est le prochain long métrage de Disney basé sur l’univers des jeux vidéos. Ralph, un méchant bloqué dans une borne d’arcade, en a marre de faire la grosse brute et décide de partir à l’aventure pour se trouver un nouveau rôle. Mais de nombreuses surprises l’attende …

Outre les promo habituelles pour le film (page facebook, teaser, macking of …), Disney choisit de profiter à fond du monde numérique qui entoure son personnage et propose sur le site officiel de jouer directement au jeu dans lequel est coincé notre héros !

Certains y retrouveront un petit air des débuts de Mario et Donkey Kong (ça) mais le jeu devient surtout assez addictif si on essaye de grappiller les points. Il sera bien sûr possible de comparer vos scores avec vos amis et tout le toin toin…

Bonne procrastination !

vader

La procrastination du lundi matin : Des gros boutons et des films célèbres

Pour cette deuxième édition du #LundiProcrastination, je vous propose deux animations ultra simples mais qui en feront sourrir plus d’un.

Vous trouvez que vos conversations manquent de grand cinéma, d’une mise en scène digne de Christopher Nolan ou George Lucas ? Et bien, je vous propose de mettre ces deux sites dans vos favoris (les url sont pas franchement faciles à retenir) pour caler ces sons cultes en plein milieu de vos conversations🙂

Ça se passe par ici :

buzzer-224x300

La procrastination du lundi matin : Testez votre vitesse de réaction

Nous sommes le lundi matin, et le lundi c’est #procrastinationDay ! Aujourd’hui un petit jeu à diffuser sur vos réseaux préférés pour montrer que vous êtes le plus rapide même après la cuite de la veille

Oui je suis un peu lent.

Ce petit test est facilement accessible sur ce site.

N’hésitez pas à poster vos moyennes dans les commentaires🙂

Excel2010

Copier/Coller sur Excel : automatiser le collage par valeur

Ce « tuto » n’est pas entièrement détaillé pour des contraintes techniques liées à l’usage des dernières versions d’Excel, il faut donc déjà savoir un peu utiliser sa propre version du logiciel. Si vous avez des questions je vous laisse poster un commentaire ou alors me contacter sur mon G+ ;) 

Je ne sais pas si vous vous êtes déjà trouvé dans cette situation ; vous voulez copier le résultat d’une formule mais Excel n’est pas de votre avis et vous copie la formule à la place.
Pour remédier à ce problème, il est nécessaire d’aller plus loin que le traditionnel Ctrl+C / Ctrl+V : clique droit sur une cellule >> Collage Spécial >> Valeurs (notez que le collage par valeur est directement disponible dans le clique droit dans les dernières versions d’Excel.

Vous me direz bien sûr que la manipulation n’est pas très dépensière en temps et clique de souris, mais si vous devez faire 4000 fois cette opération comme dans mon précédent stage, je vous donne pas 2 jours avant de lancer votre ordi par la fenêtre.

Heureusement, il est possible d’assigner un raccourci clavier en rusant un peu.  zarkod du forum commentcamarche.net nous partage une macro à ajouter dans votre classeur Excel que je recopie ici :

Sub collage_valeur()

‘ collage_valeur Macro
‘ Macro enregistrée le 31/03/2011 par Zarkod

‘ Touche de raccourci du clavier: Ctrl+w

If TypeName(Selection) = « Range » Then
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End If
End Sub

Une fois la macro copiée (et la sécurité macro enlevée), il ne vous reste plus qu’à aller dans la liste des macro installées dans votre classeur, chercher le bouton Options… et lui donner le raccourci clavier de votre choix !

Les grands avantages de My Movies sont sa présentation et surtout la taille de sa base de données.

Complétez votre filmothèque avec My Movies

Si en dehors de vos autres loisirs numériques, il vous arrive de collectionner films & séries sur vos différents dispositifs de stockage,  vous vous êtes déjà sans doute aperçu que dès que votre filmothèque devient un peu conséquente, on se noie dans la multitudes de fichiers plus ou moins classés. Voici une solution pour profiter de tous vos films sur un support agréable, complet et surtout très riche en informations.

Les grands avantages de My Movies sont sa présentation et surtout la taille de sa base de données.

MyMovies est un addon à Windows Media Center (et d’autres plateformes que nous ne verrons pas ici,  plus d’info ) qui répertorie tous les films présents dans votre médiathèque et fournie toutes les informations que le net peut vous proposer à leur sujet :

  • Jaquettes DVD / BlueRay
  • Résumés
  • Acteurs et équipe technique
  • Genres

Ainsi vous retrouverez goût à naviguer dans votre filmothèque, en cherchant tous les films d’un même acteur par exemple ou en regardant facilement l’intégrale d’une série🙂

Ce logiciel est un outil collaboratif gratuit qui vous permet d’avoir des informations toujours à jour et presque toujours fiables. Vous pouvez donc ajouter vos propres résumés, photos ou biographie d’acteurs et ainsi enrichir la base de donnée.

Je pourrais bien sûr faire un tuto (et j’en ferais surement un) pour expliquer plus en détail le fonctionnement de ce magnifique outil mais pour l’instant je vous laisse manipuler par vous même tout en vous donnant quelques astuces pour que MyMovies ne finisse pas trop rapidement dans votre corbeille🙂 :

  1. Pour que l’indexation du logiciel marche (Menu>>Titre>>Nouveau Titre>>Import par dossier) vous devez avoir chaque fichier dans un dossier distinct, sans quoi MyMovies ne détectera rien du tout
  2. Vous pouvez mettre à jour votre base de donnée une fois par jour à moins que vous ne soyez un gros collaborateur🙂
  3. L’importation des séries est assez ouverte et vous demande de placer chaque série dans un dossier avec une syntaxe bien précise pour les noms des fichiers épisode. Tous les syntaxes sont disponibles ici.

Lien de téléchargement : http://www.mymovies.dk/download.aspx

Si vous êtes bloqués ou si vous avez besoin de conseils, n’hésitez pas à poster un commentaire ou de me joindre sur mon profil G+😉

Google Music vous poursuit sur votre mobile

Google Music sur Android

J’écris cet article comme une suite au précédent sur Google Music.

La grande force de ce nouveau module de Google est sa portabilité à travers le Cloud sur tous vos périphériques ayant une connexion internet. Ainsi vous pourrez retrouver toutes vos playlist en streaming ou en accès offline sur votre androphone grâce à l’application dédiée.

Cependant, si vous avez fait un petit tour sur le market, vous vous apercevrez assez vite que l’appli n’est pas disponible de notre côté de l’Atlantique (et oui encore !). Heureusement le site androidappsdownload nous donne la possibilité d’accéder à ce service en téléchargeant et installant manuellement l’application Google Music.

Voici la dernière version existante à ce jour (4.09) .

Notez que cet appli peut ne pas marcher sur votre mobile et nécessite au moins la version 2.2 d’Androïd. Si vous ne savez pas installer un fichier apk, sachez que vous aurez besoin d’ Astro File Manager ; avec cette appli vous n’aurez plus qu’à retrouver votre fichier apk stocké sur votre carte sd, le sélectionner et lancer l’installation.

Pour toutes questions, les commentaires sont là pour ça ou alors retrouvez moi sur mon compte Google+😉

Music plus en Français

Renforcez Google Music avec Music Plus (et en français !)

Si vous faites parti des heureuses personnes qui ont pu accéder à Google Music malgré la limitation au continent américain et que vous naviguez sous Chrome, cette extension est pour vous ! Sinon je vous invite à suivre ce petit tuto qui donne la démarche pour contourner la limitation sous Firefox (après avoir fait toutes les étapes, vous pourrez vous connecter sur n’importe quel navigateur à partir de votre compte Google).

Music plus en Français

Music Plus est donc une extension pour Chrome qui ajoutera de nombreuses fonctionnalités à votre page Google Music comme :

  • Les biographies des artistes
  • Les paroles des chansons jouées
  • Un bouton de téléchargement
  • etc

[Edit mars 2012] La manipulation dans la suite de l’article ne marche plus depuis la récente mise à jour de l’extension, je reprendrais le code dans les prochains jours pour faire quelque chose de plus solide [/Edit]

Cependant comme Google Music n’est disponible que chez nos amis américains tous les textes sont en anglais et l’extension peine un peu à rechercher des artistes qui sortent de ses frontières.

Mais après quelques manip’ dans le code source de l’application,  je peux vous donner un moyen de passer l’extension à la sauce Frenchies. Pas de panique, il ne s’agira que de copier/coller, rien de bien méchant🙂

  1. Ouvrez le répertoire : C:\Users\VotreNom\AppData\Local\Google\Chrome\User Data\Default\Extensions\ipfnecmlncaiipncipkgijboddcdmego.2.1_0\scripts
  2. Là vous pourrez trouver un fichier du jolie nom myscript.js . Ouvrez le avec Clique Droit => Modifier
  3. Enfin remplacez le code présent dans le fichier par celui-ci

var last_fm_logo = chrome.extension.getURL(‘images/lastfm.gif’);
var amazon_logo = chrome.extension.getURL(‘images/amazon.jpeg’);
var notificaiton_html = ‘popup.html’;

var consoleLog = function(msg){
// uncomment for « dev mode »
//console.log(msg);
};

if (localStorage[‘download’] == ‘true’ && window.location.host == ‘play.google.com’) {
consoleLog(‘insert download button’);
insert_download_button();
}

function restore_settings() {
chrome.extension.sendRequest({‘action’ : ‘return_settings’}, function(response) {
$.each(response, function(key, value) {
localStorage[key] = value;
})
});
}

function check_url() {
consoleLog(‘check url’);
restore_settings();
if (window.location.host == ‘play.google.com’) {
consoleLog(‘setting tab id’);
chrome.extension.sendRequest({‘action’ : ‘set_tab_id’}, function(response) {
localStorage[« tabID »] = response;
consoleLog(‘tab id is ‘ + response);
});
if (window.location.hash !=  » && localStorage[‘bios’] == ‘true’) {
var type = parse_hash();
if (type == ‘ar’ || type == ‘al’) {
prepare_fetch(type);
}
else {
return;
}
}
}
else if (localStorage[‘support’] == ‘true’) {
$(document).ready(function() {
// global_shortcuts();
ama_links();
});
}
}

// last.fm api key: a7c555c150c11623a0fced6e11c1f4fe
function prepare_fetch(type) {
consoleLog(‘prepare fetch’);
var api_key = ‘a7c555c150c11623a0fced6e11c1f4fe’
var last_url =  »;
var last_url2 =  »;
if (type == ‘ar’) {
var artist = $(‘.tab-text a’)[0].innerText;
last_url = ‘http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=’ + encodeURIComponent(artist) + ‘&api_key=’ + api_key;
}
else if (type == ‘al’) {
consoleLog(‘searching album info as well’);
var artist_and_album = ($(‘.tab-text a’)[0].innerText);
var artist = artist_and_album.split(‘ – ‘)[0];
var album = artist_and_album.split(‘ – ‘)[1];
last_url = ‘http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=’ + encodeURIComponent(artist) + ‘&api_key=’ + api_key;
last_url2 = ‘http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=’ + api_key + ‘&artist=’ + encodeURIComponent(artist) + ‘&album=’ + encodeURIComponent(album);
}
if (last_url !=  ») {
// alert(last_url);
chrome.extension.sendRequest({‘action’ : ‘fetch_url’, ‘url’ : last_url}, on_artist_text);
}
if (last_url2 !=  ») {
consoleLog(‘searching album info’);
chrome.extension.sendRequest({‘action’ : ‘fetch_url’, ‘url’ : last_url2}, on_album_text);
}
}

function on_artist_text(data) {
// alert(data);
consoleLog(« artist text »);
var xml_doc = $.parseXML(data);
var $xml = $( xml_doc );
var container;
if (parse_hash() == ‘al’) {
container = $(« .albumViewContainer »)
}
else if (parse_hash() == ‘ar’) {
container = $(« .artistViewContainer »);
}
if ($(‘#last_fm_info’).length == 0) {
var last_div = ‘<div id= »last_fm_info »></div><div id= »hidden_last_fm_info » style= »display:none; »></div>’;
if (parse_hash() == ‘ar’) {
container.prepend(last_div);
}
else {
if ($(‘#last_fm_album_info’).length == 1) {
$(‘#last_fm_album_info’).before(last_div);
}
else {
container.append(last_div);
}
}
}
var img = $xml.find(‘image[size|= »extralarge »]:first’).text();
// var artist_name = $(‘.albumViewArtistTitle’).first().text();
var artist_name = ‘<div class= »albumViewAlbumTitle songListLink »>’ + $(‘.albumViewArtistTitle’).first().text() + ‘</div>’;
var artist_bio = $xml.find(« content »).text();
if (artist_bio.length != 0) {
artist_bio = strip_links(artist_bio, ‘#hidden_last_fm_info’);
artist_bio = truncate_bio(artist_bio, 99);
}
var similar_artists = $.map($xml.find(‘similar’).find(‘artist’).find(‘name’), function(a) {
return a;
});;

var list = [];
similar_artists = ($.each(similar_artists, function(key, element) {
list.push(‘<a class= »songListLink » href= »#’ + encodeURI(element.textContent) + ‘_ar » onclick= »SJBpost(\’artistSelected\’, this, \ » + element.textContent + ‘\’); »>’ + element.textContent + ‘</a>’);
}));
// alert(list.join(‘, ‘));

img = ‘<div class= »artistViewAlbumInfoContainer » style= »float:left; »><img src= »‘ + img + ‘ » width= »128″ class= »albumImage » style= »margin-right: 4px; margin-bottom: 5px; float:left; »/>’ + artist_name + ‘</div>’;
$(‘#last_fm_info’).html(img + ‘<div class= »bio_text »>’ + nl2br(artist_bio) + ‘<br /><br />’ +
‘<div id= »similar_last_fm_artists »><b>Similar artists:</b> ‘ + list.join(‘, ‘) + ‘<div class= »ext_src »>Artist bio from<br /> <a href= »http://last.fm &raquo; target= »_blank »><img src= »‘ + last_fm_logo + ‘ » /></a></div></div>’ +
‘<br clear= »all » />’);
$(« #last_fm_info > div > span.more_bio »).click(function() {
show_all_bio(‘artist’);
});
if ($(‘.artistViewTable > tbody’).children().length == 0) {
$(‘.artistViewTable’).html(‘You don\’t currently have any music by this artist.<div class= »at_amazon »>’ + $(‘.tab-text > a’).text() + ‘ MP3s available at <img src= »‘ + amazon_logo + ‘ » height= »22px » style= »margin-bottom:-9px; margin-left:-1px; » /></div><div id= »amazon_links »></div>’);
consoleLog(« Search Amazon »);
search_amazon($(‘.tab-text > a’).text());
}
}

function search_amazon(artist) {
var url = ‘http://free.apisigning.com/onca/xml?Service=AWSECommerceService&Version=2010-11-01&Operation=ItemSearch&SearchIndex=MP3Downloads&Keywords=&rsquo; + encodeURIComponent(artist) + ‘&ResponseGroup=ItemAttributes,Images,Tracks&AWSAccessKeyId=0YNM9NQ21B7TCP1XDH82′;
// http://free.apisigning.com/onca/xml?Service=AWSECommerceService&Version=2010-11-01&Operation=ItemSearch&SearchIndex=MP3Downloads&Keywords=&rsquo; + encodeURIComponent(artist) + ‘&AWSAccessKeyId=0YNM9NQ21B7TCP1XDH82’;
consoleLog(url);
chrome.extension.sendRequest({‘action’ : ‘fetch_url’, ‘url’ : url}, on_amazon);
}

function on_amazon(data) {
// alert(data);
consoleLog(« amazon response is here »);
// consoleLog(data);
var amazon_links =  »;
$(data).find(‘item’).each(function(){
var id = $(this).find(‘ASIN’).text();
var title = $(this).find(‘ItemAttributes > Title’).text();
if (title.length > 45) {
title = title.substr(0, 45) + « … »;
}
var artist = $(this).find(‘ItemAttributes > Creator’).text();
var url = $(this).find(‘DetailPageURL’).text();
var img = $(this).find(‘MediumImage > URL’).text();
var type = $(this).find(‘ItemAttributes > ProductTypeName’).text();
type = type.split(‘_’)[2];
amazon_links = amazon_links + ‘<div class= »amazon_alb album-container »><a href= »‘ + url + ‘?tag=adapas02-20″ target= »_blank » class= »fade-out-parent »><img src= »‘ + img + ‘ » height= »124″ width= »124″ class= »albumImage » style= »margin-bottom:-14px; » onmouseover= »SJBpost(\’albumArtEnter\’, this); onmouseout= »SJBpost(\’albumArtLeave\’, this); » » /><br /><span class= »amazon_text browseAlbumTitle fade-out-content »>’ + title + ‘<br /></span><div class= »fade-out-effect »></div><span class= »browseSubtext » style= »float:left; »>[‘ + type + ‘]</span></div>’;
// consoleLog(id);
// var title = $(this).find(‘title’).text();
// var url = $(this).find(‘url’).text();
// $(‘<div class= »items » id= »link_’+id+' »></div>’).html(‘<a href= »‘+url+' »>’+title+'</a>’).appendTo(‘#page-wrap’);
// $(this).find(‘desc’).each(function(){
// var brief = $(this).find(‘brief’).text();
// var long = $(this).find(‘long’).text();
// $(‘<div class= »brief »></div>’).html(brief).appendTo(‘#link_’+id);
// $(‘<div class= »long »></div>’).html(long).appendTo(‘#link_’+id);
// });
});
$(‘#amazon_links’).html(amazon_links);

// var xml_doc = $.parseXML(data);
// var $xml = $( xml_doc );
// var item = $xml.find(‘item:first’).text();
// consoleLog(item);
// var items = $xml.find(« item »);
// alert($xml.find(« item »).text());
// $.each(items, function(index, item) {
// alert(item.find(« title »).text());
// });
}

function on_album_text(data) {
consoleLog(‘album back’);
// consoleLog(data);
var xml_doc = $.parseXML(data);
var $xml = $( xml_doc );
var container;
container = $(« .albumViewContainer »);
if ($(‘#last_fm_album_info’).length == 0) {
container.append(‘<div id= »last_fm_album_info »></div><div id= »hidden_last_fm_album_info » style= »display:none; »></div>’);
}
var album_info = $xml.find(« content »).text();
if (album_info.length != 0) {
album_info = strip_links(album_info, ‘#hidden_last_fm_album_info’);
$(‘#last_fm_album_info’).html(‘<b style= »float:left; »>About this album:<br /></b><div style= »margin-left:185px; »>’ + nl2br(truncate_bio(album_info, 80)) + ‘<br /><div class= »ext_src »>Album info from<br /> <a href= »http://last.fm &raquo; target= »_blank »><img src= »‘ + last_fm_logo + ‘ » /></a></div>’);

$(« #last_fm_album_info > div > span.more_bio »).click(function() {
show_all_bio(‘album’);
});
}
}

function strip_links(text, div) {
$(div).html(text);
$(div + ‘ a’).each(function() {
$(this).before($(this).text()).remove();
});
text = $(div).html();
$(div).html( » « );
var user_cont_text = « User-contributed text is available under the Creative Commons By-SA License and may also be available under the GNU FDL. »;
if (text.indexOf(user_cont_text) != -1) {
text = text.split(user_cont_text)[0] + ‘<span class= »small_cc »>’ + user_cont_text + text.split(user_cont_text)[1] + ‘</span>’;
}
return text;
}

function truncate_bio(text, words) {
var first_snippet = text.split( » « ).slice(0, words).join(‘ ‘) + ‘<span class= »more_bio »>… <span style= »cursor:pointer; font-weight:bold; »>More &raquo;</span></span>’;
var remaining = ‘<span class= »remaining_bio » style= »display:none; »>’ + text.split( » « ).slice(words).join(‘ ‘) + ‘</span>’;
return first_snippet + remaining;
}

function show_all_bio(type) {
if (type == ‘artist’) {
$(« #last_fm_info > div > span.remaining_bio »).slideToggle();
$(« #last_fm_info > div > span.more_bio »).html( » « );
}
else if (type == ‘album’) {
$(« #last_fm_album_info > div > span.remaining_bio »).slideToggle();
$(« #last_fm_album_info > div > span.more_bio »).html( » « );
}
}

function parse_hash() {
return window.location.hash.split(‘_’)[window.location.hash.split(‘_’).length – 1];
}

function nl2br (str, is_xhtml) {
var breakTag = (is_xhtml || typeof is_xhtml === ‘undefined’) ? ‘<br />’ : ‘<br>’;
return (str +  »).replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, ‘$1’+ breakTag +’$2’);
}
function scrobble() {
var ts = Math.round((new Date()).getTime() / 1000);
}

function set_popup(data, callback) {
Track.now_playing();
consoleLog(Track.status);
callback({‘song_title’: Track.song_title, ‘artist’ : Track.artist, ‘album_art’ : Track.album_art, ‘current_time’ : Track.current_time, ‘total_time’ : Track.total_time, ‘status’ : Track.status});
}
var last_nav_request;
var last_callback;
function nav_to(request, callback) {
if (typeof(request) == ‘undefined’) {
request = last_nav_request;
callback = last_callback;
}
var type = request.type;
var id = decodeURI(unescape(request.id));
consoleLog(type);
consoleLog(id);
// consoleLog(script_text);
// append_script(script_text);
// consoleLog(script);
var element = null;
if (request.go_back) {
consoleLog(‘this is a history request’);
element = document.getElementsByClassName(‘breadcrumb-part’)[0];
}
else {
if (id != -1) {
consoleLog(‘get element by id’);
element = document.getElementById(id);
}
else {
consoleLog(‘get element by type’);
element = document.getElementById(type);
}
if (type == ‘albumSelected’) {
if (id.split(‘*_*’).length < 2) {
element = element.childNodes[0];
}
else {
element = element.childNodes[1];
}
}
}
consoleLog(element);
consoleLog(« navigate to  » + type);
dispatchMouseEvent(element, ‘click’, true, true);
if (type == ‘albums’) {
var albums = ‘{« albums »: [‘;
if ($(‘#browse-view-albums > .album-container’).length == 0) {
consoleLog(‘no albums available’);
last_nav_request = request;
last_callback = callback;
setTimeout(function(request, callback) {
nav_to(last_nav_request, last_callback);
}, 1000);
return false;
}
$(‘#browse-view-albums > .album-container’).each(function(index, element) {
var title = $(element).find(‘.album-name’).text();
var artist = $(element).find(‘.artist-name’).text();
var art = $(element).find(‘.album-art’).attr(‘src’);
var id = $(element).attr(‘id’);
if (title ==  ») {
return;
}
albums += ‘{« album »:{« title » : « ‘ + encodeURI(title) + ‘ », « artist » : « ‘ + encodeURI(artist) + ‘ », « art » : « ‘ + encodeURI(art) + ‘ », « id » : « ‘ + encodeURI(id) + ‘ »}},’;
});
albums = albums.slice(0, albums.length – 1);
albums += ‘]}’;
callback(albums);
}
else if (type == ‘albumSelected’) {
consoleLog(‘you just clicked a specific album’);
var album = $(‘.albumViewAlbumTitle’).text();
var artist = $(‘.albumViewArtistTitle’).text();
var art = $(‘img.albumViewImage.albumImage’).attr(‘src’);
// consoleLog(art);
var album = ‘{« album »: {‘ +
‘ »title » : « ‘ + encodeURI(album) + ‘ »,’ +
‘ »artist » : « ‘ + encodeURI(artist) + ‘ »,’ +
‘ »art » : « ‘ + encodeURI(art) + ‘ »,’ +
‘ »tracks »: [‘;
$(‘#songs .albumViewContainer .songRow’).each(function(index, element) {
var title = $(element).find(‘div.fade-out-content’).text();
var time = $(element).find(‘.albumViewDurationColumn’).text();
var song_id = $(element).attr(‘id’);
album += ‘{« track »:{« title » : « ‘ + encodeURI(title) + ‘ », « time » : « ‘ + time + ‘ », « song_id » : « ‘ + song_id + ‘ »}},’;
});
album = album.slice(0, album.length – 1);
album += ‘]}}’;
callback(album);
}
else if (type == ‘artists’) {
consoleLog(‘artists selected’);
var artists = ‘{« artists »: [‘;
if ($(‘#browse-view-artists > .browseArtistContainer’).length == 0) {
consoleLog(‘no artists available’);
last_nav_request = request;
last_callback = callback;
setTimeout(function(request, callback) {
nav_to(last_nav_request, last_callback);
}, 1000);
return false;
}
$(‘#browse-view-artists > .browseArtistContainer’).each(function(index,element) {
var artist = $(element).find(« .browseArtistTitle > .fade-out-content »).text();
var art = $(element).find(‘.browseArtistArtContainer > img.albumImage’).attr(‘src’);
var id = $(element).attr(‘id’);
artists += ‘{« artist »:{« title » : « ‘ + encodeURIComponent(artist) + ‘ », « art » : « ‘ + encodeURI(art) + ‘ », « id » : « ‘ + encodeURI(id) + ‘ »}},’;
});
artists = artists.slice(0, artists.length – 1);
artists += ‘]}’;
callback(artists);
}
else if (type == « artistSelected ») {
consoleLog(‘artist selected’);
var albums = ‘{« albums »: [‘;
$(‘.artistViewAlbumInfoContainer’).each(function(index, element) {
var title = $(element).find(‘.albumViewAlbumTitle’).text();
var artist = $(element).find(‘.albumViewArtistTitle’).text();
var art = $(element).find(‘.albumViewImage’).attr(‘src’);
var id = index + ‘*_*’ + title; //$(element).find(‘.albumViewAlbumTitle’); // need to figure this out; these don’t have ids
$(element).attr(‘id’, id);
if (title ==  ») {
return;
}
albums += ‘{« album »:{« title » : « ‘ + encodeURI(title) + ‘ », « artist » : « ‘ + encodeURI(artist) + ‘ », « art » : « ‘ + encodeURI(art) + ‘ », « id » : « ‘ + encodeURI(id) + ‘ »}},’;
});
albums = albums.slice(0, albums.length – 1);
albums += ‘]}’;
callback(albums);

}
last_nav_request = request;
last_callback = callback;
}

// function select_and_play(request, callback) {
// consoleLog(request.song_id);
// consoleLog(request.script);
// $(‘#’ + request.song_id).addClass(‘selectedSong’);
// callback();
// }

function playback_action(type, callback) {
consoleLog(type);
if (type == ‘playPause’) {
element = document.getElementById(‘playPause’);
}
else if (type == ‘nextSong’) {
element = document.getElementById(‘ff’);
}
else if (type == ‘prevSong’) {
element = document.getElementById(‘rew’);
}
else if (type == ‘currently_playing’) {
element = document.getElementById(‘playerSongInfo’).childNodes[0];
}
dispatchMouseEvent(element, ‘mouseover’, true, true);
dispatchMouseEvent(element, ‘mousedown’, true, true);
dispatchMouseEvent(element, ‘mouseup’, true, true);
callback();
}

function onRequest(request, sender, callback) {
if (request.action == ‘set_popup’) {
// consoleLog(« set popup »);
set_popup(request, callback)

// fetch_url(request.url, callback);
}
else if (request.action == ‘playback_action’) {
consoleLog(‘playback action’);
playback_action(request.type, callback);
}
else if (request.action == ‘nav_to’) {
nav_to(request, callback);
}
else if (request.action == ‘select_and_play’) {
consoleLog(‘handle select and play request’);
var element = document.getElementById(request.song_id);
dispatchMouseEvent(element, ‘click’, true, true);
dispatchMouseEvent(element, ‘dblclick’, true, true);
callback();
}
else if (request.action == ‘scrub’) {
var element = document.getElementById(‘slider’);
var offset_top = element.offsetTop;
var offset_left = element.offsetLeft;
}
else if (request.action == ‘restore_settings’) {
consoleLog(‘changing settings’);
restore_settings();
callback(‘calling back’);
}
};
// Wire up the listener.
chrome.extension.onRequest.addListener(onRequest);
// add amazon affiliate links to URLs
function ama_links() {
consoleLog(‘ama links’);
var allLinks = document.getElementsByTagName(« a »);
var asin =  »;
for (i = 0; i < allLinks.length; i++) {
var href = allLinks[i].href;
if (href.match(/amazon\./i) && !href.match(/tag/i) && !href.match(/nosim/i)) {
asin = getASIN(href);
if (asin != null) {
domain = getDomain(href);
if ( domain.match(/amazon\./i) ) {
allLinks[i].setAttribute(« href », « http:// &raquo; + domain + « /o/ASIN/ » + asin + « ?tag= »+associateID);
}
}
}
}
}

var associateID = ‘adapas02-20′;

function getASIN(href) {
var asinMatch;
asinMatch = href.match(/\/exec\/obidos\/ASIN\/(\w{10})/i);
if (!asinMatch) { asinMatch = href.match(/\/gp\/product\/(\w{10})/i); }
if (!asinMatch) { asinMatch = href.match(/\/exec\/obidos\/tg\/detail\/\-\/(\w{10})/i); }
if (!asinMatch) { asinMatch = href.match(/\/dp\/(\w{10})/i); }
if (!asinMatch) { return null; }
return asinMatch[1];
}

function getDomain(href) {
var d =  »;
if (href.substring(0,11)==’http://www.&rsquo;) {
d = href.replace(‘http://www.&rsquo;,  »);
} else {
if ((href.substring(0,7)==’http://&rsquo;))
d = href.replace(‘http://&rsquo;,  »);
}
d = d.substring(0, d.indexOf(‘/’));

return d;
}

var dispatchMouseEvent = function(target, var_args) {
var e = document.createEvent(« MouseEvents »);
// If you need clientX, clientY, etc., you can call
// initMouseEvent instead of initEvent
e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1));
target.dispatchEvent(e);
};

// (function() {
// var script = document.createElement(« script »);
// script.src = « http://code.jquery.com/jquery-1.6.1.min.js &raquo;;
// document.body.appendChild( script );
// })()

(function() {
$(« #playerSongInfo »).contentChange(function() {
consoleLog(‘track changed’);
if (localStorage[‘notifications’] == ‘true’) {
consoleLog(‘show a notification’);
chrome.extension.sendRequest({‘action’ : ‘create_notification’}, function(response) {
consoleLog(response);
// consoleLog(‘tab id is set to: ‘ + localStorage[« tabID »]);
});
}
});
})()

function call_notification() {
if (localStorage[‘notifications’] == ‘true’) {
consoleLog(‘show a notification’);
chrome.extension.sendRequest({‘action’ : ‘create_notification’}, function(response) {
consoleLog(response);
// consoleLog(‘tab id is set to: ‘ + localStorage[« tabID »]);
});
}
}
// DOWNLOAD SCRIPT BELOW COURTESY OF Chris Hendry
// @name Google Music Downloader
// @version 0.9.0
// @namespace http://www.radicalpi.net/
// @author Chris Hendry
// @description Allows you to download your music from Google Music Beta

function insert_download_button() {
document.getElementById(‘coloredBar’).innerHTML += « <div id=’downloadSongHolder’ style=’position:fixed; bottom:12px; right:254px; display:none; cursor:pointer;’> <img id=’downloadSong’ src=’http://radicalpi.net/upload/gMusic/download.png’&gt; </div> »;
document.getElementById(‘downloadSong’).addEventListener(« click », download, false);
setTimeout(toggleDisplay,1000);

}

function download() {

var id = document.getElementById(‘song_indicator’).parentNode.parentNode.parentNode.id;
if(id == «  ») id = document.getElementById(‘song_indicator’).parentNode.parentNode.id;
id = id.split(« _ »)[1];
var url = ‘http://play.google.com/music/play?u=0&songid=’+id+’&pt=e&rsquo;;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(data) {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
response = xhr.responseText;
url = response.split(‘ »‘)[3];
window.open(url,’Download’);
} else {
callback(null);
}
}
}
// Note that any URL fetched here must be matched by a permission in
// the manifest.json file!
xhr.open(‘GET’, url, true);
xhr.send();
}

function toggleDisplay() {

document.getElementById(‘downloadSongHolder’).style.display = document.getElementById(‘thumbsUpPlayer’).style.display;

setTimeout(toggleDisplay,1000);
}

Voilà vous n’avez plus d’excuse pour les karaokés maintenant😀

Pour toutes questions, les commentaires sont là pour ça ou alors retrouvez moi sur mon compte Google+ ;)

Vlingo5

Une alternative crédible à Siri en français sur Android

Voici déjà un moment qu’Apple a créé le buzz avec son dernier joujoux équipé d’un assistant vocal : Siri. Mais peut-on trouver un équivalent sur Androïd ?

Vlingo est la meilleure alternative que j’ai pu trouver à Siri. Il existe beaucoup de systèmes disponibles un peu partout sur la toile, parfois bien mieux réalisés que celui-ci mais bien souvent l’exclusivité des commandes en anglais rend l’utilisation lourde et pas bien pratique.

Cette application est encore bien loin du compagnon d’Apple puisqu’elle ne répondra qu’à certaines commandes bien précises dictées avec une syntaxe décrite sur la page d’accueil du logiciel : « Envoyer un texto à Dodoproduction Comment tu vas aujourd’hui ? » , « Aller à 1 place de la république », « Appeler Jack au travail », « Mise à Jour Twitter Ceci est un test avec Vlingo »…

Les gros points forts de l’application sont sa compréhension des dictés de messages en français ainsi que sa commande Vlingo Incar qui permet d’utiliser son smartphone tout en conduisant.

On pourra cependant déplorer le manque de souplesse  et l’absence de certaines commandes comme la possibilité d’écouter une certaine musique ou de mettre à jour son réseau LinkedIn ou Google+. Malgré ces défauts je l’utilise tous les jours et il me simplifie grandement la vie.

Vlingo est disponible à cette adresse sur l’android market : https://market.android.com/details?id=com.vlingo.client

Site officiel : http://www.vlingo.com/

Twitter : https://twitter.com/#!/Vlingo

bp1

Chronique de 2011 en photo par TheBigPicture [MAJ]

En cette période de fin d’année, tout le monde s’adonne à sa petite séquence rétrospection de l’année écoulée. En temps normal, chacun donne son point de vue sur les évènements passés et ses prévisions sur les évènements futurs qui devraient suivre.

TheBigPicture, un blog de Boston.com (http://www.boston.com/bigpicture/) a l’avantage de laisser les lecteurs interpréter l’objectivité des images avec de nombreuses photo sur chaque thème détaillé.

Je vous laisse donc découvrir leur chronique détaillée en 3 parties dont 2 déjà disponibles sur le site ici et .

Je vous invite bien entendu à suivre ce site merveilleux sur twitter et google+.

MAJ : la 3ème partie vient d’être publiée et est disponible ici.

excel_chartwizard

Excel et les statistiques : une grande histoire d’amour

Excel est le logiciel de calcul par excellence quand on possède un PC ; il possède des fonctions de calcul dans presque tous les domaines (compta, mathématiques, finances, …) et est à la porté d’utilisation de tout bon Homo Numericus. Avec  son grand choix de graphiques (histogrammes, nuages de point, courbes de tendance etc …) et ses tableaux croisés dynamiques, l’outil logiciel semble avoir été construit pour faire une étude statistique. En réalité, dès qu’elle devient un peu conséquente, l’étude trébuche vite sur quelques problèmes. Voici 3 pièges à éviter si vous faites des statistiques sous Excel.

Galerie de graphiques sous Excel

Piège n°1 : Le cas de l’histogramme

Connaissez-vous ce qu’est un histogramme? « Ben oui, le truc en bâtons comme dans Excel », dommage, c’était bien essayé. En effet en statistiques, l’histogramme est en réalité une courbe qui représente la densité de la distribution d’une variable quantitative (numérique) continue (qui peut se mesurer avec une « règle »). Excel nous donne comme histogramme un diagramme en fréquences pouvant être utilisé pour des variables de tout type non continues surnommé diagramme en tuyaux d’orgue en statistiques.

Comment le logiciel a-t-il pu faire une telle confusion ? Et bien tout vient d’une erreur de traduction du logiciel de l’anglais à notre français. En anglais le mot histogram est utilisé pour les deux types de graphiques de façon courante. Alors qu’en français la distinction est faite les éditeurs d’Excel l’ont traduit tout simplement par un joli histogramme. Voici l’histogramme (le vrai) pour rétablir cette injustice (généré par une macro) :

L'histogramme un peu moins glamour

Piège n°2 : Le cas de la courbe lissée

Il advient toujours un moment où l’on doit exprimer une variable en fonction d’une autre pour voir une évolution dans le temps ou tenter d’expliquer certains résultat par rapport à d’autres. Mais ce nuage de point n’est décidément pas esthétique et  ne donne vraiment d’idée de la tendance de la variable étudiée. Il devient alors tentant de placer une courbe bien arrondie pour donner au graphique tout son potentiel informatif. Malheureusement, la courbe lissée proposée par Excel est tout sauf un gain d’information ; le logiciel n’essaye pas de créer une fonction pouvant passer par tous les points comme le ferait une courbe de tendance, il n’utilise que des astuces graphiques pour rendre l’ensemble de droites plus jolie.

Il faut donc préférer la courbe en polygone de la troisième ligne pour faire des vraies analyse statistiques. Elle laisse même la possibilité d’être comparée à une autre avec en bonus de calculs simples pour déterminer les coordonnés des points d’intersection. Pour les courbes de tendance, aucun problème, Excel gère très bien tout ça avec la fonction « Ajouter une courbe de tendance ».

Piège n°3 : les indicateurs de liaison

L’analyse statistique nécessite d’utiliser plusieurs outils statistiques pour sortir des informations de ce tableau. Quand on manipule un échantillon de 500 individus avec une centaines de variables, on en vient un jour ou l’autre à réutiliser plusieurs fois certains pour des mêmes types de variables par exemple.

Certains comme la liaison entre deux variables sont très lourds à mettre en place sous Excel et avec des répétitions peuvent générer des erreurs. En effet, le logiciel possède certes une large éventail de fonctions de statistiques inférentielles (test d’adéquation à une loi de probabilité), mais manque cruellement de méthodes de statistique descriptive. Pour faire ces calculs de façon automatisée il est toujours possible de créer une Macro en langage VBA mais la programmation demande beaucoup de temps et ne sera pas forcément adaptée à tous vos fichiers de données.

Faut-il bannir Excel de toute étude statistique ?

Certainement pas ! La plupart des logiciels de saisie donne la possibilité d’exporter les données sous un format Excel. Il est alors très utilisé pour mettre en forme les variables, les trier et appliquer des filtres.

Pour le reste il faudra mieux privilégier un bon vieux SPAD, SAS ou R (gratuit) qui nécessite un apprentissage spécifique avant de savoir l’utiliser mais qui donne bien plus de possibilité d’analyse et sont bien plus rapide d’utilisation. Notons que ces trois logiciels peuvent importer des données Excel.