Installation d’un second site WordPress pour mon livre Java avec le Raspberry Pi 3B

Date de la dernière modification: 11 novembre 2018

Hébergé par OVH avec une seule base de données mySQL, j’ai donc ajouté un second site WordPress, en plus d’un premier, qui était déjà en parallèle avec mon plus ancien site perso sous Joomla. Je décris ici l’installation, dont je suis assez content du résultat:

===>   Java et le Raspberry Pi 3B

Ce site est petit et compact, typique d’un site de présentation pour un sujet particulier. Il est mis en place en quelques jours et m’a permis de me remettre avec WordPress, après 7 mois de disette sur mon livre, et de découvrir d’autres options et customisations.

L’auteur, qui s’est bien amusé, acceptera volontiers des commentaires!

Pour être franc, cela a été un peu la galère. J’ai pensé bien faire en commençant sur le PC sous Wampserver64, terminer le site, l’installer chez mon hébergeur et finalement écrire cet article. J’ai bricolé un export des tables mySQL, copié le répertoire du site, et bingo cela a fonctionné … sauf: impossible de l’administrer pour des raisons de CHARSET. J’ai donc tout repris, en recommençant du début chez mon hébergeur et en copiant / collant un à un le contenu des articles et autres menus depuis le PC. Heureusement que j’ai refait ce travail: à chaque adaptation du site WordPress, j’ai complété cet article-ci. Ecrire cet article après installation, il faut oublier: il y a trop de détails et combines dans tous les sens. 


Après avoir téléchargé la dernière version de WordPress (ici wordpress-4.9.8-fr_FR.zip), la version zip est préférable, nous l’installerons chez notre hébergeur, voir sur notre PC pour jouer avec. Nous choisirons sans doute un autre répertoire que wordpress et évidemment un autre s’il existe déjà. Pour une installation sur un PC, nous utiliserons http://127.0.0.1/wpjrsp avec un sous-répertoire wpjrsp de Wampserver64, et l’URL d’installation http://127.0.0.1/wpjrsp/wp-admin/setup-config.php sera automatiquement activé. Dans la fenêtre de notre explorateur, nous aurons après avoir cliquer sur le bouton « C’est parti »:

Je ne décrirai pas comment installer mySQL avec phpMyAdmin, voir une seconde base de données, comme worpress ici, avec un interclassement utf8_unicode_ci plus adapté pour plusieurs langues. Je considère mon cas: j’ai déjà une hébergeur chez OVH, avec une seule base de données (plusieurs coûtent plus cher) et déjà une site WordPress installé: il faudra donc changer le préfixe, par exemple wp2_. L’installateur Webpress nous créera donc un second set de table, sans écraser ni le premier site Joomla, ni le premier WordPress.


Si nous avons déjà un premier site WordPress, voir un site de test sur notre PC (c’est un conseil), et après avoir vérifier l’installation avec par exemple http://127.0.0.1/wpjrsp, 

Nous commencerons par installer les extensions que nous avons besoin et que nous avons déjà utilisés. Nous ne décrirons pas ici comment éditer notre site, et ne donnerons que quelques pistes et les difficultés rencontrés.

Il est tout à fait raisonnable de commencer sur le PC et ensuite de refaire le travail sur notre hébergeur. Ce sera un excellent exercice WordPress. Sauvegarder le site et la base de données (voir une partie des tables avec l’extension wp2_) est beaucoup plus compliqué, voir presque impossible, surtout si la version du site WordPress de notre hébergeur est plus ancienne avec des DB_CHARSET différents.


Les extensions intéressantes à mon avis pour bien débuter simple:

  • Gutenberg (éditeur en développement)
  • Post Views Counter (voir identifier le nombre de lectures)

nous les avons installées et activées. Pour installer Post Views Counter nous mettrons ce terme dans le champ de recherche de la page du menu Extension / Ajouter.


Nous avons choisi et gardé le thème Twenty Sixteen actif et nous commencerons avec Apparence / Personnaliser par corriger les deux éléments du titre et les Couleurs qui nous plaisent. Nous avons choisi, sous Média de l’en-tête, de masquer l’image. A chaque opération il ne faudra pas oublier de cliquer sur le bouton Publier.

