Gentoo trick: eina quickpkg
Dins del paquet gentoolkit podem trobar una eina que fins fa una estoneta no coneixia i que per culpa d’això m’havia fet perdre molt de temps, l’eina és realment interessant s’anomena quickpkg i ens permet crear un paquet binari a partir d’un paquet ja existent en el sistema. Realment útil quan volem tenir la còpia de seguretat de la versió d’un paquet que ja funciona en la nostre màquina i volem provar una nova versió sense haver de perdre altre vegada tot el temps fins que es torna a fer la compilació del paquet. Així doncs amb aquest eina podem estalviar realment moltes hores perdudes, almenys en el meu cas les havia perdut fins ara tontament.
Els paquets que es crein amb quickpkg obviament quedaran a:
${PKGDIR}/All ${PKGDIR}/
Grabar video-tutorials
Malgrat hi ha un molt bon programa amb una GUI basada en GTK per linux per capturar sessions i grabar veu a les sessions. El wink. O sigui, amb el que podem construir video-tutorials on expliquem com fer qualsevol cosa. Amb Gentoo no sé perquè no em funcionava a més la versió 1.5 que és la última disponible per linux no suporta grabació de veu. Així que m’he decantat per probar el vnc2swf que junt amb el pyvnc2swf (no inclòs al portage de linux) permet grabar sessions d’VNC i grabar fitxers d’audio al mateix temps. Esta prou bé l’script amb Python automatitza molt les coses. Obviament es tracta d’una aplicació basada en CLI i per tant, no té interficie gràfica i jo diria que no permet editar els arxius un cop grabats. No sé si el flash (.swf) es pot editar un cop grabat l’audio i el video. Però em sembla que és l’única manera d’editar un video-tutorial un cop grabat.
Perquè ens fem una idea del que fa l’script de Python és llençar el vnc2swf i al mateix temps podem invocar el arecord (graba .wav via ALSA). Així doncs quan a través de la mini-interfice gràfica que té el pyvnc2swf premem el botó d’stop es graba un fitxer .wav i un .swf amb el nostre video i l’audio per separat. Llavors el que fem amb el lame és convertir el .wav a .mp3 i després unim l’.mp3 amb el .swf de forma que quedin un sol arxiu .swf, el propi script ens ha creat també una pàgina .html des d’on es crida l’objecte de flash.
Com que hi ha força arxius i paràmetres a usar a continuació adjunto un petit cookbook que explica com fer-ho:
# Llencem el servidor d'Xvnc vncserver -geometry 800x600 :10 # Modifiquem el fitxer ~/.vnc/xstartup perquè es llenci el KDE amb l'escriptori del servidor Xvnc cat xstartup #!/bin/sh startkde & # Llencem el pyvnc2swf amb la seva mini-GUI per llençar i parar les grabacions vnc2swf.py -o out.swf -r 5 -S "arecord -r 22050 voice.wav" localhost:10 # Finalment llencem el client d'vnc per controlar la sessió que volem grabar vncviewer -depth 8 -compresslevel 9 -quality 9 :10
Els paràmetres que li passem al vnc2swf.py són per indicar el fitxer de sortida (-o), després li diem que grabi 5 fotogrames cada segon (-r 5) després llencem en swap el arecord prenent mostres a 22KHz i grabant la seva sortida a voice.wav. Finalment li diem que la sessió a la que s’ha de connectar en mode de només lectura és a localhost:10, o sigui, el port 5910.
Un cop parem la sessió es generarà un fitxer out.html des d’on es cridarà l’objecte de flash out.swf aquest arxiu no té incrustat el so grabat a voice.wav per adjuntar-lo hem de fer:
# Convertim a .mp3 el fitxer amb l'audio voice.wav lame voice.wav # Adjunt l'audio del fitxer voice.wav.mp3 al fitxer out.swf i la sortida ens quedarà a out2.swf edit.py -o out2.swf -a voice.wav.mp3 out.swf
A l’executar l’edit.py també es crearà el fitxer out2.html que crida l’objecte de flash out2.swf amb l’audio inclòs. Perquè us feu una idea de la sortida us adjunto aquest screenshot:
Comencem…
Doncs avui comença l’estiu per mi. No no! les vacances no! l’estiu, o sigui, que fa unes hores que la Daphne ja ha marxat cap a Xina fins al setembre. Ara a veure com m’ho manego per no estar només enganxat a l’ordinador. A més he de començar a postejar tot el que tinc a la llista de pendent que entre el boom de feina d’aquest última setmana i el aprofitar els últims dies per estar una mica més amb la Daphne realment no he tingut gens de temps d’esciure. Per altre banda comentar, que a les portes de fer 6 anys (aquest 31 de juliol) que tinc el blog obert per primer cop he aconseguit més de 100.000 visites en un mes. El mes de Maig gairebé hi vaig arribar però el de Juny ja les he superat. Espero poder seguir mantenint el nivell ja que el nombre de visites jo diria que serà quasi impossible que es mantingui tan alt. Servir més de 400.000 pàgines amb la pobre ADSL no és broma. Sort que les imatges es serveixen des de la feina sinó segur que això no ho aguanta l’ADSL.
Ara que ja sabeu com esta el tema i perquè estava offline espero poder re-agafar el ritme d’un post al dia…
Validador de targetes de crèdit pel symfony
El primer que vaig fer va ser declarar els mètodes orginals com a privats i després extendre la classe sfValidator que és la usada pels validadors de symfony. Creant un parell de mètodes públics estàndards pels validadors, bàsicament serveixen per instanciar el mètode del validador real i per capturar els paràmetres rebuts des del fitxer yml corresponent.
Doncs bé si voleu consultar el codi de la classe i un exemple d’ús a part de poder-ho consultar en la part extesa d’aques article podeu mirar als snippets de symfony, concretament a Credit Card validator.
Codi del validador:
getParameterHolder()->get('num'); $num = $this->getContext()->getRequest()->getParameter($num_param); $tipo_param = $this->getParameterHolder()->get('tipo'); $tipo = $this->getContext()->getRequest()->getParameter($tipo_param); // Lanzamos la validación $validada=$this->_isVAlidCreditCard($num,$tipo,false); // Informamos de como ha ido la validación sfContext::getInstance()->getLogger()->info("CCVAL.class.php: Tipo: ".$tipo." Num: ".$num." Validada: ".$validada); if ($validada==false) { $error = $this->getParameterHolder()->get('error'); return false; } return true; } public function initialize ($context, $parameters = null) { // initialize parent parent::initialize($context); $this->getParameterHolder()->add($parameters); return true; } /** * Testing checksum * * @param integer $ccnum * @return boolean */ private function _checkSum($ccnum) { $checksum = 0; for ($i=(2-(strlen($ccnum) % 2)); $i<=strlen($ccnum); $i+=2) { $checksum += (int)($ccnum{$i-1}); } // Analyze odd digits in even length strings or even digits in odd length strings. for ($i=(strlen($ccnum)% 2) + 1; $i< 10) { $checksum += $digit; } else { $checksum += ($digit-9); } } if (($checksum % 10) == 0) return true; else return false; } /** * Launch validation * * @param integer $ccnum * @param string $type * @param boolean $returnobj * @return boolean */ private function _isVAlidCreditCard($ccnum,$type="",$returnobj=false) { $creditcard=array( "visa"=>"/^4d{3}-?d{4}-?d{4}-?d{4}$/", "mastercard"=>"/^5[1-5]d{2}-?d{4}-?d{4}-?d{4}$/", "discover"=>"/^6011-?d{4}-?d{4}-?d{4}$/", "amex"=>"/^3[4,7]d{13}$/", "diners"=>"/^3[0,6,8]d{12}$/", "bankcard"=>"/^5610-?d{4}-?d{4}-?d{4}$/", "jcb"=>"/^[3088|3096|3112|3158|3337|3528]d{12}$/", "enroute"=>"/^[2014|2149]d{11}$/", "switch"=>"/^[4903|4911|4936|5641|6333|6759|6334|6767]d{12}$/"); if(empty($type)) { $match=false; foreach($creditcard as $type=>$pattern) if(preg_match($pattern,$ccnum)==1) { $match=true; break; } if(!$match) return false; else { if($returnobj) { $return=new stdclass; $return->valid=$this->_checkSum($ccnum); $return->ccnum=$ccnum; $return->type=$type; return $return; } else return $this->_checkSum($ccnum); } } else { if(@preg_match($creditcard[strtolower(trim($type))],$ccnum)==0) return false; else { if($returnobj) { $return=new stdclass; $return->valid=$this->_checkSum($ccnum); $return->ccnum=$ccnum; $return->type=$type; return $return; } else return $this->_checkSum($ccnum); } } } } ?>
Un exemple de com es crida el validador des dels fitxers yml de configuració al directori validate:
methods: post: [ntarjeta] names: ntarjeta: required: Yes required_msg: Credit Card number is required validators: validarCC validarCC: class: CCVAL param: num: ntarjeta tipo: tipoCC error: Your credit card number is invalid
Escriptori en 3D i nous conceptes d’usabilitat
Gràcies pel video Oriol, realment interessant. Us el recomano moltíssim ja que exposa idees de possibles futurs sistemes d’escriptoris en tres dimensions i sistemes d’interacció amb els documents/icones/programes/etc realment molt innovadors, almenys sota el meu punt de vista:
Amplificadors de 0.5W compatible amb 802.11b a 802.11g
Renasis té un petit amplificador de 0.5W amb connectors RP-SMA i TNC, a escollir. Obviament va alimentat externament i la mini-antena que porta incorporada porta un connector RP-SMA en el que si fa falta es pot connectar una antena més potent. Així doncs es poden fer coses molt interessants amb aquests dispositius. Ja sabeu que en aquest país emetre en més de 100mW és il·legal així doncs això només és per fer proves 😉
Si no sabeu on aconseguir-lo m’ho dieu en privat i us ho dic, a més el preu és molt atractiu al voltant dels 100.
Si voleu donar un cop d’ull al datasheet.