Ce cours présente les techniques que l'on peut utiliser pour effectuer des calculs parallèles avec une machine. La première partie introduit à la notion de parallélisme et de processus. Elle présente ensuite comment lancer et manipuler des processus avec les modules subprocess et multiprocessing. On y voit également comment communiquer entre processus avec des Queue et des Pipe. La deuxième partie présente les threads et leur utilisation avec le module threading. On y voit également comment créer un pool de workers/executors pour exécuter des jobs. Enfin, la dernière partie présente le framework dispy qui permet de facilement faire du calcul distribué et exploiter le parallélisme de données.
Ce deuxième cours aborde la programmation réseau, c'est-à-dire le développement d'applications avec plusieurs composants qui communiquent entre eux via la réseau. Après une rapide présentation des protocoles UDP et TCP, le cours aborde la notion de socket et présente le module Python de même nom. Le cours présente deux applications concrètes : une application de chat (basé sur UDP) et une application echo (basé sur TCP). Le cours se termine par la découverte de la notion de protocole de communication et de la définition du format des messages échangés.
Ce cours présente les techniques que l'on peut utiliser pour effectuer des calculs parallèles avec une machine. La première partie introduit à la notion de parallélisme et de processus. Elle présente ensuite comment lancer et manipuler des processus avec les modules subprocess et multiprocessing. On y voit également comment communiquer entre processus avec des Queue et des Pipe. La deuxième partie présente les threads et leur utilisation avec le module threading. On y voit également comment créer un pool de workers/executors pour exécuter des jobs. Enfin, la dernière partie présente le framework dispy qui permet de facilement faire du calcul distribué et exploiter le parallélisme de données.
Ce deuxième cours aborde la programmation réseau, c'est-à-dire le développement d'applications avec plusieurs composants qui communiquent entre eux via la réseau. Après une rapide présentation des protocoles UDP et TCP, le cours aborde la notion de socket et présente le module Python de même nom. Le cours présente deux applications concrètes : une application de chat (basé sur UDP) et une application echo (basé sur TCP). Le cours se termine par la découverte de la notion de protocole de communication et de la définition du format des messages échangés.
Présentation sur l'open hardware à la conférence Toulibre de novembre 2012. Aperçu des différentes formes d'open hardware, de l'écosystème, des licences et des impacts de cette (r)évolution
Video sur http://vimeo.com/55273355
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cashStHack
The NoSuchCon challenge was published in September 2014, for the second edition of the NoSuchCon conference. The last step of this challenge consists in exploiting a remote cryptographic service used to store encrypted messages and keys. To solve this step, a timing attack against the CPU cache was used. The access time for certain memory areas is measured regularly.
The time spent reading those memory areas depends on previous hits, this side-channel information can be used to extract data. This talk will explain the technique commonly called "Cache Attack" based on some existing papers, a demonstration will be conducted showing the extraction of the RSA private key.
Dans cet exposé, on présentera OMicroB, une machine virtuelle OCaml pour microcontrôleurs à faibles ressources, inspirée des travaux précédents sur le projet OCaPIC. Cette machine virtuelle, destinée à être exécutée sur diverses architectures matérielles (AVR, PIC, ARM, ...) permet ainsi de factoriser le développement d’applications, mais aussi de généraliser l’analyse et le débogage du bytecode associé, tout en permettant un usage précautionneux de la mémoire. On cible alors des programmes ludiques ou de domotiques destinés à être exécutés sur des microcontrôleurs à faibles ressources, en insistant sur les particularités inhérentes à la programmation de systèmes embarqués.
Dans ce cours, on découvre comment lire et écrire des fichiers à l'aide de Python. Il est possible de créer des fichiers texte ou des fichiers binaires. Pour manipuler un fichier, il faut d'abord l'ouvrir, puis on peut faire les opérations et enfin on doit le refermer.
Cours dispensé à l'IUT de l'Indre sur la base des systèmes à microprocesseur
Objectif principal : démystifier le travail du compilateur en analysant le résultat de compilation d'un programme à l'issue de quelques séances de programmation en assembleur IA32.
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...StHack
Juin 2006, le NIST publie les spécifications de plusieurs générateurs de nombres pseudo-aléatoires, dont le tristement célèbre Dual_EC_DRBG, dans la norme NIST SP 800-90A, et cela malgré le scepticisme de la communauté crypto. Depuis, il a été démontré que ce générateur peut facilement être détourné pour rendre ses sorties totalement prévisibles, en faisant un cas d'école de kleptographie (ce qui n'a pas empêché qu'il soit utilisé).
Cette présentation technique donnera les bases nécessaires pour comprendre l'utilisation des courbes elliptiques en cryptographie et comment elles ont servi à corrompre ce générateur d'aléa.
Monitoring d'un compteur EDF avec node.js @bdx.iolaurenthuet
Venez voir comment coupler votre compteur EDF à une carte RaspberryPi / Beaglebone / ... pour avoir une vision temps réel de votre consommation électrique.
Coté hardware, un montage électronique rudimentaire est utilisé (< 2 €).
Coté soft, Node.js, MongoDB et AngularJS constituent les briques applicatives principales.
Présentation sur l'open hardware à la conférence Toulibre de novembre 2012. Aperçu des différentes formes d'open hardware, de l'écosystème, des licences et des impacts de cette (r)évolution
Video sur http://vimeo.com/55273355
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cashStHack
The NoSuchCon challenge was published in September 2014, for the second edition of the NoSuchCon conference. The last step of this challenge consists in exploiting a remote cryptographic service used to store encrypted messages and keys. To solve this step, a timing attack against the CPU cache was used. The access time for certain memory areas is measured regularly.
The time spent reading those memory areas depends on previous hits, this side-channel information can be used to extract data. This talk will explain the technique commonly called "Cache Attack" based on some existing papers, a demonstration will be conducted showing the extraction of the RSA private key.
Dans cet exposé, on présentera OMicroB, une machine virtuelle OCaml pour microcontrôleurs à faibles ressources, inspirée des travaux précédents sur le projet OCaPIC. Cette machine virtuelle, destinée à être exécutée sur diverses architectures matérielles (AVR, PIC, ARM, ...) permet ainsi de factoriser le développement d’applications, mais aussi de généraliser l’analyse et le débogage du bytecode associé, tout en permettant un usage précautionneux de la mémoire. On cible alors des programmes ludiques ou de domotiques destinés à être exécutés sur des microcontrôleurs à faibles ressources, en insistant sur les particularités inhérentes à la programmation de systèmes embarqués.
Dans ce cours, on découvre comment lire et écrire des fichiers à l'aide de Python. Il est possible de créer des fichiers texte ou des fichiers binaires. Pour manipuler un fichier, il faut d'abord l'ouvrir, puis on peut faire les opérations et enfin on doit le refermer.
Cours dispensé à l'IUT de l'Indre sur la base des systèmes à microprocesseur
Objectif principal : démystifier le travail du compilateur en analysant le résultat de compilation d'un programme à l'issue de quelques séances de programmation en assembleur IA32.
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...StHack
Juin 2006, le NIST publie les spécifications de plusieurs générateurs de nombres pseudo-aléatoires, dont le tristement célèbre Dual_EC_DRBG, dans la norme NIST SP 800-90A, et cela malgré le scepticisme de la communauté crypto. Depuis, il a été démontré que ce générateur peut facilement être détourné pour rendre ses sorties totalement prévisibles, en faisant un cas d'école de kleptographie (ce qui n'a pas empêché qu'il soit utilisé).
Cette présentation technique donnera les bases nécessaires pour comprendre l'utilisation des courbes elliptiques en cryptographie et comment elles ont servi à corrompre ce générateur d'aléa.
Monitoring d'un compteur EDF avec node.js @bdx.iolaurenthuet
Venez voir comment coupler votre compteur EDF à une carte RaspberryPi / Beaglebone / ... pour avoir une vision temps réel de votre consommation électrique.
Coté hardware, un montage électronique rudimentaire est utilisé (< 2 €).
Coté soft, Node.js, MongoDB et AngularJS constituent les briques applicatives principales.
Venez voir comment "hacker" des objets de votre maison pour en faire des "objets connectés" en réutilisant vos compétences de développeur.
Des exemples de montages et de code seront présentés, entre autres :
- Comptage électrique (téléinfo)
- Monitoring de température (hacking de station météo radio)
- Contrôle d'équipements (Chauffage, VMC, Volets roulants, ...)
- RaspberryPi, BeagleBone Black et Arduino seront les principaux ingrédients.
Comment développer un serveur métier en python/C++cppfrug
Quelles sont les problématiques d'interfaçage, les avantages/inconvénients des langages, la stratégie de code, etc. dans le développement d'un serveur métier ?
Introduction à la programmation lock-free en C++11 au moyen des atomics. Présentation données par Cyril Comparon lors des rencontres C++ de Montpellier (novembre 2014).
Présentation effectuée au Meetup Programmez (08 septembre 2020)par Christophe Villeneuve sur "Etes-vous prêt pour PHP 8 ?".
Vous allez voir l'avancement du langage PHP, les nouveautés, les améliorations
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchMourad DACHRAOUI
Retour d'experience sur l'utilisation de spray dans le cadre de Mogobiz. Explication de la technique du "Magnet Pattern" et présentation des bénéfices de l'utilisation de Rx.
http://j.mp/psug43Xebia
Le package java.net et les API réseau de Java
Les Sockets Java
Les sockets en mode connecté
Un serveur TCP/IP
Un client TCP/IP
Les échanges de données
Les classes de connexion
2. Ateliers: Initiation
en Arduino
• 3 Ateliers
Ateliers: Envoi
des données
capte vers une
base de donnée
MySQL
• 1 Atelier
Ateliers:
Réception de
donnée par les
éléments Arduino
• 1 Atelier
4. Atelier 1 : Initiation en Arduino
Prototype de la
fonction
Description Paramètres
pinMode(pin, mode) Configure la broche spécifiée pour se comporter en
entrée ou en sortie
pin: numéro de la
broche
mode: INPUT, OUTPUT
ou INPUT_PULLUP
delay(ms) Met le programme en pause pendant une durée
spécifié
ms: nombre de
millisecondes à
suspendre
digitalWrite(pin, value) -broche configurée comme une OUTPUT:
HIGH Tension 5 V ou 3,3 V
LOW Tension 0 V
-broche configurée comme une INTPUT:
HIGH active le pullup interne sur la broche
d'entrée
LOW désactive le pullup interne sur la broche
pin: numéro de la
broche
value: HIGH ou LOW
8. Atelier 2 : Initiation en Arduino
Prototype de la
fonction
Description Paramètres
Servo.attach(PIN) Prend en argument un unique paramètre obligatoire
correspond au numéro de broche sur laquelle le
servomoteur est câblé
PIN: numéro de la
broche
Servo.write (N) Permet de modifier l'angle du bras du servomoteur en
donnant en paramètre l'angle en question, sous la
forme d'un nombre entier compris entre 0° et 180°
N: angle et varie entre 0°
et 180°
Serial.begin (vitesse) Définit le débit de données en bits par seconde (bauds)
pour la transmission de données en série.
Vitesse: en bits par
seconde (bauds)
exemple 115200
12. Atelier 3 : Initiation en Arduino
Prototype de la fonction Description Paramètres
Serial.print(val) Imprime les données sur le port série sous forme
de texte ASCII lisible par l'homme.
val: la valeur à imprimer -
n'importe quel type de
données
Serial.println(val) Imprime les données sur le port série en tant que
texte ASCII lisible par un humain suivi d'un
caractère de retour chariot (ASCII 13 ou ' r') et
d'un caractère de nouvelle ligne (ASCII 10 ou '
n').
val: la valeur à imprimer -
n'importe quel type de
données
dht(DHTPIN, DHTTYPE) Initialisation du capteur DHT DHTPIN: numéro de la
broche
DHTTYPE: type du capteur
DHT
dht.readHumidity(); lecture de la valeur de l'humidité
dht.readTemperature() lecture de la valeur de la température en degrés
Celsius
14. Atelier 3 : Initiation en Arduino
DHT11 Arduino Uno
Ground (-) GND
Vcc (+) 3.3v
Signal Broche (exemple: 2)
15. Atelier : Envoi des données capte vers
une base de donnée MySQL
16. Atelier : Envoi des données capte vers une
base de donnée MySQL
Prototype de la
fonction
Description Paramètres
WiFi .begin (ssid,
passe)
Initialise les paramètres réseau de la
bibliothèque WiFi et fournit l’état actuel
ssid : nom du réseau WiFi
pass : mot de passe
WiFi.status() Renvoie le statut de la connexion
server(port) Initialisation du serveur port : numéro de port
client.connect(ip,port)
client.connect(url,port)
Connectez-vous à l'adresse IP et au port spécifiés
dans le constructeur. La valeur de retour indique le
succès ou l'échec.
port : numéro de port
ip: l'adresse IP à laquelle le
client se connectera (tableau
de 4 octets)
URL: le nom de domaine
auquel le client se
connectera (string,
ex.:"arduino.cc ")
17. Atelier : Envoi des données capte vers une
base de donnée MySQL
#include <ESP8266WiFi.h>
#include <DHT.h>
#include <WiFiClient.h>
#define DHTPIN 2
#define DHTTYPE DHT11
const char* ssid = "AndroidAP";
const char* password = "123";
WiFiServer server(80);
const char* host= "temperature-
humidity.000webhostapp.com";
DHT dht(DHTPIN, DHTTYPE);
WiFiClient client;
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
WiFi.mode(WIFI_STA);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
server.begin();
Serial.println("Server started");
Serial.println(WiFi.localIP());
}
18. Atelier : Envoi des données capte vers une
base de donnée MySQL
void loop() {
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
return;
}
else {
float hif = dht.computeHeatIndex(f, h);
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
}
String data = "TEMP=";
data += t;
data += "&HUM=";
data += h;
if(client.connect(host,80)) {
client.println("GET /add1.php?"+ data +" HTTP/1.1");
client.println("Host: temperature-humidity.000webhostapp.com");
client.println("Connection: close");
client.println();
}
}
19. Atelier : Envoi des données capte vers une
base de donnée MySQL
<?php
$mysql_host = "localhost";
$mysql_database = "id6240287_arduino";
$mysql_user = "id6240287_root";
$mysql_password = "12345";
// Create connection
$conn = new mysqli($mysql_host, $mysql_user, $mysql_password,$mysql_database);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$temp1=$_GET["TEMP"];
$hum1=$_GET["HUM"];
$dt = new DateTime();
$dt = $dt->format('Y/m/d/h/i/s');
20. Atelier : Envoi des données capte vers une
base de donnée MySQL
$sql = "SELECT id, temperature, humidity FROM templog2 WHERE id IN (SELECT MAX(id) FROM
templog2)";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$temp= $row["temperature"];
$hum= $row["humidity"] ;
$id = $row["id"] ;
}
}
21. Atelier : Envoi des données capte vers une
base de donnée MySQL
if($temp1!=$temp || $hum1!=$hum){
$req = "INSERT INTO templog2 (temperature, humidity, DateEnreg) VALUES
('".$temp1."','".$hum1."','".$dt."')";
$conn->query($req);
}
else{
$upt = "UPDATE templog2 SET DateEnreg='".$dt."' WHERE id='".$id."'";
$conn->query($upt);
}
$conn->close();
?>
22. Atelier : Envoi des données capte vers une
base de donnée MySQL
ESP8266 v1 Arduino Uno
VCC 3.3 V
GND GND
RX RX
TX TX
CH_PD 3.3 V
RST -
GPI0 0 GND
GPI0 2 -
23. Atelier : Envoi des données capte vers une
base de donnée MySQL
https://www.youtube.com/watch?v=-wslrHr8xyI
24. Atelier 1 : Réception de donnée par les
éléments Arduino
25. Atelier : Réception de donnée par les
éléments Arduino
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
const char* ssid = "AndroidAP";
const char* password = "123";
String path= "/projects/etat.json";
const char* host = "192.168.43.2";
int led1 = D0;
int led2 = D1;
int led3 = D2;
int led4 = D6;
int led5 = D7;
int led6 = D8;
WiFiClient client;
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
Serial.begin(115200);
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address: " + WiFi.localIP());
}
26. Atelier : Réception de donnée par les
éléments Arduino
void loop() {
if(client.connect(host,80)) {
client.print(String("GET ") + path + " HTTP/1.1rn" +
"Host: " + host + "rn" + "Connection: keep-
alivernrn");
delay(500);
String section="header";
while(client.available()){
String line = client.readStringUntil('r');
if (section=="header") { // headers..
Serial.print(".");
if (line=="n") { // skips the empty space at the
beginning
section="json";
}
}
else if (section=="json") { // print the good stuff
section="ignore";
String result = line.substring(1); // Parse JSON
int size = result.length() + 1;
char json[size];
result.toCharArray(json, size);
StaticJsonBuffer<200> jsonBuffer;
JsonObject& json_parsed = jsonBuffer.parseObject(json);
if (!json_parsed.success())
{
Serial.println("parseObject() failed");
return;
}
27. Atelier : Réception de donnée par les
éléments Arduino
if (strcmp(json_parsed["led"], "vert") == 0) {
digitalWrite(led3, LOW);
digitalWrite(led2, LOW);
digitalWrite(led5, LOW);
digitalWrite(led4, LOW);
digitalWrite(led1, HIGH);
digitalWrite(led6, HIGH);
Serial.println("vert vs rouge");
}
else if (strcmp(json_parsed["led"], "rouge") == 0) {
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led6, LOW);
digitalWrite(led5, LOW);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
Serial.println("rouge vs vert");
}
else if (strcmp(json_parsed["led"], "orange") == 0) {
digitalWrite(led1, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led6, LOW);
digitalWrite(led2, HIGH); // allumer la LED
(tension 5V sur la broche)
digitalWrite(led5, HIGH);
Serial.println("orange vs orange");
}
}
30. Atelier : Réception de donnée par les
éléments Arduino
<?php
$led = $_GET['led'];
if($led == "vert") {
$file = fopen("etat.json", "w") or die("can't open file");
fwrite($file, '{"led": "vert"}');
fclose($file);
}
else if ($led == "rouge") {
$file = fopen("etat.json", "w") or die("can't open file");
fwrite($file, '{"led": "rouge"}');
fclose($file);
}
else if ($led == "orange") {
$file = fopen("etat.json", "w") or die("can't open file");
fwrite($file, '{"led": "orange"}');
fclose($file);
}
?>
31. Atelier : Réception de donnée par les
éléments Arduino
LED ESP8266 v3
- GND (G)
+ Broche (exemple: D1)
Notes de l'éditeur
Pullup: resistances de rappel interne Arduino 50000 ohms
Isnan: is not a number
dht.computeHeatIndex(f, h):Calculer l'indice de chaleur en degrés Fahrenheit
dht.computeHeatIndex(t, h, false): Calculer l'indice de chaleur en degrés Celsius
Wificlient Crée un client pouvant se connecter à une adresse IP Internet et à un port spécifiés
VCC, Voltage (+3.3 V; can handle up to 3.6 V)
GND, Ground (0 V)
RX, Receive data bit X
TX, Transmit data bit X
CH_PD, Chip power-down
RST, Reset
GPIO 0, General-purpose input/output No. 0
GPIO 2, General-purpose input/output No. 2