Empilement de dessins

Petite victoire suite à l’article précédent, j’ai réussi à déplacer la fonction de dessin au sein d’un Element, proprement en supprimant la dépendance cyclique, tout en affinant les objets de bout en bout. Ce qui est amusant c’est que j’ai supprimé 50-80 lignes de code pour un résultat amélioré et identique au rendu, c’est toujours agréable.

Notez qu’on avait déjà refait le subset (portion de la carte à rendre à l’écran – optimisation), en considérant la somme du Tile suivit des Items à la même coordonnée ([Tile, Element, Element, …]) et ainsi faciliter le rendu tout en corrigeant la notion de couverture d’un Tile sur un Element : un morceau de terre recouvre l’ombre du second arbre dans l’image ci-dessous, sans ça l’arbre était dessiné après et donc l’ombre recouvrait le bloc de terre qui n’a rien à voir. Ainsi c’est plus juste visuellement tout en ayant une boucle plus facile à traiter.

Du coup map (contenant tout le monde chargé) a subit le même lifting que subset (le schéma de données d’entrées aussi), soit la somme directe de tous les Elements et on supprime Tile qui perd de sens si on donne Z à Element (c’était la seule différence). Du coup on pourra étendre Element pour les objets composés.

Ensuite, étant lancé, on (avec Boudine) a continué sur l’empilement et donc la notion d’animation, toujours dans la fonction draw de Element. Le résultat comique quand oublie qu’un objet a une taille, c’est qu’ils s’écrasent au niveau 0. Ensuite, si vous oubliez que initialement vous considériez le haut du sol comme point de base, et qu’ensuite vous mélangez la nouvelle notion de taille avec les ancienne valeur de base, vous avez un sol à l’ancienne place et des arbres qui volent ^^, car eux ont suivit l’élévation incrémentée et le sol non.

En résumé un Sprite contient la notion de taille de l’objet représentée, selon la frame d’animation (ou la seule image par défaut), et le système de rendu sur base d’une hauteur de base donnée, incrémentera de la taille de l’objet rendu, additionné de son élévation Z. Ainsi vous pouvez avoir un arbre sur un arbre comme dans l’image ci-avant. Et pour illustrer l’élévation vous avez les blocs de terre qui montent ou descendent, ce qui est dessus suivra naturellement.

Tout fini bien quand les petits correctifs sont appliqués. On a donc un rendu avec code mieux réparti (le bon endroit), une mécanique d’initialisation et de rendu améliorée, des lignes et procédures inutiles retirées et le sentiment de progresser dans le bon sens.

La suite ?

On a ouvert la porte à la structure d’animation, le système de rendu de Element doit encore être amélioré pour traiter ça complètement, car Element n’a pas encore de gestion des ses animations. Pour cela le code du POC Sonic servira de base car il couvrait pas mal de possibilités variables. Il restera à faire un cas de test. Notez que je sais qu’un logiciel libre existe pour composer lui-même sur base d’image un Sprite, me reste à le trouver et voir s’il rend en sortie également les références de positionnements, ça aiderait grandement.

Sinon, on peut également repartir sur l’intégration des events, qui doivent transiter par Game ou directement aux Scene actives, à voire, et ainsi reprendre le dessin du curseur et le zoom. Reste à savoir où mettre tout ça et comment raccorder.

Nahyan, 18 ans plus tard

Nahyan, ça fait un bout de temps dis donc et en en reparlant avec certains membres de l’équipe originale, ça n’a pas prit une ride (Merci K-you). Ça tombe bien j’ai toujours pas abandonné !

Reprenons la situation

Reprenons quelques instant un mini résumé de la situation : « Seul je ne sais pas faire le jeu tel que pensé et il faut arrêter de croire que je serai aidé ».

Ensuite, dans l’optique « j’y arriverais malgré tout », il faut reprendre ce qu’on a comme acquis permettant de démarrer : je suis développeur web et pas illustrateur. Il faut donc que j’amoindrisse mon ambition, sans casser le projet ou perdre l’envie de le faire, rester motivé et prendre du plaisir à le faire.

Du coup on repars un an en arrière, j’étais développeur web en mission pour Auchan et j’ai développé, entre autre, un éditeur de plan de masse (en gros la vue du haut des meubles d’un étage de magasin). Ceci a été fait sous Angular en Canvas et c’était bien amusant de le faire. Du coup quand c’est sympa on explore et on chipote, on fait ça encore mieux, etc. Ce qui donne ceci :

Vue partielle de l’éditeur

En gros on a comme possibilité de sélectionner, drag/droper d’une liste vers le plan ou du plan vers le plan (déplacer un meuble), molette de souris pour faire une rotation du meuble ou zoom du plan (min-max), visibilité de la sélection dans une liste sur plan ou inversement au survol, etc… Le tout avec les optimisation possible pour ne dessiner que ce qui est nécessaire tout en se faisant plaisir avec les petites ombres par exemple.

Exemple de rendu d’objets : 3 meubles de différents type, une caisse et un escalator

Ici on a un exemple de certains éléments graphiques créés directement en code.

Tant qu’on y est…

J’étais lancé et je ne pouvais pas explorer plus avant les possibilités de cet éditeur, du coup je me suis créé un petit projet perso pour tester les animations en sprite. En fouillant un peu j’ai retrouvé ce bon vieux Sonic.

Ainsi j’ai pu chercher comment découper, afficher, animer, retourner, etc. notre petit héro bleu. Ensuite, me casser les dents sur la physique de déplacement du personnage mais ça on va zapper…

Oui mais ensuite ?

Ensuite la mission s’est terminée et j’ai eu quelques jours au bench. Du coup je me suis occupé en tentant de renforcer mes compétences Angular, surtout sur la partie mise en place d’un nouveau projet. Car c’est facile d’utiliser ce qui a été mis en place par d’autres, mais le faire soit même c’est de la découverte casse-gueule…

Coder c’est joli, mais un rendu c’est mieux, Canvas c’était sympa et comme j’avais déjà fait un POC (preuve de concept) isométrique en canvas à la maison, je me suis dit que mélanger les deux rendrait la chose plus amusant, Angular et Canvas pour un moteur isométrique. Il manquait un truc : les éléments graphiques, et c’est pas le plus simple.

En fouillant je suis tombé sur l’excellent site opengameart.org, fait par un développeur, Clint Bellanger, d’un jeu gratuit et open-source nommé Flare, de lien en lien je suis également tombé sur son blog partageant ses études du sujet isométrique et de son jeu et moteur graphique.

C’est dans la même suite de recherches que je suis tombé sur le magnifique logiciel MagicaVoxel. Ce truc est terrible, pas évident au début mais très agréable. C’est là que je me suis dit :  » tu n’es peut-être pas graphiste/illustrateur, mais t’as les notions et la créativité pour faire de ce logiciel l’instrument qui te manquait « .

Du coup j’ai fait ça :

Un morceau de terrain isométrique
Oui c’est un arbre

Ok je me suis bien amusé, j’ai chipoté et fait un rendu isométrique par le logiciel et puis ?

Ensuite j’ai transposé mes précédents essais et morceaux de code du projet Auchan, Sonic et compagnies en un POC de rendu isométrique. Ce qui donne, après de nombreux chipotages et réflexions sur les calculs de rapports entre écran et monde, monde et écran, en incluant les notions de zoom, d’offset et d’élévation :

Tadaaa… ok ça ressemble à rien mais en une matinée c’était pas mal (une demi journée de recherche à tourner en rond sur le net et un début de rendu). Évidemment ce n’est pas suffisant, il nous faut un objet et un curseur pour contrôler et vérifier les formules de positionnement, de zoom etc.

Et avec un objet pour vérifier la superposition, l’ombrage et l’élévation :

Du coup ça fonctionne, un POC de +650 lignes, données incluses, ça fait plaisir, et on est à 1 jour et demi. Puis en chipotant sur des dessins et en repensant au plan de masse d’Auchan, je me suis dit, qu’est-ce que ça donnerait en isométrique ? Il m’a suffit de dessiner un meuble au l’autre, changer la carte de données, corriger des superpositions et ordonnancement pour avoir ce petit magasin :

Vue isométrique test d’un plan de masse

Ça a fait beaucoup rire les collègues 🙂 .

On s’arrête au POC ?

Bien entendu non, j’ai réussi une étape, c’est bien, je l’avais déjà fait mais là c’est plus abouti. La base est là et vérifiée, on peut continuer ! Cependant c’est un POC tout dans un seul fichier, c’est pas propre et continuer là dedans c’est pas une bonne idée. Du coup, on décompose le code en morceaux, on crée des classes, on structure son code, on découvre les joies des inclusions cycliques, des prises de têtes de  » Où mettre ça ??? « , etc… Il m’aura fallu presque une semaine pour transposer le code et en arriver presque au même point qu’au POC :

Test de rendu d’un terrain variable avec objets

Là on a une version complète et fortement améliorée pour son côté structuré et flexible. Manque le curseur et le zoom qui n’ont pas encore été recâblé pour la simple et bonne raison que je me suis concentré sur le système de rendu, la structuration des données, simplification/factorisation du code et correctifs divers.

En parallèle

À coté de ça, j’ai tenté de m’installer un espace de travail propre, un petit GitLab sur le serveur daaboo, mais quand on a la moitié de RAM que nécessaire… et pas de redmine encore car GitLab pourrait peut-être suffire. Mais on est loin du compte encore. Le top serait d’avoir le moteur graphique séparé de l’usage Nahyan, on lui a trouvé un nom  » TARS « , je vous laisse chercher pourquoi.

La suite ?

