viernes, julio 29, 2016

C++ metodos y colores


Continuando con C++ en linux quise crear metodos tal y como los hago en C# y no es muy diferente pero en C++ debes crear el metodo primero y despues invocarlo, de otra forma lo que se tiene que hacer es un prototipo del metodo y lo llamo metodo solo porque es el nombre con el que estoy acostumbrado, en otras partes les llamaran funciones la unica diferencia es que el metodo es declarado como parte de una clase y una funcion es independiente de la clase.

Creamos el archivo

nano Colores.cpp

Codigo:


#include <iostream>

using namespace std;

//Mensajes
void Mensaje(string Mensaje, string Color = "Rojo")
{
    if(Color.compare("Negro")==0)
        Color = "30m";
    if(Color.compare("Rojo")==0)
        Color = "31m";
    if(Color.compare("Verde")==0)
        Color = "32m";
    if(Color.compare("Amarillo")==0)
        Color = "33m";
    if(Color.compare("Azul")==0)
        Color = "34m";
    if(Color.compare("Magenta")==0)
        Color = "35m";
    if(Color.compare("Cyan")==0)
        Color = "36m";
    if(Color.compare("Blanco")==0)
        Color = "37m";

    cout << "\033[0;"+Color << Mensaje << " \033[0m\n";
}
//Mensajes

int main(int argc, char *argv[])
{
    // \033 es ESC para empezar ESC[0;31m Significa 0 texto normal (1 es bold)
    // y 31m significa rojo y \033[0m para terminar y resetear
    // cout << "\033[0;30m Negro text \033[0m\n";
    // cout << "\033[0;31m Rojo text \033[0m\n";
    // cout << "\033[0;32m Verde text \033[0m\n";
    // cout << "\033[0;33m Amarillo text \033[0m\n";
    // cout << "\033[0;34m Azul text \033[0m\n";
    // cout << "\033[0;35m Magenta text \033[0m\n";
    // cout << "\033[0;36m Cyan text \033[0m\n";
    // Este ultimo pone el color blanco pero con un background azul
    // cout << "\033[0;37;44m Blanco text \033[0m\n";

    Mensaje("Mensaje color rojo","Rojo");
    Mensaje("Mensaje color verde","Verde");
}


Aqui vemos varias cosas, tenemos un metodo (funcion) que se llama Mensaje el cual recibe dos parametros, el Mensaje y el color del mensaje y manda a consola el mensaje en el color que se le halla enviado.

Los comentarios empiezan con "//" y todo lo que este delante de ellos sera ignorado por el compilador.

Y el metodo (funcion) esta declarado antes de mi metodo (funcion) main para que no me arroje errores al quererlo compilar por llamar un metodo que no ha sido declarado al momento de llamarlo.

Compilamos con el siguiente comando

g++ Colores.cpp -o Colores
Y ejecutamos desde consola con el siguiente comando

./Colores

C++ Hola mundo en linux


Hace poco empeze a realizar pequeños programas en C++ dentro de linux y estos son los pasos que tuve que seguir para configurar mi ambiente en linux, actualmente estoy utilizando Cub que es una combinacion de Chrome OS y Ubuntu 14.04.

Primero actualizamos nuestro sistema e instalamos el paquete que contendra nuestro compilador g++


sudo apt-get update
sudo apt-get install build-essential

Nuestro primer programa
nano hola.cpp
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
   cout << "Hola mundo";
}
Para compilarlo usamos el siguiente comando
g++ hola.cpp -o hola

Para ejecutarlo desde consola es con el siguiente comando
./hola



miércoles, julio 02, 2014

MySQL Triggers


A partir de la version 5 de MySQL ya es posible realizar triggers que son funciones especificas que se pueden ejecutar antes (BEFORE) o despues (AFTER) de una transaccion que puede ser DELETE, INSERT, UPDATE.
Los triggers utilizan OLD y NEW que son los valores que tienen las columnas antes y después de la modificación.
Con triggers o disparadores se pueden realizar acciones como replicacion de datos de una Base de Datos a otra o para llevar un Log de Transacciones insertando en una tabla auxiliar de logs.

