Initial commit - FLUJOS codebase (production branch)
Includes: FLUJOS app (Node/Flask/Python), FLUJOS_DATOS scripts (scrapers, Keras, Django) Excludes: MongoDB, scraped data, Wikipedia/WikiLeaks dumps, Python venv, node_modules
84
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,84 @@
|
||||||
|
# ========================
|
||||||
|
# DATOS PESADOS - NO SUBIR
|
||||||
|
# ========================
|
||||||
|
|
||||||
|
# MongoDB (3.2 GB)
|
||||||
|
FLUJOS_DATOS/MONGO/
|
||||||
|
|
||||||
|
# Noticias escrapeadas (1.9 GB)
|
||||||
|
FLUJOS_DATOS/NOTICIAS/archivos/
|
||||||
|
FLUJOS_DATOS/NOTICIAS/articulos/
|
||||||
|
FLUJOS_DATOS/NOTICIAS/tokenized/
|
||||||
|
|
||||||
|
# Wikipedia (611 MB)
|
||||||
|
FLUJOS_DATOS/WIKIPEDIA/articulos_wikipedia/
|
||||||
|
FLUJOS_DATOS/WIKIPEDIA/articulos_tokenizados/
|
||||||
|
|
||||||
|
# Torrents / WikiLeaks (1.1 GB)
|
||||||
|
FLUJOS_DATOS/TORRENTS/TORRENTS_WIKILEAKS_COMPLETO/tokenized/
|
||||||
|
FLUJOS_DATOS/TORRENTS/TORRENTS_WIKILEAKS_COMPLETO/txt/
|
||||||
|
|
||||||
|
# Entorno virtual Python (2.1 GB)
|
||||||
|
FLUJOS_DATOS/myenv/
|
||||||
|
myenv/
|
||||||
|
venv/
|
||||||
|
env/
|
||||||
|
.venv/
|
||||||
|
|
||||||
|
# NLTK data (50 MB)
|
||||||
|
nltk_data/
|
||||||
|
|
||||||
|
# Bases de datos
|
||||||
|
*.sqlite3
|
||||||
|
*.db
|
||||||
|
|
||||||
|
# ========================
|
||||||
|
# DEPENDENCIAS NODE
|
||||||
|
# ========================
|
||||||
|
node_modules/
|
||||||
|
**/node_modules/
|
||||||
|
|
||||||
|
# ========================
|
||||||
|
# SECRETOS Y CONFIG LOCAL
|
||||||
|
# ========================
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
|
||||||
|
# ========================
|
||||||
|
# PYTHON
|
||||||
|
# ========================
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
*.egg-info/
|
||||||
|
|
||||||
|
# ========================
|
||||||
|
# TEMPORALES Y BACKUPS
|
||||||
|
# ========================
|
||||||
|
*.save
|
||||||
|
*.bak
|
||||||
|
*_COPIA*
|
||||||
|
*~
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# ========================
|
||||||
|
# LOGS
|
||||||
|
# ========================
|
||||||
|
logs/
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
|
||||||
|
# ========================
|
||||||
|
# IDEs
|
||||||
|
# ========================
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
|
||||||
|
# Parcel cache
|
||||||
|
.cache/
|
||||||
|
.parcel-cache/
|
||||||
63
FLUJOS/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
# Dependencias
|
||||||
|
node_modules/
|
||||||
|
**/node_modules/
|
||||||
|
|
||||||
|
# Variables de entorno y secretos
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
|
||||||
|
# Python
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
.Python
|
||||||
|
*.egg-info/
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
.eggs/
|
||||||
|
|
||||||
|
# Entorno virtual Python
|
||||||
|
venv/
|
||||||
|
env/
|
||||||
|
myenv/
|
||||||
|
.venv/
|
||||||
|
|
||||||
|
# Bases de datos locales
|
||||||
|
*.sqlite3
|
||||||
|
*.db
|
||||||
|
|
||||||
|
# Archivos de backup y temporales
|
||||||
|
*.save
|
||||||
|
*.bak
|
||||||
|
*_COPIA*
|
||||||
|
*~
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
logs/
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
|
||||||
|
# IDEs
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
|
||||||
|
# Parcel bundler
|
||||||
|
.cache/
|
||||||
|
.parcel-cache/
|
||||||
|
|
||||||
|
# Datos escrapeados y pesados (si se colaran dentro de FLUJOS)
|
||||||
|
NOTICIAS/
|
||||||
|
WIKIPEDIA/
|
||||||
|
TORRENTS/
|
||||||
|
MONGO/
|
||||||
|
archivos/
|
||||||
|
articulos/
|
||||||
|
tokenized/
|
||||||
|
articulos_wikipedia/
|
||||||
|
articulos_tokenizados/
|
||||||
210
FLUJOS/BACK_BACK/FLUJOS_APP.js
Executable file
|
|
@ -0,0 +1,210 @@
|
||||||
|
// FLUJOS_APP.js ubicado en /var/www/flujos/FLUJOS/BACK_BACK/
|
||||||
|
|
||||||
|
require('dotenv').config(); // Cargar variables de entorno desde .env
|
||||||
|
|
||||||
|
const express = require('express');
|
||||||
|
const path = require('path');
|
||||||
|
const bodyParser = require('body-parser');
|
||||||
|
const helmet = require('helmet');
|
||||||
|
const { MongoClient } = require('mongodb');
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
const port = process.env.PORT || 3000;
|
||||||
|
|
||||||
|
// Configurar Helmet con CSP personalizado
|
||||||
|
app.use(
|
||||||
|
helmet.contentSecurityPolicy({
|
||||||
|
directives: {
|
||||||
|
defaultSrc: ["'self'"],
|
||||||
|
scriptSrc: [
|
||||||
|
"'self'",
|
||||||
|
"'unsafe-inline'",
|
||||||
|
'https://unpkg.com',
|
||||||
|
'https://cdnjs.cloudflare.com',
|
||||||
|
'https://fonts.googleapis.com',
|
||||||
|
'https://fonts.gstatic.com',
|
||||||
|
],
|
||||||
|
styleSrc: ["'self'", "'unsafe-inline'", 'https://fonts.googleapis.com'],
|
||||||
|
imgSrc: ["'self'", 'data:'],
|
||||||
|
connectSrc: ["'self'", 'ws://localhost:3000'],
|
||||||
|
fontSrc: ["'self'", 'https://fonts.gstatic.com'],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
app.use(bodyParser.json());
|
||||||
|
|
||||||
|
// **Definir primero las rutas de la API**
|
||||||
|
|
||||||
|
app.get('/api/data', async (req, res) => {
|
||||||
|
console.log('Solicitud recibida en /api/data');
|
||||||
|
try {
|
||||||
|
// Asegurarse de que la conexión a la base de datos está establecida
|
||||||
|
if (!db) {
|
||||||
|
res.status(500).json({ error: 'No hay conexión a la base de datos' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Acceder a las colecciones necesarias
|
||||||
|
const wikipediaCollection = db.collection('wikipedia');
|
||||||
|
const noticiasCollection = db.collection('noticias');
|
||||||
|
const torrentsCollection = db.collection('torrents');
|
||||||
|
const comparacionesCollection = db.collection('comparaciones');
|
||||||
|
|
||||||
|
// Obtener los parámetros de consulta del cliente
|
||||||
|
const { tema, subtematica, palabraClave, fechaInicio, fechaFin, nodos, complejidad } = req.query;
|
||||||
|
console.log('Parámetros de consulta:', req.query);
|
||||||
|
|
||||||
|
// Validar que el parámetro 'tema' esté presente
|
||||||
|
if (!tema) {
|
||||||
|
res.status(400).json({ error: 'El parámetro "tema" es obligatorio' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construir la consulta para obtener los nodos (noticias, wikipedia y torrents)
|
||||||
|
let nodesQuery = {
|
||||||
|
tema: tema, // Usar el tema proporcionado
|
||||||
|
};
|
||||||
|
if (subtematica) nodesQuery.subtema = subtematica;
|
||||||
|
if (palabraClave)
|
||||||
|
nodesQuery.texto = { $regex: palabraClave, $options: 'i' };
|
||||||
|
if (fechaInicio && fechaFin) {
|
||||||
|
nodesQuery.fecha = {
|
||||||
|
$gte: new Date(fechaInicio),
|
||||||
|
$lte: new Date(fechaFin),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
console.log('Consulta para nodos:', nodesQuery);
|
||||||
|
|
||||||
|
// Obtener el límite de nodos (con un máximo para evitar sobrecarga)
|
||||||
|
const nodosLimit = Math.min(parseInt(nodos) || 100, 500);
|
||||||
|
|
||||||
|
// Ejecutar la consulta y obtener los resultados de las colecciones
|
||||||
|
console.log('Ejecutando consulta para nodos en colecciones...');
|
||||||
|
const [wikipediaNodes, noticiasNodes, torrentsNodes] = await Promise.all([
|
||||||
|
wikipediaCollection.find(nodesQuery).limit(nodosLimit).toArray(),
|
||||||
|
noticiasCollection.find(nodesQuery).limit(nodosLimit).toArray(),
|
||||||
|
torrentsCollection.find(nodesQuery).limit(nodosLimit).toArray(),
|
||||||
|
]);
|
||||||
|
console.log('Nodos de Wikipedia obtenidos:', wikipediaNodes.length);
|
||||||
|
console.log('Nodos de Noticias obtenidos:', noticiasNodes.length);
|
||||||
|
console.log('Nodos de Torrents obtenidos:', torrentsNodes.length);
|
||||||
|
|
||||||
|
// Combinar los nodos de las colecciones
|
||||||
|
const nodes = [...wikipediaNodes, ...noticiasNodes, ...torrentsNodes];
|
||||||
|
console.log('Total de nodos combinados:', nodes.length);
|
||||||
|
|
||||||
|
// Utilizar los nombres de archivo exactos como IDs de los nodos
|
||||||
|
const formattedNodes = nodes.map((result) => ({
|
||||||
|
id: result.archivo.trim(), // Utilizar el nombre de archivo exacto sin normalizar
|
||||||
|
group: result.subtema || 'sin subtema',
|
||||||
|
tema: result.tema || 'sin tema',
|
||||||
|
content: result.texto || '',
|
||||||
|
fecha: result.fecha || '',
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Obtener los IDs de los nodos
|
||||||
|
const nodeIds = formattedNodes.map(node => node.id);
|
||||||
|
console.log('IDs de nodos:', nodeIds);
|
||||||
|
|
||||||
|
// Leer el parámetro 'complejidad' de la query (que en tu front envías como % de similitud)
|
||||||
|
const porcentajeSimilitudMin = parseFloat(complejidad) || 0;
|
||||||
|
console.log('Porcentaje de similitud mínimo (desde complejidad):', porcentajeSimilitudMin);
|
||||||
|
|
||||||
|
// Construir la consulta para obtener los enlaces relacionados con los nodos obtenidos
|
||||||
|
const linksQuery = {
|
||||||
|
porcentaje_similitud: { $gte: porcentajeSimilitudMin },
|
||||||
|
noticia1: { $in: nodeIds },
|
||||||
|
noticia2: { $in: nodeIds },
|
||||||
|
};
|
||||||
|
console.log('Consulta para enlaces:', linksQuery);
|
||||||
|
|
||||||
|
// Ejecutar la consulta y obtener los enlaces
|
||||||
|
console.log('Ejecutando consulta para enlaces...');
|
||||||
|
const links = await comparacionesCollection.find(linksQuery).toArray();
|
||||||
|
console.log('Enlaces obtenidos:', links.length);
|
||||||
|
|
||||||
|
// Formatear los enlaces sin normalizar los IDs
|
||||||
|
const formattedLinks = links.map((result) => ({
|
||||||
|
source: result.noticia1.trim(),
|
||||||
|
target: result.noticia2.trim(),
|
||||||
|
value: result.porcentaje_similitud,
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Enviar los datos al cliente en formato JSON
|
||||||
|
res.json({ nodes: formattedNodes, links: formattedLinks });
|
||||||
|
console.log('Datos enviados al cliente');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error al obtener datos:', error);
|
||||||
|
res.status(500).json({ error: 'Error al obtener datos' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// **Luego, definir las rutas de las páginas principales**
|
||||||
|
// Rutas para las páginas principales
|
||||||
|
app.get('/', (req, res) => {
|
||||||
|
res.sendFile(path.join(__dirname, '../VISUALIZACION/public/index.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/climate.html', (req, res) => {
|
||||||
|
res.sendFile(path.join(__dirname, '../VISUALIZACION/public/climate.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/glob-war.html', (req, res) => {
|
||||||
|
res.sendFile(path.join(__dirname, '../VISUALIZACION/public/glob-war.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/popl-up.html', (req, res) => {
|
||||||
|
res.sendFile(path.join(__dirname, '../VISUALIZACION/public/popl-up.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/int-sec.html', (req, res) => {
|
||||||
|
res.sendFile(path.join(__dirname, '../VISUALIZACION/public/int-sec.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/eco-corp.html', (req, res) => {
|
||||||
|
res.sendFile(path.join(__dirname, '../VISUALIZACION/public/eco-corp.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// **Después, configurar el middleware de archivos estáticos**
|
||||||
|
|
||||||
|
app.use(express.static(path.join(__dirname, '../VISUALIZACION/public')));
|
||||||
|
|
||||||
|
// Conexión a MongoDB usando variables de entorno
|
||||||
|
const mongoUrl = process.env.MONGO_URL || 'mongodb://localhost:27017';
|
||||||
|
const dbName = process.env.DB_NAME || 'FLUJOS_DATOS';
|
||||||
|
|
||||||
|
let db; // Variable para almacenar la conexión a la base de datos
|
||||||
|
|
||||||
|
// Función para conectar a MongoDB
|
||||||
|
async function connectToMongoDB() {
|
||||||
|
try {
|
||||||
|
const mongoClient = new MongoClient(mongoUrl, {
|
||||||
|
useNewUrlParser: true,
|
||||||
|
useUnifiedTopology: true,
|
||||||
|
});
|
||||||
|
await mongoClient.connect();
|
||||||
|
db = mongoClient.db(dbName);
|
||||||
|
console.log('Conectado a MongoDB');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error al conectar a MongoDB:', error);
|
||||||
|
process.exit(1); // Salir de la aplicación si no se puede conectar
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Llamar a la función para conectar a MongoDB
|
||||||
|
connectToMongoDB();
|
||||||
|
|
||||||
|
// Iniciar el servidor escuchando en todas las interfaces
|
||||||
|
app.listen(port, '0.0.0.0', () => {
|
||||||
|
console.log(`La aplicación está escuchando en http://localhost:${port}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Manejar el cierre de la aplicación
|
||||||
|
process.on('SIGINT', async () => {
|
||||||
|
if (db) {
|
||||||
|
await db.close();
|
||||||
|
console.log('Conexión a MongoDB cerrada');
|
||||||
|
}
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
14
FLUJOS/BACK_BACK/OBSEI/analyzer.py
Executable file
|
|
@ -0,0 +1,14 @@
|
||||||
|
from obsei.analyzer.classification_analyzer import ClassificationAnalyzerConfig, ZeroShotClassificationAnalyzer
|
||||||
|
|
||||||
|
# initialize classification analyzer config
|
||||||
|
# It can also detect sentiments if "positive" and "negative" labels are added.
|
||||||
|
analyzer_config=ClassificationAnalyzerConfig(
|
||||||
|
labels=["service", "delay", "performance"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# initialize classification analyzer
|
||||||
|
# For supported models refer https://huggingface.co/models?filter=zero-shot-classification
|
||||||
|
analyzer = ZeroShotClassificationAnalyzer(
|
||||||
|
model_name_or_path="typeform/mobilebert-uncased-mnli",
|
||||||
|
device="auto"
|
||||||
|
)
|
||||||
14
FLUJOS/BACK_BACK/OBSEI/analyzer/classification_analyzer.py
Executable file
|
|
@ -0,0 +1,14 @@
|
||||||
|
from obsei.analyzer.classification_analyzer import ClassificationAnalyzerConfig, ZeroShotClassificationAnalyzer
|
||||||
|
|
||||||
|
# initialize classification analyzer config
|
||||||
|
# It can also detect sentiments if "positive" and "negative" labels are added.
|
||||||
|
analyzer_config=ClassificationAnalyzerConfig(
|
||||||
|
labels=["service", "delay", "performance"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# initialize classification analyzer
|
||||||
|
# For supported models refer https://huggingface.co/models?filter=zero-shot-classification
|
||||||
|
text_analyzer = ZeroShotClassificationAnalyzer(
|
||||||
|
model_name_or_path="typeform/mobilebert-uncased-mnli",
|
||||||
|
device="auto"
|
||||||
|
)
|
||||||
7
FLUJOS/BACK_BACK/OBSEI/analyzer/dummy_analyzer.py
Executable file
|
|
@ -0,0 +1,7 @@
|
||||||
|
from obsei.analyzer.dummy_analyzer import DummyAnalyzer, DummyAnalyzerConfig
|
||||||
|
|
||||||
|
# initialize dummy analyzer's configuration settings
|
||||||
|
analyzer_config = DummyAnalyzerConfig()
|
||||||
|
|
||||||
|
# initialize dummy analyzer
|
||||||
|
analyzer = DummyAnalyzer()
|
||||||
11
FLUJOS/BACK_BACK/OBSEI/analyzer/ner_analyzer.py
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
from obsei.analyzer.ner_analyzer import NERAnalyzer
|
||||||
|
|
||||||
|
# NER analyzer does not need configuration settings
|
||||||
|
analyzer_config=None
|
||||||
|
|
||||||
|
# initialize ner analyzer
|
||||||
|
# For supported models refer https://huggingface.co/models?filter=token-classification
|
||||||
|
text_analyzer = NERAnalyzer(
|
||||||
|
model_name_or_path="elastic/distilbert-base-cased-finetuned-conll03-english",
|
||||||
|
device = "auto"
|
||||||
|
)
|
||||||
22
FLUJOS/BACK_BACK/OBSEI/analyzer/pii_analyzer.py
Executable file
|
|
@ -0,0 +1,22 @@
|
||||||
|
from obsei.analyzer.pii_analyzer import PresidioEngineConfig, PresidioModelConfig, \
|
||||||
|
PresidioPIIAnalyzer, PresidioPIIAnalyzerConfig
|
||||||
|
|
||||||
|
# initialize pii analyzer's config
|
||||||
|
analyzer_config = PresidioPIIAnalyzerConfig(
|
||||||
|
# Whether to return only pii analysis or anonymize text
|
||||||
|
analyze_only=False,
|
||||||
|
# Whether to return detail information about anonymization decision
|
||||||
|
return_decision_process=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# initialize pii analyzer
|
||||||
|
analyzer = PresidioPIIAnalyzer(
|
||||||
|
engine_config=PresidioEngineConfig(
|
||||||
|
# spacy and stanza nlp engines are supported
|
||||||
|
# For more info refer
|
||||||
|
# https://microsoft.github.io/presidio/analyzer/developing_recognizers/#utilize-spacy-or-stanza
|
||||||
|
nlp_engine_name="spacy",
|
||||||
|
# Update desired spacy model and language
|
||||||
|
models=[PresidioModelConfig(model_name="en_core_web_lg", lang_code="en")]
|
||||||
|
)
|
||||||
|
)
|
||||||
7
FLUJOS/BACK_BACK/OBSEI/analyzer/sentiment_analyzer.py
Executable file
|
|
@ -0,0 +1,7 @@
|
||||||
|
from obsei.analyzer.sentiment_analyzer import VaderSentimentAnalyzer
|
||||||
|
|
||||||
|
# Vader does not need any configuration settings
|
||||||
|
analyzer_config=None
|
||||||
|
|
||||||
|
# initialize vader sentiment analyzer
|
||||||
|
text_analyzer = VaderSentimentAnalyzer()
|
||||||
11
FLUJOS/BACK_BACK/OBSEI/analyzer/translation_analyzer.py
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
from obsei.analyzer.translation_analyzer import TranslationAnalyzer
|
||||||
|
|
||||||
|
# Translator does not need analyzer config
|
||||||
|
analyzer_config = None
|
||||||
|
|
||||||
|
# initialize translator
|
||||||
|
# For supported models refer https://huggingface.co/models?pipeline_tag=translation
|
||||||
|
analyzer = TranslationAnalyzer(
|
||||||
|
model_name_or_path="Helsinki-NLP/opus-mt-hi-en",
|
||||||
|
device = "auto"
|
||||||
|
)
|
||||||
10
FLUJOS/BACK_BACK/OBSEI/informer.py
Executable file
|
|
@ -0,0 +1,10 @@
|
||||||
|
from pandas import DataFrame
|
||||||
|
from obsei.sink.pandas_sink import PandasSink, PandasSinkConfig
|
||||||
|
|
||||||
|
# initialize pandas sink config
|
||||||
|
sink_config = PandasSinkConfig(
|
||||||
|
dataframe=DataFrame()
|
||||||
|
)
|
||||||
|
|
||||||
|
# initialize pandas sink
|
||||||
|
sink = PandasSink()
|
||||||
17
FLUJOS/BACK_BACK/OBSEI/observer.py
Executable file
|
|
@ -0,0 +1,17 @@
|
||||||
|
import pandas as pd
|
||||||
|
from obsei.source.pandas_source import PandasSource, PandasSourceConfig
|
||||||
|
|
||||||
|
# Initialize your Pandas DataFrame from your sources like csv, excel, sql etc
|
||||||
|
# In following example we are reading csv which have two columns title and text
|
||||||
|
csv_file = "https://raw.githubusercontent.com/deepset-ai/haystack/master/tutorials/small_generator_dataset.csv"
|
||||||
|
dataframe = pd.read_csv(csv_file)
|
||||||
|
|
||||||
|
# initialize pandas sink config
|
||||||
|
sink_config = PandasSourceConfig(
|
||||||
|
dataframe=dataframe,
|
||||||
|
include_columns=["score"],
|
||||||
|
text_columns=["name", "degree"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# initialize pandas sink
|
||||||
|
sink = PandasSource()
|
||||||
10
FLUJOS/BACK_BACK/OBSEI/sink/panadas_sink.py
Executable file
|
|
@ -0,0 +1,10 @@
|
||||||
|
from pandas import DataFrame
|
||||||
|
from obsei.sink.pandas_sink import PandasSink, PandasSinkConfig
|
||||||
|
|
||||||
|
# initialize pandas sink config
|
||||||
|
sink_config = PandasSinkConfig(
|
||||||
|
dataframe=DataFrame()
|
||||||
|
)
|
||||||
|
|
||||||
|
# initialize pandas sink
|
||||||
|
sink = PandasSink()
|
||||||
0
FLUJOS/BACK_BACK/OBSEI/source/pandas_source.py
Executable file
13
FLUJOS/BACK_BACK/flask_api/app.py
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
from flask import Flask, request, jsonify
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.route('/tensorflow', methods=['POST'])
|
||||||
|
def tensorflow_endpoint():
|
||||||
|
data = request.json
|
||||||
|
# Aquí procesarías el dato con tu modelo TensorFlow
|
||||||
|
# Por ahora solo lo devolvemos como está
|
||||||
|
return jsonify(data)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(port=5000)
|
||||||
45
FLUJOS/BACK_BACK/main.py
Executable file
|
|
@ -0,0 +1,45 @@
|
||||||
|
import pandas as pd
|
||||||
|
from pymongo import MongoClient
|
||||||
|
from obsei.source.pandas_source import PandasSource, PandasSourceConfig
|
||||||
|
from obsei.analyzer.classification_analyzer import ClassificationAnalyzerConfig, ZeroShotClassificationAnalyzer
|
||||||
|
from obsei.sink.pandas_sink import PandasSink, PandasSinkConfig
|
||||||
|
|
||||||
|
# Configura la fuente
|
||||||
|
source = PandasSource()
|
||||||
|
source_config = PandasSourceConfig(
|
||||||
|
# Proporciona tu configuración aquí
|
||||||
|
)
|
||||||
|
|
||||||
|
# Configura el analizador
|
||||||
|
analyzer = ZeroShotClassificationAnalyzer(
|
||||||
|
# Proporciona tu configuración aquí
|
||||||
|
)
|
||||||
|
analyzer_config = ClassificationAnalyzerConfig(
|
||||||
|
# Proporciona tu configuración aquí
|
||||||
|
)
|
||||||
|
|
||||||
|
# Configura el sumidero
|
||||||
|
sink = PandasSink()
|
||||||
|
sink_config = PandasSinkConfig(
|
||||||
|
# Proporciona tu configuración aquí
|
||||||
|
)
|
||||||
|
|
||||||
|
# Ejecuta el flujo de trabajo
|
||||||
|
source_response_list = source.lookup(source_config)
|
||||||
|
analyzer_response_list = analyzer.analyze_input(
|
||||||
|
source_response_list=source_response_list,
|
||||||
|
analyzer_config=analyzer_config
|
||||||
|
)
|
||||||
|
sink_response_list = sink.send_data(analyzer_response_list, sink_config)
|
||||||
|
|
||||||
|
# Ahora `sink_response_list` es una lista de DataFrames.
|
||||||
|
# Puedes concatenarlos en un solo DataFrame si es necesario.
|
||||||
|
df = pd.concat(sink_response_list)
|
||||||
|
|
||||||
|
# Realiza cualquier transformación o limpieza de datos necesaria aquí...
|
||||||
|
|
||||||
|
# Finalmente, guarda el DataFrame en MongoDB.
|
||||||
|
client = MongoClient('mongodb://localhost:27017/')
|
||||||
|
db = client['nombre_de_tu_base_de_datos']
|
||||||
|
collection = db['nombre_de_tu_coleccion']
|
||||||
|
collection.insert_many(df.to_dict('records'))
|
||||||
12056
FLUJOS/BACK_BACK/package-lock.json
generated
Executable file
32
FLUJOS/BACK_BACK/package.json
Executable file
|
|
@ -0,0 +1,32 @@
|
||||||
|
{
|
||||||
|
"name": "flujos",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Aplicación FLUJOS",
|
||||||
|
"main": "FLUJOS_APP.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node FLUJOS_APP.js",
|
||||||
|
"dev": "nodemon FLUJOS_APP.js",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@elastic/elasticsearch": "^8.9.0",
|
||||||
|
"body-parser": "^1.20.3",
|
||||||
|
"dotenv": "^16.4.5",
|
||||||
|
"express": "^4.21.0",
|
||||||
|
"express-graphql": "^0.12.0",
|
||||||
|
"force-graph": "^1.43.2",
|
||||||
|
"graphql": "^15.8.0",
|
||||||
|
"helmet": "^8.0.0",
|
||||||
|
"mongod": "^2.0.0",
|
||||||
|
"mongodb": "^6.9.0",
|
||||||
|
"mongoose": "^7.3.4",
|
||||||
|
"node-fetch": "^3.3.2",
|
||||||
|
"tree": "^0.1.3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"nodemon": "^3.1.7",
|
||||||
|
"parcel-bundler": "^1.8.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
FLUJOS/BACK_BACK/requirements.txt/requirements.txt
Executable file
|
|
@ -0,0 +1 @@
|
||||||
|
pip install obsei[all]
|
||||||
61
FLUJOS/DOCS/ARQUITECTURA_CLIENTE_JS.txt
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
┌───────────────────┐
|
||||||
|
│ HTML + CSS UI │
|
||||||
|
│ │
|
||||||
|
│ - contenedor div │
|
||||||
|
│ #globWarContainer│
|
||||||
|
│ - form #paramForm │
|
||||||
|
└─────────┬─────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ output_glob_war.js │
|
||||||
|
│ ┌───────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ 1. Inicialización del gráfico │ │
|
||||||
|
│ │ └─ ForceGraph3D()(elem) configuras estilos, forces │ │
|
||||||
|
│ └───────────────────────────────────────────────────────┘ │
|
||||||
|
│ │ │
|
||||||
|
│ ▼ │
|
||||||
|
│ ┌───────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ 2. getData(paramsObj) │ │
|
||||||
|
│ │ ├─ Construye URL: '/api/data?tema=guerra global…' │ │
|
||||||
|
│ │ ├─ fetch(url) → JSON { nodes: [...], links: [...] }│ │
|
||||||
|
│ │ ├─ Filtra enlaces inválidos (fuente/target existe)│ │
|
||||||
|
│ │ ├─ Calcula grado de cada nodo │ │
|
||||||
|
│ │ ├─ Filtra nodos con grado < MIN_DEGREE │ │
|
||||||
|
│ │ └─ Devuelve { nodes, links } │ │
|
||||||
|
│ └───────────────────────────────────────────────────────┘ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ ▼ │
|
||||||
|
│ │ ┌────────────────────────────────┐ │
|
||||||
|
│ │ │ 3. graph.graphData(data) │ │
|
||||||
|
│ │ │ Renderiza nodos + enlaces │ │
|
||||||
|
│ │ └────────────────────────────────┘ │
|
||||||
|
│ │ │ │
|
||||||
|
│ ▼ ▼ │
|
||||||
|
│ ┌──────────────────────────────┐ ┌────────────────────────┐ │
|
||||||
|
│ │ showNodeContent(content) │ │ centerGraph() │ │
|
||||||
|
│ │ └─ despliega content │ │ └─ zoomToFit + padding │ │
|
||||||
|
│ └──────────────────────────────┘ └────────────────────────┘ │
|
||||||
|
│ ▲ ▲ │
|
||||||
|
│ │ │ │
|
||||||
|
│ ┌───────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ 4. Event Listeners │ │
|
||||||
|
│ │ - form submit → llama getData(paramsObj) │ │
|
||||||
|
│ │ - window resize → llama centerGraph() │ │
|
||||||
|
│ └───────────────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ FLUJOS_APP.js │
|
||||||
|
│ ┌ getDataHandler(req, res) ┐ │
|
||||||
|
│ │ - recibe paramsQuery │ │
|
||||||
|
│ │ - consulta Mongo: │ │
|
||||||
|
│ │ • filtra por tema │ │
|
||||||
|
│ │ • aplica límites nodos/complejidad/fechas │
|
||||||
|
│ │ - construye { nodes, links } JSON │
|
||||||
|
│ └───────────────────────────┘ │
|
||||||
|
│ │ │
|
||||||
|
│ ▼ │
|
||||||
|
│ HTTP GET /api/data → getDataHandler → responde JSON │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
32
FLUJOS/DOCS/ARQUITECTURA_FLUJOS_APP_JS.txt
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
┌──────────────────────────┐
|
||||||
|
│ Cliente JS (output_*.js) │
|
||||||
|
│ getData({tema, …}) │
|
||||||
|
└────────────┬─────────────┘
|
||||||
|
│ HTTP GET /api/data?tema=…&nodos=…&minSim=…
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────┐
|
||||||
|
│ FLUJOS_APP.js – Express /api/data │
|
||||||
|
│ │
|
||||||
|
│ 1) Parsea req.query: tema, nodos, minSim│
|
||||||
|
│ 2) nodesQuery = { tema, subtema?, … } │
|
||||||
|
│ 3) .find(nodesQuery).limit(nodos) → │
|
||||||
|
│ wikipediaNodes, noticiasNodes, │
|
||||||
|
│ torrentsNodes │
|
||||||
|
│ 4) Combina y formatea a `formattedNodes`│
|
||||||
|
│ 5) nodeIds = formattedNodes.map(id) │
|
||||||
|
│ 6) linksQuery = { │
|
||||||
|
│ noticia1: { $in: nodeIds }, │
|
||||||
|
│ noticia2: { $in: nodeIds }, │
|
||||||
|
│ porcentaje_similitud: { $gte: min }│
|
||||||
|
│ } │
|
||||||
|
│ 7) comparacionesCollection.find(linksQuery) → rawLinks │
|
||||||
|
│ 8) Formatea rawLinks a `{ source, target, value }` │
|
||||||
|
│ 9) Responde `{ nodes: formattedNodes, links: formattedLinks }` │
|
||||||
|
└────────────┬────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌───────────────────────────┐
|
||||||
|
│ Cliente JS recibe JSON │
|
||||||
|
│ Filtra nodos sin conexiones│
|
||||||
|
│ Dibuja ForceGraph3D │
|
||||||
|
└───────────────────────────┘
|
||||||
69
FLUJOS/DOCS/ELASTIC.txt
Executable file
|
|
@ -0,0 +1,69 @@
|
||||||
|
PROYECTO FLUJOS: DOCUMENTACIÓN
|
||||||
|
plaintext
|
||||||
|
Copy code
|
||||||
|
===================================================================================================
|
||||||
|
1. BASE DE DATOS (ELASTICSEARCH)
|
||||||
|
a. Instalación:
|
||||||
|
bash
|
||||||
|
Copy code
|
||||||
|
# Sigue las instrucciones de la página oficial para descargar e instalar Elasticsearch y Kibana.
|
||||||
|
b. Configuración de Elasticsearch:
|
||||||
|
bash
|
||||||
|
Copy code
|
||||||
|
# AÑADE O MODIFICA las siguientes líneas en el archivo elasticsearch.yml con tu editor de texto preferido, por ejemplo:
|
||||||
|
nano config/elasticsearch.yml
|
||||||
|
|
||||||
|
network.host: localhost
|
||||||
|
http.port: 9200
|
||||||
|
c. Inicio de Elasticsearch:
|
||||||
|
bash
|
||||||
|
Copy code
|
||||||
|
# Desde la carpeta de Elasticsearch, ejecuta:
|
||||||
|
bin/elasticsearch
|
||||||
|
d. Verificación:
|
||||||
|
bash
|
||||||
|
Copy code
|
||||||
|
# Ejecuta el siguiente comando para verificar:
|
||||||
|
curl -X GET "http://localhost:9200/"
|
||||||
|
plaintext
|
||||||
|
Copy code
|
||||||
|
===================================================================================================
|
||||||
|
2. SCRAPER (scraper.py)
|
||||||
|
a. Ejecución:
|
||||||
|
bash
|
||||||
|
Copy code
|
||||||
|
# Asegúrate de estar en el directorio correcto y ejecuta:
|
||||||
|
python3 scraper.py
|
||||||
|
plaintext
|
||||||
|
Copy code
|
||||||
|
===================================================================================================
|
||||||
|
3. PROCESAMIENTO Y GUARDADO (guardar_datos.py)
|
||||||
|
a. Ejecución:
|
||||||
|
bash
|
||||||
|
Copy code
|
||||||
|
# Asegúrate de estar en el directorio correcto y ejecuta:
|
||||||
|
python3 guardar_datos.py
|
||||||
|
plaintext
|
||||||
|
Copy code
|
||||||
|
===================================================================================================
|
||||||
|
4. KIBANA
|
||||||
|
a. Configuración:
|
||||||
|
bash
|
||||||
|
Copy code
|
||||||
|
# AÑADE O MODIFICA las siguientes líneas en el archivo kibana.yml con tu editor de texto preferido, por ejemplo:
|
||||||
|
nano config/kibana.yml
|
||||||
|
|
||||||
|
elasticsearch.hosts: ["http://localhost:9200"]
|
||||||
|
b. Inicio de Kibana:
|
||||||
|
bash
|
||||||
|
Copy code
|
||||||
|
# Desde la carpeta de Kibana, ejecuta:
|
||||||
|
bin/kibana
|
||||||
|
c. Acceso a Kibana:
|
||||||
|
bash
|
||||||
|
Copy code
|
||||||
|
# Abre tu navegador y ve a:
|
||||||
|
http://localhost:5601
|
||||||
|
plaintext
|
||||||
|
Copy code
|
||||||
|
===================================================================================================
|
||||||
27
FLUJOS/DOCS/estructura.txt
Executable file
|
|
@ -0,0 +1,27 @@
|
||||||
|
proyecto/
|
||||||
|
|
|
||||||
|
|-- .gitignore # Archivos y directorios ignorados por git
|
||||||
|
|-- package-lock.json # Bloquea las versiones de las dependencias
|
||||||
|
|-- FLUJOS_APP.js # Punto de entrada de tu aplicación
|
||||||
|
|
|
||||||
|
|-- DOCS/ # Documentación del proyecto
|
||||||
|
|
|
||||||
|
|-- BACK_BACK/ # Contiene elementos relacionados con el backend
|
||||||
|
| |-- entorno/ # Configuraciones del entorno o archivos relacionados
|
||||||
|
| |-- requirements/ # Dependencias y requerimientos del proyecto
|
||||||
|
| |-- OBSEI/ # (No utilizado, considerar eliminar si no es necesario)
|
||||||
|
|
|
||||||
|
|-- VISUALIZACION/ # Código relacionado con la parte visual o frontend
|
||||||
|
| |-- node_modules/ # Módulos de Node.js
|
||||||
|
| |-- package.json # Dependencias del frontend y scripts
|
||||||
|
| |-- package-lock.json # Bloquea las versiones de las dependencias del frontend
|
||||||
|
| |-- public/ # Archivos estáticos (HTML, CSS, JS, imágenes)
|
||||||
|
| | |-- images/ # Imágenes
|
||||||
|
| | |-- ... # Otros archivos estáticos (html, css, js)
|
||||||
|
| |-- controllers/ # Controladores para la lógica del negocio
|
||||||
|
| |-- models/ # Modelos o esquemas de la base de datos
|
||||||
|
| |-- graphql/ # Definiciones para GraphQL (si se usa)
|
||||||
|
| |-- routes/ # Rutas de la aplicación
|
||||||
|
|
|
||||||
|
|-- .gitignore # Archivos y directorios ignorados por git
|
||||||
|
`-- package-lock.json # Bloquea las versiones de las dependencias
|
||||||
0
FLUJOS/README.md
Normal file
0
FLUJOS/VISUALIZACION/controllers/postController.js
Executable file
0
FLUJOS/VISUALIZACION/controllers/userController.js
Executable file
63
FLUJOS/VISUALIZACION/graphql/resolvers.js
Executable file
|
|
@ -0,0 +1,63 @@
|
||||||
|
const User = require('../models/User');
|
||||||
|
const Post = require('../models/Post');
|
||||||
|
const Node = require('../models/Node');
|
||||||
|
const Flow = require('../models/Flow');
|
||||||
|
const Project = require('../models/Project');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
users: async () => {
|
||||||
|
//... tu código existente para obtener usuarios
|
||||||
|
},
|
||||||
|
|
||||||
|
posts: async () => {
|
||||||
|
//... tu código existente para obtener posts
|
||||||
|
},
|
||||||
|
|
||||||
|
nodes: async () => {
|
||||||
|
try {
|
||||||
|
const nodes = await Node.find();
|
||||||
|
return nodes.map(node => {
|
||||||
|
return {
|
||||||
|
...node._doc,
|
||||||
|
_id: node._id.toString(),
|
||||||
|
flow: getFlow.bind(this, node._doc.flow)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
flows: async () => {
|
||||||
|
try {
|
||||||
|
const flows = await Flow.find();
|
||||||
|
return flows.map(flow => {
|
||||||
|
return {
|
||||||
|
...flow._doc,
|
||||||
|
_id: flow._id.toString(),
|
||||||
|
nodes: getNodes.bind(this, flow._doc.nodes),
|
||||||
|
project: getProject.bind(this, flow._doc.project)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
projects: async () => {
|
||||||
|
try {
|
||||||
|
const projects = await Project.find();
|
||||||
|
return projects.map(project => {
|
||||||
|
return {
|
||||||
|
...project._doc,
|
||||||
|
_id: project._id.toString(),
|
||||||
|
flows: getFlows.bind(this, project._doc.flows)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aquí necesitarías implementar las funciones auxiliares getPosts, getUser, getFlow, getNodes, getFlows y getProject.
|
||||||
104
FLUJOS/VISUALIZACION/graphql/schema.js
Executable file
|
|
@ -0,0 +1,104 @@
|
||||||
|
const { buildSchema } = require('graphql');
|
||||||
|
|
||||||
|
module.exports = buildSchema(`
|
||||||
|
type User {
|
||||||
|
_id: ID!
|
||||||
|
name: String!
|
||||||
|
email: String!
|
||||||
|
posts: [Post!]
|
||||||
|
}
|
||||||
|
|
||||||
|
type Post {
|
||||||
|
_id: ID!
|
||||||
|
title: String!
|
||||||
|
content: String!
|
||||||
|
creator: User!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Node {
|
||||||
|
_id: ID!
|
||||||
|
name: String!
|
||||||
|
flow: Flow!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Flow {
|
||||||
|
_id: ID!
|
||||||
|
nodes: [Node!]!
|
||||||
|
project: Project!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Project {
|
||||||
|
_id: ID!
|
||||||
|
flows: [Flow!]!
|
||||||
|
}
|
||||||
|
|
||||||
|
type RootQuery {
|
||||||
|
users: [User!]!
|
||||||
|
posts: [Post!]!
|
||||||
|
nodes: [Node!]!
|
||||||
|
flows: [Flow!]!
|
||||||
|
projects: [Project!]!
|
||||||
|
}
|
||||||
|
|
||||||
|
schema {
|
||||||
|
query: RootQuery
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// export const newsData = [
|
||||||
|
// {
|
||||||
|
// "id": "1",
|
||||||
|
// "title": "BlackRock adquiere empresa de tecnología financiera",
|
||||||
|
// "shares": 3500
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "id": "2",
|
||||||
|
// "title": "BlackRock lanza nuevo fondo de inversión en energías renovables",
|
||||||
|
// "shares": 2900
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "id": "3",
|
||||||
|
// "title": "BlackRock reporta ganancias record en el último trimestre",
|
||||||
|
// "shares": 4000
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "id": "4",
|
||||||
|
// "title": "BlackRock lidera ronda de financiamiento en startup de inteligencia artificial",
|
||||||
|
// "shares": 2100
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "id": "5",
|
||||||
|
// "title": "CEO de BlackRock promueve inversiones sostenibles en cumbre global",
|
||||||
|
// "shares": 2600
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "id": "6",
|
||||||
|
// "title": "BlackRock apunta a mercados emergentes con nuevo producto de inversión",
|
||||||
|
// "shares": 2800
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "id": "7",
|
||||||
|
// "title": "BlackRock se compromete a reducir su huella de carbono en un 50% para 2030",
|
||||||
|
// "shares": 3500
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "id": "8",
|
||||||
|
// "title": "BlackRock lidera el mercado de ETFs con fuerte crecimiento en el último año",
|
||||||
|
// "shares": 3900
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "id": "9",
|
||||||
|
// "title": "BlackRock anuncia inversión millonaria en infraestructura de blockchain",
|
||||||
|
// "shares": 3300
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "id": "10",
|
||||||
|
// "title": "BlackRock apoya iniciativa de transparencia financiera en G20",
|
||||||
|
// "shares": 3000
|
||||||
|
// }
|
||||||
|
// ];
|
||||||
|
|
||||||
11
FLUJOS/VISUALIZACION/models/Flow.js
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
const mongoose = require('mongoose');
|
||||||
|
const Schema = mongoose.Schema;
|
||||||
|
|
||||||
|
const FlowSchema = new Schema({
|
||||||
|
sourceNode: { type: Schema.Types.ObjectId, ref: 'Node' },
|
||||||
|
targetNode: { type: Schema.Types.ObjectId, ref: 'Node' },
|
||||||
|
intensity: Number,
|
||||||
|
// Aquí puedes incluir cualquier metadato del flujo que necesites.
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = mongoose.model('Flow', FlowSchema);
|
||||||
10
FLUJOS/VISUALIZACION/models/Node.js
Executable file
|
|
@ -0,0 +1,10 @@
|
||||||
|
const mongoose = require('mongoose');
|
||||||
|
const Schema = mongoose.Schema;
|
||||||
|
|
||||||
|
const NodeSchema = new Schema({
|
||||||
|
coordinates: { x: Number, y: Number, z: Number },
|
||||||
|
type: String,
|
||||||
|
// Aquí puedes incluir cualquier metadato del nodo que necesites.
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = mongoose.model('Node', NodeSchema);
|
||||||
0
FLUJOS/VISUALIZACION/models/Post.js
Executable file
13
FLUJOS/VISUALIZACION/models/Project.js
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
const mongoose = require('mongoose');
|
||||||
|
const Schema = mongoose.Schema;
|
||||||
|
|
||||||
|
const ProjectSchema = new Schema({
|
||||||
|
user: { type: Schema.Types.ObjectId, ref: 'User' },
|
||||||
|
nodes: [{ type: Schema.Types.ObjectId, ref: 'Node' }],
|
||||||
|
flows: [{ type: Schema.Types.ObjectId, ref: 'Flow' }],
|
||||||
|
// Aquí puedes incluir cualquier metadato del proyecto que necesites.
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = mongoose.model('Project', ProjectSchema);
|
||||||
|
|
||||||
|
|
||||||
10
FLUJOS/VISUALIZACION/models/User.js
Executable file
|
|
@ -0,0 +1,10 @@
|
||||||
|
const mongoose = require('mongoose');
|
||||||
|
const Schema = mongoose.Schema;
|
||||||
|
|
||||||
|
const UserSchema = new Schema({
|
||||||
|
username: String,
|
||||||
|
password: String,
|
||||||
|
// Aquí puedes incluir cualquier metadato del usuario que necesites.
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = mongoose.model('User', UserSchema);
|
||||||
10766
FLUJOS/VISUALIZACION/package-lock.json
generated
Executable file
27
FLUJOS/VISUALIZACION/package.json
Executable file
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"@elastic/elasticsearch": "^8.9.0",
|
||||||
|
"3d-force-graph": "^1.73.3",
|
||||||
|
"express": "^4.18.2",
|
||||||
|
"express-graphql": "^0.12.0",
|
||||||
|
"force-graph": "^1.43.2",
|
||||||
|
"graphql": "^15.8.0",
|
||||||
|
"mongod": "^2.0.0",
|
||||||
|
"mongoose": "^7.3.4",
|
||||||
|
"three": "^0.168.0",
|
||||||
|
"tree": "^0.1.3"
|
||||||
|
},
|
||||||
|
"name": "flujos",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "FLUJOS_APP.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"description": "",
|
||||||
|
"devDependencies": {
|
||||||
|
"parcel-bundler": "^1.8.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
80
FLUJOS/VISUALIZACION/public/3dscript_eco-corp.css
Executable file
|
|
@ -0,0 +1,80 @@
|
||||||
|
:root {
|
||||||
|
--cube-size: 80px;
|
||||||
|
--line-color: #333;
|
||||||
|
--hover-color: #2ecc71;
|
||||||
|
--background-color: #000;
|
||||||
|
--sidebar-width: 250px; /* Ajustamos el ancho del sidebar */
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-start; /* Asegura que el contenido comience desde la izquierda */
|
||||||
|
align-items: center;
|
||||||
|
height: 100vh;
|
||||||
|
background-color: var(--background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-container {
|
||||||
|
position: relative;
|
||||||
|
width: calc(100vw - var(--sidebar-width)); /* Restamos el ancho del sidebar */
|
||||||
|
height: 100vh;
|
||||||
|
margin-left: var(--sidebar-width); /* Añadimos margen para que no se solape */
|
||||||
|
}
|
||||||
|
|
||||||
|
.cube-container {
|
||||||
|
position: absolute;
|
||||||
|
width: var(--cube-size);
|
||||||
|
height: var(--cube-size);
|
||||||
|
transform-style: preserve-3d;
|
||||||
|
transition: transform 1s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cube-container:hover {
|
||||||
|
transform: rotateX(360deg) rotateY(360deg); /* Efecto al pasar el mouse */
|
||||||
|
}
|
||||||
|
|
||||||
|
.cube {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
transform-style: preserve-3d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.face {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: var(--hover-color);
|
||||||
|
border: 1px solid #000;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 0.65rem;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.front { transform: translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
.back { transform: rotateY(180deg) translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
.left { transform: rotateY(-90deg) translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
.right { transform: rotateY(90deg) translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
.top { transform: rotateX(90deg) translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
.bottom { transform: rotateX(-90deg) translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
|
||||||
|
.lines {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line-path {
|
||||||
|
stroke: var(--line-color);
|
||||||
|
stroke-width: 2;
|
||||||
|
transition: stroke 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line-path:hover {
|
||||||
|
stroke: #e74c3c;
|
||||||
|
}
|
||||||
147
FLUJOS/VISUALIZACION/public/3dscript_eco-corp.html
Executable file
|
|
@ -0,0 +1,147 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Visualización 2D de Noticias Políticas</title>
|
||||||
|
<link rel="stylesheet" href="3dscript_eco-corp.css">
|
||||||
|
<style>
|
||||||
|
.popup {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
background: white;
|
||||||
|
color: black;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 10px;
|
||||||
|
z-index: 2;
|
||||||
|
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.popup:focus,
|
||||||
|
.cube-container:focus + .popup {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popup button {
|
||||||
|
display: block;
|
||||||
|
margin: 10px auto;
|
||||||
|
padding: 10px;
|
||||||
|
background-color: #333;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popup button:hover {
|
||||||
|
background-color: #555;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="graph-container" id="graph-container">
|
||||||
|
<svg class="lines" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" id="svg-lines">
|
||||||
|
<!-- Líneas generadas dinámicamente -->
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const numCubes = 9; // Número total de cubos
|
||||||
|
const spacing = 150; // Espacio mínimo entre los cubos
|
||||||
|
const graphContainer = document.getElementById('graph-container');
|
||||||
|
const svgLines = document.getElementById('svg-lines');
|
||||||
|
let cubePositions = [];
|
||||||
|
|
||||||
|
// Función para detectar colisiones y asegurarse de que los cubos no se solapen
|
||||||
|
function detectCollision(newX, newY, positions) {
|
||||||
|
for (let pos of positions) {
|
||||||
|
const distance = Math.sqrt((newX - pos.x) ** 2 + (newY - pos.y) ** 2);
|
||||||
|
if (distance < spacing) {
|
||||||
|
return true; // Hay colisión
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false; // No hay colisión
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función para generar una posición aleatoria sin que los cubos se solapen
|
||||||
|
function getRandomPosition(maxWidth, maxHeight) {
|
||||||
|
let x, y;
|
||||||
|
do {
|
||||||
|
x = Math.random() * (maxWidth - spacing);
|
||||||
|
y = Math.random() * (maxHeight - spacing);
|
||||||
|
} while (detectCollision(x, y, cubePositions));
|
||||||
|
return { x, y };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función para generar cubos con posiciones aleatorias
|
||||||
|
function generateRandomCubes(cubeCount) {
|
||||||
|
for (let i = 0; i < cubeCount; i++) {
|
||||||
|
const position = getRandomPosition(window.innerWidth, window.innerHeight);
|
||||||
|
const cubeContainer = document.createElement('div');
|
||||||
|
cubeContainer.classList.add('cube-container');
|
||||||
|
cubeContainer.setAttribute('tabindex', '0');
|
||||||
|
cubeContainer.style.top = position.y + 'px';
|
||||||
|
cubeContainer.style.left = position.x + 'px';
|
||||||
|
|
||||||
|
cubeContainer.innerHTML = `
|
||||||
|
<div class="cube">
|
||||||
|
<div class="face front">País ${i}</div>
|
||||||
|
<div class="face back">Detalle ${i}</div>
|
||||||
|
<div class="face left">Año ${2000 + i}</div>
|
||||||
|
<div class="face right">Muertos ${(i + 1) * 1000}</div>
|
||||||
|
<div class="face top">ONU</div>
|
||||||
|
<div class="face bottom">Fuente</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
// Crear un popup para cada cubo
|
||||||
|
const popup = document.createElement('div');
|
||||||
|
popup.classList.add('popup');
|
||||||
|
popup.innerHTML = `
|
||||||
|
<p>Noticia relacionada con País ${i}</p>
|
||||||
|
<button>Close</button>
|
||||||
|
`;
|
||||||
|
|
||||||
|
popup.querySelector('button').addEventListener('click', () => {
|
||||||
|
popup.style.display = 'none';
|
||||||
|
cubeContainer.focus(); // Regresar el foco al cubo
|
||||||
|
});
|
||||||
|
|
||||||
|
cubeContainer.addEventListener('focus', () => {
|
||||||
|
popup.style.display = 'block';
|
||||||
|
});
|
||||||
|
|
||||||
|
cubePositions.push({ x: position.x + 35, y: position.y + 35 }); // Guardar la posición
|
||||||
|
graphContainer.appendChild(cubeContainer);
|
||||||
|
graphContainer.appendChild(popup); // Añadir el popup después del cubo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función para generar las líneas entre cubos relacionados
|
||||||
|
function generateLines() {
|
||||||
|
for (let i = 0; i < cubePositions.length - 1; i++) {
|
||||||
|
const x1 = cubePositions[i].x;
|
||||||
|
const y1 = cubePositions[i].y;
|
||||||
|
const x2 = cubePositions[i + 1].x;
|
||||||
|
const y2 = cubePositions[i + 1].y;
|
||||||
|
|
||||||
|
const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
|
||||||
|
line.setAttribute('x1', x1);
|
||||||
|
line.setAttribute('y1', y1);
|
||||||
|
line.setAttribute('x2', x2);
|
||||||
|
line.setAttribute('y2', y2);
|
||||||
|
line.setAttribute('stroke', '#333');
|
||||||
|
line.setAttribute('stroke-width', '2');
|
||||||
|
|
||||||
|
svgLines.appendChild(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generar cubos aleatorios y las líneas de conexión
|
||||||
|
generateRandomCubes(numCubes);
|
||||||
|
generateLines();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
332
FLUJOS/VISUALIZACION/public/climate.css
Executable file
|
|
@ -0,0 +1,332 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: "Retrolift";
|
||||||
|
src: url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff2") format("woff2"),
|
||||||
|
url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff") format("woff");
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: 'Fira Code';
|
||||||
|
text-shadow: 10px 10px 20px rgba(0, 255, 76, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Fira Code', monospace;
|
||||||
|
background: #000000;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
height: 70px;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ffffff;
|
||||||
|
box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
font-family: "Retrolift", sans-serif;
|
||||||
|
font-size: 4em;
|
||||||
|
font-weight: bold;
|
||||||
|
letter-spacing: 4px;
|
||||||
|
text-shadow: 6px 6px 6px #73ff00;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.glob-war:hover .logo { text-shadow: 2px 2px 8px #39ff14; }
|
||||||
|
.int-sec:hover .logo { text-shadow: 2px 2px 8px #ff69b4; }
|
||||||
|
.climate:hover .logo { text-shadow: 2px 2px 8px #ff4500; }
|
||||||
|
.eco-corp:hover .logo { text-shadow: 2px 2px 8px #006400; }
|
||||||
|
.popl-up:hover .logo { text-shadow: 2px 2px 8px #00008b; }
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ff1a1a;
|
||||||
|
padding: 10px 0;
|
||||||
|
box-shadow: 0 10px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
margin-top: 40px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 6em; /* incrementa la distancia entre los elementos */
|
||||||
|
}
|
||||||
|
.nav-links a {
|
||||||
|
color: #000000;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
transition: color 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
|
padding: 20px 40px;
|
||||||
|
box-shadow: 0 0 0px rgba(28, 103, 241, 0);
|
||||||
|
|
||||||
|
/* Estilo de los botones */
|
||||||
|
position:relative;
|
||||||
|
border: none;
|
||||||
|
|
||||||
|
transition: .4s ease-in;
|
||||||
|
z-index: 1;
|
||||||
|
width: 40vw;
|
||||||
|
height: 20vh;
|
||||||
|
border:3vw;
|
||||||
|
|
||||||
|
align-items: center;
|
||||||
|
border: 3px solid ;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
box-shadow: 0 0 6px rgba(0,0,0,0.3);
|
||||||
|
|
||||||
|
/* Estilo hover de los botones */
|
||||||
|
|
||||||
|
box-shadow: 2vw 1vw;
|
||||||
|
|
||||||
|
border: 3px solid black ;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glob-war:hover { color: #39ff14; }
|
||||||
|
.int-sec:hover { color: #ff69b4; }
|
||||||
|
.climate:hover { color: #ff4500; }
|
||||||
|
.eco-corp:hover { color: #00fff2; }
|
||||||
|
.popl-up:hover { color: #0066ff; }
|
||||||
|
|
||||||
|
.glob-war {
|
||||||
|
color: #FF4136;
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.int-sec {
|
||||||
|
color: #0074D9;
|
||||||
|
background-color: darkblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.climate {
|
||||||
|
color: #2ECC40;
|
||||||
|
background-color: lightgreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eco-corp {
|
||||||
|
color: #FFDC00;
|
||||||
|
background-color: yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popl-up {
|
||||||
|
color: #FF851B;
|
||||||
|
background-color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
height: 100vh;
|
||||||
|
width: 99%;
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background a {
|
||||||
|
display: block;
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img {
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background a img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#sidebar.active {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
top: 0;
|
||||||
|
width: 250px;
|
||||||
|
height: 100vh;
|
||||||
|
background-image: url("/images/flujos7.jpg");
|
||||||
|
background-size: cover;
|
||||||
|
color: #39ff14;
|
||||||
|
padding: 30px;
|
||||||
|
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
|
||||||
|
transform: translateX(-90%);
|
||||||
|
transition: transform 0.3s ease-out;
|
||||||
|
overflow: auto;
|
||||||
|
font-size:18px;
|
||||||
|
z-index: 3;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; /* Añade el borde al texto */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#sidebar h2 {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
text-shadow: -1px 0 black, 0 3px black, 3px 0 black, 0 -1px black; /* Añade el borde al texto */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#sidebar:hover {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebarToggle {
|
||||||
|
position: absolute;
|
||||||
|
left: 1em;
|
||||||
|
top: 1em;
|
||||||
|
background: #007BFF;
|
||||||
|
color: #39ff14;
|
||||||
|
border: none;
|
||||||
|
padding: 10px 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: background 0.3s ease;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebarToggle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
font-size:20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar label {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; /* Añade el borde al texto */
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input {
|
||||||
|
padding: 10px;
|
||||||
|
border: 2px solid #39ff14; /* Añade el borde verde al input */
|
||||||
|
background: black; /* Cambia el fondo del input a negro */
|
||||||
|
color: #39ff14; /* Cambia el color del texto en el input a verde */
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.2);
|
||||||
|
transition: box-shadow 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input:hover {
|
||||||
|
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"] {
|
||||||
|
color: #39ff14;
|
||||||
|
background: #ff6600;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"]:hover {
|
||||||
|
background: #ff6600;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
footer {
|
||||||
|
width: 100%;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #39ff14;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a {
|
||||||
|
color: #39ff14;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a:hover {
|
||||||
|
color: #2ECC40;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#climateContainer {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
opacity: 0.5;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.8em; /* reduce el tamaño de la fuente */
|
||||||
|
padding: 10px 20px; /* reduce el padding */
|
||||||
|
}
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 2em; /* incrementa la distancia entre los elementos */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.fade-out {
|
||||||
|
animation: fadeOut 2s forwards; /* Fades out over 3 seconds */
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeOut {
|
||||||
|
from {opacity: 1;}
|
||||||
|
to {opacity: 0;}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.grafico {
|
||||||
|
z-index: 1; /* Bring to front */
|
||||||
|
/* Rest of your styles */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.grafico {
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
87
FLUJOS/VISUALIZACION/public/climate.html
Executable file
|
|
@ -0,0 +1,87 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>CLIMATE</title>
|
||||||
|
<link rel="stylesheet" href="climate.css">
|
||||||
|
<!-- Fuentes de Google Fonts -->
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&display=swap" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- Cargar 3d-force-graph (incluye Three.js) -->
|
||||||
|
<!-- CORRECTO: d3 primero, force-graph después -->
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.min.js"></script>
|
||||||
|
<script src="https://unpkg.com/3d-force-graph"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<nav>
|
||||||
|
<ul class="nav-links">
|
||||||
|
<li><a href="climate.html" class="climate">CLIMATE</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<div id="climateContainer" style="position: absolute; width: 100%; height: 100%;"></div>
|
||||||
|
<div class="background">
|
||||||
|
<img src="/images/flujos6.jpg">
|
||||||
|
<img src="/images/flujos6.jpg">
|
||||||
|
<img src="/images/flujos6.jpg">
|
||||||
|
<img src="/images/flujos6.jpg">
|
||||||
|
<img src="/images/flujos6.jpg">
|
||||||
|
<script>
|
||||||
|
setTimeout(function() {
|
||||||
|
var fondo = document.querySelector('.background');
|
||||||
|
fondo.classList.add('fade-out');
|
||||||
|
fondo.style.pointerEvents = 'none';
|
||||||
|
}, 1000);
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<div id="sidebar">
|
||||||
|
<h2>Parámetros</h2>
|
||||||
|
|
||||||
|
<form id="paramForm">
|
||||||
|
<label for="fecha_inicio">Fecha de inicio:</label>
|
||||||
|
<input type="date" id="fecha_inicio" name="fecha_inicio">
|
||||||
|
|
||||||
|
<label for="fecha_fin">Fecha de fin:</label>
|
||||||
|
<input type="date" id="fecha_fin" name="fecha_fin">
|
||||||
|
|
||||||
|
<label for="nodos">Nodos:</label>
|
||||||
|
<input type="number" id="nodos" name="nodos" value="100">
|
||||||
|
|
||||||
|
<label for="complejidad">Complejidad:</label>
|
||||||
|
<input type="range" id="complejidad" name="complejidad" min="1" max="40" value="20">
|
||||||
|
|
||||||
|
<label for="param1">Búsqueda por palabra:</label>
|
||||||
|
<input type="text" id="param1" name="param1">
|
||||||
|
|
||||||
|
<label for="color1">Color 1:</label>
|
||||||
|
<input type="color" id="color1" name="color1">
|
||||||
|
|
||||||
|
<label for="param2">Búsqueda por temática personalizada:</label>
|
||||||
|
<input type="text" id="param2" name="param2">
|
||||||
|
|
||||||
|
<label for="color2">Color 2:</label>
|
||||||
|
<input type="color" id="color2" name="color2">
|
||||||
|
|
||||||
|
<input type="submit" value="Aplicar">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button id="sidebarToggle">Toggle Sidebar</button>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p><a href="#">GitHub</a> | <a href="#">Telegram</a> | <a href="#">Email</a> | <a href="#">Web de Tor</a></p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Movemos la inclusión del script aquí, al final del body -->
|
||||||
|
<script src="output_climate_pruebas.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
0
FLUJOS/VISUALIZACION/public/climate.js
Executable file
236
FLUJOS/VISUALIZACION/public/eco-corp.css
Executable file
|
|
@ -0,0 +1,236 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: "Retrolift";
|
||||||
|
src: url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff2") format("woff2"),
|
||||||
|
url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff") format("woff");
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: 'Fira Code';
|
||||||
|
text-shadow: 10px 10px 20px rgba(0, 255, 76, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Fira Code', monospace;
|
||||||
|
background: #000000;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
height: 70px;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ffffff;
|
||||||
|
box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
font-family: "Retrolift", sans-serif;
|
||||||
|
font-size: 4em;
|
||||||
|
font-weight: bold;
|
||||||
|
letter-spacing: 4px;
|
||||||
|
text-shadow: 6px 6px 6px #73ff00;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glob-war:hover .logo { text-shadow: 2px 2px 8px #39ff14; }
|
||||||
|
.int-sec:hover .logo { text-shadow: 2px 2px 8px #ff69b4; }
|
||||||
|
.climate:hover .logo { text-shadow: 2px 2px 8px #ff4500; }
|
||||||
|
.eco-corp:hover .logo { text-shadow: 2px 2px 8px #006400; }
|
||||||
|
.popl-up:hover .logo { text-shadow: 2px 2px 8px #00008b; }
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ff1a1a;
|
||||||
|
padding: 10px 0;
|
||||||
|
box-shadow: 0 10px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
margin-top: 40px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
color: #000000;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
transition: color 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
|
padding: 20px 40px;
|
||||||
|
box-shadow: 0 0 0px rgba(28, 103, 241, 0);
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
border: none;
|
||||||
|
transition: .4s ease-in;
|
||||||
|
z-index: 1;
|
||||||
|
width: 40vw;
|
||||||
|
height: 20vh;
|
||||||
|
border: 3vw;
|
||||||
|
align-items: center;
|
||||||
|
border: 3px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
box-shadow: 0 0 6px rgba(0,0,0,0.3);
|
||||||
|
border: 3px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glob-war:hover { color: #39ff14; }
|
||||||
|
.int-sec:hover { color: #ff69b4; }
|
||||||
|
.climate:hover { color: #ff4500; }
|
||||||
|
.eco-corp:hover { color: #00fff2; }
|
||||||
|
.popl-up:hover { color: #0066ff; }
|
||||||
|
|
||||||
|
.glob-war { color: #FF4136; background-color: red; }
|
||||||
|
.int-sec { color: #0074D9; background-color: darkblue; }
|
||||||
|
.climate { color: #2ECC40; background-color: lightgreen; }
|
||||||
|
.eco-corp { color: #FFDC00; background-color: yellow; }
|
||||||
|
.popl-up { color: #FF851B; background-color: orange; }
|
||||||
|
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
height: 100vh;
|
||||||
|
width: 99%;
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background a {
|
||||||
|
display: block;
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img {
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sidebar con comportamiento onhover */
|
||||||
|
#sidebar {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 250px;
|
||||||
|
height: 100vh;
|
||||||
|
background-image: url("/images/flujos7.jpg");
|
||||||
|
background-size: cover;
|
||||||
|
color: #39ff14;
|
||||||
|
padding: 30px;
|
||||||
|
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
|
||||||
|
transform: translateX(-220px);
|
||||||
|
transition: transform 0.3s ease-out;
|
||||||
|
overflow: auto;
|
||||||
|
font-size: 18px;
|
||||||
|
z-index: 3;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar:hover {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar h2 {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
text-shadow: -1px 0 black, 0 3px black, 3px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar label {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input {
|
||||||
|
padding: 10px;
|
||||||
|
border: 2px solid #39ff14;
|
||||||
|
background: black;
|
||||||
|
color: #39ff14;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.2);
|
||||||
|
transition: box-shadow 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input:hover {
|
||||||
|
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"] {
|
||||||
|
color: #39ff14;
|
||||||
|
background: #ff6600;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"]:hover {
|
||||||
|
background: #ff6600;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
width: 100%;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #39ff14;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
z-index: 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a {
|
||||||
|
color: #39ff14;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a:hover {
|
||||||
|
color: #2ECC40;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ajuste del iframe para que respete el espacio del sidebar */
|
||||||
|
.iframe-container {
|
||||||
|
width: calc(100% - 250px);
|
||||||
|
height: 100vh;
|
||||||
|
background: #000000;
|
||||||
|
margin: 0 auto;
|
||||||
|
border: none;
|
||||||
|
z-index: 1;
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
position: absolute;
|
||||||
|
left: 250px;
|
||||||
|
}
|
||||||
|
|
||||||
77
FLUJOS/VISUALIZACION/public/eco-corp.html
Executable file
|
|
@ -0,0 +1,77 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Economía y Corporaciones</title>
|
||||||
|
<link rel="stylesheet" href="eco-corp.css">
|
||||||
|
<!-- Fuentes de Google Fonts -->
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&display=swap" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- Cargar D3.js -->
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.min.js"></script>
|
||||||
|
<!-- Cargar 3d-force-graph (incluye Three.js) -->
|
||||||
|
<script src="https://unpkg.com/3d-force-graph"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<nav>
|
||||||
|
<ul class="nav-links">
|
||||||
|
<li><a href="eco-corp.html" class="eco-corp">Economía y Corporaciones</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<div id="ecoCorpContainer" style="position: absolute; width: 100%; height: 100%;"></div>
|
||||||
|
<div class="background">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<script>
|
||||||
|
setTimeout(function() {
|
||||||
|
var fondo = document.querySelector('.background');
|
||||||
|
fondo.classList.add('fade-out');
|
||||||
|
fondo.style.pointerEvents = 'none';
|
||||||
|
}, 1000);
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<div id="sidebar">
|
||||||
|
<h2>Parámetros</h2>
|
||||||
|
<form id="paramForm">
|
||||||
|
<label for="fecha_inicio">Fecha de inicio:</label>
|
||||||
|
<input type="date" id="fecha_inicio" name="fecha_inicio">
|
||||||
|
|
||||||
|
<label for="fecha_fin">Fecha de fin:</label>
|
||||||
|
<input type="date" id="fecha_fin" name="fecha_fin">
|
||||||
|
|
||||||
|
<label for="nodos">Nodos:</label>
|
||||||
|
<input type="number" id="nodos" name="nodos" value="100">
|
||||||
|
|
||||||
|
<label for="complejidad">Complejidad:</label>
|
||||||
|
<input type="range" id="complejidad" name="complejidad" min="1" max="40" value="20">
|
||||||
|
|
||||||
|
<label for="param1">Búsqueda por palabra:</label>
|
||||||
|
<input type="text" id="param1" name="param1">
|
||||||
|
|
||||||
|
<label for="param2">Búsqueda por temática personalizada:</label>
|
||||||
|
<input type="text" id="param2" name="param2">
|
||||||
|
|
||||||
|
<input type="submit" value="Aplicar">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button id="sidebarToggle">Toggle Sidebar</button>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p><a href="#">GitHub</a> | <a href="#">Telegram</a> | <a href="#">Email</a> | <a href="#">Web de Tor</a></p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Incluir tu script al final del body -->
|
||||||
|
<script src="output_eco_corp_pruebas.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
331
FLUJOS/VISUALIZACION/public/glob-war.css
Executable file
|
|
@ -0,0 +1,331 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: "Retrolift";
|
||||||
|
src: url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff2") format("woff2"),
|
||||||
|
url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff") format("woff");
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: 'Fira Code';
|
||||||
|
text-shadow: 10px 10px 20px rgba(0, 255, 76, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Fira Code', monospace;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
height: 70px;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #000000;
|
||||||
|
box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
font-family: "Retrolift", sans-serif;
|
||||||
|
font-size: 4em;
|
||||||
|
font-weight: bold;
|
||||||
|
letter-spacing: 4px;
|
||||||
|
text-shadow: 6px 6px 6px #73ff00;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.glob-war:hover .logo { text-shadow: 2px 2px 8px #39ff14; }
|
||||||
|
.int-sec:hover .logo { text-shadow: 2px 2px 8px #ff69b4; }
|
||||||
|
.climate:hover .logo { text-shadow: 2px 2px 8px #ff4500; }
|
||||||
|
.eco-corp:hover .logo { text-shadow: 2px 2px 8px #006400; }
|
||||||
|
.popl-up:hover .logo { text-shadow: 2px 2px 8px #00008b; }
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ff1a1a;
|
||||||
|
padding: 10px 0;
|
||||||
|
box-shadow: 0 10px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
margin-top: 40px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 6em; /* incrementa la distancia entre los elementos */
|
||||||
|
}
|
||||||
|
.nav-links a {
|
||||||
|
color: #000000;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
transition: color 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
|
padding: 20px 40px;
|
||||||
|
box-shadow: 0 0 0px rgba(28, 103, 241, 0);
|
||||||
|
|
||||||
|
/* Estilo de los botones */
|
||||||
|
position:relative;
|
||||||
|
border: none;
|
||||||
|
|
||||||
|
transition: .4s ease-in;
|
||||||
|
z-index: 1;
|
||||||
|
width: 40vw;
|
||||||
|
height: 20vh;
|
||||||
|
border:3vw;
|
||||||
|
|
||||||
|
align-items: center;
|
||||||
|
border: 3px solid ;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
box-shadow: 0 0 6px rgba(0,0,0,0.3);
|
||||||
|
|
||||||
|
/* Estilo hover de los botones */
|
||||||
|
|
||||||
|
box-shadow: 2vw 1vw;
|
||||||
|
|
||||||
|
border: 3px solid black ;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glob-war:hover { color: #39ff14; }
|
||||||
|
.int-sec:hover { color: #ff69b4; }
|
||||||
|
.climate:hover { color: #ff4500; }
|
||||||
|
.eco-corp:hover { color: #00fff2; }
|
||||||
|
.popl-up:hover { color: #0066ff; }
|
||||||
|
|
||||||
|
.glob-war {
|
||||||
|
color: #FF4136;
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.int-sec {
|
||||||
|
color: #0074D9;
|
||||||
|
background-color: darkblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.climate {
|
||||||
|
color: #2ECC40;
|
||||||
|
background-color: lightgreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eco-corp {
|
||||||
|
color: #FFDC00;
|
||||||
|
background-color: yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popl-up {
|
||||||
|
color: #FF851B;
|
||||||
|
background-color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
height: 100vh;
|
||||||
|
width: 99%;
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background a {
|
||||||
|
display: block;
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img {
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background a img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#sidebar.active {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
top: 0;
|
||||||
|
width: 250px;
|
||||||
|
height: 100vh;
|
||||||
|
background-image: url("/images/flujos7.jpg");
|
||||||
|
background-size: cover;
|
||||||
|
color: #39ff14;
|
||||||
|
padding: 30px;
|
||||||
|
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
|
||||||
|
transform: translateX(-90%);
|
||||||
|
transition: transform 0.3s ease-out;
|
||||||
|
overflow: auto;
|
||||||
|
font-size:18px;
|
||||||
|
z-index: 3;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; /* Añade el borde al texto */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#sidebar h2 {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
text-shadow: -1px 0 black, 0 3px black, 3px 0 black, 0 -1px black; /* Añade el borde al texto */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#sidebar:hover {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebarToggle {
|
||||||
|
position: absolute;
|
||||||
|
left: 1em;
|
||||||
|
top: 1em;
|
||||||
|
background: #007BFF;
|
||||||
|
color: #39ff14;
|
||||||
|
border: none;
|
||||||
|
padding: 10px 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: background 0.3s ease;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebarToggle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
font-size:20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar label {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; /* Añade el borde al texto */
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input {
|
||||||
|
padding: 10px;
|
||||||
|
border: 2px solid #39ff14; /* Añade el borde verde al input */
|
||||||
|
background: black; /* Cambia el fondo del input a negro */
|
||||||
|
color: #39ff14; /* Cambia el color del texto en el input a verde */
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.2);
|
||||||
|
transition: box-shadow 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input:hover {
|
||||||
|
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"] {
|
||||||
|
color: #39ff14;
|
||||||
|
background: #ff6600;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"]:hover {
|
||||||
|
background: #ff6600;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
footer {
|
||||||
|
width: 100%;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #39ff14;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a {
|
||||||
|
color: #39ff14;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a:hover {
|
||||||
|
color: #2ECC40;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#glob_war_container{
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
opacity: 0.5;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.8em; /* reduce el tamaño de la fuente */
|
||||||
|
padding: 10px 20px; /* reduce el padding */
|
||||||
|
}
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 2em; /* incrementa la distancia entre los elementos */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.fade-out {
|
||||||
|
animation: fadeOut 3s forwards; /* Fades out over 3 seconds */
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeOut {
|
||||||
|
from {opacity: 1;}
|
||||||
|
to {opacity: 0;}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.grafico {
|
||||||
|
z-index: 1; /* Bring to front */
|
||||||
|
/* Rest of your styles */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.grafico {
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
83
FLUJOS/VISUALIZACION/public/glob-war.html
Executable file
|
|
@ -0,0 +1,83 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Glob-War</title>
|
||||||
|
<link rel="stylesheet" href="glob-war.css">
|
||||||
|
<!-- Fuentes de Google Fonts -->
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&display=swap" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- Cargar D3.js -->
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.min.js"></script>
|
||||||
|
<!-- Cargar 3d-force-graph (incluye Three.js) -->
|
||||||
|
<script src="https://unpkg.com/3d-force-graph"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<nav>
|
||||||
|
<ul class="nav-links">
|
||||||
|
<li><a href="glob-war.html" class="glob-war">GLOB-WAR</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<div id="globWarContainer" style="position: absolute; width: 100%; height: 100%;"></div>
|
||||||
|
<div class="background">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<script>
|
||||||
|
setTimeout(function() {
|
||||||
|
var fondo = document.querySelector('.background');
|
||||||
|
fondo.classList.add('fade-out');
|
||||||
|
fondo.style.pointerEvents = 'none';
|
||||||
|
}, 1000);
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<div id="sidebar">
|
||||||
|
<h2>Parámetros</h2>
|
||||||
|
<form id="paramForm">
|
||||||
|
<label for="fecha_inicio">Fecha de inicio:</label>
|
||||||
|
<input type="date" id="fecha_inicio" name="fecha_inicio">
|
||||||
|
|
||||||
|
<label for="fecha_fin">Fecha de fin:</label>
|
||||||
|
<input type="date" id="fecha_fin" name="fecha_fin">
|
||||||
|
|
||||||
|
<label for="nodos">Nodos:</label>
|
||||||
|
<input type="number" id="nodos" name="nodos" value="100">
|
||||||
|
|
||||||
|
<label for="complejidad">Complejidad:</label>
|
||||||
|
<input type="range" id="complejidad" name="complejidad" min="1" max="40" value="20">
|
||||||
|
|
||||||
|
<label for="param1">Búsqueda por palabra:</label>
|
||||||
|
<input type="text" id="param1" name="param1">
|
||||||
|
|
||||||
|
<label for="color1">Color 1:</label>
|
||||||
|
<input type="color" id="color1" name="color1">
|
||||||
|
|
||||||
|
<label for="param2">Búsqueda por temática personalizada:</label>
|
||||||
|
<input type="text" id="param2" name="param2">
|
||||||
|
|
||||||
|
<label for="color2">Color 2:</label>
|
||||||
|
<input type="color" id="color2" name="color2">
|
||||||
|
|
||||||
|
<input type="submit" value="Aplicar">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button id="sidebarToggle">Toggle Sidebar</button>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p><a href="#">GitHub</a> | <a href="#">Telegram</a> | <a href="#">Email</a> | <a href="#">Web de Tor</a></p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Incluir tu script al final del body -->
|
||||||
|
<script src="output_glob_war_pruebas.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
BIN
FLUJOS/VISUALIZACION/public/images/flujos.jpg
Executable file
|
After Width: | Height: | Size: 160 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos2.jpg
Executable file
|
After Width: | Height: | Size: 256 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos3.jpg
Executable file
|
After Width: | Height: | Size: 223 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos4.jpg
Executable file
|
After Width: | Height: | Size: 313 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos6.jpg
Executable file
|
After Width: | Height: | Size: 79 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos7.jpg
Executable file
|
After Width: | Height: | Size: 65 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos8.jpg
Executable file
|
After Width: | Height: | Size: 151 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos9.jpg
Executable file
|
After Width: | Height: | Size: 154 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos_logo.png
Executable file
|
After Width: | Height: | Size: 15 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos_logo3.png
Executable file
|
After Width: | Height: | Size: 44 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos_logo4.png
Executable file
|
After Width: | Height: | Size: 37 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/flujos_logo5.png
Executable file
|
After Width: | Height: | Size: 44 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/fujos5.jpg
Executable file
|
After Width: | Height: | Size: 163 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/journalist_fondo.jpg
Executable file
|
After Width: | Height: | Size: 81 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/journalist_fondo2.jpg
Executable file
|
After Width: | Height: | Size: 12 KiB |
BIN
FLUJOS/VISUALIZACION/public/images/journalist_fondo3.jpg
Executable file
|
After Width: | Height: | Size: 38 KiB |
100
FLUJOS/VISUALIZACION/public/index.html
Executable file
|
|
@ -0,0 +1,100 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
<title>UP-LEAKS</title>
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&family=Nosifer&display=swap" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<header>
|
||||||
|
<div class="header-content">
|
||||||
|
<h1 class="title">UP-LEAKS</h1>
|
||||||
|
<div class="header-buttons">
|
||||||
|
<a href="journalist.html" class="small-button">Journalist</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav>
|
||||||
|
<ul class="nav-links">
|
||||||
|
<li><a href="glob-war.html" class="glob-war">GLOB-WAR</a></li>
|
||||||
|
<li><a href="int-sec.html" class="int-sec">INT-SEC</a></li>
|
||||||
|
<li><a href="climate.html" class="climate">CLIMATE</a></li>
|
||||||
|
<li><a href="eco-corp.html" class="eco-corp">ECO-CORP</a></li>
|
||||||
|
<li><a href="popl-up.html" class="popl-up">Popl-up</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<div id="canvasContainer" style="position: absolute; width: 100%; height: 100%; opacity: 0.5;"></div>
|
||||||
|
<div class="background">
|
||||||
|
<a href="glob-war.html">
|
||||||
|
<img class="img1" src="/images/flujos.jpg">
|
||||||
|
</a>
|
||||||
|
<a href="int-sec.html">
|
||||||
|
<img class="img2" src="/images/fujos5.jpg">
|
||||||
|
</a>
|
||||||
|
<a href="climate.html">
|
||||||
|
<img class="img3" src="/images/flujos6.jpg">
|
||||||
|
</a>
|
||||||
|
<a href="eco-corp.html">
|
||||||
|
<img class="img4" src="/images/flujos4.jpg">
|
||||||
|
</a>
|
||||||
|
<a href="popl-up.html">
|
||||||
|
<img class="img5" src="/images/flujos3.jpg">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Botones sobre las imágenes -->
|
||||||
|
<div class="button-overlay">
|
||||||
|
<div class="button-column">
|
||||||
|
<a href="glob-war.html?subtematica=conflictos_internacionales" class="overlay-button">Conflictos Internacionales</a>
|
||||||
|
<a href="glob-war.html?subtematica=guerras_civiles" class="overlay-button">Guerras Civiles</a>
|
||||||
|
<a href="glob-war.html?subtematica=terrorismo" class="overlay-button">Terrorismo</a>
|
||||||
|
<a href="glob-war.html?subtematica=armas" class="overlay-button">Armas</a>
|
||||||
|
<a href="glob-war.html?subtematica=alianzas_militares" class="overlay-button">Alianzas Militares</a>
|
||||||
|
</div>
|
||||||
|
<div class="button-column">
|
||||||
|
<a href="int-sec.html?subtematica=inteligencia" class="overlay-button">Inteligencia</a>
|
||||||
|
<a href="int-sec.html?subtematica=ciberseguridad" class="overlay-button">Ciberseguridad</a>
|
||||||
|
<a href="int-sec.html?subtematica=espionaje" class="overlay-button">Espionaje</a>
|
||||||
|
<a href="int-sec.html?subtematica=seguridad_nacional" class="overlay-button">Seguridad Nacional</a>
|
||||||
|
<a href="int-sec.html?subtematica=contraterrorismo" class="overlay-button">Contraterrorismo</a>
|
||||||
|
</div>
|
||||||
|
<div class="button-column">
|
||||||
|
<a href="climate.html?subtematica=cambio_climatico" class="overlay-button">Cambio Climático</a>
|
||||||
|
<a href="climate.html?subtematica=desastres_naturales" class="overlay-button">Desastres Naturales</a>
|
||||||
|
<a href="climate.html?subtematica=conservacion" class="overlay-button">Conservación</a>
|
||||||
|
<a href="climate.html?subtematica=energia_renovable" class="overlay-button">Energía Renovable</a>
|
||||||
|
<a href="climate.html?subtematica=contaminacion" class="overlay-button">Escasez de agua</a>
|
||||||
|
</div>
|
||||||
|
<div class="button-column">
|
||||||
|
<a href="eco-corp.html?subtematica=economia_global" class="overlay-button">Economía Global</a>
|
||||||
|
<a href="eco-corp.html?subtematica=corporaciones_multinacionales" class="overlay-button">Corporaciones Multinacionales</a>
|
||||||
|
<a href="eco-corp.html?subtematica=comercio_internacional" class="overlay-button">Comercio Internacional</a>
|
||||||
|
<a href="eco-corp.html?subtematica=organismos_financieros" class="overlay-button">Organismos Financieros</a>
|
||||||
|
<a href="eco-corp.html?subtematica=desigualdad_economica" class="overlay-button">Desigualdad Económica</a>
|
||||||
|
</div>
|
||||||
|
<div class="button-column">
|
||||||
|
<a href="popl-up.html?subtematica=sobrepoblacion" class="overlay-button">Sobrepoblación</a>
|
||||||
|
<a href="popl-up.html?subtematica=covid" class="overlay-button">COVID</a>
|
||||||
|
<a href="popl-up.html?subtematica=migraciones" class="overlay-button">Migraciones</a>
|
||||||
|
<a href="popl-up.html?subtematica=urbanizacion" class="overlay-button">Urbanización</a>
|
||||||
|
<a href="popl-up.html?subtematica=distribucion_edad" class="overlay-button">Despoblaciòn rural</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<button id="sidebarToggle">Toggle Sidebar</button>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p><a href="#">GitHub</a> | <a href="#">Telegram</a> | <a href="#">Email</a> | <a href="#">Web de Tor</a></p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
277
FLUJOS/VISUALIZACION/public/int-sec.css
Executable file
|
|
@ -0,0 +1,277 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: "Retrolift";
|
||||||
|
src: url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff2") format("woff2"),
|
||||||
|
url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff") format("woff");
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: 'Fira Code';
|
||||||
|
text-shadow: 10px 10px 20px rgba(0, 255, 76, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Fira Code', monospace;
|
||||||
|
background: #000000;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
height: 70px;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ffffff;
|
||||||
|
box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
font-family: "Retrolift", sans-serif;
|
||||||
|
font-size: 4em;
|
||||||
|
font-weight: bold;
|
||||||
|
letter-spacing: 4px;
|
||||||
|
text-shadow: 6px 6px 6px #73ff00;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glob-war:hover .logo { text-shadow: 2px 2px 8px #39ff14; }
|
||||||
|
.int-sec:hover .logo { text-shadow: 2px 2px 8px #ff69b4; }
|
||||||
|
.climate:hover .logo { text-shadow: 2px 2px 8px #ff4500; }
|
||||||
|
.eco-corp:hover .logo { text-shadow: 2px 2px 8px #006400; }
|
||||||
|
.popl-up:hover .logo { text-shadow: 2px 2px 8px #00008b; }
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ff1a1a;
|
||||||
|
padding: 10px 0;
|
||||||
|
box-shadow: 0 10px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
margin-top: 40px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 6em;
|
||||||
|
}
|
||||||
|
.nav-links a {
|
||||||
|
color: #000000;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
transition: color 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
|
padding: 20px 40px;
|
||||||
|
box-shadow: 0 0 0px rgba(28, 103, 241, 0);
|
||||||
|
position: relative;
|
||||||
|
border: none;
|
||||||
|
z-index: 1;
|
||||||
|
width: 40vw;
|
||||||
|
height: 20vh;
|
||||||
|
align-items: center;
|
||||||
|
border: 3px solid;
|
||||||
|
}
|
||||||
|
.nav-links a:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
box-shadow: 2vw 1vw;
|
||||||
|
border: 3px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glob-war { color: #FF4136; background-color: red; }
|
||||||
|
.int-sec { color: #0074D9; background-color: darkblue; }
|
||||||
|
.climate { color: #2ECC40; background-color: lightgreen; }
|
||||||
|
.eco-corp { color: #FFDC00; background-color: yellow; }
|
||||||
|
.popl-up { color: #FF851B; background-color: orange; }
|
||||||
|
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
height: 100vh;
|
||||||
|
width: 99%;
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
.background img {
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
.background img:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 250px;
|
||||||
|
height: 100vh;
|
||||||
|
background-image: url("/images/flujos7.jpg");
|
||||||
|
background-size: cover;
|
||||||
|
color: #39ff14;
|
||||||
|
padding: 30px;
|
||||||
|
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
|
||||||
|
transform: translateX(-90%); /* Oculta el 90%, deja 10% visible */
|
||||||
|
transition: transform 0.3s ease-out;
|
||||||
|
overflow: auto;
|
||||||
|
font-size: 18px;
|
||||||
|
z-index: 3;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
#sidebar:hover {
|
||||||
|
transform: translateX(0); /* Aparece entero al hacer hover */
|
||||||
|
}
|
||||||
|
#sidebar.active {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar h2 {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
text-shadow: -1px 0 black, 0 3px black, 3px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
#sidebar form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
#sidebar label {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
#sidebar input {
|
||||||
|
padding: 10px;
|
||||||
|
border: 2px solid #39ff14;
|
||||||
|
background: black;
|
||||||
|
color: #39ff14;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.2);
|
||||||
|
transition: box-shadow 0.3s ease;
|
||||||
|
}
|
||||||
|
#sidebar input:hover {
|
||||||
|
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
#sidebar input[type="submit"] {
|
||||||
|
color: #39ff14;
|
||||||
|
background: #ff6600;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
#sidebar input[type="submit"]:hover {
|
||||||
|
background: #ff6600;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
width: 100%;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #39ff14;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
footer a {
|
||||||
|
color: #39ff14;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
}
|
||||||
|
footer a:hover {
|
||||||
|
color: #2ECC40;
|
||||||
|
}
|
||||||
|
footer p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#intSecContainer {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 2;
|
||||||
|
background-color: #101020;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.8em;
|
||||||
|
padding: 10px 20px;
|
||||||
|
}
|
||||||
|
.nav-links {
|
||||||
|
gap: 2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-out {
|
||||||
|
animation: fadeOut 2s forwards;
|
||||||
|
}
|
||||||
|
@keyframes fadeOut {
|
||||||
|
from { opacity: 1; }
|
||||||
|
to { opacity: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===== Añadidos para split-screen ===== */
|
||||||
|
main.split-screen {
|
||||||
|
display: flex;
|
||||||
|
height: 100vh;
|
||||||
|
margin-left: 0; /* El sidebar está fijo encima */
|
||||||
|
}
|
||||||
|
|
||||||
|
#graphPanel {
|
||||||
|
width: 100%;
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
#detailPanel {
|
||||||
|
width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Al hacer click en un nodo */
|
||||||
|
main.split-screen.show-detail #graphPanel {
|
||||||
|
width: 45%;
|
||||||
|
}
|
||||||
|
main.split-screen.show-detail #detailPanel {
|
||||||
|
width: 50%;
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Asegurar que el grafo ocupe todo su panel */
|
||||||
|
#graphPanel #intSecContainer {
|
||||||
|
position: absolute;
|
||||||
|
top: 0; left: 0;
|
||||||
|
width: 100%; height: 100%;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Estilos del panel de detalle */
|
||||||
|
#detailPanel {
|
||||||
|
background: #101020;
|
||||||
|
color: #fff;
|
||||||
|
box-shadow: inset 1px 0 5px rgba(0,0,0,0.5);
|
||||||
|
}
|
||||||
|
#detailPanel h2 {
|
||||||
|
margin-bottom: .5em;
|
||||||
|
color: #39ff14;
|
||||||
|
}
|
||||||
|
#detailPanel p {
|
||||||
|
line-height: 1.4;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
#detailPanel .placeholder {
|
||||||
|
color: rgba(255,255,255,0.3);
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
89
FLUJOS/VISUALIZACION/public/int-sec.html
Executable file
|
|
@ -0,0 +1,89 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Inteligencia y Seguridad</title>
|
||||||
|
<link rel="stylesheet" href="int-sec.css">
|
||||||
|
<!-- Fuentes de Google Fonts -->
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&display=swap" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- Cargar D3.js -->
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.min.js"></script>
|
||||||
|
<!-- Cargar 3d-force-graph (incluye Three.js) -->
|
||||||
|
<script src="https://unpkg.com/3d-force-graph"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav>
|
||||||
|
<ul class="nav-links">
|
||||||
|
<li><a href="int-sec.html" class="int-sec">Inteligencia y Seguridad</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main class="split-screen">
|
||||||
|
<!-- PANEL IZQUIERDO: el grafo -->
|
||||||
|
<div id="graphPanel">
|
||||||
|
<div id="intSecContainer"></div>
|
||||||
|
<div class="background">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<img src="/images/flujos.jpg">
|
||||||
|
<script>
|
||||||
|
setTimeout(function() {
|
||||||
|
const fondo = document.querySelector('.background');
|
||||||
|
fondo.classList.add('fade-out');
|
||||||
|
fondo.style.pointerEvents = 'none';
|
||||||
|
}, 1000);
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- PANEL DERECHO: detalle de la noticia -->
|
||||||
|
<div id="detailPanel">
|
||||||
|
<p class="placeholder">Haz click en un nodo para ver aquí la noticia completa.</p>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<div id="sidebar">
|
||||||
|
<h2>Parámetros</h2>
|
||||||
|
<form id="paramForm">
|
||||||
|
<label for="fecha_inicio">Fecha de inicio:</label>
|
||||||
|
<input type="date" id="fecha_inicio" name="fecha_inicio">
|
||||||
|
|
||||||
|
<label for="fecha_fin">Fecha de fin:</label>
|
||||||
|
<input type="date" id="fecha_fin" name="fecha_fin">
|
||||||
|
|
||||||
|
<label for="nodos">Nodos:</label>
|
||||||
|
<input type="number" id="nodos" name="nodos" value="100">
|
||||||
|
|
||||||
|
<label for="complejidad">Complejidad:</label>
|
||||||
|
<input type="range" id="complejidad" name="complejidad" min="1" max="40" value="20">
|
||||||
|
|
||||||
|
<label for="param1">Búsqueda por palabra:</label>
|
||||||
|
<input type="text" id="param1" name="param1">
|
||||||
|
|
||||||
|
<label for="param2">Búsqueda por temática personalizada:</label>
|
||||||
|
<input type="text" id="param2" name="param2">
|
||||||
|
|
||||||
|
<input type="submit" value="Aplicar">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button id="sidebarToggle">Toggle Sidebar</button>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>
|
||||||
|
<a href="#">GitHub</a> |
|
||||||
|
<a href="#">Telegram</a> |
|
||||||
|
<a href="#">Email</a> |
|
||||||
|
<a href="#">Web de Tor</a>
|
||||||
|
</p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Incluir tu script al final del body -->
|
||||||
|
<script src="output_int_sec.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
132
FLUJOS/VISUALIZACION/public/journalist.css
Executable file
|
|
@ -0,0 +1,132 @@
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
background-color: #000000;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
color: #ffffff; /* Cambiar el color del texto a blanco */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Estilo del formulario */
|
||||||
|
.login-container {
|
||||||
|
max-width: 400px;
|
||||||
|
margin: 30px auto;
|
||||||
|
background-color: #111111; /* Fondo negro */
|
||||||
|
border: 2px solid #39ff14; /* Borde verde claro */
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
position: relative; /* Añadimos posición relativa para que los elementos internos se posicionen respecto a este contenedor */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ... Estilos existentes ... */
|
||||||
|
|
||||||
|
/* Estilos para los enlaces dentro del formulario */
|
||||||
|
.login-container a {
|
||||||
|
color: #39ff14; /* Cambiar el color del enlace a verde claro */
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-container a:hover {
|
||||||
|
color: #2ECC40; /* Cambiar el color del enlace en hover a verde más claro */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ... Resto de tus estilos ... */
|
||||||
|
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
color: #39ff14; /* Cambiar el color del título a verde claro */
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
color: #39ff14; /* Cambiar el color de las etiquetas a verde claro */
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"],
|
||||||
|
input[type="password"] {
|
||||||
|
padding: 10px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
background-color: #222222; /* Fondo negro */
|
||||||
|
color: #ffffff; /* Texto blanco */
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="submit"] {
|
||||||
|
background-color: #007BFF;
|
||||||
|
color: #ffffff;
|
||||||
|
border: none;
|
||||||
|
padding: 10px;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="submit"]:hover {
|
||||||
|
background-color: #0056b3;
|
||||||
|
border: 2px solid #39ff14; /* Borde verde claro en hover */
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
margin-bottom: 0px; /* Añadir margen inferior para separar el formulario del logo */
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
width: 400px; /* Ajustar el tamaño de la imagen según sea necesario */
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Estilos para las imágenes de fondo */
|
||||||
|
.canvas-container {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ffffff;
|
||||||
|
min-height: 100vh; /* Ajusta la altura mínima para que ocupe toda la pantalla */
|
||||||
|
margin: 20px 0;
|
||||||
|
overflow: hidden; /* Evita que las imágenes desborden del contenedor */
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-left,
|
||||||
|
.image-right {
|
||||||
|
height: 100vh; /* Ajusta la altura para que ocupe toda la pantalla */
|
||||||
|
width: auto; /* Ajusta el ancho de las imágenes para mantener la relación de aspecto */
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
max-width: 40%; /* Ajusta el ancho máximo de las imágenes de fondo */
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-left {
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-right {
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-content {
|
||||||
|
/* Ajusta estos estilos según tus necesidades */
|
||||||
|
padding: 20px;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 300px; /* Ajusta el ancho máximo del contenido */
|
||||||
|
position: relative; /* Añadimos posición relativa para que los elementos internos se posicionen respecto a este contenedor */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Añade el siguiente estilo para evitar que las imágenes desborden del contenedor */
|
||||||
|
.login-content > img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
66
FLUJOS/VISUALIZACION/public/journalist.html
Executable file
|
|
@ -0,0 +1,66 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Journalist Login</title>
|
||||||
|
<link rel="stylesheet" href="journalist.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header">
|
||||||
|
<img class="logo" src="/images/flujos_logo5.png" alt="Flujos Logo">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="canvas-container">
|
||||||
|
<img class="image-left" src="/images/journalist_fondo.jpg" alt="Fondo izquierdo">
|
||||||
|
<div class="login-container">
|
||||||
|
<h1>Journalist Login</h1>
|
||||||
|
<form onsubmit="login(event)">
|
||||||
|
<label for="username">Username:</label>
|
||||||
|
<input type="text" id="username" name="username" required>
|
||||||
|
|
||||||
|
<label for="password">Password:</label>
|
||||||
|
<input type="password" id="password" name="password" required>
|
||||||
|
|
||||||
|
<label for="publicKey">Public Key:</label>
|
||||||
|
<input type="text" id="publicKey" name="publicKey" required>
|
||||||
|
|
||||||
|
<input type="submit" value="Login">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<img class="image-right" src="/images/journalist_fondo2.jpg" alt="Fondo derecho">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function login(event) {
|
||||||
|
event.preventDefault(); // Evitar que el formulario se envíe por defecto
|
||||||
|
|
||||||
|
const username = document.getElementById('username').value;
|
||||||
|
const password = document.getElementById('password').value;
|
||||||
|
const publicKey = document.getElementById('publicKey').value;
|
||||||
|
|
||||||
|
// Enviar los datos del formulario mediante una petición AJAX a nuestro endpoint de login
|
||||||
|
fetch('/login', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ username, password, publicKey })
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
// Si el servidor devuelve un redireccionamiento, redirigimos al usuario
|
||||||
|
if (data.redirect) {
|
||||||
|
window.location.href = data.redirect;
|
||||||
|
} else {
|
||||||
|
// Si no hay redireccionamiento, se podría mostrar un mensaje de error
|
||||||
|
console.log('Credenciales inválidas');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Error en la petición AJAX:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
377
FLUJOS/VISUALIZACION/public/journalist_enter.css
Executable file
|
|
@ -0,0 +1,377 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: "Retrolift";
|
||||||
|
src: url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff2") format("woff2"),
|
||||||
|
url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff") format("woff");
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: 'Fira Code';
|
||||||
|
text-shadow: 10px 10px 20px rgba(0, 255, 76, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Fira Code', monospace;
|
||||||
|
background: #000000;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
header {
|
||||||
|
position: relative;
|
||||||
|
height: 100px;
|
||||||
|
background-color: #000000;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
width: 400px;
|
||||||
|
height: 140px;
|
||||||
|
margin-left: 400px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-content {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
max-width: 1200px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-buttons {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
right: 10px;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-right: 3px;
|
||||||
|
padding: 4px 8px;
|
||||||
|
font-size: 10px;
|
||||||
|
color: #ffffff;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: #000000;
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
border-radius: 20px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button:hover {
|
||||||
|
background-color: #ffffff;
|
||||||
|
color: #000000;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ... Resto de tus estilos ... */
|
||||||
|
|
||||||
|
|
||||||
|
/* ... Estilos existentes ... */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
/* Ajusta el tamaño de la imagen según tus necesidades */
|
||||||
|
width: 400px;
|
||||||
|
height: 140px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
right: 20px;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons a {
|
||||||
|
display: block;
|
||||||
|
margin-left: 10px;
|
||||||
|
padding: 10px 15px;
|
||||||
|
color: #ffffff;
|
||||||
|
text-decoration: none;
|
||||||
|
border: 1px solid #ffffff;
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.glob-war:hover .logo { text-shadow: 2px 2px 8px #39ff14; }
|
||||||
|
.int-sec:hover .logo { text-shadow: 2px 2px 8px #ff69b4; }
|
||||||
|
.climate:hover .logo { text-shadow: 2px 2px 8px #ff4500; }
|
||||||
|
.eco-corp:hover .logo { text-shadow: 2px 2px 8px #006400; }
|
||||||
|
.popl-up:hover .logo { text-shadow: 2px 2px 8px #00008b; }
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ff1a1a;
|
||||||
|
padding: 10px 0;
|
||||||
|
box-shadow: 0 10px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
margin-top: 40px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 6em; /* incrementa la distancia entre los elementos */
|
||||||
|
}
|
||||||
|
.nav-links a {
|
||||||
|
color: #000000;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
transition: color 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
|
padding: 20px 40px;
|
||||||
|
box-shadow: 0 0 0px rgba(28, 103, 241, 0);
|
||||||
|
|
||||||
|
/* Estilo de los botones */
|
||||||
|
position:relative;
|
||||||
|
border: none;
|
||||||
|
|
||||||
|
transition: .4s ease-in;
|
||||||
|
z-index: 1;
|
||||||
|
width: 40vw;
|
||||||
|
height: 20vh;
|
||||||
|
border:3vw;
|
||||||
|
|
||||||
|
align-items: center;
|
||||||
|
border: 3px solid ;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
box-shadow: 0 0 6px rgba(0,0,0,0.3);
|
||||||
|
|
||||||
|
/* Estilo hover de los botones */
|
||||||
|
|
||||||
|
box-shadow: 2vw 1vw;
|
||||||
|
|
||||||
|
border: 3px solid black ;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glob-war:hover { color: #39ff14; }
|
||||||
|
.int-sec:hover { color: #ff69b4; }
|
||||||
|
.climate:hover { color: #ff4500; }
|
||||||
|
.eco-corp:hover { color: #00fff2; }
|
||||||
|
.popl-up:hover { color: #0066ff; }
|
||||||
|
|
||||||
|
.glob-war {
|
||||||
|
color: #FF4136;
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.int-sec {
|
||||||
|
color: #0074D9;
|
||||||
|
background-color: darkblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.climate {
|
||||||
|
color: #2ECC40;
|
||||||
|
background-color: lightgreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eco-corp {
|
||||||
|
color: #FFDC00;
|
||||||
|
background-color: yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popl-up {
|
||||||
|
color: #FF851B;
|
||||||
|
background-color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
height: 100vh;
|
||||||
|
width: 99%;
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background a {
|
||||||
|
display: block;
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img {
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background a img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#sidebar.active {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
top: 0;
|
||||||
|
width: 250px;
|
||||||
|
height: 100vh;
|
||||||
|
background-image: url("/images/flujos7.jpg");
|
||||||
|
background-size: cover;
|
||||||
|
color: #39ff14;
|
||||||
|
padding: 30px;
|
||||||
|
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
|
||||||
|
transform: translateX(-90%);
|
||||||
|
transition: transform 0.3s ease-out;
|
||||||
|
overflow: auto;
|
||||||
|
font-size:18px;
|
||||||
|
z-index: 3;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; /* Añade el borde al texto */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#sidebar h2 {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
text-shadow: -1px 0 black, 0 3px black, 3px 0 black, 0 -1px black; /* Añade el borde al texto */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#sidebar:hover {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebarToggle {
|
||||||
|
position: absolute;
|
||||||
|
left: 1em;
|
||||||
|
top: 1em;
|
||||||
|
background: #007BFF;
|
||||||
|
color: #39ff14;
|
||||||
|
border: none;
|
||||||
|
padding: 10px 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: background 0.3s ease;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebarToggle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
font-size:20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar label {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; /* Añade el borde al texto */
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input {
|
||||||
|
padding: 10px;
|
||||||
|
border: 2px solid #39ff14; /* Añade el borde verde al input */
|
||||||
|
background: black; /* Cambia el fondo del input a negro */
|
||||||
|
color: #39ff14; /* Cambia el color del texto en el input a verde */
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.2);
|
||||||
|
transition: box-shadow 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input:hover {
|
||||||
|
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"] {
|
||||||
|
color: #39ff14;
|
||||||
|
background: #ff6600;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"]:hover {
|
||||||
|
background: #ff6600;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
footer {
|
||||||
|
width: 100%;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #39ff14;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a {
|
||||||
|
color: #39ff14;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a:hover {
|
||||||
|
color: #2ECC40;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#canvasContainer {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
opacity: 0.5;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ... Estilos existentes ... */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.8em; /* reduce el tamaño de la fuente */
|
||||||
|
padding: 10px 20px; /* reduce el padding */
|
||||||
|
}
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 2em; /* incrementa la distancia entre los elementos */
|
||||||
|
}
|
||||||
|
}
|
||||||
79
FLUJOS/VISUALIZACION/public/journalist_enter.html
Executable file
|
|
@ -0,0 +1,79 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Journalist Enter</title>
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&display=swap" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!-- Header -->
|
||||||
|
<header>
|
||||||
|
<div class="header-content">
|
||||||
|
<img src="/images/flujos_logo5.png" alt="FLUJØS 3D Logo" class="logo">
|
||||||
|
<div class="header-buttons">
|
||||||
|
<a href="login.html" class="small-button">Login/Sign Up</a>
|
||||||
|
<div class="small-button">Language</div> <!-- El botón de idioma con el dropdown se implementará más adelante -->
|
||||||
|
<a href="journalist.html" class="small-button">Journalist</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<!-- Sidebar Toggle Button -->
|
||||||
|
<button id="sidebarToggle">Toggle Sidebar</button>
|
||||||
|
|
||||||
|
<!-- Main Content -->
|
||||||
|
<main>
|
||||||
|
<!-- Graficos generados por el script de output.js -->
|
||||||
|
<div id="canvasContainer"></div>
|
||||||
|
<div class="background">
|
||||||
|
<!-- Enlaces a otras páginas -->
|
||||||
|
<a href="glob-war.html">
|
||||||
|
<img class="img1" src="/images/flujos.jpg">
|
||||||
|
</a>
|
||||||
|
<a href="int-sec.html">
|
||||||
|
<img class="img2" src="/images/fujos5.jpg">
|
||||||
|
</a>
|
||||||
|
<a href="climate.html">
|
||||||
|
<img class="img3" src="/images/flujos6.jpg">
|
||||||
|
</a>
|
||||||
|
<a href="eco-corp.html">
|
||||||
|
<img class="img4" src="/images/flujos4.jpg">
|
||||||
|
</a>
|
||||||
|
<a href="popl-up.html">
|
||||||
|
<img class="img5" src="/images/flujos3.jpg">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<!-- Sidebar with Parameters -->
|
||||||
|
<div id="sidebar">
|
||||||
|
<h2>Parámetros</h2>
|
||||||
|
<form>
|
||||||
|
<!-- Aquí van los parámetros específicos para añadir nodos -->
|
||||||
|
<label for="nodo_nombre">Nombre del Nodo:</label>
|
||||||
|
<input type="text" id="nodo_nombre" name="nodo_nombre" required>
|
||||||
|
|
||||||
|
<label for="nodo_descripcion">Descripción del Nodo:</label>
|
||||||
|
<input type="text" id="nodo_descripcion" name="nodo_descripcion" required>
|
||||||
|
|
||||||
|
<label for="nodo_imagen">Imagen del Nodo:</label>
|
||||||
|
<input type="file" id="nodo_imagen" name="nodo_imagen" accept="image/*" required>
|
||||||
|
|
||||||
|
<input type="submit" value="Añadir Nodo">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Footer -->
|
||||||
|
<footer>
|
||||||
|
<p><a href="#">GitHub</a> | <a href="#">Telegram</a> | <a href="#">Email</a> | <a href="#">Web de Tor</a></p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Script para los gráficos generados por output.js -->
|
||||||
|
<script src="output.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
438
FLUJOS/VISUALIZACION/public/libs/3d-force-graph.js
Executable file
|
|
@ -0,0 +1,438 @@
|
||||||
|
import { AmbientLight, DirectionalLight, Vector3, REVISION } from "./three.module.js";
|
||||||
|
|
||||||
|
|
||||||
|
const three = window.THREE
|
||||||
|
? window.THREE // Prefer consumption from global THREE, if exists
|
||||||
|
: { AmbientLight, DirectionalLight, Vector3, REVISION };
|
||||||
|
|
||||||
|
import { DragControls as ThreeDragControls } from './DragControls.js';
|
||||||
|
|
||||||
|
import ThreeForceGraph from "./three-forcegraph.js";
|
||||||
|
import ThreeRenderObjects from "./three-render-objects.js";
|
||||||
|
|
||||||
|
import accessorFn from "./accessor-fn.js";
|
||||||
|
import Kapsule from "./kapsule.js";
|
||||||
|
|
||||||
|
import linkKapsule from './kapsule-link.js';
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
const CAMERA_DISTANCE2NODES_FACTOR = 170;
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
// Expose config from forceGraph
|
||||||
|
const bindFG = linkKapsule('forceGraph', ThreeForceGraph);
|
||||||
|
const linkedFGProps = Object.assign(...[
|
||||||
|
'jsonUrl',
|
||||||
|
'graphData',
|
||||||
|
'numDimensions',
|
||||||
|
'dagMode',
|
||||||
|
'dagLevelDistance',
|
||||||
|
'dagNodeFilter',
|
||||||
|
'onDagError',
|
||||||
|
'nodeRelSize',
|
||||||
|
'nodeId',
|
||||||
|
'nodeVal',
|
||||||
|
'nodeResolution',
|
||||||
|
'nodeColor',
|
||||||
|
'nodeAutoColorBy',
|
||||||
|
'nodeOpacity',
|
||||||
|
'nodeVisibility',
|
||||||
|
'nodeThreeObject',
|
||||||
|
'nodeThreeObjectExtend',
|
||||||
|
'linkSource',
|
||||||
|
'linkTarget',
|
||||||
|
'linkVisibility',
|
||||||
|
'linkColor',
|
||||||
|
'linkAutoColorBy',
|
||||||
|
'linkOpacity',
|
||||||
|
'linkWidth',
|
||||||
|
'linkResolution',
|
||||||
|
'linkCurvature',
|
||||||
|
'linkCurveRotation',
|
||||||
|
'linkMaterial',
|
||||||
|
'linkThreeObject',
|
||||||
|
'linkThreeObjectExtend',
|
||||||
|
'linkPositionUpdate',
|
||||||
|
'linkDirectionalArrowLength',
|
||||||
|
'linkDirectionalArrowColor',
|
||||||
|
'linkDirectionalArrowRelPos',
|
||||||
|
'linkDirectionalArrowResolution',
|
||||||
|
'linkDirectionalParticles',
|
||||||
|
'linkDirectionalParticleSpeed',
|
||||||
|
'linkDirectionalParticleWidth',
|
||||||
|
'linkDirectionalParticleColor',
|
||||||
|
'linkDirectionalParticleResolution',
|
||||||
|
'forceEngine',
|
||||||
|
'd3AlphaDecay',
|
||||||
|
'd3VelocityDecay',
|
||||||
|
'd3AlphaMin',
|
||||||
|
'ngraphPhysics',
|
||||||
|
'warmupTicks',
|
||||||
|
'cooldownTicks',
|
||||||
|
'cooldownTime',
|
||||||
|
'onEngineTick',
|
||||||
|
'onEngineStop'
|
||||||
|
].map(p => ({ [p]: bindFG.linkProp(p)})));
|
||||||
|
const linkedFGMethods = Object.assign(...[
|
||||||
|
'refresh',
|
||||||
|
'getGraphBbox',
|
||||||
|
'd3Force',
|
||||||
|
'd3ReheatSimulation',
|
||||||
|
'emitParticle'
|
||||||
|
].map(p => ({ [p]: bindFG.linkMethod(p)})));
|
||||||
|
|
||||||
|
// Expose config from renderObjs
|
||||||
|
const bindRenderObjs = linkKapsule('renderObjs', ThreeRenderObjects);
|
||||||
|
const linkedRenderObjsProps = Object.assign(...[
|
||||||
|
'width',
|
||||||
|
'height',
|
||||||
|
'backgroundColor',
|
||||||
|
'showNavInfo',
|
||||||
|
'enablePointerInteraction'
|
||||||
|
].map(p => ({ [p]: bindRenderObjs.linkProp(p)})));
|
||||||
|
const linkedRenderObjsMethods = Object.assign(
|
||||||
|
...[
|
||||||
|
'lights',
|
||||||
|
'cameraPosition',
|
||||||
|
'postProcessingComposer'
|
||||||
|
].map(p => ({ [p]: bindRenderObjs.linkMethod(p)})),
|
||||||
|
{
|
||||||
|
graph2ScreenCoords: bindRenderObjs.linkMethod('getScreenCoords'),
|
||||||
|
screen2GraphCoords: bindRenderObjs.linkMethod('getSceneCoords')
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
export default Kapsule({
|
||||||
|
|
||||||
|
props: {
|
||||||
|
nodeLabel: { default: 'name', triggerUpdate: false },
|
||||||
|
linkLabel: { default: 'name', triggerUpdate: false },
|
||||||
|
linkHoverPrecision: { default: 1, onChange: (p, state) => state.renderObjs.lineHoverPrecision(p), triggerUpdate: false },
|
||||||
|
enableNavigationControls: {
|
||||||
|
default: true,
|
||||||
|
onChange(enable, state) {
|
||||||
|
const controls = state.renderObjs.controls();
|
||||||
|
if (controls) {
|
||||||
|
controls.enabled = enable;
|
||||||
|
// trigger mouseup on re-enable to prevent sticky controls
|
||||||
|
enable && controls.domElement && controls.domElement.dispatchEvent(new PointerEvent('pointerup'));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
triggerUpdate: false
|
||||||
|
},
|
||||||
|
enableNodeDrag: { default: true, triggerUpdate: false },
|
||||||
|
onNodeDrag: { default: () => {}, triggerUpdate: false },
|
||||||
|
onNodeDragEnd: { default: () => {}, triggerUpdate: false },
|
||||||
|
onNodeClick: { triggerUpdate: false },
|
||||||
|
onNodeRightClick: { triggerUpdate: false },
|
||||||
|
onNodeHover: { triggerUpdate: false },
|
||||||
|
onLinkClick: { triggerUpdate: false },
|
||||||
|
onLinkRightClick: { triggerUpdate: false },
|
||||||
|
onLinkHover: { triggerUpdate: false },
|
||||||
|
onBackgroundClick: { triggerUpdate: false },
|
||||||
|
onBackgroundRightClick: { triggerUpdate: false },
|
||||||
|
...linkedFGProps,
|
||||||
|
...linkedRenderObjsProps
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
zoomToFit: function(state, transitionDuration, padding, ...bboxArgs) {
|
||||||
|
state.renderObjs.fitToBbox(
|
||||||
|
state.forceGraph.getGraphBbox(...bboxArgs),
|
||||||
|
transitionDuration,
|
||||||
|
padding
|
||||||
|
);
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
pauseAnimation: function(state) {
|
||||||
|
if (state.animationFrameRequestId !== null) {
|
||||||
|
cancelAnimationFrame(state.animationFrameRequestId);
|
||||||
|
state.animationFrameRequestId = null;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
resumeAnimation: function(state) {
|
||||||
|
if (state.animationFrameRequestId === null) {
|
||||||
|
this._animationCycle();
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
_animationCycle(state) {
|
||||||
|
if (state.enablePointerInteraction) {
|
||||||
|
// reset canvas cursor (override dragControls cursor)
|
||||||
|
this.renderer().domElement.style.cursor = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Frame cycle
|
||||||
|
state.forceGraph.tickFrame();
|
||||||
|
state.renderObjs.tick();
|
||||||
|
state.animationFrameRequestId = requestAnimationFrame(this._animationCycle);
|
||||||
|
},
|
||||||
|
scene: state => state.renderObjs.scene(), // Expose scene
|
||||||
|
camera: state => state.renderObjs.camera(), // Expose camera
|
||||||
|
renderer: state => state.renderObjs.renderer(), // Expose renderer
|
||||||
|
controls: state => state.renderObjs.controls(), // Expose controls
|
||||||
|
tbControls: state => state.renderObjs.tbControls(), // To be deprecated
|
||||||
|
_destructor: function() {
|
||||||
|
this.pauseAnimation();
|
||||||
|
this.graphData({ nodes: [], links: []});
|
||||||
|
},
|
||||||
|
...linkedFGMethods,
|
||||||
|
...linkedRenderObjsMethods
|
||||||
|
},
|
||||||
|
|
||||||
|
stateInit: ({ controlType, rendererConfig, extraRenderers }) => {
|
||||||
|
const forceGraph = new ThreeForceGraph();
|
||||||
|
return {
|
||||||
|
forceGraph,
|
||||||
|
renderObjs: ThreeRenderObjects({ controlType, rendererConfig, extraRenderers })
|
||||||
|
.objects([forceGraph]) // Populate scene
|
||||||
|
.lights([
|
||||||
|
new three.AmbientLight(0xcccccc, Math.PI),
|
||||||
|
new three.DirectionalLight(0xffffff, 0.6 * Math.PI)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
init: function(domNode, state) {
|
||||||
|
// Wipe DOM
|
||||||
|
domNode.innerHTML = '';
|
||||||
|
|
||||||
|
// Add relative container
|
||||||
|
domNode.appendChild(state.container = document.createElement('div'));
|
||||||
|
state.container.style.position = 'relative';
|
||||||
|
|
||||||
|
// Add renderObjs
|
||||||
|
const roDomNode = document.createElement('div');
|
||||||
|
state.container.appendChild(roDomNode);
|
||||||
|
state.renderObjs(roDomNode);
|
||||||
|
const camera = state.renderObjs.camera();
|
||||||
|
const renderer = state.renderObjs.renderer();
|
||||||
|
const controls = state.renderObjs.controls();
|
||||||
|
controls.enabled = !!state.enableNavigationControls;
|
||||||
|
state.lastSetCameraZ = camera.position.z;
|
||||||
|
|
||||||
|
// Add info space
|
||||||
|
let infoElem;
|
||||||
|
state.container.appendChild(infoElem = document.createElement('div'));
|
||||||
|
infoElem.className = 'graph-info-msg';
|
||||||
|
infoElem.textContent = '';
|
||||||
|
|
||||||
|
// config forcegraph
|
||||||
|
state.forceGraph
|
||||||
|
.onLoading(() => { infoElem.textContent = 'Loading...' })
|
||||||
|
.onFinishLoading(() => { infoElem.textContent = '' })
|
||||||
|
.onUpdate(() => {
|
||||||
|
// sync graph data structures
|
||||||
|
state.graphData = state.forceGraph.graphData();
|
||||||
|
|
||||||
|
// re-aim camera, if still in default position (not user modified)
|
||||||
|
if (camera.position.x === 0 && camera.position.y === 0 && camera.position.z === state.lastSetCameraZ && state.graphData.nodes.length) {
|
||||||
|
camera.lookAt(state.forceGraph.position);
|
||||||
|
state.lastSetCameraZ = camera.position.z = Math.cbrt(state.graphData.nodes.length) * CAMERA_DISTANCE2NODES_FACTOR;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.onFinishUpdate(() => {
|
||||||
|
// Setup node drag interaction
|
||||||
|
if (state._dragControls) {
|
||||||
|
const curNodeDrag = state.graphData.nodes.find(node => node.__initialFixedPos && !node.__disposeControlsAfterDrag); // detect if there's a node being dragged using the existing drag controls
|
||||||
|
if (curNodeDrag) {
|
||||||
|
curNodeDrag.__disposeControlsAfterDrag = true; // postpone previous controls disposal until drag ends
|
||||||
|
} else {
|
||||||
|
state._dragControls.dispose(); // cancel previous drag controls
|
||||||
|
}
|
||||||
|
|
||||||
|
state._dragControls = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.enableNodeDrag && state.enablePointerInteraction && state.forceEngine === 'd3') { // Can't access node positions programmatically in ngraph
|
||||||
|
const dragControls = state._dragControls = new ThreeDragControls(
|
||||||
|
state.graphData.nodes.map(node => node.__threeObj).filter(obj => obj),
|
||||||
|
camera,
|
||||||
|
renderer.domElement
|
||||||
|
);
|
||||||
|
|
||||||
|
dragControls.addEventListener('dragstart', function (event) {
|
||||||
|
controls.enabled = false; // Disable controls while dragging
|
||||||
|
|
||||||
|
// track drag object movement
|
||||||
|
event.object.__initialPos = event.object.position.clone();
|
||||||
|
event.object.__prevPos = event.object.position.clone();
|
||||||
|
|
||||||
|
const node = getGraphObj(event.object).__data;
|
||||||
|
!node.__initialFixedPos && (node.__initialFixedPos = {fx: node.fx, fy: node.fy, fz: node.fz});
|
||||||
|
!node.__initialPos && (node.__initialPos = {x: node.x, y: node.y, z: node.z});
|
||||||
|
|
||||||
|
// lock node
|
||||||
|
['x', 'y', 'z'].forEach(c => node[`f${c}`] = node[c]);
|
||||||
|
|
||||||
|
// drag cursor
|
||||||
|
renderer.domElement.classList.add('grabbable');
|
||||||
|
});
|
||||||
|
|
||||||
|
dragControls.addEventListener('drag', function (event) {
|
||||||
|
const nodeObj = getGraphObj(event.object);
|
||||||
|
|
||||||
|
if (!event.object.hasOwnProperty('__graphObjType')) {
|
||||||
|
// If dragging a child of the node, update the node object instead
|
||||||
|
const initPos = event.object.__initialPos;
|
||||||
|
const prevPos = event.object.__prevPos;
|
||||||
|
const newPos = event.object.position;
|
||||||
|
|
||||||
|
nodeObj.position.add(newPos.clone().sub(prevPos)); // translate node object by the motion delta
|
||||||
|
prevPos.copy(newPos);
|
||||||
|
newPos.copy(initPos); // reset child back to its initial position
|
||||||
|
}
|
||||||
|
|
||||||
|
const node = nodeObj.__data;
|
||||||
|
const newPos = nodeObj.position;
|
||||||
|
const translate = {x: newPos.x - node.x, y: newPos.y - node.y, z: newPos.z - node.z};
|
||||||
|
// Move fx/fy/fz (and x/y/z) of nodes based on object new position
|
||||||
|
['x', 'y', 'z'].forEach(c => node[`f${c}`] = node[c] = newPos[c]);
|
||||||
|
|
||||||
|
state.forceGraph
|
||||||
|
.d3AlphaTarget(0.3) // keep engine running at low intensity throughout drag
|
||||||
|
.resetCountdown(); // prevent freeze while dragging
|
||||||
|
|
||||||
|
node.__dragged = true;
|
||||||
|
state.onNodeDrag(node, translate);
|
||||||
|
});
|
||||||
|
|
||||||
|
dragControls.addEventListener('dragend', function (event) {
|
||||||
|
delete(event.object.__initialPos); // remove tracking attributes
|
||||||
|
delete(event.object.__prevPos);
|
||||||
|
|
||||||
|
const node = getGraphObj(event.object).__data;
|
||||||
|
|
||||||
|
// dispose previous controls if needed
|
||||||
|
if (node.__disposeControlsAfterDrag) {
|
||||||
|
dragControls.dispose();
|
||||||
|
delete(node.__disposeControlsAfterDrag);
|
||||||
|
}
|
||||||
|
|
||||||
|
const initFixedPos = node.__initialFixedPos;
|
||||||
|
const initPos = node.__initialPos;
|
||||||
|
const translate = {x: initPos.x - node.x, y: initPos.y - node.y, z: initPos.z - node.z};
|
||||||
|
if (initFixedPos) {
|
||||||
|
['x', 'y', 'z'].forEach(c => {
|
||||||
|
const fc = `f${c}`;
|
||||||
|
if (initFixedPos[fc] === undefined) {
|
||||||
|
delete(node[fc])
|
||||||
|
}
|
||||||
|
});
|
||||||
|
delete(node.__initialFixedPos);
|
||||||
|
delete(node.__initialPos);
|
||||||
|
if (node.__dragged) {
|
||||||
|
delete(node.__dragged);
|
||||||
|
state.onNodeDragEnd(node, translate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state.forceGraph
|
||||||
|
.d3AlphaTarget(0) // release engine low intensity
|
||||||
|
.resetCountdown(); // let the engine readjust after releasing fixed nodes
|
||||||
|
|
||||||
|
if (state.enableNavigationControls) {
|
||||||
|
controls.enabled = true; // Re-enable controls
|
||||||
|
controls.domElement && controls.domElement.ownerDocument && controls.domElement.ownerDocument.dispatchEvent(
|
||||||
|
// simulate mouseup to ensure the controls don't take over after dragend
|
||||||
|
new PointerEvent('pointerup', { pointerType: 'touch' })
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear cursor
|
||||||
|
renderer.domElement.classList.remove('grabbable');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// config renderObjs
|
||||||
|
three.REVISION < 155 && (state.renderObjs.renderer().useLegacyLights = false); // force behavior for three < 155
|
||||||
|
state.renderObjs
|
||||||
|
.hoverOrderComparator((a, b) => {
|
||||||
|
// Prioritize graph objects
|
||||||
|
const aObj = getGraphObj(a);
|
||||||
|
if (!aObj) return 1;
|
||||||
|
const bObj = getGraphObj(b);
|
||||||
|
if (!bObj) return -1;
|
||||||
|
|
||||||
|
// Prioritize nodes over links
|
||||||
|
const isNode = o => o.__graphObjType === 'node';
|
||||||
|
return isNode(bObj) - isNode(aObj);
|
||||||
|
})
|
||||||
|
.tooltipContent(obj => {
|
||||||
|
const graphObj = getGraphObj(obj);
|
||||||
|
return graphObj ? accessorFn(state[`${graphObj.__graphObjType}Label`])(graphObj.__data) || '' : '';
|
||||||
|
})
|
||||||
|
.hoverDuringDrag(false)
|
||||||
|
.onHover(obj => {
|
||||||
|
// Update tooltip and trigger onHover events
|
||||||
|
const hoverObj = getGraphObj(obj);
|
||||||
|
|
||||||
|
if (hoverObj !== state.hoverObj) {
|
||||||
|
const prevObjType = state.hoverObj ? state.hoverObj.__graphObjType : null;
|
||||||
|
const prevObjData = state.hoverObj ? state.hoverObj.__data : null;
|
||||||
|
const objType = hoverObj ? hoverObj.__graphObjType : null;
|
||||||
|
const objData = hoverObj ? hoverObj.__data : null;
|
||||||
|
if (prevObjType && prevObjType !== objType) {
|
||||||
|
// Hover out
|
||||||
|
const fn = state[`on${prevObjType === 'node' ? 'Node' : 'Link'}Hover`];
|
||||||
|
fn && fn(null, prevObjData);
|
||||||
|
}
|
||||||
|
if (objType) {
|
||||||
|
// Hover in
|
||||||
|
const fn = state[`on${objType === 'node' ? 'Node' : 'Link'}Hover`];
|
||||||
|
fn && fn(objData, prevObjType === objType ? prevObjData : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set pointer if hovered object is clickable
|
||||||
|
renderer.domElement.classList[
|
||||||
|
((hoverObj && state[`on${objType === 'node' ? 'Node' : 'Link'}Click`]) || (!hoverObj && state.onBackgroundClick)) ? 'add' : 'remove'
|
||||||
|
]('clickable');
|
||||||
|
|
||||||
|
state.hoverObj = hoverObj;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.clickAfterDrag(false)
|
||||||
|
.onClick((obj, ev) => {
|
||||||
|
const graphObj = getGraphObj(obj);
|
||||||
|
if (graphObj) {
|
||||||
|
const fn = state[`on${graphObj.__graphObjType === 'node' ? 'Node' : 'Link'}Click`];
|
||||||
|
fn && fn(graphObj.__data, ev);
|
||||||
|
} else {
|
||||||
|
state.onBackgroundClick && state.onBackgroundClick(ev);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.onRightClick((obj, ev) => {
|
||||||
|
// Handle right-click events
|
||||||
|
const graphObj = getGraphObj(obj);
|
||||||
|
if (graphObj) {
|
||||||
|
const fn = state[`on${graphObj.__graphObjType === 'node' ? 'Node' : 'Link'}RightClick`];
|
||||||
|
fn && fn(graphObj.__data, ev);
|
||||||
|
} else {
|
||||||
|
state.onBackgroundRightClick && state.onBackgroundRightClick(ev);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
// Kick-off renderer
|
||||||
|
this._animationCycle();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
function getGraphObj(object) {
|
||||||
|
let obj = object;
|
||||||
|
// recurse up object chain until finding the graph object
|
||||||
|
while (obj && !obj.hasOwnProperty('__graphObjType')) {
|
||||||
|
obj = obj.parent;
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
410
FLUJOS/VISUALIZACION/public/libs/DragControls.js
Executable file
|
|
@ -0,0 +1,410 @@
|
||||||
|
import {
|
||||||
|
Controls,
|
||||||
|
Matrix4,
|
||||||
|
Plane,
|
||||||
|
Raycaster,
|
||||||
|
Vector2,
|
||||||
|
Vector3,
|
||||||
|
MOUSE,
|
||||||
|
TOUCH
|
||||||
|
} from './three.module.js';
|
||||||
|
|
||||||
|
const _plane = new Plane();
|
||||||
|
|
||||||
|
const _pointer = new Vector2();
|
||||||
|
const _offset = new Vector3();
|
||||||
|
const _diff = new Vector2();
|
||||||
|
const _previousPointer = new Vector2();
|
||||||
|
const _intersection = new Vector3();
|
||||||
|
const _worldPosition = new Vector3();
|
||||||
|
const _inverseMatrix = new Matrix4();
|
||||||
|
|
||||||
|
const _up = new Vector3();
|
||||||
|
const _right = new Vector3();
|
||||||
|
|
||||||
|
let _selected = null, _hovered = null;
|
||||||
|
const _intersections = [];
|
||||||
|
|
||||||
|
const STATE = {
|
||||||
|
NONE: - 1,
|
||||||
|
PAN: 0,
|
||||||
|
ROTATE: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
class DragControls extends Controls {
|
||||||
|
|
||||||
|
constructor( objects, camera, domElement = null ) {
|
||||||
|
|
||||||
|
super( camera, domElement );
|
||||||
|
|
||||||
|
this.objects = objects;
|
||||||
|
|
||||||
|
this.recursive = true;
|
||||||
|
this.transformGroup = false;
|
||||||
|
this.rotateSpeed = 1;
|
||||||
|
|
||||||
|
this.raycaster = new Raycaster();
|
||||||
|
|
||||||
|
// interaction
|
||||||
|
|
||||||
|
this.mouseButtons = { LEFT: MOUSE.PAN, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.ROTATE };
|
||||||
|
this.touches = { ONE: TOUCH.PAN };
|
||||||
|
|
||||||
|
// event listeners
|
||||||
|
|
||||||
|
this._onPointerMove = onPointerMove.bind( this );
|
||||||
|
this._onPointerDown = onPointerDown.bind( this );
|
||||||
|
this._onPointerCancel = onPointerCancel.bind( this );
|
||||||
|
this._onContextMenu = onContextMenu.bind( this );
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
if ( domElement !== null ) {
|
||||||
|
|
||||||
|
this.connect();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
connect() {
|
||||||
|
|
||||||
|
this.domElement.addEventListener( 'pointermove', this._onPointerMove );
|
||||||
|
this.domElement.addEventListener( 'pointerdown', this._onPointerDown );
|
||||||
|
this.domElement.addEventListener( 'pointerup', this._onPointerCancel );
|
||||||
|
this.domElement.addEventListener( 'pointerleave', this._onPointerCancel );
|
||||||
|
this.domElement.addEventListener( 'contextmenu', this._onContextMenu );
|
||||||
|
|
||||||
|
this.domElement.style.touchAction = 'none'; // disable touch scroll
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
disconnect() {
|
||||||
|
|
||||||
|
this.domElement.removeEventListener( 'pointermove', this._onPointerMove );
|
||||||
|
this.domElement.removeEventListener( 'pointerdown', this._onPointerDown );
|
||||||
|
this.domElement.removeEventListener( 'pointerup', this._onPointerCancel );
|
||||||
|
this.domElement.removeEventListener( 'pointerleave', this._onPointerCancel );
|
||||||
|
this.domElement.removeEventListener( 'contextmenu', this._onContextMenu );
|
||||||
|
|
||||||
|
this.domElement.style.touchAction = 'auto';
|
||||||
|
this.domElement.style.cursor = '';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
|
||||||
|
this.disconnect();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
_updatePointer( event ) {
|
||||||
|
|
||||||
|
const rect = this.domElement.getBoundingClientRect();
|
||||||
|
|
||||||
|
_pointer.x = ( event.clientX - rect.left ) / rect.width * 2 - 1;
|
||||||
|
_pointer.y = - ( event.clientY - rect.top ) / rect.height * 2 + 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateState( event ) {
|
||||||
|
|
||||||
|
// determine action
|
||||||
|
|
||||||
|
let action;
|
||||||
|
|
||||||
|
if ( event.pointerType === 'touch' ) {
|
||||||
|
|
||||||
|
action = this.touches.ONE;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
switch ( event.button ) {
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
|
||||||
|
action = this.mouseButtons.LEFT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
|
||||||
|
action = this.mouseButtons.MIDDLE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
|
||||||
|
action = this.mouseButtons.RIGHT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
action = null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// determine state
|
||||||
|
|
||||||
|
switch ( action ) {
|
||||||
|
|
||||||
|
case MOUSE.PAN:
|
||||||
|
case TOUCH.PAN:
|
||||||
|
|
||||||
|
this.state = STATE.PAN;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MOUSE.ROTATE:
|
||||||
|
case TOUCH.ROTATE:
|
||||||
|
|
||||||
|
this.state = STATE.ROTATE;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
this.state = STATE.NONE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
getRaycaster() {
|
||||||
|
|
||||||
|
console.warn( 'THREE.DragControls: getRaycaster() has been deprecated. Use controls.raycaster instead.' ); // @deprecated r169
|
||||||
|
|
||||||
|
return this.raycaster;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
setObjects( objects ) {
|
||||||
|
|
||||||
|
console.warn( 'THREE.DragControls: setObjects() has been deprecated. Use controls.objects instead.' ); // @deprecated r169
|
||||||
|
|
||||||
|
this.objects = objects;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
getObjects() {
|
||||||
|
|
||||||
|
console.warn( 'THREE.DragControls: getObjects() has been deprecated. Use controls.objects instead.' ); // @deprecated r169
|
||||||
|
|
||||||
|
return this.objects;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
activate() {
|
||||||
|
|
||||||
|
console.warn( 'THREE.DragControls: activate() has been renamed to connect().' ); // @deprecated r169
|
||||||
|
this.connect();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
deactivate() {
|
||||||
|
|
||||||
|
console.warn( 'THREE.DragControls: deactivate() has been renamed to disconnect().' ); // @deprecated r169
|
||||||
|
this.disconnect();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
set mode( value ) {
|
||||||
|
|
||||||
|
console.warn( 'THREE.DragControls: The .mode property has been removed. Define the type of transformation via the .mouseButtons or .touches properties.' ); // @deprecated r169
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
get mode() {
|
||||||
|
|
||||||
|
console.warn( 'THREE.DragControls: The .mode property has been removed. Define the type of transformation via the .mouseButtons or .touches properties.' ); // @deprecated r169
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function onPointerMove( event ) {
|
||||||
|
|
||||||
|
const camera = this.object;
|
||||||
|
const domElement = this.domElement;
|
||||||
|
const raycaster = this.raycaster;
|
||||||
|
|
||||||
|
if ( this.enabled === false ) return;
|
||||||
|
|
||||||
|
this._updatePointer( event );
|
||||||
|
|
||||||
|
raycaster.setFromCamera( _pointer, camera );
|
||||||
|
|
||||||
|
if ( _selected ) {
|
||||||
|
|
||||||
|
if ( this.state === STATE.PAN ) {
|
||||||
|
|
||||||
|
if ( raycaster.ray.intersectPlane( _plane, _intersection ) ) {
|
||||||
|
|
||||||
|
_selected.position.copy( _intersection.sub( _offset ).applyMatrix4( _inverseMatrix ) );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if ( this.state === STATE.ROTATE ) {
|
||||||
|
|
||||||
|
_diff.subVectors( _pointer, _previousPointer ).multiplyScalar( this.rotateSpeed );
|
||||||
|
_selected.rotateOnWorldAxis( _up, _diff.x );
|
||||||
|
_selected.rotateOnWorldAxis( _right.normalize(), - _diff.y );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dispatchEvent( { type: 'drag', object: _selected } );
|
||||||
|
|
||||||
|
_previousPointer.copy( _pointer );
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// hover support
|
||||||
|
|
||||||
|
if ( event.pointerType === 'mouse' || event.pointerType === 'pen' ) {
|
||||||
|
|
||||||
|
_intersections.length = 0;
|
||||||
|
|
||||||
|
raycaster.setFromCamera( _pointer, camera );
|
||||||
|
raycaster.intersectObjects( this.objects, this.recursive, _intersections );
|
||||||
|
|
||||||
|
if ( _intersections.length > 0 ) {
|
||||||
|
|
||||||
|
const object = _intersections[ 0 ].object;
|
||||||
|
|
||||||
|
_plane.setFromNormalAndCoplanarPoint( camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( object.matrixWorld ) );
|
||||||
|
|
||||||
|
if ( _hovered !== object && _hovered !== null ) {
|
||||||
|
|
||||||
|
this.dispatchEvent( { type: 'hoveroff', object: _hovered } );
|
||||||
|
|
||||||
|
domElement.style.cursor = 'auto';
|
||||||
|
_hovered = null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( _hovered !== object ) {
|
||||||
|
|
||||||
|
this.dispatchEvent( { type: 'hoveron', object: object } );
|
||||||
|
|
||||||
|
domElement.style.cursor = 'pointer';
|
||||||
|
_hovered = object;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if ( _hovered !== null ) {
|
||||||
|
|
||||||
|
this.dispatchEvent( { type: 'hoveroff', object: _hovered } );
|
||||||
|
|
||||||
|
domElement.style.cursor = 'auto';
|
||||||
|
_hovered = null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
_previousPointer.copy( _pointer );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function onPointerDown( event ) {
|
||||||
|
|
||||||
|
const camera = this.object;
|
||||||
|
const domElement = this.domElement;
|
||||||
|
const raycaster = this.raycaster;
|
||||||
|
|
||||||
|
if ( this.enabled === false ) return;
|
||||||
|
|
||||||
|
this._updatePointer( event );
|
||||||
|
this._updateState( event );
|
||||||
|
|
||||||
|
_intersections.length = 0;
|
||||||
|
|
||||||
|
raycaster.setFromCamera( _pointer, camera );
|
||||||
|
raycaster.intersectObjects( this.objects, this.recursive, _intersections );
|
||||||
|
|
||||||
|
if ( _intersections.length > 0 ) {
|
||||||
|
|
||||||
|
if ( this.transformGroup === true ) {
|
||||||
|
|
||||||
|
// look for the outermost group in the object's upper hierarchy
|
||||||
|
|
||||||
|
_selected = findGroup( _intersections[ 0 ].object );
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
_selected = _intersections[ 0 ].object;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
_plane.setFromNormalAndCoplanarPoint( camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );
|
||||||
|
|
||||||
|
if ( raycaster.ray.intersectPlane( _plane, _intersection ) ) {
|
||||||
|
|
||||||
|
if ( this.state === STATE.PAN ) {
|
||||||
|
|
||||||
|
_inverseMatrix.copy( _selected.parent.matrixWorld ).invert();
|
||||||
|
_offset.copy( _intersection ).sub( _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );
|
||||||
|
|
||||||
|
} else if ( this.state === STATE.ROTATE ) {
|
||||||
|
|
||||||
|
// the controls only support Y+ up
|
||||||
|
_up.set( 0, 1, 0 ).applyQuaternion( camera.quaternion ).normalize();
|
||||||
|
_right.set( 1, 0, 0 ).applyQuaternion( camera.quaternion ).normalize();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
domElement.style.cursor = 'move';
|
||||||
|
|
||||||
|
this.dispatchEvent( { type: 'dragstart', object: _selected } );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
_previousPointer.copy( _pointer );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function onPointerCancel() {
|
||||||
|
|
||||||
|
if ( this.enabled === false ) return;
|
||||||
|
|
||||||
|
if ( _selected ) {
|
||||||
|
|
||||||
|
this.dispatchEvent( { type: 'dragend', object: _selected } );
|
||||||
|
|
||||||
|
_selected = null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
this.domElement.style.cursor = _hovered ? 'pointer' : 'auto';
|
||||||
|
|
||||||
|
this.state = STATE.NONE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function onContextMenu( event ) {
|
||||||
|
|
||||||
|
if ( this.enabled === false ) return;
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function findGroup( obj, group = null ) {
|
||||||
|
|
||||||
|
if ( obj.isGroup ) group = obj;
|
||||||
|
|
||||||
|
if ( obj.parent === null ) return group;
|
||||||
|
|
||||||
|
return findGroup( obj.parent, group );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export { DragControls };
|
||||||
22
FLUJOS/VISUALIZACION/public/libs/accessor-fn.js
Executable file
|
|
@ -0,0 +1,22 @@
|
||||||
|
// Version 1.5.0 accessor-fn - https://github.com/vasturiano/accessor-fn
|
||||||
|
(function (global, factory) {
|
||||||
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||||
|
typeof define === 'function' && define.amd ? define(factory) :
|
||||||
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.accessorFn = factory());
|
||||||
|
})(this, (function () { 'use strict';
|
||||||
|
|
||||||
|
var index = (function (p) {
|
||||||
|
return typeof p === 'function' ? p // fn
|
||||||
|
: typeof p === 'string' ? function (obj) {
|
||||||
|
return obj[p];
|
||||||
|
} // property name
|
||||||
|
: function (obj) {
|
||||||
|
return p;
|
||||||
|
};
|
||||||
|
}); // constant
|
||||||
|
|
||||||
|
return index;
|
||||||
|
|
||||||
|
}));
|
||||||
|
//# sourceMappingURL=accessor-fn.js.map
|
||||||
|
export default TableCsv
|
||||||
26
FLUJOS/VISUALIZACION/public/libs/kapsule-link.js
Executable file
|
|
@ -0,0 +1,26 @@
|
||||||
|
export default function(kapsulePropName, kapsuleType) {
|
||||||
|
|
||||||
|
const dummyK = new kapsuleType(); // To extract defaults
|
||||||
|
dummyK._destructor && dummyK._destructor();
|
||||||
|
|
||||||
|
return {
|
||||||
|
linkProp: function(prop) { // link property config
|
||||||
|
return {
|
||||||
|
default: dummyK[prop](),
|
||||||
|
onChange(v, state) { state[kapsulePropName][prop](v) },
|
||||||
|
triggerUpdate: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
linkMethod: function(method) { // link method pass-through
|
||||||
|
return function(state, ...args) {
|
||||||
|
const kapsuleInstance = state[kapsulePropName];
|
||||||
|
const returnVal = kapsuleInstance[method](...args);
|
||||||
|
|
||||||
|
return returnVal === kapsuleInstance
|
||||||
|
? this // chain based on the parent object, not the inner kapsule
|
||||||
|
: returnVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
716
FLUJOS/VISUALIZACION/public/libs/kapsule.js
Executable file
|
|
@ -0,0 +1,716 @@
|
||||||
|
// Version 1.14.4 kapsule - https://github.com/vasturiano/kapsule
|
||||||
|
(function (global, factory) {
|
||||||
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||||
|
typeof define === 'function' && define.amd ? define(factory) :
|
||||||
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Kapsule = factory());
|
||||||
|
})(this, (function () { 'use strict';
|
||||||
|
|
||||||
|
function _iterableToArrayLimit(arr, i) {
|
||||||
|
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
|
||||||
|
if (null != _i) {
|
||||||
|
var _s,
|
||||||
|
_e,
|
||||||
|
_x,
|
||||||
|
_r,
|
||||||
|
_arr = [],
|
||||||
|
_n = !0,
|
||||||
|
_d = !1;
|
||||||
|
try {
|
||||||
|
if (_x = (_i = _i.call(arr)).next, 0 === i) {
|
||||||
|
if (Object(_i) !== _i) return;
|
||||||
|
_n = !1;
|
||||||
|
} else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);
|
||||||
|
} catch (err) {
|
||||||
|
_d = !0, _e = err;
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return;
|
||||||
|
} finally {
|
||||||
|
if (_d) throw _e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _arr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function _classCallCheck(instance, Constructor) {
|
||||||
|
if (!(instance instanceof Constructor)) {
|
||||||
|
throw new TypeError("Cannot call a class as a function");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function _defineProperties(target, props) {
|
||||||
|
for (var i = 0; i < props.length; i++) {
|
||||||
|
var descriptor = props[i];
|
||||||
|
descriptor.enumerable = descriptor.enumerable || false;
|
||||||
|
descriptor.configurable = true;
|
||||||
|
if ("value" in descriptor) descriptor.writable = true;
|
||||||
|
Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function _createClass(Constructor, protoProps, staticProps) {
|
||||||
|
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
||||||
|
if (staticProps) _defineProperties(Constructor, staticProps);
|
||||||
|
Object.defineProperty(Constructor, "prototype", {
|
||||||
|
writable: false
|
||||||
|
});
|
||||||
|
return Constructor;
|
||||||
|
}
|
||||||
|
function _slicedToArray(arr, i) {
|
||||||
|
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
|
||||||
|
}
|
||||||
|
function _arrayWithHoles(arr) {
|
||||||
|
if (Array.isArray(arr)) return arr;
|
||||||
|
}
|
||||||
|
function _unsupportedIterableToArray(o, minLen) {
|
||||||
|
if (!o) return;
|
||||||
|
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
||||||
|
var n = Object.prototype.toString.call(o).slice(8, -1);
|
||||||
|
if (n === "Object" && o.constructor) n = o.constructor.name;
|
||||||
|
if (n === "Map" || n === "Set") return Array.from(o);
|
||||||
|
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
||||||
|
}
|
||||||
|
function _arrayLikeToArray(arr, len) {
|
||||||
|
if (len == null || len > arr.length) len = arr.length;
|
||||||
|
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
||||||
|
return arr2;
|
||||||
|
}
|
||||||
|
function _nonIterableRest() {
|
||||||
|
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
||||||
|
}
|
||||||
|
function _toPrimitive(input, hint) {
|
||||||
|
if (typeof input !== "object" || input === null) return input;
|
||||||
|
var prim = input[Symbol.toPrimitive];
|
||||||
|
if (prim !== undefined) {
|
||||||
|
var res = prim.call(input, hint || "default");
|
||||||
|
if (typeof res !== "object") return res;
|
||||||
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
||||||
|
}
|
||||||
|
return (hint === "string" ? String : Number)(input);
|
||||||
|
}
|
||||||
|
function _toPropertyKey(arg) {
|
||||||
|
var key = _toPrimitive(arg, "string");
|
||||||
|
return typeof key === "symbol" ? key : String(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Detect free variable `global` from Node.js. */
|
||||||
|
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
|
||||||
|
|
||||||
|
var freeGlobal$1 = freeGlobal;
|
||||||
|
|
||||||
|
/** Detect free variable `self`. */
|
||||||
|
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
|
||||||
|
|
||||||
|
/** Used as a reference to the global object. */
|
||||||
|
var root = freeGlobal$1 || freeSelf || Function('return this')();
|
||||||
|
|
||||||
|
var root$1 = root;
|
||||||
|
|
||||||
|
/** Built-in value references. */
|
||||||
|
var Symbol$1 = root$1.Symbol;
|
||||||
|
|
||||||
|
var Symbol$2 = Symbol$1;
|
||||||
|
|
||||||
|
/** Used for built-in method references. */
|
||||||
|
var objectProto$1 = Object.prototype;
|
||||||
|
|
||||||
|
/** Used to check objects for own properties. */
|
||||||
|
var hasOwnProperty = objectProto$1.hasOwnProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to resolve the
|
||||||
|
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
|
||||||
|
* of values.
|
||||||
|
*/
|
||||||
|
var nativeObjectToString$1 = objectProto$1.toString;
|
||||||
|
|
||||||
|
/** Built-in value references. */
|
||||||
|
var symToStringTag$1 = Symbol$2 ? Symbol$2.toStringTag : undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to query.
|
||||||
|
* @returns {string} Returns the raw `toStringTag`.
|
||||||
|
*/
|
||||||
|
function getRawTag(value) {
|
||||||
|
var isOwn = hasOwnProperty.call(value, symToStringTag$1),
|
||||||
|
tag = value[symToStringTag$1];
|
||||||
|
|
||||||
|
try {
|
||||||
|
value[symToStringTag$1] = undefined;
|
||||||
|
var unmasked = true;
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
var result = nativeObjectToString$1.call(value);
|
||||||
|
if (unmasked) {
|
||||||
|
if (isOwn) {
|
||||||
|
value[symToStringTag$1] = tag;
|
||||||
|
} else {
|
||||||
|
delete value[symToStringTag$1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Used for built-in method references. */
|
||||||
|
var objectProto = Object.prototype;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to resolve the
|
||||||
|
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
|
||||||
|
* of values.
|
||||||
|
*/
|
||||||
|
var nativeObjectToString = objectProto.toString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts `value` to a string using `Object.prototype.toString`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to convert.
|
||||||
|
* @returns {string} Returns the converted string.
|
||||||
|
*/
|
||||||
|
function objectToString(value) {
|
||||||
|
return nativeObjectToString.call(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** `Object#toString` result references. */
|
||||||
|
var nullTag = '[object Null]',
|
||||||
|
undefinedTag = '[object Undefined]';
|
||||||
|
|
||||||
|
/** Built-in value references. */
|
||||||
|
var symToStringTag = Symbol$2 ? Symbol$2.toStringTag : undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `getTag` without fallbacks for buggy environments.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} value The value to query.
|
||||||
|
* @returns {string} Returns the `toStringTag`.
|
||||||
|
*/
|
||||||
|
function baseGetTag(value) {
|
||||||
|
if (value == null) {
|
||||||
|
return value === undefined ? undefinedTag : nullTag;
|
||||||
|
}
|
||||||
|
return (symToStringTag && symToStringTag in Object(value))
|
||||||
|
? getRawTag(value)
|
||||||
|
: objectToString(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if `value` is object-like. A value is object-like if it's not `null`
|
||||||
|
* and has a `typeof` result of "object".
|
||||||
|
*
|
||||||
|
* @static
|
||||||
|
* @memberOf _
|
||||||
|
* @since 4.0.0
|
||||||
|
* @category Lang
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* _.isObjectLike({});
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* _.isObjectLike([1, 2, 3]);
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* _.isObjectLike(_.noop);
|
||||||
|
* // => false
|
||||||
|
*
|
||||||
|
* _.isObjectLike(null);
|
||||||
|
* // => false
|
||||||
|
*/
|
||||||
|
function isObjectLike(value) {
|
||||||
|
return value != null && typeof value == 'object';
|
||||||
|
}
|
||||||
|
|
||||||
|
/** `Object#toString` result references. */
|
||||||
|
var symbolTag = '[object Symbol]';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if `value` is classified as a `Symbol` primitive or object.
|
||||||
|
*
|
||||||
|
* @static
|
||||||
|
* @memberOf _
|
||||||
|
* @since 4.0.0
|
||||||
|
* @category Lang
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* _.isSymbol(Symbol.iterator);
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* _.isSymbol('abc');
|
||||||
|
* // => false
|
||||||
|
*/
|
||||||
|
function isSymbol(value) {
|
||||||
|
return typeof value == 'symbol' ||
|
||||||
|
(isObjectLike(value) && baseGetTag(value) == symbolTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Used to match a single whitespace character. */
|
||||||
|
var reWhitespace = /\s/;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
|
||||||
|
* character of `string`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} string The string to inspect.
|
||||||
|
* @returns {number} Returns the index of the last non-whitespace character.
|
||||||
|
*/
|
||||||
|
function trimmedEndIndex(string) {
|
||||||
|
var index = string.length;
|
||||||
|
|
||||||
|
while (index-- && reWhitespace.test(string.charAt(index))) {}
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Used to match leading whitespace. */
|
||||||
|
var reTrimStart = /^\s+/;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base implementation of `_.trim`.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} string The string to trim.
|
||||||
|
* @returns {string} Returns the trimmed string.
|
||||||
|
*/
|
||||||
|
function baseTrim(string) {
|
||||||
|
return string
|
||||||
|
? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
|
||||||
|
: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if `value` is the
|
||||||
|
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
|
||||||
|
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
|
||||||
|
*
|
||||||
|
* @static
|
||||||
|
* @memberOf _
|
||||||
|
* @since 0.1.0
|
||||||
|
* @category Lang
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* _.isObject({});
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* _.isObject([1, 2, 3]);
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* _.isObject(_.noop);
|
||||||
|
* // => true
|
||||||
|
*
|
||||||
|
* _.isObject(null);
|
||||||
|
* // => false
|
||||||
|
*/
|
||||||
|
function isObject(value) {
|
||||||
|
var type = typeof value;
|
||||||
|
return value != null && (type == 'object' || type == 'function');
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Used as references for various `Number` constants. */
|
||||||
|
var NAN = 0 / 0;
|
||||||
|
|
||||||
|
/** Used to detect bad signed hexadecimal string values. */
|
||||||
|
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
||||||
|
|
||||||
|
/** Used to detect binary string values. */
|
||||||
|
var reIsBinary = /^0b[01]+$/i;
|
||||||
|
|
||||||
|
/** Used to detect octal string values. */
|
||||||
|
var reIsOctal = /^0o[0-7]+$/i;
|
||||||
|
|
||||||
|
/** Built-in method references without a dependency on `root`. */
|
||||||
|
var freeParseInt = parseInt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts `value` to a number.
|
||||||
|
*
|
||||||
|
* @static
|
||||||
|
* @memberOf _
|
||||||
|
* @since 4.0.0
|
||||||
|
* @category Lang
|
||||||
|
* @param {*} value The value to process.
|
||||||
|
* @returns {number} Returns the number.
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* _.toNumber(3.2);
|
||||||
|
* // => 3.2
|
||||||
|
*
|
||||||
|
* _.toNumber(Number.MIN_VALUE);
|
||||||
|
* // => 5e-324
|
||||||
|
*
|
||||||
|
* _.toNumber(Infinity);
|
||||||
|
* // => Infinity
|
||||||
|
*
|
||||||
|
* _.toNumber('3.2');
|
||||||
|
* // => 3.2
|
||||||
|
*/
|
||||||
|
function toNumber(value) {
|
||||||
|
if (typeof value == 'number') {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
if (isSymbol(value)) {
|
||||||
|
return NAN;
|
||||||
|
}
|
||||||
|
if (isObject(value)) {
|
||||||
|
var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
|
||||||
|
value = isObject(other) ? (other + '') : other;
|
||||||
|
}
|
||||||
|
if (typeof value != 'string') {
|
||||||
|
return value === 0 ? value : +value;
|
||||||
|
}
|
||||||
|
value = baseTrim(value);
|
||||||
|
var isBinary = reIsBinary.test(value);
|
||||||
|
return (isBinary || reIsOctal.test(value))
|
||||||
|
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
|
||||||
|
: (reIsBadHex.test(value) ? NAN : +value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the timestamp of the number of milliseconds that have elapsed since
|
||||||
|
* the Unix epoch (1 January 1970 00:00:00 UTC).
|
||||||
|
*
|
||||||
|
* @static
|
||||||
|
* @memberOf _
|
||||||
|
* @since 2.4.0
|
||||||
|
* @category Date
|
||||||
|
* @returns {number} Returns the timestamp.
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* _.defer(function(stamp) {
|
||||||
|
* console.log(_.now() - stamp);
|
||||||
|
* }, _.now());
|
||||||
|
* // => Logs the number of milliseconds it took for the deferred invocation.
|
||||||
|
*/
|
||||||
|
var now = function() {
|
||||||
|
return root$1.Date.now();
|
||||||
|
};
|
||||||
|
|
||||||
|
var now$1 = now;
|
||||||
|
|
||||||
|
/** Error message constants. */
|
||||||
|
var FUNC_ERROR_TEXT = 'Expected a function';
|
||||||
|
|
||||||
|
/* Built-in method references for those with the same name as other `lodash` methods. */
|
||||||
|
var nativeMax = Math.max,
|
||||||
|
nativeMin = Math.min;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a debounced function that delays invoking `func` until after `wait`
|
||||||
|
* milliseconds have elapsed since the last time the debounced function was
|
||||||
|
* invoked. The debounced function comes with a `cancel` method to cancel
|
||||||
|
* delayed `func` invocations and a `flush` method to immediately invoke them.
|
||||||
|
* Provide `options` to indicate whether `func` should be invoked on the
|
||||||
|
* leading and/or trailing edge of the `wait` timeout. The `func` is invoked
|
||||||
|
* with the last arguments provided to the debounced function. Subsequent
|
||||||
|
* calls to the debounced function return the result of the last `func`
|
||||||
|
* invocation.
|
||||||
|
*
|
||||||
|
* **Note:** If `leading` and `trailing` options are `true`, `func` is
|
||||||
|
* invoked on the trailing edge of the timeout only if the debounced function
|
||||||
|
* is invoked more than once during the `wait` timeout.
|
||||||
|
*
|
||||||
|
* If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
|
||||||
|
* until to the next tick, similar to `setTimeout` with a timeout of `0`.
|
||||||
|
*
|
||||||
|
* See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
|
||||||
|
* for details over the differences between `_.debounce` and `_.throttle`.
|
||||||
|
*
|
||||||
|
* @static
|
||||||
|
* @memberOf _
|
||||||
|
* @since 0.1.0
|
||||||
|
* @category Function
|
||||||
|
* @param {Function} func The function to debounce.
|
||||||
|
* @param {number} [wait=0] The number of milliseconds to delay.
|
||||||
|
* @param {Object} [options={}] The options object.
|
||||||
|
* @param {boolean} [options.leading=false]
|
||||||
|
* Specify invoking on the leading edge of the timeout.
|
||||||
|
* @param {number} [options.maxWait]
|
||||||
|
* The maximum time `func` is allowed to be delayed before it's invoked.
|
||||||
|
* @param {boolean} [options.trailing=true]
|
||||||
|
* Specify invoking on the trailing edge of the timeout.
|
||||||
|
* @returns {Function} Returns the new debounced function.
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* // Avoid costly calculations while the window size is in flux.
|
||||||
|
* jQuery(window).on('resize', _.debounce(calculateLayout, 150));
|
||||||
|
*
|
||||||
|
* // Invoke `sendMail` when clicked, debouncing subsequent calls.
|
||||||
|
* jQuery(element).on('click', _.debounce(sendMail, 300, {
|
||||||
|
* 'leading': true,
|
||||||
|
* 'trailing': false
|
||||||
|
* }));
|
||||||
|
*
|
||||||
|
* // Ensure `batchLog` is invoked once after 1 second of debounced calls.
|
||||||
|
* var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
|
||||||
|
* var source = new EventSource('/stream');
|
||||||
|
* jQuery(source).on('message', debounced);
|
||||||
|
*
|
||||||
|
* // Cancel the trailing debounced invocation.
|
||||||
|
* jQuery(window).on('popstate', debounced.cancel);
|
||||||
|
*/
|
||||||
|
function debounce(func, wait, options) {
|
||||||
|
var lastArgs,
|
||||||
|
lastThis,
|
||||||
|
maxWait,
|
||||||
|
result,
|
||||||
|
timerId,
|
||||||
|
lastCallTime,
|
||||||
|
lastInvokeTime = 0,
|
||||||
|
leading = false,
|
||||||
|
maxing = false,
|
||||||
|
trailing = true;
|
||||||
|
|
||||||
|
if (typeof func != 'function') {
|
||||||
|
throw new TypeError(FUNC_ERROR_TEXT);
|
||||||
|
}
|
||||||
|
wait = toNumber(wait) || 0;
|
||||||
|
if (isObject(options)) {
|
||||||
|
leading = !!options.leading;
|
||||||
|
maxing = 'maxWait' in options;
|
||||||
|
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
|
||||||
|
trailing = 'trailing' in options ? !!options.trailing : trailing;
|
||||||
|
}
|
||||||
|
|
||||||
|
function invokeFunc(time) {
|
||||||
|
var args = lastArgs,
|
||||||
|
thisArg = lastThis;
|
||||||
|
|
||||||
|
lastArgs = lastThis = undefined;
|
||||||
|
lastInvokeTime = time;
|
||||||
|
result = func.apply(thisArg, args);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function leadingEdge(time) {
|
||||||
|
// Reset any `maxWait` timer.
|
||||||
|
lastInvokeTime = time;
|
||||||
|
// Start the timer for the trailing edge.
|
||||||
|
timerId = setTimeout(timerExpired, wait);
|
||||||
|
// Invoke the leading edge.
|
||||||
|
return leading ? invokeFunc(time) : result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function remainingWait(time) {
|
||||||
|
var timeSinceLastCall = time - lastCallTime,
|
||||||
|
timeSinceLastInvoke = time - lastInvokeTime,
|
||||||
|
timeWaiting = wait - timeSinceLastCall;
|
||||||
|
|
||||||
|
return maxing
|
||||||
|
? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
|
||||||
|
: timeWaiting;
|
||||||
|
}
|
||||||
|
|
||||||
|
function shouldInvoke(time) {
|
||||||
|
var timeSinceLastCall = time - lastCallTime,
|
||||||
|
timeSinceLastInvoke = time - lastInvokeTime;
|
||||||
|
|
||||||
|
// Either this is the first call, activity has stopped and we're at the
|
||||||
|
// trailing edge, the system time has gone backwards and we're treating
|
||||||
|
// it as the trailing edge, or we've hit the `maxWait` limit.
|
||||||
|
return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
|
||||||
|
(timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
|
||||||
|
}
|
||||||
|
|
||||||
|
function timerExpired() {
|
||||||
|
var time = now$1();
|
||||||
|
if (shouldInvoke(time)) {
|
||||||
|
return trailingEdge(time);
|
||||||
|
}
|
||||||
|
// Restart the timer.
|
||||||
|
timerId = setTimeout(timerExpired, remainingWait(time));
|
||||||
|
}
|
||||||
|
|
||||||
|
function trailingEdge(time) {
|
||||||
|
timerId = undefined;
|
||||||
|
|
||||||
|
// Only invoke if we have `lastArgs` which means `func` has been
|
||||||
|
// debounced at least once.
|
||||||
|
if (trailing && lastArgs) {
|
||||||
|
return invokeFunc(time);
|
||||||
|
}
|
||||||
|
lastArgs = lastThis = undefined;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancel() {
|
||||||
|
if (timerId !== undefined) {
|
||||||
|
clearTimeout(timerId);
|
||||||
|
}
|
||||||
|
lastInvokeTime = 0;
|
||||||
|
lastArgs = lastCallTime = lastThis = timerId = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
function flush() {
|
||||||
|
return timerId === undefined ? result : trailingEdge(now$1());
|
||||||
|
}
|
||||||
|
|
||||||
|
function debounced() {
|
||||||
|
var time = now$1(),
|
||||||
|
isInvoking = shouldInvoke(time);
|
||||||
|
|
||||||
|
lastArgs = arguments;
|
||||||
|
lastThis = this;
|
||||||
|
lastCallTime = time;
|
||||||
|
|
||||||
|
if (isInvoking) {
|
||||||
|
if (timerId === undefined) {
|
||||||
|
return leadingEdge(lastCallTime);
|
||||||
|
}
|
||||||
|
if (maxing) {
|
||||||
|
// Handle invocations in a tight loop.
|
||||||
|
clearTimeout(timerId);
|
||||||
|
timerId = setTimeout(timerExpired, wait);
|
||||||
|
return invokeFunc(lastCallTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (timerId === undefined) {
|
||||||
|
timerId = setTimeout(timerExpired, wait);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
debounced.cancel = cancel;
|
||||||
|
debounced.flush = flush;
|
||||||
|
return debounced;
|
||||||
|
}
|
||||||
|
|
||||||
|
var Prop = /*#__PURE__*/_createClass(function Prop(name, _ref) {
|
||||||
|
var _ref$default = _ref["default"],
|
||||||
|
defaultVal = _ref$default === void 0 ? null : _ref$default,
|
||||||
|
_ref$triggerUpdate = _ref.triggerUpdate,
|
||||||
|
triggerUpdate = _ref$triggerUpdate === void 0 ? true : _ref$triggerUpdate,
|
||||||
|
_ref$onChange = _ref.onChange,
|
||||||
|
onChange = _ref$onChange === void 0 ? function (newVal, state) {} : _ref$onChange;
|
||||||
|
_classCallCheck(this, Prop);
|
||||||
|
this.name = name;
|
||||||
|
this.defaultVal = defaultVal;
|
||||||
|
this.triggerUpdate = triggerUpdate;
|
||||||
|
this.onChange = onChange;
|
||||||
|
});
|
||||||
|
function index (_ref2) {
|
||||||
|
var _ref2$stateInit = _ref2.stateInit,
|
||||||
|
stateInit = _ref2$stateInit === void 0 ? function () {
|
||||||
|
return {};
|
||||||
|
} : _ref2$stateInit,
|
||||||
|
_ref2$props = _ref2.props,
|
||||||
|
rawProps = _ref2$props === void 0 ? {} : _ref2$props,
|
||||||
|
_ref2$methods = _ref2.methods,
|
||||||
|
methods = _ref2$methods === void 0 ? {} : _ref2$methods,
|
||||||
|
_ref2$aliases = _ref2.aliases,
|
||||||
|
aliases = _ref2$aliases === void 0 ? {} : _ref2$aliases,
|
||||||
|
_ref2$init = _ref2.init,
|
||||||
|
initFn = _ref2$init === void 0 ? function () {} : _ref2$init,
|
||||||
|
_ref2$update = _ref2.update,
|
||||||
|
updateFn = _ref2$update === void 0 ? function () {} : _ref2$update;
|
||||||
|
// Parse props into Prop instances
|
||||||
|
var props = Object.keys(rawProps).map(function (propName) {
|
||||||
|
return new Prop(propName, rawProps[propName]);
|
||||||
|
});
|
||||||
|
return function () {
|
||||||
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||||||
|
// Holds component state
|
||||||
|
var state = Object.assign({}, stateInit instanceof Function ? stateInit(options) : stateInit,
|
||||||
|
// Support plain objects for backwards compatibility
|
||||||
|
{
|
||||||
|
initialised: false
|
||||||
|
});
|
||||||
|
|
||||||
|
// keeps track of which props triggered an update
|
||||||
|
var changedProps = {};
|
||||||
|
|
||||||
|
// Component constructor
|
||||||
|
function comp(nodeElement) {
|
||||||
|
initStatic(nodeElement, options);
|
||||||
|
digest();
|
||||||
|
return comp;
|
||||||
|
}
|
||||||
|
var initStatic = function initStatic(nodeElement, options) {
|
||||||
|
initFn.call(comp, nodeElement, state, options);
|
||||||
|
state.initialised = true;
|
||||||
|
};
|
||||||
|
var digest = debounce(function () {
|
||||||
|
if (!state.initialised) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
updateFn.call(comp, state, changedProps);
|
||||||
|
changedProps = {};
|
||||||
|
}, 1);
|
||||||
|
|
||||||
|
// Getter/setter methods
|
||||||
|
props.forEach(function (prop) {
|
||||||
|
comp[prop.name] = getSetProp(prop);
|
||||||
|
function getSetProp(_ref3) {
|
||||||
|
var prop = _ref3.name,
|
||||||
|
_ref3$triggerUpdate = _ref3.triggerUpdate,
|
||||||
|
redigest = _ref3$triggerUpdate === void 0 ? false : _ref3$triggerUpdate,
|
||||||
|
_ref3$onChange = _ref3.onChange,
|
||||||
|
onChange = _ref3$onChange === void 0 ? function (newVal, state) {} : _ref3$onChange,
|
||||||
|
_ref3$defaultVal = _ref3.defaultVal,
|
||||||
|
defaultVal = _ref3$defaultVal === void 0 ? null : _ref3$defaultVal;
|
||||||
|
return function (_) {
|
||||||
|
var curVal = state[prop];
|
||||||
|
if (!arguments.length) {
|
||||||
|
return curVal;
|
||||||
|
} // Getter mode
|
||||||
|
|
||||||
|
var val = _ === undefined ? defaultVal : _; // pick default if value passed is undefined
|
||||||
|
state[prop] = val;
|
||||||
|
onChange.call(comp, val, state, curVal);
|
||||||
|
|
||||||
|
// track changed props
|
||||||
|
!changedProps.hasOwnProperty(prop) && (changedProps[prop] = curVal);
|
||||||
|
if (redigest) {
|
||||||
|
digest();
|
||||||
|
}
|
||||||
|
return comp;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Other methods
|
||||||
|
Object.keys(methods).forEach(function (methodName) {
|
||||||
|
comp[methodName] = function () {
|
||||||
|
var _methods$methodName;
|
||||||
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
||||||
|
args[_key] = arguments[_key];
|
||||||
|
}
|
||||||
|
return (_methods$methodName = methods[methodName]).call.apply(_methods$methodName, [comp, state].concat(args));
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// Link aliases
|
||||||
|
Object.entries(aliases).forEach(function (_ref4) {
|
||||||
|
var _ref5 = _slicedToArray(_ref4, 2),
|
||||||
|
alias = _ref5[0],
|
||||||
|
target = _ref5[1];
|
||||||
|
return comp[alias] = comp[target];
|
||||||
|
});
|
||||||
|
|
||||||
|
// Reset all component props to their default value
|
||||||
|
comp.resetProps = function () {
|
||||||
|
props.forEach(function (prop) {
|
||||||
|
comp[prop.name](prop.defaultVal);
|
||||||
|
});
|
||||||
|
return comp;
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
comp.resetProps(); // Apply all prop defaults
|
||||||
|
state._rerender = digest; // Expose digest method
|
||||||
|
|
||||||
|
return comp;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
|
||||||
|
}));
|
||||||
|
//# sourceMappingURL=kapsule.js.map
|
||||||
|
export default TableCsv
|
||||||
8477
FLUJOS/VISUALIZACION/public/libs/three-forcegraph.js
Executable file
6788
FLUJOS/VISUALIZACION/public/libs/three-render-objects.js
Executable file
53917
FLUJOS/VISUALIZACION/public/libs/three.module.js
Executable file
126
FLUJOS/VISUALIZACION/public/output_climate_pruebas.js
Normal file
|
|
@ -0,0 +1,126 @@
|
||||||
|
// output_climate_pruebas.js
|
||||||
|
|
||||||
|
// Obtener el contenedor del gráfico
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const elem = document.getElementById('climateContainer');
|
||||||
|
const form = document.getElementById('paramForm');
|
||||||
|
|
||||||
|
// Inicializar el gráfico 3D
|
||||||
|
const graph = ForceGraph3D()(elem)
|
||||||
|
.backgroundColor('#000000')
|
||||||
|
.nodeLabel('id')
|
||||||
|
.nodeAutoColorBy('group')
|
||||||
|
.nodeVal(1)
|
||||||
|
.linkColor(() => '#42FF00')
|
||||||
|
.onNodeClick(node => showNodeContent(node.content))
|
||||||
|
.onNodeHover(node => { elem.style.cursor = node ? 'pointer' : null; })
|
||||||
|
.forceEngine('d3')
|
||||||
|
//.d3Force('charge', d3.forceManyBody().strength(-300))
|
||||||
|
//.d3Force('link', d3.forceLink().distance(300).strength(1));
|
||||||
|
|
||||||
|
// Centrado automático del gráfico
|
||||||
|
function centerGraph() {
|
||||||
|
setTimeout(() => {
|
||||||
|
const width = elem.clientWidth;
|
||||||
|
const height = elem.clientHeight;
|
||||||
|
graph.zoomToFit(400, Math.min(width, height) * 0.1);
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
window.addEventListener('resize', () => {
|
||||||
|
graph.width(elem.clientWidth);
|
||||||
|
graph.height(elem.clientHeight);
|
||||||
|
centerGraph();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Mostrar contenido del nodo
|
||||||
|
function showNodeContent(content) {
|
||||||
|
console.log('Contenido del nodo:', content);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función para obtener datos del servidor
|
||||||
|
async function getData(paramsObj = {}) {
|
||||||
|
try {
|
||||||
|
let url = '/api/data';
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
|
||||||
|
// Establecer el tema fijo
|
||||||
|
params.append('tema', 'cambio climático');
|
||||||
|
|
||||||
|
// Agregar parámetros del formulario, incluyendo complejidad como umbral
|
||||||
|
for (const key in paramsObj) {
|
||||||
|
if (paramsObj[key] !== undefined && paramsObj[key] !== '') {
|
||||||
|
params.append(key, paramsObj[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url += `?${params.toString()}`;
|
||||||
|
console.log('🔎 Fetch URL:', url);
|
||||||
|
|
||||||
|
const response = await fetch(url);
|
||||||
|
if (!response.ok) throw new Error(response.statusText);
|
||||||
|
const data = await response.json();
|
||||||
|
console.log('Datos recibidos del servidor:', data);
|
||||||
|
|
||||||
|
// Filtrar enlaces inválidos
|
||||||
|
const nodeIds = new Set(data.nodes.map(node => node.id));
|
||||||
|
data.links = data.links.filter(link => nodeIds.has(link.source) && nodeIds.has(link.target));
|
||||||
|
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error al obtener datos del servidor:', error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función principal: fetch, filtrar por complejidad/umbral y renderizar
|
||||||
|
async function fetchAndRender() {
|
||||||
|
const subtematica = document.getElementById('param2').value;
|
||||||
|
const palabraClave = document.getElementById('param1').value;
|
||||||
|
const fechaInicio = document.getElementById('fecha_inicio').value;
|
||||||
|
const fechaFin = document.getElementById('fecha_fin').value;
|
||||||
|
const nodos = document.getElementById('nodos').value;
|
||||||
|
const complejidad = document.getElementById('complejidad').value;
|
||||||
|
|
||||||
|
// Usamos 'complejidad' como porcentaje de similitud mínima (umbral)
|
||||||
|
const paramsObj = {
|
||||||
|
subtematica,
|
||||||
|
palabraClave,
|
||||||
|
fechaInicio,
|
||||||
|
fechaFin,
|
||||||
|
nodos,
|
||||||
|
complejidad // enviado al backend y usado de umbral en cliente
|
||||||
|
};
|
||||||
|
|
||||||
|
// Parsear complejidad a número
|
||||||
|
const umbralPct = parseFloat(complejidad) || 0;
|
||||||
|
console.log(`Aplicando umbral de similitud: ${umbralPct}%`);
|
||||||
|
|
||||||
|
const graphData = await getData(paramsObj);
|
||||||
|
if (!graphData) return;
|
||||||
|
|
||||||
|
// Filtrar enlaces por umbral de similitud
|
||||||
|
let filteredLinks = graphData.links;
|
||||||
|
if (umbralPct > 0) {
|
||||||
|
filteredLinks = filteredLinks.filter(link => Number(link.value) >= umbralPct);
|
||||||
|
console.log(`Enlaces tras aplicar umbral: ${filteredLinks.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
graph.graphData({ nodes: graphData.nodes, links: filteredLinks });
|
||||||
|
centerGraph();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escuchar evento submit del formulario
|
||||||
|
form.addEventListener('submit', event => {
|
||||||
|
event.preventDefault();
|
||||||
|
fetchAndRender();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cargar gráfico inicial
|
||||||
|
fetchAndRender();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
120
FLUJOS/VISUALIZACION/public/output_eco_corp_pruebas.js
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
// output_eco_corp.js
|
||||||
|
|
||||||
|
// Obtener el contenedor del gráfico
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const elem = document.getElementById('ecoCorpContainer');
|
||||||
|
const form = document.getElementById('paramForm');
|
||||||
|
|
||||||
|
// Inicializar el gráfico 3D
|
||||||
|
const graph = ForceGraph3D()(elem)
|
||||||
|
.backgroundColor('#000000')
|
||||||
|
.nodeLabel('id')
|
||||||
|
.nodeAutoColorBy('group')
|
||||||
|
.nodeVal(1)
|
||||||
|
.linkColor(() => 'yellow')
|
||||||
|
.onNodeClick(node => showNodeContent(node.content))
|
||||||
|
.onNodeHover(node => { elem.style.cursor = node ? 'pointer' : null; })
|
||||||
|
.forceEngine('d3')
|
||||||
|
//.d3Force('charge', d3.forceManyBody().strength(-300))
|
||||||
|
//.d3Force('link', d3.forceLink().distance(300).strength(1));
|
||||||
|
|
||||||
|
// Centrado automático del gráfico
|
||||||
|
function centerGraph() {
|
||||||
|
setTimeout(() => {
|
||||||
|
const width = elem.clientWidth;
|
||||||
|
const height = elem.clientHeight;
|
||||||
|
graph.zoomToFit(400, Math.min(width, height) * 0.1);
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
window.addEventListener('resize', () => {
|
||||||
|
graph.width(elem.clientWidth);
|
||||||
|
graph.height(elem.clientHeight);
|
||||||
|
centerGraph();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Mostrar contenido del nodo
|
||||||
|
function showNodeContent(content) {
|
||||||
|
console.log('Contenido del nodo:', content);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función para obtener datos del servidor
|
||||||
|
async function getData(paramsObj = {}) {
|
||||||
|
try {
|
||||||
|
let url = '/api/data';
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
|
||||||
|
// Establecer el tema fijo
|
||||||
|
params.append('tema', 'economía y corporaciones');
|
||||||
|
|
||||||
|
// Agregar parámetros del formulario, incluyendo complejidad como umbral
|
||||||
|
for (const key in paramsObj) {
|
||||||
|
if (paramsObj[key] !== undefined && paramsObj[key] !== '') {
|
||||||
|
params.append(key, paramsObj[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url += `?${params.toString()}`;
|
||||||
|
console.log('🔎 Fetch URL:', url);
|
||||||
|
|
||||||
|
const response = await fetch(url);
|
||||||
|
if (!response.ok) throw new Error(response.statusText);
|
||||||
|
const data = await response.json();
|
||||||
|
console.log('Datos recibidos del servidor:', data);
|
||||||
|
|
||||||
|
// Filtrar enlaces inválidos
|
||||||
|
const nodeIds = new Set(data.nodes.map(node => node.id));
|
||||||
|
data.links = data.links.filter(link => nodeIds.has(link.source) && nodeIds.has(link.target));
|
||||||
|
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error al obtener datos del servidor:', error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función principal: fetch, filtrar por complejidad/umbral y renderizar
|
||||||
|
async function fetchAndRender() {
|
||||||
|
const subtematica = document.getElementById('param2').value;
|
||||||
|
const palabraClave = document.getElementById('param1').value;
|
||||||
|
const fechaInicio = document.getElementById('fecha_inicio').value;
|
||||||
|
const fechaFin = document.getElementById('fecha_fin').value;
|
||||||
|
const nodos = document.getElementById('nodos').value;
|
||||||
|
const complejidad = document.getElementById('complejidad').value;
|
||||||
|
|
||||||
|
// Usamos 'complejidad' como porcentaje de similitud mínima (umbral)
|
||||||
|
const paramsObj = {
|
||||||
|
subtematica,
|
||||||
|
palabraClave,
|
||||||
|
fechaInicio,
|
||||||
|
fechaFin,
|
||||||
|
nodos,
|
||||||
|
complejidad // enviado al backend y usado de umbral en cliente
|
||||||
|
};
|
||||||
|
|
||||||
|
// Parsear complejidad a número
|
||||||
|
const umbralPct = parseFloat(complejidad) || 0;
|
||||||
|
console.log(`Aplicando umbral de similitud: ${umbralPct}%`);
|
||||||
|
|
||||||
|
const graphData = await getData(paramsObj);
|
||||||
|
if (!graphData) return;
|
||||||
|
|
||||||
|
// Filtrar enlaces por umbral de similitud
|
||||||
|
let filteredLinks = graphData.links;
|
||||||
|
if (umbralPct > 0) {
|
||||||
|
filteredLinks = filteredLinks.filter(link => Number(link.value) >= umbralPct);
|
||||||
|
console.log(`Enlaces tras aplicar umbral: ${filteredLinks.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
graph.graphData({ nodes: graphData.nodes, links: filteredLinks });
|
||||||
|
centerGraph();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escuchar evento submit del formulario
|
||||||
|
form.addEventListener('submit', event => {
|
||||||
|
event.preventDefault();
|
||||||
|
fetchAndRender();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cargar gráfico inicial
|
||||||
|
fetchAndRender();
|
||||||
|
});
|
||||||
123
FLUJOS/VISUALIZACION/public/output_glob_war.js
Executable file
|
|
@ -0,0 +1,123 @@
|
||||||
|
// output_glob_war.js
|
||||||
|
|
||||||
|
// Obtener el contenedor del gráfico
|
||||||
|
const elem = document.getElementById('globWarContainer');
|
||||||
|
|
||||||
|
// Inicializar el gráfico
|
||||||
|
const graph = ForceGraph3D()(elem)
|
||||||
|
.backgroundColor('#000000')
|
||||||
|
.nodeLabel('id')
|
||||||
|
.nodeAutoColorBy('group')
|
||||||
|
.nodeVal(2)
|
||||||
|
.linkColor(() => 'green')
|
||||||
|
.onNodeClick(node => showNodeContent(node.content))
|
||||||
|
.onNodeHover(node => {
|
||||||
|
elem.style.cursor = node ? 'pointer' : null;
|
||||||
|
})
|
||||||
|
.forceEngine('d3')
|
||||||
|
.d3Force('charge', d3.forceManyBody().strength(-10))
|
||||||
|
.d3Force('link', d3.forceLink().distance(30).strength(1));
|
||||||
|
|
||||||
|
// Función para obtener datos del servidor
|
||||||
|
async function getData(paramsObj = {}) {
|
||||||
|
try {
|
||||||
|
let url = '/api/data';
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
|
||||||
|
// Tema por defecto: "guerra global"
|
||||||
|
params.append('tema', 'guerra global');
|
||||||
|
|
||||||
|
// Agregar parámetros del formulario si existen
|
||||||
|
for (const key in paramsObj) {
|
||||||
|
if (paramsObj[key]) {
|
||||||
|
params.append(key, paramsObj[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url += `?${params.toString()}`;
|
||||||
|
|
||||||
|
const response = await fetch(url);
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
console.log('Datos recibidos del servidor:', data);
|
||||||
|
|
||||||
|
// Filtrar enlaces para nodos existentes
|
||||||
|
const nodeIds = new Set(data.nodes.map(n => n.id));
|
||||||
|
data.links = data.links.filter(l => nodeIds.has(l.source) && nodeIds.has(l.target));
|
||||||
|
|
||||||
|
console.log('Enlaces tras filtrar:', data.links);
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error al obtener datos del servidor:', error);
|
||||||
|
return { nodes: [], links: [] };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mostrar contenido del nodo al hacer click
|
||||||
|
function showNodeContent(content) {
|
||||||
|
console.log('Contenido del nodo:', content);
|
||||||
|
// aquí podrías mostrarlo en un panel si quieres
|
||||||
|
}
|
||||||
|
|
||||||
|
// Centrar y escalar el gráfico
|
||||||
|
function centerGraph() {
|
||||||
|
setTimeout(() => {
|
||||||
|
const width = elem.clientWidth;
|
||||||
|
const height = elem.clientHeight;
|
||||||
|
const padding = Math.min(width, height) * 0.1;
|
||||||
|
graph.zoomToFit(400, padding);
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Al cambiar el tamaño de la ventana, reajustar
|
||||||
|
window.addEventListener('resize', () => {
|
||||||
|
graph.width(elem.clientWidth);
|
||||||
|
graph.height(elem.clientHeight);
|
||||||
|
centerGraph();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Gestionar el submit del formulario de parámetros
|
||||||
|
document.getElementById('paramForm').addEventListener('submit', event => {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
const subtematica = document.getElementById('param2').value;
|
||||||
|
const palabraClave = document.getElementById('param1').value;
|
||||||
|
const fechaInicio = document.getElementById('fecha_inicio').value;
|
||||||
|
const fechaFin = document.getElementById('fecha_fin').value;
|
||||||
|
const nodos = document.getElementById('nodos').value;
|
||||||
|
const complejidad = document.getElementById('complejidad').value;
|
||||||
|
|
||||||
|
const paramsObj = {
|
||||||
|
subtematica,
|
||||||
|
palabraClave,
|
||||||
|
fechaInicio,
|
||||||
|
fechaFin,
|
||||||
|
nodos,
|
||||||
|
complejidad
|
||||||
|
};
|
||||||
|
|
||||||
|
getData(paramsObj).then(data => {
|
||||||
|
graph.graphData(data);
|
||||||
|
centerGraph();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cargar datos iniciales (guerra global) y renderizar
|
||||||
|
getData().then(data => {
|
||||||
|
if (data.nodes && data.nodes.length) {
|
||||||
|
console.log(`Se recibieron ${data.nodes.length} nodos.`);
|
||||||
|
graph.graphData(data);
|
||||||
|
centerGraph();
|
||||||
|
} else {
|
||||||
|
console.warn('No se recibieron nodos para "guerra global".');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
120
FLUJOS/VISUALIZACION/public/output_glob_war_pruebas.js
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
// output_glob_war.js
|
||||||
|
|
||||||
|
// Obtener el contenedor del gráfico
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const elem = document.getElementById('globWarContainer');
|
||||||
|
const form = document.getElementById('paramForm');
|
||||||
|
|
||||||
|
// Inicializar el gráfico 3D
|
||||||
|
const graph = ForceGraph3D()(elem)
|
||||||
|
.backgroundColor('#000000')
|
||||||
|
.nodeLabel('id')
|
||||||
|
.nodeAutoColorBy('group')
|
||||||
|
.nodeVal(1)
|
||||||
|
.linkColor(() => 'red')
|
||||||
|
.onNodeClick(node => showNodeContent(node.content))
|
||||||
|
.onNodeHover(node => { elem.style.cursor = node ? 'pointer' : null; })
|
||||||
|
.forceEngine('d3')
|
||||||
|
//.d3Force('charge', d3.forceManyBody().strength(-300))
|
||||||
|
//.d3Force('link', d3.forceLink().distance(300).strength(1));
|
||||||
|
|
||||||
|
// Centrado automático del gráfico
|
||||||
|
function centerGraph() {
|
||||||
|
setTimeout(() => {
|
||||||
|
const width = elem.clientWidth;
|
||||||
|
const height = elem.clientHeight;
|
||||||
|
graph.zoomToFit(400, Math.min(width, height) * 0.1);
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
window.addEventListener('resize', () => {
|
||||||
|
graph.width(elem.clientWidth);
|
||||||
|
graph.height(elem.clientHeight);
|
||||||
|
centerGraph();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Mostrar contenido del nodo
|
||||||
|
function showNodeContent(content) {
|
||||||
|
console.log('Contenido del nodo:', content);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función para obtener datos del servidor
|
||||||
|
async function getData(paramsObj = {}) {
|
||||||
|
try {
|
||||||
|
let url = '/api/data';
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
|
||||||
|
// Establecer el tema fijo
|
||||||
|
params.append('tema', 'guerra global');
|
||||||
|
|
||||||
|
// Agregar parámetros del formulario, incluyendo complejidad como umbral
|
||||||
|
for (const key in paramsObj) {
|
||||||
|
if (paramsObj[key] !== undefined && paramsObj[key] !== '') {
|
||||||
|
params.append(key, paramsObj[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url += `?${params.toString()}`;
|
||||||
|
console.log('🔎 Fetch URL:', url);
|
||||||
|
|
||||||
|
const response = await fetch(url);
|
||||||
|
if (!response.ok) throw new Error(response.statusText);
|
||||||
|
const data = await response.json();
|
||||||
|
console.log('Datos recibidos del servidor:', data);
|
||||||
|
|
||||||
|
// Filtrar enlaces inválidos
|
||||||
|
const nodeIds = new Set(data.nodes.map(node => node.id));
|
||||||
|
data.links = data.links.filter(link => nodeIds.has(link.source) && nodeIds.has(link.target));
|
||||||
|
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error al obtener datos del servidor:', error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función principal: fetch, filtrar por complejidad/umbral y renderizar
|
||||||
|
async function fetchAndRender() {
|
||||||
|
const subtematica = document.getElementById('param2').value;
|
||||||
|
const palabraClave = document.getElementById('param1').value;
|
||||||
|
const fechaInicio = document.getElementById('fecha_inicio').value;
|
||||||
|
const fechaFin = document.getElementById('fecha_fin').value;
|
||||||
|
const nodos = document.getElementById('nodos').value;
|
||||||
|
const complejidad = document.getElementById('complejidad').value;
|
||||||
|
|
||||||
|
// Usamos 'complejidad' como porcentaje de similitud mínima (umbral)
|
||||||
|
const paramsObj = {
|
||||||
|
subtematica,
|
||||||
|
palabraClave,
|
||||||
|
fechaInicio,
|
||||||
|
fechaFin,
|
||||||
|
nodos,
|
||||||
|
complejidad // enviado al backend y usado de umbral en cliente
|
||||||
|
};
|
||||||
|
|
||||||
|
// Parsear complejidad a número
|
||||||
|
const umbralPct = parseFloat(complejidad) || 0;
|
||||||
|
console.log(`Aplicando umbral de similitud: ${umbralPct}%`);
|
||||||
|
|
||||||
|
const graphData = await getData(paramsObj);
|
||||||
|
if (!graphData) return;
|
||||||
|
|
||||||
|
// Filtrar enlaces por umbral de similitud
|
||||||
|
let filteredLinks = graphData.links;
|
||||||
|
if (umbralPct > 0) {
|
||||||
|
filteredLinks = filteredLinks.filter(link => Number(link.value) >= umbralPct);
|
||||||
|
console.log(`Enlaces tras aplicar umbral: ${filteredLinks.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
graph.graphData({ nodes: graphData.nodes, links: filteredLinks });
|
||||||
|
centerGraph();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escuchar evento submit del formulario
|
||||||
|
form.addEventListener('submit', event => {
|
||||||
|
event.preventDefault();
|
||||||
|
fetchAndRender();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cargar gráfico inicial
|
||||||
|
fetchAndRender();
|
||||||
|
});
|
||||||
178
FLUJOS/VISUALIZACION/public/output_int_sec.js
Executable file
|
|
@ -0,0 +1,178 @@
|
||||||
|
// output_int_sec.js
|
||||||
|
|
||||||
|
// Obtener el contenedor del gráfico
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const elem = document.getElementById('intSecContainer');
|
||||||
|
const form = document.getElementById('paramForm');
|
||||||
|
const detailPanel = document.getElementById('detailPanel');
|
||||||
|
|
||||||
|
// --- Etiqueta de texto con CanvasTexture (sin SpriteText externo) ---
|
||||||
|
function makeTextSprite(text) {
|
||||||
|
if (!window.THREE) {
|
||||||
|
console.warn('THREE no está disponible; omito etiquetas.');
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const pad = 16; // más padding para nitidez
|
||||||
|
const font = 'bold 36px Fira Code, monospace'; // fuente más grande
|
||||||
|
|
||||||
|
// 1) preparar canvas al tamaño del texto
|
||||||
|
const c = document.createElement('canvas');
|
||||||
|
const ctx = c.getContext('2d');
|
||||||
|
ctx.font = font;
|
||||||
|
const w = Math.ceil(ctx.measureText(text).width) + pad * 2;
|
||||||
|
const h = 50 + pad * 2;
|
||||||
|
c.width = w; c.height = h;
|
||||||
|
|
||||||
|
// 2) dibujar texto
|
||||||
|
ctx.font = font;
|
||||||
|
ctx.fillStyle = 'rgba(255,255,255,0.98)';
|
||||||
|
ctx.textBaseline = 'middle';
|
||||||
|
ctx.fillText(text, pad, h / 2);
|
||||||
|
|
||||||
|
// 3) textura -> sprite
|
||||||
|
const tex = new THREE.CanvasTexture(c);
|
||||||
|
tex.needsUpdate = true;
|
||||||
|
|
||||||
|
const mat = new THREE.SpriteMaterial({
|
||||||
|
map: tex,
|
||||||
|
transparent: true,
|
||||||
|
depthTest: false, // que no lo tape la esfera
|
||||||
|
depthWrite: false // que no escriba en el z-buffer
|
||||||
|
});
|
||||||
|
const spr = new THREE.Sprite(mat);
|
||||||
|
|
||||||
|
// tamaño del texto en “mundo”
|
||||||
|
const k = 0.22; // ajusta tamaño del texto (↑ más grande, ↓ más pequeño)
|
||||||
|
spr.scale.set(w * k, h * k, 1);
|
||||||
|
|
||||||
|
// elevar el texto sobre el nodo
|
||||||
|
spr.position.y = 8; // sube/baja si lo ves muy pegado
|
||||||
|
|
||||||
|
return spr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inicializar el gráfico 3D
|
||||||
|
const graph = ForceGraph3D()(elem)
|
||||||
|
.backgroundColor('#000000')
|
||||||
|
.nodeLabel('id')
|
||||||
|
.nodeAutoColorBy('group')
|
||||||
|
.nodeVal(1)
|
||||||
|
.linkColor(() => 'blue')
|
||||||
|
// Texto fijo sobre cada nodo (usando CanvasTexture)
|
||||||
|
.nodeThreeObject(n => makeTextSprite(n.id))
|
||||||
|
.nodeThreeObjectExtend(true) // mantiene esfera + texto
|
||||||
|
.onNodeClick(node => showNodeContent(node.content))
|
||||||
|
.onNodeHover(node => { elem.style.cursor = node ? 'pointer' : null; })
|
||||||
|
.forceEngine('d3');
|
||||||
|
// .d3Force('charge', d3.forceManyBody().strength(-400))
|
||||||
|
// .d3Force('link', d3.forceLink().distance(300).strength(1))
|
||||||
|
|
||||||
|
// Centrado automático del gráfico
|
||||||
|
function centerGraph() {
|
||||||
|
setTimeout(() => {
|
||||||
|
const width = elem.clientWidth;
|
||||||
|
const height = elem.clientHeight;
|
||||||
|
graph.zoomToFit(400, Math.min(width, height) * 0.1);
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
window.addEventListener('resize', () => {
|
||||||
|
graph.width(elem.clientWidth);
|
||||||
|
graph.height(elem.clientHeight);
|
||||||
|
centerGraph();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Mostrar contenido del nodo
|
||||||
|
function showNodeContent(content) {
|
||||||
|
if (!detailPanel) {
|
||||||
|
console.log('Contenido del nodo:', content);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
detailPanel.innerHTML = `
|
||||||
|
<h2 style="margin:0 0 8px">Detalle</h2>
|
||||||
|
<pre style="white-space:pre-wrap; line-height:1.35; font-family:'Fira Code', monospace; font-size:14px; color:#e5e5e5;">${content || 'No hay contenido disponible.'}</pre>
|
||||||
|
`;
|
||||||
|
const split = document.querySelector('main.split-screen');
|
||||||
|
if (split) split.classList.add('show-detail');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función para obtener datos del servidor
|
||||||
|
async function getData(paramsObj = {}) {
|
||||||
|
try {
|
||||||
|
let url = '/api/data';
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
|
||||||
|
// Establecer el tema fijo
|
||||||
|
params.append('tema', 'inteligencia y seguridad');
|
||||||
|
|
||||||
|
// Agregar parámetros del formulario, incluyendo complejidad como umbral
|
||||||
|
for (const key in paramsObj) {
|
||||||
|
if (paramsObj[key] !== undefined && paramsObj[key] !== '') {
|
||||||
|
params.append(key, paramsObj[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url += `?${params.toString()}`;
|
||||||
|
console.log('🔎 Fetch URL:', url);
|
||||||
|
|
||||||
|
const response = await fetch(url);
|
||||||
|
if (!response.ok) throw new Error(response.statusText);
|
||||||
|
const data = await response.json();
|
||||||
|
console.log('Datos recibidos del servidor:', data);
|
||||||
|
|
||||||
|
// Filtrar enlaces inválidos
|
||||||
|
const nodeIds = new Set(data.nodes.map(node => node.id));
|
||||||
|
data.links = data.links.filter(link => nodeIds.has(link.source) && nodeIds.has(link.target));
|
||||||
|
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error al obtener datos del servidor:', error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función principal: fetch, filtrar por complejidad/umbral y renderizar
|
||||||
|
async function fetchAndRender() {
|
||||||
|
const subtematica = document.getElementById('param2').value;
|
||||||
|
const palabraClave = document.getElementById('param1').value;
|
||||||
|
const fechaInicio = document.getElementById('fecha_inicio').value;
|
||||||
|
const fechaFin = document.getElementById('fecha_fin').value;
|
||||||
|
const nodos = document.getElementById('nodos').value;
|
||||||
|
const complejidad = document.getElementById('complejidad').value;
|
||||||
|
|
||||||
|
// Usamos 'complejidad' como porcentaje de similitud mínima (umbral)
|
||||||
|
const paramsObj = {
|
||||||
|
subtematica,
|
||||||
|
palabraClave,
|
||||||
|
fechaInicio,
|
||||||
|
fechaFin,
|
||||||
|
nodos,
|
||||||
|
complejidad // enviado al backend y usado de umbral en cliente
|
||||||
|
};
|
||||||
|
|
||||||
|
// Parsear complejidad a número
|
||||||
|
const umbralPct = parseFloat(complejidad) || 0;
|
||||||
|
console.log(`Aplicando umbral de similitud: ${umbralPct}%`);
|
||||||
|
|
||||||
|
const graphData = await getData(paramsObj);
|
||||||
|
if (!graphData) return;
|
||||||
|
|
||||||
|
// Filtrar enlaces por umbral de similitud
|
||||||
|
let filteredLinks = graphData.links;
|
||||||
|
if (umbralPct > 0) {
|
||||||
|
filteredLinks = filteredLinks.filter(link => Number(link.value) >= umbralPct);
|
||||||
|
console.log(`Enlaces tras aplicar umbral: ${filteredLinks.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
graph.graphData({ nodes: graphData.nodes, links: filteredLinks });
|
||||||
|
centerGraph();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escuchar evento submit del formulario
|
||||||
|
form.addEventListener('submit', event => {
|
||||||
|
event.preventDefault();
|
||||||
|
fetchAndRender();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cargar gráfico inicial
|
||||||
|
fetchAndRender();
|
||||||
|
});
|
||||||
122
FLUJOS/VISUALIZACION/public/output_popl_up.js
Executable file
|
|
@ -0,0 +1,122 @@
|
||||||
|
// output_popl_up.js
|
||||||
|
|
||||||
|
// Obtener el contenedor del gráfico
|
||||||
|
const elem = document.getElementById('poplUpContainer');
|
||||||
|
|
||||||
|
// Inicializar el gráfico
|
||||||
|
const graph = ForceGraph3D()(elem)
|
||||||
|
.backgroundColor('#000000')
|
||||||
|
.nodeLabel('id')
|
||||||
|
.nodeAutoColorBy('group')
|
||||||
|
.nodeVal(5)
|
||||||
|
.linkColor(() => 'green')
|
||||||
|
.onNodeClick(node => showNodeContent(node.content))
|
||||||
|
.onNodeHover(node => {
|
||||||
|
elem.style.cursor = node ? 'pointer' : null;
|
||||||
|
})
|
||||||
|
.forceEngine('d3')
|
||||||
|
.d3Force('charge', d3.forceManyBody().strength(-10))
|
||||||
|
.d3Force('link', d3.forceLink().distance(30).strength(1));
|
||||||
|
|
||||||
|
// Función para obtener datos del servidor
|
||||||
|
async function getData(paramsObj = {}) {
|
||||||
|
try {
|
||||||
|
let url = '/api/data';
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
|
||||||
|
// Fijar el tema principal
|
||||||
|
params.append('tema', 'movimientos populares y levantamientos');
|
||||||
|
|
||||||
|
// Agregar otros parámetros si se han definido
|
||||||
|
for (const key in paramsObj) {
|
||||||
|
if (paramsObj[key]) {
|
||||||
|
params.append(key, paramsObj[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url += `?${params.toString()}`;
|
||||||
|
|
||||||
|
const response = await fetch(url);
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
console.log('📦 Datos recibidos:', data);
|
||||||
|
|
||||||
|
// Validar y limpiar links
|
||||||
|
const nodeIds = new Set(data.nodes.map(node => node.id));
|
||||||
|
data.links = data.links.filter(link => {
|
||||||
|
const valid = nodeIds.has(link.source) && nodeIds.has(link.target);
|
||||||
|
if (!valid) {
|
||||||
|
console.log(`❌ Enlace inválido eliminado: ${link.source} -> ${link.target}`);
|
||||||
|
}
|
||||||
|
return valid;
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('⚠️ Error al obtener datos:', error);
|
||||||
|
return { nodes: [], links: [] };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mostrar contenido del nodo en consola (puedes ampliar esta función)
|
||||||
|
function showNodeContent(content) {
|
||||||
|
console.log('🧠 Contenido del nodo:', content);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Centrar el gráfico tras dibujarlo
|
||||||
|
function centerGraph() {
|
||||||
|
setTimeout(() => {
|
||||||
|
const width = elem.clientWidth;
|
||||||
|
const height = elem.clientHeight;
|
||||||
|
const padding = Math.min(width, height) * 0.1;
|
||||||
|
graph.zoomToFit(400, padding);
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Redibujar al cambiar tamaño ventana
|
||||||
|
window.addEventListener('resize', () => {
|
||||||
|
graph.width(elem.clientWidth);
|
||||||
|
graph.height(elem.clientHeight);
|
||||||
|
centerGraph();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Manejar el formulario
|
||||||
|
document.getElementById('paramForm').addEventListener('submit', function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
const subtematica = document.getElementById('param2').value;
|
||||||
|
const palabraClave = document.getElementById('param1').value;
|
||||||
|
const fechaInicio = document.getElementById('fecha_inicio').value;
|
||||||
|
const fechaFin = document.getElementById('fecha_fin').value;
|
||||||
|
const nodos = document.getElementById('nodos').value;
|
||||||
|
const complejidad = document.getElementById('complejidad').value;
|
||||||
|
|
||||||
|
const paramsObj = {
|
||||||
|
subtematica,
|
||||||
|
palabraClave,
|
||||||
|
fechaInicio,
|
||||||
|
fechaFin,
|
||||||
|
nodos,
|
||||||
|
complejidad,
|
||||||
|
};
|
||||||
|
|
||||||
|
getData(paramsObj).then(graphData => {
|
||||||
|
if (graphData) {
|
||||||
|
console.log("✅ Redibujando con nuevos datos...");
|
||||||
|
graph.graphData(graphData);
|
||||||
|
centerGraph();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Obtener datos iniciales
|
||||||
|
getData().then(graphData => {
|
||||||
|
if (graphData && graphData.nodes && graphData.nodes.length > 0) {
|
||||||
|
console.log(`✅ Se recibieron ${graphData.nodes.length} nodos.`);
|
||||||
|
graph.graphData(graphData);
|
||||||
|
centerGraph();
|
||||||
|
} else {
|
||||||
|
console.warn("⚠️ No se recibieron nodos para mostrar.");
|
||||||
|
console.log("🔍 Respuesta completa:", graphData);
|
||||||
|
}
|
||||||
|
});
|
||||||
129
FLUJOS/VISUALIZACION/public/output_popl_up_pruebas.js
Normal file
|
|
@ -0,0 +1,129 @@
|
||||||
|
// output_popl_up_pruebas.js
|
||||||
|
|
||||||
|
// Obtener el contenedor del gráfico
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const elem = document.getElementById('poplUpContainer');
|
||||||
|
const form = document.getElementById('paramForm');
|
||||||
|
|
||||||
|
// Inicializar el gráfico 3D
|
||||||
|
const graph = ForceGraph3D()(elem)
|
||||||
|
.backgroundColor('#000000')
|
||||||
|
.nodeLabel('id')
|
||||||
|
.nodeAutoColorBy('group')
|
||||||
|
.nodeVal(1)
|
||||||
|
.linkColor(() => 'orange')
|
||||||
|
.onNodeClick(node => showNodeContent(node.content))
|
||||||
|
.onNodeHover(node => { elem.style.cursor = node ? 'pointer' : null; })
|
||||||
|
.forceEngine('d3')
|
||||||
|
//.d3Force('charge', d3.forceManyBody().strength(-300))
|
||||||
|
//.d3Force('link', d3.forceLink().distance(300).strength(1));
|
||||||
|
|
||||||
|
// Centrado automático del gráfico
|
||||||
|
function centerGraph() {
|
||||||
|
setTimeout(() => {
|
||||||
|
const width = elem.clientWidth;
|
||||||
|
const height = elem.clientHeight;
|
||||||
|
graph.zoomToFit(400, Math.min(width, height) * 0.1);
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
window.addEventListener('resize', () => {
|
||||||
|
graph.width(elem.clientWidth);
|
||||||
|
graph.height(elem.clientHeight);
|
||||||
|
centerGraph();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Mostrar contenido del nodo
|
||||||
|
function showNodeContent(content) {
|
||||||
|
console.log('Contenido del nodo:', content);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función para obtener datos del servidor
|
||||||
|
async function getData(paramsObj = {}) {
|
||||||
|
try {
|
||||||
|
let url = '/api/data';
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
|
||||||
|
// Establecer el tema fijo
|
||||||
|
params.append('tema', 'demografía y sociedad');
|
||||||
|
|
||||||
|
// Agregar parámetros del formulario, incluyendo complejidad como umbral
|
||||||
|
for (const key in paramsObj) {
|
||||||
|
if (paramsObj[key] !== undefined && paramsObj[key] !== '') {
|
||||||
|
params.append(key, paramsObj[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url += `?${params.toString()}`;
|
||||||
|
console.log('🔎 Fetch URL:', url);
|
||||||
|
|
||||||
|
const response = await fetch(url);
|
||||||
|
if (!response.ok) throw new Error(response.statusText);
|
||||||
|
const data = await response.json();
|
||||||
|
console.log('Datos recibidos del servidor:', data);
|
||||||
|
|
||||||
|
// Filtrar enlaces inválidos
|
||||||
|
const nodeIds = new Set(data.nodes.map(node => node.id));
|
||||||
|
data.links = data.links.filter(link => nodeIds.has(link.source) && nodeIds.has(link.target));
|
||||||
|
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error al obtener datos del servidor:', error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función principal: fetch, filtrar por complejidad/umbral y renderizar
|
||||||
|
async function fetchAndRender() {
|
||||||
|
const subtematica = document.getElementById('param2').value;
|
||||||
|
const palabraClave = document.getElementById('param1').value;
|
||||||
|
const fechaInicio = document.getElementById('fecha_inicio').value;
|
||||||
|
const fechaFin = document.getElementById('fecha_fin').value;
|
||||||
|
const nodos = document.getElementById('nodos').value;
|
||||||
|
const complejidad = document.getElementById('complejidad').value;
|
||||||
|
|
||||||
|
// Usamos 'complejidad' como porcentaje de similitud mínima (umbral)
|
||||||
|
const paramsObj = {
|
||||||
|
subtematica,
|
||||||
|
palabraClave,
|
||||||
|
fechaInicio,
|
||||||
|
fechaFin,
|
||||||
|
nodos,
|
||||||
|
complejidad // enviado al backend y usado de umbral en cliente
|
||||||
|
};
|
||||||
|
|
||||||
|
// Parsear complejidad a número
|
||||||
|
const umbralPct = parseFloat(complejidad) || 0;
|
||||||
|
console.log(`Aplicando umbral de similitud: ${umbralPct}%`);
|
||||||
|
|
||||||
|
const graphData = await getData(paramsObj);
|
||||||
|
if (!graphData) return;
|
||||||
|
|
||||||
|
// Filtrar enlaces por umbral de similitud
|
||||||
|
let filteredLinks = graphData.links;
|
||||||
|
if (umbralPct > 0) {
|
||||||
|
filteredLinks = filteredLinks.filter(link => Number(link.value) >= umbralPct);
|
||||||
|
console.log(`Enlaces tras aplicar umbral: ${filteredLinks.length}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
graph.graphData({ nodes: graphData.nodes, links: filteredLinks });
|
||||||
|
centerGraph();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escuchar evento submit del formulario
|
||||||
|
form.addEventListener('submit', event => {
|
||||||
|
event.preventDefault();
|
||||||
|
fetchAndRender();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cargar gráfico inicial
|
||||||
|
fetchAndRender();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
219
FLUJOS/VISUALIZACION/public/popl-up.css
Executable file
|
|
@ -0,0 +1,219 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: "Retrolift";
|
||||||
|
src: url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff2") format("woff2"),
|
||||||
|
url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff") format("woff");
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: 'Fira Code';
|
||||||
|
text-shadow: 10px 10px 20px rgba(0, 255, 76, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Fira Code', monospace;
|
||||||
|
background: #000000;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
height: 70px;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ffffff;
|
||||||
|
box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
font-family: "Retrolift", sans-serif;
|
||||||
|
font-size: 4em;
|
||||||
|
font-weight: bold;
|
||||||
|
letter-spacing: 4px;
|
||||||
|
text-shadow: 6px 6px 6px #73ff00;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popl-up:hover .logo { text-shadow: 2px 2px 8px #00008b; }
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ff1a1a;
|
||||||
|
padding: 10px 0;
|
||||||
|
box-shadow: 0 10px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
margin-top: 40px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
color: #000000;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
transition: color 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
|
padding: 20px 40px;
|
||||||
|
box-shadow: 0 0 0px rgba(28, 103, 241, 0);
|
||||||
|
position: relative;
|
||||||
|
border: none;
|
||||||
|
transition: .4s ease-in;
|
||||||
|
z-index: 1;
|
||||||
|
width: 40vw;
|
||||||
|
height: 20vh;
|
||||||
|
border: 3vw;
|
||||||
|
align-items: center;
|
||||||
|
border: 3px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
box-shadow: 0 0 6px rgba(0,0,0,0.3);
|
||||||
|
border: 3px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popl-up:hover { color: #0066ff; }
|
||||||
|
.popl-up { color: #FF851B; background-color: orange; }
|
||||||
|
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
height: 100vh;
|
||||||
|
width: 99%;
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background a {
|
||||||
|
display: block;
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img {
|
||||||
|
width: 20%;
|
||||||
|
height: 90vh;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 250px;
|
||||||
|
height: 100vh;
|
||||||
|
background-image: url("/images/flujos7.jpg");
|
||||||
|
background-size: cover;
|
||||||
|
color: #39ff14;
|
||||||
|
padding: 30px;
|
||||||
|
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
|
||||||
|
transform: translateX(-220px);
|
||||||
|
transition: transform 0.3s ease-out;
|
||||||
|
overflow: auto;
|
||||||
|
font-size: 18px;
|
||||||
|
z-index: 3;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar:hover {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar h2 {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
text-shadow: -1px 0 black, 0 3px black, 3px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar label {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input {
|
||||||
|
padding: 10px;
|
||||||
|
border: 2px solid #39ff14;
|
||||||
|
background: black;
|
||||||
|
color: #39ff14;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.2);
|
||||||
|
transition: box-shadow 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input:hover {
|
||||||
|
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"] {
|
||||||
|
color: #39ff14;
|
||||||
|
background: #ff6600;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"]:hover {
|
||||||
|
background: #ff6600;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
width: 100%;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #39ff14;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
z-index: 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a {
|
||||||
|
color: #39ff14;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a:hover {
|
||||||
|
color: #2ECC40;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iframe-container {
|
||||||
|
width: calc(100% - 250px);
|
||||||
|
height: 100vh;
|
||||||
|
background: #000000;
|
||||||
|
margin: 0 auto;
|
||||||
|
border: none;
|
||||||
|
z-index: 1;
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
position: absolute;
|
||||||
|
left: 250px;
|
||||||
|
}
|
||||||
90
FLUJOS/VISUALIZACION/public/popl-up.html
Executable file
|
|
@ -0,0 +1,90 @@
|
||||||
|
+<!DOCTYPE html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Demografía y Sociedad</title>
|
||||||
|
<link rel="stylesheet" href="popl-up.css">
|
||||||
|
|
||||||
|
<!-- Fuentes -->
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;700&display=swap" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- Librerías necesarias -->
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.min.js"></script>
|
||||||
|
<script src="https://unpkg.com/3d-force-graph"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!-- Navegación -->
|
||||||
|
<nav>
|
||||||
|
<ul class="nav-links">
|
||||||
|
<li><a href="popl-up.html" class="popl-up">Demografía y Sociedad</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<!-- Contenedor principal -->
|
||||||
|
<main>
|
||||||
|
<div id="poplUpContainer" style="position: absolute; width: 100%; height: 100%; z-index: 0;"></div>
|
||||||
|
|
||||||
|
<!-- Fondo animado -->
|
||||||
|
<div class="background">
|
||||||
|
<img src="/images/flujos3.jpg">
|
||||||
|
<img src="/images/flujos3.jpg">
|
||||||
|
<img src="/images/flujos3.jpg">
|
||||||
|
<img src="/images/flujos3.jpg">
|
||||||
|
<img src="/images/flujos3.jpg">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
setTimeout(() => {
|
||||||
|
const fondo = document.querySelector('.background');
|
||||||
|
fondo.classList.add('fade-out');
|
||||||
|
fondo.style.pointerEvents = 'none';
|
||||||
|
}, 1000);
|
||||||
|
</script>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<!-- Barra lateral de filtros -->
|
||||||
|
<div id="sidebar">
|
||||||
|
<h2>Parámetros</h2>
|
||||||
|
<form id="paramForm">
|
||||||
|
<label for="fecha_inicio">Fecha de inicio:</label>
|
||||||
|
<input type="date" id="fecha_inicio" name="fecha_inicio">
|
||||||
|
|
||||||
|
<label for="fecha_fin">Fecha de fin:</label>
|
||||||
|
<input type="date" id="fecha_fin" name="fecha_fin">
|
||||||
|
|
||||||
|
<label for="nodos">Nodos:</label>
|
||||||
|
<input type="number" id="nodos" name="nodos" value="100">
|
||||||
|
|
||||||
|
<label for="complejidad">Complejidad:</label>
|
||||||
|
<input type="range" id="complejidad" name="complejidad" min="1" max="40" value="20">
|
||||||
|
|
||||||
|
<label for="param1">Búsqueda por palabra:</label>
|
||||||
|
<input type="text" id="param1" name="param1">
|
||||||
|
|
||||||
|
<label for="param2">Búsqueda por temática personalizada:</label>
|
||||||
|
<input type="text" id="param2" name="param2">
|
||||||
|
|
||||||
|
<input type="submit" value="Aplicar">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Botón para colapsar la barra -->
|
||||||
|
<button id="sidebarToggle">Toggle Sidebar</button>
|
||||||
|
|
||||||
|
<!-- Footer -->
|
||||||
|
<footer>
|
||||||
|
<p>
|
||||||
|
<a href="#">GitHub</a> |
|
||||||
|
<a href="#">Telegram</a> |
|
||||||
|
<a href="#">Email</a> |
|
||||||
|
<a href="#">Web de Tor</a>
|
||||||
|
</p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Script principal -->
|
||||||
|
<script src="output_popl_up_pruebas.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
72
FLUJOS/VISUALIZACION/public/script_eco-corp.css
Executable file
|
|
@ -0,0 +1,72 @@
|
||||||
|
:root {
|
||||||
|
--cube-size: 70px; /* Tamaño reducido de los cubos */
|
||||||
|
--line-color: #333;
|
||||||
|
--hover-color: #2ecc71;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph-container {
|
||||||
|
position: relative;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
background-color: #000;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
margin: 20px auto;
|
||||||
|
perspective: 1000px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cube-container {
|
||||||
|
position: absolute;
|
||||||
|
width: var(--cube-size);
|
||||||
|
height: var(--cube-size);
|
||||||
|
transform-style: preserve-3d;
|
||||||
|
transition: transform 1s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cube-container:hover {
|
||||||
|
transform: rotateX(360deg) rotateY(360deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cube {
|
||||||
|
position: absolute;
|
||||||
|
width: var(--cube-size);
|
||||||
|
height: var(--cube-size);
|
||||||
|
transform-style: preserve-3d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.face {
|
||||||
|
position: absolute;
|
||||||
|
width: var(--cube-size);
|
||||||
|
height: var(--cube-size);
|
||||||
|
background-color: var(--hover-color);
|
||||||
|
border: 1px solid #000;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Posiciones de las caras del cubo */
|
||||||
|
.front { transform: translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
.back { transform: rotateY(180deg) translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
.left { transform: rotateY(-90deg) translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
.right { transform: rotateY(90deg) translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
.top { transform: rotateX(90deg) translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
.bottom { transform: rotateX(-90deg) translateZ(calc(var(--cube-size) / 2)); }
|
||||||
|
|
||||||
|
.lines {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line-path {
|
||||||
|
stroke: var(--line-color);
|
||||||
|
stroke-width: 2;
|
||||||
|
transition: stroke 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line-path:hover {
|
||||||
|
stroke: #e74c3c;
|
||||||
|
}
|
||||||
82
FLUJOS/VISUALIZACION/public/script_eco-corp.html
Executable file
|
|
@ -0,0 +1,82 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Noticias de Guerras y Conflictos Políticos - Disposición Aleatoria</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="script_eco-corp.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Noticias de Guerras y Conflictos Políticos - Últimos 10 años</h1>
|
||||||
|
<div class="graph-container" id="graph-container">
|
||||||
|
<!-- Los cubos serán añadidos dinámicamente con JavaScript -->
|
||||||
|
<svg class="lines" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" id="svg-lines">
|
||||||
|
<!-- Las flechas también serán generadas dinámicamente -->
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const numCubes = 5; // Número de cubos
|
||||||
|
const graphContainer = document.getElementById('graph-container');
|
||||||
|
const svgLines = document.getElementById('svg-lines');
|
||||||
|
let cubePositions = [];
|
||||||
|
|
||||||
|
// Función para generar una posición aleatoria dentro del contenedor
|
||||||
|
function getRandomPosition(maxWidth, maxHeight) {
|
||||||
|
return {
|
||||||
|
x: Math.floor(Math.random() * (maxWidth - 100)),
|
||||||
|
y: Math.floor(Math.random() * (maxHeight - 100))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función para generar cubos aleatoriamente
|
||||||
|
function generateCubes(num) {
|
||||||
|
for (let i = 0; i < num; i++) {
|
||||||
|
const position = getRandomPosition(window.innerWidth, window.innerHeight);
|
||||||
|
const cubeContainer = document.createElement('div');
|
||||||
|
cubeContainer.classList.add('cube-container');
|
||||||
|
cubeContainer.style.top = position.y + 'px';
|
||||||
|
cubeContainer.style.left = position.x + 'px';
|
||||||
|
|
||||||
|
cubeContainer.innerHTML = `
|
||||||
|
<div class="cube">
|
||||||
|
<div class="face front">País ${i+1}</div>
|
||||||
|
<div class="face back">Detalle ${i+1}</div>
|
||||||
|
<div class="face left">Año ${2010 + i}</div>
|
||||||
|
<div class="face right">Muertos ${(i+1)*1000}</div>
|
||||||
|
<div class="face top">ONU</div>
|
||||||
|
<div class="face bottom">Fuente</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
cubePositions.push({x: position.x + 35, y: position.y + 35}); // Ajustar al centro del cubo
|
||||||
|
graphContainer.appendChild(cubeContainer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Función para generar las flechas que conectan los cubos
|
||||||
|
function generateLines() {
|
||||||
|
for (let i = 0; i < cubePositions.length - 1; i++) {
|
||||||
|
const x1 = cubePositions[i].x;
|
||||||
|
const y1 = cubePositions[i].y;
|
||||||
|
const x2 = cubePositions[i + 1].x;
|
||||||
|
const y2 = cubePositions[i + 1].y;
|
||||||
|
|
||||||
|
const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
|
||||||
|
line.setAttribute('x1', x1);
|
||||||
|
line.setAttribute('y1', y1);
|
||||||
|
line.setAttribute('x2', x2);
|
||||||
|
line.setAttribute('y2', y2);
|
||||||
|
line.setAttribute('stroke', '#333');
|
||||||
|
line.setAttribute('stroke-width', '2');
|
||||||
|
|
||||||
|
svgLines.appendChild(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generar cubos y flechas al cargar la página
|
||||||
|
generateCubes(numCubes);
|
||||||
|
generateLines();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
995
FLUJOS/VISUALIZACION/public/styles.css
Executable file
|
|
@ -0,0 +1,995 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: "Retrolift";
|
||||||
|
src: url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff2") format("woff2"),
|
||||||
|
url("/home/pancho/PROGRAMACION/FLUJOS/retrolift.woff") format("woff");
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: 'Fira Code';
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Fira Code', monospace;
|
||||||
|
background: #000000;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
position: relative;
|
||||||
|
height: 120px;
|
||||||
|
background-color: #000000;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-family: 'Nosifer';
|
||||||
|
color: #ffffff;
|
||||||
|
font-size: 6.5rem;
|
||||||
|
margin: 0 auto;
|
||||||
|
line-height: 1.2;
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-content {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
max-width: 1200px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-buttons {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: absolute;
|
||||||
|
top: 70%;
|
||||||
|
right: 10px;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-right: 3px;
|
||||||
|
padding: 4px 8px;
|
||||||
|
font-size: 10px;
|
||||||
|
color: #ffffff;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: #000000;
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
border-radius: 20px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button:hover {
|
||||||
|
background-color: #ffffff;
|
||||||
|
color: #000000;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #ff1a1a;
|
||||||
|
padding: 10px 0;
|
||||||
|
box-shadow: 0 10px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
margin-top: 40px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 14em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
color: #000000;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: bold;
|
||||||
|
transition: color 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
|
padding: 20px 40px;
|
||||||
|
box-shadow: 0 0 0px rgba(28, 103, 241, 0);
|
||||||
|
position: relative;
|
||||||
|
border: none;
|
||||||
|
transition: .4s ease-in;
|
||||||
|
z-index: 1;
|
||||||
|
width: 40vw;
|
||||||
|
height: 20vh;
|
||||||
|
border: 3vw;
|
||||||
|
align-items: center;
|
||||||
|
border: 3px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
box-shadow: 0 0 6px rgba(0,0,0,0.3);
|
||||||
|
box-shadow: 2vw 1vw;
|
||||||
|
border: 3px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glob-war:hover { color: #39ff14; }
|
||||||
|
.int-sec:hover { color: #ff69b4; }
|
||||||
|
.climate:hover { color: #ff4500; }
|
||||||
|
.eco-corp:hover { color: #00fff2; }
|
||||||
|
.popl-up:hover { color: #0066ff; }
|
||||||
|
|
||||||
|
.glob-war {
|
||||||
|
color: #FF4136;
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.int-sec {
|
||||||
|
color: #0074D9;
|
||||||
|
background-color: darkblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.climate {
|
||||||
|
color: #2ECC40;
|
||||||
|
background-color: lightgreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eco-corp {
|
||||||
|
color: #FFDC00;
|
||||||
|
background-color: yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popl-up {
|
||||||
|
color: #FF851B;
|
||||||
|
background-color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center; /* Centrar horizontalmente */
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
overflow-x: hidden; /* Oculta cualquier posible desplazamiento horizontal */
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background a {
|
||||||
|
display: block;
|
||||||
|
flex: 1; /* Asegura que cada imagen se expanda uniformemente para ocupar todo el espacio disponible */
|
||||||
|
height: 100%;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
transition: transform 1.5s ease;
|
||||||
|
margin: 0; /* Elimina cualquier margen alrededor de las imágenes */
|
||||||
|
}
|
||||||
|
|
||||||
|
.background img:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#sidebar.active {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 250px;
|
||||||
|
height: 100vh;
|
||||||
|
background-image: url("/images/flujos7.jpg");
|
||||||
|
background-size: cover;
|
||||||
|
color: #39ff14;
|
||||||
|
padding: 30px;
|
||||||
|
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
|
||||||
|
transform: translateX(-90%);
|
||||||
|
transition: transform 0.3s ease-out;
|
||||||
|
overflow: auto;
|
||||||
|
font-size: 18px;
|
||||||
|
z-index: 3;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar h2 {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
text-shadow: -1px 0 black, 0 3px black, 3px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar:hover {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebarToggle {
|
||||||
|
position: absolute;
|
||||||
|
left: 1em;
|
||||||
|
top: 1em;
|
||||||
|
background: #007BFF;
|
||||||
|
color: #39ff14;
|
||||||
|
border: none;
|
||||||
|
padding: 10px 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 5px;
|
||||||
|
transition: background 0.3s ease;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebarToggle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar label {
|
||||||
|
color: #39ff14;
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input {
|
||||||
|
padding: 10px;
|
||||||
|
border: 2px solid #39ff14;
|
||||||
|
background: black;
|
||||||
|
color: #39ff14;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.2);
|
||||||
|
transition: box-shadow 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input:hover {
|
||||||
|
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"] {
|
||||||
|
color: #39ff14;
|
||||||
|
background: #ff6600;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar input[type="submit"]:hover {
|
||||||
|
background: #ff6600;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
width: 100%;
|
||||||
|
background-color: #000000;
|
||||||
|
color: #39ff14;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a {
|
||||||
|
color: #39ff14;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer a:hover {
|
||||||
|
color: #2ECC40;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#canvasContainer {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
opacity: 0.5;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-overlay {
|
||||||
|
position: absolute;
|
||||||
|
top: 100px;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: calc(100% - 100px);
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px; /* Incrementa el espacio entre botones */
|
||||||
|
width: 13%; /* Reducido el ancho de las columnas de botones */
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
display: block;
|
||||||
|
padding: 10px 15px; /* Ajustar para reducir el tamaño del botón */
|
||||||
|
color: #ffffff;
|
||||||
|
font-weight: bold; /* Hacer el texto más grueso */
|
||||||
|
text-decoration: none;
|
||||||
|
border-radius: 30px; /* Bordes redondeados para un efecto de cilindro */
|
||||||
|
font-size: 1em;
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
background-color: black; /* Fondo negro */
|
||||||
|
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
color: #ffffff;
|
||||||
|
background-color: transparent;
|
||||||
|
box-shadow: 0 0 10px rgba(255, 255, 255, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Media Queries for larger screens */
|
||||||
|
@media screen and (max-width: 1920px) {
|
||||||
|
.background a {
|
||||||
|
width: 18%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 18%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 1.1em;
|
||||||
|
padding: 16px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 1em;
|
||||||
|
padding: 8px 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 14em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1600px) {
|
||||||
|
.background a {
|
||||||
|
width: 20%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 20%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 1em;
|
||||||
|
padding: 14px 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 6.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.9em;
|
||||||
|
padding: 7px 13px;
|
||||||
|
}
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1440px) {
|
||||||
|
.background a {
|
||||||
|
width: 22%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 22%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.95em;
|
||||||
|
padding: 12px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.85em;
|
||||||
|
padding: 6px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.85em;
|
||||||
|
padding: 16px 30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1280px) {
|
||||||
|
.background a {
|
||||||
|
width: 25%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 25%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.5em;
|
||||||
|
padding: 10px 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 5.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.4em;
|
||||||
|
padding: 6px 11px;
|
||||||
|
}
|
||||||
|
.nav-links {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
gap: 5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1024px) {
|
||||||
|
.background a {
|
||||||
|
width: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.35em;
|
||||||
|
padding: 9px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.75em;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.75em;
|
||||||
|
padding: 12px 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Para teléfonos de 768px de ancho en portrait */
|
||||||
|
@media screen and (max-width: 768px) and (orientation: portrait) {
|
||||||
|
.background a {
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 90%;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.6rem;
|
||||||
|
padding: 6px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 2px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
gap: 2em; /* Reduce el espacio entre los enlaces del nav */
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
padding: 8px 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Para teléfonos de 576px de ancho en portrait */
|
||||||
|
@media screen and (max-width: 576px) and (orientation: portrait) {
|
||||||
|
.background a {
|
||||||
|
width: 95%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 95%;
|
||||||
|
gap: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 5px 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 4px 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
gap: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.4rem;
|
||||||
|
padding: 7px 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Para teléfonos de 411px de ancho en portrait */
|
||||||
|
@media screen and (max-width: 411px) and (orientation: portrait) {
|
||||||
|
.background a {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 100%;
|
||||||
|
gap: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.4rem;
|
||||||
|
padding: 4px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 4px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
gap: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.6rem;
|
||||||
|
padding: 6px 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Para teléfonos de 375px de ancho en portrait */
|
||||||
|
@media screen and (max-width: 375px) and (orientation: portrait) {
|
||||||
|
.background a {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 100%;
|
||||||
|
gap: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.35rem;
|
||||||
|
padding: 3px 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.35rem;
|
||||||
|
padding: 3px 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
gap: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.5rem;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Para teléfonos de 320px de ancho en portrait */
|
||||||
|
@media screen and (max-width: 320px) and (orientation: portrait) {
|
||||||
|
.background a {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 100%;
|
||||||
|
gap: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 2px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 2px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
gap: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.4rem;
|
||||||
|
padding: 4px 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* For devices with smaller screens (e.g., 600px - 800px width) */
|
||||||
|
@media screen and (min-width: 600px) and (max-width: 800px) and (max-height: 400px) and (orientation: landscape) {
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-overlay {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: flex-end;
|
||||||
|
height: 100%;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 15%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-end;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 2px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 2px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.3rem; /* Reduced font size */
|
||||||
|
padding: 15px 30px; /* Adjusted padding */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For medium-sized devices (e.g., 800px - 1000px width) */
|
||||||
|
@media screen and (min-width: 800px) and (max-width: 1000px) and (max-height: 450px) and (orientation: landscape) {
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-overlay {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: flex-end;
|
||||||
|
height: 100%;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 16%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-end;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.35rem;
|
||||||
|
padding: 3px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.35rem;
|
||||||
|
padding: 3px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.3rem; /* Reduced font size */
|
||||||
|
padding: 15px 30px; /* Adjusted padding */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For larger devices (e.g., 1000px - 1200px width) */
|
||||||
|
@media screen and (min-width: 1000px) and (max-width: 1200px) and (max-height: 500px) and (orientation: landscape) {
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-overlay {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: flex-end;
|
||||||
|
height: 100%;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 17%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-end;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.4rem;
|
||||||
|
padding: 3px 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.35rem;
|
||||||
|
padding: 3px 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.3rem; /* Reduced font size */
|
||||||
|
padding: 15px 30px; /* Adjusted padding */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For even larger devices (e.g., 1200px - 1500px width) */
|
||||||
|
@media screen and (min-width: 1200px) and (max-width: 1500px) and (max-height: 700px) and (orientation: landscape) {
|
||||||
|
.background {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-overlay {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: flex-end;
|
||||||
|
height: 100%;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 18%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-end;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.45rem;
|
||||||
|
padding: 4px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.35rem;
|
||||||
|
padding: 4px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.3rem; /* Reduced font size */
|
||||||
|
padding: 15px 30px; /* Adjusted padding */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media screen and (max-width: 800px) and (orientation: landscape) {
|
||||||
|
.background a {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 20%;
|
||||||
|
gap: 5px;
|
||||||
|
margin-top: 40px; /* Push buttons down to avoid navbar */
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.35rem;
|
||||||
|
padding: 2px 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.35rem;
|
||||||
|
padding: 2px 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.35rem;
|
||||||
|
padding: 2px 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For devices with width around 700px */
|
||||||
|
@media screen and (max-width: 700px) and (orientation: landscape) {
|
||||||
|
.background a {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 25%;
|
||||||
|
gap: 5px;
|
||||||
|
margin-top: 50px; /* Further adjustment */
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 2px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 2px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.3rem;
|
||||||
|
padding: 2px 3px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For smaller devices with width around 600px */
|
||||||
|
@media screen and (max-width: 600px) and (orientation: landscape) {
|
||||||
|
.background a {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 30%;
|
||||||
|
gap: 5px;
|
||||||
|
margin-top: 60px; /* Ensures the buttons are well below the navbar */
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.4rem;
|
||||||
|
padding: 3px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.5rem;
|
||||||
|
padding: 3px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.5rem;
|
||||||
|
padding: 3px 5px;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Landscape mode for screens up to 480px wide */
|
||||||
|
@media screen and (max-width: 480px) and (orientation: landscape) {
|
||||||
|
.button-overlay {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: flex-end;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-column {
|
||||||
|
width: 28%;
|
||||||
|
gap: 2px;
|
||||||
|
margin-top:150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-button {
|
||||||
|
font-size: 0.45rem;
|
||||||
|
padding: 3px 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-button {
|
||||||
|
font-size: 0.45rem;
|
||||||
|
padding: 3px 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
font-size: 0.45rem;
|
||||||
|
padding: 3px 4px;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
12
FLUJOS/VISUALIZACION/routes/index.js
Executable file
|
|
@ -0,0 +1,12 @@
|
||||||
|
//Las rutas en Express.js son maneras de definir cómo responde tu aplicación a las solicitudes de los clientes
|
||||||
|
//en ciertos endpoints URI,
|
||||||
|
// que son caminos o rutas a los que los clientes pueden acceder. Las rutas pueden ser creadas y manejadas en el archivo principal de tu aplicación
|
||||||
|
//, pero para proyectos más grandes, generalmente se separan en su propio archivo o módulo para mantener el código organizado y legible.
|
||||||
|
const express = require('express');
|
||||||
|
const router = express.Router();
|
||||||
|
|
||||||
|
router.get('/', (req, res) => {
|
||||||
|
res.send('Estás en la página de inicio.');
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
||||||
8
FLUJOS/VISUALIZACION/routes/users.js
Executable file
|
|
@ -0,0 +1,8 @@
|
||||||
|
const express = require('express');
|
||||||
|
const router = express.Router();
|
||||||
|
|
||||||
|
router.get('/', (req, res) => {
|
||||||
|
res.send('Estás en la página de usuarios.');
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
||||||
6
FLUJOS/package-lock.json
generated
Executable file
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"name": "FLUJOS",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {}
|
||||||
|
}
|
||||||
43
FLUJOS_DATOS/COMPARACIONES/dividendos.py
Executable file
|
|
@ -0,0 +1,43 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
def dividir_archivo_grande(input_file, output_dir, lineas_por_archivo=1000000):
|
||||||
|
try:
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
with open(input_file, 'r') as f_in:
|
||||||
|
archivo_indice = 1
|
||||||
|
f_out = open(os.path.join(output_dir, f'parte_{archivo_indice}.txt'), 'w')
|
||||||
|
for i, linea in enumerate(f_in):
|
||||||
|
if i % lineas_por_archivo == 0 and i > 0:
|
||||||
|
f_out.close()
|
||||||
|
archivo_indice += 1
|
||||||
|
f_out = open(os.path.join(output_dir, f'parte_{archivo_indice}.txt'), 'w')
|
||||||
|
f_out.write(linea)
|
||||||
|
f_out.close()
|
||||||
|
print(f"Archivo '{input_file}' dividido en {archivo_indice} partes en '{output_dir}'")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error al dividir el archivo '{input_file}': {e}")
|
||||||
|
|
||||||
|
def procesar_comparaciones():
|
||||||
|
# Directorio base
|
||||||
|
base_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'FLUJOS_DATOS', 'COMPARACIONES')
|
||||||
|
|
||||||
|
# Definir los nombres de las comparaciones y sus carpetas correspondientes
|
||||||
|
comparaciones = {
|
||||||
|
'wikipedia_vs_noticias': 'wikipedia_vs_noticias.txt',
|
||||||
|
'wikipedia_vs_torrents': 'wikipedia_vs_torrents.txt',
|
||||||
|
'torrents_vs_noticias': 'torrents_vs_noticias.txt'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configurar las rutas de salida
|
||||||
|
for nombre_carpeta, nombre_archivo in comparaciones.items():
|
||||||
|
input_file = os.path.join(base_dir, nombre_archivo)
|
||||||
|
output_dir = os.path.join(base_dir, nombre_carpeta)
|
||||||
|
|
||||||
|
# Verificar si el archivo de entrada existe
|
||||||
|
if os.path.exists(input_file):
|
||||||
|
dividir_archivo_grande(input_file, output_dir, lineas_por_archivo=1000000)
|
||||||
|
else:
|
||||||
|
print(f"El archivo '{input_file}' no existe. No se puede dividir.")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
procesar_comparaciones()
|
||||||
254
FLUJOS_DATOS/COMPARACIONES/pipeline_completo.py
Executable file
|
|
@ -0,0 +1,254 @@
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import logging
|
||||||
|
from logging.handlers import RotatingFileHandler
|
||||||
|
from collections import Counter
|
||||||
|
from datetime import datetime
|
||||||
|
from pymongo import MongoClient
|
||||||
|
from tqdm import tqdm
|
||||||
|
from multiprocessing import Pool, cpu_count
|
||||||
|
import psutil
|
||||||
|
import string
|
||||||
|
import nltk
|
||||||
|
from nltk.corpus import stopwords
|
||||||
|
|
||||||
|
# Descargar stopwords la primera vez
|
||||||
|
nltk.download('stopwords')
|
||||||
|
stop_words = set(stopwords.words('spanish'))
|
||||||
|
|
||||||
|
# Parámetros de configuración
|
||||||
|
SIMILARITY_THRESHOLD = 4.0
|
||||||
|
LOG_FILE = "pipeline_mongolo.log"
|
||||||
|
NUM_PROCESOS = 4 # Limitar a 4 procesos
|
||||||
|
|
||||||
|
# Configuración de logging con rotación de archivos
|
||||||
|
logger = logging.getLogger()
|
||||||
|
logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
handler = RotatingFileHandler(LOG_FILE, maxBytes=10*1024*1024, backupCount=5) # 10 MB por archivo, 5 archivos de respaldo
|
||||||
|
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
handler.setFormatter(formatter)
|
||||||
|
|
||||||
|
logger.addHandler(handler)
|
||||||
|
|
||||||
|
# Función para iniciar un cliente MongoDB
|
||||||
|
def init_mongo_client():
|
||||||
|
"""Inicializa un nuevo cliente MongoDB para cada proceso."""
|
||||||
|
return MongoClient('localhost', 27017)
|
||||||
|
|
||||||
|
# Función para preprocesar el texto
|
||||||
|
def preprocesar_texto(texto):
|
||||||
|
# Eliminar signos de puntuación
|
||||||
|
texto = texto.translate(str.maketrans('', '', string.punctuation))
|
||||||
|
# Convertir a minúsculas
|
||||||
|
texto = texto.lower()
|
||||||
|
# Eliminar stop words
|
||||||
|
palabras = texto.split()
|
||||||
|
palabras = [word for word in palabras if word not in stop_words]
|
||||||
|
return ' '.join(palabras)
|
||||||
|
|
||||||
|
# Función para asignar tema y subtema basado en el contenido del texto
|
||||||
|
def asignar_tema_y_subtema(texto):
|
||||||
|
tematicas = {
|
||||||
|
'inteligencia y seguridad': ['inteligencia', 'ciberseguridad', 'espionaje', 'seguridad nacional', 'contraterrorismo'],
|
||||||
|
'cambio climático': ['cambio climático', 'desastres naturales', 'conservación', 'energía renovable', 'escasez de agua'],
|
||||||
|
'guerra global': ['conflictos internacionales', 'guerras civiles', 'terrorismo', 'armas', 'alianzas militares'],
|
||||||
|
'demografía y sociedad': ['sobrepoblación', 'enfermedades', 'migraciones', 'urbanización', 'despoblación rural'],
|
||||||
|
'economía y corporaciones': ['economía global', 'corporaciones multinacionales', 'comercio internacional', 'organismos financieros', 'desigualdad económica']
|
||||||
|
}
|
||||||
|
|
||||||
|
texto_lower = texto.lower()
|
||||||
|
for tema, palabras_clave in tematicas.items():
|
||||||
|
for palabra_clave in palabras_clave:
|
||||||
|
if palabra_clave in texto_lower:
|
||||||
|
return tema, palabra_clave
|
||||||
|
return 'otros', 'general'
|
||||||
|
|
||||||
|
# Función para extraer la fecha del nombre del archivo
|
||||||
|
def extraer_fecha_de_nombre(nombre_archivo):
|
||||||
|
try:
|
||||||
|
fecha_str = re.search(r'\d{4}-\d{2}-\d{2}', nombre_archivo).group(0)
|
||||||
|
return datetime.strptime(fecha_str, '%Y-%m-%d')
|
||||||
|
except:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Función para contar palabras en un archivo tokenizado
|
||||||
|
def contar_palabras(nombre_archivo):
|
||||||
|
try:
|
||||||
|
with open(nombre_archivo, 'r', encoding='utf-8') as f:
|
||||||
|
palabras = f.read().split()
|
||||||
|
return Counter(palabras)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al contar palabras en {nombre_archivo}: {e}")
|
||||||
|
return Counter()
|
||||||
|
|
||||||
|
# Función para comparar dos archivos y calcular el porcentaje de similitud
|
||||||
|
def comparar_archivos(archivo1, archivo2):
|
||||||
|
try:
|
||||||
|
conteo1 = contar_palabras(archivo1)
|
||||||
|
conteo2 = contar_palabras(archivo2)
|
||||||
|
|
||||||
|
palabras_comunes = set(conteo1.keys()) & set(conteo2.keys())
|
||||||
|
num_palabras_comunes = sum(min(conteo1[p], conteo2[p]) for p in palabras_comunes)
|
||||||
|
num_palabras_totales = sum(conteo1.values()) + sum(conteo2.values())
|
||||||
|
|
||||||
|
if num_palabras_totales == 0:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
porcentaje_similitud = (num_palabras_comunes / num_palabras_totales) * 100
|
||||||
|
return porcentaje_similitud
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al comparar archivos {archivo1} y {archivo2}: {e}", exc_info=True)
|
||||||
|
return 0 # Retornar 0 en caso de error
|
||||||
|
|
||||||
|
# Función paralelizada para manejar las comparaciones
|
||||||
|
def manejar_comparacion_multiproceso(pair):
|
||||||
|
archivo1, archivo2 = pair
|
||||||
|
try:
|
||||||
|
# Inicia MongoDB dentro del proceso
|
||||||
|
client = init_mongo_client()
|
||||||
|
db = client['FLUJOS_DATOS']
|
||||||
|
comparaciones_collection = db['comparaciones']
|
||||||
|
|
||||||
|
nombre_archivo1 = os.path.basename(archivo1)
|
||||||
|
nombre_archivo2 = os.path.basename(archivo2)
|
||||||
|
|
||||||
|
porcentaje = comparar_archivos(archivo1, archivo2)
|
||||||
|
comparacion = {
|
||||||
|
'noticia1': nombre_archivo1,
|
||||||
|
'noticia2': nombre_archivo2,
|
||||||
|
'porcentaje_similitud': porcentaje
|
||||||
|
}
|
||||||
|
|
||||||
|
comparaciones_collection.insert_one(comparacion)
|
||||||
|
logging.info(f"Guardada comparación entre {nombre_archivo1} y {nombre_archivo2} con {porcentaje:.2f}% de similitud.")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al manejar comparación {archivo1} vs {archivo2}: {e}", exc_info=True)
|
||||||
|
finally:
|
||||||
|
client.close()
|
||||||
|
|
||||||
|
# Función para verificar si el documento ya fue procesado
|
||||||
|
def documento_ya_subido(nombre_archivo, collection):
|
||||||
|
return collection.find_one({"archivo": nombre_archivo}) is not None
|
||||||
|
|
||||||
|
# Función para subir documentos a MongoDB
|
||||||
|
def subir_documento_a_mongodb(nombre_archivo, tema, subtema, fecha, texto, collection):
|
||||||
|
documento = {
|
||||||
|
'archivo': nombre_archivo,
|
||||||
|
'tema': tema,
|
||||||
|
'subtema': subtema,
|
||||||
|
'fecha': fecha,
|
||||||
|
'texto': texto # Subimos el texto original
|
||||||
|
}
|
||||||
|
try:
|
||||||
|
collection.insert_one(documento)
|
||||||
|
logging.info(f"Subido documento: {nombre_archivo} con tema: {tema}, subtema: {subtema}.")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al subir documento {nombre_archivo}: {e}")
|
||||||
|
|
||||||
|
# Función para procesar documentos y subirlos a MongoDB
|
||||||
|
def procesar_documentos(directorio, collection):
|
||||||
|
archivos = [os.path.join(directorio, f) for f in os.listdir(directorio)]
|
||||||
|
print(f"Procesando {len(archivos)} archivos en el directorio: {directorio}")
|
||||||
|
|
||||||
|
# Subir documentos a MongoDB
|
||||||
|
with tqdm(total=len(archivos), desc=f"Subiendo documentos a MongoDB ({collection.name})", ncols=100) as pbar:
|
||||||
|
for archivo in archivos:
|
||||||
|
nombre_archivo = os.path.basename(archivo)
|
||||||
|
if documento_ya_subido(nombre_archivo, collection):
|
||||||
|
logging.info(f"Saltando {nombre_archivo}, ya está subido.")
|
||||||
|
pbar.update(1)
|
||||||
|
continue
|
||||||
|
|
||||||
|
fecha = extraer_fecha_de_nombre(nombre_archivo)
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(archivo, 'r', encoding='utf-8') as f:
|
||||||
|
texto_original = f.read()
|
||||||
|
texto_preprocesado = preprocesar_texto(texto_original)
|
||||||
|
tema, subtema = asignar_tema_y_subtema(texto_preprocesado)
|
||||||
|
subir_documento_a_mongodb(nombre_archivo, tema, subtema, fecha, texto_original, collection)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al procesar archivo {archivo}: {e}")
|
||||||
|
|
||||||
|
pbar.update(1)
|
||||||
|
|
||||||
|
def manejar_comparaciones_multiproceso(directorios_tokenized):
|
||||||
|
try:
|
||||||
|
archivos_tokenizados = []
|
||||||
|
for directorio in directorios_tokenized:
|
||||||
|
archivos_directorio = [os.path.join(directorio, f) for f in os.listdir(directorio)]
|
||||||
|
archivos_tokenizados.append(archivos_directorio)
|
||||||
|
|
||||||
|
# Generar pares de archivos para comparar (combinaciones entre directorios)
|
||||||
|
pairs = []
|
||||||
|
for i in range(len(archivos_tokenizados)):
|
||||||
|
for j in range(i+1, len(archivos_tokenizados)):
|
||||||
|
for archivo1 in archivos_tokenizados[i]:
|
||||||
|
for archivo2 in archivos_tokenizados[j]:
|
||||||
|
pairs.append((archivo1, archivo2))
|
||||||
|
|
||||||
|
total_pairs = len(pairs)
|
||||||
|
logging.info(f"Total de pares a comparar: {total_pairs}")
|
||||||
|
|
||||||
|
# Procesar las comparaciones en lotes más pequeños para reducir el uso de memoria
|
||||||
|
batch_size = 1000 # Tamaño del lote
|
||||||
|
num_batches = (total_pairs // batch_size) + 1
|
||||||
|
|
||||||
|
logging.info(f"Procesando en {num_batches} lotes de {batch_size} pares cada uno.")
|
||||||
|
|
||||||
|
for batch_num in range(num_batches):
|
||||||
|
batch_start = batch_num * batch_size
|
||||||
|
batch_end = min(batch_start + batch_size, total_pairs)
|
||||||
|
batch_pairs = pairs[batch_start:batch_end]
|
||||||
|
|
||||||
|
logging.info(f"Procesando lote {batch_num + 1}/{num_batches}")
|
||||||
|
|
||||||
|
with Pool(processes=NUM_PROCESOS) as pool:
|
||||||
|
list(tqdm(pool.imap_unordered(manejar_comparacion_multiproceso, batch_pairs), total=len(batch_pairs), desc=f"Comparando archivos (Lote {batch_num + 1})", ncols=100))
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error en manejar_comparaciones_multiproceso: {e}", exc_info=True)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
try:
|
||||||
|
# Rutas absolutas de los archivos en formato txt
|
||||||
|
carpeta_noticias_txt = '/var/www/theflows.net/flujos/FLUJOS_DATOS/NOTICIAS/articulos'
|
||||||
|
carpeta_wikipedia_txt = '/var/www/theflows.net/flujos/FLUJOS_DATOS/WIKIPEDIA/articulos_wikipedia'
|
||||||
|
carpeta_torrents_txt = '/var/www/theflows.net/flujos/FLUJOS_DATOS/TORRENTS/TORRENTS_WIKILEAKS_COMPLETO/txt'
|
||||||
|
|
||||||
|
# Carpetas con los archivos tokenizados para hacer las comparaciones
|
||||||
|
carpeta_noticias_tokenized = '/var/www/theflows.net/flujos/FLUJOS_DATOS/NOTICIAS/tokenized'
|
||||||
|
carpeta_wikipedia_tokenized = '/var/www/theflows.net/flujos/FLUJOS_DATOS/WIKIPEDIA/articulos_tokenizados'
|
||||||
|
carpeta_torrents_tokenized = '/var/www/theflows.net/flujos/FLUJOS_DATOS/TORRENTS/TORRENTS_WIKILEAKS_COMPLETO/tokenized'
|
||||||
|
|
||||||
|
# Iniciar cliente MongoDB
|
||||||
|
client = init_mongo_client()
|
||||||
|
|
||||||
|
# Omitir la subida de documentos
|
||||||
|
print("Subiendo archivos originales de Noticias a MongoDB...")
|
||||||
|
logging.info("Iniciando subida de noticias a MongoDB")
|
||||||
|
procesar_documentos(carpeta_noticias_txt, client['FLUJOS_DATOS']['noticias'])
|
||||||
|
logging.info("Finalizada subida de noticias a MongoDB")
|
||||||
|
|
||||||
|
# print("Subiendo archivos originales de Wikipedia a MongoDB...")
|
||||||
|
logging.info("Iniciando subida de Wikipedia a MongoDB")
|
||||||
|
procesar_documentos(carpeta_wikipedia_txt, client['FLUJOS_DATOS']['wikipedia'])
|
||||||
|
logging.info("Finalizada subida de Wikipedia a MongoDB")
|
||||||
|
|
||||||
|
# print("Subiendo archivos originales de TORRENTS a MongoDB...")
|
||||||
|
logging.info("Iniciando subida de TORRENTS a MongoDB")
|
||||||
|
procesar_documentos(carpeta_torrents_txt, client['FLUJOS_DATOS']['torrents'])
|
||||||
|
logging.info("Finalizada subida de TORRENTS a MongoDB")
|
||||||
|
|
||||||
|
# Comparar archivos tokenizados y guardar comparaciones en MongoDB
|
||||||
|
print("Comparando textos tokenizados entre Noticias, Wikipedia y TORRENTS...")
|
||||||
|
logging.info("Iniciando comparaciones entre textos tokenizados")
|
||||||
|
manejar_comparaciones_multiproceso([carpeta_noticias_tokenized, carpeta_wikipedia_tokenized, carpeta_torrents_tokenized])
|
||||||
|
logging.info("Finalizadas comparaciones entre textos tokenizados")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error en la ejecución del script: {e}", exc_info=True)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
577
FLUJOS_DATOS/COMPARACIONES/pipeline_mongolo.log.1
Normal file
|
|
@ -0,0 +1,577 @@
|
||||||
|
2025-08-09 00:44:56,478 - INFO - Guardada comparación entre Hammer Film Productions.txt y Sanción.txt con 1.47% de similitud.
|
||||||
|
2025-08-09 00:44:56,482 - INFO - Guardada comparación entre Hammer Film Productions.txt y Saúl Luciano Lliuya.txt con 9.36% de similitud.
|
||||||
|
2025-08-09 00:44:56,486 - INFO - Guardada comparación entre Hammer Film Productions.txt y Antiprotestantismo.txt con 14.38% de similitud.
|
||||||
|
2025-08-09 00:44:56,489 - INFO - Guardada comparación entre Big Water.txt y Desigualdad de ingreso en Estados Unidos.txt con 17.72% de similitud.
|
||||||
|
2025-08-09 00:44:56,494 - INFO - Guardada comparación entre Big Water.txt y Iberos.txt con 3.69% de similitud.
|
||||||
|
2025-08-09 00:44:56,497 - INFO - Guardada comparación entre Big Water.txt y .km.txt con 9.94% de similitud.
|
||||||
|
2025-08-09 00:44:56,501 - INFO - Guardada comparación entre Big Water.txt y Censura internacional china.txt con 11.17% de similitud.
|
||||||
|
2025-08-09 00:44:56,504 - INFO - Guardada comparación entre Big Water.txt y Alfarería en la provincia de Almería.txt con 9.97% de similitud.
|
||||||
|
2025-08-09 00:44:56,507 - INFO - Guardada comparación entre Big Water.txt y Acuerdo de Prespa.txt con 12.30% de similitud.
|
||||||
|
2025-08-09 00:44:56,510 - INFO - Guardada comparación entre Big Water.txt y Segunda Cumbre BRIC 2010.txt con 15.52% de similitud.
|
||||||
|
2025-08-09 00:44:56,514 - INFO - Guardada comparación entre Big Water.txt y Santa Marina del Rey.txt con 15.99% de similitud.
|
||||||
|
2025-08-09 00:44:56,517 - INFO - Guardada comparación entre Big Water.txt y Omaira Montoya Henao.txt con 17.75% de similitud.
|
||||||
|
2025-08-09 00:44:56,520 - INFO - Guardada comparación entre Big Water.txt y Biodiversidad Virtual.txt con 14.38% de similitud.
|
||||||
|
2025-08-09 00:44:56,523 - INFO - Guardada comparación entre Big Water.txt y Estudios de ciencia, tecnología y género.txt con 14.04% de similitud.
|
||||||
|
2025-08-09 00:44:56,527 - INFO - Guardada comparación entre Big Water.txt y Representación (política).txt con 15.18% de similitud.
|
||||||
|
2025-08-09 00:44:56,530 - INFO - Guardada comparación entre Big Water.txt y Roxana Campos.txt con 12.54% de similitud.
|
||||||
|
2025-08-09 00:44:56,534 - INFO - Guardada comparación entre Big Water.txt y Reforma económica china.txt con 5.09% de similitud.
|
||||||
|
2025-08-09 00:44:56,538 - INFO - Guardada comparación entre Big Water.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 11.66% de similitud.
|
||||||
|
2025-08-09 00:44:56,541 - INFO - Guardada comparación entre Big Water.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 12.70% de similitud.
|
||||||
|
2025-08-09 00:44:56,544 - INFO - Guardada comparación entre Big Water.txt y Oswald Pohl.txt con 16.83% de similitud.
|
||||||
|
2025-08-09 00:44:56,547 - INFO - Guardada comparación entre Big Water.txt y Empresa Nacional Siderúrgica.txt con 12.94% de similitud.
|
||||||
|
2025-08-09 00:44:56,551 - INFO - Guardada comparación entre Big Water.txt y Certificate Signing Request.txt con 9.49% de similitud.
|
||||||
|
2025-08-09 00:44:56,554 - INFO - Guardada comparación entre Big Water.txt y Antônio de Sousa Neto.txt con 15.57% de similitud.
|
||||||
|
2025-08-09 00:44:56,557 - INFO - Guardada comparación entre Big Water.txt y Unión Ortodoxa.txt con 14.92% de similitud.
|
||||||
|
2025-08-09 00:44:56,561 - INFO - Guardada comparación entre Big Water.txt y Emisora móvil.txt con 7.31% de similitud.
|
||||||
|
2025-08-09 00:44:56,564 - INFO - Guardada comparación entre Big Water.txt y Demografía de la República Democrática del Congo.txt con 18.31% de similitud.
|
||||||
|
2025-08-09 00:44:56,568 - INFO - Guardada comparación entre Big Water.txt y Desigualdad de ingreso.txt con 7.10% de similitud.
|
||||||
|
2025-08-09 00:44:56,572 - INFO - Guardada comparación entre Big Water.txt y Terrorismo de extrema izquierda.txt con 7.89% de similitud.
|
||||||
|
2025-08-09 00:44:56,577 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Iberos.txt con 6.21% de similitud.
|
||||||
|
2025-08-09 00:44:56,580 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 21.25% de similitud.
|
||||||
|
2025-08-09 00:44:56,584 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Censura internacional china.txt con 17.78% de similitud.
|
||||||
|
2025-08-09 00:44:56,587 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Alfarería en la provincia de Almería.txt con 16.25% de similitud.
|
||||||
|
2025-08-09 00:44:56,591 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Ingeniería comercial.txt con 18.38% de similitud.
|
||||||
|
2025-08-09 00:44:56,594 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Chevrolet Cobalt.txt con 3.03% de similitud.
|
||||||
|
2025-08-09 00:44:56,597 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Código Unificado de Punto de Suministro.txt con 15.82% de similitud.
|
||||||
|
2025-08-09 00:44:56,601 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 18.41% de similitud.
|
||||||
|
2025-08-09 00:44:56,604 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Estación de tratamiento de agua potable.txt con 10.93% de similitud.
|
||||||
|
2025-08-09 00:44:56,607 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Militar.txt con 19.62% de similitud.
|
||||||
|
2025-08-09 00:44:56,611 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Demografía de Canadá.txt con 16.88% de similitud.
|
||||||
|
2025-08-09 00:44:56,614 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y EToro.txt con 16.90% de similitud.
|
||||||
|
2025-08-09 00:44:56,617 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Ambiente biofísico.txt con 15.47% de similitud.
|
||||||
|
2025-08-09 00:44:56,621 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Juego ganar ganar.txt con 14.11% de similitud.
|
||||||
|
2025-08-09 00:44:56,624 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 19.18% de similitud.
|
||||||
|
2025-08-09 00:44:56,628 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 21.31% de similitud.
|
||||||
|
2025-08-09 00:44:56,631 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Oswald Pohl.txt con 14.69% de similitud.
|
||||||
|
2025-08-09 00:44:56,634 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Empresa Nacional Siderúrgica.txt con 20.01% de similitud.
|
||||||
|
2025-08-09 00:44:56,638 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Teletón El Salvador.txt con 19.31% de similitud.
|
||||||
|
2025-08-09 00:44:56,641 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Antônio de Sousa Neto.txt con 11.44% de similitud.
|
||||||
|
2025-08-09 00:44:56,645 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Mercenarios (BattleTech).txt con 17.65% de similitud.
|
||||||
|
2025-08-09 00:44:56,648 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Efecto cis.txt con 16.17% de similitud.
|
||||||
|
2025-08-09 00:44:56,652 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Demografía de la República Democrática del Congo.txt con 15.63% de similitud.
|
||||||
|
2025-08-09 00:44:56,656 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Desigualdad de ingreso.txt con 11.47% de similitud.
|
||||||
|
2025-08-09 00:44:56,659 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Terrorismo de extrema izquierda.txt con 12.34% de similitud.
|
||||||
|
2025-08-09 00:44:56,664 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Iberos.txt con 1.94% de similitud.
|
||||||
|
2025-08-09 00:44:56,667 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y .km.txt con 10.83% de similitud.
|
||||||
|
2025-08-09 00:44:56,670 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Asesoría Jurídica Internacional.txt con 14.67% de similitud.
|
||||||
|
2025-08-09 00:44:56,674 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Desarrollo de videojuegos independiente.txt con 3.77% de similitud.
|
||||||
|
2025-08-09 00:44:56,677 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Ingeniería comercial.txt con 13.31% de similitud.
|
||||||
|
2025-08-09 00:44:56,680 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Chevrolet Cobalt.txt con 5.68% de similitud.
|
||||||
|
2025-08-09 00:44:56,684 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Código Unificado de Punto de Suministro.txt con 11.82% de similitud.
|
||||||
|
2025-08-09 00:44:56,688 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 7.66% de similitud.
|
||||||
|
2025-08-09 00:44:56,692 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Estación de tratamiento de agua potable.txt con 12.92% de similitud.
|
||||||
|
2025-08-09 00:44:56,696 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Militar.txt con 8.73% de similitud.
|
||||||
|
2025-08-09 00:44:56,700 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Demografía de Canadá.txt con 6.70% de similitud.
|
||||||
|
2025-08-09 00:44:56,703 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y EToro.txt con 10.03% de similitud.
|
||||||
|
2025-08-09 00:44:56,707 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Ambiente biofísico.txt con 13.47% de similitud.
|
||||||
|
2025-08-09 00:44:56,710 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Juego ganar ganar.txt con 11.59% de similitud.
|
||||||
|
2025-08-09 00:44:56,714 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Alejandro VII.txt con 7.87% de similitud.
|
||||||
|
2025-08-09 00:44:56,718 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Violencia obstétrica.txt con 11.91% de similitud.
|
||||||
|
2025-08-09 00:44:56,722 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Torrente Gros.txt con 9.15% de similitud.
|
||||||
|
2025-08-09 00:44:56,726 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Guerra de Reforma.txt con 6.67% de similitud.
|
||||||
|
2025-08-09 00:44:56,729 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Certificate Signing Request.txt con 5.69% de similitud.
|
||||||
|
2025-08-09 00:44:56,733 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Antônio de Sousa Neto.txt con 15.13% de similitud.
|
||||||
|
2025-08-09 00:44:56,736 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Unión Ortodoxa.txt con 9.59% de similitud.
|
||||||
|
2025-08-09 00:44:56,740 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Efecto cis.txt con 10.54% de similitud.
|
||||||
|
2025-08-09 00:44:56,743 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Sanción.txt con 5.65% de similitud.
|
||||||
|
2025-08-09 00:44:56,747 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Saúl Luciano Lliuya.txt con 14.35% de similitud.
|
||||||
|
2025-08-09 00:44:56,751 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Antiprotestantismo.txt con 9.08% de similitud.
|
||||||
|
2025-08-09 00:44:56,754 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Desigualdad de ingreso en Estados Unidos.txt con 6.27% de similitud.
|
||||||
|
2025-08-09 00:44:56,757 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Club Deportivo La Equidad (Femenino).txt con 7.70% de similitud.
|
||||||
|
2025-08-09 00:44:56,760 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y .km.txt con 8.42% de similitud.
|
||||||
|
2025-08-09 00:44:56,763 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Asesoría Jurídica Internacional.txt con 10.96% de similitud.
|
||||||
|
2025-08-09 00:44:56,767 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Desarrollo de videojuegos independiente.txt con 2.18% de similitud.
|
||||||
|
2025-08-09 00:44:56,770 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Ingeniería comercial.txt con 7.98% de similitud.
|
||||||
|
2025-08-09 00:44:56,773 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Chevrolet Cobalt.txt con 8.85% de similitud.
|
||||||
|
2025-08-09 00:44:56,776 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Código Unificado de Punto de Suministro.txt con 6.75% de similitud.
|
||||||
|
2025-08-09 00:44:56,779 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 4.03% de similitud.
|
||||||
|
2025-08-09 00:44:56,782 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Estación de tratamiento de agua potable.txt con 9.89% de similitud.
|
||||||
|
2025-08-09 00:44:56,785 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Militar.txt con 5.92% de similitud.
|
||||||
|
2025-08-09 00:44:56,788 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Demografía de Canadá.txt con 4.05% de similitud.
|
||||||
|
2025-08-09 00:44:56,792 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y EToro.txt con 6.73% de similitud.
|
||||||
|
2025-08-09 00:44:56,796 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Ambiente biofísico.txt con 8.19% de similitud.
|
||||||
|
2025-08-09 00:44:56,800 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Juego ganar ganar.txt con 7.92% de similitud.
|
||||||
|
2025-08-09 00:44:56,803 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 4.29% de similitud.
|
||||||
|
2025-08-09 00:44:56,806 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 4.87% de similitud.
|
||||||
|
2025-08-09 00:44:56,809 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Oswald Pohl.txt con 9.97% de similitud.
|
||||||
|
2025-08-09 00:44:56,813 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Empresa Nacional Siderúrgica.txt con 5.66% de similitud.
|
||||||
|
2025-08-09 00:44:56,816 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Teletón El Salvador.txt con 4.97% de similitud.
|
||||||
|
2025-08-09 00:44:56,819 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Antônio de Sousa Neto.txt con 10.74% de similitud.
|
||||||
|
2025-08-09 00:44:56,822 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Mercenarios (BattleTech).txt con 4.41% de similitud.
|
||||||
|
2025-08-09 00:44:56,825 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Efecto cis.txt con 5.29% de similitud.
|
||||||
|
2025-08-09 00:44:56,828 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Sanción.txt con 5.90% de similitud.
|
||||||
|
2025-08-09 00:44:56,835 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Saúl Luciano Lliuya.txt con 9.67% de similitud.
|
||||||
|
2025-08-09 00:44:56,839 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Terrorismo de extrema izquierda.txt con 2.81% de similitud.
|
||||||
|
2025-08-09 00:44:56,844 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Iberos.txt con 3.14% de similitud.
|
||||||
|
2025-08-09 00:44:56,846 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y .km.txt con 10.28% de similitud.
|
||||||
|
2025-08-09 00:44:56,849 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Asesoría Jurídica Internacional.txt con 16.83% de similitud.
|
||||||
|
2025-08-09 00:44:56,853 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Censura internacional china.txt con 9.20% de similitud.
|
||||||
|
2025-08-09 00:44:56,856 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Alfarería en la provincia de Almería.txt con 8.87% de similitud.
|
||||||
|
2025-08-09 00:44:56,859 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Acuerdo de Prespa.txt con 13.96% de similitud.
|
||||||
|
2025-08-09 00:44:56,862 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Segunda Cumbre BRIC 2010.txt con 13.66% de similitud.
|
||||||
|
2025-08-09 00:44:56,865 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Santa Marina del Rey.txt con 16.36% de similitud.
|
||||||
|
2025-08-09 00:44:56,868 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Omaira Montoya Henao.txt con 18.10% de similitud.
|
||||||
|
2025-08-09 00:44:56,871 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Biodiversidad Virtual.txt con 13.74% de similitud.
|
||||||
|
2025-08-09 00:44:56,875 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Estudios de ciencia, tecnología y género.txt con 12.73% de similitud.
|
||||||
|
2025-08-09 00:44:56,878 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Representación (política).txt con 13.59% de similitud.
|
||||||
|
2025-08-09 00:44:56,881 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Roxana Campos.txt con 15.90% de similitud.
|
||||||
|
2025-08-09 00:44:56,885 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Reforma económica china.txt con 3.33% de similitud.
|
||||||
|
2025-08-09 00:44:56,889 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 9.83% de similitud.
|
||||||
|
2025-08-09 00:44:56,892 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 11.27% de similitud.
|
||||||
|
2025-08-09 00:44:56,895 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Oswald Pohl.txt con 17.99% de similitud.
|
||||||
|
2025-08-09 00:44:56,898 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Empresa Nacional Siderúrgica.txt con 12.18% de similitud.
|
||||||
|
2025-08-09 00:44:56,902 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Teletón El Salvador.txt con 11.70% de similitud.
|
||||||
|
2025-08-09 00:44:56,904 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Antônio de Sousa Neto.txt con 17.30% de similitud.
|
||||||
|
2025-08-09 00:44:56,908 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Mercenarios (BattleTech).txt con 10.49% de similitud.
|
||||||
|
2025-08-09 00:44:56,911 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Efecto cis.txt con 12.67% de similitud.
|
||||||
|
2025-08-09 00:44:56,914 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Sanción.txt con 3.61% de similitud.
|
||||||
|
2025-08-09 00:44:56,917 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Saúl Luciano Lliuya.txt con 15.50% de similitud.
|
||||||
|
2025-08-09 00:44:56,920 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Antiprotestantismo.txt con 12.49% de similitud.
|
||||||
|
2025-08-09 00:44:56,923 - INFO - Guardada comparación entre Puebla de Segur.txt y Desigualdad de ingreso en Estados Unidos.txt con 18.11% de similitud.
|
||||||
|
2025-08-09 00:44:56,927 - INFO - Guardada comparación entre Puebla de Segur.txt y Club Deportivo La Equidad (Femenino).txt con 15.07% de similitud.
|
||||||
|
2025-08-09 00:44:56,930 - INFO - Guardada comparación entre Puebla de Segur.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 16.31% de similitud.
|
||||||
|
2025-08-09 00:44:56,933 - INFO - Guardada comparación entre Puebla de Segur.txt y Asesoría Jurídica Internacional.txt con 12.21% de similitud.
|
||||||
|
2025-08-09 00:44:56,937 - INFO - Guardada comparación entre Puebla de Segur.txt y Desarrollo de videojuegos independiente.txt con 14.01% de similitud.
|
||||||
|
2025-08-09 00:44:56,940 - INFO - Guardada comparación entre Puebla de Segur.txt y Ingeniería comercial.txt con 15.45% de similitud.
|
||||||
|
2025-08-09 00:44:56,943 - INFO - Guardada comparación entre Puebla de Segur.txt y Chevrolet Cobalt.txt con 2.86% de similitud.
|
||||||
|
2025-08-09 00:44:56,947 - INFO - Guardada comparación entre Puebla de Segur.txt y Código Unificado de Punto de Suministro.txt con 15.26% de similitud.
|
||||||
|
2025-08-09 00:44:56,950 - INFO - Guardada comparación entre Puebla de Segur.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 19.28% de similitud.
|
||||||
|
2025-08-09 00:44:56,954 - INFO - Guardada comparación entre Puebla de Segur.txt y Estación de tratamiento de agua potable.txt con 9.33% de similitud.
|
||||||
|
2025-08-09 00:44:56,957 - INFO - Guardada comparación entre Puebla de Segur.txt y Militar.txt con 16.46% de similitud.
|
||||||
|
2025-08-09 00:44:56,960 - INFO - Guardada comparación entre Puebla de Segur.txt y Demografía de Canadá.txt con 18.26% de similitud.
|
||||||
|
2025-08-09 00:44:56,963 - INFO - Guardada comparación entre Puebla de Segur.txt y EToro.txt con 15.76% de similitud.
|
||||||
|
2025-08-09 00:44:56,967 - INFO - Guardada comparación entre Puebla de Segur.txt y Ambiente biofísico.txt con 14.46% de similitud.
|
||||||
|
2025-08-09 00:44:56,971 - INFO - Guardada comparación entre Puebla de Segur.txt y Juego ganar ganar.txt con 13.89% de similitud.
|
||||||
|
2025-08-09 00:44:56,974 - INFO - Guardada comparación entre Puebla de Segur.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 18.19% de similitud.
|
||||||
|
2025-08-09 00:44:56,978 - INFO - Guardada comparación entre Puebla de Segur.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 19.30% de similitud.
|
||||||
|
2025-08-09 00:44:56,981 - INFO - Guardada comparación entre Puebla de Segur.txt y Oswald Pohl.txt con 13.09% de similitud.
|
||||||
|
2025-08-09 00:44:56,984 - INFO - Guardada comparación entre Puebla de Segur.txt y Empresa Nacional Siderúrgica.txt con 21.23% de similitud.
|
||||||
|
2025-08-09 00:44:56,988 - INFO - Guardada comparación entre Puebla de Segur.txt y Teletón El Salvador.txt con 18.86% de similitud.
|
||||||
|
2025-08-09 00:44:56,991 - INFO - Guardada comparación entre Puebla de Segur.txt y Antônio de Sousa Neto.txt con 10.77% de similitud.
|
||||||
|
2025-08-09 00:44:56,995 - INFO - Guardada comparación entre Puebla de Segur.txt y Mercenarios (BattleTech).txt con 17.89% de similitud.
|
||||||
|
2025-08-09 00:44:56,998 - INFO - Guardada comparación entre Puebla de Segur.txt y Efecto cis.txt con 16.19% de similitud.
|
||||||
|
2025-08-09 00:44:57,002 - INFO - Guardada comparación entre Puebla de Segur.txt y Sanción.txt con 1.66% de similitud.
|
||||||
|
2025-08-09 00:44:57,005 - INFO - Guardada comparación entre Puebla de Segur.txt y Saúl Luciano Lliuya.txt con 11.21% de similitud.
|
||||||
|
2025-08-09 00:44:57,009 - INFO - Guardada comparación entre Puebla de Segur.txt y Antiprotestantismo.txt con 18.46% de similitud.
|
||||||
|
2025-08-09 00:44:57,012 - INFO - Guardada comparación entre Trabajo de mierda.txt y Desigualdad de ingreso en Estados Unidos.txt con 9.31% de similitud.
|
||||||
|
2025-08-09 00:44:57,015 - INFO - Guardada comparación entre Trabajo de mierda.txt y Club Deportivo La Equidad (Femenino).txt con 8.60% de similitud.
|
||||||
|
2025-08-09 00:44:57,018 - INFO - Guardada comparación entre Trabajo de mierda.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 9.67% de similitud.
|
||||||
|
2025-08-09 00:44:57,021 - INFO - Guardada comparación entre Trabajo de mierda.txt y Asesoría Jurídica Internacional.txt con 12.23% de similitud.
|
||||||
|
2025-08-09 00:44:57,025 - INFO - Guardada comparación entre Trabajo de mierda.txt y Desarrollo de videojuegos independiente.txt con 3.62% de similitud.
|
||||||
|
2025-08-09 00:44:57,028 - INFO - Guardada comparación entre Trabajo de mierda.txt y Ingeniería comercial.txt con 12.03% de similitud.
|
||||||
|
2025-08-09 00:44:57,031 - INFO - Guardada comparación entre Trabajo de mierda.txt y Chevrolet Cobalt.txt con 7.14% de similitud.
|
||||||
|
2025-08-09 00:44:57,034 - INFO - Guardada comparación entre Trabajo de mierda.txt y Código Unificado de Punto de Suministro.txt con 9.32% de similitud.
|
||||||
|
2025-08-09 00:44:57,037 - INFO - Guardada comparación entre Trabajo de mierda.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 6.35% de similitud.
|
||||||
|
2025-08-09 00:44:57,040 - INFO - Guardada comparación entre Trabajo de mierda.txt y Estación de tratamiento de agua potable.txt con 11.96% de similitud.
|
||||||
|
2025-08-09 00:44:57,044 - INFO - Guardada comparación entre Trabajo de mierda.txt y Militar.txt con 7.77% de similitud.
|
||||||
|
2025-08-09 00:44:57,047 - INFO - Guardada comparación entre Trabajo de mierda.txt y Demografía de Canadá.txt con 5.70% de similitud.
|
||||||
|
2025-08-09 00:44:57,050 - INFO - Guardada comparación entre Trabajo de mierda.txt y EToro.txt con 9.27% de similitud.
|
||||||
|
2025-08-09 00:44:57,054 - INFO - Guardada comparación entre Trabajo de mierda.txt y Ambiente biofísico.txt con 12.41% de similitud.
|
||||||
|
2025-08-09 00:44:57,057 - INFO - Guardada comparación entre Trabajo de mierda.txt y Juego ganar ganar.txt con 10.54% de similitud.
|
||||||
|
2025-08-09 00:44:57,060 - INFO - Guardada comparación entre Trabajo de mierda.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 6.02% de similitud.
|
||||||
|
2025-08-09 00:44:57,064 - INFO - Guardada comparación entre Trabajo de mierda.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 6.85% de similitud.
|
||||||
|
2025-08-09 00:44:57,067 - INFO - Guardada comparación entre Trabajo de mierda.txt y Oswald Pohl.txt con 10.33% de similitud.
|
||||||
|
2025-08-09 00:44:57,071 - INFO - Guardada comparación entre Trabajo de mierda.txt y Empresa Nacional Siderúrgica.txt con 7.64% de similitud.
|
||||||
|
2025-08-09 00:44:57,074 - INFO - Guardada comparación entre Trabajo de mierda.txt y Teletón El Salvador.txt con 6.53% de similitud.
|
||||||
|
2025-08-09 00:44:57,077 - INFO - Guardada comparación entre Trabajo de mierda.txt y Antônio de Sousa Neto.txt con 12.06% de similitud.
|
||||||
|
2025-08-09 00:44:57,081 - INFO - Guardada comparación entre Trabajo de mierda.txt y Mercenarios (BattleTech).txt con 6.10% de similitud.
|
||||||
|
2025-08-09 00:44:57,084 - INFO - Guardada comparación entre Trabajo de mierda.txt y Efecto cis.txt con 8.20% de similitud.
|
||||||
|
2025-08-09 00:44:57,087 - INFO - Guardada comparación entre Trabajo de mierda.txt y Demografía de la República Democrática del Congo.txt con 7.03% de similitud.
|
||||||
|
2025-08-09 00:44:57,091 - INFO - Guardada comparación entre Trabajo de mierda.txt y Desigualdad de ingreso.txt con 3.57% de similitud.
|
||||||
|
2025-08-09 00:44:57,095 - INFO - Guardada comparación entre Trabajo de mierda.txt y Terrorismo de extrema izquierda.txt con 3.82% de similitud.
|
||||||
|
2025-08-09 00:44:57,100 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Iberos.txt con 3.82% de similitud.
|
||||||
|
2025-08-09 00:44:57,103 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y .km.txt con 8.17% de similitud.
|
||||||
|
2025-08-09 00:44:57,107 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Censura internacional china.txt con 11.96% de similitud.
|
||||||
|
2025-08-09 00:44:57,110 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Alfarería en la provincia de Almería.txt con 11.60% de similitud.
|
||||||
|
2025-08-09 00:44:57,114 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Acuerdo de Prespa.txt con 11.31% de similitud.
|
||||||
|
2025-08-09 00:44:57,117 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Segunda Cumbre BRIC 2010.txt con 18.12% de similitud.
|
||||||
|
2025-08-09 00:44:57,120 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Santa Marina del Rey.txt con 16.52% de similitud.
|
||||||
|
2025-08-09 00:44:57,123 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Omaira Montoya Henao.txt con 20.37% de similitud.
|
||||||
|
2025-08-09 00:44:57,127 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Biodiversidad Virtual.txt con 16.44% de similitud.
|
||||||
|
2025-08-09 00:44:57,130 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Estudios de ciencia, tecnología y género.txt con 15.68% de similitud.
|
||||||
|
2025-08-09 00:44:57,133 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Representación (política).txt con 18.18% de similitud.
|
||||||
|
2025-08-09 00:44:57,136 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Roxana Campos.txt con 15.74% de similitud.
|
||||||
|
2025-08-09 00:44:57,141 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Reforma económica china.txt con 4.59% de similitud.
|
||||||
|
2025-08-09 00:44:57,144 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Alejandro VII.txt con 15.90% de similitud.
|
||||||
|
2025-08-09 00:44:57,147 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Violencia obstétrica.txt con 18.63% de similitud.
|
||||||
|
2025-08-09 00:44:57,150 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Torrente Gros.txt con 16.83% de similitud.
|
||||||
|
2025-08-09 00:44:57,154 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Guerra de Reforma.txt con 12.69% de similitud.
|
||||||
|
2025-08-09 00:44:57,157 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Certificate Signing Request.txt con 8.53% de similitud.
|
||||||
|
2025-08-09 00:44:57,161 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Katalin Bogyay.txt con 12.49% de similitud.
|
||||||
|
2025-08-09 00:44:57,164 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Unión Ortodoxa.txt con 16.91% de similitud.
|
||||||
|
2025-08-09 00:44:57,168 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Emisora móvil.txt con 7.67% de similitud.
|
||||||
|
2025-08-09 00:44:57,171 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Sanción.txt con 3.08% de similitud.
|
||||||
|
2025-08-09 00:44:57,174 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Saúl Luciano Lliuya.txt con 15.63% de similitud.
|
||||||
|
2025-08-09 00:44:57,177 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Antiprotestantismo.txt con 15.88% de similitud.
|
||||||
|
2025-08-09 00:44:57,180 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Desigualdad de ingreso en Estados Unidos.txt con 11.10% de similitud.
|
||||||
|
2025-08-09 00:44:57,183 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Club Deportivo La Equidad (Femenino).txt con 12.95% de similitud.
|
||||||
|
2025-08-09 00:44:57,190 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 13.28% de similitud.
|
||||||
|
2025-08-09 00:44:57,194 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Censura internacional china.txt con 8.00% de similitud.
|
||||||
|
2025-08-09 00:44:57,197 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Alfarería en la provincia de Almería.txt con 7.17% de similitud.
|
||||||
|
2025-08-09 00:44:57,200 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Acuerdo de Prespa.txt con 12.88% de similitud.
|
||||||
|
2025-08-09 00:44:57,203 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Segunda Cumbre BRIC 2010.txt con 11.54% de similitud.
|
||||||
|
2025-08-09 00:44:57,206 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Santa Marina del Rey.txt con 13.59% de similitud.
|
||||||
|
2025-08-09 00:44:57,209 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Omaira Montoya Henao.txt con 15.78% de similitud.
|
||||||
|
2025-08-09 00:44:57,212 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Biodiversidad Virtual.txt con 12.24% de similitud.
|
||||||
|
2025-08-09 00:44:57,216 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Estudios de ciencia, tecnología y género.txt con 10.17% de similitud.
|
||||||
|
2025-08-09 00:44:57,219 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Demografía de Canadá.txt con 8.06% de similitud.
|
||||||
|
2025-08-09 00:44:57,222 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Roxana Campos.txt con 14.53% de similitud.
|
||||||
|
2025-08-09 00:44:57,226 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Reforma económica china.txt con 2.90% de similitud.
|
||||||
|
2025-08-09 00:44:57,229 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Alejandro VII.txt con 10.44% de similitud.
|
||||||
|
2025-08-09 00:44:57,233 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Violencia obstétrica.txt con 12.64% de similitud.
|
||||||
|
2025-08-09 00:44:57,236 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Torrente Gros.txt con 12.99% de similitud.
|
||||||
|
2025-08-09 00:44:57,239 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Guerra de Reforma.txt con 8.15% de similitud.
|
||||||
|
2025-08-09 00:44:57,243 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Certificate Signing Request.txt con 6.07% de similitud.
|
||||||
|
2025-08-09 00:44:57,246 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Katalin Bogyay.txt con 6.74% de similitud.
|
||||||
|
2025-08-09 00:44:57,249 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Unión Ortodoxa.txt con 11.21% de similitud.
|
||||||
|
2025-08-09 00:44:57,253 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Emisora móvil.txt con 5.01% de similitud.
|
||||||
|
2025-08-09 00:44:57,256 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Sanción.txt con 3.79% de similitud.
|
||||||
|
2025-08-09 00:44:57,259 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Saúl Luciano Lliuya.txt con 12.82% de similitud.
|
||||||
|
2025-08-09 00:44:57,262 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Antiprotestantismo.txt con 10.12% de similitud.
|
||||||
|
2025-08-09 00:44:57,266 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Desigualdad de ingreso en Estados Unidos.txt con 20.24% de similitud.
|
||||||
|
2025-08-09 00:44:57,269 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Club Deportivo La Equidad (Femenino).txt con 16.58% de similitud.
|
||||||
|
2025-08-09 00:44:57,273 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 19.28% de similitud.
|
||||||
|
2025-08-09 00:44:57,276 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Asesoría Jurídica Internacional.txt con 14.22% de similitud.
|
||||||
|
2025-08-09 00:44:57,280 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Desarrollo de videojuegos independiente.txt con 13.69% de similitud.
|
||||||
|
2025-08-09 00:44:57,283 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Ingeniería comercial.txt con 17.93% de similitud.
|
||||||
|
2025-08-09 00:44:57,286 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Chevrolet Cobalt.txt con 3.07% de similitud.
|
||||||
|
2025-08-09 00:44:57,290 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Código Unificado de Punto de Suministro.txt con 15.31% de similitud.
|
||||||
|
2025-08-09 00:44:57,294 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 19.93% de similitud.
|
||||||
|
2025-08-09 00:44:57,297 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Estación de tratamiento de agua potable.txt con 10.70% de similitud.
|
||||||
|
2025-08-09 00:44:57,300 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Militar.txt con 20.52% de similitud.
|
||||||
|
2025-08-09 00:44:57,304 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Demografía de Canadá.txt con 19.04% de similitud.
|
||||||
|
2025-08-09 00:44:57,307 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y EToro.txt con 17.32% de similitud.
|
||||||
|
2025-08-09 00:44:57,310 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Ambiente biofísico.txt con 14.88% de similitud.
|
||||||
|
2025-08-09 00:44:57,314 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Juego ganar ganar.txt con 15.95% de similitud.
|
||||||
|
2025-08-09 00:44:57,317 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 19.84% de similitud.
|
||||||
|
2025-08-09 00:44:57,320 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 21.37% de similitud.
|
||||||
|
2025-08-09 00:44:57,324 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Oswald Pohl.txt con 14.41% de similitud.
|
||||||
|
2025-08-09 00:44:57,327 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Empresa Nacional Siderúrgica.txt con 19.64% de similitud.
|
||||||
|
2025-08-09 00:44:57,331 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Teletón El Salvador.txt con 21.81% de similitud.
|
||||||
|
2025-08-09 00:44:57,334 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Antônio de Sousa Neto.txt con 11.33% de similitud.
|
||||||
|
2025-08-09 00:44:57,337 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Mercenarios (BattleTech).txt con 19.49% de similitud.
|
||||||
|
2025-08-09 00:44:57,341 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Efecto cis.txt con 17.20% de similitud.
|
||||||
|
2025-08-09 00:44:57,344 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Demografía de la República Democrática del Congo.txt con 16.46% de similitud.
|
||||||
|
2025-08-09 00:44:57,348 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Desigualdad de ingreso.txt con 12.09% de similitud.
|
||||||
|
2025-08-09 00:44:57,352 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Terrorismo de extrema izquierda.txt con 13.97% de similitud.
|
||||||
|
2025-08-09 00:44:57,358 - INFO - Guardada comparación entre Juegos de guerra.txt y Iberos.txt con 8.42% de similitud.
|
||||||
|
2025-08-09 00:44:57,361 - INFO - Guardada comparación entre Juegos de guerra.txt y .km.txt con 5.61% de similitud.
|
||||||
|
2025-08-09 00:44:57,364 - INFO - Guardada comparación entre Juegos de guerra.txt y Asesoría Jurídica Internacional.txt con 10.46% de similitud.
|
||||||
|
2025-08-09 00:44:57,368 - INFO - Guardada comparación entre Juegos de guerra.txt y Desarrollo de videojuegos independiente.txt con 15.64% de similitud.
|
||||||
|
2025-08-09 00:44:57,372 - INFO - Guardada comparación entre Juegos de guerra.txt y Ingeniería comercial.txt con 13.44% de similitud.
|
||||||
|
2025-08-09 00:44:57,375 - INFO - Guardada comparación entre Juegos de guerra.txt y Chevrolet Cobalt.txt con 2.31% de similitud.
|
||||||
|
2025-08-09 00:44:57,378 - INFO - Guardada comparación entre Juegos de guerra.txt y Código Unificado de Punto de Suministro.txt con 11.91% de similitud.
|
||||||
|
2025-08-09 00:44:57,382 - INFO - Guardada comparación entre Juegos de guerra.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 18.59% de similitud.
|
||||||
|
2025-08-09 00:44:57,385 - INFO - Guardada comparación entre Juegos de guerra.txt y Estación de tratamiento de agua potable.txt con 7.93% de similitud.
|
||||||
|
2025-08-09 00:44:57,389 - INFO - Guardada comparación entre Juegos de guerra.txt y Militar.txt con 18.07% de similitud.
|
||||||
|
2025-08-09 00:44:57,392 - INFO - Guardada comparación entre Juegos de guerra.txt y Demografía de Canadá.txt con 17.59% de similitud.
|
||||||
|
2025-08-09 00:44:57,396 - INFO - Guardada comparación entre Juegos de guerra.txt y EToro.txt con 13.68% de similitud.
|
||||||
|
2025-08-09 00:44:57,401 - INFO - Guardada comparación entre Juegos de guerra.txt y Reforma económica china.txt con 9.41% de similitud.
|
||||||
|
2025-08-09 00:44:57,405 - INFO - Guardada comparación entre Juegos de guerra.txt y Alejandro VII.txt con 19.25% de similitud.
|
||||||
|
2025-08-09 00:44:57,408 - INFO - Guardada comparación entre Juegos de guerra.txt y Violencia obstétrica.txt con 14.18% de similitud.
|
||||||
|
2025-08-09 00:44:57,412 - INFO - Guardada comparación entre Juegos de guerra.txt y Torrente Gros.txt con 15.71% de similitud.
|
||||||
|
2025-08-09 00:44:57,416 - INFO - Guardada comparación entre Juegos de guerra.txt y Guerra de Reforma.txt con 19.27% de similitud.
|
||||||
|
2025-08-09 00:44:57,420 - INFO - Guardada comparación entre Juegos de guerra.txt y Certificate Signing Request.txt con 9.84% de similitud.
|
||||||
|
2025-08-09 00:44:57,424 - INFO - Guardada comparación entre Juegos de guerra.txt y Katalin Bogyay.txt con 16.16% de similitud.
|
||||||
|
2025-08-09 00:44:57,427 - INFO - Guardada comparación entre Juegos de guerra.txt y Unión Ortodoxa.txt con 17.27% de similitud.
|
||||||
|
2025-08-09 00:44:57,431 - INFO - Guardada comparación entre Juegos de guerra.txt y Emisora móvil.txt con 15.66% de similitud.
|
||||||
|
2025-08-09 00:44:57,435 - INFO - Guardada comparación entre Juegos de guerra.txt y Sanción.txt con 1.24% de similitud.
|
||||||
|
2025-08-09 00:44:57,438 - INFO - Guardada comparación entre Juegos de guerra.txt y Saúl Luciano Lliuya.txt con 8.81% de similitud.
|
||||||
|
2025-08-09 00:44:57,441 - INFO - Guardada comparación entre Juegos de guerra.txt y Antiprotestantismo.txt con 16.49% de similitud.
|
||||||
|
2025-08-09 00:44:57,445 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Desigualdad de ingreso en Estados Unidos.txt con 15.22% de similitud.
|
||||||
|
2025-08-09 00:44:57,448 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Club Deportivo La Equidad (Femenino).txt con 12.28% de similitud.
|
||||||
|
2025-08-09 00:44:57,451 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 13.24% de similitud.
|
||||||
|
2025-08-09 00:44:57,455 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Asesoría Jurídica Internacional.txt con 13.36% de similitud.
|
||||||
|
2025-08-09 00:44:57,459 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Desarrollo de videojuegos independiente.txt con 8.75% de similitud.
|
||||||
|
2025-08-09 00:44:57,462 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Acuerdo de Prespa.txt con 10.56% de similitud.
|
||||||
|
2025-08-09 00:44:57,465 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Chevrolet Cobalt.txt con 4.05% de similitud.
|
||||||
|
2025-08-09 00:44:57,469 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Código Unificado de Punto de Suministro.txt con 13.96% de similitud.
|
||||||
|
2025-08-09 00:44:57,472 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Omaira Montoya Henao.txt con 15.74% de similitud.
|
||||||
|
2025-08-09 00:44:57,475 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Estación de tratamiento de agua potable.txt con 11.36% de similitud.
|
||||||
|
2025-08-09 00:44:57,479 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Militar.txt con 12.00% de similitud.
|
||||||
|
2025-08-09 00:44:57,482 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Demografía de Canadá.txt con 11.31% de similitud.
|
||||||
|
2025-08-09 00:44:57,486 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Roxana Campos.txt con 11.61% de similitud.
|
||||||
|
2025-08-09 00:44:57,490 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Reforma económica china.txt con 4.43% de similitud.
|
||||||
|
2025-08-09 00:44:57,493 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Alejandro VII.txt con 11.12% de similitud.
|
||||||
|
2025-08-09 00:44:57,496 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Violencia obstétrica.txt con 14.46% de similitud.
|
||||||
|
2025-08-09 00:44:57,500 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Torrente Gros.txt con 12.34% de similitud.
|
||||||
|
2025-08-09 00:44:57,503 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Guerra de Reforma.txt con 9.51% de similitud.
|
||||||
|
2025-08-09 00:44:57,507 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Certificate Signing Request.txt con 10.28% de similitud.
|
||||||
|
2025-08-09 00:44:57,510 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Katalin Bogyay.txt con 10.18% de similitud.
|
||||||
|
2025-08-09 00:44:57,514 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Mercenarios (BattleTech).txt con 10.44% de similitud.
|
||||||
|
2025-08-09 00:44:57,518 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Emisora móvil.txt con 7.27% de similitud.
|
||||||
|
2025-08-09 00:44:57,521 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Sanción.txt con 2.33% de similitud.
|
||||||
|
2025-08-09 00:44:57,524 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Saúl Luciano Lliuya.txt con 13.39% de similitud.
|
||||||
|
2025-08-09 00:44:57,528 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Antiprotestantismo.txt con 13.35% de similitud.
|
||||||
|
2025-08-09 00:44:57,531 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Desigualdad de ingreso en Estados Unidos.txt con 11.04% de similitud.
|
||||||
|
2025-08-09 00:44:57,534 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Club Deportivo La Equidad (Femenino).txt con 12.57% de similitud.
|
||||||
|
2025-08-09 00:44:57,538 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 13.99% de similitud.
|
||||||
|
2025-08-09 00:44:57,541 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Asesoría Jurídica Internacional.txt con 15.01% de similitud.
|
||||||
|
2025-08-09 00:44:57,544 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Desarrollo de videojuegos independiente.txt con 5.51% de similitud.
|
||||||
|
2025-08-09 00:44:57,547 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Ingeniería comercial.txt con 14.21% de similitud.
|
||||||
|
2025-08-09 00:44:57,550 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Chevrolet Cobalt.txt con 5.78% de similitud.
|
||||||
|
2025-08-09 00:44:57,553 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Código Unificado de Punto de Suministro.txt con 13.60% de similitud.
|
||||||
|
2025-08-09 00:44:57,556 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 9.10% de similitud.
|
||||||
|
2025-08-09 00:44:57,559 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Estación de tratamiento de agua potable.txt con 14.30% de similitud.
|
||||||
|
2025-08-09 00:44:57,563 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Militar.txt con 11.32% de similitud.
|
||||||
|
2025-08-09 00:44:57,566 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Demografía de Canadá.txt con 8.78% de similitud.
|
||||||
|
2025-08-09 00:44:57,569 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y EToro.txt con 11.72% de similitud.
|
||||||
|
2025-08-09 00:44:57,572 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Ambiente biofísico.txt con 14.70% de similitud.
|
||||||
|
2025-08-09 00:44:57,575 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Juego ganar ganar.txt con 15.44% de similitud.
|
||||||
|
2025-08-09 00:44:57,579 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 8.56% de similitud.
|
||||||
|
2025-08-09 00:44:57,582 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 10.01% de similitud.
|
||||||
|
2025-08-09 00:44:57,585 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Oswald Pohl.txt con 13.52% de similitud.
|
||||||
|
2025-08-09 00:44:57,588 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Empresa Nacional Siderúrgica.txt con 10.67% de similitud.
|
||||||
|
2025-08-09 00:44:57,592 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Teletón El Salvador.txt con 10.43% de similitud.
|
||||||
|
2025-08-09 00:44:57,595 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Antônio de Sousa Neto.txt con 14.34% de similitud.
|
||||||
|
2025-08-09 00:44:57,598 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Mercenarios (BattleTech).txt con 8.27% de similitud.
|
||||||
|
2025-08-09 00:44:57,601 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Efecto cis.txt con 11.84% de similitud.
|
||||||
|
2025-08-09 00:44:57,605 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Demografía de la República Democrática del Congo.txt con 11.70% de similitud.
|
||||||
|
2025-08-09 00:44:57,609 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Desigualdad de ingreso.txt con 5.05% de similitud.
|
||||||
|
2025-08-09 00:44:57,613 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Terrorismo de extrema izquierda.txt con 6.04% de similitud.
|
||||||
|
2025-08-09 00:44:57,617 - INFO - Guardada comparación entre Medidas activas.txt y Club Deportivo La Equidad (Femenino).txt con 11.62% de similitud.
|
||||||
|
2025-08-09 00:44:57,621 - INFO - Guardada comparación entre Medidas activas.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 13.38% de similitud.
|
||||||
|
2025-08-09 00:44:57,624 - INFO - Guardada comparación entre Medidas activas.txt y Asesoría Jurídica Internacional.txt con 9.05% de similitud.
|
||||||
|
2025-08-09 00:44:57,628 - INFO - Guardada comparación entre Medidas activas.txt y Desarrollo de videojuegos independiente.txt con 17.89% de similitud.
|
||||||
|
2025-08-09 00:44:57,632 - INFO - Guardada comparación entre Medidas activas.txt y Ingeniería comercial.txt con 11.71% de similitud.
|
||||||
|
2025-08-09 00:44:57,635 - INFO - Guardada comparación entre Medidas activas.txt y Chevrolet Cobalt.txt con 2.06% de similitud.
|
||||||
|
2025-08-09 00:44:57,639 - INFO - Guardada comparación entre Medidas activas.txt y Código Unificado de Punto de Suministro.txt con 11.17% de similitud.
|
||||||
|
2025-08-09 00:44:57,643 - INFO - Guardada comparación entre Medidas activas.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 20.65% de similitud.
|
||||||
|
2025-08-09 00:44:57,646 - INFO - Guardada comparación entre Medidas activas.txt y Estación de tratamiento de agua potable.txt con 6.43% de similitud.
|
||||||
|
2025-08-09 00:44:57,649 - INFO - Guardada comparación entre Medidas activas.txt y Militar.txt con 15.47% de similitud.
|
||||||
|
2025-08-09 00:44:57,653 - INFO - Guardada comparación entre Medidas activas.txt y Demografía de Canadá.txt con 19.14% de similitud.
|
||||||
|
2025-08-09 00:44:57,657 - INFO - Guardada comparación entre Medidas activas.txt y EToro.txt con 14.46% de similitud.
|
||||||
|
2025-08-09 00:44:57,660 - INFO - Guardada comparación entre Medidas activas.txt y Ambiente biofísico.txt con 10.28% de similitud.
|
||||||
|
2025-08-09 00:44:57,664 - INFO - Guardada comparación entre Medidas activas.txt y Juego ganar ganar.txt con 10.67% de similitud.
|
||||||
|
2025-08-09 00:44:57,667 - INFO - Guardada comparación entre Medidas activas.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 20.41% de similitud.
|
||||||
|
2025-08-09 00:44:57,671 - INFO - Guardada comparación entre Medidas activas.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 19.58% de similitud.
|
||||||
|
2025-08-09 00:44:57,674 - INFO - Guardada comparación entre Medidas activas.txt y Oswald Pohl.txt con 10.45% de similitud.
|
||||||
|
2025-08-09 00:44:57,678 - INFO - Guardada comparación entre Medidas activas.txt y Guerra de Reforma.txt con 22.27% de similitud.
|
||||||
|
2025-08-09 00:44:57,682 - INFO - Guardada comparación entre Medidas activas.txt y Teletón El Salvador.txt con 17.38% de similitud.
|
||||||
|
2025-08-09 00:44:57,686 - INFO - Guardada comparación entre Medidas activas.txt y Antônio de Sousa Neto.txt con 7.58% de similitud.
|
||||||
|
2025-08-09 00:44:57,689 - INFO - Guardada comparación entre Medidas activas.txt y Mercenarios (BattleTech).txt con 20.02% de similitud.
|
||||||
|
2025-08-09 00:44:57,693 - INFO - Guardada comparación entre Medidas activas.txt y Emisora móvil.txt con 17.74% de similitud.
|
||||||
|
2025-08-09 00:44:57,697 - INFO - Guardada comparación entre Medidas activas.txt y Demografía de la República Democrática del Congo.txt con 14.05% de similitud.
|
||||||
|
2025-08-09 00:44:57,701 - INFO - Guardada comparación entre Medidas activas.txt y Desigualdad de ingreso.txt con 17.88% de similitud.
|
||||||
|
2025-08-09 00:44:57,706 - INFO - Guardada comparación entre Medidas activas.txt y Terrorismo de extrema izquierda.txt con 22.17% de similitud.
|
||||||
|
2025-08-09 00:44:57,711 - INFO - Guardada comparación entre Estéfany Grajales.txt y Iberos.txt con 1.97% de similitud.
|
||||||
|
2025-08-09 00:44:57,714 - INFO - Guardada comparación entre Estéfany Grajales.txt y .km.txt con 8.89% de similitud.
|
||||||
|
2025-08-09 00:44:57,717 - INFO - Guardada comparación entre Estéfany Grajales.txt y Censura internacional china.txt con 7.29% de similitud.
|
||||||
|
2025-08-09 00:44:57,721 - INFO - Guardada comparación entre Estéfany Grajales.txt y Alfarería en la provincia de Almería.txt con 6.44% de similitud.
|
||||||
|
2025-08-09 00:44:57,724 - INFO - Guardada comparación entre Estéfany Grajales.txt y Acuerdo de Prespa.txt con 15.71% de similitud.
|
||||||
|
2025-08-09 00:44:57,727 - INFO - Guardada comparación entre Estéfany Grajales.txt y Segunda Cumbre BRIC 2010.txt con 10.45% de similitud.
|
||||||
|
2025-08-09 00:44:57,730 - INFO - Guardada comparación entre Estéfany Grajales.txt y Santa Marina del Rey.txt con 11.64% de similitud.
|
||||||
|
2025-08-09 00:44:57,733 - INFO - Guardada comparación entre Estéfany Grajales.txt y Omaira Montoya Henao.txt con 16.86% de similitud.
|
||||||
|
2025-08-09 00:44:57,736 - INFO - Guardada comparación entre Estéfany Grajales.txt y Biodiversidad Virtual.txt con 10.64% de similitud.
|
||||||
|
2025-08-09 00:44:57,739 - INFO - Guardada comparación entre Estéfany Grajales.txt y Estudios de ciencia, tecnología y género.txt con 10.31% de similitud.
|
||||||
|
2025-08-09 00:44:57,742 - INFO - Guardada comparación entre Estéfany Grajales.txt y Representación (política).txt con 12.04% de similitud.
|
||||||
|
2025-08-09 00:44:57,745 - INFO - Guardada comparación entre Estéfany Grajales.txt y Roxana Campos.txt con 14.50% de similitud.
|
||||||
|
2025-08-09 00:44:57,750 - INFO - Guardada comparación entre Estéfany Grajales.txt y Reforma económica china.txt con 2.31% de similitud.
|
||||||
|
2025-08-09 00:44:57,753 - INFO - Guardada comparación entre Estéfany Grajales.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 7.68% de similitud.
|
||||||
|
2025-08-09 00:44:57,756 - INFO - Guardada comparación entre Estéfany Grajales.txt y Violencia obstétrica.txt con 14.46% de similitud.
|
||||||
|
2025-08-09 00:44:57,759 - INFO - Guardada comparación entre Estéfany Grajales.txt y Torrente Gros.txt con 10.42% de similitud.
|
||||||
|
2025-08-09 00:44:57,763 - INFO - Guardada comparación entre Estéfany Grajales.txt y Guerra de Reforma.txt con 7.15% de similitud.
|
||||||
|
2025-08-09 00:44:57,766 - INFO - Guardada comparación entre Estéfany Grajales.txt y Teletón El Salvador.txt con 8.55% de similitud.
|
||||||
|
2025-08-09 00:44:57,769 - INFO - Guardada comparación entre Estéfany Grajales.txt y Antônio de Sousa Neto.txt con 14.42% de similitud.
|
||||||
|
2025-08-09 00:44:57,773 - INFO - Guardada comparación entre Estéfany Grajales.txt y Unión Ortodoxa.txt con 10.95% de similitud.
|
||||||
|
2025-08-09 00:44:57,778 - INFO - Guardada comparación entre Estéfany Grajales.txt y Emisora móvil.txt con 4.23% de similitud.
|
||||||
|
2025-08-09 00:44:57,781 - INFO - Guardada comparación entre Estéfany Grajales.txt y Demografía de la República Democrática del Congo.txt con 9.08% de similitud.
|
||||||
|
2025-08-09 00:44:57,785 - INFO - Guardada comparación entre Estéfany Grajales.txt y Desigualdad de ingreso.txt con 3.78% de similitud.
|
||||||
|
2025-08-09 00:44:57,789 - INFO - Guardada comparación entre Estéfany Grajales.txt y Terrorismo de extrema izquierda.txt con 4.59% de similitud.
|
||||||
|
2025-08-09 00:44:57,801 - INFO - Guardada comparación entre Sputnik V.txt y Iberos.txt con 14.63% de similitud.
|
||||||
|
2025-08-09 00:44:57,809 - INFO - Guardada comparación entre Sputnik V.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 1.65% de similitud.
|
||||||
|
2025-08-09 00:44:57,817 - INFO - Guardada comparación entre Sputnik V.txt y Asesoría Jurídica Internacional.txt con 1.10% de similitud.
|
||||||
|
2025-08-09 00:44:57,826 - INFO - Guardada comparación entre Sputnik V.txt y Desarrollo de videojuegos independiente.txt con 6.95% de similitud.
|
||||||
|
2025-08-09 00:44:57,834 - INFO - Guardada comparación entre Sputnik V.txt y Ingeniería comercial.txt con 1.49% de similitud.
|
||||||
|
2025-08-09 00:44:57,842 - INFO - Guardada comparación entre Sputnik V.txt y Chevrolet Cobalt.txt con 0.22% de similitud.
|
||||||
|
2025-08-09 00:44:57,850 - INFO - Guardada comparación entre Sputnik V.txt y Código Unificado de Punto de Suministro.txt con 1.85% de similitud.
|
||||||
|
2025-08-09 00:44:57,858 - INFO - Guardada comparación entre Sputnik V.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 3.55% de similitud.
|
||||||
|
2025-08-09 00:44:57,866 - INFO - Guardada comparación entre Sputnik V.txt y Estación de tratamiento de agua potable.txt con 0.85% de similitud.
|
||||||
|
2025-08-09 00:44:57,874 - INFO - Guardada comparación entre Sputnik V.txt y Militar.txt con 2.22% de similitud.
|
||||||
|
2025-08-09 00:44:57,886 - INFO - Guardada comparación entre Sputnik V.txt y Demografía de Canadá.txt con 4.43% de similitud.
|
||||||
|
2025-08-09 00:44:57,898 - INFO - Guardada comparación entre Sputnik V.txt y EToro.txt con 2.24% de similitud.
|
||||||
|
2025-08-09 00:44:57,911 - INFO - Guardada comparación entre Sputnik V.txt y Ambiente biofísico.txt con 1.35% de similitud.
|
||||||
|
2025-08-09 00:44:57,919 - INFO - Guardada comparación entre Sputnik V.txt y Juego ganar ganar.txt con 1.47% de similitud.
|
||||||
|
2025-08-09 00:44:57,928 - INFO - Guardada comparación entre Sputnik V.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 3.80% de similitud.
|
||||||
|
2025-08-09 00:44:57,937 - INFO - Guardada comparación entre Sputnik V.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 3.31% de similitud.
|
||||||
|
2025-08-09 00:44:57,945 - INFO - Guardada comparación entre Sputnik V.txt y Oswald Pohl.txt con 1.19% de similitud.
|
||||||
|
2025-08-09 00:44:57,953 - INFO - Guardada comparación entre Sputnik V.txt y Empresa Nacional Siderúrgica.txt con 2.79% de similitud.
|
||||||
|
2025-08-09 00:44:57,962 - INFO - Guardada comparación entre Sputnik V.txt y Teletón El Salvador.txt con 2.96% de similitud.
|
||||||
|
2025-08-09 00:44:57,970 - INFO - Guardada comparación entre Sputnik V.txt y Antônio de Sousa Neto.txt con 0.85% de similitud.
|
||||||
|
2025-08-09 00:44:57,979 - INFO - Guardada comparación entre Sputnik V.txt y Mercenarios (BattleTech).txt con 3.28% de similitud.
|
||||||
|
2025-08-09 00:44:57,987 - INFO - Guardada comparación entre Sputnik V.txt y Efecto cis.txt con 2.36% de similitud.
|
||||||
|
2025-08-09 00:44:57,995 - INFO - Guardada comparación entre Sputnik V.txt y Demografía de la República Democrática del Congo.txt con 2.74% de similitud.
|
||||||
|
2025-08-09 00:44:58,004 - INFO - Guardada comparación entre Sputnik V.txt y Desigualdad de ingreso.txt con 7.94% de similitud.
|
||||||
|
2025-08-09 00:44:58,013 - INFO - Guardada comparación entre Sputnik V.txt y Terrorismo de extrema izquierda.txt con 7.14% de similitud.
|
||||||
|
2025-08-09 00:44:58,018 - INFO - Guardada comparación entre Día Naranja.txt y Iberos.txt con 2.73% de similitud.
|
||||||
|
2025-08-09 00:44:58,021 - INFO - Guardada comparación entre Día Naranja.txt y .km.txt con 10.44% de similitud.
|
||||||
|
2025-08-09 00:44:58,024 - INFO - Guardada comparación entre Día Naranja.txt y Censura internacional china.txt con 9.80% de similitud.
|
||||||
|
2025-08-09 00:44:58,027 - INFO - Guardada comparación entre Día Naranja.txt y Alfarería en la provincia de Almería.txt con 8.32% de similitud.
|
||||||
|
2025-08-09 00:44:58,030 - INFO - Guardada comparación entre Día Naranja.txt y Acuerdo de Prespa.txt con 13.79% de similitud.
|
||||||
|
2025-08-09 00:44:58,034 - INFO - Guardada comparación entre Día Naranja.txt y Segunda Cumbre BRIC 2010.txt con 13.09% de similitud.
|
||||||
|
2025-08-09 00:44:58,037 - INFO - Guardada comparación entre Día Naranja.txt y Santa Marina del Rey.txt con 13.53% de similitud.
|
||||||
|
2025-08-09 00:44:58,040 - INFO - Guardada comparación entre Día Naranja.txt y Omaira Montoya Henao.txt con 14.45% de similitud.
|
||||||
|
2025-08-09 00:44:58,043 - INFO - Guardada comparación entre Día Naranja.txt y Biodiversidad Virtual.txt con 14.37% de similitud.
|
||||||
|
2025-08-09 00:44:58,047 - INFO - Guardada comparación entre Día Naranja.txt y Estudios de ciencia, tecnología y género.txt con 13.66% de similitud.
|
||||||
|
2025-08-09 00:44:58,050 - INFO - Guardada comparación entre Día Naranja.txt y Representación (política).txt con 13.39% de similitud.
|
||||||
|
2025-08-09 00:44:58,053 - INFO - Guardada comparación entre Día Naranja.txt y Roxana Campos.txt con 14.48% de similitud.
|
||||||
|
2025-08-09 00:44:58,057 - INFO - Guardada comparación entre Día Naranja.txt y Reforma económica china.txt con 3.21% de similitud.
|
||||||
|
2025-08-09 00:44:58,061 - INFO - Guardada comparación entre Día Naranja.txt y Alejandro VII.txt con 10.92% de similitud.
|
||||||
|
2025-08-09 00:44:58,064 - INFO - Guardada comparación entre Día Naranja.txt y Violencia obstétrica.txt con 16.07% de similitud.
|
||||||
|
2025-08-09 00:44:58,067 - INFO - Guardada comparación entre Día Naranja.txt y Torrente Gros.txt con 12.91% de similitud.
|
||||||
|
2025-08-09 00:44:58,071 - INFO - Guardada comparación entre Día Naranja.txt y Guerra de Reforma.txt con 8.50% de similitud.
|
||||||
|
2025-08-09 00:44:58,074 - INFO - Guardada comparación entre Día Naranja.txt y Certificate Signing Request.txt con 7.28% de similitud.
|
||||||
|
2025-08-09 00:44:58,078 - INFO - Guardada comparación entre Día Naranja.txt y Katalin Bogyay.txt con 9.29% de similitud.
|
||||||
|
2025-08-09 00:44:58,081 - INFO - Guardada comparación entre Día Naranja.txt y Unión Ortodoxa.txt con 12.26% de similitud.
|
||||||
|
2025-08-09 00:44:58,085 - INFO - Guardada comparación entre Día Naranja.txt y Emisora móvil.txt con 6.07% de similitud.
|
||||||
|
2025-08-09 00:44:58,088 - INFO - Guardada comparación entre Día Naranja.txt y Sanción.txt con 3.32% de similitud.
|
||||||
|
2025-08-09 00:44:58,091 - INFO - Guardada comparación entre Día Naranja.txt y Saúl Luciano Lliuya.txt con 15.74% de similitud.
|
||||||
|
2025-08-09 00:44:58,094 - INFO - Guardada comparación entre Día Naranja.txt y Antiprotestantismo.txt con 11.52% de similitud.
|
||||||
|
2025-08-09 00:44:58,098 - INFO - Guardada comparación entre Negro de carbón.txt y Desigualdad de ingreso en Estados Unidos.txt con 16.13% de similitud.
|
||||||
|
2025-08-09 00:44:58,104 - INFO - Guardada comparación entre Negro de carbón.txt y Iberos.txt con 4.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,108 - INFO - Guardada comparación entre Negro de carbón.txt y .km.txt con 10.24% de similitud.
|
||||||
|
2025-08-09 00:44:58,112 - INFO - Guardada comparación entre Negro de carbón.txt y Censura internacional china.txt con 12.10% de similitud.
|
||||||
|
2025-08-09 00:44:58,115 - INFO - Guardada comparación entre Negro de carbón.txt y Alfarería en la provincia de Almería.txt con 12.17% de similitud.
|
||||||
|
2025-08-09 00:44:58,119 - INFO - Guardada comparación entre Negro de carbón.txt y Acuerdo de Prespa.txt con 10.82% de similitud.
|
||||||
|
2025-08-09 00:44:58,122 - INFO - Guardada comparación entre Negro de carbón.txt y Segunda Cumbre BRIC 2010.txt con 16.75% de similitud.
|
||||||
|
2025-08-09 00:44:58,125 - INFO - Guardada comparación entre Negro de carbón.txt y Santa Marina del Rey.txt con 16.03% de similitud.
|
||||||
|
2025-08-09 00:44:58,128 - INFO - Guardada comparación entre Negro de carbón.txt y Omaira Montoya Henao.txt con 15.87% de similitud.
|
||||||
|
2025-08-09 00:44:58,132 - INFO - Guardada comparación entre Negro de carbón.txt y Biodiversidad Virtual.txt con 16.90% de similitud.
|
||||||
|
2025-08-09 00:44:58,136 - INFO - Guardada comparación entre Negro de carbón.txt y Estudios de ciencia, tecnología y género.txt con 15.48% de similitud.
|
||||||
|
2025-08-09 00:44:58,139 - INFO - Guardada comparación entre Negro de carbón.txt y Representación (política).txt con 17.32% de similitud.
|
||||||
|
2025-08-09 00:44:58,142 - INFO - Guardada comparación entre Negro de carbón.txt y Roxana Campos.txt con 13.41% de similitud.
|
||||||
|
2025-08-09 00:44:58,147 - INFO - Guardada comparación entre Negro de carbón.txt y Reforma económica china.txt con 4.87% de similitud.
|
||||||
|
2025-08-09 00:44:58,151 - INFO - Guardada comparación entre Negro de carbón.txt y Alejandro VII.txt con 14.84% de similitud.
|
||||||
|
2025-08-09 00:44:58,154 - INFO - Guardada comparación entre Negro de carbón.txt y Violencia obstétrica.txt con 16.67% de similitud.
|
||||||
|
2025-08-09 00:44:58,158 - INFO - Guardada comparación entre Negro de carbón.txt y Torrente Gros.txt con 17.75% de similitud.
|
||||||
|
2025-08-09 00:44:58,161 - INFO - Guardada comparación entre Negro de carbón.txt y Guerra de Reforma.txt con 11.89% de similitud.
|
||||||
|
2025-08-09 00:44:58,165 - INFO - Guardada comparación entre Negro de carbón.txt y Certificate Signing Request.txt con 10.17% de similitud.
|
||||||
|
2025-08-09 00:44:58,168 - INFO - Guardada comparación entre Negro de carbón.txt y Katalin Bogyay.txt con 10.83% de similitud.
|
||||||
|
2025-08-09 00:44:58,173 - INFO - Guardada comparación entre Negro de carbón.txt y Mercenarios (BattleTech).txt con 13.12% de similitud.
|
||||||
|
2025-08-09 00:44:58,176 - INFO - Guardada comparación entre Negro de carbón.txt y Emisora móvil.txt con 9.11% de similitud.
|
||||||
|
2025-08-09 00:44:58,180 - INFO - Guardada comparación entre Negro de carbón.txt y Demografía de la República Democrática del Congo.txt con 16.70% de similitud.
|
||||||
|
2025-08-09 00:44:58,185 - INFO - Guardada comparación entre Negro de carbón.txt y Desigualdad de ingreso.txt con 8.19% de similitud.
|
||||||
|
2025-08-09 00:44:58,190 - INFO - Guardada comparación entre Negro de carbón.txt y Terrorismo de extrema izquierda.txt con 8.76% de similitud.
|
||||||
|
2025-08-09 00:44:58,196 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Iberos.txt con 1.52% de similitud.
|
||||||
|
2025-08-09 00:44:58,199 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y .km.txt con 10.66% de similitud.
|
||||||
|
2025-08-09 00:44:58,203 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Censura internacional china.txt con 5.10% de similitud.
|
||||||
|
2025-08-09 00:44:58,206 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Alfarería en la provincia de Almería.txt con 4.59% de similitud.
|
||||||
|
2025-08-09 00:44:58,209 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Acuerdo de Prespa.txt con 14.33% de similitud.
|
||||||
|
2025-08-09 00:44:58,213 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Segunda Cumbre BRIC 2010.txt con 8.35% de similitud.
|
||||||
|
2025-08-09 00:44:58,216 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Santa Marina del Rey.txt con 10.95% de similitud.
|
||||||
|
2025-08-09 00:44:58,219 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Omaira Montoya Henao.txt con 11.37% de similitud.
|
||||||
|
2025-08-09 00:44:58,222 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Biodiversidad Virtual.txt con 9.89% de similitud.
|
||||||
|
2025-08-09 00:44:58,225 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Estudios de ciencia, tecnología y género.txt con 7.47% de similitud.
|
||||||
|
2025-08-09 00:44:58,228 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Representación (política).txt con 8.14% de similitud.
|
||||||
|
2025-08-09 00:44:58,232 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Roxana Campos.txt con 11.45% de similitud.
|
||||||
|
2025-08-09 00:44:58,236 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Reforma económica china.txt con 1.85% de similitud.
|
||||||
|
2025-08-09 00:44:58,239 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Alejandro VII.txt con 7.07% de similitud.
|
||||||
|
2025-08-09 00:44:58,243 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Violencia obstétrica.txt con 8.36% de similitud.
|
||||||
|
2025-08-09 00:44:58,246 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Torrente Gros.txt con 8.36% de similitud.
|
||||||
|
2025-08-09 00:44:58,249 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Guerra de Reforma.txt con 5.13% de similitud.
|
||||||
|
2025-08-09 00:44:58,252 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Certificate Signing Request.txt con 5.35% de similitud.
|
||||||
|
2025-08-09 00:44:58,256 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Katalin Bogyay.txt con 4.67% de similitud.
|
||||||
|
2025-08-09 00:44:58,259 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Unión Ortodoxa.txt con 7.72% de similitud.
|
||||||
|
2025-08-09 00:44:58,263 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Emisora móvil.txt con 3.57% de similitud.
|
||||||
|
2025-08-09 00:44:58,266 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Demografía de la República Democrática del Congo.txt con 7.35% de similitud.
|
||||||
|
2025-08-09 00:44:58,270 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Desigualdad de ingreso.txt con 2.81% de similitud.
|
||||||
|
2025-08-09 00:44:58,274 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Terrorismo de extrema izquierda.txt con 3.58% de similitud.
|
||||||
|
2025-08-09 00:44:58,278 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Iberos.txt con 2.17% de similitud.
|
||||||
|
2025-08-09 00:44:58,281 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y .km.txt con 9.51% de similitud.
|
||||||
|
2025-08-09 00:44:58,285 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Censura internacional china.txt con 8.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,288 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Alfarería en la provincia de Almería.txt con 7.11% de similitud.
|
||||||
|
2025-08-09 00:44:58,291 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Ingeniería comercial.txt con 15.79% de similitud.
|
||||||
|
2025-08-09 00:44:58,294 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Segunda Cumbre BRIC 2010.txt con 12.82% de similitud.
|
||||||
|
2025-08-09 00:44:58,297 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Código Unificado de Punto de Suministro.txt con 12.44% de similitud.
|
||||||
|
2025-08-09 00:44:58,303 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Santa Marina del Rey.txt con 14.06% de similitud.
|
||||||
|
2025-08-09 00:44:58,306 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Biodiversidad Virtual.txt con 14.30% de similitud.
|
||||||
|
2025-08-09 00:44:58,309 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Estudios de ciencia, tecnología y género.txt con 11.39% de similitud.
|
||||||
|
2025-08-09 00:44:58,312 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Representación (política).txt con 12.52% de similitud.
|
||||||
|
2025-08-09 00:44:58,316 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y EToro.txt con 12.19% de similitud.
|
||||||
|
2025-08-09 00:44:58,320 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Reforma económica china.txt con 2.67% de similitud.
|
||||||
|
2025-08-09 00:44:58,324 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Alejandro VII.txt con 10.32% de similitud.
|
||||||
|
2025-08-09 00:44:58,327 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Violencia obstétrica.txt con 14.46% de similitud.
|
||||||
|
2025-08-09 00:44:58,330 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Torrente Gros.txt con 12.71% de similitud.
|
||||||
|
2025-08-09 00:44:58,333 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Guerra de Reforma.txt con 8.33% de similitud.
|
||||||
|
2025-08-09 00:44:58,337 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Certificate Signing Request.txt con 6.24% de similitud.
|
||||||
|
2025-08-09 00:44:58,340 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Katalin Bogyay.txt con 7.35% de similitud.
|
||||||
|
2025-08-09 00:44:58,343 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Unión Ortodoxa.txt con 12.50% de similitud.
|
||||||
|
2025-08-09 00:44:58,347 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Emisora móvil.txt con 5.22% de similitud.
|
||||||
|
2025-08-09 00:44:58,349 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Sanción.txt con 3.99% de similitud.
|
||||||
|
2025-08-09 00:44:58,352 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Saúl Luciano Lliuya.txt con 14.36% de similitud.
|
||||||
|
2025-08-09 00:44:58,356 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Antiprotestantismo.txt con 9.90% de similitud.
|
||||||
|
2025-08-09 00:44:58,359 - INFO - Guardada comparación entre Criptografía híbrida.txt y Desigualdad de ingreso en Estados Unidos.txt con 7.82% de similitud.
|
||||||
|
2025-08-09 00:44:58,362 - INFO - Guardada comparación entre Criptografía híbrida.txt y Club Deportivo La Equidad (Femenino).txt con 8.48% de similitud.
|
||||||
|
2025-08-09 00:44:58,365 - INFO - Guardada comparación entre Criptografía híbrida.txt y .km.txt con 10.20% de similitud.
|
||||||
|
2025-08-09 00:44:58,368 - INFO - Guardada comparación entre Criptografía híbrida.txt y Asesoría Jurídica Internacional.txt con 10.83% de similitud.
|
||||||
|
2025-08-09 00:44:58,371 - INFO - Guardada comparación entre Criptografía híbrida.txt y Desarrollo de videojuegos independiente.txt con 3.16% de similitud.
|
||||||
|
2025-08-09 00:44:58,374 - INFO - Guardada comparación entre Criptografía híbrida.txt y Ingeniería comercial.txt con 10.03% de similitud.
|
||||||
|
2025-08-09 00:44:58,377 - INFO - Guardada comparación entre Criptografía híbrida.txt y Chevrolet Cobalt.txt con 6.92% de similitud.
|
||||||
|
2025-08-09 00:44:58,380 - INFO - Guardada comparación entre Criptografía híbrida.txt y Código Unificado de Punto de Suministro.txt con 9.07% de similitud.
|
||||||
|
2025-08-09 00:44:58,383 - INFO - Guardada comparación entre Criptografía híbrida.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 5.50% de similitud.
|
||||||
|
2025-08-09 00:44:58,386 - INFO - Guardada comparación entre Criptografía híbrida.txt y Estación de tratamiento de agua potable.txt con 12.52% de similitud.
|
||||||
|
2025-08-09 00:44:58,389 - INFO - Guardada comparación entre Criptografía híbrida.txt y Militar.txt con 8.93% de similitud.
|
||||||
|
2025-08-09 00:44:58,392 - INFO - Guardada comparación entre Criptografía híbrida.txt y Demografía de Canadá.txt con 4.88% de similitud.
|
||||||
|
2025-08-09 00:44:58,395 - INFO - Guardada comparación entre Criptografía híbrida.txt y EToro.txt con 7.21% de similitud.
|
||||||
|
2025-08-09 00:44:58,398 - INFO - Guardada comparación entre Criptografía híbrida.txt y Ambiente biofísico.txt con 11.15% de similitud.
|
||||||
|
2025-08-09 00:44:58,401 - INFO - Guardada comparación entre Criptografía híbrida.txt y Juego ganar ganar.txt con 12.15% de similitud.
|
||||||
|
2025-08-09 00:44:58,404 - INFO - Guardada comparación entre Criptografía híbrida.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 5.76% de similitud.
|
||||||
|
2025-08-09 00:44:58,407 - INFO - Guardada comparación entre Criptografía híbrida.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 6.52% de similitud.
|
||||||
|
2025-08-09 00:44:58,410 - INFO - Guardada comparación entre Criptografía híbrida.txt y Oswald Pohl.txt con 9.51% de similitud.
|
||||||
|
2025-08-09 00:44:58,413 - INFO - Guardada comparación entre Criptografía híbrida.txt y Empresa Nacional Siderúrgica.txt con 5.95% de similitud.
|
||||||
|
2025-08-09 00:44:58,416 - INFO - Guardada comparación entre Criptografía híbrida.txt y Teletón El Salvador.txt con 6.67% de similitud.
|
||||||
|
2025-08-09 00:44:58,419 - INFO - Guardada comparación entre Criptografía híbrida.txt y Antônio de Sousa Neto.txt con 11.36% de similitud.
|
||||||
|
2025-08-09 00:44:58,422 - INFO - Guardada comparación entre Criptografía híbrida.txt y Mercenarios (BattleTech).txt con 5.61% de similitud.
|
||||||
|
2025-08-09 00:44:58,425 - INFO - Guardada comparación entre Criptografía híbrida.txt y Efecto cis.txt con 8.28% de similitud.
|
||||||
|
2025-08-09 00:44:58,428 - INFO - Guardada comparación entre Criptografía híbrida.txt y Sanción.txt con 5.26% de similitud.
|
||||||
|
2025-08-09 00:44:58,431 - INFO - Guardada comparación entre Criptografía híbrida.txt y Saúl Luciano Lliuya.txt con 9.64% de similitud.
|
||||||
|
2025-08-09 00:44:58,434 - INFO - Guardada comparación entre Criptografía híbrida.txt y Antiprotestantismo.txt con 5.97% de similitud.
|
||||||
|
2025-08-09 00:44:58,438 - INFO - Guardada comparación entre Criptografía híbrida.txt y Terrorismo de extrema izquierda.txt con 3.06% de similitud.
|
||||||
|
2025-08-09 00:44:58,442 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Iberos.txt con 0.83% de similitud.
|
||||||
|
2025-08-09 00:44:58,445 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y .km.txt con 8.12% de similitud.
|
||||||
|
2025-08-09 00:44:58,448 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Censura internacional china.txt con 3.49% de similitud.
|
||||||
|
2025-08-09 00:44:58,451 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Alfarería en la provincia de Almería.txt con 2.81% de similitud.
|
||||||
|
2025-08-09 00:44:58,455 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Ingeniería comercial.txt con 7.38% de similitud.
|
||||||
|
2025-08-09 00:44:58,458 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Segunda Cumbre BRIC 2010.txt con 5.79% de similitud.
|
||||||
|
2025-08-09 00:44:58,460 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Santa Marina del Rey.txt con 7.58% de similitud.
|
||||||
|
2025-08-09 00:44:58,463 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Omaira Montoya Henao.txt con 8.63% de similitud.
|
||||||
|
2025-08-09 00:44:58,466 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Biodiversidad Virtual.txt con 6.74% de similitud.
|
||||||
|
2025-08-09 00:44:58,469 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Estudios de ciencia, tecnología y género.txt con 4.84% de similitud.
|
||||||
|
2025-08-09 00:44:58,472 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Representación (política).txt con 5.67% de similitud.
|
||||||
|
2025-08-09 00:44:58,476 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Roxana Campos.txt con 10.01% de similitud.
|
||||||
|
2025-08-09 00:44:58,480 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Reforma económica china.txt con 1.00% de similitud.
|
||||||
|
2025-08-09 00:44:58,483 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Alejandro VII.txt con 4.75% de similitud.
|
||||||
|
2025-08-09 00:44:58,489 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Violencia obstétrica.txt con 5.36% de similitud.
|
||||||
|
2025-08-09 00:44:58,492 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Guerra de Reforma.txt con 3.03% de similitud.
|
||||||
|
2025-08-09 00:44:58,496 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Certificate Signing Request.txt con 2.87% de similitud.
|
||||||
|
2025-08-09 00:44:58,499 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Katalin Bogyay.txt con 2.92% de similitud.
|
||||||
|
2025-08-09 00:44:58,502 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Unión Ortodoxa.txt con 5.06% de similitud.
|
||||||
|
2025-08-09 00:44:58,506 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Emisora móvil.txt con 2.03% de similitud.
|
||||||
|
2025-08-09 00:44:58,508 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Sanción.txt con 6.58% de similitud.
|
||||||
|
2025-08-09 00:44:58,511 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Saúl Luciano Lliuya.txt con 10.32% de similitud.
|
||||||
|
2025-08-09 00:44:58,514 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Antiprotestantismo.txt con 4.37% de similitud.
|
||||||
|
2025-08-09 00:44:58,517 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Desigualdad de ingreso en Estados Unidos.txt con 18.11% de similitud.
|
||||||
|
2025-08-09 00:44:58,523 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Iberos.txt con 4.99% de similitud.
|
||||||
|
2025-08-09 00:44:58,526 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y .km.txt con 8.77% de similitud.
|
||||||
|
2025-08-09 00:44:58,530 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Censura internacional china.txt con 14.72% de similitud.
|
||||||
|
2025-08-09 00:44:58,533 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Alfarería en la provincia de Almería.txt con 13.31% de similitud.
|
||||||
|
2025-08-09 00:44:58,536 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Acuerdo de Prespa.txt con 9.82% de similitud.
|
||||||
|
2025-08-09 00:44:58,540 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Segunda Cumbre BRIC 2010.txt con 19.37% de similitud.
|
||||||
|
2025-08-09 00:44:58,543 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Santa Marina del Rey.txt con 15.42% de similitud.
|
||||||
|
2025-08-09 00:44:58,546 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Omaira Montoya Henao.txt con 18.60% de similitud.
|
||||||
|
2025-08-09 00:44:58,550 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Biodiversidad Virtual.txt con 18.93% de similitud.
|
||||||
|
2025-08-09 00:44:58,553 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Estudios de ciencia, tecnología y género.txt con 18.39% de similitud.
|
||||||
|
2025-08-09 00:44:58,556 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Representación (política).txt con 18.64% de similitud.
|
||||||
|
2025-08-09 00:44:58,559 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Roxana Campos.txt con 13.19% de similitud.
|
||||||
|
2025-08-09 00:44:58,564 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Reforma económica china.txt con 6.23% de similitud.
|
||||||
|
2025-08-09 00:44:58,567 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Alejandro VII.txt con 17.53% de similitud.
|
||||||
|
2025-08-09 00:44:58,571 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Violencia obstétrica.txt con 18.68% de similitud.
|
||||||
|
2025-08-09 00:44:58,574 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Torrente Gros.txt con 19.27% de similitud.
|
||||||
|
2025-08-09 00:44:58,578 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Guerra de Reforma.txt con 15.54% de similitud.
|
||||||
|
2025-08-09 00:44:58,581 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Certificate Signing Request.txt con 9.38% de similitud.
|
||||||
|
2025-08-09 00:44:58,585 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Katalin Bogyay.txt con 13.31% de similitud.
|
||||||
|
2025-08-09 00:44:58,589 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Mercenarios (BattleTech).txt con 14.61% de similitud.
|
||||||
|
2025-08-09 00:44:58,593 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Efecto cis.txt con 16.18% de similitud.
|
||||||
|
2025-08-09 00:44:58,596 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Sanción.txt con 2.47% de similitud.
|
||||||
|
2025-08-09 00:44:58,599 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Saúl Luciano Lliuya.txt con 13.65% de similitud.
|
||||||
|
2025-08-09 00:44:58,602 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Antiprotestantismo.txt con 16.94% de similitud.
|
||||||
580
FLUJOS_DATOS/COMPARACIONES/pipeline_mongolo.log.2
Normal file
|
|
@ -0,0 +1,580 @@
|
||||||
|
2025-08-09 00:44:56,475 - INFO - Guardada comparación entre Hammer Film Productions.txt y Efecto cis.txt con 11.97% de similitud.
|
||||||
|
2025-08-09 00:44:56,481 - INFO - Guardada comparación entre Hammer Film Productions.txt y Demografía de la República Democrática del Congo.txt con 12.70% de similitud.
|
||||||
|
2025-08-09 00:44:56,485 - INFO - Guardada comparación entre Hammer Film Productions.txt y Desigualdad de ingreso.txt con 11.06% de similitud.
|
||||||
|
2025-08-09 00:44:56,489 - INFO - Guardada comparación entre Hammer Film Productions.txt y Terrorismo de extrema izquierda.txt con 11.13% de similitud.
|
||||||
|
2025-08-09 00:44:56,492 - INFO - Guardada comparación entre Big Water.txt y Club Deportivo La Equidad (Femenino).txt con 16.83% de similitud.
|
||||||
|
2025-08-09 00:44:56,496 - INFO - Guardada comparación entre Big Water.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 15.03% de similitud.
|
||||||
|
2025-08-09 00:44:56,499 - INFO - Guardada comparación entre Big Water.txt y Asesoría Jurídica Internacional.txt con 17.11% de similitud.
|
||||||
|
2025-08-09 00:44:56,502 - INFO - Guardada comparación entre Big Water.txt y Desarrollo de videojuegos independiente.txt con 7.09% de similitud.
|
||||||
|
2025-08-09 00:44:56,505 - INFO - Guardada comparación entre Big Water.txt y Ingeniería comercial.txt con 17.07% de similitud.
|
||||||
|
2025-08-09 00:44:56,508 - INFO - Guardada comparación entre Big Water.txt y Chevrolet Cobalt.txt con 4.89% de similitud.
|
||||||
|
2025-08-09 00:44:56,511 - INFO - Guardada comparación entre Big Water.txt y Código Unificado de Punto de Suministro.txt con 16.52% de similitud.
|
||||||
|
2025-08-09 00:44:56,515 - INFO - Guardada comparación entre Big Water.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 12.48% de similitud.
|
||||||
|
2025-08-09 00:44:56,518 - INFO - Guardada comparación entre Big Water.txt y Estación de tratamiento de agua potable.txt con 13.52% de similitud.
|
||||||
|
2025-08-09 00:44:56,521 - INFO - Guardada comparación entre Big Water.txt y Militar.txt con 14.83% de similitud.
|
||||||
|
2025-08-09 00:44:56,524 - INFO - Guardada comparación entre Big Water.txt y Demografía de Canadá.txt con 13.34% de similitud.
|
||||||
|
2025-08-09 00:44:56,527 - INFO - Guardada comparación entre Big Water.txt y EToro.txt con 16.48% de similitud.
|
||||||
|
2025-08-09 00:44:56,530 - INFO - Guardada comparación entre Big Water.txt y Ambiente biofísico.txt con 17.05% de similitud.
|
||||||
|
2025-08-09 00:44:56,534 - INFO - Guardada comparación entre Big Water.txt y Juego ganar ganar.txt con 15.27% de similitud.
|
||||||
|
2025-08-09 00:44:56,537 - INFO - Guardada comparación entre Big Water.txt y Alejandro VII.txt con 13.45% de similitud.
|
||||||
|
2025-08-09 00:44:56,540 - INFO - Guardada comparación entre Big Water.txt y Violencia obstétrica.txt con 17.57% de similitud.
|
||||||
|
2025-08-09 00:44:56,544 - INFO - Guardada comparación entre Big Water.txt y Torrente Gros.txt con 15.69% de similitud.
|
||||||
|
2025-08-09 00:44:56,547 - INFO - Guardada comparación entre Big Water.txt y Guerra de Reforma.txt con 10.91% de similitud.
|
||||||
|
2025-08-09 00:44:56,551 - INFO - Guardada comparación entre Big Water.txt y Teletón El Salvador.txt con 14.06% de similitud.
|
||||||
|
2025-08-09 00:44:56,554 - INFO - Guardada comparación entre Big Water.txt y Katalin Bogyay.txt con 10.29% de similitud.
|
||||||
|
2025-08-09 00:44:56,558 - INFO - Guardada comparación entre Big Water.txt y Mercenarios (BattleTech).txt con 11.21% de similitud.
|
||||||
|
2025-08-09 00:44:56,561 - INFO - Guardada comparación entre Big Water.txt y Efecto cis.txt con 14.48% de similitud.
|
||||||
|
2025-08-09 00:44:56,564 - INFO - Guardada comparación entre Big Water.txt y Sanción.txt con 3.02% de similitud.
|
||||||
|
2025-08-09 00:44:56,567 - INFO - Guardada comparación entre Big Water.txt y Saúl Luciano Lliuya.txt con 13.04% de similitud.
|
||||||
|
2025-08-09 00:44:56,570 - INFO - Guardada comparación entre Big Water.txt y Antiprotestantismo.txt con 13.69% de similitud.
|
||||||
|
2025-08-09 00:44:56,574 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Desigualdad de ingreso en Estados Unidos.txt con 18.62% de similitud.
|
||||||
|
2025-08-09 00:44:56,577 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Club Deportivo La Equidad (Femenino).txt con 16.26% de similitud.
|
||||||
|
2025-08-09 00:44:56,580 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y .km.txt con 7.61% de similitud.
|
||||||
|
2025-08-09 00:44:56,584 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Asesoría Jurídica Internacional.txt con 14.55% de similitud.
|
||||||
|
2025-08-09 00:44:56,588 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Desarrollo de videojuegos independiente.txt con 12.35% de similitud.
|
||||||
|
2025-08-09 00:44:56,591 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Acuerdo de Prespa.txt con 8.02% de similitud.
|
||||||
|
2025-08-09 00:44:56,594 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Segunda Cumbre BRIC 2010.txt con 19.10% de similitud.
|
||||||
|
2025-08-09 00:44:56,597 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Santa Marina del Rey.txt con 12.70% de similitud.
|
||||||
|
2025-08-09 00:44:56,601 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Omaira Montoya Henao.txt con 14.45% de similitud.
|
||||||
|
2025-08-09 00:44:56,604 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Biodiversidad Virtual.txt con 17.70% de similitud.
|
||||||
|
2025-08-09 00:44:56,608 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Estudios de ciencia, tecnología y género.txt con 19.18% de similitud.
|
||||||
|
2025-08-09 00:44:56,611 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Representación (política).txt con 19.90% de similitud.
|
||||||
|
2025-08-09 00:44:56,615 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Roxana Campos.txt con 11.47% de similitud.
|
||||||
|
2025-08-09 00:44:56,619 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Reforma económica china.txt con 7.17% de similitud.
|
||||||
|
2025-08-09 00:44:56,623 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Alejandro VII.txt con 18.36% de similitud.
|
||||||
|
2025-08-09 00:44:56,626 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Violencia obstétrica.txt con 18.69% de similitud.
|
||||||
|
2025-08-09 00:44:56,629 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Torrente Gros.txt con 17.47% de similitud.
|
||||||
|
2025-08-09 00:44:56,633 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Guerra de Reforma.txt con 17.58% de similitud.
|
||||||
|
2025-08-09 00:44:56,636 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Certificate Signing Request.txt con 10.46% de similitud.
|
||||||
|
2025-08-09 00:44:56,640 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Katalin Bogyay.txt con 15.33% de similitud.
|
||||||
|
2025-08-09 00:44:56,643 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Unión Ortodoxa.txt con 19.18% de similitud.
|
||||||
|
2025-08-09 00:44:56,647 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Emisora móvil.txt con 12.91% de similitud.
|
||||||
|
2025-08-09 00:44:56,650 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Sanción.txt con 2.22% de similitud.
|
||||||
|
2025-08-09 00:44:56,654 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Saúl Luciano Lliuya.txt con 12.41% de similitud.
|
||||||
|
2025-08-09 00:44:56,657 - INFO - Guardada comparación entre Autoridad Vasca de Protección de Datos.txt y Antiprotestantismo.txt con 16.47% de similitud.
|
||||||
|
2025-08-09 00:44:56,660 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Desigualdad de ingreso en Estados Unidos.txt con 9.93% de similitud.
|
||||||
|
2025-08-09 00:44:56,663 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Club Deportivo La Equidad (Femenino).txt con 10.49% de similitud.
|
||||||
|
2025-08-09 00:44:56,669 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 13.21% de similitud.
|
||||||
|
2025-08-09 00:44:56,673 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Censura internacional china.txt con 6.36% de similitud.
|
||||||
|
2025-08-09 00:44:56,676 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Alfarería en la provincia de Almería.txt con 6.36% de similitud.
|
||||||
|
2025-08-09 00:44:56,680 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Acuerdo de Prespa.txt con 15.27% de similitud.
|
||||||
|
2025-08-09 00:44:56,684 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Segunda Cumbre BRIC 2010.txt con 10.32% de similitud.
|
||||||
|
2025-08-09 00:44:56,687 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Santa Marina del Rey.txt con 13.06% de similitud.
|
||||||
|
2025-08-09 00:44:56,691 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Omaira Montoya Henao.txt con 15.62% de similitud.
|
||||||
|
2025-08-09 00:44:56,695 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Biodiversidad Virtual.txt con 10.62% de similitud.
|
||||||
|
2025-08-09 00:44:56,699 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Estudios de ciencia, tecnología y género.txt con 9.56% de similitud.
|
||||||
|
2025-08-09 00:44:56,702 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Representación (política).txt con 10.55% de similitud.
|
||||||
|
2025-08-09 00:44:56,706 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Roxana Campos.txt con 14.38% de similitud.
|
||||||
|
2025-08-09 00:44:56,712 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Reforma económica china.txt con 2.21% de similitud.
|
||||||
|
2025-08-09 00:44:56,716 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 7.31% de similitud.
|
||||||
|
2025-08-09 00:44:56,719 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 7.98% de similitud.
|
||||||
|
2025-08-09 00:44:56,723 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Oswald Pohl.txt con 12.58% de similitud.
|
||||||
|
2025-08-09 00:44:56,726 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Empresa Nacional Siderúrgica.txt con 9.04% de similitud.
|
||||||
|
2025-08-09 00:44:56,730 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Teletón El Salvador.txt con 7.43% de similitud.
|
||||||
|
2025-08-09 00:44:56,733 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Katalin Bogyay.txt con 6.01% de similitud.
|
||||||
|
2025-08-09 00:44:56,736 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Mercenarios (BattleTech).txt con 5.71% de similitud.
|
||||||
|
2025-08-09 00:44:56,740 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Emisora móvil.txt con 3.72% de similitud.
|
||||||
|
2025-08-09 00:44:56,743 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Demografía de la República Democrática del Congo.txt con 9.45% de similitud.
|
||||||
|
2025-08-09 00:44:56,748 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Desigualdad de ingreso.txt con 3.73% de similitud.
|
||||||
|
2025-08-09 00:44:56,752 - INFO - Guardada comparación entre Inventario General del Patrimonio Cultural Valenciano.txt y Terrorismo de extrema izquierda.txt con 4.13% de similitud.
|
||||||
|
2025-08-09 00:44:56,757 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Iberos.txt con 1.21% de similitud.
|
||||||
|
2025-08-09 00:44:56,761 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 6.90% de similitud.
|
||||||
|
2025-08-09 00:44:56,764 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Censura internacional china.txt con 3.69% de similitud.
|
||||||
|
2025-08-09 00:44:56,767 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Alfarería en la provincia de Almería.txt con 4.00% de similitud.
|
||||||
|
2025-08-09 00:44:56,771 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Acuerdo de Prespa.txt con 11.78% de similitud.
|
||||||
|
2025-08-09 00:44:56,774 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Segunda Cumbre BRIC 2010.txt con 6.94% de similitud.
|
||||||
|
2025-08-09 00:44:56,777 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Santa Marina del Rey.txt con 8.25% de similitud.
|
||||||
|
2025-08-09 00:44:56,780 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Omaira Montoya Henao.txt con 9.00% de similitud.
|
||||||
|
2025-08-09 00:44:56,783 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Biodiversidad Virtual.txt con 6.81% de similitud.
|
||||||
|
2025-08-09 00:44:56,786 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Estudios de ciencia, tecnología y género.txt con 5.95% de similitud.
|
||||||
|
2025-08-09 00:44:56,790 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Representación (política).txt con 6.83% de similitud.
|
||||||
|
2025-08-09 00:44:56,794 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Roxana Campos.txt con 9.13% de similitud.
|
||||||
|
2025-08-09 00:44:56,799 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Reforma económica china.txt con 1.47% de similitud.
|
||||||
|
2025-08-09 00:44:56,803 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Alejandro VII.txt con 5.08% de similitud.
|
||||||
|
2025-08-09 00:44:56,806 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Violencia obstétrica.txt con 6.50% de similitud.
|
||||||
|
2025-08-09 00:44:56,809 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Torrente Gros.txt con 7.26% de similitud.
|
||||||
|
2025-08-09 00:44:56,813 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Guerra de Reforma.txt con 4.55% de similitud.
|
||||||
|
2025-08-09 00:44:56,816 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Certificate Signing Request.txt con 3.25% de similitud.
|
||||||
|
2025-08-09 00:44:56,819 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Katalin Bogyay.txt con 3.41% de similitud.
|
||||||
|
2025-08-09 00:44:56,822 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Unión Ortodoxa.txt con 6.08% de similitud.
|
||||||
|
2025-08-09 00:44:56,826 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Emisora móvil.txt con 2.36% de similitud.
|
||||||
|
2025-08-09 00:44:56,829 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Demografía de la República Democrática del Congo.txt con 5.62% de similitud.
|
||||||
|
2025-08-09 00:44:56,833 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Desigualdad de ingreso.txt con 2.41% de similitud.
|
||||||
|
2025-08-09 00:44:56,836 - INFO - Guardada comparación entre Guerra Fría (desambiguación).txt y Antiprotestantismo.txt con 5.15% de similitud.
|
||||||
|
2025-08-09 00:44:56,839 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Desigualdad de ingreso en Estados Unidos.txt con 13.62% de similitud.
|
||||||
|
2025-08-09 00:44:56,842 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Club Deportivo La Equidad (Femenino).txt con 15.58% de similitud.
|
||||||
|
2025-08-09 00:44:56,850 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 14.69% de similitud.
|
||||||
|
2025-08-09 00:44:56,853 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Desarrollo de videojuegos independiente.txt con 5.69% de similitud.
|
||||||
|
2025-08-09 00:44:56,856 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Ingeniería comercial.txt con 15.75% de similitud.
|
||||||
|
2025-08-09 00:44:56,859 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Chevrolet Cobalt.txt con 6.38% de similitud.
|
||||||
|
2025-08-09 00:44:56,862 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Código Unificado de Punto de Suministro.txt con 15.34% de similitud.
|
||||||
|
2025-08-09 00:44:56,866 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 12.20% de similitud.
|
||||||
|
2025-08-09 00:44:56,868 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Estación de tratamiento de agua potable.txt con 14.52% de similitud.
|
||||||
|
2025-08-09 00:44:56,871 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Militar.txt con 13.37% de similitud.
|
||||||
|
2025-08-09 00:44:56,875 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Demografía de Canadá.txt con 9.45% de similitud.
|
||||||
|
2025-08-09 00:44:56,878 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y EToro.txt con 12.96% de similitud.
|
||||||
|
2025-08-09 00:44:56,881 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Ambiente biofísico.txt con 16.73% de similitud.
|
||||||
|
2025-08-09 00:44:56,884 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Juego ganar ganar.txt con 15.35% de similitud.
|
||||||
|
2025-08-09 00:44:56,888 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Alejandro VII.txt con 13.06% de similitud.
|
||||||
|
2025-08-09 00:44:56,891 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Violencia obstétrica.txt con 15.38% de similitud.
|
||||||
|
2025-08-09 00:44:56,894 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Torrente Gros.txt con 14.63% de similitud.
|
||||||
|
2025-08-09 00:44:56,897 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Guerra de Reforma.txt con 10.64% de similitud.
|
||||||
|
2025-08-09 00:44:56,901 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Certificate Signing Request.txt con 7.58% de similitud.
|
||||||
|
2025-08-09 00:44:56,904 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Katalin Bogyay.txt con 8.23% de similitud.
|
||||||
|
2025-08-09 00:44:56,907 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Unión Ortodoxa.txt con 13.44% de similitud.
|
||||||
|
2025-08-09 00:44:56,911 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Emisora móvil.txt con 6.24% de similitud.
|
||||||
|
2025-08-09 00:44:56,915 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Demografía de la República Democrática del Congo.txt con 12.61% de similitud.
|
||||||
|
2025-08-09 00:44:56,919 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Desigualdad de ingreso.txt con 5.01% de similitud.
|
||||||
|
2025-08-09 00:44:56,922 - INFO - Guardada comparación entre Batalla de Zaragoza.txt y Terrorismo de extrema izquierda.txt con 6.26% de similitud.
|
||||||
|
2025-08-09 00:44:56,927 - INFO - Guardada comparación entre Puebla de Segur.txt y Iberos.txt con 8.40% de similitud.
|
||||||
|
2025-08-09 00:44:56,930 - INFO - Guardada comparación entre Puebla de Segur.txt y .km.txt con 7.00% de similitud.
|
||||||
|
2025-08-09 00:44:56,934 - INFO - Guardada comparación entre Puebla de Segur.txt y Censura internacional china.txt con 17.54% de similitud.
|
||||||
|
2025-08-09 00:44:56,937 - INFO - Guardada comparación entre Puebla de Segur.txt y Alfarería en la provincia de Almería.txt con 19.11% de similitud.
|
||||||
|
2025-08-09 00:44:56,941 - INFO - Guardada comparación entre Puebla de Segur.txt y Acuerdo de Prespa.txt con 7.11% de similitud.
|
||||||
|
2025-08-09 00:44:56,944 - INFO - Guardada comparación entre Puebla de Segur.txt y Segunda Cumbre BRIC 2010.txt con 18.66% de similitud.
|
||||||
|
2025-08-09 00:44:56,948 - INFO - Guardada comparación entre Puebla de Segur.txt y Santa Marina del Rey.txt con 14.86% de similitud.
|
||||||
|
2025-08-09 00:44:56,951 - INFO - Guardada comparación entre Puebla de Segur.txt y Omaira Montoya Henao.txt con 14.33% de similitud.
|
||||||
|
2025-08-09 00:44:56,955 - INFO - Guardada comparación entre Puebla de Segur.txt y Biodiversidad Virtual.txt con 14.95% de similitud.
|
||||||
|
2025-08-09 00:44:56,958 - INFO - Guardada comparación entre Puebla de Segur.txt y Estudios de ciencia, tecnología y género.txt con 18.80% de similitud.
|
||||||
|
2025-08-09 00:44:56,961 - INFO - Guardada comparación entre Puebla de Segur.txt y Representación (política).txt con 16.42% de similitud.
|
||||||
|
2025-08-09 00:44:56,965 - INFO - Guardada comparación entre Puebla de Segur.txt y Roxana Campos.txt con 10.17% de similitud.
|
||||||
|
2025-08-09 00:44:56,970 - INFO - Guardada comparación entre Puebla de Segur.txt y Reforma económica china.txt con 8.53% de similitud.
|
||||||
|
2025-08-09 00:44:56,973 - INFO - Guardada comparación entre Puebla de Segur.txt y Alejandro VII.txt con 19.13% de similitud.
|
||||||
|
2025-08-09 00:44:56,977 - INFO - Guardada comparación entre Puebla de Segur.txt y Violencia obstétrica.txt con 16.79% de similitud.
|
||||||
|
2025-08-09 00:44:56,980 - INFO - Guardada comparación entre Puebla de Segur.txt y Torrente Gros.txt con 16.79% de similitud.
|
||||||
|
2025-08-09 00:44:56,984 - INFO - Guardada comparación entre Puebla de Segur.txt y Guerra de Reforma.txt con 18.74% de similitud.
|
||||||
|
2025-08-09 00:44:56,987 - INFO - Guardada comparación entre Puebla de Segur.txt y Certificate Signing Request.txt con 11.31% de similitud.
|
||||||
|
2025-08-09 00:44:56,991 - INFO - Guardada comparación entre Puebla de Segur.txt y Katalin Bogyay.txt con 17.46% de similitud.
|
||||||
|
2025-08-09 00:44:56,994 - INFO - Guardada comparación entre Puebla de Segur.txt y Unión Ortodoxa.txt con 18.27% de similitud.
|
||||||
|
2025-08-09 00:44:56,999 - INFO - Guardada comparación entre Puebla de Segur.txt y Emisora móvil.txt con 14.19% de similitud.
|
||||||
|
2025-08-09 00:44:57,003 - INFO - Guardada comparación entre Puebla de Segur.txt y Demografía de la República Democrática del Congo.txt con 18.04% de similitud.
|
||||||
|
2025-08-09 00:44:57,007 - INFO - Guardada comparación entre Puebla de Segur.txt y Desigualdad de ingreso.txt con 12.63% de similitud.
|
||||||
|
2025-08-09 00:44:57,011 - INFO - Guardada comparación entre Puebla de Segur.txt y Terrorismo de extrema izquierda.txt con 14.13% de similitud.
|
||||||
|
2025-08-09 00:44:57,016 - INFO - Guardada comparación entre Trabajo de mierda.txt y Iberos.txt con 1.74% de similitud.
|
||||||
|
2025-08-09 00:44:57,019 - INFO - Guardada comparación entre Trabajo de mierda.txt y .km.txt con 10.22% de similitud.
|
||||||
|
2025-08-09 00:44:57,022 - INFO - Guardada comparación entre Trabajo de mierda.txt y Censura internacional china.txt con 6.06% de similitud.
|
||||||
|
2025-08-09 00:44:57,026 - INFO - Guardada comparación entre Trabajo de mierda.txt y Alfarería en la provincia de Almería.txt con 5.14% de similitud.
|
||||||
|
2025-08-09 00:44:57,029 - INFO - Guardada comparación entre Trabajo de mierda.txt y Acuerdo de Prespa.txt con 14.73% de similitud.
|
||||||
|
2025-08-09 00:44:57,032 - INFO - Guardada comparación entre Trabajo de mierda.txt y Segunda Cumbre BRIC 2010.txt con 9.14% de similitud.
|
||||||
|
2025-08-09 00:44:57,035 - INFO - Guardada comparación entre Trabajo de mierda.txt y Santa Marina del Rey.txt con 10.35% de similitud.
|
||||||
|
2025-08-09 00:44:57,038 - INFO - Guardada comparación entre Trabajo de mierda.txt y Omaira Montoya Henao.txt con 12.13% de similitud.
|
||||||
|
2025-08-09 00:44:57,042 - INFO - Guardada comparación entre Trabajo de mierda.txt y Biodiversidad Virtual.txt con 9.75% de similitud.
|
||||||
|
2025-08-09 00:44:57,045 - INFO - Guardada comparación entre Trabajo de mierda.txt y Estudios de ciencia, tecnología y género.txt con 8.00% de similitud.
|
||||||
|
2025-08-09 00:44:57,048 - INFO - Guardada comparación entre Trabajo de mierda.txt y Representación (política).txt con 9.50% de similitud.
|
||||||
|
2025-08-09 00:44:57,051 - INFO - Guardada comparación entre Trabajo de mierda.txt y Roxana Campos.txt con 11.53% de similitud.
|
||||||
|
2025-08-09 00:44:57,056 - INFO - Guardada comparación entre Trabajo de mierda.txt y Reforma económica china.txt con 2.00% de similitud.
|
||||||
|
2025-08-09 00:44:57,059 - INFO - Guardada comparación entre Trabajo de mierda.txt y Alejandro VII.txt con 7.08% de similitud.
|
||||||
|
2025-08-09 00:44:57,062 - INFO - Guardada comparación entre Trabajo de mierda.txt y Violencia obstétrica.txt con 10.17% de similitud.
|
||||||
|
2025-08-09 00:44:57,065 - INFO - Guardada comparación entre Trabajo de mierda.txt y Torrente Gros.txt con 8.70% de similitud.
|
||||||
|
2025-08-09 00:44:57,069 - INFO - Guardada comparación entre Trabajo de mierda.txt y Guerra de Reforma.txt con 5.49% de similitud.
|
||||||
|
2025-08-09 00:44:57,072 - INFO - Guardada comparación entre Trabajo de mierda.txt y Certificate Signing Request.txt con 5.04% de similitud.
|
||||||
|
2025-08-09 00:44:57,076 - INFO - Guardada comparación entre Trabajo de mierda.txt y Katalin Bogyay.txt con 5.31% de similitud.
|
||||||
|
2025-08-09 00:44:57,079 - INFO - Guardada comparación entre Trabajo de mierda.txt y Unión Ortodoxa.txt con 8.32% de similitud.
|
||||||
|
2025-08-09 00:44:57,082 - INFO - Guardada comparación entre Trabajo de mierda.txt y Emisora móvil.txt con 3.72% de similitud.
|
||||||
|
2025-08-09 00:44:57,085 - INFO - Guardada comparación entre Trabajo de mierda.txt y Sanción.txt con 4.66% de similitud.
|
||||||
|
2025-08-09 00:44:57,089 - INFO - Guardada comparación entre Trabajo de mierda.txt y Saúl Luciano Lliuya.txt con 14.63% de similitud.
|
||||||
|
2025-08-09 00:44:57,092 - INFO - Guardada comparación entre Trabajo de mierda.txt y Antiprotestantismo.txt con 8.00% de similitud.
|
||||||
|
2025-08-09 00:44:57,096 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Desigualdad de ingreso en Estados Unidos.txt con 17.44% de similitud.
|
||||||
|
2025-08-09 00:44:57,099 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Club Deportivo La Equidad (Femenino).txt con 17.57% de similitud.
|
||||||
|
2025-08-09 00:44:57,102 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 19.50% de similitud.
|
||||||
|
2025-08-09 00:44:57,105 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Asesoría Jurídica Internacional.txt con 18.74% de similitud.
|
||||||
|
2025-08-09 00:44:57,109 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Desarrollo de videojuegos independiente.txt con 7.70% de similitud.
|
||||||
|
2025-08-09 00:44:57,112 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Ingeniería comercial.txt con 19.10% de similitud.
|
||||||
|
2025-08-09 00:44:57,115 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Chevrolet Cobalt.txt con 4.09% de similitud.
|
||||||
|
2025-08-09 00:44:57,118 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Código Unificado de Punto de Suministro.txt con 15.22% de similitud.
|
||||||
|
2025-08-09 00:44:57,122 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 14.49% de similitud.
|
||||||
|
2025-08-09 00:44:57,125 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Estación de tratamiento de agua potable.txt con 13.82% de similitud.
|
||||||
|
2025-08-09 00:44:57,128 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Militar.txt con 15.80% de similitud.
|
||||||
|
2025-08-09 00:44:57,132 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Demografía de Canadá.txt con 12.73% de similitud.
|
||||||
|
2025-08-09 00:44:57,135 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y EToro.txt con 17.91% de similitud.
|
||||||
|
2025-08-09 00:44:57,139 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Ambiente biofísico.txt con 16.50% de similitud.
|
||||||
|
2025-08-09 00:44:57,142 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Juego ganar ganar.txt con 14.05% de similitud.
|
||||||
|
2025-08-09 00:44:57,145 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 12.52% de similitud.
|
||||||
|
2025-08-09 00:44:57,148 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 14.42% de similitud.
|
||||||
|
2025-08-09 00:44:57,152 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Oswald Pohl.txt con 19.70% de similitud.
|
||||||
|
2025-08-09 00:44:57,155 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Empresa Nacional Siderúrgica.txt con 15.61% de similitud.
|
||||||
|
2025-08-09 00:44:57,159 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Teletón El Salvador.txt con 13.94% de similitud.
|
||||||
|
2025-08-09 00:44:57,162 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Antônio de Sousa Neto.txt con 16.86% de similitud.
|
||||||
|
2025-08-09 00:44:57,165 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Mercenarios (BattleTech).txt con 12.10% de similitud.
|
||||||
|
2025-08-09 00:44:57,168 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Efecto cis.txt con 13.98% de similitud.
|
||||||
|
2025-08-09 00:44:57,172 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Demografía de la República Democrática del Congo.txt con 13.79% de similitud.
|
||||||
|
2025-08-09 00:44:57,176 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Desigualdad de ingreso.txt con 7.07% de similitud.
|
||||||
|
2025-08-09 00:44:57,180 - INFO - Guardada comparación entre Susana Ruiz Cerutti.txt y Terrorismo de extrema izquierda.txt con 8.43% de similitud.
|
||||||
|
2025-08-09 00:44:57,185 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Iberos.txt con 2.38% de similitud.
|
||||||
|
2025-08-09 00:44:57,188 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y .km.txt con 9.99% de similitud.
|
||||||
|
2025-08-09 00:44:57,190 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Asesoría Jurídica Internacional.txt con 15.33% de similitud.
|
||||||
|
2025-08-09 00:44:57,194 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Desarrollo de videojuegos independiente.txt con 4.61% de similitud.
|
||||||
|
2025-08-09 00:44:57,197 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Ingeniería comercial.txt con 13.60% de similitud.
|
||||||
|
2025-08-09 00:44:57,200 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Chevrolet Cobalt.txt con 5.63% de similitud.
|
||||||
|
2025-08-09 00:44:57,203 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Código Unificado de Punto de Suministro.txt con 11.74% de similitud.
|
||||||
|
2025-08-09 00:44:57,207 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 8.92% de similitud.
|
||||||
|
2025-08-09 00:44:57,210 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Estación de tratamiento de agua potable.txt con 14.00% de similitud.
|
||||||
|
2025-08-09 00:44:57,215 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Militar.txt con 11.08% de similitud.
|
||||||
|
2025-08-09 00:44:57,218 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Representación (política).txt con 12.00% de similitud.
|
||||||
|
2025-08-09 00:44:57,222 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y EToro.txt con 11.19% de similitud.
|
||||||
|
2025-08-09 00:44:57,225 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Ambiente biofísico.txt con 13.68% de similitud.
|
||||||
|
2025-08-09 00:44:57,228 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Juego ganar ganar.txt con 13.77% de similitud.
|
||||||
|
2025-08-09 00:44:57,231 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 8.23% de similitud.
|
||||||
|
2025-08-09 00:44:57,235 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 9.00% de similitud.
|
||||||
|
2025-08-09 00:44:57,238 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Oswald Pohl.txt con 15.83% de similitud.
|
||||||
|
2025-08-09 00:44:57,241 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Empresa Nacional Siderúrgica.txt con 10.25% de similitud.
|
||||||
|
2025-08-09 00:44:57,245 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Teletón El Salvador.txt con 9.94% de similitud.
|
||||||
|
2025-08-09 00:44:57,247 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Antônio de Sousa Neto.txt con 16.10% de similitud.
|
||||||
|
2025-08-09 00:44:57,251 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Mercenarios (BattleTech).txt con 8.95% de similitud.
|
||||||
|
2025-08-09 00:44:57,254 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Efecto cis.txt con 10.28% de similitud.
|
||||||
|
2025-08-09 00:44:57,257 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Demografía de la República Democrática del Congo.txt con 9.95% de similitud.
|
||||||
|
2025-08-09 00:44:57,261 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Desigualdad de ingreso.txt con 4.18% de similitud.
|
||||||
|
2025-08-09 00:44:57,265 - INFO - Guardada comparación entre Reconstrucción Blanca.txt y Terrorismo de extrema izquierda.txt con 5.45% de similitud.
|
||||||
|
2025-08-09 00:44:57,270 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Iberos.txt con 7.01% de similitud.
|
||||||
|
2025-08-09 00:44:57,273 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y .km.txt con 6.49% de similitud.
|
||||||
|
2025-08-09 00:44:57,277 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Censura internacional china.txt con 19.33% de similitud.
|
||||||
|
2025-08-09 00:44:57,281 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Alfarería en la provincia de Almería.txt con 16.93% de similitud.
|
||||||
|
2025-08-09 00:44:57,284 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Acuerdo de Prespa.txt con 8.17% de similitud.
|
||||||
|
2025-08-09 00:44:57,288 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Segunda Cumbre BRIC 2010.txt con 20.93% de similitud.
|
||||||
|
2025-08-09 00:44:57,291 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Santa Marina del Rey.txt con 13.26% de similitud.
|
||||||
|
2025-08-09 00:44:57,294 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Omaira Montoya Henao.txt con 15.23% de similitud.
|
||||||
|
2025-08-09 00:44:57,297 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Biodiversidad Virtual.txt con 16.65% de similitud.
|
||||||
|
2025-08-09 00:44:57,301 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Estudios de ciencia, tecnología y género.txt con 19.56% de similitud.
|
||||||
|
2025-08-09 00:44:57,304 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Representación (política).txt con 19.55% de similitud.
|
||||||
|
2025-08-09 00:44:57,308 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Roxana Campos.txt con 9.87% de similitud.
|
||||||
|
2025-08-09 00:44:57,312 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Reforma económica china.txt con 8.41% de similitud.
|
||||||
|
2025-08-09 00:44:57,316 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Alejandro VII.txt con 20.21% de similitud.
|
||||||
|
2025-08-09 00:44:57,319 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Violencia obstétrica.txt con 19.13% de similitud.
|
||||||
|
2025-08-09 00:44:57,323 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Torrente Gros.txt con 18.39% de similitud.
|
||||||
|
2025-08-09 00:44:57,326 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Guerra de Reforma.txt con 19.88% de similitud.
|
||||||
|
2025-08-09 00:44:57,330 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Certificate Signing Request.txt con 9.67% de similitud.
|
||||||
|
2025-08-09 00:44:57,333 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Katalin Bogyay.txt con 16.04% de similitud.
|
||||||
|
2025-08-09 00:44:57,337 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Unión Ortodoxa.txt con 19.42% de similitud.
|
||||||
|
2025-08-09 00:44:57,341 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Emisora móvil.txt con 14.11% de similitud.
|
||||||
|
2025-08-09 00:44:57,344 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Sanción.txt con 2.14% de similitud.
|
||||||
|
2025-08-09 00:44:57,347 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Saúl Luciano Lliuya.txt con 11.82% de similitud.
|
||||||
|
2025-08-09 00:44:57,350 - INFO - Guardada comparación entre Relaciones Unión Europea-micro-Estados europeos.txt y Antiprotestantismo.txt con 17.82% de similitud.
|
||||||
|
2025-08-09 00:44:57,354 - INFO - Guardada comparación entre Juegos de guerra.txt y Desigualdad de ingreso en Estados Unidos.txt con 16.80% de similitud.
|
||||||
|
2025-08-09 00:44:57,358 - INFO - Guardada comparación entre Juegos de guerra.txt y Club Deportivo La Equidad (Femenino).txt con 13.43% de similitud.
|
||||||
|
2025-08-09 00:44:57,361 - INFO - Guardada comparación entre Juegos de guerra.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 13.43% de similitud.
|
||||||
|
2025-08-09 00:44:57,365 - INFO - Guardada comparación entre Juegos de guerra.txt y Censura internacional china.txt con 18.24% de similitud.
|
||||||
|
2025-08-09 00:44:57,369 - INFO - Guardada comparación entre Juegos de guerra.txt y Alfarería en la provincia de Almería.txt con 16.38% de similitud.
|
||||||
|
2025-08-09 00:44:57,372 - INFO - Guardada comparación entre Juegos de guerra.txt y Acuerdo de Prespa.txt con 5.59% de similitud.
|
||||||
|
2025-08-09 00:44:57,376 - INFO - Guardada comparación entre Juegos de guerra.txt y Segunda Cumbre BRIC 2010.txt con 17.45% de similitud.
|
||||||
|
2025-08-09 00:44:57,379 - INFO - Guardada comparación entre Juegos de guerra.txt y Santa Marina del Rey.txt con 10.44% de similitud.
|
||||||
|
2025-08-09 00:44:57,382 - INFO - Guardada comparación entre Juegos de guerra.txt y Omaira Montoya Henao.txt con 10.66% de similitud.
|
||||||
|
2025-08-09 00:44:57,386 - INFO - Guardada comparación entre Juegos de guerra.txt y Biodiversidad Virtual.txt con 13.83% de similitud.
|
||||||
|
2025-08-09 00:44:57,389 - INFO - Guardada comparación entre Juegos de guerra.txt y Estudios de ciencia, tecnología y género.txt con 16.93% de similitud.
|
||||||
|
2025-08-09 00:44:57,392 - INFO - Guardada comparación entre Juegos de guerra.txt y Representación (política).txt con 15.91% de similitud.
|
||||||
|
2025-08-09 00:44:57,396 - INFO - Guardada comparación entre Juegos de guerra.txt y Roxana Campos.txt con 8.33% de similitud.
|
||||||
|
2025-08-09 00:44:57,399 - INFO - Guardada comparación entre Juegos de guerra.txt y Ambiente biofísico.txt con 12.18% de similitud.
|
||||||
|
2025-08-09 00:44:57,403 - INFO - Guardada comparación entre Juegos de guerra.txt y Juego ganar ganar.txt con 12.95% de similitud.
|
||||||
|
2025-08-09 00:44:57,406 - INFO - Guardada comparación entre Juegos de guerra.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 18.04% de similitud.
|
||||||
|
2025-08-09 00:44:57,410 - INFO - Guardada comparación entre Juegos de guerra.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 18.54% de similitud.
|
||||||
|
2025-08-09 00:44:57,414 - INFO - Guardada comparación entre Juegos de guerra.txt y Oswald Pohl.txt con 12.17% de similitud.
|
||||||
|
2025-08-09 00:44:57,418 - INFO - Guardada comparación entre Juegos de guerra.txt y Empresa Nacional Siderúrgica.txt con 17.12% de similitud.
|
||||||
|
2025-08-09 00:44:57,421 - INFO - Guardada comparación entre Juegos de guerra.txt y Teletón El Salvador.txt con 19.06% de similitud.
|
||||||
|
2025-08-09 00:44:57,425 - INFO - Guardada comparación entre Juegos de guerra.txt y Antônio de Sousa Neto.txt con 9.18% de similitud.
|
||||||
|
2025-08-09 00:44:57,428 - INFO - Guardada comparación entre Juegos de guerra.txt y Mercenarios (BattleTech).txt con 19.59% de similitud.
|
||||||
|
2025-08-09 00:44:57,432 - INFO - Guardada comparación entre Juegos de guerra.txt y Efecto cis.txt con 14.15% de similitud.
|
||||||
|
2025-08-09 00:44:57,436 - INFO - Guardada comparación entre Juegos de guerra.txt y Demografía de la República Democrática del Congo.txt con 15.03% de similitud.
|
||||||
|
2025-08-09 00:44:57,440 - INFO - Guardada comparación entre Juegos de guerra.txt y Desigualdad de ingreso.txt con 13.63% de similitud.
|
||||||
|
2025-08-09 00:44:57,444 - INFO - Guardada comparación entre Juegos de guerra.txt y Terrorismo de extrema izquierda.txt con 15.11% de similitud.
|
||||||
|
2025-08-09 00:44:57,449 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Iberos.txt con 4.05% de similitud.
|
||||||
|
2025-08-09 00:44:57,452 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y .km.txt con 10.48% de similitud.
|
||||||
|
2025-08-09 00:44:57,455 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Censura internacional china.txt con 11.91% de similitud.
|
||||||
|
2025-08-09 00:44:57,459 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Alfarería en la provincia de Almería.txt con 9.38% de similitud.
|
||||||
|
2025-08-09 00:44:57,462 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Ingeniería comercial.txt con 13.54% de similitud.
|
||||||
|
2025-08-09 00:44:57,466 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Segunda Cumbre BRIC 2010.txt con 15.46% de similitud.
|
||||||
|
2025-08-09 00:44:57,469 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Santa Marina del Rey.txt con 11.86% de similitud.
|
||||||
|
2025-08-09 00:44:57,472 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 12.25% de similitud.
|
||||||
|
2025-08-09 00:44:57,476 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Biodiversidad Virtual.txt con 13.40% de similitud.
|
||||||
|
2025-08-09 00:44:57,479 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Estudios de ciencia, tecnología y género.txt con 12.24% de similitud.
|
||||||
|
2025-08-09 00:44:57,482 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Representación (política).txt con 13.89% de similitud.
|
||||||
|
2025-08-09 00:44:57,485 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y EToro.txt con 15.48% de similitud.
|
||||||
|
2025-08-09 00:44:57,488 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Ambiente biofísico.txt con 16.10% de similitud.
|
||||||
|
2025-08-09 00:44:57,491 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Juego ganar ganar.txt con 14.21% de similitud.
|
||||||
|
2025-08-09 00:44:57,495 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 10.25% de similitud.
|
||||||
|
2025-08-09 00:44:57,498 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 11.14% de similitud.
|
||||||
|
2025-08-09 00:44:57,501 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Oswald Pohl.txt con 12.76% de similitud.
|
||||||
|
2025-08-09 00:44:57,504 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Empresa Nacional Siderúrgica.txt con 11.38% de similitud.
|
||||||
|
2025-08-09 00:44:57,507 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Teletón El Salvador.txt con 11.31% de similitud.
|
||||||
|
2025-08-09 00:44:57,510 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Antônio de Sousa Neto.txt con 12.53% de similitud.
|
||||||
|
2025-08-09 00:44:57,516 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Unión Ortodoxa.txt con 14.20% de similitud.
|
||||||
|
2025-08-09 00:44:57,519 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Efecto cis.txt con 13.00% de similitud.
|
||||||
|
2025-08-09 00:44:57,522 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Demografía de la República Democrática del Congo.txt con 11.21% de similitud.
|
||||||
|
2025-08-09 00:44:57,526 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Desigualdad de ingreso.txt con 7.37% de similitud.
|
||||||
|
2025-08-09 00:44:57,530 - INFO - Guardada comparación entre Navegador sin interfaz gráfica.txt y Terrorismo de extrema izquierda.txt con 7.84% de similitud.
|
||||||
|
2025-08-09 00:44:57,535 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Iberos.txt con 2.69% de similitud.
|
||||||
|
2025-08-09 00:44:57,538 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y .km.txt con 11.65% de similitud.
|
||||||
|
2025-08-09 00:44:57,541 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Censura internacional china.txt con 7.83% de similitud.
|
||||||
|
2025-08-09 00:44:57,545 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Alfarería en la provincia de Almería.txt con 7.91% de similitud.
|
||||||
|
2025-08-09 00:44:57,548 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Acuerdo de Prespa.txt con 13.29% de similitud.
|
||||||
|
2025-08-09 00:44:57,551 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Segunda Cumbre BRIC 2010.txt con 11.86% de similitud.
|
||||||
|
2025-08-09 00:44:57,554 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Santa Marina del Rey.txt con 13.76% de similitud.
|
||||||
|
2025-08-09 00:44:57,557 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Omaira Montoya Henao.txt con 16.22% de similitud.
|
||||||
|
2025-08-09 00:44:57,560 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Biodiversidad Virtual.txt con 13.23% de similitud.
|
||||||
|
2025-08-09 00:44:57,563 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Estudios de ciencia, tecnología y género.txt con 11.80% de similitud.
|
||||||
|
2025-08-09 00:44:57,566 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Representación (política).txt con 13.90% de similitud.
|
||||||
|
2025-08-09 00:44:57,569 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Roxana Campos.txt con 15.37% de similitud.
|
||||||
|
2025-08-09 00:44:57,574 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Reforma económica china.txt con 3.27% de similitud.
|
||||||
|
2025-08-09 00:44:57,577 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Alejandro VII.txt con 10.26% de similitud.
|
||||||
|
2025-08-09 00:44:57,580 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Violencia obstétrica.txt con 12.67% de similitud.
|
||||||
|
2025-08-09 00:44:57,583 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Torrente Gros.txt con 11.64% de similitud.
|
||||||
|
2025-08-09 00:44:57,586 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Guerra de Reforma.txt con 8.89% de similitud.
|
||||||
|
2025-08-09 00:44:57,590 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Certificate Signing Request.txt con 7.02% de similitud.
|
||||||
|
2025-08-09 00:44:57,593 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Katalin Bogyay.txt con 7.94% de similitud.
|
||||||
|
2025-08-09 00:44:57,596 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Unión Ortodoxa.txt con 13.46% de similitud.
|
||||||
|
2025-08-09 00:44:57,600 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Emisora móvil.txt con 5.46% de similitud.
|
||||||
|
2025-08-09 00:44:57,603 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Sanción.txt con 4.75% de similitud.
|
||||||
|
2025-08-09 00:44:57,606 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Saúl Luciano Lliuya.txt con 18.10% de similitud.
|
||||||
|
2025-08-09 00:44:57,609 - INFO - Guardada comparación entre Asociación Civil Transparencia.txt y Antiprotestantismo.txt con 11.11% de similitud.
|
||||||
|
2025-08-09 00:44:57,613 - INFO - Guardada comparación entre Medidas activas.txt y Desigualdad de ingreso en Estados Unidos.txt con 17.19% de similitud.
|
||||||
|
2025-08-09 00:44:57,618 - INFO - Guardada comparación entre Medidas activas.txt y Iberos.txt con 11.34% de similitud.
|
||||||
|
2025-08-09 00:44:57,622 - INFO - Guardada comparación entre Medidas activas.txt y .km.txt con 4.69% de similitud.
|
||||||
|
2025-08-09 00:44:57,626 - INFO - Guardada comparación entre Medidas activas.txt y Censura internacional china.txt con 21.99% de similitud.
|
||||||
|
2025-08-09 00:44:57,630 - INFO - Guardada comparación entre Medidas activas.txt y Alfarería en la provincia de Almería.txt con 18.91% de similitud.
|
||||||
|
2025-08-09 00:44:57,633 - INFO - Guardada comparación entre Medidas activas.txt y Acuerdo de Prespa.txt con 5.11% de similitud.
|
||||||
|
2025-08-09 00:44:57,637 - INFO - Guardada comparación entre Medidas activas.txt y Segunda Cumbre BRIC 2010.txt con 16.23% de similitud.
|
||||||
|
2025-08-09 00:44:57,640 - INFO - Guardada comparación entre Medidas activas.txt y Santa Marina del Rey.txt con 9.02% de similitud.
|
||||||
|
2025-08-09 00:44:57,644 - INFO - Guardada comparación entre Medidas activas.txt y Omaira Montoya Henao.txt con 10.85% de similitud.
|
||||||
|
2025-08-09 00:44:57,648 - INFO - Guardada comparación entre Medidas activas.txt y Biodiversidad Virtual.txt con 11.79% de similitud.
|
||||||
|
2025-08-09 00:44:57,651 - INFO - Guardada comparación entre Medidas activas.txt y Estudios de ciencia, tecnología y género.txt con 17.04% de similitud.
|
||||||
|
2025-08-09 00:44:57,655 - INFO - Guardada comparación entre Medidas activas.txt y Representación (política).txt con 14.27% de similitud.
|
||||||
|
2025-08-09 00:44:57,658 - INFO - Guardada comparación entre Medidas activas.txt y Roxana Campos.txt con 7.25% de similitud.
|
||||||
|
2025-08-09 00:44:57,663 - INFO - Guardada comparación entre Medidas activas.txt y Reforma económica china.txt con 13.63% de similitud.
|
||||||
|
2025-08-09 00:44:57,667 - INFO - Guardada comparación entre Medidas activas.txt y Alejandro VII.txt con 17.10% de similitud.
|
||||||
|
2025-08-09 00:44:57,671 - INFO - Guardada comparación entre Medidas activas.txt y Violencia obstétrica.txt con 13.08% de similitud.
|
||||||
|
2025-08-09 00:44:57,675 - INFO - Guardada comparación entre Medidas activas.txt y Torrente Gros.txt con 12.78% de similitud.
|
||||||
|
2025-08-09 00:44:57,678 - INFO - Guardada comparación entre Medidas activas.txt y Empresa Nacional Siderúrgica.txt con 16.90% de similitud.
|
||||||
|
2025-08-09 00:44:57,682 - INFO - Guardada comparación entre Medidas activas.txt y Certificate Signing Request.txt con 10.05% de similitud.
|
||||||
|
2025-08-09 00:44:57,686 - INFO - Guardada comparación entre Medidas activas.txt y Katalin Bogyay.txt con 21.60% de similitud.
|
||||||
|
2025-08-09 00:44:57,690 - INFO - Guardada comparación entre Medidas activas.txt y Unión Ortodoxa.txt con 15.70% de similitud.
|
||||||
|
2025-08-09 00:44:57,693 - INFO - Guardada comparación entre Medidas activas.txt y Efecto cis.txt con 12.67% de similitud.
|
||||||
|
2025-08-09 00:44:57,696 - INFO - Guardada comparación entre Medidas activas.txt y Sanción.txt con 1.05% de similitud.
|
||||||
|
2025-08-09 00:44:57,700 - INFO - Guardada comparación entre Medidas activas.txt y Saúl Luciano Lliuya.txt con 7.55% de similitud.
|
||||||
|
2025-08-09 00:44:57,704 - INFO - Guardada comparación entre Medidas activas.txt y Antiprotestantismo.txt con 16.65% de similitud.
|
||||||
|
2025-08-09 00:44:57,706 - INFO - Guardada comparación entre Estéfany Grajales.txt y Desigualdad de ingreso en Estados Unidos.txt con 10.78% de similitud.
|
||||||
|
2025-08-09 00:44:57,709 - INFO - Guardada comparación entre Estéfany Grajales.txt y Club Deportivo La Equidad (Femenino).txt con 11.39% de similitud.
|
||||||
|
2025-08-09 00:44:57,712 - INFO - Guardada comparación entre Estéfany Grajales.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 12.99% de similitud.
|
||||||
|
2025-08-09 00:44:57,715 - INFO - Guardada comparación entre Estéfany Grajales.txt y Asesoría Jurídica Internacional.txt con 14.03% de similitud.
|
||||||
|
2025-08-09 00:44:57,719 - INFO - Guardada comparación entre Estéfany Grajales.txt y Desarrollo de videojuegos independiente.txt con 4.42% de similitud.
|
||||||
|
2025-08-09 00:44:57,722 - INFO - Guardada comparación entre Estéfany Grajales.txt y Ingeniería comercial.txt con 14.59% de similitud.
|
||||||
|
2025-08-09 00:44:57,725 - INFO - Guardada comparación entre Estéfany Grajales.txt y Chevrolet Cobalt.txt con 7.40% de similitud.
|
||||||
|
2025-08-09 00:44:57,728 - INFO - Guardada comparación entre Estéfany Grajales.txt y Código Unificado de Punto de Suministro.txt con 10.89% de similitud.
|
||||||
|
2025-08-09 00:44:57,732 - INFO - Guardada comparación entre Estéfany Grajales.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 8.17% de similitud.
|
||||||
|
2025-08-09 00:44:57,735 - INFO - Guardada comparación entre Estéfany Grajales.txt y Estación de tratamiento de agua potable.txt con 13.53% de similitud.
|
||||||
|
2025-08-09 00:44:57,738 - INFO - Guardada comparación entre Estéfany Grajales.txt y Militar.txt con 10.39% de similitud.
|
||||||
|
2025-08-09 00:44:57,741 - INFO - Guardada comparación entre Estéfany Grajales.txt y Demografía de Canadá.txt con 6.79% de similitud.
|
||||||
|
2025-08-09 00:44:57,744 - INFO - Guardada comparación entre Estéfany Grajales.txt y EToro.txt con 11.75% de similitud.
|
||||||
|
2025-08-09 00:44:57,747 - INFO - Guardada comparación entre Estéfany Grajales.txt y Ambiente biofísico.txt con 14.36% de similitud.
|
||||||
|
2025-08-09 00:44:57,750 - INFO - Guardada comparación entre Estéfany Grajales.txt y Juego ganar ganar.txt con 12.12% de similitud.
|
||||||
|
2025-08-09 00:44:57,753 - INFO - Guardada comparación entre Estéfany Grajales.txt y Alejandro VII.txt con 8.78% de similitud.
|
||||||
|
2025-08-09 00:44:57,757 - INFO - Guardada comparación entre Estéfany Grajales.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 8.37% de similitud.
|
||||||
|
2025-08-09 00:44:57,760 - INFO - Guardada comparación entre Estéfany Grajales.txt y Oswald Pohl.txt con 13.65% de similitud.
|
||||||
|
2025-08-09 00:44:57,763 - INFO - Guardada comparación entre Estéfany Grajales.txt y Empresa Nacional Siderúrgica.txt con 9.45% de similitud.
|
||||||
|
2025-08-09 00:44:57,766 - INFO - Guardada comparación entre Estéfany Grajales.txt y Certificate Signing Request.txt con 5.51% de similitud.
|
||||||
|
2025-08-09 00:44:57,769 - INFO - Guardada comparación entre Estéfany Grajales.txt y Katalin Bogyay.txt con 6.51% de similitud.
|
||||||
|
2025-08-09 00:44:57,773 - INFO - Guardada comparación entre Estéfany Grajales.txt y Mercenarios (BattleTech).txt con 6.79% de similitud.
|
||||||
|
2025-08-09 00:44:57,777 - INFO - Guardada comparación entre Estéfany Grajales.txt y Efecto cis.txt con 9.65% de similitud.
|
||||||
|
2025-08-09 00:44:57,781 - INFO - Guardada comparación entre Estéfany Grajales.txt y Sanción.txt con 4.40% de similitud.
|
||||||
|
2025-08-09 00:44:57,783 - INFO - Guardada comparación entre Estéfany Grajales.txt y Saúl Luciano Lliuya.txt con 16.37% de similitud.
|
||||||
|
2025-08-09 00:44:57,787 - INFO - Guardada comparación entre Estéfany Grajales.txt y Antiprotestantismo.txt con 9.59% de similitud.
|
||||||
|
2025-08-09 00:44:57,796 - INFO - Guardada comparación entre Sputnik V.txt y Desigualdad de ingreso en Estados Unidos.txt con 2.53% de similitud.
|
||||||
|
2025-08-09 00:44:57,804 - INFO - Guardada comparación entre Sputnik V.txt y Club Deportivo La Equidad (Femenino).txt con 1.72% de similitud.
|
||||||
|
2025-08-09 00:44:57,812 - INFO - Guardada comparación entre Sputnik V.txt y .km.txt con 0.64% de similitud.
|
||||||
|
2025-08-09 00:44:57,821 - INFO - Guardada comparación entre Sputnik V.txt y Censura internacional china.txt con 4.02% de similitud.
|
||||||
|
2025-08-09 00:44:57,829 - INFO - Guardada comparación entre Sputnik V.txt y Alfarería en la provincia de Almería.txt con 4.28% de similitud.
|
||||||
|
2025-08-09 00:44:57,837 - INFO - Guardada comparación entre Sputnik V.txt y Acuerdo de Prespa.txt con 0.53% de similitud.
|
||||||
|
2025-08-09 00:44:57,846 - INFO - Guardada comparación entre Sputnik V.txt y Segunda Cumbre BRIC 2010.txt con 2.43% de similitud.
|
||||||
|
2025-08-09 00:44:57,853 - INFO - Guardada comparación entre Sputnik V.txt y Santa Marina del Rey.txt con 1.12% de similitud.
|
||||||
|
2025-08-09 00:44:57,862 - INFO - Guardada comparación entre Sputnik V.txt y Omaira Montoya Henao.txt con 1.32% de similitud.
|
||||||
|
2025-08-09 00:44:57,870 - INFO - Guardada comparación entre Sputnik V.txt y Biodiversidad Virtual.txt con 1.74% de similitud.
|
||||||
|
2025-08-09 00:44:57,878 - INFO - Guardada comparación entre Sputnik V.txt y Estudios de ciencia, tecnología y género.txt con 2.52% de similitud.
|
||||||
|
2025-08-09 00:44:57,890 - INFO - Guardada comparación entre Sputnik V.txt y Representación (política).txt con 2.09% de similitud.
|
||||||
|
2025-08-09 00:44:57,902 - INFO - Guardada comparación entre Sputnik V.txt y Roxana Campos.txt con 0.80% de similitud.
|
||||||
|
2025-08-09 00:44:57,915 - INFO - Guardada comparación entre Sputnik V.txt y Reforma económica china.txt con 14.23% de similitud.
|
||||||
|
2025-08-09 00:44:57,924 - INFO - Guardada comparación entre Sputnik V.txt y Alejandro VII.txt con 2.77% de similitud.
|
||||||
|
2025-08-09 00:44:57,932 - INFO - Guardada comparación entre Sputnik V.txt y Violencia obstétrica.txt con 1.74% de similitud.
|
||||||
|
2025-08-09 00:44:57,941 - INFO - Guardada comparación entre Sputnik V.txt y Torrente Gros.txt con 1.93% de similitud.
|
||||||
|
2025-08-09 00:44:57,949 - INFO - Guardada comparación entre Sputnik V.txt y Guerra de Reforma.txt con 4.13% de similitud.
|
||||||
|
2025-08-09 00:44:57,958 - INFO - Guardada comparación entre Sputnik V.txt y Certificate Signing Request.txt con 3.45% de similitud.
|
||||||
|
2025-08-09 00:44:57,967 - INFO - Guardada comparación entre Sputnik V.txt y Katalin Bogyay.txt con 4.88% de similitud.
|
||||||
|
2025-08-09 00:44:57,975 - INFO - Guardada comparación entre Sputnik V.txt y Unión Ortodoxa.txt con 2.37% de similitud.
|
||||||
|
2025-08-09 00:44:57,985 - INFO - Guardada comparación entre Sputnik V.txt y Emisora móvil.txt con 6.42% de similitud.
|
||||||
|
2025-08-09 00:44:57,993 - INFO - Guardada comparación entre Sputnik V.txt y Sanción.txt con 0.10% de similitud.
|
||||||
|
2025-08-09 00:44:58,002 - INFO - Guardada comparación entre Sputnik V.txt y Saúl Luciano Lliuya.txt con 0.89% de similitud.
|
||||||
|
2025-08-09 00:44:58,010 - INFO - Guardada comparación entre Sputnik V.txt y Antiprotestantismo.txt con 2.64% de similitud.
|
||||||
|
2025-08-09 00:44:58,013 - INFO - Guardada comparación entre Día Naranja.txt y Desigualdad de ingreso en Estados Unidos.txt con 12.59% de similitud.
|
||||||
|
2025-08-09 00:44:58,016 - INFO - Guardada comparación entre Día Naranja.txt y Club Deportivo La Equidad (Femenino).txt con 13.83% de similitud.
|
||||||
|
2025-08-09 00:44:58,019 - INFO - Guardada comparación entre Día Naranja.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 15.00% de similitud.
|
||||||
|
2025-08-09 00:44:58,022 - INFO - Guardada comparación entre Día Naranja.txt y Asesoría Jurídica Internacional.txt con 16.10% de similitud.
|
||||||
|
2025-08-09 00:44:58,026 - INFO - Guardada comparación entre Día Naranja.txt y Desarrollo de videojuegos independiente.txt con 6.07% de similitud.
|
||||||
|
2025-08-09 00:44:58,029 - INFO - Guardada comparación entre Día Naranja.txt y Ingeniería comercial.txt con 15.65% de similitud.
|
||||||
|
2025-08-09 00:44:58,033 - INFO - Guardada comparación entre Día Naranja.txt y Chevrolet Cobalt.txt con 5.71% de similitud.
|
||||||
|
2025-08-09 00:44:58,036 - INFO - Guardada comparación entre Día Naranja.txt y Código Unificado de Punto de Suministro.txt con 12.92% de similitud.
|
||||||
|
2025-08-09 00:44:58,039 - INFO - Guardada comparación entre Día Naranja.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 9.75% de similitud.
|
||||||
|
2025-08-09 00:44:58,042 - INFO - Guardada comparación entre Día Naranja.txt y Estación de tratamiento de agua potable.txt con 14.19% de similitud.
|
||||||
|
2025-08-09 00:44:58,046 - INFO - Guardada comparación entre Día Naranja.txt y Militar.txt con 13.34% de similitud.
|
||||||
|
2025-08-09 00:44:58,049 - INFO - Guardada comparación entre Día Naranja.txt y Demografía de Canadá.txt con 9.46% de similitud.
|
||||||
|
2025-08-09 00:44:58,053 - INFO - Guardada comparación entre Día Naranja.txt y EToro.txt con 13.11% de similitud.
|
||||||
|
2025-08-09 00:44:58,056 - INFO - Guardada comparación entre Día Naranja.txt y Ambiente biofísico.txt con 16.18% de similitud.
|
||||||
|
2025-08-09 00:44:58,059 - INFO - Guardada comparación entre Día Naranja.txt y Juego ganar ganar.txt con 14.96% de similitud.
|
||||||
|
2025-08-09 00:44:58,063 - INFO - Guardada comparación entre Día Naranja.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 10.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,066 - INFO - Guardada comparación entre Día Naranja.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 11.75% de similitud.
|
||||||
|
2025-08-09 00:44:58,070 - INFO - Guardada comparación entre Día Naranja.txt y Oswald Pohl.txt con 16.52% de similitud.
|
||||||
|
2025-08-09 00:44:58,073 - INFO - Guardada comparación entre Día Naranja.txt y Empresa Nacional Siderúrgica.txt con 10.96% de similitud.
|
||||||
|
2025-08-09 00:44:58,076 - INFO - Guardada comparación entre Día Naranja.txt y Teletón El Salvador.txt con 11.40% de similitud.
|
||||||
|
2025-08-09 00:44:58,080 - INFO - Guardada comparación entre Día Naranja.txt y Antônio de Sousa Neto.txt con 14.33% de similitud.
|
||||||
|
2025-08-09 00:44:58,083 - INFO - Guardada comparación entre Día Naranja.txt y Mercenarios (BattleTech).txt con 9.49% de similitud.
|
||||||
|
2025-08-09 00:44:58,087 - INFO - Guardada comparación entre Día Naranja.txt y Efecto cis.txt con 11.08% de similitud.
|
||||||
|
2025-08-09 00:44:58,090 - INFO - Guardada comparación entre Día Naranja.txt y Demografía de la República Democrática del Congo.txt con 11.45% de similitud.
|
||||||
|
2025-08-09 00:44:58,094 - INFO - Guardada comparación entre Día Naranja.txt y Desigualdad de ingreso.txt con 5.40% de similitud.
|
||||||
|
2025-08-09 00:44:58,098 - INFO - Guardada comparación entre Día Naranja.txt y Terrorismo de extrema izquierda.txt con 6.15% de similitud.
|
||||||
|
2025-08-09 00:44:58,103 - INFO - Guardada comparación entre Negro de carbón.txt y Club Deportivo La Equidad (Femenino).txt con 16.02% de similitud.
|
||||||
|
2025-08-09 00:44:58,107 - INFO - Guardada comparación entre Negro de carbón.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 15.13% de similitud.
|
||||||
|
2025-08-09 00:44:58,110 - INFO - Guardada comparación entre Negro de carbón.txt y Asesoría Jurídica Internacional.txt con 15.62% de similitud.
|
||||||
|
2025-08-09 00:44:58,114 - INFO - Guardada comparación entre Negro de carbón.txt y Desarrollo de videojuegos independiente.txt con 8.75% de similitud.
|
||||||
|
2025-08-09 00:44:58,117 - INFO - Guardada comparación entre Negro de carbón.txt y Ingeniería comercial.txt con 17.09% de similitud.
|
||||||
|
2025-08-09 00:44:58,120 - INFO - Guardada comparación entre Negro de carbón.txt y Chevrolet Cobalt.txt con 4.84% de similitud.
|
||||||
|
2025-08-09 00:44:58,124 - INFO - Guardada comparación entre Negro de carbón.txt y Código Unificado de Punto de Suministro.txt con 16.91% de similitud.
|
||||||
|
2025-08-09 00:44:58,127 - INFO - Guardada comparación entre Negro de carbón.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 13.27% de similitud.
|
||||||
|
2025-08-09 00:44:58,131 - INFO - Guardada comparación entre Negro de carbón.txt y Estación de tratamiento de agua potable.txt con 13.96% de similitud.
|
||||||
|
2025-08-09 00:44:58,134 - INFO - Guardada comparación entre Negro de carbón.txt y Militar.txt con 17.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,137 - INFO - Guardada comparación entre Negro de carbón.txt y Demografía de Canadá.txt con 12.65% de similitud.
|
||||||
|
2025-08-09 00:44:58,141 - INFO - Guardada comparación entre Negro de carbón.txt y EToro.txt con 15.04% de similitud.
|
||||||
|
2025-08-09 00:44:58,144 - INFO - Guardada comparación entre Negro de carbón.txt y Ambiente biofísico.txt con 18.35% de similitud.
|
||||||
|
2025-08-09 00:44:58,148 - INFO - Guardada comparación entre Negro de carbón.txt y Juego ganar ganar.txt con 18.15% de similitud.
|
||||||
|
2025-08-09 00:44:58,151 - INFO - Guardada comparación entre Negro de carbón.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 13.09% de similitud.
|
||||||
|
2025-08-09 00:44:58,155 - INFO - Guardada comparación entre Negro de carbón.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 13.83% de similitud.
|
||||||
|
2025-08-09 00:44:58,158 - INFO - Guardada comparación entre Negro de carbón.txt y Oswald Pohl.txt con 16.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,161 - INFO - Guardada comparación entre Negro de carbón.txt y Empresa Nacional Siderúrgica.txt con 14.35% de similitud.
|
||||||
|
2025-08-09 00:44:58,165 - INFO - Guardada comparación entre Negro de carbón.txt y Teletón El Salvador.txt con 15.09% de similitud.
|
||||||
|
2025-08-09 00:44:58,168 - INFO - Guardada comparación entre Negro de carbón.txt y Antônio de Sousa Neto.txt con 14.14% de similitud.
|
||||||
|
2025-08-09 00:44:58,173 - INFO - Guardada comparación entre Negro de carbón.txt y Unión Ortodoxa.txt con 16.45% de similitud.
|
||||||
|
2025-08-09 00:44:58,176 - INFO - Guardada comparación entre Negro de carbón.txt y Efecto cis.txt con 16.22% de similitud.
|
||||||
|
2025-08-09 00:44:58,180 - INFO - Guardada comparación entre Negro de carbón.txt y Sanción.txt con 2.86% de similitud.
|
||||||
|
2025-08-09 00:44:58,183 - INFO - Guardada comparación entre Negro de carbón.txt y Saúl Luciano Lliuya.txt con 13.32% de similitud.
|
||||||
|
2025-08-09 00:44:58,187 - INFO - Guardada comparación entre Negro de carbón.txt y Antiprotestantismo.txt con 14.66% de similitud.
|
||||||
|
2025-08-09 00:44:58,191 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Desigualdad de ingreso en Estados Unidos.txt con 6.88% de similitud.
|
||||||
|
2025-08-09 00:44:58,195 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Club Deportivo La Equidad (Femenino).txt con 9.47% de similitud.
|
||||||
|
2025-08-09 00:44:58,198 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 9.23% de similitud.
|
||||||
|
2025-08-09 00:44:58,202 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Asesoría Jurídica Internacional.txt con 11.29% de similitud.
|
||||||
|
2025-08-09 00:44:58,206 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Desarrollo de videojuegos independiente.txt con 3.19% de similitud.
|
||||||
|
2025-08-09 00:44:58,209 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Ingeniería comercial.txt con 9.76% de similitud.
|
||||||
|
2025-08-09 00:44:58,212 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Chevrolet Cobalt.txt con 6.39% de similitud.
|
||||||
|
2025-08-09 00:44:58,215 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Código Unificado de Punto de Suministro.txt con 8.91% de similitud.
|
||||||
|
2025-08-09 00:44:58,218 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 6.19% de similitud.
|
||||||
|
2025-08-09 00:44:58,221 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Estación de tratamiento de agua potable.txt con 12.68% de similitud.
|
||||||
|
2025-08-09 00:44:58,224 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Militar.txt con 7.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,228 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Demografía de Canadá.txt con 5.29% de similitud.
|
||||||
|
2025-08-09 00:44:58,231 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y EToro.txt con 8.49% de similitud.
|
||||||
|
2025-08-09 00:44:58,234 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Ambiente biofísico.txt con 11.35% de similitud.
|
||||||
|
2025-08-09 00:44:58,237 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Juego ganar ganar.txt con 9.90% de similitud.
|
||||||
|
2025-08-09 00:44:58,241 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 5.22% de similitud.
|
||||||
|
2025-08-09 00:44:58,244 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 6.22% de similitud.
|
||||||
|
2025-08-09 00:44:58,247 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Oswald Pohl.txt con 11.04% de similitud.
|
||||||
|
2025-08-09 00:44:58,250 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Empresa Nacional Siderúrgica.txt con 6.63% de similitud.
|
||||||
|
2025-08-09 00:44:58,253 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Teletón El Salvador.txt con 6.55% de similitud.
|
||||||
|
2025-08-09 00:44:58,256 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Antônio de Sousa Neto.txt con 12.01% de similitud.
|
||||||
|
2025-08-09 00:44:58,259 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Mercenarios (BattleTech).txt con 5.72% de similitud.
|
||||||
|
2025-08-09 00:44:58,263 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Efecto cis.txt con 7.21% de similitud.
|
||||||
|
2025-08-09 00:44:58,266 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Sanción.txt con 5.14% de similitud.
|
||||||
|
2025-08-09 00:44:58,269 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Saúl Luciano Lliuya.txt con 11.93% de similitud.
|
||||||
|
2025-08-09 00:44:58,272 - INFO - Guardada comparación entre Microsoft Anti-Virus.txt y Antiprotestantismo.txt con 6.77% de similitud.
|
||||||
|
2025-08-09 00:44:58,275 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Desigualdad de ingreso en Estados Unidos.txt con 11.60% de similitud.
|
||||||
|
2025-08-09 00:44:58,278 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Club Deportivo La Equidad (Femenino).txt con 13.85% de similitud.
|
||||||
|
2025-08-09 00:44:58,281 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 18.60% de similitud.
|
||||||
|
2025-08-09 00:44:58,284 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Asesoría Jurídica Internacional.txt con 17.80% de similitud.
|
||||||
|
2025-08-09 00:44:58,288 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Desarrollo de videojuegos independiente.txt con 4.54% de similitud.
|
||||||
|
2025-08-09 00:44:58,291 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Acuerdo de Prespa.txt con 13.00% de similitud.
|
||||||
|
2025-08-09 00:44:58,297 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Chevrolet Cobalt.txt con 6.85% de similitud.
|
||||||
|
2025-08-09 00:44:58,300 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 8.87% de similitud.
|
||||||
|
2025-08-09 00:44:58,303 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Omaira Montoya Henao.txt con 15.45% de similitud.
|
||||||
|
2025-08-09 00:44:58,306 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Estación de tratamiento de agua potable.txt con 14.49% de similitud.
|
||||||
|
2025-08-09 00:44:58,309 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Militar.txt con 12.70% de similitud.
|
||||||
|
2025-08-09 00:44:58,313 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Demografía de Canadá.txt con 7.30% de similitud.
|
||||||
|
2025-08-09 00:44:58,316 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Roxana Campos.txt con 14.18% de similitud.
|
||||||
|
2025-08-09 00:44:58,319 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Ambiente biofísico.txt con 13.53% de similitud.
|
||||||
|
2025-08-09 00:44:58,322 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Juego ganar ganar.txt con 13.72% de similitud.
|
||||||
|
2025-08-09 00:44:58,325 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 8.82% de similitud.
|
||||||
|
2025-08-09 00:44:58,328 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 10.54% de similitud.
|
||||||
|
2025-08-09 00:44:58,331 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Oswald Pohl.txt con 16.05% de similitud.
|
||||||
|
2025-08-09 00:44:58,334 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Empresa Nacional Siderúrgica.txt con 10.27% de similitud.
|
||||||
|
2025-08-09 00:44:58,337 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Teletón El Salvador.txt con 10.78% de similitud.
|
||||||
|
2025-08-09 00:44:58,340 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Antônio de Sousa Neto.txt con 14.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,343 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Mercenarios (BattleTech).txt con 8.08% de similitud.
|
||||||
|
2025-08-09 00:44:58,347 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Efecto cis.txt con 10.65% de similitud.
|
||||||
|
2025-08-09 00:44:58,350 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Demografía de la República Democrática del Congo.txt con 10.82% de similitud.
|
||||||
|
2025-08-09 00:44:58,353 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Desigualdad de ingreso.txt con 4.31% de similitud.
|
||||||
|
2025-08-09 00:44:58,357 - INFO - Guardada comparación entre Dirección General de Logística Informativa.txt y Terrorismo de extrema izquierda.txt con 4.85% de similitud.
|
||||||
|
2025-08-09 00:44:58,362 - INFO - Guardada comparación entre Criptografía híbrida.txt y Iberos.txt con 1.56% de similitud.
|
||||||
|
2025-08-09 00:44:58,365 - INFO - Guardada comparación entre Criptografía híbrida.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 8.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,368 - INFO - Guardada comparación entre Criptografía híbrida.txt y Censura internacional china.txt con 5.01% de similitud.
|
||||||
|
2025-08-09 00:44:58,372 - INFO - Guardada comparación entre Criptografía híbrida.txt y Alfarería en la provincia de Almería.txt con 4.71% de similitud.
|
||||||
|
2025-08-09 00:44:58,375 - INFO - Guardada comparación entre Criptografía híbrida.txt y Acuerdo de Prespa.txt con 10.82% de similitud.
|
||||||
|
2025-08-09 00:44:58,378 - INFO - Guardada comparación entre Criptografía híbrida.txt y Segunda Cumbre BRIC 2010.txt con 7.86% de similitud.
|
||||||
|
2025-08-09 00:44:58,381 - INFO - Guardada comparación entre Criptografía híbrida.txt y Santa Marina del Rey.txt con 10.34% de similitud.
|
||||||
|
2025-08-09 00:44:58,384 - INFO - Guardada comparación entre Criptografía híbrida.txt y Omaira Montoya Henao.txt con 10.04% de similitud.
|
||||||
|
2025-08-09 00:44:58,387 - INFO - Guardada comparación entre Criptografía híbrida.txt y Biodiversidad Virtual.txt con 8.47% de similitud.
|
||||||
|
2025-08-09 00:44:58,390 - INFO - Guardada comparación entre Criptografía híbrida.txt y Estudios de ciencia, tecnología y género.txt con 6.56% de similitud.
|
||||||
|
2025-08-09 00:44:58,393 - INFO - Guardada comparación entre Criptografía híbrida.txt y Representación (política).txt con 8.81% de similitud.
|
||||||
|
2025-08-09 00:44:58,395 - INFO - Guardada comparación entre Criptografía híbrida.txt y Roxana Campos.txt con 9.63% de similitud.
|
||||||
|
2025-08-09 00:44:58,399 - INFO - Guardada comparación entre Criptografía híbrida.txt y Reforma económica china.txt con 1.69% de similitud.
|
||||||
|
2025-08-09 00:44:58,403 - INFO - Guardada comparación entre Criptografía híbrida.txt y Alejandro VII.txt con 6.62% de similitud.
|
||||||
|
2025-08-09 00:44:58,406 - INFO - Guardada comparación entre Criptografía híbrida.txt y Violencia obstétrica.txt con 10.00% de similitud.
|
||||||
|
2025-08-09 00:44:58,409 - INFO - Guardada comparación entre Criptografía híbrida.txt y Torrente Gros.txt con 8.30% de similitud.
|
||||||
|
2025-08-09 00:44:58,412 - INFO - Guardada comparación entre Criptografía híbrida.txt y Guerra de Reforma.txt con 5.11% de similitud.
|
||||||
|
2025-08-09 00:44:58,416 - INFO - Guardada comparación entre Criptografía híbrida.txt y Certificate Signing Request.txt con 5.23% de similitud.
|
||||||
|
2025-08-09 00:44:58,419 - INFO - Guardada comparación entre Criptografía híbrida.txt y Katalin Bogyay.txt con 4.22% de similitud.
|
||||||
|
2025-08-09 00:44:58,422 - INFO - Guardada comparación entre Criptografía híbrida.txt y Unión Ortodoxa.txt con 7.73% de similitud.
|
||||||
|
2025-08-09 00:44:58,426 - INFO - Guardada comparación entre Criptografía híbrida.txt y Emisora móvil.txt con 3.69% de similitud.
|
||||||
|
2025-08-09 00:44:58,429 - INFO - Guardada comparación entre Criptografía híbrida.txt y Demografía de la República Democrática del Congo.txt con 6.86% de similitud.
|
||||||
|
2025-08-09 00:44:58,436 - INFO - Guardada comparación entre Criptografía híbrida.txt y Desigualdad de ingreso.txt con 2.72% de similitud.
|
||||||
|
2025-08-09 00:44:58,439 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Desigualdad de ingreso en Estados Unidos.txt con 5.05% de similitud.
|
||||||
|
2025-08-09 00:44:58,442 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Club Deportivo La Equidad (Femenino).txt con 7.00% de similitud.
|
||||||
|
2025-08-09 00:44:58,445 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 6.28% de similitud.
|
||||||
|
2025-08-09 00:44:58,448 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Asesoría Jurídica Internacional.txt con 8.06% de similitud.
|
||||||
|
2025-08-09 00:44:58,451 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Desarrollo de videojuegos independiente.txt con 1.98% de similitud.
|
||||||
|
2025-08-09 00:44:58,454 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Acuerdo de Prespa.txt con 13.32% de similitud.
|
||||||
|
2025-08-09 00:44:58,457 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Chevrolet Cobalt.txt con 7.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,460 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Código Unificado de Punto de Suministro.txt con 6.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,463 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 3.81% de similitud.
|
||||||
|
2025-08-09 00:44:58,465 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Estación de tratamiento de agua potable.txt con 8.87% de similitud.
|
||||||
|
2025-08-09 00:44:58,469 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Militar.txt con 5.28% de similitud.
|
||||||
|
2025-08-09 00:44:58,472 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Demografía de Canadá.txt con 3.39% de similitud.
|
||||||
|
2025-08-09 00:44:58,475 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y EToro.txt con 5.99% de similitud.
|
||||||
|
2025-08-09 00:44:58,478 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Ambiente biofísico.txt con 6.93% de similitud.
|
||||||
|
2025-08-09 00:44:58,480 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Juego ganar ganar.txt con 6.57% de similitud.
|
||||||
|
2025-08-09 00:44:58,484 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 3.37% de similitud.
|
||||||
|
2025-08-09 00:44:58,487 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 4.26% de similitud.
|
||||||
|
2025-08-09 00:44:58,489 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Torrente Gros.txt con 5.86% de similitud.
|
||||||
|
2025-08-09 00:44:58,492 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Oswald Pohl.txt con 8.37% de similitud.
|
||||||
|
2025-08-09 00:44:58,495 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Empresa Nacional Siderúrgica.txt con 4.81% de similitud.
|
||||||
|
2025-08-09 00:44:58,498 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Teletón El Salvador.txt con 4.34% de similitud.
|
||||||
|
2025-08-09 00:44:58,501 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Antônio de Sousa Neto.txt con 9.71% de similitud.
|
||||||
|
2025-08-09 00:44:58,504 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Mercenarios (BattleTech).txt con 3.74% de similitud.
|
||||||
|
2025-08-09 00:44:58,507 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Efecto cis.txt con 4.61% de similitud.
|
||||||
|
2025-08-09 00:44:58,510 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Demografía de la República Democrática del Congo.txt con 4.71% de similitud.
|
||||||
|
2025-08-09 00:44:58,514 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Desigualdad de ingreso.txt con 1.70% de similitud.
|
||||||
|
2025-08-09 00:44:58,517 - INFO - Guardada comparación entre Ciclismo en los Juegos Europeos de Minsk 2019.txt y Terrorismo de extrema izquierda.txt con 1.95% de similitud.
|
||||||
|
2025-08-09 00:44:58,521 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Club Deportivo La Equidad (Femenino).txt con 18.65% de similitud.
|
||||||
|
2025-08-09 00:44:58,524 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Dirección General de Atención a las Víctimas y Promoción de la Memoria Democrática.txt con 19.35% de similitud.
|
||||||
|
2025-08-09 00:44:58,528 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Asesoría Jurídica Internacional.txt con 17.87% de similitud.
|
||||||
|
2025-08-09 00:44:58,532 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Desarrollo de videojuegos independiente.txt con 9.60% de similitud.
|
||||||
|
2025-08-09 00:44:58,535 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Ingeniería comercial.txt con 19.27% de similitud.
|
||||||
|
2025-08-09 00:44:58,538 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Chevrolet Cobalt.txt con 3.70% de similitud.
|
||||||
|
2025-08-09 00:44:58,541 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Código Unificado de Punto de Suministro.txt con 16.43% de similitud.
|
||||||
|
2025-08-09 00:44:58,545 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Guerra de guerrillas en la península ibérica durante las guerras napoleónicas.txt con 17.08% de similitud.
|
||||||
|
2025-08-09 00:44:58,548 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Estación de tratamiento de agua potable.txt con 11.94% de similitud.
|
||||||
|
2025-08-09 00:44:58,552 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Militar.txt con 18.72% de similitud.
|
||||||
|
2025-08-09 00:44:58,555 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Demografía de Canadá.txt con 14.78% de similitud.
|
||||||
|
2025-08-09 00:44:58,558 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y EToro.txt con 19.12% de similitud.
|
||||||
|
2025-08-09 00:44:58,562 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Ambiente biofísico.txt con 17.33% de similitud.
|
||||||
|
2025-08-09 00:44:58,565 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Juego ganar ganar.txt con 16.06% de similitud.
|
||||||
|
2025-08-09 00:44:58,568 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Declaración de los Derechos de la Mujer y de la Ciudadana.txt con 14.79% de similitud.
|
||||||
|
2025-08-09 00:44:58,572 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Convención Marco de las Naciones Unidas sobre el Cambio Climático.txt con 17.52% de similitud.
|
||||||
|
2025-08-09 00:44:58,575 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Oswald Pohl.txt con 18.15% de similitud.
|
||||||
|
2025-08-09 00:44:58,578 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Empresa Nacional Siderúrgica.txt con 17.55% de similitud.
|
||||||
|
2025-08-09 00:44:58,582 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Teletón El Salvador.txt con 17.44% de similitud.
|
||||||
|
2025-08-09 00:44:58,585 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Antônio de Sousa Neto.txt con 14.52% de similitud.
|
||||||
|
2025-08-09 00:44:58,588 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Unión Ortodoxa.txt con 18.93% de similitud.
|
||||||
|
2025-08-09 00:44:58,593 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Emisora móvil.txt con 9.68% de similitud.
|
||||||
|
2025-08-09 00:44:58,596 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Demografía de la República Democrática del Congo.txt con 16.85% de similitud.
|
||||||
|
2025-08-09 00:44:58,601 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Desigualdad de ingreso.txt con 9.08% de similitud.
|
||||||
|
2025-08-09 00:44:58,604 - INFO - Guardada comparación entre Relaciones España-Finlandia.txt y Terrorismo de extrema izquierda.txt con 10.23% de similitud.
|
||||||
68871
FLUJOS_DATOS/COMPARACIONES/pipeline_mongolo.log.3
Normal file
1255
FLUJOS_DATOS/COMPARACIONES/pipeline_mongolo.log.4
Normal file
1245
FLUJOS_DATOS/COMPARACIONES/pipeline_mongolo.log.5
Normal file
276
FLUJOS_DATOS/COMPARACIONES/pipeline_mongolo.py
Executable file
|
|
@ -0,0 +1,276 @@
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import logging
|
||||||
|
from logging.handlers import RotatingFileHandler
|
||||||
|
from collections import Counter
|
||||||
|
from datetime import datetime
|
||||||
|
from pymongo import MongoClient
|
||||||
|
from tqdm import tqdm
|
||||||
|
from multiprocessing import Pool
|
||||||
|
import string
|
||||||
|
import nltk
|
||||||
|
from nltk.corpus import stopwords
|
||||||
|
|
||||||
|
# Descargar stopwords la primera vez
|
||||||
|
nltk.download('stopwords')
|
||||||
|
stop_words = set(stopwords.words('spanish'))
|
||||||
|
|
||||||
|
# Parámetros de configuración
|
||||||
|
SIMILARITY_THRESHOLD = 4.0
|
||||||
|
LOG_FILE = "pipeline_mongolo.log"
|
||||||
|
NUM_PROCESOS = 2 # Número de procesos para el Pool
|
||||||
|
BATCH_SIZE = 50 # Tamaño del lote para archivos
|
||||||
|
|
||||||
|
# Configuración de logging con rotación de archivos
|
||||||
|
logger = logging.getLogger()
|
||||||
|
logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
handler = RotatingFileHandler(LOG_FILE, maxBytes=10*1024*1024, backupCount=5) # 10 MB por archivo, 5 archivos de respaldo
|
||||||
|
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
handler.setFormatter(formatter)
|
||||||
|
|
||||||
|
logger.addHandler(handler)
|
||||||
|
|
||||||
|
# Función para iniciar un cliente MongoDB
|
||||||
|
def init_mongo_client():
|
||||||
|
"""Inicializa un nuevo cliente MongoDB para cada proceso."""
|
||||||
|
return MongoClient('localhost', 27017)
|
||||||
|
|
||||||
|
# Función para preprocesar el texto
|
||||||
|
def preprocesar_texto(texto):
|
||||||
|
# Eliminar signos de puntuación
|
||||||
|
texto = texto.translate(str.maketrans('', '', string.punctuation))
|
||||||
|
# Convertir a minúsculas
|
||||||
|
texto = texto.lower()
|
||||||
|
# Eliminar stop words
|
||||||
|
palabras = texto.split()
|
||||||
|
palabras = [word for word in palabras if word not in stop_words]
|
||||||
|
return ' '.join(palabras)
|
||||||
|
|
||||||
|
# Función para asignar tema y subtema basado en el contenido del texto
|
||||||
|
def asignar_tema_y_subtema(texto):
|
||||||
|
tematicas = {
|
||||||
|
'inteligencia y seguridad': ['inteligencia', 'ciberseguridad', 'espionaje', 'seguridad nacional', 'contraterrorismo'],
|
||||||
|
'cambio climático': ['cambio climático', 'desastres naturales', 'conservación', 'energía renovable', 'escasez de agua'],
|
||||||
|
'guerra global': ['conflictos internacionales', 'guerras civiles', 'terrorismo', 'armas', 'alianzas militares'],
|
||||||
|
'demografía y sociedad': ['sobrepoblación', 'enfermedades', 'migraciones', 'urbanización', 'despoblación rural'],
|
||||||
|
'economía y corporaciones': ['economía global', 'corporaciones multinacionales', 'comercio internacional', 'organismos financieros', 'desigualdad económica']
|
||||||
|
}
|
||||||
|
|
||||||
|
texto_lower = texto.lower()
|
||||||
|
for tema, palabras_clave in tematicas.items():
|
||||||
|
for palabra_clave in palabras_clave:
|
||||||
|
if palabra_clave in texto_lower:
|
||||||
|
return tema, palabra_clave
|
||||||
|
return 'otros', 'general'
|
||||||
|
|
||||||
|
# Función para extraer la fecha del nombre del archivo
|
||||||
|
def extraer_fecha_de_nombre(nombre_archivo):
|
||||||
|
try:
|
||||||
|
fecha_str = re.search(r'\d{4}-\d{2}-\d{2}', nombre_archivo).group(0)
|
||||||
|
return datetime.strptime(fecha_str, '%Y-%m-%d')
|
||||||
|
except:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Función para contar palabras en un archivo tokenizado
|
||||||
|
def contar_palabras(nombre_archivo):
|
||||||
|
try:
|
||||||
|
with open(nombre_archivo, 'r', encoding='utf-8') as f:
|
||||||
|
palabras = f.read().split()
|
||||||
|
return Counter(palabras)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al contar palabras en {nombre_archivo}: {e}")
|
||||||
|
return Counter()
|
||||||
|
|
||||||
|
# Función para comparar dos archivos y calcular el porcentaje de similitud
|
||||||
|
def comparar_archivos(archivo1, archivo2):
|
||||||
|
try:
|
||||||
|
conteo1 = contar_palabras(archivo1)
|
||||||
|
conteo2 = contar_palabras(archivo2)
|
||||||
|
|
||||||
|
palabras_comunes = set(conteo1.keys()) & set(conteo2.keys())
|
||||||
|
num_palabras_comunes = sum(min(conteo1[p], conteo2[p]) for p in palabras_comunes)
|
||||||
|
num_palabras_totales = sum(conteo1.values()) + sum(conteo2.values())
|
||||||
|
|
||||||
|
if num_palabras_totales == 0:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
porcentaje_similitud = (num_palabras_comunes / num_palabras_totales) * 100
|
||||||
|
return porcentaje_similitud
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al comparar archivos {archivo1} y {archivo2}: {e}", exc_info=True)
|
||||||
|
return 0 # Retornar 0 en caso de error
|
||||||
|
|
||||||
|
# Función paralelizada para manejar las comparaciones
|
||||||
|
def manejar_comparacion_multiproceso(pair):
|
||||||
|
archivo1, archivo2 = pair
|
||||||
|
try:
|
||||||
|
# Inicia MongoDB dentro del proceso
|
||||||
|
client = init_mongo_client()
|
||||||
|
db = client['FLUJOS_DATOS']
|
||||||
|
comparaciones_collection = db['comparaciones']
|
||||||
|
|
||||||
|
nombre_archivo1 = os.path.basename(archivo1)
|
||||||
|
nombre_archivo2 = os.path.basename(archivo2)
|
||||||
|
|
||||||
|
porcentaje = comparar_archivos(archivo1, archivo2)
|
||||||
|
comparacion = {
|
||||||
|
'noticia1': nombre_archivo1,
|
||||||
|
'noticia2': nombre_archivo2,
|
||||||
|
'porcentaje_similitud': porcentaje
|
||||||
|
}
|
||||||
|
|
||||||
|
comparaciones_collection.insert_one(comparacion)
|
||||||
|
logging.info(f"Guardada comparación entre {nombre_archivo1} y {nombre_archivo2} con {porcentaje:.2f}% de similitud.")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al manejar comparación {archivo1} vs {archivo2}: {e}", exc_info=True)
|
||||||
|
finally:
|
||||||
|
client.close()
|
||||||
|
|
||||||
|
# Función para verificar si el documento ya fue procesado
|
||||||
|
def documento_ya_subido(nombre_archivo, collection):
|
||||||
|
return collection.find_one({"archivo": nombre_archivo}) is not None
|
||||||
|
|
||||||
|
# Función para subir documentos a MongoDB
|
||||||
|
def subir_documento_a_mongodb(nombre_archivo, tema, subtema, fecha, texto, collection):
|
||||||
|
documento = {
|
||||||
|
'archivo': nombre_archivo,
|
||||||
|
'tema': tema,
|
||||||
|
'subtema': subtema,
|
||||||
|
'fecha': fecha,
|
||||||
|
'texto': texto # Subimos el texto original
|
||||||
|
}
|
||||||
|
try:
|
||||||
|
collection.insert_one(documento)
|
||||||
|
logging.info(f"Subido documento: {nombre_archivo} con tema: {tema}, subtema: {subtema}.")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al subir documento {nombre_archivo}: {e}")
|
||||||
|
|
||||||
|
# Función para procesar documentos y subirlos a MongoDB
|
||||||
|
def procesar_documentos(directorio, collection):
|
||||||
|
archivos = [os.path.join(directorio, f) for f in os.listdir(directorio)]
|
||||||
|
print(f"Procesando {len(archivos)} archivos en el directorio: {directorio}")
|
||||||
|
|
||||||
|
# Subir documentos a MongoDB
|
||||||
|
with tqdm(total=len(archivos), desc=f"Subiendo documentos a MongoDB ({collection.name})", ncols=100) as pbar:
|
||||||
|
for archivo in archivos:
|
||||||
|
nombre_archivo = os.path.basename(archivo)
|
||||||
|
if documento_ya_subido(nombre_archivo, collection):
|
||||||
|
logging.info(f"Saltando {nombre_archivo}, ya está subido.")
|
||||||
|
pbar.update(1)
|
||||||
|
continue
|
||||||
|
|
||||||
|
fecha = extraer_fecha_de_nombre(nombre_archivo)
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(archivo, 'r', encoding='utf-8') as f:
|
||||||
|
texto_original = f.read()
|
||||||
|
texto_preprocesado = preprocesar_texto(texto_original)
|
||||||
|
tema, subtema = asignar_tema_y_subtema(texto_preprocesado)
|
||||||
|
subir_documento_a_mongodb(nombre_archivo, tema, subtema, fecha, texto_original, collection)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al procesar archivo {archivo}: {e}")
|
||||||
|
|
||||||
|
pbar.update(1)
|
||||||
|
|
||||||
|
# Función mejorada para manejar las comparaciones con menor uso de RAM
|
||||||
|
def manejar_comparaciones_multiproceso(directorios_tokenized):
|
||||||
|
try:
|
||||||
|
archivos_tokenizados = []
|
||||||
|
for directorio in directorios_tokenized:
|
||||||
|
archivos_directorio = [os.path.join(directorio, f) for f in os.listdir(directorio)]
|
||||||
|
archivos_tokenizados.append(archivos_directorio)
|
||||||
|
|
||||||
|
total_pairs = 0
|
||||||
|
|
||||||
|
# Procesar combinaciones para reducir el uso de memoria
|
||||||
|
for i in range(len(archivos_tokenizados)):
|
||||||
|
for j in range(i+1, len(archivos_tokenizados)):
|
||||||
|
archivos1 = archivos_tokenizados[i]
|
||||||
|
archivos2 = archivos_tokenizados[j]
|
||||||
|
|
||||||
|
num_archivos1 = len(archivos1)
|
||||||
|
num_archivos2 = len(archivos2)
|
||||||
|
|
||||||
|
logging.info(f"Comparando {num_archivos1} archivos de {directorios_tokenized[i]} con {num_archivos2} archivos de {directorios_tokenized[j]}")
|
||||||
|
|
||||||
|
# Procesar por bloques
|
||||||
|
for idx1 in range(0, num_archivos1, BATCH_SIZE):
|
||||||
|
batch_archivos1 = archivos1[idx1:idx1+BATCH_SIZE]
|
||||||
|
for idx2 in range(0, num_archivos2, BATCH_SIZE):
|
||||||
|
batch_archivos2 = archivos2[idx2:idx2+BATCH_SIZE]
|
||||||
|
|
||||||
|
# Usar un generador para los pares
|
||||||
|
def pair_generator():
|
||||||
|
for a1 in batch_archivos1:
|
||||||
|
for a2 in batch_archivos2:
|
||||||
|
yield (a1, a2)
|
||||||
|
|
||||||
|
total_pairs_in_batch = len(batch_archivos1) * len(batch_archivos2)
|
||||||
|
total_pairs += total_pairs_in_batch
|
||||||
|
logging.info(f"Procesando batch de {total_pairs_in_batch} pares")
|
||||||
|
|
||||||
|
with Pool(processes=NUM_PROCESOS) as pool:
|
||||||
|
list(tqdm(
|
||||||
|
pool.imap_unordered(manejar_comparacion_multiproceso, pair_generator()),
|
||||||
|
total=total_pairs_in_batch,
|
||||||
|
desc=f"Comparando archivos",
|
||||||
|
ncols=100
|
||||||
|
))
|
||||||
|
|
||||||
|
logging.info(f"Total de pares comparados: {total_pairs}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error en manejar_comparaciones_multiproceso: {e}", exc_info=True)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
try:
|
||||||
|
# Rutas absolutas de los archivos en formato txt
|
||||||
|
carpeta_noticias_txt = '/var/www/theflows.net/flujos/FLUJOS_DATOS/NOTICIAS/articulos'
|
||||||
|
carpeta_wikipedia_txt = '/var/www/theflows.net/flujos/FLUJOS_DATOS/WIKIPEDIA/articulos_wikipedia'
|
||||||
|
carpeta_torrents_txt = '/var/www/theflows.net/flujos/FLUJOS_DATOS/TORRENTS/TORRENTS_WIKILEAKS_COMPLETO/txt'
|
||||||
|
|
||||||
|
# Carpetas con los archivos tokenizados para hacer las comparaciones
|
||||||
|
carpeta_noticias_tokenized = '/var/www/theflows.net/flujos/FLUJOS_DATOS/NOTICIAS/tokenized'
|
||||||
|
carpeta_wikipedia_tokenized = '/var/www/theflows.net/flujos/FLUJOS_DATOS/WIKIPEDIA/articulos_tokenizados'
|
||||||
|
carpeta_torrents_tokenized = '/var/www/theflows.net/flujos/FLUJOS_DATOS/TORRENTS/TORRENTS_WIKILEAKS_COMPLETO/tokenized'
|
||||||
|
|
||||||
|
# Iniciar cliente MongoDB
|
||||||
|
client = init_mongo_client()
|
||||||
|
|
||||||
|
# Subir las noticias, artículos de Wikipedia y TORRENTS a MongoDB en formato txt
|
||||||
|
# print("Subiendo archivos originales de Noticias a MongoDB...")
|
||||||
|
# logging.info("Iniciando subida de noticias a MongoDB")
|
||||||
|
# procesar_documentos(carpeta_noticias_txt, client['FLUJOS_DATOS']['noticias'])
|
||||||
|
# logging.info("Finalizada subida de noticias a MongoDB")
|
||||||
|
|
||||||
|
#print("Subiendo archivos originales de Wikipedia a MongoDB...")
|
||||||
|
#logging.info("Iniciando subida de Wikipedia a MongoDB")
|
||||||
|
#procesar_documentos(carpeta_wikipedia_txt, client['FLUJOS_DATOS']['wikipedia'])
|
||||||
|
#logging.info("Finalizada subida de Wikipedia a MongoDB")
|
||||||
|
|
||||||
|
print("Subiendo archivos originales de TORRENTS a MongoDB...")
|
||||||
|
logging.info("Iniciando subida de TORRENTS a MongoDB")
|
||||||
|
procesar_documentos(carpeta_torrents_txt, client['FLUJOS_DATOS']['torrents'])
|
||||||
|
logging.info("Finalizada subida de TORRENTS a MongoDB")
|
||||||
|
|
||||||
|
|
||||||
|
# ==> Sólo comparaciones Wikipedia vs Wikipedia <==
|
||||||
|
print("Comparando textos tokenizados de Wikipedia entre sí...")
|
||||||
|
logging.info("Iniciando comparaciones sólo de Wikipedia")
|
||||||
|
manejar_comparaciones_multiproceso([
|
||||||
|
carpeta_wikipedia_tokenized,
|
||||||
|
carpeta_wikipedia_tokenized
|
||||||
|
])
|
||||||
|
logging.info("Finalizadas comparaciones de Wikipedia")
|
||||||
|
|
||||||
|
# print("Comparando textos tokenizados entre Noticias, Wikipedia y TORRENTS...")
|
||||||
|
# logging.info("Iniciando comparaciones entre textos tokenizados")
|
||||||
|
# manejar_comparaciones_multiproceso([carpeta_noticias_tokenized, carpeta_wikipedia_tokenized, carpeta_torrents_tokenized])
|
||||||
|
# logging.info("Finalizadas comparaciones entre textos tokenizados")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error en la ejecución del script: {e}", exc_info=True)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
7
FLUJOS_DATOS/COMPARACIONES/requirements.txt
Executable file
|
|
@ -0,0 +1,7 @@
|
||||||
|
transformers==4.10.0
|
||||||
|
tensorflow==2.17.0
|
||||||
|
scikit-learn==0.24.2
|
||||||
|
pandas==1.3.2
|
||||||
|
numpy==1.19.5
|
||||||
|
elasticsearch==7.13.4
|
||||||
|
nltk==3.6.2
|
||||||
69
FLUJOS_DATOS/DOCS/ELASTIC.txt
Executable file
|
|
@ -0,0 +1,69 @@
|
||||||
|
PROYECTO FLUJOS: DOCUMENTACIÓN
|
||||||
|
|
||||||
|
|
||||||
|
===================================================================================================
|
||||||
|
1. BASE DE DATOS (ELASTICSEARCH)
|
||||||
|
a. Instalación:
|
||||||
|
|
||||||
|
# Sigue las instrucciones de la página oficial para descargar e instalar Elasticsearch y Kibana.
|
||||||
|
b. Configuración de Elasticsearch:
|
||||||
|
|
||||||
|
# AÑADE O MODIFICA las siguientes líneas en el archivo elasticsearch.yml con tu editor de texto preferido, por ejemplo:
|
||||||
|
nano config/elasticsearch.yml
|
||||||
|
|
||||||
|
network.host: localhost
|
||||||
|
http.port: 9200
|
||||||
|
c. Inicio de Elasticsearch:
|
||||||
|
|
||||||
|
# Desde la carpeta de Elasticsearch, ejecuta:
|
||||||
|
bin/elasticsearch
|
||||||
|
|
||||||
|
d. Verificación:
|
||||||
|
|
||||||
|
# Ejecuta el siguiente comando para verificar:
|
||||||
|
curl -X GET "http://localhost:9200/"
|
||||||
|
|
||||||
|
===================================================================================================
|
||||||
|
2. SCRAPER (scraper.py)
|
||||||
|
a. Ejecución:
|
||||||
|
|
||||||
|
# Asegúrate de estar en el directorio correcto y ejecuta:
|
||||||
|
python3 scraper.py
|
||||||
|
|
||||||
|
===================================================================================================
|
||||||
|
3. PROCESAMIENTO Y GUARDADO (guardar_datos.py)
|
||||||
|
a. Ejecución:
|
||||||
|
|
||||||
|
# Asegúrate de estar en el directorio correcto y ejecuta:
|
||||||
|
python3 guardar_datos.py
|
||||||
|
|
||||||
|
|
||||||
|
===================================================================================================
|
||||||
|
4. KIBANA
|
||||||
|
a. Configuración:
|
||||||
|
|
||||||
|
# AÑADE O MODIFICA las siguientes líneas en el archivo kibana.yml con tu editor de texto preferido, por ejemplo:
|
||||||
|
nano config/kibana.yml
|
||||||
|
|
||||||
|
elasticsearch.hosts: ["http://localhost:9200"]
|
||||||
|
b. Inicio de Kibana:
|
||||||
|
|
||||||
|
# Desde la carpeta de Kibana, ejecuta:
|
||||||
|
bin/kibana
|
||||||
|
c. Acceso a Kibana:
|
||||||
|
|
||||||
|
# Abre tu navegador y ve a:
|
||||||
|
http://localhost:5601
|
||||||
|
|
||||||
|
===================================================================================================
|
||||||
|
|
||||||
|
|
||||||
|
sito@SIT0:~/PROGRAMACION/FLUJOS_TODO/FLUJOS_DATOS/elasticsearch-8.10.0/bin$ ./elasticsearch-reset-password -u elastic
|
||||||
|
This tool will reset the password of the [elastic] user to an autogenerated value.
|
||||||
|
The password will be printed in the console.
|
||||||
|
Please confirm that you would like to continue [y/N]Y
|
||||||
|
|
||||||
|
|
||||||
|
Password for the [elastic] user successfully reset.
|
||||||
|
New value: VFe09fj6X*jqSZpyqZrb
|
||||||
|
sito@SIT0:~/PROGRAMACION/FLUJOS_TODO/FLUJOS_DATOS/elasticsearch-8.10.0/bin$
|
||||||