Angular2 & Spring boot en mode RESTful

A installer Mysql, Spring Tool Suite 3, Java 1.8 minimun, Visual Studio Code 14 avec plugin Debugger fro chrome, le navigateur chrome , node.js 12

 

Etape 1/ utilisation de Spring Initializr

Allez sur https://start.spring.io/ pour fabriquer le fichier de configuration des jars compatibles pour réaliser nos actions.

Spring Start pour configuration automatique

Télécharger le projet au format zip et le placer dans le workspace

Importer le projet dans l’outil Spring Tool Suite™ 3 avec une version d’eclipse spécialement configuré pour Spring.

 

 

 

Etape 2/ Utilisation de Maven

Le projet est importé, exécution sur le projet Maven > Run > Maven install :

Mais erreur de configuration du JDK dans la console:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project todo: Compilation failure
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

Ajout donc du JDK pour le projet, clic droit sur le Projet > Build Path > Configure Build Path >

Puis Onglet Library : choisir le JRE System puis bouton « Edit … »

Puis dans la nouvelle fenêtre choisir « Installed JRE »

Dans la nouvelle fenêtre faire « Add… », dans la nouvelle fenêtre faire « Standard VM » puis « Next » et indiquer le chemin du JDK sur votre ordinateur dans le champ « JRE Home » puis si le JDK indiqué est valide alors le bouton « Finish » ramène à la fenêtre précédente…

Validez le JDK installé par défaut en cochant la case à gauche comme sur cette copie d’écran:

Fermer les fenêtres avec « Apply and close » puis vérifier que le « bon » JDK est indiqué sur cette dernière fenêtre avant de faire « Finish »:

Eclipse maven run maven install

Relancer mais maintenant problème du JPA et de la base de données:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Si le déploiement de Spring ne fonctionne pas, il faut vérigier que le fichier application.properties existe bien. Sinon le copier coller depuis l’étape 5

 

 

Etape 3/ Fabrication d’une classe Todo entity et configuration BD

Faire une classe Todo dans le projet en ajoutant les getter et setter, constructor, toString, equals et hashcode :

package fr.ema.lgi2p.m2.todo;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Todo {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String texte;
private Boolean actif;

}

Maintenant on doit créer une base de données avec un utilisateur de BD pour ce projet, dans mysql avec phpmyadmin, faite la création d’un utilisation/MDP ayant tout les droits sur une base de données. Dans mon exemple, ces 2 valeurs seront todo.

PhpMyadmin configuration utilisateur et base de données

NOTA: Erreur suivante:

The server time zone value 'Paris, Madrid' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

fichier Application Version 0.1

Cela vient d’une veille configuration de mon serveur mysql qui a une TimeZone double, pour corriger, soit il faut changer le réglage dans le fichier de configuration de Mysql mais j’ai trouvé plus simple en forçant dans la connexion JDBC la TimeZone:

spring.datasource.url=jdbc:mysql://localhost:3306/todo?zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC

Une dernière exécution du projet Maven > Run > Maven install puis il faut exécuter la classe principale TodoApplication via clic droit Run > Java Application et accéder au service via un navigateur en allant sur http://127.0.0.1:8080/

Run As TodoApplication

Vous pouvez vérifier que pour l’instant aucune entité n’a été créé dans la base de données.

NOTA: il faut ajouter la dépendance suivante dans le fichier pom.xml

<dependency>
<groupId>org.threeten</groupId>
<artifactId>threetenbp</artifactId>
<version>1.3.3</version>
</dependency>

Etape 4/ Fabrication d’une classe Controleur RESTful

Créer une nouvelle Classe TodoControleur:

Spring class TodoControleur

Avec ce code qui permet de déclarer qu’une méthode est accéssible via cette URL :

package fr.ema.lgi2p.m2.todo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TodoControleur {

@RequestMapping(value="/todos", method=RequestMethod.GET)
public String listeTodos() {
return "{todos:[]}";
}

}

Testé l’appel via l’URL : http://127.0.0.1:8080/todos

Ajoutons une méthode pour créer un todo qui aura comme texte un identifiant passé

 @RequestMapping(value = "/todo/{id}", method = RequestMethod.GET)
public Todo getTodo(@PathVariable int id) {
Todo todo = new Todo( "todo-" +id , false );

return todo; 
}

Appelons l’URL via : http://127.0.0.1:8080/todo/100

Etape 5/ Utilisation d’Hibernate au lieu de JPA pour voir un peu de code

On pourrait utiliser la couche JPA générique de Spring mais vu que nous avons une connaissance d’Hiberante et pour voir l’enchainement des opération, nous allons désactiver le JPA pour exploiter Hibernate à la place.

En premier lieu il faut configurer le fichier application.properties se trouvant dans le dossier src/main/ressources

# ===============================
# DATABASE
# ===============================

#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/todo?zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC
spring.datasource.username=todo
spring.datasource.password=todo



# ===============================
# JPA / HIBERNATE
# ===============================

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext

Voici la nouvelle version de la classe TodoApplication:

package fr.ema.lgi2p.m2.todo;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;

import java.util.Properties;

import javax.sql.DataSource;

@SpringBootApplication
@EnableAutoConfiguration(exclude = { //
DataSourceAutoConfiguration.class, //
DataSourceTransactionManagerAutoConfiguration.class, //
HibernateJpaAutoConfiguration.class })
public class TodoApplication {

@Autowired
private Environment env;

public static void main(String[] args) {
SpringApplication.run(TodoApplication.class, args);
}

@Bean(name = "dataSource")
public DataSource getDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();

// See: application.properties
dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));

System.out.println("## getDataSource: " + dataSource);

return dataSource;
}

