jueves, 29 de diciembre de 2011

Extender funcionalidades en jQuery

Hoy he descubierto que cuando queremos extender funcionalidades en jQuery lo primero que hariamos es:
Object.prototype.miFuncion = function { return "Hola mundo"; };
var mivar = new Object();
alert(mivar.miFuncion());
El problema de esto es que hace que jQuery reviente por las cuatro esquinas y todo empiece a fallar y tu a tirarte de los pelos. La solucion es bien sencilla, usaremos $.extend para ello.
$.extend({miFuncion: function () { return "Hola mundo"; }});
alert($.miFuncion());
O también de esta otra forma:
$.fn.extend({miFuncion: function () { return "Hola mundo"; }});
alert($('#miselector').miFuncion());
Pues eso niños, prohibido tocar el prototype de cualquier objeto de javascript que no hayais creado vosotros. Porque sino sufrireis las consecuencias XDDD.

martes, 20 de diciembre de 2011

Primitive Types en Papyrus

In the model explorer, right click on your model, then choose 'Import package from registered library'. In the window that pops up pick 'UMLPrimitiveTypes' (or the Java ones, if you prefer that).

Fuente: Stackoverflow EDITO: Para quien no lo sepa Papyrus es un plugin para generar diagramas UML en Eclipse.

Convertir Clob en String

Para convertir un campo de tipo Clob en la BD en String deberemos realizar los siguientes pasos:
Clob strClob = rs.getClob(1);  //Obtenemos el dato de la consulta
String str;
StringBuffer strFinal;
BufferedReader bufferRead = new BufferedReader(strClob.getCharacterStream());
while ((str = bufferRead.readLine()) != null)
  strFinal.append(str);

martes, 13 de diciembre de 2011

SCP Task en Ant

Hoy me ha pasado que tenia que hacer una tarea ant que me copiase el contenido de una carpeta en el servidor. Después de configurar todo con la key etc. no iba. ¿Por qué?

Primero, la key que estaba usando estaba en formato ppk (putty) y el scp funciona con formato openSSH. Asi que nada, con el Puttygen hacemos una exportacion de la key a openSSH desde el menu Conversion. 

Segundo, teniendo la key no es suficiente, si queremos que vaya si tener una lista de hosts autorizados deberemos añadir el atributo trust="true".

Una vez tenemos esos puntos controlados ya deberia funcionar todo correctamente. La tarea ant por lo tanto ha quedado tal que asi:

<target name="deploy" depends="dist">
 <scp todir="user@XXX.XXX.XXX.XXX:${deploy.folder}" trust="true" keyfile="C:\keys\private.ssh" passphrase="">
  <fileset dir="${dist.home}" />
 </scp>
</target>

Como crear un fichero con Ant

Para crear un fichero con Ant y encima que contenga el texto que nosotros deseemos es algo tan simple como esto:
<echo file="hola.txt">Hola Mundo!</echo>

lunes, 12 de diciembre de 2011

JDBC y Oracle

Ahora mismo por motivos laborales estoy usando Oracle como base de datos. Lo que no me acordaba y me ha estado mareando era que para usar el driver en JDBC debemos indicarselo al DriverManager de JDBC para que lo incluya con la siguiente linea:
import oracle.jdbc.driver.OracleDriver;
...
DriverManager.registerDriver(new OracleDriver());

miércoles, 7 de diciembre de 2011

jQuery UI Combinar una lista Draggable con otra Sortable

Cuando estén trabajando con una lista de elementos "draggables" y estos vayan a ser colocados en una lista "sortable" es posible que si intentáis obtener el id del elemento que se esta moviendo os volváis locos de atar. ¿Por qué? Porque tanto al clonar como al trasladar el original, al generarse el helper omite dicho atributo, supongo que para evitar conflictos con los ids. Por lo tanto, si necesitamos de ese valor, lo que podemos hacer es asignarle el valor a otro atributo distinto. Me explico:
<ul id="lista_draggable">
<li title="mi_identificador 1">Elemento 1</li>
<li title="mi_identificador 2">Elemento 2</li>
<li title="mi_identificador 3">Elemento 3</li>
</ul>
<ul id="lista_sortable">
</ul>
Y el jQuery quedaría así:
$("#lista_draggable").draggable({

  connectToSortable: "#lista_sortable",

  helper: "clone"

});

