|
01
octubre de
2009
|
Acabamos de liberar la versión 1.0.2 del plugin jquery.oembed. el plugin de jquery desarrollado por Avanzis para facilitar la inserción de recursos usando el protocolo oembed.
Por si te lo has perdido, en mi anterior entrada del blog explicaba qué es y cómo funciona jquery.oembed
Resumen de las mejoras de esta la versión 1.0.2 de jquery.oembed:
- Añadido atributo “alt” a las imágenes de flickr con el título de la imagen, el autor y el servicio.
- El comportamiento por defecto al insertar código es sustituir el elemento por el código del recurso.
- Puedes elegir tres comportamientos diferentes para insertar código del recurso o indicar la función que se va encargar de procesar el código devuelto.
- “replace”. Sustituye todo el código del elemento por el del recurso.
- “fill”. Rellena el elemento con el...
|
|
|
30
marzo de
2009
|
¿Qué es OEmbed?
OEmbed es una API que implementan algunos sitios web como Flickr o Vimeo para facilitar incrustar sus recursos - vídeos, imágenes o contenidos multimedia - en tu página web.
Puedes encontrar más información sobre su funcionamiento y los proveedores que lo soportan en su página oficial:
¿Cómo funciona OEmbed?
Básicamente consiste en ofrecer un método REST que al llamar a una URL que indica el servicio, esta devuelve en formato JSON o XML la información necesaria para incrustar el recurso.
Por ejemplo, si quisiéramos mostrar la imagen de esta URL:
Tendríamos que seguir un complicado proceso para conseguir el enlace correcto o bien utilizar algunos métodos particulares de Flickr...
|
|
|
23
marzo de
2009
|
¿Qué son los “Microformatos”?
Los microformatos son una forma simple de añadir información
semántica a las páginas web, utilizando las herramientas que ya nos proporciona
los estándares definidos en XHTML.
Esta información semántica incluida en las páginas web puede
ser extraída y procesada por los navegadores y los programas y así realizar
ciertas acciones con ellas.
La información que se puede ofrecer con microformatos es muy
diversa, por lo que hay diferentes microformatos, cada uno con su finalidad.
Por ejemplo, podemos ofrecer la información de un evento para añadirlo con
facilidad a tu calendario con el microformato hCalendar o bien los datos
de una persona para guardarlo en tu lista de contactos con el microformato hCard.
¿Cómo se aplican los microformatos a una página web existente?
Lo bueno de los microformatos es que utilizan atributos de
XHTML estándar, por lo que es bastante sencillo aplicarlo a una página web
existente. Los atributos que utilizan los microformatos son:
Estos son atributos que ya existen en XHTML y...
|
|
|
19
marzo de
2009
|
Para celebrar el día de padre, hoy han publicado la versión final de ASP.NET MVC 1.0.
No existen grandes mejoras respecto versión ASP.NET MVC Release Candidate 2, excepto quizá la actualización de jQuery a la versión 1.3.2.
Cuidado si utilizas alguno de estos plugins porque pueden dar problemas:
- PowerCommands - Este lo usaba yo y he tenido que desinstalarlo.
- Clone Detective
- Azure Tools
Han publicado un hotfix que puede solucionarlo:
|
|
|
19
enero de
2009
|
Hoy me he pasado un buen rato intentando averiguar cómocomprobar que un método “mockeado” con Rhino Mocks se llamaba un número determinado de veces. Primero creamos el “mock” del objeto que queremos probar: IMailServiceemailService = MockRepository.GenerateMock<IMailService>(); Ya podemos realizar la prueba, por ejemplo con un controller de MVC al que le pasamos este objeto en el constructor y que cuando se realizauna determinada acción, debe llamar internamente a un método del objeto “mockeado”. TestController invitations =...
|
|
|
14
enero de
2009
|
En las aplicaciones empresariales es imprescindible realizar
operaciones con las bases de datos que se comporten como un todo o que no se
ejecuten si ocurre algún problema.
Supongamos, que
queremos programar una transferencia de dinero entre dos cuentas bancarias. Para
ello, el programa debe restar el importe de la transferencia de la cuenta A y
además aumentar esta misma cantidad en la cuenta B. ¿Qué pasaría si entre una
operación y otra ocurre un error y no estamos utilizando transacción? Pues que la
base de datos se quedaría en un estado inconsistente, y en la vida real seguramente
acabaríamos en la cárcel.
Para evitar el calabozo existen las transacciones.
Si estamos utilizando LINQ to SQL,
uno de los métodos más sencillos para realizar transacciones, es utilizar el
objeto TransactionScope que se encuentra en el
espacio de nombres System.Transactions. Seguramente tendrás
que añadirlo a tus referencias del proyecto porque no está incluido por
defecto.
Una vez añadida la referencia necesaria, comenzamos una
transacción creando el objeto...
|
|
|
14
enero de
2009
|
Una de las formas de establecer las propiedades de los
controles que se crean utilizando los métodos deASP.NET MVC es usar objetos anónimos de C#, como si estos se trataran de un
diccionario.
Por ejemplo, para crear un TextBox con la propiedad ‘MaxLength’
y deshabilitado, usamos la siguiente instrucción:
<%=Html.TextBox("title", ViewData.Eval("title"), new
{ maxlength = 300, disabled = "disabled"
})
Seguir leyendo
|
|
|
26
noviembre de
2008
|
En el posts anteriores ya vimos cómo utilizar y configurar StructureMap para poner en práctica la inyección de dependencias.
Tal y como prometí, ahora vamos a ver un pequeño ejemplo de cómo utilizar el StructureMap y el mocking de objetos en las pruebas unitarias.
Quizá te preguntes que es un “ Mock”.
Un mock, en el contexto de pruebas unitarias, es un objeto “falso” que simula el comportamiento del objeto real, con el fin de realizar las pruebas. En la wikipedia lo asimilan al maniquí que utilizan los diseñadores coches para realizar las pruebas de accidentes.
Te sugiero si utilizas pruebas unitarias, profundices más sobre este tema.
Existen muchas librerías para realizar mocks en .NET.
|
|
|
26
noviembre de
2008
|
Uno de los objetivos que debe tener un buen programador es que su código esté poco acoplado, es decir, que dos componentes con funcionalidades distintas dependan el uno del otro lo mínimo posible. De esta forma conseguirá que sus dos componentes por separado sean reutilizables y más fáciles de mantener.
Para eliminar al máximo la dependencia entre componentes, existe un patrón de diseño conocido como “ Inyección de dependencias” (“ Dependency Injection” o DI). Este patrón consiste básicamente en que en vez de ser una clase la que crea objetos, estos se inyectan o resuelven en el último momento.
Existen diferentes proyectos en .NET que intentan ayudarnos a aplicar este patrón:
|
|
|
20
noviembre de
2008
|
El SEO, o Search Engine Optimization, se refiere al conjunto de técnicas que debemos aplicar en una Web para que esté optimizada en buscadores y que salgamos bien posicionados.$0$0Técnicas SEO hay muchísimas, pero en mi opinión hay 6 que destacan sobre todas las demás:$0$0$0Tener sitemaps.$0$0La palabra/frase clave debe ser el título de la página.$0$0La palabra/frase clave debe encontrarse dentro de la url de la página.$0$0La palabra/frase clave (debe estar dentro de un)/(debe ser el) H1 en la página.$0$0La palabra/frase clave debe estar repetida varias veces dentro de la página, algunas de ellas con negrita.$0$0Estructura de enlaces internos: todas las páginas de tu Web deben estar enlazadas entre ellas con pocos saltos de diferencia.$0$0Todo ello bajo la premisa de tener un buen contenido. Sin buen contenido no empezamos ni a hablar. Será este buen contenido el que te proporcione enlaces entrantes, y será la constancia el que haga que Google confíe en ti.$0$0Si estás interesado en técnicas SEO más avanzadas, te recomiendo el blog comunactivo.
|
|
|
06
octubre de
2008
|
Esto de jQuery es divertido. Igual de divertido que javascript pero más fácil.
Hace unos días di una primero introducción a jQuery e hice mi primer plugin que llamé macEmulator.
Ahora presento un nuevo plugin que responde a una necesidad real y casi diaria de todo programador en ASP.NET (a no ser que trabaje con MVC).
Se trata de emular el FindControl de ASP.NET pero con javascript. Vayamos a un ejemplo:
Tenemos un DataList con un ItemTemplate que tiene dos Panels y un Label en cada Panel
<asp:DataList ID="DataList1" runat="server">
<ItemTemplate>
<asp:Panel ID="Panel1" runat="server">
<asp:Label...
|
|
|
03
octubre de
2008
|
Tras la breve introducción a jQuery, propongo un ejemplo que he llamado "macEmulator". La verdad es que soy bastante malo dando nombre a las cosas, y en el mundo de la programación tenemos que estar todo el santo día dando nombres a variables, a funciones, a clases, a ficheros...
El "macEmulator" lo que hace es coger las imágenes ubicadas dentro del "div" que le indiquemos y darles un efecto similar al de los iconos de los Mac. Cuando el ratón está encima de un icono la imagen se hace grande (progresivamente) y cuando sales se hace pequeña (también de forma progresiva).
Lo he puesto dentro de un plugin, de forma que activar la funcionalidad se reduce a una sola línea de código:
$("#divId").macEmulation(100,150,100,500);
Donde:
- divId es el "id" del div en el que están ubicadas las imágenes.
- El primer parámetro marca la anchura inicial de las imágenes
- El segundo parámetro marca la anchura de la imagen cuando el ratón está sobre...
|
|
|
03
octubre de
2008
|
Javascript ha sido siempre un eterno candidato a desaparecer. Sin embargo, con el paso de los años su importancia en el mundo Web ha ido en aumento.
Javascript no suele gustar. Se puede hacer muchísimas cosas con él, pero tiene varios inconvenientes. Empezando por la selectiva incompatibilidad entre navegadores, y acabando por una curva de aprendizaje no lineal (hacer cosas fáciles es fácil, hacer cosas difíciles es muy difícil... y en el medio hay poquito).
Para los que hemos trabajado con javascript desde sus inicios, solemos tener pequeñas librerías que nos hacen todo lo que queremos. Pero suelen ser librerías poco estándar... vamos, que cada uno las tiene de su padre y de su madre.
Es por eso que últimamente en la oficina suena mucho " jQuery", del que Richard ya ha hablado. Básicamente, jQuery es un framework javascript, que nos permite olvidarnos de las incompatibilidades y...
|
|
|
29
septiembre de
2008
|
Cuando hoy he leído el último artículo de Scott Guthrie - Scottgu para los amigos –‘jQuery and Microsoft’, me he quedado alucinado.
La noticia en sí es muy buena: van a comenzar a distribuir jQuery, mi librería Javascript favorita, junto con Visual Studio. No sólo eso. Además darán soporte nativo de ‘Intellisense’ en su editor, crearán controles para AJAX Control Toolkit, la integrarán con ASP.NET MVC y contribuirán con pruebas, corrección de errores y parches.
Nosotros ya estamos usando jQuery en nuestros nuevos proyectos, y los diseñadores de Avanzis ya han comenzado a utilizarlo cuando necesitan realizar efectos avanzados con Javascript.
Las principales ventajas de jQuery son:
- No es intrusivo.
Esto significa que no se mezcla el código HTML con Javascript, con lo que se consigue un código más limpio y fácil de mantener.
- Simplifica las tareas habituales de Javascript.
Seleccionar un...
|
|
|
29
agosto de
2008
|
!Acaban de lanzar la preview 5 de ASP.NET MVC en Codeplex!
Si eres de los valientes (como nosotros) que estas desarrollando con ASP.NET MVC, recuerda que tendrás que desinstalar la versión anterior antes de instalar este nuevo lanzamiento.
Por si nos os apetece leer, y ya que tengo que revisar los cambios en profundidad, aquí tenéis algunas de las nuevas características respecto a la Preview 4:
- Mejoras en los motores de visualización (ViewEngine)
- Ahora, en vez de ser cada controlador el responsable de decidir que motor de visualización se utilizará, los motores se registran de forma global.
- Se ha modificado la interfaz IViewEngine para que añada el método "RenderPartial".
- Mejoras en los helpers
- Soporte para la renderización de views parciales.
- Nuevo parámetro para poder indicar a un DropDownList cuál será su opción por defecto.
- Se han...
|
|
|
25
julio de
2008
|
En Avanzis estamos empezando un proyecto que nos ilusiona mucho, y que esperamos que vea la luz antes de final de año. Como todo proyecto que empieza, uno de los primeros aspectos a decidir es qué metodología vamos a seguir y qué plataforma tecnológica. En este proyecto vamos a utilizar Scrum y Test Driven Development. Vale. Y ahora os preguntareis ¿esto qué significa?. Pues básicamente son dos relativamente nuevas metodologías en el desarrollo de software, clasificadas dentro de las llamadas “ágiles”. Estas dos metodologías tienen algo en común. Se asume que el diseño de la arquitectura de clases, la definición de las funcionalidades y la especificación de requisitos, es un proceso que fluye a través de todo el desarrollo del proyecto, y no son una etapa inicial aislada. No hay que esperar a tener el diseño y la especificación completa para empezar a desarrollar. Scrum es una manera de organizarse, y TDD es una manera de desarrollar.
¿Qué es SCRUM?
Scrum es una metodología de trabajo ágil, especialmente...
|
|
|
23
julio de
2008
|
Siguiendo la serie de artículos sobre Lucene ( Lucene para ASP.NET (Parte I). Introducción y Lucene para ASP.NET (Parte II). Indexación), dónde conocimos qué era Lucene y cómo indexar contenidos, durante este artículo vamos a hablar de la búsqueda, sin duda, el objetivo último que perseguimos.
Según la estructura del Document planteada en el artículo sobre Indexación, cuando queramos buscar algo atacaremos a los campos "Title" y "Text", pues son los que contendrán la información importante. Es decir, lo que queremos es "buscar palabras que se encuentran en el título o en el texto".
A continuación tenemos un método que busca en ambos campos y devuelve un listado de Document's:
public static List<Document> SearchDocuments(string sQuery)
{
|
|
|
16
julio de
2008
|
Estaba realizando una consulta en T-SQL para mostrar el número de pedidos realizados por día entre dos fechas. Algo relativamente simple, ¿verdad?
Pues aunque parezca increíble, SQL Server no proporciona una función sencilla que permita obtener únicamente la fecha de un campo de tipo DateTime ignorando la hora almacenada. En el caso del informe que quería realizar, me impedía agrupar correctamente los pedidos por fecha porque el campo DateTime también almacena la hora.
Afortunadamente, Anatoly Lubarsky nos proporciona una solución bastante sencilla.
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, CAMPO_FECHA))
Donde CAMPO_FECHA es el nombre del campo de la tabla que contiene la fecha que quieres procesar. También puedes utilizar GETDATE() en vez de CAMPO_FECHA para obtener únicamente la fecha de hoy.
Esta es la consulta SQL resultante:
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, DateCreated)) as OrderDate, COUNT(*) as OrdersCount FROM...
|
|
|
10
julio de
2008
|
!Firefox me encanta!
Firefox es mi navegador favorito para navegar por Internet por su velocidad y simplicidad, pero sobre todo gracias a extensiones como Firebug que son imprescindibles para cualquier desarrollador web.
Me gustaría utilizar este navegador para realizar las pruebas de las aplicaciones en ASP.NET, pero por algún motivo Firefox se muestra extremadamente lento cuando se conecta a las páginas del ordenador local (localhost). ¡Pero esta mañana he leído la solución a ese problema!
Básicamente, consiste en entrar en la configuración avanzada de Firefox, introduciendo about:config en la URL del navegador, y cambiar el parámetro 'network.dns.ipv4OnlyDomains' a 'localhost'.
Pruébalo, y notarás la diferencia.
|
|
|
04
julio de
2008
|
Tras hablar de buscadores avanzados para Webs e introducir Lucene para ASP.NET, a lo largo de este artículo hablaremos de cómo hacer la indexación con Lucene.
Distinguimos tres pasos básicos cuando hacemos la indexación:
- Abrir el índice.
- Crear y añadir el Document (del que ya hablamos en el anterior artículo).
- Optimizar el índice.
Abrir el índice
Lo primero un ejemplo de cómo se abre un índice:
IndexWriter writer = new IndexWriter(IndexPath, new SpanishAnalyzer(), !Directory.Exists(IndexPath));
El constructor de "IndexWriter" consta de tres parámetros:
|
|
|
04
julio de
2008
|
Una de los requisitos más habituales para un buscador es que al realizar las búsquedas no distinga las palabras que se diferencian sólo por acentos. Por ejemplo, si buscas la palabra “como”, también se desea que les aparezcan los resultados con las palabra “cómo”.
Hacer esto es SQL Server es muy sencillo, si sabes cómo.
El truco está en cambiar la intercalación (“Collation” en inglés) del campo en el que quieres buscar o bien de la base de datos completa, para que utilice alguna de las intercalaciones que ignoran los acentos, que son aquellas acabadas en “_IA” (Insensitive Accent).
La sentencia para cambiar una base de datos completa para utilizar la intercalación “Modern_Spanish_CI_AI”:
ALTER DATABASE [nombrebasededatos] COLLATE Modern_Spanish_CI_AI
Si lo que queremos es sólo cambiar un campo de una tabla, el administrador de SQL Server te hace la vida más fácil. Sólo tienes que editar las propiedades de la columna, y quitar la opción de “Distinguir acentos” en el formulario que...
|
|
|
19
junio de
2008
|
En Avanzis hemos utilizado varios CRM hasta la fecha. Empezamos utilizando el SuperOffice, pero nos resultaba demasiado complejo para realizar algunas tareas simples. Después de intentar sin demasiado éxito la implantación del producto de Microsoft, realizamos un desarrollo simple para uso interno, si bien se queda muy corto para las necesidades actuales.
Así que nos hemos puesto manos a la obra, para realizar una investigación de las alternativas existentes. Una de las primeras alternativas ha sido el SugarCRM. Sin embargo, su modelo de licencias no nos ha convencido. Después de analizar otros como Splendid CRM, Compiere, OTRS, Hipergate o Sinergia, nos hemos decidido a implementar el CRM vtiger.
Nos han convencido varias cosas. Entre ellas, la facilidad...
|
|
|
16
junio de
2008
|
Tras hablar de la necesidad de un buscador avanzado para Web, comentamos que en Todoexpertos.com usamos Lucene para ASP.NET.
En este artículo vamos a introducir qué es exactamente Lucene y los puntos maestros de cómo funciona. Lo primero de todo, obviamente, es descargarse el .sln de Lucene, para poder trabajar con él.
En general, cualquier motor de búsqueda tiene dos elementos clave: la indexación y la búsqueda. Primero hay que definir sobre qué se quiere buscar y cómo, y luego ya buscaremos. Ya anticipo que la parte de indexación es mucho más compleja que la de búsqueda, y es en la que más tiempo nos pasaremos pensando.
Lo bueno de Lucene, es que tanto la indexación como la búsqueda giran entorno a lo mismo: el Document, que es sin duda uno de los elementos más importante. Entendiendo qué es el Document ya tenemos muchísimo...
|
|
|
13
junio de
2008
|
Toda aplicación Web que se precie debe tener un buscador. Pero un buscador en condiciones.
Desde Intranets hasta Webs personales, el hecho de permitir que el usuario busque contenidos en tu Web es muy recomendable e incluso en algunos casos totalmente imprescindible.
Pero hacer un buscador en condiciones no es fácil. Si tenemos una Web pequeña o queremos buscar sobre pocos contenidos, la solución la podemos encontrar en una sencilla sentencia SQL usando el comando " LIKE" o, para MySQL, el famoso " MATCH... AGAINST".
Sin embargo, lo de "pocos contenidos" no suele darse de forma demasiado común. La solución que suelen dar las Webs públicas es poner la típica "Búsqueda de Google" que incluso te permite ganar dinero con Adsense, o usar la Google Ajax Search API.
En este caso, lo bueno es que las búsquedas son bastante...
|
|
|
11
junio de
2008
|
Una de las nuevas características de c# 3.0 es la posibilidad de inicializar objetos complejos en el momento que se declaran.
Por ejemplo:
class Coche
{
public string Marca { get; set; }
public stirng Modelo { get; set; }
}
Podemos declararlo indicando ya sus propiedades:
Coche c = new Coche {Marca = "Ford", Modelo = "Focus"};
También puedes utilizar esta característica para añadir elementos a una colección en el momento de declararla:
List<Coche> coches = new List<Coche>() {
new Coche {Marca = "Ford", Modelo="Focus"},
new Coche {Marca = "Seat", Modelo="Panda"}
}
Lo que no tenía claro hasta ahora es cómo inicializar diccionarios y hoy me ha hecho falta en el proyecto que estoy desarrollando utilizando ASP.NET MVC.
En concreto necesitaba un diccionario de tipo IDictionary<string, object> donde indicarle las propiedades html de un textbox. Este es el...
|
|
|
04
junio de
2008
|
Siguiendo un poco con la primera parte del artículo sobre Rendimiento en MySQL, quisiera añadir algunas sugerencias. ¿Cómo decidir qué índices configurar?Hay sentencias SQL que se usan mucho más que otras, así como sentencias SQL más pesadas que otras. Por tanto, comenzaremos siempre por las sentencias SQL más comunes. Casi todas ellas, salvo contadas excepciones, van a necesitar un buen índice. Hay ocasiones en las que tenemos una tabla con unas pocas decenas de registros a las que no se suele prestar la atención que se debería: sí, ésas también necesitan índice. Así pues, el asunto se reduce a saber definir qué sentencias SQL van a ser las más usadas, algo que en algunos casos puede no ser trivial. Por otra parte, tenemos las sentencias SQL raramente usadas pero de mucha carga. Un ejemplo típico es una sentencia SQL usada en la administración de la Web para hacer estadísticas o reportes varios. Si bien es cierto que estas sentencias son raramente utilizadas (¿1 vez por semana?), hay que...
|
|
|
03
junio de
2008
|
En Todoexpertos trabajamos con MySQL.
Antes de entrar en Avanzis ya había trabajado con esta base de datos, aunque no de forma tan intensa como con Todoexpertos. Siempre he usado SQLServer 2000, SQL Server 2005 y SQL Server 2005 Express, sobretodo porque su integración con ASP.NET es total. Incluso he hecho mis pinitos con Oracle... pero eso es harina de otro costal.
A pesar de mis reticencias iniciales, cada vez me gusta más MySQL. Al ser un proyecto OpenSource, la comunidad que lo rodea provee de un montón de herramientas extremadamente útiles.
Como os podréis imaginar, la carga que Todoexpertos le da a la base de datos es brutal, con lo que pequeños matices implican grandes efectos en el rendimiento.
Ha llegado a haber picos de peticiones SQL que han provocado el temible error " Sort Aborted", que viene a significar algo como " MySQL no...
|
|
|
02
junio de
2008
|
Uno de nuestros principales proyectos es el gestor de contenidos Avanzis Webportal. Y en un proyecto de estas características, el editor HTML es una parte fundamental.
Hasta ahora hemos utilizado el FreeTextBox, que se ha quedado un tanto obsoleto en el entorno tecnológico actual. Por ejemplo, no soporta estar dentro de un UpdatePanel de AJAX.
Por ello, mi compañero Javi y yo, nos hemos dedicado estas últimas semanas a analizar los editores existentes para decidir cual vamos a utilizar a partir de ahora. En la primera ronda, descartamos el FCKEditor y el TinyMC, a pesar de ser proyectos open source, por la falta de soporte extenso para ASP.net y de algunas funcionalidades importantes. Así que pasamos a estudiar y a probar más a fondo el de
|
|
|
30
mayo de
2008
|
¡Qué ganas tenía de tener una Web de nuestra empresa en condiciones! Si es que ya dicen que en ‘casa del herrero…’. Por fin voy a poder enseñar la web de Avanzis a mi familia, amigos y clientes sintiéndome orgulloso de ella. No es que el diseño anterior de la Web fuera tan horrible – qué voy a decir, si creo recordar que lo hice yo - lo que pasa es que el nuevo me gusta mucho. ¿Quién soy? Por educación y siguiendo el ejemplo de mis compañeros, me presentaré en este primer post. Me llamo Richard Chamorro y soy uno de los fundadores de Avanzis y su director técnico o CTO. ¿De qué voy a hablar en este blog? Principalmente sobre mi trabajo. Pero tengo la suerte de trabajar en cosas que me gustan, por lo que también voy a hablar de cosas de las que me apetecería comentar con algún colega. Siendo algo más...
|
|