La première opération a été de purger au mieux le site tel qu’il se trouve après l’installation. Nous avons voulu quelque chose de beaucoup plus simple. Après chaque adaptation, il faudra « publier » les corrections. Avec le menu Apparence / Widgets nous avons retiré tous les articles en les supprimant des trois Colonne latéral du Blog / Pied de page 1 et Pied de page 2. Ensuite, sous Apparence / Menus nous avons retiré les pages du Menu supérieur (mais évidemment pas l’Accueil) et tous les liens du Menu des liens de réseaux …. décochant aussi la case Menu des liens de réseaux sociaux. Sous Personnalisation / Média de l’en-tête nous avons masqué l’image d’en-tête. 

Le plus délicat sans doute est d’effacer les pages successives qui sont présentées au démarrage sur la page d’accueil. Il n’est pas possible de les retirer facilement. Il faut utiliser Personnalisation / Options du thème et remplacer toutes les pages spécifier par le choix de recherche nommer –Selectionner — (j’ai mis un moment pour trouver).

Dans le menu Pages , nous sectionnerons Actions Groupées et Déplacer dans la corbeille pour toutes les pages, sauf la page d’accueil.

Il faudra ensuite, si nous le désirons, désactiver tous les commentaires: sous Réglages / Discussion.

La seconde opération est d’éditer la page d’accueil avec un nouveau titre et contenu. Juste sous le titre nous cliquerons sous classique, pour faire passer l’éditeur en mode HTML. Nous y mettrons des liens URL sans oublier l’option de lien « Ouvrir le lien dans un nouvel onglet » plus confortable pour le lecteur de nos pages (je l’ai utilisé dans toutes mes pages).

Finalement l’idée est de créer un certain nombres d’articles pour les déposer dans le menu principal en haut de la page. L’article installé Bonjour tout le monde pourra être remplacé par un nouveau titre et contenu. Dans les articles, par simplicité, surtout si nous avons une article dédié au contact, nous décocherons Autoriser les commentaires et Autoriser les notifications par ping (en utilisant modification rapide de l’éditeur des articles).


Ensuite nous ajouterons ces articles dans le menu principal en haut. Pour ce faire nous utiliserons Apparence / Menus et y déposerons nos articles que nous pourrons organiser à notre guise.

Sur un PC où le menu vient sur toute la largeur, il peut être intéressant d’y changer la couleur de fond et la police en gras. Ceci doit se faire dans le fichier style.css du thème. Ici c’est  à la ligne 3020. L’édition peut se faire avec Apparence / Editeur et il faudra se méfier. Il est aussi possible avec un outil comme CORE FTP LE de l’éditer directement après avec créer une copie de sauvegarde. L’essayer sur le PC avec un éditeur comme Notepad++ dans le répertoire du thème (par exemple D:\wamp64\www\wpjrsp\wp-content\themes\twentysixteen) sera préférable. 

.main-navigation .primary-menu,
.main-navigation .primary-menu > li {
border: 0;
/* jbb */
background-color: #ffecb3;
font-weight: bold
}

Un site sera plus joli et attractif si nous y ajoutons des images. Nous commencerons par sélectionner les 3 images installées et les effacer.
Sous Médias / Sélection de masse nous cocherons toutes les images pour les effacer.

Sous Médias / Ajouter nous choisirons des images sur notre PC pour les importer dans notre bibliothèque.

Sous Apparence / Personnaliser / Widgets / Barre latéral nous indiquerons Ajouter un Widget et Galerie. Dans Galerie nous ajouterons toutes les images de notre bibliothèque et finalement Insérer la Galerie, sans oublier un Publier tout à la fin.

En retournant dans la Galerie nous pourrons réorganiser les images et y ajouter une Légende et une Description. La légende apparaîtra sur la page d’accueil alors que la description viendra sur une page entière avec l’image en haut suivi d’un texte où il est même possible d’y ajouter des références URL, mais à la main. Ici un exemple avec un URL dont la page sera présentée dans un nouvel onglet:

<a href="https://fr.wikipedia.org/wiki/Raspberry_Pi" rel="noopener" target="_blank">Le site Wikipedia du Pi en français</a>

Améliorations

L’éditeur de texte ne nous conviendra certainement pas.
L’extension TinyMCE Advanced pourra être installée, activée et un certain nombre de boutons seront installé, comme la couleur de fond de paragraphes utilisée pour le titre ici.

Nous avons aussi introduit le Shortcode Date de la dernière modification: 11 novembre 2018 pour afficher la date de modification dans nos pages (montrant que nous sommes actifs à Google … un de ses critères).
Le code qui suit a été introduit dans la partie Fonctions du thème, functions.php, en fin de fichier, et avec Apparence / Éditeur. L’essayer sur le PC avec un éditeur comme Notepad++ dans le répertoire du thème (par exemple D:\wamp64\www\wpjrsp\wp-content\themes\twentysixteen) sera préférable. 

//JBB
// Ajout d'un shortcode pour insérer une date de dernière modification
function datedermaj_handler($atts, $content=null){
return the_modified_date( 'j F Y', 'Dernière modification: ' , $after, 0 );
}
add_shortcode( 'datemodif', 'datedermaj_handler' );

Raspberry Pi 3 – Java – Un projet conséquent

Mon nouveau livre chez Eyrolles sur Java et le Raspberry Pi 3 est presque terminé et en précommande sur Amazon. Nous y retrouverons plein d’exemples et d’exercices comme décrit ici. Vous pouvez me contacter: jean-bernard@boichat.ch

J’ai écrit une application similaire, en Java, sur mon premier Raspberry, il y a quelques années, qui marche vraiment bien. Je suis en train de l’étendre et de l’améliorer, pour mon dernier Pi 3.

Voici en quelques mots la démarche et les spécifications:

Cette application va allumer et éteindre une lampe de bureau ou un lampadaire, pour à la fois simuler une présence dans la maison et lors de déplacement de personnes en cas de basse lumière. 

Le lever et le coucher du soleil doivent être calculés suivant la saison et un certain nombre de paramètres doivent être définis. A 2 heures du matin, nous ne ferons pas de simulation, mais un déplacement de personne sera détectée.

En cas de très basse lumière (ou d’éclipse de soleil), nous aurons donc la lampe qui s’allume aussi pour nous permettre de descendre les escaliers!

Un serveur Web va nous permettre de vérifier le bon fonctionnement de la bête, de montrer les périodes actives, et d’autres valeurs comme la température au voisinage du système ou l’accès à des données extérieurs dans d’autres objets connectés.  

 

Il faudra donc un certain nombre de composants que je poserai sur une platine de test et vérifierai avec des scripts Python avant les intégrer dans le code Java:

– Un relais 220V pour la lampe
– Un senseur de mouvement
– Un senseur de lumière
– Un senseur de température
– Une LED d’alarme ou d’indication
– Un buzzer (avertisseur sonore) 

 

Pour le relais 5/220V et le buzzer, j’ai reçu de Chine des composants dont j’ai eu des difficultés à retrouver les schémas et spécifications. Afin de ne pas endommager mon Raspberry, j’ai commencé par les tester sur mon vieux Arduino Duemilanove.

L’application (a été) et est développée sous Eclipse Oxygen et fonctionne sous Windows en simulant les composants hardware ou autres mouvements.

 
 public SystemControl() { 
   if (System.getProperty("os.name").startsWith("Windows")) {
      System.out.println("SystemControl - We are on Windows ");
    
      withPrint = true;    //Message de déroulement du programme
      isTarget  = false;   //Identifie si on se trouve sur le Pi 3
   } 
 }

 

Je ne suis pas certain que je vais déposer ici tout mon matériel, car je n’aime pas trop montrer du code pas trop propre! Et cette application est plus que conséquente.

Chaque fois qu’une classe peut être testée séparément, c’est un plus d’y ajouter une entrée main(). Nous pourrons donc la tester séparément. Ici la classe ConfigParam qui va lire nos paramètres du fichier config.txt:
 

 import java.io.BufferedReader;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.HashMap;
 import java.util.Map;

