Todas las entradas de: peplluis

Basic 50th Aniversario y no conoces a «Small»

Al hilo del post anterior, estos cincuenta años han dado de sí para liberar cientos de versiones y formas diferentes de implementar intérpretes y compiladores BASIC, es emocionante imaginar su increíble capacidad polimórfica solo enumerando mentalmente algunas de ellas en el transcurso de los años. Si os parece además de intentar recuperar alguna de las primeras versiones, compartiré con vosotros algunos links a proyectos que no por veteranos dejan de tener validez.

Es encomiable que algunas comunidades docentes se focalicen a lenguajes gratuitos o productos educativos con “etiqueta” orientados a un entorno de aprendizaje que permite introducir fácilmente a principiantes o personas sin sentido de la programación. También es cierto que de forma lateral la actual dispersión y diversidad en la oferta tecnológica, nos provoque un sentimiento de aprensión por lo desconocido y desarrollemos un sentimiento de confort para con los conocidos, pues estos últimos se dibujan en un escenario mas próximo pues se aplican dentro de las métricas adoptadas y reconocidas por nuestra comunidad.

Esto último es aplicable a cualquier tipo de actividad que reúne personas en torno a tecnologías, ya sean móviles, tabletas, ordenadores… sistemas con un robotito, una manzana o unas ventanas. En este sentido os animo a que seáis tecnológicamente transgresores y tengáis la curiosidad de aprender de lo que no sabéis, descubriereis un mundo de opciones donde apenas parecía haber una sola. Y esta es realmente la magia de la tecnología! Miles de ingenieros nos reinventan a diario la forma de ver y entender nuestro mundo, materializando  su imaginación en mecanismos y herramientas que nos permiten ser más creativos.

Os recomiendo que visualicéis el video “lo que la mayoría de escuelas no enseñan”

http://msmvps.com/blogs/peplluis/archive/2013/02/28/just-one-word-superpower.aspx

Es divertido romper con ciertos estereotipos, y descubrir pequeñas joyas como la que os presentare a continuación, ni mejor ni peor, sin bombo ni platillo, pequeño pero con un enorme valor didáctico, un gran trabajo por detrás y nada que envidiar a otros conocidos proyectos “sociales” entorno a la programación.

Solo que de nuevo, es simplemente “BASIC” http://smallbasic.com/

J
Saludos,
PepLluis,

Back to Basic 1964/2014, pequeñas historias con mucha trayectoria.

Ummm, Si hacemos cuentas, creo que los años transcurridos son 50!

Así que antes de cualquier otra consideración ¡Hurry! Os invito a Celebrar que Mi Lenguaje favorito “el BASIC” Cumple medio siglo:

Así que, vamos a recordar a los mas jóvenes que con «esto» también hacíamos app’s 🙂 

Module BASIC Over50Years
    5 Cls
    10 rem "Mis Cincuenta Años"
    20 Dim x,y: x=1 : y=1
    30 Locate x,y
    40 Print "Feliz, Feliz CUMPE! a la ", x
    50 x=x+1:y=y+1
    60 If x>24 then x=1
    70 if y>40 then y=1
    80 goto 30
End Module

Creo que en la historia de los lenguajes, nadie pone en duda que BASIC ha significado la puerta de entrada amigable para cientos de miles de programadores. De la misma forma las implementaciones visuales “arrastrar/soltar” del Basic se posicionaron rápidamente en el mundo profesional como el nuevo paradigma para el desarrollo de aplicaciones rápidas dentro de un mismo entorno.

 

La barrera creada por la complejidad de los potentes compiladores de C++ orientados a sistemas, frente a los amigables lenguajes visuales que nos permitían crear GUI’s con un par de clics en pocos minutos, fue sin lugar a dudas el preámbulo y los precursores que sentaron las bases para que hoy en día podamos disfrutar de especificaciones e IDE’s como C# y VB.

Espero sacar algo de tiempo, para poder compartir con vosotros una serie de “cortos” con la historia de este apasionante lenguaje. “Aunque para algunos” Basic continúe siendo el sinónimo de “sencillo”.

Para empezar os invito a ‘echar’ una ojeada al primer manual de la “primera especificación Basic” publicado por el “Dartmouth College of Computation” en 1964… evidentemente hemos evolucionado jajajaja!, pero te reto a que intentes retroceder esos 50 años y ponerte en la camisa aquellos que por primera vez podían instruir a su computador organizando bloques de órdenes que se interpretaban y/o compilaban bajo demanda! Quizás Roslyn no esté tan lejos J ES BROMA!!

BASIC 64 : http://www.bitsavers.org/pdf/dartmouth/BASIC_Oct64.pdf

En las siguientes…. podéis ver otras implementaciones de BASIC entre el 77-81 para CP/M y la primera revisión de VBDOS!

 

   

