JASoft.org

Creación de manejadores de peticiones asíncronos: El contador de Meneame.net

Creación de manejadores de peticiones asíncronos: El contador de Meneame.net
Meneame.net es una Web recopiladora de enlaces en la que los usuarios publican enlaces que creen de interés, y el resto de los usuarios votan o critican en función de lo sus intereses. La teoría es que, de este modo, los enlaces más interesantes subirán hacia las primeras posiciones de su categoría en virtud de este proceso de "crowdsourcing". La práctica es que no siempre es así (prueba a posicionar un enlace técnico, por ejemplo). Pero no obstante la web es muy interesante para encontrar enlaces y noticias de interés general dentro de temáticas más o menos prosaicas. A cada voto que recibe una URL se le denomina "meneo". El caso es que, al menos oficialmente, no existe ningún botón de información sobre cuántos "meneos" tiene una determinada URL, al estilo de los que tiene Facebook o Twitter. Los únicos desarrollos que integran este botón para poder poner dicha información en tu blog o web pertenecen a sitios de valoración social, estilo ShareIt y compañía, por lo que si quieres tene... [Más]

Solución al mensaje "Error genérico de GDI+" en aplicaciones Web que generan gráficos

Solución al mensaje "Error genérico de GDI+" en aplicaciones Web que generan gráficos
Este fin de semana he estado trabajando en una pequeña aplicación que en breve colgaré con código fuente para todo el mundo y que me dio el error que os comento en el título del post. Aunque todo lo que utilicé era compatible con .NET 2.0, la desarrollé en mi equipo con Visual Studio 2010 y .NET 4.0, donde todo funcionaba a la perfección. Al subirla al servidor donde iba a estar albergada, de repente, me daba el error "Error genérico de GDI+" o -en inglés- "A generic error occurred in GDI+", sin más explicaciones, y con unas referencias muy raras a Remoting. Mi código original generaba una imagen que posteriormente se devolvía al navegador en formato PNG. El código que estaba utilizando era similar al siguiente: Bitmap img = new Bitmap(sRutaImagenPatron);Graphics g = Graphics.FromImage(img);Font f = new Font(fuente, tamanio, FontStyle.Bold);Brush b = colorLetra;g.DrawString(string.Format("{0:n0}", iDato), f, b, posX_Letra, posY_Letra); context.Response.ContentType = "image/png";img... [Más]

La manera correcta de actualizar contadores de rendimiento personalizados

La manera correcta de actualizar contadores de rendimiento personalizados
Esta es una pregunta interesante que ha surgido en el curso de fundamentos de la plataforma .NET que tutelo on-line en campusMVP. Se trata de una pregunta sencilla pero con una sutileza interesante respecto a la creación de contadores de rendimiento para Windows desde .NET. Cuando creamos un contador personalizado en .NET incrementamos o disminuimos su valor para actualizar la medición que queremos reflejar en el contador de rendimiento del sistema. Algunos ejemplos de contadores que podemos crear son: uno que indique el número de usuarios actualmente autenticados en nuestra aplicación Web, uno que indique el número de compras realizadas en una tienda on-line, el promedio de consultas lanzadas contra un almacén de datos, etc, etc... Tienen mucha utilidad ya que nos permiten monitorizar con las herramientas propias de Windows el desempeño de nuestras aplicaciones, tanto en tiempo real como haciendo trazas para un análisis posterior. El caso es que todos ellos implican generalmente e... [Más]

Como incluir cambios de línea en los Tooltips

Como incluir cambios de línea en los Tooltips
Hoy como es huelga general en España, un truco rapidito para que no nos tachen de esquiroles :-P Los Tooltips son esas etiquetas flotantes que aparecen cuando dejas el cursor del ratón unos instantes parado encima de algún control de tu aplicación, y que normalmente te dan información contextual interesante sobre el mismo: Son muy útiles en las aplicaciones Windows Forms, pero ¿Cómo podemos hacer para que un Tooltip se muestre como el de la figura anterior, es decir, en varias líneas? Lo primero que cabría pensar es que podríamos poner un “\n” como se hace en las constantes de cadena de C#, así: NotifyIcon1.Text = “DOTNET4\nInternet access”; Pero no funciona y veríamos realmente ese “\n” en el texto. La solución es concatenarle en cada cambio de línea la constante: Environment.NewLine con lo que quedaría algo así: NotifyIcon1.Text = “DOTNET4” + Environment.NewLine + “Internet access”; ¡Listo! Con esto conseguirás Tooltips como los de la figura superior, mucho más cómodo... [Más]

La mejor forma de aprender a programar

La mejor forma de aprender a programar
No nos andemos con rodeos: la mejor forma de aprender a programar es programando. Es más, yo diría que es la única forma de aprender de verdad a hacerlo. Esto puede parecer una perogrullada, algo obvio. Sin embargo no lo es tanto si examinamos detenidamente de qué manera aprende programación un porcentaje muy elevado de personas. Muchos aspirantes a aprender un lenguaje de programación, tecnología o entorno nuevos lo que hacen es recibir clase en un aula. Que quede claro que estoy hablando todo el tiempo de gente con poca o nula experiencia real en la tecnología concreta que está intentando aprender. Ir a un centro a formarnos -o que los docentes vengan a nuestra empresa- tiene la principal ventaja de ser muy cómodo para el que se forma. En un tiempo reducido se reciben de manera condensada muchos conocimientos. Esto puede estar bien y ser lo más adecuado si ya tenemos mucha experiencia y queremos aprender rápidamente los fundamentos de una tecnología “para saber por dónde pisamos... [Más]

OrderedDictionary vs Dictionary