Là ça fait une semaine que je m’échine à refondre la structuration Sprite et Element, suite de ce que je disais avant, fondre et refondre pour trouver le bon équilibre de séparation des concepts, stockage des données, etc. J’y suis presque, l’idée est d’avoir un Sprite qui s’occupe de stocker l’image et les infos descriptives de cette image (points de référence, hauteur/largeur, frames d’animations, …) et de l’autre un Element faisant référence à un Sprite tout en ayant ses valeurs propres. Ainsi 2 Elements « brin d’herbe » utilisant le même Sprite pourront être animé séparément et ne pas avoir cet effet ringard de tous les mêmes élément animés en même temps.

Dans cette refonte j’essaye d’inclure directement la notion d’animation et d’objet composé.

Il y a encore pas mal de travail avant d’avoir à nouveau une base propre, stable et bien pensée, même si on sait d’avance que ce n’est pas le dernier refactoring du code de base.

Pour détails du jour

Pour ceux que ça intéresse ou pour le souvenir :

  • Usage de la classe Bloc au lieu de l’interface périmée
  • Suppression de Tile au profit de Element contenant une propriété Z (élévation).
  • Nettoyage et fixes suite à la disparition tragique de Tile
  • La grande question est… (non pas celle là) comment transférer Draw de Scene dans Element vu qu’on a un Camera, un incrément de bloc et des coordonnées d’écran
  • Stacking mis en place au niveau du subset
  • Hero est un set de données x, y en dur
  • Cursor désactivé, mouse event aussi
  • Autre question est comment mélanger Iso et rendu standard au sein d’une scène, mélange de méthode et de services

Pour info il y a 30 TODOs qui traînent dont 19 rien que dans Iso…

Badawok 7.x ne meurt jamais

Pourquoi diable un article sur Badawok 7.x ? Car en fait je l’utilise encore et continue de faire progresser sa branche, même si la 8 a été démarrée. D’un côté car il est en prod et qu’il faut suivre parfois les petits couacs potentiels, et puis, surtout, car je développe un nouveau site client, et donc, avec une version stable et pas en dev, comme je peux me le permettre avec Comitards.

Que dire ? Plein de trucs !

Depuis le début de la 7, une page peut prévoir des remplacements, textes pour 99% de l’utilisation mais également d’insertion de module, via les accolades ( {class:method|params|...} ). Une erreur a été corrigée au niveau de la détection des params, jamais utilisé jusqu’ici, et très fortement utilisé dans mon projet actuel. Quatre ans plus tard, une fonctionnalité voit son plein potentiel, et ça fait plaisir !

De même, une bonne surprise de conception, l’ordre des étapes de rendu permet de passer des arguments via PHP : {class:method|params|<?php echo $maVar ?>}.

Ainsi une problématique récurrente a pu trouver une nouvelle solution : la traduction de données.

Le système de langue étant dynamique, le nombre de langue varie et la maintenance de formulaires est pénible, coté front et coté code avec les checks etc. On découpe tout ça autrement.

Brutalement on imagine une table avec un seul id, mettez ce que vous voulez comme champs, excepté du texte. Coté formulaire vous ne vous occupez que de vos champs et vous insérez là où vous voulez l’appel au système de traduction ({trad:displayOne|params}) les params pouvant définir, dans un ordre définis, l’id du champs, son maxlength, etc. Je vous passe les détails.

Dynamiquement le formulaire sera complété de vos champs et ceux-ci seront pré-rempli si existant. Côté back, 2 méthodes, une de check des required et langue par défaut et une de sauvegarde multi-lingue.

Maintenance plus aisée, tant pour l’utilisateur que le développeur 🙂 !

Avec le même système d’insertion de module, et sur retour d’expérience du site terragusto.be, où la colonne de gauche devait être préparée par chaque action, ici notre menu/sous-menu principal est composé de 3 insertions, un par menu. Ainsi on ne met pas de code dans le layout non nécessaire et le rendu de manière centralisée avec les appels préparatoires qui vont bien et toujours les ACL qui vont avec.

Encore un autre usage et amélioration, la barre d’admin, d’habitude dans le layout sur condition ACL (Access Control List) et ici en centralisé avec config pour le global et la possibilité à chaque action de déclarer un menu potentiel, dont l’ACL activera ou pas l’affichage.

Enfin, un système de message d’erreur ou confirmation centralisé, inspiré de l’univers ZF. On envoie le message, on le configure pour son apparence et hop, le prochain affichage possible les affichera selon le template défini.

Cette version a encore du poil de la bête et n’a pas encore tout donné, c’est un plaisir personnel de voir son propre framework capable et fonctionnel :).

Nabaztag:tag sur Raspberry B r2

Le 13 janvier 2009 Fozzgog est arrivé, non sans mal. Et quelques années plus tard il se tût… Violet ayant fait faillite, racheté, re-faillite, abandonné et la communauté à réussi à obtenir les codes sources et le domaine nabaztag.com.

Je vous passes les détails de l’histoire, c’est long et internet en est gorgé. La question est, après autant de temps, puis-je encore le faire fonctionner comme « avant » ou presque ?

La réponse est « oui » !

En cherchant je suis tombé sur le tuto de Pierre Dandumont utilisant OpenJabNab avec l’aide de la communauté. L’article est déjà vieux et n’est plus tout à fait à jour, j’ai du bricoler un peu, d’où cet article pour en faire la mise à jour.

