Hello le magicien du code est de retour. Yesseuh ! i’m here. Je vais vous parler aujourd’hui d’une technologie que j’ai découvert il y’a quelques mois. Merci à @mbeuryonline  pour le partage 🙂 . D’habitude quand je découvre une nouvelle techno j’en parle en premier à mon master @Khadim210 et à quelques passionnés que je connais. Mais après discussions j’ai trouvé qu’elle était méconnue de tous c’est ainsi que je me suis mis au four pour ainsi l’appréhender très tôt.

Avec l’essor des réseaux sociaux, le développement des Objets connectés et l’émergence  du Nosql on s’était tous mis d’accord que le big data était un potentiel dans l’avenir de l’informatique. Après réflexion les informaticiens ont pensé encore mieux, au lieu de stocker les données simplement, maintenant on va les étudier et les comprendre. Ahh le Machine Learning a alors fait ses preuves. J’y ai  cru vraiment au Machine learning mais actuellement on va se tourner vers la Blockchain.

La blockchain est née avec la crypto-monnaie Bitcoin. Il est alors important de comprendre c’est quoi le Bitcoin puisque toutes les implémentations de blockchain utilise sa philosophie. Alors c’est quoi le Bitcoin ? Le Bitcoin est un réseau Peer to Peer qui permet d’envoyer de l’argent sans passer par aucune entité centrale telle qu’une banque.

Euh certains me diront que c’est easy sans passer par une banque on peut voler de l’argent ou faire du trafic. Lol non !!! Le Bitcoin utilise des techniques de cryptographies bien connues et des structures de données un peu complexes pour assurer la sécurité. Ce sont ces moyens qui le rendent invulnérable.

Notions Cryptographiques

  • Fonction de  Hachage ou « Hash »

Pour faire simple on va procéder par exemple.  On dispose d’un mot quelconque par exemple « passerpasser ». On applique à cet mot une fonction mathématique de Hachage et on trouve «5G+C3VIdmGmvnf6A/kh5FX+2Ul8Spao83fQ/IMQHoiz8kf/VBI38BS66QOPtjrBCgfddVpJoxa2pDnUsYEV6xA== ». J’ai utilisé la fonction de hachage SHA512 intégrée dans le système de sécurité de Symfony 2 (i love this Framework Yeah !!!).

Donc pour résumer la fonction de hachage prend une entrée quelconque de chaîne de caractère  et retourne à la fin un résultat unique et irréversible.

  • La signature Électronique

Qui n’a jamais voulu signer un papier électroniquement sans l’imprimer ? La signature électronique a pour but de prouver que vous êtes bien l’émetteur du message. Bon ici on ne dispose pas de stylo pour signer mais plutôt de clés.

L’émetteur d’un message possède 2 clés : une clé publique et une clé privée. La clé privée est utilisée pour faire signer le message donc en aucun cas vous ne devez la divulguer. La signature électronique sera en fait un  Hash généré après avoir fait passé le message et la clé privée à une fonction de Hachage. Le récepteur peut vérifier l’identité de l’émetteur en appliquant une autre fonction de Hachage prenant en paramètre la signature, le message et la clé publique de l’émetteur. Il est à signaler que sniffer la signature sur le réseau ne vous permettra pas de retrouver la clé privé de l’émetteur.

Notion de structures de données (Il fallait être présent à vos cours d’Algorithmique ahhhh)

  • La chaîne de blocs (block chain)

Vous vous souvenez de vos cours en langage C sur les listes chaînées ?? Voilà c’est à peu près la même chose. On dispose d’une structure en forme de blocs relié les uns aux autres. Contrairement aux listes chaînées où on stockait l’adresse du pointeur suivant ici chaque bloc contient le Hash du bloc précédent. Chaque bloc dispose  d’un hash qui est déterminé en fonction des données stockées. L’avantage avec ce modèle est que toute modification du Hash d’un bloc entraîne la modification du Hash précédent.

  • Arbre de Merkle

Bon je ne suis pas votre prof d’algorithmique allez en cours ou bien suivez ce lien après on fera des calculs de complexité.

C’est quoi la blockchain ?

La blockchain c’est avant tout une promesse. Une promesse de se faire confiance mutuellement sans se connaître et sans intermédiaire. Pour se faire la blockchain enregistre dans un grand registre accessible à tout le monde l’historique des transactions. Vous voulez vendre un acte de maison ou échanger de la monnaie (Bitcoin) tout est ajouté à la blockchain. Ce registre est un système informatique sous forme de blocs qui regroupe toutes la transaction.

 

2

Avant de valider une transaction des machines ou personnes appelées Mineurs vérifient que vous possédez vraiment ce que vous dite avant de valider la transaction. Pour ma part je dirais que la blockchain est une base de données distribuées qui est ACD. Vous vous souvenez de votre cours en base de données (Merci à mon master @khadim210).

A l’image d’une base qu’on qualifierait d’ACID ici moi je dirais que la blockchain est ACD.

A = Atomicité: qui correspond à l’indivisibilité des opérations de la transaction. Soit le tout est validé ou le tout est rejeté.

