dimanche 23 décembre 2018

Paradigm : Pure functions are thread-safe

Servlet : Why-servlets-are-not-thread-safe


I need to know why the servlets are not thread safe ?
Servlet instances are inherently not thread safe because of the multi threaded nature of the Java programming language in general. The Java Virtual Machine supports executing the same code by multiple threads. This is a great performance benefit on machines which have multiple processors. This also allows the same code to be executed by multiple concurrent users without blocking each other.
Imagine a server with 4 processors wherein a normal servlet can handle 1000 requests per second. If that servlet were threadsafe, then the web application would act like as if it runs on a server with 1 processor wherein the servlet can handle only 250 requests per second (okay, it's not exactly like that, but you got the idea).
If you encounter threadsafety issues when using servlets, then it is your fault, not Java's nor Servlet's fault. You'd need to fix the servlet code as such that request or session scoped data is never assigned as an instance variable of the servlet. For an in-depth explanation, see also How do servlets work? Instantiation, sessions, shared variables and multithreading.

lundi 12 novembre 2018

Maven : mvn dependency:purge-local-repository


Pour nettoyer le cache local, essayez d'utiliser le plug-in de dépendance.
  1. mvn dependency:purge-local-repository : Il s'agit d'une tentative de suppression des fichiers du référentiel local, mais elle se poursuit toujours et remplit le référentiel local une fois les éléments supprimés.
  2. mvn dependency:purge-local-repository -DreResolve=false : Cela évite la re-résolution des dépendances mais semble toujours aller sur le réseau à certains moments.
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false : Ceci a été ajouté par Paweł Prażak et semble bien fonctionner. J'utiliserais le troisième si vous voulez que le repo local soit vidé, et le premier si vous voulez juste jeter le repo local et récupérer les dépendances.

Maven : mvn dependency:

mvn dependency:list permet d'établir la liste des dépendances du projet, soit l'équivalent du répertoire WEB-INF/lib.

mvn dependency:tree trace un arbre, où chaque branche est une dépendance qui introduit par transitivité d'autres dépendances.

jeudi 1 novembre 2018

Spring MVC : Root Application context vs le contexte Spring MVC

Le contexte applicatif Spring MVC charge les beans @Repository et @Controller déjà chargés par le Root Application context. Ces beans sont donc chargés en double. Pour rappel, le contexte Spring MVC peut injecter des beans déclarés dans le Root Application context (l'inverse n'étant pas vrai).

Lien : https://www.baeldung.com/spring-web-contexts

lundi 29 octobre 2018

Java : Formats are generally not synchronized.




From JavaDoc :

Formats are generally not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

 It allows for formatting (date -> text), parsing (text -> date), and normalization
Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.


If using Java 8, it's better to use thread-safe

DateTimeFormatter

samedi 20 octobre 2018

Git: merge ff vs --no-ff vs --ff-only

git merge --no-ff branch : force git à créer un commit avec un msg à garder dans l'historique
git merge --ff-only : force git à faire un merge uniquement s'il peut le faire avec un ff, sinon il doit abandonner.

liens:
http://www.dynamic-mess.com/developpement/git-merge-fast-forward-rebase-culture-git/
https://tech.m6web.fr/tentative-d-explication-des-fast-forward-sous-git

JavaScript : pass-by-reference or pass-by-value ?

 Data type manipulation in JavaScript


TypeCopied byPassed byCompared by
NumberValueValueValue
BooleanValueValueValue
StringImmutableImmutableValue
ObjectReferenceReferenceReference

Spatial locality and linkedlist

Spatial locality refers to the use of data elements within relatively close storage locations. Sequential locality, a special case of spatial locality, occurs when data elements are arranged and accessed linearly, such as, traversing the elements in a one-dimensional array.

jeudi 11 octobre 2018

mercredi 3 octobre 2018

Comprendre la ViewEncapsulation dans un Component Angular

L'encapsulation des vues :

Shadow DOM vient des standards des Web Components, il permet d'encapsuler une partie du DOM et des styles CSS., ce qui permet d'appliquer un script ou un style sur un élément précis.

https://medium.com/@simonb90/comprendre-la-viewencapsulation-dans-un-component-angular-83decae8f092

lundi 1 octobre 2018

Angular : Route Configuration

https://angular.io/tutorial/toh-pt5

router-outlet

https://www.techiediaries.com/angular-router-multiple-outlets/

Using Parameter in Routes :

https://www.techiediaries.com/angular-router/
https://www.techiediaries.com/angular-router-routerlink-navigate-navigatebyurl/

Exemple de paramètre dynamique : il faut importer ActivatedRoute et ParamMap (est un observable)
et initialiser ActivatedRoute dans le constucteur :

constructor(private route:ActivatedRoute ){}

ngOnInit() {   this.route.snapshot.paramMap.get('name')  }

const routes : Routes = [
{path: 'home', component: HomeComponent },
{path: 'login', component: LoginComponent},
{path: 'film/:name', component: FilmDetailCompoenent}

]

Angular : Module


Les paramétres de @NgModule:

Permet d’organiser une application en modules fonctionnels ou techniques 
--declarations : définit tous les éléments embarqués dans le module (composants, directives, pipes, etc.).
--Exports : Les composants que nous voulons rendre disponible aux autres
--Imports : Permet d'importer les modules dont nous avons besoin au niveau du module courant.
--Providers : Liste les services utilisés par le composant
--Bootstrap : définit une référence vers la vue principale (Composant racine de l'application)

Création d'un module avec la CLI Angular: ng g module login

 Après la creation il faut ouvrir le module :
 import {LoginModule} from './login/login.module';
 app.module.ts et dans @NgModule -> imports ajouter LoginModule


Angular : Création d'un service


 -- Comment utiliser?
--Services.
--Injection des dépendances.

Injection des dépendances:

Le principe de ce pattern est de casser les dépendances entre les éléments.
Donc avoir une couplage faible entre les élements et ainsi permettre une meiulleur maintenance. et facilite l'ecriture des tests.

Dans le cadre d’Angular, un composant peut avoir besoin d’un service, on dit alors que le composant est dépendant du service. Le framework Angular joue alors le rôle de gestionnaire de dépendances.
Angular implemente une fonctionnalité qui permet d'utiliser ce mecanisme.

-- Le Framework Angular récupere les informations du service dont-il a besoin à partir de la proprietes "provider" du décorateur @NgModule, qui est le niveau le plus haut de l'application.
Lorsqu’un service est déclarée à ce niveau de l’application est généralement un singleton, à chaque fois qu’un élément du Framework demande ce service, ce sera la même instance qui lui sera retournée. Les dépendances déclarées à ce niveau agissent donc comme des singletons.

-- Si nous voulons crées des instances unique à chaque composants, il faut utiliser la propriété "provider" du décorateur @Component

Services Angular:

Dans l'architecture Angular L’objectif d’un service est de contenir toute la logique métier de l’application.
-- Le service doit avoir une seul responsabilité.
-- On peut injecter un service à l'aide l'annotation @Injectable.
 Ce décorateur n’est donc pas obligatoire lorsque le service ne possède aucune dépendance, mais le mettre dans tous les cas est une bonne pratique que nous vous conseillons.

 Création d'un service : cd src/app/login/


 Angular CLI : ng g service authetification
 crée : authentification.service.spec et authentification.service.ts
 Annotée @Injectable
 Pour utiliser ce service il faut le fournir dans la proprietes "providers" de @NgModule du module LoginModule.

 Donc, il faut import {AuthentificationService} from './authentification.service';
 Puis : providers: [AuthentificationService], dans @NgModule

 Pour pouvoir utiliser le service dans authentification.component, il faut :
 import {AuthentificationService} from '../authentification.service';

 Puis, dans le constructeur : constructor(public authentificationService: AuthentificationService)

 Nous mettons l'accesseur à public pour qu'il soit visible par tout les composants.

 Maintenant, nous allons utiliser le service et lui demander si un utilisateur et login ou non?
 this.authentificationService.isLoggedIn(this.username);

 Maintenant, créons la variable username:
 username = 'Naoufal';
 // Variable qui affiche le message retournée par le service
 isLoggedIn: boolean = false;
  ngOnInit() {
    this.isLoggedIn = this.authentificationService.isLoggedIn(this.username);
  }
  
  Pour afficher la variable isLoggedIn, nous devons modifier le fichier authetification.component.html
  Composant d'authentification !
  {{username}} -- {{isLoggedIn}}
-- Les informations sont afficher correctement.


Pour s'assurer que l'appel au service se fait correctement, nous allons changer le username.

Angular : Création d'un composant

 cd src/app/login/

/!\ Le composant ne doit contenir que la logique de présentation.

 ng g component authentification || ng g c authentification

 Dans le module LoginModule on voit que declarations: [AuthentificationComponent] a été ajouté.

 Pour la rendre exploitable par les autres modules on doit l'ajouter au paramétrés "Exports":, dans login.module.ts

 Donc : exports: [AuthentificationComponent] dans @NgModule

 Maintenant nous allons personnaliser le css et html de notre component.

 --authentification.component.css => p{ color : green}
 --authentification.component.html => Login component
 Pour savoir le component tag de votre application il faut ouvrir :
 --authentification.component.ts
 puis, dans @Component le paramétre selector : dans notre cas, c'est :
 app-authentification

 copier, coller dans app.component.html
 --Relancer "ng serve"

enter image description here

Angular : La vue et le two-way data binding

Le "two-way" Data Binding : 


C'est une combinaison du Property Binding et du Event Binding sous une unique annotation.
Dans ce cas là, le component se charge d'impacter le DOM en cas de changement du modèle, et le DOM avertit le Component d'un changement via l'émission d'un évènement.

Le mécanisme se rapproche du fameux ngModel Angular 1, mais avec des algorithmes de Data Binding différents.

Pour pouvoir afficher et éditer le nom du produit, la syntaxe ngModel est nécessaire.
Il suffit d’assigner la propriété du produit avec ngModel pour que la liaison de donnée soit effective. Si l’utilisateur édite le champ dans l’input, la variable dans le code sera modifiée, et la réciproque est aussi vraie.

Cela veut dire que si une méthode ou un mécanisme est amené à modifier le nom du produit, l’utilisateur verra cette modification immédiatement dans son interface.

'ngModel' en détail :

Pour comprendre exactement ce qui se passe lorsqu’on utilise l’instruction [(ngModel)], il faut décortiquer la structure de sa syntaxe.

Les deux crochets [ ], représentent le property binding (la liaison à la propriété).
Cela signifie que la valeur circule depuis le modèle (dans le code) vers ce qui est affiché dans la vue.
C’est tout simplement le one-way (unidirectionnel) data binding du modèle vers la vue.

Les deux parenthèses ( ), quant à elles, représentent l’event binding (la liaison à l’événement).
C’est l’inverse du property binding, car c’est la vue qui va notifier le modèle d’un événement.
C’est un one-way data binding de la vue vers le modèle dans ce cas.

Ainsi, en utilisant les deux ensembles, un two-way data binding est créé et le flux circule dans les deux sens.

Pour plus d'information : https://vsavkin.com/two-phases-of-angular-2-applications-fda2517604be

Angular : Data binding



Laison des données : Ce "data binding" va permettre de synchroniser les données entre les composants et les vues.

Une modification d’une propriété d’un composant sera automatiquement reflétée sur l’interface, et inversement une modification d’un contrôle HTML mettra à jour les propriétés du composant.
Binding supporter par Angular (DOM <->Component):
<->
Angular a défini quatre sortes de Data Binding pour synchroniser le template et le Component:
databinding


Mécanisme du one-way binding

Veut dire que le flux du données part d'une data source à la vue 
  1. {{value}}  Interpolation template=> Ce mécanisme permet de modifier le DOM à partir du modèle, si un changement est intervenu sur une valeur de ce dernier. On peut faire des calculs ou appeler des fonctions défini dans le composant à l’intérieur {{value}}. les limitations de l’utilisation : https://angular.io/guide/template-syntax
  2. [propriete] = "valeur" : Ce mécanisme permet de valoriser une propriété d'un composant ou d'une directive à partir du modèle, si un changement est intervenu sur une valeur de ce dernier. Interpolation vs porpriete binding : https://www.codementor.io/adekunleoyaniyi/interpolation-vs-property-binding-in-angular2-eu1tzbyn4
  3. (evenement) = "fonctionHandler" : Ce mécanisme permet d'exécuter une fonction portée par un Component suite à un évènement émis par un élément du DOM.
  4. [(ng-model)] = "propriete"

--Event Binding (Laison d'evenement) : permet à une application Angular d’exécuter du code, des actions, lorsqu'un événement est levé.

il suffit de décorer de parenthèses le nom de l’événement DOM à écouter et de fournir la méthode à exécuter sur cet événement
L'objet $event : est disponible dans la variable $event fournie par Angular. 
C’est cet objet qui contient la donnée que nous voulons récupérer. 
Une première solution est de passer cet objet $event dans une méthode qui est définit dans le composant, ensuite d’aller chercher l’entrée utilisateur à l’intérieur.

Angular : Angular CLI

Création de l'application avec Angular CLI.

-- scaffolder de la part de gOOGLE :  exposant un ensemble de commandes permettant d’accélérer le processus d’initialisation du projet.
-- facilite la création des applications Angualr

-- npm install -g @angular/cli 
-- npm update @angular/cli en cas de probléme  
-- ng new "le nom du projet" --routing 
-- cd "nom du projet" 
-- ng serve --host 0.0.0.0 --port 4200  

vendredi 28 septembre 2018

Git : Références Git

Git : Reflog le journal des références

le réflog n'est pas partagé et il est enregistre dans tree .git/logs/
git reflog nom-branche, sinon on ne passe pas d’argument il va prendre HEAD (référence special)par défaut

Affiche :
nom-branche@{0}: commande appliqué

On peut faire un git reset --hard nom-branche@{0}

Git : Rebase your project history

Rebase : est un ensemble de cherry-pick
/!\ Il faut faire attention si le commit est déjà partager (pusher) ou s'il est juste en local.

git rebase -i

listes les commits du haut vers le bas:

  • pick : appliqué le commit tel qu'il est
  • drop
  • reword : garde les changements du commit et offre la possibilité d'editer le message du commit 
  • edit : le script fait pause après l'application du commit et offre la possibilté de faire un amend ou un changement
  • squash :combine le commit courant et le commit précédent (comme un amend automatique)
  • fixup : comme squash, sauf qu'il supprime le commit courant des messages du log
  • exec: permet de lancer une script shell
Lien pour faire un rebase avec IntelliJ:

Source : https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History

Git : Filter-Branch

Source : https://git-scm.com/docs/git-filter-branch
git filter-branch --env-filter 'Nom-Du-Filter' HEAD~10..HEAD ==> range

filter-branch : permet de lancer un filtre :
Exemple de filter :
'GIT_AUTHOR_NAME= Naoufal'

Git : la notation (..) double-dot syntax et (...) Triple Dot syntax

Source : https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection

Voir les commits qui sont atteignable d'une branche est pas de l'autre.

Cette commande peut être utilisé par les commandes log et diff.

Example history for range selection.

D et C ne sont pas atteignable par master.

$ git log master..experiment
D
C
$ git log master...experiment Atteignable par les deux références 
F
E
D
C
$ git log --left-right master...experiment Atteignable par les deux références

< F
< E
> D
> C

Git : What's the difference between HEAD^ and HEAD~ vs HEAD@{} also known as tilde vs caret vs at sign in Git?

Le HEAD pointe toujours vers la pointe de la branche en cours dans notre repository.

Si le HEAD est un merge, alors il a deux parents.


Premier parent : c'est la branche dans laquelle on merge

HEAD^ <=> HEAD^1 <=> HEAD~: le Première parent qui s'affiche toujours à gauche.

~ : Fait toujours référence au 1er parent

Deuxième parent : c'est la branche à partir de laquelle on merge

HEAD^2 : est le deuxième parent

Exemple pour voir le parent du deuxième parent :

git log HEAD^2~ Peux être le commit initial

git checkout - is a shorthand for git checkout @{-1}.


https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git

Git : Utilitaires-Git-Reset-démystifié

reset workflow

git reset --soft HEAD~ : Déplace le HEAD
git reset --mixed (default) HEAD~ : Met à jour l'index
git reset --hard HEAD~ : Déplace le working Directory => Très dangereux car pas de backup

Git : Git clean -f

Commande très dangereuse, il supprime tous les fichiers non tracker  (untracked files)!!

Pour supprimer les répertoires, il faut ajouter le flag d:

 git clean -fd

git clean -fdx : pour supprimer les fichiers ignore

Pour avoir le mode interactive :

git clean -idx : donne un preview


Git : git checkout (-p|--patch) et (-f| --force)

https://www.md-systems.ch/de/blog/techblog/2011/08/23/partial-checkout-git-checkout-p


-p | --patch

git checkout : pour changer de branches : qui prend les choses du graphe des commits et les copies dans le répertoire de travail (Working Directory) .
reset workflow


Si on ajoute le -p | --patch, il va comparer ce qu'on a dans le HEAD avec le Working Directory et va essayer de le copier dans le Working Directory et ouvre un mode interactive, pour que l'on puisse faire nos choix.


-f  | --force

Va forcer la copie de HEAD vers le Working Directory et les changement en local seront perdu, afin de revenir à un état connu et qui fonctionne, ne touche pas au fichier et répertoires qui ne sont pas tracker.



Git : Undo d'un merge

Si par erreur je fais un merge, comment je peux le supprimer?
options:
git revert HEAD -m 1 : (-m la ligne principale, et le 1 c'est l'endroit ou était le HEAD lorsqu'on a fait le merge) =>

Cela introduit un nouveau commit , ce nouveau Snapshot est equivalent à commit f8c880b



Cela peut être problématique, il y a une autre option :

git reset --hard f8c880b, 


Plus d'informations : 
https://git-scm.com/book/fr/v2/Utilitaires-Git-Reset-d%C3%A9mystifi%C3%A9

jeudi 27 septembre 2018

Git : Etiquette Tips pour écrire "un bon message de commit"

Commit-message étiquette :
  • Ne changer jamais l'historique des branches
  • Moins de 50 caractères pour le titre (Qu'est ce qui est fait)
  • Moins de 72 caractères pour le corps (Comment c'est fait)
Plus d'informations : https://chris.beams.io/posts/git-commit/
https://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message

On peut créer une template des messages des commits à l'aide de :

git config commit.template "le path vers le template de message .gitmessage.txt"
https://robots.thoughtbot.com/better-commit-messages-with-a-gitmessage-template
https://www.syntevo.com/blog/?p=4076

Git : Tag

Tag : point sur un commit particulier pour donner une sémantique

git tag nomDuTag (Simple Tag)
pour supprimer git tag  nomDuTag  -f

git tag nomDuTag -m ' ' (Annotated Tag)

git show -q

Partager un Tag

git push origin nomDUTAg

git push origin --tags

Plus d'informations : https://git-scm.com/book/fr/v1/Les-bases-de-Git-%C3%89tiquetage

Git : git push matching vs simple

A partir de la version 2 :

warning: push.default is unset; its implicit value is changing in 
Git 2.0 from 'matching to 'simple'. To squelch this message and 
maintain the current behavior after the default changes, use:

   git config -- global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

When push.default is set to 'matching', git will push local branches 
to the remote branches that already exist with the same name.

In Git 2.0, Git will default to the more conservative 'simple' behavior, 
which only pushes the current branch to the corresponding remote 
branch that 'git pull' uses to update the current branch.

See 'git help config' and search for 'push.default' for further information. 
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode 
'current' instead of 'simple' if you sometimes use older versions of Git)

In short, matching forces you to keep remote and local branches in sync, with the same names at all time. Simple lets you have different branch names and doesn’t force you to push all the branches as the same time. For me simple is a lot more, er, simpler, and safe and reflects the way I work better. The choice is easy.

 git config --global push.default simple 

utiliser 

git push -u origin branch : pour la premier fois afin que git fait le set du remote en tant que upstream (l'option -u)

Git : pull rebase afin d'eviter le merge commit et garder un historique propre

Source : https://delicious-insights.com/fr/articles/bien-utiliser-git-merge-et-rebase/

Garder un historique propre 

On peut recourir à des options de configuration, locales ou globales, pour obtenir le même résultat d'un pull --rebase ou pull -r. Ce peut être au niveau d’une branche (ex. configuration locale branch.feature.rebase = true) ou un comportement général, ce que je vous recommande (configuration globale pull.rebase = true).

git config --global pull.rebase true


Cas particulière



Si on ne veut pas faire de rebase, il suffit de faite :

git pull --no rebase


Autre options :

git pull --rebase=preserve
git pull --rebase=interactive

Git : Git distribué - Développements distribués modèle de Workflow

Source : 

Gestion Centralisée : 


Gestion centralisée.

Mode du gestionnaire d’intégration


Le mode du gestionnaire d’intégration.

Mode dictateur et ses lieutenants

Le processus du dictateur bienveillant.

mercredi 26 septembre 2018

Is Hibernate Criteria API Deprecated and if so what API should we use?

Yes:

https://stackoverflow.com/questions/31200850/is-hibernate-criteria-api-deprecated-and-if-so-what-api-should-we-use
AFAIK and off looking at the Javadocs, the Hibernate Criteria API is not deprecated. However, there is a very good argument for using JPA over hibernate, as it means you can switch between persistence providers without having to modify your code. Where as if you go with the Hibernate Criteria API, then your code is completely tied in to Hibernate.

Update 06/07/16

"This appendix covers the legacy Hibernate org.hibernate.Criteria API, which should be considered deprecated.
New development should focus on the JPA javax.persistence.criteria.CriteriaQuery API. Eventually, Hibernate-specific criteria features will be ported as extensions to the JPA javax.persistence.criteria.CriteriaQuery. For details on the JPA APIs, see Criteria.".
This means, the Hibernate criteria is usable as it isn't officially @Deprecated, but you should be using JPA instead!

Exemple :

CriteriaBuilder builder = entityManager.getCriteriaBuilder();

CriteriaQuery<Person> criteria = builder.createQuery( Person.class );
Root<Person> root = criteria.from( Person.class );
criteria.select( root );
//Type Safe, on doit active le processeur d'annotation 
// 

How to use Hibernate JPA 2 Metamodel Generator?

https://stackoverflow.com/questions/44737254/how-to-use-hibernate-jpa-2-metamodel-generator criteria
.where( builder.equal( root.get( Person_.name ), "John Doe" ) ); List<Person> persons = entityManager.createQuery( criteria ).getResultList();

Activation dans IntelliJ: