martes, 21 de junio de 2016

¿Qué pasaría si todo el mundo fuese capaz de programar? Estamos a punto de averiguarlo.


Podemos estar entrando en una era en la que cualquiera es capaz de hacer programas, a pesar de que no sepan programación – al menos no de la manera en la que la mayoría nosotros lo entendemos ahora mismo.

He empezado a jugar con una aplicación para iPad llamada Ready, que permite a los más pequeños hacer pequeños juegos, aplicaciones sencillas, y proyectos digitales creativos. Utiliza una sencilla interfaz “drag-and-drop” (arrastra y suelta) para crear objetos, cambiar sus propiedades, y hacer que interactúen entre ellos o con el usuario.


Crear una pelota, proporcionarle “físicas” para que responda a la gravedad; convertirla en goma para que “rebote” sobre las superficies; hacer una barra que se mueva de izquierda a derecha con los cursores; construir un muro de bloques que desaparecen cuando son golpeados por la pelota y listo… tenemos un Arkanoid de toda la vida.

Lo que WYSISWYG (lo que ves es lo que obtienes) hizo por la creación de documentos, lo hacerReady por la programación. Pero los efectos podrían ir más allá que el mero ahorro de tiempo.

Programación Drag-and-Drop

Ready realmente es un escritorio de Unity, el motor de juego multiplataforma que a su vez está basado en C y C++. Al permitir a los niños desarrollar juegos simplemente utilizando drag-and-drop e interfaces if/then, Ready sitúa a jóvenes desarrolladores un nivel por encima de lo que podríamos considerar como código “real” – pero sigue permitiéndoles crear desde cero.

Yendo más allá, imagino que los usuarios, con el tiempo, serán capaces de profundizar lo suficiente para crear sus propios objetos y elementos – quizá incluso ofreciéndolos a otros en un mercado digital. Piensa en un Minecraft, pero construido desde el principio para ser una plataforma creativa completamente abierta.


Las buenas ideas son más valoradas que el buen código.

Jugar con estas herramientas hace que me pregunte si, dentro de poco, todos nosotros estaremos desarrollando de esta manera. ¿Podría "Ready" y otros escritorios similares hacer por la programación lo que hizo Photoshop por las imágenes o Word por la creación documental?. Si lo hace, entonces la creación de aplicaciones por “no-programadores” con buenas ideas podría ser inminente. Aunque el código puede no ser tan elegante ni optimizado como si un desarrollador lo escribiera desde cero, este tipo de aplicaciones serían válidas como prototipos.


Cuanto más fáciles sean los ordenadores, más se alejan los usuarios de ser programadores.


Un conjunto configurable de elementos y objetos como "Ready" puede que no tenga en cuenta las infinitas posibilidades y nuevas innovaciones de la codificación pura, pero la mayoría de los programas actualmente no usan ese tipo de innovación de todos modos. Pensemos en Uber. Una aplicación GPS enlazada a una aplicación de cobros enlazada a una aplicación de citas. Y los nuevos programadores no van a intentar crear nada tan robusto como una plataforma de intercambio de ficheros global ni nada parecido.

Antes de que los más puristas empecéis a atacar el concepto de una programación que se dirige más hacia PowerPoint que hacia Python, consideremos por un momento que podríamos decir lo mismo sobre cualquier lenguaje de programación. Después de todo C++ o cualquier lenguaje de alto nivel, pasa a través de un compilador para convertirse en algo que la mayoría de nosotros es incapaz de leer. Y el programa en sí mismo se asienta sobre un sistema operativo, y lenguaje ensamblador, e instrucciones máquina, y arquitectura basada en chips… Puedes considerarte a ti mismo un desarrollador de software competente sin haber bajado jamás a ese nivel de comprensión.

Créeme, yo me encuentro entre los puristas, resentidos por la aparición del Mac y otras interfaces que parecían diseñadas intencionadamente para hacer la computación “más fácil” simplemente distanciando a los usuarios de las funciones básicas. Microsoft hizo que invocásemos a “the wizard” (el mago), como si fuera algo misterioso que las aplicaciones y sus extensiones acabasen en el directorio correcto. Cuanto más fáciles sean los ordenadores, más se alejan los usuarios de ser programadores. Echo de menos mi fichero autoexec.bat



