miércoles, 6 de abril de 2016

Configuración de Windows 2008 server

En el manual que se puede descargar más abajo, se encuentra una explicación básica, de como configurar algunas de las funciones de un sistema Windows 2008 Server.

El índice del manual es el siguiente:

0.- Pasos previos
1.- Instalación de Active Directory
2.- Creación de usuarios y grupos
3.- Adición de un equipo cliente al dominio
4.- Creación de un RAID5
5.- Directorios compartidos, auditorías y cuotas de disco
6.- Instalación y configuración de un servidor de impresión
7.- Instalación y configuración de Terminal Server
8.- Limitar acciones a los usuarios
9.- Instalación automática de programas
10.- Instalación de servidor web y FTP






Este manual fue desarrollado como parte de un trabajo para el Ciclo Formativo de Grado Superior de Desarrollo de Aplicaciones Multiplataforma. El interés del mismo es meramente instructivo, y es posible que haya datos que no sean del todo correctos.

miércoles, 10 de febrero de 2016

Informes en VB.net

Hay distintas maneras de realizar informes en VB.net. En esta entrada se va a explicar como realizarlos con y sin Crystal Report.
Para el desarrollo de esta entrada, se va a partir desde un conocimiento básico de VB.net, así como de sentencias MySQL, y se realizará con Microsoft Visual Studio 2010.
Se empleará una Base de Datos de videojuegos, que contendrá las siguientes tablas y columnas:

JUEGOS
idJuego
nombreJuego
generoJuego
idCompania
fechaLanzamiento

COMPANIAS
idCompania
nombreCompania
nacionalidadCompania


Se va a realizar un informe "normal", que muestre los juegos lanzados en una fecha seleccionada, y otro con Crystal Report, que muestre los juegos divididos por géneros, de una compañía concreta.

Para comenzar, hay que habilitar los informes, para lo que hay que ir a las propiedades del proyecto, y entrar en la opción compilar. Una vez dentro de ella, seleccionar la opción situada en la parte inferior Opciones de compilación avanzadas..., para una vez dentro de ellas, seleccionar ".NET Framework 3.5" como Versión de .NET Framework de destino.

En el informe normal, se parte de tener un elemento de tipo MonthCalendar, llamado "elementoMonthCalendar". Al seleccionar una fecha en este, automáticamente se debe cargar la información de los juegos lanzados ese día, en un dataset llamado "dsVideojuegos", que deberá estar asignado a un elemento de tipo ReportViewer, llamado "elementoReportViewer". Este deberá cargar un informe de nombre "informeNormal".

  1. Para comenzar, se va a configurar el DataSet. Para ello, dentro del mismo se debe pulsar Click Derecho, y agregar una tabla de datos. En este ejemplo, a esta tabla de datos se le va a llamar "tblInfoJuegos".
  2. A continuación, hay que hacer click derecho en la tabla de datos, y seleccionar la opción agregar columna. Se deben agregar tantas columnas como se vayan a usar en el informe, y es altamente recomendable hacerlo, nombrándolas con el mismo nombre que tienen en la Base de Datos. Para este caso de ejemplo, los campos agregados serán idJuego, nombreJuego, generoJuego, idCompania, fechaLanzamiento, nombreCompania y nacionalidadCompania.
En este punto, ya está creado el DataSet, y se va a proceder a crear y dar forma al informe.
  1. Cuando se crea un informe, aparece una plantilla en blanco, que es en la que hay que cargar la información que se desea mostrar. Primero, se van a poner las partes estáticas, que se pueden agregar, mediante las opciones que se ven al pulsar click derecho, insertar. Para este caso de ejemplo, se va a añadir un título, y un label "Juegos lanzados el: ".
  2. Ahora, se va a proceder a insertar las partes dinámicas, como por ejemplo, una lista que muestre la información deseada. (Los datos de los juegos lanzados en una fecha concreta, previamente seleccionada). El filtro por fecha se llevará a cabo en otro punto, aqui se da por hecho que el DataSet ya tiene la información correcta. Para ello, se va a insertar un elemento de tipo Lista. Al hacerlo, aparecerá una ventana emergente, que preguntará cual se quiere que sea el origen de los datos. En la lista desplegable Origen de datos:, hay que seleccionar el DataSet deseado, y en caso de que este tenga varios conjuntos de datos, elegir el deseado. En este ejemplo, unicamente se ha creado uno "tblInfoJuegos".
  3. En la lista, hay que pulsar click derecho en la barra superior, y seleccionar la opción Insertar columna.
  4. En la parte superior derecha de la columna creada, aparecerá un icono rectángular, en el que habrá que seleccionar el campo del DataSet que corresponde a esa columna. Hay que añadir tantas columnas como sea necesario. 
  5. Si se quiere añadir uno de los campos de DataSet, para que aparezca en un cuadro de texto, hay que insertar un nuevo cuadro de texto, y con click derecho, entrar en la opción Expresión. Una vez dentro, en la parte inferior, seleccionar la Categoría Conjunto de datos, y aparecerá una lista con los DataSet, y de cada uno, los valores. Esta expresión puede alterarse en el cuadro superior. Para este ejemplo, esto se va a emplear para que en cada informe aparezca la fecha de lanzamiento que se está mostrando.
