[APNT] = Advertencia!, post no técnico.

Concurso Blogs Peruanos, Estamos buscando a los 20 mejores Blogs del Perú
Páginas Amarillas

Disculpen el off-topic, sobre todo por la temporada baja de posts. He estado ocupando el tiempo lo que queda después del trabajo en un proyecto personal, y haciendo la tesis para obtener el título de Ing. de Sistemas (ahora sólo tengo el de bachiller en Ing. de Sistemas), y bueno creo que si no hace ahora, no se hace nunca... así que parece que si la hacemos... hay muchos posts en la cola, y cuando se pueda los iremos enviando...

El motivo de la entrada, es debido a un concurso que se esta organizando en los bloggers peruanos: 20 Blogs peruanos. En la cual este humilde blog también esta participando.

Hace más de tres años (Marzo-2005), que me inicie en esto de los blogs y no me arrepiento, me ha dado muchas satisfaciones he conocido a mucha gente, y sin querer queriendo también ha influido en las ofertas laborales que he tenido. Hace más de 2 años que blogueo en Geeks (Junio-2006), chanfle no enviamos el post de celebración del segundo aniversario, y pues sigo repitiendo que es la comunidad de blogs más grande a nivel hispana, en blogs, contenido y calidad. Creo que uno de los exitos de la misma, ha sido convocar a todas las personas de los diversos paises de habla hispana que deseen compartir sus conocimientos, o en mi caso lo poco que sé, con la comunidad. Además de compartir, creo que se aprende muchas más, por los comentarios y por los otros bloggers presentes.

Y pués y nada, si en algo les ha ayudado este humilde blog, alguna de sus dudas ha sido resuelta, los ha motivado a leer un poco más para darme la contra, o simplemente encontraron un tip de bolsillo, pueden hacer llegar su voto a través de la siguiente página: Vota por un blog, no se olvide de escoger la categoría tecnología.

P.D.: Tampoco lo vean como una campaña Spam, no van a ver en el msn: Voten por mi blog menos el clásico no voten por mi blog, es sólo una manera de ver si los que aún quedan suscritos al RSS de blog siguen vistando el blog, y si hay alguien más leyendo el blog.

Por cierto, casí lo olvido, sólo se puede votar hasta el 22 de agosto :D

Saludos,

apunte de instalacion

ttf

En este mini-howto explico como instalar fuentes TTF para poder utilizarlas en Linux, para aquellos que no nos conformamos con las fuentes comunes que vienen instladas por defecto en el sistema.

En este caso me llamo la atencion el tipo de fuente ‘Old English’ en especial, aunque hay otras muy atractivas como ‘Avalon Quest’, ‘Tolkien’

Para disponer de todas estas fuentes, primero, descargamos este archivo :

Luego, descomprimimos el zip, copiamos el directorio resultante a /usr/share/fonts/truetype y ejecutamos :

# fc-cache

Como queria disponer de estas fuentes para utilizarlas desde el Gimp, pero no queria reinciarlo simplemente le di click en el boton para recargar las fuentes disponibles en el sistema.

ttf

Resumen (descarga script en bash, probado en Debian Testing):

#!/bin/bash
 
function get_deb()
{
PKG[0]="wget"
PKG[1]="unzip"
PKG[2]="fontconfig"
 
  for i in 0 1 2
  do
    PKG_ST=`dpkg-query -s ${PKG[i]} 2> /dev/null | grep "Status: install"`;
 
    if [ "${PKG_ST}" != "Status: install ok installed" ]; then
      apt-get -y install ${PKG[i]};
    fi
  done
}
 
 
function get_ttfp()
{
DIR_TTF="/usr/share/fonts/truetype"
PKG_TTFP="polices.zip"
URL_TTFP="http://www.cercledefaeries.com/accueil/polices/${PKG_TTFP}"
 
  cd ${DIR_TTF};
 
  wget ${URL_TTFP};
  unzip ${PKG_TTFP};
  rm ${PKG_TTFP};
 
  fc-cache;
}
 
  get_deb;
  get_ttfp;
 
