Mostrando las entradas con la etiqueta programacion. Mostrar todas las entradas
Mostrando las entradas con la etiqueta programacion. Mostrar todas las entradas

Pensando sobre la Estrategia de Desarrollo Móvil Multiplataforma


Como programador de aplicaciones móviles debes preguntarte cual es tu estrategia para desarrollar aplicaciones para las diversas plataformas que existen. Esa pregunta es algo difícil de contestar, y se debe a que tenemos muchas opciones disponibles. A continuación veremos las opciones que tenemos para desarrollar para iOs, Android, Windows Phone o Windows 8, cual sería tal vez la más recomendable y espero también tu opinión.

El desarrollo multiplataforma quiere decir, básicamente, que construyamos una aplicación móvil que funcione en distintos dispositivos móviles sin importar el sistema operativo con el que cuenten. No necesariamente en todos, pero si en varios. Es decir, puedes tener una idea para una aplicación, luego piensas ¿va a funcionar en Android? ¿Y qué pasa con iOs? ¿Desarrollo también para Windows Phone sin importar que su nicho de mercado es pequeño? ¿Aún debo recordar a BlackBerry? Espero que no.

El escenario más común, y que la mayoría de desarrolladores y empresas consideran es elegir entre Android y iOs, o si debería desarrollar una aplicación nativa o una versión web de la aplicación. Tal vez se considere una versión nativa para Windows Phone u 8. La cosa es que, todo llega a un punto en que tienes que decidir. Y tienes que decidir porque si no tu extraordinaria aplicación nunca llegará a las masas.



Veamos las diferentes opciones:

1. Aplicaciones Nativas 

Está bien. Seguro parece la mejor opción. Pero, espera, piensa que tienes que desarrollar en Objective C si quieres hacer una aplicación para iOs. Vas a utilizar el framework Cocoa y tendrás que tener una Mac. Para Android, tienes que saber Java y puedes desarrollar en Mac o Windows, pero es probable que tengas que utilizar un emulador. Ahora cuando vayas por la opción de desarrollar aplicaciones nativas, por supuesto que tienes acceso a todos los elementos de la interfaz gráfica nativa. Construyes la aplicación y los usuarios van a percibir dicha aplicación especial para esa plataforma. Es la idea por la que la mayoría se decide por construir aplicaciones nativas. Apuntas a dos grandes mercados si solo desarrollas en Android y iOs. Si eliges desarrollar una aplicación de pago, la mejor opción es desarrollar para iOs, olvídate de Android, que es el reino de las aplicaciones gratuitas.

2. Aplicaciones HTML5 o Híbridas

La opción 1 es esa. La opción 2 es hacer algo entre desarrollo nativo y lo que es puro HTML o un desarrollo multiplataforma. Una opción recomendable es utilizar las herramientas de desarrollo Xamarin. Xamarin te permite escribir una aplicación para Android y iOS en C#. Puedes utilizar las librerías portátiles en C# para escribir gran parte de código portable que puedes reutilizar. La diferencia entre desarrollar aplicaciones nativas y desarrollar aplicaciones con Xamarin es muy pequeña porque Xamarin se coloca encima de las API nativas y lo que hace es dejarte escribir el código Java o de Objective C mediante C#. Hay mucho tras bastidores, pero seguirás utilizando los controles nativos. Es solo otra capa de desarrollo encima. Después de Xamarin hay otras herramientras como Titanium. O como PhoneGap donde realmente construyes una aplicación híbrida. Ya estamos entrando al terreno de HTML5.

Puedes construir una aplicación HTML5 y básicamente alojarla en tu hosting, y puedes hacer que funcione en plataformas móviles. Puede ser que utilices algo como Kendo UI de Telerik o Sencha Touch. Luego lo que tienes es básicamente una aplicación HTML5 que es responsiva o adaptable (el término que prefieras) y que funciona en diferentes plataformas móviles. Si quieres hacer un instalador, puedes encapsular esto en algo como PhoneGap y en sí crear una aplicación nativa.

Ahora veamos las ventajas y las desventajas. 

Si vas a desarrollar una aplicación nativa, lograrás la experiencia Android o iOS o Windows más pura, pero necesitas experiencia, herramientas y desarrolladores que pueden escribir en esas plataformas. Escribir código en Objective C, si nunca lo has hecho antes, no es tan fácil. Hay una gran curva de aprendizaje. Incluso por el lado de Java y desarrollando en Android, también hay una gran curva de aprendizaje. Si quieres crear aplicaciones Windows Phone es una plataforma completamente distinta y Windows 8 también es otro mundo.



Si vas por el camino del HTML5, las cosas aún están en una edad temprana. Tal vez cuando los dispositivos puedan ser más poderosos, podremos desarrollar aplicaciones HTML5 para plataformas móviles. Pero aún no. Justo ahora, la experiencia es complicada. Es un poco difícil lograr que las cosas funcionen correctamente en cada dispositivo y que se vean igual de bien, y existe un tiempo de espera para la carga del contenido o la interfaz. No son tan rápidas. No tanto como cuando desarrollas aplicaciones nativas.

Ahora si tomamos una aproximación híbrida, esa es la más recomendada. Para la mayoría de desarrolladores, yo por ejemplo, se nos hará más fácil haciendo las cosas con Xamarin. Piensa que escribirás código una vez y funcionará de forma nativa en varias plataformas.

Si usas algo como MvvmCross, la cual es una librería que funciona con Xamarin, permite que utilices el 90% del código, y la única cosa diferente entre las plataformas son las vistas. Xamarin parece ser una opción muy buena, ya que aunque tengas que aprender algo sobre el desarrollo para iOs o para Android o para Windows, aun tendrás mucho código común que escribirás en C#. Básicamente utilizarás un único lenguaje de programación en vez de probar aprender al menos tres lenguajes diferentes y no poder compartir el código entre ellos. Y tampoco vas a tener los problemas que tendrías con HTML5. Por ahora, Xamarin parece ser la mejor opción, y luego el desarrollo híbrido y luego el nativo. En HTML5 todavía no. Tal vez en el futuro.

No es que esté haciendo promoción a Xamarin. No tengo comprada ninguna licencia con ellos, yo aún programo en Java para Android, sé C# y con esa habilidad podría construir aplicaciones móviles Windows pero pienso que las características de Xamarin la hacen una herramienta insuperable, he probado la versión gratuita y parece cumplir con lo que promete. Y al final la decisión depende de tí, amigo desarrollador.

Espero tu opinión y tal vez cuentes tu experiencia.

Mejora tus Habilidades en SQL Server sin Pedir Dinero al Banco

¿Dónde puedo aprender más? Es la pregunta que se hace alguien siempre que lleva un curso o una carrera. En lo que respecta a SQL Server, es igual. El problema es que inscribirse en una certificación, un curso libre o un seminario representa invertir mucho dinero, sin embargo, hay que ser honestos y creo que muchos de ustedes compartirán mi opinión: en realidad ese tipo de eventos no nos enseñan más de lo que ya sabemos, porque por ejemplo, una certificación es más un cartón que dice que eres experto en SQL Server, pero puedes encontrarte con un adolescente de 13 años que sabe lo mismo que tu. En serio.

La verdad de la milanesa es que hay dos simples cosas que sé y que debes saber tu también.

  1. Las personas quieren aprender más.
  2. La comunidad de SQL Server es simplemente asombrosa y le gusta compartir lo que conoce.

La parte divertida es que la mayoría de personas parece pensar que es caro aprender. El hecho es que tus habilidades pueden crecer mucho sin tener que pedir dinero a un banco. Sólo tienes que invertir tu tiempo.

Veamos una lista pequeña de recursos que me sirvieron y sirven mucho para aprender y pueden servirte, creo que te van a servir para que tus habilidades aumenten. Las buenas notificas es que la mayoría son gratuitas, otras hay que pagar algo pero no es mucho, pero en casi todas la única inversión que tienes que haces es tu tiempo. Si quieres invertir en ti mismo, el mejor recurso disponible que tienes es disponible es el tiempo. Úsalo sabiamente.

A continuación mis consejos:

  1. Leer.
  2. Ver.
  3. Participar.

