≡
Mostrando entradas con la etiqueta desarrollo. Mostrar todas las entradas
Mostrando entradas con la etiqueta desarrollo. Mostrar todas las entradas

viernes, 2 de septiembre de 2022

MySQL - Procedimientos y Funciones con parámetros opcionales

Si usas procedimientos y funciones de base de datos en MySql o Sql, que reciben parámetros y  que son llamados desde código back (por ejemplo, PHP), o desde cualquier otro lenguaje, habrás notado que, en más de una ocasión, si has decidido añadir un parámetro, o bien has creado un procedimiento o función alternativa (para que no se joda el código ya escrito) o has tenido que revisar todo el código back para añadir, aunque sea con vacío o null, el parámetro en cuestión.

Y habrás pensado... "ya podía tener SQL, al estilo de javascript, php y otros lenguajes, la posibilidad de crear un parámetro con un valor por omisión por si este no es suministrado", lo que viene a ser... un parámetro opcional. 

Por ejemplo, vamos a utilizar un procedimiento muy sencillo que recibe dos parámetros de cadena, devolviendo sus valores.
  CREATE PROCEDURE localdb.parameters_test(p1 varchar(10),p2 varchar(30) )
  BEGIN
      select p1,p2;
  END
  
Si en este caso hacemos...


	call parameters_test("hello","bye");
    
    
    
p1p2
hellobye
Si ahora cambiamos el procedimiento a... CREATE PROCEDURE localdb.parameters_test(p1 varchar(10),p2 varchar(30),p3 varchar(10) ) BEGIN select p1,p2,p3; END Pero no cambiamos la llamada, obtendremos un error. ¿Cómo podemos entonces usar procedimientos y funciones de bases de datos, donde, dentro de su código obtengamos parámetros opcionales, incluso de valores de tipo indefinido? Sí, ya sé que ahora la tendencia es usar el tipado de datos en todo momento, igual que desde 1998 al 2004 aproximadamente, se recomendaba usar las Foreign Keys para conservar la integridad de las tablas, mientras que después se puso de moda mantener la integridad en el código y no usar las claves relacionadas, o Foreign Keys. Y ahora muchos utilizan ya No-SQL para no definir una estructura rígida de base de datos. Todo este tipo de prácticas son a elección del analista, que ha de tener en cuenta si se desea una integridad robusta, un desarrollo de código más ágil, y mil variables más. Como anécdota os contaré que muchos entendieron lo de "ahora no se lleva crear claves relacionadas/foreign keys" y terminaron por no usar índices clave. Sí. Ya imaginarás la de bases de datos que he tenido que indexar y reindexar porque, a cierto volumen de datos la consulta se hacía eterna. En SQL, usad claves, por favor! Dicho esto... al grano.

Parámetros Opcionales en SQL/MySQL

Para "simular" y controlar los parámetros en funciones y procedimientos de base de datos, haremos uso del comando EXTRACTVALUE, que viene a ser como un "lector" o "intérprete" de valores XML. En el siguiente ejemplo básico, lo entenderás claramente.


  CREATE PROCEDURE localdb.parameters_test(pAll varchar(300))
  BEGIN
      set @p1 = (select ExtractValue(pAll,"p1"));
      set @p2 = (select ExtractValue(pAll,"p2"));
      select @p1,@p2;
  END
  



	Call parameters_test("<p1>Hello</p1><p2>Bye</p2>");
    
    
    
    
p1p2
HelloBye
Y si ahora cambiamos el procedimiento para aceptar un nuevo parámetro, no será necesario cambiar nada en el código back (o fuente o como quieras llamaro). CREATE PROCEDURE localdb.parameters_test(pAll varchar(300)) BEGIN set @p1 = (select ExtractValue(pAll,"p1")); set @p2 = (select ExtractValue(pAll,"p2")); set @p3 = (select ExtractValue(pAll,"p3")); select @p1,@p2,@p3; END Call parameters_test("<p1>Hello</p1><p2>Bye</p2>");
p1p2p3
HelloBye
Por supuesto, dentro del procedimiento o función, debes comprobar tanto el tipo, el valor y si existe o no el parámetro pasado para hacer que tu código sea comprensible y útil. Pero eso es a tu elección y a la de tu equipo (si lo hay).