public class ConfigParam {
  private String paramFile = null;
  private boolean withPrint = false;

private Map<String, String> configParamMap = null;

public ConfigParam(String paramFile, boolean withPrint) {
  this.paramFile = paramFile;
  this.withPrint = withPrint;

  configParamMap = new HashMap<String, String>();
 }

/**
 * Read the configuration parameters for the SystemControl application
 *
 * @return 0 (ok) or different error cases
 */
 public boolean readConfig() {
   BufferedReader br = null;
   try {
     br = new BufferedReader(new FileReader(paramFile));
   }
   catch (FileNotFoundException e) {
     if (withPrint) {
       System.out.println("File " + paramFile + " does not exist");
       System.exit(-1);
     }

     return false;
   }

   String line = null;
   for (;;) {
     try {
       line = br.readLine();
     }
     catch (IOException e) {
       break;
    
   }

   if (line == null) {
     break;
   }

   line = line.replace("\t"," "); //No tabs
   line = line.replace(" ",""); //No spaces at all

   int indexSep = line.indexOf('=');
   int indexSemiCol = line.indexOf(';'); //Position of the comment if any

   if ((indexSep > 0) && (indexSemiCol > 0)) {
     String key = line.substring(0, indexSep);
     String value = line.substring(indexSep + 1, indexSemiCol);
     configParamMap.put(key, value);
   }

   //In this way line without parameters are ignored (doc or other info)
 }

 try {
   br.close();
 }
 catch (IOException e) {
   return false;
 }

 if (configParamMap.size() == 0) {
   if (withPrint) {
     System.out.println("File " + paramFile + " is empty");
   }
   return false; //Empty file
 }

   return true;
 }

public int getInt(String parameter) {
  String value = (String)configParamMap.get(parameter);
  if (value == null) {
    return -2; //No such parameter
  }

  try {
    return Integer.parseInt(value);
  }
  catch(Exception e) {
    return -3; //Invalid value
  }
 }

 public String getString(String parameter) {
  String value = (String)configParamMap.get(parameter);
  return value; //Null if not exist
 }

 public boolean getBoolean(String parameter) {
   String value = (String)configParamMap.get(parameter);
   if (value == null) {
     return false;
   }

   if (value.toLowerCase().compareTo("true") == 0) {
     return true;
   }

   return false;
 }

/**
 * Change the value in one parameter
 *
 * @param parameter
 * @param value
 */
 public void setValue(String parameter, String value) {
   for (Map.Entry<String, String> entry : configParamMap.entrySet()) {
     if (entry.getKey().compareTo(parameter) == 0) {
       entry.setValue(value); //In the map
       break;
     }
   }
 }

public boolean saveConfig() {
  StringBuffer strBuf = new StringBuffer();

  BufferedReader br = null;
  try {
    br = new BufferedReader(new FileReader(paramFile));
  }
  catch (FileNotFoundException e) {
    if (withPrint) {
       System.out.println("File " + paramFile + " does not exist");
    }

   return false;
 }

 String line = null;
 for (;;) {
   try {
     line = br.readLine();
   }
   catch (IOException e) {
     break;
 }

 if (line == null) {
   break;
 }

 int indexSemiCol = line.indexOf('='); //Position of the comment if any
 if (indexSemiCol > 0) {
   String key = line.substring(0, indexSemiCol).trim(); //The parameter
   String value = (String)configParamMap.get(key); //The value change at runtime

   String comment = line.substring(line.indexOf(';') + 1);

   String firstPart = key + "=" + value;
   strBuf.append(firstPart);

   for (int i = firstPart.length(); i < 25; i++) {
     strBuf.append(" ");
   }

   strBuf.append(";" + comment + "\n");
 }

 //In this way line without parameters are ignored (doc or other info)
 }

 try {
   br.close();
 }
 catch (IOException e) {
   return false;
 }

PrintWriter out;
 try {
   out = new PrintWriter(paramFile);
 }
 catch (FileNotFoundException e) {
   return false;
 }

 out.println(strBuf);
 out.close();

 return true;
}

public Map<String, String> getParamMap() {
  return configParamMap;
}

public static void main(String[] args) {
  ConfigParam cfgPara = new ConfigParam("config.txt", true);
  cfgPara.readConfig();

  Map<String, String> theConfigParamMap = cfgPara.getParamMap();
  theConfigParamMap.forEach((k,v)->System.out.println("Param: " + k + " \tValue : " + v));
 }
}

 
Et voici le résultat:

Param: delaySunset 	 Value : 30
Param: afterSunset 	 Value : 22:40
Param: urlBbbLightSensor Value : http://192.168.1.61:8001/lightsync
Param: bbbSensorLevel 	 Value : 3900
Param: beforeSunrise 	 Value : 07:12
Param: delaySunrise 	 Value : 15
Param: withPrint 	 Value : false
Param: onPeriod 	 Value : 300
Param: offPeriod 	 Value : 60
Param: mouvementDelay 	 Value : 91
Param: t1DS1820file 	 Value : w1_slave

Je vais rapidement expliquer ces paramètres et leurs impacts sur le programme.

A suivre …. 

Le Pi4J sur un Raspberry Pi 3

Mon nouveau livre chez Eyrolles sur Java et le Raspberry Pi 3 est presque terminé et en précommande sur Amazon. Nous y retrouverons l’installation du Pi4J comme ici, et le développement d’application Java sous Eclipse, après vérification avec des scripts Python. Vous pouvez me contacter: jean-bernard@boichat.ch

Le logiciel Pi4J permet de gérer en Java le port GPIO du Raspberry Pi et il faut l’installer (ici la description sur le site du projet du Pi4J).

Dans la version du Raspbian du 2017-11-29 que j’ai installée, le Java 8 est présent.
J’ai eu pas mal de soucis et j’ai dû consulter quelques ressources, en particulier sur https://www.raspberrypi.org/. Je n’ai pas voulu me prendre la tête, ni avec les BCM2835 – expecting BCM2708 or BCM2709, ni avec les développeurs du Raspbian et ceux du Pi4J, qui ne semblent pas trop suivre une même direction en compilant différemment leurs librairies.
Mon java -Dpi4j.linking=dynamic qui fonctionne m’a suffit.

Installation

Dans une console LXTerminal de Raspbian:

sudo apt-get update
sudo apt-get upgrade

curl -s get.pi4j.com | sudo bash
sudo /opt/pi4j/examples/build pour compiler le 66 exemples.

Attention! A cause des incompatibilités de versions ou de Kernel, il faut utiliser:
java -Dpi4j.linking=dynamic

Dans le répertoire /opt/pi4j/examples/ la commande
sudo java -Dpi4j.linking=dynamic -classpath.:/opt/pi4j/lib/’*’ BlinkGpioExample 
fera le travail: nous montrer que le Pi4J est bien installé et fonctionne.
Cet exemple ne nécessite aucun montage sur le port GPIO: la LED verte qui clignote avec cet exemple se trouve sur la carte, à côté de la LED rouge de l’alimentation.

Comme cela fonctionnait comme un charme, j’ai pris le temps de faire une sauvegarde de l’image! 

Raspberry Pi 3 – Les outils Windows essentiels

Mon nouveau livre chez Eyrolles sur Java et le Raspberry Pi 3 est presque terminé et en précommande sur Amazon. Nous y retrouverons tous les outils décrits ici.
Vous pouvez me contacter: jean-bernard@boichat.ch

Quelques outils sont essentiels afin de « manager » correctement un Raspberry Pi.

Win32 Disk Imager

Nous pourrons télécharger Win32 Disk Imager sur Sourceforge et l’installer sur son PC. Nous le retrouverons sous le nom d’Image Writer

Sa première utilisation sera pour sauvegarder une image. Un nom contenant la date et un fichier texte séparé avec une description pourra nous aider par la suite.
Nous sélectionnerons le lecteur et un nom de fichier dans un répertoire distinctif. En cliquant sur le bouton « Lire » il faudra patienter. 

Lorsque l’écriture est terminée, c’est avantageux de le zipper, car c’est un gros fichier!
J’utilise moi-même 7Zip (version msi conseillée) et le fichier de 32 Goctets passera à 3Go!

Avant d’installer et d’utiliser Putty et WinScp il faut d’abord activer le SSH sur le Rasperry Pi.
Sur le Pi 3 nous irons sur le menu Préférence, Configuration du Pi, et Interface.
Nous activerons le SSH,  le validerons et changerons le mot de passe.


Putty

Nous pourrons télécharger putty depuis http://www.putty.org/.