1. Leer

Nunca es suficiente. Hay una increíble cantidad de sitios web y blogueros (como yo) ahí afuera escribiendo sobre SQL Server. Algunos de ellos son sorprendentes, incluso yo. La mayoría de esos blogueros son realmente buenos. Incluso si no entiendo la mitad de lo que leo, lo cual es muy probable, pongo en mis marcadores ciertos artículos que pienso que me ayudarán en el futuro. Mi consejo es disponer unos 30 minutos para leer sobre lo que está pasando en el mundo del SQL Server. Y cuando estas personas enlazan a otro autor, empieza a leer sus artículos también. A continuación una lista de blogs que deberías leer y si están en inglés, hay buenos bloggers que escriben en español pero la realidad es que lo más nuevo y mejor está en inglés (no seas el tipo del comercial del éxito):

2. Ver

3. Participar

Hay muchos foros en internet sobre SQL Server. Participa en uno o dos de ellos. Cuando encuentres un problema que se te resiste, no temas preguntar. Comparte lo que sabes o lo que sabes que no sabes. Y alguien te dirá, está bien, está mal. Pero de esa forma se aprende.

10 Consejos Para Desarrollar en PHP

1) Oriéntate a Objetos

Si no has entrado al reino de la programación orientada a objetos, estás en desventaja, y estás quedándote atrás muy rápido.

OOP es esencialmente un método de programación con el uso de clases u objetos, que agrupan métodos similares y eliminan la necesidad de repetir el código y realizar ciertas tareas básicas de producción muy simples. Los objetos son esencialmente clases que juntan funciones y las empacan en una envoltura que puede ser utilizada una y otra vez sin necesidad de volver a escribir dicha funcionalidad o procedimientos cada vez que necesitas hacer algo.

La programación por procedimientos se basa en escribir una rutina cada vez que el servidor lee cada archivo. Con OOP, puedes tener uno o dos objetos instanciados, lo cual podrían convertirse en unos cuantos, cientos o miles de otros objetos que podrían desarrollar ciertas tareas dependiendo de las variables pasadas a los objetos. OOP es más rápida, simple y fácil de depurar, usa menos recursos del servidor, menos código, es más rápido cargar y más lógica para trabajar una vez que entiendas los principios básicos.

2) Aléjate de cualquier cosa que termine con _once()

Todos sabemos que include() simplemente da una advertencia si falla, mientras que require() mata el script con un error fatal cuando falla. Nosotros no debemos olvidar que include_once() y require_once() son extremadamente duros con los recursos del servidor. No hay nada que podamos hacer respecto a eso, es cómo funciona PHP. Sólo recuerda que esas cosas matan tus recursos del servidor, especialmente cuando estás utilizando un framework enorme, y si planeas utilizar tu código propiamente no las necesitas.

3) Desarrolla con Error Reporting On

La primera cosa que debes hacer cuando inicias un nuevo proyecto es activar el reporte de errores a E_ALL, y sólo debes desactivarlo cinco segundos antes de enviar tu código a producción. No hay nada como un proyecto en producción sin errores. Con Error Reporting On, detectarás cualquier pequeño error que eventualmente saltará a morderte en el cuello … creo que entiendes.

4) Utiliza un A Framework si lo necesitas

Alguien podría recomendarte no utilizar framework porque son muy grandes y pesados, pero los framework ayudan con las tareas aburridas, aunque tienes que aprender las funciones del framework para hacer esas cosas simples, es la única desventaja. Te ayuda a disminuir la oportunidad de escribir mal código ya que alguien ha escrito lo básico por ti … aunque claro debes pretender que eso no es verdad.

5) Usa las funciones incorporadas de PHP

Ok, quieres contar la cantidad de elementos en un array? Puedes realizar un bucle sobre el array e incrementar el valor por cada iteración. O puedes utilizar la función de PHP count(), lo cual hace lo mismo. PHP tiene muchas funciones incorporadas que pueden hacer muchas cosas que necesites, de modo que revisa el manual para saber si estás haciendo las cosas de la mejor manera posible.

6) Protege tu base de datos

La forma más segura es utilizar la función mysql_real_escape_string() para cualquier dato que vaya a enviarse a la base de datos. Esta función se asegura que todas las cadenas no contengan código malicioso, de modo que es el primer paso para proteger tus datos. Otra cosa que puedes hacer es validar todas las cadenas POST y GET, nunca usar $_REQUEST, y asegurarte que todos los datos enviados por formularios son del tipo y valor correcto antes de ejecutar la consulta a la base de datos.

7) Usa POST No GET

No siempre es posible, pero cuando no es necesario, no utilices GET, usa POST. La razón es simple, GET es fácil de emular, todo lo que necesitas es agregar algo a la barra de direcciones y tu proyecto quedará alterado. Obvio, GET es la forma más fácil de realizar paginación y permalinks, pero cuando se envían datos de formulario, quédate con POST, es más seguro.

8) Dibuja antes de codificar

Una buena práctica antes de empezar a aporrear el teclado, es realizar un esquema de tu proyecto, incluso unas cuantas notas en una hoja de papel. Es muy importante ya que proporciona la mecánica de tu aplicación antes de sentarte a codificar, porque en el proceso de planificación tu tomarás la conciencia de las dificultades y evitarás ese gran dolor de cabeza cuando percibas que estás haciéndolo todo mal, o alguna cosa innecesaria o estúpida.

9) Entiende tu proyecto

Un artista no puede dibujar algo que no ha sido antes visto. Un cantante no puede cantar una canción que no ha escuchado antes. No puedes codificar un proyecto que no has entendido totalmente. Si no entiendes exactamente lo que necesitas hacer, y cómo necesitas hacerlo, no vas a poder construirlo.

10) Codifica, Codifica, Codifica

No puedes llegar a ser un buen desarrollador leyendo. No puedes llegar a ser un buen desarrollador si estás mirando a alguien desarrollar. El único método probado y seguro para convertirse en un buen desarrollador es escribir código. Codificar. Pero, y es el truco, desarrolla cosas reales. No codifiques algo en lo que no tienes interés o no lo usarás. Construye algo que te guste, y estará excitado e interesado en hacerlo, y por eso podrás aprender. Luego, hazlo sorprendente, agrégale más cosas y hazlo mejor.

Certificación Java EE 6 Web Services Developer (OCEJWSD) – Como Prepararte para el Examen

El nivel Oracle Certified Expert (OCE) para Enterprise Edition 6 Servicios Web Java (OCEJWSD) es obtenido al pasar las pruebas de certificación de los candidatos que deben demostrar que tienen las habilidades prácticas  que se requieren para crear, implementar y desplegar servicios web y clientes de servicios web que utilizan la tecnología Java.

En este artículo vamos a revisar como es que está diseñada la Certificación OCE Web, que tipo de pruebas se realizan y cuáles no, y como prepararte para y dar el examen. También hay algunos consejos para prepararse para el examen, incluyendo material de preparación y consejos para afrontar cada parte del examen.

Certificación “Oracle Certified Expert, Java EE 6 Web Services Developer

La certificación OCEJWSD 6 proporciona a los estudiantes los conocimientos necesarios para el desarrollo de Servicios Web con Java (Java EE6 SDK) permitiéndoles así: crear, implementar y desplegar servicios web y clientes de servicios web con Java. Se centra en APIs de servicios web Java EE 6 como JAX-RS y JAX-WS.

Los siguientes son los temas del examen para ser Java EE 6 Web Services Developer Certified Expert

  • Crear un servicio web SOAP en un contenedor servlet.
  • Crear un servicio web RESTful en un contenedor servlet.
  • Crear un servicio web basado en SOPA implementando en un componente EJB.
  • Crear un servicio web RESTful implementado en un componente EJB.
  • Configurar la seguridad del Java EE para un servicio web SOAP.
  • Crear un servicio web cliente para un servicio web basado en SOAP.
  • Crear un servicio web cliente para un servicio web RESTful.
  • Crear un servicio web basado en SOAP utilizando la plataforma Java SE.
  • Crear manejadores para servicios web SOAP.
  • Crear servicios web SOAP de bajo nivel.
  • Utilizar MTOM y MIME en un servicio web SOAP.
  • Utilizar WS-Addressing con un servicio web SOAP.
  • Configurar el nivel de seguridad de los mensajes para un servicio web SOAP.
  • Aplicar las mejores prácticas para diseñar e implementar servicios web.

