viernes, 16 de diciembre de 2011

reCaptcha Bug

This is happening with reCaptcha - I guess is a kind of Bug. Otherwise, they may be having wrong information for using with the OCR software.



Estuve escuchando la charla de Luis von Ahn (creador de reCaptcha) y ahora proyecto de Google.

http://www.ted.com/talks/luis_von_ahn_massive_scale_online_collaboration.html

Donde explica algo que muchos sabemos y es que se usa este famoso sistema para poder ayudar en la digitalización de libros (de la biblioteca digital de Google)

Cómo se hace? Fácil: cuando ingresamos un código, vemos 2 palabras. Una de esas palabras no pudo ser reconocida por el software OCR de Google entonces nos pide ayuda para que la interpretemos nosotros.

La otra palabra está puesta para que el sitio sepa que hay un humano detrás del monitor y no un robot programado para hacer spam o descargar automáticamente, etc.

Bueno, entonces cuando vi esto me pregunté: Qué pasa si yo se cual es la palabra que necesita Google interpretar? Si el software de OCR no supo cuál es, entonces cómo podrá saber que la estoy ingresando bien? Si sabemos esto, entonces podemos terminar haciendo que las digitalizaciones de libros en Google terminen diciendo cualquier cosa!

Y el problema es que es muy fácil saber cuál de las dos palabras es la que no sabe reCaptcha... ¡Es la que está tachada! Porque ellos pueden colocar ese tachón de forma dinámica. La otra palabra es la que el software no pudo interpretar.

Sabiendo esto, me fui a probar lo siguiente: Ingreso cualquier cosa en el lugar de la palabra que no detectó el programa OCR y entonces no solo que me dejará pasar para el paso siguiente sino que le meto basura a la base de datos de Google!

Algunas capturas de eso. Al día de hoy persistía el error. Informé a reCaptcha mediante el email de prensa de Google pero no he recibido respuesta.

Yo creo que es un asunto a tener en cuenta...







jueves, 15 de diciembre de 2011

Cacique - Testeo de Sitios

La verdad es que muy pocas veces me siento alegremente sorprendido por una noticia como esta. Y es que un producto argentino se anuncia como Open Source, siendo una herramienta muy potente y de mucho uso (y lo principal, que no esconde ninguna venta detrás)

No digo "argentino" en un sentido de orgullo, sino porque nosotros en este país no acostumbramos a regalar cosas. Somos una sociedad tan castigada por la mala administración económica y por el ejemplo que nos dan los políticos (robando todo el tiempo frente a nuestras narices sin ir preso o enjuiciado siquiera), que no es raro entender nuestra forma de ser. No la justifico, sino que la trato de entender para saber por qué lado debe venir el cambio.

Bueno, pero regresando a la noticia... Se trata de "Cacique", una aplicación desarrollada por MercadoLibre para testear su propio sitio web.

Este "movimiento" de lanzar semejante herramienta como Open Source creo que se debe a razones de promoción. No se olviden que desde hace un tiempo, MercadoLibre dejó de poner tantas trabas para la compra-venta y creación de nuevas cuentas (recuerdo que tenías que poner tu DNI y debía ser válido, sino no te creaban la cuenta. También tenías que esperar que te llamaran por teléfono y vaya a saber qué otras cosas más) Ahora abrir una cuenta es cosa de todos los días.

Todo esto es porque cada vez tenía menos movimiento (supongo), sino, por qué modificarían algo que les funciona bien?

También veo que si MercadoLibre está siendo asesorado (o por conocimiento propio) de cómo mover una empresa hacia el futuro. Y es un movimiento que funciona: Colocar código Open Source (les suena a Google?)

Y se están asegurando de tener presencia en el mundo. Porque ya las cosas van cambiando y quien no se adapta, muere. Así de simple. Y sino, pregúntenle a los grandes dinosaurios que van muriendo de a poco (BlockBuster, el video club, las disqueras que todavía venden CDs como principal ingreso, etc)

