martes, enero 28, 2014

Desensamblando binarios en línea

Analizando un firmware desconocido? No tenés a mano nasm/ndisasm? No te acordás los opcodes de memoria?

Online Disassembler es el sueño de todo hacker: un desensamblador en línea. ODA soporta una gran cantidad de arquitecturas y tiene las heurísticas necesarias para interpretar la estructura de muchos archivos binarios (PE, ELF, etc.). Permite subir uno o varios archivos, o bien escribir los bytes en el cuadro de texto para ver qué representan.

Probemos con esto. A qué código C correspondería la siguiente secuencia?
55 89 e5 d9 45 08 d8 45 0c d9 05 a0 84 04 08 de f9 5d c3
Tips: la arquitectura es 32 bits, y en el valor almacenado en ds:0x80484a0 es 2.0 (en IEEE754 binary32). Facilísimo.

Pero ODA no es el único desensamblador en línea. Pym's es un proyecto similar, hecho en python y también permite subir un archivo, desensamblarlo y navegar el código, aunque es más limitado en cuanto a las arquitecturas y tipos de archivo soportados. Aún así, es otra opción a considerar.

Bien, solo eso por ahora. Happy reversing!

viernes, enero 24, 2014

Benchmark day 2: WD Caviar Red 1TB (WDC WD10EFRX-68JCSN0)

Esta es la segunda de la serie de pruebas a discos rígidos, esta vez contra el disco del equipo personal. Siguen las especificaciones y más abajo los resultados por si a alguno le interesa. He remarcado los datos más relevantes.

Western Digital Caviar Red 1TB
Modelo: WDC WD10EFRX-68JCSN0
Capacidad: 1 TB
Interfaz: SATA III
Caché: 64 MB
Velocidad: variable según la serie
Tamaño de sector: 4K físico, 512 lógico
 
# hdparm -I /dev/sda
ATA device, with non-removable media
 Model Number:       WDC WD10EFRX-68JCSN0                    
 Serial Number:      [REDACTED]
 Firmware Revision:  01.01A01
 Transport:          Serial, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0
Standards:
 Supported: 8 7 6 5 
 Likely used: 8
Configuration:
 Logical  max current
 cylinders 16383 16383
 heads  16 16
 sectors/track 63 63
 --
 CHS current addressable sectors:   16514064
 LBA    user addressable sectors:  268435455
 LBA48  user addressable sectors: 1953525168
 Logical  Sector size:                   512 bytes
 Physical Sector size:                  4096 bytes
 Logical Sector-0 offset:                  0 bytes
 device size with M = 1024*1024:      953869 MBytes
 device size with M = 1000*1000:     1000204 MBytes (1000 GB)
 cache/buffer size  = unknown
Capabilities:
 LBA, IORDY(can be disabled)
 Queue depth: 32
 Standby timer values: spec'd by Standard, with device specific minimum
 R/W multiple sector transfer: Max = 16 Current = 16
 DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
      Cycle time: min=120ns recommended=120ns
 PIO: pio0 pio1 pio2 pio3 pio4 
      Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
 Enabled Supported:
    * SMART feature set
      Security Mode feature set
    * Power Management feature set
    * Write cache
    * Look-ahead
    * Host Protected Area feature set
    * WRITE_BUFFER command
    * READ_BUFFER command
    * NOP cmd
    * DOWNLOAD_MICROCODE
      Power-Up In Standby feature set
    * SET_FEATURES required to spinup after power up
      SET_MAX security extension
    * 48-bit Address feature set
    * Device Configuration Overlay feature set
    * Mandatory FLUSH_CACHE
    * FLUSH_CACHE_EXT
    * SMART error logging
    * SMART self-test
      Media Card Pass-Through
    * General Purpose Logging feature set
    * 64-bit World wide name
    * URG for READ_STREAM[_DMA]_EXT
    * URG for WRITE_STREAM[_DMA]_EXT
    * IDLE_IMMEDIATE with UNLOAD
    * WRITE_UNCORRECTABLE_EXT command
    * {READ,WRITE}_DMA_EXT_GPL commands
    * Segmented DOWNLOAD_MICROCODE
    * Gen1 signaling speed (1.5Gb/s)
    * Gen2 signaling speed (3.0Gb/s)
    * Gen3 signaling speed (6.0Gb/s)
    * Native Command Queueing (NCQ)
    * Host-initiated interface power management
    * Phy event counters
    * Idle-Unload when NCQ is active
    * NCQ priority information
    * unknown 76[15]
    * DMA Setup Auto-Activate optimization
      Device-initiated interface power management
    * Software settings preservation
    * SMART Command Transport (SCT) feature set
    * SCT LBA Segment Access (AC2)
    * SCT Error Recovery Control (AC3)
    * SCT Features Control (AC4)
    * SCT Data Tables (AC5)
      unknown 206[7]
      unknown 206[12] (vendor specific)
      unknown 206[13] (vendor specific)
Security: 
 Master password revision code = 65534
  supported
 not enabled
 not locked
  frozen
 not expired: security count
  supported: enhanced erase
 140min for SECURITY ERASE UNIT. 140min for ENHANCED SECURITY ERASE UNIT. 
Logical Unit WWN Device Identifier: 50014ee209106fb8
 NAA  : 5
 IEEE OUI : 0014ee
 Unique ID : 209106fb8
Checksum: correct
 
# smartctl -x /dev/sda
smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.13.0] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     WDC WD10EFRX-68JCSN0
Serial Number:    [REDACTED]
LU WWN Device Id: 5 0014ee 209106fb8
Firmware Version: 01.01A01
User Capacity:    1.000.204.886.016 bytes [1,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Tue Jan 21 20:01:34 2014 ART
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00) Offline data collection activity
                                        was never started.
                                        Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever 
                                        been run.