¿Cómo comienzo?

La primera cosa que necesitas del sitio web de Oracle para empezar a certificarte es entender los objetivos del examen. Hay subtemas para cada sección mencionada a continuación y se recomienda estudiar todos los capítulos para lograr un buen puntaje.

Consejos para prepararse para el examen de Certificación

El paquete JAX-WS es utilizado para crear servicios web basados en SOAP en Java. Hay dos áres importantes que debes entender.

  1. Crear un servicio web a partir de un archivo WSDL utilizando JAX-WS. Investiga más acerca de la herramienta wsimport para generar artefactos desde WSDL. Hay mucha información que nos explican como manejar el código JAX-WS en Java, estudia todas las anotaciones que traen ejemplos. Por ejemplo Access MessageContext.SERVLET_CONTEXT desde un @WebServiceContext inyectado.
  2. Crear un servicio web empezando con código fuente Java utilizando JAX-WS. Las siguientes anotaciones con ejemplos son parte de este examen.
    • @WebService para indicar un servicio.
    • @WebMethod, @WebMethod (exclude) para indicar métodos de servicios.
    • @SOPABinding para seleccionar doc/lit, doc/bare, rpc/lit style de un servicio web.
    • @Oneway donde el servicio no tiene ninguna respuesta.
    • @WebParam, y @WebResult para personalizar parámetros y operaciones de nombres.
  3. La API JAX-RS introducida en Java EE 6 es utilizada para crear servicios web REStful. Debes tener buen conocimiento para aplicar anotaciones JAX-RS en Java o componentes Servlet o EJB. Recuerda estudiar el nuevo EJB tipo Singleton con estas anotaciones. Las siguientes anotaciones con ejemplos son parte de este examen.
    • @Path anotación para responder a plantillas URI.
    • Anotaciones @GET, @POST para responder solicitudes HTTP.
    • Anotaciones @Consumes y @Produces para indicar los formatos de entrada y salida para el servicio web RESTful.
    • @PathParam, @QueryParam, @MatrixParam y @HeaderParam para extraer data de solicitudes.
    • Utilizar UriInfo y UriBuilder para crear URIs que se refiere a los recursos del servicio.

Es difícil explicar cada capítulo en un sólo artículo y está más allá del alcance de este.

Materiales de estudio

El único recurso gratuito encontrado en la web es de JSR PDFS de Oracle. Descarga los capítulos sobre JAX-RS y JAX-WS JSRs y lee todos los capítulos. El tutorial que dan en Oracle es un buen recurso con ejemplos de codificación.

Explicando la Arquitectura ASP.NET MVC para Principiantes

Introducción

Este artículo intenta proporcionar conceptos y fundamentos básicos del flujo de información de la arquitectura ASP.NET MVC (Modelo – Vista – Controlador) a principiantes.

MVC es la abreviatura para Modelo – Vista – Controlador. ASP.NET MVC es la arquitectura para desarrollar aplicaciones web ASP.NET de forma diferente al desarrollo web ASP.NET tradicional. Las aplicaciones web desarrolladas con ASP.NET MVC incluso son más amigables con los motores de búsqueda, lo que contribuye a mejorar el SEO de un sitio web.

Para desarrollar aplicaciones ASP.NET MVC se necesita Microsoft .NET Framework 3.5 o superior.

La interacción de MVC con el Navegador

Como en una interacción normal con un servidor web, una aplicación MVC también acepta solicitudes y responde al navegador web de la misma manera.

asp net mvc 01

Dentro de la Arquitectura MVC

Toda la arquitectura ASP.NET MVC está basada en el Microsoft .NET Framework 3.5 y con la adición de utilizar LINQ para SQL Server.

¿Qué es un Modelo?

  • Un modelo MVC es básicamente una clase C# o VB.NET.
  • Un modelo es accesible por el controlador y la vista.
  • Un modelo puede ser utilizado para pasar datos del controlador a la vista.
  • Una vista puede utilizar el modelo para mostrar datos en una página.

¿Qué es una Vista?

  • Una vista es una página ASPX sin tener un archivo de código detrás de ella.
  • Toda generación y formato específico HTML de página se puede hacer dentro de la vista.
  • Uno puede utilizar código inline (etiquetas del servidor) para desarrollar páginas dinámicas.
  • Una solicitud a una vista (página ASPX) sólo puede ser hecha desde un método de acción de un controlador.

¿Qué es un Controlador?

  • Un controlador es básicamente una clase C# o VB.NET, la cual ha heredado system.mvc.controller.
  • Un controlador es el corazón de la arquitectura MVC.
  • Dentro de la clase Controlador los métodos de acción pueden ser implementados para ser responsables de responder al navegador o llamar a las vistas.
  • Un controlador puede acceder y utilizar una clase Modelo para pasar datos a las vistas.
  • El controlador utiliza ViewData para pasar cualquier dato a una vista.

asp net mvc 02

Estándares MVC para la estructura y nombres de archivos

MVC utiliza una estructura de directorio y nomenclatura de archivos estándar la cual es una muy importante parte del desarrollo de una aplicación MVC.

Dentro de la carpeta Raíz de la aplicación, deben haber 3 carpetas para el modelo, la vista y el controlador.

Aparte de esos 3 directorios, debe existir un archivo Global.asax en la carpeta raíz, y un web.config igual que en una aplicación ASP.NET tradicional.

  • Raíz [carpeta]
    • Controlador [carpeta]
      • Archivos código fuente del Controlador
    • Modeloss [carpeta]
      • Archivos código fuente del Modelo
    • Vistas [carpeta]
      • Archivos aspx/ascx de la Vista
    • Global.asax
    • Web.config

Ciclo de Vida ASP.NET MVC

A continuación veamos como es que la arquitectura MVC ejecuta las solicitudes al navegador y las interacciones de un objeto con otro.

El proceso paso a paso es explicado en la siguiente imagen:

asp net mvc 03

Solicitud del navegador – Paso 1

El navegador solicita una URL específica. Vamos a asumir que el usuario ingresa la URL siguiente:

[xyz.com]/home/index/

El trabajo de Global.asax – ruteo MVC – Paso 2

La URL indicada es interpretada por el método application_start() dentro del archivo Global.asax. Desde la URL solicitada, también interpretamos el Controlador, la Acción y el ID.

De modo que para [xyz.com]/home/index/:

Controlador=home

Acción= index()

ID=vacío, no hemos indicado ID en [xyz.com]/home/index/, de modo que se considera vacío

Métodos del Controlador y de Acción – Paso 3

MVC ahora encuentra la clase controlador home en la carpeta Controlador. Una clase controlador contiene diferente métodos de acción.

Puede haber más de un método de acción, pero MVC sólo invocará el método que ha sido interpretado desde la URL, en nuestro caso es index().

De modo que algo como: homeControlador.index() sucederá dentro de la clase controlador MVC.

Ínvocar el método de acción puede retornar un texto o HTML generado utilizando una vista.

Llamar a una vista – Paso 4

Invocando la vista retornará vista(). Una llamada a la vista accederá a la página ASPX en particular dentro de la carpeta Vistas y generará el HTML desde ASPX y responderá de vuelta al navegador.

En nuestro caso, el controlador fue home y la acción fue index(). De modo que llamando view() retornará un HTML generado desde la página ASPX localizada en /vistas/home/index.aspx.

Eso es, todo el proceso, espero se entienda y es como funciona la arquitectura MVC.

Como Escribir una Chrome App para tu Sitio Web en 5 minutos

Parece dificil pero en realidad es muy fácil escribir una aplicación para Chrome en menos de 5 minutos. Vamos a crear una simple Chrome App que lo que hace es agregar un ícono en la página de Nueva Pestaña de Chrome, y que al hacer clic en el ícono nos lleve a nuestra página. Es básicamente un marcador.

