Monday, May 26, 2014

¿Qué es un modelo de datos?

Un modelo de datos es un mapa, así de simple, un mapa que describe el camino que sigue la información de un punto a otro de un proceso.

En un proceso de negocio se documentan los movimientos de información, servicios, productos y/o dinero, de la correcta ejecución del proceso depende que el negocio opere de manera exitosa, y la mejor manera de controlar esa ejecución es documentar el proceso.
El primer paso de la creación de un proceso es definir cuál es la meta del proceso, ésta definición nos permitirá definir qué información requerimos para cumplirla.
Por ejemplo:
Tenemos una tienda que vende batidos de sabores así que ofrecemos varios sabores y opciones de batidos:
Base:
Agua      $5
Leche    $8
Yogurt   $8

Sabores:
Banana
Melón
Chocolate
Sandía
Limón
Naranja
Dos Sabores       +$2
Tres Sabores      +$3

Ejercicios
¿Cuál sería la meta de un modelo de datos basado en ésta información?

¿Qué información necesitamos para definir el proceso de negocio asociado?

Wednesday, May 21, 2014

Como ver el valor de una variable en una sentencia SQL ejecutándose en Oracle

Uno de los problemas generalizados en Oracle es el poder ver el valor de una variable incluida en una sentencia ejecutada.

¿a que me refiero con ésto?

En Oracle podemos usar una sentencia de éste tipo:

INSERT INTO emp VALUES
    (:empno, :ename, :job, :sal, :deptno)

donde los valores son incluidos por parámetro en variables, 
en éste caso es fácil de saber cuál valor es cuál cierto?

¿Que tal cuando las variables son incluidas ... así? 


INSERT INTO emp VALUES
    (:E1, :E2, :E3, :E4, :E5)


aunque no lo crea es un formato muy utilizado, 
¿cómo sabría usted cuál variable es cuál?

La manera difícil es generar un sql parecido a éste, por cada variable:


select sesion.sid,
       sesion.serial#,
       sesion.username,
       sesion.sql_id,
       sesion.sql_child_number,
       optimizer_mode,
       hash_value,
       address,
       sql_text
  from v$sqlarea sqlarea, v$session sesion
 where sesion.sql_hash_value = sqlarea.hash_value
   and sesion.sql_address    = sqlare

La manera fácil es con una herramienta de optimización como 
el DBOptimizer de Embarcadero:

Como ven aquí nos muestra todas las variables relacionadas al SQL 
con sólo un click


Tuesday, May 20, 2014

Mapas de Calor en Delphi

Un mapa de calor o "Heatmap" es un mapa que cambia de color por zonas dependiendo de un dato, es muy usado para estadísticas de producción en regiones geográficas.

Por ejemplo si queremos un mapa que nos mida las ventas por país como éste:

o como éste


Tenemos algunas maneras interesantes de hacerlas:

Lo primero es dibujar o importar el mapa, el mapa por lo general está definido en formato svg el cual es un formato de coordenadas, que se ve como ésto:

<svg height="210" width="500">
  <polygon points="200,10 250,190 160,210" style="fill:lime;stroke:purple;stroke-width:1" />
  Sorry, your browser does not support inline SVG.
</svg> 

pero claro ése es un triángulo, su mapa se verá como ésto:


perdonen, éste es solo un segmento del mapa, pero se debe incluir en nuestro programa cada segmento a estudiar y formar el mapa con la unión de todos ellos.



En nuestro programa creamos un objeto TPATH y en TPath.data insertamos los puntos vistos que forman nuestra región, crearemos un objeto para cada región que forma nuestro mapa.




Una vez completada la inserción de todas las regiones ( y debidamente identificadas ) podemos manipular su color con un simple case.




begin

FireDAC.Connected := True;
try
FDQuerySelect.Open;
FDQuerySelect.First;
while(not FDQuerySelect.EOF)do 
begin
Case (FDQuerySelect.FieldByName(‘MType’).AsInteger) of
1 : Pathlist[FDQuerySelect.index].fill.color := Green;
0 : Pathlist[FDQuerySelect.index].fill.color := Red;
else 
Pathlist[FDQuerySelect.index].fill.color := Blue; 

end;
FDQuerySelect.Next;

end;

Form.Redraw;

end;

Éste es tan sólo un ejemplo de lo que podemos hacer con Delphi, los reto a hacer lo mismo con Live Bindings



Monday, May 19, 2014

El Mercadeo en la programación moderna


En el mundo de hoy como ingenieros nos enfrentamos a una competencia globalizada, ya no existe la ventaja de ser locales en este campo de batalla mundial, el avance de las telecomunicaciones e internet han contribuido a que nuestra competencia pueda proveer sus servicios a mejor precio y con mejor infraestructura que nosotros como si estuviera aqui!

Se necesita mantener una visión de mercadeo de nuestras habilidades para descubrir la manera de llegar al usuario global, poder hacer aplicaciones para mejorar la vida de las personas sin importar donde estén y de ésta manera vender nuestro trabajo.

Debemos abrir nuestras mentes no solo al hacer por hacer, sino obtener una visión de negocio, nos gusta pensar en nosotros mismos como artistas, pero estamos en un mundo donde nuestras herramientas no pueden ser perfectas para todos.

La creación de herramientas computacionales que se ajustan a la manera de trabajar de todas las empresas es un sueño, hay tantas maneras de trabajar como empresas y un sistema que se ajuste a todas es una locura.

La era del software a la medida llegó a su fin hace mas de 15 años atrás, estamos en una era donde se utilizan herramientas que se complementan entre ellas para llegar a soluciones económicamente rentables.

Hay que volver a la raíz de la ingeniería y disolver los grandes problemas en problemas pequeños.

Debemos mercadear soluciones a un problema simple, que se puedan combinar para solucionar problemas complejos.


Raúl Morales Víquez raul.morales.víquez@hotmail.com / http://informatica-raulmorales.blogspot.com
Consultor en informática e Instructor, certificado en Seguridad Informática, Graduado en la Universidad Latina de Costa Rica con más de 10 años de experiencia en diversas áreas de cultura organizacional en empresas multinacionales.

Cuáles son sus temas favoritos?

Cuáles son sus problemas en el día a día?
Han tenido alguna situación que se arregló de una manera que no los dejó satisfechos?

Por favor hagan sus preguntas a raul.morales.viquez@hotmail.com


Tuesday, May 6, 2014

Cómo hacer una aplicación multilenguaje en Delphi

Lo primero que necesitamos para éste ejercicio es un objeto Tlang el cual incluiremos en la aplicación que deseemos tenga posibilidad multilenguaje.

Una vez finalizado y funcionando el programa, vamos a agregar un control que nos permita elegir el lenguaje que deseemos, puede ser parecido a éste:

TLang1.jpg

Una vez hecho ésto le damos doble click al componente TLang y él traerá a enfoque la siguiente ventana:

TLang2.jpg

La ventana solicita el código del lenguaje en la parte superior y a continuación lista todas las etiquetas del programa que hicimos, a la derecha de cada una podemos colocar nuestra traducción de cada una.

ADVERTENCIA
Sólo las etiquetas que traduzcamos manualmente y que tengan la propiedad "AutoTranslate" activada se traducirán cuando se cambie el idioma.

El lenguaje cambia cuando se actualiza la propiedad "lang" del control TLang como en éste ejemplo:
Lang1.Lang := ListBox1.Selected.Text;


Friday, May 2, 2014

Como trabajo con JSON en Delphi?

Para trabajar en JSON se utiliza el objeto TJSONObject, de la siguiente manera:

Si uno está generando la información a enviar puede usar el siguiente método:

var
  LJSONObject: TJSONObject;
 
begin
  LJSONObject:= TJSONObject.Create;
  LJSONObject.AddPair(TJSONPair.Create(TJSONString.Create('Hola'),
                                       TJSONString.Create('Mundo')));

Rápido y sencillo verdad?
Pero digamos que tenemos que utilizar un header predefinido como éste:

const
  GJSONString =
'{'+
    '"glossary": {'+
        '"title": "example glossary",'+
  '"GlossDiv": {'+
            '"title": "S",'+
   '"GlossList": {'+
                '"GlossEntry": {'+
                   ' "ID": "SGML",'+
     '"SortAs": "SGML",'+
     '"GlossTerm": "Standard Generalized Markup Language",'+
     '"Acronym": "SGML",'+
     '"Abbrev": "ISO 8879:1986",'+
     '"GlossDef": {'+
                        '"para": "A meta-markup language, used to create markup languages such as DocBook.",'+
      '"GlossSeeAlso": ["GML", "XML"]'+
                    '},'+
     '"GlossSee": "markup"'+
                '}'+
            '}'+
        '}'+
    '}'+
'}';

Entonces se utiliza la funcion parser del objeto TJSONObject de ésta manera:

procedure ConsumeJsonBytes;
var
  LJSONObject: TJSONObject;
 
begin
  LJSONObject := nil;
  try
    LJSONObject := TJsonObject.Create;
    { convert String to JSON }
    LJSONObject.Parse(BytesOf(GJSONString), 0);
 
    { output the JSON to console as String }
    Writeln(LJSONObject.ToString);
  finally
    LJSONObject.Free;
  end;
end;

Produciendo el objeto deseado.


Exploring the Differences between Red-Teaming and Blue-Teaming in Cybersecurity: Why Red-Teaming is Sexier; but Blue-Teaming is More Crucial

When it comes to cybersecurity, there are two teams that often get confused: redteams and blueteams. Redteams are the hackers, the ones w...