Babylon 5

He tenido que buscar una version de Babylon 5 que incluyera el diccionario de frances a español. Y ya que he hecho ademas unas instrucciones "mu apañas" y se lo he pasado todo en un fichero comprimido subiendolo a megaupload aprovecho para colocar tambien el link en el blog por si a alguien le resulta util. Por cierto, Babylon 5 es un diccionario para palabras y expresiones para quien no lo sepa.

Técnicas ninja aplicadas a la vida diaria, lección 1

Se acabaron los exámenes y a escribir de nuevo que esto está muy abandonado. Un monton de clases aburridas me han dado para unas cuantas tiras cómicas de dudosa gracia. Comenzamos con un nuevo personaje, Tokio Shunjuku, que nos instruirá en una serie de técnicas ninja para aplicarlas a nuestra vida diaria. ¡Sayonara!

Image Hosted by ImageShack.us

DB+Bleach+Death Note

Para entender esta tira hay que conocer Bleach, Dragon Ball y Death Note.

Guión: MikeHDF
Dibujo: El chico costra

Image Hosted by ImageShack.us

No veais lo que me ha costado hacer la maldita tira, entre que no me acordaba de como se dibujaba a Celula ni el traje de Ichigo cuando libera el Bankai ni los pelos de Trunks. Y colorearlo todo con todos los detalles mas las malditas manchitas de Celula ya era el colmo XD.

En fin espero que la hayais disfrutado ^^

LOS OUTER JOIN DE SQL SERVER

Para entender el post necesitas: Tener conocimientos de SQL, aunque no necesariamente de SQL Server (otra cosa es que te sea útil si no lo utilizas).

Cuando uno está acostumbrado al comportamiento de un motor de base de datos específico, iniciarse con uno distinto puede resultar un problema; ya que es normal encontrar casos particulares en los que el comportamiento de uno y otro difieren, sobre todo a la hora de manejar valores nulos.

En mi caso, ya estaba acostumbrado a trabajar con la base de datos Informix de la compañía IBM, de las más potentes y rápidas que he utilizado sin lugar a dudas, cuando empecé a utilizar / experimentar la versión Express de SQL Server 2005. Tenía que migrar una aplicación de un lenguaje (Dynamic 4GL) a su nueva versión harto mejorada (Genero 4GL) y de una base de datos a otra.

Todo fue bien hasta que tuve que hacer una SQL con un "potito" OUTER JOIN.

En el programa en cuestión, necesitabamos relacionar la tabla de artículos con la tabla de existencias, pero queríamos que salieran todos los artículos que pertenecieran, por ejemplo, a la familia 'AJUSA', sin importar si existía o no el registro correspondiente en la tabla de existencias. Además, para el presente ejemplo, sólo vamos a consultar el año 2008.

La consulta a ejecutar en Informix es muy simple:

SELECT articulo.*,existencia.*
FROM articulo, OUTER existencia
WHERE articulo.fam_art = existencia.fam_art
AND articulo.cod_art = existencia.cod_art
AND articulo.fam_art = 'AJUSA'
AND existencia.ejercicio = 2008
ORDER BY articulo.fam_art

Para comprobar que la sentencia es correcta, basta con hacer un SELECT COUNT de los registros de la tabla de artículos cuya familia sea 'AJUSA' y compararlo con el resultante de esta misma consulta. Ambas sentencias devolverán el mismo número de registros. Y si tenemos pocos artículos podemos asegurarnos comparando, os aseguro que no falla.

Ahora bien, si hacemos la consulta equivalente en SQL Server, que sería:

SELECT articulo.*,existencia.*
FROM existencia RIGHT OUTER JOIN articulo
ON existencia.fam_art = articulo.fam_art
AND existencia.cod_art = articulo.cod_art
WHERE articulo.fam_art = 'AJUSA'
AND existencia.ejercicio = 2008
ORDER BY articulo.fam_art

Tendremos una desagradable sorpresa; ya que sólo devolverá los registros que en ambas tablas existan con los criterios especificados o, lo que es lo mismo, HACE UN PUTO INNER JOIN.

Rebuscando por ahí encontré esta página en el que veía confirmada esta afirmación y la forma de solucionar el problema. La forma de trabajar de SQL Server es un poco especialita, por decirlo suavemente: primero se hace el filtrado de la clausula WHERE y ¡¡DESPUÉS!! el OUTER JOIN.