También como ejemplo vamos a ver como se construye una extensión para Chrome, la cual ofrece más funcionalidad, desde ella se puede buscar en un sitio web determinado o mirar las publicaciones más recientes. La extensión tampoco demora en hacerse.

Chrome es ahora uno de los navegadores más populares y esto tiene algo de sentido para tener alguna clase de presencia en la Chrome Store. Afortunadamente, como vamos a ver, necesitas pocos conocimientos de HTML, CSS y Javascript para crear una Chrome App.

Como Crear una Chrome App para tu Sitio Web

Es fácil. Descarga el archivo chrome-app.zip en tu escritorio, extrae los archivos y abre el archivo manifest.json file en el Bloc de Notas o cualquier editor de textos. Necesitas hacer unos cuantos cambios al archivo.

Agrega el nombre de tu sitio web en la línea número 2, pon una pequeña descripción del mismo en la línea 3 (menos de 132 caracteres) y reemplazar www.webwindowslinux.com en las líneas 5 y 7 con la URL de tu sitio web. Asegúrate que eres el propietario de esos sitios web y que has verificado la propiedad utilizando Google Webmaster Tools.

image

Guarda el archivo manifest.json. Ahora crea una imagen de 128×128 pixeles con el logo de tu sitio web (puedes utilizar MS Paint) y guardar el archivo con el nombre icon.png en la misma carpeta donde está el archivo manifest.json. Para ahorrar tiempo, puedes utilizar el archivo de ejemplo incluido.

Como Publicar tu Web App en la Chrome Store

Nuestra primera Chrome app está ahora lista y necesitamos publicarla en la Chrome Store. Crea un nuevo archivo zip con los archivos icon.png y manifest.json.

Luego ve al Chrome Dashboard y sube tu archivo zip. En la siguiente pantalla, elige una categoría para tu App (para tu sitio web puedes elegir Noticias y Tiempo => Cobertura informativa), agrega una descripción detallada (lo cual ayuda en SEO), algunas capturas de pantalla, elige un idioma por defecto y publica tu app. Eso es todo.

Necesitas pagar una tarifa de registro única de $5 a Google utilizando Google Wallet para activar tu cuenta de desarrollador. Esto es opcional si estás desarrollando una Chrome app /extension para tu instalación local de Chrome y no deseas publicar la aplicación en la Chrome web store.

Como crear una Chrome Extension para tu sitio web

Escribir una extensión básica de Chrome para tu sitio web es igual de sencillo.

Descarga el ejemplo chrome-extension.zip y extrae el contenido. Cambia el archivo manifest.json para incluir el nombre de tu extensión y la descripción.

image

Luego abre el archivo webwindowslinux.js e incluye la URL de tu feed RSS.

image

Pon todos los archivos en un archivo zip y subelos a tu Chrome Dashboard. Agrega la metadata apropiada, y dentro de algunos minutos, tu extensión estará funcionando en la Chrome store en todo el mundo.

Generando PDF utilizando ItextSharp en C#

Introducción

Existen varios requerimientos para generar archivos en PDF, por ejemplo generar facturas en ese formato, hay varias opciones para generar documentos PDF. Por supuesto que la opción más simple es utilizar Crystal Reports además de tener una buena calidad, pero el problema con Crystal Reports es que es necesario instalarlo, y si es un proyecto web, se necesita instalar Crystal Reports en el servidor del hosting, de modo que encuentro en ItextSharp una alternativa interesante.

Después de investigar en varios artículos de internet para poder generar la factura tal como la esperaba un cliente, ya que la información para utilizar ItextSharp está en partes así que vamos a ver una forma más completa: como emitir un PDF con encabezado, cuerpo y pie de página.

Requerimientos

La librería iTextSharp está disponible gratuitamente y puede ser descarga desde aquí.

Utilizando el Código

Después de descargar iTextSharp , hay que agregar una referencia a la librería de ITextSharp en tu proyecto.

Utiliza el siguiente espacio de nombres antes de empezar a escribir código.

using iTextSharp.text.pdf;

using iTextSharp.text; 

El código sería el siguiente:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using iTextSharp.text.pdf;
using iTextSharp.text;
using System.IO;

namespace CrearPDF_iText
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btnCrearPDF_Click(object sender, EventArgs e)
        {
            Document doc = new Document(iTextSharp.text.PageSize.A4);

            System.IO.FileStream file = new System.IO.FileStream(Application.StartupPath + "/" + DateTime.Now.ToString("ddMMyyHHmmss") + ".pdf", System.IO.FileMode.OpenOrCreate);

            PdfWriter writer = PdfWriter.GetInstance(doc, file);
            doc.Open();
            PdfPTable tab = new PdfPTable(3);
            PdfPCell cell = new PdfPCell(new Phrase("Encabezado", new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 24)));
            cell.Colspan = 3;
            cell.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right
            //Style
            cell.BorderColor = new BaseColor(System.Drawing.Color.Red);
            cell.Border = 1; // | Rectangle.TOP_BORDER;
            cell.BorderWidthBottom = 3f;
            tab.AddCell(cell);
            //row 1
            tab.AddCell("R1C1");
            tab.AddCell("R1C2");
            tab.AddCell("R1C3");
            //row 2
            tab.AddCell("R2C1");
            tab.AddCell("R2C2");
            tab.AddCell("R2C3");
            cell = new PdfPCell();
            cell.Colspan = 3;
            iTextSharp.text.List pdfList = new List(List.UNORDERED);
            pdfList.Add(new iTextSharp.text.ListItem(new Phrase("Producto de Lista 1")));
            pdfList.Add("Producto de Lista 2");
            pdfList.Add("Producto de Lista 3");
            pdfList.Add("Producto de Lista 4");
            cell.AddElement(pdfList);
            tab.AddCell(cell);
            doc.Add(tab);
            // calling PDFFooter class to Include in document
            writer.PageEvent = new PDFFooter();
            doc.Close();
            file.Close();
        }

      
    }

    public class PDFFooter : PdfPageEventHelper
    {
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            //base.OnEndPage(writer, document);
            // Writing Footer on Page
            PdfPTable tab = new PdfPTable(1);
            PdfPCell cell = new PdfPCell(new Phrase("Prueba de Pie de Página"));
            cell.Border = 0;
            tab.TotalWidth = 300F;
            tab.AddCell(cell);
            tab.WriteSelectedRows(0, -1, 300, 30, writer.DirectContent);
        }


    }
}

Puntos de Interés

El siguiente código es para crear un PDF a disco con la ayuda de la clase FileStream class, también puedes utilizar la clase MemoryStream para enviar el PDF como una respuesta.

System.IO.MemoryStream str = new System.IO.MemoryStream();

        PdfWriter writer = PdfWriter.GetInstance(doc, str);

        Response.AddHeader("Content-Disposition", "attachment;filename=report.pdf");

        Response.ContentType = "application/pdf";

        Response.BinaryWrite(str.ToArray());

        str.Close();

        Response.End();

Cómo optimizar el software para Windows y Tablets

Es evidente que el futuro de Windows tiene que ver con las tablets y pantallas táctiles. Pero, ¿cómo escribir software que aproveche al máximo la variedad de dispositivos en que Windows se ejecuta? La clave para esto, es trabajar con los fundamentos construidos en Windows.

software-windows-tables

Uno de los puntos fuertes de Windows a menudo pasado por alto es la compatibilidad hacia atrás. Es tan fácil siempre tener en cuenta el hardware más reciente, mientras que te olvidas del hardware existente y la necesidad de encontrar formas de escribir software que puede funcionar en ambos.

Windows tiene una larga historia basada en la compatibilidad hacia atrás que puede permitir a los desarrolladores de software escribir software que se puede ejecutar en hardware actual, así como en hardware heredado. La clave para esto es la API Win32 de Windows sobre la cual fue construido.

Win32API

