lunes, 24 de noviembre de 2014



Instalación:
npm install -g github desde tu consola ó descarga e instala en tu pc con un wizard desde --> http://git-scm.com/download
git init: Inicializa git en el directorio.
git config --global user.email "webmasterluise@gmail.com"
git config --global user.name "Luis Eduardo"
git add -A : Agrega los archivos al branch en el nivel de test.
git commit -m "Commit inicial" : Agrega los archivos al branch en el nivel productivo.
git log : Muestra los cambios.
git checkout master: te mueves al branch "master"
git checkout experimental: te mueves al branch "expermiental".
git log --oneline --graph --all : muestra todos los commits realizados en lista.
git config --global alias.elalias 'log --online --graph --all': creas una variable en git que contiene otra.
FUSIONES
FAST FORWARD (para archivos diferentes entre colaboradores)... "O" para escribir y luego :x
git merge experimental
git branch --merged
git branch "nuevo nombre"
FUSIÓN MANUAL (para cuando dos desarrolladores hacen merge el mismo archivo)
git checkout master
git merge colaboradores
git commit -am "Fusion ejecutada" : el -am es add y merge.
Borrar rama (branch)
git branch -d experimental: borra el branch "experimental"


Github es el workstation de git en la nube.
Comandos básicos de cónsola
Cls: Limpia la pantalla.
Echo: Habilita o deshabilita el volcado de texto de programa.
Pause: Detiene la ejecución de comandos y continúa al presionar una tecla.
Date: Muestra la fecha del sistema.
Time: Muestra la hora del sistema.
Ver: Muestra la versión del sistema operativo.
Vol: Muestra el volumen específico de una unidad.
Path: Indica el trayecto por defecto del sistema.
Mem: Muestra datos sobre la memoria usada, libre, etc.

Comandos para la gestión de archivos
Copy: Copiar un archivo o una carpeta.
Del: Eliminar un archivo.
Mkdir o MD: Crear un directorio.
Rmdir o RD: Eliminar un directorio.
Chdir o CD: Cambia a un directorio deseado.
Dir: Muestra el contenido de un directorio.
Rename o Ren: Renombra un archivo.
Type: Muestra un tipo de fichero en específico.

Comandos de unidades de disco
Fdisk: Gestor de particiones de disco.
Format: Da formato a una unidad de disco.
Label: Asigna una etiqueta a un disco.
Scandisk: Comprueba el disco duro y lo repara si es necesario.

Comandos de red
ARP: Muestra la tabla de resolución de protocolos.
FTP: Cliente FTP de Windows.
IPConfig: Muestra la configuración del IP.
NBTSTAT: Muestra el estado de la red por BIOS.
Net: Comando que ofrece varias utilidades de red.
Netstat: Muestra el estado de la red de Windows.
Telnet: Inicia la sesión telnet.
Tracert: Hace una traza hasta llegar al destino.

Comandos de programación
Edit: Editor de textos, similar al bloc de notas.
Choice: Para dar al usuario a elegir entre distintas opciones.
Debug: Inicia el depurador de códigos.
If: Condicional para ejecutar distintas sentencias.
For: Ejecuta varias sentencias hasta terminar el ciclo.
Goto: “Ir a”. Se debe especificar la ruta.
Presentación del Especialista Confluence:
De tarea, pasar la info. http://www.avajava.com/tutorials/lessons/how-do-i-change-my-log4j-settings-while-my-web-application-is-running.html
¿Porqué NIB? ¿Para qué? Con Nib potencias el trabajo de Stylus, lo haces mucho más simple y tienes la habilidad de omitir los prefijos de vendor, con un simple import inicial. Ejemplo: @import 'nib/vendor' , @import 'nib/gradients' , vendor-prefixes: o ms moz webkit .

Instalación: Para descargar referencias e instalar los comandos requeridos en el prompt de tu OS, ejecutar el siguiente comando: npm install -g nib

Integrando Nib con Stylus: Para compilar el archivo .styl integrando nib a stylus se ejecuta el siguiente comando: stylus -u nib -c -w archivo.styl

