GIT Cómo hacer un parche de un commit(s) dado

Introducción

Relacionado: GIT: Cómo hacer un parche con los cambios actuales

El caso en esta entrada puede ser conocido por muchos usurios veteranos de git y por los nóveles que no hayan conocido cómo solucionarlo.

En nuestro trabajo diario, tenemos que compartir uno o varios cambios que están en el histórico de git o en una rama local de trabajo y queremos compartir esos combios ya sea como solución a un problema o para pasarle una tarea a un compañero o lo que sea, ¿cómo lo hacemos?

Continue reading

Añadir origen de nuget por defecto

Problema

Recientemente he tenido que reinstalar mi equipo de trabajo, y comprobando que la nueva instalación funcionaba como la anterior me he encontrado que al recompilar un proyecto hecho con .NET5 no compilaba (le falta encontrar los origenes de Nuget), dando el siguiente mensaje:

Continue reading

Instalar Oh My Posh y personalizar el prompt del terminal

Introducción

Oh My Posh es un motor para el prompt del terminal de windows, que permite ser personalizado para cualquier shell que tenga la capacidad de ajustar la cadena de solicitud con una función o variable (usaremos powershell).

Es muy útil si programas y usas GIT porqué te muestra información útil, depende del tema que se use, pero si estás en un directorio en un repo git, la rama de trabajo, cuantos commits estás por detras del remote, cuantos ficheros pendietes de commit, si ha habido un error, y más …

El objetivo es tener un prompt (parecido, no esté en concreto necesariamente) como sl siguiente:

Continue reading

Cómo unir commits en git en uno sólo [ACTUALIZADO]

En ocasiones ocurre que necesitamos juntar varios commits the git. Casó típico: en tu trabajo diario con git vas cumpliendo poco a poco mini hitos que te pones, pero a la hora de compartir el trabajo o de enviar los cambios a un repositorio compartido sólo se permite enviar el trabajo en un único commit agrupado.

¿Cómo solucionarlo? La solución se llama hacer un squash de los commits.

Continue reading

Log de mensajes HTTP en Mule 4

Introducción

Mule es ESB (Enterprise Service Bus) Se usa para enviar/recibir mensajes heterogéneos entre diferentes productos/consumidores.

Admite muchos componentes de transporte y servicio como JMS, SOAP, JBI, BPEL, EJB, AS/400, HTTP, JDBC, TCP, UDP, SMTP, FILE, FTP y más.

Como en Internet el idioma padre es HTTP vamos a ver cómo hacer logging de las peticiones y respuestas HTTP que pasan por mule.

Continue reading

Configurar SSH para usar diferentes pares de claves con bitbucket y otros servicios git [ACTUALIZADO]

Introducción

Normalmente uso git como herramienta de control de código fuente. Por lo general el escenario que me he encontrado es una única cuenta en mi equipo. Ya que en equipo personal hago mis pruebas con bitbucket y en el trabajo con el servidor GIT que ponga a mi disposición la empresa.

En la actualidad, trabajo con un servidor GIT centralizado pero algunas entidades con las que colaboramos en el trabajo tienen sus propios servidores GIT. Esto plantea un escenario nuevo. Ya que si usas git sobre protocolo HTTP te da igual pero hoy en día por cuestiones de seguridad es muy recomendable SSH y en este caso es donde aparece el “problema”.

No es un problema, claro, pero para poder trabajar contra varios servidores con claves de acceso RSA para SSH diferentes es necesario configurar un poco el equipo. El siguiente ejemplo lo he hecho en Windows 10 con Git Bash pero en un shell de GNU/Linux o macOS sugpongo que irá igual (o muy parecido).

Continue reading

Para que sirve using en c#

La instrucción using:

using(var disposableObject = new object_that_implements_IDisposable()) { ... }

es una construcción usada para ahorra código al usar una estructura que implemente IDisposable cómo esta:

var disposableObject = new object_that_implements_IDisposable()
try
{
    ...
}
finally
{
    if(disposableObject != null)
    {
        ((IDisposable)your_object).Dispose();
    }
}