martes, 23 de agosto de 2022

Scrum, Sprints, Estimaciones y Fanfarrones

¡Al tema! ¡Y vaya tema!

Cada año, en una extraña herencia de las dietas milagro, aparecen en el ámbito empresarial, y adoptado especialmente por el sector tecnológico, fórmulas mágicas que prometen ser una revolución. Unido a esto, hay quien; por asistencia a una conferencia, descubrimiento fortuito o conversación de café (con o sin misterio) con un compañero de puesto similar en una empresa mayor; se "empapa" o se lo mira por encima o se crea un concepto en su cabeza, llega a la oficina y dice: ¡Eureka!
Seguramente habrás oído hablar de, o sufrido, el método Scrum o similar. Son métodos de trabajo, realmente aplicado a cualquier sector, orientado a grupos, en principio, con un proyecto común cuyas tareas son dependientes.

En muchos casos asistirás, o habrás asistido, a reuniones dónde realmente cada profesional se ocupa de un sprint (el tiempo estimado para ese grupo de tareas), aunque por alguna razón el "especialista" de turno ha mezclado en un sprint tareas no dependientes, de ahí que diga que cada profesional se ocupa de un sprint. La reunión se hace eterna, pues realmente se está haciendo una reunión con los presentes sin estar todos involucrados en el mismo proyecto o que no tienen tareas dependientes. 

La empresa acaba de ser víctima de un fanfarrón, y tú acabas de sufrir las consecuencias. Pues esa palabra que el "especialista" escuchó y que le llevó a decir "Eureka!", se ha convertido en un absurdo método de control y de examen estresante de aptitudes.

Si en este punto has entendido algo, es que lo has sufrido. Bienvenido a la era de la fanfarria tecnológica.

En caso de que se aplique de forma correcta una metodología ágil como Scrum, entramos en un terreno pantanoso si hablamos de servicios, especialmente si hablamos de desarrollo informático.

Una de las bases de este tipo de metodologías es la estimación de tiempos. Y eso, en desarrollo informático, es un problema.

Veamos cómo sería la estimación de tiempos en un carpintero.

A un carpintero le piden hacer una silla. Con una madera, barniz y forma concretas. El carpintero no ha realizado nunca esa especificidad. Al carpintero le hacen la pregunta: ¿para cuándo estará?. El carpintero tiene esa madera. Si no la tuviese tendría que buscarla y hablar con proveedores conllevando un tiempo indeterminado. Pero afortunadamente para nuestro implicado, tiene la madera que se ha solicitado. 

¿Cuánto tardará? Él ha trabajado esa madera, y en hacer una silla tarda 3 días. Pero el diseño lo desconoce, por lo que responde: "6 días". 

El carpintero se encuentra con que ciertos aspectos del diseño, con esa madera concreta, no son viables. Ha tenido que hacer algunas pruebas que le han retrasado un día. Al final comprueba que para algunos elementos necesita cambiar la madera. Escribe un email (es un artesano moderno) al cliente que le responde un día después, aceptando el cambio de madera en esos elementos. 

El carpintero, al barnizar con el líquido especificado, descubre que éste, que también lo tenía, se comporta de forma diferente en cada tipo de madera. Por lo que necesita cambiar el tipo de barniz, escribiendo nuevamente al cliente. El cliente responde en dos días admitiendo el cambio. 

El carpintero entrega el trabajo a los 8 días. En este caso ha tenido suerte y el cliente (o jefe de proyecto) entiende la circunstancia. 