Entiendan que el mundo que se nos viene no tiene lugar para el dinero. Estamos apuntando más para el lado de una Economía Basada en Recursos y no en papel moneda.


Felicitaciones a Mercado Libre y aprovecho para darles las gracias por esta estupenda herramienta!

Cacique

martes, 13 de diciembre de 2011

Blackberry: Getting Info from the App World


Third-party applications can interface with the BlackBerry App World™ storefront. Using this feature, your application can obtain information about itself, such as the current version that is available and the license key it uses. This is useful for keeping the application current and making sure that it runs on a specific BlackBerry smartphone model. You can also launch the BlackBerry App World and point it directly to the web page for a specific application, making it easier to sell other applications or upgrades to the current application.

To test functionality that is dependent on accessing these properties (such as license validation) before your application is available on BlackBerry App World, you may load values into the properties yourself as part of a wireless installation. For more informationt, see this article.

The following example demonstrates how to interface to the BlackBerry App World. The complete project for this sample can be downloaded here.


package com.rim.samples.AppWorld;

import java.io.*;
import javax.microedition.content.*;
import net.rim.device.api.system.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;

/**
 * SampleApplication.java
 *
 * Sample application that shows how an application can
 * interface with BlackBerry App World.
 *
 * Note: For the sake of simplicity, this sample application may
 * not leverage resource bundles and resource strings. However,
 * it is STRONGLY recommended that application developers make
 * use of the localization features available within the
 * BlackBerry development platform to ensure a seamless application
 * experience across a variety of languages and geographies. For more
 * information on localizing your application, please refer to
 * the BlackBerry Java Development Environment Development Guide
 * associated with this release.
 *
 */
public class SampleApplication extends UiApplication {
    /**
     * The App World specific ID of this application.
     */
    private static final String RIM_APP_WORLD_ID = "RIM_APP_WORLD_ID";
    /**
     * A flag (true or false) that specifies whether there is
     * currently an update for this app available.
     */
    private static final String RIM_APP_WORLD_UPDATE_AVAIL = "RIM_APP_WORLD_UPDATE_AVAIL";
    /**
     * The license key for this application, as specified by the
     * App World purchase.
     */
    private static final String RIM_APP_WORLD_LICENSE_KEY = "RIM_APP_WORLD_LICENSE_KEY";
    /**
     * The name of the application, as specified in the App World
     * ISV Portal.
     */
    public static final String RIM_APP_WORLD_NAME = "RIM_APP_WORLD_NAME";
    /**
     * The email address of the purchaser. This will be their
     * PayPal email address.
     */
    public static final String RIM_APP_WORLD_EMAIL = "RIM_APP_WORLD_EMAIL";
    /**
     * The PIN of the purchaser.
     */
    public static final String RIM_APP_WORLD_PIN = "RIM_APP_WORLD_PIN";
    /**
     * The version of the application, as specified in the App
     * World ISV Portal.
     */
    public static final String RIM_APP_WORLD_VERSION = "RIM_APP_WORLD_VERSION";

