Creador de Favicon Online

| |
0 comentarios
Algo que todos los bloggers tarde o temprano hacemos es crear un favicon, ahora les muestro uno para crearlo de manera online. favicon.cc



Se trata de una pizarra en la que se dibuja a mano alzada, también se puede importar una imagen, y agregar frames para hacerlo animado.

Mientras lo creamos nos muestra constantemente como está quedando.


Al terminar podemos publicarlo para que otro lo use o descargarlo para usarlo.

Link: favicon.cc
Seguir leyendo

Error al importar a SQL Server desde Excel

| |
0 comentarios
Error al importar a SQL Server desde Excel


Error:

"The value could not be converted because of a potential loss of data"

"An error occurred on the specified object of the specified component"

"The identified component returned an error from the ProcessInput method. The error is specific to the component, but the error is fatal and will cause the Data Flow task to stop running. There may be error messages posted before this with more information about the failure"

Los números de error son : 0xc02020c5 0xc0209029 y 0xc0047022

¿Cuando se produce?

Se suele dar cuando se importan datos desde Excel a SQL Server.

¿Porque aparece?

Puede presentarse por no manejar bien los valores Null en la base de datos que recibe la importación de datos o en la creación del paquete SSIS. Principalmente que la planilla de excel tenga campos nulos y la base de datos no los acepta.
También puede darse que los tipos de datos en el origen y el destino no coincidan, ejemplo una celda en Excel con texto y queremos insertarla en un campo de destino tipo byte o int. No es igual si quisiéramos importar una celda int en un campo varchar.

¿Cual es la solución?

Hay que asegurarse que la planilla de Excel tiene los datos que se esperan, esto es fundamental y vamos a tener que trabajar menos luego en SQL, personalmente acomodo absolutamente todo en Excel, a veces esto es engorroso, pero siempre hay formas de hacerlo en forma simplificada, cuando hablamos de varios miles de filas, a veces llegué a usar Visual Basic Script en Excel para modificar las columnas.
Otra opción es generar un pequeño algoritmo en C#, VB.Net, VB6 o el lenguaje que sea, que lea la planilla de Excel e inserte los datos en SQL, directamente para aquellas columnas que no tienen problemas y realizando algún tipo de conversión en las que son mas problemáticas.
Esto último puede parecer medio rudimentario pero cuando no se sabe que columna tiene el error, se realiza una conversión en cada uno de los datos, obligadamente y sea necesario o no, EN TODOS, a veces cuando hay que importar unos 50.000 empleados en pocas horas, este puede parecer el camino mas largo y rudimentario pero visto en perspectiva no lo es tanto.


Espero les sirva y si no les sirve de solución, comenten que pueden surgir nuevas.
Seguir leyendo

Hosting en Servers Gratuitos - Experiencia

| |
0 comentarios
Como muchos bloggers, durante nuestro camino vamos aprendiendo un poco como es todo el tema, una de ellas es el tema de los hosts de Internet, es decir el lugar donde guardamos nuestro blog en Internet.

Lo que voy a comentar sobre algunos de estos servicios es en base a mi experiencia como Blogger desde 2009 y también a la experiencia de varios amigos que me sirvió mucho a mi también.

También puedo decir que fueron blogs anteriores a este, siempre con temática de tecnología y programación, material propio, imágenes propias o bajo licencia CC.

Antes de empezar quiero hacer una aclaración o diferenciación. Wordpress.com y Wordpress.org no es lo mismo.

Wordpress.com: Es el gestor de contenido Wordpress instalado en servidores de Wordpress.com (es decir es el gestor de contenido + host gratuito)

Wordpress.org: Es el gestor de contenido Wordpress en si, se puede descargar desde esa misma dirección para luego instalarlo en algún host externo.

000webhost.com 

Es muy rápido, pero se cae todo el tiempo. En realidad es rápido muy rápido, posee mas de 20 servidores y depende en cuales te toque al crear una cuenta, hay servers que se caen mas que otros.
Es una lotería cuando te van a cerrar la cuenta, pueden pasar años o 2 días. En Internet está lleno de experiencias de usuarios que perdieron 500 posts o mas por no tener backup y le cerraron todo, luego intercambiando mails con algun empleado del server les terminaban diciendo cosas como:
"Pague el servicio básico y su página va a estar de nuevo online con todo su contenido."
 "Su página gratuita estaba sobrecargando los servicios que son de pago"

datawebhosting.com.ar 

Ojo con los servers que ofrecen planes a muy bajo costo, lo barato sale caro y DataWeb es un ejemplo de ello, muchísimas experiencias en Internet, incluso amigos míos.

Los servicios como estos no tienen un buen soporte se cae todo y no tienen respuestas, hay gente que tiene pago 2 años y a los 3 meses se cansan y se van, ofrecen facilidad de pagar por medio de Pago Facil o Rapi Pago, todo eso vende, es "recomodo" pero el servicio es vergonzoso, siempre hay excepciones, si te consideras con suerte puede que te vaya bien, porque es eso lo que vas a necesitar en este tipo de servicios.

byethost.com 

Velocidad buena, no se cae casi nunca, casi no cierran cuentas, PERO ya te cuento mas adelante lo que me pasó.

Posee varios revendedores en España, Uruguay y otros países, hay que saber diferenciarlos porque también ofrecen Host gratis, pero con mas limitaciones que el original, byethost.com, hay que aclarar también que si alguno de estos revendedores o resellers deja de existir, las cuentas gratuitas que estaban en realidad en byethost.com (no vas a creer que los revendedores tienen sus propios servers), dejan de existir también, sucedió con un reseller de Uruguay. Por lo que está claro que conviene crear la cuenta en el original.

Paso a explicar el PERO de antes; si bien en Internet hay muy pocos casos que comenten que le cerraron la cuenta, al menos yo encontré pocos y muchos estaban justificados, esto me motivo a hacerme una cuenta allí. Me cerraron una cuenta, donde tenía un blog con 20 días y mas de 70 posts, sin back up de todo. No pude ni reclamar, ya que los reclamos se hacen desde el panel de control el cual te lo cierran también. Entonces es siempre una lotería cuando te van a cerrar la cuenta y si no tenés un backup reciente olvidate porque salvo que pagues un plan no te devuelven nada.


Hosts en Wordpress.org

