AndroidWebServer

La aplicación

Para construir un servidor web es necesario contar con un programa que haga las veces de “servidor”, es decir, que esté escuchando siempre en uno o varios sockets a la espera de algún cliente para servirle la información solicitada.
La interfaz gráfica será muy sencilla, una etiqueta para mostrar la IP del servidor, un botón para encender o apagar el servidor web y una consola para ver que es lo que está sucediendo, es decir llevar un registro de eventos.

Super query sobre Northwind

Antiguamente, en mis clases en UPIITA el profesor Carlos de la Cruz había pedido un query sobre la base de datos Northwind que nos devolviera las órdenes que tuvieran dos productos iguales, en aquel momento no pude hacerlo (t_t), pero ahora que lo ha vuelto a pedir en el grupo de mi maigo @Rosend_mc, me lo tomé personal y aquí está.

La consulta nos regresará pares de órdenes, con al menos dos productos iguales, sé que es enooorme y que seguro hay una solución mejor pero como siempre digo: por algo se empieza. Dejo el Script en SQL y un PDF en el que intento explicar los detalles de la consulta.

Descargar PDF con la explicación
SELECT DISTINCT O1.Or1
 ,O2.Or2
FROM (
 SELECT OD1.OrderID Or1
  ,OD2.OrderId Or2
  ,OD1.ProductID
  ,OD2.ProductID P1
 FROM [Order Details] OD1
 INNER JOIN [Order Details] OD2
  ON OD1.ProductID = OD2.ProductID
   AND OD1.OrderID <> OD2.OrderID
 WHERE OD1.OrderID IN (
   SELECT OD.OrderID
   FROM [Order Details] OD
   GROUP BY OD.OrderID
   HAVING COUNT(OD.ProductID) >= 2
   )
  AND OD2.OrderID IN (
   SELECT OD.OrderID
   FROM [Order Details] OD
   GROUP BY OD.OrderID
   HAVING COUNT(OD.ProductID) >= 2
   )
 ) O1
INNER JOIN (
 SELECT OD1.OrderID Or1
  ,OD2.OrderId Or2
  ,OD1.ProductID
  ,OD2.ProductID P2
 FROM [Order Details] OD1
 INNER JOIN [Order Details] OD2
  ON OD1.ProductID = OD2.ProductID
   AND OD1.OrderID <> OD2.OrderID
 WHERE OD1.OrderID IN (
   SELECT OD.OrderID
   FROM [Order Details] OD
   GROUP BY OD.OrderID
   HAVING COUNT(OD.ProductID) >= 2
   )
  AND OD2.OrderID IN (
   SELECT OD.OrderID
   FROM [Order Details] OD
   GROUP BY OD.OrderID
   HAVING COUNT(OD.ProductID) >= 2
   )
 ) O2
 ON O1.Or1 = O2.Or1
  AND O1.Or2 = O2.Or2
  AND O1.P1 <> O2.P2

Si lo mejoran no duden en pasarme su script.


¡Saludos!
@fferegrino :)

Usando OneNote en la escuela

Ahora que he regresado a la escuela he decidido usar OneNote para tomar mis apuntes, he de aprovechar que ahora curso asignaturas que tienen que ver por completo con el desarrollo de sistemas informáticos. Por el momento es un poco extraño oír solo las digitaciones mientras otros rasgan sus hojas con bolígrafos. Ya me acostumbraré.

Tampoco es que sepa aprovechar al 100% la plataforma de OneNote, pero de a poco se aprende (¿¡cómo inserto un dibujo en una hoja?!).

Ah, se me olvidaba, acá el link a los apuntes: Bloc de notas ESCOM_3, desde luego, se actualiza diario... o cada vez que tomo notas ;)

¡Saludos!
@fferegrino :)

Envío de correos "desde la base de datos" con .NET

Seguro hay otras maneras de hacerlo, pero cuando tienes que hacerlo rápido no hay muchas opciones, hablo de enviar correos periódicamente desde datos tomados de la base de datos.

Forma de uso
La solución que aquí propongo es de cierta manera "dinámica", ya que podemos usar este programita para enviar tantos correos como deseemos, lo único que necesitamos hacer es enviarle como parámetro el stored procedure del cual consultará los datos, el procedimiento le deberá devolver estas tres columnas al programa:

  • DESTINATARIOS: Una columna que contiene los correos a los cuales será enviado el mensaje. Los correos deberán ir separados por un ;.
  • ASUNTO: Contiene el asunto con el que será enviado el correo.
  • MENSAJE: El mensaje que contendrá el correo, puede ser HTML (recomiendo sea básico).



Como mencioné al principio de todo: probablemente haya mejores maneras de hacerlo ya que de esta manera dejamos toda la carga a la BD ya que es ella quien tendría que formar el mensaje, el dinamismo del que hablo radica en que nosotros podemos, con la ayuda del stored procedure sacar cualquier información que necesitemos de la base.

La forma de usar el programa es la siguiente:
$ SendMails storedProcedure
La mejor parte es que gracias a las tareas de Windows podemos programar el programa para que se ejecute periódicamente, tantas veces como deseamos y con un procedimiento distinto para enviar correos distintos cada ocasión.

