<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel Yafacb</title>
    <description>The latest articles on DEV Community by Daniel Yafacb (@danielyafacb).</description>
    <link>https://dev.to/danielyafacb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F444578%2F5b5614f8-926a-4a66-a462-4b43420fa929.jpeg</url>
      <title>DEV Community: Daniel Yafacb</title>
      <link>https://dev.to/danielyafacb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielyafacb"/>
    <language>en</language>
    <item>
      <title>MS-SQL, React, Fetch ... Mostrar imagen desde un campo tipo Imagen</title>
      <dc:creator>Daniel Yafacb</dc:creator>
      <pubDate>Fri, 25 Oct 2024 18:20:58 +0000</pubDate>
      <link>https://dev.to/danielyafacb/ms-sql-react-fetch-mostrar-imagen-desde-un-campo-tipo-imagen-13ji</link>
      <guid>https://dev.to/danielyafacb/ms-sql-react-fetch-mostrar-imagen-desde-un-campo-tipo-imagen-13ji</guid>
      <description>&lt;p&gt;No es una gran idea el tener un campo de base de datos donde se almacene una fotografía o cualquier otro tipo de archivo. Pero como programador uno debe adaptarse a las necesidades en cualquier escenario.&lt;/p&gt;

&lt;p&gt;A continuación la estructura de los datos. Se asume que luego se ha creado un procedimiento almacenado llamado APL_WEB_TRABAJADOR_FOTO el cual devuelve el campo llamado "imagen".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fur93rvkiizwmong6ofnd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fur93rvkiizwmong6ofnd.jpg" alt="Image description" width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend&lt;/strong&gt;: Al devolver los datos desde backend, este debe ser usando .send, como este ejemplo:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
export const getPersonalFoto = async (req, res) =&amp;gt; {&lt;br&gt;
  const cnServidor = await getConnection();&lt;br&gt;
  const result = await cnServidor&lt;br&gt;
    .request()&lt;br&gt;
    .input("CODTRAB", sqlRef.VarChar, req.params.codtrab)&lt;br&gt;
    .query("EXEC APL_WEB_TRABAJADOR_FOTO @CODTRAB");&lt;br&gt;
  res.send( result.recordset[0].imagen );&lt;br&gt;
};&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Primero debemos comprobar que nuestro Backend funciona correctamente, para esto, usaremos Postman y aquí muestro el resultado que debería tener un parecido a lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2857pq55fqi05r83uux.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2857pq55fqi05r83uux.jpg" alt="Image description" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto ratifica que el Blob funciona ... &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j6l7axej67yg3a2c2ve.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j6l7axej67yg3a2c2ve.jpg" alt="Image description" width="638" height="721"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>sqlserver</category>
    </item>
    <item>
      <title>React: Como llenar un Select/Option Padre-Hijo</title>
      <dc:creator>Daniel Yafacb</dc:creator>
      <pubDate>Sat, 01 Aug 2020 03:30:01 +0000</pubDate>
      <link>https://dev.to/danielyafacb/react-como-llenar-un-select-option-padre-hijo-2p3l</link>
      <guid>https://dev.to/danielyafacb/react-como-llenar-un-select-option-padre-hijo-2p3l</guid>
      <description>&lt;p&gt;&lt;br&gt;