Je vais essentiellement reprendre ses étapes et retirer/ajouter la différence. Principalement je ne suis pas sous mac et n’utiliserais pas le service Bonjour. L’OS de base n’est plus tout à fait le même non plus.

Mon idée est de pouvoir promener mon lapin chez moi et en dehors moyennant une prise de courant. Il est quand même la mascotte de la Famille du Band Bleu 🙂

Mon matos :

  • Un Raspberry B (r2), alim etc.
  • Carte SD 4Go
  • Mon Nabaztag:tag, alim etc
  • Un routeur WI-FI
  • Clavier, souris, écran HDMI (ou adaptateur etc. dans mon cas)

Sur la carte SD j’ai mis une version de Raspian Jessie Lite, pour n’avoir que le nécessaire et sans interface graphique. J’ai essayé Noobs mais sur la 4Go, la mise à jour n’avait pas assez de place. Après de toute façon il ne nous faut que de la console :).

J’ai utilisé win32diskimager pour mettre l’image sur ma carte SD.

On branche et on allume. Oubliez pas que le login/pw de base sont pi/raspberry.

IMG_20160201_204545

Config de base

Un fois connectez on va mettre les bonne conditions de départ, tapez sudo raspi-config, vous aurez un bel écran d’interface avec un tas d’options :).

Activez SSH s’il ne l’est pas, réglez votre langue et étendez le file system à toute la carte. Dans notre cas on est déjà console, pas besoin de désactiver l’interface graphique au boot. Mais vous pouvez régler la mémoire vidéo à 16Mo.

Dans les options avancées il y a aussi hostname, ne l’oubliez pas, donnez un nom à votre terrier :). Ça évite de toucher aux fichiers (hosts, hostname) manuellement par la suite.

Là normalement vous pouvez ping, mais non ! Dans cette version il y a une erreur connue. Vous devrez d’abord exécuter : sudo chmod u+s /bin/ping .

Ensuite tentez un ping vers ce que vous voulez pour vérifier votre connexion réseau.

Maintenant qu’on a du réseau on met à jour.

sudo apt-get update
sudo apt-get upgrade

IMG_20160202_210457

Ensuite on fixe son IP. Dans mon projet de promener l’installation ça a d’autant plus d’importance.

sudo nano /etc/network/interfaces

Mon réseau est en 192.168.1.x, vous devrez adapter les configs selon votre cas. Vous devez modifier la ligne iface eth0 inet dhcp en :

auto eth0
iface eth0 inet static
address 192.168.1.150
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.150

On sudo reboot, on débranche clavier souris etc, on laisse juste alim et réseau. On retourne a son bureau, on s’installe confortablement, on prend putty et on se connecte :

ssh pi@192.168.1.150

Serveur DNS

Comme le dit le tuto de Pierre, le truc chiant c’est que le lapin a besoin d’un nom de domaine pour se connecter au serveur. Donc il nous faut notre propre serveur DNS local.

sudo apt-get install bind9
sudo /etc/init.d/bind9 start

C’est parti pour plein de config. Perso j’ai eu du mal sur cette partie du fait des mises en pages des contenus. Pour infos je me suis basé sur mes configs de domaines, le tuto de Pierre et une doc.

On va créer notre nom de domaine : terrier.loc avec son sous domaine ojn.terrier.loc .

sudo nano /etc/bind/named.conf.local

Attention la deuxième partie est l’envers de notre réseau.

zone "terrier.loc" {
  type master;
  file "/etc/bind/db.terrier.loc";
};

zone "1.168.192.in-addr.arpa" {
  type master;
  file "/etc/bind/db.192.168.1.inv";
};

Maintenant il nous faut les 2 fichiers précisés.

sudo nano /etc/bind/db.terrier.loc
$TTL 604800
@ IN SOA ojn.terrier.loc. root.terrier.loc. (
  1 ; serial
  604800 ; refresh
  86400 ; retry
  2419200 ; expire
  604800 ) ; negative cache TTL
;
@ IN NS ojn.terrier.loc.
@ IN A 192.168.1.150
;
ojn IN A 192.168.1.150
;192.168.1.150 IN A 192.168.1.150

Et l’autre.

sudo nano /etc/bind/db.192.168.1.inv
$TTL 604800
@ IN SOA ojn.terrier.loc. root.localhost. (
  2 ; serial
  604800 ; refresh
  86400 ; retry
  2419200 ; expire
  604800 ) ; negative cache TTL
;
        NS ojn.terrier.loc.
150     PTR ojn.terrier.loc.

Maintenant il faut dire au Rasp de l’utiliser.

sudo nano /etc/resolv.conf
# Generated by resolvconf
domain home
nameserver 192.168.1.1
nameserver 192.168.1.150

Particularités ici, si vous avez un soucis d’accès lors de test du domaine, commenté la 1.1. Si vous rebootez elle sera décommentée.

Enfin, on active le serveur de cache pour accéder au net. On décommente la partie forwarders et on met l’ip de la passerelle.