    private MainScreen screen;
    private BasicEditField contentIdField;
    public SampleApplication() {

        // Get name of your app
        String myAppName = ApplicationDescriptor.currentApplicationDescriptor().getName();
        // It must be exact name of your application as
        // registered with the App World ISV portal
        //String myAppName = "AppName:Vendor";

        // If you are targeting 4.3+, use this:
        CodeModuleGroup group = CodeModuleGroupManager.load( myAppName );

        // On 4.2 you would need to use the following:
        /*
        CodeModuleGroup group = null;
        if( myAppName != null ) {
            CodeModuleGroup[] groups = CodeModuleGroupManager.loadAll();
            if( groups != null ) {
                for( int i = 0; i < groups.length; ++i ) {
                    if( groups[ i ].containsModule( myAppName ) ) {
                        group = groups[ i ];
                        break;
                    }
                }
            }
        } else {
            myAppName = "unknown";
        }
        */

        // Pull out the App World data from the CodeModuleGroup
        final String key = group == null ? "unknown" : group.getProperty( RIM_APP_WORLD_LICENSE_KEY );
        final String update = group == null ? "unknown" : group.getProperty( RIM_APP_WORLD_UPDATE_AVAIL );
        final String myContentId = group == null ? "" : group.getProperty( RIM_APP_WORLD_ID );
        final String name = group == null ? "unknown" : group.getProperty( RIM_APP_WORLD_NAME );
        final String email = group == null ? "unknown" : group.getProperty( RIM_APP_WORLD_EMAIL );
        final String pin = group == null ? "unknown" : group.getProperty( RIM_APP_WORLD_PIN );
        final String version = group == null ? "unknown" : group.getProperty( RIM_APP_WORLD_VERSION );
        screen = new MainScreen() {
            public boolean isDirty() {
                return false;
            }
        };

        //Display the data on the screen
        VerticalFieldManager manager = new VerticalFieldManager();
        screen.add( manager );
        manager.add( new BasicEditField( "App Name : ", myAppName, 100, Field.READONLY ) );
        manager.add( new BasicEditField( "License Key : ", key, 100, Field.READONLY ) );
        manager.add( new BasicEditField( "Update Available : ", update, 100, Field.READONLY ) );
        manager.add( new BasicEditField( "Name : ", name, 100, Field.READONLY ) );
        manager.add( new BasicEditField( "Email : ", email, 100, Field.READONLY ) );
        manager.add( new BasicEditField( "PIN : ", pin, 100, Field.READONLY ) );
         manager.add( new BasicEditField( "Version : ", version, 100, Field.READONLY ) );
        manager.add( new SeparatorField() );

        //Create the resources needed to launch the App World
        //pointing at our app's page
        contentIdField = new BasicEditField( "Content ID : ", myContentId );
        manager.add( contentIdField );
        ButtonField button = new ButtonField( "Open BlackBerry App World", ButtonField.CONSUME_CLICK );
        button.setChangeListener( new FieldChangeListener() {
            public void fieldChanged( Field field, int context ) {
                try {
                    openAppWorld( contentIdField.getText() );
                } catch( final Exception e ) {
                    SampleApplication.this.invokeLater( new Runnable() {
                        public void run() {
                            Dialog.alert( "Problems opening App World: " + e.getMessage() );
                        }
                    } );
                }
            }
        } );
        manager.add( button );
        pushScreen( screen );
    }

    /***
     * openAppWorld
     * <p>
     * Opens the App World pointing to a specific application. <p>
     * Note: This method takes advantage of
     * javax.microedition.content, which was introduced in 4.3.
     * There is no way to open the BlackBerry App World on an older OS.
     * <p>
     * @param myContentId App World ID of application to open.
     * @throws IllegalArgumentException if myContentId is invalid
     * @throws ContentHandlerException if App World is not installed
     * @throws SecurityException if access is not permitted
     * @throws IOException if access to the registry fails
     */

    protected void openAppWorld( String myContentId ) throws IllegalArgumentException, ContentHandlerException,
            SecurityException, IOException {
        Registry registry = Registry.getRegistry( SampleApplication.class.getName() );
        Invocation invocation = new Invocation( null, null, "net.rim.bb.appworld.Content", true, ContentHandler.ACTION_OPEN );
        invocation.setArgs( new String[] { myContentId } );
        boolean mustExit = registry.invoke( invocation );
        if( mustExit ) // For strict compliance - this should never happen on a BlackBerry
            screen.close();

        // Please note that this response won't be generated
        // until the BlackBerry App World exits
        // This method will block until that time
        Invocation response = registry.getResponse( true );
        if( response.getStatus() != Invocation.OK )
            Dialog.alert( "Problem invoking BlackBerry App World. Error code " + response.getStatus() );
        else
            Dialog.inform( "BlackBerry App World successfully opened." );
    }

