pixel-art-nantes.jpg

Franck Drion a effectué pas moins de 400 heures de travail étalés sur une année pour obtenir cette magnifique vue synthétique de Nantes en Pixel Art.

Il a appelé son oeuvre : « Nantes Pixel Art »

On retrouve tous les incontournables de la ville de Nantes, jusqu'au plus petit détail. On pourrait passer plusieurs heures à découvrir les moindre détail de son tableau et c'est le but du Pixel Art.

Pour les fans, il est possible d'acquérir une version imprimée de son oeuvre sur du forex brillant en HD. A l'heure actuelle, deux formats sont proposés, il est nécessaire de contacter Franck Drion directement par email pour commander une copie de son oeuvre.

Les impressions sont signées et numérotées par l'artiste.

Même Johanna Rolland, la maire de Nantes a tweeté la news publiée sur Presse Océan :

johanna-rolland-pixel-art.jpg

N'hésitez pas à découvrir et à suivrece talentueux artiste via sa page Facebook.

buzzme.png

Vous souhaitez vous organiser des sessions "Question pour un champion" à la maison avec votre famille ou vos amis ?

Voici BuzMe, un buzzeur connecté bluetooth pouvant être utilisé sur une tablette ou un smartphone.

Le projet BuzMe est français, ses créateurs viennent tout juste de lancer un financement participatif au travers de la plateforme Indiegogo. En plus de vendre des buzzeurs, ils fournissent 4 applications gratuites et des API ouvertes permettant à des développeurs tiers d'utiliser leur buzzeur au sein de leur propre application.

Ils se sont fixé un budget de $100,000 pour se lancer dans la commercialisation de ce buzzeur connecté.

Le prix de vente "early deals" du buzzeur du Indiegogo :

Suivez le projet :

Bonne chance à ces Nantais pour le lancement de leur projet !

altmine-co.jpg

Vous commencez à vous intéresser aux monnaies alternatives comme le Bitcoin, le Litecoin ou bien le Dodgecoin ? Vous souhaitez participer à la validation des blocs de transactions du réseau et devenir ainsi mineur ?

Venez miner sur Altmine.co, mon pool de minage Litecoin P2P totalement ouvert et ne nécessitant aucune inscription préalable. Ce pool se repose sur la technologie P2pool. Le serveur étant hébergé chez Online, il offre de très faibles latences aux personnes qui sont chez un FAI français.

Pour commencer à miner simplement :

  1. Télécharger le kit de minage Windows disponible sur le site ou téléchargez des outils de minage comme Cpuminer, Cudaminer, Cgminer .... (attention, ces outils sont parfois reconnus comme des trojans par les antivirus). Si vous utilisez vos propres outils, l'URL du serveur est le suivant : http://altmine.co:4444
  2. Renseignez dans le fichier "settings.bat" votre identifiant de Wallet de Litecoin sur lequel vous souhaitez recevoir votre crypto-monnaie en échange des ressources de calcul mises à disposition sur le réseau.
  3. Si vous ne possédez pas de Wallet Litecoin, téléchargez la dernière version de l'application Litecoin et créez un nouveau Wallet.
  4. Exécutez l'outil de minage adapté à votre matériel.

Les statistiques du pool et de l'ensemble des utilisateurs du pool sont disponibles à cette adresse : http://altmine.co/static/

À chaque "Share" approuvé par le réseau Litecoin, vous devriez recevoir des transactions proportionnelles à vos efforts de calcul :

minage-altmine.jpg

Vous voilà devenu mineur de transaction. Pour consulter le cours du Litecoin, vous pouvez faire un tour du coté du site de BTC-e. La valeur du Litecoin a énormément baissée depuis l'hiver 2014, mais il n'est pas impossible qu'un jour le Litecoin atteigne une valorisation beaucoup plus importante.


Update : N'oubliez pas de modifier votre niveau de difficulté afin d'éviter des "share" trop long à réaliser.

Lors qu'un Japonais tente d'innover pour répondre à son téléphone le plus rapidement possible, cela donne cette vidéo totalement loufoque et ringarde. A découvrir si vous ne la connaissez pas déjà !


Après avoir trouvé la solution pour son téléphone, il s'est intéressé à l'iPad d'Apple :

Vous pouvez découvrir toutes les autres vidéos de morishowta sur sa chaine Youtube.

web2day_2015.png

Le Web2day offre un condensé des dernières tendances et des meilleures pratiques en matière d’innovation. A l’occasion de différentes conférences, workshops, showroom, concours de startups, soirées, tous les professionnels du numérique de France et de partout ailleurs en Europe, se retrouvent, pendant 3 jours, pour « faire le plein » de nouveautés, d’inspiration et de rencontres.

Pour cette édition 2015 qui se déroulera du 3 à 5 juin, ce sont plus de 2 300 passionnés de nouvelles technologies (entrepreneurs, sponsors, professionnels du web et du numérique, technophiles, étudiants, journalistes, blogueurs,…) et plus de 130 speakers internationaux de renoms qui sont attendus en juin prochain.