Total time to complete Offline data collection: (13320) seconds.
Offline data collection capabilities:
                                        (0x7b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine recommended polling time:        (   2) minutes.
Extended self-test routine recommended polling time:     ( 152) minutes.
Conveyance self-test routine recommended polling time:   (   5) minutes.
SCT capabilities:         (0x30bd) SCT Status supported.
                                        SCT Error Recovery Control supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAGS    VALUE WORST THRESH FAIL RAW_VALUE
  1 Raw_Read_Error_Rate     POSR-K   200   200   051    -    0
  3 Spin_Up_Time            POS--K   138   133   021    -    4058
  4 Start_Stop_Count        -O--CK   100   100   000    -    47
  5 Reallocated_Sector_Ct   PO--CK   200   200   140    -    0
  7 Seek_Error_Rate         -OSR-K   200   200   000    -    0
  9 Power_On_Hours          -O--CK   098   098   000    -    1920
 10 Spin_Retry_Count        -O--CK   100   253   000    -    0
 11 Calibration_Retry_Count -O--CK   100   253   000    -    0
 12 Power_Cycle_Count       -O--CK   100   100   000    -    47
192 Power-Off_Retract_Count -O--CK   200   200   000    -    21
193 Load_Cycle_Count        -O--CK   200   200   000    -    25
194 Temperature_Celsius     -O---K   112   105   000    -    31
196 Reallocated_Event_Count -O--CK   200   200   000    -    0
197 Current_Pending_Sector  -O--CK   200   200   000    -    0
198 Offline_Uncorrectable   ----CK   100   253   000    -    0
199 UDMA_CRC_Error_Count    -O--CK   200   200   000    -    0
200 Multi_Zone_Error_Rate   ---R--   100   253   000    -    0
                            ||||||_ K auto-keep
                            |||||__ C event count
                            ||||___ R error rate
                            |||____ S speed/performance
                            ||_____ O updated online
                            |______ P prefailure warning

SMART Extended Comprehensive Error Log Version: 1 (6 sectors)
No Errors Logged

SMART Extended Self-test Log Version: 1 (1 sectors)
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SCT Status Version:                  3
SCT Version (vendor specific):       258 (0x0102)
SCT Support Level:                   1
Device State:                        Active (0)
Current Temperature:                    31 Celsius
Power Cycle Min/Max Temperature:     27/37 Celsius
Lifetime    Min/Max Temperature:     19/38 Celsius
Under/Over Temperature Limit Count:   0/0
SCT Temperature History Version:     2
Temperature Sampling Period:         1 minute
Temperature Logging Interval:        1 minute
Min/Max recommended Temperature:      0/60 Celsius
Min/Max Temperature Limit:           -41/85 Celsius
Temperature History Size (Index):    478 (350)

SCT Error Recovery Control:
           Read:     70 (7,0 seconds)
          Write:     70 (7,0 seconds)

SATA Phy Event Counters (GP Log 0x11)
ID      Size     Value  Description
0x0001  2            0  Command failed due to ICRC error
0x0002  2            0  R_ERR response for data FIS
0x0003  2            0  R_ERR response for device-to-host data FIS
0x0004  2            0  R_ERR response for host-to-device data FIS
0x0005  2            0  R_ERR response for non-data FIS
0x0006  2            0  R_ERR response for device-to-host non-data FIS
0x0007  2            0  R_ERR response for host-to-device non-data FIS
0x0008  2            0  Device-to-host non-data FIS retries
0x0009  2        33157  Transition from drive PhyRdy to drive PhyNRdy
0x000a  2           45  Device-to-host register FISes sent due to a COMRESET
0x000b  2            0  CRC errors within host-to-device FIS
0x000f  2            0  R_ERR response for host-to-device data FIS, CRC
0x0012  2            0  R_ERR response for host-to-device non-data FIS, CRC
0x8000  4       523088  Vendor specific
He resaltado el contador de ciclos de carga (Load Cycle Count) puesto que es un dato a tener presente ya que otras series de discos de WD, vale decir, los Caviar Green, han tenido problemas al utilizar una política de ahorro de energía demasiado agresiva que reduce el tiempo de vida de la unidad. En este disco, por suerte, el conteo de ciclos parece bastante normal.
 
# hdparm -tT /dev/sda
/dev/sda:
 Timing cached reads:   26724 MB in  2.00 seconds = 13374.46 MB/sec
 Timing buffered disk reads: 422 MB in  3.01 seconds = 140.12 MB/sec
 
$ dd if=/dev/zero of=archivo.img count=1K bs=1M conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 9.80654 s, 109 MB/s
Las pruebas de lectura con hdparm y con dd. Cuanto más velocidad indiquen, mejor, por supuesto.
 
palimpsest - Prueba de rendimiento de solo lectura (clic para agrandar)
Este gráfico representa la velocidad de lectura y el tiempo de acceso en distintas partes del disco, desde los sectores más externos al plato (parte izquierda) hasta los más cercanos al eje (parte derecha). La línea azul representa la velocidad de lectura (asociada a la escala izquierda), mientras que los puntos verdes representan los tiempos de acceso en distintas ubicaciones del disco (asociada a la escala derecha).
Es notable la diferencia en la velocidad de lectura que existe al operar con los primeros sectores respecto de los últimos: 155 MB/s contra 70 MB/s. Como curiosidad, a su vez, se puede advertir que los sectores del centro del plato tienen un tiempo de acceso ligeramente más uniforme.
 
$ bonnie++
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
hc-maurom       16G  1229  95 114703  11 52129   4  6031  88 154671   7 102.4   2
Latency              8984us    2427ms     688ms   22552us     122ms     731ms
Version  1.96       ------Sequential Create------ --------Random Create--------
hc-maurom           -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 26100  22 +++++ +++ 25978  16 +++++ +++ +++++ +++ +++++ +++
Latency             26012us     340us     771us      42us       9us      26us
Los resultados de bonnie++ son bastante completos. Además de hacer mediciones de entrada/salida sobre el disco, mide también operaciones sobre el sistema de archivos (que por ahora no reviso). Lo relevante son las tasas de escritura y lectura en bloques, la cantidad de búsquedas por segundo (más es mejor) y la latencia de las mismas (menos es mejor).
 
Todas las pruebas fueron realizadas sobre una partición ext4.

Press START: sólo para nostálgicos

Esto ya es noticia vieja, pero no puedo dejar de republicarlo.

El usuario de YouTube NicksplosionFX se tomó el arduo trabajo de armar un video con la pantalla de inicio de casi todos los videojuegos desarrollados para el viejo sistema NES de Nintendo, que fue más conocido aquí con las consolas clones FamiCon / Family Game.

El video comprende más de 709 pantallas de inicio ordenados alfabéticamente por el título del juego, con su correspondiente música y animación, en un clip que dura casi tres horas. Buceando en algunos minutos pude cruzarme con varios de los grandes títulos que entretuvieron mi niñez, y estoy seguro de que muchos que están rondando los treinta reconocerán la música de apertura de sus títulos favoritos.

Va entonces, gráfica y sonido de 8-bits para todos aquellos nostálgicos como yo.

jueves, enero 23, 2014

Benchmark day 1: Seagate Barracuda 500GB (ST500DM002-1BD142)

En una charla con un viejo amigo sobre discos rígidos actuales puse de ejemplo algunos a los que he tenido acceso habitualmente. A partir de eso se me ocurrió tratar de determinar qué diferencia de rendimiento hay entre los discos de mi equipo hogareño y mi estación de trabajo, por lo que recurrí a las tradicionales herramientas de prueba en Linux.

La primera prueba va contra el disco de la estación de trabajo, siguen las especificaciones y más abajo los resultados por si a alguno le interesa. He remarcado los datos más relevantes.

Seagate Barracuda 500GB
Modelo: ST500DM002-1BD142
Capacidad: 500 GB
Interfaz: SATA III
Caché: 16 MB
Velocidad: 7200 RPM
Tamaño de sector: 4K físico, 512 lógico

# hdparm -I /dev/sda
ATA device, with non-removable media
 Model Number:       ST500DM002-1BD142                       
 Serial Number:      [REDACTED]
 Firmware Revision:  KC45    
 Transport:          Serial, SATA Rev 3.0
Standards:
 Used: unknown (minor revision code 0x0029) 
 Supported: 8 7 6 5 
 Likely used: 8
Configuration:
 Logical  max current
 cylinders 16383 16383
 heads  16 16
 sectors/track 63 63
 --
 CHS current addressable sectors:   16514064
 LBA    user addressable sectors:  268435455
 LBA48  user addressable sectors:  976773168
 Logical  Sector size:                   512 bytes
 Physical Sector size:                  4096 bytes
 Logical Sector-0 offset:                  0 bytes
 device size with M = 1024*1024:      476940 MBytes
 device size with M = 1000*1000:      500107 MBytes (500 GB)
 cache/buffer size  = 16384 KBytes
 Nominal Media Rotation Rate: 7200
Capabilities:
 LBA, IORDY(can be disabled)
 Queue depth: 32
 Standby timer values: spec'd by Standard, no device specific minimum
 R/W multiple sector transfer: Max = 16 Current = 16
 Recommended acoustic management value: 208, current value: 208
 DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
      Cycle time: min=120ns recommended=120ns
 PIO: pio0 pio1 pio2 pio3 pio4 
      Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
 Enabled Supported:
    * SMART feature set
      Security Mode feature set
    * Power Management feature set
    * Write cache
    * Look-ahead
    * Host Protected Area feature set
    * WRITE_BUFFER command
    * READ_BUFFER command
    * DOWNLOAD_MICROCODE
      SET_MAX security extension
    * Automatic Acoustic Management feature set
    * 48-bit Address feature set
    * Device Configuration Overlay feature set
    * Mandatory FLUSH_CACHE
    * FLUSH_CACHE_EXT
    * SMART error logging
    * SMART self-test
    * General Purpose Logging feature set
    * WRITE_{DMA|MULTIPLE}_FUA_EXT
    * 64-bit World wide name
      Write-Read-Verify feature set
    * WRITE_UNCORRECTABLE_EXT command
    * {READ,WRITE}_DMA_EXT_GPL commands
    * Segmented DOWNLOAD_MICROCODE
    * Gen1 signaling speed (1.5Gb/s)
    * Gen2 signaling speed (3.0Gb/s)
    * Gen3 signaling speed (6.0Gb/s)
    * Native Command Queueing (NCQ)
    * Phy event counters
    * unknown 76[15]
      Device-initiated interface power management
    * Software settings preservation
    * SMART Command Transport (SCT) feature set
    * SCT Long Sector Access (AC1)
    * SCT LBA Segment Access (AC2)
    * SCT Error Recovery Control (AC3)
    * SCT Features Control (AC4)
    * SCT Data Tables (AC5)
      unknown 206[12] (vendor specific)
      unknown 206[13] (vendor specific)
Security: 
 Master password revision code = 65534
  supported
 not enabled
 not locked
  frozen
 not expired: security count
  supported: enhanced erase
 78min for SECURITY ERASE UNIT. 78min for ENHANCED SECURITY ERASE UNIT. 
Logical Unit WWN Device Identifier: 5000c5005022a977
 NAA  : 5
 IEEE OUI : 000c50
 Unique ID : 05022a977
Checksum: correct

# smartctl -x /dev/sda
smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.13.0] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     ST500DM002-1BD142
Serial Number:    [REDACTED]
LU WWN Device Id: 5 000c50 05022a977
Firmware Version: KC45
User Capacity:    500,107,862,016 bytes [500 GB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  ATA-8-ACS revision 4
Local Time is:    Wed Jan 22 08:13:16 2014 ART
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x82)    Offline data collection activity
                                           was completed without error.
                                           Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0)    The previous self-test routine completed
                                           without error or no self-test has ever
                                           been run.