Para configurarlo necesitamos poner nuestra cadena de conexión en el archivo app.config, así como los parámetros para enviar el correo, como el host, usuario, puerto...
<configuration>
  <appSettings>

    <add key="mailHost" value="smtp.gmail.com"/>
    <add key="mailUser" value="ejemplo@gmail.com"/>
    <add key="port" value="587"/>
    <add key="ssl" value="true"/>
    <add key="user" value="ejemplo@gmail.com"/>
    <add key="password" value="random*Pass"/>

  </appSettings>
  <connectionStrings>
    <add name="CON" connectionString="Data Source=localhost\SQL;Initial Catalog=DB;User ID=US;Password=PSWD" 
        providerName="System.Data.SqlClient"/>
  </connectionStrings>
</configuration>

SendMailsApp (Se incluyen las librerías de Microsoft Practices necesarias para que el programa funcione).

¿Tienes alma de desarrollador?

Si necesitas algo más especializado te dejo el código la solución del programa hecho en C# y con Visual Studio  para que lo modifiques a tu gusto.

Cualquier duda o comentario siempre es bienvenido :)

SendMailsSource (Se necesitan algunas librerías de Microsoft Practices incluídas en el enlace de arriba).

¡Saludos!
@fferegrino :)

ediThor se muda a GitHub


Tiene rato ya que les había contado de ediThor, el editor de texto concurrente que en equipo programamos unos compañeros y yo para una asignatura en la UPIITA.

Pues resulta que en aquellos tiempos era un novato (más) en esto de compartir código en línea, ahora que ya me "enseñaron" a usar GitHub, he decidido mudar el proyecto a un repositorio en la plataforma. Cabe destacar que no es el ediThor (beta) del que se habla en la entrada anterior porque decidí reescribirlo todo (porque de igual manera el nivel de mi nuestra programación estaba bastante decadente en esos tiempos), eso sí, lo de beta aún no se le quita, "está chavo todavía" diría yo.

Pues así las cosas, si algún javamaniaco quisiera unirse al desarrollo del proyecto ya sabe en donde encontrarme. Con gusto colaboramos.

El repositorio es:



¡Saludos!
@fferegrino :)

La importancia de programar con estilo


Y al decir "programar con estilo" no me refiero a que estén todo el tiempo con los meñiques levantados, o sólo hacerlo las tardes a las 5 p.m.

Programar con estilo es hacer nuestros programas legibles, lo más documentados que podamos y siguiendo las convenciones que algunas comunidades de programadores suelen adoptar para que nuestro código sea "universal".

Si bien dicen que cada programador tiene su forma de hacer lo suyo (en lo cual creo que tienen razón), esto a veces se convierte en un problema cuando de optimizar, corregir o ampliar el código se trata. En el mejor de los casos recordaremos por completo lo que la variable asdflkj significa en nuestro código, pero imagínate que ya no recuerdas y tienes que andarle buscando por todos lados lo que realmente quisiste hacer. O PEOR AÚN: Imagínate que lo que tu desarrollaste hace tiempo ahora es responsabilidad de alguien más, ¡pobre de él!

"Pues mientras funcione", aplica, sí. Hay veces en las que es necesaria hacer una corrección rápida (bomberazo, le dicen), pero al final del día no olvides regresar y hacerlo de la manera correcta. Créeme te facilitarás la vida a ti y probablemente a tus colegas.

Creo que el problema viene desde las escuelas, por lo general al momento de entregar nuestros proyectos, tareas, prácticas, etc. nos conformamos con el "pues, funciona", esto debido a que pocas veces se trabaja varias veces sobre la misma cosa. Son entregas únicas y es por eso que prestamos muy poca atención a la manera en las que las hacemos. El ideal sería que al inicio del curso definiéramos sobre qué vamos a estar trabajando (una especie de proyecto a largo plazo) para forzarnos a darle mantenimiento al código, a mejorarlo  y por tanto hacer las cosas bien.

Ayudará bastante si en un momento dado entramos al mundo laboral en el cual sí se desarrolla constantemente sobre un mismo programa, el cual debería estar bien documentado y entendible para que pueda ser trabajado por varias manos, manos a las cuales les resulte sencillo manipularlo y no se pierda tiempo en preguntarle al de al lado "¿y esto qué hace?" o quedarnos rascando la cabeza un buen rato preguntándonos "¿para qué usé esto?".

Para nuestra fortuna existen algunas guías de estilo que nos muestran algunas de las convenciones acordadas, las cuales podemos no aceptar por completo desde el inicio sí es importante tenerlas en cuenta. Claro que uno puede inventar sus propias normas, lo importante es respetarlas siempre.

Amigo programador, te dejo unas guías de estilo que me encontré por ahí (cofcofintercofcofnetcof), recuerda que seguro hay alguna para tu lenguaje favorito.


Guía 1 C++Guía 2 C++Guía 3 C++Guía 1 C#Guía 2 C#Guía 1 JavaGuía 2 JavaGuía 1 PHPGuía 2 PHPGuía Phyton.

¡Saludos!

@fferegrino :)

De C a HTML con Flex (como Norman manda)

Ya hace unos días les había hablado de flex y la práctica que teníamos que hacer. Bien, resulta que apenas se entrega. Y no es como inicialmente la había hecho:

Lo que había hecho fue de manera individual y esta que subo hoy es en equipo (Mi equipo: Byron, Gaby y Robert).
Las funciones que escriben el archivo html están por separado. Para mejor explicación visita el post anterior.

Descargas
PracticaC2HTML.tar.gz
PracticaC2HTML.zip


¡Saludos!
@fferegrino :)