Je cherche à comprendre comment charger le navigateur embarqué de Java FX dans un client lourd. Je ne sais pas si ce projet fonctionne mais ce sera un premier pas vers l'obtention d'un PoC qui marche.
Je suis tombée sur cet autre repo qui a deux avantages :
- Il va droit au but en affichant un index.html
- Il s'appuie sur les modules de Java 9+
J'ai été très critique sur le code proposé par Collin Damon car en voulant montrer ce qu'est la OOP le seul exemple qu'il donne d'API à se fabriquer est entièrement statique.
Je reprends donc son exemple et je vais tenter de le rendre objet :
public final class Assert {
private Assert() {}
public static void notNull(String fieldName, Object input) {
if (input == null) {
throw MissingMandatoryValueException.forNullValue(fieldName);
}
}
public static void notBlank(String fieldName, String input) {
if (input == null) {
throw MissingMandatoryValueException.forNullValue(fieldName);
}
if (input.isBlank()) {
throw MissingMandatoryValueException.forBlankValue(fieldName);
}
}
public static StringAsserter field(String fieldName, String value) {
return new StringAsserter(fieldName, value);
}
public static class StringAsserter {
private final String fieldName;
private final String value;
private StringAsserter(String fieldName, String value) {
this.fieldName = fieldName;
this.value = value;
}
public StringAsserter notBlank() {
Assert.notBlank(fieldName, value);
return this;
}
public StringAsserter maxLength(int maxLength) {
if (value != null && value.length() > maxLength) {
throw StringSizeExceededException
.builder()
.field(fieldName)
.currentLength(value.length())
.maxLength(maxLength).build();
}
return this;
}
}
}
Étape 1 - Créer une interface qui va exprimer ce que l'on compte faire :
public interface Assertion {
boolean isValid();
}
Étape 2 - Fournir une implémentation pour chaque use case :
Cas de la chaîne de caractères null
:
/**
* Cette classe prend un `Object` pour rendre générique le test de nullité.
*/
public final class NotNull implements Assertion {
private final Object value;
public NotNull(Object value) {
this.value = value;
}
@Override
public boolean isValid() {
return this.value != null;
}
}
Cas de la chaîne de caractères vide :
/**
* Il faudra fournir une implémentation de NotEmpty par type testé,
* ce qui peut sembler lourd mais qui a du sens puisque la notion de
* nullité peut changer en fonction du type. Par exemple, une String
* vide n'est pas la même chose qu'un tableau vide.
*/
public final class NotEmpty implements Assertion {
private final String value;
public NotEmpty(String value) {
this.value = value;
}
@Override
public boolean isValid() {
return !this.value.isEmpty();
}
}
Étape 3 - Ajout de la composition
L'assertion composée est elle aussi une implémentation de l'interface Assertion
et ne prend que des Assertion
en paramètre.
public final class Assertions implements Assertion {
private final Assertion[] assertions;
public Assertions(Assertion... assertions) {
this.assertions = assertions;
}
@Override
public boolean isValid() {
return Arrays.asList(this.assertions).stream().allMatch {
(Assertion it) -> is.isValid();
}
}
}
Étape 4 - Un exemple d'utilisation
public class Main {
public static void main(String... args) {
String toto = "titi";
new Assertions(
new NotNull(toto),
new NotEmpty(toto)
).isValid();
}
}
Dans cet exemple, aucun calcul n'est effectué dans le constructeur et tous les déclenchements sont joués uniquement au moment de l'invocation de la méthode isValid()
(on est donc en lazy evaluation), chaque objet possède un à état, tous les attributs sont immutables et les classes aussi (car final), il y a zéro héritage et uniquement de la composition, tout a été codé en interface-first pour s'abstraire des implémentations, enfin les classes étant rikiki, elles sont ultra-simples à tester.
Edit : en Kotlin le mot-clef new disparait car le langage assume qu'un constructeur soit une fonction static
à scope global (ce qui est le cas dans le bytecode de Java), du coup la chaîne d'instanciations apparaît comme une composition de fonctions (au sens f o g(x)
ou f(g(x))
) sans avoir besoin de passer par une fluent API et une monade.
Je reprends l'exemple que j'avais donné ici et que j'ai modifié pour le "Yegorifier".
#![allow(non_snake_case)]
// Interface / Trait
trait Addition {
fn add(&self) -> i32;
}
// Couple
struct Couple {
opA: i32,
opB: i32,
}
impl Couple {
// Équivalent à une méthode 'static' de Java simulant un constructeur
fn new(opA: i32, opB: i32) -> Self {
return Couple { opA: opA, opB: opB }
}
}
// Triplet
struct Triplet {
opA: Box<dyn Addition>, // Un trait doit être passé dans un objet de type Box
opB: i32,
}
impl Triplet {
// Équivalent à une méthode 'static' de Java simulant un constructeur
fn new(opA: Box<dyn Addition>, opB: i32) -> Self {
return Triplet { opA: opA, opB: opB }
}
}
// Implémentations du trait "Addition"
impl Addition for Couple {
fn add(&self) -> i32 {
return self.opA + self.opB;
}
}
impl Addition for Triplet {
fn add(&self) -> i32 {
return (*self.opA).add() + self.opB;
}
}
// Exécution
fn main() {
let additionA = Couple::new(1, 2);
println!("Couple add : [{}]", additionA.add()); // Print 3
// Ne pas oublier de wrapper Couple dans une Box
let additionB = Triplet::new(Box::new(additionA), 3);
println!("Triplet add : [{}]", additionB.add()); // Print 6
}
Plein d'exemples de fichiers SWIFT (format MT101 à MT950, MX et SEPA).
Pour @Animal et @Doudou
J'en note quelques uns ici :
Format MT101 :
{1:F01SAESVAV0AXXX0466020121}{2:O1011538070522LRLRXXXX4A0700005910650705221739N}{3:{108:MT101 001 OF 019}}{4:
:20:00028
:28D:1/1
:50H:/VTB.2003.02
19Apr2002
:30:020419
:21:x
:32B:USD1,
:50L:x
:59:/x
x
:71A:OUR
-}{5:{MAC:00000000}{CHK:24857F4599E7}{TNG:}}
Format MT103 :
{1:F01AAAAGRA0AXXX0057000289}{2:O1030919010321BBBBGRA0AXXX00570001710103210920N}{3:{108:MT103 003 OF 045}{121:c8b66b47-2bd9-48fe-be90-93c2096f27d2}}{4:
:20:5387354
:23B:CRED
:23E:PHOB/20.527.19.60
:32A:000526USD1101,50
:33B:USD1121,50
:50K:FRANZ HOLZAPFEL GMBH
VIENNA
:52A:BKAUATWW
:59:723491524
C. KLEIN
BLOEMENGRACHT 15
AMSTERDAM
:71A:SHA
:71F:USD10,
:71F:USD10,
:72:/INS/CHASUS33
-}{5:{MAC:75D138E4}{CHK:DE1B0D71FA96}}
Format MT104 :
{1:F01COPZBEB0AXXX0377002075}{2:O1041453110804LRLRXXXX4A1100009036981108041654N}{3:{108:MT104 002 OF 033}}{4:
:20:00130
:23E:AUTH
:30:001118
:52C:/34x
:21:16x
:32B:USD1,34
:50K:/34x
x
:59:/34x
35x
:33B:BEF2,
:71F:CAD1,34
:71G:USD1,34
:36:1,3456789012
:36:1,3456789012
:21:16x
:32B:USD1,34
:50K:/34x
x
:59:/34x
35x
:33B:BEF2,
:71F:CAD1,34
:71G:USD1,34
:36:1,3456789012
:36:1,3456789012
:21:16x
:32B:USD1,34
:50K:/34x
x
:59:/34x
35x
:33B:BEF2,
:71F:CAD1,34
:71G:USD1,34
:36:1,3456789012
:36:1,3456789012
:32B:USD3,34
:19:4,02
:71F:CAD1,34
:71G:USD1,34
-}{5:{MAC:00000000}{CHK:9F3A5F4F2532}{TNG:}}
Format MT202 :
{1:F01COPZBEB0AXXX0377002089}{2:O2021454110804LRLRXXXX4A1100009037121108041654N}{3:{108:MT103 003 OF 045}{121:c8b66b47-2bd9-48fe-be90-93c2096f27d2}}{4:
:20:00345
:21:123456/DEV
:13C:/A234567Z/1359+0100
:32A:071231EUR9980,
:58A:TESTSEVT
-}{5:{MAC:00000000}{CHK:7E0FAA1CFBE1}{TNG:}}
Format MT509 :
{1:F01COPZBEB0AXXX0377001940}{2:O5091449110804LRLRXXXX4A1100009035631108041649U}{3:{108:MT509 001 OF 004}}{4:
:16R:ADDINFO
:95P::MEOR//TESTUSVT
:95P::MERE//TESTUSVT
:16S:ADDINFO
-}{5:{MAC:00000000}{CHK:1A8015CB9899}{TNG:}}
Format MT900 :
{1:F01SIIBUS30AXXX0481250565}{2:O9001331080620LPLPXXXX4A0800001263100806200933N}{3:{108:MT900 005 OF 012}}{4:
:20:02629
:21:123456/DEV
:25:6-9412771
:32A:040229USD112,9
-}{5:{CHK:588D66867002}{TNG:}}
Format MT910 :
{1:F01SIIBUS30AXXX0481250566}{2:O9101331080620LPLPXXXX4A0800001263110806200933N}{3:{108:MT910 009 OF 034}}{4:
:20:02645
:21:123456/DEV
:25:6-9412771
:32A:000103USD112,
:52A:DNBANOKK
-}{5:{CHK:1477E5825C43}{TNG:}}
Format MT940 :
{1:F01COPZBEB0AXXX0377002460}{2:O9401506110804LRLRXXXX4A1100009040831108041707N}{3:{108:MT940 003 OF 058}}{4:
:20:02618
:21:123456/DEV
:25:6-9412771
:28C:00102
:60F:C000103USD672,
:62F:C000103USD987,
-}{5:{CHK:592A3DB2CA5B}{TNG:}}
Format MT942 :
{1:F01SIIBUS30AXXX0481250571}{2:O9421332080620LPLPXXXX4A0800001263160806200933N}{3:{108:MT942 005 OF 015}}{4:
:20:02761
:25:6-9412771
:28C:1/1
:34F:USD123,
:13D:0001032359+0500
:90D:75475USD123,
:90C:75475USD123,
-}{5:{CHK:F7C4F89AF66D}{TNG:}}
Format MT950 :
{1:F01SAESVAV0AXXX0466020565}{2:O9501552070522LRLRXXXX4A0700005915090705221752N}{3:{108:MT950 007 OF 030}}{4:
:20:02711
:25:210057665066
:28C:00196
:60F:C000103HKD672,
:61:000103D642,NRTI9999
CHECK NO. 57650
:62F:C000103HKD30,
-}{5:{CHK:22ED16B18106}{TNG:}}
Format MX CAMT026.001 :
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.026.001.04">
<UblToApply>
<Assgnmt>
<Id>UTACOMPAY12345090323001</Id>
<Assgnr>
<Pty>
<Id>
<OrgId>
<AnyBIC>CUSBGB2L</AnyBIC>
</OrgId>
</Id>
</Pty>
</Assgnr>
<Assgne>
<Agt>
<FinInstnId>
<BICFI>MMMMGB2L</BICFI>
</FinInstnId>
</Agt>
</Assgne>
<CreDtTm>2012-03-24T08:35:30</CreDtTm>
</Assgnmt>
<Case>
<Id>CUSBGB2L-20120323-001</Id>
<Cretr>
<Pty>
<Id>
<OrgId>
<AnyBIC>CUSBGB2L</AnyBIC>
</OrgId>
</Id>
</Pty>
</Cretr>
</Case>
<Undrlyg>
<Initn>
<OrgnlInstrId>COMPAY12345090323001</OrgnlInstrId>
<OrgnlInstdAmt Ccy="GBP">52317.48</OrgnlInstdAmt>
<ReqdExctnDt>2012-03-23</ReqdExctnDt>
</Initn>
</Undrlyg>
<Justfn>
<AnyInf>true</AnyInf>
</Justfn>
</UblToApply>
</Document>
Format MX PACS008.001 :
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.04" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FIToFICstmrCdtTrf>
<GrpHdr>
<MsgId>BBBB/120928-CCT/JPY/123</MsgId>
<CreDtTm>2012-09-28T16:00:00</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<SttlmInf>
<SttlmMtd>COVE</SttlmMtd>
<InstgRmbrsmntAgt>
<FinInstnId>
<BICFI>CCCCJPJT</BICFI>
</FinInstnId>
</InstgRmbrsmntAgt>
<InstdRmbrsmntAgt>
<FinInstnId>
<BICFI>AAAAJPJT</BICFI>
</FinInstnId>
</InstdRmbrsmntAgt>
</SttlmInf>
<InstgAgt>
<FinInstnId>
<BICFI>BBBBUS33</BICFI>
</FinInstnId>
</InstgAgt>
<InstdAgt>
<FinInstnId>
<BICFI>AAAAGB2L</BICFI>
</FinInstnId>
</InstdAgt>
</GrpHdr>
<CdtTrfTxInf>
<PmtId>
<InstrId>BBBB/120928-CCT/JPY/123/1</InstrId>
<EndToEndId>ABC/4562/2012-09-08</EndToEndId>
<TxId>BBBB/120928-CCT/JPY/123/1</TxId>
</PmtId>
<PmtTpInf>
<InstrPrty>NORM</InstrPrty>
</PmtTpInf>
<IntrBkSttlmAmt Ccy="JPY">10000000</IntrBkSttlmAmt>
<IntrBkSttlmDt>2012-09-29</IntrBkSttlmDt>
<ChrgBr>SHAR</ChrgBr>
<Dbtr>
<Nm>ABC Corporation</Nm>
<PstlAdr>
<StrtNm>Times Square</StrtNm>
<BldgNb>7</BldgNb>
<PstCd>NY 10036</PstCd>
<TwnNm>New York</TwnNm>
<Ctry>US</Ctry>
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<Othr>
<Id>00125574999</Id>
</Othr>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BICFI>BBBBUS33</BICFI>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BICFI>AAAAGB2L</BICFI>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>DEF Electronics</Nm>
<PstlAdr>
<StrtNm>Mark Lane</StrtNm>
<BldgNb>55</BldgNb>
<PstCd>EC3R7NE</PstCd>
<TwnNm>London</TwnNm>
<Ctry>GB</Ctry>
<AdrLine>Corn Exchange 5th Floor</AdrLine>
</PstlAdr>
</Cdtr>
<CdtrAcct>
<Id>
<Othr>
<Id>23683707994215</Id>
</Othr>
</Id>
</CdtrAcct>
<Purp>
<Cd>GDDS</Cd>
</Purp>
<RmtInf>
<Strd>
<RfrdDocInf>
<Tp>
<CdOrPrtry>
<Cd>CINV</Cd>
</CdOrPrtry>
</Tp>
<Nb>4562</Nb>
<RltdDt>2012-09-08</RltdDt>
</RfrdDocInf>
</Strd>
</RmtInf>
</CdtTrfTxInf>
</FIToFICstmrCdtTrf>
</Document>
Format SEPA :
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.02">
<FIToFICstmrCdtTrf>
<GrpHdr>
<MsgId>PSCXMILBGRAA20101115114110891</MsgId>
<CreDtTm>2013-11-07T11:41:10</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<TtlIntrBkSttlmAmt Ccy="EUR">20.00</TtlIntrBkSttlmAmt>
<IntrBkSttlmDt>2013-11-07</IntrBkSttlmDt>
<SttlmInf>
<SttlmMtd>CLRG</SttlmMtd>
<ClrSys>
<Prtry>ST2</Prtry>
</ClrSys>
</SttlmInf>
<InstdAgt>
<FinInstnId>
<BIC>BCYPCY2N</BIC>
</FinInstnId>
</InstdAgt>
</GrpHdr>
<CdtTrfTxInf>
<PmtId>
<InstrId>DEUTDE0920000891</InstrId>
<EndToEndId>NOTPROVIDED</EndToEndId>
<TxId>DEUTDEFF011OS10222891</TxId>
</PmtId>
<PmtTpInf>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
</PmtTpInf>
<IntrBkSttlmAmt Ccy="EUR">20.00</IntrBkSttlmAmt>
<ChrgBr>SLEV</ChrgBr>
<InstgAgt>
<FinInstnId>
<BIC>DEUTDEFFXXX</BIC>
</FinInstnId>
</InstgAgt>
<Dbtr>
<Nm>Debtor name</Nm>
<PstlAdr>
<Ctry>DE</Ctry>
<AdrLine>Indirizzo 1 Dbtr</AdrLine>
<AdrLine>Indirizzo 2 Dbtr</AdrLine>
</PstlAdr>
<Id>
<OrgId>
<Othr>
<Id>PT50078101120112001285102</Id>
<SchmeNm>
<Cd>BANK</Cd>
</SchmeNm>
</Othr>
</OrgId>
</Id>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE73340302860352858328</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BIC>DEUTDEFFXXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>BCYPCY2N</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>CREDITOR NAME</Nm>
<PstlAdr>
<Ctry>GR</Ctry>
<AdrLine>ADDRESS 1</AdrLine>
<AdrLine>ATHENS</AdrLine>
</PstlAdr>
<Id>
<OrgId>
<Othr>
<Id>PT60078101120112001285102</Id>
<SchmeNm>
<Cd>BANK</Cd>
</SchmeNm>
</Othr>
</OrgId>
</Id>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>GR2703801380000000000089777</IBAN>
</Id>
</CdtrAcct>
<RmtInf>
<Ustrd>Rem. Info</Ustrd>
</RmtInf>
</CdtTrfTxInf>
</FIToFICstmrCdtTrf>
</Document>
GraphQL est une alternative très sérieuse à RESTful. Ce qui me pose encore problème pour l'adopter définitivement c'est la carence en frameworks afin de parser/lexer les requêtes reçues via HTTP et d'en assurer le mapping côté base de données.
Ici GraphQL Java apporte une première pierre à cet édifice avec un exemple d'implémentation simple mais concret.
Plein d'exemple de layouts pour slides afin d'avoir des présentations dynamiques et intéressantes.
JDK8 AES-GCM code example. GitHub Gist: instantly share code, notes, and snippets.
Plein d'exemples simples pour apprendre Kotlin. Play Kotlin intègre même un runner et un éditeur pour tester les exemples sans avoir à installer quoi que ce soit.
Vous utilisez l'emailing dans votre stratégie marketing ? Ce dossier WebRankInfo détaille comment être conforme au RGPD avec l'envoi de mailing. Suivez les étapes et vous serez RGPD friendly !
Dit autrement, le RGPD pour les nuls, en 5 min et par l'exemple.
Les politiques économiques appliquées par la France depuis 5 Présidents de notre République à présent, sont toutes dictées par la Commission Européennes siégeant à Bruxelles via des GOPÉ (Grandes Orientation Politique et Économique).
Le Portugal ayant décidé de contrevenir à ces GOPÉ et, ayant le temps avant d'être obligé de les appliquer, en profite pour appliquer une politique économique contraire aux desiderata de Bruxelles et... Ça marche !
Via une river
Pour votre entreprise
Des alternatives à trello avec des exemples de GUI de boards Kanban.
Pour toi Chlouchloutte
Ce genre de boite pour la partie Story du Wiki-Story cela me semble bien. Qu'en penses-tu Lenny ?
Un exemple de menu déroulant
Un tutoriel sur le design pattern builder du GoF où les différentes complexité d'implémentation de ce design pattern sont illustrés. Félicitation à l'auteur, très bon article.
Un tuto sur iptables par l'exemple
D'autres exemples de CV design
Exemple de CV design
Ceux qui ont retenu mon attention :
Tout un tas de templates en CSS