La solución propuesta en la web de sqlteam consiste en incluir los criterios de selección en la clausula ON del OUTER JOIN. Para que nos entendamos, si queremos sacar TODOS los artículos relacionados con la tabla de existencias que sean del 2008 (existan o no en esta tabla); la consulta necesaria sería:

SELECT articulo.*,existencia.*
FROM existencia RIGHT OUTER JOIN articulo
ON existencia.fam_art = articulo.fam_art
AND existencia.cod_art = articulo.cod_art
AND existencia.ejercicio = 2008

Pero en nuestro caso tenemos un problema adicional; y es que sólo necesitamos los artículos cuya familia es 'AJUSA'. El campo fam_art forma parte del OUTER JOIN, con lo que esta condición sería ignorada por el motor de la base de datos; de modo que la consulta:

SELECT articulo.*,existencia.*
FROM existencia RIGHT OUTER JOIN articulo
ON existencia.fam_art = articulo.fam_art
AND existencia.cod_art = articulo.cod_art
AND articulo.fam_art = 'AJUSA'
AND existencia.ejercicio = 2008

... daría el mismo resultado que la sentencia SQL anterior; vamos, que saca todos los artículos tengan o no tengan existencias en el 2008.

Pero la solución está cerca atendiendo al orden de ejecución de las clausulas, porque lo que debemos hacer es utilizar la clausula ON para indicar los filtros sobre la tabla en la que se especifica el OUTER (en nuestro caso, '"existencia") y después emplear la clausula WHERE para la tabla de la que queremos extraer todos los registros ("articulo" en este ejemplo):

SELECT articulo.*,existencia.*
FROM existencia RIGHT OUTER JOIN articulo
ON existencia.fam_art = articulo.fam_art
AND existencia.cod_art = articulo.cod_art
AND existencia.ejercicio = 2008
WHERE articulo.fam_art = 'AJUSA'

Esta consulta devuelve los registros que deseábamos obtener.

Los OUTER JOIN se utilizan muy rara vez y es difícil encontrar información sobre este dichoso problema; así pues, decidí que tan preciada información tenía que estar en este blog, que tantas visitas recibe, para que el conocimiento se propague rápidamente XD.

VIVA CALIGULA (VERSIÓN OFFLINE)

Frikis y frikas (pongámoslo en plural, seamos optimistas), tuve un pequeño olvido en mi presentación con respecto a mis aportaciones a este nuestro blog (no vuestro, nuestro); y es que si hay algo que me pirra son los videojuegos antiguos (esos que tiraban perfectamente en un Pentium III o incluso inferior) y los minijuegos flash gratuitos, a los que se dedican enteramente no pocas páginas.

Seguramente pronto no tardaré en aburriros con mis juegos favoritos de aquellos que rulan con menos del Gigahercio y que no necesitan ocupar 3 Gigabytes del puto disco duro para echarlos a andar en pos de la espectacularidad gráfica y memeces similares; para eso siempre resulta mejor comprar una consola de última generación a tener que actualizar el ordenador cada dos años si queremos deleitarnos con las novedades del sector lúdico (siendo optimista y hablando de gente con pasta, claro); y luego para que la mayoría de las veces nos sintamos estafados o decepcionados con la jugabilidad del producto en cuestión. Lo dicho, otro día os aburro con eso XD.

El caso es que ahora os quiero hablar de un jueguecillo Flash harto divertido y gore (como los buenos) que encontré hace un par de días en la fabulosa web Minijuegos. Se trata de "Viva Caligula"; en el que encarnas al zumbado emperador romano, que decide erradicar la perversión de las calles de Roma... matando a todos sus ciudadanos.

Calígula limpiando los jardínes

Para realizar tan tiránica (más que titánica) tarea, podrás recorrer las siete colinas de Roma y coleccionar todas las armas que existen en el juego, un total de 26, una por cada letra del alfabeto representada en nuestro teclado (tened en cuenta que la "Ñ" no cuenta para los anglosajones que diseñaron el juego).

Calígula resucitando muertos, Emily Bouffante creo que tiene ese mismo poder

Los ciudadanos, esos cabroncetes pseudo-empáticos, se acaban cabreando si llenas la calle de cadáveres o si te ven atacar a los que pertenecen a su mismo grupo; por lo que llegará un momento en el que tendrás que pelear contra todos.

Existe, además un poder que se activa cuando nuestro personaje esta ebrio de poder y sed de sangre (de vino, también) denominado "Rampage mode", que nos permitirá descuartizar a nuestras víctimas con bastante menos golpes de los habituales.

Calígula en Rampage mode

Arma especial de hipnosis colectiva de Calígula XD

Una vez obtenidas todas las armas, podréis entrar en el palacio de nuestro pirado psicópata y ¡FORMAR PARTE DE UNA ORGÍA! en el que recibirá hasta el apuntador.

El juego ha sido fruto de la colaboración entre www.adultswim.com y www.popandco.com, en cuyas webs tendréis la posibilidad de jugar online a éste y otros juegos geniales como Bible fight en el que puedes encarnar a Moisés, Eva, Satán, Jesús o incluso al mismisimo Dios para darte de hostias contra éstos y otros personajes bíblicos.

El punto negativo de "Viva Caligula" es que ocupa unos 16 MB (6 MB el fichero principal y el resto para las texturas que se cargan al acceder a los distintos niveles). Si borramos con frecuencia los ficheros temporales de nuestro navegador, la carga del mismo puede resultar un coñazo. Es por eso que no he parado hasta conseguir descargar todos los ficheros que el juego necesita para funcionar correctamente sin conexión a internet. Como no he saltado ningún dispositivo de seguridad para hacerlo y el juego es gratuito, aquí lo tenéis:

Viva Caligula (Offline)

Contraseña del archivo: elchicocostra.blogspot.com

En el fichero rar tenéis el juego y el Flash Player 9 (dentro de la subcarpeta "player") que os permitirá disfrutar del juego a mayor velocidad que si lo abrís con vuestro navegador.

Todo friki es un psicópata en potencia, así que ¡saciad vuestros bajos instintos, putos!

CONECTAR A DISTINTAS BASES DE DATOS DE SQL SERVER CON CRYSTAL REPORTS

Para entender el post necesitas: Tener conocimientos de SQL Server, Crystal Reports y Visual Basic 6, así como estar familiarizado con las conexiones vía ODBC.

Parece que, desde la versión 8 ó 9 de Crystal Reports, existe un problema a la hora de cambiar la base de datos a la que queremos conectar cuando lanzamos un informe, ya sea utilizando los módulos RDC o .NET de Crystal Reports. Recuerdo haberle dado muchas vueltas en su día, cuando tuve que programar un administrador de informes con sus filtros y la información de conexión vía ODBC (nombre del DSN, driver, servidor, usuario y contraseña) de modo que fuesen fácilmente configurables. Por aquel entonces cargaba (innecesariamente) los datos en un RecordSet con la sentencia SQL del informe y luego se lo asignaba al objeto CRAXDRT.Report correspondiente. Creía que el método funcionaba correctamente, hasta que tuve que hacer un pequeño lanzador de informes con el runtime de Crystal Reports XI y detectamos que siempre atacaba a la base de datos que fuese declarada en el informe origen. Después de quebraderos de cabeza varios, y hacer muchas tonterías, di con la solución al comprobar la sentencia SQL del informe (que era lo primero que tenía que haber hecho, leches).

Parece que desde la versión 8 en adelante, se les ocurrió la genial idea de dejar guardada la información de la base de datos a la que debía conectar el informe explícitamente en la clausula FROM de la dichosa sentencia SQL. De modo que, hagas lo que hagas con la cadena de conexión del informe, a éste le basta con encontrar el servidor SQL al que estaba enlazado para que deseche la nueva información o, si no la encuentra, seguramente falle sin más.

Por suerte, este problema tiene solución sin tocar la sentencia SQL. Basta con modificar los datos de conexión de las tablas utilizadas en el informe (ya sea alterando la ConnectionString o las ConnectionProperties) y alterar el origen de los datos mediante la propiedad Location de la tabla. A continuación os dejo el código fuente de una función con la que podéis atajar el problema:

Entorno utilizado: Visual Basic 6 SP6 con el runtime de Crystal Reports XI Release 2.
Base de datos: SQL Server 2000. Puede ser útil también para Oracle.


Public Function AplicaCambios(ByRef crrep As CRAXDRT.Report _
, strDsn As String, strServer As String, strDb As String _
, strUid As String, strPwd As String, strDriver As String) As Boolean
    Dim i As Integer
    Dim esSqlServer As Boolean

    AplicaCambios = True

    'Comparamos sin distinguir mayúsculas. _
     Si se trata de un report contra SQL Server tendremos _
     que procesar el Location de cada tabla.

    If InStr(1, strDriver, "SQL SERVER", vbTextCompare) Then
        esSqlServer = True
    Else
        esSqlServer = False
    End If

    For i = 1 To crrep.database.Tables.Count
        With Me.crReport.database.Tables(i)
            Call .ConnectionProperties.DeleteAll

            Call .ConnectionProperties.Add("DSN", strDsn)
            Call .ConnectionProperties.Add("Server", strServer)
            Call .ConnectionProperties.Add("Database", strDb)
            Call .ConnectionProperties.Add("User ID", strUid)
            Call .ConnectionProperties.Add("Password", strPwd)
            Call .ConnectionProperties.Add("UseDSNProperties", False)

            If esSqlServer Then
                On Error Resume Next
                .Location = strDb & ".dbo." & .Location

                If Err.Number Then
                    Call MsgBox("Error al procesar los nombres de las tablas: " _
                    & vbCrLf & .Location & " al pasar a " _
                    & strDb & ".dbo." & .Location _
                    & vbCrLf & Err.Number & ": " & Err.Description)

                    AplicaCambios = False
                    Exit For
                End If
                On Error GoTo 0
            End If
        End With
    Next
End Function 'AplicaCambios


La comprobación del driver no sé si os resultará útil; en mi caso, el programa lo utilizo para atacar mediante ODBC a SQL Server o a ficheros de texto plano; por eso no aplico el cambio de la propiedad Location siempre.

Por último, creo conveniente comentar que una de las ventajas de Crystal Reports XI es que no hay que procesar los subinformes, ya que todas las tablas se encuentran localizadas en el miembro Database del objeto CRAXDRT.Report. Creo recordar que, para la versión 9, sí era necesario recorrer todas las secciones para aplicar los cambios.

Espero que sirva de ayuda a alguien. Para sugerencias o dudas, tienen a su disposición los comentarios.

Speed Racer (AKA Meteoro)

Recuerdo que cuando tenía unos 14 años o así pusieron en canal sur una serie llamada en España "Meteoro".

Image Hosted by ImageShack.us

La animación era un poco cutre (normal porque la serie es de 1967) e iba acerca de un adolescente (como no) que pilota un deportivo un tanto especial, el Mach 5, corriendo en carreras de cualquier parte del mundo. El Mach 5 fué diseñado por su padre, un corredor profesional retirado, y dispone de mecanismos que permiten conducir en cualquier tipo de terreno y con todo tipo de obstáculos. El piloto llamada en España Meteoro tendrá que usar dichos mecanismos en numerosas ocasiones, pues se enfrenta habitualmente a competidores sin escrúpulos y criminales internacionales que tratan de amañar las carreras.

Meteoro suele ir acompañado de su novia Trixie, su hermano pequeño Spridle y de la mascota de éste, Chim-Chim (un mono).

La información la he sacado de la base de datos de frozen-layer aqui os pongo el link a la ficha por si sentís curiosidad y no desmerecer el trabajo del que la haya escrito.

La serie en si misma a mi me parece infantil y está muy desactualizada como podréis comprobar en la intro que he encontrado en San Youtube y he puesto más abajo (aunque creo que basta con ver los primeros 30 o 60 segundos para haceros una idea de lo que era):




¿Y por qué reseño esta serie si me parece tan cutre? Pues porque los hermanos Wachowski (que al parecer ahora son hermano y hermana ya que Larry se ha hecho un cambio de sexo en sus vacaciones en Tailandia y ahora se llama Lana) están realizando una película de imagen real de esta serie y el primer trailer que ha salido es espectacular. Lo podéis ver y descargar en la pagina oficial de la película aunque esté en inglés merece la pena. Para los que usen firefox y no puedan ver quicktime (yo al menos no encuentro el plugin) yo les recomiendo bajarlo que tienen los enlaces al lado para ello y así poder disfrutarlo en alta calidad, pero si son demasiado perros pueden verlo en este enlace de youtube que está subtitulado al español.

Como curiosidad sale Mathew Fox al que mucha gente conocerá como Jack en Perdidos. El reparto está repleto de actores bastante conocidos como Susan Sarandon, Emile Hirsch, Christina Ricci, Susan Sarandon y John Goodman.

Según la ficha de Yahoo cine se estrenará el 9 de mayo de este año y yo desde luego ya lo he marcado en el calendario.

NUEVO POR AQUÍ...

Jelou ebriguan. Para mantener el espíritu de este blog, he tardado un poquito en autopresentarme porque tenía que hacer el vago; pero como hasta de hacer el vago se cansa uno, aquí estoy.

Mi nick completo es Mike HippiesDiggingFlowers (HippiesFumandoFlores, para los que no tienen mucha idea de inglés). Este nick tiene mucha historia a sus espaldas: se me ocurrió un día al escuchar una canción de los 70 que se titula "Hippies don't dig flowers" (los hippies no fuman flores) y yo me dije, ¿cómo que no?; de modo que adopté este Nick en detrimento de otras invenciones infantiles como Pereltoira Vendonabos y FurtherMuteTuteFundez.

...

Bueno, tal vez no tuviese tanta historia como pensaba, pero ¿qué esperabas?, es un simple sobrenombre internautico.

El caso es que llevaba tiempo (2 semanicas (me encanta usar paréntesis)) queriendo tener un segundo blog que estuviese dedicado a la informática; concretamente al software y la programación. Quería dar a conocer aplicaciones que cualquier friki ha necesitado alguna vez, como un renombrador masivo para reordenar sus colecciones de imágenes porno (vamos, frikis, que todos sabemos que nuestros discos duros están llenos de archivos dedicados al culto de Onan); así como exponer las soluciones a problemas que los programadores noveles nos solemos encontrar al entrar en el mundo laboral y que, con cierta dificultad, logramos hallar a base de cabezazos y googleos.

Básicamente, mis post van a ser un pestiño.

El caso es que el padre de este blog consideró que mis aspiraciones casaban con el espiritu del mismo (en realidad sus palabras casi textuales fueron "colabora en mi blog y ayúdame a conquistar el mundo"... puto friki), y me ha dejado la puerta abierta para que haga lo que me plazca (como un Windows sin antivirus conectado a internet juas (véis como es verdad que me gusta usar los paréntesis)). La idea de sabote.... estooo, colaborar en otro blog no me era nada desagradable, así que aquí estoy.

Pues nada más; ahora que ya sabéis en que van a consistir mis aportaciones, podéis continuar visitando vuestras páginas porno favoritas; aunque os recomendaría que picárais en el vídeo que os pongo a continuación, que es un temita musical bastante potable que viene a pelo con lo de colabor... estoooo sabotear.


Beastyboys - Sabotage


Read ya.

I'm back

Por fin acabé mis examenes que no me dejaban tiempo para casi nada así que por fin podré volver a escribir posts que nadie leerá XD.

Para empezar hablaré de una utilidad que he puesto en la barra derecha del blog, el ZedFreeSMS, que te permite enviar 5 sms gratis diarios registrando una cuenta de usuario, lo podeis hacer ademas desde el mismo programa. Para ello id "Iniciar/Terminar Sesión" y veréis una opción para registrar una cuenta si aun no lo habéis hecho. Los SMS serán de 100 caracteres ya q el resto los usan para añadir publicidad al final pero a SMS regalado no le mires el...ehmm...diente.

También tenemos a un nuevo colaborador Mike_HDF que ya se auto-presentará y se encargará de realizar post acerca de códigos e informática.

Y para rellenar el post en el que tampoco esperaba decir nada especial cuelgo unas tiras de Calvin y Hobbes que he estado traduciendo.


Image Hosted by ImageShack.us
By elchicocostra at 2008-02-13

Image Hosted by ImageShack.us
By elchicocostra at 2008-02-13

Image Hosted by ImageShack.us
By elchicocostra at 2008-02-13

Pues nada pronto publicaré algo decente.