Más que un simple ahorro de tiempo.


Ready” me hace pensar que la simplificación de las interfaces de usuario puede, finalmente, ofrecer algo distinto a un simple distanciamiento del código: el poder. La gratificación instantánea de construir algo en “Ready” proporciona esa sensación de poder – casi como ser el autor de Hypercard en los primeros días de Macintosh o construir un sitio en WordPress cuando mi ambición y necesidades superan claramente mis habilidades. Hay un plug-in de WordPress para casi todo lo que puedo querer hacer en mi sitio.

Una cosa es cierta, si la gente no tiene que escribir código, puede que nunca entiendan cómo funcionan realmente las cosas. Estarán limitados por las posibilidades ofrecidas por los creadores de las plataformas, a través de las cuales ensamblarán componentes prefabricados en aplicaciones y otras experiencias digitales.

Del mismo modo que dimos la bienvenida a los usuarios de AOL al Internet real, “Ready” y otras aplicaciones, pueden hacer entrar a legiones de “desarrolladores civiles” en la industria de los juegos y las aplicaciones. Con la democracia viene un poco de embrutecimiento. No van a ser maestros en programación, pero tampoco son maestros en música los compositores que escriben las canciones de las bandas de garaje. Esta puede ser la realidad creativa “mash-up” hacia la que vamos. (El mashup es un género musical que consiste en la creación de un nuevo tema mediante la combinación de fragmentos (loops), instrumentos concretos, pistas vocales (a cappellas) y pistas instrumentales a cachitos o enteras de otros temas anteriormente ya realizados por otros). Hay mucho que aprender si quieres estar al día. Yo era bueno en Pascal, pero hoy en día los lenguajes de programación son muy duros y puede que no compense lo suficiente aprenderlos.

Este puede ser el momento en que finalmente entramos en la era de “Bandas de Garage” de la creación de aplicaciones y juegos. Las cosas pueden ponerse complicadas, pero también serán menos comerciales, brillantes y funcionalmente opacas.

A pesar de todo, en un mundo en el que escribir código se ha convertido en una habilidad rara y valiosa, una plataforma como “Ready” permite a las masas experimentar el poder de la creación.

Esa experiencia, por si misma, puede ser más importante que cualquiera de las aplicaciones que creemos. Cambia la manera en la que percibimos el panorama digital en el que gastamos gran parte de nuestras vidas. Ahora mismo todo es software creado por otros, pero con las herramientas correctas, podría ser el software que imaginemos y creemos por nosotros mismos.

Estoy listo para eso.


Artículo por: Douglas Rushkoff. Traducido y adaptado por: Miguel Montero Gámez.


Si tienes cualquier duda o comentario recuerda que puedes exponerlo aquí o bien mediante nuestro twitter facebook.
Compartir:

lunes, 20 de junio de 2016

Truco Delphi - Ocultar icono de nuestra aplicación en barra de tareas

Hoy toca un truco rápido, fácil y para toda la familia que consiste en ocultar el icono de nuestra aplicación de la barra de tareas en Delphi.

¿Para que sirve esto? Bueno, eso depende; imaginad que necesitáis hacer una aplicación iconizada en el área de notificaciones (Al lado del reloj) y que queréis que cuando se muestre no aparezca el icono en la barra de tareas (igual que el reloj de Windows por ejemplo).

Para ello solamente tendremos que anular la función CreateParams de la clase TForm para codificar nosotros mismos lo que necesitamos de la siguiente manera:
 
TfrmPrincipal = class(TForm)
  private
    { Private declarations }
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    { Public declarations }
  end;

procedure TfrmPrincipal.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle and not WS_EX_APPWINDOW;
  Params.WndParent := Application.Handle;
end;


Si tienes cualquier duda o comentario recuerda que puedes exponerlo aquí o bien mediante nuestro twitter y facebook.
Compartir:

viernes, 17 de junio de 2016

Truco Java - Añadir imágenes a un JTable desde un campo Blob en MySQL