$("#lista_sortable").sortable({

  stop: function (event, ui) {

    alert(ui.item.attr("title"));

  }

});

Podéis probar libremente a cambiar el atributo title por id y veréis que no hay manera de obtener dicho atributo. Eh! Pero que si alguien lo consigue que me lo diga que le coloco en un altar :)

martes, 6 de diciembre de 2011

Ubuntu, la webcam y la madre que lo pario

Tanto ubuntu, tanto ubuntu y resulta que para tener una webcam bien configurada tienes estar trasteando mil y un cosas.

Para empezar, en la configuración del sonido debemos indicar que el input de entrada es la webcam, si no sale en la lista probar a escribir en una terminal pacmd, y una vez dentro dump. Luego hacemos exit y volvemos a la configuración de sonido de ubuntu. Mágicamente habrá aparecido. Lo seleccionamos y cerramos.

Para asegurarnos de que la próxima vez que arranque sigue configurado así, volvemos a ejecutar pacmd y dump como hemos hecho antes y copiamos la linea que empieza por set-default-source alsa_input.usb. Nos vamos a /etc/pulse/default.pa y al final del fichero la pegamos. Reiniciamos el equipo y listo.

Pero aquí no acaba todo, resulta que si nos escuchamos después de grabarnos tendremos una voz de pitufo maquinero que nos dejara así O_O.

Para solucionar esto basta con crear un fichero en la siguiente ruta con el nombre deamon.conf:
gedit $HOME/.pulse/daemon.conf

Luego dentro escribimos:
default-sample-rate = 16000

Guardamos y reiniciamos el demonio de pulseaudio: pulseaudio --kill && pulseaudio --start

Con esto ya podremos usar Skype o similares.

Imagenes en Rails 3.1.x

Para poder usar imágenes propias de la aplicación en Rails deberemos insertarlas en la carpeta app/assets/images/. Dentro de esta carpeta deberemos generar la estructura de directorios que deseemos para las imágenes, ya que si insertamos una imagen llamada p.ej: arrow.gif en esa carpeta a pelon su url sera: http://[app_domain]/arrow.gif. Si lo que deseamos es que la url sea http://[app_domain]/images/arrow.gif deberemos crear la siguiente estructura de directorios: app/assets/images/images/arrow.gif

martes, 29 de noviembre de 2011

This para jQuery UI y JavaScript

Buenas. Veréis, llevo ya unos días refactorizando un código javascript de esos infumables a POO para que el código sea muchisimo más mantenible. Hasta aquí ningún problema, pero el problema viene cuando quieres hacer uso de jQuery dentro de tus clases.

El problema es el siguiente: el objeto this cuando estas dentro de una función jQuery no es el mismo que cuando estas dentro de tu función definida para tu clase. Para evitar que uno machaque al otro, deberemos previamente guardar una referencia a dicha variable. Esto se consigue con el metodo data() que llevan muchas funcionalidades de jQuery UI. Para ejemplo un boton:
function MyClass() {
  this.myField = 1;
}

MyClass.prototype.MyMethod = function () {
  $("lista").sortable({
    start: function(event, ui) {
      alert("No es lo mismo this:" + $(this) + " que this:" + self.myField);
    }
  }).data("self", this);
}

viernes, 25 de noviembre de 2011

Caracter copyright en expresión regular

Hoy, he necesitado buscar el símbolo de marras en una expresión regular y he aprendido que este si es algo raro, basta con indicar su equivalente hexadecimal en la expresión regular

En mi caso el código es: \0xA9

Edito: Para javascript hay que quitar el cero.

jueves, 24 de noviembre de 2011

Era de cajón

Ayer me estuve dando de ostias con jQuery e IE y para colmo hoy descubro que si no colocas un DOCTYPE correcto para IE este hace lo que le da la gana. A sido ponerlo y ¡Voilà! de repente la lentitud en los scripts, los bugs de css y alguna cosa más han desaparecido.