En este punto, el informe ya está creado y formateado de acuerdo a las necesidades. El siguiente paso, es agregar el informe recien creado al elemento de tipo ReportViewer, para lo cual, hay que ir al elemento, y en el icono que aparece en la parte superior derecha, seleccionar el informe deseado de la lista desplegable.

A continuación, hay que obtener la información deseada de la base de datos, cargarla en el DataSet, y refrescar el informe. A continuación se muestra un código de ejemplo: Tal y como se ha explicado anteriormente, para este ejemplo, en este informe, se van a mostrar los datos de los juegos que hayan sido lanzados en una fecha seleccionada.
    Private Sub elementoMonthCalendar_DateSelected(ByVal sender As Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles elementoMonthCalendar.DateSelected
        Try
            dsVideojuegos.Clear()

            Dim rutaBD As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\BBDDs\BBDD_videojuegos.accdb"
            Dim conexionBD As New OleDbConnection(rutaBD)

            Dim fechaSeleccionada As String = elementoMonthCalendar.SelectionRange.Start.ToString("MM/dd/yyyy")

            Dim query As String = "SELECT idJuego, nombreJuego, generoJuego, fechaLanzamiento, co.idCompania AS idCompania, nombreCompania, nacionalidadCompania FROM JUEGOS ju, COMPANIAS co WHERE ju.idCompania = co.idCompania AND fechaLanzamiento = #" & fechaSeleccionada & "#"

            Dim adaptador As New OleDbDataAdapter(query, conexionBD)
            adaptador.Fill(dsVideojuegos, "tblInfoJuegos")

            conexionBD.Close()
            elementoReportViewer.RefreshReport()
        Catch ex As Exception
            MsgBox("Ha habido algun problema.", vbInformation)
        End Try
    End Sub 



Una vez finalizado el informe normal, se va a proceder a realizar un informe con Crystal Report. Tal y como se ha explicado previamente, en este ejemplo, el informe va a mostrar los juegos de una compañía concreta (seleccionada de un ComboBox), divididos por géneros.

Se va a reutilizar el DataSet "dsVideojuegos", creado previamente, ya que los campos que se van a emplear son los mismos. También se empleará un elemento de tipo CrystalReportViewer, llamado "visorCR", al que se le vinculará un informe en Crystal Report, llamado "informeCrystal".

  1. Al crear un informe de Crystal Report, aparece un asistente que pregunta como se quiere crear el informe. Es recomendable seleccionar la opción Como informe en blanco. Al hacerlo, aparecerá un asistente, en el que hay que buscar el DataSet, dentro de Datso del proyecto, ADO.NET DataSets. Hay que seleccionar la/s tabla/s que se vayan a emplear.
  2. En este punto, ya se podrá modificar el informe, de manera similar a como se hizo con el informe normal. Se puede apreciar que el informe de Crystal Report, se compone de cinco apartados, cuyo sentido es el siguiente:
      • Encabezado del informe: Se muestra solo una vez, al comienzo del informe.
      • Encabezado de página: Se muestra una vez por cada página, al comienzo de la misma.
      • Detalles: Se muestra tantas veces como sea necesario. (Es la que muestra la información requerida).
      • Pie de página: Se muestra una vez por cada página, al final de la misma.
      • Pie del informe: Se muestra solo una vez, al final del informe.
  3.  Una vez se sabe para que se emplea cada parte, hay que colocar las partes estáticas del informe, del mismo modo que se ha mostrado previamente.
  4.  A continuación, se van a poner los datos que se extraigan directamente del DataSet, como para el ejemplo realizado, el nombre de la compañía. (Los datos de los juegos en si mismos, se colocarán más adelante, ya que se quieren dividir en géneros). Para colocar uno de los campos del DataSet, hay que ir al Explorador de campos, y buscar de dentro de Campos de base de datos. En caso de que no aparezcan, hay que pulsar click derecho, y seleccionar la opción Asistente de base de datos, para agregar el DataSet.
  5. Para "agrupar" un conjunto de elementos (como por ejemplo, los juegos según género), hay que insertar en la sección Detalles, un grupo
  6. Al insertarlo, aparecerá un asistente en el que se debe especificar el campo por el que agrupará, y el orden.
  7. Al crear un grupo, se habrán creado dos nuevas secciones, que son su encabezado, y su pie, quedando en el centro la sección Detalles, que es donde habrá que poner los campos que se quieren mostrar de cada miembro del grupo. En el caso de ejemplo, los datos de cada juego.
Con esto, el  informe ya estará terminado, y hay que asignarlo al elemento de tipo CrystalReportViewer, del mismo modo que se hizo con el informe normal, con la diferencia, de que desde el Cuadro de herramientas, hay que agregar el DataSet al formulario manualmente. Una vez asignado, hay que cargarle la información, y refrescar el informe. A continuación se muestra un código de ejemeplo: Tal y como se ha explicado anteriormente, en este ejemplo se elige una compañía de un ComboBox, y se muestran los juegos pertenecientes a esa compañía.
    Private Sub comboBox_compania_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles comboBox_compania.SelectedIndexChanged

        Dim query As String
        Dim ada As New OleDbDataAdapter

        Try
            DsVideojuegos.Clear()

            query = "SELECT idJuego, nombreJuego, generoJuego, fechaLanzamiento, co.idCompania AS idCompania, nombreCompania, nacionalidadCompania FROM JUEGOS ju, COMPANIAS co WHERE ju.idCompania = co.idCompania AND co.idCompania = " & comboBox_compania.SelectedValue

            ada = New OleDbDataAdapter(query, conexionBD)

            ada.Fill(DsVideojuegos, "tblInfoJuegos")

            Dim rpt As New informeCrystal()
            rpt.SetDataSource(DsVideojuegos)
            visorCR.ReportSource = rpt

        Catch ex As Exception
            MsgBox("Ha habido algun problema.", vbInformation)
        End Try
    End Sub


De este modo, se habrán creado dos informes. Uno normal y otro de Crystal Report.

domingo, 31 de enero de 2016

Acceso a una Base de Datos MySQL con PHP y realización de consultas simples.

En esta entrada, se va a explicar como acceder a una base de datos MySQL desde PHP, y como realizar consultas en la misma.


Para el ejemplo que se va a mostrar aquí, partimos de lo siguiente:

  • Una base de datos MySQL, con nombre "nombreBD".
  • El usuario de la base de datos es "usuBD", y la contraseña es "passBD".
  • En la base de datos, hay una tabla llamada "personas".
  • La tabla "personas" tiene 3 columnas. ("nombre", "apellidos", "edad").
  • En el mismo host de la base de datos, hay un programa PHP, cuya explicación se explicará en esta entrada.


En este ejemplo, se va a proceder a realizar la conexión a la base de datos, y a mostrar por pantalla el nombre completo de las personas que tengan más de 18 años.

Nuestro programa PHP, debe contener una clase que sea la que se encargue de conectar con la base de datos.
class DB_CONNECT
{
 
    function connect() 
    {
        /*Esta es la parte en la que hay que poner los datos de la conexión a la Base de Datos.*/
           define('DB_USER', "usuBD");
           define('DB_PASSWORD', "passBD");
           define('DB_DATABASE', "nombreBD");
           define('DB_SERVER', "localhost");  
  
        $con = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD) or die(mysql_error());
        $db = mysql_select_db(DB_DATABASE) or die(mysql_error()) or die(mysql_error());
        return $con;
    }
 
    function close()
    {
        mysql_close();
    }
 
    function __construct()
    {
        $this->connect();
    }
 
    function __destruct() 
    {
        $this->close();
    }

}