sudo nano /etc/bind/named.conf.options
options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        forwarders {
                192.168.1.1;
        };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

Redémarrez et testez, ping google.com, ping ojn.terrier.loc. Cf. ma remarque d’avant avec les ligne nameserver.

Vous pouvez également tester depuis votre poste en modifiant votre connexion réseau et en précisant le serveur DNS à 192.168.1.150.

dns-win

Le serveur

On y est, on va mettre le serveur en place et on va utiliser un Apache, comme dit Pierre, il y aura pas des milliers de lapins.

sudo apt-get install apache2 php5 libapache2-mod-php5
sudo /bin/hostname -F /etc/hostname
sudo a2enmod rewrite
sudo /etc/init.d/apache2 restart

Ensuite OpenJabNab, il nous faudra Git.

sudo apt-get install git
cd /var/www
sudo git clone https://github.com/OpenJabNab/OpenJabNab.git

Et c’est reparti pour un peu de config.

sudo nano /etc/apache2/sites-available/000-default.conf

Là aussi j’ai du adapter la conf directement dans le default. j’ai retiré les commentaires.

<VirtualHost *:80>
        DocumentRoot /var/www/OpenJabNab/http-wrapper

        <Directory /var/www/OpenJabNab/http-wrapper>
                Options -Indexes +FollowSymLinks
                AllowOverride All
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

default est déjà actif par défaut, un simple apache restart devrait suffire, sinon comme le tuto de Pierre :

sudo a2dissite default
sudo a2ensite default
sudo /etc/init.d/apache2 restart

Tapez l’ip de votre OJN (dans mon cas 192.168.1.150) pour y accéder. Vous devriez avoir le message « Problem with OpenJabNab ! » signe que tout va bien 🙂 Si vous avez une page d’index c’est que votre mod rewrite n’est pas activé.

Maintenant c’est compilation ! Yeah 🙂

sudo apt-get install qt4-qmake qt4-qtconfig qt4-designer qt4-dev-tools libqwt5-qt4-dev build-essential
cd /var/www/OpenJabNab/server
sudo qmake -r
sudo make

On configure, encore et toujours 🙂

sudo cp openjabnab.ini-dist bin/openjabnab.ini
sudo nano bin/openjabnab.ini
[Config]
httpListener = true
httpApi = true
httpVioletApi = true
xmppListener = true
RealHttpRoot = /var/www/OpenJabNab/http-wrapper/ojn_local/
HttpRoot = ojn_local
HttpPluginsFolder = plugins
StandAloneAuthBypass = true
AllowAnonymousRegistration=true
AllowUserManageBunny=true
AllowUserManageZtamp=true
SessionTimeout=300
TTS=acapela
MaxNumberOfBunnies=64
MaxBurstNumberOfBunnies=72

[OpenJabNabServers]
PingServer=ojn.terrier.loc
BroadServer=ojn.terrier.loc
XmppServer=ojn.terrier.loc
ListeningHttpPort=8080
ListeningXmppPort=5222

[Log]
LogFile=openjabnab.log
LogFileLevel=Debug
LogScreenLevel=Warning
DisplayCronLog=false

On change le RealHttpRoot, on met true à StandAloneAuthBypass et les 3 suivants, on change my.domain.com en ojn.terrier.loc.

Au tour des plugins :

sudo nano bin/plugins/plugin_auth.ini
[global]
authMethod=full

On donne les accès en écriture :

sudo chmod 777 /var/www/OpenJabNab/http-wrapper/ojn_admin/include

On ajoute les voix et humeurs :

cd /var/www/OpenJabNab/http-wrapper/ojn_local/plugins/
sudo wget http://down.dandu.be/nabaz-lang-mp3-fr.tar.gz
sudo wget http://down.dandu.be/nabaz-ojn-mp3-fr.tar.gz
sudo tar xvfz nabaz-lang-mp3-fr.tar.gz
sudo tar xvfz nabaz-ojn-mp3-fr.tar.gz

Et on lance !

sudo ./bin/openjabnab

Techniquement ça devrait démarrer sans erreur. Du coup on va dans l’admin du terrier 192.168.1.150/ojn_admin.

terrierloc-01En bas de page on peut voir les infos, ce qui montre ce qui a été chargé, preuve que ça fonctionne.

Il vous faudra créer un compte, le premier sera mit en admin automatiquement.

Le lapin

Ensuite il faut ajouter le lapin, dans account, donnez lui un nom en suivant les contraintes et entrez sa mac.

Prenez votre lapin, allumez le en appuyant sur son bouton de tête, il devient bleu. Connectez vous à son Wi-Fi et rendez-vous sur son ip 192.168.0.1.

IMG-20160203-WA0072

Le lapin a du mal à se connecter en Wi-Fi (peut-être mon lapin), déjà le WPA il a du mal mais y arrive parfois (nabaztag:tag), le v1 lui ne sait faire que du WEP. Je n’ai pas envie de chipoter, j’ai un routeur, une connexion invisible, ça suffira, j’ai désactivé la sécurité. Faites en fonction de votre projet et de votre lapin !

