Online de nuevo

Y estamos de nuevo arriba, después de cambiar de servidor por uno el doble de poderoso, por fin el blog esta funcionando como debe ser.

El anterior servidor se encontraba en Webbynode, era un VPS (Servidor virtualizado) bastante pequeño pero con el suficiente trafico como para dejar abajo el engine de MySQL, esto provocaba que la memoria siempre se excediera cuando se publicaba algún post.

Esta ves se contrato un servidor en Linode con el doble de recursos y desde el momento de configurar se siente la diferencia, además de que Linode cuenta con una amplia documentación para levantar el server y todo lo que necesites en cuestión de minutos.

Debo agradecer completamente a Alex Franco que hizo todas las modificaciones al server e instalo un nuevo panel de administración bastante bueno.

Son geniales los VPS! :D

Editor de texto enriquecido jHtmlArea (WYSIWYG) para ASP.NET y jQuery

Los editores de texto enriquecidos o mejor conocidos como editores WYSIWYG (What You See is What You Got – Lo que ves es lo que obtienes) son de bastante utilidad para cierto tipo de desarrollos, como lo es cuando el usuario quiere modificar el mismo los estilos de lo que escribe, agregar listados o agregar hipervinculos, etc, sin que tenga que aprender HTML para realizarlo.

Buscando un buen rato por alguno sencillo, ligero y que se integrara rapidamente a ASP.NET/Mono, me encontre con jHtmlArea, un plugin para jQuery aun en desarrollo pero lo bastante estable como para poder utilizarlo en el proyecto que estoy desarrollando.

Editor WYSIWYG jHtmlArea

Configurarlo y usarlo es realmente sencillo:

  • Descarga el archivo del sitio web del proyecto.
  • Descarga jQuery.
  • Los archivos javascript agregarlos a una carpeta (js por ejemplo) y los CSS lo mismo (puede llamarse css el folder :P ).
  • Agregar las referencias de los archivos en el código:
    <head>
    	<script src="/js/jquery-1.3.2.min.js" type="text/javascript"></script>
    	<script src="/admin/js/jHtmlArea.ColorPickerMenu-0.7.0.min.js" type="text/javascript"></script>
    	<script src="/admin/js/jHtmlArea-0.7.0.min.js" type="text/javascript" ></script>
    
    	<link rel="stylesheet" type="text/css" href="/admin/css/jHtmlArea.css" />
    
    	<script type="text/javascript">
    		$(document).ready(function(){
    			$("textarea").htmlarea();
    		});
    	</script>
    </head>
  • Agregar un elemento <textarea> simple o un textbox multilinea de asp.net.
    <asp:TextBox runat="server" id="txtContenido" TextMode="MultiLine" Width="680" Height="300" ></asp:TextBox>

Con esto automaticamente cada elemento textarea aparecera con las opciones del editor, existen otras configuraciones como agregar o eliminar elementos de la barra de botones tal y como lo indica el autor en su sitio.

Más herramientas para convertir PDF, Word o HTML a ePub para iPad

Actualización: Si lo que quieres es solo leer documentos PDF, Apple actualizo iBook y ya se pueden pasar los archivos, aquí te explico como.

Hace unos dias hice un pequeño tutorial de como convertir libros de PDF a ePub usando Calibre para poder leerlos en el iPad, eh estado buscando algunas alternativas y esto fue lo que encontre:

Web

  1. Epub2Go – Es un sitio web que te permite en solo unos clicks convertir PDF’s a ePub, para leerlos con iBook o Stanza, es gratuito y rapido (al menos cuando yo lo probe), le pasas el PDF y te regresa tu libro convertido, listo para importarlo al iPad.
  2. BookGlutton – Otro sitio web, este solo permite convertir HTML a ePub, no es gratuito, cobran 5 dlls por descargar el ePub convertido, tiene otro detalle, el documento HTML tiene que seguir algunas guías sencillas que están en el sitio para cumplir con los lineamientos y subirlo como zip.
  3. Feedbooks – En este sitio web puedes crear tu libro y publicarlo en formato ePub para cualquier dispositivo, tiene una libreria bastante completa de libros de propiedad común, aunque si lo tuyo es escribir libros, este es un excelente sitio para hacerlo, tiene una interfaz web para crear el libro bastante sencilla, por lo que revise el servicio es gratuito.

Aplicaciones

  1. Calibre – Como ya lo había mencionado, es la que mejor me funcionó a mi, bastante sencilla y gratuita.
  2. Sigil book editor – Esta es una herramienta para editar libros en formato ePub principalmente, pero se pueden importar archivos en formato TXT y HTML para después convertirlos a ePub, es muy visual ya que cuenta con un editor WYSIWYG como el de Word, es multiplataforma y gratuito.
  3. ePUB-tools – Grupo de herramientas en base a linea de comandos para convertir desde casi cualquier formato de texto a ePub, es gratuito pero no tan amigable como otros ya que hay que usar la consola para convertir los libros.
  4. Stanza – Stanza desktop te permite convertir al igual que calibre casi cualquier tipo de formato a ePub, además tiene la cualidad que las versiones para iPhone, iPod Touch e iPad pueden leer PDF, Word, TXT, etc…, es gratuito y bastante sencillo.

Bueno, estos son los que encontre, ojalá les sirva alguno.

DropDownList en cascada con jQuery y ASP.NET