En fin niños, ya sabéis, lo primero es poner el DOCTYPE si queréis evitaros dolores de cabeza.

miércoles, 23 de noviembre de 2011

replaceAll en JavaScript

Hoy resulta que he descubierto que la función replace de javascript no funciona como un espera que funciona. Resulta que si la usamos en plan busca esta cadena y reemplaza, solo reemplazará la primera ocurrencia de dicha cadena, pero no las siguientes.

Para evitar esto, tenemos dos formas.
- La cutre: Hacer un bucle hasta que se canse de encontrar ocurriencias y las hayamos sustituido todas.
- La elegante: Usar una expresión regular con el modificador g. Para muestra un ejemplo:
var str_salida = str.replace(/busca_esto/g, "reemplaza_por_esto");

Cada día le cojo más "cariño" a javascript :D

Hola mundo para windows phone 7.1

Hace unas entradas puse un enlace sobre tutoriales para la nueva interfaz del windows 8. Pues ahora es el turno de la versión móvil.

http://www.genbetadev.com/desarrollo-aplicaciones-moviles/un-hola-mundo-en-windows-phone-71-mango

martes, 22 de noviembre de 2011

Nota mental: jQuery + table

No intentar nunca hacer un sortable donde los items son tags table

Os volveréis locos debido al errático comportamiento de jQuery con dicho elemento.

Aun así, si teneis ganas de fliparlo con ese tema os dejo dos webs que quizas os echen un cable:
http://www.isocra.com/2008/02/table-drag-and-drop-jquery-plugin/
http://setiabud.blogspot.com/2009/06/jquery-ui-sortable-with-table.html

Triángulos con CSS

Si alguna vez habeis necesitado pintar un triangulo y no teneis una imagen a mano o simplemente pasais de complicaros la vida, con CSS se puede hacer, ¿no me creeis? pues comprobarlo por vosotros mismos.

http://css-tricks.com/snippets/css/css-triangle/

lunes, 14 de noviembre de 2011

Drivers ATI para tajetas mobility legacy

Ayer me encontré con el problema de instalar los drivers ATI a mi viejo portatil DELL que lleva una gráfica Radeon Mobility X1300.

El problema reside básicamente en que ATI no ofrece soporte oficial a las tarjetas de portatil y que el fabricante solo tenia drivers para windows Vista x32 y yo tengo un Windows 7 x64.

Bueno, la cuestión es que a partir de cierta versión de los drivers Catalyst estos no estan soportados por dichas tarjetas gráficas.

Yo he probado con la versión 9.3 y han funcionado, ignoro si una versión superior funcionarán.

Al lio, te descargas dichos drivers para Vista x64.

Luego, te descargas una aplicación para modificar el instalador y que permita la instalación de drivers para tarjetas Mobility. Dicho programa lo encontraremos en: http://www.hardwareheaven.com/modtool.php

Para usar dicho programa deberemos deshabilitar el UAC y ejecutarlo como administradores.

Una vez tenemos instalado el anterior programa. Primero debemos iniciar la instalación de los drivers para que los descomprima en una carpeta del disco. Luego abortamos la instalación y arrancamos el Mobility Modder. Pulsamos en buscar y buscamos la carpeta con el nombre del driver y la versión. Seguidamente pulsamos modificar.

Si todo ha ido bien, lo cerramos y ejecutamos el setup.exe que hay dentro de la carpeta que le hemos indicado a Mobility Modder previamente.

Windows 7 alertará de que se intenta instalar un driver no firmado/soportado. Le decimos que continúe y reiniciamos.

Listo, ya tenemos los drivers operativos en windows 7.

Desarrollo en Windows 8

Hoy revisando mis blogs de interes he descubierto una web con muy buenos ejemplos de como programar para la nueva interfaz de windows 8

Aqui os dejo el enlace: http://robertoluis.wordpress.com/w8/

jueves, 10 de noviembre de 2011

Como darse de alta en una lista de correo

Hoy, por necesidades laborales e investigadoras he tenido que darme de alta en la lista de correo de tomcat. Como esto es nuevo para mi, dejare un pasito a pasito de como lo he hecho.

