En glorioso estéreo

Todos los días grabo Diálogos 3, como algunos ya sabréis. El archivo WMA resultante suele ocupar un poco más de 9 MB. Bueno, pues a partir de este lunes ha empezado a ocupar 19 MB. Me he alegrado mucho porque he supuesto lo que eso significaba. Para asegurarme he comparado las propiedades de un par de estos archivos, uno de antes y otro de después del cambio.

Antes:

antes

Después:

después


Es decir: RNE 3 ha aumentado la calidad de sus emisiones a través de Internet1. Qué gozada. Espero que la cosa dure.

  1. Ya he cambiado el script para que tenga en cuenta las novedades. []

Copias de seguridad de repositorios SVN

Si utilizas TortoiseSVN quizá te interese este pequeño programa para hacer copias de seguridad periódicas de tus repositorios SVN. Está escrito en VBScript. Guárdalo en un archivo con la extensión vbs y ejecútalo cada vez que quieras hacer la copia. El resultado será un archivo cuyo nombre seguirá el formato 2008-01-30_19-30-00_repositorio.backup (fecha, hora y nombre del repositorio, terminado en la extensión backup).

' Fecha, en el formato AAAA-MM-DD.
Function ObtenerFecha

    Dim sAno   'As String
    Dim sMes   'As String
    Dim sDia   'As String
    Dim sAhora 'As Date

    sAhora = Now
    sAno = DatePart("yyyy", sAhora)
    sMes = DatePart("m", sAhora)

    If (Len(sMes) = 1) Then
        sMes = "0" & sMes
    End If

    sDia = DatePart("d", sAhora)

    If (Len(sDia) = 1) Then
        sDia = "0" & sDia
    End If

    Dim sResultado 'As String

    sResultado = sAno & "-" & sMes & "-" & sDia

    ObtenerFecha = sResultado

End Function

' Hora, en el formato HH-MM-SS.
Function ObtenerHora

    Dim sHora    'As String
    Dim sMinuto  'As String
    Dim sSegundo 'As String
    Dim sAhora   'As Date

    sAhora = Now
    sHora = DatePart("h", sAhora)

    If (Len(sHora) = 1) Then
        sHora = "0" & sHora
    End If

    sMinuto = DatePart("n", sAhora)

    If (Len(sMinuto) = 1) Then
        sMinuto = "0" & sMinuto
    End If

    sSegundo = DatePart("s", sAhora)

    If (Len(sSegundo) = 1) Then
        sSegundo = "0" & sSegundo
    End If

    Dim sResultado 'As String

    sResultado = sHora & "-" & sMinuto & "-" & sSegundo

    ObtenerHora = sResultado

End Function

' Creación de la orden a ejecutar.

Dim sPrefijo 'As String

sPrefijo = ObtenerFecha & "_" & ObtenerHora

Dim sOrden 'As String