Al mes siguiente, llega otro cliente que pide un diseño muy parecido al anterior, con la misma madera y el mismo barniz. El carpintero le informa de los cambios que serán necesarios, y ante la pregunta de "¿cuándo estará?", el carpintero responde 5 días, entregando el trabajo en 3 días. 

¿Se entiende? Bien. Normalmente un desarrollador informático no repite una tarea. Es más; un buen programador/analista informático reutilizará hilos de código (clases, rasgos, etc.), cuya preparación inicial conllevará un tiempo indeterminado en pro de un ahorro de tiempo posterior. Y teniendo en cuenta esto, ¿cuál crees que debería de ser la respuesta a la pregunta de cuándo estará?.

Este es el gran problema que se encuentra un programador, analista o cualquier puesto que necesite hacer un estudio previo ante una tarea desconocida ante la estimación de tiempos. Cualquier desarrollador sabe que, excepto las tareas de mantenimiento con error localizado, algo que estimas en cinco días puede estar en dos horas o en un mes.

Algo que, sin duda, jamás entenderá el fanfarrón de metodologías ágiles que utiliza como control de personal y que le hace sentirse útil con la convicción de que, si no fuese por él, la empresa no saldría adelante. 

Hay muchos tipos de trabajadores en todas las empresas y sectores. Unos aportan rapidez, otros excelencia y otros creatividad. Un jefe de proyecto que no sabe sacar partido de su equipo no está haciendo su trabajo correctamente. Por muy al día que esté en dietas milagro.

miércoles, 16 de marzo de 2022

CSS y el caos de los Frameworks

Bueno. Abordemos el tema de forma directa. Y es que cada vez que veo el uso del css en mis clientes, poco se diferencia de los antiguos htmls repletos de "style=", sólo que ahora tenemos cadenas interminables de "class=" y, en ocasiones, combinadas con "style=". Eso sí, seguramente tendremos una carga inicial de Bootstrap.

Y es una muy buena ayuda usar frameworks CSS, que te van a simplificar mucho el uso de los grid, estilos de botones y posiciones, ventanas modales, menús... ya sabes. Pero, si vas a abordar un nuevo proyecto, piensa en, aunque te ayudes para ciertos aspectos de los frameworks CSS, crear tu propia plantilla CSS que aborde estilos (colores, boxes, etc) que vas a usar en tu proyecto.

Adicionalmente, es curioso como aún hay quien utiliza poco las etiquetas personalizadas en lugar de llenar todo de divs con clases. El resultado será muy parecido o similar, pero te puede ayudar a entender mejor el diseño de tu web o webapp, además de evitar las "superposiciones" que hacen que digas "¿porqué demonios hace esto?

Sobre este tema de las etiquetas personalizadas, hay gente que piensa que al tener menos compatibilidad que las clases, decide no usarlas. Aunque luego sea curioso que estén integrando en su javascript requerimientos que sólo los últimos navegadores van a soportar.

Veamos un ejemplo, usando como base Bootstrap.

	<!-- Con Bootstrap -->
	<div class="row mt-3">
		<div class="col-4 offset-2 border shadow">
			Hola Mundo con bootstrap
		</div>
	</div>

Ahora veamos que pasa si usamos "custom tags"

	<!-- Con tags -->
	<style>
      tarjeta {
        width: 34%;
        border: 1px solid grey;
        padding: 1em;
        display: block;
        margin-left: 16%;
        background-color: white;
        border-radius: 3px;
        box-shadow: 5px 5px 7px rgba(0,0,0,.2);
        margin-top: 1em;
        text-align: center;
	}
   </style>
    
    
	<tarjeta>
		Hola Mundo Tags
	</tarjeta>

Vaya. Parece que tiene un poco más de lío. Excepto... si esa especificación de "tarjeta" la tenemos en nuestro archivo CSS y, en TODO nuestro código, usamos simplemente nuestro nuevo tag "tarjeta".

Juega con este código en Codilink

Por supuesto, esto también lo puedes hacer usando las clases. Y una práctica muy recomendable es que, para cada elemento, box, card, diseño que quieras usar, uses una clase (o un tag) superior y los elementos internos los uses con etiquetas "estándar".