Para empezar vamos a la página de Apache Tomcat donde indican la lista de correo.http://tomcat.apache.org/lists.html#tomcat-users

El sistema funciona de la siguiente forma, cada cuenta de correo perteneciente a ese dominio es un comando que interpreta el servidor de la lista de correos. Así que para darnos de alta enviaremos un email en blanco y sin asunto a la siguiente dirección de correo
users-digest-subscribe@tomcat.apache.org
La diferencia entre la suscripción digester de la normal es que la digester te envia un resumen de los mensajes.

Una vez recibamos la respuesta nos pedirá que enviemos un email de confirmacion igual que antes a la una dirección que nos indican. Una vez enviada recibiremos un email de Bienvenida.

Lo primero que haremos será leernos la FAQ y la info enviando sendos emails a:
users-digest-info@tomcat.apache.org
users-digest-faq@tomcat.apache.org

Para terminar, si queremos enviar una consulta la enviaremos a:
users@tomcat.apache.org
Siempre especificando claramente la versión de tomcat y adjuntando los ficheros de configuración si es posible.

miércoles, 9 de noviembre de 2011

Como arreglar el Empathy para que funcione con cuentas hotmail en ubuntu 11.10

A dia de hoy y desde hace un mes, el empathy dejo de funcionar tras actualizar a ubuntu 11.10.

Hoy ya me he cansado esperando el parche y buscando he encontrado con la siguiente solución: http://askubuntu.com/questions/76948/problems-connecting-msn-with-empathy

Los pasos a seguir son sencillos. Abrimos una terminal y tecleamos:
gedit /usr/share/pyshared/papyon/service/description/AB/__init__.py
Y en la linea 23 más o menos pone algo asi:
url = "http://contacts.msn.com/abservice/abservice.asmx"
lo sustituimos por lo siguiente:
url = "http://local-bay.contacts.msn.com/abservice/abservice.asmx"

Guardamos, reiniciamos empathy y listo, a volar!

lunes, 7 de noviembre de 2011

Formulario con nombres de campo idénticos

Cuantas veces nos hemos tropezado con que queremos enviar un array de datos en un formulario al servidor y no sabemos como.

Tenemos dos opciones:

  • Si se tratan de checkbox usar como name del campo "nombre_del_campo[]". Importante los corchetes.
  • Otra forma, valida para JSP/Servlets (no lo he probado con otros lenguajes). Poner el mismo name a todos y luego recoger el valor con request.getParameterValues("nombre_campo").
Si tenéis alguna aportación no dudéis en hacerla

martes, 25 de octubre de 2011

Combinar correctamente

La mejor herramienta de las que he probado. Juzgar vosotros mismos. Dando un color podemos obtener colores análogos, complementarios y mucho más. Y si los dados no nos convencen podemos variar su tonalidad para darle o quitarle vivacidad al color.


ACTUALIZACIÓN: El otro día me pasaron una página más completa donde podremos ver un ejemplo de los colores seleccionados en una web sencilla o poner texto blanco, gris y negro encima de cada color
http://colorschemedesigner.com/

miércoles, 5 de octubre de 2011

SSI Filter en Tomcat 7

El otro día en el trabajo me estuve peleando intentando configurar un tomcat para que interpretara instrucciones SSI. Así que quiero dejar constancia de como se configura desde eclipse.

Lo primero de todo, abrir el fichero web.xml del servidor tomcat ubicado en /conf. En el deberemos descomentar el filtro SSI y el filter-mapping.

Filter SSI
    <filter>
        <filter-name>ssi</filter-name>
        <filter-class>
          org.apache.catalina.ssi.SSIFilter
        </filter-class>
        <init-param>
          <param-name>contentType</param-name>
          <param-value>text/html(;.*)?</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>3</param-value>
        </init-param>
        <init-param>
          <param-name>expires</param-name>
          <param-value>666</param-value>
        </init-param>
        <init-param>
          <param-name>isVirtualWebappRelative</param-name>
          <param-value>1</param-value>
        </init-param>
    </filter>

Filter mapping
    <filter-mapping>
        <filter-name>ssi</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Lo mas importante es en el Filter que la opción isVirtualWebappRelative este bien configurado en funcion de lo que busquemos.

