Comment builder sa version de Chromium embarquée pour du Java.
Le site du projet : https://bitbucket.org/chromiumembedded/java-cef
Les pré-requis à avoir pour le build (version de GCC, la GLIBC toussa) : https://bitbucket.org/chromiumembedded/java-cef/wiki/BranchesAndBuilding
Un tuto de build sur Stackoverflow : http://stackoverflow.com/questions/21192279/how-to-integrate-chromium-embedded-framework-cef-with-java
Avec un copier-coller du tuto pour exécuter un build en C/C++ de Chromium :
Yes!
It took me a short time to initialize a JCEF project. Following is steps i did:
Please note that i use Maven Project and JVM 64bit
Download JCEF and extract it JCEF
Declare Environment Variable to point to ${EXTRACT_DIR}/bin/lib/win64
Install following files in local repository: ${EXTRACT_DIR}/bin/{gluegen-rt.jar,
gluegen-rt-natives-windows-amd64.jar, jogl-all.jar,
jogl-all-natives-windows-amd64.jar, jcef.jar}.
Example: mvn install:install-file -Dfile=gluegen-rt.jar -DgroupId=org.jcef -DartifactId=gluegen -Dversion=1.0 -Dpackaging=jar
Create a maven project and declare installed artifacts in pom.xml
Copy sample: ${EXTRACT_DIR}/bin/tests/simple/MainFrame.java to your project and try it
Un comparatif de performance entre différents serveur web expressifs du type Sparkjava (en java) et Sinatra (en Ruby). Pour rappel, un serveur web expression vous permet d'écrire ce genre de choses :
get("/mon/url", monAction);
post("/mon/url", monAction);
Avec "monAction" qui peut être au choix :
- une lambda
- une instance
- un pointeur sur fonction
En résumé, nous avons les résultats suivants sur un Retina Macbook Pro i7@2.7GHz and 16GB RAM :
-
Golang + bmizerany Pat + GOMAXPROCS(7):
51684 Requests/sec => 1550508 requests in 30s -
Sparkjava:
48631.24 Requests/sec => 1458768 requests in 30s
Average Latency 1.29ms -
Golang + bmizerany Pat:
42222 Requests/sec => 1266661 requests in 30s
Average Latency 1.52ms -
Golang + Gorilla Pat (using Gorillas Muxer)
37756 Requests/sec => 1132689 requests in 30s
Average Latency 1.71ms -
PyPy2.7 Python + Twisted:
12633 Requests/sec => 379001 requests in 30s -
Python + Flask:
11751 Requests/sec => 16393 requests in 30s
Average Latency 55.54ms -
Node + Express:
8962 Requests/sec => 268866 requests in 30s
Average Latency 7.14ms -
Python + Twisted:
3425 Requests/sec => 102781 requests in 30s
Je ne suis pas une grande fana de Gradle (je n'aime pas avoir du code dans ma configuration de build, parce que cela transforme ma configuration tout bête et déclarative, en un script avec du code potentiellement très compliqué dedans).
Apache Buildr reprend les bonnes pratiques de Maven c'est-à-dire :
- Séparer la partie du build qui exécute quelque chose (les plugins)
- De la partie qui dit quoi exécuter et quand (le pom.xml)
L'autre bénéfice, c'est que cela vous pousse à simplifier votre processus de build plutôt que de couvrir votre dette technique avec un script Groovy/Gradle par-dessus : on ne résout pas un problème d'organisation avec du code, il faut être soit débile (cf. écrits de Deleuze) soit un gros nerd à moitié taré pour penser ça car ce faisant on ne remonte pas à la root cause du problème. #MonPointDeVue #SiTuTeSensViséTesKunKon.
Gradle promeut cette croyance de noob qui dit que fusionner la préoccupation de workflow de build avec la préoccupation d'exécution (c'est-à-dire avec du code, avec des if-then-else, while-for, throw-catch...) c'est jeun's, cool, rebelle et vachement-plus-rapide-nempêche. Or si vous m'avez suivi jusque-là, vous comprenez en quoi il est essentiel de séparer ces préoccupations !
C'est pour cela que Maven force les gens à développer des plugins, pour que ce travers de tout mélanger par fainéantise ne vous gagne pas. Une dette technique impardonnable en Java depuis 2010, c'est bien celle qui se situe au niveau du build, alors en 2016, c'est juste une honte.
La page Oracle contenant une bonne partie des options que l'on peut passer à une JVM HotSpot.
Comment embarquer un moteur de rendu HTML / JS en Java
Comment configurer un projet Spring 4 avec les annotations.
Fourni en prime une démo sympa de la couche hibernate et de spring-orm.
L'encodage UTF-8 (et UTF-16) sur la machine virtuelle d'Oracle.
Un article parlant des mécanismes d'optimisation de la JVM. Je me le garde sous le coude pour plus tard
Un tuto toujours sympa à connaître
Un petit rappel pour Chlouchoutte (sujet que nous avions abordé toutes les deux il y a quelques semaines)
La fameuse et célèbre librairie de cryptographie en Java
Installer une JVM à la main sans les droits root.
Je copie-colle l'astuce :
JDK is not available as a portable ZIP file, unfortunately. However, you can follow these steps:
- Create working JDK directory (C:\JDK in this case)
- Download latest version of JDK from Oracle (for example jdk-7u7-windows-x64.exe)
- Download and install 7-Zip (or download 7-Zip portable version if you are not administrator)
- With 7-Zip extract all the files from jdk-XuXX-windows-x64.exe into the directory C:\JDK
- Execute the following commands in cmd.exe:
- cd C:\JDK.rsrc\1033\JAVA_CAB10
- extrac32 111
- Unpack C:\JDK.rsrc\1033\JAVA_CAB10\tools.zip with 7-zip
- Execute the following commands in cmd.exe:
- cd C:\JDK.rsrc\1033\JAVA_CAB10\tools\
- for /r %x in (*.pack) do .\bin\unpack200 -r "%x" "%~dx%~px%~nx.jar" (this will convert all .pack files into .jar files)
- Copy all contents of C:\JDK.rsrc\1033\JAVA_CAB10\tools where you want your JDK to be
- Setup JAVA_HOME and PATH manually to point to your JDK dir and its BIN subdirectory.
Une lib 3D pour faire des jeux en Java (pour Chlouchloutte)
À lire plus tard sur le garbage collector.
Charger un Tomcat embarqué + la création de servlet codée en Java (donc sans config XML). Pas mal
Comment embarquer un Jetty ou un Tomcat dans une webapp Java qui se démarre en stand-alone.
Un résumé d'une bonne partie des lambas (Consumer, BiFunction, Function, Predicate) et des pointeurs sur fonctions.
Toujours sur les tutos en Java 8 je vais essayer de vous expliquer les mapper et la méthode .map de l'API Stream.
Définition 'Mapper' :
Objet ou fonction permettant de convertir un élément en un autre élément.
Exemple :
J'ai une liste de String :
List<String> list = ...;
Que je souhaite convertir en ceci :
List<Integer> sizes; // qui contient la taille de chacune des String de la liste précédente.
En vieux Java j'écrirais :
private List<Integer> convert(List<String> strList) {
List<Integer> result = new ArrayList<>(list.size());
for (String str : strList) {
result.add(str.size());
}
return result;
}
En lambda j'écrirai :
private List<Integer> convert(List<String> strList) {
return strList.stream().map(str -> str.size()).toList();
}
Et votre mapper c'est cette petite lamdba 'str -> str.size()' qui sera appliquée à chaque élément de la liste un par un.
Je continue ma série de tutos sur les technos manquées en Java 7 et 8. Ici les Callable.
Ce sont des Runnable mais qui peuvent retourner un objet (je vous renvoie aux principes de la programmation asynchrone en JavaScript).