Documentos de Académico
Documentos de Profesional
Documentos de Cultura
The Original Hacker Nro 6
The Original Hacker Nro 6
Fomo puede %erse, es un simple artilugio que respetando los principios de la PGG es capaz de optimizar el
rendimiento de la aplicaci(n de +orma impensada.
UTILI&ANDO @@CALL PARA CREAR PSEUDO M<TODOS DE
AGREGACIN AL (UELO
Minalmente, habr# que tener en cuenta que por cada propiedad colectora, un mtodo de agregaci(n ser#
necesario e in%ocado por +et() cada %ez que ste sea llamado. !i en el modelo de usuario tu%isemos que
crear tantos mtodos de agregaci(n como propiedades colectoras +uesen a crearse al %uelo, se perder"a toda
portabilidad y no solo %ol%er"amos al principio, estar"amos haciendo un modelo in%iable.
/l mtodo m#gico __call() de PJP
7
ha sido dise6ado para actuar cuando el mtodo inaccesible de un objeto
es in%ocado )notar que no sir%e para cuando el mtodo es in%ocado como +unci(n de clase. /n ese caso, debe
emplearse __call"tatic()
,
*. Be+iniendo este mtodo en la clase usuario, su clase madre o en la que sea
necesario crear propiedades colectoras al %uelo, estar"amos dando soluci(n al problema.
&na implementaci(n b#sica de este mtodo, podr"a %erse como la siguiente1
function __call($call- $ar+) {
if(strpos($call- 'add_') === 0 .. $ar+) {
$cls = str_replace('add_'- ''- $call);
$propert/ = 0{$cls_collection0;
if(1propert/_e2ists($this- $propert/)) $this->$propert/ = arra/();
$this->$propert/ = arra/_mer+e($this->$propert/- $ar+);
E/em#&o $o#ia!o &itera&mente !e& m-to!o __call() !e& o*/eto StandardObject
3
!e Euro#io Engine
/l mtodo __call() recibe dos par#metros desde el intrprete1 el primero, es el nombre del mtodo que se
intenta in%ocar. /l segundo, un array con cada uno de los argumentos pasados al mtodo inaccesible durante
su llamada.
7 http1HHwww.php.netHmanualHesHlanguage.oop;.o%erloading.phpNobject.call
8 http1HHwww.php.netHmanualHesHlanguage.oop;.o%erloading.phpNobject.callstatic
9 https1HHbazaar.launchpad.netHOeugeniabahitHeuropioe-perimentalHtrun@H%iewHhead1HcoreHormPengineHobjectsHstandardobject.
phpNL<D
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
10
/l condicional del mtodo se encarga de %eri+icar que el nombre del mtodo inaccesible comience por la
cadena add_ )esto le dar# la pauta de que se trata de un mtodo de agregaci(n* y que el array $ar+ no est
%ac"o.
if(strpos($call- 'add_') === 0 .. $ar+)
Para de+inir el nombre de la propiedad colectora, simplemente eliminar# add_ del nombre del mtodo y
concatenar# el resultado a _collection1
$cls = str_replace('add_'- ''- $call);
$propert/ = 0{$cls_collection0;
Minalmente, si la propiedad no e-iste )por si se ol%id( crearla*, la crear# para luego, combinarla con la actual1
if(1propert/_e2ists($this- $propert/)) $this->$propert/ = arra/();
$this->$propert/ = arra/_mer+e($this->$propert/- $ar+);
Gbtn tu tarjeta de dbito QasterFard AR.'?!S
T una cuenta bancaria en &!. para trans+erir tu dinero desde PayPal desde http1HHbit.lyHpromo0payoneer
)S* Para obtener la tarjeta sin costo !e*es ha$er una $arga ini$ia& !e 3S7 100 y registrarte $on e&
en&a$e de esta promoci(n. 7e &o $ontrario, se !e*itar)n 3S7 2A de tu primera carga. La cuenta bancaria
%irtual te permite trans+erir el dinero desde PayPal y que se acredite autom#ticamente en tu QasterFard.
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
11
EUROPIO ENGINE LAB8
MANIPULACIN DE DATOS
CON DATAHANDLER+ UN
MUNDO M9S ALL9 DE LOS
OB,ETOS+++
ESTE ART'CULO NO SOLO
PRETENDE DOCUMENTAR AL
OB,ETO DATAHANDLER DE
EUROPIO ENGINE, SINO *UE
ADEM9S, SER(IR9 COMO
FUENTE DE REFERENCIA
PARA EL PSEUDO MAPEO DE
TABLAS MEDIANTE
INFORMATION@SCHEMA+
esde hace %arios meses atr#s, el tema m#s redundante en
los cursos de capacitaci(n que imparto sobre /uropio
/ngine, era la manipulaci(n de datos en el #mbito de los
objetos. Pero no se trataba de algo caprichoso, sino de una
necesidad real1 =qu sucede cuando necesitamos e+ectuar
estad"sticas sobre datos, e%itando adrede el uso de objetos>
B
.ntes de preocuparnos por el Uc(mo siempre debemos
plantearnos Uqu necesitamos y a partir de all", decidir qu es lo
que tenemos que hacer, pero no antes. , de esos Uqu +ue que
termin( surgiendo la necesidad de crear un objeto que permitiese
trabajar con datos sin tocar la estructura de las tablas empleadas
por los objetos.
Por este moti%o, aun%ue a.n no hayas uti&i+a!o Euro#io
Engine como core de tus aplicaciones, te re$omien!o &eer este
art8$u&o ya que te ser%ir# para %er c(mo resol%er el tratamiento de
datos en tus aplicaciones orientadas a objetos.
MANIPULACIN DE DATOS (S+ TRABA,O CON OB,ETOS
Para que e-ista una ne$esi!a! rea& !e mani#u&a$i'n !e !atos )y no de objetos* deben cumplirse ciertas
caracter"sticas1
7. 7e*e estar !ire$tamente re&a$iona!a a &a *ase !e !atos< Por ejemplo, decir Unecesito localizar
los objetos X que pertenezcan al usuario Y no es una necesidad real ya que estamos hablando de
objetos y cometiendo el error de tratar de manipular objetos como si +uesen datos. !iguiendo el
ejemplo, obtener la colecci(n de objetos V del usuario , deber"a ser lo que suceda por de+ecto. /s
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
12
decir, se soluciona con un buen dise6o de los objetos )el usuario Y tendr# una propiedad colectora
objeto_x y recuperando al usuario , se recuperar# la colecci(n de los objetos X que lo componen. Para
saber c(mo lograr un dise6o de objetos de este estilo, re+erirse al art"culo anterior sobre propiedades
al vuelo*2
8. 7e*e tener una *ase s'&i!a so*re &a $ua& /usti(i$ar &a ne$esi!a! !e tra*a/ar $on &os !atos<
Por ejemplo, la necesidad de crear una herramienta de an#lisis de rendimiento de la base de datos
ser"a una justi+icaci(n aceptable. Qientras que cualquier requerimiento %isual sobre los objetos, no
ser"a justi+icaci(n su+iciente para manipular datos directamente desde la propia base de datos2
9. No !e*e e,istir una (orma '#tima y via*&e !e reso&ver e& re%uerimiento mani#u&an!o
o*/etos< /ste "tem debe ir de la mano con el anterior. Por ejemplo, si lo que se desea es obtener
estad"sticas sobre uso del sistema, un requerimiento podr"a resol%erse de +orma %iable Uobteniendo
registros de una sola tabla que obteniendo una colecci(n de objetos y haciendo el an#lisis estad"stico
sobre toda la colecci(n, ya que obtener una colecci(n de 7DDD objetos podr"a implicar e+ectuar
consultas a decenas de tablas, algo que no justi+icar"a para conocer cu#ntos datos se cargaron en la
BB en los $ltimos ;W, por ejemplo.
:. 7e*e tratarse !e ne$esi!a!es !e so&o &e$tura< 5am#s debe escribirse sobre la base de datos
destinada al almacenamiento de in+ormaci(n sobre los objetos. !olo los modelos pueden escribir en su
propia tabla y esto debe respetarse de +orma estricta. Be lo contrario, se pierde toda garant"a sobre
rendimiento y +uncionamiento de la aplicaci(n.
Jabiendo aclarado estos puntos +undamentales, paso directo a hablar sobre BataJandler.
DATA8 UN NUE(O MDULO INCORPORADO AL CORE DE EUROPIO
ENGINE
Primero me en+ocar en c(mo se utiliza este m(dulo )es %erdaderamente muy simple* para luego e-plicar
c(mo trabaja de +orma interna.
EL OB,ETO DATAHANDLER
Fomo su nombre lo indica, se trata de un manejador de datos y es por el momento, el $nico objeto disponible
del m(dulo.
.l ser instanciado, este objeto necesitar# dos par#metros1 el nombre de la tabla sobre la que se trabajar#
)obligatorio* y el +ormato en el que se desea obtener los resultados )opcional, por de+ecto retorna un array de
datos*.
3ata4andler(string $tabla'- const $formato=34_5%6789_3898()
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
13
/l +ormato )opcional* debe ser una de las constantes prede+inidas por /uropio /ngine. /stas pueden ser1
DH_O!"#$_D#$# 5ormato al :ue se refiere* array de datos%
Un arra/ cu/os elementos ser;n arra/s asociativos (nombre de clave
ser; nombre de campo)< Utili=ado como valor por defecto<
DH_O!"#$_O&'()$ 5ormato al :ue se refiere* array de objetos%
Un arra/ cu/os elementos ser;n ob>etos<
&otar :ue 34_5%6789_%?@#A9 no retorna los datos de una tabla
convertidos a ob>etos sino :ue en base a los datos obtenidos se
encar+ar; de crear los ob>etos correspondientes<
M<TODOS
Por el momento, solo dispone de 8 mtodos p$blicos.
get_latest(int $n)
Retorna los "ltimos # registros$
# %&%'(L) *% +,)
$ultimos = 3ata4andler('comentarios')->get_latest(*+);
# devolver los "ltimos -. registros de la ta!la llamada comentarios
filter(string $condition,- const $filter=DH_./$(!_(01)
Retorna los registros coincidentes con la condicin pasada como primer parmetro$
/l ti#o !e (i&tro $filter podr# ser cualquiera de las constantes prede+inidas por /uropio /ngine1
-------------------B-------------------B------------
)O2S$#2$( S.32..)#DO S.32O
-------------------B-------------------B------------
34_5$C9#6_#DE i+ual :ue =
34_5$C9#6_&%9#D distinto :ue F>
34_5$C9#6_C9 menor :ue F
34_5$C9#6_G9 ma/or :ue >
E valor por defecto
Por el momento, filter() admite una $nica condici(n cuyo operador sea cualquiera de los anterios.
$productos = 3ata4andler('productos')->filter(45roducto_id 6 74- DH_./$(!_/$);
Retornar los primeros registros donde la /* sea menor que 0
DATAHELPER, EL BACKSTAGE DEL OB,ETO DATAHANDLER
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
14
BataJelper se encarga de Umeter mano en la base de datos. !u objeti%o es el de sustituir la +unci(n de un
GRQ ya que si trabajamos realmente con datos no ser"a correcto mapear objetos. , para lograrlo, debe e%itar
meterse en la tabla de los objetos de +orma directa.
/ntonces =c(mo crear queries din#micos sin mapear los objetos> /s muy simple1 se pseudo0mapea la tabla
=c(mo> Fonsultando a la tabla )O/8"2S de .2O!"#$.O2_S)H("# de 0ySB21
"#C#A9 A%CU7&_&87#-
$5(A%CU7&_9HI# C$J# 'KintK'- 'i'-
$5(A%CU7&_9HI# C$J# 'KdecimalK'- 'd'- 's')
)
!O" .2O!"#$.O2_S)H("#%)O/8"2S
L4#6# 98?C#_"A4#78 = )
8&3 98?C#_&87# = )
98?C#_"A4#78 ser# el nombre de la base de datos de la aplicaci(n, mientras que 98?C#_&87# el que se
haya pasado como par#metro al crear el 3ata4andler. Para %er un ejemplo completo, recomiendo estudiar
el c(digo +uente de BataJelper
:
.
Contratan!o un CPS $on e& en&a$e !e esta #u*&i$i!a!, me ayu!as a mantener 1he >rigina& ?a$4er DE
Servi!ores a solo 3S7 F G mes1
20 5B de disco
Biscos SS7
7 'B de trans+erencia
F12 QB :A0
6nsta&a$i'n en menos !e 1H
/lige 3*untu Server 12<04 21S y despreoc$pate de
la seguridad, optimiz#ndolo con Ia$41heStri##er
Luego de instalarlo, $on(ig.ra&o $on Ia$41heStri##er1 http1HHwww.eugeniabahit.comHproyectosHjac@thestripper
Contratan!o $on este en&a$e, me ayu!as a mantener e& servi!or !e 1he >rigina& ?a$4erD http1HHbit.lyHpromo0digitalocean
: https1HHbazaar.launchpad.netHOeugeniabahitHeuropioe-perimentalHtrun@H%iewHhead1HcoreHdataHdatahelper.php
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
15
DESMITIFICANDO EL
CONCEPTO DE SESIONES+
TODO ES M9S SIMPLE DE
LO *UE PARECE+++
UNA DE LAS CONSULTAS *UE
MIS ALUMNOS ME HACEN EN
LOS CURSOS DE M(C ES
*U< HACER ACON LOS
LOGINA EN UNA
APLICACIN+ REALMENTE ES
ALGO MUY SENCILLO, SI SE
SABE CON E%ACTITUD DE
*U< SE TRATA ESTO DEL
MANE,O DE SESIONES
l concepto de Usesiones, b#sicamente es una entelequia.
o e-iste un concepto de Usesi(n como tal y que sea
independiente al concepto de cookies. /
Las sesiones, son en rea&i!a! un mo!o !e #ersisten$ia !e
!atos mediante la intera$$i'n !e ar$hivos en e& #ro#io
servi!or y en el ordenador del usuario )o sea, cookies*.
/l concepto de sesi(n, se re(iere a &a me$)ni$a uti&i+a!a #ara
generar &a #ersisten$ia tem#ora& !e $iertos !atos !e&
usuario.
Bicha mec#nica, consiste b#sicamente en1
6!enti(i$a$i'n !e& usuarioD se identi+ica a
cualquier usuario que ingresa a un sitio Eeb,
mediante un identi+icador $nico )?B, que por cierto,
nada tiene que %er con las bases de datos*. Por
ejemplo1 imaginemos que estamos desarrollando un
nue%o lenguaje de programaci(n. /ntonces, cada %ez
que una persona ingresa en el sitio Eeb, de +orma
autom#tica, nuestro script le Uin%enta un Uc(digo o
cadena de identi+icaci(n, $nico para ese usuario.
Persisten$ia !e& i!enti(i$a!orD el proceso de
persistencia del identi+icador, es un proceso interno
que debe realizarse en el ser%idor. Fonsiste en
implementar una mec#nica que permita almacenar
de +orma temporal, el identi+icador asignado al
usuario, hasta que ste abandone el sitio. La mayor"a
de los manejadores de sesiones o de los lenguajes
como PJP que implementan dicho concepto de +orma
nati%a en el propio lenguaje, di%iden esta mec#nica
en dos acciones1
7* .lmacenamiento del identi+icador en el
ser%idor, el cual puede imaginarse como un
archi%o temporal2
8* .lmacenamiento del identi+icador en el
ordenador del usuario, el cual no es m#s que
una cookie.
/l uso de cookies en el ordenador del usuario, podr"a
e%itarse si por ejemplo, en el archi%o del usuario en
el ser%idor, se guardara in+ormaci(n di%ersa sobre el
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
16
usuario1 desde su ?P hasta la %ersi(n del sistema
operati%o. !in embargo, esto podr"a traer aparejadas
consecuencias indeseables1 desde una sobrecarga
del ser%idor, hasta la colisi(n de usuarios que
mediante un proxy, pudieran utilizar la misma ?P. /s
por este moti%o, que la mejor soluci(n encontrada
hasta ahora, ha sido el uso m$ltiple de archi%os1 en
el ser%idor y en el cliente, a modo de ookies.
/sta, es la base del manejo de sesiones y nada tiene
que %er con un concepto tangible ni mucho menos,
con los procesos de registro de usuarios e
identi+icaci(n mediante el ingreso de cla%es pri%adas.
Por este moti%o, hay que aprender a diferenciar
entre el manejo de sesiones y la gestin de
usuarios.
GESTIN DE USUARIOS (S+ MANE,O DE SESIONES
La gesti(n de usuarios, debe %erse como la gesti(n
de cualquier otro objeto del sistema. /s as" que si se
requiere gestionar usuarios se deber# contar con un
m(dulo de gesti(n de usuarios.
Fuando trabajamos con objetos, el usuario en s"
mismo, no es m#s que un objeto del sistema. /s otro
componente como tantos. , como tal, tendr# su
clase con mtodos y propiedades como cualquier
otra y en una arquitectura QXF, tambin contar# con
su %ista y controlador correspondiente.
Fuando se analiza el total de la aplicaci(n, se puede
obser%ar que un modelo de usuarios, no puede
relacionarse de +orma directa, con ning$n otro
m(dulo del sistema. Be all", la necesidad de dise6ar
un m(dulo independiente para los usuarios. ?ncluso,
aunque ste, tenga solo un modelo.
!i se describen las cualidades del objeto usuario,
respetando de +orma estricta la organizaci(n
orientada a objetos de una arquitectura e incluso, su
paradigma hom(nimo, el usuario no tendr# m#s que
dos propiedades1 la primera e ine%itable, su ?B y la
segunda, su nombre )el usuario es de nombre 5uan*.
. lo sumo, cuando se trabaja con di+erentes ni%eles
de acceso, tendr# un ni%el )el usuario es de ni%el ;*.
/l usuario como objeto, G Ues de contrase6a ni
Utiene una contrase6a. /l usuario, solo debe
ingresar un dato pri%ado para acceder al sistema.
Bicho dato, es conocido como Ucontrase6a y no es
m#s que un requerimiento gr#+ico a los ojos de una
orientaci(n a objetos estricta.
Por este moti%o, la contrase6a )la cual es un dato
pri%ado que solo el propietario debe conocer como si
se tratase del P? de su tarjeta de crdito*, es el
$nico requerimiento gr#+ico que requerir# un
tratamiento especial en el modelo. , ste, G
consistir# en agregar una nue%a propiedad de clase,
sino tan solo, en preparar al mtodo save() para
recibir como par#metro, dicho dato. Pues la +orma
m#s %iable de hacer persistir dicho dato, es
manipulando datos m#s all# del objeto. , a +in de
reutilizar recursos, no debe crearse una nue%a tabla
en la base de datos, sino, apro%echar la destinada a
hacer persistir los objetos &suario.
Por otra parte, debe hacerse notar que el objeto
&suario como tal, tendr# los mismos mtodos que
cualquier otro1 save()- +et() / destro/().
Fuando un acceso restringido sea requerido, ser# el
manejador de sesiones quien entre en juego, pero no
ya manipulando objetos sino datos. Pues la
restricci(n de acceso y el ingreso de contrase6as, no
son m#s que requerimientos gr#+icos que recurren a
Udatos puros para su tratamiento.
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
17
Un mdulo de usuarios es totalmente independiente de
un manejador de sesiones. Solo se aprovecha la base
de datos utili"ada para hacer persistir los objetos, a fin
de evitar la sobre#saturacin de recursos
?ncluso, un m(dulo de usuarios podr"a no ser necesario, si el sistema no requiere su gesti(n y por el contrario,
solo cuenta con el requerimiento gr#+ico de ingresar datos determinados que coincidan con los esperados. /s
el caso de restricci(n de acceso por un $nico nombre de usuario y contrase6a. Para el sistema y a ni%el
arquitect(nico, stos, son solo datos que el Uusuario )no el programador* conoce )o ubica* como nombre de
usuario y contrase6a. . ni%el algor"tmico, son tan solo, dos cadenas de te-to que deben coincidir con las
esperadas.
=CMO SER'A ENTONCES UNA CLASE USUARIO SI LA CLA(E NO ES UNA PROPIEDAD>
!i se desea entonces, contar con un m(dulo de gesti(n de usuarios, no habr# m#s que crear dicho m(dulo.
Las sesiones, son un caso aparte e independiente, ya que ni siquiera interact$an con el o los objetos de este
m(dulo. Repito1 simplemente reutilizan la misma base de datos.
. tal +in, colocar aqu" un t"pico modelo &suario, solo a modo de ejemplo por si la gesti(n de los mismos es
requerida. !i se trabaja con QXF, las %istas y controladores, ser#n como las de cualquier otro modelo.
En Python:
from core<dbla/er import run_:uer/
class Usuario(ob>ect)*
def __init__(self)*
self<usuario_id = 0
self<nombre = ''
def save(self- 59d)*
if self<usuario_id == 0*
s:l = 000$&"#69 $&9% usuario (nombre- p!d)
M8CU#" ('K(u)s'- 'K(p)s')000 K dict( u=self<nombre- p=p!d)
self<usuario_id = run_:uer/(s:l)
else*
s:l = 000UI389# usuario
"#9 nombre = 'K(u)s'- p!d = 'K(p)s'
L4#6# usuario_id = K(uid)i000 K dict( u=self<nombre- p=p!d-
uid=self<usuario_id)
run_:uer/(s:l)
def +et(self)*
s:l = 000"#C#A9 usuario_id- nombre 56%7 usuario
L4#6# usuario_id = Ki000 K self<usuario_id
fields = run_:uer/(s:l)'0(
self<nombre = fields'N(
def destro/(self)*
s:l = 0003#C#9# 56%7 usuario
L4#6# usuario_id = Ki000 K self<usuario_id
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
18
run_:uer/(s:l)
En PHP:
re:uire_once 'coreOdbla/er<php';
class Usuario {
function __construct() {
$this->usuario_id = 0;
$this->nombre = '';
function save($59d) {
if($this->usuario_id == 0) {
$s:l = 0$&"#69 $&9% usuario (nombre- p!d)
M8CU#" ()- ))0;
$data = arra/('ss'- 0{$this->nombre0- 0$p!d0);
$this->usuario_id = 3?%b>ect**e>ecutar( $s:l- $data);
else {
$s:l = 0UI389# usuario
"#9 nombre = )- p!d = )
L4#6# usuario_id = )0;
$data = arra/(0ssi0- 0{$this->nombre0- 0$p!d0- 0{$this->usuario_id0);
3?%b>ect**e>ecutar($s:l- $data);
function +et() {
$s:l = 0"#C#A9 usuario_id- nombre
56%7 usuario
L4#6# usuario_id = )0;
$data = arra/(0i0- 0{$this->usuario_id0);
$fields = arra/( 'usuario_id'=>''- 'nombre'=>'');
3?%b>ect**e>ecutar($s:l- $data- $fields);
$this->nombre = $fields''nombre'(;
function destro/() {
$s:l = 03#C#9# 56%7 usuario
L4#6# usuario_id = )0;
$data = arra/(0i0- 0{$this->usuario_id0);
3?%b>ect**e>ecutar($s:l- $data);
/s necesario aclarar que en QXF, cuando el controlador llame al mtodo save() deber# hacerlo pas#ndole
como par#metro, el dato correspondiente a la contrase6a ya ci+rado.
En Python:
from hashlib import mdP
self<model<save(:d7(5ass9ord)%;e<digest())
En PHP:
$this->model->save(:d7($5ass9ord));
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
19
ACE:16I>
Por 7, 5uan deb"a pagar Y; y lo mismo que paga por 7 lo paga por ;. Por 7;, el
precio era de Y7D pero por 7DD, de Y7;. =Zu estaba comprando 5uan>
Ayu!aD que los n$meros no te enga6an. o hay nada que la aritmtica b#sica no pueda resol%er.
Responde AN1ES del 20G0JG2014 a tra%s de 1Kitter utilizando el hashtag LA$erti/o1>?J
E& nom*re !e &os gana!ores ser) #u*&i$a!o en &a siguiente e!i$i'n
La respuesta correcta ser# publicada en 'he Griginal Jac@er [\ junto con los ganadores
S>23C6MN A2 ACE:16I> 7E 1?E >:656NA2 ?ACNE: NOF
ES1A7PS16CAS< 'G'.L B/ R/!P&/!'.!1 22 H FGRR/F'.!1 11 H .F?/R'G!1 F0Q H B/!.F?/R'G!1 F0Q
Para morir el d"a de su cumplea6os n$mero 9D, el hombre tendr"a que haber nacido un a6o antes o muerto un a6o
despus ya que al no haber e-istido un a6o cero, muri( el d"a de su cumplea6os n$mero 8K.
Como pro$ramadores, el ra"onamiento lateral #entre otras cosas# nos a%uda a
aislar el verdadero problema del conte&to descartando as', a!uella informacin
!ue a pesar de aparentar ser de inter(s, resulta irrelevante para la solucin del
problema El acertijo nos lo demuestra con los datos sobre la hora de nacimiento
% fallecimiento Puede parecer interesante pero si sabemos !ue no es matem)tico
el c)lculo *es entonces un dato relevante+
...porque no existi el ao 0, ste, es el
:ANN6N5 7E 5ANA7>:ES 7E2 LA$erti/o1>?F
P:60E:A :ESP3ES1A
C>::EC1A
!suario que dio la "# respuesta correcta en su primer intento
]micodwar+t
)+elic"talo por su respuesta*
:ESP3ES1A 0EI>:
A:530EN1A7A
$espuesta que mejor ha explicado el acertijo
]diegodela%ega
)+elic"talo por su respuesta*
>1:>S 5ANA7>:ESD
]3rn3st0, ]$huso, ]neomatheKs, ]0i$4yRCarras$o, ]imon$&us, ]r#&a, ]mta#iag1, ]*en/asCa+%ue+ y ]santararo
tambin merecen ser +elicitados por haber acertado en la respuesta 1*
Programar es saber aislar el problema descartando lo irrelevante
/l KCL de las personas estudia para ampliar sus conocimientos.
Pero tu, puedes ser parte del otro 8L.
w w w . $ u r s o s d e # r o g r a m a $ i o n a ! i s t a n $ i a . c o m
c l a s e s i n d i % i d u a l e s ^ p e r s o n a l i z a d a s
p a r a e l 8 L q u e b u s c a l l e g a r m) s a & & ) ! e & $ o n o $ i mi e n t o
FREE AS IN FREEDOM
LA (ERDADERA <TICA HACKER
ecesitamos %i%ir en un mundo donde el acceso al $ono$imiento sea 26B:E2 donde la so&i!ari!a! con el %ecino G sea 62PC61A. Bebe dejar de condenarse el
compartir conocimiento con nuestros seres queridos y allegados. EB C!D"0 e1$E en $u1 D!n01, #!y DuC#0 Fue Gue4e1 #!Ce2+
DILE A MO&ILLA *UE NO
INCORPORE EL DRM DE
ADOBE A FIREFO%
!(lo una semana despus del B"a
?nternacional contra el BRQ, 0o+i&&a
anun$i' %ue a#oyar) &a 5esti'n
7igita& !e :estri$$iones en su
navega!or Sire(o,, el cual tendr# una
utilidad incorporada que obtendr# e
instalar# autom#ticamente los BRQ de
.dobe.
ENCPA2E 3N E-0A62 A AN7:EAS 5A2
)F'G de Qozilla* hacindole saber que te
opones al BRQ.
CANCELA TU CUENTA EN
NETFLI% HYO LO HICEI
Jace un a6o atr#s, enterada de que
Net(&i, so&o #ermitir8a &a
re#ro!u$$i'n !e v8!eos en
navega!ores extensiones
premium Tas8 &&amaron a& 7:0E
cancel mi suscripci(n anual =por qu>
Porque la libertad de toda una
comunidad B/B/ %aler m#s que
cualquier serie JB.
.FF/B/ . '& F&/'. B/ /'ML?V y
ENCPA2ES 3N 0ENSAIE
CANCE2AN7> 13 S3SC:6PC6MN.
Anun$ia tu !e$isi'n en 1Kitter y tus
redes sociales.
NO USES DISPOSITI(OS
*UE PROHIBEN COMPARTIR
TUS PROPIOS ARCHI(OS
CON LIBERTAD
HYO NO LOS USOI
Ama+on Nin!&e, iPa!, iPo!, iPhone y
dem#s dispositi%os de .pple incluyen una
Aesti(n Bigital de Restricciones que !aUa
&a &i*erta! !e &as #ersonas.
Bispositi%os con .ndroid _tambin son
peligrosos`
VN> 2>S 3SESW
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 yHo isotipos son propiedad registrada de cada una de las empresas mencionadas y se utilizan en este a+iche sin permiso de las mismas.
Qediante sus plata+ormas
Iindle y Prime. 2eer m)s "
.pple utiliza el BRQ para controlar
iG! y a los usuarios de G! V.
2eer m)s "
/l BRQ se incorpora en el coraz(n de
Eindows y muchos ser%icios como
!il%erlight, imponen el BRQ en los
usuarios. 2eer m)s "
o satis+echo con el uso de BRQ para su ser%icio de
streamin%, ahora et+li- est# tratando de imponer el
BRQ en la Eeb. 2eer m)s "
!ony ha utilizado acciones legales para hostigar e
intimidar a las personas que han modi+icado sus
sistemas P!9. 2eer m)s "
SI DE (ERDAD APOYAS EL SOFTWARE LIBRE, JSALO, PROMU<(ELO Y ABANDONA LO PRI(ATI(O SIN
E%CUSAS+ EL CAMBIO EST9 EN TUS MANOS+
1405301135816
1405301135816
6