    public static void main( String[] args ) {
        new SampleApplication().enterEventDispatcher();
    }
}

sábado, 3 de diciembre de 2011

Conditional Loading for Responsive Designs

Loading content on small devices is something you must consider for giving a great user experience on your site.

So, this "24 ways" entry explains how you can handle that by checking the screen width > 640 and stopping excessive data. You should only put a link to do the job.

24 ways: Conditional Loading for Responsive Designs

viernes, 2 de diciembre de 2011

RIM - BlackBerry - COD size

http://supportforums.blackberry.com/t5/Java-Development/The-maximum-size-of-a-BlackBerry-smartphone-application/ta-p/502534
Extracto:

"The limit for the number of sibling COD files that can exist within a single application is 127.  This means that the maximum theoretical size limit for an application would be 16256 KB, which consists of 8128 KB of application data and 8128 KB of resource data. "

jueves, 3 de noviembre de 2011

Tooltips in BlackBerry

I don't know yet if there's a Manager for this (please let me know as a comment if you do) tooltips I want to do.

So, if you want to have in your BlackBerry application something like the stuff I'm showing on the following captures, well, keep reading...



Obviously, the design is very simple. What I want to give you is the functionality, very open so you can put your design there (even with the tooltips, which are simple PNG images)

For getting the code, just go here: http://pastebin.com/ynDmk5pc
Create a new project and paste that. That's all.

Hope you like it ;-)




jueves, 13 de octubre de 2011

BlackBerry ApplicationIndicator class

In RIM Blackberry OS 4.6+ there is a feature - ability to show notification icon in statusbar. Integrated application use it to give quick and informative information for user: Dealler - missed calls, Messages - unread messages etc.



Possible use of notification icon:
  • missed events
  • RSS updates
  • object status (ex. weather/app activity/gps signal strength)
  • other
To add/modify/remove notification icon we can use ApplicationIndicator class:
Represents an application indicator that consists of an icon and optional numeric value.
The icon is placed in indicators area along with others such as new mail counter, calendar reminders, missed calls counter, security status and others.
  • Application can register only one indicator and has to register it every time the phone starts.
  • All indicators are cleared upon phone restart.
  • Indicators may be not visible if there will be no space on statusbar
  • Indicator dimensions depend on current theme and phone screen size.
  • The icon size varies from 10x10 up to 24x24.
  • If indicator is initialized with a big icon then an exception is thrown.
  • Indicator can have optional numeric value that usually serves as a counter.
  • The value can be negative, 0 or positive.
  • If indicator is used as a counter it's better to hide it when its value is equal to 0.
  • If indicator value is too big, it will display '99+' or '999+'

Add notification icon

For this we should create instance of ApplicationIcon:
Application icon class is used in conjunction with application indicator and application messages.
It incapsulates image and its painting properties.
EncodedImage mImage = EncodedImage.getEncodedImageResource("indicator_icon.png");
ApplicationIcon mIcon = new ApplicationIcon(mImage);
Then we should register ApplicationIndicator with ApplicationIndicatorRegistry:
ApplicationIndicatorRegistry.register(icon, iconOnly, visible)
icon - an icon to be displayed in the indicators area
iconOnly - specifies if indicator should have icon representation only and no value
visible - specifies whether indicator has to be visible initially
ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry.getInstance();
ApplicationIndicator indicator = reg.register(mIcon, false, true);

Modify indicator icon and value

To modify icon, use ApplicationIndicator.setIcon method:
ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry.getInstance();
ApplicationIndicator appIndicator = reg.getApplicationIndicator();
appIndicator.setIcon(icon);
To modify number value, use ApplicationIndicator.setValue method:
ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry.getInstance();
ApplicationIndicator appIndicator = reg.getApplicationIndicator();
appIndicator.setValue(value);
  • If very big value is provided then indicator will display '99+' or '999+'.