Esta instrucción sólo tiene sentido para declarar objetos que implementen el interfaz IDisposable

Referenciausing (Instrucción, Referencia de C#)

Obtener vistas relacionadas en Oracle

Introducción

En ocasiones estamos manejado vistas o elementos de PL/SQL que necesitamos saber que relación existe entre ellos. Para esto oracle nos ofrece la vista user_dependencies que relaciona un objeto (vista, package, function, procedure) con otro si éste es dependencia de otro.

Caso de pruebas

Supongamos una vista ALUMNOS que se usa para hacer consulta, se consume en 1 procedure y 1 function. Si ejecutamos una consulta como la siguiente:


SELECT * FROM user_dependencies
  START WITH name = 'ALUMNOS'
  CONNECT BY PRIOR TRIM(referenced_name) = TRIM(name);

Obtendremos un resultado como el siguiente, donde veremos en la columna de la izquierda para cada ocurrencia de la izquierda en que elemento de la derecha esta como una dependencia.

Referencias

  1. USER_DEPENDENCIES:
    https://docs.oracle.com/cd/B28359_01/server.111/b28320/statviews_5252.htm
  2. ALL_DEPENDENCIES:
    https://docs.oracle.com/cd/B28359_01/server.111/b28320/statviews_1066.htm#i1576452

SQL Join: ¿Cual usar?

Introducción

Hace unos días tuve una conversación muy recurrente entre desarrolladores de software respecto del uso cotidiano de SQL. ¿Cómo usar JOIN? Esta duda la tienen aún desarrolladores expertos, pues bien vamos a aclarar un poco que es eso del JOIN.

Como breve resumen, decir que JOIN se usa en SQL para combinar filas de dos o más tablas. Y es una sentencia con tantas posibilidades que realmente se merece una explicación en una única entrada de este blog.

La sentencia JOIN como una expresión algebraica

Si tomamos cada tabla de la base de datos como un conjunto de datos donde cada columna posee su propio dominio definimos el operador como el JOIN para el conjunto de tuplas a relacionar (no deja de ser una composición):

De modo que R y S son dos tablas, y t y s son filas de cada tabla que se unirán si se cumple la condición dada. Y lo más fácil es ver el siguiente dibujo que representa los diferentes tipos de JOINS que existen conceptualmente (no todas los sistemas gestores de base de datos los soportan) y su representación aproximada como diagrama de Venn:

En este dibujo podemos ver gráficamente la idea de cada tipo de JOIN, filas que se relacionan en ambas tablas (conjuntos), filas que no tengan relación y estén en una tabla pero sí en la otra. O al revés, filas que no estén en la primera tabla y sí en la segundo, y en fin … todas las combinaciones que muestra el gráfico.

Por cierto, si se hace una composición de dos tablas con JOIN y la fila compuesta devuelta es resultado de una relación donde para una tabla hay datos y en la segunda tabla no existe relación, los campos de esa segunda tabla devueltos serám NULL.

Para leer más sobre algebra relacional recomiendo los apuntes de Pedro Pablo Alarcón Cavero [4], buen material docente sin duda. Pero todo esto es mejor analizarlo con un buen ejemplo.

Caso práctico

Si accedemos a la Web de W3Schools, tiene una base de datos de ejemplo donde podemos probar online difernetes sentencias SQL [Acceso a la BD en W3Schools].

Tablas de datos básicas

En este apartado primero vamos a ver una muestra de los datos que contienen las tablas, en la mayoría de casos vamos a ver una SELECT y los primeros registros que devuelve la base de datos, para mas información consultar el enlace “Acceso a la DB de W3Schools”.

Listado de Clientes

select * from Customers
CustomerID CustomerName ContactName Address City PostalCode Country
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

(Devuelve 91 clientes)

Listado de Empleados

select * from Employees
EmployeeID LastName FirstName BirthDate Photo Notes
1 Davolio Nancy 1968-12-08 EmpID1.pic Education includes a BA in psychology from Colorado State University. She also completed (The Art of the Cold Call). Nancy is a member of ‘Toastmasters International’.
2 Fuller Andrew 1952-02-19 EmpID2.pic Andrew received his BTS commercial and a Ph.D. in international marketing from the University of Dallas. He is fluent in French and Italian and reads German. He joined the company as a sales representative, was promoted to sales manager and was then named vice president of sales. Andrew is a member of the Sales Management Roundtable, the Seattle Chamber of Commerce, and the Pacific Rim Importers Association.

(Devuelve 10 empleados)

Listado de Transportistas

select * from Shippers
ShipperID ShipperName Phone
1 Speedy Express (503) 555-9831
2 United Package (503) 555-3199
3 Federal Shipping (503) 555-9931

(Devuelve 3 transportistas)

Listado de Pedidos

select * from Orders
OrderID CustomerID EmployeeID OrderDate ShipperID
10248 90 5 1996-07-04 3
10249 81 6 1996-07-05 1
10250 34 4 1996-07-08 2

(Devuelve 196 pedidos)

Obtener los pedidos de cada cliente

Este es el ejemplo que ofrece W3SChools:

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;
OrderID CustomerName OrderDate
10248 Wilman Kala 1996-07-04
10249 Tradição Hipermercados 1996-07-05
10250 Hanari Carnes 1996-07-08
10251 Victuailles en stock 1996-07-08

(Mostramos los 4 primeros, hay 196 resultados)

Obtener los clientes que nunca han hecho un pedido

Ahora vamos a pensar en la tabla clientes y en pedidos. En pedidos se registran los pedidos y qué cliente lo realiza, pero … ¿cómo saber qué clientes no han hecho aún un pedido?

SELECT c.CustomerID AS CodigoCliente, c.CustomerName, o.CustomerID AS ClienteEnPedido
FROM Customers AS c
LEFT JOIN Orders AS o ON c.CustomerID=o.CustomerID
WHERE o.OrderID IS NULL;
CodigoCliente CustomerName ClienteEnPedido
1 Alfreds Futterkiste null
6 Blauer See Delikatessen null
12 Cactus Comidas para llevar null
22 FISSA Fabrica Inter. Salchichas S.A. null
26 France restauration null
32 Great Lakes Food Market null
40 La corne d’abondance null
42 Laughing Bacchus Wine Cellars null
43 Lazy K Kountry Store null
45 Let’s Stop N Shop null
50 Maison Dewey null
53 North/South null
57 Paris spécialités null
64 Rancho grande null
74 Spécialités du monde null
78 The Cracker Box null
82 Trail’s Head Gourmet Provisioners null

De los 91 clientes que hay, estos 17 no tiene pedidos realizados. Además podemos ver cómo la columna con el ID de cliente en pedidos obtenida con este JOIN vale NULL, con lo que sabemos que existe relación.

Obtener los empleados que no han hecho ventas

Este es otro ejemplo cómo el anterior:

SELECT e.EmployeeID, e.FirstName
FROM Employees AS e
LEFT JOIN Orders AS o ON e.EmployeeID=o.EmployeeID
WHERE o.EmployeeID IS NULL;
EmployeeID LastName FirstName BirthDate Photo Notes
10 West Adam 1928-09-19 EmpID10.pic An old chum.

Adam West es el único cliente que no ha registrado pedidos en la base de datos.

Obtener qué pedidos ha hecho Nancy

Este caso es el mismo que obtener los pedidos de cada cliente, pero añadiendo un flltro por empleado.

SELECT e.EmployeeID, e.FirstName, o.OrderID
FROM Employees AS e
INNER JOIN Orders AS o ON e.EmployeeID=o.EmployeeID
WHERE e.FirstName = 'Nancy';
EmployeeID FirstName OrderID
1 Nancy 10258
1 Nancy 10270
1 Nancy 10275
1 Nancy 10285
1 Nancy 10292

Muestro los 5 primeros pedidos, pero Nancy ha hecho 29 pedidos.

Conclusión

JOIN es una clausula para las consultas SELECT que enrique mucho el lenguaje SQL, permite realizar consultas para diferentes casos muy interesantes sin tener que recurrir a escribir consultas muy complicadas.

Ejemplos para analizar el uso de JOIN hay muchos y en Google podemos encontrar muchos, espero que este resumen sirva de ayuda.

Referencias

  1. Join en Wikipedia: http://es.wikipedia.org/wiki/Join
  2. Join en W3SChoolshttp://www.w3schools.com/sql/sql_join.asp
  3. Manual de MySQL5 – Sentencia JOIN: http://dev.mysql.com/doc/refman/5.0/es/join.html
  4. Para leer algo más sobre algebra relacional (con permiso de Pedro Pablo Alarcón Cavero ): http://www-oei.eui.upm.es/Asignaturas/BD/BD/docbd/tema/algebra.pdf

Leer XML con namspaces fácil en PHP

Introducción

Cuando manipulamos documentos XML [1] desde PHP [2] uno de los “quebraderos” de cabeza son los namespaces. Un namespace no es nada complicado ni rocambolesco como algunos opinan; no deja de ser un enriquecimiento semántico para dotar de más información a un documento XML.

Tradicionalmente los desarrolaldores PHP no se han complicado con este concepto. Pero hoy en día con la cantidad de mensajes y documentos XML que envían mediante REST, SOAP, APIs de terceros, etc. es inevitable y totalmente recomendable conocer como manipularlos de forma sencilla en PHP.

Caso de uso: Google shopping

Por lo general cualquier documento XML generado por y para Google tendrá en namespace http://base.google.com/ns/1.0, que simplemente añade algo de información adicional al documento XML (descripciones, items, ….) [4].

Cómo ejemplo vamos a manipular un documento para el servicio Google Shopping [3].

<?xml version="1.0"?>

<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
    <channel>
        <title>El nombre de tu feed de datos</title>
        <link>http://www.example.com</link>
        <description>Una descripción de tu contenido</description>
        <item>
            <title>Suéter de lana rojo</title>
            <link> http://www.example.com/página-información-producto1.html</link>
            <description>Suéter suave y cómodo que te abrigará en las frías noches de                         
            invierno</description>
            <g:image_link>http://www.example.com/imagen1.jpg</g:image_link>
            <g:price>25</g:price>
            <g:condition>nuevo</g:condition>
            <g:id>1a</g:id>
        </item>
    </channel>
</rss>

Si leyéramos este documento directamente con SimpleXML no entendería los namespaces ni sus elementos, quedan este documento:

<?xml version="1.0"?>

<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
    <channel>
        <title>El nombre de tu feed de datos</title>
        <link>http://www.example.com</link>
        <description>Una descripción de tu contenido</description>
        <item>
            <title>Suéter de lana rojo</title>
            <link> http://www.example.com/página-información-producto1.html</link>
            <description>Suéter suave y cómodo que te abrigará en las frías noches de                         
            invierno</description>

        </item>
    </channel>
</rss>

¿Cómo solucionarlo? Un ejemplo tonto sería la siguiente función que dado un elemento de un documento XML con SimpleXML busca los elementos del namespace http://base.google.com/ns/1.0. Obtenidos los elementos de este namespace en ese nodo, sólo debemos recoger la propiedad deseada (precio).

function xml_get_price(SimpleXMLElement $item)
{
    $googleSpace  = $item->children('http://base.google.com/ns/1.0');
    return $googleSpace->price; // para el ejemplo anterior: 25
}

¡Fin! Espero que sea útil.

Referencias

  1. XML 1.0 (w3c): http://www.w3.org/TR/REC-xml/
  2. PHP SimpleXML: http://php.net//manual/es/book.simplexml.php
  3. Google Shopping: https://www.google.es/shopping
  4. Google Merchants Expecificacion RSS 2.0: https://support.google.com/merchants/answer/160589?hl=es