Dans la config avancée, désactivez le DHCP, donnez lui une IP fixe (192.168.1.151) ensuite renseignez le serveur ojn.terrier.loc/vl.

On sauve, le lapin redémarre et si tout va bien ça s’allume ! Le lapin bouge les oreilles et vous sautez dans tous les sens, votre lapin se reconnecte !

IMG-20160203-WA0070

Lancement automatique

J’ai essayé en vain la solution du daemon. Je n’ai peut-être pas trouvé de solution suffisamment à jour. J’ai donc utilisé la solution barbare mais fonctionnelle de Pierre :

sudo nano /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

sudo /var/www/OpenJabNab/server/bin/openjabnab

exit 0

Le lien déjà mentionné de la doc en parle.

Fin

IMG_20160203_173847

Fozzgog est prêt à reconquérir le monde… ou pas 🙂

Dans les possibilités de suites, car OJN ne gère pas/plus les chorégraphies ça serait de développer le plugin le permettant, tout à l’air d’être à disposition pour y arriver. Il n’y a quasi pas de doc donc ça sera empirique mais pourquoi pas essayer.

En local TTS et Taïchi fonctionnent bien. L’API pour le coucher, lever, TTS aussi. C’est déjà une bonne base pour redévelopper avec. Reste à voir si il peut le faire en autonomie.

Affaire à suivre 🙂

OVH, GMail et l’envoie de mail

Prenons le cas où vous avez votre domaine, vous configurez un compte mail et le raccordez à un compte GMail pour plus de facilité. Classique.

D’un autre côté vous avez votre serveur et vous envoyez des mails avec le même compte mail.

Et bim, vous voilà avec un compte bloqué !

OVH sécurise vos comptes mails en surveillant la provenance de connexion. GMail est en Amérique et votre VPS (par exemple) en France, du coup, en même temps vous êtes connecté à 2 endroits = piratage de compte détecté.

Une fois que ça vous arrive, ils vous suffit de déclarer un incident chez OVH et de leur expliquer la situation. Ainsi, plus de soucis.

Évidemment, cela n’arrive que dans le cas où votre GMail rapatrie ou envoie des mails pendant que votre serveur effectue également un envoie de mail. Mais c’est toujours bon à savoir.

Notez que pour débloquer votre compte il vous faudra vous rendre dans votre manager et saisir un nouveau mot de passe (ou le même). 5 à 10 minutes plus tard le statu sera revenu à la normal.

PHPMailer sur OVH en SMTP/POP3

Suite au fait que les emails envoyés par certains de mes sites ne sont plus reçus, j’ai cherché et trouvé une solution qui fonctionne conformément à mes attentes.

Contexte : VPS sur OVH, domaine OVH qui pointe vers ce VPS.

Première chose, j’utilisais déjà PHPMailer, une version précédente et domaine configuré pour SPF et DKIM. Donc mise à jour vers la source github de PHPMailer.

OVH n’est pas clair dans sa documentation quand vous en trouvez une qui est cohérente avec le reste et à jour. Basez vous sur le mail reçus lorsque vous créez votre compte. Le mail vous donne les ports et adresses à utiliser ainsi que l’indication très importante : connexion POP3 avant SMTP.

Par bonheur, la doc de PHPMailer fourni un exemple complet en ce sens.

//Authenticate via POP3.
//After this you should be allowed to submit messages over SMTP for a while.
//Only applies if your host supports POP-before-SMTP.
$pop = POP3::popBeforeSmtp('pop3.example.com', 110, 30, 'username', 'password', 1);

//Create a new PHPMailer instance
//Passing true to the constructor enables the use of exceptions for error handling
$mail = new PHPMailer(true);
try {
    $mail->isSMTP();
    //Enable SMTP debugging
    // 0 = off (for production use)
    // 1 = client messages
    // 2 = client and server messages
    $mail->SMTPDebug = 2;
    //Ask for HTML-friendly debug output
    $mail->Debugoutput = 'html';
    //Set the hostname of the mail server
    $mail->Host = "mail.example.com";
    //Set the SMTP port number - likely to be 25, 465 or 587
    $mail->Port = 25;
    //Whether to use SMTP authentication
    $mail->SMTPAuth = false;
    //Set who the message is to be sent from
    $mail->setFrom('from@example.com', 'First Last');
    //Set an alternative reply-to address
    $mail->addReplyTo('replyto@example.com', 'First Last');
    //Set who the message is to be sent to
    $mail->addAddress('whoto@example.com', 'John Doe');
    //Set the subject line
    $mail->Subject = 'PHPMailer POP-before-SMTP test';
    //Read an HTML message body from an external file, convert referenced images to embedded,
    //and convert the HTML into a basic plain-text alternative body
    $mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
    //Replace the plain text body with one created manually
    $mail->AltBody = 'This is a plain-text message body';
    //Attach an image file
    $mail->addAttachment('images/phpmailer_mini.png');
    //send the message
    //Note that we don't need check the response from this because it will throw an exception if it has trouble
    $mail->send();
    echo "Message sent!";
} catch (phpmailerException $e) {
    echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
    echo $e->getMessage(); //Boring error messages from anything else!
}