A continuación, se va a instanciar un elemento de la clase que se acaba de crear, y se va a proceder a realizar la consulta, y a mostrarla por pantalla.
/*Con esta linea, se crea la conexión con la base de datos, empleando la clase creada anteriormente.*/
    $db = new DB_CONNECT(); 

/*Con esta linea, se realiza la consulta deseada*/
    $result = mysql_query("SELECT nombre, apellidos FROM personas WHERE edad > 18");
 
/*Con esta linea se comprueba que la consulta devuelva*/ 
/*algún resultado, y si es así, el programa continua.*/
    if (mysql_num_rows($result) > 0)
    {
       /*Este bucle dará una vuelta por cada registro devuelto.*/
       while ($row = mysql_fetch_array($result))
       {
          /*El registro devuelto, se encuentra en la variabla $row, para*/
          /*extraerlo, hay que llamar al elemento como si fuera un array.*/
          echo $row["nombre"]." ".$row["apellidos"]." ";
       }
    }

De este modo, se habrán obtenido y mostrado por pantalla los datos deseados.

domingo, 24 de enero de 2016

Los gigantes invisibles

Soy un gran aficionado a la Nintendo Wii y la F1. He probado muchos juegos de velocidad, pero el único que me ha hecho sentirla, ha sido un sencillo juego llamado "Speed". Probablemente no solo no lo hayáis jugado, si no que siquiera habréis oido hablar de el. He jugado a todos los juegos "conocidos" de velocidad de Nintendo Wii, y a varios "desconocidos". Y en conjunto, para mí este es el mejor. Pero como ya he dicho, es poca la gente que lo conozca. Este es solo uno de los muchos ejemplos que se podrían citar de los grandes juegos, algunos gigantescos, que tan solo por su escasísima promoción no conocemos. Este artículo va dedicado a estos gigantes que nadie conoce. Quizá el juego ideal para tí esté al final de la última estantería de la tienda de videojuegos, o en la cesta de 2 juegos 15€.  No debe uno cerrarse a jugar tan solo a los juegos comercialmente conocidos, pues te arriesgas a perderte tu juego ideal, que no tiene por que ser el más vendido.