Me refiero a cualquier host como 000webhost.com o byethost en sus versiones gratuitas, en general te soportan PHP y MySql en una versión medianamente reciente, pero te dan poca memoria, eso hace que muchos plugins no corran bien, no los básicos, pero si querés alguno que haga backup automático no corren, necesitan mas de 100MB de memoria, y te dan entre 32 y 42MB, salvo que seas sumamente ordenado casi nadie se pone cada 2 días a hacer el backup manualmente, con el trabajo que cuesta migrar.

AwardSpace.com

No cierra muchas cuentas, no es lo habitual, pero es muy lento, demasiado, casi no se cae. Pero la lentitud que tiene a veces en cargar una página con el servicio gratuito hace que te vayas solo. Una página básica, muy básica que sea de 1/2MB puede tardar mas de 30 segundos por ejemplo el plugin básico de Wordpress Twenty Eleven sin ningún post puede tardar 30 segundos.

Blogger.com

Rápido, no tiene publicidad permite publicidad propia, espacio y ancho de banda infinitos, pero hay que ver que tipo de contenido se le agrega, este puede ir en contra de las condiciones de uso. Muchos lo esquivan por no tener todas las posibilidades de WordPress.org, pero estamos hablando de algo gratuito, no de algo pago y no conozco que hayan cerrado un blog si se cumplen las normas.

Wordpress.com 

Rápido, no tiene publicidad pero no permite que le pongas tuya, espacio y ancho de banda ilimitados, pero hay que ver que tipo de contenido le vas a poner, igual que blogger.

 
Comentarios finales:

Es lo que me pasó en mi experiencia personal y leyendo mucho, pero mucho en internet experiencias de otros bloggers, algunos de ellos amigos. Pero lo cierto es que nunca me quedo tranquilo con un server gratis.

Lo que hacen muchos, se meten en blogger.com, una vez que hacen algo de dinero con Adsense u otro servicio de publicidad, se pagan un server que les deje poner Wordpress.org y migran el blog.

Mi intención con esto es evitar que alguien mas caiga en la decepción que supone perder el trabajo realizado, con el esfuerzo e ilusión puesto en el.

Como les fue a ustedes, tuvieron experiencias diferentes a la mía? contanos la tuya.
Seguir leyendo

Editores HTML Online

| |
0 comentarios
Para aquellos que diseñan y programan Web es siempre necesario tener a mano un editor HTML, si es Online, mejor.


Hay uno para cada necesidad, veamos algunos.

Quackit HTML Editor 

Tarda unos segundos en cargar, pero lo ponemos primero porque de los mas completos que hay.




Live editor


Visualmente es cómodo, pero es pago.


Real Time HTML Editor

Sencillo y rápido



Seguir leyendo

SQL Server - BackUp y recuperación

| |
0 comentarios
A la hora de configurar los Back up de nuestras bases de datos tenemos tener bien en claro ciertas cosas como:
  1. Donde se van a almacenar?
  2. la frecuencia del respaldo?
  3. la frecuencia de sobre-escribir la misma información?
Si bien esos puntos se refieren al guardado de la información están íntimamente ligados a la tarea de recuperación que en algún momento nos podría tocar realizar y para esto nos preguntamos:

  1. Cuantos datos puede soportar perder la empresa, menos datos puede soportar perder entonces mas frecuentemente hay que respaldar
  2. Cuanto tiempo puede la empresa estar sin esa información disponible si se produce un fallo, si la recuperación tiene que ser rápida, hay que tener los backup disponibles en medios de acceso rápido, si la información es mucha, la nube no sería una opción hoy día todavía.
  3. Que costos puede asumir en la empresa, a mas costo mayor disponibilidad para hacer respaldos frecuentemente.

Recovery model o modelo de recuperación

En SQL Server tenemos 3 modelos de recuperación diferentes, cada uno hacen mas o menos uso del transaction log, veamos:
  1. Full, Registra absolutamente todas las transacciones en el transaction log, incluye indices, operaciones e inserciones masivas. Por lo que su grado de respaldo es excelente, se puede restaurar todo en cualquier punto histórico.
  2. Bulk-Logged o de registro masivo que no deben ser utilizadas constantemente, solo en algún caso muy necesario como por ejemplo para optimizar las llamadas operaciones de "registro mínimo"
  3. Simple,tambien se almacenan en el transaction log, pero no guarda absolutamente todo como lo hace el modelo Full, el modo siempre no hace crecer el log progresivamente sino que lo borra en cada checkpoint.
Copyright (c) 123RF Stock Photos

Lo que vimos recién son modelos, ahora hablemos de los tipos, que no es lo mismo, en SQL Server existe:

  1. Completo, hace backup de todas las paginas de datos que conforman la base de datos, incluso las transacciones. Cuando tenemos mucha información el respaldo también es muy grande.
  2. Diferencial, respalda solo los cambios que hubo desde el backup anterior, son rápidos. Como nota decir que la base Master no puede respaldarse en este tipo.
  3. Filegroup, respalda un grupo de archivos en particular, tener en cuenta que para realizar la restauración se necesitan todos los archivos que sean de un grupo de archivos.
  4. Bitacora de transacciones, solo funciona con el modelo Full y Bulk, y respalda el transaction log. Con este tipo se puede reducir el tamaño del transaction log, respaldándolo por si algo fallase en el original.





Seguir leyendo

Problemas con Process.Start y ShellExecute con URLs en Windows 8

| |
0 comentarios
Las llamada a Process.Start () y ShellExecute () esta mostrando problemas, muchos desarrolladores que son usuarios de Windows 8 comentan que tienen problemas para abrir URLs llamándola desde una aplicación, usando ShellExecute o Process.Start.
Como sucede siempre con aplicaciones y SO nuevos, como lo es Windows 8, no existe tanta documentación de errores que nos permitan dar con la solucion rápidamente.

No se trata de ningun ambiente de trabajo extraño, lo cual hace que el error está siendo muy común en los programadores por estos dias. Las circunstancias en las que se da el error son las siguientes:

- Al ejecutar el Process.Start, o la tradicional API ShellExecute pasando como parámetro cualquier ruta que lleve a un archivo HTML.
- Se tiene como navegador predeterminado Internet Explorer.
- Hay que ejecutar como administrador.

Todo esto en combinación produce que o bien no sucede nada o surge un mensaje de error.

El mensaje de error desde la consola - Excepción no controlada.

Buscando en Internet sale a la vista que el problema tiene que ver en como se registran los navegadores en Windows 8, IE es una aplicación integrada con el SO y su forma de registrarse es diferente a como lo hacen los demás navegadores.

