Un petit historique de BDD de la part de Liz Keogh :
https://www.youtube.com/watch?v=2EM4itu7j7I
https://www.youtube.com/watch?v=AFCdE5KSREI
Is TDD dead :
https://martinfowler.com/articles/is-tdd-dead/
C'est exactement ça !
Le souhait de vouloir porter des attributs distingués comme féminins ne va pas dans le sens d'une dé-normalisation du genre, bien au contraire, c'est le fait de porter des pantalons en se sentant femme qui participe à la destruction des genres.
Plus long, plus complet
Pas complet mais bien résumé.
I have no idea what I am doing...
import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator;
import org.bouncycastle.crypto.params.KeyParameter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
import java.security.SecureRandom;
public class Authentication {
private static Logger LOGGER = LoggerFactory.getLogger(Authentication.class.getCanonicalName());
// Are these sizes arbitrary ?
private static final int SEED_BYTES = 20;
private static final int HASH_BYTES = 20;
// increase iterations as high as your performance can tolerate
// since this increases computational cost of password guessing
// which should help security
private static final int ITERATIONS = 1000;
//Encoding
public static final String ENCODING = "UTF-8";
public String generateSalt() {
return new String(new SecureRandom().generateSeed(SEED_BYTES));
}
public String hashToken(String password, String salt) {
try {
PKCS5S2ParametersGenerator kdf = new PKCS5S2ParametersGenerator();
kdf.init(password.getBytes(ENCODING), salt.getBytes(ENCODING), ITERATIONS);
return new String(((KeyParameter) kdf.generateDerivedMacParameters(8 * HASH_BYTES)).getKey());
} catch (UnsupportedEncodingException exception) {
LOGGER.info("Error when hashing password : {}", exception.getMessage());
}
return null;
}
public boolean isPasswordValid(String givenPassword, String salt, String storedHash) {
return this.hashToken(givenPassword, salt).equals(storedHash);
}
}
J'ai commencé à regarder Bouncy Castle et je suis pas mal bloquée sur la compréhension des algorithmes de chiffrement...
Je met ici le début de ma réflexion :
package com.moi.search;
import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.DataLengthException;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.paddings.BlockCipherPadding;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Base64;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
public class AESBouncyCastle {
private final BlockCipher AESCipher = new AESEngine();
private PaddedBufferedBlockCipher paddedBufferedBlockCipher;
private KeyParameter key;
public void setPadding(BlockCipherPadding bcp) {
this.paddedBufferedBlockCipher = new PaddedBufferedBlockCipher(AESCipher, bcp);
}
public SecretKey generateKey() throws NoSuchAlgorithmException {
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256);
return kg.generateKey();
}
public String generateSecretKeyStringFormatted() throws NoSuchAlgorithmException {
SecretKey key = this.generateKey();
return this.convertToString(Base64.encode(key.getEncoded()));
}
public void setKey(byte[] key) {
this.key = new KeyParameter(key);
}
public void setKey(SecretKey key) {
this.setKey(key.getEncoded());
}
public byte[] retrieveKeyFromString(String key) {
return Base64.decode(key);
}
public String encrypt(String input) throws DataLengthException, InvalidCipherTextException {
byte[] result = this.processing(this.convertToBytes(input), true);
return this.convertToString(Base64.encode(result));
}
public String decrypt(String input) throws DataLengthException, InvalidCipherTextException {
byte[] bytesToDecrypt = Base64.decode(input);
return this.convertToString(this.processing(bytesToDecrypt, false));
}
private byte[] processing(byte[] input, boolean encrypt) throws DataLengthException, InvalidCipherTextException {
paddedBufferedBlockCipher.init(encrypt, key);
byte[] output = new byte[paddedBufferedBlockCipher.getOutputSize(input.length)];
int bytesWrittenOut = paddedBufferedBlockCipher.processBytes(input, 0, input.length, output, 0);
paddedBufferedBlockCipher.doFinal(output, bytesWrittenOut);
return output;
}
private byte[] convertToBytes(String content) {
return content.trim().getBytes(StandardCharsets.UTF_8);
}
private String convertToString(byte[] content) {
return new String(content, StandardCharsets.UTF_8).trim();
}
}
Exemple d'utilisation :
AESBouncyCastle cipherEngine = new AESBouncyCastle();
cipherEngine.setPadding(new PKCS7Padding());
String key = cipherEngine.generateSecretKeyStringFormatted();
cipherEngine.setKey(cipherEngine.retrieveKeyFromString(key));
cipherEngine.encrypt(stuffToEncrypt);
toto = cipherEngine.decrypt(stuffToDecrypt);
{
"name": "toto",
"version": "1.0.0",
"description": "fdsvfkdgbvfi",
"author": "MOA",
"license": "MIT",
"scripts": {
"build": "npm run build-clean-dist && npm run build-sass && npm run build-autoprefix && npm run optimize-css",
"build-clean-dist": "rimraf dist",
"build-sass": "node-sass --output-style expanded --source-map true scss/target.scss dist/target.css",
"build-autoprefix": "postcss --use autoprefixer --map false --output dist/target.css dist/target.css",
"optimize-css": "cleancss -o dist/target.min.css dist/target.css"
},
"devDependencies": {
"rimraf": "2.6.2",
"clean-css-cli": "4.1.11",
"node-sass": "4.8.3",
"autoprefixer": "8.2.0",
"postcss-cli": "5.0.0"
}
}
Hi hi !
omeletteDuFromage
Je propose une nouvelle loi.
Étant donné que les salariés de chez Vuitton sont fiers de porter du Vuitton, je propose la loi suivante :
Chaque individu salarié ou collaborateur d'une entreprise aura l'obligation de consommer dans l'entreprise qu'il sert. Mais il ne pourra consommer que les premiers prix (prix les moins cher).
Les salariés de sodexo aura obligation de manger sodexo tous les midi.
Les paysans devront consommer leur propre récolte.
Les personnes dans la banque devront se domicilier exclusivement dans la banque où ils travaillent.
Les constructeurs du bâtiment, vivre dans des bâtiments construits par eux, où ils se verront affecter le premier prix.
Les fonctionnaires devront mettre leurs enfants dans des établissements publics de type ZEP.
Ainsi de suite...
Les politiciens, exemple de la nation, auront l'obligation de tout consommer en "premier prix" niveau France, afin de vivre le quotidien des plus démunis.
Seuls exclus en terme d'alimentation sont les enfants (-18ans).
Cas particulier : les travailleurs de la boisson, qui auront obligation de consommer tous les deux jours. Les travailleurs du tabac devront eux, fumer tous les jours.
En cas d'invitation d'un salarié ou d'un collaborateur d'une entreprise chez vous, vous devrez lui servir des produits de l'entreprise dans laquelle il travaille et qu'il a l'habitude de consommer.
Les sanctions : 40 000€ d'amende par journée non respectée pour l'individu qui n'a pas tenu son obligatoire et 200 000€ d'amende pour l'entreprise (par jour non respecté également)
En cas délation avec preuves de la part d'un autre individu, celui-ci récupérera la moitié des 40 000€.
Vous avez choisi une entreprise, soyez-en fiers !
<a href="?addtag=troll" title="Hashtag troll">#troll</a>
Un retour d'exp de Xebia sur de l'offshore.
En plus court : Intellij ne build pas les projets si un espace existe dans le chemin.
Voilà, voilà...
Travail collaboratif en ligne
Comment manipuler l'opinion publique en obligeant les individus à réfléchir d'une certaine manière.
Libération (que je ne soutiens pas spécialement), semble aller dans ce sens aussi :
https://www.liberation.fr/checknews/2018/10/31/est-il-vrai-que-40-des-francais-seraient-favorables-a-un-regime-autoritaire_1689072
D'ailleurs, le sondage en lui-même pue un peu la merde :
https://www.ifop.com/wp-content/uploads/2018/10/115896-Rapport.pdf
Un outil sympa.
Pas très "private" dans sa version gratuite, mais à garder sous le coude
Une page qui reprend les quatre types de management, du 1.0 au 4.0
C'est pas mal du tout :)
Great voice actor
Nouvelle formalisation : "En tant que…, je souhaite que le produit permette de… car cela apporterait l’avantage de…"
La formalisation "je veux... afin de... " met une ambiguité entre l'action et l'objectif.
Un ice breaker sympa que je vais essayer dans une équipe prochainement.
Aussi, la méthode Moscow, qui permet de prioriser des US.