Introduccion A Las Bases de Datos
Introduccion A Las Bases de Datos
Introduccion A Las Bases de Datos
1
Con…namiento 2020-2021, Versión 1.0
Índice
1 Introducción 3
1.1 Sobre los Ejemplos de este Trabajo . . . . . . . . . . . . . . . 4
1.2 Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Bases de Datos 5
2.1 Clasi…cación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 ¿Qué son las bases de datos SQL? . . . . . . . . . . . . . . . . 7
2.2.1 Lenguaje de de…nición de datos (DDL) . . . . . . . . . 9
2.2.2 Lenguaje de manipulación de datos DML . . . . . . . . 10
2.3 ¿Qué son las bases de datos NoSQL? . . . . . . . . . . . . . . 19
2.3.1 SQL en comparación con NoSQL . . . . . . . . . . . . 23
2.3.2 SQL en comparación con Terminología NoSQL . . . . . 25
2.4 Programando en Diferentes Manejadores de Bases de Datos . . 30
2.4.1 SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.4.2 MySQL/MariaDB . . . . . . . . . . . . . . . . . . . . . 33
2.4.3 PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . 41
2.4.4 MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.5 Lenguajes de Programación y Bases de Datos SQL . . . . . . 48
2.5.1 Java y el Acceso a Base de Datos Relacionales . . . . . 50
2.5.2 Python y el Acceso a Base de Datos Relacionales . . . 56
2.5.3 Pruebas de Penetración . . . . . . . . . . . . . . . . . . 58
2.6 Programando desde la Web . . . . . . . . . . . . . . . . . . . 60
2.6.1 SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
2.6.2 MySQL y MariaDB . . . . . . . . . . . . . . . . . . . . 61
2.6.3 PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . 62
2.6.4 MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . 63
3 Intercambio de Información 66
3.1 Archivos de Formatos Abiertos . . . . . . . . . . . . . . . . . 72
3.2 Estándares Según el Tipo de Datos . . . . . . . . . . . . . . . 83
3.3 ¿Qué son los Metadatos? . . . . . . . . . . . . . . . . . . . . . 87
6 Bibliografía 144
1 Introducción
Con el aumento del acceso a internet por parte de personas y empresa se ha
generado un auge de las redes sociales, comercio electrónico y demás activi-
dades que implican el uso del cómputo, generando un aumento exponencial
de la información y datos que se generan a los cuales se puede tener acceso. El
gran reto del manejo de datos es el poder recolectar, almacenar, estructurar
y analizar grandes cantidades de información en el menor tiempo posible que
pueden ser usados para la toma de decisiones, adquirir conocimiento y otras
tantas nuevas posibilidades que se abren con el paso de los años.
Comencemos por algunos conceptos fundamentales:
1.2 Agradecimientos
Este proyecto fue posible gracias al apoyo recibido por la Facultad de Cien-
cias de la Universidad Nacional Autónoma de México (UNAM) y al tiempo
robado a nuestras actividades académicas, principalmente durante el período
de con…namiento de los años 2020 y 2021.
2 Bases de Datos
¿Qué son las bases de datos? una base de datos es un conjunto de
datos pertenecientes a un mismo contexto y almacenados sistemáticamente
para su uso posterior (véase [12] y [13]). En este sentido; una biblioteca puede
considerarse una base de datos compuesta en su mayoría por documentos
y textos impresos en papel e indexados para su consulta. Actualmente la
mayoría de las bases de datos están en formato digital, se han desarrollado y
se ofrece un amplio rango de soluciones al problema del almacenamiento de
datos.
2.1 Clasi…cación
Las bases de datos se pueden clasi…car de diferentes formas: acuerdo a la
ubicación, de acuerdo a la forma de establecer relaciones entre los datos,
según la orientación, entre otros.
De acuerdo a la ubicación
Date: una fecha de calendario que contiene el año (de cuatro cifras), el
mes y el día.
Time: La hora del día en horas, minutos y segundos (el valor predeter-
minado es 0).
planes de ejecución de una consulta SQL y elige aquel que sea más e…ciente
para llevar adelante la misma.
Existe una ampliación de SQL conocida como FSQL (Fuzzy SQL, SQL
difuso) que permite el acceso a bases de datos difusas, usando la lógica difusa.
SELECT [{ALLjDISTINCT}]
<nombre_campo>[, <nombre_campo>...]
FROM {<nombre_tabla>j<nombre_vista>}[,
{<nombre_tabla>j<nombre_vista>}...]
[WHERE <condición> [{ANDjOR} <condición>...]]
[GROUP BY <nombre_campo>[, <nombre_campo>...]]
[HAVING <condición> [{ANDjOR} <condición>...]]
[ORDER BY {<nombre_campo>j<indice_campo>}
[{ASCjDESC}][,{<nombre_campo>j<indice_campo>}
[{ASCjDESC}]]];
SELECT palabra clave que indica que la sentencia de SQL que que-
remos ejecutar es de selección.
ALL indica que queremos seleccionar todos los valores. Es el valor por
defecto y no suele especi…carse casi nunca.
WHERE especi…ca una condición que debe cumplirse para que los
datos sean devueltos por la consulta. Admite los operadores lógicos AND
y OR.
HAVING especi…ca una condición que debe cumplirse para que los
datos sean devueltos por la consulta. Su funcionamiento es similar al de
WHERE pero aplicado al conjunto de resultados devueltos por la consulta.
Debe aplicarse siempre junto a GROUP BY y la condición debe estar referida
a los campos contenidos en ella.
SELECT
matricula, marca, modelo, color, numero_kilometros, num_plazas
FROM
coches
ORDER BY
marca, modelo;
los datos serán devueltos ordenados por marca y por modelo en orden
ascendente, de menor a mayor.
Ejemplo de consulta simpli…cada a través de un comodín de campos (*):
El uso del asterisco indica que queremos que la consulta devuelva todos los
campos que existen en la tabla y los datos serán devueltos ordenados por
marca y por modelo.
SELECT *
FROM
coches
ORDER BY
marca, modelo;
SELECT
matricula, marca, modelo, color, numero_kilometros, num_plazas
FROM
coches
WHERE
matricula = ’MF-234-ZD’ OR matricula = ’FK-938-ZL’;
Una condición WHERE puede ser negada a través del Operador Lógico
NOT. La Siguiente consulta devolverá todos los datos de la tabla coches,
menos el que tenga la matrícula MF-234-ZD.
SELECT
matricula, marca, modelo, color, numero_kilometros, num_plazas
FROM
coches
WHERE
NOT matricula = ’MF-234-ZD’;
SELECT
matricula, marca, modelo, color, numero_kilometros, num_plazas
FROM
coches
ORDER BY
marca ASC, modelo DESC;
INSERT INTO
tablatura(columnaA, [columnaB, ...])
VALUES
(’valor1’, [’valor2’, ...]);
INSERT INTO
tabla(columna1[, columna2, ...])
VALUES
(’valor1A’, [’valor1B’, ...]),
(’value2A’, [’value2B’, ...]), ...;
INSERT INTO
agenda_telefonica
VALUES
(’Roberto Fernández’, ’4886850’),
(’Alejandro Sosa’, ’4556550’);
Notar que las sentencias separadas pueden tener semántica diferente (es-
pecialmente con respecto a los triggers), y puede tener diferente rendimiento
que la sentencia de inserción múltiple.
Para insertar varias …las en MS SQL puede utilizar esta construcción:
SELECT *
FROM NEW TABLE (
INSERT INTO phone_book
VALUES (’Cristobal Jeldrez’,’0426.817.10.30’)
) AS t
¿Por qué debería usar una base de datos NoSQL? Las bases de datos
NoSQL se adaptan perfectamente a muchas aplicaciones modernas, como
dispositivos móviles, Web y juegos, que requieren bases de datos ‡exibles,
escalables, de alto rendimiento y altamente funcionales para proporcionar
excelentes experiencias de usuario.
baja latencia. Las bases de datos de búsqueda NoSQL están diseñadas para
hacer análisis sobre datos semiestructurados.
C o lu m n a C am p o A trib u to C o lu m n a C am p o
Ín d ic e Ín d ic e Ín d ic e se c u n d a rio Ín d ic e Ín d ic e
Ta b la u o b je to D o c u m e nto
M apa M apa M apa
a n id a d o in c ru sta d o
Texto:
Fecha:
Especiales:
db.<nombre_colección>.<nombre_Operación>(<condiciones_de_la_operación>)
Operaciones:
item1 = {
Nombre: "Luís",
Apellidos: "Martinez",
Edad: 18,
A…ciones: ["fútbol","senderismo","tenis"],
Amigos: [
{
Nombre:"Monica",
Edad:20
},
{
Nombre:"Andrés",
Edad:24
}
]
}
db.hi.insert(item1)
db.amigos.…nd().pretty()
item2 = {
Nombre: "Luís",
Apellidos: "Martinez",
Edad: 18,
}
db.hi.insert(item2)
db.amigos.…nd().pretty()
db.amigos.…nd({Nombre:"Luís"}])
db.amigos.…nd({$and:[{Nombre:"Luís"},{Apellidos:"Martinez"}]}])
db.amigos.…nd({
$or:[
{$and:[{Nombre:"Luís"},{Apellidos:"Martinez"}]},
{Edad:{gte:18}}
]
})
db.amigos.…nd({Amigos:{$exists:true}}])
Sqlite
PostgreSQL
MongoDB
2.4.1 SQLite
es una herramienta de Software libre, que permite almacenar información
en dispositivos empotrados de una forma sencilla, e…caz, potente, rápida y
en equipos con pocas capacidades de hardware, como puede ser una PDA o
un teléfono celular. Está presente en todos los dispositivos Android, iPhone,
Mac y Windows 10, además en los navegadores Firefox, Chromium, Chrome
y Safari entre otros.
SQLite implementa el estándar SQL92 y también agrega extensiones que
facilitan su uso en cualquier ambiente de desarrollo. Esto permite que SQLite
soporte desde las consultas más básicas hasta las más complejas del lenguaje
SQL, y lo más importante es que se puede usar tanto en dispositivos móviles
como en sistemas de escritorio, sin necesidad de realizar procesos complejos
de importación y exportación de datos, ya que existe compatibilidad al 100%
entre las diversas plataformas disponibles, haciendo que la portabilidad entre
dispositivos y plataformas sea transparente.
def create_connection(path):
connection = None
try:
connection = sqlite3.connect(path)
print("Connection to SQLite DB successful")
except Error as e:
print(f"The error ’{e}’ occurred")
return connection
connection = create_connection("/trayectoria/basedatos")
Ejemplo de uso Una vez que hemos ingresado al sistema de base de datos
con nuestro usuario, entonces podemos pedirle al sistema que cree o abra una
base de datos:
sqlite3 prueba.db
y estamos en posibilidad de crear nuestras tablas, por ejemplo:
create table Productos(
id_prod int,
descripcion text,
precio ‡oat(9,2),
precioVenta ‡oat(9,2)
);
e ingresamos valores:
y los visualizamos:
2.4.2 MySQL/MariaDB
MySQL/MariaDB es un sistema de administración de bases de datos (Data-
base Management System, DBMS) para bases de datos relacionales. Así,
estos manejadores de bases de datos, no son más que una aplicación que
permite gestionar archivos llamados de bases de datos.
Existen muchos tipos de bases de datos, desde un simple archivo hasta
sistemas relacionales orientados a objetos. MySQL/MariaDB, como base
de datos relacional, utiliza multiples tablas para almacenar y organizar la
información. MySQL/MariaDB fue escrito en C y C++ y destaca por su gran
# mysql
> use mysql
> update user set plugin=” where user=’root’;
> alter user root@localhost identi…ed by ’XXXXXXX’;
> ‡ush privilegies;
> exit
y para usarlo
$ mysql -u root -p
# mysql_secure_installation
# mysql
$ mysql -u root -p
Sin embargo, este usuario no podrá trabajar con ninguna de las bases de
datos MySQL hasta que se le otorguen privilegios adicionales. Ahí el detalle.
import mysql.connector
from mysql.connector import Error
Ejemplo de uso Una vez que hemos ingresado al sistema de base de datos
con nuestro usuario, entonces podemos pedirle al sistema que nos muestre
las bases de datos existentes:
show databases
use prueba
show tables
e ingresamos valores:
y los visualizamos:
2.4.3 PostgreSQL
Las bases de datos relacionales son uno de los tipos más populares que existen,
y su uso nos permite crear sitios web de toda clase. Entre los sistemas de
bases de datos relacionales más utilizados se encuentra uno que es conocido
como PostgreSQL, que dicho sea de paso está entre los más usados a nivel
mundial.
PostgreSQL, o simplemente Postgres para darle un nombre más pin-
toresco, es un sistema de código abierto de administración de bases de datos
del tipo relacional, aunque también es posible ejecutar consultas que sean
no relaciones. En este sistema, las consultas relacionales se basan en SQL,
mientras que las no relacionales hacen uso de JSON.
Como decíamos, se trata de un sistema de código abierto y además gra-
tuito, y su desarrollo es llevado adelante por una gran comunidad de colabo-
radores de todo el mundo que día a día ponen su granito de arena para hacer
de este sistema una de las opciones más sólidas a nivel de bases de datos.
Dos detalles a destacar de PostgreSQL es que posee data types (tipos
de datos) avanzados y permite ejecutar optimizaciones de rendimiento avan-
zadas, que son características que por lo general solo se ven en sistemas de
bases de datos comerciales, como por ejemplo SQL Server de Microsoft u
Oracle de la compañía homónima.
Ejemplo de uso Una vez que hemos ingresado al sistema de base de datos
con nuestro usuario, entonces podemos pedirle al sistema que nos muestre
las bases de datos existentes:
nl
nc prueba
nd
e ingresamos valores:
y los visualizamos:
2.4.4 MongoDB
MongoDB (del inglés humongous, "enorme") es un sistema de base de datos
NoSQL orientado a documentos de código abierto y escrito en C++, que en
lugar de guardar los datos en tablas lo hace en estructuras de datos BSON
(similar a JSON) con un esquema dinámico. Al ser un proyecto de código
abierto, sus binarios están disponibles para los sistemas operativos Windows,
GNU/Linux, OS X y Solaris y es usado en múltiples proyectos o implementa-
ciones en empresas como MTV Network, Craigslist, BCI o Foursquare.
La razón de esto es que MongoDB, al estar escrito en C++, cuenta con
una más que notoria capacidad para aprovechar los recursos de la máquina
y, al estar licenciado bajo una licencia GNU AGPL 3.0, es posible adaptarlo
a nuestras necesidades.
Si no conocemos a MongoDB, al principio puede que nos sientamos un
poco perdidos. Al no tener tablas ni nada que se parezca a SQL como
referencia, tendremos que estudiar un poco su …losofía y características para
entender cómo manejar los datos. Aun así, MongoDB es una seria candidata
para almacenar los datos de nuestras aplicaciones.
$ mongo
def get_database():
# Provide the mongodb atlas url to connect python to
mongodb using pymongo
CONNECTION_STRING = "mongodb+srv://<username>:<password>@<cluster-
name>.mongodb.net/myFirstDatabase"
# Create a connection using MongoClient. You can im-
port MongoClient or use pymongo.MongoClient
client = MongoClient(CONNECTION_STRING)
# Create the database for our example (we will use the
same database throughout the tutorial
return client[’user_shopping_list’]
dbname = get_database()
Ejemplo de uso Una vez que hemos ingresado al sistema de base de datos
con nuestro usuario, entonces podemos pedirle al sistema nos muestre las
colecciones existentes (bases de datos), mediante:
db
db.createCollection(prueba)
show collections
use prueba
var miProductos =
[
{"_id" : 1, "descripcion" : "Cigarros", "precio" : 25.5,
"precioVenta" : 30.0},
{"_id" : 2, "descripcion" : "Refresco", "precio" : 4.5,
"precioVenta" : 6.0},
];
db.Productos.insert(miProductos);
y los visualizamos:
db.Productos.…nd()
var miVentas =
[
{"_id" : 1, "id_prod" : 1, "Cantidad" : 2, "Fecha" :
"2020/12/01 8:01:00"},
{"_id" : 2, "id_prod" : 2, "Cantidad" : 5, "Fecha" :
"2020/12/01 10:15:00"},
{"_id" : 3, "id_prod" : 2, "Cantidad" : 4, "Fecha" :
"2020/12/01 13:34:00"},
{"_id" : 4, "id_prod" : 1, "Cantidad" : 3, "Fecha" :
"2020/12/01 21:56:00"},
];
db.Ventas.insert(miVentas);
db.Ventas.…nd()
db.Ventas.…nd().forEach(
function (object) {
var commonInBoth=db.Productos.…ndOne({ "_id":
object.id_prod} );
if (commonInBoth != null) {
print(object.Fecha, object.Cantidad, common-
InBoth.descripcion, commonInBoth.precioVenta, (commonInBoth.precioVenta
* object.Cantidad));
}
}
);
no con…able.
Crear una conexión a una base de datos es costoso, para evitar incurrir en
este tiempo de creación y destrucción de conexiones o limitar el número de
conexiones que una aplicación utiliza como máximo las aplicaciones utilizan
un pool de conexiones. Las conexiones se crean al iniciar la aplicación o bajo
demanda según se van necesitando más hasta el límite máximo de…nido.
Cuando la aplicación necesita una conexión la obtiene de forma rápida del
pool de conexiones y cuando termina de utilizarla la devuelve al pool de
conexiones para que sea reutilizada en posteriores usos.
Cada base de datos utiliza un protocolo diferente de comunicación con
los clientes por lo que es necesario un componente que abstrae de las pecu-
liaridades de cada base de datos y proporcione un marco común de trabajo
independiente de cada base de datos. Cada base de datos requiere de un
Driver compatible también con la versión de la base de datos. Generalmente,
son los desarrolladores de la propia base de datos los que proporcionan un
Driver especí…co adecuado para el acceso a la base de datos desde Java que
cumple con las APIs de JDBC.
package io.github.picodotdev.blgbitix.javasql;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DriverManager.drivers().forEach(d -> {
System.out.printf("Driver: %s%n", d.getClass().getName());
});
try (Connection connection = DriverManager.getConnection("jdbc:h2:mem:datab
"sa", "")) {
connection.setAutoCommit(false);
...
} catch (Exception e) {
e.printStackTrace();
}
}
}
connection.close();
Driver: org.h2.Driver
Primary key: 1
Primary key: 2
Product (id: 1, name: PlayStation 5, price: 499,99 EUR)
Product (id: 2, name: Xbox Series X, price: 499,99 EUR)
plugins {
id ’application’
}
repositories {
mavenCentral()
}
dependencies {
implementation ’com.h2database:h2:1.4.200’
}
application {
mainClass = ’io.github.picodotdev.blgbitix.javasql.Main’
}
sql-injection-1.sql
En esta sentencia se …naliza la sentencia original con ; y se inicia otra lo
que provoca la eliminación de una tabla, con un valor para user_id especial-
mente construido para ejecutar la sentencia maliciosa de eliminación de la
tabla.
sql-injection-2.sql
La solución al problema de seguridad de SQL injection en Java es no
construir la sentencia de forma dinámica mediante concatenación de cadenas
utilizando la clase PreparedStatement con argumentos para los datos que se
inserten en la sentencia SQL.
sql-injection-prepared-statement.java
con…g_…le = open(r"C:nUsersnyournamencon…g.json")
con…g = json.load(con…g_…le)
query = "SELECT *
FROM League
JOIN Country ON Country.id = League.country_id;"
2.6.1 SQLite
Se puede trabajar este manejador de bases de datos desde la red, ingresando
a la dirección: https://www.codechef.com/ide
Por ser un servicio en red, no es necesario conocer que bases de datos
hay, ni seleccionar alguna de las existentes para inicar el trabajo en la base
de datos. Por lo tanto, sólo creamos las tablas necesarias, agregamos valores y
hacemos las operaciones requeridas con la base de datos creada, por ejemplo:
Hackers éticos e investigadores de seguridad en todo el mundo y contiene cientos de he-
rramientas para el trabajo forense, esta distribución es basada en Debian.
4
Puede ser por ejemplo Linux, Apache, MySQL, PHP, Perl, Python, etc.
5
Es un proyecto comunitario que ayuda a organizaciones e instituciones educativas a
diseñar, implementar y administrar aplicaciones seguras. Encontrando amenazas como:
Inyección (SQL, OS, XXE, LDAP), irrupción en la autenti…cación y la sesión, Cross Site
Scripting, irrupción en el control de acceso, errores en la con…guración de la seguridad,
exposición de datos sensibles, protección insu…ciente contra ataques, uso de componentes
con vulnerabilidades conocidos, API con protección insu…ciente, etc.
2.6.3 PostgreSQL
Se puede trabajar este manejador de bases de datos desde la red, ingresando
a la dirección: https://rextester.com/l/postgresql_online_compiler
Por ser un servicio en red, no es necesario conocer que bases de datos
hay, ni seleccionar alguna de las existentes para inicar el trabajo en la base
de datos. Por lo tanto, sólo creamos las tablas necesarias, agregamos valores y
hacemos las operaciones requeridas con la base de datos creada, por ejemplo:
Creamos la tabla de Productos e insertamos los valores mediante:
2.6.4 MongoDB
Se puede trabajar este manejador de bases de datos desde la red, ingresando
a la dirección: https://www.jdoodle.com/online-mongodb-terminal/
Por ser un servicio en red, no es necesario conocer que bases de datos
hay, ni seleccionar alguna de las existentes para inicar el trabajo en la base
de datos. Por lo tanto, sólo creamos las colecciones necesarias, agregamos
valores y hacemos las operaciones requeridas con la base de datos creada, por
ejemplo:
Creamos el document de Productos e insertamos los valores mediante:
var miProductos =
[
{"_id" : 1, "descripcion" : "Cigarros", "precio" : 25.5,
"precioVenta" : 30.0},
{"_id" : 2, "descripcion" : "Refresco", "precio" : 4.5,
"precioVenta" : 6.0},
];
db.Productos.insert(miProductos);
db.Productos.…nd()
var miVentas =
[
{"_id" : 1, "id_prod" : 1, "Cantidad" : 2, "Fecha" :
"2020/12/01 8:01:00"},
{"_id" : 2, "id_prod" : 2, "Cantidad" : 5, "Fecha" :
"2020/12/01 10:15:00"},
{"_id" : 3, "id_prod" : 2, "Cantidad" : 4, "Fecha" :
"2020/12/01 13:34:00"},
{"_id" : 4, "id_prod" : 1, "Cantidad" : 3, "Fecha" :
"2020/12/01 21:56:00"},
];
db.Ventas.insert(miVentas);
db.Ventas.…nd()
db.Ventas.…nd().forEach(
function (object) {
var commonInBoth=db.Productos.…ndOne({ "_id":
object.id_prod} );
if (commonInBoth != null) {
print(object.Fecha, object.Cantidad, common-
InBoth.descripcion, commonInBoth.precioVenta, (commonInBoth.precioVenta
* object.Cantidad));
}
}
);
3 Intercambio de Información
Hay una gran variedad de tecnologías disponibles para producir y almacenar
datos. Como son: hojas de cálculo, bases de datos, Software estadístico más
especí…co y más. Esto genera una enorme diversidad de formatos, a veces
este es por decir lo menos caótico.
Algunos de estos formatos, no siempre se adecuan a los niveles de apertura
deseados, aquí ofrecemos algunas pautas y recomendaciones que facilitan la
adaptación y/o transformación de estos formatos hacia otros más abiertos y
fácilmente reutilizables.
<catalogo>
<libro>
<autor>Raúl González Duque</autor>
<titulo>Python para todos</titulo>
<genero>Computación</genero>
</libro>
</catalogo>
{
libro: {
autor: Raúl González Duque,
titulo: Python para todos,
genero: Computación
}
}
YAML es un lenguaje que fue diseñado para ser legible (y como tal
será fácil de editar con cualquier editor de texto estándar). Su noción es a
menudo similar a reStructuredText o una sintaxis Wiki, que también intentan
ser legibles tanto por seres humanos y computadoras. YAML 1.2 incluye
también una noción de taquigrafía que sea compatible con JSON, y como
tal, cualquier documento JSON es también válido YAML; Sin embargo esto
no sostiene al revés.
—
libro:
autor: Raúl González Duque
titulo: Python para todos
genero: Computación
Archivos separado por comas los archivos CSV pueden ser un for-
mato útil debido a que son compactos y por lo tanto adecuado para trans-
ferir grandes conjuntos de datos con la misma estructura. Sin embargo, el
formato es tan espartano que los datos son frecuentemente inservibles sin
documentación, ya que puede ser casi imposible adivinar el signi…cado de las
diferentes columnas. Por tanto, es particularmente importante para los for-
matos separados por comas que la documentación de los campos individuales
sea precisa.
Además, es esencial que la estructura del archivo sea respetada, como
una omisión única de un campo puede perturbar la lectura de todos los datos
restantes en el archivo sin ninguna posibilidad real de recti…carla, porque no
se puede determinar cómo los datos restantes deben ser interpretados.
posible para que sea más fácil para una máquina para distinguir las partidas
(de cualquier tipo) a partir del contenido y así sucesivamente. En general se
recomienda no exhibir en formato de procesamiento de texto, si hay datos
en un formato diferente.
Texto documentos de texto (. Txt) son muy fáciles para leer en los
ordenadores. Por lo general, no incluyen metadatos estructurales, lo que sig-
ni…ca que los desarrolladores necesitan para crear un programa de análisis
que pueda interpretar cada documento tal y como aparece. Algunos proble-
mas pueden ser causados al cambiar archivos de texto plano entre sistemas
operativos. MS Windows, Mac OSX y otras variantes de Unix tienen su
propia forma de decirle a la computadora que se ha llegado al …nal de la
línea.
HDF (https://www.hdfgroup.org/solutions/hdf5/)
En el ámbito cientí…co, se genera gran cantidad de información en for-
mato digital, que es necesario distribuir. Dada la diferente naturaleza de
ésta, es necesario utilizar distintos formatos especialmente adaptados a cada
uno de los tipos de datos que se vayan a almacenar. El principal problema,
radica en la estandarización y la interoperabilidad, ya que, pese a que existen
numerosos estándares de almacenamiento de información, no todos son so-
portados por las distintas aplicaciones informáticas utilizadas, lo que puede
presentar problemas en el momento de la difusión y reutilización de dicha
información. El formato HDF (Hierarchical Data Format), representa una
alternativa e…caz al ser adoptado como estructura de almacenamiento de
datos, cuyas características más representativas son las siguientes:
formato del archivo en sí. Los formatos en los cuales la información es publi-
cada - en otras palabras, la base digital en la cual la información es almace-
nada - puede ser "abierto" o "cerrado". Un formato abierto es aquel donde
las especi…caciones del software están disponibles para cualquier persona, de
forma gratuita, así cualquiera puede usar dichas especi…caciones en su pro-
pio software sin ninguna limitación en su reutilización que fuere impuesta
por derechos de propiedad intelectual.
Si el formato del archivo es "cerrado", esto puede ser debido a que el for-
mato es propietario y sus especi…caciones no están disponibles públicamente,
o porque el formato es propietario y aunque las especi…caciones se han he-
cho públicas, su reutilización es limitada. Si la información es liberada en
un formato de archivo cerrados, esto puede causar grandes obstáculos para
reutilizar la información codi…cada en él, forzando a aquellos que deseen usar
la información a comprar software innecesario.
La ventaja de los archivos de formatos abiertos, es que permiten a los de-
sarrolladores producir varios paquetes de software y servicios utilizando esos
formatos. Esto entonces reduce al mínimo los obstáculos para la reutilización
de la información que contienen.
El uso de formatos de archivo con propiedad, para el que la especi…cación
no está disponible públicamente, puede crear dependencia de software de
terceros o de los titulares de licencias de los formatos de archivos. En el peor
de los casos, esto puede signi…car que la información sólo se pueden leer con
ciertos softwares especiales, que pueden ser muy caros, o que pueden quedar
obsoletos.
La preferencia del término Gobierno de Datos Abiertos, es que la infor-
mación se publicará en formatos de archivo abiertos, los cuales son de lectura
mecánica.
Base de datos como los servicios webs, las bases de datos permiten el
acceso directo a los datos dinámicamente. Las bases de datos tienen la ven-
taja de extraer aquella información en la cual estén interesados. Hay algunas
preocupaciones de seguridad en cuanto a permitir extracciones remotas a
bases de datos, y el acceso a las bases de datos es útil si su estructura y la
importancia de las tablas y campos individuales están bien documentados.
Generalmente es relativamente simple y no tiene costo crear web services que
expongan datos de una base de datos, esta puede ser una manera fácil de
lidiar con las problemáticas de seguridad.
Las …las deben …nalizar con los caracteres de "retorno de carro" (nr) y
"salto de línea" (nn) unidos (nrnn). Esta forma de separar las líneas se
denomina usualmente CRLF ("Carriage Return Line Feed").
Tanto los campos como los valores deben estar separados por comas
(",").
col1,col2nrnn
"La tasa de Juan, está vacía",La tasa de Pablo está llenanrnn
"La tasa de Juannnestá vacía",La tasa de Pablo está llenanrnn
"La tasa de Juannrnnestá vacía",La tasa de Pablo está llenanrnn
col1,col2nrnn
"La tasa de ""Juan"" está vacía",La tasa de Pablo está llenanrnn
col1,col2,col3nrnn
a„bnrnn
a,"",bnrnn
No usar artículos.
Ejemplos:
Estar en español.
solicitante_nombre
solicitante_cargo
solicitante_documento_tipo
solicitante_documento_numero
No recomendado: "fecha_hora"
Recomendado: "audiencia_id", "audiencia_fecha_hora".
Fila de encabezado Los datos deben contener sólo una …la de en-
cabezado. Desde la segunda …la en adelante, sólo debe haber datos, pero
nunca un encabezado.
Texto
Los campos de texto no deben contener espacios en blanco innecesarios
al principio ni al …nal.
Entidades Las entidades que aparezcan entre los datos de un campo tex-
tual deben tener una descripción única. Es decir, toda mención que se realice
a una entidad dada debe hacerse usando exactamente la misma cadena de
caracteres cada vez:
Siglas Todas las siglas se escriben en mayúsculas, sin usar puntos ni espa-
cios intermedios.
Número
Para los números negativos debe incluirse el símbolo menos "-" inmedi-
atamente antes del número, sin espacio en blanco intermedio.
Moneda Los valores numéricos que sean además valores monetarios se con-
sideran números y, por lo tanto, valen las mismas recomendaciones que para
ellos. Además, agregamos las siguientes recomendaciones:
Fecha: YYYY-MM-DD
Hora: HH:MM:SS[.mmmmmm][+HH:MM]
Duración: YYYY-MM-DDTHH:MM:SS[.mmmmmm]
Rangos horarios
Los rangos estarán divididos en dos partes separadas por un doble guión
bajo "__", la primera indica el día y la segunda, la hora.
Se puede omitir la parte del día o bien de la hora pero nunca ambas.
El día se puede indicar tanto mediante rangos separando los días con
guiones medios "-" o bien como particulares con el guión bajo "_".
Los días se indicarán con sus iniciales en castellano: LUN, MAR, MIE,
JUE, VIE, SAB y DOM
Si existe la posibilidad de que haya otro valor que no sea true, false o
"valor ausente" signi…ca que se eligió un tipo de datos incorrecto: este
no es booleano, el tipo de dato booleano es binario y sólo admite 2
valores de verdad (aparte del caso del "valor ausente").
Las clases de Java se de…nen en archivos con el mismo nombre que la clase.
Entonces, se debe guardar esta clase en un archivo llamado Carro.java. Solo
se puede de…nir una clase en cada archivo.
Una clase de Carro pequeña similar está escrita en Python de la siguiente
manera:
class Carro:
def __init__(self, color, modelo, anio):
self.color = color
self.modelo = modelo
self.anio = anio
Al pre…jar los nombres de las variables con self, le dice a Python que
estos son atributos. Cada instancia de la clase tendrá una copia. Todas las
variables en Python están escritas de forma ‡exible, y estos atributos no son
una excepción.
También se puede crear variables de instancia fuera de .__init__(),
pero no es una práctica recomendada ya que su alcance suele ser confuso.
Si no se utilizan correctamente, las variables de instancia creadas fuera de
.__init__() pueden provocar errores sutiles que son difíciles de encontrar.
Por ejemplo, puede agregar un nuevo atributo .ruedas a un objeto carro como
este:
5
6 >>> print(f"Este tiene {carro.Carro.ruedas} ruedas")
7 Este tiene 0 ruedas
8
9 >>> print(f"Este tiene {mi_carro.ruedas} ruedas")
10 Este tiene 0 ruedas
14
15 >>> # cambiar el valor de la variable de clase
16 ... carro.Carro.ruedas = 4
17
18 >>> print(f"Este tiene {mi_carro.ruedas} ruedas")
19 Este tiene 4 ruedas
20 >>> print(f"Mi otro carro tiene {mi_otro_carro.ruedas}
ruedas")
21 Mi otro carro tiene 4 ruedas
22
23 >>> # Cambiar el valor de la variable de instancia para
mi_carro
24 ... mi_carro.ruedas = 5
25
26 >>> print(f"Mi carro tiene {mi_carro.ruedas} ruedas")
27 Mi carro tiene 5 ruedas
28 >>> print(f"Mi otro carro tiene {m_otro_carro.ruedas}
ruedas")
29 Mi otro carro tiene 4 ruedas
1. mi_carro
2. mi_otro_carro
miCarro.color = "Rojo";
class Carro:
ruedas = 0
def __init__(self, color, modelo, anio):
self.color = color
self.modelo = modelo
self.anio = anio
self._portavasos = 6
class Carro:
ruedas = 0
def __init__(self, color, modelo, anio):
self.color = color
self.modelo = modelo
self.anio = anio
self.__portavasos = 6
self and this En Java, una clase se re…ere a sí misma con la referencia
this:
public void setColor(String color) {
this.color = color;
}
this está implícito en el código Java: normalmente no es necesario es-
cribirlo, a menos que pueda haber confusión entre dos variables con el mismo
nombre.
Podemos escribir el mismo código de esta manera:
public void setColor(String newColor) {
color = newColor;
}
Dado que Carro tiene un atributo llamado .color, y no hay otra variable
en el alcance con el mismo nombre, una referencia a ese nombre funciona.
Usamos esto en el primer ejemplo para diferenciar entre el atributo y el
parámetro, ambos con nombre color.
En Python, la palabra clave self tiene un propósito similar. Así es como
se re…ere a las variables de miembro, pero a diferencia de this de Java, es
necesario si desea crear o hacer referencia a un atributo de miembro:
class Carro:
def __init__(self, color, modelo, anio):
self.color = color
self.modelo = modelo
self.anio = anio
self._voltaje = 12
@property
def voltaje(self):
return self._voltaje
Python requiere cada uno de ellos en el código anterior. Cada uno crea
o hace referencia a los atributos. Si los omite, Python creará una variable
local en lugar de un atributo.
La diferencia entre cómo se usa self y this en Python y Java se debe a
diferencias subyacentes entre los dos lenguajes y cómo nombran variables y
atributos.
Se puede llamar a di_hola() desde cualquier lugar que sea visible. Esta
función no tiene referencia a self, lo que indica que es una función global, no
una función de clase. No puede alterar ni almacenar ningún dato en ninguna
clase, pero puede usar variables locales y globales.
Por el contrario, cada línea de código Java que escribe pertenece a una
clase. Las funciones no pueden existir fuera de una clase y, por de…nición,
todas las funciones de Java son métodos. En Java, lo más cerca que puede
llegar a una función pura es mediante el uso de un método estático:
class Vehiculo:
def __init__(self, color, modelo):
self.color = color
self.modelo = modelo
class Dispositivo:
def __init__(self):
self._voltaje = 12
class Carro(Vehiculo, Dispositivo):
def __init__(self, color, modelo, anio):
Vehiculo.__init__(self, color, modelo)
Dispositivo.__init__(self)
self.anio = anio
@property
def voltaje(self):
return self._voltaje
@voltaje.setter
def voltaje(self, volts):
print("Aviso: esto puede causar problemas!")
self._voltaje = volts
@voltaje.deleter
def voltaje(self):
print("Aviso: el radio dejara de trabajar!")
del self._voltaje
Java, por otro lado, solo admite herencia única, lo que signi…ca que las
clases en Java pueden heredar datos y comportamiento de una sola clase
principal. Sin embargo, los objetos Java pueden heredar el comportamiento
de muchas interfaces diferentes. Las interfaces proporcionan un grupo de
métodos relacionados que un objeto debe implementar y permiten que varias
clases secundarias se comporten de manera similar.
Para ver esto en acción, divida la clase Java Carro en una clase principal
y una interfaz:
...
>>> class Rinoceronte:
... pass
...
>>> mi_carro = Carro("amarillo", "Beetle", "1966")
>>> mi_telefono = Telefono()
>>> mi_Rinoceronte = Rinoceronte()
>>> cargar(mi_carro)
Cargando 12 volts dispositivo
>>> cargar(mi_telefono)
Cargando a 12 volts Dispositivo
>>> cargar(mi_Rinoceronte)
No se puede cargar Rinoceronte
class Object {
boolean equals(Object obj) { ... }
int hashCode() { ... }
String toString() { ... }
}
servicios públicos, como las colecciones que clasi…can objetos en función del
valor, necesitan ambas.
toString() devuelve una representación de cadena del objeto. De forma
predeterminada, este es el nombre de la clase y la dirección. Este método se
llama automáticamente cuando se pasa un objeto a un método que requiere
un argumento de cadena, como System.out.println():
Carro@61bbe9ba
def __str__(self):
return f’Carro {self.color} : {self.modelo} : {self.anio}’
class Carro:
def __init__(self, color, modelo, anio):
self.color = color
self.modelo = modelo
self.anio = anio
def __str__(self):
return f’Carro {self.color} : {self.modelo} : {self.anio}’
def __eq__(self, other):
return self.anio == other.anio
def __lt__(self, other):
return self.anio < other.anio
def __add__(self, other):
return Carro(self.color + other.color,
self.modelo + other.modelo,
int(self.anio) + int(other.anio))
Hay muchos más operadores que puede sobrecargar usando métodos dun-
der. Ofrecen una forma de enriquecer el comportamiento de su objeto de una
manera que los métodos predeterminados de la clase base común de Java no
lo hacen.
4.5 Re‡exión
La re‡exión se re…ere a examinar un objeto o clase desde dentro del objeto
o clase. Tanto Java como Python ofrecen formas de explorar y examinar los
atributos y métodos de una clase.
class com.realpython.Carro
true
>>> print(dir(mi_carro))
[’_Carro__portavasos’, ’__add__’, ’__class__’, ’__de-
lattr__’, ’__dict__’,
’__dir__’, ’__doc__’, ’__eq__’, ’__format__’, ’__ge__’,
’__getattribute__’,
’__gt__’, ’__hash__’, ’__init__’, ’__init_subclass__’,
’__le__’, ’__lt__’,
’__module__’, ’__ne__’, ’__new__’, ’__reduce__’, ’__re-
duce_ex__’, ’__repr__’,
’__setattr__’, ’__sizeof__’, ’__str__’, ’__subclasshook__’,
’__weakref__’,
’_voltaje’, ’color’, ’modelo’, ’voltaje’, ’ruedas’, ’anio’]
>>> print(getattr(mi_carro, "__format__"))
<built-in method __format__ of Carro object at 0x7fb4c10f5438>
Esta capacidad también existe en Python. Sin embargo, dado que Python
no distingue entre funciones y atributos, debe buscar especí…camente en-
tradas que sean invocables:
Por otro lado, existe el Software libre, desarrollado por usuarios y para
usuarios que, entre otras cosas, comparten los códigos fuente, el pro-
grama ejecutable y dan libertades para estudiar, adaptar y redistribuir
a quien así lo requiera el programa y todos sus derivados.
apropiada, por ejemplo si requiere que usted sea el titular de los derechos de
autor del código que desea añadir, entonces se trata de una licencia demasia-
do restrictiva como para considerarla libre.
La libertad 3 incluye la libertad de publicar sus versiones modi…cadas
como Software libre. Una licencia libre también puede permitir otras formas
de publicarlas; en otras palabras, no tiene que ser una licencia de Copyleft.
No obstante, una licencia que requiera que las versiones modi…cadas no sean
libres, no se puede considerar libre.
«Software libre» no signi…ca que «no es comercial». Un programa libre
debe estar disponible para el uso comercial, la programación comercial y la
distribución comercial. La programación comercial de Software libre ya no es
inusual; el Software libre comercial es muy importante, ejemplo de ello es la
empresa RedHat (ahora propiedad de IBM). Puede haber pagado dinero para
obtener copias de Software libre, o puede haber obtenido copias sin costo.
Pero sin tener en cuenta cómo obtuvo sus copias, siempre tiene la libertad
de copiar y modi…car el Software, incluso de vender copias.
El término Software no libre se emplea para referirse al Software dis-
tribuido bajo una licencia de Software más restrictiva que no garantiza estas
cuatro libertades. Las leyes de la propiedad intelectual reservan la mayoría de
los derechos de modi…cación, duplicación y redistribución para el dueño del
Copyright; el Software dispuesto bajo una licencia de Software libre rescinde
especí…camente la mayoría de estos derechos reservados.
Los manuales de Software deben ser libres por las mismas razones que
el Software debe ser libre, y porque de hecho los manuales son parte del
Software. También tiene sentido aplicar los mismos argumentos a otros tipos
de obras de uso práctico; es decir, obras que incorporen conocimiento útil, tal
como publicaciones educativas y de referencia. La Wikipedia es el ejemplo
más conocido.
Sin embargo esta es una pregunta sobre la que los expertos a día de hoy,
tras muchos años de discusiones, siguen sin ponerse de acuerdo. ¿Es más se-
guro el Software de código abierto que los programas cerrados, o viceversa?
Lo cierto es que, en términos generales, ambos bandos tienen sus razones
con las que defender sus argumentos. Por un lado, los usuarios de las aplica-
ciones y sistemas de código abierto, de…enden que, al estar el código fuente
disponible a los ojos de todo el mundo, es mucho más fácil localizar posibles
agujeros de seguridad y vulnerabilidades que pongan en peligro los datos de
los usuarios.
Por otro lado, aquellos que consideran que los sistemas cerrados son más
seguros en este sentido, a…rman que al tener acceso tan solo los expertos
al código fuente de sus aplicaciones, es más complicado que se produzcan
…ltraciones o inserciones de Software malicioso en este tipo de sistemas. Hay
que tener en cuenta que, por ejemplo, Google premia a las personas que
descubren fallos de seguridad en su Software como Chrome, aunque no es el
único gigante de la tecnología en utilizar estas tácticas.
De hecho muchas empresas están gastando miles de millones de dólares
y/o euros en hacer que sus propuestas sean lo más seguras posible, argumen-
tando que la seguridad de sus proyectos es una de sus prioridades, todo con
el …n de intentar frenar que los atacantes vulneren sus sistemas. Por otro
lado, otros aseguran que cuando el código fuente es público, más ojos están
disponibles para detectar posibles vulnerabilidades o errores en dicho código,
por lo que siempre será más rápido y sencillo poner soluciones con el …n de
ganar en seguridad.
Sea como sea, en cualquiera de los dos casos, lo que ha quedado más que
demostrado es que la seguridad no está garantizada en ningún momento, ya
hagamos referencia a propuestas de código abierto, o no. Pero también es
cierto que lo que se procura es que los riesgos de ser atacados se reduzcan
en la medida de lo posible. Sirva como ejemplo que los sistemas Linux son
considerados desde hace mucho tiempo como un sistema operativo seguro, en
buena parte debido a las ventajas que ofrece su diseño. Dado que su código
está abierto, son muchas las personas que incorporan mejoras de las que el
resto de usuarios de Linux se bene…cian, a diferencia de las propuestas de
Windows o MacOS, donde estas correcciones generalmente se limitan a las
que detectan Microsoft y Apple.
No obstante, en nuestra defensa del Software libre, diremos que su código
abierto permite que los errores sean encontrados y solucionados con mayor
rapidez, por lo que determinamos que es el Software más recomendable.
En general, puede a…rmarse que el Software libre es más seguro, ya que
debido a su carácter abierto y distribuido, un gran número de programadores
y personas expertas pueden estar atentas al código fuente -especialmente en
los grandes proyectos-, lo cual permite hacer auditorías con objeto de detectar
errores y puertas traseras (Backdoor, en inglés) que pongan en riesgo nuestros
datos.
Así, los grandes programas y proyectos de Software libre, con una ex-
tensa comunidad de desarrolladores/as y personas usuarias que lo respalden,
presentan niveles muy altos de seguridad, un alto grado de protección y una
rápida respuesta a posibles vulnerabilidades.
GPLv3 contiene normas de compatibilidad que hacen que sea más fácil
combinar el código GPL con el código que se publicó bajo diferentes
licencias. Esto se re…ere en particular al código bajo la licencia de
Apache v. 2.0.
Licencia Copyleft Hay que hacer constar que el titular de los derechos
de autor (Copyright) de un Software bajo licencia Copyleft puede también
realizar una versión modi…cada bajo su Copyright original, y venderla bajo
cualquier licencia que desee, además de distribuir la versión original como
Software libre. Esta técnica ha sido usada como un modelo de negocio por
una serie de empresas que realizan Software libre (por ejemplo MySQL); esta
práctica no restringe ninguno de los derechos otorgados a los usuarios de la
versión Copyleft.
Licencia estilo MIT Las licencias MIT son de las más permisivas, casi se
consideran Software de dominio público. Lo único que requieren es incluir la
licencia MIT para indicar que el Software incluye código con licencia MIT.
Licencia Mozilla Public License MPL Esta licencia requiere que los
archivos al ser distribuidos conserven la misma licencia original pero pueden
ser usados junto con archivos con otra licencia, al contrario de la licencia
GPL que requiere que todo el código usado junto con código GPL sea licen-
ciado como código GPL. También en caso de hacer modi…caciones extensivas
permite distribuirlas bajo diferentes términos y sin incluir el código fuente
en las modi…caciones.
pero sin perder ciertos derechos que son la fuente de sus ingresos como la
venta de licencias.
Las expresiones «Software libre» y «código abierto» se re…eren casi al
mismo conjunto de programas. No obstante, dicen cosas muy diferentes
acerca de dichos programas, basándose en valores diferentes. El movimiento
del Software libre de…ende la libertad de los usuarios de ordenadores, en un
movimiento en pro de la libertad y la justicia. Por contra, la idea del código
abierto valora principalmente las ventajas prácticas y no de…ende principios.
Esta es la razón por la que gran parte de la comunidad de Software libre está
en desacuerdo con el movimiento del código abierto y nosotros no empleamos
esta expresión en este texto.
que éste evita la ambigüedad del término en ese idioma que es «Free» en
«Free Software».
Mucha gente reconoce el bene…cio cualitativo del proceso de desarrollo de
Software cuando los desarrolladores pueden usar, modi…car y redistribuir el
código fuente de un programa. El movimiento del Software libre hace especial
énfasis en los aspectos morales o éticos del Software, viendo la excelencia
técnica como un producto secundario de su estándar ético. El movimiento
de código abierto ve la excelencia técnica como el objetivo prioritario, siendo
el compartir el código fuente un medio para dicho …n. Por dicho motivo, la
FSF se distancia tanto del movimiento de código abierto como del término
«código abierto (Open Source)».
Puesto que la «iniciativa de Software libre Open Source Initiative (OSI)»
sólo aprueba las licencias que se ajustan a la «de…nición de código abierto
(Open Source De…nition)», la mayoría de la gente lo interpreta como un es-
quema de distribución, e intercambia libremente "código abierto" con "Soft-
ware libre". Aún cuando existen importantes diferencias …losó…cas entre
ambos términos, especialmente en términos de las motivaciones para el de-
sarrollo y el uso de tal Software, raramente suelen tener impacto en el proceso
de colaboración.
Aunque el término "código abierto" elimina la ambigüedad de libertad
frente a precio (en el caso del inglés), introduce una nueva: entre los progra-
mas que se ajustan a la de…nición de código abierto, que dan a los usuarios
la libertad de mejorarlos, y los programas que simplemente tienen el código
fuente disponible, posiblemente con fuertes restricciones sobre el uso de dicho
código fuente. Mucha gente cree que cualquier Software que tenga el código
fuente disponible es de código abierto, puesto que lo pueden manipular, sin
embargo, mucho de este Software no da a sus usuarios la libertad de dis-
tribuir sus modi…caciones, restringe el uso comercial, o en general restringe
los derechos de los usuarios.
Fue creada en el 2019 por el equipo del proyecto de código abierto Holochain,
esta licencia fue desarrollada para ser utilizada con aplicaciones criptográ…-
cas distribuidas. El inconveniente con las licencias tradicionales es que no
obligaba a compartir los datos. Esto podría perjudicar el funcionamiento de
toda la red. Por eso la CAL también incluye la obligación de proporcionar
a terceros los permisos y materiales necesarios para utilizar y modi…car el
Software de forma independiente sin que ese tercero tenga una pérdida de
datos o capacidad.
Hay que decir que la gente del CERN parece haber encontrado la solución
a un problema que viene afectando a algunos proyectos de código abierto.
Una gran empresa utiliza ese proyecto para comercializar servicios y no solo
hace ningún aporte al proyecto original (ya sea con código o dando apoyo
…nanciero) si no que también compite en el mismo mercado.
provenir tanto del sector privado, del sector voluntario o del sector público.
En los últimos años se ha visto un incremento notable de grandes corpora-
tivos (como IBM, Microsoft, Intel, Google, Samsung, Red Hat, etc.) que
han dedicado una creciente cantidad de recursos humanos y computacionales
para desarrollar Software libre, ya que esto apoya a sus propios negocios.
En México el Software libre nació en las Universidades y los Centros de
Investigación. Es por eso que, desde hace cuatro décadas, los estudiantes
y los profesores usan Software libre para …nes didácticos y de investigación.
Las universidades suelen optar por el uso de Software libre en vez de utilizar
Software privativo porque satisface de una mejor manera sus necesidades de
cómputo, dada su naturaleza de apertura del código y la libertad de compartir
los resultados obtenidos. De forma colateral, no se tienen gastos adicionales
derivados del pago de licenciamientos.
Computólogos, físicos, químicos, matemáticos, otros profesionistas y cien-
tí…cos utilizan Software libre como herramienta de investigación y creación.
Un claro ejemplo de ello es la llamada Delta Metropolitana, que es una red
de supercomputadoras que están en varios puntos de la Ciudad de México,
en el CINESTAV, el IPN, la UAM y la UNAM. Esa red de supercómputo uti-
liza Software libre para consolidar sus recursos, hacer investigación y generar
conocimiento.
Por otro lado, dadas las características del Software de código cerrado, un
usuario común ignora absolutamente el contenido del mismo y por tanto si
existe dentro de las líneas del código alguna amenaza contra su equipo o su
información, además el usuario no sólo tiene prohibido el intentar eliminar o
cambiar esa parte del código sino que puede ser perseguido por la ley por el
hecho de intentar conocer si existe tal amenaza en dicho Software.
Además, en una sociedad de la información, el Software se ha convertido
en una herramienta importante de productividad, y una licencia de Software
privativo constituye un acuerdo o contrato entre dos sujetos jurídicos que vo-
luntariamente acuerdan las condiciones de uso de un programa, pero el costo
económico de dicha licencia es cada vez más alto y en el caso de instituciones
educativas, gubernamentales y sociedades civiles es en la mayoría de los casos
-por decir lo menos- prohibitivo.
Ya hace un tiempo, en varios periódicos de circulación nacional (véase
[10]) fue publicado el siguiente anuncio:
El Instituto Mexicano de la Propiedad Industrial (IMPI) anunció
que en las próximas semanas dará inicio una serie de clausuras a
Además, la UNAM, desde junio 9 del 2009 …rmó un acuerdo (véase [11]):
Ante este escenario, una alternativa viable podría ser optar por el Soft-
ware libre, aunque, pese a su incipiente desarrollo es seguro que en un futuro
podría alcanzar a suplir todas las necesidades básicas de los usuarios, dejando
la adquisición de paquetes especializados sólo para los cursos avanzados que
justi…que el uso de Software privativo.
Libre redistribución
y esta puede ser a través de un pago o sin costo. Es por ello que existen
distintas empresas, organizaciones y usuarios que pueden apoyar a los usuar-
ios …nales en el desarrollo y soporte de algún programa de Software libre o
una distribución personalizada de Linux por un costo determinado.
Mucha gente, en especial ejecutivos de empresas, se acercan a Linux bajo
la promesa de que es una solución de bajo costo -muchos piensan que incluso
es gratis-. Pero la realidad es que detrás de Linux y los programas de Software
libre (y aquí la traducción correcta de la palabra inglesa, Free es libre, no
gratis) pueden llevar una serie de costos ocultos que deben ser considerados
al momento de decidir si se implementa una solución propietaria o una libre.
Los costos ocultos aparecen cuando se intenta instalar y capacitar en el
uso de algún Software y se necesitan la ayuda de un informático, al que
se tiene que pagar, o alguna empresa quiere personalizar la interfaz de un
programa y necesita la ayuda de un programador, que también tienen un
coste, por lo que …nalmente el comentario suele ser "el Software libre no es
barato".
El primer punto a considerar al evaluar ambas alternativas es el costo
de la licencia. Los productos de Software libre no suelen tener un costo de
licencia asociado, que si existe en los programas propietarios. De hecho es
allí en donde los fabricantes de Software recargan sus costos de investigación
y desarrollo, de producción e incluso sus ganancias. En este primer punto el
ganador claro es el Software libre, y es lo que los adeptos de este esquema
publicitan a viva voz: "su compañía puede ahorrar miles de dólares al año
usando Software libre".
El segundo punto a considerar es el costo de instalación, con…guración
y capacitación. Dependiendo de su complejidad, algunos productos comer-
ciales no contemplan costos extra por este concepto y otros -como Windows,
por ejemplo- son tan populares que se puede encontrar numerosas opciones
de instalación -a través de empresas o profesionales- donde escoger en el mer-
cado. A veces en el Software libre la con…guración puede implicar recompilar
el producto con algunas opciones particulares, algo que sólo pueden realizar
técnicos con un nivel adecuado de conocimientos y que puede que no sean
tan fáciles de encontrar. Aquí por lo general la ventaja va hacia el Software
comercial.
Una vez instalado el Software, toca realizar actualizaciones de manten-
imiento. Si bien es cierto lo que algunos de los fanáticos del Software libre
dicen, de que nadie lo obliga a mejorar el Software con que cuenta, la realidad
-especialmente en lo que a seguridad se re…ere- obliga a las empresas a man-
tener su Software actualizado. Aún así, los costos de actualizar Software libre
suelen ser signi…cativamente más bajos que los de productos comerciales, y
suelen ser menos exigentes con el Hardware necesario para ejecutarlos. La
mayoría de las veces la ventaja aquí es para el Software libre, pero hay que
evaluar ya que varía dependiendo de cada caso.
Por último hay algunas casas que desarrollan productos de Software libre
-dan el código y permiten que cualquiera lo modi…que o re utilice- pero …jan
contratos con cargos mensuales o anuales para mantenimiento del mismo,
algo que se parece mucho a un cobro por licencia, por lo que hay que estar
seguro de conocer todas las condiciones cuando una empresa nos ofrece una
solución propia y la cali…ca como Software libre.
Además de estas consideraciones hay una que debe sumarse eventual-
mente a esta evaluación: el costo de migrar a otra solución. En Software
libre suelen usarse estándares abiertos para almacenar los datos, lo que fa-
cilita las migraciones. En cambio muchas soluciones propietarias suelen tener
formatos propietarios que pueden dejar "amarrados" los datos de la empresa
a una aplicación especí…ca.
Sólo después de evaluar estos aspectos del Software, que pueden tener
implicaciones importantes en el presupuesto, es que un CIO puede decir si
una solución de Software libre le conviene más a una empresa o no, algo que
va más allá de que la aplicación sea gratis o no.
En resumen, todas estas voces se quejan de dos cosas: los grandes be-
ne…cios que obtienen los proveedores de servicios en la nube con su Software
sin retribuirles en consecuencia, y la falta de colaboración manteniendo los
productos con los que lucran. Sin embargo, no nos engañemos, el quid de
la cuestión está principalmente en el dinero: la opinión generalizada de la
comunidad es que el Software de código abierto nunca fue pensado para que
las empresas de servicios en la nube lo tomasen y lo vendieran.
Por otro lado, si es posible bifurcar un proyecto libre que se cierra, ¿no
hubiese sido mejor colaborar con él antes y haber evitado el cierre? Si no se
invierte y se mantiene con salud aquello que da bene…cios, puede terminar
por desaparecer. A medio camino entre el depredador y el parásito: así
es como ven muchas desarrolladoras de código abierto a los proveedores de
servicios en en la nube.
Vale la pena retomar ahora la frase esa de que «el Software de código
abierto nunca fue pensado para que las empresas de servicios en la nube lo
tomasen y lo vendieran». ¿Para qué fue pensado el código abierto, entonces?
No hay ninguna licencia de código abierto o Software libre reconocida por
la Free Software Foundation o la Open Source Initiative que prohíba hacer
negocio con el Software. Lo que prohíben es la discriminación en la capacidad
y alcance de su uso en función de la parte, se trate de un individuo o de la
mayor multinacional imaginable.
¿Cuál es la solución a un embrollo de tamaña envergadura? Lo único
claro es que no es una cuestión de blancos y negros y las consideraciones
son demasiadas como para seguir ahondando: empresas que cotizan en bolsa
quieren más dinero de otras compañías -que también cotizan en bolsa y por
mucho más-, que además del Software ponen la infraestructura sobre la que
distribuyen sus ofertas y que tienen la capacidad de clonar tu producto en un
abrir y cerrar de ojos, no solo porque tienen el capital, sino porque tienen la
experiencia necesaria tras contribuir técnica, pero también en muchos casos,
económicamente, durante largo tiempo.
Pese a ello, esta situación está alterando el paradigma actual, en el que
el modelo de desarrollo del código abierto se ha impuesto como impulsor
de la innovación en el sector empresarial, y ya hay quien habla de que nos
acercamos al …n, o al principio del …n de la Era del Open Source, cuya
preponderancia estaría sentenciada por la revolución de la nube, a la postre
el mayor estímulo que haya tenido el código abierto hasta la fecha.
El futuro, pues, pasaría por el Shared Source Software, bajo el cual
diferentes compañías con intereses alineados colaborarán en el desarrollo de
proyectos concretos, pero limitando su explotación comercial a sí mismas.
Todavía no estamos ahí, no obstante, y no parece tampoco que el relevo se
vaya a dar en breve. De suceder, será muy llamativo: la muerte del código
abierto por un éxito mal entendido.
pañías más activas). Aunque más del 50% de los contribuyentes pertenecen
a la industria tecnológica (el 8% del total de sus empleados participaron
en estos desarrollos), también hubo participación signi…cativa de empresas
de consultoría, cientí…cas, técnicas y, en menor medida, de distribuidores,
minoristas y empresas del ámbito …nanciero.
¿Puede una …losofía de desarrollo como el código abierto, disponible para
todo el mundo, llegar a convertirse en una fuente de ventajas diferenciales
para el resto de los países, que se ha visto tradicionalmente muy superado en
su relevancia en el entorno tecnológico por los gigantes tecnológicos de Esta-
dos Unidos o de China? El informe a…rma que su uso puede llegar a incidir
en gran medida en el desarrollo de una independencia tecnológica superior,
de una mayor competitividad y de más innovación. Veremos si llegamos a ver
en el resto del mundo políticas que incentiven el uso del código abierto como
una variable estratégica clave para ello. La idea, capitalizar la tecnología de
una forma más orientada al procomún y al desarrollo colaborativo, suena sin
duda atractiva e interesante.
6 Bibliografía
Este texto es una recopilación de múltiples fuentes, nuestra aportación -si es
que podemos llamarla así- es plasmarlo en este documento, en el que tratamos
de dar coherencia a nuestra visión de los temas desarrollados.
Herramientas
Referencias
[1] https://www.gnu.org/philosophy/free-sw.es.html 119
[12] https://es.wikipedia.org/wiki/SQL 5
[13] https://es.wikipedia.org/wiki/NoSQL
Atentamente