domingo, 15 de diciembre de 2013

WCF: Bad request? - Dos razones por las cuales ocurre.

Una razón por la cual un servicio responde con la famosa respuesta "Bad Request" es porque un nombre de parámetro en el lado del cliente no tiene el mismo nombre que el nombre del parámetro en la definición del contrato.

Otra razón es el valor de los parámetros que se están pasando al servicio. Si en el lado del cliente el parámetro Edad se pasa con valor -1 pero en el lado del servidor ese parámetro es de tipo Byte, se produce el error y con buena razón. Entonces a revisar también los valores que se pasan por parámetro!

domingo, 29 de septiembre de 2013

VirtualBox: Corregir problema con UUID para reutilizar discos virtuales.

Un compañero me preguntó si había usado la opción de clonado en VirtualBox ya que ocupaba un sistema limpio varias veces, sin embargo no pudo porque le aparecía el siguiente error:



Resulta que sí me ocurrió ese error una vez, de hecho la opción de clonado no es necesario que la utilice para lo que él quería hacer porque tarda horas en clonarse. Lo más fácil es utilizar un comando para cambiar el UUID (identificador universal único).

En linux:

VBoxManage internalcommands setvdiuuid /path/to/Test.vdi

En Windows:

C:\Program Files\Oracle\VirtualBox\VBoxManage.exe internalcommands sethduuid "D:\Virtual Disks\Test\Test.vdi"

domingo, 2 de junio de 2013

Javascript: Cómo obtener los objetos vinculados al objeto window dentro de un iframe

Utilizando JQuery o javascript:

$('#iframeName').get(0).contentWindow.window
$('#iframeName')[0].contentWindow.window
document.getElementById('iframeName').contentWindow.window

Con cualquiera de las sentencias anteriores se logra obtener  referencia a un objeto creado por un usuario o referenciar los objetos hijos de window. Ejemplo:

document.getElementById('iframeName').contentWindow.window.document

sábado, 25 de mayo de 2013

Javascript: Copiar texto en portapapeles en IE

Código para poder copiar datos en el portapapeles del sistema operativo. Válido solo en IE:

var content = document.getElementById('txtHiddenCopyUrl');               
content.focus();
content.select();
range = content.createTextRange();
range.execCommand("Copy");
window.status = "Contents copied to clipboard";
setTimeout("window.status=''", 1800);


El caso anterior sirve por ejemplo si tenemos un textarea, en otros casos podemos copiar directamente en el portapapeles usando solo una línea de código:

window.clipboardData.setData("Text", variableWithText);

donde variableWithText es una variable que contiene el texto para copiar en el portapaples.

miércoles, 3 de abril de 2013

HTML - Atributo Complete para el elemento img

Hoy ví que una compañera tenía en un elemento IMG el atributo "complete", lo cuál se me hizo muy extraño, hasta le dije que no lo usara. Como siempre me quedé con la duda y lo investigué. Resulta que ese atributo si existe pero solo en el BOM (Browser Object Model), o sea, que los navegadores de internet si reconocen dicho atributo para el elemento IMG.

Yo me acuerdo más del DOM al punto que investigando en las revisiones de la W3C, no mencionan por ninguna parte al atributo "complete".

Encontré una referencia que dice que para HTML5 ese atributo si va a estar definido, pero no lo he comprobado.

Para que sirve el atributo "complete" en el elemento img?

Se usa únicamente para saber si la imagen ya se cargó completamente. Es un atributo de solo lectura y esto quiere decir que no se le puede asignar un valor, lo máximo que se puede hacer es consultar su estado utilizando javascript.

Es inválido poner: <img id="miEjemplo" complete="complete" />

Es inválido porque "complete" es de solo lectura y en el ejemplo anterior se le está asignando un valor, además el valor que puede o se espera que tenga debe ser de tipo booleano true|false.

Cuando un uri no existe, se devuelve internamente el código de estado 404. Si una imagen no existe aun así en el atributo "complete" queda el valor true tanto en Chrome como Firefox, lo cual se me hace algo extraño, en cambio IE el atributo si queda en false.

uri = uniform resource identifier / identificador uniforme de recurso / es un recurso como una imgen por ejemplo, algo específico.

JQuery - Formas para obtener la altura del contenido en un IFrame

Funciona correctamente, por desgracia en IE 9 Y 8 vamos a tener problemas ya que siempre retorna el valor 0:

var iframeSize = $('#myIFrame').contents().find('body').height();


Otra vez jquery me ayudó con una línea de código que aunque en el ejemplo que ví, no era lo mismo que me estaba ocurriendo, de bataso ví que basta con poner lo siguiente para obtener la altura aproximada del contenido del iFrame:

var iframeSize = $('#myIFrame').contents().height();


Ambas líneas son aceptables, pero como siempre en IE lo que parece lógico que sirva, no siempre es así.

Ser precavido, el iframe para mi caso no tenía el atributo height establecido, por lo que la altura default viene siendo cero y cambia hasta que se agrega contenido al iframe. CSS también entra en juego en estos casos, por lo que recomiendo tener en mente cualquier estilo que afecte las dimensiones del iframe.

sábado, 16 de marzo de 2013

Javascript - Cómo obtener un elemento específico del DOM donde la fuente es una cadena

Tenemos en una variable una cadena de un documento HTML o en un servicio que devuelve un string de html y queremos filtrarlo solo para obtener únicamente el contenido del elemento HEAD, podemos aplicar el siguiente script:

var head = txt.split("<head")[1]
              .split(">")
              .slice(1)
              .join(">")
              .split("</head>")[0];


O por ejemplo para obtener el contenido del elemento body:

var body = txt.split("<body")[1]
              .split(">")
              .slice(1)
              .join(">")
              .split("</body>")[0];


Lo mismo pero utilizando expresiones regulares:
var head = txt.match(/<(.*|\n*|\t*|(\r\n)*)head(.*|\n*|\t*|(\r\n)*)>
                      (.|\n|\t|\r\n)*<(.*|\n*|\t*|(\r\n)*)\/(.*|\n*|\t*
                      |(\r\n)*)head(.*|\n*|\t*|(\r\n)*)>$/gim);

var body = txt.match(/<(.*|\n*|\t*|(\r\n)*)body(.*|\n*|\t*|(\r\n)*)>
                      (.|\n|\t|\r\n)*<(.*|\n*|\t*|(\r\n)*)\/(.*|\n*|\t*
                      |(\r\n)*)body(.*|\n*|\t*|(\r\n)*)>$/gim);


Es mejor usar la expresión regular ya que en los flags se indica case-insensitive.

Ahora podemos llenar las dos secciones de un iframe, tanto el head como el body con un string de tipo HTML:

$('#myIframe').contents().find('head').html(head); $('#myIframe').contents().find('body').html(body);