Como usar DropDownList o Selects en cascada con ASP.NET y jQuery?, es una de las dudas que mas se generan en los foros de discusión al momento de realizar cosas con AJAX y .NET sin el UpdatePanel.

Voy a explicar como realizo esta tarea para que sea un proceso sencillo.

Crearemos un nuevo proyecto web y nos aseguraremos de configurarlo para que pueda usar jQuery.

En la pagina Default.aspx agregaremos dos DropDownList y quedara algo como el siguiente codigo:

<%@ Page Language="C#" Inherits="EjemploDropDownList.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head runat="server">
	<title>Ejemplo DropDownList</title>
	<script src="js/jquery-1.4.2.min.js" type="text/javascript" ></script>
</head>
<body>
	<form id="form1" runat="server">
		<asp:DropDownList runat="server" id="ddlPrincipal" ></asp:DropDownList>

		<br />

		<asp:DropDownList runat="server" id="ddlSecundario" > </asp:DropDownList>
	</form>
</body>
</html>

Lo unico que hace este código es agregar la referencia de jQuery (la 1.4.2) y dos DropDownList, sin ningún otro control ni tampoco código que tenga que ser procesado aun por el servidor.

Enseguida vamos a llenar el primer DropDownList (ddlPrincipal) con algunos datos, en este caso seran continentes, esto lo vamos a colocar en el evento Load de la pagina Default.aspx:

private void Page_Load(object sender, System.EventArgs e)
		{
			ListItem elemento;

			elemento = new ListItem("America", "1");
			ddlPrincipal.Items.Add(elemento);

			elemento = new ListItem("Africa", "2");
			ddlPrincipal.Items.Add(elemento);

			elemento = new ListItem("Europa", "3");
			ddlPrincipal.Items.Add(elemento);
		}

Corremos el proyecto y nos debe mostrar algo como esto:

Ejemplo de DropDownList

Ahora es tiempo de meter un poco de código JavaScript en nuestra aplicación, para eso insertaremos el siguiente código entre las etiquetas <head> de Default.aspx :

<script type="text/javascript">
		$(document).ready(function(){

		// Configuracion de jQuery y AJAX
		$.ajaxSetup({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            data: "{}",
            dataFilter: function(data) {
                var msg;

                if (typeof (JSON) !== 'undefined' &&
                    typeof (JSON.parse) === 'function')
                  msg = JSON.parse(data);
                else
                  msg = eval('(' + data + ')');

                if (msg.hasOwnProperty('d'))
                  return msg.d;
                else
                  return msg;
            }
        });

			// Solo se ejecuta cuando seleccionamos alguna opcion.
			$('#<%=ddlPrincipal.ClientID %>').change(function(){
				$.ajax({
					url: "Default.aspx/obtenerPaises",
					data: "{'continente':'" + $("#<%=ddlPrincipal.ClientID %>").val() + "'}",
					success: function(msg) {
						$('#<%=ddlSecundario.ClientID %>').html(msg);
					},
					error: function(XMLHttpRequest, textStatus, errorThrown) {
				       alert('Error: ' + textStatus + ", " + errorThrown);
				   }
				});
			});

		});
	</script>

Este código hace dos cosas:

  1. Configura jQuery para usar AJAX y JSON como nosotros necesitamos y nos evita un pequeno malestar respecto a las “d” en los .NET frameworks anteriores a 3.5.
  2. Captura el evento Change del DropDownList Principal que ocurre cuando se selecciona cualquier opción del DropDownList y va a buscar el código que se ejecutara por .NET para traer lo que haga falta.

Como nota especial, si observan estoy pidiendo la información de la misma pagina “Default.aspx” y no de un WebService que es como comúnmente se hacen estas peticiones, a esto se le llama usar WebMethods.

Enseguida veremos el código que en .NET dependiendo de la opción seleccionada traerá una respuesta diferente, para lo cual agregaremos al archivo Default.aspx.cs el siguiente codigo debajo de Load_Page :

[WebMethod()]
		public static string obtenerPaises(string continente)
		{
			List<ListItem> elementos = new List<ListItem>();
			ListItem elemento;
			string resultado = "";

			// Usaremos simples 'if' para hacer sencillo el ejemplo.
			if (continente == "1") {
				elemento = new ListItem("Mexico", "1");
				elementos.Add(elemento);
				elemento = new ListItem("EUA", "2");
				elementos.Add(elemento);
			}

			if (continente == "2") {
				elemento = new ListItem("Kenia","1");
				elementos.Add(elemento);
				elemento = new ListItem("Congo","2");
				elementos.Add(elemento);
			}

			if (continente == "3") {
				elemento = new ListItem("Francia","1");
				elementos.Add(elemento);
				elemento = new ListItem("Italia","2");
				elementos.Add(elemento);
			}

			foreach (ListItem item in elementos) {
				resultado = resultado + "<option value='" + item.Value + "'>";
				resultado = resultado + item.Text;
				resultado = resultado + "</option>,";
			}

			return resultado;
		}

Este código como verán es bastante sencillo y lo unico que hace es recibir como parametro el “continente” y en base al que se selecciono agregar a un listado ciertos elementos y al final regresar una cadena de <options> de un select de HTML.

Segunda nota: el nombre de la variable que recibe el parametro debe ser el mismo que el que pasamos en el javascript (data: “{‘continente’: … )

Y listo, ahora hay que correr el proyecto y esto nos permitira realizar DropDownList en cascada.