C = Cohérence: Une transaction doit laisser la blockchain cohérente avant comme après la transaction. Cette cohérence est assurée par les Mineurs qui assurent la validité des transactions.

D= La durabilité: Les résultats valides d’une transaction sont mis dans un bloc puis horodaté  et ajouté à la blockchain. On y inscrit aussi le Hash du bloc précédent pour garder sa cohérence et elle distribuée à tout le monde.

Cette distribution rend la base de données infalsifiable puisque chaque utilisateur possède une copie de la base en local. Pour la modifier il faut alors altérer en même temps pour tous les utilisateurs connectés.

J’ai préféré enlever le I de ACID ici puisque dans la littérature sur les bases de données transactionnelles on suppose que les résultats intermédiaire d’une transaction sont invisibles aux autres transactions en cours alors que dans la blockchain ce n’est  pas le cas. Ici tout est visible par tout le monde.

C’est quoi un mineur ?

Un mineur c’est vous, moi ou toute personne connectée sur la blockchain qui utilise des formules mathématiques pour vérifier si une transaction est valide. Pourquoi connecter sa machine pour vérifier pour les autres ? Les mineurs sont payés après chaque transaction valide. Certains mineurs peuvent se faire presque vers 1200 euros par mois. Il faut avoir de la puissance de calcul et une bonne connexion pour faire ces vérifications. Les techniques utilisées par les mineurs dépendent de la blockchain. Dans la blockchain du Bitcoin cette technique est appelée le “Proof-of-Work”, preuve de travail, et constitue en la résolution de problèmes algorithmiques.

Comment ça marche ?

1

Je précise que les Machine A et  B communiquent en utilisant leurs clés publiques. Et tant que personne ne divulgue sa clé privée il est impossible de connaître son identité.

Implémentation (Le cas de Ethereum)

Je sais que vous voulez du code mais on ne codera pas today :p. Je vais vous parlez enfin de Ethereum. En une phrase, Ethereum est un ordinateur mondial, que n’importe qui peut programmer et utiliser comme il le souhaite. Cet ordinateur est toujours allumé, il est très sécurisé, et tout ce qui est fait à l’aide de cet ordinateur est public. Ethereum vous permet d’écrire des dApp (Application décentralisée). Pour interagir avec la blockchain on crée de petits programmes appelés « smart contract ». Si vous êtes un amoureux de JavaScript et du langage C vous ne serez pas dépaysé. Je reviendrais dans un autre article sur l’implémentation des « smart contrat ». Les « smart contrats »  sont des programmes intelligents qui une fois  les conditions d’exécution de ces engagements sont réunies, ceux-ci s’exécutent automatiquement sur la blockchain, en prenant en compte l’ensemble des conditions et des limitations qui avaient été programmés dans le contrat à l’origine.

Le potentiel de la blockchain

Aujourd’hui personnellement je crois que l’avenir sera tourné vers la blockchain. Il n’existe pas encore trop d’experts et il est opportun pour nous jeune passionné et africain de saisir cette chance et apporter un plus à cette technologie. La blockchain dispose d’un champ d’exploitation assez large: banques, assurance, immobilier, santé, énergie, transports, vote en ligne, etc.

De façon générale, des blockchains pourraient remplacer la plupart des « tiers de confiance » centralisés (métiers de banques, notaires, cadastre,…) par des systèmes informatiques distribués. Actuellement nous pouvons appliquer la blockchain dans le E-Gouvernance surtout en Afrique car il n’est pas toujours évident de faire confiance à nos dirigeant. On pourrait ainsi les remplacer par des applications ultra smart.

Bonne Lecture c’était Thierno Thiam aka Localhost  à l’antenne depuis les ténèbres des codes sources !!!!

Hello !

Wow ça fait exactement 251 jours que je n’ai pas de partage avec vous le temps passe tellement vite, je suis désolé. Ces temps ci j’étais sur les codes, config de serveurs, tests, optimisations, … bref. Mais ne vous inquiétez j’ai des surprises pour vous alors stay tuned 😉

Avant de commencer je vais vous donner la définition de Web Scraping d’après Wikipédia :

Le web scraping (parfois appelé Harvesting) est une technique d’extraction du contenu de sites Web, via un script ou un programme, dans le but de le transformer pour permettre son utilisation dans un autre contexte.

La semaine passé j’ai remarqué que mon collègue regardait les parutions de gbitch à chaque fois qu’il avait du temps libre. Des fois il a du mal à le lire à cause d’une connexion qui n’est pas stable. Alors je lui ai proposé d’écrire un script pour extraire toutes les images en local 🙂 D’accord je vais vous montrer comment j’ai fait. C’est un tout petit script de rien du tout.

J’ai commencé par analyser la structure de la partie qui nous intéresse sur la page. Je vais vous faire une capture d’écran :

Capture du 2015-06-29 06:50:54

 