To hide or show indicator, use ApplicationIndicator.setVisible

Unregister ApplicationIndicator

Most likely you don't want your app indicator to stay in statusbar, it's better to ApplicationIndicatorRegistry.unregister() it on app close.

Sample application

Icons:









Code:
import net.rim.blackberry.api.messagelist.ApplicationIcon;
import net.rim.blackberry.api.messagelist.ApplicationIndicator;
import net.rim.blackberry.api.messagelist.ApplicationIndicatorRegistry;
import net.rim.device.api.system.EncodedImage;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.container.MainScreen;

class Scr extends MainScreen {
    EncodedImage mImageGreen = EncodedImage
      .getEncodedImageResource("bb_icon_green.png");
    ApplicationIcon mIconGreen = new ApplicationIcon(mImageGreen);
    EncodedImage mImageRed = EncodedImage
      .getEncodedImageResource("bb_icon_red.png");
    ApplicationIcon mIconRed = new ApplicationIcon(mImageRed);

    ApplicationIcon mIcon = mIconGreen;

    public Scr() {
     add(new LabelField("Use menu to:"));
     add(new LabelField("Register indicator"));
     add(new LabelField("Increment value"));
     add(new LabelField("Decrement value"));
     add(new LabelField("Switch icon"));
     add(new LabelField("Unregister indicator"));
    }

    MenuItem menuRegister = new MenuItem("register", 0, 0) {
     public void run() {
      registerIndicator();
     };
    };
    protected int mValue = 0;
    MenuItem menuIncrement = new MenuItem("increment", 0, 0) {
     public void run() {
      mValue++;
      updateValue(mValue);
     };
    };
    MenuItem menuDecrement = new MenuItem("decrement", 0, 0) {
     public void run() {
      mValue--;
      updateValue(mValue);
     };
    };
    MenuItem menuSwitchIcon = new MenuItem("icon", 0, 0) {
     public void run() {
      mIcon = (mIcon == mIconGreen) ? mIconRed : mIconGreen;
      updateIcon(mIcon);
     };
    };
    MenuItem menuUnregister = new MenuItem("unregister", 0, 0) {
     public void run() {
      unregisterIndicator();
     };
    };

    protected void makeMenu(Menu menu, int instance) {
     super.makeMenu(menu, instance);
     menu.add(menuRegister);
     menu.add(menuIncrement);
     menu.add(menuDecrement);
     menu.add(menuSwitchIcon);
     menu.add(menuUnregister);
    }

    private void registerIndicator() {
     try {
      ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry
        .getInstance();
      ApplicationIndicator indicator = 
        reg.register(mIcon, false, true);
     } catch (Exception e) {
     }
    }

    private void unregisterIndicator() {
     try {
      ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry
        .getInstance();
      reg.unregister();
     } catch (Exception e) {
     }
    }

    void updateValue(int value) {
     try {
      ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry
        .getInstance();
      ApplicationIndicator appIndicator = 
        reg.getApplicationIndicator();
      appIndicator.setValue(value);
     } catch (Exception e) {
     }
    }

    void updateIcon(ApplicationIcon icon) {
     try {
      ApplicationIndicatorRegistry reg = ApplicationIndicatorRegistry
        .getInstance();
      ApplicationIndicator appIndicator = 
        reg.getApplicationIndicator();
      appIndicator.setIcon(icon);
     } catch (Exception e) {
     }
    }
}


miércoles, 12 de octubre de 2011

Dart : Structured web programming

Hace par de días Google anunció su rumoreado lenguaje de programación del cual les había informado en eliax, y lo ha bautizado Dart (como "Dardo"), y he estado estudiándolo y hoy les doy mis primeras breves impresiones.

Noten antes de continuar que Dart está en una etapa muy temprana de su desarrollo. Google lo considera un "Technology Preview" (un avance sobre lo que será), y no una versión final, destacando explícitamente que muchas cosas podría cambiar de aquí a la primera versión oficial.