Il vous suffit de mettre les valeurs qui vous sont transmise et … ça n’ira pas encore.

Il va vous falloir vous connecter également à SMTP.

//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication
$mail->Username = "yourname@example.com";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";

Il vous suffit de modifier SMTPAuth de false à true et d’ajouter les 2 lignes et c’est fini !

Badawok

Note à ceux qui utilisent le framework badawok (v7 dans mon cas), vous aurez un conflit entre votre classe mailer et base_mailer car badawok utilise déjà un PHPMailer.

Supprimez l’extend de la classe base_mailer et ajouter les require_once des classes : phpmailer, smtp et pop3. Créez un répertoire vendor dans votre projet pour y mettre proprement les 3 classes de PHPMailer et le tour sera facilement joué.

La v7 étant uniquement patchée pour le moment, cette modification ne sera pas répercutée.

En ce début de 2014

Un accident de voiture me retient chez moi, laisser passer un piétons n’est pas sans danger quand la personne derrière ne fait pas attention…

L’occasion de mettre tout un tas de chose en ordre, comme son site, ses projets, le ménage…

Ainsi, Badawok 7.1 a été testé sur dev.comitards avec succès, juste 2-3 broutilles corrigées (cf le site tech).

Ensuite, j’ai eu l’occasion de dessiner le côté de ma future borne d’arcade, un future article y sera consacré.

J’ai également eu l’occasion de suivre une formation chez Alsacréations à Strasbourg sur le CSS3 et prochainement sur l’HTML5. Je vous la recommande ! Ainsi que ses marchés de Noël ;).

Les domaines de beabuzz sont tombés, le projet n’a donc de souvenir que la seconde partie de Badawok. Merci Bertrand M. pour cette aventure, qui, pour moi, n’est pas terminée :), même si différente !

De mon côté, daaboo, continue son changement de structure, progressivement. Tout va bien de ce côté là et je reprendrais surement tous mes sites sur un seul nouveau serveur.

Côté site web daaboo, le projet fusionnel daaboo/killan/tech reste sur la table, manque une idée finalisée et ça sortira 🙂 reste à savoir quand…

Ceci est une révolution…

Nous sommes chez Sivit depuis +6ans, je ne retrouve même plus la date du premier contact, c’est dire. Personnellement, je n’avais rien à leur reprocher, bon service et offre correcte, nous ce qu’on voulait, c’était développer notre offre d’hébergement, mails, domaines et de conception web, ainsi que des petits outils très en vogue à l’époque comme les compteurs, livre d’or etc. Ok ça c’est mort depuis un sacré bout de temps, les temps changent.

Depuis le rachat de Sivit par Nerim, j’ai personnellement senti une différence tant dans la qualité du service que dans leur communication.

S’en suit depuis quelques mois une séries de soucis avec nos serveurs qui n’avaient pas vraiment bougés pour dire d’en mériter. On a tout d’abord cru a une attaque par empoisonnement de cache DNS, puis a des tentatives de hack par les mails et au final plus assez de ressource sur la machine, veuillez prendre l’offre double ou quadruple… non merci, c’est pas 2 sites qui pètent un VDS même s’il est vrai que le VDS en question est pas terrible vu la concurrence.

C’est là que j’ai trouvé, grâce a des avis éclairés (encore merci à vous), une solution. Je vais changer ma manière d’opérer et aller vers cette fameuse « virtualisation ».

Il faut dire que passer des soirées et week-end entier pour de la config… à un moment donné on a autre chose à faire quand celles-ci ne vous apportent plus d’ennuis que de satisfaction. Revoir mon mode opératoire était donc indispensable, j’avais même pensé tout simplement arrêter cette partie de mon activité.

Ça plus les soucis passés ça faisaient beaucoup pour un seul homme en après journée… mais voilà qu’une nouvelle voie s’ouvre à moi comme dit ci-avant et donc on va reprendre le taureau par les cornes et affronter la bête.

J’ai jusque fin des contrats des 2 serveurs daaboo, soit +- juin, pour tout migrer, reconfigurer, adapter largement et offrir mieux pour vivre mieux.

Vous vous imaginez donc largement que tous les projets et sites sont actuellement en stand-by, le temps de mettre tout ça au clair le plus rapidement possible. Ça coûtera un peu, c’est sur, le recouvrement coûte toujours quelque chose, mais c’est pour un mieux.

badawok 7 – yaml et tests unitaires

L’inspiration m’est revenu voulant éviter Mecaclac 9 qui me sort par tous les trous. C’est ainsi que la relance de badawok 7, non terminé, m’a pris.

Je me suis mis en tête de mettre en application mes récentes recherches au sujet de PHPUnit. Ayant déjà pratiqué simpleTest, c’était là l’occasion de tester autre chose. J’aime assez bien, même si NetBeans n’a pas l’air de le reconnaitre, ce qui n’aide pas.

