@eugen!"!#$ GLAMP HACKER Y PROGRAMADORA E%TREMA HACKER ESPECIALI&ADA EN PROGRAMACIN E%TREMA E INGENIER'A IN(ERSA DE CDIGO SOBRE GNU)LINU%, APACHE, MYS*L, PYTHON Y PHP+ EUGENIABAHIT+COM DOCENTE E INSTRUCTORA DE TECNOLOG'AS GLAMP CURSOS+EUGENIABAHIT+COM CURSOSDEPROGRAMACIONADISTANCIA+COM MIEMBRO DE LA FREE SOFTWARE FOUNDATION FSF+ORG Y THE LINU% FOUNDATION LINU%FOUNDATION+ORG+ CREADORA DE PYTHON-PRINTR, EUROPIO ENGINE, ,ACKTHESTRIPPER+ (IM CONTRI- BUTOR+ FUNDADORA DE HACKERS N- DE(ELOPERS MAGA&INE Y RESPONSABLE EDITORIAL HASTA OCTUBRE -./+
Buen01 A2e1, /3 4e ,un0
4e 53.6 'NDICE DE LA EDICIN NRO7 EUROPIO ENGINE LAB8 URL CUSTOMI&ABLES Y SLUGS EN EUROPIO ENGINE++++++++++++++++++++++++++++/ INGENIER'A DE SOFTWARE Y ESTRUCTURAS DE DIRECTORIOS DEFINITI(AS EN APLICACIONES M(C MODULARES++++++++++++++++++++++++++++++++++++7 HACK PARA EMULAR LA AUTOCARGA Y DESACTI(ACIN DE MDULOS DE UN SISTEMA COMO POL'TICA DE EMERGENCIA FRENTE A FALLOS INESPERADOS+++++++.6 ESE CAPTCHA NO (ERIFICA A LOS HUMANOS, SINO *UE COMPRUEBA SU MIOP'A+++++++++++++++++++++.9 The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 3 EUROPIO ENGINE LAB8 URL CUSTOMI&ABLES Y SLUGS EN EUROPIO ENGINE LLE(ABA TIEMPO ,IMMY COMENT:NDOME LA NECESIDAD DE CREAR URLS PERSONALI&ADAS EN EUROPIO ENGINE YA *UE ES UNO DE LOS RE*UERIMIENTOS M:S USADOS EN EL FRONT-END DE LA MAYOR PARTE DE LAS APLICACIONES WEB+ UNOS MESES ATR:S DECID' IMPLEMENTAR UN SISTEMA PARA EL CUAL ME INSPIR; EN EL DE D,ANGO Y PARA MI SORPRESA, AL D'A DE HOY SE CON(IRTI EN LA CARACTER'STICA M:S POPULAR DEL ENGINE+ ace algunas revisiones atrs, incorpor en Europio Engine un sistema de URL personaliadas !ue utilian e"presiones regulares para la de#inici$n de slugs. % Esta idea &!ue como tantas otras surgi$ del ingenio de 'imm( )aniel Barranco& se convirti$ en los *ltimos + meses en una de las caracter,sticas ms populares del motor ( por tanto, en una de las ms consultadas. Es por ello !ue en esta entrega e"plicar como implementar dicha caracter,stica en las aplicaciones ( como generar slugs -E.& compatibles, aprovechando la ocasi$n para hablarles sobre algunos hacks incre,bles. COMEN&AR A UTILI&AR URL PERSONALI&ADAS Lo primero !ue debemos hacer es crear un archivo llamado urls.php en la ra, de la aplicaci$n. Es importante saber !ue este archivo no es sustituido ni reemplaado de ninguna #orma cuando el core de Europio Engine es actualiado mediante el updater 1 . Trason!o El contenido de este archivo es ejecutado como c$digo en estado puro por el enrutador de ApplicationHandler mediante eval. El enrutador utilia el constructor eval 2 del lenguaje &destinado originalmente a evaluar c$digo& como hack para evitar el uso de global ( la creaci$n de variables globales. / http011www.cursosdeprogramacionadistancia.com1pastebin1codigo#uente1ver1/2 + http011www.php.net1manual1es1#unction.eval.php The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 4 El archivo urls.php no debe contar con eti!uetas de apertura ni cierre. -olo debe contener una variable llamada $urls cu(o valor se un array0 $urls = array(); FUNCIONAMIENTO DEL ARRAY <URLS -e trata de un array asociativo cu(as claves sern e"presiones regulares !ue de#inan los slugs personaliados ( sus valores asociados, la verdadera URL cu(o recurso se desee mostrar al usuario. Un ejemplo sencillo, plantea la como slug la e"presi$n regular del literal de 1productos para mostrar al usuario el recurso listar del modelo Producto perteneciente al m$dulo de ventas0 $urls = array( "/^\/productos$/" => "/ventas/producto/listar" ); -eg*n el array anterior, los usuarios !ue accediesen a examples.org/productos llegar,an al mismo recurso !ue accediendo a travs de example.org/ventas/producto/listar Ejemplos un poco ms complejos, podr,an re!uerir argumentos #ijos0 $urls = array( "/^\/ofertas/" => "/ventas/producto/ver/ofertas" ); . variables0 $urls = array( "/!/producto\/[0-9|a-z|A-Z|\-]{1,}/" => "/ventas/producto/ver" ); En cual!uier caso, todo el slug ser pasado como parmetro al recurso dentro de un array. Los elementos de dicho array sern cada una de las partes obtenidas tras el anlisis sintctico 3parsing4 de la URL, el cul tomar la barra diagonal 3slash4 como parmetro divisor de la UR5. )e esta #orma, si el slug resultante se viese como este0 The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 5 example.org/user/ua!"01# 6roducir,a el siguiente array0 array("user"# "$uan2%&'") Entonces, si hubiese estado de#inido como0 $urls = array( "/!/user\/[0-9|a-z|A-Z]{1,}/" => "/usuarios/user/ver" ); El Application Handler llamar,a al recurso ver del modelo user perteneciente al m$dulo de usuarios, siendo dicha llamada e!uivalente a0 $slug(data = array("user"# "$uan2%&'"); $controlador = ne) *ser+ontroller(); $controlador,>$er%$slu&'data(; =CUANDO SE ACTI(A> El enrutador del Application Handler, siempre intentar, en primera instancia, invocar a un m$dulo&modelo& recurso. -olo cuando la UR5 est mal #ormada o sea ine"istente, se #ijar si e"iste un archivo llamado urls.php en la ra, de la aplicaci$n ( comprobar si la UR5 recibida coincide con alguna de las claves del arra(. El enrutador considera !ue una "#$ est% &ien orma!a si res'eta e( ormato /)*dulo/)odelo/recurso-.argumento/. 7oda UR5 !ue no respete dicho #ormato, ser considera UR5 mal #ormada. SLUG HACK MOSTRAR UNA (ISTA POR DEFECTO SIN REDIRECCIONAMIENTO En el array $urls se debe crear la siguiente e"presi$n regular0 $urls = array( "/!/$/" => "/ruta/a/vista/por/de0ecto" ); The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 6 Luego, en la secci$n 1PP23+14356 del archivo con0ig.ini de la aplicaci$n, se debe establecer el valor de la directiva 7891*24(:38; en 1 7891*24(:38; = / RECUPERAR UN OB,ETO A PARTIR DE UN SLUG SIN CONTAR CON SU ID 6uede ser el caso de una UR5 #ormada solo por la denominaci$n de un determinado objeto, como en el ejemplo del usuario /user/$uan2%&'. En un caso como este, en el controlador puede emplearse a )ata%andler 8 para recuperar al objeto sin contar con su 5), utiliando el mtodo #ilter. 0unction ver($data=array()) < $opt = array("0lags"=>93248=(921>(?4=3P(@3>@); $user = isset($data-&/) A 0ilter(var($data-&/# 93248=(?16343B8(?P8+312(+@1=?# $opt) C ""; $oD$(user = +atta,a!dler%-user-, +,'/012A3'045673(-8f9lter%:!a)e;$user:(< #... E Hagamos la diferencia Estudiantes de sistemas de todo el mundo de habla hispana, cuentan con mi(es !e recursos (i&res para enri!uecerse pro#esionalmente !ue so(o son 'osi&(es 'or e( esuer)o * !e!icaci+n !e ,ui-nes 'onemos nuestro conocimiento a( servicio !e (a comuni!a!. 6or m,nima !ue sea tu donaci$n, me a(udas a continuar aportando conocimiento a todos los estudiantes ( pro#esionales de sistema !ue lo necesitan para el #uturo de sus carreras. Entre todos, PODEMOS hacer una gran diferencia
The .rigina( /ac0er La revista 3edici$n mensual en 6)94 The .rigina( /ac0er 1i&rar* Biblioteca de recursos para estudiantes de in#ormtica Euro'io Engine :otor de so#tware para aplicaciones :;< modulares en 6%6 2ac0TheStri''er Deployer para servidores con n#asis en seguridad 8 ;er art,culo sobre 3mani'u(aci+n !e !atos con 4ata/an!(er5 en The .rigina( /ac0er N67 descargando el paper desde este enlace0 http011librar(.originalhac=er.org1search1datahandler The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 7 INGENIER'A DE SOFTWARE Y ESTRUCTURAS DE DIRECTORIOS DEFINITI(AS EN APLICACIONES M(C MODULARES LO PADEC' DURANTE A?OS+ DURANTE A?OS ME DEDI*U; A IN(ESTIGAR Y TRATAR DE DESCUBRIR UN ES*UELETO *UE RESULTASE TAN PTIMO COMO IRREFUTABLE+ LA CREACIN DE EUROPIO ENGINE ME AYUD MUCHO EN EL HALLA&GO DE UNA RESPUESTA Y AHORA, TRAS DOS A?OS DE CONSTANTES PRUEBAS SOBRE ALGO M:S DE 73 APLICACIONES CREADAS, PUEDO CONTARLES MI PROPUESTA SIN MIEDO A COMETER ERRORES+ nredos, desprolijidades, decisiones >provisorias para siempre?, son solo algunas de las tantas causas !ue generan el malestar ( la desesperaci$n !ue todo programador padece de #orma permanente en su carrera como desarrollador de -o#tware ( a pesar de haber le,do los mejores libros, estudiado con los mejores docentes, seguido los mejores consejos ( haberse mantenido actualiado sobre los *ltimos avances en tecnolog,a, la desgastante sensaci$n nunca desaparece. E 6arece una introducci$n ir$nica, casi sarcstica, pero no lo es. Es la pura realidad !ue vivo d,a a d,a cuando reviso alg*n c$digo en @it%ub, intento hacer algo de ingenier,a inversa sobre alguna app o simplemente escucho padecer a mis alumnos. 6ues (a organi)aci+n !e( c+!igo uente, (a estructura interna !e una a'(icaci+n * su es,ue(eto, re'resentan e( 809 !e( -:ito !e una a'(icaci+n. A si alguna de estas #alla, el #racaso del -o#tware es un hecho inminente. LA IMPORTANCIA CONTAR CON UN SISTEMA BIEN ORGANI&ADO Las bases de una aplicaci$n modular, no son solo un #ormalismo tcnico de moda. 6or consiguiente, sus principios de 'orta&i(i!a!, enca'su(aci+n e in!e'en!encia, deben ser respetados sin margen de error. Un sistema modular es a!uel !ue se compone de un n*mero desconocido de aplicaciones denominadas >m$dulos? ( !ue permite la incorporaci$n o eliminaci$n de un m$dulo sin alterar en absoluto las aplicaciones The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 8 restantes. )e esta #orma, un sistema modular !ue ho( cuenta con un m$dulo de ventas ( otro de costos, maBana podr contar con un m$dulo e"tra de seguridad social sin !ue los m$dulos de ventas ( costos se vean a#ectados. 6or otra parte, es norma inviolable, !ue un sistema modular cuente con un n*cleo independiente, !ue pueda mantenerse, actualiarse ( modi#icarse sin !ue ello a#ecte a los m$dulos del sistema. 6or supuesto !ue todo esto no se logra solo con una estructura interna coherente. 6ero igual de cierto es, !ue contar con un es!ueleto irre#utable, nos soluciona el CDE del problema. PROPUESTA ESTRUCTURAL <omo coment al principio, tras un largo per,odo de pruebas e investigaciones, logr dar con una estructura !ue al momento, a demostrado dar los mejores resultados. Esta estructura !ue propongo no es nueva. 6arte de ella puede verse sugerida por grandes autores como ;artin <o=(er 4 ( aplicada por numerosos frameworks en di#erentes lenguajes. Ao simplemente he tomado esta ar!uitectura ( he creado un h,brido !ue toma lo mejor de sta sumando unos to!ues propios mu( sutiles. E"teriormente, el es,ue(eto estructura( !e un sistema mo!u(ar ;>C 3independientemente del lenguaje con el !ue se encuentre creado4, deber,a verse e"actamente como el siguiente 3algunos nombres pueden variar40 . FGG appsH Aqu se almacenarn todas las aplicaciones (mdulos) del sistema FGG common I FGG custom I JGG liDs FGG core FGG staticH Destinado al almacenamiento de archivos estticos JGG tests Los asteriscos F indican !ue el nombre del directorio puede variar SOBRE LOS NOMBRES (ARIABLES El directorio apps tiene por objetivo el almacenamiento de los m$dulos del sistema 3ms adelante veremos su estructura interna4. 6or lo tanto, nombres como applications ( modules tambin son vlidos. Es importante !ue se conserve un nombre el plural, puesto !ue la estructura de directorios de un sistema, es tambin una #orma de documentaci$n. Los nombres en ingls representan una sugerencia universal !ue puede ser bien entendida por cual!uier programador1a independientemente de su nacionalidad o procedencia. El directorio stat9c debe ser una carpeta #cilmente trasladable 3portable4 cu(o *nico objetivo sea el almacenamiento de archivos estticos inherentes a la @U5 del sistema. 6or lo tanto, admitir nombres tales como media, site(media, static(server, etc. dependiendo del tratamiento !ue dicho directorio #uese a tener. G http011www.martin#owler.com The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 9 static FGG css FGG html FGG img FGG $s s=-ad)9!-$" FGG s>!tha?hl JGG En el ejemplo anterior, los directorios sD,admin,v2 ( synthaxhl corresponden a librer,as de terceros ( por lo tanto, su estructura interna ha sido conservada. SOBRE LA FINALIDAD DE LOS DIRECTORIOS La #inalidad de las carpetas apps ( static #ue e"plicada anteriormente. <on respecto a las restantes, nos encontramos con los directorios common ( core, los principales del sistemas ( por ello es mu( importante entender la di#erencia entre ambos. El directorio core tiene como *nica #inalidad el almacenamiento de archivos ( librer,as del n*cleo de la aplicaci$n. -on archivos del n*cleo, todos a!uellos !ue resulten in!is'ensa&(es 'ara e( arran,ue * uncionamiento !e( sistema ( !ue a la ve 'ue!an ser 'orta!os a otro sistema sin re,uerir mo!iicaciones. -i un archivo del core re!uiriese un m,nimo cambio para servir a otro aplicaci$n, ser,a un error !ue podr,a deberse a0 La necesidad de generar una directiva de con#iguraci$n variableH La necesidad de mover el archivo #uera del n*cleoH El directorio co))o! suele ser similar al directorio core en el sentido de !ue todo el sistema necesita de l para #uncionar. -in embargo, a pesar de su naturalea esencial, todos los archivos son comunes al sistema en el !ue se encuentran pero su portabilidad hacia otro sistema ser,a imposible. Es decir, !ue se trata de archivos * (i&rer?as comunes a( sistema ,ue (os contiene 'ero no a otro, incluso aun!ue la similitud entre dos o ms sistemas se vea a#ectada por la casualidad de dicha similitud, a reutiliar archivos de un common. 9inalmente nos encontramos con la carpeta tests, claramente destinada a las pruebas unitarias del sistema. Es sumamente importante !ue aun!ue el e!uipo de desarrollo a*n no ha(a logrado implementar tcnicas de programaci$n avanadas como 7)) o pruebas unitarias, inclu(a esta carpeta en los sistemas !ue diseBe, pues servir en un #uturo al tiempo !ue sirve como #orma de respuesta rpida a si se cuenta o no con tests. Il ver esa carpeta vac,a, con una sola vista rpida, el programador podr saber !ue el sistema no cuenta con pruebas unitarias ( !ue no ha sido desarrollado mediante 7)). DIRECTORIOS POR DENTRO La estructura interna de cada directorio, var,a de acuerdo al mismo ( a #actores inherentes al pro(ecto. -in embargo, ciertas normas ( sub&carpetas debern ser respetadas como se describe a continuaci$n. <omenar The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 10 por lo ms simple e ir hacia lo ms complejo. Lo ms aconsejable para el directorio tests es !ue ste repli!ue la misma estructura de directorios !ue la del -U7. Esto permitir !ue al momento de empa!uetar el sistema para su distribuci$n, puedan suprimirse los tests sin ms es#uero !ue eliminar el directorio correspondiente. La estructura interna del directorio stat9c debe inde#ectiblemente !uedar a criterio de los diseBadores gr#icos ( maquetadores. -i no se contase con la e"periencia de pro#esionales gr#icos en el pro(ecto, puede emplearse una subestructura tradicional 3!ue no por ser tradicional ser la ms $ptima4 !ue garantice un orden m,nimo ( al mismo tiempo, #acilite su comprensi$n. 7radicionalmente, una estructura interna $ptima, ser,a a!uella !ue basase su organiaci$n en el tipo de archivos. 6ara ello, se podr,a contar con una carpeta por tipo de archivos estticos0 html, css, $s, img, audio, video, pd0, etctera. <uando se trabajase con plantillas o es!ueletos gr#icos prediseBados como Frameworks o soluciones tales como Bootstrap, ser aconsejable colocar dentro del directorio esttico la carpeta original de dicha librer,a, respetando su estructura interna intacta (a !ue esto simpli#icar el proceso de #uturas actualiaciones. La estructura interna del directorio core, claramente depende de #orma directa, del n*cleo !ue se utilice ( de c$mo ste ha(a sido creado. -i se tiene previsto desarrollar un n*cleo propio, lo ms aconsejable ser,a organiar los subdirectorios por responsabilidades (1o tipo de herramienta. Esto es e!uivalente a modulariar el n*cleo. Ilgunos ejemplos ser,an0 orm, sesiones, helpers, interfaces, etc. El directorio co))o!, sin dudas, es el !ue ma(or tendencia a la desorganiaci$n genera ( sin embargo, es el !ue ms necesita de una rigurosa disciplina en su estructura. <omo les digo a mis alumnos, la carpeta common debe organizarse con un rgimen militar!. La carpeta common suele poder resolver sus necesidades con + subdirectorios0 custom ( liDs ( jams deber,a tener archivos en la ra,, salvo contadas e"cepciones bien justi#icadas. I lo sumo, la estructura interna ms compleja !ue pueda verse en la ra,, podr,a verse como la siguiente0 common/ FGG core FGG custom FGG liDs FGG tools JGG plugins En esta estructura, cada subdirectorio cumplir,a una #unci$n espec,#ica0 co))o!/core@ respetando la estructura interna del core del sistema, su responsabilidad ser,a la de almacenar cual!uier e"tensi$n del n*cleo. Ejemplos de ellos podr,an ser clases heredadas del objeto de alg*n .R: o &ms com*n& herencia de helpers. The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 11 co))o!/custo)@ esta es la carpeta ms importante ( parad$jicamente la menos utiliada. La tendencia universal del programador, es descargar librer,as o herramientas de terceros ( con#undir la libertad !ue el -o#tware Libre nos da con una prctica de programaci$n. Jue un -o#tware sea libre ( permita modi#icar el c$digo no implica !ue e"ista una buena prctica de programaci$n !ue diga >modi#ica los archivos originales ( arruina la posibilidad de mantenerlos actualiados?. Los archivos de terceros 'I:K- deben modi#icarse. %acerlo obliga a mantener la misma versi$n del so#tware, por el resto de los d,as sin posibilidad de instalar actualiaciones, con todos los riesgos de seguridad !ue ello implica. El so#tware de tercero siempre !ueda intacto ( es en esta carpeta custom! !ue haremos los cambios necesarios. L<$moM -obreescribiendo lo menos posible a!uellas clases o #unciones !ue se deseen personaliar. Una buena tcnica ( mu( prctica consiste en crear una +ustom?ome+lass !ue herede de una ?ome+lass e"istente ( sobrescriba el mtodo !ue se !uiere modi#icar, invocando previamente 3siempre !ue sea necesario4 al mtodo parent correspondiente. <uando se tratase de una #unci$n, simplemente se crear,a una +uston?ome9unction para una ?ome9unction. co))o!/l9=s@ son todas las librer,as de terceros. co))o!/tools@ son todos a!uellos guiones 3scripts4 propios creados con #inalidades puntuales, como pueden ser generadores de backups, cleaners, #unciones para env,o de correo electr$nico, scripts ejecutados por el cron, etc. co))o!/plu&9!s@ los complementos suelen ser un tema mu( discutido ( el hacerlo tiene argumentaciones vlidas desde ambas partes. Un complemento es una aplicaci$n completa 3como un m$dulo del sistema4 pero !ue en ve de poder ser utiliada por un usuario es utiliada por el programador en el desarrollo de los m$dulos del sistema. )e esta #orma, un generador de #ormularios accesible por el navegador, !ue permita al usuario crear un #ormulario de contacto para el frontend de su sistema, ser,a un m$dulo mientras !ue una clase generadora de #ormularios !ue el programador utiliar,a en la l$gica de una vista para crear el #ormulario !ue el usuario utilice para generar los su(os, ser,a un plugin. 6or lo tanto, un plugin podr,a considerarse complemento del core 3es a!u, donde se discute4 ( la l,nea !ue marca la di#erencia es mu( delgada ( est dada por la respuesta a la pregunta "#i#ir$a una aplicaci%n sin este complemento&!. Un ejemplo claro est en 'uropio 'ngine. Il ser 'uropio un n*cleo propiamente dicho, el generador de #ormularios se considera un plugin (a !ue se podr,a crear cual!uier tipo de aplicaci$n (1o sistema prescindiendo de ste. -in embargo, si se creara un framework utiliando 'uropio 'ngine, el mismo generador de #ormularios !ue ho( se considera un plugin, deber,a #ormar parte de las herramientas del n*cleo del framework. ESTRUCTURA INTERNA DE UN MDULO Esta estructura #ue la !ue ms me cost$ hallar ( ms aBos me llev$ tanto investigar como probar ( evaluar resultados. The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 12 <uando se trata de una ar!uitectura :;<, claramente cada m$dulo tendr sus directorios models, vie)s ( controllers, pero ah,, no puede ni debe concluir el es!ueleto. Un m$dulo es un -o#tware completo. Llammosle micro&aplicaci$n si se lo desea, pero no deja de ser un so#tware !ue emplea un n*cleo com*n. <omo tal, tendr sus propios re!uerimientos ( necesidades ( por lo tanto, no 'o!r% 'rescin!ir !e (os siguientes archivos * !irectorios0 app,name/ FGG models/ FGG vie)s/ I JGG templates/ FGG controllers/ FGG helpers/ FGG con0ig.ini FGG con0ig.ini.dist FGG app,name.sKl FGG license JGG =817L8 La estructura anterior es la *nica !ue ha demostrado hasta el momento, verdadera capacidad de portabilidad. Entre los directorios, nos podremos encontrar con los siguientes destinos0 )odels/ almacenaje de todos los modelos de la aplicaci$n 3m$dulo del sistema4 $9eAs/ almacenaje de la parte l$gica de todas las vistas del m$dulo $9eAs/te)plates/ en caso de !ue el m$dulo posea templates %7:L personaiados 3!ue deban ser le,dos pero no servidos4 es aconsejable almacenarlos en este directorio, #acilitando as, la portabilidad del m$dulo. 7o!trollers/ almacenaje de los controladores del m$dulo helpers/ almacenaje de clases (1o #unciones a(udantes propias de este m$dulo Los archivos de la ra, del m$dulo, es aconsejable !ue sean solo ( *nicamente los propuestos, considerando !ue cada uno contar con la siguiente responsabilidad0 co!f9&.9!9 / co!f9&.9!9.d9st 7odo a!uel dato !ue pueda ser variable dependiendo del conte"to, debe setearse en una variable global o pre#erentemente, en una constante. Utiliar un archivo de con#iguraci$n por secciones, es una e"celente alternativa (a !ue la ma(or,a de los lenguajes, posee #unciones !ue permiten analiar este tipo de archivos 3parsing4 ( utiliar su in#ormaci$n. Un ejemplo de este archivo )EBE distribuirse 3portarse4 en un archivo de distribuci$n .dist The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 13 app-!a)e.sBl El m$dulo necesitar sus propias tablas en el sistema. Este archivo debe contener todas ( cada una de las instrucciones -JL necesarias para !ue con tan solo importar el archivo a una base de datos, se ejecuten las consultas re!ueridas para !ue el m$dulo #uncione sin rodeos. Una buena prctica es ir completando este archivo en tiempo real a medida !ue el desarrollo demande cambios en la )B. 16A+26 )e verdad, este es el archivo ms importante. 6uede ser un simple archivo de te"to con instrucciones cortas. <ada ve !ue el desarrollo demande un cambio de con#iguraci$n en la plata#orma, la instalaci$n de un so#tware, librer,a o herramienta de terceros, dicha in#ormaci$n se agregar en tiempo real en este archivo, bajo el t,tulo >re!uerimientos e instalaci$n? l9ce!se Un simple archivo de te"to con el nombre de la licencia bajo la cual se distribu(e el m$dulo ( pre#erentemente un enlace hacia el te"to de la licencia, ser la mejor #orma de portar ( distribuir micro aplicaciones. The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 14 HACK PARA EMULAR LA AUTOCARGA Y DESACTI(ACIN DE MDULOS DE UN SISTEMA COMO POL'TICA DE EMERGENCIA FRENTE A FALLOS INESPERADOS ACTI(AR Y DESACTI(AR MDULOS DE FORMA AUTOM:TICA, ES ESPECIALMENTE @TIL CUANDO EN PRODUCCIN SE HACE NECESARIO ACTUAR DE MANERA R:PIDA PARA RESOL(ER CONFLICTOS EN UN MDULO+ DE ESTA FORMA, DESACTI(ANDO UN MDULO TEMPORALMENTE, NOS DAR: A TIEMPO A RESOL(ER EL PROBLEMA EN PRODUCCIN, SIN PONER EN RIESGO A TODO EL SISTEMA+ s 8D de junio, tengo la edici$n #inaliada pero de pronto la necesidad de generar contenido *til se impone sobre la de cumplir con lo pactado. Entonces me dije Lpor !u no hacer una edici$n ms >temtica?. A as, surgi$ esta imperiosa necesidad de reeditar la revista a penas horas antes de su lanamiento, con el #in de o#recerles unas notas !ue en su conjunto, les puedan servir para aplicar a todo un pro(ecto. E En el art,culo de pgina 8, les comentaba sobre la estructura de directorios de#initiva !ue tras aBos de pruebas e investigaci$n, logr hallar para armar el es!ueleto irre#utable de una aplicaci$n modular. En el proceso de investigaci$n anterior, me es#orc por obtener resultados objetivos independientes del lenguaje. 5ncluso, me ocup de in#ormarme sobre las sugerencias !ue e"pertos en cada lenguaje propon,an ( de all, !ue pude tomar lo mejor de cada una. A en ese camino, hall la soluci$n a otro problema !ue les trasmito a continuaci$n. Una gran parte de los lenguajes algebraicos interpretados, cuentan con constructores !ue #acilitan desde la autocarga de clases 3el caso de 6%6 con la pr$"imamente obsoleta ((autoload N ( N http011www.php.net1manual1es1#unction.autoload.php The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 15 spl(autoload(register 2 4 hasta el tratamiento de directorios como pa!uetes 3el caso de 6(thon con el archivo ((init((.py4. <ada lenguaje tiene su >buenas ideas? ( sus a*n mejores mtodos ( de todos ellos es posible dejarse inspirar para obtener grandes soluciones propias !ue permitan mejorar la calidad de nuestros pro(ectos ( por sobre todo, del diseBo de nuestras aplicaciones. Este hack !ue les !uiero contar, permite activar * !esactivar !e orma autom%tica, !etermina!os m+!u(os !e nuestro sistema, con so(o a(terar un va(or !e orma &inariaA Esto puede ser mu( *til cuando trabajamos con soluciones modulares propias !ue al distribuirse pueden di#erentes re!uerimientos modulares. La solucin consiste en definir una directiva con valor binario, en el archivo de configuracin del mdulo la cual sea verificada al arrancar el sistema actuando en consecuencia. )e esta #orma, cada m$dulo del sistema podr,a contar con una variable 1*452517 dentro de una secci$n -1PP61L8/ del archivo de con#iguraci$n del m$dulo, cu(os valores posibles puedan ser & o %, 4rue o 9alse, 5n u 500 o cual!uier otro valor binario. ; Archivo: appname/confi.ini [ACCDA26] ; ... 1*452517 = & ; ! para activar" # para desactivar la autocara ; ... Il arrancar el sistema, un autoload propio recorrer el directorio de aplicaciones 3m$dulos del sistema4 ( preguntar si el valor de IU7.L.I) para cada m$dulo es el e!uivalente a encendido 3/4. )e ser as,, el auto& cargador del sistema, proceder a importar1cargar un archivo centraliador del m$dulo !ue deber,a incluirse en la ra, del mismo. )e esta #orma, desactivar un m$dulo del sistema consistir en establecer a D el valor de una *nica variable. Lo anterior puede tambin ser complementado a nivel gr#ico, recurriendo a la misma variable para saber si incluir o no en la inter#a gr#ica al m$dulo correspondiente. )e esta #orma, visualmente se activar,an o desactivar,an botones ( men*s 3entre otros complementos gr#icos4 con solo modi#icar el valor de una *nica variable. 2 http011www.php.net1manual1es1#unction.spl&autoload®ister.php The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 16 ESE CAPTCHA NO (ERIFICA A LOS HUMANOS, SINO *UE COMPRUEBA SU MIOP'A NO ME DIGAS SI ERES HUMANO+ SOLO EN('A ESTE FORMULARIO SI NO ERES MIOPE+ i la inteligencia arti#icial no va acompaBada de inteligencia real, de mu( poca utilidad resultar. - -e supone !ue la 5ngenier,a es la ciencia encargada de encontrar soluciones a problemas e"istentes, en un rea determinada. )e esta #orma, la 5ngenier,a de -o#tware, se encarga de encontrar soluciones in#ormticas a problemas determinados. -in embargo, (a im'(ementaci+n !e captchas ha su'uesto (a generaci+n !e un 'ro&(ema, resu(tan!o so(ucionar menos !e (o ,ue com'(ica. Un requisito de inteligencia debera ser la simplicidad -i una soluci$n no es simple, no deber,a ser considerada inteligente. 6ues la grandea e"iste en la simplicidad. <omo usuario de un sistema, seguramente padeciste la #rustraci$n de no lograr enviar un #ormulario e"itosamente por!ue has #allado acertando la respuesta al captcha o peor a*n, por!ue tu tiempo de sesi$n ha e"pirado. <omo programador1a Bte '(anteaste a(guna ve) ,ue si (os captcha han si!o crea!os 'ara !escartar ro&ots cometen un error a( e:'irar 'uesto ,ue (os humanos 'or natura(e)a 'rocesamos (a inormaci+n m%s (ento ,ue un or!ena!orC La idea de los captcha siempre me gust$ ( me result$ sumamente interesante, conceptualmente hablando. 6ero ni su propuesta ni su implementaci$n me han resultado *tiles. )e all, !ue decid, crear mis propios captchas en mis aplicaciones, !ue solo veri#icasen !ue !uien pretende enviar un #ormulario sea humano ( no, !ue no sea miope. Los captchas, en su ma(or,a, utilian imgenes generadas al aar a #in de !ue la respuesta no pueda ser le,da por un ordenador. -in embargo, la inteligencia arti#icial &al menos en niveles accesibles& no ha alcanado a >raonar? como lo hacemos los humanos. Esto, signi#ica !ue un ordenador, no ser,a capa, por ejemplo, de The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 17 raonar lateralmente, de entender el sarcasmo o dis#rutar de un chiste. Entonces Lpor !u no utiliar te"to plano ( preguntar de !u color es un albarico!ue violetaM Lo admito. Oo se !u es un albarico!ue 3(a lo buscar en el diccionario4, pero s, so( capa de deducir !ue la respuesta correcta a la pregunta anterior es violeta. A no necesit hacer es#ueros, claro est. =CMO CREAR UN CAPTCHA EN TE%TO PLANO *UE SOLO PUEDA SER RESPONDIDO POR HUMANOS> Lo *nico !ue necesitas es generar tus propias preguntas ( respuestas. <uanto ms #cil sea la pregunta, mejores resultados obtendrs. -e necesitar,a una base de datos para hallar las respuestas por un ordenador o un algoritmo de inteligencia arti#icial altamente avanado, pero a*n no ha sido desarrollado 3aun!ue s, investigado4. Las mejores preguntas sern a!uellas impli!uen el cumplimiento de ciertas consignas. 6or ejemplo >d,game cuantos dedos ha( en una mano pero no utilice n*meros?. %asta un niBo pe!ueBo podr,a responder >cinco?. LA BASE DE DATOS La lista de preguntas ( respuestas puede ser almacenada en una base de datos tradicional, o mejor a*n, en un archivo de te"to plano !ue consuma menor cantidad de recursos. En este *ltimo caso, se deber decidir un #ormato identi#icador para el conjunto&par pregunta&respuesta. :i pre#erido es colocar un par por l,nea ( respuesta separada de pregunta por un pipe. Pregunta & . =espuesta & Pregunta 2 . =espuesta 2 Pregunta M% . =espuesta M% de esta #orma, el carcter divisor de pares ser el salto de l,nea ( el de pregunta&respuesta, el pipe. LA OBTENCIN DE UNA PREGUNTA La pregunta debe ser algo elegido al aar (a !ue el aar di#iculta la generaci$n de cracks. Las #unciones random del lenguaje, son *tiles en estos casos. Un ejemplo en 6%6 podr,a verse como el siguiente0 # Almaceno el contenido de la $ase de datos en un arra% (salto las lneas en $lanco) $ro)s = 0ile("dataDase"# 9328(?N3P(8LP4O(2368?); # &enero un entero al a'ar para utili'ar lueo como ndice $random = rand(%# count($ro)s) , &); # ($teno el par preunta)respuesta $par = $ro)s-$random/; The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 18 # *eparo la preunta de la respuesta list($pregunta# $respuesta) = explode("."# $par); CAPTURAR LA RESPUESTA SIN RE*UERIR SESIONES Il usuario mostraremos la pregunta0 PAphp echo $pregunta; A> A por l$gica, o#receremos una #orma de indicar la respuesta, mediante un campo de #ormulario0 Pinput type="text" name="respuesta"> 6ara luego validar la respuesta 3sin re!uerir almacenarla previamente en una sesi$n4 necesitaremos una #orma de capturar la respuesta ( saber a !u pregunta pertenece. 6ara ello, podremos recurrir al n*mero de ,ndice almacenndolo en un campo oculto 3aun!ue esto ser,a algo bastante vulnerable40 Pinput type="hidden" name="random(Kuestion" value="PAphp echo $random; A>"> 6ara hacerlo menos vulnerable, podr,a crearse un token para este campo, el cual se guardase temporalmente en un archivo junto al inde( correspondiente0 $toQen = mdM(uniKid(mt(rand()# 4rue)); 0ile(put(contents("/private/dir/$toQen"# $random); Luego, lo !ue ser,a almacenado en el hidden, ser,a el to=en0 Pinput type="hidden" name="random(Kuestion" value="PAphp echo $toQen; A>"> de esta #orma, se podr,a capturar la respuesta ( la pregunta a travs de su to=en. (ALIDAR LA RESPUESTA -i se ha generado un to=en, obtendremos el inde( de la respuesta a travs de la lectura del archivo >to=eniado?0 The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 19 $opt = array("0lags"=>93248=(921>(?4=3P(@3>@); $user(toQen = isset($(P5?4-"random(Kuestion"/) A 0ilter(var( $(P5?4-"random(Kuestion"/# 93248=(?16343B8(?P8+312(+@1=?# $opt) C "null"; $indice = null; $0ile = "/private/dir/$user(toQen"; i0(0ile(exists($0ile)) $9!d9ce ; f9le'&et'co!te!ts%$f9le(< Una ve obtenido el ,ndice, solo es cuesti$n de repetir los pasos con los !ue se obtuvo la pregunta para obtener la respuesta ( compararla0 $ro)s = 0ile("dataDase"# 9328(?N3P(8LP4O(2368?); $par = $ro)s-$9!d9ce/; list($pregunta# $respuesta) = explode("."# $par); i0($respuesta == $respuesta(dada(por(el(usuario) < # todo correcto ... E else < # respuesta equivocada ... E Ilternativamente, dado !ue no necesitamos conocer la cantidad de datos alojados en el archivo, para localiar la respuesta podemos recurrir al mtodo seeQ de ?pl9ile5D$ect0 $dataDase = ne) ?pl9ile5D$ect($0ile); $dataDase,>seeQ($indice); $respuesta = $dataDase,>current(); Il #inaliar toda la comprobaci$n, es aconsejable liberar espacio en disco eliminando el archivo creado. Oo obstante, una tarea programada en el cron !ue se ejecute de #orma peri$dica en busca de archivos antiguos 3de un / d,a de antigPedad o ms4 para eliminarlos, ser,a un complemento ideal. Lectura recomendada Emu(aci+n !e to0ens !e seguri!a! tem'ora(es 'ara e( registro !e usuarios http011librar(.originalhac=er.org1search1to=en The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 20 ACE#T$2.@ Lsuicidio, homicidio o un caso para >:older ( -cull(?M Un e!uipo de investigadores encuentra en una habitaci$n completamente vac,a, carente de ventanas ( con la *nica puerta cerrada con un pestillo desde el interior, a un hombre ahorcado con una soga amarrada de una biga ubicada a G mts del suelo ( a +D cm del techo. I los investigadores, llam$ poderosamente la atenci$n, haber encontrado el suelo lleno de agua, teniendo en cuenta !ue en toda la habitaci$n, no hab,a caBer,as ni ning*n otro objeto ms !ue las paredes, el techo, el suelo, el occiso, la soga, la biga ( la puerta con su pestillo. L<$mo logr$ colgarse el occisoM A*u!a@ los investigadores hallaron la respuesta en el agua encontrada en el suelo de la habitaci$n. Responde ANTES del 20D0ED2014 a travs de T=itter utiliando el hashtag FAcertiGoT./E E( nom&re !e (os gana!ores ser% 'u&(ica!o en (a siguiente e!ici+n La respuesta correcta ser publicada en 7he .riginal %ac=er OQC junto con los ganadores
S.1"C$HN A1 ACE#T$2. 4E T/E .#$I$NA1 /ACJE# N67 Esta ve no nos ha ido tan bien con el acertijo. 6or si no lo recuerdas, el mismo dec,a >6or /, 'uan deb,a pagar RN ( lo mismo !ue paga por / lo paga por N. 6or /N, el precio era de R/D pero por /DD, de R/N. LJu estaba comprando 'uanM? ( la respuesta, estaba en la misma a(uda0 >I(uda0 !ue los nKmeros no te engaBen....?. S'uan estaba comprando n*merosT Los n*meros !ue compraba podr,an haber sido los !ue se colocan en las puertas de las casas para identi#icar un domicilio o hasta incluso velas de cumpleaBos. Esta ve no ha( ranking de ganadores. -olo podemos mencionar la respuesta ms acercada, !ue nuevamente, ha sido la del >#uturo #iel seguidor? del FAcertiGoT./, L!iego!e(avega S9elicitacionesT En la simplicidad se encuentran las verdaderas respuestas El UCE de las personas estudia para ampliar sus conocimientos. 6ero tu, puedes ser parte del otro +E. w w w . c u r s o s d e ' r o g r a m a c i o n a ! i s t a n c i a . c o m c l a s e s i n d i v i d u a l e s V p e r s o n a l i a d a s p a r a e l + E ! u e b u s c a l l e g a r m% s a ( ( % ! e ( c o n o c i mi e n t o FREE AS IN FREEDOM LA (ERDADERA ;TICA HACKER Oecesitamos vivir en un mundo donde el acceso al conocimiento sea 1$B#EH donde la so(i!ari!a! con el vecino O. sea $1MC$TA. )ebe dejar de condenarse el compartir conocimiento con nuestros seres !ueridos ( allegados. EA B!C"0 e1$D en $u1 C!n01, #!y CuB#0 Eue Fue4e1 #!Be2+ DILE A MO&ILLA *UE NO INCORPORE EL DRM DE ADOBE A FIREFO% -$lo una semana despus del ),a 5nternacional contra el )R:, ;o)i((a anunci+ ,ue a'o*ar% (a Iesti+n 4igita( !e #estricciones en su navega!or <ireo:, el cual tendr una utilidad incorporada !ue obtendr e instalar automticamente los )R: de Idobe. EN>MA1E "N E-;A$1 A AN4#EAS IA1 3<7. de :oilla4 hacindole saber !ue te opones al )R:. CANCELA TU CUENTA EN NETFLI% GYO LO HICEH %ace un aBo atrs, enterada de !ue Net(i: so(o 'ermitir?a (a re'ro!ucci+n !e v?!eos en navega!ores extensiones premium Nas? ((amaron a( 4#;O cancel mi suscripci$n anual Lpor !uM 6or!ue la libertad de toda una comunidad )EBE valer ms !ue cual!uier serie %). I<<E)E I 7U <UEO7I )E OE79L5W ( EN>MA1ES "N ;ENSA2E CANCE1AN4. T" S"SC#$PC$HN. Anuncia tu !ecisi+n en T=itter ( tus redes sociales. NO USES DISPOSITI(OS *UE PROHIBEN COMPARTIR TUS PROPIOS ARCHI(OS CON LIBERTAD GYO NO LOS USOH Ama)on Jin!(e, iPa!, iPo!, iPhone ( dems dispositivos de Ipple inclu(en una @esti$n )igital de Restricciones !ue !aQa (a (i&erta! !e (as 'ersonas. )ispositivos con Indroid Stambin son peligrososT RN. 1.S "SESS UTILI&AR SOFTWARE PRI(ATI(O O DISPOSITI(OS CON RESTRICCIONES Y DECIR *UE APOYAS EL SOFTWARE LIBRE, ES CINISMO+ UN HACKER ;TICO ES A*UEL *UE ES COHERENTE CON LO *UE DICE Y HACE+ HACKTI(ISMO ;TICO LAS SIGUIENTES COMPA?'AS HACEN DA?O A LA LIBERTAD DE LAS PERSONAS Los siguientes logotipos (1o isotipos son propiedad registrada de cada una de las empresas mencionadas ( se utilian en este a#iche sin permiso de las mismas. :ediante sus plata#ormas Xindle ( 6rime. 1eer m%s 5 Ipple utilia el )R: para controlar i.- ( a los usuarios de .- W. 1eer m%s 5 El )R: se incorpora en el cora$n de Yindows ( muchos servicios como -ilverlight, imponen el )R: en los usuarios. 1eer m%s 5 Oo satis#echo con el uso de )R: para su servicio de streaming, ahora Oet#li" est tratando de imponer el )R: en la Yeb. 1eer m%s 5 -on( ha utiliado acciones legales para hostigar e intimidar a las personas !ue han modi#icado sus sistemas 6-8. 1eer m%s 5 SI DE (ERDAD APOYAS EL SOFTWARE LIBRE, @SALO, PROMU;(ELO Y ABANDONA LO PRI(ATI(O SIN E%CUSAS+ EL CAMBIO EST: EN TUS MANOS+ 1407011352019 1407011352019 7