Ejemplo

Crear una tabla a la cual le pondremos un trigger
CREATE TABLE clientes
(
    iCliente INT NOT NULL AUTO_INCREMENT,
    Cliente VARCHAR(450) DEFAULT '',
    PRIMARY KEY(iCliente)
)ENGINE = InnoDB;
Crear una tabla de logs donde insertaremos los clientes modificados
CREATE TABLE clientes_log
(
    iCliente_Log INT NOT NULL AUTO_INCREMENT,
    Cliente VARCHAR(450) DEFAULT '',
    Fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY(iCliente_Log)
)ENGINE = InnoDB;
Creamos un Trigger que se dispare en cada UPDATE de la tabla clientes
CREATE TRIGGER trigger_clientes_log AFTER UPDATE ON clientes
FOR EACH ROW
INSERT INTO clientes_log(Cliente)VALUES(OLD.Cliente);
Con esto completamos un log automatico para cambios en la tabla de clientes.

viernes, junio 27, 2014

MySQL - Backups Incrementales


Realizar backups incrementales en MySQL se pueden realizar utilizando los "binary logs", son los archivos donde se encuentran almacenadas todas las transacciones de la base de datos.
Activar los binary logs en MySQL
Editar archivo my.cnf nano /etc/mysql/my.cnf
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
La primera linea indica la ruta donde se guardaran los logs, y la segunda linea dice que se borraran los archivos log despues de 10 dias.
El directorio de logs se ve como sigue:
ls -al /var/log/mysql/
total 16
drwxr-s--- 2 mysql adm  4096 Sep  5 10:41 .
drwxr-xr-x 7 root  root 4096 Sep  5 09:52 ..
-rw-rw---- 1 mysql adm   106 Sep  5 10:41 mysql-bin.000001
-rw-rw---- 1 mysql adm    32 Sep  5 10:41 mysql-bin.index
El archivo mysql-bin.000001 es el log activo donde actualmente se estaran guardando todas las transacciones, y el archivo mysql-bin.index es donde estan todos los archivos bin logs.
Creacion de Base de Datos para prueba
Vamos a crear una base de datos de prueba para realizar los backups incrementales.
CREATE DATABASE `backup`;
USE backup;
CREATE TABLE `clientes`(
    `iCliente` INT NOT NULL AUTO_INCREMENT,
    `Cliente` VARCHAR(45) NOT NULL DEFAULT '',
    PRIMARY KEY(`iCliente`)
) ENGINE InnoDB;
Ahora insertamos unos registros
USE backup;
INSERT INTO clientes(Cliente)VALUES('Luis Gomez');
Hacemos el primer backup completo con mysqldump
mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 backup > full_backup.sql
--single-transaction hara un dump de las tablas innoDB en un estado consistente,--flush-logs cerrara los logs actuales y abrira uno nuevo, --master-data=2 escribira comentarios en el archivo dump sobre las posiciones de los logs.
Si revisamos el directorio /var/log/mysql/ se abra creado un nuevo archivo mysql-bin.000002 y todos los cambios y transacciones se grabaran en ese archivo, y la siguiente vez que se ejecute un flush-logs o se reinicie el servidor de MySQL se creara el archivo mysql-bin.000003 y asi sucesivamente.
ls -al /var/log/mysql/
total 20
drwxr-s--- 2 mysql adm  4096 Sep  5 10:48 .
drwxr-xr-x 7 root  root 4096 Sep  5 09:52 ..
-rw-rw---- 1 mysql adm   149 Sep  5 10:48 mysql-bin.000001
-rw-rw---- 1 mysql adm   106 Sep  5 10:48 mysql-bin.000002
-rw-rw---- 1 mysql adm    64 Sep  5 10:48 mysql-bin.index
Ahora insertamos mas registros
USE backup;
INSERT INTO clientes(Cliente)VALUES('Jade Gomez');
INSERT INTO clientes(Cliente)VALUES('Victor Gomez');
Ya solo necesitamos hacer flush a los logs, con esto se creara un nuevo archivo mysql-bin.000003, es como un corte, a partir de este momento cualquier cambio se estara almacenando en mysql-bin.000003, pero los cambios anteriores al flush estaran en mysql-bin.000002.
Restarurar binary log
Primero vamos a borrar la base de datos y volverla a crear vacia.
DROP DATABASE backup;
CREATE DATABASE backup;
Ahora hacemos un restore con el primer dump que hicimos
mysql -uroot -p backup < full_backup.sql
La base de datos contiene solo los registros de cuando hicimos el respaldo, pero vamos a agregar lo que viene en el binary log.
mysqlbinlog mysql-bin.000002 | mysql -uroot -p backup
Con esto debemos tener actualizada la base de datos hasta el punto en que hicimos flush log y se comenzo a grabar en el nuevo mysql-bin.000003.