Por ejemplo...

	<style>
      .claseTarjeta {
        display: block;
        border: 1px solid grey;
        width: 10em;
        padding: 1em;
      }

      .claseTarjeta p {
        display: block;
        color: black;
        padding: 0;
        font-size: .8em;
        line-height: .8em;
      }

      .claseTarjeta p:nth-child(1) {
        border-bottom: 1px solid black;
        color: red;
        font-size: 1em;
        line-height: 2em;
      }

      .claseTarjeta p:nth-child(3) {
        color: green;
      }
   </style>
    
    
	<div class="claseTarjeta">
		<p>Hola! Soy Rojo</p>
		<p>Y yo no</p>
		<p>Y yo verde</p>
	</div>
Juega con este código en Codilink

Aparentemente más código que escribir, pero... por un lado te podrás saltar (un poco) las definiciones del framework que estés usando (si lo usas). Por otro lado, cada vez que cambies tu hoja de estilos, tendrás todo tu sitio actualizado. Y finalmente, tendrás un código con estilos unificados y mucho, mucho, mucho más limpio.

En definitiva. Usa lo que prefieras. Pero... cuanto menos llenes el código que contiene la información con estilos y MILES DE CLASES, te alegrarás cuando tengas que hacer una modificación.

Por cierto, recuerda que para forzar al navegador a usar tu última versión de tu hoja de estilos, simplemente añade un ?v999xxOloQueSea al enlazarla. Con esto forzarás que se carge la última versión.

Adicionalmente, te recomiendo que empieces a usar variables CSS, especialmente para los colores, y así contemplar, el cada vez más usado, modo oscuro o modo claro según la configuración de tu sistema.

Como último tip, recuerda que si algo no está haciendo lo que "debería", quizá el "css" que añade por defecto tu navegador, o esa clase o tag ya la tiene definida el framework, puedes usar "all: unset;" para quitar todo lo que se haya definido sobre ella.

Y aunque entiendo la "pereza" que da hacer los estilos personalizados, creéme. Te alegrarás. Podrás tener templates que te ayuden en otros proyectos. Podrás usar tamaños relativos (muchos frameworks usan tamaños en pixels) y personalizar al máximo todo lo que quieras. Y si además usas en desarrollo (recuerda POR FAVOR, quitar las extensiones no .css del deployer/publicador de producción) metalenguaje como Sass, pues más sencillo todo.

martes, 14 de diciembre de 2021

HTML, CSS y Javascript Online con Codi.link y otros

Aunque todo esto lo puedes hacer en local y con tu editor de código, hay veces que quieres probar "en vivo" algunas alternativas de código, css, html o javascript. Y es posible que tu editor de código admita addons para hacer todo esto en una misma pantalla. Pero también somos muchos los desarrolladores que no queremos "petar" nuestros editores y recurrimos a herramientas online, a veces desarrolladas por nosotros mismos, para hacer esta "zona de ensayo".

Pues para facilitarte esto, muchos publican sus propias herramientas online para beneficio de la comunidad (y algunos para beneficio publicitario, algo nada reprochable).

CODI.LINK

El primero que te recomiendo es Codi.Link, del youtuber/streamer Miguel Ángel Durán.

De reciente creación y con la ayuda de sus seguidores, promete convertirse en uno de las mejores zonas de pruebas de CSS, Html y Javascript online.

CODEPEN

Uno de los más conocidos y usados es CodePen. Similar al anterior y con multitud de funciones.

JS.DO

Una zona de pruebas que yo he usado (y uso) desde hace mucho tiempo, ya que es simple y sin separación de código es JS DO de Rodrigo Siqueira.

viernes, 9 de julio de 2021

Validar y Buscar errores en un Json Online

El formato de datos Json nos permite hacer muchísimas cosas, todo desarrollador, tanto Backend como Frontend ha lidiado alguna vez con un enorme Json que contiene... un error.