Total time to complete Offline data collection:         (  600) seconds.
Offline data collection capabilities:
                                    (0x7b) SMART execute Offline immediate.
                                           Auto Offline data collection on/off support.
                                           Suspend Offline collection upon new command.
                                           Offline surface scan supported.
                                           Self-test supported.
                                           Conveyance Self-test supported.
                                           Selective Self-test supported.
SMART capabilities:            (0x0003)    Saves SMART data before entering 
                                           power-saving mode.
                                           Supports SMART auto save timer.
Error logging capability:        (0x01)    Error logging supported.
                                           General Purpose Logging supported.
Short self-test routine recommended polling time:           (   1) minutes.
Extended self-test routine recommended polling time:        (  79) minutes.
Conveyance self-test routine recommended polling time:      (   2) minutes.
SCT capabilities:            (0x303f)    SCT Status supported.
                                         SCT Error Recovery Control supported.
                                         SCT Feature Control supported.
                                         SCT Data Table supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAGS    VALUE WORST THRESH FAIL RAW_VALUE
  1 Raw_Read_Error_Rate     POSR--   110   099   006    -    33944
  3 Spin_Up_Time            PO----   100   100   000    -    0
  4 Start_Stop_Count        -O--CK   100   100   020    -    28
  5 Reallocated_Sector_Ct   PO--CK   100   100   036    -    0
  7 Seek_Error_Rate         POSR--   073   060   030    -    22473249
  9 Power_On_Hours          -O--CK   094   094   000    -    5328
 10 Spin_Retry_Count        PO--C-   100   100   097    -    0
 12 Power_Cycle_Count       -O--CK   100   100   020    -    28