Espero que al menos os haga sonreír!
Un abrazo a todos los VBros!

PepLluis, 

 

Comunidades tecnicas de Microsoft en España

Es bueno saber que no todo se encuentra en la red, así que si tienes «sed» de compartir tu día a día de forma presencial participando en las actividades que se propician desde los UG’s , estoy seguro de que el siguiente enlace os será de mucha utilidad :

http://msdn.microsoft.com/es-es/cc424933.aspx

En el encontrareis la mayor parte de grupos que periódicamente organizan actividades abiertas a toda la comunidad. Aunque no están todas, espero que poco a poco se vaya actualizando con todos los grupos que mantienen el espíritu.

Geeks world 🙂
PepLluis,

Netduino 1 – C# – timer

Hablando con un amigo, salió el tema de que tenia un netduino de los antiguos y recordaba un ejemplo que les dieron en un taller donde lo compraron, pero argumentaba que era un poco precario pues en la demo encendían/apagaban el led de la placa con «thread.Sleep»… rápidamente me puse a reír y le explique que como en sus hermanos mayores también dispone de timers!

Tengo un ejemplo posteado en VB, pero tal y como me comprometí en la conversación lo posteo en C# aunque estoy seguro que existen 101 ejemplos que explican lo mismo, pues este es solo un «hola mundo» para microframework.

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
 
namespace NetduinoApplication1
{
    public class Program
    {
        static OutputPort onboardLed = new OutputPort(Pins.ONBOARD_LED, false);
        static Timer firstTimer = new Timer(new TimerCallback(tictac), null, 250, 250);
 
        public static void Main()
        {
            Thread.Sleep(Timeout.Infinite);
        }
 
        static Boolean onOff;
        public static void tictac(object status)
        {
            onboardLed.Write(onOff);
            onOff = !onOff;
        }
    }
}

Aunque es de lo mas básico, espero que ayude algún que otro rezagado.
Saludos,
PepLluis,

Sant Jordi : El Libro y la Rosa

Estoy seguro de que todos conocéis la fiesta del Libro y la Rosa, para los que somos tecquis… quizás se nos antoja raro, raro, leer libros que no sean de tecnología, también estoy casi seguro de que tu chica no va a regalarte ningún libro de esos J estate tranquilo pues no te vas a quedar con las ganas!

Durante el próximo 24 y 25 de abril todos los que queráis “hojear” literatura técnica, tendréis la oportunidad de acceder gratuitamente a los libros de ediciones eni. Creo que es una buena forma de conocerlos, a lo sumo cuando además están cumpliendo 15 años!

www.ediciones-eni.com/librosgratis

O sea que Felicidades!

Saludos,
PepLluis,

 

Cerbuino y el módulo ENC28

Si estas intentando obtener una IP de un DHCP de tu router y no lo estas consiguiendo… existe un “gapo conocido” con el lwip compilado en la versión de GHI 4.2.6.2, asi que no pierdas el tiempo pues no podrás obtener ninguna IP del DHCP de algunos routers.

Solo te queda la opción de configurar una IP estática.

Por otra parte debes tener en cuenta que el evento “networkAddressChanged” solo se levanta una vez al iniciarse el procesador, por lo que si se cambia la IP de “forma manual” deberás seguirlo de “forma manual”.

Os dejo un pequeño ejemplo como punto de entrada para experimentar reacciones.

Como ya sabéis el firmware del Cerbuino es de comunidad i la parte del ENC28 está basada en la aportación de comunidad, espero que entre todos podamos pulir la próxima liberación.

 

No dudéis pedirlo en VB si lo necesitais 🙂

Saludos,

using System;
using Microsoft.SPOT;
 
using Microsoft.SPOT.Net.NetworkInformation;
using GT = Gadgeteer;
 
Namespace GadgeteerApp1
{
 
    Partial Public Class Program
    {
        NetworkInterface miEth;
        GT.Timer tmr = new GT.Timer(30000);
 
        void ProgramStarted()
        {
            miEth = NetworkInterface.GetAllNetworkInterfaces()[0];
            miEth.PhysicalAddress = miMac;            
            Debug.Print("Program Started... wait for an IP");
            NetworkChange.NetworkAddressChanged += NetworkChange_NetworkAddressChanged;            
            tmr.Tick += tmr_Tick;
            tmr.Start();
        }
 
        Boolean tictac;
        string lastIP;
        void tmr_Tick(GT.Timer timer)
        {
            if (lastIP != miEth.IPAddress.ToString())
            {
                lastIP = miEth.IPAddress.ToString();
                Debug.Print("Current Ip : " + lastIP);
            }
 
            if (miEth.IPAddress == "0.0.0.0")
            {
                Mainboard.SetDebugLED(true);
                Debug.Print("No DHCP server response :-(");
                miEth.EnableStaticIP("192.168.1.50", "x.x.x.x", "y.y.y.y");
            }
            else
            {
                Mainboard.SetDebugLED(tictac);
                tictac = !tictac;
                if (tmr.Interval.Milliseconds > 1000) tmr.Interval = new TimeSpan(0, 0, 1);
            }
        }
 
        void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
        {
            Debug.Print("Nueva IP : " + miEth.IPAddress.ToString());
        }
    }
}