Aclaro nuevamente que el error se da en todos los navegadores, pero teniendo IE como predeterminado.

La solución pasa en la mayoría de los casos por desinstalar el navegador y reinstalarlo, las versiones mas recientes están tomando cuenta de estos problemas, por ejemplo Chrome es un navegador que tiene nuevas versiones constantemente.
Seguir leyendo

Alias en SQL

| |
0 comentarios
Vamos a ver el uso de Alias en lenguaje SQL, se trata de un nombre que se le da a una columna a una tabla o al resultado de una función, su utilidad está en facilitar la redacción de las sentencias de SQL y también para mostrar los resultados de esas sentencias con nombres de columnas mas familiares.

Como dije antes se pueden aplicar a:

-Las columnas y tablas de la siguiente manera.



SELECT AliasDeTabla.columna AS AliasDeColumna
FROM tabla AS AliasDeTabla

En este caso en los resultados tanto la tabla como las columnas van a llevar el nombre del alias y no el original.

-En funciones del SQL, tales como SUM, AVG, COUNT, etc.

Utilizamos la tabla, Store_Information,

Tabla VentasXCiudad
Ciudad     Ventas   
Pilar          55000  
Cordoba    26300
Rosario     44000


SELECT AVG(VporC.Ventas) AS VentasPromedio
FROM VentasXCiudad VporC
GROUP BY VporC.Ciudad

Resultado:
VentasPromedio
 41766,66



como podemos ver el nombre de la columna no se ve, sino que lo que obtenemos en cambio es el nombre de lo que la función devuelve, "VentasPromedio", esto es mucho mas representativo del resultado, por otra parte las funciones como AVG, SUM y COUNT no se pueden utilizar sin usar el alias.
Seguir leyendo

Autocompletar TextBox usando Ajax en ASP.Net

| |
1 comentarios
Vamos a ver como autocompletar un TextBox con Ajax, para esto usamos un AJAXControlExtender, y vamos a ver que no es tan difícil como puede parecer.

Para esto vamos a usar el AutoCompleteExtender que es parte del Ajax Control Toolkit


Para el que nunca trabajó con Ajax, y mas precisamente con el Ajax Control Toolkit tal vez le pase lo mismo que a mi, al probarlo da una sensación de que todo se simplifica, que todo se vuelve transparente y las cosas funcionan. Cuando empece a trabajar con ASP.Net me sentí casi como programando en un Windows Form, con Ajax me sentí todavía mas así.

Bueno comencemos, en hay que tener siempre el AutoCompleteExtender conectado al TextBox, lo hacemos mediante la propiedad TargetControlID del AutoCompleteExtender.

Contamos con la siguiente tabla en nuestra base de datos:

Tabla "Paises"
Campo "nombre", contiene: "Argentina, Argelia, Sudafrica, Estados Unidos, España"

Como el proceso autocompletado lo vamos a realizar desde el lado del servidor, tenemos que crear un Web Service que nos lo haga.


