Laburo España: 250.000 ofertas de empleo

neomode en la web

programación, diseño web y diseño gráfico

iPhone, el dispositivo total.

El 3en1 más bonito que se ha diseñado jamás: el iPhone.

Hace unas semanas Steve Jobs, el gurú de Apple, nos deleitó en la Macworld con la presentación del último invento tecnológico de la empresa de la manzana. El 3en1 más bonito que se ha diseñado jamás: el iPhone. Para caldear el ambiente anunció que iba a presentar tres novedades en la feria tecnológica de Mac: un teléfono móvil, una TabletMac y un nuevo iPod. Pero dejó boquiabiertos a los presentes y a los fans de Apple de todo el mundo cuando mostró su nuevo gadget: el iPhone, que combina estos tres dispositivos en uno y todo bajo la supervisión del Sistema Operativo Mac OS X (sí, sí, el mismo S.O. de los Mac’s), lo que supone una garantía de un perfecto funcionamiento bajo un diseño espectacular.


Leer +
Anotación por Mode Martínez Palenzuela a las 16:41:47 | Comentarios (0)
Guardado en la categoría General | Referencias (0)

getURL() y las medidas de seguridad de Flash 8

Si tenemos la última versión del reproductor de Macromedia, el famoso flash Player, comprobaremos que los links hechos con getURL() que antes nos funcionaban han dejado de hacerlo. Esto es así por las nuevas medida de seguridad que ha insertado Adobe en el reproductor. Al parecer un usuario malintencionado se podía infiltrar en nuestro ordenador a través de un archivo swf. Pero claro, muchos menús animados están hechos en Flash, y esta medida nos deja "con las patas colgando".

Hay una manera de solucionarlo y es añadiendo el tag <param name="allowScriptAccess" value="always"> al tag <object> con el objeto de que se permita la ejecución de ActionScript hacia fuera. Pero ojo, si sólo añadimos este tag la cosa no va a funcionar. Además debemos añadir el mismo atributo al tag <embed> . Para que lo veais más claro echadle un vistazo a este código:



En vez de "always" podemos utilizar "sameDomain" para restringir el funcionamiento de getURL a películas cargadas desde el mismo sitio. Aunque "always" nos asegura el funcionamiento casi en todo caso, la seguridad puede resentirse.
Anotación por Mode Martínez Palenzuela a las 20:19:21 | Comentarios (0)
Guardado en la categoría Flash | Referencias (0)

De vuelta al trabajo...en Granada

Estuvimos de Vacaciones y ... convalencientes.

Os pido disculpas a aquellos que habeis solicitado ayuda en esta bitácora durante el mes de Agosto y no habeis recibido respuesta, pero además de que estaba supuestamente de vacaciones tuve un problemilla con la moto y no estaba cómodo tecleando con el brazo escayolado ;-) Pero bueno, ya sin escayola y poniéndome las pilas para volver a empezar, esta vez en mi ciudad, espero ir resolviendo cuestiones y de esa manera poder aprender más junto con vosotros.
Anotación por Mode Martínez Palenzuela a las 13:40:44 | Comentarios (5)
Guardado en la categoría General | Referencias (0)

DataSet’s con más de una tabla.

Definimos nuestros propios comandos de ataque a la BD.

Cuando usamos un DataSet que maneja sólo una tabla, los comandos para realizar las inserciones, eliminaciones y actualizaciones de la base de datos podemos generarlos directamente con CommandBuilder. Por ejemplo, para una Base de Datos SQL haríamos:

Private comandos As SQLCommandBuilder(miAdaptador)