Para encontrar ese "carácter" puñetero, o ese error de composición eventual, Curious Concept nos trae su utilidad online Json Formarter and Validator.


Y aunque seguramente conozcas otras utilidades para el formateo, consulta e incluso validación de Jsons, esta sencilla herramienta me ha parecido la más útil y usable de todas las que conozco.

Échale un vistazo y me cuentas.

Json Formarter and Validator Online

jueves, 17 de junio de 2021

MySQL. Error 1031

Si tienes alguna base de datos MYSQL con versión 5.3 o anterior, e intentado hacer una transferencia a un motor superior, te puedes encontrar que alguna tabla te da error 1031, y una descripción similar a "Table storage engine for ‘tabla’ doesn’t have this option", es muy posible que, cuando se creó esa tabla se hiciese con un ROW_FORMAT = FIXED.

Y si estás usando InnoDB, debes saber que sólo admite los formatos REDUNDANT, COMPACT, DYNAMIC y COMPRESSED.

Cambia el row_format de tu tabla y... tira!

martes, 20 de octubre de 2015

Problemas conectando MySQL en IIS Asp clásico


Si estás utilizando un IIS para depurar en local códigos de ASP clásico bajo sistemas Windows 7 y superiores, es posible que te hayas encontrado con algunos problemas a la hora de conectarte a una base de datos Mysql (o similares) desde tu código. Vamos a ver como solucionar estos problemas.


Algunos de los problemas que te puedes encontar es:


Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][Administrador de controladores ODBC] No se encuentra el nombre del origen de datos y no se especificó ningún controlador predeterminado.


Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][Administrador de controladores ODBC] La arquitectura del DSN especificado no coincide entre el controlador y la aplicación.



La razón de estos errores puede deberse a varios motivos.

En el primer caso, se puede deber a que no tienes instalado el "conector" (el driver de conexión a la base de datos) que estés utilizando. Como supongo que la mayoría usaréis Mysql, en http://dev.mysql.com/downloads/connector/odbc/ podéis encontrar los conectores ODBC, que debes descargar e instalar.

Si teniendo el conector correcto, que podrás comprobar en el "Administrador de Origen de Datos ODBC" ( %windir%\syswow64\odbcad32.exe ó %windir%\system32\odbcad32.exe )* , comprobación que puedes realizar en la pestaña "Controladores", y aún así te aparece el error de "No se encuentra el nombre de origen de datos", antes de empezar a volverte loco/a con otras soluciones, o si ya las has probado y con un nombre ODBC te aparece el segundo error de "la arquitectura...", te propongo que pruebes lo siguiente:

SOLUCIÓN BASADA EN EL POOL del Administrador IIS

Entra en el Administrador de Internet Information Services, en la página principal, y en el desplegable superior (sección), ve a system.applicationHost/applicationPools.

Una vez ahí, pulsa en la sección applicationsPoolDefaults y activa enable32BitAppOnWin64 (True).

Aplica los cambios (botón Aplicar superior).


Esto debería solucionar el problema.


OTRAS CONSIDERACIONES

Cómo has podido notar, cuando te he hablado del Administrador de Origen de Datos ODBC, en Windows 7 (o superior) tienes dos administradores, el que se encuentra en syswow64 y el que está en system32. El segundo, sólo gestiona los conectores 64bits, por lo que si usas un sistema 32bits, debes crear los DSN en el administrador del syswow64. Recuerda, además, que en IIS, se utilizará los DSN del sistema.


ACCEDER A MYSQL CON ASP Clásico

Recuerda, la cadena de conexión a la base de datos, ya sea sin utilizar el DSN:

conn_string = 'Driver={MySQL ODBC 5.1 Driver};Server=servidor;Port=3306;Database=tubasededatos;Uid=usuario;Pwd=contraseña'


ó utilizando un DSN del sistema, creado en el Administrador de Origen de Datos:

conn_string = 'MinombreDSN'