El otro punto importante es el parametro contentType. Ahi deberemos filtrar aquellas paginas que queremos que sean analizadas para interpretar comandos SSI, en este caso son todas de tipo text/html. Importe lo que hay detras, ya que no siempre el contentType viene solo el mimeType, sino que va seguido del charset. Ej: text/html; charset=UTF-8

Una vez tenemos esto, deberemos marcar el contexto con el siguiente atributo
privileged="true". Esto se encuentra en /conf/context.xml.

Luego, el servidor deberemos configurarlo con la siguiente opción, ya que sino dará problemas en una clase, esta reconocido como un bug y se esta trabajando en ello, pero mientras tanto deberemos marcar esta opción: Publish module contexts to separate XML files



Después de esto ya solo nos queda hacer nuestras pruebas con SSI.

jueves, 29 de septiembre de 2011

Cuidadito con los comandos de Rails

Hoy copiando y ejecutando el siguiente comando del libro que estoy leyendo:
rails generate scaffold Product \ title:string description:text image_url:string price:decimal
me producia multiples errores en todo lo que decia el libro, ¿Por qué? Porque la barrita invertida que sale en el texto no debemos ponerla, esto me ha generado espacios en los nombres de variable y definicion de la tabla de la bd y esto probocaba todos los errores.

Asi que niños, en el futuro, desconfiar de cosas incoherentes como una barra invertida solitaria en medio de un comando XD.

miércoles, 21 de septiembre de 2011

By convention

En Ruby por convención encontraremos las variables, métodos, clases etc. escritos de la siguiente forma:

ElementoConvenciónEjemplos
Variables, parámetros de métodos, métodos Empiezan por minúscula y se el subrayado o guion bajo para separar palabras line_item, xr2000, order
Clases, módulos, constantes Empiezan por mayúscula y las palabras se separan mediante capitalización Object, PurchaseOrder, LineItem
Simbolos Similar a las variables pero empezando con : :id, :line_items, :action

domingo, 18 de septiembre de 2011

Problemas con teclado apple en Ubuntu 11.04

Con esto del desarrollo de aplicaciones web, el uso de los caracteres < > es imprescindible. Pero si usas un Apple keyboard en Ubuntu te darás cuenta de que estas teclas se encuentran donde está la tecla con los caracteres de º ª.

Para solucionarlo, basta con seguir las indicaciones que he encontrado en esta página

Básicamente en el home de nuestro usuario, ejecutamos el siguiente comando en la terminal:
gedit ./.Xmodmap
Y dentro del fichero escribimos lo siguiente:
keycode 49 = less greater less greater bar brokenbar bar 
keycode 94 = masculine ordfeminine backslash brokenbar backslash brokenbar
Una vez lo guardamos, reiniciamos la sesión o la máquina (según lo perro que estemos) y listo.

Empezando con Rails

Hoy empiezo en mi andadura con Rails después de comprarme el libro hace más de 3 meses. Hasta la fecha, lo único que he conseguido es instalarlo y tener soporte para mysql. No es porque sea cortito (si preguntáis a mi novia os dirá lo contrario), es que no he podido dedicarle más tiempo XD.

Me acabo de dar cuenta que la primera vez que creo un proyecto me instala muchas gemas que no tenía instaladas, quizás por eso, todos mis intentos previos de usar un IDE han fracaso, en cambio desde consola ha ido como la seda. Cuando vaya cogiendo soltura quizás me de cuenta de por qué.

Ah, importante, para trabajar acordaros de entrar en la carpeta que creéis con el mismo nombre que el del proyecto

Continuando con mis cosas, cuando tiro a ejecutar la aplicación, me doy cuenta de que no arranca, devolviendome el siguiente error:
Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

Para solucionarlo debemos acceder a la carpeta del proyecto,  y una vez dentro editar el fichero Gemfile añadiéndole las siguientes lineas:
gem 'therubyracer' 
gem 'execjs'

Al terminar guardamos el fichero y aplicamos los cambios con:
bunble install.

Ahora si que si, ya arranca. Así que continuemos con leyendo el libro.