Siendo miAdaptador un objeto instanciado de la clase SQLAdapter (podemos comprobar la sentencia que genera VB accediendo a la propiedad CommandText de los distintos comandos:

MsgBox(comandos.InsertCommand.CommandText)
MsgBox(comandos.UpdateCommand.CommandText)
MsgBox(comandos.DeleteCommand.CommandText)

Pero si vamos a manejar más de una tabla en el DataSet comprobaremos que al intentar realizar alguna de las operaciones anteriores obtenemos un error. Esto es así porque los comandos generados automáticamente con CommandBuilder sólo afectan a una tabla. En el caso de manejar más de una tabla tenemos que especificar obligatoriamente los comandos correspondientes. Por ejemplo, para una BD Access:

Private cmdINSERT As OleDbCommand
Private cmdUPDATE As OleDbCommand
Private cmdDELETE As OLEDBCommand

cmdINSERT = New OleDbCommand(“INSERT INTO Socios (IdSocio, Nombre, Telefono) _
VALUES (?,?,?)”, miConexion)
cmdUPDATE = New OleDbCommand(“UPDATE Socios SET Socios.Nombre=?, _
Socios.Telefono=? WHERE IdSocio=?”, miConexion)
cmdDELETE = New OleDbCommand(“DELETE * FROM Socios WHERE IdSocio=?”, miConexion)

Donde los caracteres “?” representan los parámetros que se le pasan a los comandos (si la BD es SQL Server deberemos sustituir estos caracteres por el carácter “@”). Cuando demos orden de ejectuar alguno de estos comandos, VB sustituirá estos parámetros con los valores correspondientes que nosotros le suministraremos. Por ejemplo, para el comando de inserción:

cmdINSERT.Parameters.Add(New OleDbParameter(“IdSocio”, txtCodigoSocio))
cmdINSERT.Parameters.Add(New OleDbParameter(“Nombre”, txtNombre))
cmdINSERT.Parameters.Add(New OleDbParameter(“Telefono”, txtTelefono))

Teniendo en cuenta que txtCodigoSocio, txtNombre y txtTelefono son cuadros de texto con los valores correspondientes.

Ahora sólo nos queda ejecutar el comando:

cmdINSERT.ExecuteNonQuery()

El método ExecuteNonQuery() se utiliza para ejecutar un comando SQL sobre una base de datos siempre que dicho comando no devuelva como resultado un conjunto de filas. Es decir, para realizar una acción concreta que no genera información de salida, como es el caso de una inserción, una actualización o una eliminación. Si queremos ejecutar un comando que nos devuelva una o más filas afectadas (por ejemplo una consulta) deberemos utilizar ExecuteReader() , que devuelve un objeto DataReader.


Ejemplo con SQL en un mantenimiento tipo:

Partimos de:

conn.ConnectionString = cadConn
miAdaptador = New OleDbDataAdapter("SELECT * FROM SOCIOS INNER JOIN CARGOS ON _
SOCIOS.IDCARGO=CARGOS.CODCARGO ORDER BY codigo", cadConn)
miAdaptadorCargos = New OleDbDataAdapter("SELECT * FROM CARGOS ORDER BY_
codCargo", cadConn)

Creamos los comandos:

insertCommand = New OleDbCommand("INSERT INTO Socios (codigo, dni, nombre, _
direccion, poblacion, IdCargo) VALUES (@CLAVE, @DNI, @NOM, @DIR, @POB, @CAR)", conn)
deleteCommand = New OleDbCommand("DELETE * FROM Socios WHERE_
codigo = @CLAVE", conn)
updateCommand = New OleDbCommand("UPDATE Socios SET nombre=@NOM, dni=@DNI, _
direccion=@DIR, poblacion=@POB, IdCargo=@CAR WHERE codigo=@CLAVE", conn)

Definimos los parámetros:

deleteCommand.Parameters.Add(New SqlParameter("@CLAVE", OleDbType.BigInt))
With insertCommand.Parameters
.Add(New OleDbParameter("@CLAVE", SqlType.BigInt))
.Add(New OleDbParameter("@DNI", SqlType.Char))
.Add(New OleDbParameter("@NOM", SqlType.Char))
.Add(New OleDbParameter("@DIR", SqlType.Char))
.Add(New OleDbParameter("@POB", SqlType.Char))
.Add(New OleDbParameter("@CAR", SqlType.BigInt))
End With
With updateCommand.Parameters
.Add(New OleDbParameter("@CLAVE", SqlType.BigInt))
.Add(New OleDbParameter("@DNI", SqlType.Char))
.Add(New OleDbParameter("@NOM", SqlType.Char))
.Add(New OleDbParameter("@DIR", SqlType.Char))
.Add(New OleDbParameter("@POB", SqlType.Char))
.Add(New OleDbParameter("@CAR", SqlType.BigInt))
End With


Asignamos valor a los parámetros (en el caso de una inserción):

With insertCommand.Parameters
.Item("@CLAVE").Value = CInt(txtCodigo.Text)
.Item("@DNI").Value = txtDNI.Text
.Item("@NOM").Value = txtNombre.Text
.Item("@DIR").Value = txtDireccion.Text
.Item("@POB").Value = txtPoblacion.Text
.Item("@CAR").Value = cmbCargos.SelectedIndex + 1
End With


Ejecutamos el comando:

insertCommand.ExecuteNonQuery()
Anotación por Mode Martínez Palenzuela a las 12:16:29 | Comentarios (0)
Guardado en la categoría .NET | Referencias (0)

Almacenar una imagen en una Base de Datos en .NET

Campos Imagen y Controles PictureBox.

Podemos utilizar dos caminos diferentes para incorporar imágenes a nuestros registros. Uno de ellos es definir un campo cadena que almacenará la ruta donde se encuentra la imagen y el otro es, directamente grabar la imagen en la base de datos como una cadena binaria. Elegiremos uno u otro en base a nuestras necesidades y al proveedor de datos utilizado, ya que no todos poseen un tipo de campo que permita almacenar imágenes.

Almacenando la ruta en la base de datos.

Es el método más sencillo. Basta con almacenar en el campo correspondiente de la Tabla una cadena con la ruta a visualizar y usar el método FromFile() del objeto Image para cargar la imagen correspondiente en un PictureBox. De esta forma el tamaño de la base de datos no crece de forma exponencial, pero a cambio nos obliga a tener todas las imágenes perfectamente organizadas y a transportarlas junto con nuestro proyecto. Además, si algún usuario elimina por error una imagen de la carpeta correspondiente, la aplicación no podrá mostrarla y se generará una excepción que deberemos tener en cuenta.


Recuperar la imagen de la Base de Datos.

Suponiendo un DataSet y una variable posRegistro que apunta al registro actual.


‘ Acceder a la fila correspondiente
Dim registro as DataRow
registro = miTabla.Rows(posRegistro)
‘ Comprobar que contiene una ruta
if registro(“Foto” ) <> “” then
‘ Cargamos la foto en el PictureBox
PictureBox1.Image = Image.FromFile(registro(“Foto” ))
End If


Asignar una imagen desde archivo.

En el evento Click del PictureBox o de un botón de comando:

‘ Especificar parámetros para el cuadro de diálogo
dlgAbrir.InitialDirectory = “ C:\Documents And Settings\Admin\Mis Documentos\Mis Imágenes”
‘ Invocar al cuadro de diálogo
dlgAbrir.ShowDialog()
‘ Comprobar que se ha elegido un archivo y no se ha pulsado el botón Cancelar
if dlgAbrir.FileName <> “dlgAbrir” then
‘ Cargar la imagen del archivo en el PictureBox
PictureBox1.Image = Image.FromFile(dlgAbrir.FileName)
‘ Asignarla a la columna correspondiente en la Tabla
Registro(“Foto” ) = dlgAbrir.FileName
Else
Msgbox (“No ha seleccionado un nombre de archivo válido…” )
End If


Almacenando la imagen en la base de datos.

Casi todos los RDBMS cuentan con algún tipo de columna que facilita el almacenamiento de imágenes, pero su enlace y tratamiento en aplicaciones no es tan fácil como cabría esperar. SQL Server, por ejemplo, cuenta con un tipo Image pero no tiene correspondencia con ningún tipo de la plataforma .NET y ni siquiera puede enlazarse directamente a un control PictureBox. El tipo más parecido en la plataforma es base64binary. Cuando creamos una columna tipo Image en SQL Server es conveniente permitir que admita nulos para evitar determinado tipo de errores en el caso de que uno de valores de la columna no haya sido asignado.

Recuperar la imagen de la Base de Datos.

En primer lugar necesitamos saber cuál es la fila actual de datos que está mostrándose y posteriormente comprobar si la columna con la imagen tiene un valor nulo o no. Si no es nulo significará que existe una imagen, pero no podemos mostrarla directamente porque el tipo de dato Image no es compatible con el que admite un control PictureBox.

Por ello hay que crear un flujo de datos en memoria, es decir, un objeto MemoryStream, que contenga la secuencia de bytes alojada en el campo imagen. Una vez hecho esto podemos usar el método FromStream() de la clase Image para mostrarla en el PictureBox.

Por el contrario, si el valor de la columna es nulo deberemos eliminar el contenido actual del PictureBox, para que refleje la situación de la fila actual.

Para hacer todo esto podemos aprovechar el método PositionChanged() que es invocado por todos los métodos que causan una actualización de los datos.

Private Sub objdsLibros_PositionChanged()
Me.lblNavLocation.Text = (((Me.BindingContext(objdsLibros, “Libros” ).Position+1)._
ToString + “ de “ + Me.BindingContext(obdjdsLibros,”Libros” ).Count.ToString)
Dim posicion = BindingContext(objdsLibros, “Libros” ).Position
If Not obdjsLibros.Libros(Posicion).IsPortadaNull then
‘ Creamos un MemoryStream
Dim Imagen As New MemoryStream(obdjsLibros.Libros(BindingContext(obdjsLibros,_
“Libros” ).Position).Portada)
‘ Introducimos la imagen en el PictureBox
PictureBox1.Image = Imagen.FromStream(Imagen)
Else
‘ Limpiamos
PictureBox1.CreateGraphics().Clear(Color.Black)
End If
End Sub


Asignar una imagen desde archivo.

El evento Click del PictureBox o de un botón de comando que pongamos debajo del mismo nos puede sevir para especificar el código para cargar la imagen desde un archivo ayudándonos de un control cuadro de diálogo.

Podemos usar el método FromFile() de la clase Image para recuperar la imagen de un archivo y mostrarla en el PictureBox. Los DataColumn no disponen de un método similar, por lo que tendremos que recuperar la imagen en memoria como secuencia de bytes y luego asignarla a la propiedad Image del PictureBox.

Private Sub PictureBox1_Click (….) …
‘ Abrimos el cuadro de diálogo de selección de archivo y si se elige uno …
if OpenFileDialog1.ShowDialog() = DialogResult.Ok then
‘Mostramos
PictureBox1.Image= Image.FromFile(OpenFileDialog1.FileName)
‘Creamos un FileStream para recuperar la imagen en memoria …
Dim Img As NewFileStream(OpenFileDialog1.FileName, FileMode.Open, FileAcces.Read)
‘ … en un array de bytes
Dim Imagen (Img.Length) As Byte
‘ Leemos
Img.Read(Imagen, 0, Img.Length)
Img.Close
‘ Asignamos
obdjsLibros.Libros(Me.BindingContext(obdjsLibros, “Libros” ).Position).Portada=Imagen
End If
End Sub

PLEASE REPORT BUGS
Anotación por Mode Martínez Palenzuela a las 12:13:00 | Comentarios (0)
Guardado en la categoría .NET | Referencias (0)

Ajax ..¿de qué se trata?

Una nueva manera de ver la web con Ajax (Asynchronous JavaScript+XML)

Su nombre evoca a los antiguos héroes griegos, a un equipo de fútbol e incluso puede que a un detergente. Pero Ajax no es nada de eso en el mundo de la red de redes, sino la unión de varias tecnologías ya existentes a las que, juntas, se les ha encontrado nuevas aplicaciones. No es una tecnología en sí mismo, sino el uso conjunto de XHTML, CSS, DOM (Document Object Model), XML, XSLT y JavaScript.

Con Ajax se consigue intercambiar datos con el servidor de forma asíncrona, sin que se vea afectada la interacción con el usuario. Este asincronismo consigue separar la interacción del usuario de la aplicación, creando una capa intermedia escrita en JavaScript, entre éste y el servidor. Esta capa se encarga de mostrar la interfaz y comunicarse con el servidor. Es decir, con Ajax no existe comunicación directa entre el usuario y el servidor, que es lo que ocurre con las webs convencionales. Esto posibilita que JavaScript pueda hacer peticiones al servidor remoto sin que se tenga que recargar la página. Es decir, se pueden realizar peticiones y recibir respuestas a través de HTTP sin que el usuario perciba interrupción alguna. Nada más y nada menos...a partir de ahí se abre todo un nuevo abanico de posibilidades.

Existe un magnífico artículo en inglés de J.J. Garrett, que es quien acuñó el término Ajax, así que más que él no sabrá nadie. Puedes acceder a él clicando aquí.
Anotación por Mode Martínez Palenzuela a las 12:37:20 | Comentarios (0)
Guardado en la categoría Ajax | Referencias (0)

Mandar variables a Flash desde HTML-Javascript

¿Cómo puedo mandar una variable a una película flash?

Pues hay varias formas de hacerlo. Una de ellas es utilizando la función DoFSCommands que el propio Flash nos crea al publicar. Posteriormente sólo deberemos utilizar el método SetVariable del objeto Flash. Puedes leer acerca de ello en los siguientes links:

Tutorial Cristalab

Pero disponemos de otra forma más sencilla, muy útil cuando sólo queremos enviar un valor. Consiste en utilizar los atributos FlashVars del tag <object> y flashvars del tag <embed> que se necesitan para incrustrar una película flash en un documento HTML.

El problema es que como el valor que queremos pasar a la película flash será variable (no tiene mucha utilidad pasar siempre el mismo valor, no?), debemos utilizar javascript, concretamente el objeto document y el método write para indicar el valor de la variable.

El parámetro FlashVars se define de la siguiente forma dentro de <object>:

<param name="FlashVars" value="valor">

El atributo flashvars de <embed> se define sin más de la siguiente forma:

flashvars="valor"

Pero de esta forma sólo podríamos mandar valores fijos. Para mandar valores a variables necesitamos de javascript. El código definitivo quedaría así:


<object classid="clsid:D27cdb6e-ae6d-11cf-96b8-444553540000" 
codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=8,0,0,0"
id="menu" width="750" height="133" align="middle">
<param name="Src" value="../imgs/menu.swf" />
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="../imgs/menu.swf?op=3" />
<script language="javascript">
//..............................
// www.neomode.org
//..............................
// Recogemos en la variable menu el GET
// enviado por la película Flash
var menu=document.location.search;
// Extraemos sólo el último carácter
//que lleva la opción pulsada
var opcion=menu.substr(menu.length-2,1);

// Si ha habido algún error en la
//transmisión de GET
//suponemos la primera opción
if(opcion=='undefined') { opcion=1; };
document.write('<param name="FlashVars"
value="op='+opcion+'"/>');
</script>
<param name="quality" value="high" />
<PARAM NAME="BGColor" VALUE="FFFFFF">
<PARAM NAME="SWRemote" VALUE="">
<param name="wmode" value="transparent" />
<param name="bgcolor" value="#999999" />
<script language="javascript">
document.write('<embed src="../imgs/menu.swf"
width="750" height="133" quality="high"
pluginspage="http://www.macromedia.com/go/getflashplayer"
type="application/x-shockwave-flash" menu="false"
allowscriptaccess="sameDomain" swLiveConnect=true
id="menu" name="menu"
flashvars="op='+opcion+'"></embed>');
</script>
</object>

Y Voilá! de esta forma hacemos que se genere el valor de la variable cuando se interprete el código en el navegador.

Y para qué sirve esto? Pues a mí personalmente me ha servido para hacer que un menú confeccionado con flash y que se repite en todas las páginas de un sitio conserve la opción que se ha seleccionado marcada en el menú, reflejando de esta forma el lugar que le corresponde en el menú a la página visualizada (de otra forma, el menú aparecería "desde cero" en cada página). Cuando la página esté operativa subiré un link a este mismo post. Por el momento sólo existe en mi Mac.



Anotación por Mode Martínez Palenzuela a las 14:00:03 | Comentarios (0)
Guardado en la categoría Flash | Referencias (0)

JavaScript con Flash 8 (Problemas con getURL)

Flash 8 no interactúa con javascript, porqué se odian?

Bueno, no es que se odien, es que por motivos de seguridad (según Adobe) si publicamos una película flash con los settings tal y como vienen por defecto, comprobaremos que al hacer un getURL con intención de enviar valores de variables al documento HTML que enlazamos, Flash elimina de la URL estas variables, es decir, no manda ningún valor. Me explico...si por ejemplo hacemos:

getURL('pagina.htm?op=10&subop=23', '_self', 'GET');

donde op y subop son las variables que queremos enviar, veremos que en la línea de dirección de nuestro navegador sólo aparece:

pagina.htm

...y ni rastro de lo que va después de la interrogación, con lo que no podemos recoger esas variables de ningún modo.

Para solucionar esto debemos irnos a File -> Publish Settings, y en la pestaña Flash, en la opción Local playback security, seleccionamos Access network only. Y a partir de entonces Flash tendrá ojos para javascript y podremos hacernos una función en javascript para recoger los valores de esas variables. No obstante si tenemos variables definidas en la línea de tiempo principal de la película, al utilizar el método GET en la función getURL, se nos encadenarán todas estas variables a la URL y puede que no queramos eso. En este caso basta con eliminar el parámetro GET de la función getURL, quedando la cosa como sigue:

getURL('pagina.htm?op=10&subop=23', '_self');

Pero, cómo hago para mandar valores desde HTML o javascript a la película Flash? Pues eso en otro post...próximamente.
Anotación por Mode Martínez Palenzuela a las 12:15:20 | Comentarios (0)
Guardado en la categoría Flash | Referencias (0)

Formularios modales y no modales

Cómo restringir el foco al formulario activo...

Normalmente cuando invocamos desde un formulario a otro, podemos cambiar el foco de la aplicación a cualquier ventana windows que tengamos en segundo plano (sea o no sea de nuestra aplicación) simplemente haciendo click en dicha ventana. Esto es porque lo invocamos de forma no modal. El método que nos permite lanzar un formulario no modal desde otro es Show(). Ejemplo:

frmClientes.Show()

Pero si necesitamos que el formulario que invocamos conserve el foco hasta que éste sea cerrado, evitando así que se pueda interrumpir cualquier proceso que se lleve a cabo dentro del mismo, tendremos que lanzarlo de forma modal mediante el método ShowDialog(). Ejemplo:

frmClientes.ShowDialog()
Anotación por Mode Martínez Palenzuela a las 11:28:56 | Comentarios (11)
Guardado en la categoría .NET | Referencias (0)

Tu galería de imágenes pesa mucho?

Vamos a quitarle peso...

Si hemos creado una galería de imágenes en Flash es lógico que la película resultante nos haya engordado un poco. Pero si el peso nos parece desorbitado posiblemente sea porque hemos importado las imágenes a nuestra biblioteca y las hemos dejado con la configuración de compresión que tengan en origen. Para solucionar esto hacemos doble click sobre cada archivo de imagen en la biblioteca. Nos aparecerá la ventana Propiedades de mapas de bits. Lo más probable es que aparezca seleccionada la casilla Utilizar datos de JPEG importado. Pues bien, la deseleccionamos y nos aparece un cuadro de texto donde teclearemos la calidad o nivel de compresión que queremos para nuestras fotos. Un 80-90% baja el peso de la película considerablemente sin que la calidad se vea muy afectada. En esa misma ventana podemos ver el ahorro en bytes que obtenemos. Y listo.
Anotación por Mode Martínez Palenzuela a las 12:59:00 | Comentarios (4)
Guardado en la categoría Flash | Referencias (0)

Copyleft Mode Martínez Palenzuela - Granada - Andalucía - España

Sindica este sitio usando: RSS 1.0, RSS 2.0, Atom. Esta bitácora se mantiene con Bitacorae.
ADN.esADN.es Medio Oficial Premios Bitacoras 2008: Peliculas