Lo primero a destacar de Dart es la razón de su existencia, las razones son potencialmente las siguientes:

1. Javascript, el lenguaje por defecto para programar aplicaciones web en navegadores está fuera de control. Inició como algo sencillo, pero se ha vuelto toda una bestia, y al no tener estructura promueve demasiado la producción de "código spagetti" en donde al programa le falta estructura y en donde todo se vuelve difícil de mantener, en particular en proyectos grandes (algo que he vivido en carne propia).

2. Con HTML5, es complicado y tedioso cambiar contextos con distintos lenguajes de programación y declarativos, siendo la norma el combinar en un solo código fuente a Javascript, HTML, CSS, y algún otro lenguaje de servidor (como puede ser PHP, JSP, ASP, etc). Esto es algo que los que programamos con frecuencia aplicaciones web nos enfrentamos constantemente.

3. Siguiendo el punto anterior, otro problema es que la aplicación web típica por lo general se divide en dos lenguajes de programación distintos. Uno para el cliente (Javascript) que se ejecuta localmente en el navegador, y otro para servidores (PHP, JSP, ASP, etc). En vez de uno poder programar todo en un solo lenguaje.

4. Lenguajes como Javascript y PHP no fueron diseñados para escalar masivamente de forma horizontal.

Dart promete resolver todo esto, con un lenguaje super sencillo y que resultará familiar para toda persona que tenga al menos un conocimiento básico de Java, C#, o similares.

Dart parece un cruce entre Java y Javascript, por un lado soportando las estructuras de Java (Classes, Interfaces), pero por otro permitiendo opcionalmente la declaración de variables sin tipos explícitos (de forma similar a Javascript, Visual Basic o ColdFusion).

Dart además fue pensado para escalar masivamente, de modo que aplicaciones creadas en Dart para ambientes de servidores podrían por ejemplo comportarse como las de Google en sus inmensas granjas de servidores, tomando ventaja de patrones de alta escalabilidad.

Por ejemplo, algo que noté curioso sobre Dart es que intencionalmente es single-threaded (es decir, soporta un solo hilo de ejecución), lo que a primera vista aparenta una gran restricción, pero al leer la especificación técnica se hace evidente que reemplazaron el concepto de multi-threading por el concepto de Isolates (popularizado por el lenguaje Erlang).

Isolates en esencia es bastante similar a programar Processes en C bajo ambientes UNIX. Es decir, es como hacer un fork (o bifurcación de código) de un nuevo programa, en esencia separando el Isolate de tu programa por completo.

Esto tiene como gran beneficio que ahora tanto tu programa como los que desprendas de él en forma de Isolates se pueden paralizar de forma sencilla y altamente escalable.

Obviamente es necesario poder uno comunicarse entre el programa principal y los Isolates desprendidos, y para eso se adoptó un sistema de mensajería por queue.

Según Google, estas facilidades de Dart permitirán crear desde pequeños programas por un solo desarrollador, hasta complejos mega-sistemas con grandes equipos de desarrolladores, programando desde aplicaciones móviles hasta aplicaciones en la nube para millones de usuarios, todas con un solo lenguaje y entorno de ejecución.

Por si no lo han notado, Dart entonces apunta no solo a ser un reemplazo de Javascript en navegadores web al largo plazo, sino que además un reemplazo de Java, .Net, Metro, Objective-C, PHP y todo otro lenguaje que se puedan imaginar.

Esa es una meta bastante ambiciosa, pero creo que dado que Dart es apoyado por Google (lo que significa que no tardaremos en ver entornos de ejecución nativos de Dart en Google Chrome y Android OS), y que Dart intrínsecamente es un lenguaje sencillo de rápido aprendizaje y con una sintaxis que resultará familiar a muchos, que tiene buenas posibilidades de tener éxito.