@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) throws Exception {
Properties properties = new Properties();

// See: application.properties
properties.put("hibernate.dialect", env.getProperty("spring.jpa.properties.hibernate.dialect"));
properties.put("hibernate.hbm2ddl.auto", "update");
properties.put("hibernate.show_sql", env.getProperty("spring.jpa.show-sql"));
properties.put("current_session_context_class", //
env.getProperty("spring.jpa.properties.hibernate.current_session_context_class"));

LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();

// Package contain entity classes
factoryBean.setPackagesToScan(new String[] { "" });
factoryBean.setDataSource(dataSource);
factoryBean.setHibernateProperties(properties);
factoryBean.afterPropertiesSet();
//
SessionFactory sf = factoryBean.getObject();
System.out.println("## getSessionFactory: " + sf);
return sf;
}

@Autowired
@Bean(name = "transactionManager")
public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);

return transactionManager;
}


}

Cette nouvelle version permet de déconnecter les méthodes classiques du JPA pour appeler une nouvelle classe TodoDao qui va assure les opérations classiques de persistence:

package fr.ema.lgi2p.m2.todo;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional
public class TodoDao {

@Autowired
private SessionFactory sessionFactory;

public List<Todo> listTodo() {
Session session = this.sessionFactory.getCurrentSession();
Query<Todo> query = session.createQuery("From Todo", Todo.class);
return query.getResultList();
}

public Todo newTodo(Todo newTodo) {
Session session = this.sessionFactory.getCurrentSession();
session.save(newTodo);

return newTodo;
}


}

 

Modification de la classe TodoControleur pour utiliser la classe TodoDao:

 @Autowired
private TodoDao todoDao;

 @RequestMapping(value = "/todo/{id}", method = RequestMethod.GET)
public Todo getTodo(@PathVariable int id) {
Todo todo = new Todo("todo-" + id, false);
todoDao.newTodo(todo);
return todo;
}

Maintenant l’appel à l’URL suivante : http://127.0.0.1:8080/todo/100 fabrique un nouveau todo et le fait persister.

 

Etape 6/ Static content pour Spring boot

Création d’un dossier src/main/ressources/static pour le contenu static du service qui va contenir les développements en AngularJs.

Création d’une classe IndexController qui va envoyé le contenu de index.html

package fr.ema.lgi2p.m2.todo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class IndexController {
@RequestMapping("/")
public String welcome() {
  return "index.html";
}
}

Puis création d’un nouveau dossier src/main/ressources/static/img y placer des images et ajouter le code ci-dessous à la classe TodoApplication pour autoriser le contenu statique dans ce dossier:

 public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/img/**")
.addResourceLocations("classpath:/img/");
}

 

Etape 7/ Utilisation d’angular avec l’IDE en ligne

Appel à l’IDE proposé par Angular  https://angular.io/generated/live-examples/getting-started-v0/stackblitz.html

NOTA : cet IDE ne fonctionne pas avec Firefox, je recommande de l’utiliser avec Chrome

 

installation de NodeJS

npm install -g @angular/cli

 

Update npm on ne sait jamais (et update de nodejs peut être aussi?)

npm i npm

 

Création du projet todo dans un dossier d’un workspace dédié aux projet node-js/angularjs

ng new todo

 

Copier le dossier src téléchargés depuis le site https://angular.io/generated/live-examples/getting-started-v0/stackblitz.html dans le dossier src du projet todo en remplaçant tout le contenu.

Créer les fichiers finaux d’angularjs dans le dossier du projet spring boot et plus précisement dans le dossier ressources/static/:

ng build todo --prod  --outputPath=C:\DEV\workspace-spring\todo\src\main\resources\static

Déploiement ensuite classiquement du projet spring boot pour tester

Etape 8/ Utilisation d’angular avec l’IDE ou sans IDE

 

Debug et test du front avec création du fichier sourceMap

ng serve --sourceMap=true

Attention pour tester en local ces fichiers il faut vérifeir le fichier index.html dans le dossier dist\todo\ et corriger la balise <basehref= »/ » /> avec une URL valide. Heureusement dans notre déploiement avec spring notre application est à la racine.

Pour utiliser les fichiers finaux dans le déploiement, il suffit de copier les fichiers du dossier dist/todo/ dans le dossier src/main/ressources/static/ et appelr l’URL http://127.0.0.1:8080/

Debug avec chrome:

Il faut démarrer chrome en mode debug avec cette ligne de commande pour lancer chrome avec les outils de développement et le port d’écoute 9222 et ouvrir l’URL http://127.0.0.1:4200/

C:\Users\pierre.jean\AppData\Local\Chromium\Application\chrome.exe --auto-open-devtools-for-tabs --remote-debugging-port=9222 -incognito http://127.0.0.1:4200/

 

Pour lancer depuis Visual Code voici le fichier de configuration de launch.json:

{
    // Utilisez IntelliSense pour en savoir plus sur les attributs possibles.
    // Pointez pour afficher la description des attributs existants.
    // Pour plus d'informations, visitez : https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Chrome Launch",
            "type": "chrome",
            "request": "update",
            "runtimeExecutable":"C:/Users/pierre.jean/AppData/Local/Chromium/Application/chrome.exe",
            "runtimeArgs": [
                "--new-window",                
                "--remote-debugging-port=9222"            
              ],
            "port": 9222,
            "sourceMaps": true,
            "url": "http://localhost:4200/",
            "webRoot": "${workspaceFolder}",
            "sourceMapPathOverrides": {      
                "webpack:///./*":"${workspaceRoot}\\*" 
              }
          } 
    ]
}

 

 

NOTA ERREUR:

Error: Could not find module « @angular-devkit/build-angular »
npm update
npm install –save-dev @angular-devkit/build-angular

npm install -g @angular/cli

npm install -g @angular-devkit/build-angular

 

 

 

Publié dans IMT Mines Alès | Laisser un commentaire

git sourcesup

https://sourcesup.renater.fr/account/
Mettre un mot de passe du compte unix
Vérifier le mot de passe: https://sourcesup.renater.fr/account/change_pw.php

Trouver l’URL
URL : https://pierre.jean@git.renater.fr/authscm/pierre.jean/git/rearm/rearm.git cf copie d’écran en dessous pour le trouver
login UNIX pierre.jean
le BON MDP de SOurcesup

Ouvrir GitHub Desktop, faire clone a repository du smart https
https://pierre.jean@git.renater.fr/authscm/pierre.jean/git/rearm/rearm.git

—–
Ne fonctionne plus ?

Commande
git init

git clone ssh://git@git.renater.fr:2222/nom_projet.git

git clone https://pierre.jean@git.renater.fr/authscm/pierre.jean/git/rearm/rearm.git

Ouvre fenêtre authentification pour cloner sauf…

git config –global user.email « pierre.jean@mines-ales.fr »
git config –global user.name « pierre.jean »
git add rearm
git commit -m « Message de validation »

Publié dans Développement | Laisser un commentaire

Accès manager-gui via Tomcat 8.5 dans Docker

Suite à l’installation de Tomcat 8.5 dans docker, je n’ai pas trouvé simplement comment accéder à l’interface de déploiement web dans Tomcat.

Il faut donc modifier les fichiers suivants:

/usr/local/tomcat/conf/tomcat-users.xml:

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin" password="password" roles="manager-gui,manager-script" />

Puis aller dans les réglages de l’application manager dans /usr/local/tomcat/webapps/manager/META-INF/context.xml et modifier le tag suivant :

 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />

Par ceci:

 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="\d+\.\d+\.\d+.\d+|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />

Merci à cet article :

https://stackoverflow.com/questions/42692206/docker-tomcat-users-configuration-not-working

 

 

 

 

 

Publié dans Développement | Laisser un commentaire

gvim et vimrc

Habituellement je n’utilise que la ligne suivante dans mon fichier vimrc qui gère la configuration par défaut de mon gvim/vim :

colorscheme slate

Juste le changement du thème et donc des couleurs par défaut de Gvim en choisissant un thème prédéfini.

J’avais besoin de disposer d’un Gvim ouvert au centre de mon écran de taille plutôt réduite déjà en mode édition avec un fichier vide par défaut. Du coup, j’ai installé le plugin wimproved.vim. Ce plugin a installer simplement, le fichier wimproved32.dll dans le dossier principal de vim, dans le dossier autoload le fichier autoload/wimproved.vim et dans le dossier plugin le fichier plugin/wimproved.vim.

Ensuite il faut configurer le fichier vimrc :

" Simplifier l'interface de gvim en retirant le menu et les icones
autocmd GUIEnter * silent! WToggleClean
" Centrer gvim avec une taille de 30% de l'écran
autocmd GUIEnter * silent! WCenter 30
" Degré de transparence de l'interface sur 255 niveau
autocmd GUIEnter * silent! WSetAlpha 220
" Couleur du thème
colorscheme slate

" test si c'est l'édition d'un nouveau fichier ou d'un fichier existant
" ces réglages ne sont appliqués qu'au nouveau fichier pas aux fichiers en éditon 
if argc()==0

  " cache les symboles ~ qui indiquent des lignes non existente
  hi NonText guifg=bg
  " fait une insertion vide par défaut pour retirer le message d'introduction 
  normal i 
  " mode insertion au lieu d'être mode commande comme habituellement
  start
endif


 

Vi / VIM / Gvim sont des outils très pratiques car disponiblent sur toutes les plateformes et les systèmes d’exploitations. Ils gèrent un nombre important type de format et ouvrent même des fichiers de tailles énormes sans sourciller. Je sais que l’apprentissage sur cet outil est compliqué (mode commande <-> mode édition) mais les manipulations de types expressions régulières et les plugins additionnels en font un outil extraordinaire.

Efface les lignes avec le mot profile quelque part:

:g/profile/d

Efface les lignes ne contenant par le mot profile quelque part:

:g!/profile/d

 

 

Publié dans Développement | Laisser un commentaire

Protégé : Tp4 IMT Mines Développement Web

Cette publication est protégée par un mot de passe. Pour la voir, veuillez saisir votre mot de passe ci-dessous :

Publié dans IMT Mines Alès | Commentaires fermés sur Protégé : Tp4 IMT Mines Développement Web

Résultat du sondage de Stackoverflow 2017 et Infographie de Chooseyourboss 2018

Le sondage 2017 du site web de support informatique stackoverflow vient de sortir. Le sondage est très/trop complet notamment sur des questions hors du domaine du développement (le développeur a t’il des enfants par exemple). Vous pouvez le trouver à cette URL.

Je sors quelques points que je trouve intéressant et donc ce n’est que mon regard personnel sur ce sondage, chacun est libre d’en sortir ses propres impressions.

Et blog de Choose Your Boss a ajouté une infographie pour 2018

 

 

Comment se définit le développeur:

Finalement on peut dire que les sondés sont globalement des développeurs qui font un peu de tout en Front/Back/Full, finalement c’est le « Desktop or entreprise applications » qui montre bien que ce type de développement est assez faible sur ce site. Peut être que les développeurs de ce genre d’applications sont expérimentés et n’ont plus besoin de poser des questions.

 

La bataille des IDEs:

Le Visual Studio payant et gratuit semble enfoncé les autres, le trio des éditeurs Sublime Text/Vim/Notepad++ semble être très utilisé au final, le reste est très classique au final.

Les langages des développeurs:

Beaucoup de développement web en Front, donc JS+HTML+CSS sontles premier. On trouve les inaltérables SQL/Shell en plus. La tendance reste Java/Python/C#/PHP/C++/C.  J’ai indiqué les langages ayant plus de 10%, vous trouverez surement votre langage dans le sondage.

 

Les Framework des développeurs:

Node.js / Angular /react indique bien que le développement des solutions javascript a le vent en poupe. Ce qui est surprenant encore c’est le .Net Core qui est très important, une information que je n’avais pas personnellement.

Base de données utilisées

 

La seconde place de SQL Server est pour moi une surprise, le reste me parait assez classique comme représentation.

Les plateformes cible des développeurs:

Attention, ce n’est pas avec quel OS ils développent, il y a une réponse spécifique sur ce point. On voit bien que le classique c’est Linux/Windows, un peu d’android, de cluster AWS, Mac OS. Rasberry Pi et WordPress sont présentés comme des cibles cela indique bien la force de leur spécificité.

 

Les regroupement  des technologies pour les développeurs:

Très utile cela indique bien les liaisons outils/technologies/plateformes pour comprendre qu’elles sont les compétences liées.

 

 

Publié dans Développement | Laisser un commentaire

Duplicator et Debug WordPress avec Eclipse PDT

Objectif: configuration de wordpress (duplicator ou fresh install) opérationnelle avec un debug dans Eclipse PDT

Etape 1 : Configuration d’EasyPhp/Wamp/Mamp

Pour activer le debuggeur xdebug dans les outils de développement, la toute première étape est de localiser le « bon » fichier php.ini. En effet, votre ordinateur peut contenir plusieurs fichiers php.ini dans différents dossier pour gérer un PHP en version de test, en version de production, en sauvegarde ou un fichier php.ini si vous écrivez du PHP en utilisation en mode CLI (CLI=client).

Etape 1.1: Localiser et Ouvrir le fichier php.ini

Pour localiser le fichier php.ini actif, il faut soit créer un fichier phpinfo.php à la racine du DocumentRoot d’apache contenant le code suivant:

<?php phpinfo(); ?>

Ouvrir la page correspondante dans le navigateur via par exemple l’URL: http://127.0.0.1/phpinfo.php

Vous pouvez trouver l’URL de votre serveur local apache par défaut en cherchant sur internet Mamp phpinfo car souvent cette page phpinfo.php existe par défaut.

Vous obtenez l’ensemble des réglages du PHP dans Apache et surtout le « bon » fichier php.ini:

 

Maintenant, regardons si le xdebug est activé, si on trouve l’information « with Xdebug » comme dans l’image ci-dessous:

Information que xdebug est actif dans la page phpinfo

Pour activer le xdebug s’il n’est pas activé, il faut donc ouvrir ce fichier pour vérifier/modifier/ajouter les lignes suivantes:

  • activer la ligne qui indique le xdebug, cette ligne ne doit pas commencer par un ; (qui indique un commentaire) mais par zend_extension
  • la ligne  zend_extension doit indiquer un fichier valide de xdebug par exemple:
    zend_extension="c:/wamp/bin/php/php5.6.2/zend_ext/php_xdebug-2-5.6-vc11-x86_64.dll"
    
    xdebug.remote_enable = on

La modification des lignes ci-dessus dans le fichier php.ini est à sauvegarder et le redémarrage d’Apache doit permettre d’activer enfin le xdebug. Pour le vérifier, ouvrez de nouveau l’URL vers le fichier phpinfo.php. Vous trouverez normalement une indication que le xdebug est bien activité et que le mode remote debug est aussi actif :

Les réglages ci-dessous peuvent être ajouté ulterieurement au fichier php.ini:

zend_extension="c:/wamp/bin/php/php5.6.2/zend_ext/php_xdebug-2-5.6-vc11-x86_64.dll"
xdebug.remote_autostart=on
xdebug.remote_enable=on
xdebug.remote_handler="dbgp"
xdebug.remote_host=127.0.0.1
;xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.remote_mode=req
xdebug.show_local_vars=1

 

Vu que vous êtes sur la page phpinfo.php, localisez aussi le dossier DocumentRoot d’Apache.

Vous trouvez pour votre serveur web apache le dossier DOCUMENT_ROOT de votre installation. NOTEZ LE C’EST UN REGLAGE IMPORTANTE. Ce dossier sera l’espace de travail (« workspace ») à indiquer à Eclipse PDT/PHP et le lieu d’installation de votre wordpress.

Habituellement c’est ce type de valeur mais cela peut varier:

  • Pour Wamp dans le dossier c:\wamp64\www
  • Pour Mamp dans le dossier /Applications/Mamp/htdocs
  • Pour EasyPhp dans c:\Programmes\EsayPhp\www

Vous pouvez le localiser avec le fichier phpinfo.php

 

Etape 1.2:Installation en local de wordpress « fresh install »

Si vous utilisez Duplicator, l’etape 1.2 correspondante est ci-dessous.

Le téléchargement des fichiers de wordpress peut être réalisé à partir de ce site Web : https://fr.wordpress.org/

Il faut dé-zipper les fichiers et les placer dans un dossier WordPress du DocumentRoot d’Apache (le dossier DocumentRoot est le dossier que voit Apache sur votre disque dur) en les copiant:

Copier-wordpress-DocumentRoot

 

Etape 1.2:Installation en local de wordpress « duplicator »

Pour Duplicator, normalement, vous disposer de 2 fichiers, 1 install.php et un fichier zip appelé package/paquet en VF.

Créer un sous dossier dans le DocumentRoot d’Apache et installer les 2 fichiers ci-dessus.

 

Etape 1.3: Création de la base de données et d’un utilisateur de la base de données WordPress

Allez sur phpmyadmin, habituellement à l’adresse http://127.0.0.1/phpmyadmin/ ou pour EasyPhp http://127.0.0.1:8887/modules/phpmyadmin3522x121112094748

Puis choisissiez l’onglet Utilisateur

phpmyad-onglet-utilisateur

Puis « Ajouter un utilisateur »

Indiquez les informations suivantes pour créer un utilisateur qui dispose de tous les droits sur une base de données (retenez les informations saisies en les notant dans un coin):

phpmyad-ajout-utilisateur

Vous avez à partir de là, une base de données, un utilisateur et un mot de passe opérationnel que vous noterez pour l’installation de WordPress

Etape 1.4: Installez WordPress

En allant sur l’adresse suivante http://127.0.0.1 vous devriez trouver le dossier wordpress et pouvoir lancer l’installation de WordPress grâce aux informations de la base de données.

Dans le cas de duplicator, les interfaces sont différents mais s’enchainent en laissant les valeurs par défaut.

Vérifier que votre wordpress est opérationnel, l’installation peut échouer parfois…

 

Etape 2 :Installation et configuration d’Eclipse PDT ou Eclipse PHP

Etape 2.1: Installation

Télécharger le fichier zip d’Eclipse depuis http://www.master-ctn.mines-ales.fr/install/windows/ ou http://www.master-ctn.mines-ales.fr/install/macos/

Dézipper le fichier dans un dossier par exemple c:\Developpement\Eclipse ou sur le bureau de votre ordinateur.

Lancer eclipse en trouvant dans ce dossier le fichier eclipse.exe.

Indiquer comme workspace à Eclipse le Dossier DOCUMENT_ROOT conservé pour cette occasion.

Etape 2.2: Réglages d’Eclipse PDT/PHP pour xdebug

Il y a plusieurs moyens de modifier les réglages d’Eclipse PDT/PHP pour que l’IDE prenne en compte le xdebug comme débuggeur par défaut. Dans certaines versions d’Eclipse PDT, le débuggeur configuré est la version payant de Zend Debugger. Il suffit souvent de désactiver ce dernier au profit de xdebug pour que cela fonctionne correctement.

Faire Menu Windows > Preferences puis ouvrir PHP > Debug dans la fenêtre des préférences puis « l’hyperlien » PHP servers… pour éditer le serveur par défaut « Default PHP Web Server ». Dans la fenêtre « Edit Server », sélectionnez l’onglet « Debugger » pour enfin choisir comme Debugger: XDebug. Finish et OK pour valider les modifications.

Nota: il est possible de trouver la liste des serveurs via Menu Windows > Preferences puis ouvrir PHP > Servers mais je trouve pratique de consulter les réglages du débugger dans PHP > Debug.

Ainsi par défaut, le réglage du serveur web par défaut est d’utiliser xdebug.

 

Etape 3: Création d’un projet PHP pour WordPress dans Eclipse PDT/PHP

Après installation de WordPress dans le DocumentRoot d’Apache dans le sous dossier WordPress, nous allons créer un projet PHP portant le même nom pour récupérer les fichiers PHP de WordPress dans Eclipse:

Faire Menu File > New > PHP Project:

File-New-Php Project

Dans la fenêtre de création d’un nouveau projet « New PHP Project » indiquer le nom du projet WordPress et l’option « Create new project in workspace », on peut vérifier que le dossier indiquer par l’interface correspond bien au dossier de l’installation de WordPress:

New-Project

L’importation d’un grand nombres de fichiers de WordPress dasn Eclipse PDT peut prendre jusqu’à quelques dizaines de minutes selon la taille du WordPress et la puissance de votre ordinateur.

WordPress contient quelques pseudo « erreurs » mal détectées par Eclipse, même si le projet est indiqué avec une petite croix rouge, il peut parfaitement fonctionner.

Etape 3.2: Création d’une configuration de Debug

Pour débugger un projet PHP, il faut en premier lieu créer une configuration de Debug, via le Menu Run > Debug Configuration …

Ou via click droit sur un programme PHP > Debug As > Debug Configurations …

Dans la nouvelle fenêtre « Debug Configurations », on peut créer une nouvelle configuration de Debug via le bouton « New Debug Configuration », indiquer un nom (un label) à cette configuration et surtout le fichier à débugger:

PS : on peut noter l’URL qui est affichée dans le bas de l’interface avec l’option « Auto Generate », si on décoche cette option, on peut ainsi modifier une partie de l’URL.

On peut vérifier que le débugger par défaut pour cette configuration est bien indiqué dans l’onglet Debugger : 

On peut laisser un point d’arrêt automatique via l’option « Break at First Line » ou au contraire vouloir laisser l’option décoché pour utiliser d’autres points d’arrêt (voir plus bas).

Etape 3.3: Lancer le Debugger

Maintenant on peut lancer le « Debugger » avec le bouton « Debug » en bas à droite.
Ce qui devrait ouvrir l’URL dans un navigateur intégré à Eclipse PDT et nous proposer de basculer dans la perspective « Debug » d’Eclipse. Il faut confirmer en indiquant que l’on souhaite qu’Eclipse PDT se souvienne de cette réponse pour éviter d’avoir cette fenêtre à chaque fois.

Cela va ouvrir la perspective « Debug » pour Eclipse PDT. Une perspective est un nouvel agencement des différentes fenêtres d’Eclipse PDT. Cette nouvelle organisation doit mettre en avant ce qui est utile au Debug: les variables, quelques dizaines de lignes de codes, si le serveur Apache est en pause sur un fichier et à quel ligne et dans un coin le navigateur intégré d’Eclipse PDT:

Dans l’exemple ci-dessus, le debugger s’est automatiquement mis en pause sur la première ligne de PHP (cf le choix « Break at First Line » est actif dans la Configuration de Debug plus haut).

Pour contrôler l’exécution du programme PHP en mode debug, soit d’exécuter ligne par ligne le programme PHP, on peut utiliser la barre de menu suivante:

  1. Le bouton 1 permet d’activer/désactiver tous les points d’arrêts
  2. Le bouton 2 permet de faire exécuter toutes les lignes de PHP jusqu’au prochain point d’arrêt, si il n’y a plus de point d’arrêt exécute jusqu’à la fin le programme
  3. Le bouton 3 permet d’arrêt la session de debug sans obtenir de résultat
  4. Le bouton 4 permet de débugger en entrant dans les fonctions PHP
  5. Le bouton 5 permet de débugger en exécutant les fonctions PHP sans entrer dedans

Etape 3.4: Les points d’arrêts

Quand on debugger, ce qui est souvent utile  de faire exécuter le programme PHP depuis le début, autrement-dit depuis le lancement du programme PHP, jusqu’à un endroit critique du programme PHP.

On place donc habituellement un point d’arrêt sur une ligne de code juste avant l’ensemble des lignes qui sont à débugger.

La session de Débug démarre, puis on utilise le bouton 2 (Resume ou touche F8) qui déclenche l’exécution du programme PHP jusqu’au premier point d’arrêt. Puis arrivé sur les lignes de code problématiques, on utilise les boutons 4 (Step Into ou touche F5) et 5 (Step Over F6) pour exécuter ligne à ligne, un peu à la manière d’un ralenti.

Une fois les lignes problématiques passées, nous exécutons le reste du programme avec le bouton 2 (Resume ou touche F8) pour obtenir l’affichage de la page dans le navigateur.

Etape 3.5: Relancer le Debug

Une fois la session de debug terminée, on peut relancer le Debug via clic droit > Run As > PHP Web Application

Attention, Eclipse PDT n’accepte d’avoir qu’une seule session de debug, si votre session n’est pas terminée, vous pouvez l’arrêter via le bouton 3 (Terminate ou touche CTRL+F2).

On peut par contre debugger plusieurs pages dans la session de débug, en appelant de nouvelles pages sur le même projet PHP. On peut aussi utiliser un navigateur extérieur pour voir la session de Debug dans Firefox/Chrome ou tout autre navigateur.

 

Etape 3.6: Mettre un point d’arrêt dans le code

Jusque là on lance le debug de tout WordPress mais on pourrait avoir envie de n’avoir le debugger que dans une certaine partie du code par exemple dans les pages du template.

On peut mettre un point d’arrêt (breakpoint en VO) en cliquant « en face » de la ligne que l’on souhaite debugger, un cercle va apparaitre à gauche du numéro de ligne pour indiquer que l’on a un point d’arrêt. Pour retirer un point d’arrêt re-cliquer dessus.

Eclipse-breakpoint

Il peut être utile par exemple d’aller mettre un point d’arrêt en face d’une des pages de template pour vérifier l’enchainement des opérations fabriquant le HTML.

Nous utiliserons cette solution dans le template enfant plus bas dans l’exercice.

Etape 3.7: WordPress mode debug

Modifier le fichier wp_config.php pour avoir définir ces 2 variables pour afficher les erreurs

// Active le mode WP_DEBUG 
define( 'WP_DEBUG', true );

// Création du fichier logging dans le fichier /wp-content/debug.log 
define( 'WP_DEBUG_LOG', true );

// Disable display of errors and warnings 
define( 'WP_DEBUG_DISPLAY', true );
@ini_set( 'display_errors', 0 );

// Use dev versions of core JS and CSS files (only needed if you are modifying these core files)
define( 'SCRIPT_DEBUG', true );

// Affiche les requêtes SQL
define( 'SAVEQUERIES', true );

 

WP_DEBUG_DISPLAY peut être préfé à false pour permettre d’utiliser uniquement que le fichier debug.log

SAVEQUERIES permet de créer une variable $wpdb->queries contenant les requêtes SQL.

 

Etape 4: Thème enfant

Pour éviter qu’une mise à jours du thème choisi n’entraine la perte de vos réglages. Il faut faire un thème enfant…

En premier lieu, localiser votre thème actif dans l’interface du backoffice de wordpress. Puis trouvez, le dossier correspondant à ce thème dans le dossier d’installtion de wordpress. Par exemple, mon thème actif est nude, j’ai donc le dossier suivant (nude doit être remplacé par le nom de votre thème dans votre installation bien sur) :

wp-contents/themes/nude

Créer un dossier voisin de ce dossier avec -child à la fin du nom

wp-contents/themes/nude-child

C’est dans ce dossier que l’on va créer notre thème enfant.

Créer un fichier style.css

wp-contents/themes/nude-child/style.css

Ce fichier peut être ouvert avec Eclipse PDT/PHP et indiquer les informations suivantes:

/**
* Theme Name: Nude child
* Author: Pierre JEAN 
* Author URI: 
* Template: nude
* Description: Nude child
* Version: 1.0
* Tags: translation-ready, custom-background
* Text Domain: nude
* License: GNU GPL v3
* License URI: https://www.gnu.org/licenses/gpl-3.0.html
*/
/* Ajouter des réglages CSS ci-dessous */