exit 0;

Uso del script :

$ chmod +x ttf-policies.sh

$ sudo ./ttf-policies.sh

o

$ su; ./ttf-policies.sh

Mas informacion: http://ubuntu.wordpress.com

ShareThis

search sibu

Dejo para descarga 2 plugins que pueden utilizar para hacer busquedas en SibuWiki y la pagina principal de la Comunidad Sibu desde la barra de Firefox/Iceweasel(en teoria funciona con IE pero no me consta).

Descarga :

Busquedas en Comunidad Sibu : sibu.xml

<searchplugin xmlns="http://www.mozilla.org/2006/browser/search/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/">
<os :ShortName>Sibu</os>
<os :Description>Comunidad Sibu, Costa Rica</os>
<os :InputEncoding>UTF-8</os>
<os :Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP%2BHj8y%2FAAAACXBIWXMAAB5zAAAecwFCmCoXAAAAB3RJTUUH2AYYEwoOK2NmlgAAAbJJREFUKM9t0U9IkwEYx%2FHv%2B2fvfJdbzc2lBr6Q9EcHhTZQBCM8iLekLuIhKOgQnYro0N9TXbzUQeiQBxEi8FAeFClQsHBNySkSBeH6s0wG0dbL3LutbU8HS3foOT08fA4Pvx9UzYK6fO7d1Jtg9U39t8wrYHbPja4fUeQ%2FYKW%2FfnIhqJmONtGSnnnbugsUgFj95vv8lnUY41viVjDAjc2G9khqG%2BivFc10nVgKqP72%2B0Xfat0GKZYbzxyLxjxDzmjXbz10pVRrPzpgP%2FB9vJpnkSxefMVCkoJ2XWnijpq4ljuq%2Ba3CL57ynO%2BAi4Zc2TYOrgU%2BXAL9kzE3GD47bWR33soxua8%2F7tS89J12gNmRi5VmUUWVXjkvPRISxBBL%2BuSyLI0Asdros0FxSVg2JC4TsiohUeS43M7M34vtAbUza9wNl2vwkCBJiS8Ibnpk4MLJm51boELF9pZ1fpLEogUHDQ9Wsbj4Nweg5BE3NmOYKOQx0DBt0jugnGlMtTbHecF2CXvp5tA6TlXU8bb0w1enZvXPVGijN9Mx7h%2BOJKsARDWjIz30o8%2Fr3v%2BEx5Gvu2X9AXeRoyL4D2b1AAAAAElFTkSuQmCC</os>
<os :Url type="text/html" method="GET" template="http://sibu.homelinux.org/?s={searchTerms}"></os>
<os :Url type="application/x-suggestions+json" method="GET" template="http://sibu.homelinux.org/?s={searchTerms}"></os>
</searchplugin>

Busquedas en el wiki : sibuwiki.xml

<searchplugin xmlns="http://www.mozilla.org/2006/browser/search/">
<shortname>SibuWiki</shortname>
<description>Comunidad Sibu, Costa Rica</description>
<inputencoding>UTF-8</inputencoding>
<image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP%2BHj8y%2FAAAACXBIWXMAAB5zAAAecwFCmCoXAAAAB3RJTUUH2AYYEwoOK2NmlgAAAbJJREFUKM9t0U9IkwEYx%2FHv%2B2fvfJdbzc2lBr6Q9EcHhTZQBCM8iLekLuIhKOgQnYro0N9TXbzUQeiQBxEi8FAeFClQsHBNySkSBeH6s0wG0dbL3LutbU8HS3foOT08fA4Pvx9UzYK6fO7d1Jtg9U39t8wrYHbPja4fUeQ%2FYKW%2FfnIhqJmONtGSnnnbugsUgFj95vv8lnUY41viVjDAjc2G9khqG%2BivFc10nVgKqP72%2B0Xfat0GKZYbzxyLxjxDzmjXbz10pVRrPzpgP%2FB9vJpnkSxefMVCkoJ2XWnijpq4ljuq%2Ba3CL57ynO%2BAi4Zc2TYOrgU%2BXAL9kzE3GD47bWR33soxua8%2F7tS89J12gNmRi5VmUUWVXjkvPRISxBBL%2BuSyLI0Asdros0FxSVg2JC4TsiohUeS43M7M34vtAbUza9wNl2vwkCBJiS8Ibnpk4MLJm51boELF9pZ1fpLEogUHDQ9Wsbj4Nweg5BE3NmOYKOQx0DBt0jugnGlMtTbHecF2CXvp5tA6TlXU8bb0w1enZvXPVGijN9Mx7h%2BOJKsARDWjIz30o8%2Fr3v%2BEx5Gvu2X9AXeRoyL4D2b1AAAAAElFTkSuQmCC</image>
<url type="application/x-suggestions+json" method="GET" template="http://sibuwiki.homelinux.org/index.php/Special:Search">
  <param name="action" value="opensearch"/>
  <param name="search" value="{searchTerms}"/>