183 Runtime_Bad_Block       -O--CK   100   100   000    -    0
184 End-to-End_Error        -O--CK   100   100   099    -    0
187 Reported_Uncorrect      -O--CK   100   100   000    -    0
188 Command_Timeout         -O--CK   100   100   000    -    0
189 High_Fly_Writes         -O-RCK   100   100   000    -    0
190 Airflow_Temperature_Cel -O---K   061   054   045    -    39 (Min/Max 26/41)
194 Temperature_Celsius     -O---K   039   046   000    -    39 (0 16 0 0)
195 Hardware_ECC_Recovered  -O-RC-   044   026   000    -    33944
197 Current_Pending_Sector  -O--C-   100   100   000    -    0
198 Offline_Uncorrectable   ----C-   100   100   000    -    0
199 UDMA_CRC_Error_Count    -OSRCK   200   200   000    -    0
240 Head_Flying_Hours       ------   100   253   000    -    147261543683280
241 Total_LBAs_Written      ------   100   253   000    -    1601632265
242 Total_LBAs_Read         ------   100   253   000    -    3080541557
                            ||||||_ K auto-keep
                            |||||__ C event count
                            ||||___ R error rate
                            |||____ S speed/performance
                            ||_____ O updated online
                            |______ P prefailure warning

SMART Extended Comprehensive Error Log Version: 1 (5 sectors)
No Errors Logged

SMART Extended Self-test Log Version: 1 (1 sectors)
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SCT Status Version:                  3
SCT Version (vendor specific):       522 (0x020a)
SCT Support Level:                   1
Device State:                        Active (0)
Current Temperature:                    39 Celsius
Power Cycle Min/Max Temperature:     26/41 Celsius
Lifetime    Min/Max Temperature:     16/46 Celsius
Under/Over Temperature Limit Count:   0/0
SCT Temperature History Version:     2
Temperature Sampling Period:         1 minute
Temperature Logging Interval:        59 minutes
Min/Max recommended Temperature:     14/55 Celsius
Min/Max Temperature Limit:           10/60 Celsius
Temperature History Size (Index):    128 (77)

SCT Error Recovery Control:
           Read: Disabled
          Write: Disabled

SATA Phy Event Counters (GP Log 0x11)
ID      Size     Value  Description
0x000a  2           19  Device-to-host register FISes sent due to a COMRESET
0x0001  2            0  Command failed due to ICRC error
0x0003  2            0  R_ERR response for device-to-host data FIS
0x0004  2            0  R_ERR response for host-to-device data FIS
0x0006  2            0  R_ERR response for device-to-host non-data FIS
0x0007  2            0  R_ERR response for host-to-device non-data FIS

# hdparm -tT /dev/sda
/dev/sda:
 Timing cached reads:   24824 MB in  2.00 seconds = 12423.12 MB/sec
 Timing buffered disk reads: 402 MB in  3.01 seconds = 133.65 MB/sec

$ dd if=/dev/zero of=archivo.img count=1K bs=1M conv=fdatasync
1024+0 registros leídos
1024+0 registros escritos
1073741824 bytes (1,1 GB) copiados, 9,96082 s, 108 MB/s

palimpsest - Prueba de rendimiento de solo lectura (clic para agrandar)

$ bonnie++
Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
soda         15808M  1105  96 112638   7 45472   4  4853  74 151543   6 271.5   4
Latency             10287us     436ms    1531ms   85189us     151ms    1255ms
Version  1.96       ------Sequential Create------ --------Random Create--------
soda                -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 26311  22 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++
Latency             57369us     312us     316us     292us      14us      77us

Todas las pruebas fueron realizadas sobre una partición ext4. Mañana van los resultados del otro disco.

viernes, diciembre 20, 2013

Adiós, Winamp

Desde la 0.92 a la 3 fuiste el mejor reproductor de música para la windola. Brindemos por las innumerables horas que pasé escuchándote :'-(
(y por los vuelos mentales con plugins de visualizaciones)

jueves, diciembre 19, 2013

Kernels nuevos en Debian Stable