OrderedDictionary vs Dictionary
Hoy, en el curso de preparación del examen 70-536, ha surgido la siguiente duda: “¿OrderedDictionary sólo se diferencia respecto a Dictionary, en qué se puede tener acceso además de por clave también por índice, o existe alguna otra diferencia mayor?” La verdad es que OrderedDictionary es un mal nombre para los programadores de habla hispana, porque hay la tendencia a pensar que ordena los elementos, cuando en realidad se refiere a que los guarda por el orden en que se han introducido con el método Add.  Un diccionario que ordene sus elementos es un SortedDictionary de tipo genérico. Así, si escribimos un código similar a este:using System; using System.Collections; using System.Collections.Specialized; public class Prueba { public static void Main() { OrderedDictionary od = new OrderedDictionary(); od.Add("05", "Cinco"); od.Add("02", "Dos"); od.Add("03", "Tres"); od.Add("04", "Cuatro"); od.Add("01", "Uno"); Console.WriteLine("Iterar como... [Más]

Videojuegos 3D renderizados en la nube

Videojuegos 3D renderizados en la nube
Hace alrededor de año y medio escribía en este mismo blog acerca de “una idea loca” sobre la que había leído. Se trataba de la posibilidad de crear super-computadores gráficos albergados en la nube de forma que sirvieran gráficos 3D renderizados en tiempo real (y ahí está lo impresionante) a dispositivos que no tienen la capacidad suficiente. Un ejemplo: teléfonos móviles o aparatos semi-tontos enchufados a una televisión normal. La idea es que el terminal simplemente envía a los servidores las pulsaciones de teclado o pantalla, los servidores gráficos renderizan en tiempo real los gráficos resultantes de esas interacciones, y el terminal se limita a visualizar dichas imágenes. El resto del tiempo se repite este bucle. A mi personalmente me parece increíble conseguir esto con la tecnología actual, y sobre todo con las redes actuales (y por lo que parece peor aún con las futuras), ya que estamos hablando de imágenes de alta calidad y movimientos a 30 o 50 frames por segundo. En el post... [Más]

Usando foreach con un diccionario genérico

Usando foreach con un diccionario genérico
Lo habitual cuando tenemos una colección o un enumerable de cualquier tipo es recorrer sus elementos usando un bucle de tipo foreach. Sin embargo, cuando usamos una colección genérica de tipo System.Collections.Generic.IDictionary, como por ejemplo Dictionary<TKey,TValue> o SortedList<TKey,TValue>, (que son super-útiles en muchos casos) nos encontraremos con dificultades. Si intentamos hacer algo como esto:Dictionary dict = new Dictionary(); dict.Add("Uno", 1); dict.Add("Dos", 2); dict.Add("Tres", 3); foreach(int numero in dict) { Console.WriteLine(numero); } Descubriremos que obtenemos un error como este otro: Cannot convert type 'System.Collections.Generic.KeyValuePair<string,int>' to 'int' En el ejemplo anterior definimos un diccionario genérico que va a llevar laves de tipo texto y que usaremos para almacenar números enteros. El problema es que esta no es la forma correcta de iterar por colecciones genéricas que tengan pares de clave/valor. L... [Más]

Archivos temporales de compilación de ASP.NET

Archivos temporales de compilación de ASP.NET
Esta pregunta ha surgido hoy en uno de mis cursos de desarrollo Web y me ha parecido interesante para comentarla aquí. Como es sabido ASP.NET Web Forms hace uso de una serie de archivos de código auto-generados para “mezclar” su código con las clases “code-beside” que contienen los eventos y el código que escribimos para los formularios Web, por medio del uso de clases parciales y herencia. Nota: Por ejemplo, en la página Default.aspx, su archivo “code-beside” sería Default.aspx.cs o Default.aspx.vb en función de si programamos en C# o VB Este código se genera dinámicamente al compilar el sitio Web y, en teoría, se almacena para hacer caché en la carpeta: C:\Windows\Microsoft.NET\Framework\vx.y.zzzz\Temporary ASP.NET Files siendo x.y.zzzz la versión de la plataforma que tengamos instalada, que en caso de .NET 4.0 es “v4.0.30319” y en las demás versiones anteriores (2.0, 3.0 y 3.5) es “v2.0.50727” (ya he dicho muchas veces que las versiones 2.0, 3.0 y 3.5 son lo mismo a efectos... [Más]

Resolver el error “No se puede encontrar el tipo” al cargar un formulario con un control propio

Resolver el error “No se puede encontrar el tipo” al cargar un formulario con un control propio
Yo no programo demasiado para Windows Forms, ya sabéis que lo mío es más la Web. Pero últimamente estoy trabajando a los ratos en un proyecto que tienen una parte de visualización para escritorio hecha con esta tecnología. Como soy partidario de reutilizar al máximo, siempre encapsulo la funcionalidad todo lo que puedo, incluyendo funcionalidad de la interfaz de usuario. Por eso en este trabajo, tengo varios controles de usuario listos para arrastrar y soltar en cualquier formulario que los requiera. El caso es que tras haber trasteado bastante con la interfaz, de repente algunos formularios me empezaron a fallar, mostrándome un error como el de la figura (yo trabajo con todo en inglés, incluidos los nombres de clases  y variables):  (la parte difusa lleva el nombre del control que no se carga y su espacio de nombres) A pesar de que en el código del diseñador del formulario todo parecía estar bien y se reconoce el tipo del control y a pesar de que si ejecutas la aplicación... [Más]

Este soy yo y este es mi blog técnico, dedicado al software y a la programación.

Mis otros blogs

- JM Alarcón @ campusMVP.es
Contenido técnico en español orientado a desarrolladores
- JMAlarcon.es
Blog personal no técnico: sociedad, innovación, empresa...

Krasis

- campusMVP.es:
Los mejores cursos online de programación en español

- SELF LMS:
La plataforma de elearning más potente del mercado.