How to populate a Select/Option with Father-Children&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Llenar un "combobox", el mismo que en HTML se llama "Select" y a sus items, se les denomina "Options" es algo complicado con React. &lt;br&gt;
En mi base de datos, a manera de reto, utilicé una colección (tabla en SQL) con 2 campos: Nombre de la clase y una lista de las sub clase (una relación padre-hijo, uno a varios), que realmente en Firebase es un campo de tipo Array.&lt;br&gt;
Por ejemplo la clase "TV &amp;amp; Entertaiment", tendría una sub-clase de "Television", "Media Players", "Gaming", "Accesories", etc ...&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l3TsKDaa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oqfdsdtqk2hj301vltb5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l3TsKDaa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oqfdsdtqk2hj301vltb5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo más fácil era realizar un método que reacciones después del clic sobre un Select para que retorne desde la base de datos los valores de la Sub Clase .. sin embargo, cuando utilizas servicios On-Line, como Firebase, te van a cobrar por cada "transacción" que realices, por lo tanto debes ingeniarte en procurar invocar pocas veces a los servicios.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    const QUERY_CLASS = gql`
        query{
            Gear_ClassAll{
                clase_nombre
                sub_clase
            }
        }
    `;
    const { loading, error, data } = useQuery(QUERY_CLASS)
    if (loading) return &amp;lt;p&amp;gt;Loading...&amp;lt;/p&amp;gt;
    if (error) return &amp;lt;p&amp;gt;Error :(&amp;lt;/p&amp;gt;
    let arrClases = data.Gear_ClassAll
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;La sentencia de arriba, es una expresión de un ESQUEMA de GraphQL que le permite al cliente obtener los datos.&lt;br&gt;
clase_nombre es un campo de tipo String&lt;br&gt;
sub_clase es un campo de tipo Array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;FormControl as="select"
    value={clase}
    onChange ={(e) =&amp;gt; fnLlenarSubClases(e)}&amp;gt;
    &amp;lt;option value=""&amp;gt;Select a item ...&amp;lt;/option&amp;gt;
    {arrClases.map((item, index) =&amp;gt; {
        return &amp;lt;option key={`op${index}`}
            data-tag={item.sub_clase.toString()}
        &amp;gt;{item.clase_nombre}&amp;lt;/option&amp;gt;
    })}
&amp;lt;/FormControl&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;{clase} es una variable de estado, que contiene el nombre y valor del padre. Debido a que el control HTML SELECT permite atributos personalizados donde puedes almacenar cualquier información, vamos a colocar en el atributo data-tag (puede llamarse data-array o data-elementos) el array de sub elementos del padre, o sea los hijos. Para eso convertimos el array, en una cadena con separaciones de ","&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data-tag={item.sub_clase.toString()}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ahí radica la magia. Luego cuando el usuario selecciona un elemento del padre, de-construimos la cadena almacenada en el atributo mediante la función .split() y la asignamos a una variable de estado, para que REACT se encargue de construir nuevamente las opciones del Select hijo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    function fnLlenarSubClases(e) {
        setclase(e.target.value);
        if (e.target.value) {
            setarrSubClases(e.target.options[e.target.selectedIndex].getAttribute("data-tag").split(","))
        } else {
            setarrSubClases([])
        }
        setsub_clase("")
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Abajo, la construcción del SELECT hijo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;FormControl as="select"
    value={sub_clase}
    onChange={(e) =&amp;gt; setsub_clase(e.target.value)}&amp;gt;
    &amp;lt;option&amp;gt;Select a item ...&amp;lt;/option&amp;gt;
    {arrSubClases.map((item, index) =&amp;gt; {
        return &amp;lt;option key={index}&amp;gt;{item}&amp;lt;/option&amp;gt;
    })}
&amp;lt;/FormControl&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>react</category>
      <category>graphql</category>
      <category>select</category>
      <category>option</category>
    </item>
    <item>
      <title>Proyecto: Gear</title>
      <dc:creator>Daniel Yafacb</dc:creator>
      <pubDate>Sat, 01 Aug 2020 02:21:58 +0000</pubDate>
      <link>https://dev.to/danielyafacb/proyecto-gear-580j</link>
      <guid>https://dev.to/danielyafacb/proyecto-gear-580j</guid>
      <description>&lt;p&gt;Tengo otra carrera profesional: La fotografía (&lt;a href="https://danielyafacb.tumblr.com"&gt;https://danielyafacb.tumblr.com&lt;/a&gt;). Y lógico en mis almacenes tengo mucho equipo, a la cual siempre le he prestado mucho cuidado (pues cuestan mucho dinero). He buscado alguna APP que me solucione el control o gestión de mis activos pero no he encontrado uno a mi gusto, así que haré uno a mi gusto ... por yo quiero, y porque - creo - que yo puedo.&lt;br&gt;
Lo llamaré: Apliset Gear (no pregunten que significa Apliset).&lt;/p&gt;

&lt;p&gt;Estoy utilizando:&lt;/p&gt;

&lt;p&gt;Apple iMac 27"&lt;br&gt;
VS Code (Después de VBA, lo mejor de Windows)&lt;br&gt;
Google Firebase: Firestore + Search Customer + Storage + Auth&lt;br&gt;
Express&lt;br&gt;
Nodemon&lt;br&gt;
Babel&lt;br&gt;
React&lt;br&gt;
React-Router&lt;br&gt;
Apollo Client 3.0&lt;br&gt;
Axios&lt;br&gt;
FortAwesome&lt;br&gt;
React-Bootstrap&lt;/p&gt;

&lt;p&gt;Y dejé de usar React-Apollo y ahora soy full Hooks!&lt;/p&gt;

</description>
      <category>proyecto</category>
      <category>react</category>
      <category>apollo</category>
      <category>graphql</category>
    </item>
    <item>
      <title>¿Porqué hoy soy fans de React, GraphQL y Firebase?</title>
      <dc:creator>Daniel Yafacb</dc:creator>
      <pubDate>Fri, 31 Jul 2020 22:24:49 +0000</pubDate>
      <link>https://dev.to/danielyafacb/porque-hoy-soy-fans-de-react-graphql-y-firebase-3ne3</link>
      <guid>https://dev.to/danielyafacb/porque-hoy-soy-fans-de-react-graphql-y-firebase-3ne3</guid>
      <description>&lt;p&gt;Ya con una amplia experiencia de trabajo en el desarrollo de soluciones bajo plataformas Windows y con un buen producto bajo la manga, que me brinda dinero extra y seguridad (en caso de desempleo) .. me pregunté un día si estaba correcto continuar programando en .Net y SQL Server (últimas versiones). Sumado a que me preocupaba mucho la lentitud de las respuestas de IIS (si, el servidor web de Windows), la gran inversión en adquirir nuevas licencias para el virtualizador y licencias SQL para cluster ... asomé mi atención sobre algunas otras alternativas. Y pues empecé a estudiar nuevamente, al estilo de ahora: por Youtube.&lt;/p&gt;

&lt;p&gt;Encontré muchos capos y empecé a programar mis “HOLA MUNDO“ en muchos lenguajes - no tantos la verdad - Python, Angular, Go, Rust ... hasta que llegué a uno del cual muchos hablaban ... NODE JS, y descubrí que junto a otros complementos como Express y React estaban dominando al mundo ... era otra pandemia que tenía años en el mercado, y que yo - muy mal - los había ignorado.&lt;/p&gt;

&lt;p&gt;Poco a poco llegaron conceptos nuevos como Contenedores o Kubernetes, Docker, Amazon ... Firebase .. con dicha herramienta de Google puse mucho énfasis ... nadie más que una gran empresa para un gran producto. Una base de datos NO-SQL que sería todo lo que yo andaba buscando. Goodbye SQL, muérdete tus índices, roles, collate y la maldita lentitud en tus operaciones. Good bye ASP.Net, espero que JSON les corte la cabeza muy pronto. Aunque tendré que seguir trabajando con ellos por unos meses hasta migrar todo.  &lt;/p&gt;

&lt;p&gt;Ahora, React ... fue agradable encontrar mucha información ... abundante, vigente, y prometedora. A pesar que aún no lo domino, ya gozo de sus potenciales. Especialmente la gran cantidad de paquetes FREE que empoderizan su nombre ... pero hasta ahora no ha existido un solo tema o pregunta que no haya encontrado respuesta en la nube. Gracias a todos los que publican.&lt;/p&gt;

&lt;p&gt;GraphQL ... aquella interface entre tus APPS y la Data, que te aseguran portabilidad - un lenguaje de consultas para cualquier base de datos. Código abierto desarrollado por Facebook. &lt;/p&gt;

&lt;p&gt;Indagando como usar MS-SQL Server en la web, llegué a Firebase, sin pagar licencias de servidor, sin pagar licencias por microprocesador, por region, por usuario ... muy aparte que Firebase te brinda todo el potencial para tus apps como almacenamiento, seguridad y todas las API del mundo de Google (Drive, Search, Docs, Maps, etc).&lt;/p&gt;

</description>
      <category>react</category>
      <category>graphql</category>
      <category>firebase</category>
      <category>docker</category>
    </item>
    <item>
      <title>React ... para Novatos de los 90’</title>
      <dc:creator>Daniel Yafacb</dc:creator>
      <pubDate>Fri, 31 Jul 2020 21:21:58 +0000</pubDate>
      <link>https://dev.to/danielyafacb/react-para-novatos-de-los-90-2ggj</link>
      <guid>https://dev.to/danielyafacb/react-para-novatos-de-los-90-2ggj</guid>
      <description>&lt;p&gt;Hola, esta serie de post, tienen como objetivo (aparte de hacerme recordar) ayudar a quienes, como yo, mayor de 40 años, con experiencia en la programación estructurada, de aquellos donde existía un Main() en tu proyecto ... de aquellos que nacieron con Turbo Basic, Turbo Pascal .. C++ &lt;/p&gt;

&lt;p&gt;Espero sea de su utilidad&lt;/p&gt;

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