Vengo siguiendo bastante de cerca la publicación de versiones estables del kernel de Linux. A fines de diagnóstico suelo compilar la última versión disponible e instalarla en varias de las máquinas sobre las que tengo acceso. Como quizás le sirva a más de uno, acá dejo disponible la última versión que compilé en casa.
Todas estas son directamente instalables sobre Debian GNU/Linux Wheezy 7.0 de 64 bits sin quilombo de dependencias. Cada directorio contiene los paquetes con la imagen del kernel, los encabezados, el firmware y la configuración utilizada en la compilación.
Si les interesa saber qué hay de nuevo, les dejo el clásico resumen hecho por la gente de KernelNewbies: Linux 4.0.

Actualización 2015: en función a la reciente publicación de la nueva versión estable Debian GNU/Linux 8.0 Jessie, y tras haber migrado los equipos que utilizo habitualmente, mantendré a los paquetes aquí publicados brevemente como históricos y luego -eventualmente- desaparecerán del repositorio. Para los que estén interesados en mantenerse al día con las últimas versiones, encontrarán nuevos paquetes del núcleo en el post dedicado a Kernels nuevos en Debian Jessie.

jueves, noviembre 14, 2013

gzip y poesía

Cómo gunzip decodificaría una versión comprimida de "El cuervo" de Poe. Cada secuencia de caracteres entre llaves es una referencia a una secuencia previa del texto. Créditos a Julia Evans!

lunes, noviembre 11, 2013

Lavando el teclado

La máquina de escritorio tiene un teclado que ya pasa los doce años. En el medio ya cambié de máquina tres veces, sin embargo el teclado se mantiene constante. Hay algunas razones:
  • la distribución de teclas en inglés me resulta cómoda para programar (vale decir, para escribir los símbolos más utilizados no necesito pulsar teclas modificadoras);
  • las teclas están bien espaciadas y el recorrido es cómodo al tacto;
  • el conector es PS2, con lo cual todavía puede usarse con algunos equipos; y desde ya,
  • todas las teclas funcionan como recién comprado, por lo cual no tiene sentido cambiarlo aún.
Indudablemente, pasados algunos años, todo teclado que se utiliza diaramente se torna un museo de suciedad, y esta no es  la excepción, así que cada tanto me tomo el tiempo de pegarle una enjuagada. Además, está el argumento de que un teclado sucio es más peligroso que un asiento de inodoro -lo que no me parece nada extraño- así que una limpieza no viene mal.
Si bien se puede limpiar por afuera, gran parte de la suciedad acumulada queda generalmente bajo las teclas, por lo que la mejor manera de dejarlo brillante es desmontándolo entero. Afortunadamente este modelo está armado mediante encastres, por lo que se pueden desmontar tanto las teclas como el cuerpo sin necesidad de sacar un sólo tornillo.
Así que, ya decidido no a limpiar el teclado sino a lavarlo completamente, el primer paso fue sacar algunas fotos antes del despiece para recordar dónde debo ubicar cada tecla al ensamblarlo nuevamente.


Como puede observarse, el estado ya era deplorable. Debería haberlo limpiado antes, pero sin un reemplazo como para usar en el equipo mientras se seca, no me quise arriesgar.
Las teclas en este modelo se sacan simplemente tirando hacia arriba con fuerza. Podría haber usado un destornillador para hacer palanca, pero no hizo falta. Ya sin las teclas, hay tres grampas plásticas que mantienen juntas las tapas del cuerpo y que también hay que quitar.


Este es el lado interno de la tapa superior, van fotos de vuelta para recordar donde va cada tira y cada cuadradito de goma. Desconozco qué diferencia hay entre los verdes y los amarillos, para mí son lo mismo. De la tapa inferior saqué el circuito y el film que contiene las pistas de las teclas, que dejé enrollado y reservado para cuando todo esté seco nuevamente.



Enjuague y revisión de cada tecla y montante para remover restos que pudieran haber quedado. Algunas pasaron por el cepillo para quedar relucientes.


Para secarlas, la mejor opción es una centrifugadora de verdura, un secador de pelo de baja temperatura, o bien varias horas sobre papel tissue. Las tapas, dejándolas afurea a la sombra, quedan listas en unas horas.


Ya seco, está listo para ensamblar. Luego de poner cada tecla, sólo queda repasar el cable con un paño y desengrasante.


El producto terminado.


Antes y después. El amarillo en algunos lugares no es por suciedad sino por ciertos químicos que hacen que el plástico se torne así con el tiempo. El blanco original se puede recuperar con agua oxigenada y un poco más de trabajo, pero por ahora ya estoy hecho; eso quedará para otra vez.


martes, octubre 08, 2013

Nueva versión rc de tv_grab_ar.py

A comienzos de 2010 tiré las primeras lineas de código para un sencillo script que descarga la grilla de programación de un conocido proveedor de televisión por cable. Este script retorna la información en formato XMLTV lista para ser consumida por aplicaciones tales como TvTime y MythTV.

Hoy me toca publicar una versión extremadamente release candidate de este grabber tv_grab_ar.py, originada por una serie de cambios en el sitio web fuente de la información. La actualización ha implicado una reescritura de más de la mitad del código original, por lo cual lo considero una versión aún en pruebas.

Las novedades incluyen:
  • La reescritura completa por los cambios en el sitio web del proveedor.
  • Un nuevo método de descarga de grillas y fichas, algo mas eficiente que el anterior.
  • Arreglos para que el archivo de salida valide contra la definición xmltv.dtd.
  • Conversión del parsing de argumentos desde optparse a argparse.
  • Implementación de los argumentos days y offset.
Es REQUISITO volver a configurar el grabber ejecutando ./tv_grab_ar.py --configure

Esta versión no utiliza el almacenamiento temporal de las fichas de programas (fichas.db) y entre las cuestiones aún no resueltas está la definición de la localización y el tipo de señal de la que se dispone (analógica, digital o hd), que es sobre lo que necesito comentarios de ustedes.

Como siempre, please test & give feedback.

Link de descarga en el post original.

martes, agosto 27, 2013

Un vistazo a código de la demoscene '93

