Unverified Commit eb65906d authored by Pierre-Jean CHANCELLIER's avatar Pierre-Jean CHANCELLIER Committed by GitHub

script to create json file from duniter.db

script to create json file from duniter.db with CRON tasks + Examples of datasets
parent bcccfbd1
#graph{border: 3px ridge snow;background:black;position:relative;}
#github{border-color:grey;color: black;width: 17%;font-size: 10px;}
.zoom{cursor: move;fill: none;pointer-events: all;}
.sous-graph{display:none;}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -2,8 +2,19 @@
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Test pour D3JS</title>
<title>Wotmap</title>
<meta property="og:url" content="https://duniter.normandie-libre.fr/wotmap/" />
<meta property="og:type" content="article" />
<meta property="og:title" content="Wotmap" />
<meta property="og:description" content="La toile de confiance de la monnaie libre Ğ1" />
<meta property="og:image" content="https://duniter.normandie-libre.fr/wotmap/img/capture.jpg" />
<meta property="og:image:width" content="1225" />
<meta property="og:image:height" content="870" />
<meta name="description" content="La toile de confiance de la monnaie libre Ğ1">
<meta name="keywords" content="Monnaie libre,duniter,toile de confiance">
<meta name="author" content="Pierre-Jean CHANCELLIER">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="icon" href="https://duniter.normandie-libre.fr/wotmap/img/duniter-logo.ico" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/10.0.0/css/bootstrap-slider.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<link rel="stylesheet" href="css/style.css">
......@@ -20,11 +31,15 @@
</button>
</div>
<div class="modal-body">
<p>Les données représentées ici ne sont pas à jour. Il s'agit d'un instantané du 23/03/2018. De plus, il se peut que mon script ait généré quelques inexactitudes. En effet, il s'agit plus ici d'une première expérimentation avec la librairie Javascript D3JS que d'une réelle application ; même si elle pourra le devenir. Pour ce faire, vous pouvez me soutenir en monnaie libre :</p>
<p>Les données représentées ici sont mises à jour toutes les 24h (à 3h30). Pour le moment, le positionnement des noeuds est lié aux liens qui les relient aux autres et, à l'avenir, j'essaierai de prendre en compte la centralité d'intermédiarité. Je compte aussi implémenter une fonction de recherche. Pour ce faire, vous pouvez me soutenir en monnaie libre :</p>
<div class="text-center">
<a href="https://g1.duniter.fr/api/#/v1/payment/4FgeWzpWDQ2Vp38wJa2PfShLLKXyFGRLwAHA44koEhQj?amount=10&comment=wotmap&redirect_url=https%3A%252F%252Fduniter.rml9-lehavre.tk/graph&cancel_url=https%3A%252F%252Fduniter.rml9-lehavre.tk/graph">
<img src="https://g1.duniter.fr/api/../img/duniter_button.svg">
</a>
<a href="https://g1.duniter.fr/api/#/v1/payment/4FgeWzpWDQ2Vp38wJa2PfShLLKXyFGRLwAHA44koEhQj?amount=10&comment=wotmap&redirect_url=https%3A%252F%252Fduniter.rml9-lehavre.tk/graph&cancel_url=https%3A%252F%252Fduniter.rml9-lehavre.tk/graph">
<img src="img/duniter_button.svg">
</a>
<br /><br />
<a id="github" class="btn btn-default" href="https://github.com/paidge/wotmap" role="button">
<img src="img/github-256.png" width="20" /> Github
</a>
</div>
</div>
<div class="modal-footer">
......@@ -74,13 +89,14 @@
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script async defer src="https://buttons.github.io/buttons.js"></script>
<script src="js/vendor/mousewheel.min.js"></script>
<script src="js/helpers.js"></script>
<script src="js/navigation.js"></script>
<script src="js/graph.js"></script>
<script>
$(document).ready(function(){
d3.json('data/wot.d3js.json', display);
d3.json('data/wot.json', display);
//d3.json('data/datatest.json', display);
$('#myModal').modal('show');
// Evite le scroll de la page lorsque la souris est sur #graph
......@@ -95,4 +111,4 @@
}
</script>
</body>
</html>
\ No newline at end of file
</html>
......@@ -2,7 +2,7 @@
function wot() {
var MAX_ZOOM_IN = 1.7,
MAX_ZOOM_OUT = 0,
ZOOM_STEP = 0.2,
ZOOM_STEP = 0.1,
MOVE_STEP = 100,
ACTUAL_ZOOM_LEVEL = 1.0;
var IS_PAUSED = true,
......@@ -55,10 +55,6 @@ function wot() {
function createNodes(rawDataNodes) {
// On initialise les échelles
var maxAmountValue = d3.max(rawDataNodes, function (d) { return +d.degree_layout; });
var maxAmountX = d3.max(rawDataNodes, function (d) { return +d.x; });
var minAmountX = d3.min(rawDataNodes, function (d) { return +d.x; });
var maxAmountY = d3.max(rawDataNodes, function (d) { return +d.y; });
var minAmountY = d3.min(rawDataNodes, function (d) { return +d.y; });
radiusScale = d3.scalePow()
.exponent(0.5)
......@@ -113,9 +109,9 @@ function wot() {
// Astuce pour avoir un rect derriere le graph qui fait à peu près sa taille
// Avec le CSS ça permet d'afficher la croix de déplacement
var fond = innerSpaceZoom.append("rect")
.attr("width", "2800")
.attr("height", "2500")
.attr("transform", "translate(-600,-1000)")
.attr("width", "10000")
.attr("height", "7000")
.attr("transform", "translate(-5000,-3000)")
.attr("class", "zoom");
// On cree les liens entre chaque noeud
......@@ -179,16 +175,14 @@ function wot() {
// On lance la simulation des forces
simulation.nodes(nodes)
.on("tick", ticked)
.force("link")
.links(rawData.links);
.links(datalinks);
simulation.alpha(1).restart();
IS_PAUSED = false;
};
function zoomFunction(){
console.log(d3.event.transform);
ACTUAL_ZOOM_LEVEL = d3.event.transform.k;
innerSpaceZoom.attr("transform", d3.event.transform);
}
......@@ -350,7 +344,7 @@ function wot() {
chart.liberer = function(adapt){
IS_FULL = true;
gbubbles.transition(500).style('opacity',0.7);
gbubbles.transition(500).style('opacity',1);
bubbles.attr('fill',function(d){if (d.referent){return "#ffc107";}else{return "#17a2b8";}});
links.transition(500).style('stroke-opacity',1);
$('.sous-graph').hide();
......
<?php
$datum = date("d­m­Y H:i");
// Definit l'emplacement du fichier de base de données
define("PATH","/var/lib/duniter/.config/duniter/duniter_default/duniter.db");
// Definit l'endroit où le fichier de sortie sera enregistré
define("OUTPATH",dirname( __FILE__ ) . "/../data/");
// Definit à partir de quelle identité on démarre le parcours de la toile
define("PUBKEY_CGEEK","2ny7YAdmzReQxAayyJZsyVYwYhVyax2thKcGknmQy5nQ");
$tab_final['elements']['nodes'] = [];
$tab_final['elements']['edges'] = [];
$tab_tmp = [
0 => [
'name' => 'cgeek',
'pubkey' => PUBKEY_CGEEK
]
];
try{
// Connexion à la BDD
$pdo = new PDO('sqlite:'.PATH);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // ERRMODE_WARNING | ERRMODE_EXCEPTION | ERRMODE_SILENT
} catch(Exception $e) {
echo $datum . " : Impossible d'accéder à la base de données SQLite : ".$e->getMessage();
die();
}
$i=0;
while (array_key_exists($i,$tab_tmp)){
// echo $datum . " : " . $i.'. On recupere les voisins de '.$tab_tmp[$i]['name'].chr(13).chr(10);
$objmember['data'] = ['id'=>strval($i+1),'name'=>$tab_tmp[$i]['name'],'pubkey'=>$tab_tmp[$i]['pubkey'],'degree_layout'=>0,'referent'=>false];
$voisins = recuperer_voisins($objmember['data']);
$objmember['data']['degree_layout'] = count($voisins);
if ($objmember['data']['degree_layout']>=9){$objmember['data']['referent']=true;}
$tab_final['elements']['nodes'][] = $objmember;
$i++;
}
// Déconnexion à la BDD
$pdo = null;
// Ecriture du résultat dans un fichier
$json = json_encode($tab_final, JSON_PRETTY_PRINT);
try{
$file = fopen(OUTPATH.'wot.json', 'w+');
fwrite($file, $json);
fclose($file);
echo $datum . " : recuperation des donnees de la wotmap terminee";
} catch(Exception $e){
echo $datum . " : Impossible d'enregistrer le fichier de sortie : ".$e->getMessage();
die();
}
/* ======================================
== Fonctions personnalisees ==
====================================== */
function recuperer_voisins($member){
global $tab_final;
global $pdo;
$voisins = [];
// On récupère les certifs emises par le membre
$stmt = $pdo->prepare("SELECT * FROM c_index AS c, i_index AS i WHERE c.receiver = i.pub AND c.issuer = :pubkey");
$stmt->execute(array('pubkey' => $member['pubkey']));
$certifs_donnees = $stmt->fetchAll();
foreach ($certifs_donnees as $certif){
$voisin = ['name'=>$certif['uid'],'pubkey'=>$certif['pub']];
$voisins[] = $voisin;
$edge['data'] = ['id'=>(count($tab_final['elements']['edges'])+1),'source'=>$member['id'],'target'=>strval(idvoisin($voisin))];
$tab_final['elements']['edges'][] = $edge;
}
// On récupère les certifs recues par le membre
$stmt = $pdo->prepare("SELECT * FROM c_index AS c, i_index AS i WHERE c.issuer = i.pub AND c.receiver = :pubkey");
$stmt->execute(array('pubkey' => $member['pubkey']));
$certifs_recues = $stmt->fetchAll();
foreach ($certifs_recues as $certif){
$voisin = ['name'=>$certif['uid'],'pubkey'=>$certif['pub']];
if (!in_array($voisin, $voisins)){
$voisins[] = $voisin;
idvoisin($voisin);
}
}
// Retourne la liste des voisins uniques du membre
return $voisins;
}
function idvoisin($tabvoisin){
global $tab_tmp;
$key = recursive_array_search($tabvoisin['pubkey'], $tab_tmp);
if (!is_numeric($key)){
$return = array_push($tab_tmp, $tabvoisin);
}else{
$return = $key+1;
}
// Retourne l'id du voisin dans le tableau $tab_tmp
return $return;
}
/* Fonction récupérée dans la doc de PHP pour chercher récursivement une valeur dans un tableau multidimensionnel */
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
return $current_key;
}
}
return false;
}
?>
\ No newline at end of file
<?php
$datum = date("d­m­Y H:i");
// Definit l'emplacement du fichier de base de données
define("PATH","/var/lib/duniter/.config/duniter/duniter_default/duniter.db");
// Definit l'endroit où le fichier de sortie sera enregistré
define("OUTPATH",dirname( __FILE__ ) . "/../data/");
// Definit à partir de quelle identité on démarre le parcours de la toile
define("PUBKEY_CGEEK","2ny7YAdmzReQxAayyJZsyVYwYhVyax2thKcGknmQy5nQ");
$tab_final['nodes'] = [];
$tab_final['links'] = [];
$tab_tmp = [
0 => [
'name' => 'cgeek',
'pubkey' => PUBKEY_CGEEK
]
];
try{
// Connexion à la BDD
$pdo = new PDO('sqlite:'.PATH);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // ERRMODE_WARNING | ERRMODE_EXCEPTION | ERRMODE_SILENT
} catch(Exception $e) {
echo $datum . " : Impossible d'accéder à la base de données SQLite : ".$e->getMessage();
die();
}
$i=0;
while (array_key_exists($i,$tab_tmp)){
//echo $datum . " : " . $i.'. On recupere les voisins de '.$tab_tmp[$i]['name'].chr(13).chr(10);
$objmember = ['id'=>strval($i+1),'name'=>$tab_tmp[$i]['name'],'pubkey'=>$tab_tmp[$i]['pubkey'],'degree_layout'=>0,'referent'=>false];
$voisins = recuperer_voisins($objmember);
$objmember['degree_layout'] = count($voisins);
if ($objmember['degree_layout']>=9){$objmember['referent']=true;}
$tab_final['nodes'][] = $objmember;
$i++;
}
// Déconnexion à la BDD
$pdo = null;
// Ecriture du résultat dans un fichier
$json = json_encode($tab_final, JSON_PRETTY_PRINT);
try{
$file = fopen(OUTPATH.'wot.json', 'w+');
fwrite($file, $json);
fclose($file);
echo $datum . " : recuperation des donnees de la wotmap terminee";
} catch(Exception $e){
echo $datum . " : Impossible d'enregistrer le fichier de sortie : ".$e->getMessage();
die();
}
/* ======================================
== Fonctions personnalisees ==
====================================== */
function recuperer_voisins($member){
global $tab_final;
global $pdo;
$voisins = [];
// On récupère les certifs emises par le membre
$stmt = $pdo->prepare("SELECT * FROM c_index AS c, i_index AS i WHERE c.receiver = i.pub AND c.issuer = :pubkey");
$stmt->execute(array('pubkey' => $member['pubkey']));
$certifs_donnees = $stmt->fetchAll();
foreach ($certifs_donnees as $certif){
$voisin = ['name'=>$certif['uid'],'pubkey'=>$certif['pub']];
$voisins[] = $voisin;
$edge = ['id'=>(count($tab_final['links'])+1),'source'=>$member['id'],'target'=>strval(idvoisin($voisin))];
$tab_final['links'][] = $edge;
}
// On récupère les certifs recues par le membre
$stmt = $pdo->prepare("SELECT * FROM c_index AS c, i_index AS i WHERE c.issuer = i.pub AND c.receiver = :pubkey");
$stmt->execute(array('pubkey' => $member['pubkey']));
$certifs_recues = $stmt->fetchAll();
foreach ($certifs_recues as $certif){
$voisin = ['name'=>$certif['uid'],'pubkey'=>$certif['pub']];
if (!in_array($voisin, $voisins)){
$voisins[] = $voisin;
idvoisin($voisin);
}
}
// Retourne la liste des voisins uniques du membre
return $voisins;
}
function idvoisin($tabvoisin){
global $tab_tmp;
$key = recursive_array_search($tabvoisin['pubkey'], $tab_tmp);
if (!is_numeric($key)){
$return = array_push($tab_tmp, $tabvoisin);
}else{
$return = $key+1;
}
// Retourne l'id du voisin dans le tableau $tab_tmp
return $return;
}
/* Fonction récupérée dans la doc de PHP pour chercher récursivement une valeur dans un tableau multidimensionnel */
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
return $current_key;
}
}
return false;
}
?>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment