SQLite: sistema de gestión de bases de datos relacional embebida.

Las empresas hoy en día se han visto la necesidad de tener información al instante de lo que requieren sus clientes y responder así ante la competencia. Esto a llevado a utilizar los dispositivos móviles como herramientas de gestión de información.

Esta necesidad ha provocado que el almacenamiento de los datos en los dispositivos móviles haya mejorado, creando diversas opciones de manejadores de base de datos. Gracias a esto contamos con las base de datos embebidas o empotradas y entre estas se encuentra SQLite.

¿Que es SQLite?

SQLite es una biblioteca en Lenguaje C compacta inferior a los 600KB, que implementa un motor de base de datos transaccional de SQL incorporado. No requiere de servidor, ni configuración, lee y escribe directamente de un archivos de disco ordinarios(¿Quieres Saber mas?).

SQLite Esta bajo una licencia de dominio publico, por lo tanto es de uso gratuito, libre para cualquier uso, ya sea comercial o privado. Actualmente es implementada en muchas aplicaciones y dispositivos, entre los cuales se encuentran (¿Quieres saber mas?):

  • Android
  • iPhone y iOS
  • Mac
  • Firefox
  • Chrome

Limitaciones

No se deje engañar por el “Lite” en el nombre. SQLite fue diseñado originalmente con una política de evitar límites arbitrarios. Debido a que los límites superiores no estaban bien definidos, no se probaron, y los errores (incluidas las posibles vulnerabilidades de seguridad) a menudo se encontraban al llevar a SQLite a extremos. Por esta razón, las versiones nuevas de SQLite tienen límites bien definidos :

  • Los bytes máximo en una cadena de BLOB 1,000,000,000 bytes .
  • Números de columnas máximo 2,000 columnas.
  • Los bytes máximo en una sentencia SQL 1,000,000 bytes .
  • Numero máximo de relaciones 64 relaciones.
  • Numero máximo de argumentos por función 100 argumentos.
  • Numero maximo de instrucciones SELECT compuesta 500 instrucciones.
  • Longitud máxima de un patrón LIKE o GLOB 50,000 bytes.
  • Número máximo de parámetros de host en instrucción SQL 999 instrucciones.
  • La profundidad máxima de Trigger Recursivos 1,000
  • Numero máximo de base de datos asociadas 10 Base de datos.
  • Paginas en un archivo de base de datos 1,073,741,823 Paginas.
  • Numero máximo de filas en una tabla 18446744073709551616 filas.
  • Numero máximo de tamaño de archivo BD 128 terabytes.
  • Numero máximo de tablas en una base de datos 1,073,741,823 Tablas.

Algunos limites puede varias si al momento de compilar cambian los valores de las macros, no recomendado por fallas de seguridad (¿Quieres saber mas?)

Tipos de datos

SQLite utiliza un sistema de tipado dinámico mas general. El tipo de datos esta asociado con un valor en si y no con su contenedor. Este tipado dinámico es compatible con el tipo estático de otros motores de base de datos, de modo que los tipos estáticos en SQL que funcionan en otra motores de base de datos deberían funcionar de la misma manera en SQLite.

Cada uno de los datos almacenados en una base de datos SQLite implementa alguno de los siguientes tipos:

  • NULL, un valor nulo.
  • INTEGER, un entero con signo que se almacena en 1, 2, 3, 4, 5, 6 o 8 bytes de acuerdo a la magnitud del valor.
  • REAL, un número de coma flotante (real), almacenado en 8 bytes.
  • TEXT, una cadena de texto almacenada con las codificaciones UTF-8, UTF-16BE o UTF-16-LE.
  • BLOB, datos en formato binario, se almacenan exactamente como se introdujeron.Fecha y hora Tipo de datos

SQLite no tiene una clase de almacenamiento reservada para almacenar fechas y / o horas. En su lugar, las funciones de fecha y hora incorporadas de SQLite son capaces de almacenar fechas y horas como valores TEXT, REAL o INTEGER:

Afinidad de tipo de datos.

La clase de almacenamiento preferida para una columna se llama su “afinidad”. La afinidad de tipo de una columna es el tipo recomendado para los datos almacenados en esa columna.

Considera esto:

CREAR TABLA t1 (a INT, b VARCHAR (10));
INSERT INTO t1 (a, b) VALORES ('123', 456);

La base de datos de tipo rígido convertirá la cadena ‘123’ en un entero 123 y el entero 456 en una cadena ‘456’ antes de realizar la inserción.

Para que el ejemplo anterior funcione en SQLite como lo hace en otros motores de base de datos SQL, SQLite admite el concepto de afinidad de tipo de datos en las columnas.

SQLite asigna a cada columna de la base de datos las siguientes afinidades de tipo de datos.

  • TEXT
  • NUMERIC
  • INTEGER
  • REAL
  • BLOB

Reglas para la implementación de la afinidad de columna

La afinidad de una columna está determinada por el tipo declarado de la columna, de acuerdo con las siguientes reglas en el orden mostrado:

Si el tipo declarado contiene la cadena “INT”, se le asigna afinidad INTEGER.

Si el tipo declarado de la columna contiene alguna de las cadenas “CHAR”, “CLOB” o “TEXT”, entonces esa columna tiene afinidad de TEXT. Observe que el tipo VARCHAR contiene la cadena “CHAR” y, por lo tanto, se le asigna afinidad de TEXTO.

Si el tipo declarado para una columna contiene la cadena “BLOB” o si no se especifica ningún tipo, entonces la columna tiene afinidad BLOB.

Si el tipo declarado para una columna contiene alguna de las cadenas “REAL”, “FLOA” o “DOUB”, entonces la columna tiene una afinidad REAL.

Si ninguna de las reglas anteriores cumple entonces se aplica la afinidad NUMERIC.

Tenga en cuenta que el orden de las reglas para determinar la afinidad de columnas es importante. Una columna cuyo tipo declarado es “CHARINT” coincidirá con las reglas 1 y 2, pero la primera regla tiene prioridad y, por lo tanto, la afinidad de la columna será INTEGER.

Esta tabla muestra solo un pequeño subconjunto de los nombres de tipos de datos que aceptará SQLite. Tenga en cuenta que SQLite ignora los argumentos numéricos entre paréntesis que siguen el nombre de tipo (por ejemplo, “VARCHAR (255)”) (¿Quieres saber mas?)

Ventajas

Es fácil de usar como un software integrado con dispositivos como televisores, teléfonos móviles, cámaras, dispositivos electrónicos domésticos, etc.

Actualiza su contenido de manera continua, por lo que se pierde poco o ningún trabajo en caso de falla de energía o falla.

Las consultas de SQLite son más pequeñas que los códigos de procedimiento equivalentes, por lo que las posibilidades de errores son mínimas.

También conserva la compatibilidad hacia atrás.

Desventajas.

SQLite no se utiliza para manejar solicitudes HTTP de tráfico alto.

El tamaño de la base de datos está restringido a 140 TB en la mayoría de los casos.

Otros sabores.

Existen otras bases de datos embebidas que podrás probar entre las cuales tenemos:

Primeros pasos con SQLite.

Instalación interfaz.

En casi todas distribuciones Linux traen la posibilidad de instalar la interfaz de SQLite con el gestor de paquete de cada distribución. Podremos instalar fácilmente SQLite en otros sistemas operativo, descargando desde la pagina oficial de SQLite, donde encontraremos, el código fuente, como también los binarios necesario para la instalación en nuestro sistema operativo.

En el caso de Debian y las distribuciones basadas en Debian podemos instalar con la siguientes sentencias.

 sudo apt update # Actualiza la base de datos de los paquetes
 sudo apt upgrade # Actualiza los paquetes.
 sudo apt install sqlite3 # instala sqlite3.

Para el sistema operativo window descargamos de la pagina oficial el archivo zip sqlite-tools-win32-x86-3290000.zip. Extraemos el contenido de sqlite-tools-win32-x86-3290000.zip con la herramientas para descomprimir de su preferencia.

En mi caso estoy utilizando 7-zip para window.

Copiamos el archivo sqlite-tools-win32-x86-3290000.zip al escritorio

Descomprimimos el archivo sqlite-tools-win32-x86-3290000.zip que se encuentra en el escritorio con la herramienta 7-zip.

Creamos una carpeta en la unidad C: con el nombre sqlite3 y copiamos lo archivos del archivo que descomprimimos.

Agregamos el directorio C:\sqlite3 al path del sistema.

  1. Buscar, busque y seleccione: Variables del sistema
  2. Busque la variable de entorno PATH y selecciónela. Haga clic en Editar. Si no existe la variable de entorno PATH, haga clic en Nuevo.
  3. En la ventana Editar la variable del sistema (o Nueva variable del sistema), debe especificar el valor de la variable de entorno PATH. Haga clic en Aceptar. Cierre todas las demás ventanas haciendo clic en Aceptar.

Corriendo interfaz de SQLite en window.

Una vez que tenemos instalado y agregado la dirección en donde se encuentra el ejecutable de sqlite, en la variable del PATH. Procedemos a ejecutar sqlite desde el lanzador de window digitando sqlite3 y damos enter.

Hola SQLite, como verán nos aparece la interfaces de comando de SQLite.

Desde la interfaces podemos, crear, modificar y eliminar, tablas, índices, vistas y disparadores. SQLite implementa la mayorías de sentencias del estándar de SQL 92 y aunque omite algunas característica propias del lenguaje SQL, agrega otras propias de SQLite. En el siguiente enlace podrán encontrar como implementa SQLite las sentencias del estándar SQL 92.

Además de la sentencias SQL, en la interfaz de SQLite podemos ejecutar comandos propios del interfaze, que nos proporciona ayuda para configurar la interfaz, como también sentencias que nos muestra el contenido de la base de datos.

Para visualizar las sentencias de la interfaz escriba .help, el punto ante de la palabra help no es por error, cada sentencias de la interfaz de SQLite debe iniciar con un punto.Para salir de la interfaz debe escribir desde el indicador de comando de SQLite, .exit o .quit.

Todas las sentencias SQL que queramos ejecutar desde la interfaz de SQLite debemos finalizarla con punto y como(;).

Puesta en marcha.

Para crear una base de datos con la interfaz de SQLite, debe seguir la siguiente sintaxis.

sqlite3 [dirección donde se almacenara base de datos] \ basedatos.db

Crearemos la base de datos holamundo.db en el directorio que nos encontramos actualmente, digitado en la interfaz la siguiente sentencia.

    sqlite3 holamundo.db

Si la base de datos ya estuviera creada, la interfaz no lo sobrescribe, si no que abre la base de datos.

Crear tablas

Crearemos una tabla llamada coins con los campos Id de tipo ENTEGER , Coin de tipo TEXT y Exchange de tipo real siguiendo la sentencia.

CREATE TABLE IF NOT EXISTS COINS (Id INTERGER PRIMARY KEY,Coin TEXT, Exchange REAL);

Para comprobar la afinidad de tipo de datos crearemos otra tabla con el nombre de COINSAFINIDAD y tendrá los campos Id de tipo TINYINT, Coin de tipo VARCHAR( 25) Y Exchange de tipo FLOAT (7.4), como podrá ver, cambiamos los tipos de datos, aunque SQLite los tipos de datos son NULL,TEXT,INTERGER,REAL Y BLOB, por medio de la afinidad crea la tabla.

CREATE TABLE IF NOT EXISTS COINSAFINIDAD (Id TINYINT PRIMARY KEY,Coin VARCHAR( 25), Exchange FLOAT (7.4));

Ingresar registros

Ingresaremos en cada tabla dos registros, en el primer registro asignaremos al Id =1, Coin =Córdoba oro y a Exchange =1.0. Al segundo registro asignaremos al Id =2, Coin =Dollar US y a Exchange =33.05.

INSERT INTO COINS VALUES (1,”Córdoba oro”,1.0),(2,”Dollar US ”,33.05);
INSERT INTO COINSAFINIDAD VALUES (1,”Córdoba oro”,1.0),(2,”Dollar US ”,33.05);

Visualizar el contenido de las tablas

Para visualizar el contenido de las tablas, utilizaremos las siguientes sentencias

SELECT * FROM  COINS;
SELECT * FROM  COINSAFINIDAD;

Hasta aquí hemos podido ver, la interfaz de SQLite es una herramienta poderosa para el manejo de las base de datos de SQLite (¿Quieres saber mas?).

Ademas de la interfaz de comando de SQLite, contamos con GUI entre las cuales contamos con:

Anuncios

Hola Python

ya es hora de iniciar con otro lenguaje de programación y me decido por python3. python es un lenguaje de programación de alto nivel, interpretado, multiparadigma, de tipado dinámico y multiplataforma. quieres saber mas?

La agrupación de código se efectúa por medio de  indentación.

if x < 0:
    x = 0
    print('Número negativo, actualizandolo a cero')
elif x == 0:
    print('Cero')
for i in range(10):
    print(i)
def al_cuadrado(x):
    return x**2

Variables

Las variables como todo en python son un objeto, cada variable cuenta con un identificador, en el cual el identificador debe cumplir :
No debe tener haber espacio entre el identificador (ej. correcto str_nombre_apellido, incorrecto nombre apellido)
No es recomendable utilizar símbolos o caracteres especiales en el identificador (ej.: correcto nombre_y_apellido incorrecto nombre_&_apellido)
No debe utilizar palabras reservadas para identificador de variable (ej.: correcto _list, incorrecto list)

Todos los identificadores son case-sensitive o sea que distingue entre minúscula y mayúscula

Hola Python

 print("Hola mundo")

Configuración pom.xml para compilar en netbeans

Necesite aprender un poco de Maven ,ya que el IDE que estaba utilizando estaba dando fallas y desconocia si las fallas se iban a corregir tenia que emigrar y pensar que eso me podia pasar con otro ide.
Por ejemplo Netbeans y Eclipse, cada uno tiene su gestión y construcción de proyectos. Esto me impide poder tomar un proyecto que comence con netbeans y terminarlo en eclipse, por lo menos no de una manera que me fuera facil. Maven era la solucion mas idonia para ero por lo que me llevo aprender un poco sobre esta herramienta.

Aqui un link para ver los primeros pasos con maven.

De momento dejo un codigo que necesite en mi archivo POM para poder compilar en netbeans


<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory> ${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass> ni.gacssoftware.gcontodont.Gcontodont</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>

 

Libreria requerida para ejecutar reportes compilados de JasperReport

Con la nueva versión de JasperReport studio me vi obligado a buscar las librerías que requiere para la ejecución de los reportes copilados (reporte.japer),  desde la wiki de JasperReport encontré una información que me sirvió de referencia aunque después tuve que encontrar a prueba y error las que realmente necesite para la ejecución de los reportes, a continuación listo la librerías necesarias:

Asta aquí tenemos  las librerías necesarias para poder ejecutar el reporte y visualizar en pantalla o impresora,  si queremos que el reporte envié la salida de visualización a un archivo se debe agregar las siguientes librerías:

 

Con esto ya podemos visualizar los reportes de JasperReport en aplicaciones java. si tienen algún comentario no duden en compartirlo.

OpenScad hola mundo

OpenSCAD es una aplicación opensource para crear objetos sólidos CAD. es compilador 3D basado en un lenguaje de descripción textual. Un documento de OpenSCAD especifica primitivas geométricas y define como son modificadas y manipuladas para reproducir un modelo 3D. OpenSCAD esta disponible tanto para GNU/Linux, MS Windows y Apple OS X.

Cuando ejecuta openscad la primer pantalla que mostrara si no se activa el checkbox “no mostrar de nuevo”

pantallaopenscad1

La ventana de trabajo o ventana principal, al lado izquierdo cuenta con editor de texto donde ingresa las sentencias para las gráficos solidos, al lado superior derecho muestra las figuras solidas, al lado inferior derecho muestra los resultados de las compilación de las sentencias que se digitaron en el editor de texto de el lado izquierdo.

openscadmain

Openscad funciona como un lenguaje de programación interpretado, donde podrá utilizar variables, funciones, palabras claves, modulación, etc. las sentencias principales se encuentran en la pagina CheatSheet. La finalización de sentencia debe estar especificado por un punto y como (;).  ejemplo

creare un cubo hola mundo siguiendo las sintaxis de la sentencia cube

holamundocube

x=15;
y=15;
z=15;
cube([x,y,z]);

como se puede ver estoy utilizando variables y cada finalización de sentencias se finaliza con punto y como(;), para visualizar en imagen lo digitado en el editor de texto debe presionar la tecla de función F5.  También podría poner contantes en cube lo que digitalizaría en ves de las variables serian numero por ejemplo:

 cube([15,15,15]);

hay varia variantes para cada sentencia en openscad y se puede ver en la pagina CheatSheet.

Asta aquí el hola mundo de openscad próximamente iré haciendo nuevas entradas de las bondades que ofrece openscad

 

Selecionar fila de un Jtable con el boton derecho del mouse a la ves que se llama al menu contextual en java

Tenia una aplicación donde seleccionaba las filas con el botón izquierdo y llamaba al menú contextual con el botón derecho, pero me dije eso no es muy amigable para el usuario, entonces procedí a buscar información y me encontré que en java también se puede seleccionar con el boton derecho al mismo tiempo que se llama al menu contextual.

public class PnlTabla extends javax.swing.JPanel{
private JTable tblConsulta
private PopConsulta popConsulta 
public PnlTabla(){
 initpnlTabla()
}
private void initpnlTabla(){
    tblConsulta = new JTable(); 
    popConsulta = new PopConsulta();
    tblConsulta.addMouseListener(new LtrPputable());
    add(tblConsulta);
}

 class LtrPputable extends  MouseAdapter {
       @Override
       public void mousePressed(java.awt.event.MouseEvent evt) {
         showPopMenu(evt);
        }
        @Override
        public void mouseReleased(java.awt.event.MouseEvent evt) {
          showPopMenu(evt);
        }
        private void showPopMenu(java.awt.event.MouseEvent evt){
        if(evt.isPopupTrigger()){
           int punto = tblConsulta.rowAtPoint(evtMouse.getPoint());
        if (punto >= 0 && punto < tblConsulta.getRowCount())
            {tblConsulta.setRowSelectionInterval(punto, punto);}
            popConsulta.show(tblConsulta, evt.getX(),evt.getY());
       }
 }
 
   class PopConsulta extends JPopupMenu{
        private    JMenuItem             itm1,itm2,itm3;

        public PopupConsulta(){
            initPopu();
        } 

       private void initPopu(){
        itm1          =new JMenuItem("Primero");
        itm2         =new JMenuItem("Segundo");
        itm3          =new JMenuItem("Tercero");
 add(itm1);
 add(itm2);
 add(itm3);
 }
 }            
}

 

Este es el código general depende de ustedes hacerlo mas fino y mas llamativo, como veran es un JPanel el cual podran agregar a un contenedor como un Jframe…..

 

Tablas de colores , Hexadecimal y codigo RGB

Muchas veces necesitamos saber el código de un color y tenemos que recurrir a prueba y error aquí les dejo un tabla de colores que mea servido mucho.

Nombre
del color

Color
Hexadecimal

Color RGB

Color

IndianRed #CD5C5C 205,92,92
LightCoral #F08080 240,128,128
Salmon #FA8072 250,128,114
DarkSalmon #E9967A 233,150,122
LightSalmon #FFA07A 255,160,122
Crimson #DC143C 220,20,60
Red #FF0000 255,0,0
FireBrick #B22222 178,34,34
DarkRed #8B0000 139,0,0
Pink #FFC0CB 255,192,203
LightPink #FFB6C1 255,182,193
HotPink #FF69B4 255,105,180
DeepPink #FF1493 255,20,147
MediumVioletRed #C71585 199,21,133
PaleVioletRed #DB7093 219,112,147
LightSalmon #FFA07A 255,160,122
Coral #FF7F50 255,127,80
Tomato #FF6347 255,99,71
OrangeRed #FF4500 255,69,0
DarkOrange #FF8C00 255,140,0
Orange #FFA500 255,165,0
Gold #FFD700 255,215,0
Yellow #FFFF00 255,255,0
LightYellow #FFFFE0 255,255,224
LemonChiffon #FFFACD 255,250,205
LightGoldenrodYellow #FAFAD2 250,250,210
PapayaWhip #FFEFD5 255,239,213
Moccasin #FFE4B5 255,228,181
PeachPuff #FFDAB9 255,218,185
PaleGoldenrod #EEE8AA 238,232,170
Khaki #F0E68C 240,230,140
DarkKhaki #BDB76B 189,183,107
Lavender #E6E6FA 230,230,250
Thistle #D8BFD8 216,191,216
Plum #DDA0DD 221,160,221
Violet #EE82EE 238,130,238
Orchid #DA70D6 218,112,214
Fuchsia #FF00FF 255,0,255
Magenta #FF00FF 255,0,255
MediumOrchid #BA55D3 186,85,211
MediumPurple #9370DB 147,112,219
BlueViolet #8A2BE2 138,43,226
DarkViolet #9400D3 148,0,211
DarkOrchid #9932CC 153,50,204
DarkMagenta #8B008B 139,0,139
Purple #800080 128,0,128
Indigo #4B0082 75,0,130
SlateBlue #6A5ACD 106,90,205
DarkSlateBlue #483D8B 72,61,139
GreenYellow #ADFF2F 173,255,47
Chartreuse #7FFF00 127,255,0
LawnGreen #7CFC00 124,252,0
Lime #00FF00 0,255,0
LimeGreen #32CD32 50,205,50
PaleGreen #98FB98 152,251,152
LightGreen #90EE90 144,238,144
MediumSpringGreen #00FA9A 0,250,154
SpringGreen #00FF7F 0,255,127
MediumSeaGreen #3CB371 60,179,113
SeaGreen #2E8B57 46,139,87
ForestGreen #228B22 34,139,34
Green #008000 0,128,0
DarkGreen #006400 0,100,00
YellowGreen #9ACD32 154,205,50
OliveDrab #6B8E23 107,142,35
Olive #808000 128,128,0
DarkOliveGreen #556B2F
MediumAquamarine #66CDAA 102,205,170
DarkSeaGreen #8FBC8F 143,188,143
LightSeaGreen #20B2AA 32,178,170
DarkCyan #008B8B 0,139,139
Teal #008080 0,128,128
Aqua #00FFFF 0,255,255
Cyan #00FFFF 0,255,255
LightCyan #E0FFFF 224,255,255
PaleTurquoise #AFEEEE 175,238,238
Aquamarine #7FFFD4 127,255,212
Turquoise #40E0D0 64,224,208
MediumTurquoise #48D1CC 72,209,204
DarkTurquoise #00CED1 0,206,209
CadetBlue #5F9EA0 95,158,160
SteelBlue #4682B4 70,130,180
LightSteelBlue #B0C4DE 176,196,222
PowderBlue #B0E0E6 176,224,230
LightBlue #ADD8E6 173,216,230
SkyBlue #87CEEB 135,206,235
LightSkyBlue #87CEFA 135,206,250
DeepSkyBlue #00BFFF 0,191,255
DodgerBlue #1E90FF 30,144,255
CornflowerBlue #6495ED 100,149,237
MediumSlateBlue #7B68EE 123,104,238
RoyalBlue #4169E1 65,105,225
Blue #0000FF 0,0,255
MediumBlue #0000CD 0,0,205
DarkBlue #00008B 0,0,139
Navy #000080 0,0,128
MidnightBlue #191970 25,25,112
Cornsilk #FFF8DC 255,248,220
BlanchedAlmond #FFEBCD 255,235,205
Bisque #FFE4C4 255,228,196
NavajoWhite #FFDEAD 255,222,173
Wheat #F5DEB3 245,222,179
BurlyWood #DEB887 222,184,135
Tan #D2B48C 210,180,140
RosyBrown #BC8F8F 188,143,143
SandyBrown #F4A460 244,164,96
Goldenrod #DAA520 218,165,32
DarkGoldenrod #B8860B 184,134,11
Peru #CD853F 205,133,63
Chocolate #D2691E 210,105,30
SaddleBrown #8B4513 139,69,19
Sienna #A0522D 160,82,45
Brown #A52A2A 165,42,42
Maroon #800000 128,0,0
White #FFFFFF 255,255,255
Snow #FFFAFA 255,250,250
Honeydew #F0FFF0 240,255,240
MintCream #F5FFFA 245,255,250
Azure #F0FFFF 240,255,255
AliceBlue #F0F8FF 240,248,255
GhostWhite #F8F8FF 248,248,255
WhiteSmoke #F5F5F5 245,245,245
Seashell #FFF5EE 255,245,238
Beige #F5F5DC 245,245,220
OldLace #FDF5E6 253,245,230
FloralWhite #FFFAF0 255,250,240
Ivory #FFFFF0 255,255,240
AntiqueWhite #FAEBD7 250,235,215
Linen #FAF0E6 250,240,230
LavenderBlush #FFF0F5 255,240,245
MistyRose #FFE4E1 255,228,225
Gainsboro #DCDCDC 220,220,220
LightGrey #D3D3D3 211,211,211
Silver #C0C0C0 192,192,192
DarkGray #A9A9A9 169,169,169
Gray #808080 128,128,128
DimGray #696969 105,105,105
LightSlateGray #778899 119,136,153
SlateGray #708090 112,128,144
DarkSlateGray #2F4F4F 47,79,79
Black #000000 0,0,0