A continuación una presentación más detallada:



¿Porqué o para que stylus? En resumidas palabras... Limpieza, rápidez, compresión, optimización, visualización, distribución y multiplicidad de css ejecutando un comando de compilación basado en otro .styl.

Instalación: Desde tu consola sea cual sea el OS, siempre y cuando tengas instalado nodejs, ejecutar el siguiente comando: npm install -g stylus. Extraer el archivo comprimido en donde gustes como referencia (ya en el prompt se agregaron los comandos de stylus).

HelloWorld stylus: Crea tu archivo .styl, inyecta parametros, y ve a tu consola de nuevo. Ejecutar desde consola el siguiente comando: stylus -c archivo.styl y será compilado tu archivo .styl a formato .css.
Para probar crea un archivo index.html, en el head has referencia al archivo .css y cada vez que cambies y ejecutes la compilación del archivo .styl podrás ver como cambia el .css y tu página web.

Mantener el compilador de stylus escuchando automáticamente cualquier cambio: Simplemente agrega al comando de compilación la etiqueta "-w" seguida de "-c". Ejemplo: stylus -c -w archivo.styl. El comportamiento será parecido al siguiente: ****** WATCHING ****** COMPILING ****** WATCHING

viernes, 1 de agosto de 2014

miércoles, 23 de julio de 2014

Estos son los comandos más recurridos en la operación y administración de sistemas unix/linux.

Cadena de comandos frecuentemente usados:

1) Para abrir un archivo, filtrar los datos a mostrar según un string como parámetro, saltando espacios vacios y delimitando según caracter parametrizado la cadena para seleccionar la columna final que deseamos:
cat xxxxxxxxxx.log | grep 'xxxxxxxxxxxx' | tr -s " " | cut -d ":" -f5

 Cuadro Descriptivo de comandos más usados
 