Desde mis primeros años cerca de las computadoras siempre me fascinaron las demos.

No, no me refiero a las versiones recortadas de programas o juegos que se dan con fines comerciales, nada de eso. En nuestro contexto también se denominan demos a ciertas presentaciones multimedia creadas por programadores y artistas como una forma de arte alternativo y como muestra de sus capacidades.

Cualquiera que vea una demo en funcionamiento podría confundirla simplemente con un videoclip medio bizarro que se reproduce en la PC. A simple vista parecería ser sólo eso. Sin embargo, el archivo que almacena ese “video”, por así decirlo, suele pesar apenas 64 kilobytes, o incluso menos, 4 kilobytes; y una de las características que más asombran es precisamente esa: ¿cómo logran “almacenar” este tipo de animaciones en un archivo tan pequeño? 

El truco, en realidad, radica en que el video en sí (y la música, normalmente) no está contenido en el archivo binario, sino que el binario es un archivo que al ejecutarse genera completamente la animación, como una especie de “mueble autoensamblable”.

Además de este detalle, los programadores de demos buscan aprovechar al máximo las características del hardware para el cual están trabajando, logrando animaciones que en muchos casos son impensables de ver en esos limitados equipos.

Buena parte de estas demos son creadas por grupos multidisciplinarios denominados demogroups, cuyos miembros son muy buscados por los departamentos de recursos humanos de la industria de videojuegos, sea como programadores, artistas gráficos o músicos, e incluso figuran entre los participantes de la reconocida conferencia académica de gráficos por computadora SIGGRAPH.

El coder aancsiid resume en pocos párrafos “Qué es una demo”, y los artículos Demo (Computer_programming) y Demoscene en Wikipedia son buenos puntos de partida para acercarse a la historia y las particularidades de las demos, pero lo que no pueden dejar de conocer son los clásicos sitios Pouet.net y Scene.org, dedicados exclusivamente a las obras de esta subcultura.

De las que me han dejado con la mente en blanco recuerdo a heaven seven de exceed, fr-041:debris de farbrausch,  elevated de rgba&tbc, chaos theory de conspiracy/cns, y las mas nuevas como agenda de fairlight, spin de asd.

Para que se den una idea, el ejecutable de heaven seven pesa 64 kilobytes, y logra todo esto ...



con sólo 64 kilobytes !!!... debris pesa 177 kilobytes, y la demo elevated pesa 4 kilobytes... Piensen que al día de hoy el código HTML de una página web pesa en promedio unos 52 kb, y una fotografía digital pesa por lo menos 3.000 kb. Esta gente logra toda una experiencia multimedia en apenas una fracción de eso... Pero no se queden con lo que les digo: si tienen una máquina a mano, bájense los binarios y ejecútenlos, para ver la realidad.

Cyberhades tiene también una buena lista de posts dedicados al tema, y precisamente es por ellos que me entero de que el grupo Future Crew ha dejado disponible el código fuente de la demo “Second Reality”, con motivo del 20 aniversario de su creación.

Y aquí repito: el CÓDIGO FUENTE DE LA DEMO. Piensen que, dadas las exepcionales secuencias gráficas que los demogroups eran capaces de generar en aquella época, los hacks que éstos utilizaban para lograrlas eran secretos muy bien protegidos que muchas veces definían los primeros puestos en las competencias internacionales (demoparties). Por ello, poder acceder al código completo de una, ver su estructura interna y descifrar su funcionamiento es un regalo que hay que agradecer.



Además de felicitar a Future Crew por su amplia trayectoria, merece mis respetos Fabien Sanglard al acercarnos esta maravilla a los mortales mediante un ilustrado análisis de los fuentes de Second Reality que, por caso, contienen código en Assembler, C y Pascal. Recordemos que Sanglard nos viene deleitando ya con la aproximación al código fuente detrás de Prince of Persia, Doom y Quake.

Me encantaría seguir charlando de demos, pero mejor que eso es sentarse a ver algunas por demoscene.tv, capped.tv, o mejor, ejecutándolas en vivo en la PC.

sábado, julio 06, 2013

Instalación de ipfw/dummynet en Debian Wheezy

¿dummynet? ¿qué es dummynet?

Según su sitio web: “dummynet es una herramienta de simulación de redes en vivo diseñada originalmente para probar protocolos de red, y que desde entonces se utiliza para una variedad de aplicaciones entre las que se incluye el manejo de ancho de banda. Simula/impone limitaciones de encolado y ancho de banda, retrasos, pérdida de paquetes y otros efectos. Implementa también varios algoritmos de planificación. dummynet puede utilizarse en el mismo equipo donde se ejecuta la aplicación a probar o en cajas externas que actúan como enrutadores o puentes.
La selección de tráfico se realiza mediante el firewall ipfw, que es la interfaz de usuario principal para dummynet. ipfw permite seleccionar con precisión el tráfico y la dirección a trabajar, simplificando su configuración y uso.”
Para más información los dirijo al completo artículo Dummynet Revisited de los autores Marta Carbone y Luigi Rizzo.

Procedimiento