[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService 
{
//String de consulta
 const string selectQuery = "SELECT nombre FROM Paises WHERE nombre LIKE @prefijo";
//Metodo del Web Service que nos va a devolver el listado de paises
    [WebMethod]
    public string[] ObtenerListaDePaises(string prefijo)
    {
        //Array de nombres
        string[] Nombre = null;
        try
        {
            using (SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConnectionString1"].ConnectionString))
            {
                sqlCon.Open();                
                using (SqlCommand sqlComd = sqlCon.CreateCommand())
                {
                    sqlComd.CommandType = CommandType.Text;
                    sqlComd.CommandText = selectQuery;
                    sqlComd.Parameters.Add(new SqlParameter("@prefijo", string.Format("{0}%", prefijo)));

                    using (SqlDataAdapter sqlAdpt = new SqlDataAdapter())
                    {
                        sqlAdpt.SelectCommand = sqlComd;

                        using (DataTable table = new DataTable())
                        {
                            sqlAdpt.Fill(table);
                            Nombre = new string[table.Rows.Count];
                            int i = 0;
                            foreach (DataRow rdr in table.Rows)
                            {
                                Nombre[i] = rdr["Country"].ToString().Trim();
                                ++i;
                            }
                        }
                    }
                }
            }
        }

        catch 
        {
            //Manejo de errores
        }

        return Nombre;
    }
   
}


Siguiendo, ahora vamos a trabajar desde el lado del cliente, relacionemos el WebService con el AutoCompleteExtender, y configurarlo para que utilice el método ObtenerListaDePaises, articulandolo con el TextBox.

<asp:scriptmanager runat="server" id="ScriptManager1"><services>
 <asp:servicereference path="AutoComplete.asmx">
</asp:servicereference></services>
</asp:scriptmanager>
<div>
<asp:textbox runat="server" id="txtPais" />
<ajaxtoolkit:autocompleteextender completioninterval="10" enablecaching="true" minimumprefixlength="1" servicemethod="GetCountriesList" servicepath="WebService.asmx" targetcontrolid="txtPais" id="autoComplete1" runat="server">
</ajaxtoolkit:autocompleteextender></div>
</asp:scriptmanager>

Ahora vamos a ejecutar la página y ver los resultados.


Los resultados van a ir apareciendo a medida que el usuario escriba en el TextBox, la informacion llega desde el lado del servidor en forma asíncrona
Seguir leyendo

El Open Source: Conceptos básicos y buenas prácticas

| |
0 comentarios
Primero fueron las mas pequeñas y con los años ahora hasta grandes empresas estan utilizando como suite de aplicaciones de cabecera software open source, es decir de código abierto.
Hay algo que surge en muchos de nosotros cuando hablamos sobre este tema, y se podría resumir en frases como, que no todo lo que brilla es oro, lo barato sale caro, el software libre no es gratis.

Algo de cierto hay en esto, y usar aplicaciones open source obliga a las empresas a comprender el marco jurídico que envuelve a este tipo de software.


Es bien sabido que si se incumplen las condiciones establecidas en licencias para software open source puede dar lugar a demandas judiciales. Es importante entonces que todas las empresas, desde la mas pequeña hasta la mas grande, entiendan básicamente las condiciones que hay en una licencia de código abierto.

Esto no solo se aplica a empresas que usan las aplicaciones open source, sino también a aquellas que las desarrollan, el generar una aplicación abierta en forma seria requiere que los programadores y diseñadores del software también estén a la altura de las circunstancia en cuanto a que licencias open source van a cubrirlo, ya que o bien pueden ser demasiado permisivas y terminar perjudicando el trabajo realizado o demasiadas cerradas con lo que una empresa que pretenda usarla apegándose a la licencia puede descartar la aplicación por verlo inviable.

Existen cientos de licencias open source, cada una con sus peros y contras, algunas mas flexibles en un aspecto y otras en otro. Es necesario que lo usuarios sigan la condiciones de el paquete de software que estén usando, teniendo en cuenta a los subpaquetes que vienen y a veces ni sabemos que existen.

Como ventaja podemos contar que la mayoría del software abierto se rige por las mismas licencias, y existen dos categorías principales por lo que las organizaciones tienen que buscar tener un protocolo que se adapte a el copyleft, la cual obliga a los desarrolladores a hacer que el código fuente y toda la documentación esten disponibles, y la otra es permissive que hace que se le atribuya el credito al autor

Las licencias open source son diferentes y pueden resultar confusas si siempre nos manejamos con licencias tipo copyright, entonces primero es necesario conocer que licencias se aplican al software del cual está haciendo uso y luego es necesario poner en practica una estrategia para no incumplirla.
Seguir leyendo

Aprende programación online

| |
0 comentarios
Codecademy es un portal web que permite practicar nuestras habilidades para programar.

Para destacar contra otros podemos decir que en primer lugar es gratuito, segundo esta en español y tiene herramientas que permiten hacer las pruebas en el mismo sitio


Entre lo que se puede practicar está:


  •   JavaScript
  •   HTML/CSS
  •   Python
  •   Ruby



    Podemos compartir nuestras practicas con nuestros amigos en las redes sociales
    Pedagogicamente está muy bien, va desde 0 y avanza adecuadamente en nivel de dificultad

Seguir leyendo

Interfaces

| |
0 comentarios
¿Que son y para que sirven las interfaces?,

Las interfaces son una herramienta mas de la programación orientada a objetos, estas enlistan propiedades, funciones, métodos, eventos, clases, estructuras y/o puede tener interfaces anidadas.
Las interfaces se implementan en las clases que necesiten usarlas pero deben estar implementadas con todos los miembros de la misma, es decir propiedades, métodos, eventos, etc.

Sus características son varias, nombramos algunas:

  •  Solucionan muchos problemas de compatibilidad
  • Al trabajar en grupo facilita el entendimiento entre los miembros
  • No poseen ningún tipo de lógica en su interior, solo definiciones
Ahora, un ejemplo de interfaz en .Net:

Interface ICiudadICliente

   Function Ciudad() As Int32

   Function Cliente() As Int32

   Property NombreCiudad() As String

End Interface

Las interfaces son usadas también por el mismo Framework de .Net, su fin es facilitar la programación de nuestras clases:
    IConvertible
    IEquatable
    IComparable
    IDisposable
    IFormattable
Seguir leyendo

Delegados en C#

| |
0 comentarios
Usar delegados en C#

Para explicarlo voy a usar ejemplos muy difundidos en Internet, así usamos algo estandarizado y con menos posibilidades de cometer errores.

Para entender que hacen o para que sirven veamos en que momentos se puede necesitar usar

"Ordenar" es un método que sirve para ordenar cualquier cosa, siempre que herede de la interfaz iComparable y se implemente el método CompareTo,

public void Ordenar(IComparable[] items)
{    
for(i=0; i<items.length; i++)
    {       
       Icomparable tmp = items[i];
       items[i] = items[j];
       items[j] = tmp;    
    }
}

Ahora la usamos en un ejemplo, Persona es una clase y se define así:

class csharp public class Persona: IComparable
{
   //Estas propiedades se definen en una sola linea
   public string Nombre { get; set; }

   public Date FecNacimiento { get; set; }

   public float Peso { get; set; }

   public Persona(string Nombre, Date FecNacimiento, float Peso)
   {
      this.Nombre = Nombre;
      this.FecNacimiento = FecNacimiento;
      this.Peso = Peso;
   }

   //Metodo parte de IComparable
   public int CompareTo(object obj)
   {
      Persona p = obj as Persona;
      //Compara las personas por Fecha de Nacimiento
      return this.FecNacimiento.CompareTo(p.Fecnacimiento);
   }
}
//clase Fecha
public class Fecha : IComparable
{
   int dia, mes, año;

   public Fecha(int dia, int mes, int año)
   {
      this.dia = dia;
      this.mes = mes;
      this.año = año;
      if (!IsValid) throw new ArgumentException("La fecha no es válida");
   }

   //Verificar si una fecha es valida o no
   bool IsValid
   {
      get{
         //Verifico si la fecha tiene rango valido
         if (año &lt;= 0 || mes &lt;= 0 || mes &gt; 12 || dia &lt;= 0 || dia &gt; 31)
            return false;
         //Verifico si el año es bisiesto que febrero no tenga mas de 28 dias
         if ((año % 400 == 0 && mes == 2 && dia > 28) || (mes == 2 && dia > 29))
            return false;
         // Verifico los meses que no tienen 31 dias
         if ((mes == 4 || mes == 6 || mes == 9 || mes == 11) &amp;&amp; dia == 31)
            return false;
         return true;
      }
   }

   public int dia
   {
      get { return dia; }
   }
   public int mes
   {
      get { return mes; }
   }
   public int mes
   {
      get { return mes; }
   }

   //Metodo para comparar fecha
   public int CompareTo(object x)
   {
      fecha d = x as Date;
      if (d == null)
         throw new ArgumentException();
     

         return (d.Year > año || (d.Year == año && d.Month > mes) || (d.Year == año && d.Month == mes && d.Day > dia)) ? -1 : (d.Year == año && d.Month == mes && d.Day == dia) ? 0 : 1;
   }
}

class Program
{
   //Main es donde se usan las clases  
   static void Main(string[] args)
   {
      //array de personas

       Persona[] personas = new Persona[]
      {
         new Persona("Mario", new fecha(5, 8, 1955), 80),
         new Persona("Carlos", new
fecha(14, 4, 1965), 55),
         new Persona("Juan", new
fecha(12, 6, 1956), 66),
         new Persona("Raul", new
fecha(21, 5, 1966), 77)
      };

      //Acá ordena el array de personas
      Sort(personas);

      foreach (Persona p in personas)
      {
         Console.WriteLine("Nombre: {0}   Fecha: {1}, {2}, {3}, Peso: {4}",
         p.nombre, p.FechNacimiento.dia, p.FecNacimiento.mes, p.FecNacimiento.año, p.Peso);
      }
      Console.ReadKey();
   }

   static void Ordenar(IComparable[] items)
   {
      for (int i = 0; i < items.Length - 1; i++)
         for (int j = i + 1; j < items.Length; j++)
                
         if (items[i].CompareTo(items[j]) > 0){
            IComparable tmp = items[i];
            items[i] = items[j];
            items[j] = tmp;
         }
   }
}
 

¿Que pasa si tuvieramos que tener diferentes criterios de ordenación para el mismo objeto?, por ejemplo si quisiéramos ordenar a las personas por peso.

No vamos a hacer varios métodos que comparen dentro de la clase Persona y sucedería que el método Ordenar no sirve para comparar todo tipo que fuese IComparable, sino que sería static void Ordenar(Persona[] items).

El uso de delegados entra en juego ahora, ya que el código del método Main tiene que ser flexible y permitir escoger el criterio de comparación que se desea utilizar.

Un delegado es un tipo que puede recibir métodos con una firma específica.
Delegados:

public delegate [valor de retorno] Comparison([parametro 1], [parametro 2], ... , [parametro n]);

Nuestro ejemplo:

public delegate int Comparison(object x, object y);

Nos entrega un entero y se le pasan 2 objetos, es decir puede recibir un método que devuelva un entero y recibe 2 parámetros de tipo object.

Una característica particular de los delegados es que los podemos definir en cualquier parte de nuestro código, es decir no tiene que estar dentro de una clase como los métodos.

Ponemos el delegado en nuestro código, en cualquier lugar:

static void Ordenar(Persona[] items, Comparison compare)
{
   for (int i = 0; i < items.Length - 1; i++)
      for (int j = i + 1; j < items.Length; j++)        
     
      if (compare(items[i],items[j]) > 0)
      {
         Persona tmp = items[i];
         items[i] = items[j];
         items[j] = tmp;
      }
}

Luego agregamos los métodos para  así comparar por nombre, por fecha de nacimiento y por peso:


public static int CompareByName(object x, object y)
{
   Persona p1 = x as Persona;
   Persona p2 = y as Persona;
   return StringComparer.OrdinalIgnoreCase.Compare(p1.Name, p2.Name);}

public static int CompararPorPesot(object x, object y){
   Persona p1 = x as Persona;
   Persona p2 = y as Persona;
   return p1.Peso.CompareTo(p2.peso);}

public static int ComparePorNacimiento(object x, object y){
   Persona p1 = x as Persona;
   Persona p2 = y as Persona;
   return p1.FecNacimiento.CompareTo(p2.FecNacimiento);}

Código cliente:

static void Main(string[] args)
{
   Persona[] personas = new Persona[]
   {
         new Persona("Mario", new fecha(5, 8, 1955), 80),
         new Persona("Carlos", new
fecha(14, 4, 1965), 55),
         new Persona("Juan", new
fecha(12, 6, 1956), 66),
         new Persona("Raul", new
fecha(21, 5, 1966), 77)
   };

   Ordenar(personas, Persona.CompararPorNombre);


   foreach (Persona p in personas)
   {
      Console.WriteLine("Nombre: {0}", p.Nombre);
   }

   Console.WriteLine();
   Ordenar(personas, Persona.CompararPorFecNacimiento);
   foreach (Persona p in personas)
   {
      Console.WriteLine("Fecha: {0}, {1}, {2}",p.FecNacimiento.dia, p.FecNacimiento.mes, p.FecNacimiento.año);
   }

   Console.WriteLine();

   Ordenar(personas, Persona.CompararPorPeso);   foreach (Persona p in personas)
   {
      Console.WriteLine("Peso: {0}",p.peso);
   }
   Console.ReadKey();
}


Ordenar alfabéticamente desde la segunda letra
agregamos:

public static int CompareFromSecondLetter(object x, object y){
   Persona p1 = x as Persona;
   Persona p2 = y as Persona;
   return StringComparer.OrdinalIgnoreCase.Compare(p1.nombre.Substring(1), p2.nombre.Substring(1));}


y lo usamos así

Ordenar(personas, Persona.CompareFromSecondLetter);


Bueno espero algo se entienda, intenté explicarlo lo mejor posible, obviamente hace falta un nivel de conocimiento por encima del básico, pero tampoco es tan dificil. Delegados es un tema extendo, en MSDN hay mucha mas documentación y ejemplos de uso. Saludos.
Seguir leyendo

Google no desarrollará para Windows 8

| |
0 comentarios
Google anuncia que no va a aplicaciones propias para Windows 8 o Windows RT, si bien esto se podía suponer por se competencia, ahora ya es oficial, asi que no vamos a ver versiones Gmail o Drive para esos sistemas.

El director de Google Apps, Clay Bavor:

"No tenemos planes para hacer aplicaciones Windows. Somos muy cuidadosos sobre dónde invertir y vamos a donde los usuarios estan y no están en con Windows Phone o Windows 8"

"Si eso cambia, podríamos invertir allí, por supuesto."

También dijo:

"En 2012 hemos puesto algunas de las bases y realmente mejoramos la experiencia de nuestras principales aplicaciones en los dispositivos móviles, tales como el agregado de la edición nativa de hojas de cálculo, tanto para iOS y Android,".

"Realmente vemos esto como la primera versión de nuestra experiencia móvil, aunque, se continuará haciendo grandes inversiones en telefonía móvil en 2013 con el objetivo de tener mejores aplicaciones móviles".

"La nube ya no es un misterio. Casi todas las empresas con las que hablamos están pasando por un cambio monumental donde todo el mundo está utilizando no sólo uno o dos dispositivos, sino que a veces hasta cinco con tabletas, ordenadores portátiles, teléfonos inteligentes y computadoras de escritorio", dijo Bavor.

Con respecto a la nube, aun queda un trecho hasta lograr confiabilidad y disponibilidad, hace unos días Drive y Gmail dejaron de estar disponibles por 30 minutos, entonces se agradece que Google se avoque a mejorar lo que tiene antes de hacer mas cosas.

Bavor dijo que la empresa estaba "poco feliz" por la situación y que estan "manos a la obra", y se trabaja para determinar las causas de lo sucedido.
Seguir leyendo

Inyección de dependencias en PHP

| |
0 comentarios
Inyección de dependencias (en inglés Dependency Injection, DI) es un patrón de diseño orientado a objetos y ha sido un tema frecuente de discusión entre muchos desarrolladores corporativos en los últimos años. Uno de los temores para utilizarlo es el riesgo de sacrificar demasiado tiempo la construcción de la arquitectura de la aplicación sin hacer ningún trabajo real, como suele ser lo habitual.  Como característica se puede decir que el termino se le atribuye a Martin Fowler y que se le pasa objetos a una clase, en lugar de ser la clase en si la que vaya a crear el objeto


no es ésta inyección
Imaginemos que trabajamos haciendo un sitio web de preguntas y respuestas, estilo Stack Overflow. Seguramente crearíamos una clase llamada Pregunta, que contendría un miembro de tipo Autor. Un objeto Autor directamente en el constructor:

 class autor {
    private $nombre;
    private $apellido;
    public function __construct($nombre, $apellido) {
        $this->nombre = $nombre;
        $this->apellido = $apellido;
    }
    public function getnombre() {
        return $this->nombre;
    }
    public function getapellido() {
        return $this->apellido;
    }
}
class
pregunta {
    private $autor;
    private $
pregunta;
    public function __construct($
pregunta, $autornombre, $autorapellido) {
        $this->autor = new autor($autornombre, $autorapellido);
        $this->
pregunta = $pregunta;
    }
    public function getautor() {
        return $this->autor;
    }
    public function get
pregunta() {
        return $this->pregunta;
    }
}


Podemos considerar que es un buen código, pero hay ciertos problemas:

  •      La información de Autor que pasa al constructor pregunta no tiene nada que hacer dentro de alcance de pregunta. El nombre del autor debe estar dentro de la clase Autor porque no tiene nada que ver con pregunta.
  •      La clase de Autor está estrechamente unida con la clase pregunta. Si añadimos un nuevo parámetro al constructor del autor, entonces tenemos que modificar todas las clases donde creamos un objeto Autor - un proceso tedioso y largo, especialmente en aplicaciones de gran tamaño. 


Una solución a estos problemas la da la inyección de dependencia, mediante la inserción de las dependencias a través de constructor de la clase dependiente ("inyección del constructor"). Obtenemos como resultado un código altamente mantenible, que se vería así.


class Author {
    private $firstName;
    private $lastName;
    public function __construct($firstName, $lastName) {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }
    public function getFirstName() {
        return $this->firstName;
    }
    public function getLastName() {
        return $this->lastName;
    }
}
class Question {
    private $author;
    private $question;
    public function __construct($question, Author $author) {
        $this->author = $author;
        $this->question = $question;
    }
    public function getAuthor() {
        return $this->author;
    }
    public function getQuestion() {
        return $this->question;
    }
}


Ventajas
    
Las ventajas saltan a la vista, siempre teniendo en cuenta que su uso es para proyectos a largo plazo, estos se vuelven mas fáciles de mantener, si bien puede ser mas lento al comienzo, al realizar cambios cuando la aplicación ya este en producción no sufrimos la típica cascada de cambios en las clases.esos i está bien hecho.

Dependencias de inyección en open source.

Las empresas pequeñas no tienen mucho presupuesto para crear herramientas, tales como un marco de inyección de dependencias. Sin embargo se encuentran muchas soluciones open source en la web. Symfony2 utiliza un componente DI muy sólido que se basa en Java Spring. 


 Cuándo utilizar la inyección de dependencias

La inyección de dependencia es más útil, cuando se trabaja en proyectos a largo plazo, proyectos que son desarrollados y mantenidos
activamente durante un largo período de tiempo. Esto reduce enormemente los costes y atrae a los mejores desarrolladores. Pero puede resultar contraproducente cuando queremos sacar unas pantallas rapidas para impresionar a un cliente mostrandole como queda todo, ya que los tiempos de desarrollo se hacen mayores.
Seguir leyendo

Sistemas adaptables para mejorar la experiencia del usuario

| |
0 comentarios
En informática, el término "sistema adaptativo" se refiere al proceso en el que un sistema interactivo adapta su comportamiento a los usuarios individuales en base a la información adquirida sobre el mismo, el contexto de uso y su entorno. Aunque los sistemas de adaptación han sido largamente discutido en el mundo académico y han sido una aspiración de los científicos informáticos e investigadores, nunca ha habido un mejor momento que el actual para realizar el potencial de lo que la futura interacción con los sistemas informáticos será.

Las capacidades de TI (tecnologías de la información) actuales para rastrear las interacciones, agregar y analizar en tiempo real, junto con los datos recogidos por los sensores que llevamos en nuestros dispositivos inteligentes, nos brinda una oportunidad como nunca antes para diseñar adaptabilidad para ofrecer en última instancia, una mejor experiencia de usuario que es a la vez discreta y transparente para el mismo y a veces hasta para los programadores.Vamos a ver la importancia del contexto en el diseño de experiencias de adaptación, dar ideas sobre cómo diseñar los sistemas adaptativos, y tal vez inspirar a los diseñadores a considerar en que medida los dispositivos inteligentes y aplicaciones sensibles al contexto pueden mejorar la experiencia del usuario con la adaptabilidad.

Ejemplos de sistemas adaptativos
Un primer ejemplo de una función de adaptación se pueden encontrar en los dispositivos de navegación GPS. Utilizando uno de estos dispositivos, el usuario es capaz de localizar con facilidad y desplazarse a cualquier lugar manejando. Cuando se hace de noche el sistema automáticamente cambia el color de la interfaz a un "modo nocturno", mas oscuro para no cegar al conductor con una luz brillante desde el dispositivo. El sistema conoce la ubicación exacta del usuario y la posición del sol, y por la comprensión de estos dos factores, el sistema mantiene un entorno de conducción segura, adaptándose así a las necesidades del usuario.




El diseño adaptativo consiste la combinación de datos de los sensores inteligentes de dispositivos, conectividad de red y el análisis del comportamiento del usuario, que es como el ingrediente secreto detrás de la creación de una experiencia de adaptación. Mediante la combinación de estas capacidades, no sólo se puede comprender el contexto de uso, también podemos anticipar lo que el usuario necesita en un momento determinado.Hoy dia Google es un ejemplo interesante de una aplicación adaptable que permite a los usuarios responder a las preguntas que pensamos pero no escribimos. A través de unas smarts cards que aparecen a lo largo del día en el smarthphone del usuario, Google ahora te dice el tiempo del día antes de empezar el día, la cantidad de tráfico que puede esperar antes de salir para el trabajo, cuando llegará el próximo tren o el resultado de tu equipo favorito. Esto se hace mediante el registro y el análisis de sus preferencias mientras usamos el teléfono. Por ejemplo, las actualizaciones de tu equipo deportivo favorito se basan en su navegación por Internet y el historial de tus búsquedas. Y mediante el análisis de la ubicación actual, las ubicaciones anteriores y el historial web, Google te presenta una smart card con las condiciones del tráfico en la ruta hasta tu destino mas probable. Increible, no?


Como profesionales, sabemos que a algunos usuarios de móviles no les gusta usar el teclado virtual e intentan evitarlo todo lo posible. Mediante la utilización de datos sobre el comportamiento personal del usuario, un sensor, junto con capacidades en dispositivos inteligentes se pueden usar comandos de voz (similar a Siri iOS), Google crea así una experiencia adaptativa que ayuda a los usuarios a evitar el uso del teclado virtual.

Por supuesto que los sistemas adaptativos no sólo se limitan a los dispositivos móviles.

  •     Ubiquitous computing o computación ubicua (Ubicomp) es la idea de estar rodeado de dispositivos inteligentes y conectados en red, los objetos digitales han sido cuidadosamente ajustados para ofrecernos ayuda discreta mientras navegamos a nuestro trabajo y en la vida personal. 
  •     Inteligencia ambiental (AmI) se refiere a los entornos digitales que son sensibles y responden a la presencia de personas.


Nest utiliza sensores para adaptar la temperatura en el hogar. Es un termostato que aprende, es un gran ejemplo de un sistema adaptativo integrado para entornos domésticos. Usando una variedad de sensores para la temperatura, la humedad, el tacto, la actividad de campo cercano, la actividad de campo lejano y la luz ambiente, incluso, detecta si hay gente en casa. Ajusta de la temperatura adaptándola a esta información, automáticamente se puede reducir hasta un 20% la cuenta por calefacción y enfriamiento de la vivienda. Cuando no hay nadie alrededor, Nest aprende a bajar la temperatura. Al llegar a casa desde el trabajo, sabe que la temperatura debe subir. Después de las primeras semanas, aprende cuando se llega a casa del trabajo y se puede encender la calefacción antes de llegar para que encontremos la casa caliente. En el año 1991 Mark Weiser, ampliamente considerado como el padre de la computación ubicua, escribió:

Nest es un gran ejemplo de cómo la tecnología Ubicomp puede desaparecer en nuestro entorno hasta que sólo la interfaz de usuario sigue siendo perceptible para los usuarios.

Este es el futuro del diseño de experiencias de usuarios. Pensamiento adaptativo en contraste con los sistemas tradicionales de escritorio, dispositivos móviles se utilizan normalmente en muchas situaciones diferentes, sin embargo, las aplicaciones móviles hoy en día no se aprovechan a menudo de información sobre el contexto en su uso, y por lo tanto sólo son utilizables para fines muy específicos.

Por ejemplo, una aplicación de mapas de tu ciudad para negocios locales puede ser utilizado en diferentes contextos: trabajar solo para la ciudad o para el país, y con o sin conectividad a la red.

Los usuarios actuales del sistema pueden personalizar su dispositivo a través de las preferencias y la configuración y elegir qué aplicaciones funcionan mejor para sus necesidades. Incluso después de la implementación de procesos de diseño centrados en el usuario que garantizan un cierto grado de aceptación de los usuarios y dar una mayor comprensión del contexto, es imposible de anticipar las necesidades de todos los usuarios y asignar los requisitos para una del sistema.

El pensamiento adaptativo" es una mentalidad que proporciona las herramientas necesarias para mejorar significativamente la experiencia del usuario y mejorar el uso previsto del producto mediante la utilización de la tecnología que está disponible. Se trata de aprender del medio ambiente, del usuario y la adaptación a sus necesidades del momento y situación. Por lo tanto, los diseñadores primero debe diseñar para el contexto de uso y luego diseñar el conjunto de funciones que se activan en situaciones relevantes.
Seguir leyendo

Crear función helper en el template

| |
0 comentarios
A veces cuando ingresamos datos en una plantilla, estos no tienen el formato que esperamos. En estas situaciones tendrás que crear funciones personalizadas para formatearlo.

Si usted está usando por ejemplo handlebars, es mas fácil registrar una función auxiliar, pero en otras soluciones, como underscore no ofrecen esa funcionalidad. Vas a tener hace el tuyo propio.

La razón por la que esto no es tan simple como podría parecer se debe a que la mayoría de las bibliotecas de templates harán que el objeto de datos que le pasamos se pase a la función de la template con el valor de "this" como contexto. Por lo tanto, la función necesita ser parte de este objeto. Hay un par de maneras de solucionar esto. El camino principal es añadir la función para el objeto de datos antes de pasarla a la función de plantilla. ejemplo:


// assume data object and template function
data.formatPrice = function (priceInCents) {
    return "$" + (priceInCents / 100).toFixed(2);
}
var html = template(data);

Esto es ideal para ciertas situaciones, pero es posible que usted tengamos varios conjuntos de templates, cada cual tiene su propio conjunto de funciones auxiliares. Lo que me gustaría hacer en estos casos es envolver la función de plantilla en otra función que se aplicará a los helpers del objeto data.
 
var productTemplate = function (data) {
    var template = _.template("the template string");
    data.helperFunction1 = function () { return "whatever" };
    return template(data);
};
 
Hay varias maneras de mejorar esto (puedes comenzar con el almacenando en el caché en "raw" la función del template, fuera de esta función), pero seria la idea básica. Ahora, puedes simplemente pasar los datos a ese productTemplate y tener acceso a las funciones helpers
 
 
Seguir leyendo

Templates JavaScript

| |
0 comentarios
Underscored para lo simple Handlebars para lo mas complejo

Usar una template de JavaScriptPuede puede ser una buena elección, primeramente lo que tenemos que hacer es buscar una biblioteca bien probada y depurada.

Aunque las opciones son casi infinitas, hay dos opciones muy buenas, dependiendo de la complejidad de tu proyecto.

Si el proyecto es relativamente simple, puedes utilizar Underscore.js. En su mayor parte, esta biblioteca ofrece utilidades de programación funcional, pero tiene un método _.template que no podria facilitarnos mas la vida. Por defecto, se utiliza la ERB-esque <% =%> delimitadores, pero que modificarse fácilmente. La belleza de esta solución es que cualquier proyecto que requiera templates probablemente tenga cargado Underscore ya, debido a su enorme utilidad general. En el buscador puedes obtener más información acerca de Underscore, hay mucha.

Si estas un poco mas entusiasmado, te recomiendo esto, Con muchas bloques útiles (como #each, #if y mas) y la capacidad de registrar tus propias funciones de ayuda.


Por supuesto que hay otras bibliotecas de templates, no dudes es en buscar mas! Los nombrados suelen ser los mas populares.
  

Seguir leyendo

Insertar Widgets con shortcodes en WordPress

| |
0 comentarios




Widgets que pueden ser agregados con Shortcodes



La capacidad de uso de shortcodes en WordPress es muy subestimada. Shortcode permite al usuario final crear elementos complejos, con sólo pulsar unas teclas y al mismo tiempo modularizar las tareas de edición.

Este tutorial es para usuarios mas bien experimentados de WordPress, vamos a ver widgets y shortcodes sin entrar en demasiados detalles acerca de cómo y por qué funcionan. Si estas buscando más información, le sugiero la lectura de shortcodes en Mastering WordPress y el artículo Widgets API.
  Tomando un widget al azar

Lo primero que miraba era en cómo dar salida a cualquier widget sin shortcodes. Una vez hecho esto, que la aplicación de un shortcode es un asunto relativamente trivial. Escabando en el Codex, encontré la función the_widget() que hace exactamente lo que quiero.

Se necesitan tres parámetros:

El nombre de la clase del widget.
Configuración de instancia del widget,
Los argumentos de la barra lateral
de widgets.

Con esto no sólo se puede emitir un widget en cualquier lugar, ademas puedo pasar argumentos diferentes a cualquier barra lateral de widgets. Esto es muy bueno porque puedo especificar parámetros como before_widget y after_widget.

Esto también abre la posibilidad de cambiar fácilmente el estilo del widget dentro del código corto, pero eso lo vemos luego.


Luego de aplicar ciertos CSS, el widget calendario se puede agregar en cualquier lugar
Haciendo el "Output Buffering"

Al agregar un Shortcode, tendrías que buscar en el texto una cadena en particular, haces algo con ese texto y retornar el resultado que queremos ver. Es obvio que vamos a utilizar the_widget(), pero esta función sólo se hace eco de contenido. Para solucionar este problema vamos a utilizar los búferes de salida.

Me explico mejor, mira los dos ejemplos siguientes, el resultado es exactamente el mismo.




1- the_widget( 'WP_Widget_Archives' );


1- ob_start();

2- the_widget( 'WP_Widget_Archives' );

3- $contents = ob_get_clean();

4- echo $contents;

Primero empezamos nuestro buffer. Mediante el uso de ob_get_clean (), que puede tirar el contenido de la memoria intermedia en una variable (y también borrar la memoria intermedia). Una vez hecho esto podemos hacer eco de esa variable.
 
Creando el Shortcode.

Ahora ya sabemos todo lo que necesitamos, así que vamos a crear el esqueleto de nuestro shortcode. Primero tenemos que averiguar cuáles son los argumentos que tenemos que pasar, y qué argumentos queremos permitir al usuario pasar a través de la etiqueta de shortcode

   
Widget type- El widget es lo que queremos mostrar;
     Title - El título del widget (usado en el parámetro de instancia);
     Otros parámetros de instancia;
     Otros argumentos de barra lateral.

Admito que esto es un poco escasovago. La razón de esto es que en cada widget se necesita un conjunto separado de los argumentos posibles debido a la funcionalidad tan variada que tienen. Por un widget de categoría, también puede especificar el atributo jerárquico, esto no se aplica en otros por ejemplo.

La solución de este problema requiere un shortcode flexible, y una buena documentación de usuario final.



La base del shortcode


add_shortcode( 'widget', 'my_widget_shortcode' );
function my_widget_shortcode( $atts ) {

// Configure defaults and extract the attributes into variables
extract( shortcode_atts( 
 array( 
  'type'  => '',
  'title' => '',
 ), 
 $atts 
));

$args = array(
 'before_widget' => '<div class="box widget">',
 'after_widget'  => '</div>',
 'before_title'  => '<div class="widget-title">',
 'after_title'   => '</div>',
);

ob_start();
the_widget( $type, $atts, $args ); 
$output = ob_get_clean();

return $output;
Hay dos atributos en común en todos los shortcodes. El type es donde el usuario especificará el tipo de widget, y el title es donde el usuario especifica el título.

Una vez que tenemos nuestra $atts, calculamos los $args - Parámetros del widget sidebar. Dado que este sería un theme comercial, no es necesario dar al usuario control sobre estos argumentos, por lo que ahora no esta mas que harcodeado.

En la última sección vamos a poner todo junto para crear el widget de final.


Extendiendo el shortcode.

Una vez hecho esto, podemos volver con los parámetros de nuestro shortcode. Un ejemplo es el que permite al usuario elegir un esquema. Para nuestro ejemplo, esto es oscuro o claro, pero fácilmente se podría especificar un color exacto.

Todo lo que necesitas hacer es agregar un argumento al shortcode, añadir una clase CSS a nuestro widget basada en este argumento y dejar que nuestra hoja de estilos haga el resto.


add_shortcode( 'widget', 'my_widget_shortcode' );

function my_widget_shortcode( $atts ) {

// Configure defaults and extract the attributes into variables
extract( shortcode_atts( 
 array( 
  'type'   => '',
  'title'  => '',
  'scheme' => 'light'
 ), 
 $atts 
));

$args = array(
 'before_widget' => '<div class="box widget scheme-' . $scheme . ' ">',
 'after_widget'  => '</div>',
 'before_title'  => '<div class="widget-title">',
 'after_title'   => '</div>',
);

ob_start();
the_widget( $type, $atts, $args ); 
$output = ob_get_clean();

return $output;

Si queremos que sea aún más flexible, podemos permitir que un color de fondo sea pueda asignar, podemos agregar los $args utilizando los parámetros del shortcode, y mucho más.

Esta solución funciona perfectamente con widgets personalizados. Todo lo que necesitamos hacer es agregar el nombre de la clase como el type y adaptar los ajustes específicos de la instancia.
Seguir leyendo
Con la tecnología de Blogger.