Pour se connecter, nous utiliserons l’adresse IP du Rasperry Pi, le port 22 et le mode SSH.
Cela nous permettra d’avoir une console à disposition sans avoir besoin d’un écran. C’est particulièrement pratique en mode WiFi.

WinScp

Nous pourrons télécharger WinScp depuis https://winscp.net/eng/download.php.

Pour se connecter, c’est pareil à Putty. Nous utiliserons le protocole SFTP et le port 22.
Cela nous permettra de transférer des fichiers, comme par exemple des classes Java compilées et voir même testées sur un PC dans un environnement Eclipse (cool).

Installation du logiciel sur un Raspberry Pi 3

Mon nouveau livre chez Eyrolles sur Java et le Raspberry Pi 3 est presque terminé et en précommande sur Amazon. Nous y retrouverons l’installation du Raspberry Pi 3 comme ici, ainsi qu’une version sans écran, ni clavier ou souris. Les sauvegardes et récupérations y sont aussi décrites. Vous pouvez me contacter: jean-bernard@boichat.ch

Raspberry Pi 3 – Achat, installation et premier démarrage

J’ai acheté un set avec :

  • un Rasperry Pi 3 B;
  • un bloc d’alimentation;
  • et un boîtier.

J’avais aussi commandé une micro carte 32 Gbytes Evo Plus de Samsung, après avoir consulté Internet, pour vérifier si certaines cartes pouvaient créer des problèmes. 

Je possède un adaptateur USB3.0 qui m’a permis d’y insérer la micro carte. Le logiciel de SD Association, SD Card Formatter téléchargé et installé sur mon PC depuis https://www.sdcard.org/downloads/formatter_4/, m’a permis de formater ma micro carte.
J’ai alors effectué un Quick Format (FAT 32).

J’ai ensuite téléchargé Noobs, l’outil d’installation, depuis https://www.raspberrypi.org/documentation/installation/noobs.md. Je l’ai dé-zippé dans mon répertoire D:\RaspberryPi3\NOOBS_v2_4_5 et copié ensuite sur ma micro carte.

J’ai finalement « éjecté » la micro carte et l’ai introduite sous mon Raspberry Pi 3 branché ainsi:

  • un câble HDMI sur mon moniteur
  • une souris USB
  • un clavier USB
  • un câble Ethernet pour accéder mon réseau (le WiFi, après configuration, va aussi)
  • le bloc d’alimentation du set.

J’ai enfin démarré la bête en branchant le chargeur. En quelques instant, j’avais l’image que l’on voit sur https://www.raspberrypi.org/documentation/installation/noobs.md, et pour la version téléchargée v2.4.5 (released on 29th November 2017), c’est à dire le logiciel pour poursuivre l’installation du système d’exploitation.

J’ai choisi l’installation Raspbian, la langue française, le clavier (ch pour moi), et cliqué sur le bouton en haut à gauche « Installer ». J’ai eu le temps de me préparer un café!
Après l’installation, nous aurons un redémarrage automatique et un joli look après avoir activé une console et le menu Programmation:

Quand j’ai eu terminé cette première installation, je me suis amusé à installer WordPress, juste pour jouer. J’ai eu pas mal de petits problèmes avec la partie PHP, mais cela a fonctionné (joli). Ensuite, j’ai voulu installer le Pi4J et plus rien n’a fonctionné (mon phpMyAdmin mort). Grrr!

Donc, j’ai tout recommencé, vérifié le Pi4J, compilé les exemples et vérifié celui du led qui clignote sur la carte. Alors j’ai fait une première sauvegarde avec Win32 Disk Imager.

Sur l’image ci-dessus, nous devinons une commande ifconfig dans une console LXTerminal, qui nous permet d’identifier l’adresse IP du Rasperry Pi que nous pourrons:

Dès que les outils Putty et WinScp seront installés, suivant ce que nous allons faire avec notre « bête », nous n’aurons plus besoin ni d’écran, ni de clavier, ni de souris, ni d’écran HDMI et ni de câble Ethernet (nous travaillerons alors en mode Wifi). Pour stopper correctement le Raspberry Pi,  il faudra alors entrer la commande « sudo halt » dans la console Putty.