La valeur la plus importante en fait est la ligne Template.

A partir de là, pour récupérer les réglages par défaut de votre style parent, vous pouvez soit:

  • Copier coller tous les réglages CSS du fichier parents, simple et efficace
  • Faire une importation HTML avec la ligne suivante @import url(« ../nude/style.css »);
  • Ajouter le fichier functions.php avec le hook wp_enqueue_scripts

Créer un fichier functions.php dans le dossier du theme enfant est une bonne méthode actuellement car elle ne dépend pas du navigateur et elle nous permet de tester un hook (add_action):

<?php
function appelStyleCssParent(){
    wp_enqueue_script( 'parent-style', get_template_directory_uri() . '/style.css' );
}

add_action('wp_enqueue_scripts', 'appelStyleCssParent' );
?>

Etape 5: Liste des pages d’un template WordPress:

  • single.php affichage d’un article seul
  • page.php affichage d’une page seule
  • page<nom>.php qui affichera directement la page qui s’appelle <nom>
  • home.php gestion de la page d’accueil
  • tag.php affichage des pages tags (tag-<nom du tag>.php pour afficher les page liées au tag.
  • archive.php affichage des archives (par catégorie, par label, par auteur, etc.).
  • category.php affichage par catégorie ( category-<nom catégorie>.php)
  • search.php affichage des résultats d’une recherche.
  • 404.php page de gestion de l’erreur 404
  • <nom page>.php par exemple mentions-legales.php
  • author.php affichage d’un auteur et des ses ressources liées
  • date.php affichage par date précise (année, mois ou jour) des articles
  • loop.php gestion de la boucle principale de WordPress
  • one-column-page.php pour affichage sur une seule colonne donc sans sidebar

Pour voir le système de choix des enchaînements de pages dans les tablettes de nombreux diagrammes sont disponibles sur le Web par exemple sur le site WordPress.

Voici quelques informations sur les fonctions classiques d’un thème et l’organisation d’un page en sous pages:

 

On peut donc retoucher une page en la copiant dans le dossier enfant. Copier donc le fichier page.php depuis le template parent dans le dossier enfant puis faire une modification par exemple autour de the_title() qui permet d’afficher le titre d’une page. Si vous voulez modifier un article dans ce cas là, il faut prendre le fichier single.php.

NOTA: dans le fichier single.php on peut voir un appel à un sous fichier qui va fabriquer le contenu, par exemple dans le thème twentynineteen, la ligne suivante va chercher un autre fichier

get_template_part( 'template-parts/content/content', 'single' );

Il suffit de refabriquer l’enchainement de dossier et de fichier content-single.php pour remplacer le contenu

/twentynineteen-child/template-parts/content/content-single.php

On peut aussi faire des templates différents pour une catégorie d’article ou pour une page dont on a son ID en appelant par exemple un fichier single-1.php pour avoir ce template pour l’article numéro 1. Il existe aussi par titre du fichier , catérogie, etc.

Nous allons faire un second template en créant dans le dossier du template enfant un fichier single-2.php avec ce contenu:

<?php
/*
Template Name: Nouveau template 2 de single.php
Template Post Type: post, page
*/
get_header();
?>

DEBUT DU NOUVEAU TEMPLATE
<?php the_title(); ?>

Vous pouvez choisir le template à appliquer à un article en l’éditant comme indiqué sur cette copie d’écran:

Bien sur la conception d’un template de page ou de post/article est longue c’est pourquoi on reprend souvent des thèmes en les customisant selon le besoin.

 

 

Publié dans CTN | Laisser un commentaire

Arduino M0 pro et UART additionnel

Dans le cadre d’un développement sur un Arduino M0 Pro, je me retrouve a devoir brancher en protocole UART un module bluetooth et un lecteur RFID tout les deux en UART.

Comme je débute en Arduino, je branche le module bluetooth sur RT( broche 0) /TX (broche 1) de la carte :

 

Donc se pose la question d’avoir une entrée UART sur d’autres broches. J’avoue que je traine sur google et que je trouve enfin la bonne explication pour transformer les broches  10 en TX et 11 en RX.

Vous trouverez sur ce lien toutes les explications chez Adafruit mais pour ceux qui cherchent comme moi, voici le résumé avec le code:

#include "wiring_private.h"

Uart Serial2(&sercom1, 11, 10, SERCOM_RX_PAD_0, UART_TX_PAD_2);

void SERCOM1_Handler()
{
 Serial2.IrqHandler();
}

void setup()
{
  Serial2.begin(9600);
  pinPeripheral(10, PIO_SERCOM);
  pinPeripheral(11, PIO_SERCOM);
}


void loop()
{
 if (Serial2.available()){
   byte byteRead = Serial2.read();
   Serial2.write(byteRead);
   Serial.write( byteRead ); 
 }
}

Et voila, j’avoue que cela m’a permis d’entrer dans des détails du « M0 pro » et de son contrôleur ATSAMD21  mais enfin j’ai compris comment on peut refaire un UART de plus en cas de besoin.

Voila le montage final avec UART sur PIN 0 et 1, SDA & SCL branché et enfin le nouveau UART PIN 10 et PIN 11

Publié dans Développement | Laisser un commentaire

WordPress sur le serveur

Installation de WordPress sur le serveur www.master-ctn.mines-ales.fr

  • Récupérer vos codes auprès de votre enseignant. Merci de venir systématiquement avec eux à tous les TPs WordPress
  • Télécharger wordpress depuis le site officiel français ou depuis http://www.master-ctn.mines-ales.fr/install/wordpress/
  • Lancer le logiciel Filezilla pour transférer les fichiers sur le serveur
    • Dans la barre du haut, entrer les informations suivantes:
      • Hote: sftp://www.master-ctn.mines-ales.fr
      • Identifiant: ctn19_votre_identifiant_mais_vous_ne_vous_appelez_pas_jean_comme_moi
      • Mot de passe: sur le même document que votre identifiant
    • Utilisez le glissez déplacer pour transférer les fichiers du wordpress dezipper dans la partie droite de filezilla dans le dossier www
    • Attention il faut à la fin que votre wordpress se trouve dans le dossier www et non pas dans le dossier www/wordpress/ c’est plus simple pour la suite
    • Sur le dossier www, faire clic droit « droits d’accès au fichier » et les permissions de groupes doivent être toutes cochées (et la valeur numérique à 775 en fait)
  • Lancer l’installation de votre wordpress en vous rendant à l’adresse suivante après avoir changé l’identifiant ctn19_jean ci-dessous par votre propre identifiant:
    • http://www.master-ctn.mines-ales.fr/ctn19_jean/
    • Entrez votre identifiant et votre mot de passe dans la fenêtre qui masque votre wordpress le temps de sa conception
    • Les informations d’installations sont les suivantes pour la première étape:
      • Nom de la base de données: ctn19_jean
      • Nom du serveur de base de données: www.master-ctn.mines-ales.fr      localhost
      • Identifiant: ctn19_jean
      • Mot de passe: sur le même document que votre identifiant
      • Préfixe des tables: laisser la valeur par défaut wp_
    • Les informations d’installation pour la seconde étape
      • Titre du site: à votre inspiration et vos choix
      • Identifiant: ce que vous souhaitez MAIS VOUS DEVEZ VOUS EN SOUVENIR
      • Mot de passe: ce que vous souhaitez MAIS VOUS DEVEZ VOUS EN SOUVENIR
      • Email: votre email de l’IMT Mines Alès
        • NOTA: merci de bien noté votre identifiants et votre mot de passe wordpress, il est un peu complexe de les réinitialiser à chaque séance
    • Vérification du front et du back office de votre site wordpress.
  • Installation de modules/plugins/extensions
    • Installation manuelle de module ssh-sftp-updater-support.0.8.2.zip
      • Dezipper le fichier ssh-sftp-updater-support.0.8.2.zip à télécharger depuis http://www.master-ctn.mines-ales.fr/install/wordpress/
      • Utilisez filezilla comme dans la procédure précédente pour placer le dossier ssh-sftp-updater-support dans le dossier www/wordpress/wp-content/plugins/
    • Dans le back-office de wordpress allez à la page des extensions via le menu de gauche et activée l’extension. Placer les fichiers dans le dossier rends visible l’extension mais elle n’est pas activée par défaut.
    • L’extension sftp permet de télécharger des plugins et des thèmes en utilisant le backoffice de wordpress en indiquant les informations suivantes:
      • Nom du serveur: www.master-ctn.mines-ales.fr
      • Identifiant: ctn19_jean
      • Mot de passe: sur le même document que votre identifiant
      • Méthode : SSH2
    • Mise en pratique par l’installation du plugin pour la sauvegarde et le transfert de site wordpress: Duplicator
      • Dans le back-office, aller sur extensions > Ajouter
      • Dans le champs ‘rechercher des extensions » indiquer duplicator
      • Installer l’extension « Duplicator – Extension de migration WordPress  » Par Snap Creek
      • Activer l’extension Duplicator
      • Aller Duplicator via le menu Duplicator à gauche
        • Pour créer un paquet duplicator, appuyer sur le bouton « créer un paquet »
        • Les réglages par défauts des trois étapes sont habituellements suffisants pour créer un paquet duplicator soit un fichier archive zip et un programme installer.php qui sont nécéssaires à la duplication du wordpress
        • Télécharger le paquete duplicator (soit l’archive et le fichier installer.php) pour conserver une sauvegarde de votre site
  • Ajouter des image à la bibliothèque de Media de et vérifier avec filezilla sa création dans le dossier www/wordpress/wp-content/uploads
    • NOTA: un dossier par date est créer pour conserver les fichiers
  • Utilisez votre nouvel wordpress pour créer différents contenus de types articles et pages et concevoir un menu via l’interface
  • Utilisez l’interface de wordpress pour activer un nouveau thème pour votre site
  • Rôles des utilisateurs sous WordPress (administrateur, éditeur, auteur, contributeur, abonne)
  • Template enfant

Liste des pages d’un template WordPress:

  • single.php affichage d’un article seul
  • page.php affichage d’une page seule page<nom>.php qui affichera directement la page qui s’appelle <nom>
  • home.php gestion de la page d’accueil
  • tag.php affichage des pages tags (tag-<nom du tag>.php pour afficher les page liées au tag.
  • archive.php affichage des archives (par catégorie, par label, par auteur, etc.).
  • category.php affichage par catégorie ( category-<nom catégorie>.php)
  • search.php affichage des résultats d’une recherche.
  • 404.php page de gestion de l’erreur 404
  • <nom page>.php par exemple mentions-legales.php
  • author.php affichage d’un auteur et des ses ressources liées
  • date.php affichage par date précise (année, mois ou jour) des articles
  • loop.php gestion de la boucle principale de WordPress
  • one-column-page.php pour affichage sur une seule colonne donc sans sidebar

Pour voir le système de choix des enchaînements de pages dans les tablettes de nombreux diagrammes sont disponibles sur le Web par exemple : ici ou sur le site WordPress.

 

 

Vérification du fonctionnement de Xdebug pour PC personnel

;PJE
;xdebug.remote_enable = off 
;xdebug.remote_enable = off
xdebug.remote_autostart=on
xdebug.remote_enable=on
xdebug.remote_enable=1
xdebug.remote_handler="dbgp"
xdebug.remote_host=127.0.0.1
;xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.remote_mode=req
xdebug.show_local_vars=1

 

Publié dans CTN | Commentaires fermés sur WordPress sur le serveur

Formation python Quatrième partie

 EXERCICE ONZE

Manipulons quelques fonction de la bibliothèque numpy:

import numpy as np
donneesX = np.array([[1,2,3,15,18] , [18,22,4,15,15]])
print ( donneesX.shape )

 

Fabrication d’un tableau de séries de données

import numpy as np
temperature = np.arange(25,44.5,0.5)
print( temperature )

print( temperature.mean() )
print( np.mean( temperature ) )

print( np.min( temperature ) )
print( np.max( temperature ) )
print( np.median( temperature ) )
print( np.std( temperature ) )

 

Manipulation de matrice par l’appel de fonction sur chaque élément:

import numpy as np
temperature = np.arange(25,44.5,0.5)

def toKelvin(x):
 return x + 273.15

print( toKelvin( temperature ) )

 

Manipulation des tableaux par réorganisation des lignes et des colonnes

a = np.arange(6)
print( a )
a = np.arange(6).reshape(2,3)
print( a )

Itération sur chaque élément du tableau:

a =np.array([[1,2],[3,4],[5,6]])
for (x,y), valeur in np.ndenumerate(a):
   print( valeur )

Plus compliqué en indiquant que les valeurs pour les indices paires:

a =np.array([[1,2],[3,4],[5,6]])
for (x,y), valeur in np.ndenumerate(a):
   if x % 2 == 0 
      print( valeur )

Ou le second éléments de chaque sous-tableau:

a =np.array([[1,2],[3,4],[5,6]])
for (x,y), valeur in np.ndenumerate(a):
   if y == 1 
      print( valeur )

Attention imaginons ce type de situations et que nous voulons le dernier élément

a =np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
for (x,y), valeur in np.ndenumerate(a):
   if y == 1 
      print( valeur )

Il faudrait alors utiliser

a =np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
[ soustableau[ -1 ] for soustableau in a]

Mais en fait il faudrait écrire plutôt

a =np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
for valeur in ( [ soustableau[ -1 ] for soustableau in a] ):
  print( valeur )

 

Publié dans EuroMov | Laisser un commentaire