tag:blogger.com,1999:blog-140745702024-03-08T03:18:05.119+01:00TranquilidadHay otros mundos, pero están en éste. Hay otras vidas, pero están en ti.Unknownnoreply@blogger.comBlogger177125tag:blogger.com,1999:blog-14074570.post-16298795344594625592019-08-29T22:36:00.001+02:002019-08-29T22:36:01.432+02:00Tiësto feat. Tegan And Sara - Feel It In My Bones<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/ygQtml-Xsog" width="480"></iframe>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-78243962163239004002019-07-27T22:58:00.001+02:002019-07-27T23:03:02.559+02:00Como reinstalar una nueva imagen de Raspberry Pi desde dentro y por sshSin sacar siquiera la tarjeta de la RasperryPi :D (entre otras cosas por que ya no dispongo de lector de tarjetas). El sistema se que tenía era bastante viejo y tenía una debian Wheezy (7) para la que ya no se hacen paquetes. Total, imposible de hacer un update/upgrade. Aquí los pasos para reinstalar el sistema de nuevo con la última versión, todo por ssh, sin despeinarse ;)<br />
<br />
Descargamos la ultima raspbian desde <a href="https://www.raspberrypi.org/downloads/raspbian/">https://www.raspberrypi.org/downloads/raspbian/</a> en mi caso he cogido la lite.<br />
<br />
Vamos a editar la imagen y transmitirla ya modificada para que el sistema arranque directamente con SSH e IP fija:<br />
<br />
<blockquote class="tr_bq">
$ mkdir rpi<br />
$ cd rpi<br />
$ 7z x ../2019-07-10-raspbian-buster-lite.zip<br />
$ fdisk -l 2019-07-10-raspbian-buster-lite.img<br />
Disk 2019-07-10-raspbian-buster-lite.img: 2 GiB, 2197815296 bytes, 4292608 sectors<br />
Units: sectors of 1 * 512 = 512 bytes<br />
Sector size (logical/physical): 512 bytes / 512 bytes<br />
I/O size (minimum/optimal): 512 bytes / 512 bytes<br />
Disklabel type: dos<br />
Disk identifier: 0x17869b7d<br />
Device Boot Start End Sectors Size Id Type<br />
2019-07-10-raspbian-buster-lite.img1 8192 532480 524289 256M c W95 FAT32 (LBA)<br />
2019-07-10-raspbian-buster-lite.img2 540672 4292607 3751936 1,8G 83 Linux</blockquote>
<div>
<br /></div>
<div>
Montamos sobre loop devices las dos particiones (el valor del offset sale de multiplicar el comienzo de la partición por el tamaño de sector: 8192 * 512 = 4194304):</div>
<blockquote class="tr_bq">
$ sudo losetup /dev/loop1 -o 4194304 2019-07-10-raspbian-buster-lite.img<br />
$ sudo losetup /dev/loop2 -o 276824064 2019-07-10-raspbian-buster-lite.img<br />
$ mkdir p1 p2</blockquote>
<br />
<blockquote class="tr_bq">
$ sudo mount /dev/loop1 p1<br />
$ sudo mount /dev/loop2 p2</blockquote>
<div>
<div>
<br /></div>
</div>
<div>
Ahora tenemos las particiones montadas en sendos directorios.</div>
<div>
<br /></div>
<div>
Para activar el ssh necesitamos crear en la primera partición un archivo llamado "ssh":</div>
<blockquote class="tr_bq">
$ echo ssh > p1/ssh</blockquote>
<div>
<br /></div>
<div>
Para fijar nuestra ip debemos editar el archivo "p2/etc/dhcpcd.conf", al final del archivo habilitamos el interfaz (por ej, el eth0)</div>
<div>
<br /></div>
<div>
<blockquote class="tr_bq">
# Example static IP configuration:<br />
interface eth0<br />
static ip_address=192.168.1.2/24<br />
#static ip6_address=fd51:42f8:caae:d92e::ff/64<br />
static routers=192.168.1.1<br />
static domain_name_servers=8.8.8.8</blockquote>
</div>
<div>
<br /></div>
<div>
Desmontamos las particiones y los loops:</div>
<div>
<blockquote class="tr_bq">
$ sudo umount /dev/loop1<br />
$ sudo umount /dev/loop2<br />
$ sudo losetup -D</blockquote>
</div>
<div>
<br /></div>
<div>
Ya tenemos la imagen preparada, para guardarla sobre la SD vamos a transmitirla por SSH directamente. Debemos activar el acceso root por ssh: "sudo passwd root" en la raspberry. Editar el /etc/sshd si fuera necesario.</div>
<div>
<br /></div>
<div>
Detener todos los demonios y procesos posibles, para asegurarnos que nadie se dedica a escribir en disco.</div>
<div>
<br /></div>
<div>
Ahora es recomendable tener una segunda consola abierta con root contra la Raspberry y lanzar el comando "sync" que nos asegurará que todos los datos están escritos en la SD y podemos apagarla.</div>
<div>
<br /></div>
<div>
En otra consola lanzamos:</div>
<blockquote class="tr_bq">
$ gzip -c 2019-07-10-raspbian-buster-lite.img | ssh root@192.168.1.9 "gunzip -c > /dev/mmcblk0"</blockquote>
<div>
<br /></div>
<div>
Una vez acabe volvemos a la consola previa, "sync" y esperamos a que finalice.</div>
<div>
<br /></div>
<div>
Ya podemos apagar y volver a encenderla, si todo hay ido bien:</div>
<blockquote class="tr_bq">
$ ssh pi@[IP]<br />
password: raspberry<br />
Linux raspberrypi 4.19.57+ #1244 Thu Jul 4 18:42:50 BST 2019 armv6l</blockquote>
<div>
<br /></div>
<div>
Y aunque pueda parecer poco heterodoxo, ya lo tenemos listo.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-57506043640307122902018-02-26T19:14:00.000+01:002018-02-26T19:23:28.477+01:00postfix certificate key values mismatchRecientemente durante la instalación de un nuevo certificado en un servidor postfix me sucedió el siguiente error:
<pre class="codigo">$ telnet x.x.x.x 25
Escape character is '^]'.
220 x.x.x ESMTP Postfix
> EHLO test
250-x.x.x
250-PIPELINING
250-SIZE 34044240
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
> STARTTLS
454 4.7.0 TLS not available due to local problem
Connection closed by foreign host.</pre>
En el log de postfix podemos ver la oscura razón:
<pre class="codigo">postfix/smtpd[6376]: warning: cannot get RSA private key from file "/etc/postfix/smtpd.pem": disabling TLS support
postfix/smtpd[6376]: warning: TLS library problem: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:x509_cmp.c:340:</pre>
Tras varias vueltas resulta que efectivamente los certificados que está mirando son distintos, el problema se encontraba en que habia puesto el certificado de las CA intermedias antes que el certificado del propio servidor. Aquí hay una guía muy completa sobre la <a href="http://blog.carl.pro/2015/12/postfix-tls-configuration/">instalación en postfix</a>, reproduzco algunas partes:
<pre class="codigo">openssl x509 -noout -modulus -in cert.pem | openssl md5
(stdin)= d467b8860d03aec22ad97eed3d77cac2</pre>
<pre class="codigo">openssl rsa -noout -modulus -in key.pem | openssl md5
(stdin)= d467b8860d03aec22ad97eed3d77cac2</pre>
Ambos modulos deberian coincidir, si no coinciden o nos hemos liados con los archivos o como yo hemos pegado el certificado incorrecto primero :)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-25093827447108405502017-03-25T22:37:00.000+01:002017-03-25T22:37:46.458+01:00Visual Studio Code indentation guides colorPrimero activamos que se muestren las guias en settings.json:
<br />
<pre style="background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; overflow: auto; padding: 9.5px; word-break: break-all; word-wrap: break-word;"><code class="json" style="background-color: transparent; border-radius: 0px; box-sizing: border-box; color: inherit; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0px; white-space: pre-wrap;"> // Controls whether the editor should render indent guides
"<span class="hljs-attribute" style="box-sizing: border-box; color: #0451a5;">editor.renderIndentGuides</span>": <span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-literal" style="box-sizing: border-box; color: blue;">true</span></span>,</code></pre>
Luego en el Color Theme que tengamos activo, editamos el color de la key: <b>guide</b> tal que así:
<br />
<pre style="background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; line-height: 1.42857; margin-bottom: 10px; overflow: auto; padding: 9.5px; word-break: break-all; word-wrap: break-word;"><code class="json" style="background-color: transparent; border-radius: 0px; box-sizing: border-box; padding: 0px;"><span style="color: #333333; font-family: "menlo" , "monaco" , "consolas" , "courier new" , monospace;"><span style="white-space: pre-wrap;"><span style="white-space: pre-wrap;"><plist version="1.0">
<dict>
<key>name</key>
<string>Monokai Yggdrasil</string>
<key>settings</key>
<array>
<dict>
<key>settings</key>
<dict>
<key>background</key>
<string>#23241F</string>
<!-- Color del cursor del editor -->
<key>caret</key><string>#FF0000</string>
<!-- Color de la guía del editor -->
<key>guide</key><string>#303030</string></span></span></span></code></pre>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-14074570.post-44506737143628320102017-03-15T20:34:00.002+01:002017-03-15T20:34:48.975+01:00Script de migracion de Gnome Terminal para Ubuntu 16.04 LTSLa migración de Ubuntu siempre trae sorpresas, esta vez ha sido no poder recuperar la configuración del Gnome Terminal y que no haya ninguna herramienta que lo haga cuando es relativamente sencillo, han pasado de gconf (un sistema de configuración mediante archivos xml) a <a href="https://wiki.gnome.org/action/show/Projects/dconf" target="_blank">dconf</a> (sistema de db por clave en bajo nivel).<br />
<br />
El script lee un directorio con los xml viejos (normalmente en /home/user/.gconf/apps/gnome-terminal) y los instala en el nuevo sistema pasandole un dump de la nueva config en un formato que dconf entiende.<br />
<br />
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;">python gterminal_tool.py --load-current-profiles --skip-duplicate-names \
--load-gconf-profiles-from homefolder_backup/.gconf/apps/gnome-terminal \
--execute-delete --execute-action</pre>
<br />
De paso permite también la alteración de uno o mas parámetros de todos los perfiles, que importamos o existentes al mismo tiempo.<br />
<br />
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 13.6px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;">python gterminal_tool.py --load-current-profiles --set=<span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">"</span>font='Consolas 13'<span class="pl-pds" style="box-sizing: border-box;">"</span></span> \
--set=<span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">"</span>default-size-columns=170<span class="pl-pds" style="box-sizing: border-box;">"</span></span> --set=<span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">"</span>default-size-rows=50<span class="pl-pds" style="box-sizing: border-box;">"</span></span> \
--execute-delete --execute-action</pre>
El código para descargar en github:<br />
<br />
<a href="https://github.com/fcosantos/gnome-terminal-migrate">https://github.com/fcosantos/gnome-terminal-migrate</a><br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-18232915849369252632017-01-28T23:17:00.001+01:002017-01-28T23:17:15.207+01:00The Midnight - Vampires<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/bBs-lPvk3Zk" width="480"></iframe>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-82352287333916207782016-12-21T22:01:00.003+01:002016-12-21T22:01:59.522+01:00Felices fiestasCon la llegada de estas fechas no puede uno menos que acordarse de todas esas personas que han estado este año ahí, al pie del cañón, mis mejores deseos para ellos, que se ven reflejados en este precioso christmas:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKnHEy7OQNQDU1yybKr2o-_avjM4_3QCcsxgON0gyqRM3UBb8U0hKFIE-YMU-cLiNeY813mP5D1GAO9VxUoUsv5Y4ORyfwWTKuy2h7GkjA1GZpu_4qUTk58g_LDyS3aYVeZ2owiQ/s1600/zapatero+precipicio.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKnHEy7OQNQDU1yybKr2o-_avjM4_3QCcsxgON0gyqRM3UBb8U0hKFIE-YMU-cLiNeY813mP5D1GAO9VxUoUsv5Y4ORyfwWTKuy2h7GkjA1GZpu_4qUTk58g_LDyS3aYVeZ2owiQ/s400/zapatero+precipicio.jpg" width="400" /></a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-68880751968664419572016-12-03T11:04:00.001+01:002016-12-03T11:04:12.278+01:00El mundo vuelve a girar<h3>Röyksopp feat. Robyn - Monument (The Inevitable End Version)</h3><br />
<p>Arriba o abajo, dos caras de la misma moneda. Hoy toca tirar de nuevo.</p><br />
<iframe width="480" height="270" src="https://www.youtube.com/embed/Zo6UnKr6Bwg" frameborder="0" allowFullScreen=""></iframe>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-6931704551993228632016-12-01T23:15:00.001+01:002016-12-01T23:15:18.947+01:00ESP8266 Mini D1 con sensor de presión barométrica GY-BMP280-3.3Para montar nuestra propia estación meteorológica es fundamental tener un sensor de presión, he estado probando el GY-BMP280, un sensor que vale menos de 2€ comprándolo en cualquier página china.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK3ktVVtGVbqQb9eQrR34OZClojxiiX9tIAr4dviVwzW3GNgHZW48RJ5rgYqbtpZ4-bPXZlC9_2cp5AvlMnGDhBLUOZAzGE0IAJ5Cl7Disr26GZMnhU17fFF2BX8_SvMijXubxWg/s1600/IMG_20161128_192553.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK3ktVVtGVbqQb9eQrR34OZClojxiiX9tIAr4dviVwzW3GNgHZW48RJ5rgYqbtpZ4-bPXZlC9_2cp5AvlMnGDhBLUOZAzGE0IAJ5Cl7Disr26GZMnhU17fFF2BX8_SvMijXubxWg/s400/IMG_20161128_192553.jpg" width="400" /></a></div>
<br />
Se trata de una pequeña placa que trae el sensor de Bosch y los pines para conexion I2C y SPI. Por comodidad, y uso de pines he probado el protocolo I2C montado en una placa MiniD1. Una de las cosas poco claras es el tema del pinout, a que pins debe conectarse en la MiniD1 la señal de reloj (SCL) y la de datos (SDA), urgando un poco en la documentación del código hardware/esp8266com/esp8266/ vemos las declaraciones de pines del chip ESP8266 a la placa MiniD1:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">#########################################################################<br /># variants/d1_mini/pins_arduino.h<br />#########################################################################<br />#define PIN_WIRE_SDA (4) // D2<br />#define PIN_WIRE_SCL (5) // D1<br />static const uint8_t SDA = PIN_WIRE_SDA;<br />static const uint8_t SCL = PIN_WIRE_SCL;<br />static const uint8_t LED_BUILTIN = 2;<br />static const uint8_t BUILTIN_LED = 2;<br />static const uint8_t D0 = 16;<br />static const uint8_t D1 = 5;<br />static const uint8_t D2 = 4;<br />static const uint8_t D3 = 0;<br />static const uint8_t D4 = 2;<br />static const uint8_t D5 = 14;<br />static const uint8_t D6 = 12;<br />static const uint8_t D7 = 13;<br />static const uint8_t D8 = 15;<br />static const uint8_t RX = 3;<br />static const uint8_t TX = 1;</span></blockquote>
<br />
Por defecto la librería Wire de Arduino se reemplaza con la TwoWire que define begin con los pines SDA y SCL:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">#########################################################################<br /># ~/Arduino/hardware/esp8266com/esp8266/libraries/Wire/Wire.cpp<br />#########################################################################<br />static int default_sda_pin = SDA;<br />static int default_scl_pin = SCL;<br />// Constructors ////////////////////////////////////////////////////////////////<br />TwoWire::TwoWire(){}<br />// Public Methods //////////////////////////////////////////////////////////////<br />void TwoWire::begin(int sda, int scl){<br /> default_sda_pin = sda;<br /> default_scl_pin = scl;<br /> twi_init(sda, scl);<br /> flush();<br />}</span></blockquote>
<br />
Estos por defecto están mapeados a D1 y D2 (4, 5) según la tabla de traducción anterior, en la documentación se explica más o menos:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">#########################################################################<br />~/Arduino/hardware/esp8266com/esp8266$ vi doc/libraries.md<br />## I2C (Wire library)<br />Wire library currently supports master mode up to approximately 450KHz.<br />Before using I2C, pins for SDA and SCL need to be set by calling<br />`Wire.begin(int sda, int scl)`, i.e. `Wire.begin(0, 2)` on ESP-01,<br />else they default to pins 4(SDA) and 5(SCL).<br />#########################################################################</span></blockquote>
<br />
Para testear los dispositivos i2c hay una libreria muy interesante, que scanea las direcciones en las que se pueden encontrar <a href="https://github.com/mcauser/i2cdetect">https://github.com/mcauser/i2cdetect</a> . Con un poco de código el BMP280 aparece en la posición 0x76.<br />
<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">#########################################################################<br />#include <wire .h=""><br />#include <i2cdetect .h=""><br />void setup() {<br /> Wire.begin(0, 2); -> D3,D4<br /> //Wire.begin();<br /> Serial.begin(9600);<br /> Serial.println("i2cdetect example\n");<br /> Serial.print("Scanning address range 0x03-0x77\n\n");<br />}<br />void loop() {<br /> i2cdetect(); // default range from 0x03 to 0x77<br /> delay(2000);<br />}</i2cdetect></wire></span></blockquote>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"> 0 1 2 3 4 5 6 7 8 9 a b c d e f<br />00: -- -- -- -- -- -- -- -- -- -- -- -- --<br />10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --<br />20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --<br />30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --<br />40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --<br />50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --<br />60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --<br />70: -- -- -- -- -- -- 76 --<br />############################################################################</span></blockquote>
<br />
Trás esto debemos hacer un par de cambios al código de prueba de Adafruit_BMP280:<br />
- Antes de nada definimos los pines en los que tenemos el I2C: Wire.begin(D3,D4);<br />
- Indicamos la dirección del I2C:<br />
Adafruit_BMP280 bme; // I2C<br />
bme.begin(0x76)<br />
<br />
Ya deberíamos poder ver los resultados del sensor por el puerto serie:<br />
<br />
Temperature = 21.09 *C<br />
Pressure = 100162.88 Pa<br />
Approx altitude = 97.21 m<br />
<br />
Si queremos un ejemplo completo en: <a href="http://lazyzero.de/en/elektronik/esp8266/diy_weather/start" target="_blank">http://lazyzero.de/en/elektronik/esp8266/diy_weather/start</a> podemos ver un sensor de humedad, temperatura y este mismo de presión con su código completo.<br />
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-17152833798080366432016-10-30T11:04:00.004+01:002016-10-30T11:04:59.129+01:00Convertir Matroska video to MP4 para televisiones Samsung<div class="separator" style="clear: both; text-align: left;">
Hoy en día las televisiones soportan un amplio rango de formatos y casi todos se pueden emitir desde un servidor de videos sin problemas (Universal Media Server por ejemplo). Aunque de vez en cuando nos encontramos con el típico formato que falla o nuestra tele carece de software para reproducirlo. En estos casos tenemos dos opciones, configurar nuestro servidor para que realice la conversión al vuelo o reconvertirlos nosotros mismos, vamos a explorar esta opción con un software muy común como el VLC:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Abrimos el VLC y elegimos convertir/guardar:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj51CKWCi1TlSG5-pKzdXBjSFTnVHcrYC7orH893Wwl1tHEVQrQdqK40rMxUSKoN6kwlagYjkVQGINzVAYUV1wfpN9LeKTeb0eOXGgRvi7drkvUTtZaqYjTvhlYYTHwOPlB4oFxjg/s1600/Selection_001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj51CKWCi1TlSG5-pKzdXBjSFTnVHcrYC7orH893Wwl1tHEVQrQdqK40rMxUSKoN6kwlagYjkVQGINzVAYUV1wfpN9LeKTeb0eOXGgRvi7drkvUTtZaqYjTvhlYYTHwOPlB4oFxjg/s1600/Selection_001.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Añadimos el archivo que queremos convertir:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiYfaMWhMRLbPHG3JpB4Plem_fbd5EUGC_j_wGjbhcEaZef-E_YEVdCiDXK_Vr3vvJSDIAyU8YdsQ3cJTrLdVTDQyPBO3eYN6koiXWM0j6w5tAn6l-WzLN6lakbK88Y-ZFwczy8w/s1600/Selection_002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiYfaMWhMRLbPHG3JpB4Plem_fbd5EUGC_j_wGjbhcEaZef-E_YEVdCiDXK_Vr3vvJSDIAyU8YdsQ3cJTrLdVTDQyPBO3eYN6koiXWM0j6w5tAn6l-WzLN6lakbK88Y-ZFwczy8w/s1600/Selection_002.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Cliqueamos convertir y editamos el perfil:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFQ_eyW6RhdRDl4UF1FKyikqt3Ld301EnD_ZnkRT3buqPr_aJjhB6HZ4cqYc9_fVO5WuOvRgoR90xr21HpiQu-ErMOir78T2zS1IGqlzZ4aLbSk8Ou87T8dn3xXXNVU6OARF7mzQ/s1600/Selection_003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFQ_eyW6RhdRDl4UF1FKyikqt3Ld301EnD_ZnkRT3buqPr_aJjhB6HZ4cqYc9_fVO5WuOvRgoR90xr21HpiQu-ErMOir78T2zS1IGqlzZ4aLbSk8Ou87T8dn3xXXNVU6OARF7mzQ/s1600/Selection_003.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Para la encapsulación MP4/MOV:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijTAShbRnET1K2AmZe6FfBht4rb-Xa6ACbTzLpMAnKZGRUkpI3eB-PIud5llgs1LV0GDXFGQfyusnMS5lSfdOSu72dxo0xLFFw_5veFOJzmPR68wgmvNcckhtFICoTnLqs7_AtTA/s1600/Selection_004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijTAShbRnET1K2AmZe6FfBht4rb-Xa6ACbTzLpMAnKZGRUkpI3eB-PIud5llgs1LV0GDXFGQfyusnMS5lSfdOSu72dxo0xLFFw_5veFOJzmPR68wgmvNcckhtFICoTnLqs7_AtTA/s1600/Selection_004.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
En principio no hará falta convertir el video, pero si quisieramos un formato bastante compatible es H264.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmh8klZPS4g7tWJv3ZgfeSSjUrQ34L5HPD0uwlLeBsLvGSIKaZCFNhJCemcyUqeA7brdMvpoGFIgOB2_x3dJ2IuhJRs4g0CBVB__hVScpDYRKANki000fgOMY5t3B2w-RJ7Bl68w/s1600/Selection_005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmh8klZPS4g7tWJv3ZgfeSSjUrQ34L5HPD0uwlLeBsLvGSIKaZCFNhJCemcyUqeA7brdMvpoGFIgOB2_x3dJ2IuhJRs4g0CBVB__hVScpDYRKANki000fgOMY5t3B2w-RJ7Bl68w/s1600/Selection_005.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Para el audio en caso de no poder mantener el original una buena opción es el más básico:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAr0U3KLYjNE7m7yrfMHjfiBa1qHejbQSuaT8I_mqHzMyLZvD3rylzjx_q7Hyly0xyb99bHpWpxf0rgXy3O6pOPxTG7LDeVvJtjf6oJY1VpJH7LmhyphenhyphensqPC03TsB33shuDptmtaSQ/s1600/Selection_006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAr0U3KLYjNE7m7yrfMHjfiBa1qHejbQSuaT8I_mqHzMyLZvD3rylzjx_q7Hyly0xyb99bHpWpxf0rgXy3O6pOPxTG7LDeVvJtjf6oJY1VpJH7LmhyphenhyphensqPC03TsB33shuDptmtaSQ/s1600/Selection_006.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Ya solo queda guardar el nuevo archivo, en caso de que haya conversión de formato de por medio será un poco mas lento:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6dkb0ix0kG8YHlzqj8FYxDn76192kxRwStuV2AvT-o6VfyZmZlXX9va94TKBfDHoKcTWoxQIOI5DIvZB50ZP2IEPy-dtD_E2UGvZZJu8sb2XAGBqzWZpnvKQxAogDAy_r2GX8CQ/s1600/Selection_007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6dkb0ix0kG8YHlzqj8FYxDn76192kxRwStuV2AvT-o6VfyZmZlXX9va94TKBfDHoKcTWoxQIOI5DIvZB50ZP2IEPy-dtD_E2UGvZZJu8sb2XAGBqzWZpnvKQxAogDAy_r2GX8CQ/s1600/Selection_007.png" /></a></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-58515717407599122682016-04-21T14:00:00.000+02:002016-06-11T18:00:15.592+02:00Cause you make me feel...<div class="separator" style="clear: both; text-align: center;">
<iframe width="560" height="315" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/QtXby3twMmI/0.jpg" src="https://www.youtube.com/embed/QtXby3twMmI?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-71308995487712908582015-04-06T23:36:00.000+02:002015-04-06T23:39:16.407+02:00IO error montando raidEn este caso md3 se trata de un raid 1 que no es capaz de montar por errores en el segundo disco, lanzando los siguientes comandos observamos los siguientes errores:<br />
<pre class="codigo"># mount /dev/md3 /mnt/home/
mount: wrong fs type, bad option, bad superblock on /dev/md3,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so</pre>
<pre class="codigo"># smartctl -a /dev/sdb
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000b 077 077 016 Pre-fail Always - 11928801
2 Throughput_Performance 0x0005 139 139 054 Pre-fail Offline - 70
3 Spin_Up_Time 0x0007 131 131 024 Pre-fail Always - 282 (Average 294)
4 Start_Stop_Count 0x0012 100 100 000 Old_age Always - 22
5 Reallocated_Sector_Ct 0x0033 001 001 005 Pre-fail Always FAILING_NOW 639
7 Seek_Error_Rate 0x000b 099 099 067 Pre-fail Always - 1
8 Seek_Time_Performance 0x0005 124 124 020 Pre-fail Offline - 33
9 Power_On_Hours 0x0012 099 099 000 Old_age Always - 13406
10 Spin_Retry_Count 0x0013 100 100 060 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 22
192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 35
193 Load_Cycle_Count 0x0012 100 100 000 Old_age Always - 35
194 Temperature_Celsius 0x0002 187 187 000 Old_age Always - 32 (Min/Max 24/44)
196 Reallocated_Event_Count 0x0032 024 024 000 Old_age Always - 1528
197 Current_Pending_Sector 0x0022 001 001 000 Old_age Always - 11248
198 Offline_Uncorrectable 0x0008 100 100 000 Old_age Offline - 28
199 UDMA_CRC_Error_Count 0x000a 200 200 000 Old_age Always - 0</pre>
<pre class="codigo"># dmesg
ata2.00: exception Emask 0x0 SAct 0x7fe0001f SErr 0x0 action 0x0
ata2.00: irq_stat 0x40000008
ata2.00: failed command: READ FPDMA QUEUED
ata2.00: cmd 60/08:a8:e8:0c:b7/00:00:9f:00:00/40 tag 21 ncq 4096 in
res 51/40:08:e8:0c:b7/00:00:9f:00:00/40 Emask 0x409 (media error)
ata2.00: status: { DRDY ERR }
ata2.00: error: { UNC }
ata2.00: configured for UDMA/133
sd 1:0:0:0: [sdb] Unhandled sense code
sd 1:0:0:0: [sdb]
Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
sd 1:0:0:0: [sdb]
Sense Key : Medium Error [current] [descriptor]
Descriptor sense data with sense descriptors (in hex):
72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
9f b7 0c e8
sd 1:0:0:0: [sdb]
Add. Sense: Unrecovered read error - auto reallocate failed
sd 1:0:0:0: [sdb] CDB:
Read(10): 28 00 9f b7 0c e8 00 00 08 00
end_request: I/O error, dev sdb, sector 2679573736
ata2: EH complete</pre>
El problema se debe a que está intentando escribir el journal que tenía pendiente, la solución es montarlo sin que lo escriba, perderemos los últimos datos pero posiblemente tengamos acceso a gran parte del disco.<br />
<pre class="codigo"># mount -o ro,noload /dev/md3 /mnt/home/</pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-39768952344542616722012-06-09T18:44:00.001+02:002016-06-11T18:00:30.812+02:0060 seconds for Mr. Light<iframe allowfullscreen="" frameborder="0" height="270" src="http://www.youtube.com/embed/Ko_84RCovQA?fs=1" width="480"></iframe><br />
<br />
Un poquito de electronica....Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-15866641838309996832012-04-13T12:15:00.001+02:002012-04-13T12:20:36.353+02:00Cambiar los puertos de escucha de nessus 5Para cambiar los puertos en los que escucha nessus podemos hacerlo bien autenticandonos en el interfaz web:<br />
<br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc_VkrFoVggDDG9L48y0gRkQ8wyFPhNWCCPM4kP5hACmEvj6INDo_vNIrEQh1-9uT808XKzt1KfU0WuK-7PmbnKu7VXl7j7ASW-2V2F6PsBrdXA6lDO4auYUNWg_qRQ-LarUr0HQ/s1600/nessus_cambio_puerto.PNG" />
<br />
<br />
O bien a través de la consola mediante los siguientes comandos:<br />
Para modificar el puerto de la consola web:
<br />
<pre class="codigo">/opt/nessus/sbin/nessus-fix --set xmlrpc_listen_port=PUERTO</pre>
Para modificar el puerto del antiguo protocolo NTP:
<br />
<pre class="codigo">/opt/nessus/sbin/nessus-fix --set listen_port=PUERTO</pre>
Después:
<br />
<pre class="codigo">/etc/init.d/nessusd stop
/etc/init.d/nessusd start</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-24850091409079621262012-04-12T10:45:00.001+02:002012-04-12T10:46:59.061+02:00Corrupción de tablas GPTÚltimamente los Ubuntu suelen instalar por defecto el tipo de <a href="http://es.wikipedia.org/wiki/Tabla_de_particiones_GUID">tabla de particiones GPT</a>, un estándar basado en EFI que reemplaza el viejo MBR.
Hemos tenido un problema con la corrupción (aparente) de una de estas tablas, grub dejó de tener acceso a su partición y por tanto de arrancar el sistema, tras muchas vueltas una de las soluciones ha sido reescribir la tabla de particiones, para ello arrancando desde un livecd:
<pre class="codigo">livecd ~ # parted /dev/sda
(parted) p
Warning: /dev/sda contains GPT signatures, indicating that it has a GPT table. However, it does not have a valid fake msdos partition table, as
it should. Perhaps it was corrupted -- possibly by a program that doesn't understand GPT partition tables. Or perhaps you deleted the GPT
table, and are now using an msdos partition table. Is this a GPT partition table?
Yes/No? yes
Model: ATA ST2000DL003-9VT1 (scsi)
Disk /dev/sda: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 1018kB 1000kB bios_grub
2 1018kB 257MB 256MB ext2
3 257MB 2000GB 2000GB lvm
</pre>
Como vemos nos avisa de que a pesar de que hay firmas GPT algo raro ha pasado, posiblemente esté leyendo la tabla de backup. Como aun tenemos toda la información con realizar un pequeño cambio para que se sobreescriba será suficiente:
<pre class="codigo">(parted) set
Warning: /dev/sda contains GPT signatures, indicating that it has a GPT table. However, it does not have a valid fake msdos partition table, as
it should. Perhaps it was corrupted -- possibly by a program that doesn't understand GPT partition tables. Or perhaps you deleted the GPT
table, and are now using an msdos partition table. Is this a GPT partition table?
Yes/No? yes
Partition number? 1
Flag to Invert? bios_grub
New state? on/[off]? on</pre>
Volviendo a rearrancar el parted:
<pre class="codigo">livecd ~ # parted /dev/sda
GNU Parted 3.0
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: ATA ST2000DL003-9VT1 (scsi)
Disk /dev/sda: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 1018kB 1000kB bios_grub
2 1018kB 257MB 256MB ext2
3 257MB 2000GB 2000GB lvm
(parted) q
livecd ~ # vgscan
Reading all physical volumes. This may take a while...
Found volume group "XXX" using metadata type lvm2
</pre>
Ahora ya tenemos acceso a la partición donde teníamos el lvm, igualmente grub ya puede localizar de nuevo su referencia y arrancar el sistema correctamente.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-90596996759030170092012-02-15T19:29:00.000+01:002012-02-15T19:30:29.160+01:00Referencia cruzada en DjangoDjango está diseñado para nuestra comodidad, si bien algunas veces se hace dificil encontrar exactamente lo que necesitamos, este es el caso de las referencias cruzadas:<br />
<br />
En el caso de tener un campo <a href="https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey" title="django.db.models.ForeignKey">ForeignKey</a> o <a href="https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ManyToManyField" title="django.db.models.ManyToManyField">ManyToManyField</a> existen ocasiones en que queremos seguir esta relación para obtener los campos relacionados de la otra, un ejemplo que me ha sucedido recientemente es que al hacer uso del objeto de paginacion (<a href="https://docs.djangoproject.com/en/dev/topics/pagination/#django.core.paginator.Paginator" title="django.core.paginator.Paginator">Paginator</a>) si quieres obtener las referencias necesitas realizar otra consulta (en un bucle for por ejemplo) con el objeto final que quieres mostrar, esto provocaba que la optimización del paginator (solo se trae los registros a mostrar) se fuera a paseo obligando a procesar toda la tabla y hacer n bucles mas con la tabla que nos interesa. Esto se resuelve haciendo uso del objeto referencia <a href="https://docs.djangoproject.com/en/dev/ref/models/relations/#related-objects-reference" target="_blank">RelatedManager</a>.
<br />
<br />
Imaginando que tenemos un objeto llamado cesto y un objeto llamado peras que tiene como foreingkey un cesto si queremos localizar las peras del cesto de esta forma llamariamos a pera.cesto_set.all()<br />
Esto es muy útil pues podemos delegar esta parte de la lógica en la plantilla consiguiendo una aplicación bastante mínima:
<br />
<pre class="codigo">{% for pera in peras %}
{{ pera.tipo }}
{% for cesto in pera.cesto_set.all %}
{{ cesto.nombre }}
{% endfor %}
{% endfor %}
</pre>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-60792360782243633662011-12-16T16:17:00.000+01:002011-12-16T16:19:07.449+01:00Compilar SQUID 2.7 en Ubuntu 10.10 con OpenSSL 1.0.0En la nueva rama de OpenSSL 1.0.0 el soporte para SSL v2 ha sido eliminado, SSLv2 es un protocolo obsoleto que contiene múltiples fallos de seguridad que son fácilmente explotables, por tanto su uso debe ser evitado.<br />
<br />
El problema ocurre cuando queremos compilar programas con versiones antiguas que hacen en su código uso de este protocolo, este es el caso de querer compilar desde código SQUID2.7 sobre una Ubuntu 10.10, obtendremos un error similar a:
<br />
<pre class="codigo">ssl_support.o: In function `sslCreateServerContext':
/usr/src/proxy/squid-2.7.STABLE9/src/ssl_support.c:451: undefined reference to `SSLv2_server_method'
ssl_support.o: In function `sslCreateClientContext':
/usr/src/proxy/squid-2.7.STABLE9/src/ssl_support.c:614: undefined reference to `SSLv2_client_method'
collect2: ld returned 1 exit status
</pre>
<br />
La solución pasa por parchear el código o eliminar las partes que requieren de funciones sslv2 tal como se puede observar en el siguiente patch
<br />
<pre class="codigo">--- /usr/src/proxy/squid-2.7.STABLE9/src/ssl_support.c.orig 2011-12-16 12:54:54.000000000 +0100
+++ /usr/src/proxy/squid-2.7.STABLE9/src/ssl_support.c 2011-12-16 12:55:15.000000000 +0100
@@ -446,10 +446,12 @@
ERR_clear_error();
debug(83, 1) ("Initialising SSL.\n");
switch (version) {
+#ifndef OPENSSL_NO_SSL2
case 2:
debug(83, 5) ("Using SSLv2.\n");
method = SSLv2_server_method();
break;
+#endif
case 3:
debug(83, 5) ("Using SSLv3.\n");
method = SSLv3_server_method();
@@ -609,10 +611,12 @@
ERR_clear_error();
debug(83, 1) ("Initialising SSL.\n");
switch (version) {
+#ifndef OPENSSL_NO_SSL2
case 2:
debug(83, 5) ("Using SSLv2.\n");
method = SSLv2_client_method();
break;
+#endif
case 3:
debug(83, 5) ("Using SSLv3.\n");
method = SSLv3_client_method();
</pre>
<br />
Para aplicarlo podemos copiar el contenido anterior en un archivo y ejecutar: patch -p0 < parche.txtUnknownnoreply@blogger.com2tag:blogger.com,1999:blog-14074570.post-75626343748989166232011-11-27T18:48:00.001+01:002011-11-27T18:52:47.614+01:00La belleza está en los ojos del que miraPara un momento a mirar la belleza que nos rodea:<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="360" src="http://www.youtube-nocookie.com/embed/gXDMoiEkyuQ?rel=0#t=1s" width="640"></iframe><br />
<br />
<a href="http://en.wikipedia.org/wiki/Louis_Schwartzberg">Louis Schwartzberg</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-68938881943340947482011-10-26T09:31:00.001+02:002011-10-26T09:32:39.924+02:00Deshabilitar ipv6 en ubuntu 11.10 GNU/Linux 3.0.0Parece que en los ultimos kernel algo ha cambiado que ya no es posible deshabilitar el soporte IP v6 a través de los métodos tradicionales, vease:<br />
<ul>
<li>Método 1, <b>NO FUNCIONA</b>. Añadir la configuración al núcleo (supuestamente funcional en Ubuntu 10.04 y 10.10):
<pre class="codigo">vi /etc/sysctl.conf
# IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
</pre>
Recargamos la configuración y vemos si está aplicada con:
<pre class="codigo">sysctl -p
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
</pre>
</li>
<li>Método 2. <b>NO FUNCIONA</b>. Deshabilitar los módulos (supuestamente funcional en Ubuntu 9.04 y anteriores):
<pre class="codigo">vi /etc/modprobe.d/aliases
alias net-pf-10 ipv6 off
alias net-pf-10 off
alias ipv6 off</pre>
Reiniciamos
<pre class="codigo">reboot
</pre>
</li>
<li>Método 3. <b style="color:red">FUNCIONA</b> Como posiblemente todo esto no nos haya funcionado:
<pre class="codigo">vi /etc/default/grub
<< GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
>> GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash ipv6.disable=1”
</pre>
Recargamos la configuración del grub y reiniciamos:
<pre class="codigo">update-grub
reboot
</pre>
</li>
</ul>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-14074570.post-88131957919530152622011-10-14T12:01:00.001+02:002011-10-14T12:01:55.957+02:00Backup y recuperación del MBR y tabla de particionesBackup a un archivo del mbr, particiones y lista legible:
<pre class="codigo">dd if=/dev/sda of=sda.mbr bs=512 count=1
fdisk -l > particiones.txt
</pre>
Recuperación a disco:
<pre class="codigo">dd if=sda.mbr of=/dev/sda bs=512 count=1</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-38367302393219150942011-10-02T11:00:00.001+02:002011-10-02T12:23:37.165+02:00Como crear una tabla de asociación en Excel<br />
El otro día un amigo profesor me comentaba que estaba creando una tabla excel para llevar la contabilidad de las notas de sus alumnos. Para ello durante el curso realizaba distintas pruebas (exámenes al fin y al cabo) que aportaban un porcentaje de la nota final, para el resto debía utilizar indicadores de comportamiento del alumno, el había tenido la idea de hacer uso de las puntuaciones de las pruebas para automáticamente rellenar los indicadores de comportamiento, he aquí donde entra la pregunta, ¿como hacer una hoja excel genérica en la que no tenga que estar haciendo AVERAGE(A1;B1...) etc si no que automáticamente coja las columnas que yo le diga)?<br />
<br />
La solución que se me ocurrió en ese momento fue crear una nueva hoja donde rellenaríamos las relaciones que deben tenerse en cuenta para hacer la media, veamos pues:<br />
<br />
Tenemos una tabla con notas por alumnos y exámenes:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHe2aRNLnH5xSlBmrBsdTMnxVtgTix6jGxAT_Z6KZ79eK94GGCnk5UM-dXZhIGyuyRJgHMwdtOyzVMCcRDBm-qpK0uSgcNd32ekhtFVM2pHtSAUGOLoH5JBZgMe9FrIzcLKpmrMg/s1600/01.png" /></div>
<br />
Y la tabla de indicadores que deseamos rellenar automáticamente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYqsEsOU52BI3o05dMGrtWwNxktr3DINiyT7A1UgDouRIC25DMUClVEXlMWsLLDDbOCkVdmf_XcPnAkHHay3NB_d1FSVsWQm6S-j_rSR0VFVvwkt24TJOGAYemzFHzvsM7lcCv3Q/s1600/02.png" /></div>
<br />
La idea que me propuso era básicamente hacer que la competencia número 1 se basara en la media del listening, vocabulario y examen T1, la del 2 en otras 4 distintas, tal que así. En estático sería simplemente en la columna B39=AVERAGE(B5;C5;D5), en la C39=AVERAGE(de otras cuatro)<br />
<br />
Hasta aquí bien, pero si tengo otra clase con diferentes asignaturas y las relaciones cambian debo editar una por una todas las celdas de mi tabla de indicadores, ¿como hacer esta edición mas intuitiva?<br />
<br />
Para ello usaremos una tabla de relaciones, abrimos una nueva página donde creamos una tabla que diga para el indicador uno usarás B,C y D, para el 2: C,D,F y H, etc:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf38iEF_lH8d235rb0k866dn7D-E8qKVufeNO4tO_HQANEPfIHCzUvBMkiKTax_jxSbjDzyICHK-HnP0KlreY2UuGTC5F05FIvg2UjEWOv7RmiY7whZz-IvPI3LzH8kVVNbCpWNg/s1600/03.png" /></div>
<br />
Ahora queremos que en la celda B39 de la hoja Alumnos se evalúe esta relación, para ello haremos uso de una formula que obtenga de la hoja Referencias el numero de indicador según la columna en la que nos encontramos.<br />
<br />
Un poco de teoría:<br />
La función COLUMN() nos dice el valor numérico de la columna actual en el caso B39, COLUMN() = 2<br />
La funcion ROW() nos devuelve el valor numérico de la fila en la que estamos B39, ROW() = 39<br />
La función OFFSET nos permite obtener el contenido de una celda en relación a la que le indiquemos, por ej: OFFSET(B39;1;1) = contenido de la celda C40.<br />
<br />
De esta forma vamos a ir construyendo la formula poco a poco:<br />
<pre class="codigo">=OFFSET(Referencias!$B$4;COLUMN()-1;1)</pre>
Como nos encontramos en la columna B, COLUMN() devuelve 2, siendo el indicador 1, le restamos 1 y cogemos el OFFSET respecto a Referencias!$B$4, esto nos devolverá el contenido de Referencias!C5 = "B"<br />
<br />
Para seleccionar la fila debemos posicionarnos en la primera tabla de notas, esto lo haremos restandole a nuestra fila la distancia con la fila de la primera tabla:<br />
<pre class="codigo">=(ROW()-39+5) </pre>
Al estar en la fila 39 la operación nos devolverá "5".<br />
<br />
Concatenando:<br />
<pre class="codigo">=OFFSET(Referencias!$B$4;COLUMN()-1;1) & (ROW()-39+5)</pre>
Resultado: B5<br />
<br />
Ahora introducimos la función INDIRECT que permite hacer referencia al numero de celda que escribamos en otra, por ej: Si A1="B1" entonces INDIRECT(A1) nos devolverá el contenido de la celda B1.<br />
<pre class="codigo">=INDIRECT( OFFSET(Referencias!$B$4;COLUMN()-1;1) & (ROW()-39+5) )</pre>
Nos devolverá el contenido de B5 = 6<br />
<br />
Haciendo esta misma operación con la media de los 6 indicadores sería tal que así:<br />
<pre class="codigo">
=AVERAGE(
INDIRECT( OFFSET(Referencias!$B$4;COLUMN()-1;1) & (ROW()-39+5) );
INDIRECT( OFFSET(Referencias!$B$4;COLUMN()-1;2) & (ROW()-39+5) );
INDIRECT( OFFSET(Referencias!$B$4;COLUMN()-1;3) & (ROW()-39+5) );
INDIRECT( OFFSET(Referencias!$B$4;COLUMN()-1;4) & (ROW()-39+5) );
INDIRECT( OFFSET(Referencias!$B$4;COLUMN()-1;5) & (ROW()-39+5) );
INDIRECT( OFFSET(Referencias!$B$4;COLUMN()-1;6) & (ROW()-39+5) )
)</pre>
Cuidado con olvidarse un punto y coma en el último pues eso haría que excel creyera que hay otro valor más e hiciera media con cero.<br />
<br />
Ya solo queda copiar el contenido de B39 en todas las demás:<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKHI8gZTjoNbbOKk8gUI8KTJ-m1p_AQApBCqtYF4ifRBdAqyojO2posO4vX2XcHAc0D1Mu03Sv0qloIeJXamdTJSaNlnoFC_Uz0Nn_VwEf1oewQexypSsHxVUfhabD1hkHXc0nUQ/s1600/04.png" /></div>
<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-15392316454085004902011-05-06T13:28:00.001+02:002011-05-06T13:29:53.036+02:00Extraer los certificados SSL de un determinado puerto (2)Esto es una ampliación a la entrada de como obtener los certificados de cierto puerto: <a href="http://www.tranquilidadtecnologica.com/2006/08/extraer-los-certificados-ssl-de-un.html">http://www.tranquilidadtecnologica.com/2006/08/extraer-los-certificados-ssl-de-un.html</a><br />
<br />
En aquel entonces era para puertos puramente SSL:<br />
<pre class="codigo">$ openssl s_client -showcerts -connect smtp.gmail.com:465
CONNECTED(00000003)
depth=0 /C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 /C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 /C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
i:/C=ZA/ST=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com
-----BEGIN CERTIFICATE-----
MIIDVjCCAr+gAwIBAgIDP97OMA0GCSqGSIb3DQEBBAUAMIHOMQswCQYDVQQGEwJa
QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xHTAb
BgNVBAoTFFRoYXd0ZSBDb25zdWx0aW5nIGNjMSgwJgYDVQQLEx9DZXJ0aWZpY2F0
aW9uIFNlcnZpY2VzIERpdmlzaW9uMSEwHwYDVQQDExhUaGF3dGUgUHJlbWl1bSBT</pre><br />
Pero en algunos casos el puerto puede comenzar la sessión SSL a posteriori mediante el comando STARTTLS, en estos casos debemos especificar que protocolo debe hablar, por ejemplo:<br />
<pre class="codigo">$ openssl s_client -showcerts -connect smtp.gmail.com:25 -starttls smtp
CONNECTED(00000003)
depth=1 /C=US/O=Google Inc/CN=Google Internet Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
i:/C=US/O=Google Inc/CN=Google Internet Authority
-----BEGIN CERTIFICATE-----
MIIDWzCCAsSgAwIBAgIKaM9uMQADAAAirTANBgkqhkiG9w0BAQUFADBGMQswCQYD
VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu
dGVybmV0IEF1dGhvcml0eTAeFw0xMTAyMTYwNDM4MDlaFw0xMjAyMTYwNDQ4MDla
MGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N
b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRcwFQYDVQQDEw5zbXRw
LmdtYWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAzv9SacnXKcAx
+0B4yVH2qdpVUXnCk0Nvkn/y2Y0nkzFaWsWMAkOLTMtsa5yP69pnsYb9tUrs4KiL
DkRnf7RdSVlmpIGAknMAPDY/rja23ltutuN7Q4EjadsY8Q+NX5uWjlPsA5BE8GuI
9JobEl4iGFUAfF+2iOGlwFeFbpCaDJECAwEAAaOCASwwggEoMB0GA1UdDgQWBBQK
stTMUTHcQEpEpgaXuVVXJeIHxjAfBgNVHSMEGDAWgBS/wDDr9UMRPme6npH7/Gra
42sSJDBbBgNVHR8EVDBSMFCgTqBMhkpodHRwOi8vd3d3LmdzdGF0aWMuY29tL0dv
b2dsZUludGVybmV0QXV0aG9yaXR5L0dvb2dsZUludGVybmV0QXV0aG9yaXR5LmNy
bDBmBggrBgEFBQcBAQRaMFgwVgYIKwYBBQUHMAKGSmh0dHA6Ly93d3cuZ3N0YXRp
Yy5jb20vR29vZ2xlSW50ZXJuZXRBdXRob3JpdHkvR29vZ2xlSW50ZXJuZXRBdXRo
b3JpdHkuY3J0MCEGCSsGAQQBgjcUAgQUHhIAVwBlAGIAUwBlAHIAdgBlAHIwDQYJ
KoZIhvcNAQEFBQADgYEAxxXNJTE3LS1vmaqNZcFbNeUQtF/9DHpTfGGTtQCAjeMR
uhwSpAmc3/TxeERkT8cBckQxZWlMn2sHa418+DNv0/0QB4SZs0Fus4mXq/Erz91Y
Ouo+mV5BJSkDXH/qbG6wiBdEIypseBEbG+XJMxTSaYVgUjY313rBbAvQ0Uf7ZGQ=
-----END CERTIFICATE-----
1 s:/C=US/O=Google Inc/CN=Google Internet Authority
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
-----BEGIN CERTIFICATE-----
MIICsDCCAhmgAwIBAgIDC2dxMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDkwNjA4MjA0MzI3WhcNMTMwNjA3MTk0MzI3
WjBGMQswCQYDVQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZ
R29vZ2xlIEludGVybmV0IEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
gYkCgYEAye23pIucV+eEPkB9hPSP0XFjU5nneXQUr0SZMyCSjXvlKAy6rWxJfoNf
NFlOCnowzdDXxFdF7dWq1nMmzq0yE7jXDx07393cCDaob1FEm8rWIFJztyaHNWrb
qeXUWaUr/GcZOfqTGBhs3t0lig4zFEfC7wFQeeT9adGnwKziV28CAwEAAaOBozCB
oDAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFL/AMOv1QxE+Z7qekfv8atrjaxIk
MB8GA1UdIwQYMBaAFEjmaPkr0rKV10fYIyAQTzOYkJ/UMBIGA1UdEwEB/wQIMAYB
Af8CAQAwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20v
Y3Jscy9zZWN1cmVjYS5jcmwwDQYJKoZIhvcNAQEFBQADgYEAuIojxkiWsRF8YHde
BZqrocb6ghwYB8TrgbCoZutJqOkM0ymt9e8kTP3kS8p/XmOrmSfLnzYhLLkQYGfN
0rTw8Ktx5YtaiScRhKqOv5nwnQkhClIZmloJ0pC3+gz4fniisIWvXEyZ2VxVKfml
UUIuOss4jHg7y/j7lYe8vJD5UDI=
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority
---
No client certificate CA names sent
---
SSL handshake has read 1906 bytes and written 363 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : RC4-SHA
Session-ID: BA187E0D09C0CDDE4A3520D6991731686C09AF37EB4B5AA5DE6275B2ACB2A202
Session-ID-ctx:
Master-Key: 67579D9C448EFBC8C576EB29F76B3A89A80C7A43E67302B4A6A5205CA5E193F0DC127E205D08ED5BB3747749890110E4
Key-Arg : None
Start Time: 1304681288
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
250 ENHANCEDSTATUSCODES
</pre>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-14074570.post-31650972213353509192011-04-28T14:07:00.000+02:002011-04-28T14:07:17.363+02:00Eliminar un volumen raid definitivamenteA veces queremos dejar de usar un volumen raid pero a pesar de pararlo formatear los dispositivos etc se vuelve a crear solo en cada inicio para que esto no suceda hay que borrar el bloque de metadatos de cada unidad:<br />
<pre class="codigo"># mdadm --stop /dev/md1
# mdadm --misc --zero-superblock /dev/sda2
# mdadm --misc --zero-superblock /dev/sdb2
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-14074570.post-78988027188774955742011-04-28T13:35:00.005+02:002011-04-28T14:07:30.824+02:00Utilidades básicas de compilación en UbuntuFacil:<br />
<br />
<pre class="codigo"># apt-get install build-essential
# apt-get install libssl-dev
# apt-get install python-all-dev
# apt-get install python-setuptools
</pre>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-14074570.post-61188744542075081682011-04-07T21:37:00.005+02:002011-04-07T22:20:16.153+02:00Llave de paso Eheim 2213 goteandoTras casi 2 años sin usar el filtro las juntas tóricas se habían endurecido y roto, el conector de la llave de pasó había quedado tal que así:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQpkRmFGl2gwc2LFTN1nN7j3Mu2Pb3pF6tucr38TIOAl-G_Lt__vomjTVtZzdBXHvm9gsNO9a17o1BLtiS5cXgkiaFu2ZkQYZQMk0wPPGgCuugGERzqNsIK7qq2OMotOlU8pisVA/s1600/P1040587.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQpkRmFGl2gwc2LFTN1nN7j3Mu2Pb3pF6tucr38TIOAl-G_Lt__vomjTVtZzdBXHvm9gsNO9a17o1BLtiS5cXgkiaFu2ZkQYZQMk0wPPGgCuugGERzqNsIK7qq2OMotOlU8pisVA/s640/P1040587.jpg" width="640" /></a></div><br />
Estó hacía que se pediera una gota por minuto en cada una de las llaves, lo que equivale a un par de vasos de agua diarios que podía llegar a recoger, tras mucho buscar en tiendas online un repuesto, unas nuevas llaves valen casi 12€ y las gomas mas de 6€, así que llendo para la ferretería 15cts cada una de estas juntas tóricas :)<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKlZxSmBgHU4RyByfEac7nwWlKjEVttaxuFvvEgB0V4Ccl9hXoMyX2CEpH9ooS3qqoaGLGFP9jmYu0fDhatjDr-m9YLGCFF6LtHPePCJBZWUOM4h_auwsNj6BP-jK8s4P6yOxgcA/s1600/P1040593.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKlZxSmBgHU4RyByfEac7nwWlKjEVttaxuFvvEgB0V4Ccl9hXoMyX2CEpH9ooS3qqoaGLGFP9jmYu0fDhatjDr-m9YLGCFF6LtHPePCJBZWUOM4h_auwsNj6BP-jK8s4P6yOxgcA/s640/P1040593.jpg" width="640" /></a></div><br />
Encajan a la perfección y por ahora no hay perdidas:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEWXHakArNYqvP72SqAtaY9rRj5_Yh8UbASgTJQQ5wcBHNoXO72SiHx0L8Otg2hxFu6L0d6gO-bHX0smszv9Avvn5JLEPUlUfbOl-VpN6_Qf1XV7sRp5405AuKeh117A-rdJmihg/s1600/P1040590.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEWXHakArNYqvP72SqAtaY9rRj5_Yh8UbASgTJQQ5wcBHNoXO72SiHx0L8Otg2hxFu6L0d6gO-bHX0smszv9Avvn5JLEPUlUfbOl-VpN6_Qf1XV7sRp5405AuKeh117A-rdJmihg/s640/P1040590.jpg" width="640" /></a></div><br />
Como curiosidad otro apaño que tuve que hacerle al filtro, al pobre mio me lo cogieron por los tubos y claro la boca se partió, el superglue (cianocrilato en los chinos) ha servido a las mil maravillas, el plastico ha quedado perfectamente soldado, lo que se ve blaquillo por encima es cola que le puse a posteriori para quedarme mas tranquilo o si hubiera una fuga tener tiempo para localizarla antes de encharcar toda la casa.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKlZxSmBgHU4RyByfEac7nwWlKjEVttaxuFvvEgB0V4Ccl9hXoMyX2CEpH9ooS3qqoaGLGFP9jmYu0fDhatjDr-m9YLGCFF6LtHPePCJBZWUOM4h_auwsNj6BP-jK8s4P6yOxgcA/s1600/P1040593.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyF-nq1__hSIDJ2Vpt-UKOQ9QHr2aFJ76joHPlCyFShZisrXf7JZih3zp0v-YFB_9rk71UXZcUAxHlpdC74amoqm5HVVaisoehqVHgHrVbvJt5akVGQxSKCPqNbyZtc0gZyTK03w/s1600/P1040603.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyF-nq1__hSIDJ2Vpt-UKOQ9QHr2aFJ76joHPlCyFShZisrXf7JZih3zp0v-YFB_9rk71UXZcUAxHlpdC74amoqm5HVVaisoehqVHgHrVbvJt5akVGQxSKCPqNbyZtc0gZyTK03w/s640/P1040603.jpg" width="640" /></a></div>Unknownnoreply@blogger.com1