J’ai attaqué gentiment avec les classes t et st pour commencer en douceur, mais cela a déjà mis en évidence certaines petite lacunes de structure ou de contrôle. But atteint donc, et ce n’est là que le début, je vise une couverture maximale.

Sur mon portable, le pear yaml n’était pas installé du coup je me suis à nouveau confronté à cette non inclusion du yaml dans PHP. Chance pour moi, Fabien Potencier (Symfony) a mis sur GitHub la partie de Symfony concernant le yaml, version 1.2, mieux que ce que ne propose les libraires en ligne ou même le pear.

Il m’a suffit de quelques adaptations (pas d’utilisation de namespace, tous dans un seul répertoire), cf logger, et le tour était joué.

Ceci dit je me suis donc intéressé à l’idée namespace pour badawok, mais là, manquant de compréhention, je vais parfaire mes recherches afin de décider si oui ou non cela peut aller avec badawok. ainsi que la migration des projets clefs comme comitards.be, terragusto.be ou racougree.be v2 à venir.

Tout cela m’a donné une bouffée d’air frais. Corriger, refondre, mettre en forme le code, adapter, simplifier, factoriser … que du bonheur !

L’avenir de badawok se dessine plus clairement maintenant. Je pense ajouter une installation, retirer ses dépendances vhost et .urls, ajouter un .htaccess longtemps mis de côté (.urls), ajouter dès lors un panneau d’administration de son badawok, donc aussi gérer les utilisateurs directement par badawok, même si cela semble se rapprocher du CMS, ce que la fusion BaB donnera probablement.

En parlant de fusion BaB, cela s’éclaircit également, un design de menu contextuel a été pensé, changeant de l’habitude mais qui pourrait être bien sympa, plus graphique ainsi que l’idée générale du comment cette édition contextuelle va se glisser, ce qu’elle gèrera, ce que cela va apporter, ses possibilités de développement pur (PHP, JS, CSS), et d’autres idées encore, comme la gestion AJAX du contenu vu que l’on gère ici des contenus dans un corps. Accompagné d’un require et d’un class.js le tour serait joué.

Un site badawok.net va arriver et ainsi pouvoir mettre en avant le redmine, le produit, une démo et un téléchargement ! Ceci dit cela se voudra être pour la sortie de la v7, on a encore le temps et il y a d’autres priorités malheureusement.

Comitards 2 – lancement

Comitards 2 a été lancé le 17 mars vers 22h-23h après 27h de boulot en 2 jours pour finir, débugger et migrer de la 1 à la 2.

Le samedi alors que nous annoncions déjà depuis un moment la sortie du site en date du 18 (St Torè) le premier pique de visite ‘pointe’ le bout de son nez avec +1500 vues et 900 le lendemain, puis plus rien pendant 3 jours… FAUX le script de stats n’avait pas été réactivé dans la conf…

Le pique du jeudi (après le St Torè) nous a laissé un indice, soit +1200 vues puis +1500 à nouveau le lendemain.

En même temps la 2.0.4 est sortie corrigeant les quelques petits bugs urgents.

C’est le samedi 6, quand nous avons lancé la newsletter, après avoir ajouté quelques fonctionnalités de modérations et du contenu, que le gros pique a explosé les stats avec +4000 vues pendant 2 jours (pour un nombre de visiteurs unique grandissant).

Et va savoir pourquoi mais lundi 15 bam repique de +2400 vues, sans raison apparente, ah ben si, les mails qui s’ouvrent après coup et boom seconde vague ! Le reste du temps, moyenne agréable de quelques centaines de pages vue et dizaines de visiteurs uniques, pour un site occasionnel… 🙂

Mais comitards 2, il change quoi ?

En gros la base de données a été refondue, et on a coupé 1/3 des tables refondues en un système unifié, plus flexible.

Le design a lui aussi été complètement réécrit, ainsi que les interfaces et la manière d’interagir.

Le contenu a été complété encore et encore et de nouveaux types de contenus ont été introduit comme les autocollants, les guerres, …

Un long travail, jamais fini, mais qui en cet état représente une belle évolution de sa version précédente.

Cela n’a pas été facile mais pour ceux qui nous ont envoyé (à Sophie et moi) des mails de contribution et même des remerciements, ça me fait plaisir de l’avoir fait. Aux autres qui râlent sans prendre la mesure, même si on traite leur demande, on a juste envie des les envoyer au diable avec leçons de politesse, de comprendre qu’il ne paye pas et que quelqu’un derrière fait nuit blanche pour eux…

Le lancement ne c’est pas fait que sur internet.

Effectivement nous avons pris part à la St Torè (Liège) et distribué des centaines de flyers et autocollants de penne en guise de campagne promotionnelle. Merci à ceux qui nous ont aidé !

Là tout de suite Comitards 2.0.4 c’est 1928 inscrits, 267 groupes folkloriques pour 4 pays et 6 traductions.

Ce n’est pas fini 🙂

724_g