Y hablando de entornos de ejecución, Dart funciona de dos maneras: La primera y más obvia es en una máquina virtual Dart, similar a como ejecuta Java, lo que podemos llamar la forma "nativa" de ejecutar aplicaciones Dart.

La otra manera es con un convertidor que convierte programas Dart a Javascript, lo que permitiría a desarrolladores ir trabajando con Dart mientras migran de Javascript y esperan que los proveedores de navegadores web adopten el lenguaje.

Por el momento el convertidor funciona con versiones recientes de Chrome, Firefox y Safari (todavía no con Internet Explorer). Lo ideal obviamente sería que Mozilla, Apple y Microsoft implementaran la máquina virtual de Dart en sus navegadores, pero habrá que esperar a ver si estas instituciones y empresas no se sienten amenazadas por Dart y están dispuestas a adoptarlo.

Una buena noticia es que Google ha hecho a Dart 100% Open Source, con la esperanza sin duda de que Dart se convierta en un estándar por-defecto, y que quizás sea adoptado por competidores bajo la promesa que al igual que HTML5, la industria sería quien defina su futuro (aunque bajo la tutela de Google, muy posiblemente).

Personalmente, este es el primer lenguaje de programación que verdaderamente me emociona desde los días del inicio de Java, pues con su simpleza se presta mucho a uno ser muy productivo rápidamente.

En nota relacionada, les traigo lo que para muchos quizás sea una primicia relacionada a Dart: Todos los rumores apuntan a que Google está desarrollando también un IDE (un entorno de programación visual integrado) que se ejecutará como un servicio "en la nube" al cual internamente llaman "Brightly" ("Brillante").

La idea de Brightly sería una que he mencionado varias veces en muchas de mis charlas en vivo: El desarrollo de un IDE que funciona al 100% dentro de tu navegador Web, con todos tus archivos fuentes archivados en la nube, lo que significa que podrás trabajar desde cualquier lugar, a cualquier hora, en cualquier máquina que tenga un navegador web moderno, y quizás con un simple clic arrancar la aplicación en un ambiente de prueba o producción (como bien podría ser el Google App Engine).

Una nota final que quiero agregar es que no se apresuren a declarar la muerte prematura de Javascript. Javascript estará con nosotros por mucho tiempo más, en particular dada las millones de páginas web que dependen de ese lenguaje en la actualidad, y del hecho que Dart aun está en etapa de desarrollo, por lo que aun si se convierte en todo un éxito su impacto no se empezará a sentir por al menos 2 años más.

Sin embargo, si tienen un tiempo libre, no estaría mal que le dieran una repasadita a los documentos técnicos de Dart, e incluso que prueben crear un par de programas en el lenguaje, o hasta sugerir cambios a Google en esta etapa abierta para comentarios. Este bien podría ser parte del futuro de la web...

Dart : Structured web programming

Bluestacks :: App Player for Windows :: Run apps fast on your PC or tablet

This application lets you run Android applications in your PC (Mac soon)

Check this video on Youtube: http://youtu.be/Nus9-Tu_J9k

Bluestacks :: App Player for Windows :: Run apps fast on your PC or tablet

miércoles, 5 de octubre de 2011

Utilizing the HTML5 File API to choose, upload, preview and see progress for multiple files

Excelente código para subir archivos usando AJAX. Lo nuevo es que permite el famoso "drag & drop" (al mejor estilo Gmail) para arrastrar tu archivo hasta el browser y luego subirlo.
Lo probé en Firefox y Chrome, dando excelentes resultados!

Utilizing the HTML5 File API to choose, upload, preview and see progress for multiple files - Robert's talk

martes, 27 de septiembre de 2011

Microsoft desarrolló un software para teletrabajo



Microsoft desarrolló un software para teletrabajo

La empresa se unió con Jobing y Datco para realizar las aplicación especialmente diseñada para esta práctica laboral. Se puede acceder a la plataforma desde PC, tablet y teléfonos, y está basada en las herramientas Sharepoint y Lync.