Alguien dijo una vez "Por más que repitas una mentira, esta no pasará a ser verdad".

miércoles, 20 de enero de 2016

Errores absurdos programando

Esta entrada, es un homenaje a todas esa situaciones, en las que nos hemos tirado de los pelos, para darnos luego cuenta, de que el programa no compilaba por una tontería. Seguramente, te haya pasado, que un programa aparentemente correcto, simplemente no funciona, y el error que produce no tiene sentido, o ni siquiera produce error alguno. Ya he perdido la cuenta de la cantidad de veces que me ha pasado esto, pero si recuerdo (demasiado bien), el error que me motivó a escribir esta entrada.
Era un programa en Java, en el cual por algún motivo, había puesto un punto y coma justo detrás de una sentencia if, lo que hacía que el compilador la omitiera. Es un error sumamente absurdo (quizá ni pueda llegar a llamarse error), pero para más inri, la línea de código en cuestión llegaba justo hasta el final de la pantalla, por lo que a menos que usara la barra de desplazamiento, no alcanzaba a ver el punto y coma.
Estuve más de tres horas con ese "error". Era muy frustrante, por que el código era correcto y no generaba ningún error al compilar, pero simplemente, el programa no funcionaba como debía. Finalmente, y sin saber aun muy bien como, me di cuenta del "error", y lógicamente, lo "solucioné" rápido.
Esa no fue la primera vez que me pasaba algo asi, y estoy seguro de que tampoco será la última, pero los errores absurdos seguirán siendo un motivo de desesperación como otro cualquiera, aunque estos al menos, tienen una solución sencilla... escurridiza, pero sencilla.

martes, 19 de enero de 2016

Plaketas

El juego Lights Out es un juego muy conocido, inventado en 1995, en el cual hay que ir encendiendo y apagando luces, hasta hacer que dos mapas sean iguales. En Play Store se puede encontrar una versión minimalista de este juego, llamada Plaketas, creada por mi.

El funcionamiento del juego es simple, hay que ir tocando las distintas plaketas de la parte inferior, para hacer que el mapa de abajo coincida con el de arriba, pero al tocar una plaketa, no solo cambiará la plaketa seleccionada, sino también las plaketas que tiene alrededor, incluyendo las diagonales.


Hay distintos modos de dificultad, que se van desbloqueando progresivamente, y la consecución de los niveles se puntúa con un sistema de copas de oro, plata o bronce.

Plaketas es un juego de estética minimalista, pero con plena funcionalidad, gratuito, y sin publicidad abusiva.

lunes, 18 de enero de 2016

Mejorar levemente el rendimiento en Android.

Es habitual encontrarse con gente que quiere que su móvil "vaya más rápido". Pues lo siento, pero la magia no existe, por lo que en esta entrada no vas a encontrar ninguna solución que haga que tu móvil vaya de golpe el doble de bien. No obstante, si que vas a encontrar un par de aplicaciones interesantes, que pueden ayudarte a que tu móvil vaya un poco más aliviado, sin necesidad de ser root.



La primera de estas aplicaciones, es CCleaner, una aplicación que a mucha gente no sorprenderá, ya que la mayoría de gente la tenemos instalada en nuestros ordenadores para limpiar la caché. Pues resulta, que la versión móvil de este programa es igual de útil que su versión homónima de ordenador, por lo que es altamente recomendable.





Por otro lado, Greenify es una aplicación que se encarga de forzar el cierre de las aplicaciones que elijamos de forma automática, lo que previene que estas estén consumiendo memoria sin que el usuario se percate de ello.