Le programme des 130 conférences, débats, workshops organisés tout au long des 3 jours s’articulera autour des 5 grandes thématiques suivantes :

  • Entrepreneuriat (startup, financement, accélérateur…),
  • Expertise métier (échange de bonnes pratiques),
  • Internet of everything (objets connectés, e-santé...),
  • Innovation responsable (« green », économie collaborative, politiques numériques & territoire)
  • Et un plus impertinent « What the fuck ? » (regroupant des sujets prospectifs, décalés, sociétaux…).

A noter qu’en marge de cette programmation, le web2day accueillera également :

  • Un concours international de startups (« Le global challenge») afin de faciliter le lien entre la cinquantaine de jeunes pousses retenues à cette occasion et les fonds d’investissement présents à Nantes, pour le concours.
  • Une Tech Zone,
  • Un showroom sur lequel sera présenté toute une panoplie d’objets connectés.

Les pass 3 jours "Early Bird" sont d'ores et déjà disponibles sur le site du Web2day au tarif de 189€ au lieu de 249€.

Si l’événement vous intéresse, n'hésitez pas à réserver vos places dès maintenant avant salle comble.

marshmallowchallengesetup.jpg

Des spaghettis , un marshmallow, du ruban et du scotch peuvent permettre d'apprendre beaucoup sur l'homme et la manière dont il collabore en équipe.

Tom Wujec présente des résultats surprenants de ses recherches approfondies sur le "problème du marshmallow".

Il s'agit d'un simple exercice de construction en équipe, qui implique :

  • des spaghettis secs
  • un mètre de ruban collant
  • un marshmallow.

Le mashmallow doit être positionné sur la partie la plus haute de la tour construite en spaghettis. L'équipe qui réalise la tour la plus haute en 18 minutes remporte le concours.

Ce test a été réalisé par de nombreuses d'équipes différentes, cependant les équipes qui réalisent les plus grandes tours ne sont pas celles qui ont les positions sociales les plus élevées dans notre société.

C

Vous avez franchi la première étape qui est l'arduinisation de votre télécommande pour ouvrir vos volets ? Voici la seconde étape qui consiste à automatiser l'ouverture et la fermeture de vos volets aux horaires du lever et du coucher du soleil.

J'utilise pour cela un simple fichier NodeJS se basant sur les deux librairies suivantes :

  • Cron pour l'automatisation de tâches
  • Suncalc pour le calcul des horaires de lever et coucher du soleil.

Le programme réalisé est très simple, il programme un job Cron au prochain coucher ou lever du soleil. Le job se limite à réaliser un appel HTTP au service REST exposé par l'Arduino sur lequel est connecté la télécommande des volets. Dès lors que le job se termine, il programme une nouvelle tâche à l'inverse de la tâche qu'il vient d’effectuer.

/**
 * DomoGeeek v0.1
 * https://github.com/ltoinel/domogeeek
 *
 * Copyright 2014 DomoGeeek
 * Released under the Apache License 2.0 (Apache-2.0)
 *
 * @desc: Task that opens and closes my shutters

 */


var request = require('request');
var CronJob = require('cron').CronJob;
var SunCalc = require('suncalc');
       
//Local require
var config = require('../config');
var multipush = require('../../../libs/multipush');

/**
 * Initializes a new Cron job.
 *
 * @param name : the job name
 * @param uri : the uri to request
 * @param timeFunction : the time function to call
 * @param date : the date
 */

function initJob(name, uri, timeFunction, date){
       
        var time = timeFunction(date);
        console.log("Job initializing : " + name + " at " + time);
       
        var job = new CronJob(time,
       
        // OnTick
        function(){
               
                console.log("Job starting : " + name);
               
                request.get(uri).on('error', function(err) {
                        console.error("Shutter API error : " + err);
                });
               
                multipush.send(config.multipush,"Job starting",name,config.shutters.channel);
               
                // Stop the current job
                this.stop();
               
        // OnCompleted
        },function(){
               
                console.log("Job stop : " + name);
               
                // Schedule the next job
                scheduleNextJob(name);

        }, false, config.timezone).start();
}

/**
 * Schedules the next jobs.
 *
 * @param previousJobName The previous job name
 */

function scheduleNextJob(previousJobName){
       
        // If the previous job was closing the shutters
        if (previousJobName == config.shutters.close.message) {
               
                // Schedules the task that will open the shutters tomorrow
                initJob(config.shutters.open.message, config.shutters.open.url, getOpenTime, getTomorrowDate());

        // If the previous job was opening the shutters
        } else if (previousJobName == config.shutters.open.message){
               
                // Schedules the task that will close the shutters today
                initJob(config.shutters.close.message, config.shutters.close.url, getCloseTime, new Date());
        }
}

/**
 * Return the date of tomorrow.
 */

function getTomorrowDate(){
        var today = new Date();
        var tomorrow = new Date();
        tomorrow.setDate(today.getDate()+1);
        return tomorrow;
}

/**
 * Return the times regarding the configured latitude and longitude.
 *
 * @param date : the date to use for the times calculation.
 */