Comando Sintaxis y Descripción Ejemplo Opciones
>, <, >>, << (redirección) Permiten redireccionar la entrada o salida de un comando a un archivo. cat arch1 arch2 >> arch3 (añade arch1 y arch2 al final de arch3) <, > Redireccionan la entrada y la salida (respectivamente) borrando previamente el archivo de destino
<<, >> Redireccionan la entrada y la salida a continuación del archivo de destino.
| (tuberías) Permiten redireccionar la entrada o salida de un comando a otro comando. ls -l | lp (realiza un listado del directorio actual por impresora) -
* En todos aquellos comandos, que esperan el nombre de un archivo o la ruta de un directorio, se sustituye por cualquier cadena de caracteres, incluido la cadena vacía. - -
? En todos aquellos comandos, que esperan el nombre de un archivo o la ruta de un directorio, se sustituye por un carácter cualquiera. - -
awk Lenguaje para búsqueda y procesado de patrones y expresiones regulares. - -
cal cal [mes] año Devuelve un calendario del año (y el mes) especificados. cal 09 1993 (devuelve el calendario de septiembre de 1993) -
calendar Servicio de agenda que permite indicar fechas y horas en el que se le avise - Consiste en poner el archivo calendar en el directorio de usuario.
cat cat archivo ... Concatena e Imprime cat arch2 (envía el archivo arch2 a la pantalla) -
cc Compilador de C que suele proporcionar cualquier UNIX - -
cd cd
cd directorio Cambio de Directorio
cd /usr/ploro/pagines (le coloca en el directorio /usr/ploro/pagines) -
chmod chmod [u|g|o] {+|-} {rwx} {archivo|directorio} Cambio de modos o permisos de archivos chmod g-rw cuentas (quita los permisos de lectura y escritura del archivo cuentas para los usuarios pertenecientes al grupo) u Propietario
g Miembros del grupo
o Otros usuarios
+ Activa el permiso
- Quita el permiso
r Lectura
w Escritura
x Ejecución
cmp cmp arch1 arch2 Compara dos archivos cmp datos1 historico (compara los archivos datos1 y historico retornando la primera línea y posición del primer octeto que difiera) -
comm comm [-1,-2,-3] arch1 arch2 Busca las líneas en común entre dos archivos. comm clientes1 clientes2 (en la primera columna aparecen las líneas que sólo aparecen en clientes1, en la segunda columna sólo las que aparecen en clientes2 y en la tercera, aquellas que aparecen en ambos) 1 No genera la primera columna
2 No genera la segunda columna
3 No genera la tercera columna
cp cp arch1 arch2 Copia archivos cp orla /tmp/orla.bk (copia el archivo orla del directorio actual al archivo orla.bk en el directorio /tmp) -
cut cut [-c | -f [-d] ] archivo ... Recorta verticalmente campos de archivos cut -f2,4,6 -d, (recorta los campos 2, 4 y 6 utilizando como delimitador de campo la coma. c Divide contando por columnas (caracteres)
f Divide contando por campos (fields)
d Especifica el delimitador de campo
date date Retorna el día y la hora - -
diff diff [-b,-e] arch1 arch2
diff [-b,-e,-r] dir1 dir2 Busca las diferencias entre líneas de dos archivos o directorios.
diff -r /usr/pepe /usr/jose (averigua las diferencias entre todos los archivos de los dos directorios especificados y de sus subdirectorios) b Ignora blancos al principio de línea
e Formatea la salida para ed
r Recorrer subdirectorios
echo echo [cadena] Imprime cadena - -
ex ex Editor de líneas - -
find find ruta criterio acción... Busca archivos que cumplen el criterio y realiza una acción (o varias) sobre ellos. find /tmp -name fact* -print (busca e imprime el nombre de los archivos en el directorio /tmp que comiencen por fact) Los criterios para los archivos pueden ser:
-name archivo Con ese nombre
-size [+|-]n De tamaño n bloques
-links [+|-]n Con n links
-ntime [+|-]n Accedido hace n días
-mtime [+|-]n Modificado hace n días
-newer archivo Modificado después de archivo Donde aparece n se asume el valor exacto. +n y -n significan mayor o menor que, reespectivamente.
Las acciones pueden ser:
-print Imprime la ruta de los archivos encontrados
-exe comando Ejecuta comando
-ok comando Ejecuta comando pidiendo confirmación.
En estos dos últimos casos el archivo encontrado se repesenta con {}
grep grep [-n,-c,-v] patrón archivo Busca ocurrencias de un patrón en un archivo grep valencia cities (busca todas las ocurrencias de la palabra valencia en el archivo cities) a Poner el número de cada línea donde aparece el patrón
c Sólo aparecen las líneas que contienen el patrón
v Aparecen las líneas que no contienen el patrón
help help Invoca la ayuda -
kill kill [-9] ident_proceso Envía un mensaje de terminación a un proceso kill -9 777 (mata el proceso 777) 9 Produce una terminación indiscutible del proceso
ln ln arch1 arch2 Crea vínculos (links) entre archivos ln juan /usr/invitados/juanperez (enlaza el archivo juan con el directorio /usr/invitados/juanperez) -
login login [usuario] Permite entrar a trabajar con otro usuario login juan (pedirá la palabra de paso de juan para entrar a trabajar con ese usuario) -
lp lp [-d] archivo ... Lanza a impresora lp facturas ivas (envía a impresora los archivos facturas y ivas) d Selecciona impresora
lpstat lpstat [-p] archivo ... Obtiene el estado de impresión de un archivo lpstat facturas (obtiene información de la impresión del archivo facturas) p Información sobre la impresora
ls ls [-{a,c,l,p,r,s}] archivo ... Lista el contenido de un directorio ls -la (lista todos los archivos del directorio actual con información extendida) a Lista todos los archivos
c Ordena por fecha
l Listado Largo
p Señala cuáles son directorios con /
r Invierte el orden del listado
s Indica el tamaño en bloques
mail mail
mail dirección ... Para enviar y recibir correo.
mail ploro@uv.es
Este es el cuerpo del mensaje
<CTRL-D> Envía el texto hasta CTRL-D a ploro@uv.es
Cuando se invoca sin parámetros se tienen al menos los siguientes subcomandos:
<return> Lee los siguientes mensajes. Si no hay más sale de mail.
* Da un resumen de comandos de mail - Vuelve al mensaje anterior
p Reimprime el mensaje
a [arch] Añade el mensaje a arch (por defecto arch es mbox)
d Elimina el mensaje
q Sale de mail
<CTRL-D> Igual que q.
man man [sección] Permite consultar el manual man grep (obtiene ayuda sobre el comando grep) -
mesg mesg [-y | -a] Habilita o inhabilita la entrada de mensajes write. mesg y (habilita la entrada de mensajes) y Habilita
a Desabilita
mkdir mkdir directorio Crea un nuevo directorio mkdir trabajo (crea un nuevo subdirectorio denominado trabajo en el directorio actual) -
mv mv arch1 arch2
mv arch1 directorio Traslada o renombra archivos
mv facturas trabajo/ (mueve el archivo facturas al directorio trabajo) -
passwd passwd Permite cambiar la palabra de paso - -
paste paste [-dn] Permite combinar líneas de varios archivos paste -d, codfact facturas (genera un archivo que contiene en cada línea, la línea correspondiente del archivo codfact, un carácter coma de separación y la línea correspondiente del archivo facturas. dn Establece el carácter de enlace
pr pr [-d, -ln, -p, -t, -wn] Imprime (formatea) archivos pr -pl24 facturas (visualiza por pantalla, de veinticuatro en veinticuatro líneas y separando por pausas, el archivo facturas) d Líneas a doble espacio
ln Establece la longitud (altura) de página en n líneas.
p Hace pausa entre páginas
t No incluye encabezamiento de cada página
wn Establece la anchura de página en n columnas.
ps ps [-a, -u, -x] Retorna los procesos activos ps -aux (visualiza en formato extendido todos los procesos activos y sus usuarios) a Retorna todos los procesos
u Indica el usuario de cada proceso
x Información extendida
pwd pwd Indica el directorio actual - -
rm rm [-l,-r] archivo ... Borra archivos rm -r trabajo (elimina el directorio trabajo y todos los archivos y subdirectorios que cuelgan de él) l Protege archivos existentes
r Borra recursivamente todos los subdirectorios y archivos que cuelgan del directorio a borrar
rmdir rmdir directorio ... Borra directorios siempre y cuando estén vacíos rm trabajo (borra el directorio trabajo en el caso que esté vacío) -
sed sed [opciones] Editor de flujo - -
sort sort [-b,-d,-f,-n,-o archsal, -r] archent Ordena las líneas de un archivos según orden lexicográfico. sort -f -o salida entrada (ordena el archivo entrada en el archivo salida ignorando mayúsculas y minúsculas) b Ignorar los espacios del principio de línea
d Ordena según diccionario
f Ignora diferencias entre mayúsculas y minúsculas
n Ordena los números por el valor y no por orden lexicográfico
o archivo El resultado se escribe en archivo
r Revierte el orden
spell spell archivo Corrige ortográficamente un archivo - -
tail tail [-n] archivo Recorta las últimas líneas de un archivo. tail -100 diario (Imprime las últimas 100 líneas del archivo diario) -
uniq uniq [-u,-d,-c] archent [archsal] Suprime las líneas duplicadas en un archivo. uniq -d ventas masvendidos (produce en el archivo masvendidos aquellas líneas de ventas que aparecen más de una vida) u Sólo retorna aquellas líneas duplicadas
d Retorna las líneas duplicadas
c Retorna el número de veces que aparece repetida cada línea
vi vi Editor de pantalla vi facturas (edita el archivo facturas. Si no existe lo crea) Dentro del editor y desde el modo comando (que se accede con ESC):
i Inserta caracteres
x Borra caracteres
:q Salir sin grabar
:x Salir grabando cambios
wc wc [-l,-w,-c] archivo ... Cuenta las palabras de un archivo (WordCount). wc -l diario (cuenta las líneas del archivo diario) l Cuenta líneas
w Cuenta palabras
c Cuenta caracteres
who who [am I] Indica los usuarios conectados al sistema who (informa sobre los usuarios conectados en ese momento) am I Sólo proporciona información sobre el propio usuario.
write write nombredeusuario Envía una nota a otro usuario del sistema write vanessa
Nos vemos a la salida?
<CTRL-D> (Envía una nota a la usuario vanessa)
-

Selenium IDE es un plugin de firefox que graba y ejecuta interacciones del usuario con el navegador, puedes crear scripts de su tipo o simplemente grabar las interacciones para ser ejecutadas. Selenium IDE puede exportar scripts para la el software RemoteControl y WebDriver which records and plays back user interactions with the browser. Use this to either create simple scripts or assist in exploratory testing. It can also export Remote Control or WebDriver scripts, aunque deben ser revisados y adaptados en algunos de sus puntos.


descarga Selenium IDE: http://docs.seleniumhq.org/download/

descarga SelBlocks IDE (este te permite agregar comandos de loop, tipo while): https://addons.mozilla.org/es/firefox/addon/selenium-ide-sel-blocks/

Lo recomiendo, sobre opciones como Imacro o greymonkey.


martes, 15 de julio de 2014




La imágen representa un modelo de oferta de trabajo para solicitud de visa temporaria aplicable a Chile, la carta una vez completada debe ser notariada con la presencia de ambas partes, particularmente el empleado y un representante legal del empleador.

domingo, 22 de junio de 2014

Modelo-Vista-Controlador (Model-View-Controller MVC)

  1. EJEMPLO YII
Yii implementa el diseño de patron modelo-vista controlador (model-view-controller MVC) el cual es adoptado ampliamente en la programación Web. MVC tiene por objeto separar la lógica del negocio de las consideraciones de la interfaz de usuario para que los desarrolladores puedan modificar cada parte más fácilmente sin afectar a la otra. En MVC el modelo representa la información (los datos) y las reglas del negocio; la vista contiene elementos de la interfaz de usuario como textos, formularios de entrada; y el controlador administra la comunicación entre la vista y el modelo.
Más alla del MVC, Yii tambien introduce un front-controller llamado aplicación el cual representa el contexto de ejecución del procesamiento del pedido. La aplicación resuelve el pedido del usuario y la dispara al controlador apropiado para tratamiento futuro.
El siguiente diagrama muestra la estructura estática de una aplicación Yii"
Estructura estática de aplicación Yii
Estructura estática de aplicación Yii

1. Un flujo de tareas típico 

El siguiente diagrama muestra un típico flujo de tareas de una aplicación Yii cuando resuelve un pedido de usuario:
Un típico flujo de tareas de una aplicación Yii
Un típico flujo de tareas de una aplicación Yii
  1. Un usuario realiza un pedido con la siguiente URL http://www.example.com/index.php?r=post/show&id=1 y el servidor Web se encarga de la solicitud mediante la ejecución del script de arranque en index.php.
  2. El script de entrada crea una instancia de applicación y la ejecuta.
  3. La aplicación obtiene la información detallada del pedido del usuario del componente de aplicaciónrequest.
  4. El controlador determina le controlador y la acción pedido con ayuda del componente de aplicación llamado urlManager. Para este ejemplo el controlador es post que refiere a la clase PostController y la acción es show que su significado es determinado por el controlador.
  5. La aplicación crea una instancia del controlador pedido para resolver el pedido del usuario. El controlador determina que la acción show refiere al nombre de método actionShow en la clase controlador. Entonces crea y ejecuta los filtros asociados con esta acción (ejemplo: control de acceso, benchmarking). La acción es ejecutado si los filtros lo permiten.
  6. La acción lee el modelo Post cuyo ID es 1 de la base de datos.
  7. La acción realiza la vista llamada show con el modelo Post
  8. La vista lee y muestra los atributos del modelo Post.
  9. La vista ejecuta algunos widgets.
  10. El resultado realizado es embebido en un esquema (layout).
  11. La acción completa la vista realizada y se la muestra al usuario.

----------------------------------------------------------------------------------------------------------------------

MVC está muerto, es hora de seguir adelante.

MVC es una idea fenomenal. Usted tiene modelos, que son agradables pedacitos independientes de Estado, vistas que son buenos pedacitos independientes de la interfaz de usuario y los controladores que son buenos pedacitos independientes de ...
¿Qué?
Ciertamente no soy la primera persona en darse cuenta de esto, pero el problema con MVC como se da es que usted termina el relleno demasiado código en los controladores, porque usted no sabe dónde más ponerlo.
Para solucionar este problema que he estado usando un nuevo patrón:MOVER . M odelos, O peraciones, V iews y E respiraderos.

Visión de conjunto

Arquitectura de una aplicación de MOVE
Voy a definir los detalles en un minuto, pero este diagrama muestra la estructura básica de una aplicación de MOVE.
  • Modelos encapsular todo lo que su aplicación sabe.
  • Operaciones encapsular todo lo que hace la aplicación.
  • Vistas mediar entre la aplicación y el usuario.
  • Los eventos se utilizan para unir todos estos componentes de manera segura.
Con el fin de evitar el código espagueti, también vale la pena señalar que hay recomendaciones para lo que se permiten los objetos de cada tipo de hacer. He representado a estos como flechas en el diagrama. Por ejemplo, las vistas se les permite escuchar a los eventos emitidos por los modelos, y las operaciones se les permite cambiar los modelos, pero los modelos no deben hacer referencia a puntos de vista o las operaciones.

Modelos

El modelo arquetípico es un objeto de "usuario". Tiene por lo menos una dirección de correo electrónico, y probablemente también un nombre y un número de teléfono.
En los modelos de aplicación de MOVE sólo envolver conocimiento. Esto significa que, además de los captadores y definidores, pueden contener funciones que le permiten comprobar "es la contraseña del usuario?", Pero que no contienen funciones que permiten guardarlos en una base de datos o subirlos a una API externa . Ese sería el empleo de una operación.

Operaciones

Una operación común para las aplicaciones está registrando un usuario pulg Es realmente dos sub-operaciones compuestas juntos: primero obtener la dirección de correo electrónico y la contraseña del usuario, segundo cargar el modelo "usuario" de la base de datos y comprobar si la contraseña coincide.
Las operaciones son los que hacen el mundo de MOVE. Ellos son responsables de hacer cambios a sus modelos, para mostrar los puntos de vista correctos en el momento adecuado, y para responder a los eventos provocados por las interacciones del usuario. En una aplicación bien factorizada, cada sub-operación se puede ejecutar de forma independiente de su matriz; por lo que en los hechos diagrama de flujo hacia arriba, y los cambios son empujados hacia abajo.
Lo que es interesante sobre el uso de las operaciones de esta manera es que toda la aplicación en sí puede ser tratada como una operación que se inicia cuando se inicia el programa. Se genera tantos sub-operaciones, ya que necesita, donde se ejecuta cada sub-operación concurrente existente en paralelo, y se sale del programa cuando todos están completos.

Vistas

La pantalla de inicio de sesión es una vista en la que se encarga de mostrar un par de cuadros de texto para el usuario. Cuando el usuario hace clic en el botón "login" la vista producirá un evento de "loginAttempt", que contiene el nombre de usuario y una contraseña que el usuario escribió.
Todo lo que el usuario puede ver o interactuar con debe ser alimentado por una vista. Ellos no sólo muestran el estado de la aplicación de una forma comprensible, pero también simplifican el flujo de las interacciones del usuario entrantes en eventos significativos. Es importante destacar que vistas no cambian modelos directamente, simplemente se emiten eventos a las operaciones, y esperar a que los cambios al escuchar a los eventos emitidos por los modelos.

Eventos

El evento "loginAttempt" se emite por la vista cuando el usuario hace clic identificarte. Además, cuando la operación de inicio de sesión se completa, el modelo de "currentUser" emitirá un evento para notificar a la aplicación que ha cambiado.
Escuchando en eventos es lo que da de MOVE (y MVC) la inversión de control que usted necesita para permitir que los modelos para actualizar vistas sin los modelos de ser directamente conscientes de que las opiniones están poniendo al día. Esta es una poderosa técnica de abstracción, permitiendo que los componentes que se acoplan entre sí sin interferir entre sí.

¿Por qué ahora?

No quiero que se me malinterprete como dando a entender que MVC es malo; que realmente ha sido una manera increíblemente exitosa para estructurar grandes aplicaciones para las últimas décadas. Desde que se inventó, sin embargo, las nuevas técnicas de programación se han vuelto populares. Sin cierres (o bloques anónimos) de enlace de eventos puede ser muy tedioso; y sin deferrables (también conocidos como deferreds o promesas) la idea de tratar las operaciones individuales como objetos en sí mismos, no tiene mucho sentido.
Para reiterar: MVC es impresionante, pero está diseñado con décadas de antigüedad tecnologías. MOVE es simplemente una actualización para hacer un mejor uso de las nuevas herramientas que tenemos.
Muchos problemas de rendimiento y de escalabilidad suceden cuando se utilizan las conexiones a las bases de datos. Hay que tener en cuenta que las conexiones son un recurso que consume memoria y tiempo de procesador, por lo que sólo se deben crear las conexiones necesarias y estas deben cerrarse tan pronto como se a posible.

Una buena práctica es que todas las clases accedan a los recursos de la base de datos usando siempre una única conexión sin importar el número de instancias que estas clases generen al ser ejecutadas en una aplicación.

El patrón Singleton (instancia única) es el más sencillos, conocidos y utilizados. Está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto, asegurando de que sólo exista una única instancia de la clase sin importar el número de veces que se intente crear y proporcionando un punto de acceso global.

Se podría suponer que utilizando miembros estáticos obtendríamos el mismo resultado, pero no es así, ya que en este caso la responsabilidad de tener una única instancia recae en el cliente de la clase.

El patrón Singleton hace que la clase sea responsable de su única instancia y se implementa creando en nuestra clase un método para la creación de la instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con atributos como protegido o privado).

Resumiendo, el patrón Singleton, provee una única instancia global ya que:

  • La propia clase es responsable de crear la única instancia.
  • Permite el acceso global a dicha instancia mediante un método de clase.
  • Declara el constructor de clase como privado para que no sea instanciable directamente.
El diseño clásico de un es el siguiente:





Analizando la clase se puede observar el uso de los modificadores "private" y "static" en el constructor que hacen que no se pueda crear la clase de forma directa, sino a través del método public GetInstance() que devuelve la instancia creada.

A continuación voy a mostrar un ejemplo en c# en el que tendremos dos clases, que al crearse se guardan la fecha y hora de creación:



  • "Instancia1", en la que no se utiliza el patrón Singleton

  • "Instancia2" en la que implementaremos el patrón Singleton.

    Para utilizar esta clase se deberá invocar mediante el método "GetInstance()".
Aquí les dejo el pantallazo del programa en el que se utilizan ambas clases, es muy básico con la opción "a" se crea una instancia de la clase que no tiene implementado el patrón Singleton y con la opción "b" se crea la instancia con el patrón implementado y estas instancias se guardan en una lista para mostrarlas.





Como se puede observar cada vez que se crea una instancia sin el patrón Singleton obtenemos una fecha y hora diferente, es decir, son instancias diferentes que se crean en cada llamada. En cambio, utilizando el patrón Singleton obtenemos la misma fecha y hora, ya que se crea una sola instancia de acceso global.



                    




sábado, 21 de junio de 2014

Mejores prácticas para el manejo de excepciones


Amigos, hemos estado utilizando el manejo de excepciones en nuestro código para casi todas las aplicaciones estándar de la industria. Enfoque habitual es crear algunas clases de excepciones personalizadas que se extienden de la base Excepción clase. En este post, voy a sugerir otro enfoque que pudiera hacerle más sentido.

Secciones de este mensaje:
  • Nuestro nuevo enfoque
  • Ventajas

Nuestro nuevo enfoque

Probablemente algunos de nosotros ya utilizan este mecanismo. Si usted es uno de ellos, entonces por favor revise este post y sugerir las mejoras. De lo contrario, aprender sobre este mecanismo y sus comentarios.
Nuestro nuevo enfoque utiliza las clases internas estáticas para cada nuevo escenario excepcional .Tradicionalmente, creamos una clase DBException extendiendo la clase Exception. Ahora, cada vez que nos vemos atrapados en una situación en la que es necesario que excepción lanzada, solemos crear una instancia de esta clase, poner un poco de información en forma de mensaje, y echarlo.
Ahora, vamos a considerar que hay situaciones siguientes que hemos identificado en el que tenemos que tirar DBException:
  1. Error de ejecución del SQL
  2. No existen datos en la que esperamos al menos una fila
  3. Existen múltiples filas en la que esperamos fila único single
  4. Error parámetros no válido
y pueden existir muchos más de tales casos.
Diferentes con nuestro enfoque tradicional, y mucho, prueba nuestro nuevo enfoque, es decir crear las clases internas estáticas.
Vamos a empezar con la clase BaseException que se crea como abstracto y será el tratamiento super clase de todas las clases de excepción.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Make this class abstract so that developers are forced to create
// suitable exception types only
public abstract class BaseException extends Exception{
    //Each exception message will be hold here
    private String message;
    public BaseException(String msg)
    {
        this.message = msg;
    }
    //Message can be retrieved using this accessor method
    public String getMessage() {
        return message;
    }
}
No es el momento de crear nuevas clases internas de excepción. Deje que golpeó el teclado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class DBExeption
{
    //SQL execution error
    public static class BadExecution extends BaseException
    {
        private static final long serialVersionUID = 3555714415375055302L;
        public BadExecution(String msg) {
            super(msg);
        }
    }
    //No data exist where we expect at least one row
    public static class NoData extends BaseException
    {
        private static final long serialVersionUID = 8777415230393628334L;
        public NoData(String msg) {
            super(msg);
        }
    }
    //Multiple rows exist where we expect only single row
    public static class MoreData extends BaseException
    {
        private static final long serialVersionUID = -3987707665150073980L;
        public MoreData(String msg) {
            super(msg);
        }
    }
    //Invalid parameters error
    public static class InvalidParam extends BaseException
    {
        private static final long serialVersionUID = 4235225697094262603L;
        public InvalidParam(String msg) {
            super(msg);
        }
    }
}
Aquí, creamos una clase interna para cada escenario posible error identificado en el arranque. No puede haber muchos más extra. Depende de ti sólo para identificar y agregar más clases.
Veamos cómo estas clases parecen en archivos de registro.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TestExceptions {
    public static void main(String[] args)
    {
        try
        {
            throw new DBExeption.NoData("No row found for id : x");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
Output:
com.exception.DBExeption$NoData: No row found for id : x
at com.test.TestExceptions.main(TestExceptions.java:7)
Como se puede ver el mensaje de registro de seguimiento de pila de excepción, si se ha vuelto más informativo.

Ventajas del uso de clases internas

  1. Ventaja más importante es que si usted desarrollador ha escrito un texto de mensaje dudoso, entonces también se puede observar claramente que lo que era realmente malo.
  2. Usted puede utilizar la instancia de comparación en diferentes situaciones en el que maneje diferentes escenarios excepcionales.
  3. No es necesario enviar una sola excepción para un gran conjunto de condiciones excepcionales.
  4. Es fácil de escribir casos de prueba de unidad para casos negativos donde se sabe la clase exacta excepción, debe esperar.
  5. La tala es más significativo e informativo.
Espero que este post ha sido algunos informativa para usted. Si usted tiene algunas sugerencias, por favor escríbame.
Subscribe to RSS Feed Sígueme en twitter!