[ 1 ]
Jobing un software exclusivo para teletrabajo.
El programa se llama Jobing y permitirá a los empleados cumplir sus funciones desde cualquier lugar y acceder desde dispositivos como unaPC, notebooks, tablets o smartphone a las aplicaciones corporativasen forma segura.

Con esta alianza, Microsoft buscó fortalecer sus conocimientos en el sector y así desarrollar la aplicación especialmente diseñada para empresas que aplican el trabajo a distancia. Actualmente con más de 700 compañías están considerando la posibilidad de implementarlo en el país, mientras que el 15 por ciento ya está transitando un proceso de implementación concreto.

El software permitirá que el teletrabajador y su jefe estén comunicados utilizando todos los medios existentes: teléfono, mail, video conferencia, Chat, blog o muro, para realizar su tarea de manera segura y productiva.

Además, permite que navegue por toda la información que necesita, comparta documentos en línea, realice búsquedas y trabaje en equipo. Otra ventaja es que el empleado pueda recibir asistencia permanente y cuenta con todos los recursos que necesita.

Fabio Boggino, director de Jobing, explicó que está unión permite a las organizaciones contar con la herramienta indispensable para que los teletrabajadores y telesupervisores puedan realizar sus tareas desde cualquier lugar sin necesidad de concurrir a los edificios laborales, “mejorando su calidad de vida y productividad”, dijo.

"Una vez que una empresa decide aplicar teletrabajo con sus trabajadores, el software se instala en los servidores de la organización para que los empleados accedan luego de manera remota", agregó Boggino.

Por su parte, Fernando Jaime, gerente de servicios profesionales de Datco, sostuvo que no se trata sólo de tecnología sino de una solución que permite acceder al ambiente de trabajo tal como en la oficina. “La solución se basa en herramientas de productividad de Microsoft como Sharepoint y Lync”, remarcó.

En tanto, Agustina Seiguer, directora de Negocios de la división de productividad de Microsoft Argentina y Uruguay, consignó que “Lync unifica todas las formas de comunicación empresarial para brindar a los usuarios una experiencia mucho más conectada, facilitando el teletrabajo, a través del uso de la PC, la Web y el celular”.

El software fue diseñado por tres expertos en la materia: Jobing se ocupó del asesoramiento relacionado con el trabajo a distancia, Microsoft aportó las herramientas de desarrollo, mientras que Datco diseñó la solución y será la encargada de comercializarlo e implementarlo.

Microsoft desarrolló un software para teletrabajo - CanalAR

viernes, 16 de septiembre de 2011

AnythingSlider | CSS-Tricks

Anything Slider is a jQuery plugin which allows you to show any website or HTML code as slider.... Trully fantastic and easy to use. Good work they've done.

Download latest: http://github.com/ProLoser/AnythingSlider/downloads

AnythingSlider | CSS-Tricks:

jueves, 15 de septiembre de 2011

PHP - Getting coordinates based on address


I have attached here the class and a test file so you can see how it works.
I plan to develop this class in the future that’s why it requires a Google Maps API key.
Here is the test file for it, just to make an impression on how it looks like :
  1. <?php
  2.  
  3. //include our class
  4. require_once(dirname(__FILE__) . ‘/class.googleHelper.php’);
  5.  
  6. //your Google Maps API key (you can get one for free from http://code.google.com/apis/maps/signup.html)
  7. $apiKey = ‘API_KEY_HERE’;
  8.  
  9. //init our object
  10. $obj = new googleHelper($apiKey);
  11.  
  12. //get coordinates and print the debug info
  13. $address = ‘Danmark, Sjælland, Hørve, Dragsholm Alle 4534′;
  14. print ‘For our "’ . $address . ‘" we have these data : ‘;
  15. print ‘<pre>’;
  16. print_r($obj->getCoordinates($address ));
  17.  
  18. ?>