You are on page 1of 22

THE ORIGINAL HACKER

SOFTWARE LIBRE, HACKING y PROGRAMA-


CIN, EN UN PROYECTO DE
EUGENIA BAHIT

@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

You might also like