function getTimes(date){
        var times = SunCalc.getTimes(date, config.shutters.latitude, config.shutters.longitude);
        return times;
}

/**
 * Return the next time in cron format to open the shutters.
 *
 * @param date : the date to use for the sunrise calculation.
 */

function getOpenTime(date){

        // Fix configured time
        if (config.shutters.open.time !== undefined){
                return config.shutters.open.time;
        }
       
        var times = getTimes(date);
        console.log("Get sunrise time for " + date + " => " + times.sunrise);
       
        return times.sunrise.getSeconds()+" "+times.sunrise.getMinutes()+" "+times.sunrise.getHours()+" * * *";
}

/**
 * Return the next time in cron format to close the shutters.
 *
 * @param date : the date to use for the sunset calculation.
 */

function getCloseTime(date){
       
        // Fix configured time
        if (config.shutters.close.time !== undefined){
                return config.shutters.close.time;
        }
       
        var times = getTimes(date);
        console.log("Get sunset time for " + date + " => " + times.sunset);
       
        return times.sunset.getSeconds()+" "+times.sunset.getMinutes()+" "+times.sunset.getHours()+" * * *";
}

// Starts the right job now
var now = new Date();
var times = getTimes(now);

// Sunrise will arrive today, we have to open the shutters today
if (times.surise > now){
        initJob(config.shutters.open.message, config.shutters.open.url, getOpenTime, new Date());
}
// Sunrise was previous, sunset will arrive today, we have to close the shutters today
else if (times.sunset > now ){
        initJob(config.shutters.close.message, config.shutters.close.url, getCloseTime, new Date());
       
// Sunrise and sunset are past, we have to open the shutters tomorrow
} else if (times.sunset < now ){
        initJob(config.shutters.open.message, config.shutters.open.url, getOpenTime, getTomorrowDate());
}

Le fichier de configuration nécessaire au bon fonctionnement du programme :

// Shutters task service
config.shutters = {};
config.shutters.enabled = true;
config.shutters.latitude = 47.2;
config.shutters.longitude = -1.5;
config.shutters.open = {};
config.shutters.open.time = '0 0 9 * * *'; // If not set, use the sunset time
config.shutters.open.message = 'Ouverture automatique des volets';
config.shutters.open.url = 'http://xxx.xxx.xxx.xxx/up';
config.shutters.close = {};
//config.shutters.close.time = '0 0 22 * * *'; // If not set, use the sunrise time
config.shutters.close.message = 'Fermeture automatique des volets';
config.shutters.close.url =  'http://xxx.xxx.xxx.xxx/down';
config.shutters.channel =  'openkarotz';

Ce bout de code est OpenSource, vous pouvez l'enrichir et proposer des améliorations via GitHub.

mqttorg-glow.png

Connaissez-vous le MQTT ? Il s'agit d'un standard OASIS permettant de simplifier la communication machine à machine (M2M), idéalement conçu pour l'Internet des objets.

MQTT is a machine-to-machine (M2M)/"Internet of Things" connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios. It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers.

C'est sympa, mais cela signifie quoi dans la pratique ?

Et bien cela ressemble à un bus d’événement très simple à contacter sur lequel des producteurs et des consommateurs de message peuvent s'abonner.

broker.png

Il existe de nombreuses implémentations de broker MQTT sur Internet. L'un des plus simples à utiliser est très certainement Mosca, une implémentation NodeJS de MQTT ultra-configurable et adaptable à tout besoin. Quelques lignes de code Javascript permettent d'instancier son propre serveur MQTT.

Pour des besoins plus lourds, notamment l'exposition REST/COAP des objets, il est possible d'utiliser Eclipse Ponte une surcouche de Mosca actuellement en incubation à la fondation Eclipse.

architecture-ponte.png

Ensuite si vous souhaitez ajouter de l’intelligence à votre broker MQTT, la solution la plus simple est de connecter une instance Node-Red à votre broker MQTT.

node-red-screenshot2.png

Vous pourrez créer les scénarios de votre choix, orchestrer des actions dès lors qu'un certain événement arrive sur le broker ...

C'est autour de ces deux produits que je suis en train de revoir l'architecture de mon logiciel de domotique pour les geeks : Domogeeek. Une branche de développement a été créée spécifiquement pour la migration. Le gros avantage du MQTT est que les producteurs de messages et les consommateurs peuvent être répartis sur différentes machines.

Je vous tiendrai au courant de mes avancements, une v1.0 devrait bientôt voir le jour dès que tous les modules auront été migrés.

je-suis-un-choix-banner.jpg

Petit coup de pouce à Vincent Quester, un ami qui participe au festival de film Nikon et qui a de super idées. Il a tourné un court métrage avec Blaise Moulin, un super comédien qui me fait bien rire.

Dans le court métrage, Blaise, petit franchouillard moyen, a du succès avec les femmes et ne sait pas leur dire non. Il apprendra pourtant, à ses dépens, que c'est en s'affirmant qu'on évite les pires situations.

nikon-je-suis-un-choix.jpg

Si la vidéo vous plait, n'hésitez pas à les soutenir !