Hoy hemos realizado una encuesta a través del twitter del blog preguntandoos sobre que lenguaje queríais el siguiente truco y ha ganado JAVA.

Por suerte estoy realizando un master de JAVA ahora mismo y a diario me surgen problemas y dudas que voy solventando y que, seguramente, sean las mismas que tengáis vosotros si estáis empezando con este lenguaje.

En el truco que nos ocupa hoy os voy a enseñar cómo solucioné la cuestión de mostrar un campo de imagen (tipo BLOB en MySQL) en un JTable.


Os pondré el código que rellena la tabla y luego os destacaré un par de secciones que son las que considero más importantes.

Este es el código en cuestión:

    /**
     * Procedimiento LlenarTabla
     * Utilizando el procedimiento modeloImagen.listImagen,
     * se rellena la tabla pasada por parametro.
     * @param tablaImagenes
     * @throws java.sql.SQLException
     * @throws java.io.IOException
     */
    public void LlenarTabla(JTable tablaImagenes) throws SQLException, IOException{
        DefaultTableModel modeloTabla = new DefaultTableModel() {
            @Override //Redefinimos el método getColumnClass
            public Class getColumnClass(int column){
                switch(column) {
                    case 0: return Object.class;
                    case 1: return Object.class;
                    case 2: return Object.class;
                    case 3: return ImageIcon.class;
                    default: return Object.class;
                }
            }
        };
        //Establecemos el modelo correspondiente en la JTable
        tablaImagenes.setModel(modeloTabla);
        
        //Añadimos las columnas correspondientes
        modeloTabla.addColumn("ID IMAGEN");
        modeloTabla.addColumn("ES CATEGORIA");
        modeloTabla.addColumn("DESCRIPCION");
        modeloTabla.addColumn("IMAGEN"); //Esta es la columna [3], es la que
                                         //nos interesa que sea una imagen.
                
        Object[] columna = new Object[4];
        
        ArrayList<imagen> listaImagenes = modeloImagenes.ListarImagenXEsCategoria("","");
        
        int numRegistros = listaImagenes.size();
        
        for (int i = 0; i < numRegistros; i++) {
            columna[0] = listaImagenes.get(i).getIdImagen();
            columna[1] = listaImagenes.get(i).getEsCategoria();
            columna[2] = listaImagenes.get(i).getDescripcion(); 

            //Transformamos el campo blob en ImageIcon
            Blob blob = listaImagenes.get(i).getImagen();
            int blobLength = (int) blob.length();  
            byte[] bytes = blob.getBytes(1, blobLength);
            blob.free();
            BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
            ImageIcon icon = new ImageIcon(img); 
            
            //Añadimos la imagen a la columna correspondiente
            columna[3] = icon;
            
            //Añadimos la fila al modelo
            modeloTabla.addRow(columna);
            
            //Establecemos el alto de la fila                                   
            tablaImagenes.setRowHeight(i, icon.getIconHeight());    
        }
        
   } 



No voy a entrar en el detalle de cómo recupero los datos de MySQL ni de cómo se define la clase Imagen (si queréis el código podéis pedírmelo en los comentarios y os lo facilitaré), pero sí quiero que prestéis atención a este código:

         DefaultTableModel modeloTabla = new DefaultTableModel() {
            @Override //Redefinimos el método getColumnClass
            public Class getColumnClass(int column){
                switch(column) {
                    case 0: return Object.class;
                    case 1: return Object.class;
                    case 2: return Object.class;
                    case 3: return ImageIcon.class;
                    default: return Object.class;
                }
            }
        };


Ese fragmento de código define el modelo que utilizará el objeto JTable y sobre el hemos de redefinir el método getColumnClass para que, en la columna [3] nos devuelva un ImageIcon, que es lo que queremos mostrar.

Otra parte importante del código, y que seguro que muchos ya conocéis, es el encargado de convertir el campo BLOB en un ImageIcon.
  
            //Transformamos el campo blob en ImageIcon
            Blob blob = listaImagenes.get(i).getImagen();
            int blobLength = (int) blob.length();  
            byte[] bytes = blob.getBytes(1, blobLength);
            blob.free();
            BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
            ImageIcon icon = new ImageIcon(img); 
            