CatDotNet Open Space 2014

CatdotNet es la suma de esfuerzos de diferentes grupos de usuarios de .NET, unidos con el propósito de aprender y compartir. El próximo Sábado 12 de Abril de 2014, de 10 a 19h, Catdotnet en colaboración con el Ajuntament de Barcelona organizamos un Open Space, con el objetivo de reunirnos todos los usuarios de .net para aprender, practicar, difundir y compartir, juntos.

no pierdas este link : http://catdotnet.net/cdnos14/

Será la oportunidad para encontrarnos todos en un mismo espacio, en el que compartir experiencias y conocimientos entre nosotros! Queremos estar todos, y eso te incluye a ti. Para que dentro de unos años, cuando te pregunten dónde estabas tu cuando los grupos de usuarios .net nos unimos para aprender y compartir.

Nos vemos allí!
PepLluis,

thread progressBar in WinForms – Also in C#

Después de una interesante conversación entorno a las diferencias de lenguaje “entre VB i C#” con mi amigo Jose María y de frente a la reiterativa discusión sobre la sintaxis… aquí os dejo el último ejemplo en C# para que lo comparéis con su anterior en VB.

Realmente pensáis que hay tanta diferencia como para continuar discutiendo cual mejor?, para poder apreciar los matices de cada uno de los lenguajes, como mínimo uno tiene que ser “bilingüe” y practicante pues en otro caso la discusión esta fuera de criterio…

El debate está servido! Jajajaja!. 

 

using System;
using System.Windows.Forms;
using System.Threading;
 
namespace ThreadProgressBar
{
    public partial class frmMain : Form
    {
        System.Timers.Timer tmr = new System.Timers.Timer(1000);
        delegate void myDeleg(Form toClose);
        Form currentPrgBar = null;
        Boolean createPrgBar = false;
        Boolean disposePrgBar = false;
 
        public frmMain()
        {
            InitializeComponent();
        }
 
        /// When form load
        private void frmMain_Load(object sender, EventArgs e)
        {
            tmr.Elapsed += tmr_Elapsed;
            tmr.Interval = 100;
            tmr.Start();
        }
 
        /// When running button is presed
        private void simulateLoad(object sender, EventArgs e)
        {
            createPrgBar = true;
            btnRunning.Text = "Load in progress";
            for (int i = 0; i < 10000; i++)
            {
                btnRunning.Text = "Running loop :" + i.ToString();
                btnRunning.Refresh();
                Application.DoEvents();
            }
            btnRunning.Text = "Run New Loop";
            disposePrgBar = true;
        }
 
        /// watch if any process are running to create a new progress bar
        void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (createPrgBar & (currentPrgBar == null))
            {
                Thread myThread = new Thread(onFlyProgressBar);
                myThread.Start();
                createPrgBar = false;
            }
            else
            {
                if (disposePrgBar)
                {
                    closeForm(currentPrgBar);
                    disposePrgBar = false;
                }
            }
        }
 
        /// Create new 'processing' progressBar
        void onFlyProgressBar()
        {
            Label lblMessage = new Label 
            {
                Dock = DockStyle.Top,
                Text = "Procesing, please wait..",
                TextAlign = System.Drawing.ContentAlignment.MiddleCenter,
                Font = new System.Drawing.Font("Microsoft Sans Serif"14,
                                                System.Drawing.FontStyle.Bold,
                                                System.Drawing.GraphicsUnit.Point)                                                
            };
 
            ProgressBar prgBar = new ProgressBar
            {
                Height = 15,
                Dock = DockStyle.Bottom,
                Style = ProgressBarStyle.Marquee
            };
 
            currentPrgBar = new Form()
            {         
                Width = 300, Height = 50,
                StartPosition = FormStartPosition.CenterScreen,
                ControlBox = false,
                FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D
            };
            currentPrgBar.Controls.AddRange(new Control[] { lblMessage, prgBar });
            currentPrgBar.LostFocus += recoverFocus;
            Application.Run(currentPrgBar);
        }
 
        void recoverFocus(object sender, EventArgs e)
        {
            currentPrgBar.TopMost = true;
        }
 
        /// Make current prgBar topmost if lost focus
        void closeForm(Form toClose)
        {
            if (toClose == nullreturn;
            if (toClose.InvokeRequired)
            {
                toClose.Invoke(new myDeleg(closeForm), toClose);
            }
            else
            {
                toClose.Close();
                currentPrgBar = null;
            }
        }
    }
}