</url>
<url type="text/html" method="GET" template="http://sibuwiki.homelinux.org/index.php/Special:Search">
  <param name="search" value="{searchTerms}"/>
  <param name="sourceid" value="Mozilla-search"/>
</url>
<searchform>http://sibuwiki.homelinux.org/index.php/Special:Search</searchform>
</searchplugin>

Instalacion :

Windows :

Copiar a C:\Archivos de programa\Mozilla Firefox\searchplugins.

GNU/Linux :

(Iceweasel) Copiar a /usr/share/iceweasel/searchplugins.

(Firefox) Copiar a /usr/share/firefox/searchplugins.

Por ultimo, reiniciar el navegador.

Mas informacion: http://developer.mozilla.org

ShareThis

Debido a que, en ocaciones queremos pasar nuestros archivos de musica al reproductor, pero sucede que estos ocupan tanto espacio que no nos alcanza para llevar todo lo que queramos(o la mayoria), no nos queda otra opcion que bajar la calidad del sonido(bajando el bit rate).

Este script lo que hace es pasarle parametros (bitrate, directorio origen de los ficheros originales y directorio destino de los ficheros codificados) a lame(necesitaran instalar el paquete que lo provee).

Si no se le pasan parametros buscara los ficheros de audio en el directorio desde donde se esta llamando al script codificandolos a una tasa de 128 b/s. y creara un directorio en el lugar de origen donde guardara el/los fichero(s) resultante(s).

Se pueden obviar algunos o todos los parametros, ya que es polimorfico.

Si quieren que este disponible sin tener que copiarlo a un directorio especifico o llamarlo utilizando la ruta absoluta, pueden copiarlo a /usr/local/bin y darle permisos de ejecucion :

$ sudo cp bt_mp3.sh /usr/local/bin
$ sudo chmod 755 /usr/local/bin/bt_mp3.sh

Ejemplo de salida:

$ bt_mp3.sh 128 music/megadeth/warchest/ /home/mbrenes/Desktop/music/megadeth/bt_new
ID3v2 found. Be aware that the ID3 tag is currently lost when transcoding.
LAME 3.97 32bits (http://www.mp3dev.org/)
CPU features: MMX (ASM used), SSE, SSE2
Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
Encoding 1000_times_goodbye.mp3
      to /home/mbrenes/Desktop/music/megadeth/bt_new/1000_times_goodbye.mp3
Encoding as 44.1 kHz 128 kbps j-stereo MPEG-1 Layer III (11x) qval=3
    Frame          |  CPU time/estim | REAL time/estim | play/CPU |    ETA 
 14821/14821 (100%)|    0:41/    0:41|    0:50/    0:50|   9.3812x|    0:00 
--------------------------------------------------------------------------------------------------------------------
   kbps        LR    MS  %     long switch short %
  128.0       10.3  89.7        95.4   2.7   1.9
Writing LAME Tag...done
ReplayGain: -10.4dB
...

Descarga del script:
bt_mp3.sh.tar.gz (1 KB)

Cualquier duda(o bt_mp3.sh –help) o sugerencia aca :D.

Mas Informacion :
http://www.lasalle.es

ShareThis

http://sergiot2.com/blogimages/2008/06Jun/18_magia.jpg

Un post de reflexión :D, y que servirá de referencia a otros.

Recurrentemente ante situaciones donde estás horas y horas, con un problema y no encuentras el código que lo haga funcionar, visitas todos los foros, en español, inglés, y hasta chino, y nada, y a la gente que envías un email esta apretada con sus quehaceres, lo último que queda es hacer la magia.

¿Pero qué es la magia?. La magia es la experiencia, el sentido común, y la habilidad que vas acumulando conforme aumenta tu participación en proyectos (exitosos o no). No se han dado cuenta que su ki, aumenta después de cada proyecto?, pues una manera de comprobarlo es revisando los primeros códigos que hacíamos, y que cuando los revisas, has los llegas a negar... pero esa es otra historia.

Ahora la adquisición de conocimientos es de todo el contexto: compañeros, proyecto, usuarios, y todo lo que rodea al proyecto. aprendes buenas prácticas, aprendes malas prácticas, (ya sabes que no hacer), aprendes de los buenos jefes de proyectos, también de los malos, incrementa tu capacidad de negociación, y tomar responsabilidad, sobre todo para que no tener que resolver bugs de otros te chanten muertitos de otros, aprendes a tratar con las personas, después de tratar con los usuarios, aprendes aguantar a los compañeros chinches, (no se como se dirá en otros países, pero alguien chinche es aquella persona que hace llegar al límite tu nivel de paciencia).

¿Y como aplico la magia para resolver un problema de programación?

Lo primero, es saber donde buscar, y donde preguntar, y a quién preguntar, recordar que probablemente nosotros no seamos los primeros con el mismo problema. El detalle viene en que quizás la solución no encaje en nuestra aplicación, o sea muy trabajosa, o sea muy compleja, entonces la opción es dar una alternativa, al requerimiento del usuario.

Debemos analizar nuevamente el requerimiento y buscar soluciones alternativas, hombre que de alguna manera tienes que satisfacer el requerimiento del usuario. Y estas alternativas dependiendo del requerimiento pueden variar, quizás haciendo cambios en el diseño, lo solucionemos, o quizás anexando información, ya la magia nos dirá que hacer.

Un ejemplo:

Problema: Desde una página aspx, estoy enviando los productos seleccionados en la página, y estoy abriendo un popup a través de JavaScript, pero si los navegadores tienen habilitado bloquear los popups, la aplicación pierde de alguna manera el flujo actual, y si estoy limpiando los productos seleccionados después de hacer postback, los productos seleccionados se pierden, y el usuario no sabe si tiene que volver a seleccionar los productos.

Solución: Buscar el código JavaScript para detectar si el usuario tiene activada esta opción.

Re-Problema: El problema puede venir, por ejemplo si para abrir el popup estamos registrando el código desde una página ASP.NET, y para hacerlo esto necesita un postback, ahora si el postback hace otros eventos, y dependiendo de nuestro código, tengamos que hacer más código para no perder algunas variables que estemos usando, y que todo funcione correctamente, y se hace todo un rollo.

Solución-Alternativa: Cambiar el diseño, e indicar al usuario que productos están seleccionandos. Así, si el navegador usuario tiene habilitado el bloqueo de popups, no tengo que hacer código extra por que le estoy informado cuales son productos seleccionados, y que no tiene que volverlo hacer.

Y eso, no todo se resuelve programando.

Por eso siempre ante alguna pregunta de código media marciana, siempre pregunto cual es el requerimiento, y quizás esta re-pregunta demuestre que no queremos ayudar o desconocimiento del tema que puede ser cierto, pero quizás no necesitemos un código marciano, solo cambiar de alguna manera el requerimiento.

Saludos,

Hay que tener algunas consideraciones a la hora de embeber el html de flash en nuestras páginas web y que este sea un código válido por la W3C.

Lo primero que tenemos que tener en cuenta es no usar el objeto embed, que lo encontramos por ejemplo en las referencias de YouTube:

   1: <object width="425" height="344">
   2:    <param name="movie" value="http://www.youtube.com/v/MrMNHwmd9Hc&hl=en">
   3:    </param>
   4:    <embed src="http://www.youtube.com/v/MrMNHwmd9Hc&hl=en" 
   5:           type="application/x-shockwave-flash" width="425" height="344">
   6:    </embed>
   7: </object>

Este objeto embed, no es parte de la especificación XHTML, y por ende no pasara la validación. El ajuste consiste en no usar el objeto embed, y en su lugar sólo usar el objeto param:

   1: <object width="425" height="344" 
   2:      data="http://www.youtube.com/v/42znqcedrX0"
   3:      type="application/x-shockwave-flash" >
   4:    <param name="movie" value="http://www.youtube.com/v/42znqcedrX0" />            
   5: </object>

Veamos el caso por ejemplo de un MP3 Player:

   1: <object type="application/x-shockwave-flash" 
   2:      data="http://sergiot2.com/audio/player.swf"
   3:      width="290" height="24" id="audioplayer1">
   4:    <param name="movie" value="http://sergiot2.com/audio/player.swf" />
   5:    <param name="FlashVars" 
   6:          value="playerID=1&amp;autostart=yes&amp;loop=yes&amp;" +
   7:                 "bg=0xf8f8f8&amp;leftbg=0xeeeeee&amp;lefticon=0x666666&amp;" + 
   8:                 "rightbg=0xcccccc&amp;rightbghover=0x999999&amp;" + 
   9:                 "righticon=0x666666&amp;righticonhover=0xFFFFFF&amp;" +
  10:                 "text=0x666666&amp;slider=0x666666&amp;track=0xFFFFFF&amp;" +
  11:                 "border=0x666666&amp;loader=0x9FFFB8&amp;" + 
  12:                 "soundFile=http%3A%2F%2Fsergiot2.com%2Faudio%2FGeorgeMichael-Faith.mp3" />
  13:    <param name="quality" value="high" />
  14:    <param name="menu" value="false" />
  15:    <param name="bgcolor" value="#FFFFFF" />
  16: </object>

NOTA: En el atributo value use "+" para concatenar por cuestión de espacio en el blog se debería colocar todo junto sin concatenar. Notar además como a través de la parámetro FlashVars, podemos pasar variables al objeto flash, si es que lo necesitará. Si desea MP3 Audio Player en su sitio web:

Si desean verificar la validación, pueden hacerlo en la siguiente página: http://sergiot2.com/blog/validW3C.aspx.

Mas sobre el tema de Flash, y la validación:

Saludos,

El otro día estaba revisando una aplicación, que inexplicablemente dejo de funcionar el acceso a datos. No se mostraba nada en la portada, no había información, -chess... nos hackearon. Pero revisando la base de datos todo estaba bien, toda la información estaba como debería estar. Era una aplicación Web de terceros, revise la configuración del proveedor de acceso a datos, y entre una de las configuraciones que era SQL Server, me decía que no se podía establecerla conexión, sin más detalles. Pero la base de datos estaba online y funcionando correctamente, comencé  a indagar cuales fueron los últimos cambios, si se instalaron add-ins, o se cambio alguna configuración, y nada.

Para la conexión estaba usando un login SQL, así que entre con ese usuario por el SQL Server Management Studio, y el mensaje fue clarísimo:

SQL Server 2005 - Your password is expired.

"You password is expired. You must enter another password before you can log on".

Y esto debido que durante la creación del usuario marcaron la opción, "Enforce password expiration":

SQL Server 2005 - Enforce password expiration

Cabe resaltar que esta feature de SQL Server 2005 sólo funciona sobre Windows Server 2003 (imagino que W2k8 también debe funcionar).

La recomendación es activar esta opción, por medidas de seguridad. Pero imagino que cada organización tendrá sus propias políticas. Pero vamos al tema, que pasa si habilito la opción, que recomendaciones se debe tener en la aplicación.

¿Dónde cambiamos el número de días de expiración?

Pues usa la misma política que las cuentas de Windows. Nos vamos Herramientas administrativas, e ingresamos a Local Security Policy. Dentro de Account Policies -> Password Policy, cambiamos los días para la edad máxima del password.

http://sergiot2.com/blogimages/2008/06Jun/12_LocalPolicy.jpg

Nota: Estas son las configuraciones por defecto, no la tomen como ejemplo, aún no soy el indicado para hablar de estos temas, todavía no me han dado completamente un server para jugar (6). Artículo relacionado al tema: SQL Server 2005 Login Properties to Enforce Password Policies and Password Expiration.

¿Y cómo le digo a la aplicación que cambie el password?

Pues el administrador debería tenerlo agendado en el Outlook con un reminder de un par de días. Pues si no pasa esto, podemos activar alertas programáticamente, para notificar ante la necesidad de cambiar la cadena de conexión.

   1: static void Main(string[] args)
   2:    {
   3:      String cn = "data source=192.168.1.8; database=northwind; uid=tinysa; pwd=password";
   4:  
   5:      using (SqlConnection sql = new SqlConnection(cn))
   6:      {
   7:        using (SqlCommand cmd = new SqlCommand(
   8:                        "SELECT * FROM Customers WHERE CompanyName LIKE 'a%'",
   9:                        sql))
  10:        {
  11:          try
  12:          {
  13:            sql.Open();
  14:            SqlDataReader rd = cmd.ExecuteReader();
  15:  
  16:            Console.Write("Customers: ");
  17:            while (rd.Read())
  18:            {
  19:              Console.WriteLine("{0}, ", rd["CompanyName"]);
  20:            }
  21:  
  22:            sql.Close();
  23:          }
  24:          catch (SqlException sqlEx)
  25:          {
  26:            if (sqlEx.Number == 18487)
  27:            {
  28:              //send email, sms a webMaster.
  29:              Console.WriteLine("El password de la conexion ha expirado");
  30:            }
  31:          }
  32:          catch (Exception ex)
  33:          {
  34:            Console.WriteLine("hubo un error: {0}", ex.ToString());
  35:          }
  36:        }
  37:      }
  38:  
  39:      Console.ReadLine();
  40:  
  41:    }

NOTA: El ejemplo es didáctico, la cadena de conexión debería ser colocada en el archivo web.config, y este debería ser encriptado.

Notar que el código de Error de SQL de este mensaje es el número 18487, y si sucede este problema podemos enviarle un mensaje por msn, bloquearlo hasta que cambie la cadena de conexión y lo actualice en el web.config configurar para enviarle un email al encargado de la Web o Aplicación, notificándole lo sucedido.

Hay otros tipos de errores, que también podríamos considerar:

  • 15113 - Login failed for user '%.*ls' Reason: Password validation failed. The account is locked out.
  • 18463 - Login failed for user '%.*ls'. Reason: Password change failed. The password cannot be used at this time.
  • 18464 - Login failed for user '%.*ls'. Reason: Password change failed. The password does not meet policy requirements because it is too short.
  • 18465 - Login failed for user '%.*ls'. Reason: Password change failed. The password does not meet policy requirements because it is too long.
  • 18466 - Login failed for user '%.*ls'. Reason: Password change failed. The password does not meet policy requirements because it is not complex enough.
  • 18467 - Login failed for user '%.*ls'. Reason: Password change failed. The password does not meet the requirements of the password filter DLL.
  • 18468 - Login failed for user '%.*ls'. Reason: Password change failed. An unexpected error occurred during password validation.
  • 18487 - Login failed for user '%.*ls'. Reason: The password of the account has expired.
  • 18488 - Login failed for user '%.*ls'. Reason: The password of the account must be changed.

Extraído de: Changing Passwords Programmatically. Imaginen que el administrador creo el user, y marco la opción cambiar el password la primera vez de login, y no lo haga y nos de esa password para conectarnos a la aplicación... hay casos....

Hay otra opción, y es cambiar el password a través de una página de administración. La clase SqlConnection, tiene un método llamado ChangePassword, para esta tarea. En esta referencia hay un código ejemplo, sólo hay que agregar la siguiente línea (la número 5):

   1: private static string ModifyConnectionString(
   2:        string connectionString, string NewPassword)
   3:    {
   4:      //AGREGAR ESTA LINEA
   5:      SqlConnection.ChangePassword(connectionString, NewPassword);
   6:  
   7:      // Use the SqlConnectionStringBuilder class to modify the
   8:      // password portion of the connection string. 
   9:      SqlConnectionStringBuilder builder =
  10:          new SqlConnectionStringBuilder(connectionString);
  11:      builder.Password = NewPassword;
  12:      return builder.ConnectionString;
  13:    }

Es como cambiarla usando el Sql Server Management Studio, y este código podríamos incluirlo dentro de las páginas de administración, ya que necesita que algún admin ingrese el nuevo password para el usuario.

Saludos,

Desde hace tiempo que vengo usando y agregando todos los sitios comunes que visito, al buscador de IE, ya que te da mucha flexibilidad para agregar un nuevo buscador, y hasta se puede hacer que el buscador te de algunas otras funcionalidades, como la de validador.

Pero Firefox, no te da está misma flexibilidad, bueno sin add-ins y en la instalación por defecto, no he logrado hacerlo. Pero Firefox si soporta OpenSearch, pero no todos los sitios tienen habilitado el OpenSearch :(, y hasta esperar que lo habiliten...

Pues existe una solución muy sencilla y práctica, basada en OpenSearch, y es simular nosotros la página con el descubrimiento para búsquedas. La receta:

   1. Primero creamos un archivo Xml, con el siguiente código:

   1: <OpenSearchDescription>
   2:    <ShortName>Geeks.ms Search</ShortName>
   3:    <LongName>
   4:      Geeks.ms - Todo lo que los geeks de Windows y .Net tiene que contar
   5:    </LongName>
   6:    <Description>
   7:      Geeks.ms - Todo lo que los geeks de Windows y .Net tiene que contar.
   8:    </Description>
   9:    <Tags>buscador, asp.net, windows, search, visual studio</Tags>
  10:    <Url type="text/html" template="http://geeks.ms/search/SearchResults.aspx?q={searchTerms}"/>
  11:    <Image height="16" width="16" type="image/x-icon">http://geeks.ms/favicon.ico</Image>
  12:    <Attribution>
  13:      Copyright http://sergiot2.com/blog. All rights reserved.
  14:    </Attribution>
  15:    <SyndicationRight>open</SyndicationRight>
  16:    <AdultContent>false</AdultContent>
  17:    <Language>es</Language>
  18:    <OutputEncoding>UTF-8</OutputEncoding>
  19:    <InputEncoding>UTF-8</InputEncoding>
  20: </OpenSearchDescription>

Por poner un ejemplo. El shortName es lo que aparecerá en el cuadrito de búsqueda, atención con la URL, y como enlazamos a la búsqueda, image para el icono, y otros atributos.

   2. Ahora en la página deseada y dentro del elemento head, agregamos lo siguiente:

   1: <link title="Geeks.ms Search" type="application/opensearchdescription+xml" 
   2:         rel="search" href="searchGeeks.xml" />

Notar, que acá hacemos referencia al archivo xml, creado previamente.

   3. Ahora sólo nos queda abrir la página en cuestión: http://sergiot2.com/blog/searchEngine.aspx, en Firefox obviamente.

   4. Nos vamos al buscador, y agregamos el buscador para "Geeks.ms Search". Notar que en la opción de agregar saldrá el icono del sitio donde estén, en este caso, el icono de mi sitio:

http://sergiot2.com/blogimages/2008/06Jun/06_addSearch.jpg

5. Pero no se preocupen no van a tener que ver el feo icono :D, después de agregar el buscador ya toma el icono asignado en el archivo xml:

http://sergiot2.com/blogimages/2008/06Jun/06_searchGeeks.jpg

No son grandes cosas, pero siempre ahorra un poco de tiempo para búsquedas en sitios que usamos con mayor frecuencia.

Ahora sólo deje tres buscadores, el de Geeks.ms para buscar entradas y no repetirlas, o alguna entrada que vi y necesito, mi blog que también uso como repositorio de algún código, y el MS Events, que visito de vez en cuando para buscar un WebCast, este último esta programado para buscar WebCast en inglés, si desean le hacen el cambio en la URL para buscar los de nuestro idioma.

P.D.: A medida que los vaya necesitando voy a ir agregando otros buscadores que uso, da mucha lata hacerlo todos juntos :D.

Saludos,

Para comenzar a agregar funcionalidades para el OO, el Netbeans trae entre la basta variedad y cantidad de plugins uno exclusivo para el desarrollo de extenciones para esta suite ofimatica.

Este se puede agregar accediendo a Tools | Plugins, se accede a la cejilla Available Plugins y se marca OpenOffice.org API Plugin para instalar. Por supuesto debemos tener instalado el kit de desarrollo del OpenOffice (paquete openoffice.org-dev).

oo + netbeans

Terminado de instalar, nos movemos a la cejilla de Installed y verificamos que este activado, sino le damos click derecho -> Enable …

Luego, en Tools | Options, en la cejilla Miscellaneous | OpenOffice.org API Plugin Settings | OpenOffice.org Settings.

oo + netbeans

Indicamos las rutas si no las detecta automaticamente de :

Directorio de instalacion del OO : /usr/lib/openoffice
Directorio donde se ubica el kit de desarrollo del OO : /usr/lib/openoffice/sdk

Mas Informacion:
http://wiki.services.openoffice.org

ShareThis

Desde hace rato me estaba dando contra el monitor evitando que la ventana principal del Addon en el que estoy trabajando para el OO se abriese las veces que el usuario lo intentara cargar del menu y cuando lo consegui senti mas motivos para darle con mas fuerza xD.

La solucion es tan simple como aplicar el paton de diseño Singleton, eso es todo.

Esta en la implementacion de la clase que arma la ventana principal (CDlgQuote.java).

package org.openoffice.quote;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class CDlgQuote extends JFrame
{
  /* Crear una variable estatica que servira como bandera 
   * y nos indicara si ya se creado una instancia.
   */
  private static CDlgQuote __DlgQuote;
 
  /* Hacer el constructor privado para obligar a la hora de crear
   * un objeto a utilizar un metodo que se encargue de llamar al contructor 
   * en caso de que no exista otra instancia.
   */
  private CDlgQuote()
  {
    /* Un metodo que inicializa las propiedades de la ventana, nada del otro mundo */
    InitComponents(); 
  }
 
  /* El susodicho metodo encagado de comprobar la existencia
   * de una instancia creada.
   */
  public static CDlgQuote getInstance()
  {
    if (__DlgQuote == null)
    {
      __DlgQuote = new CDlgQuote();
    }
 
    return __DlgQuote;
  }
 
...

En el archivo fuente propiamente del Addon (CQuote.java) :

...
/* Seccion donde se carga el Addon accediendo desde el menu del OO. */
 
public void dispatch(com.sun.star.util.URL aURL,com.sun.star.beans.PropertyValue[] aArguments)
{
  if (aURL.Protocol.compareTo("org.openoffice.quote.cquote:") == 0)
  {
    if (aURL.Path.compareTo("FrmQuote") == 0)
    {
      /* Se crea el objeto utilizando el metodo para tal caso en lugar de hacerlo por el medio
       * del constructor(ya que no permitimos que sea accesible desde afuera) directamente.
       */
      CDlgQuote DlgQuote = CDlgQuote.getInstance();
 
      DlgQuote.setVisible(true);
    }
  }
}
...

Mas informacion: http://java.sun.com

ShareThis

- Next »