@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, ,u30)Ag01$0 45.6 'NDICE DE LA EDICIN NRO7 PHP Y EL MANE,O DE OB,ETOS EN MEMORIA++++++++/ PHP8 HACKING, DEBUGGING O SIMPLEMENTE DI(ERSIN+++++++++++++++++++++++++++++++++++++9 SOFTWARE LIBRE Y LA DIFERENCIA CON EL SOFTWARE PRI(ATI(O DESDE UNA PTICA INTR'NSECAMENTE PROFESIONAL Y NO POL'TICA+++++++++++++++++++./ LA ORIENTACIN A OB,ETOS Y SUS ENFO*UES COMO ESTILO Y PARADIGMA++++++++++++++++++++++++++.9 The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 3 PHP Y EL MANE,O DE OB,ETOS EN MEMORIA Eugenia Bahit agradece a Hugo (@huguidugui) por la revisin ortogrfica de este artculo EL PRESENTE ES UNA TRANSCRIPCIN ADAPTADA DEL INTERCAMBIO DE IDEAS SOBRE OB,ETOS Y REFERENCIAS EN LA ESTRUCTURA FOREACH, SURGIDAS EN LA CLASE DE PHP A(AN&ADO CON %ABI PICO URISABEL+ l tratamiento que PHP hace de los objetos a bajo a nivel, es realmente sorprendente y necesita sin dudas un apartado especial. !i bien en la documentaci"n o#icial de PHP se habla sobre el manejo que el lenguaje hace de los objetos en la memoria aclarando que $stos en realidad, no son pasados por re#erencia %ver& http&''php.net'manual'es'language.oop(.re#erences.php), considero necesario dar una e*plicaci"n m+s a #ondo con ejemplos concretos puesto que no es algo #+cil de relacionar. ,e hecho, #ue lo que nos sucedi" no hace mucho, a Xabi i!o "risabe# $%&abi'i!( y a m- en medio de una clase de PHP y que nos llev" a hacer una investigaci"n m+s pro#unda sobre los objetos bas+ndonos en ejemplos concretos. .uando se crea un objeto /asign+ndolo a una variable de tipo $a = new A();/ la variable $a se almacena en memoria pero el valor de $a no es el objeto en s- mismo, sino un puntero hacia el objeto A. 0r+#icamente estar-a sucediendo algo como esto& --------+----------- D1 | D2 --------+----------- obj A | $a = D1 --------+----------- 1la l-nea de arriba representa una direcci"n de memoria #icticia y la de abajo, el dato almacenado en ella2 3o interesa si los objetos creados se asignan solo a variables o $stas, adem+s, se introducen en un array4 los elementos del array continuar+n apuntando a la direcci"n en memoria del objeto, ya que la variable lo hace& $c = array($a); The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 4 --------+-----------+------------- D1 | D2 | D3 --------+-----------+------------- obj A | $a = D1 | $c[0] = D1 --------+-----------+------------- ntonces, si yo creo un alias de $c[0] 1como el alias generado en la estructura foreach mediante el constructor as2, ese alias tambi$n estar-a apuntando a la direcci"n de memoria del objeto. Porque si bien el as crea variables al vuelo, no les otorga un valor a las mismas en caso de ser objetos sino que como valor, le otorga un puntero hacia la direcci"n de memoria del objeto. Por este motivo, #os ob)etos 'ue*en mo*i+i!arse me*iante foreach sin ne!esi*a* *e ser 'asa*os 'or re+eren!ia, sto podr-a e*plicar adem+s, que si bien lo siguiente agrega la propiedad foo al objeto A& php c!ass A " # php $a = new A(); php $b = new A(); php $c = array($a$ $b); php $c[0]->foo = 'bar'; php pr%n&'r($a); A (bjec& ( [foo] = bar ) 5l destruir la variable $a igual se conserve el objeto& php unset($a); php pr%n& %sse&($a) ) *+r,e* - *.a!se*; .a!se php print_r($c); Array ( [0] = A (bjec& ( [foo] => bar ) [1] = A (bjec& ( ) ) Porque en memoria, estar-a pasando esto& The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 5 --------+-----------+------------- D1 | D2 | D3 --------+-----------+------------- obj A | /0123ADA | $c[0] = D1 --------+-----------+------------- Por lo tanto, siempre que se est$ haciendo re#erencia al objeto, ser+ $ste quien sea modi#icado y no la variable que lo contiene& php c!ass A " # php $a = new A(); php $a-foo = *bar*; php pr%n&'r($a); A (bjec& ( [foo] = bar ) php $b = array($a); php foreach($b as $obj) $obj->foo = strtoupper($obj->foo); php pr%n&'r($a); A (bjec& ( [foo] => BAR ) Por ejemplo, en el caso anterior, la estructura foreach itera sobre un array, construyendo el alias sobre el objeto propiamente dicho. Por lo tanto, $ste ser+ un puntero hacia la direcci"n en memoria del objeto y por ese motivo, es que el pr%n&'r() #inal lo muestra modi#icado. !in embargo, si en ve6 de iterar sobre el array, se iterase directamente sobre el objeto, el alias se estar-a construyendo sobre las propiedades del objeto y no sobre el objeto mismo. so e*plicar-a porqu$ en ese caso, solo podr-a modi#icarse el objeto si el valor de la propiedad es pasado por re#erencia& php > # sin pasar el valor de la propiedad por referencia php foreach($a as $proper&y=$a!ue) $4a!,e = s&r&o!ower($4a!,e); php pr%n&'r($a); A (bjec& ( [foo] = 1A3 ) php > # ahora, pasando el valor de la propiedad por referencia php foreach($a as $proper&y="$a!ue) $4a!,e = s&r&o!ower($4a!,e); php pr%n&'r($a); A (bjec& ( [foo] = bar ) s tambi$n de hacer notar, que e# -mbito *e #os ob)etos es in*e'en*iente a# -mbito *e #as variab#es, The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 6 puesto que el mismo, jam+s deja de ser puntero hacia la memoria in!#uso a.n *entro *e una +un!i/n. s decir, si creo por ejemplo un array $c con dos objetos $a y $b y los paso a una #unci"n foo() como par+metro $5, si $a se encuentra en D2 apuntando a D1, el primer elemento de $c, se encontrar-a en D3 apuntando a D1 y si lo paso como $5, $5 estar-a en D4 apuntando tambi$n a D1. sto supone poder modi#icar al array indirectamente si lo que se modi#ica es el objeto, sin necesidad de ser pasado por re#erencia. php c!ass A " # php $a = new A(); php $b = new A(); php $c = array($a$ $b); php php function foo($#) $ $#[0]->bar = %&'; ( php foo($c); php php pr%n&'r($a); A (bjec& ( [bar] => %&' ) Para ampliar la in#ormaci"n sobre las re#erencias, recomiendo leer la siguiente secci"n del manual de PHP& http&''php.net'manual'es'language.re#erences.php The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 7 PHP8 HACKING, DEBUGGING O SIMPLEMENTE DI(ERSIN Eugenia Bahit agradece a Hugo (@huguidugui) por la revisin ortogrfica de este artculo EL PRESENTE PAPER REFLE,A DI(ERSOS MECANISMOS IMPLEMENTADOS SOBRE SCRIPTS DE PHP PARA ANALI&AR EL USO DE MEMORIA DE FORMA E%PERIMENTAL Y POR LO TANTO SOLO DEBEN SER TOMADOS COMO UN CURIOSO E%PERIMENTO+ i te gusta e*perimentar, anali6ar y dejarte llevar por un esp-ritu de curiosidad e*trema, jugar a debuggear y anali6ar internamente lo que sucede cuando ejecutas un script PHP, puede ser muy divertido. ! !i bien PHP es un lenguaje interpretado y de alto nivel que no permite e#ectuar un verdadero debug desde el propio c"digo 1por ejemplo, no puedes saber en qu$ direcci"n de memoria se est+ escribiendo determinado valor2, con apenas conocer el 7, del proceso del script puedes comen6ar a divertirte. ADVERTENCIA: el contenido de este paper solo es de inters para el disfrute satisfaccin personal de uien se de!a in"adir por la curiosidad# $uera de ello% carece de toda utilidad! INTRODUCCIN 8ediante el siguiente comando se puede obtener una lista de procesos relacionados con cualquier b9squeda, como por ejemplo, php& ps a,6 | 7rep php !in embargo, podr-a tratarse de una lista e*tensa que se deber-a #iltrar manualmente o mediante e*presiones regulares. Por ejemplo& si estoy ejecutando un script llamado f%!e18php mediante el usuario eugenia, podr-a #iltrar la b9squeda de #orma mucho m+s precisa mediante lo siguiente& ps a,6 | 7rep -2 9e,7en%a:s; [0-<]; 8;php: f%!e18php9 .on los comandos anteriores obtendr-amos solo la l-nea correspondiente al proceso de nuestro script& The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 8 e,7en%a 2=>0= 08> 083 ?2>00 @@00 p&sA= B+ 13-30 0-00 php f%!e18php !i quisi$ramos :hilar m+s #ino; a9n, podr-amos obtener solo el 7, del proceso si partimos la cadena en palabras. Para ello, guardaremos la ejecuci"n del comando en una variable que utili6aremos luego para e*traer el 7,& p=(Cps a,6 | 7rep -2 9e,7en%a:s; [0-<]; 8;php: f%!e18php9C) ; echo $"p[1]# PHP Y EL USO DE MEMORIA l 7, del proceso puede ser 9til para conocer el uso de memoria de un script. e,7en%aDco888-$ p=()ps au* + ,rep -- .eu,enia/s0 [0-1]0 20php/ fi!e%2php.)); echo $$p[%]( 2<0?3 e,7en%aDco888-$ ca& AprocA2<0?3As&a&,s EaFe- php B&a&e- B (s!eep%n7) -- estado del proceso (1) +7%5- 2<0?3 G%5-2<0?3 GG%5- 2=2>3 +racerG%5- 0 H%5-1000 1000 1000 1000 I%5-1000 1000 1000 1000 .DB%Je- 2K> Iro,ps- ? 2? 2@ 30 ?> 10? 10< 12? 1000 LFGeaM- ?31?? M1 -- tamao mximo de memoria virtual LFB%Je- ?2>00 M1 -- tamao total de memoria virtual en uso LF/cM- 0 M1 LFG%n- 0 M1 LFNOP- @@0? M1 LF3BB- @@00 M1 -- uso real en memoria fsica LFDa&a- 11=1> M1 -- tamao del segmento de datos en memoria virtual LFB&M- 13> M1 -- tamao de la pila en memoria virtual LF26e- @>=0 M1 -- tamao del texto en memoria virtual LF/%b- 1=1=0 M1 LFG+2- =? M1 LFBwap- 0 M1 +hrea5s- 1 888 1<2 Los posibles estados de un proceso pueden ser& 3 = r,nn%n7 B = s!eep%n7 D = s!eep%n7 (pero no p,e5e %n&err,Fp%rse) Q = JoFb%e + = &race5 or s&oppe5 Para me*ir e# esta*o *e# 'ro!eso, se puede mantener :abierto; el script de varias #ormas& The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 9 <. invocando a la #unci"n s!eep(E) para retrasar & segundos la ejecuci"n =. invocando a la #unci"n rea5!%ne() para dejar el script abierto a la espera de una entrada del usuario 5lternativamente, se puede e#ectuar el an+lisis desde el propio script obteniendo la 7, del proceso con la #unci"n 7e&Fyp%5(). Luego, se invocar+ a she!!'e6ec() para correr los comandos que nos permitan visuali6ar el consumo de memoria. l siguiente ejemplo, compara el uso de memoria que se hace al crear un array e*tenso con di#erentes m$todos. P!2! un 2e1u3$!:0 0";e$<0 2e=0>en:0 e;e=u$!2 301 =?:g0 >e:!n$e PHP-CLI n=!n:0 un! nue<! n$e2@!A en =!:! e;e=u=?n+ $p%5 = 7e&Fyp%5(); pr%n& she!!'e6ec(spr%n&f(97rep -% 4Frss AprocARsAs&a&,s9$ $p%5)); $a = array(); $% = 0; wh%!e($% S= 102?;102?) $a[] = $%++; pr%n& she!!'e6ec(spr%n&f(97rep -% 4Frss AprocARsAs&a&,s9$ $p%5)); / !m"##$ %&'( )* !m"##$ 11+,,- )* / $p%5 = 7e&Fyp%5(); pr%n& she!!'e6ec(spr%n&f(97rep -% 4Frss AprocARsAs&a&,s9$ $p%5)); $a = array(); for($%=0; $% S= 102?;102?; $a[]=$%++); pr%n& she!!'e6ec(spr%n&f(97rep -% 4Frss AprocARsAs&a&,s9$ $p%5)); / !m"##$ %&'( )* !m"##$ 1'',,- )* / $p%5 = 7e&Fyp%5(); pr%n& she!!'e6ec(spr%n&f(97rep -% 4Frss AprocARsAs&a&,s9$ $p%5)); $a = ran7e(0$ 102?;102?); pr%n& she!!'e6ec(spr%n&f(97rep -% 4Frss AprocARsAs&a&,s9$ $p%5)); / !m"##$ %&'( )* !m"##$ 1'',(. )* / Para tener una idea apro*imada de !u-nta memoria !onsume e# !/*igo 'ro'iamente *i!ho y cu+nta es la :memoria inicial; consumida por PHP, te propongo reali6ar el siguiente e*perimento paso a paso& The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 10 <2 .rea un archivo llamado f%!e8php con el siguiente c"digo& S)php $p%5 = 7e&Fyp%5(); pr%n& she!!'e6ec(spr%n&f(97rep -% 4Frss AprocARsAs&a&,s9$ $p%5)); $a = array(); $% = 0; wh%!e($% S= 102?;102?) $a[] = $%++; pr%n& she!!'e6ec(spr%n&f(97rep -% 4Frss AprocARsAs&a&,s9$ $p%5)); s!eep(30); ) =2 .orre el archivo ejecutando& php -f f%!e8php >2 ?+pidamente, antes de transcurridos los >@ segundos del s!eep, ejecuta el siguiente comando para conocer el uso de memoria hecho por el script& p=(Cps a,6 | 7rep -2 98;php: -f: f%!e8php9C); pro%5=$"p[1]#; 7rep -% 4Frss AprocA $pro%5As&a&,s A2 5hora, abre el archivo nuevamente y borra todo el c"digo e*cepto la l-nea del s!eep() de #orma tal que el archivo se vea as-& S)php s!eep(30); ) (2 ?epite los pasos = y > y compara el uso de memoria. l mismo e*perimento puede reali6arse con di#erentes algoritmos y as- e#ectuar un an+lisis e*haustivo que permita e*traer conclusiones con#iables. Por ejemplo 0!u-nta memoria !onsume en rea#i*a* #a !rea!i/n *e variab#es1 Puedes contrastar el 9ltimo an+lisis contra el resultado del siguiente& S)php $a = 123?K>@=<0123?K>@=<0123?K>@=<0123?K>@=<0; s!eep(30); ) B ahora, para hacerlo m+s interesante, agr$gale un ,nse&() a la variable& The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 11 S)php $a = 123?K>@=<0123?K>@=<0123?K>@=<0123?K>@=<0; unset($a); s!eep(30); ) CDaya sorpresaE !ucede que unset() se #imita a *estruir #a variab#e a nive# *e script 'ero no #ibera #a memoria *e +orma inme*iata, 3o encontr$ una e*plicaci"n o#icial de lo que ocurre verdaderamente, pero la no o#icial ser-a que el recolector de basura de PHP liberar+ esa memoria en el momento que la necesite a #in. sto podr-a estar justi#icado por el hecho de que si la liberaci"n #uese inmediata, deber-a trabajar la .PF para hacerlo. !e puede e#ectuar una innumerable cantidad de pruebas incluso utili6ando herramientas mucho m+s completas que un simple 7rep. Por ejemplo, si eres de esas personas curiosas capaces de pasar horas y hasta d-as debuggeando'anali6ando #rente al ordenador, con s&race podr+s divertirte viendo qu$ es lo que va haciendo PHP mientras se ejecuta tu script 1personalmente me encanta ver el tra6o cuando llega al momento de dormir el script *,2& strace php f%!e8php Gambi$n puedes utili6ar& s&race -#3 php f%!e8php 1mi pre#erida2 para ver un debug propio de s&race y al #inal, un resumen de las di#erentes llamadas al sistema que PHP va haciendo. 7ncluso, puedes #iltrar las llamadas mediante& s&race -e rea#45rite php f%!e8php !&race, quien se utili6a del mismo modo que s&race, tambi$n puede resultarte tan enloquecedor como entretenido y si bien a la mayor-a resulta menos 9til que s&race, a mi me agrada mucho m+s& !trace php f%!e8php Htra alternativa es utili6ar 75b aunque a pesar del enorme cariIo que siento por 75b, para un script 1de PHP2 no suele ser demasiado 9til& The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 12 ,#b php y luego& (75b) run fi!e2php 888 TU Gro7raF rece%4e5 s%7na! B0I0E+$ 0n&err,p&8 06b@f55?2? %n ''Merne!'4sysca!! () (75b) bt V0 06b@f55?2? %n ''Merne!'4sysca!! () V1 06b@=f@50> %n nanos!eep () a& 88Asys5epsA,n%6Asysca!!-&eFp!a&e8B-=2 V2 06b@=f@aff %n ''s!eep (secon5s=0) a& 88Asys5epsA,n%6Asys4A!%n,6As!eep8c-13= 888 Luego, con pFap se puede ver el mapeo de memoria que hace el proceso de PHP& .orriendo el script por un lado con php -f f%!e8php, luego ejecutar& p=(Cps a,6 | 7rep -2 98;php: -f: f%!e8php9C); pro%5=$"p[1]#; p6ap -* $proi# OTROS RECURSOS BTILES, SIMPCTICOS Y)O CURIOSOS top *e# script2 .orrer el script y en paralelo ejecutar& p=(Cps a,6 | 7rep -2 98;php: -f: f%!e8php9C); pro%5=$"p[1]#; top -p $proi# /// 012 3#4" 0" 51 !1"6 "4# #7" # 8903 8:4: 61:4; 9<::=52 +.(, eugenia '. . 1,>m 11&m ,>%' # . -/> .$../%' php ps *e# script2 .orrer el script y en paralelo ejecutar& p=(Cps a,6 | 7rep -2 98;php: -f: f%!e8php9C); pro%5=$"p[1]#; ps -p $pro%5 -o Rcp,$RFeF$cF5 8903 8:4: 9:2 1(/+ -/' php -f file/php l porcentaje de .PF usado var-a de acuerdo al estado del 'cript. .u+nto m+s tiempo transcurre y el script duerme con el s!eep() menos uso de .PF habr+ mientras que el uso de memoria se mantiene impoluto. !i se utili6ase rea5!%ne() en lugar de s!eep podr-a ponerse en ejecuci"n el scr%p& mientras se corre el comando reiteradas veces a #in de ver como el consumo de .PF va llegando a 0. The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 13 SOFTWARE LIBRE Y LA DIFERENCIA CON EL SOFTWARE PRI(ATI(O DESDE UNA PTICA INTR'NSECAMENTE PROFESIONAL Y NO POL'TICA Eugenia Bahit agradece a Hugo (@huguidugui) por la revisin ortogrfica de este artculo ENSAYO SOBRE CMO DECIDIR TU FUTURO PROFESIONAL om9nmente, las personas con#unden los conceptos de :libertad; y :gratuidad; crey$ndolos sin"nimos. Pero a esta altura, todos deber-amos saber que no lo son. . !in embargo, no es mi responsabilidad como programadora, revertir esta garra#al con#usi"n y solo es algo que me interesa cuando :estoy de humor; para que me interese. 3o obstante, !omo miembro *e #a "ree #oft$are "oundation% *o!ente e instru!tora *e 'rograma!i/n es mi ob#iga!i/n e*u!ar a #os 'rograma*ores en esto, haci$ndoles entender que #a *i+eren!ia entre uno 3 otro no es una cuesti"n de :bandos; sino que es una !uesti/n *e 4*esarro##o 'ro+esiona#5. Para un programador, la diferencia entre libre y gratis es su propio futuro profesional. ,em+s est+ decir que promuevo el desarrollo de !o#tware Libre y por lo tanto, no har6 4'ro'agan*a 'o#7ti!a5, sto signi#ica que no te dir$ porqu$ debes desarrollar !o#tware Libre ni mucho menos intentar$ convencerte de que lo hagas. !inceramente, #o 8ue hagas *e tu vi*a 3 *e tu 'ro+esi/n, no es a#go 8ue me im'orte, Pues es tu vida y solo t9 debes decidir sobre ella. The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 14 Bo simplemente, te e*plicar$ la di#erencia entre :una cosa y la otra; y procurar$ darte las herramientas necesarias para que decidas cu+l ser+ tu camino, incluso aunque ello implique que no elijas el camino del !o#tware Libre. Pues si a#guien 8ue no entien*e e# So+t9are :ibre *es*e una /'ti!a 'ro+esiona# intentase *esarro##ar#o, 'o*r7a ser !ontra'ro*u!ente 'ara 8ui6nes s7 #o enten*emos. Hablando hace poco con uno de mis alumnos, le dije& Para poder decidir si desarrollars Software libre o Software privativo debes plantearte primero por cul actividad cobrars. ;esarro##es So+t9are :ibre o 'rivativo, si de tu trabajo se trata, cobrar ten*r-s 8ue !obrar. so aqu- no est+ en juego. Lo 9nico que *ebes *e!i*ir es 'or !u-# !on!e'to !obrar-s y para ello, las opciones son solo dos, aunque de cada una de ellas, puedan derivar decenas y hasta cientos de alternativas. l l-mite estar+ en tu creatividad. Pero #a e#e!!i/n *e una *e #as *os a#ternativas, estar- so#o 3 .ni!amente en e# va#or 8ue t. mismo te otorgues !omo 'rograma*or, B cuando hablo de valor, no hablo de precio. Piensa en valor como en cu(nto "aloras a tus padres. ntonces 0!u-nto te va#oras !omo 'rograma*or1 !eguramente, si re!i6n !omien<as a 'rogramar, tus conocimientos no sean muchos y todo te cueste demasiado es#uer6o. Ganto es#uer6o que hasta llegues a creer que resolver un 5B8 se podr-a comparar a tocar el cielo con las manos. ntonces, estar+s creyendo que te valoras. !in embargo, al escuchar los requerimientos de tu cliente e*perimentar+s una sensaci"n de miedo e incertidumbre e internamente te preguntar+s si verdaderamente podr+s resolverlo. 5unque tambi$n podr-as e*perimentar una sensaci"n de omnipotencia y a pesar de no saber mucho m+s que la #orma de de#inir una variable, estar-as convencido de que no e*iste nada que no puedas resolver. ntonces, creer+s que te valoras pero sin embargo, en el #ondo, e*perimentar+s una especie de miedo a )eter la pata. stando en cualquiera de estos grupos, seguramente tengas mu!h7sima m-s +a!i#i*a*, ta#ento 3 're'ara!i/n 'ara generar i*eas 3 !rear estrategias !omer!ia#es, Pues no e*iste ser humano en el mundo que sea incapa6 de vender. !in embargo, los hay incapaces de programar. .laramente, en estos casos, !obrar 'or tu traba)o !omo 4!omer!iante5 te 'ermitir- ganar m-s *inero 8ue !obrar 'or tu traba)o !omo 4'rograma*or5, pues como programador solo lograr+s hacer un trabajo mediocre que cualquier otro programador un poco m+s e*perimentado podr-a mejorar. Puesto en un ejemplo 1con n9meros redondos e irreales2& Mientras que por tu trabajo como programador podras ganar no ms de 1 rupias, cobrando como The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 15 comerciante, podras ganar ! con cada persona que use tu Software ", con que tan solo consigas # personas que lo utilicen, estaras ganando ms dinero que como programador. Pero ahora, puede pasar todo lo contrario de lo dicho anteriormente y ta# ve< seas *e esas 'ersonas es'e!ia#es 8ue va#ora en serio su 'ro+esi/n. sto puede signi#icar que estudies con el 9nico #in de superarte a ti mismo4 que intentes per#eccionarte d-a a d-a4 que necesites estar programando cosas nuevas constantemente4 que solo te motives para programar cuando te en#rentas a nuevos desa#-os4 que t9 mismo te propongas desa#-os y que te guste llegar al #ondo de las cosas por el mero placer de haberlo logrado. !i este es tu caso, entonces, sabes va#orarte !omo 'rograma*or 3 'ara ti, ver*a*eramente no e&isten im'osib#es4 pues seguramente sabes vencer tus miedos porque tu amor 'or #a 'ro+esi/n es su'erior a to*o #o *em-s, !i este es tu caso, tu propio ego te obligar+ a cobrar como programador, pues de lo contrario, ser-a tu orgullo el que estar-a en juego. Pero a diferencia del anterior, tu podrs ganar 1 rupias por lo que aquel solo llegara a ganar 1. $ntonces, siempre te ser incluso ms fcil, ganar el dinero por lo que vales como programador. n de#initiva, debes elegir entre dos opciones& 1( ser un !omer!iante 8ue a'ren*i/ a 'rogramar 'ara 'o*er ha!er nego!ios= 2( ser un 'rograma*or 8ue va#ora su traba)o, ero no *ebes ha!er un )ui!io *e va#or, sto se trata de ser honesto con uno mismo. !e trata de tener humildad y de no ponerse metas inalcan6ables. % veces, pretender seguir un objetivo obligado por una ideologa, puede costarte demasiado caro. ntonces, na*ie 'ue*e )u<garte 3 *e!ir si tu *e!isi/n es buena o ma#a4 correcta o incorrecta. ,ecidir+s lo que est$ a tu alcance. B si *e!i*es !on honesti*a* 3 humi#*a*, na*ie 'o*r- )u<garte, 5hora, la pregunta #inal es& 0*esarro##o So+t9are :ibre o 'rivativo1 Si tu *e!isi/n ha si*o #a 'rimera o'!i/n, es decir, ser un comerciante que programa, la 9nica #orma de The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 16 ganar el su#iciente dinero para vivir, ser+ crear !o#tware privativo. >en*er-s a #os usuarios un 'ermiso 'ara uti#i<ar e# so+t9are 8ue has *esarro##a*o ya que ello te permitir+ ganar dinero su#iciente. 7ncluso, puede que no necesites programar m+s de uno o dos !o#tware en toda tu vida. ,e lo contrario, si intentas cobrar solo tu trabajo como programador, puede que el dinero que ganes no te alcance para vivir y entonces, e*perimentes mucha #rustraci"n. Si en !ambio e#egiste 8ue se te va#ore !omo 'rograma*or, !obrar-s 'or !a*a minuto *e# tiem'o 8ue em'#ees en !rear !a*a uno *e #os So+t9are 8ue se te en!argue y har+s valer celosamente cada segundo de tu tiempo. No te im'ortar- 8ui6n ni 'ara 8u6 use tu So+t9are, 'ues !uanta m-s gente use tu So+t9are, m-s 'restigio a#!an<ar-s como programador y !uanto m-s 'restigio tengas, m-s va#*r- un segun*o *e tu tiem'o y por consiguiente, m+s elevada ser+ la coti6aci"n de tu hora de trabajo. ntonces, el !o#tware Libre te ser+ m+s conveniente. Pues solo as- lograr+s llegar a m+s gente y ganar m+s prestigio, caracter-sticas necesarias para poder coti6ar mejor tu trabajo. B, si me quedaba pendiente esclarecer la di#erencia entre :libre; y :gratis; podr-amos decir que& Gratis es: el trabajo de programaci&n reali'ado por un comerciante "a que (ste, no cobrar su trabajo de programaci&n, sino que cobrar el uso que finalmente se )aga sobre eso que program&. n cambio& Libre es: el trabajo )ec)o por quien cobra por programar sin )acer restricciones sobre lo que se )aga con aquello que program&. lige a conciencia y estar+s siguiendo el camino m+s apropiado. The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 17 LA ORIENTACIN A OB,ETOS Y SUS ENFO*UES COMO ESTILO Y PARADIGMA Eugenia Bahit agradece a Hugo (@huguidugui) por la revisin ortogrfica de este artculo COMPRENDER DESDE LAS BASES LA RADICAL DIFERENCIA *UE E%ISTE ENTRE LA ORIENTACIN A OB,ETOS (ISTA COMO PARADIGMA DE PROGRAMACIN Y LA *UE SE OBSER(A DESDE EL PUNTO DE (ISTA AR*UITECTNICO, SERC LA DIFERENCIA ENTRE UN SISTEMA INFORMCTICO PERFECTO Y UNO ERRNEO+ a Hrientaci"n a Hbjetos parece, en ocasiones, ser un gran misterio di#-cil de dilucidar. sto se debe a que mu!ho se hab#a de ella, 'ero mu3 'o!o se !ono!e en rea#i*a*. L Lo cierto es que la Hrientaci"n a Hbjetos 1HH2 no solo es un paradigma de programaci"n. La Hrientaci"n a Hbjetos, de hecho, puede ser vista, anali6ada y estudiada desde dos en+o8ues absolutamente di#erentes& como 'ara*igma de programaci"n como esti#o arquitect"nico n una gran parte de la bibliogra#-a, la HH se abarca desde ambas "pticas pero sin hacer una clara distinci"n. Gal es as-, que sendos en#oques llegan a con#undirse generando en el lector o estudiante, una idea equivocada sobre qu$ es en realidad la HH. ste error, es el que m+s nos cuesta corregir en el p9blico en general, a los docentes y te"ricos que nos dedicamos al estudio de la HH desde sus dos en#oques. Por ello, intentar$ reali6ar dicha distinci"n utili6ando ejemplos concretos, recurriendo as- al c"digo antes que a las e*plicaciones te"ricas. .omen6ar$ entonces, con un ejemplo cl+sico de la orientaci"n a objetos, bas+ndome en el ob!eto *suario. !i recurrimos a la ?? !omo esti#o ar8uite!t/ni!o, nos podremos encontrar con la siguiente clase& c!ass Hs,ar%o(objec&)- 5ef ''%n%&''(se!f)- se!f8noFbre = ** se!f8c!a4e = ** se!f8eFa%! = ** se!f8&e!efono = ** The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 18
5ef re7%s&rar(se!f)- pass n cambio, si el mismo ejemplo, se abarca desde el paradigma, nos encontrar-amos con algo similar a& c!ass Hs,ar%o(objec&)- 5ef ''%n%&''(se!f)- se!f8,s,ar%o'%5 = 0 se!f8noFbre = ** se!f85a&oscon&ac&o = [] 5ef a55'5a&ocon&ac&o(se!f$ 5a&ocon&ac&o)- se!f85a&oscon&ac&o8appen5(coFpos%&e(Da&oUon&ac&o$ 5a&ocon&ac&o)) 5ef sa4e(se!f$ c!a4e)- pass 5ef 7e&(se!f)- pass 5ef 5es&roy(se!f)- pass c!ass Da&oUon&ac&o(objec&)- 5ef ''%n%&''(se!f)- se!f85a&ocon&ac&o'%5 = 0 se!f85enoF%nac%on = ** se!f84a!or = ** se!f8,s,ar%o = 0 V e&c888 .omo puede verse, #a !om'#e)i*a* *e# 'ara*igma es #e)anamente su'erior a #a sen!i##e< *e# esti#o. $l paradigma es complejo, detallista, minucioso, l&gico " racional, mientras que el estilo es pragmtico. Hriginalmente, la HH *es*e e# 'unto *e vista ar8uite!t/ni!o, promov-a el uso del paradigma para el diseIo de todos los componentes del sistema. !in embargo, no lo hac-a de #orma e*pl-cita, sino que simplemente se limitaba a de#inir que 4to*o !om'onente *e# sistema *eb7a ser trata*o 3 mani'u#a*o !omo un ob)eto5. s decir, no se hablaba de :paradigma; sino tan solo de :objetos;. sto, dio origen a que por e#ecto de los usos y costumbres, el estilo arquitect"nico utili6ara como valor prioritario, la sinta*is y elementos de la Programaci"n Hrientada a Hbjetos 1PHH2 pero dejando a un lado e# 4'ara*igma5, el cual de#ine 4un mo*o .ni!o e in*is!utib#e *e *ise@ar #os ob)etos *e un sistema 'ero no ne!esariamente to*os sus !om'onentes5. The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 19 An*is!utib#e signi+i!a 48ue no tiene #ugar a ob)e!iones5, ,e esta #orma, si yo dijese que el objeto persona :tiene dos ojos; cualquiera podr-a objetar mi a#irmaci"n diciendo que :los ojos no los tiene la persona, sino que los posee la cara de la persona;. B esto 9ltimo, es indiscutible. Pues nadie podr-a decir que los ojos 3H se encuentran ubicados en la cara. s entonces, !uan*o se ##ega a este nive# *e abstra!!i/n ine8u7vo!a e inob)etab#e, que #os ob)etos est-n sien*o ra<ona*os *es*e un en+o8ue ra!iona#= *es*e e# en+o8ue *e# 'ara*igma *e 'rograma!i/n. 5s-, puede concluirse 1en una #orma demasiado simplista y poco ortodo*a2 en que cualuier ob!eto su!eto a debate es un ob!eto "isto desde un en+oue aruitect,nico pero no te,rico. !iendo inmensamente m+s ortodo*os, dir-amos que& $l estilo orientado a objetos es pragmtico mientras que el paradigma de programaci&n es racional .opiar$ ahora el ejemplo seg9n estilo, resaltando aquello que para el paradigma ser-a incorrecto& c!ass Hs,ar%o(objec&)- 5ef ''%n%&''(se!f)- se!f8noFbre = ** se!f2c!ae = '' se!f2e6ai! = '' se!f2te!efono = '' 5ef re,istrar(se!f)- pass ?b)e!iones seg.n e# 'ara*igma Para el paradigma de programaci"n, se debe ra6onar de #orma purista y ser muy racional al momento de abstraer los conte*tos. Hbjeci"n sobre la propiedad clave & Bo, como usuario, no me caracteri6o por mi contraseIa. ,e hecho, nadie deber-a conocer mi contraseIa y las cualidades que :nos de#inen; son aquellas cualidades que :se perciben;. Hbjeci"n sobre las propiedades e/mail y tel$#ono & yo como usuario no soy :de e/mail; y si dijese que :tengo un tel$#ono; deber-a tratar al mismo como un objeto. !in embargo, no estoy hablando del :aparato tele#"nico; sino del n9mero :de contacto;. ,e all- la indiscutible a#irmaci"n de que tanto el tel$#ono como el e/mail son datos de contacto que :pertenecen; al usuario. Hbjeci"n al m$todo registrar & registrar una acci"n que puede reali6ar un ser humano sobre el sistema in#orm+tico. Por eso, a dicha #uncionalidad se la denomina :recurso; 1herramienta con la que cuenta el usuario para reali6ar determinada acci"n2. Los recursos de un sistema, son parte de los componentes del sistema pero no #orman parte de los actores. Los actores del sistema, seg9n el paradigma, solo pueden e#ectuar por s- solos, > acciones& crearse 1para persistir2, leerse y destruirse. The Original Hacker www.originalhacker.org 2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 20 Htro aspecto a tener en cuenta, es que e# sistema in+orm-ti!o 'er+e!to no es aquel que elige la HH desde uno u otro en#oque, sino que es a8ue# 8ue sabe !omo uti#i<ar ambos en+o8ues *e +orma e8ui#ibra*a. l estilo arquitect"nico tratar+ a cada uno de los componentes del sistema como un objeto. sto signi#icar+ que desde un helper hasta un #ormulario ser+ un objeto para el sistema. Metfora: como a"uda para entender los sistemas informticos equilibrando el uso de objetos, pensar en un sistema como en un rodaje de ! en el que e*isten actores " otros roles. $ntonces, todos los componentes que puedan considerarse +actores principales " secundarios, se definirn seg"n el paradigma " el resto, lo )ar solo arquitect&nicamente. s el caso concreto de B>C *on*e #os a!tores son 4#os mo*e#os5 mientras que las vistas, controladores, helpers y dem+s componentes del n9cleo del sistema, solo poseen un :estilo orientado a objetos;. ,ebe adem+s tenerse en cuenta que cuando se ha elegido un estilo orientado a objetos para el diseIo del sistema, toda in#ormaci"n que deba hacerse persistir deber+ /previamente/ anali6ar qu$ tipo de persistencia aplicar-a a cada caso. n estos sistemas puede haber dos tipos de 'ersisten!ia& la persistencia *e *atos la persistencia *e a!tores Godo lo que se considere :actor; ser+ un objeto en el sentido m+s purista del t$rmino, es decir que ser+ tratado bajo el dogma del paradigma sin e*cepciones. !eg9n la opini"n pro#esional del programador, los 4ob)etos 'uros5 1actores2 podr+n hacerse persistir en una base *e *atos 1!JL o no/!JL2, en archivos, etc. !in embargo, toda persistencia de 4*atos +i)os5 1no variables2 pre#erentemente deber+ hacerse en ar!hivos *e !on+igura!i/n 1con+ig2 o ini!ia#i<a!i/n 1settings2. -ener en cuenta el tipo de persistencia, ser lo que otorgue ma"or portabilidad " facilidad de mantenimiento " evoluci&n al sistema. .uando uno se en#rente a determinados datos que requieran persistir en una ,B, se estar+ entonces #rente a un objeto que no est+ siendo tratado de la #orma adecuada, ya sea porque se lo est+ tratando de #orma arquitect"nica cuando es en realidad un actor o bien, porque siendo un objeto de estilo estamos queriendo darle un tratamiento de actor. HACKTI(ISMO DTICO LAS SIGUIENTES COMPAE'AS HACEN DAEO A LA LIBERTAD DE LAS PERSONAS Los siguientes logotipos y'o isotipos son propiedad registrada de cada una de las empresas mencionadas y se utili6an en este a#iche sin permiso de las mismas. 8ediante sus plata#ormas Kindle y Prime. :eer m-s 5 5pple utili6a el ,?8 para controlar iH! y a los usuarios de H! L. :eer m-s 5 l ,?8 se incorpora en el cora6"n de Mindows y muchos servicios como !ilverlight, imponen el ,?8 en los usuarios. :eer m-s 5 3o satis#echo con el uso de ,?8 para su servicio de strea)ing, ahora 3et#li* est+ tratando de imponer el ,?8 en la Meb. :eer m-s 5 !ony ha utili6ado acciones legales para hostigar e intimidar a las personas que han modi#icado sus sistemas P!>. :eer m-s 5 SI DE (ERDAD APOYAS EL SOFTWARE LIBRE, BSALO, PROMUD(ELO Y ABANDONA LO PRI(ATI(O SIN E%CUSAS+ EL CAMBIO ESTC EN TUS MANOS+ 1408151766476 1408151766476 8