martes, abril 22, 2014

Vicidial Cluster

Vicidial Cluster

Conexiones remotas - MySQL

Validar que desde todos los servidores dentro del cluster se puedan comunicar de manera remota.
mysql -h172.16.0.4 -uroot -prootPasswd
El comando anterior debe cambiar acorde al servidor y las credenciales apropiadas.

Servicio NTP

Validar servicio de ntp este ejecutandose en el servidor correcto, generalmente en el de la Base de Datos.
ntpq -p

Edicion de archivo /etc/astguiclient.conf

Editar el archivo /etc/astguiclient.conf y validar la siguiente configuracion.
# Database connection information
VARDB_server => 172.16.0.3
VARDB_database => asterisk
VARDB_user => cron
VARDB_pass => 1234
VARDB_custom_user => custom
VARDB_custom_pass => custom1234
VARDB_port => 3306

# Alpha-Numeric list of the astGUIclient processes to be kept running
# (value should be listing of characters with no spaces: 123456)
#  X - NO KEEPALIVE PROCESSES (use only if you want none to be keepalive)
#  1 - AST_update
#  2 - AST_send_listen
#  3 - AST_VDauto_dial
#  4 - AST_VDremote_agents
#  5 - AST_VDadapt (If multi-server system, this must only be on one server)
#  6 - FastAGI_log
#  7 - AST_VDauto_dial_FILL (only for multi-server, this must only be on one server)
#  8 - ip_relay (used for blind agent monitoring)
#  9 - Timeclock auto logout
VARactive_keepalives => 123468
En la primera parte
# Database connection information
Va informacion de la conexion a la base de datos, la IP del servidor y las credenciales que usara.
En la segunda parte
# Alpha-Numeric list of the astGUIclient processes to be kept running
Son las opciones que tienen que estar ejecutandose, y en comentarios muestra cuales opciones son exclusivas solamente para un solo servidor, generalmente el de la base de datos, estas opciones son la 5 y la 7 por lo que en el servidor de Base de Datos quedaria de la siguiente forma.
VARactive_keepalives => 12345678
Y para los demas servidores quedaria de la siguiente forma.
VARactive_keepalives => 123468

MySQL conexiones remotas

MySQL conexiones remotas

Para habilitar conexiones remotas a nuestro servidor MySQL se tienen que realizar varios cambios, uno de ellos es editar el archivo de configuracion de MySQL /etc/my.cnf

Edicion de archivo /etc/my.cnf

Se deben buscar las siguientes lineas:
#This will disable networking
#skip-networking
bind-address=172.16.0.4
Asegurarse que la linea skip-networking este comentada con el caracter de # y de tener la linea bind-address=172.16.0.4asignada a la IP del servidor.
Despues se debe reiniciar el servicio de MySQL
service mysql restart
Entrar a la consola de MySQL y ejecutar el siguiente comando para dar permiso a todas las conexiones remotas.
mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;
Por ejemplo para darle permiso a root seria el siguiente ejemplo:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootPasswd' WITH GRANT OPTION;
Y finalmente se limpian los privilegios para actualizar los cambios.
mysql> FLUSH PRIVILEGES;
Con esto el servidor esta listo para aceptar conexiones remotas
mysql -h172.16.0.4 -uroot -prootPasswd