Mucho se ha escrito acerca de cómo usar las pantallas táctiles en tablets es tan diferente a usar el teclado y el ratón de una computadora de escritorio. En lugar de obligar a los usuarios a tener que elegir una u otra, ¿por qué no puedes el software escribirse dinámicamente y que vaya a cambiar dependiendo del hardware sobre el que se utiliza?. Aunque la mayoría de los programadores de hoy en día dependen de marcos de software complejos, pocos pueden apreciar el poder del bajo nivel de la API de Windows. Esta API fue diseñada para ser dinámica. Uno de los problemas que se enfrentan es cómo construir software que pueda tomar ventaja de las características que se encuentran en una nueva versión de Windows, sin dejar de apoyar las versiones anteriores de Windows. La solución es fácil y ha existido en Windows desde Windows 95. Hay APIs que permiten que al software comprobar si existe una API o no, y entonces, si lo hace, es llamar a través de un puntero y si no lo hace, se utiliza una solución alternativa. Además, Windows proporciona una gran cantidad de información acerca de las especificaciones actuales del equipo de ejecutarlo, lo que el software puede ser escrito a implementar características nuevas cuando estén disponibles y transformarse a sí mismo a ese hardware.

Otro problema con las diferentes versiones de Windows es que las interfaces de usuario seguirán cambiando. El aspecto y la sensación pueden ser diferentes, entre diferentes versiones de Windows. Una vez más, la API de Windows viene al rescate. En lugar de depender de la apariencia por defecto y sentir por los elementos de la interfaz de usuario, la API de Windows, desde Windows 95, ha ofrecido una variedad de medios para personalizar la apariencia de una aplicación. Cosas como OwnerDraw, customdraw, subclases (para cambiar el comportamiento por defecto), superclassing (construir nuevas clases de control sobre los ya existentes) e incluso clases de escritura de ventana personalizadas desde cero, todas ofrecen maneras de escribir aplicaciones que pueden parecer y actuar de manera muy similar en varias versiones de Windows. Lo sorprendente es que estas características han estado en Windows desde el principio, desde Windows 95.

Incluso cuando se trata de gráficos, no es totalmente dependiente de lo último en hardware de DirectX y la última versión de Windows. Desde Windows 95, El soporte de DIB está en la API de bajo nivel (mapas de bits independientes del dispositivo), ha sido la piedra angular sobre la cual las tecnologías posteriores (por ejemplo, vídeo) se han construido. Cuando necesites una solución para la animación gráfica, puedes construir tu propio control lienzo personalizado utilizando la API de DIB y crear tu propio motor de sprites 2D en la parte superior del mismo. La belleza de esto es que ese control gráfico no dependerá de una versión específica de Windows ni requerir DirectX (sin necesidad de hardware especial o drivers). Si bien algunas de las características gráficas más avanzadas pueden requerir cosas más avanzadas, ese motor sprites 2D se ejecutará en Windows 95 hasta Windows 8. También es sorprendente lo poco que ha cambiado en el bajo nivel de la API de Win32 y cómo es compatible con versiones anteriores a Windows 8 inclusive (modo escritorio por supuesto).

El punto es que el software puede ofrecer características que han estado en Windows desde hace más de 15 años. Ahora, al añadir características dinámicas a dicho software que pueden cambiar dependiendo de la versión de Windows que se ejecute en el hardware y lo hará, entonces realmente tienes una herramienta poderosa para el desarrollo de software. No hay necesidad de preocuparse por la versión de .NET que esté en el equipo. No hay necesidad de preocuparse por la versión de DirectX que esté en un equipo. No hay necesidad de preocuparse por el tamaño de la pantalla o si se basa en dispositivos táctiles o no (cambia dinámicamente la interfaz de usuario en función de qué tipo de dispositivo está ejecutándose).

Imagínate software, que cuando se ejecute en una computadora de escritorio lo sabe y aprovecha al máximo todo el espacio disponible de la pantalla para los elementos de la interfaz de usuario? Sin embargo, cuando se ejecute en un dispositivo más pequeño, como una netbook, de forma dinámica cambie para utilizar mejor el espacio limitado de la pantalla. Y aún más, cuando se ejecute en un dispositivo táctil (es decir, tablets), cambia el diseño de usuario por completo para compensar la necesidad de elementos de interfaz de usuario más grandes para el tacto. La construcción de software dinámico es lo que se necesita ahora. En lugar de quejarse cómo el software funciona bien en una tablet, pero desperdicia espacio y funciona mal en un escritorio, ¿por qué no podemos tener las dos cosas? ¿Por qué no puede ser el software dinámico?

Otro problema con tratar de escribir software dinámico es que diferentes ordenadores pueden tener diferencias en el rendimiento. Un humilde CPU ATOM en una tableta de Windows no va a rendir lo mismo que si se ejecuta el software en una computadora de escritorio con la última CPU. La clave aquí es escribir software para el denominador más bajo, la CPU ATOM. Esto requiere software más pequeño, más rápido. La mejor manera de hacer esto es escribir software usando un compilador de código nativo que produzca ejecutables pequeños y software rápido.

El objetivo es escribir software que se pueda ejecutar en un equipo legado de 10 años con hardware mínimo. El software puede ser escrito para que alcance en un disquete pasado de moda y también sea verdaderamente transportable (lo que significa que puede copiar y ejecutar). El software debe ser transportable hoy. Debe ser capaz de ser simplemente copiados a una unidad y pasar de un equipo a otro o incluso ejecutarse directamente desde una unidad en cualquier ordenador. Esto requiere de software con una huella mínima y ninguna pesada dependencia del sistema.

Mediante el uso de un compilador de código nativo y la API de Win32 para construir software dinámico, los programadores pueden construir mejor software que puede aprovechar cualquier ordenador con Windows.

La verdadera pregunta es si, ¿puede esto realmente hacerse? La respuesta es definitivamente sí. ¿Pero lo haremos como desarrolladores de software?

Movimiento de Proyectil en C#

Introducción

C# tiene una gran variedad de bibliotecas y espacios de nombres, cuando consideras desarrollar una aplicación la cual requiere movimiento que puede ser un proyectil o una hipérbole. En el contexto de estos supuestos, C# tiene la biblioteca System.Drawing y la clase Point para dibujar el punto sobre diferentes ejes (x,y).

movimiento-proyectil

Para implementar el movimiento de proyectil en C# se utilizan bucles y otras técnicas que crean complejidad y un código sobrecargado para los programadores. La técnica que vamos a ver te puede ayudar a crear el movimiento de proyectil utilizando el control Timer y lógica de gráficos.

Entorno

El movimiento de proyectil es difícil de implementar en C#, pero es un problema común enfrentado por diferentes estudiantes y profesionales.

El Código

Este gráfico ayudará al usuario a dibujar cualquier movimiento en C#. Los ejes son definidos como son descritos en la siguiente imagen.

Coordenadas

Coordenadas:

(4,6) (6,4) (8,-4) (8,6)

El código es el siguiente:

public partial class Form1 : Form
  {

      int Cronometro = 0;

      byte Mario_Pos = 5;

      public Form1()
      {
          InitializeComponent();
      }

      private void Form1_Load(object sender, EventArgs e)
      {

      }

      void Mario_Salto()
      {
          Cronometro++;
          if (Cronometro <= 10)
              picMario.Location = new Point(picMario.Location.X + 4, picMario.Location.Y + 6);
          else if (Cronometro > 10 && Cronometro <= 15)
              picMario.Location = new Point(picMario.Location.X + 6, picMario.Location.Y + 4);
          else if (Cronometro > 15 && Cronometro <= 20)
              picMario.Location = new Point(picMario.Location.X + 8, picMario.Location.Y - 4);
          else if (Cronometro > 20 && Cronometro <= 30)
              picMario.Location = new Point(picMario.Location.X + 8, picMario.Location.Y - 6);

          else
          {
              //timer1.Enabled = false;
              Cronometro = 0;
              Mario_Pos -= 1;
          }
      }

      private void timer1_Tick(object sender, EventArgs e)
      {
          Mario_Salto();
      }

  }

En el diseño del formulario, debes poner en True la propiedad Double Buffered para minimizar la latencia del control pictureBox.

Adjunto código: ProjectileMotion