Con la colaboración de varios compañeros de trabajo surgió la siguiente receta para construirlo en Debian Wheezy (en este caso para amd64, pero es similar en i386). No es la única ni la mejor manera, pero es una que funciona. Si alguno encuentra una mejor, será bienvenida.
  1. Bajar la versión de ipfw compatible con kernels 3.x (20130607 o superior) y descomprimirla
    wget http://info.iet.unipi.it/~luigi/doc/20130607-ipfw3.tgz
    tar xvzf 20130607-ipfw3.tgz
  2. Instalar los paquetes necesarios para Debian
    apt-get install build-essential linux-headers-`uname -r` \ 
    linux-source-3.2
  3. Desempaquetar el código fuente completo del kernel linux. Esto requiere al menos 700 MB de espacio en disco libres, así que estén preparados.
    cd /usr/src
    tar xvjf linux-source-3.2.tar.bz2
  4. Copiar la configuración del kernel que se está ejecutando y las versiones de los módulos instalados
    cd /usr/src/linux-source-3.2
    cp -v /boot/config-`uname -r` .config
    cp -v /usr/src/linux-headers-`uname -r`/Module.symvers .
  5. Preparar el entorno de compilación del kernel
    cd /usr/src/linux-source-3.2
    make prepare
    make scripts
  6. Compilar ipfw indicando la ruta a los fuentes del kernel
    cd /ruta/a/ipfw3-2012
    make KSRC=/usr/src/linux-source-3.2
  7. Si no tiró errores, probar la carga y descarga del modulo ipfw_mod
    insmod kipfw-mod/ipfw_mod.ko
    dmesg
    rmmod ipfw_mod
  8. (Opcional) Instalar los binarios de ipfw y el modulo del kernel
    mkdir /lib/modules/`uname -r`/updates
    cp -v kipfw-mod/ipfw_mod.ko /lib/modules/`uname -r`/updates
    depmod
    cp -v ipfw/ipfw /usr/local/sbin
    chmod +x /usr/local/sbin/ipfw
  9. (Opcional) Verificar la instalación del modulo y agregarlo para cada inicio del equipo
    modprobe ipfw_mod
    dmesg
    echo ipfw_mod >> /etc/modules
  10. Listo!
Dejo un breve script para los haraganes que, como yo, prefieren ejecutar todo el procedimiento de un saque: build-ipfw.sh

Suerte y saludos!

jueves, julio 04, 2013

Renovando el escritorio

El tiempo ha pasado sigilosamente, las máquinas virtuales tardan cada vez más en procesar, las aplicaciones requieren de más memoria y almacenamiento... En síntesis, la obsolescencia se fue adueñando de la vieja Pentium D y de su propio usuario hasta que llega el momento de una renovación.

Así se ve el escritorio nuevo:


Software:
Debian GNU/Linux 7.1 (Wheezy, amd64)
Kernel 3.2.0-4-amd64 (3.2.46 en realidad)
Gnome 3.4.2 Classic (con iconos Gnome-Colors)

Hardware:
Intel Core i5-3470 @ 3.20 Ghz (quad)
Intel DZ68DB Motherboard
Intel Ivybridge Desktop HD2500 GPU
Memox 8 GB DDR3 RAM
Seagate Barracuda ST500DM002 (500 GB, 6Gb/s, 16Mb, 7200RPM)

viernes, marzo 15, 2013

SUBE no quiere Ubuntu(s)

No hace mucho comentaba en este mismo blog sobre mis dificultades para hallar el listado de viajes realizados en el sistema web de la tarjeta SUBE. Hoy volvemos a tocar este tema a partir de lo descubierto por un gran amigo.

Para (volverlos a) poner en contexto la tarjeta SUBE, o más bien el Sistema Único de Boleto Electrónico, es: "Un servicio para abonar con una sola tarjeta viajes en colectivos, subtes y trenes adheridos, en la Región Metropolitana de Buenos Aires."