sOrden = """%programfiles%\svn\bin\svnadmin.exe"" dump c:\repos > c:\" & sPrefijo & "_repos.backup"

' Ejecución

Dim WshShell 'As WScript.Shell

Set WshShell = CreateObject("WScript.Shell")

WshShell.Run "%comspec% /c " & sOrden, 0, True

En este caso en particular, se supone que el repositorio está en C:\repos\. El resultado acabará en C:\. Cambia esas rutas por las que más te interesen.

Mi vídeo para Diálogos 3

Pensaba que estaba perdido por culpa de aquel o aquellos que están grabando los programas de Diálogos 3 y subiéndolos al archivo de Internet. Pues parece que no es así: en cuestión de un par de meses me voy a ventilar todos los programas que subieron (son unos 12 GB).

Creí que eran seres sobrehumanos, ángeles enviados para salvarme de mis tardes de hastío. Pero no, deben ser gente normal y corriente porque, de vez en cuando, se les escapó algún programa (de cualquier manera, seáis quienes seáis, ¡gracias y mil gracias!). Así que voy a poner algo de mi parte. El siguiente bloque de código se corresponde con un programita para bash que permite grabar en formato MP3 la emisión de Diálogos 3 a través de Internet:

HOY=`date +%Y-%m-%d`
ANO=`date +%Y`
PISTA=`date +%d`

/usr/bin/mplayer \
  -really-quiet -cache 1000 -dumpstream -dumpfile ${HOY}.wma \
  -playlist "http://www.rtve.es/rne/audio/RNE3.asx" &
PROCESO=$!
sleep 80m
kill $PROCESO

# Pasar el archivo WMA a formato WAV.
/usr/bin/mplayer -really-quiet \
  ${HOY}.wma -vc null -vo null -ao pcm:fast:waveheader:file=${HOY}.wav

# Pasar el archivo WAV a formato MP3.
/usr/bin/lame --quiet \
  --add-id3v2 \
  --tt "${HOY}" \
  --ty "${ANO}" \
  --ta "RNE3 - Ramón Trecet" \
  --tg "Other" \
  --tl "Diálogos 3" \
  --tn "${PISTA}" \
  ${HOY}.wav ${HOY}.mp3

# Borrar el archivo WAV, no borramos el WMA por si acaso ha fallado algo.
rm -f ${HOY}.wav

Ejecuta esta tarea a las 14:50 de lunes a viernes y tendrás el programa grabado todos los días. Obviamente, necesitas un Linux con mplayer, lame y cron con acceso a Internet que esté encendido mientras se emite el programa. La grabación se realiza durante 80 minutos, es decir, desde diez minutos antes del programa hasta diez minutos después.

Modificaré este programa para que tenga cada vez más funciones, como rutas, emisiones y duraciones configurables, entre otras cosas. Aquí encontrarás la versión más reciente del mismo.

Resalte de sintaxis

Mis primeros pasos en el mundo de la programación los di en Pascal, concretamente en Turbo Pascal. Amarillo sobre azul.

Si no me falla la memoria, la versión 7 de Turbo Pascal fue la primera en incorporar resalte de sintaxis. El murciano decía que aquello parecía una feria, con tantos colorines. Hoy en día, el resalte de sintaxis es una de esas herramientas imprescindibles, una ayuda más en las tareas de programación.
Syntax Highlighting
Pues aprovecho para anunciar que mi wiki ya resalta la sintaxis del código gracias a la extensión GeSHiCodeTag. De entre todas las extensiones del mismo tipo para Mediawiki he escogido ésta porque se apoya en GeSHi, que me gusta mucho.

PHP 5 y la zona horaria predeterminada

Es posible que, si trabajas con fechas en PHP 5, te hayas encontrado con este mensaje:

date() [function.date]: It is not safe to rely on the system’s timezone
settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Europe/Berlin’ for ‘CET/1.0/no DST’ instead

Para evitarlo sólo tienes que decirle a PHP en qué zona horaria te encuentras. Puedes utilizar la variable date.timezone. Por ejemplo, si se trata de la zona Europe/Madrid, incluye la siguiente línea en el archivo .htaccess (si es el caso) correspondiente a la aplicación que estés desarrollando:

php_value date.timezone Europe/Madrid

Encontrarás más información al respecto aquí.

Consultas almacenadas y Access

No es que sea mi sistema gestor de bases de datos favorito, pero de vez en cuando me veo obligado a trabajar con Microsoft Access. Quizá lo que menos me gusta sean las herramientas que proporciona para crear consultas SQL.

AccessEn concreto, el editor, porque las herramientas para crear consultas con el ratón, sin escribir una sola línea, son muy útiles para los principiantes.

Acostumbrado como estoy a trabajar con MySQL y SQL Server, también lo estoy a utilizar procedimientos almacenados. Una rápida búsqueda en Google me ha llevado a este artículo publicado en StarDeveloper. En él se describen las bases necesarias para crear algo parecido a procedimientos almacenados en Access.

Si has trabajado en algún proyecto que utilice Access desde un programa externo (por ejemplo, desde una aplicación Visual Basic), es posible que hayas tenido que crear consultas SQL concatenando cadenas de texto, algo así:

...
sConsulta = _
    "SELECT " & _
    "  [Año ocurrencia], " & _
    "  [Año cierrepago], " & _
    "  [Total Pagado] " & _
    "FROM VALORES " & _
    "  WHERE " & _
    "  ( " & _
    "    [Año ocurrencia] BETWEEN " & _
         CStr(.iAñoInicial) & " AND " & _
         CStr(.iAñoFinal) & _
    "  ) AND (" & _
    "    [Año cierrepago] BETWEEN " & _
         CStr(.iAñoInicial) & " AND " & _
         CStr(.iAñoFinal) & _
    "  )" & _
    "ORDER BY " & _
    "  [Año ocurrencia] ASC, " & _
    "  [Año cierrepago] ASC"
    ...

Una vez compilada la aplicación, si la consulta tiene que ser modificada es necesario cambiar el código del programa y volver a compilar. Sin embargo, si las consultas se almacenan en la base de datos puedes modificarlas sin tocar el programa.

Lo dicho: si quieres saber cómo modificar tus aplicaciones para que el código de las consultas esté en Access, lee este artículo.