Comme vous pouvez le voir nous avons la liste des collections (des images) et une pagination. Ça c’est notre première page maintenant on regarde le code sources de la pagination pour voir si on peut extraire la liste des autres pages. Il suffit de faire un simple clic droit et inspecter le code :

Capture du 2015-06-29 06:57:21

Voilà ! Les liens se trouvent sur une balise a.numero_page qui sont dans un bloc div#other_une donc on peut dire que le sélecteur CSS pour accéder à la liste des urls est : #other_une a.numero_page.

Maintenant on fait la même chose avec les images :

Capture du 2015-06-29 08:29:19

D’après le code source on peut dire que le sélecteur CSS pour accéder aux images est le suivant : .unegbich img.

C’est tout ce dont nous avons besoin pour extraire les URL des images. Maintenant passons au script.

Nous allons utiliser deux gems : rest_client qui va nous permettre de récupérer le code HTML d’une page web et la gem nokogiri qui est un parseur HTML et XML. Pour les installer il faut taper ces deux commandes (il faut mettre sudo devant si le système l’exige)

gem install rest_client
gem install nokogiri

première étape : récupération des URL des pages.

require 'nokogiri'
require 'rest_client'

base_url = "http://gbich.com/"
lien = "#{base_url}index.php?choix=collectionune&&limite=0"
html = RestClient.get(lien)
doc = Nokogiri::HTML(html)
pages = doc.css("#other_une a.numero_page")
pages.map! { |p| p['href'] }
puts pages

Nous avons récupérer le code HTML de la page avec RestClient.get(lien) puis le parser avec le code Nokogiri::HTML(html) et enfin récupérer la liste des urls des pages avec le sélecteur CSS doc.css("#other_une a.numero_page"). On obtiendra le résultat suivant après l’exécution du script :

#
index.php?choix=collectionune&&limite=30
index.php?choix=collectionune&&limite=60
index.php?choix=collectionune&&limite=90
index.php?choix=collectionune&&limite=120
index.php?choix=collectionune&&;limite=150
index.php?choix=collectionune&&;limite=180
index.php?choix=collectionune&&;limite=210
index.php?choix=collectionune&&;limite=240
index.php?choix=collectionune&&;limite=270
index.php?choix=collectionune&&;limite=300
index.php?choix=collectionune&&;limite=330
index.php?choix=collectionune&&;limite=360
#
index.php?choix=collectionune&&limite=30
index.php?choix=collectionune&&limite=60
index.php?choix=collectionune&&limite=90
index.php?choix=collectionune&&limite=120
index.php?choix=collectionune&&;limite=150
index.php?choix=collectionune&&;limite=180
index.php?choix=collectionune&&;limite=210
index.php?choix=collectionune&&;limite=240
index.php?choix=collectionune&&;limite=270
index.php?choix=collectionune&&;limite=300
index.php?choix=collectionune&&;limite=330
index.php?choix=collectionune&&;limite=360

Il a doublé urls, en fait il y a une pagination avant et après la liste des images c’est pourquoi on a ce résultat. Maintenant ce qu’on va faire c’est enlever l’ancre « # » de la liste et prendre la moitié du tableau puis mettre l’URL de base (http://gbich.com/) sur les liens et enfin ajouter le premier lien sur la liste. On ajoute ces 4 petites lignes :

pages -= ['#']
pages = pages[0..pages.size/2-1]
pages.map! { |p| base_url+p }
pages = ["http://gbich.com/index.php?choix=collectionune&&limite=0"] + pages

deuxième étape : récupération les URLs des images à extraire.

On ajoute ces lignes sur le script :

images = []
for page in pages
  html = RestClient.get page
  doc = Nokogiri::HTML(html)
  for r in doc.css(".unegbich img")
    images << base_url + r['src']
  end
end
puts images

troisième étape (fin) : téléchargement des images 🙂

On va exécuter cette commande ruby script.rb > sortie_images.txt pour mettre la liste des URL des images sur un fichier sortie_images.txt.

Ensuite on utilise la commande wget pour télécharger les images. On crée un nouveau répertoire ensuite on se déplace dessus et exécuter la commande : wget -i sortie_images.txt et vous aurez les images en quelques secondes, minutes, heures, ... euh ça dépend de votre connexion internet 😛

Voilà c'est tout pour aujourd'hui, vous pouvez jeter un coup d'oeuil sur scrapy pour aller plus loin. Amusez vous bien 😉

 

Voici le script final :

require 'nokogiri'
require 'rest_client'

images = []
base_url = "http://gbich.com/"
lien = "http://gbich.com/index.php?choix=collectionune&&limite=0"
html = RestClient.get(lien)
doc = Nokogiri::HTML(html)
pages = doc.css("#other_une a.numero_page")
pages.map! { |p| p['href'] }

pages -= ['#']
pages = pages[0..pages.size/2-1]
pages.map! { |p| base_url+p }
pages = ["http://gbich.com/index.php?choix=collectionune&&limite=0"] + pages

for page in pages
  html = RestClient.get page
  doc = Nokogiri::HTML(html)
  for r in doc.css(".unegbich img")
    images << base_url + r['src']
  end
end

puts images