Un excelente profesional, con el que tengo el gusto de compartir el trabajo diario, me remitió el siguiente correo:
Una curiosidad. Estando en casa, quise entrar en la página de la tarjeta SUBE para ver los viajes realizados (https://gestiones.sube.gob.ar/bienvenida.aspx), y me encontré con este mensaje de error:
No le presté demasiada atención en ese momento (será problema del sitio, me dije a mí mismo). Al día siguiente intenté nuevamente, con idéntico resultado. Pero oh sorpresa, con otro navegador (Chromium en vez de Firefox) sí pude ingresar.

Probé cambiarle el useragent al Firefox ¡y también pude ingresar! Y luego de un rato llegué a la conclusión de que lo que no le gusta al sitio es la palabra Ubuntu en el useragent del Firefox: quitándola, o reemplazándola por cualquier cosa como Windows, Suse, Debian o incluso la palabra 'basura', entra sin dramas.

Y corroboré ese hallazgo cambiando el useragent de chromium, agregándole la palabra Ubuntu. Ejecutando desde la línea de comandos $ chrome --user-agent="Mozilla/5.0 (X11; Ubuntu; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.619.0 Safari/534.16" tampoco me dejó ingresar.
No contento con lo encontrado, se tomó unos minutos para seguir investigando:
Descubrí algo más. No es la palabra Ubuntu de por sí la que dispara el filtro, ya que lanzando el navegador con --user-agent="Ubuntu" también deja ingresar a la página para realizar gestiones.

La cuestión parece ser "X11; Ubuntu"

Si uno suprime el X11, o si los cambia de lugar (por ej. "Ubuntu; X11"), también entra.
Ahora bien, ¿me puede explicar alguien qué tiene de malo Ubuntu como para que restrinjan ese sistema operativo en la plataforma del sistema SUBE? Como hemos visto, el error sólo ocurre con Ubuntu, con Debian funciona correctamente.

miércoles, marzo 06, 2013

Identificar sockets en uso en 3.. 2.. 1..

Normalmente uso
# netstat -tnap
pero debo decir que
# lsof -i -P +c 0 +M
resulta sumamente útil también.
Visto en alias.sh

martes, marzo 05, 2013

Drop Table Captcha

Justo a mí me viene a tocar...

Como mínimo, espero hayan implementado correctamente la validación de entradas.

miércoles, febrero 27, 2013

Gruhak Covers The Greatest Classic Rock Songs

Hace ya bastante tiempo, no recuerdo cuando ni qué estaba buscando, creo que era alguna versión de The Seeker de los Who en vivo, por la máquina de Youtube caigo en la playlist de una bandita croata que para juntar un poco de fama se largó con unos covers de temas clásicos de rock. Hasta ahí es la historia clásica, en Youtube hay cientos de miles de covers.

El tema es que a mi juicio suenan bien, demasiado bien. Y como cuando alguna banda suena bien hay que compartirla, les dejo aquí algunos de los covers interesantes:

Gruhak Covers The Greatest Classic Rock Songs (Playlist)

Gruhak - Comfortably Numb (Pink Floyd)



Gruhak - Rock and Roll (Led Zeppelin)



Gruhak - The Seeker (The Who)


Gruhak - Bullfrog blues (Rory Gallagher)



Gruhak - Rock and Roll damnation (AC/DC)


Gruhak - Love me two times (The Doors)


Pero de toda la lista, la versión que hacen de No Quarter es a mi criterio una joya oculta. Lamentablemente los muchachos de Google primero le silenciaron el audio y luego bajaron el tema entero (justo a ese!), pero tuve el tino de bajarme el tema de Youtube antes de que lo limpiaran, así que se los dejo en línea para que lo disfruten.

Gruhak - No Quarter (Led Zeppelin)


Los muchachos de Gruhak (así se llama la banda) también tienen, por supuesto, temas propios que largaron en el primer album el año pasado, así que si tienen tiempo dénse una vuelta por su web para escucharlos.

lunes, diciembre 17, 2012

Antipatrones de SQL

Así lo describen en el sitio web...
Bill Karwin ha ayudado a miles de personas a escribir mejor SQL y construir bases de datos relacionales más fuertes. Ahora él comparte su colección de antipatrones - los errores más comunes que ha identificado en esas miles de peticiones de ayuda.
El libro al que me refiero es "SQL Antipatterns: Avoiding the Pitfalls of Database Programming" y a mi juicio debería ser de lectura obligada para que todo desarrollador que toca bases de datos conozca lo que NO debe hacer. Al menos en mi experiencia, he visto estos antipatrones implementados demasiadas veces.

Estas slides algo viejas, de la MySQL Conference & Expo 2009, les darán una idea de lo que trata el texto:


martes, diciembre 04, 2012

Trivia de enlaces en Linux: ls -l

En una charla de mate con un amigo dimos con las siguientes cuestiones, que pudimos dilucidar luego de pensar un buen rato (y sin salir a buscar en google o la wikipedia). Dado el siguiente árbol y posterior listado de directorio:

.
├── bin
├── examples
├── pydasm
│   └── build
│       ├── lib.linux-x86_64-2.6
│       └── temp.linux-x86_64-2.6
└── rbdasm

mauro@stereo:/usr/local/src/libdasm-1.5$ ls -la
total 900
drwxr-xr-x 6 mauro mauro   4096 dic 15  2011 .
drwxrwsr-x 5 root  staff   4096 nov 29 12:04 ..
drwxr-xr-x 2 mauro mauro   4096 ene  9  2006 bin
drwxr-xr-x 2 mauro mauro   4096 dic 15  2011 examples
-rw-r--r-- 1 mauro mauro   5558 dic 27  2007 HISTORY.txt
-rw-r--r-- 1 mauro mauro 163894 dic 15  2011 libdasm.a
-rw-r--r-- 1 mauro mauro  31201 feb 14  2006 libdasm.c
-rw-r--r-- 1 mauro mauro    344 ene  9  2006 libdasm.def
-rw-r--r-- 1 mauro mauro  17199 feb 21  2006 libdasm.h
-rw-r--r-- 1 mauro mauro 162312 dic 15  2011 libdasm.o
-rwxr-xr-x 1 mauro mauro 161338 dic 15  2011 libdasm.so
-rw-r--r-- 1 mauro mauro    785 feb 21  2006 LIB.txt
-rw-r--r-- 1 mauro mauro    605 ene  9  2006 Makefile
-rw-r--r-- 1 mauro mauro    183 ene  9  2006 Makefile.msvc
-rw-r--r-- 1 mauro mauro 283110 feb 21  2006 opcode_tables.h
drwxr-xr-x 3 mauro mauro   4096 dic 15  2011 pydasm
drwxr-xr-x 2 mauro mauro   4096 ene 11  2006 rbdasm
-rw-r--r-- 1 mauro mauro  14460 feb 21  2006 README.txt
-rw-r--r-- 1 mauro mauro    161 ene  9  2006 TODO.txt

Con el único fin de molestarles, acá van unas preguntas:
  1. ¿Qué representan los números de la segunda columna del listado?
  2. ¿Podría un archivo tener un número mayor a 1?
  3. ¿Por qué las entradas . (punto), .. (punto-punto) y pydasm (entre otras) tienen distintos números?
  4. ¿Mediante qué llamada a sistema (función, no comando) puede obtenerse ese valor?
  5. ¿Cuál es el campo relevante en la estructura obtenida por la llamada del punto anterior?
Se los dejo como tarea y en quince días vemos que sale...

jueves, octubre 18, 2012

Esto pasó el fin de semana

Y gracias al usuario LeanHG en youtube lo podemos volver a vivir...

G3 - You really got me (The Kinks) [Luna Park 2012]

G3 - White Room (Cream) [Luna Park 2012]

G3 - Rockin' in the Free World (Neil Young) [Luna Park 2012]

Joe Satriani - Flying in a blue dream [Luna Park 2012]

Efectivamente, Steve Morse (act. Deep Purple), John Petrucci (act. Dream Theater) y Joe Satriani (act. Chickenfoot) dieron gala en una nueva edición del G3 en Argentina, acompañados por Dave LaRue, Mike Keneally, Jeff Campitelli y Mike Mangini, entre otros.

Dejo varias reviews del show así se dan una idea: El Acople, Clarín, Rock & Pop, y la de Fabio, obviamente.

viernes, septiembre 07, 2012

Creo haber viajado alguna vez

Algún alma caritativa me puede decir en qué parte del sitio web de la tarjeta SUBE está el bendito enlace a la pantalla de consulta de viajes?
Desde ya, muchas gracias!

Actualización: 10/09/2012: Por fin apareció el botón en la pantalla de gestión! Gracias SUBEros!