Manejar Eventos del Sistema Utilizando Código Administrado (C#, Vb.NET)

Introducción

Manejar eventos del sistema (hooks) sin una librería o una librería nativa (C ó C++) es problemático. ¿Cómo hacerlo desde código administrado sin ninguna librería? En resumen utilizando SetWinEventHook (no SetWinEventHookEx) con el flag WINEVENT_OUTOFCONTEXT.

Entorno

Un hook tradicional requiere crear una función o un método. Adicionalmente este método o función debe “ser mapeada en el espacio de direcciones del proceso que genera el evento”. Lo que significa que el método debe ser un método residente en una biblioteca nativa (DLL en C++). La razón de esto es que el sistema cargará y mapeará la ubicación de la DLL y requiere esto para encontrar el puntero de la función de tu método.

Entonces ¿cómo podemos hacer si parece que no es posible hacerlo con código administrado? Bien, hay una trampa en el escenario descrito. Cuando se utiliza el término “Hook” aplica a lo que significa el “hook”. Pero hay un tipo de hook que ha llegado a ser sinónimo de todos los hook. Espero entiendas, es algo confuso. Ese tipo de hook es llamado un "In-Context Hook" (hook en contexto).

Microsoft dice que la siguientes características describen los aspectos clave en las funciones de in-context hook:

  • Las funciones in-context hooks deben estar localizadas en una librería de vínculos dinámicos (DLL) que el sistema mapee en el espacio de direcciones del servidor.
  • Las funciones in-context hook comparten el espacio de direcciones con el servidor.
  • Cuando el servidor dispara un evento, el sistema llama a una función hook sin realizar lo que se llama la serialización.
  • Las funciones in-context hook tienden a ser muy rápidas y recibir notificaciones de eventos´de forma síncrona porque no hay serialización.
  • Algunos eventos pueden ser entregados out-of-process (fuera del proceso), incluso a pesar que tu solicites que sean entregados in-process (utilizando el flag WINEVENT_INCONTEXT). Puedes ver este comportamiento con casos de interoperabilidad de aplicación de 64-bit y 32-bit y con eventos de consola de Windows.
  • Entonces, ya sabemos que hay varios tipos de hooks. Nosotros no podemos simplemente y eficientemente crear callabacks por hooks in-context utilizando lenguajes administrados. ¿Cuál podría ser tus opciones? Ahí están las funciones de "Out-of-Context Hook".

    Microsoft dice que las siguientes características son los aspectos clave de las funciones out-of-context hook:

  • Las funciones hook Out-of-context están localizadas en el espacio de direcciones del cliente, a pesar que su código esté o no en una DLL.
  • Las funciones hook Out-of-context no están mapeadas en el espacio de direcciones del servidor.
  • Cuando un evento es disparado, los parámetros para las funciones hook son serializados a través de procesos.
  • Las funciones hook Out-of-context son notablemente más lentos en comparación con funciones hook in-context debido a la serialización.
  • El sistema pone en cola las notificaciones de los eventos, de modo que ellos llegan asíoncronamente debido al tiempo que se requiere para la serialización.
  • Como puedes ver que los hooks Out-of-Context son muy diferentes de los hooks tradicionales. Nota la parte que dice que las funciones hooks "Out-of-context” son notablemente más lentas debido a la serialización. Esto llega a ser menos relevante en estos días. Código más lento pero confiable es mejor que código rápido no confiable; las soluciones administradas son el futuro. Como puedes ver no es necesario algo especial para implementar un hook Out-of-Context.  La única cosa que se necesita es hacerlo.

    El Código

    Considera la siguiente clase:

    C#:

    public enum SystemEvents : uint
    {
    EVENT_SYSTEM_FOREGROUND = 3, //Active Foreground Window
    EVENT_SYSTEM_CAPTURESTART = 8, //Active Foreground Window Mouse Capture
    EVENT_OBJECT_CREATE = 32768, //An object has been created. The system sends this event for the following user interface elements: caret, header control, list-view control, tab control, toolbar control, tree view control, and window object.
    EVENT_OBJECT_DESTROY = 32769, //An object has been destroyed. The system sends this event for the following user interface elements: caret, header control, list-view control, tab control, toolbar control, tree view control, and window object.
    EVENT_OBJECT_FOCUS = 32773 //An object has received the keyboard focus. The system sends this event for the following user interface elements: list-view control, menu bar, pop-up menu, switch window, tab control, tree view control, and window object.
    }


    public class SystemEvent
    {
    private const uint WINEVENT_OUTOFCONTEXT = 0;
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern System.IntPtr SetWinEventHook(uint eventMin, uint eventMax, System.IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags);

    private delegate void WinEventDelegate(System.IntPtr hWinEventHook, uint eventType, System.IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
    public event SystemEventEventHandler SystemEventHandler;
    public delegate void SystemEventEventHandler(System.IntPtr hWinEventHook, uint eventType, System.IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
    private uint m_event = 0;
    private WinEventDelegate m_delegate = null;

    private System.IntPtr m_foregroundHwnd = System.IntPtr.Zero;
    public SystemEvent(SystemEvents SystemEvent)
    {
    m_event =System.Convert.ToUInt32(SystemEvent);
    m_delegate = new WinEventDelegate(WinEventProc);
    try {
    SetWinEventHook(m_event, m_event, System.IntPtr.Zero, m_delegate,System.Convert.ToUInt32(0),System.Convert.ToUInt32(0), WINEVENT_OUTOFCONTEXT);
    } catch (System.Exception ex) {
    System.Diagnostics.Debug.WriteLine(ex.ToString());
    }
    }

    public void WinEventProc(System.IntPtr hWinEventHook, uint eventType, System.IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
    {
    if ((((SystemEventHandler != null)) && (SystemEventHandler.GetInvocationList().Length > 0))) {
    m_foregroundHwnd = hwnd;
    if (SystemEventHandler != null) {
    SystemEventHandler(hWinEventHook, eventType, hwnd, idObject, idChild, dwEventThread, dwmsEventTime);
    }
    }
    }

    public System.IntPtr Hwnd
    {
    get { return m_foregroundHwnd; }
    }
    }
    Vb.NET:
    Public Enum SystemEvents As UInteger
    EVENT_SYSTEM_FOREGROUND = 3 'Active Foreground Window
    EVENT_SYSTEM_CAPTURESTART = 8 'Active Foreground Window Mouse Capture
    EVENT_OBJECT_CREATE = 32768 'An object has been created. The system sends this event for the following user interface elements: caret, header control, list-view control, tab control, toolbar control, tree view control, and window object.
    EVENT_OBJECT_DESTROY = 32769 'An object has been destroyed. The system sends this event for the following user interface elements: caret, header control, list-view control, tab control, toolbar control, tree view control, and window object.
    EVENT_OBJECT_FOCUS = 32773 'An object has received the keyboard focus. The system sends this event for the following user interface elements: list-view control, menu bar, pop-up menu, switch window, tab control, tree view control, and window object.
    End Enum


    Public Class SystemEvent
    Private Const WINEVENT_OUTOFCONTEXT As UInteger = 0
    <System.Runtime.InteropServices.DllImport("user32.dll")> _
    Private Shared Sub SetWinEventHook(ByVal eventMin As UInteger, ByVal eventMax As UInteger, ByVal hmodWinEventProc As IntPtr, ByVal lpfnWinEventProc As WinEventDelegate, ByVal idProcess As UInteger, ByVal idThread As UInteger, ByVal dwFlags As UInteger)
    End Sub
    Private Delegate Sub WinEventDelegate(ByVal hWinEventHook As IntPtr, ByVal eventType As UInteger, ByVal hwnd As IntPtr, ByVal idObject As Integer, ByVal idChild As Integer, ByVal dwEventThread As UInteger, ByVal dwmsEventTime As UInteger)
    Public Event SystemEvent(ByVal hWinEventHook As IntPtr, ByVal eventType As UInteger, ByVal hwnd As IntPtr, ByVal idObject As Integer, ByVal idChild As Integer, ByVal dwEventThread As UInteger, ByVal dwmsEventTime As UInteger)
    Private m_event As UInteger = 0
    Private m_delegate As WinEventDelegate = Nothing
    Private m_foregroundHwnd As IntPtr = IntPtr.Zero

    Public Sub New(ByVal SystemEvent As SystemEvents)
    m_event = CUInt(SystemEvent)
    m_delegate = New WinEventDelegate(AddressOf WinEventProc)
    Try
    SetWinEventHook(m_event, m_event, IntPtr.Zero, m_delegate, CUInt(0), CUInt(0), WINEVENT_OUTOFCONTEXT)
    Catch ex As Exception
    Debug.WriteLine(ex.ToString)
    End Try
    End Sub

    Public Sub WinEventProc(ByVal hWinEventHook As IntPtr, ByVal eventType As UInteger, ByVal hwnd As IntPtr, ByVal idObject As Integer, ByVal idChild As Integer, ByVal dwEventThread As UInteger, ByVal dwmsEventTime As UInteger)
    If ((Not SystemEventEvent Is Nothing) AndAlso (SystemEventEvent.GetInvocationList.Length > 0)) Then
    m_foregroundHwnd = hwnd
    RaiseEvent SystemEvent(hWinEventHook, eventType, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
    End If
    End Sub

    Public ReadOnly Property Hwnd() As IntPtr
    Get
    Return m_foregroundHwnd
    End Get
    End Property
    End Class
     
    Para utilizar esas clases, en Vb.NET:
    Dim KeyboardFocus As New SystemEvent(SystemEvents.EVENT_OBJECT_FOCUS)
    Dim ForegroundWindowWhoHasKeyboardFocus As IntPtr = KeyboardFocus.Hwnd
    Para utilizar esas clases, en C#:
    SystemEvent KeyboardFocus = new SystemEvent(SystemEvents.EVENT_OBJECT_FOCUS);
    System.IntPtr  ForegroundWindowWhoHasKeyboardFocus = KeyboardFocus.Hwnd; 
    En vez de llamar a GetForegroundWindow cada vez que quieres saber cual aplicación tiene el foco del teclado. Simplemente lo lees desde KeyboardFocus.Hwnd.
    ¿Hay una lista sustancial de EVENT_OBJECT_? Puedes encontrar la lista haciendo una búsqueda para "EVENT_OBJECT_FOCUS = 32773", en la clase sólo hay unos ejemplos. 

    Puntos de Interés


    Sería grandioso ver otros hooks Out-of-Context de ustedes. Si conoces algunos, deja un comentario.

    21 Pasos Para Mejorar el Desempeño de Aplicaciones ASP.Net

    La clave en cada aplicación de nivel empresarial para ser exitosa es la velocidad de respuesta de la aplicación. ASP.Net ofrece una gran variedad de características para desarrollar aplicaciones basadas en la web, pero algunas veces, por adherirse a las mejores prácticas, la aplicación no es tan rápida como debería ser. A continuación, 21 sugerencias para hacer mucho más veloz tu aplicación:

    1. Siempre establece debug=”false” en el web.config del entorno de producción.
    2. Siempre establece trace=”false” en el web.config del entorno de producción.
    3. Si estás utilizando ASP.Net 2.0 o una versión más reciente siempre utiliza la versión pre-compilada de tu código y siempre prefiere el tipo de proyecto aplicación web sobre el tipo de proyecto sitio web. Si estás utilizando sitio web siempre publicalo y luego sube la versión pre-compilada de tu sitio en el entorno de producción.
    4. Siempre compila tu proyecto en modo Release antes de subir tu aplicación al entorno de producción.
    5. Disminuye el peso del html: para eso utiliza menos tablas y más div´s y si es posible no le des un gran nombre para tu control ya que aumenta el tamaño en kb del html la usar ese id para diferenciarlo de los otros controles. Si estás creando controles personalizadas puedes sobre escribir tu clienteid y uniqueid.
    6. Utiliza API de cache tanto como sea posible para disminuir el ida y vuelta al servidor y mejorar el desempeño de la aplicación. ASP.NET 2.0 o versiones más altas tienen una función llamada sqlcachedependancy para el cacheo de la base de datos. Validará la caché con la base de datos de operaciones como insert, update y delete y si no es posible hay que utilizar cacheo basado en archivos.
    7. Elimina espacios en blanco del html. Puedes utilizar expresiones regulares para eliminar espacios en blanco.
    8. Para ASP.net 2.0 y versiones más recientes, utilizar master pages. Eso mejorará tu desempeño.
    9. Elige utilizar Reader sobre Dataset a menos que tengas razones especificas para utilizar las bases de datos.
    10. Utiliza llamadas asíncronas ADO.NET para extraer datos. Si estás utilizando el mismo procedimiento varias veces entonces utiliza el comando Prepare para mejorar la velocidad.
    11. Revisa la configuración del servidor IIS como requerimiento para tu aplicación.
    12. Deshabilita el estado de vista para tus controles si es posible. Si estás utilizando ASP.Net 2.0 o una versión superior utiliza el control de estado en vez de ViewState.
    13. Usa Server.Transfer en vez de Response.Redirect.
    14. Siempre utiliza el modo de estado de sesión inproc si es posible.
    15. Utiliza Ajax para tu aplicación pero de forma inteligente. Muchas llamadas Ajax para una página disminuirá el desempeño.
    16. Mide el desempeño de tu aplicación con herramientas como Redgate Profiler, Firebug y WhySlovw.
    17. Utiliza System.Text.StringBuilder para concatenar cadenas, es 4 veces más rápido que una variable tipo String.
    18. Pon el código JavaScript en archivos .Js y enlázalos al final de tu aplicación
    19. Utiliza archivos CSS para estilar tu aplicación.
    20. Utiliza el pagina de base de datos en vez de hacerlo en la aplicación, mientras muestras enormes cantidades de datos
    21. Llama a los servicios web desde java script en vez del lado del servidor. Utiliza llamadas asíncronas para llamar un método web desde el servicio web.

    Eso es todo. Para que aprendan.

    Adobe Air: Qué es, Como Programar y Tutoriales

    Estos días estoy desarrollando una interfaz para generar los libros electrónicos de SUNAT, y me topé con el software PLE de la misma, que está hecho en Adobe Air. Me pareció bastante atractiva la interfaz, pero en sí desconozco que se necesita para desarrollar aplicaciones en Adobe Air. Primero vamos a averiguar que es Adobe Air.

    ¿Qué es Adobe Air?

    AIR es la abrevitaura de Adobe Integrated Runtime. Adobe AIR, cuyo nombre clave es Apollo, es un entorno de ejecución multiplataforma para la construcción de aplicaciones RIA (Rich Internet Applications) utilizando Adobe Flash, Adobe Flex, HTML y AJAX, las cuales pueden usarse como aplicaciones de escritorio.

    Lo interesante es que una aplicación Adobe AIR puede funcionar en Windows, Linux y Mac OS, sin necesidad de volver a reprogramarla, pues básicamente es un sitio web portátil.

    Las aplicaciones pueden funcionar sin necesidad de estar conectadas a internet, pero una vez que tengan dicha conexión, su funcionalidad puede aumentar.

    ¿Cómo Desarrollo en Adobe Air?

    A la fecha, podemos desarrollar este tipo de aplicaciones de 3 formas diferentes:

    1. HTML/AJAX, a través de Adobe Dreamweaver CS3 u otros programas de edición de HTML junto con AIR SDK.x.
    2. Adobe Flash Builder x.
    3. Adobe Flash CSx

    Esto es todo por el momento, como que conocemos a Adobe AIR, estaré actualizando con enlaces a tutoriales en la red, aunque deben prepararse aprendiendo algo de inglés, porque la mayoría y los más actualizados están en ese idioma.

    Emgu CV – Plataforma de Procesamiento de Imágenes

    imageEmgu CV es una plataforma cruzada, una envoltura .Net para la librería de procesamiento de imágenes OpenCV.

    Permite a las funciones de OpenCV ser llamadas desde lenguajes compatibles con .NET como C#, VB, VC++, Iron Python, etc. La envoltura puede ser compilada en Mono y ejecutada en Windows, Linux, Mac OS X, iPhone, iPad y dispositivos Android.

    Emgu CV está escrita enteramente en C#. El beneficio es que puede ser compilada en Mono y por lo tanto puede ser ejecutada en cualquier plataforma que soporte Mono, incluyendo Linux, Mac OS X, iOS y Android. Bastante esfuerzo ha tomado pasar a una implementación pura de C# desde que los encabezados debieron ser portados, comparando con una implementación administrada en C++, donde los archivos de encabezados simplemente seria incluídos. Pero vale la pena ya que puede tener funcionando a Emgu en Windows y en Fedora 10. Con el beneficio que el código será multiplataforma.

    Fuente: www.emgu.com/wiki/index.php/Main_Page

    Descarga Crystal Reports Todas las Versiones

    SAP tiene una página donde nos permite descargar versiones de evaluación de su software de reporting Crystal Reports. Ingresa aquí.

    image

    El periodo de evaluación es de 30 días en general. Tiempo suficiente para comprarlo o hacer eso que tu ya sabes ….

    Lecciones de Programación ¡Gratis!

    Un grupo llamado CodeAcademy está ofreciendo un programa llamado CodeYear. Necesitas enviar tu email y luego te enviarán una lección de programación cada semana por todo un año (por el momento están enseñando JavaScript).

    Crear Extensiones Para Firefox [Recursos]

    Actualmente estoy interesado en desarrollar extensiones para Firefox, y como anotación aquí traigo un listado de recursos para desarrollar extensiones para Firefox, algunos o la mayoría están en inglés, pero son necesarios para aprender el tema de crear una extensión para el navegador Firefox:

    image1. Mozilla Developer Network (MDN) – Tutorial para aprender XUL.

    Está en inglés, tiene un completo tutorial para aprender XUL, que no es otra cosa que el XML necesario para programar las extensiones de Firefox.

    Enlace para MDN 

    image2. Editor de Texto Komodo Edit

    Komodo Edit es un editor de código abierto, pequeño y gratuito. Tiene soporte de XUL, y es donde desarrollan los ejemplos del enlace anterior.

    Enlace para Komod Edit

    3. XULRunner

    Permite instalar, actualizar y eliminar extensiones para Firefox y Thunderbird.

    Enlace para XULRunner

    4. Utilizar Visual Studio como Entorno de Desarrollo para XUL

    Aunque el XUL necesario para crear una extensión puede escribirse en el bloc de notas, o un editor de texto sencillo, el IDE del Visual Studio da soporte para Intellisense, validación y texto coloreado.

    Enlace

    5. Tutorial para crear una extensión de Firefox con Visual Studio

    Con el anterior podemos utilizar Visual Studio para desarrollar nuestra propia extensión para Firefox. Está en inglés, pienso traducirla y actualizarla porque es del 2006.

    Enlace

    image6. Creador de Extensiones Online

    El Add-On Builder nos permite crear extensiones básicas mediante un formulario.

    Enlace

    7. Crear una Extensión

    En ingles, es un tutorial breve pero bastante completo de como desarrollar una aplicación, incluyendo algunas indicaciones para su depuración.

    Enlace

    API Para Convertir HMTL a PDF

    imageJoliprint es un servicio Web que te permite convertir páginas web a PDF con un simple marcador. Pero también tiene una API (interfaz de programación) RESTful que desarrolladores pueden utilizar para convertir HTML en PDF.

    No requiere ninguna API Key y la APi se puede utilizar para fines comerciales o no comerciales.

    Tener disponible una API como la de Joliprint nos permite:

    • Crear plugins para sistemas de administración de contenido
    • Un sistema que permita crear PDF a partir de RSS
    • Una aplicación móvil que convierta páginas en PDF

    Y cualquier otra aplicación que nos podamos imaginar. La documentación de la API puedes revisarla aquí. Empieza a programar, tal vez encuentres una mina de oro.

    10 cosas que molestan a los programadores

    Si te consideras un 'programador', sabes que hay cosas que nos molestan, pero las 10 cosas que mas nos molestan son (en orden de molestia):

    10.Comentarios que explican el 'como' pero no el 'que'

    9.Interrupciones, de clientes, proveedores, jefes, compañeros, familiares, etc.

    8.Requisitos que crecen: primero es un programa para registrar facturas, luego se convierte en facturación con almacén, al último te piden que incluyas planillas e integración con SUNAT.

    7.Jefes que no entienden de programación.

    6.Documentar nuestras aplicaciones...¿para qué? (aunque es importante)

    5.Aplicaciones sin documentación...¿ves que es importante?


    Sigue leyendo...


    4.Fallos del hardware, que los achacan a nuestra aplicación. "Se malogró el disco duro cuando instalamos tu programa".

    3.Imprecisiones: "Oye esta fallando el programa" (¿todo el programa? ¿los 250 módulos?).

    2.Otros programadores: somos una especie solitaria, y a veces muy agresivos con nuestros semejantes.

    1.Tu propio código: "esto puede ser mejorado", "¡que feo código, lo reescribo en este momento!"

    ¿Y a tí programador, que es lo que más te molesta?

    Fuente:
    http://www.kevinwilliampang.com/post/Programming-Proverbs.aspx


    ¿Que es lo que hace un buen programador?

    En Sql Server Central tienen un artículo donde se preguntan que es lo que hace un buen programador (está en inglés, me voy a dar un tiempo para traducirlo).

    Lea el artículo aquí.

    Enlaces sobre Programación

    Me he propuesto aprender C# a fondo, ya la sintaxis la estoy manejando regular, pero me parece un buen reto que despertará a mis neuronas adormecidas por la rutina de siempre. En mi afán de aprender, estoy portando una aplicación de Visual Fox hacia C#, manejando incluso Dbf's, ya que es un sistema de planillas, que tiene su base de datos en Dbf's, una aplicación heredada.

    También estoy investigando como crear complementos y la forma de extraer información de Outlook, ya se que hay aplicaciones comerciales para eso, pero no está demas invertir tiempo en algo que sirve, además una aplicación comercial vale arriba de los mil dolares, y en el Perú, quien puede pagar eso sin que el bolsillo se resienta.

    Y esos enlaces los pongo aquí, para no volver a buscarlos luego, son enlaces a sitios de programación, algunos que he encontrado recientemente, otros que los tengo en la memoria, referente a Visual Fox, NET (VBNET y C#), Visual Basic:

    Fox Press: Revista sobre Visual Fox, uno de los lenguajes que sé usar, y me ha servido de mucho.

    Blog de Dan Fernandez: Blog sobre productos NET, ahí encontré un artículo interesante sobre como crear un complemento para Outlook.

    Otros Sitios del Guille: enlaces que tiene el archiconocido Guille, el maestro. El Guille tiene un artículo sobre como leer un archivo de texto y asignarlo a un combo, un control de lista o un listview. El Guille también tiene una sección referente a C#, una manual de iniciación, bueno y que ayuda bastante a los que estamos entrando paso a paso en el hermano mayor de VB.Net. Y el mismo Guille tiene su sección de equivalencias entre VBasic y C#, que es como un traductor para programadores como yo.

    StringBuilder: es una página del Microsoft MSDN, ahí aprendí a usar el StringBuilder.

    En MailXMail tienen un curso de C#. Incluso lo pueden descargar en PDF.

    The Code Project: sitio enorme sobre NET.

    La capacidad del programador cuenta mas que el lenguaje o herramienta de programación que usa. Es el lema de Harvey Triana, aunque no actualiza mucho sus artículos sigue siendo una referencia, desde que andaba con el VB 6.0.

    Este es un sitio más, Net un mundo por descubrir, está mas orientado a noticias o descripción de las nuevas tecnologías en programación Web: ASPNET, AJAX, etc, estoy revisandolo para ver cuanto puede servir de ayuda para un programador de aplicaciones de escritorio.

    El blog de Sergio Tarrillo, colaborador de El Guille. No solo habla de programación, sino de productividad, consejitos que no están demás.

    Y el sitio de Geeks de Microsoft, que reune a todos los blogueros de Microsoft, ahí es donde probablemente encontraremos mucha ayuda, y mas retos también...

    Bueno eso es todo, por ahora. Seguimos investigando, seguimos aprendiendo.