Con estos sencillos pasos podemos obtener el resultado deseado.

Resultado final en una aplicación SWING

Si tienes cualquier duda o comentario recuerda que puedes exponerlo aquí o bien mediante nuestro twitter y facebook.
Compartir:

jueves, 16 de junio de 2016

Truco Delphi - Alternar colores de filas en DBGrid

Hoy os presento un pequeño truco que hará que vuestros DBGrids luzcan mucho mejor añadiendo unas pocas lineas de código.

Lo que tratamos de conseguir es que nuestro DBGrid presente las filas con colores alternos y además que la fila seleccionada se resalte también de manera alterna.


Para conseguir este objetivo debemos escribir la función GridDrawColumnCell como sigue:


procedure TfrmPrincipal.GridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  RowColors: array[Boolean] of TColor = (clSilver, clWhite);
  RowSelectedColors: array[Boolean] of TColor = (clHotLight, clHighlight);
var
  OddRow: Boolean;
begin
  if (Sender is TDBGrid) then
  begin
    OddRow := Odd(TDBGrid(Sender).DataSource.DataSet.RecNo);
    if (gdSelected in State) then
      TDBGrid(Sender).Canvas.Brush.Color := RowSelectedColors[OddRow]
    else
      TDBGrid(Sender).Canvas.Brush.Color := RowColors[OddRow];
    TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;
end;


Este procedimiento lo podemos poner en el formulario donde esté el DBGrid o bien en una unidad aparte y luego importarla con el comando Uses. Si incluimos el procedimiento en el formulario, es importante hacerlo como procedimiento de clase:

 TfrmPrincipal = class(TForm)

    { Otros métodos y propiedades del formulario }

    procedure GridDrawColumnCell(Sender: TObject; const Rect: TRect;
                                 DataCol: Integer; Column: TColumn; State: TGridDrawState);
  private
    { Private declarations }

  public
    { Public declarations }
  end;



De esta manera podremos seleccionar el DBGrid y asignar el procedimiento al evento OnDrawColumnCell.


Si tienes cualquier duda o comentario recuerda que puedes exponerlo aquí o bien mediante nuestro twitter y facebook.
Compartir:

miércoles, 15 de junio de 2016

Truco Delphi - Prevenir la ejecución de más de una instancia de nuestra aplicación (I)


Hace ya bastante tiempo que no posteo, pero eso no quiere decir que me haya olvidado de vosotros.
Como no dispongo de mucho tiempo para continuar con el curso de Lazarus y postear de forma asidua los artículos que tenía previstos, voy a empezar a postear pequeños tips y códigos de ejemplo para resolver pequeños problemas que me surgen en el día a día.

Hoy quiero mostraros como hacer que vuestra aplicación no se ejecute más de una vez, pero, en lugar de manteniendo la instancia más antigua, haciendo que la nueva instancia tome el control, es decir, que la nueva ejecución sustituya a la antigua.

Para ello nos vamos a basar en el procedimiento de WinApi GetCurrentProcessId, que nos dará el id de proceso del programa que estamos ejecutando y en el objeto TApplication para obtener el ExeName que será el que buscaremos.



Básicamente lo que pretendemos es terminar cualquier proceso que se llame como el nuestro, pero que no sea el nuestro :D


Añadimos el siguiente código en el evento OnCreate de nuestro formulario principal.

procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
  FProcessID := GetCurrentProcessId;
  FExeName   := ExtractFileName(Application.ExeName);
  
  CerrarInstancias;
end;

Este es el código que recorrerá todos los procesos de Windows y eliminará las instancias que existan de nuestra aplicación excepto la actual.

procedure TfrmPrincipal.CerrarInstancias;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);


  while Integer(ContinueLoop) <> 0 do
  begin

      if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
          UpperCase(FExeName)) or
          (UpperCase(FProcessEntry32.szExeFile) =
          UpperCase(FExeName)))  and
         (FProcessEntry32.th32ProcessID <> FProcessID)
      then
      begin
        TerminateProcess(OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0);
      end;

       ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);

end;

Mas adelante pondré otras maneras de prevenir la ejecución de más de una instancia de nuestras aplicaciones.
Compartir:

jueves, 31 de marzo de 2016

Hola Mundo multilingüe

¡Hola Mundo!

Aprovechando que he implementado SyntaxHighLighter en el blog, vamos a hacer un repaso por la mayoría de lenguajes de programación haciendo lo primero que debería hacer todo programador que empieza con un nuevo lenguaje de programación; el programa "Hola Mundo"

Espero que os guste el formato. A partir de ahora empezaré a incluir entradas con tips de programación en diferentes lenguaje y rutinas interesantes para que las tengamos todos a mano.

ColdFusion

<html>
<head>
<title>Test</title>
</head>
<body>

  <cfset message = "¡Hola Mundo!">
  <cfoutput>#message#</cfoutput>

</body>
</html>

C#

using System;
namespace HelloWorld
{
    class Hello 
    {
        static void Main() 
        {
            Console.WriteLine("¡Hola Mundo!");           
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

C++

#include <iostream>
 
int main()
{
  std::cout << "¡Hola Mundo!" << std::endl;
  return 0;
}

Delphi/Pascal

program Hello;
begin
  writeln ('¡Hola Mundo!');
  readln
end.

JavaScript

<!DOCTYPE HTML>
<html>
<body>

  <p>Header...</p>

  <script>
    alert('¡Hola Mundo!')
  </script>

  <p>...Footer</p>

</body>
</html>

Java
public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("¡Hola Mundo!");
    }

}

Perl

  #!/usr/bin/env perl

  use v5.10.0;
  use warnings;
  use strict;

  say "¡Hola Mundo!";

Php

<html>
<head>
<title>Test</title>
</head>
<body>

 <?php
  $message = "¡Hola Mundo!";
  echo $message;
 ?>

</body>
</html>

PowerShell

$strString = "¡Hola Mundo!"
write-host $strString

Python

print("¡Hola Mundo!")

Ruby

puts '¡Hola Mundo!'

Visual Basic

Module Hello
  Sub Main()
      MsgBox("¡Hola Mundo!")  
  End Sub
End Module

Compartir:

lunes, 28 de marzo de 2016

Juegos para programar: Lightbot: Code Hour

Hace ya varias semanas desde la última entrada y varias más desde el primer artículo sobre "Juegos para programar". Lo cierto es que he estado bastante ocupado con el Master de Java, Semana Santa, Vacaciones, etc... pero aquí estamos de nuevo para volver a bloguear más a menudo.


LightBot: Code Hour

Hoy os traemos un juego que hará las delicias de los pequeños y no tan pequeños. Se llama LightBot: Code Hour. Este pequeño juego es gratuito y nos ofrece una secuencia de puzzles que irán creciendo en dificultad y que nos acercarán a temas tan propios de la programación como los procedimientos y los bucles.


¿En que consiste?

El juego consiste en dirigir nuestro LightBot hacia una serie de cuadrículas azules, distribuidas por un tablero, y encendiendo una bombilla sobre ellos. La gracia del asunto es que tenemos un número máximo de acciones que podemos llevar a cabo para acabar cada una de las fases.



Tendréis la posibilidad de seleccionar el idioma que queráis (entre ellos el español) y el género de vuestro LightBot.

El juego puede resultar algo corto, pero si tenemos en cuenta que es gratuito y a quién va dirigido, no me cabe duda de que será muy interesante para los más pequeños.



Otras versiones

Si os quedáis con ganas de más, tenéis disponibles dos versiones adicionales de LightBot, una de 4 a 8 años y otra para edades de 9 en adelante. Desafortunadamente estas versiones ya son de pago y su precio oscila entre los 2,99€ y los 3,18€ dependiendo de la versión y la plataforma.

Además tenéis una versión de navegador a la que podéis acceder desde aquí y jugar gratuitamente


Espero que os haya gustado este post y que me dejéis en los comentarios si queréis que hable sobre algún juego concreto que consideréis interesante para esta temática y lo incluiré sin problemas.

Compartir:
Con la tecnología de Blogger.

BoosterBlog

BoosterBlog
BoosterBlog

Timeline Twitter

Seguidores

Seguidores