Que tengáis una excelente semana!
PepLluis,

thread progressBar in WinForms

En el último post y en “WinForms”, comentamos como en algunas circunstancias se nos produce una excepción de ‘Subproceso Anulado’ cuando creamos/destruimos hilos en una misma función.

Después de conversar sobre el tema, y hablando con uno de vosotros sobre un escenario donde en ‘WinForm’ clásico nunca ha sido capaz de visualizar una ‘progress bar’ independientemente del form principal y aun pensando que deben existir montón de ejemplos J me he decidido a juguetear un ratito para ver como lo haría yo…

Este es el resultado (no sé si muy bueno, pero funciona.)

De todas maneras se me ocurre, que en próximos post podríamos hablar de cómo hacerlo usando “async”  “await” y “task”. Que os parece?

Si lo consideráis interesante no dudéis pedirme el equivalente en C#.

In the last post we are discussing around «WinForms» and some exceptions when create / destroy threads inside the same function.

After talking more about this, and share with somebody of you who are using classic ‘WinForm’ and has never been able to display a ‘progress bar’ independently of the main form, I think that we can found a plenty of examples on the web, But I decided tinkering for a while to see how I’d do it …

This is the result (not sure if is a very good sample, but it works.)

Anyway, it occurs to me that in next post could talk about how to do it using «async» «await» and «task». What you think?

Do not hesitate to ask me for the equivalent code in C #.

Espero vuestros comentarios!

Imports System.Threading
Public Class Main
 
    Private WithEvents tmr As New System.Timers.Timer(1000)
    Private currentPrgBar As Form
    Private createPrgBar As Boolean = False
    Private disposePrgBar As Boolean = False
 
    Delegate Sub myDeleg(toClose As Form)
 
    ''' When running button is presed
    Private Sub simulateLoad(sender As Object, e As EventArgsHandles btnRunning.Click
        createPrgBar = True
        btnRunning.Text = "Load in progress"
        For index = 1 To 10000
            btnRunning.Text = "Running loop :" + index.ToString
            btnRunning.Refresh()
            Application.DoEvents()
        Next
        btnRunning.Text = "Run New loop"
        disposePrgBar = True
    End Sub
 
    ''' watch if any process are running to create a new progress bar
    Private Sub tmr_Tick(sender As Object, e As EventArgsHandles tmr.Elapsed
        If createPrgBar And (currentPrgBar Is NothingThen
            Dim myThread As New Thread(AddressOf onFlyStatusBarForm)
            myThread.Start()
            createPrgBar = False
        Else
            If disposePrgBar Then
                closeForm(currentPrgBar)
                disposePrgBar = False
            End If
        End If
    End Sub
    ''' When form load
    Private Sub Main_Load(sender As Object, e As EventArgsHandles MyBase.Load
        tmr.Interval = 100
        tmr.Start()
    End Sub
    ''' When main form closes
    Private Sub Main_FormClosing(sender As Object, e As FormClosingEventArgsHandles MyBase.FormClosing
        closeForm(currentPrgBar)
    End Sub
 
    ''' Create new 'processing' progressBar
    Sub onFlyStatusBarForm()
        Dim lblMessage As New Label With {.Dock = DockStyle.Top,
                                          .Text = "Procesing, please wait..",
                                          .TextAlign = ContentAlignment.MiddleCenter,
                                          .Font = New System.Drawing.Font("Microsoft Sans Serif"14.0!,
                                                                          System.Drawing.FontStyle.Bold,
                                                                          System.Drawing.GraphicsUnit.Point,
                                                                          CType(0Byte))
                                         }
        Dim prgBar As New ProgressBar With {.Height = 15, .Dock = DockStyle.Bottom, .Style = ProgressBarStyle.Marquee}
 
        currentPrgBar = New Form() With {.Width = 300, .Height = 50,
                               .StartPosition = FormStartPosition.CenterScreen,
                               .ControlBox = False,
                               .FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D
                              }
 
        currentPrgBar.Controls.AddRange(New Control() {lblMessage, prgBar})
        AddHandler currentPrgBar.LostFocus, AddressOf recoverFocus
        Application.Run(currentPrgBar)
    End Sub
 
    ''' Make current prgBar topmost if lost focus
    Private Sub recoverFocus(sender As Object, e As EventArgs)
        currentPrgBar.TopMost = True
    End Sub
 
    ''' Close current 'progressBar'
    Sub closeForm(toClose As Form)
        If toClose Is Nothing Then Exit Sub
        If toClose.InvokeRequired Then
            toClose.Invoke(New myDeleg(AddressOf closeForm), toClose)
        Else
            toClose.Close()
            currentPrgBar = Nothing
        End If
    End Sub
 
End Class