tag:blogger.com,1999:blog-89042004862193208002024-03-14T06:11:32.731+01:00El zulo de ImpalahHay días en que me levanto menos gilipollas de lo habitual y mis pensamientos parecen tener cierta coherencia.
Si los recuerdo, los posteo aquí.Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-8904200486219320800.post-51682832435498578972012-05-07T15:27:00.004+01:002012-05-07T15:27:32.167+01:00Aventuras con pythonMe he pasado a python.<br />
<br />
Así de simple. Estaba ya harto de todas las barrabasadas y el código sucio que tenía que crear con PHP, usara el framework que usara (no se salva ni dios), así que me he liado la manta a la cabeza y voy a rehacer todo el trabajo de dos años en Python.<br />
<br />
Lo curioso es que la mayor parte de ese trabajo ha sido corregir las cagadas del framework, adaptar lo que yo pretendía hacer al mismo y llenar todo el código de ñapas.<br />
<br />
Así que me he pasado a Python, con Django (Web framework), con Tastypie (REST), sobre Tornado (web server) y... si me quejaba de la cantidad brutal de librerías de Java, ¡toma dos tazas! Eso sí, por primera vez desde hace mucho tiempo, me estoy centrando en crear mis aplicaciones, no en arreglar "lo de debajo".<br />
<br />
Y a esas almas envidiosas que dicen que Python es lento unas pequeñas palabritas: ¡y una mierda!<br />
<br />
Por primera vez desde hace algún tiempo soy feliz programando.<br />
<br />Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com1tag:blogger.com,1999:blog-8904200486219320800.post-41464391879158519932012-02-15T00:14:00.002+01:002012-02-15T00:14:25.114+01:00¿Qué hacer durante un apagón?No falla.<br />
<br />
Llegas a casa después del trabajo, te reciben un par de gatas maullando como locas de alegria porque supuestamente te han echado de menos pero cuyo mayor interés es que las observes mientras usan la arena (no es coña, una de mis gatas me obliga a ir donde la arena y si yo no vigilo, se aguanta), vas a la nevera a por un red bull y algo de comer, te sientas ante el ordenador a revisar qué ha pasado por el mundo y te preparas para hacer algo productivo... no sé, revisar Menéame o algo así.<br />
<br />
Pasan los minutos, haces cosas, y notas que en la calle ha empezado a lloviznar; lo normal en invierno.<br />
<br />
Y sucede también algo habitual en Barcelona, cuando llueve, cuando hace sol, cuando nieva, los días de viento y los días calmados.<br />
<br />
Un apagón.<br />
<br />
Primero piensas "bah, vendrá la luz rápido", porque se supone que vives en una de las ciudades más modernas de Europa, en un país del primer mundo (eso dicen), en el punto de encuentro de las culturas, en la referencia del Mediterráneo, en un hervidero de startups de alta tecnología, en una ciudad orientada al turista, al que cuidan y miman y no permiten que pasen necesidades ni sufran esos pequeños inconvenientes de sus (habitualmente) frías regiones de origen.<br />
<br />
Pero se te olvida que tú no eres un turista, eres un habitante habitual (barcelonés te llaman), que no vives en la zona turística, sino en un barrio de los de toda la vida, de esos en los que se mezclan edificios de viviendas de 9 pisos y casitas con jardín viviendo en armonía, con sus tiendas de barrio, sus agujeros en las aceras, sus casas okupadas, sus "casals" donde van los jubilados a pasar el día... vamos, que no vives en Paseo de Gracia ni cerca de El Corte Inglés.<br />
<br />
Y la luz no viene. Las reflexiones anteriores te han llevado un par de minutos, mientras el SAI (la mejor compra que has hecho desde que vives en esta bendita ciudad) ha lanzado unos 50 pitidos avisando que no le gusta estar sin alimentación y que como no venga la luz deprisa te quedas sin internet porque el router no lleva baterías (mira, igual me pienso comprar un router a pilas).<br />
<br />
A los 15 minutos necesitas entretenerte. Por suerte el portátil tiene batería para 1 hora y con el google talk abierto al otro lado tienes con quien charlar. No, ya no, sólo 57 minutos. Dicen que cuando mejor lo pasas el tiempo transcurre más deprisa; supongo que cuando se va la luz será la inversa: 10 segundos de tiempo real serán 3 minutos de "tiempo informático".<br />
<br />
Es igual, necesitas diversión porque va para largo. Esperemos que no tanto como el 23 de Julio de 2007 al mediodía, el día del "gran apagón", cuando decidiste irte a tomar un granizado a un bar con aire acondicionado y al llegar descubriste que la mitad de la ciudad estaba sin electricidad. Ese día el olor a plástico quemado debería haberte advertido de que algo no iba bien... y el humo negro saliendo de la subestación eléctrica que subía a dos manzanas no presagiaba nada bueno...<br />
<br />
Dejémoslo, vamos al presente: 20 minutos in electricidad y necesitas entretenerte.<br />
<br />
Primero te levantas procurando no pisas a una gata mientras con el móvil iluminas un poquito el camino. Te golpeas la espinilla con la mesita del salón mientras enciendes tu última vela y miras la llama. Bonita iluminación, bonita llama, huele bien (es aromática, huele a mango). En la calle está todo como la cueva de un oso, oscura (no sé si la cuevas de oso están adoquinadas, supongo que no porque no he vivido en ninguna, aunque sí he vivido en un cuchitril que debía parecerse demasiado... y me disperso).<br />
<br />
Vas hacia la puerta, ojeas por la mirilla, oyes a los vecinos intentando subir por las escaleras (algo difícil para algunos con andador, pero bueno...). 30 minutos sin luz.<br />
<br />
Decides contar los pitidos del SAI, uno cada 10 segundos, impepinables: PI PI PI PI. Los cronometras para asegurarte de que no es uno cada 5 segundos, que indicaría que le quedan 15 minutos de batería. PI [10 segundos]PI [otros 10 segundos]PI[me abuuuurro]PI[voy a dar un paseo]PI[nah, vamos a seguir contando]PI[tengo hambre, voy a poner una pizza en el horn... ah no]PI[coño, el movil sin batería]PI[a la mierda!]<br />
<br />
40 minutos sin luz.<br />
<br />
Te pones a caminar por la zona visible y sin peligro de pisar gatas, unos tres metros cuadrados. Le interesas a una gata, te persigue, se cruza. "Gatas". "Me aburro". "Gatas". Coges en brazos a una gata que te gruñe, a la que previamente has tenido que agarrar de una pata para que no se escapase. Te gusta el riesgo y acercas tu nariz al cuello de la gata que te gruñe para hacerle carantoñas. Te gruñe. El aliento le huele a comida de gato y algo inidentificable pero que asocias con zombies. Te gruñe más y se agarra con fuerza con las uñas sacando hilos de tu jersey. Quizás va siendo hora de soltarla. Te acercas a una mesa y la dejas ir, arañándote el brazo. Dejará marca pero no hace falta betadine.<br />
<br />
50 minutos sin luz.<br />
<br />
"Gatas". "Me aburro". Te acuerdas de que tienes un puntero láser. Gatas + láser = diversión. Diversión para ti, para las gatas es una putada. Buscas el láser que está más allá de tus tres metros de seguridad y tiras un bolígrafo y varios papeles buscando a tientas. Quien fuese gato para ver en la oscuridad. Lo malo es el olor de aliento y la castración, pero bueno...<br />
<br />
1 hora sin luz.<br />
<br />
Tocotón tocotón gatas corriendo por el pasillo. Llegan a la puerta y se paran. ¿Son idiotas o qué? Tienen el láser delante de las narices y no lo persiguen. Ya no quiero ser gato, y me ahorro la castración. Ah! mira, ahora sí, que vienen, que vienen! Tocotón Tocotón y se paran.<br />
<br />
Definitivamente los gatos son idiotas y ya llevo 1 hora y 10 minutos sin luz.<br />
<br />
El portátil se queda sin batería, ahora tengo dos pitidos PI piiiiiii. Te despides de quien te ha estado entreteniendo y dices que si viene la luz vuelves al gtalk. Cierras todo lo que tienes abierto, las descargas de pr0n y esas cosas....<br />
<br />
1 hora 15 minutos sin luz.<br />
<br />
"Me aburro". No pasa nadie por la calle, está oscura, llueve. "Estoy triste y me aburro". "Tengo hambre".<br />
<br />
1 hora y 20 minutos sin luz.<br />
<br />
Vas a cotillear a ver si ha venido FECSA a hacer algo o siguen contando los lerus que le pagas cada mes. Probablemente será lo segundo porque priorizan muy bien: dinero antes que servicio.<br />
<br />
Como buen cotilla hay que buscar una excusa. Recuerdas que hay varias botellas de plástico dispersas por la cocina así que las metes en una bolsa. Te pones una cazadora, te abrochas los pantalones (porque es invierno que si no te tocaría buscar los pantalones fuera de la zona de 3 metros semi iluminada). Y recuerdas que el láser también tiene un LED. Eres idiota como un gato.<br />
<br />
1 hora 30 minutos sin luz.<br />
<br />
Abres la puerta, sales, bajas hasta el primer descansillo iluminado por el LED del láser que como buen idiota no recordabas que tenía y...<br />
<br />
Viene la luz.<br />
<br />
Hay que joderse.<br />
<br />
Te da el bajón porque ya no podrás cotillear a gusto con los vecinos criticando a la compañía eléctrica. Ya no podrás decir "siempre igual, caen 4 gotas y se rompe todo", ni tampoco dirás "como en el metro, que cuando llueve se jode y cuando hace bueno también".<br />
<br />
Te guardas la ganas de cotillear, sales a la calle cagándote de frío y dejas la bolsa de basura en el contenedor (el de basura "normal", que el de plástico lo han puesto donde Cristo perdió las sandalias; decisiones de ayuntamiento, ya sabes, lo normal, también son idiotas).<br />
<br />
Subes a casa y piensas: ¿en que invierten el dinero de mi factura de la luz? ¿en mariscadas y putas?<br />
<br />
Y también piensas: Kabul-celona.<br />
<br />
Lo malo es que no vives en la Green Zone...<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com0tag:blogger.com,1999:blog-8904200486219320800.post-58374407089799419572011-11-14T14:42:00.001+01:002011-11-14T15:39:17.721+01:00¿Errores informáticos?Ante todo, este post no va dirigido precisamente a los profesionales del desarrollo. Así que si alguien de ese grupo me lee que no espere soluciones mágicas ni superdebuggers de la muerte. Si alguien del "otro grupo" lo lee (lo que por otra parte me haría muy feliz) que no espere compasión por mi parte. Este post trata sobre incompetencia.<br />
<br />
<br />
Sucedió hace unos días: <b><a href="http://www.meneame.net/story/standard-poor-s-quita-francia-aaa-error-informatico">Francia se queda sin triple AAA debido a un error informático</a></b>.<br />
<br />
Antes había sido precedido por dos cagadas que no consiguieron achacar a las malévolas y revolucionarias máquinas: <b><a href="http://www.meneame.net/story/como-comete-error-contabilidad-55-000-millones">Cagada en la deuda de Alemania</a></b> y <b><a href="http://www.meneame.net/story/error-contable-reduce-deuda-publica-irlanda-3-600-millones-euros">Cagada en la deuda de Irlanda</a></b>. Supongo que no ha de ser sencillo acusar a Microsoft por haberla pifiado al diseñar (mal) una hoja Excel.<br />
<br />
La verdad es que los errores informáticos pululan por doquier. Ya sólo haciendo una consulta en meneame encontramos <b><a href="http://www.meneame.net/search.php?q=error+inform%C3%A1tico">decenas de páginas llenitas de acusaciones y sospechas</a></b> hacia nosotros, los pobres técnicos. No es que todos estemos libres de culpa pero es que parece que somos una panda de chapuceros y que en cualquier momento se acabará el mundo por nuestra culpa.<br />
<br />
No voy a decir nada nuevo para quien se dedica al desarrollo (de hecho es una de nuestras máximas), pero seguro que a muchos "legos en la materia" les extraña leer esto que voy a poner:<br />
<br />
<div style="text-align: center;">
<b>El principal error informático se encuentra entre el ordenador y la silla.</b></div>
<br />
Parecerá coña pero los ordenadores no se equivocan, son infalibles. Los ordenadores hacen lo que se les manda, ni más ni menos. Ni siquiera esos algoritmos tan chulos que hacen Google y Facebook para averiguar la marca de nuestra ropa interior servirían para mucho sin alguien que los hubiese ideado, que los estuviese revisando cada poco tiempo, que los afinase y que los probase.<br />
<br />
Skynet no existe, y si existe todavía no tiene conciencia de sí misma. HAL 9000 no existe, y si existe, no piensa por sí mismo. Esos robotitos tan chulos de "Yo Robot" y todos los agentes Smith de Matrix sólo son pajas mentales de escritores, guionistas y plagiadores.<br />
<br />
Un ordenador, o una red de ordenadores, o la red de ordenadores más grande del mundo no es más que una herramienta y, como todas las herramientas, está pensada para ser usada por los humanos (bueno, y por los gatos mientras esperan a que les<b> <a href="http://www.youtube.com/watch?v=h6CcxJQq1x8">crezcan pulgares</a> </b>para llevar a cabo su plan de conquista mundial). Un ordenador sin alguien que lo "alimente" es un conjunto de hierros inútiles. Sí, hasta esos de la manzanita, son poco más que pisapapeles de lujo.<br />
<br />
<br />
Imaginemos que se produce un atropello en la calle: ¿alguien culpa al coche? O pensemos por un momento que un tren descarrilla: ¿la culpa es de la locomotora, que no frena en las curvas? O que alguien muere por un golpe con una llave inglesa: ¿metemos en la carcel a la pobre llave?<br />
<br />
Pero claro, con los ordenadores es distinto, porque son muy listos. Están acechando y esperando a que llegue el momento adecuado y ¡Zasca! te largan un error y le quitan la triple AAA a Francia. O peor aun, se esperan a estar cerca de Marte y <b><a href="http://centros5.pntic.mec.es/ies.victoria.kent/Rincon-C/Curiosid/Rc-6/RC-6.htm">estrellan una sonda</a> </b>que vale millones de euros porque sí, porque son malévolos. Y qué decir de esos que te roban en el banco por internet cuando tú sólo estabas carteándote con el presidente de Nigeria.<br />
<br />
Un ordenador es una máquina estúpida y detrás de esos "errores informáticos" siempre hay un grupito de humanos que la han cagado. Todavía estoy esperando el día en que un peritaje concluya que algo ha sido culpa de un ordenador; da igual que sea un accidente aéreo o un recuento de votos, quien se equivoca siempre es un humano. ¿A alguien le suena que haya sucedido? Pues a mí tampoco.<br />
<br />
"Error informático" se usa para esconder la incompetencia de un analista económico que no sabe usar una hoja de cálculo.<br />
<br />
"Error informático" se usa para justificar la incompetencia de una empresa al diseñar un producto informático. Bien sea por abaratar costes y contratar becarios, por ahorrarse el tiempo de probar lo que hacen o porque "da igual, ya les cobraremos el mantenimiento". Lo malo es cuando se usa "eso" en procesos electorales.<br />
<br />
"Error informático" se usa para<b> <a href="http://www.meneame.net/story/sindicato-prisiones-achaca-fallo-informatico-error-caso-pontevedra">esconder la incompetencia de quien no hace su trabajo</a> </b>y espera que una máquina se lo resuelva. El error es dejarles ver pr0n en el trabajo, o haberles dado el trabajo, simplemente.<br />
<br />
La verdad es que me apetecía desahogarme, y tampoco era cuestión de escribir un post sólo con la frase "sois una panda de ignorantes incompetentes". Es probable que mi tráfico de 3 lectores pasase a uno solo... yo mismo.<br />
<br />
Pues eso, que la próxima vez que se os ocurra decir "error informático" os miréis las manos a ver dónde habéis metido la zarpa.<br />
<br />
No, por mucho que os empeñéis no existen los "errores informáticos".<br />
<br />
<br />
<br />
<br />
<br />Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com2tag:blogger.com,1999:blog-8904200486219320800.post-51176316497275498172011-10-25T09:00:00.001+01:002011-10-25T16:30:51.766+01:00Crónica de un roadshow (Windows Phone 7)Ya hace más de un mes que no publico nada, entre otras cosas porque he estado haciendo cosas productivas, por ejemplo conquistar Europa con Napoleón y el <b><a href="http://www.totalwar.com/napoleon/">Total War</a></b>. Pero el tema de mi adicción a los juegos lo dejaremos para otra ocasión porque tiene demasiada chicha.<br />
<br />
Aprovechando que el Lunes 24 de Octubre asistí a una Roadshow sobre la plataforma Windows Phone 7.5 (Mango pa los amigos) y como estoy emocionado con lo que me regalaron, pues vamos a contar qué pasó.<br />
<br />
El evento se llamaba "<b>Cómo desarrollar y publicar las mejores aplicaciones y juegos para Windows Phone</b>" y el programa era el siguiente:<br />
<br />
<span id="lblEventDescription"><span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;"></span></span></span></span><br />
<div style="margin: 0cm 0cm 0pt;">
<span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;"><i><span style="font-size: 14px;">09:00-09:30 Registro</span></i></span></span></span></div>
<span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;">
</span></span></span><br />
<div style="margin: 0cm 0cm 0pt;">
<span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;"><i><span style="font-size: 14px;">09:30-10:30 Por qué Windows Phone?</span></i></span></span></span></div>
<span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;">
</span></span></span><br />
<div style="margin: 0cm 0cm 0pt;">
<span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;"><i><span style="font-size: 14px;">10:30-12:00 Plataforma de desarrollo de aplicaciones y Juegos</span></i></span></span></span></div>
<span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;">
</span></span></span><br />
<div style="margin: 0cm 0cm 0pt;">
<span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;"><i><span style="font-size: 14px;">12:00-12:15 Descanso (café)</span></i></span></span></span></div>
<span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;">
</span></span></span><br />
<div style="margin: 0cm 0cm 0pt;">
<span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;"><i><span style="font-size: 14px;">12.15-13:15 Datos, Servicios y "Live Tiles" (Ventanas Vivas)</span></i></span></span></span></div>
<span style="font-size: 8px;"><span lang="ES"><span style="font-size: 12px;">
<div style="margin: 0cm 0cm 0pt;">
<i><span style="font-size: 14px;">13:15-14:00 Capacidades avanzadas de Windows Phone</span></i></div>
<div style="margin: 0cm 0cm 0pt;">
<i><span style="font-size: 14px;">14:00-15:00 Descanso</span></i></div>
<div style="margin: 0cm 0cm 0pt;">
<i><span style="font-size: 14px;">15.00-16:00 Multitarea en Windows Phone
</span></i></div>
<div style="margin: 0cm 0cm 0pt;">
<i><span style="font-size: 14px;">16:00-16:15 Descanso</span></i></div>
<div style="margin: 0cm 0cm 0pt;">
<i><span style="font-size: 14px;">16:15-17:15 Desarrollo paso a paso y publicación de "Zombsquare"</span></i></div>
<div style="margin: 0cm 0cm 0pt;">
<i><span style="font-size: 14px;">17:15-17:45 Cómo comercializar tus aplicaciones y juegos en el Marketplace</span></i></div>
<div style="margin: 0cm 0cm 0pt;">
<i><span style="font-size: 14px;">17:45-18:00 Recursos, Ayudas e Iniciativas</span></i></div>
</span></span></span><br />
<br />
La verdad, tenía bastante miedo de que se convirtiera en algo parecido a "<b><a href="http://www.youtube.com/watch?v=8To-6VIJZRE">Developers! Developers!</a></b>", o peor aún, que fuese un evento de captación de adeptos al lado oscuro y que hubiese que realizar algún sacrificio de sangre. En el mejor de los casos esperaba una aburrida presentación cargada de Powerpoints contando las bondades del producto pero sin llegar a ver la potencio (o la falta de ella) de la plataforma.<br />
<br />
Menos mal que me equivoqué.<br />
<br />
Soy ya perro viejo en estas lides y cuando me cuentan algo nuevo, sobre todo si viene de los propios iniciadores del invento, no me suelo creer ni la mitad. Yo también he maquillado "productos" y realizado "demos" y, aunque no se me da demasiado bien el Powerpoint, sé mentir lo suficientemente bien como para vender hielo a un esquimal si hace falta. Suelo detectar desde lejos a los vendemotos, supongo que será porque he tenido que vender yo algunas y quizás las feromonas que emiten puedo olerlas a kilómetros.<br />
<br />
Pues no es el caso y, aunque alguien pueda pensar que el lado oscuro me ha llamado a su lado, he de reconocer que Windows Phone 7.5 está bastante completo. Si Microsoft hace algo bien, como en su día .NET o hace poco con Windows 7, se merecen mis elogios. En el fondo lo suyo es un negocio, como al que podamos dedicarnos cualquiera de nosotros (de hecho creo que muy pocos estamos libres de culpa porque o curramos o hemos currado en consultoras o tenemos nuestros clientes de pago).<br />
<br />
Lo dejaré ahí y si hace falta se comenta algo más otro día.<br />
<br />
El Roadshow, interesante de principio a fin, excepto en un par de ocasiones en las que el hambre no me dejaba razonar. Los ponentes (Eduardo Ortega, José Antonio Gallego e Isabel Gómez) controlaban y, ojo que es importante, fueron sinceros en todo momento con las limitaciones de la plataforma, que las tiene, y algunas las he twiteado (y otras las han twiteado otros).<br />
<br />
Hubo presentaciones, hubo mucha cháchara a alta velocidad y chascarrillos y, sobre todo, hubo demostraciones y desarrollos en directo sobre la plataforma, ahí con un par, y petando lo justo. Si todo hubiera funcionado a la primera hubiera sido sospechoso.<br />
<br />
No es que sea un entusiasta de la GUI <b><a href="http://www.microsoft.com/design/toolbox/tutorials/windows-phone-7/metro/">Metro</a></b> las "Live Tiles" y esos inventos, de hecho el que esté por defecto en Windows 8 me da bastante rabia (casi tanta como que Ubuntu traiga Unity de serie, puaj!) pero ¡coño! en el móvil queda bien.<br />
<br />
El que la GUI haya que desarrollarla con <b><a href="http://www.silverlight.net/">Silverlight </a></b>no me acaba de gustar demasiado, igual que no me gusta el Flash al que pretendía "sustituir". Quizás podría haberse optado a la solución de Windows 8, desarrollando con HTML5, pero supongo que la fechas aprietan y cambiarlo todo ahora sería un suicidio económico. Sea como sea, hacer la GUI con Visual Studio (o Microsoft Expression Blend) es sencillo y se basa, como Android, en "atar" eventos a widgets. El SDK es gratuito así que no hay queja.<br />
<br />
Limitaciones de la plataforma, las tiene, algunas poco comprensibles. Según nos han aclarado era por falta de tiempo y que irían siendo puestas de forma pública, aunque comenté en twitter mis sospechas de que hubiese algún SDK pro de pago con accesso a lo limitado (seguro que alguno recuerda las acusaciones de hace años de que Microsoft ocultaba partes de la API de Windows para eliminar competencia). Les daré un voto de confianza y veremos si para la próxima están corregidas.<br />
<br />
Algunas de esas limitaciones eran bastante curiosas, como el no poder acceder a Bluetooth, o que las alarmas no funciones si el teléfono no tiene batería (esta no es de la API), o alguna otra que había con las Live Tiles y las tareas en background. En todos los casos la respuesta fue que muchas limitaciones eran para proteger al usuario de malware O.O<br />
<br />
No sé los demás pero a mí, como desarrollador, me interesa acceder a TODO y poder especificar yo las limitaciones de mi aplicación. Por otra parte es comprensible que, ya que todas las aplicaciones se van a tener que descargar obligatoriamente desde el Zune Marketplace, quieran cubrirse las espaldas y no arriesgarse a demandas por facturas de miles de euros en SMS no solicitados, por ejemplo. Pero ya digo, como desarrollador me fastidia (por no decir me jode) que esté limitada "por la seguridad de un fulano que suele ser demasiado estúpido como para saber qué instala". Casi hubiera preferido que se hubiesen creado zonas de aplicaciones confiables en el Marketplace pero que nos dejasen la oportunidas de trastear con todo.<br />
<br />
El Marketplace, otra historia. Son 75 euros para registrarse como desarrollador, más caro que los 30 de Android y mucho más barato que los 200 de iOS. Y se pueden "liberar" hasta tres móviles para hacer instalaciones locales. Ni bien, ni mal; me parece correcto. Tiene en común con el resto de "mercados" que las aplicaciones pr0n están vetadas. Mal, muy mal; en el pr0n se mueve mucha pasta y están echando fuera a muchos potenciales compradores de la plataforma.<br />
<br />
También hay un programa de Ads (anuncios) e incluso un componente para meter esos Ads en las aplicaciones (de Microsoft, que es quien controla los clicks y las visualizaciones de anuncios). Curioso y creo que lo usaré nada, odio los anuncios. Probablemente me la rechacen pero mi segunda aplicación sería un eliminador de Ads y un AdBlock o algo así para el Internet Explorer del móvil. Sí, no hay Firefox, por ahora, ni Chrome y no he visto si hay Opera... una pena.<br />
<br />
Todavía he de probar cómo se comporta el navegador con los estándares. Prometían que iba bien pero no sé yo, no me fío del Explorer.<br />
<br />
Mi conclusión final es que no tengo conclusión porque no he podido probarlo a fondo. Lo mostrado promete mucho y la GUI Metro es curiosa y funcional. Lo que nos han mostrado me ha parecido interesante y me ha animado a desarrollar alguna cosilla para cogerle el tranquillo. Supongo que no puede ser más terrible que trabajar con Windows CE (todavía recuerdo cuando en el 2000 me hice con una PDA e intenté acceder al sensor de infrarrojos... con C++ y a pelo).<br />
<br />
Para poner los dientes largos: regalaban 5 móviles y nos hicieron, no sé, unas 30 preguntas para ver quienes se los llevaban.<br />
<br />
Ahora tengo sobre mi mesa uno de ellos, un <b><a href="http://es.engadget.com/2010/10/11/lg-quantum-en-nuestras-manos/">LG Quantum</a></b> (como el detergente), liberado y ya con la última versión de Windows Phone 7.5.<br />
<br />
Hale, moríos de envidia.<br />
<br />
Para una vez que gano algo...<br />
<br />
<br />
<b>Update</b>: me comentan desde twitter que el SDK de Microsoft es opcional y que otras compañías también pueden ofrecerlos. Gracias por la info. Sigo odiando los Ads vengan de quien vengan :-P<br />
<br />Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com2tag:blogger.com,1999:blog-8904200486219320800.post-31566806577248992742011-09-01T17:04:00.000+01:002011-09-01T17:04:39.037+01:00Marketing en redes sociales e idiotas con ordenador
<br />
<div style="margin-bottom: 0cm;">
Ayer, al destapar un yogur y dejar
impoluta la tapa con mi lengua, descubrí algo que me llamó mucho la
atención. Lo primero fue que normalmente el yogur se pega en
grandes cantidades en el borde de la tapa y, si no tienes cuidado al
lamer, te acaba salpicando. Lo segundo fue más inquietante: <i>todavía
había “premios” bajo las tapas</i>.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Recuerdo que en mi niñez a mi madre la
convencía con malas artes para que me comprase los yogures de
determinada marca, no porque estuviesen más buenos, sino porque bajo
las tapas había premios y, con suerte, recogías a la semana
siguiente el álbum de cromos de Naranjito o el muñeco que acababa
mordisqueado y olvidado bajo la cama...</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Además, en el Cola Cao o tenías los
muñequitos del Subbuteo o los Mini Airgamboys de Barcelona 92, o las
camisetas del Mundobasket. Que le dieran po'l saco al Nesquick,
aunque estaba más bueno y no te dejaba un pegote polvoroso en el
fondo de la taza. El Cola Cao te regalaba cosas útiles.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Para recoger ciertos regalos tenías
que enviar un carta, un cupón o lo que fuese y tú tenías tu cacho
de cartón pintado y la empresa tenía tus datos y te enviaba
publicidad y conocía algo más de tus hábitos de consumo.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<b>Quid pro quo</b>. A ti te daban un
muñequito y les cedías unos datos que realmente te importaban poco.
Total, que te enviasen un catálogo chorra que acababa en la basura
tampoco era molesto.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
A mi entender ésto no ha evolucionado
demasiado a lo largo de los años. Lo que ha involucionado es la
calidad de la recompensa al consumidor.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Todavía hay empresas que siguen dando
“satisfacción inmediata” (de verdad que Cola Cao es honrosa en
ese aspecto) pero la gran mayoría intentan saber de ti, seguirte y
espiarte sin darte nada.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Y a las tapas de yogur me remito: mete
un código, mete todos tus datos y adjunta un análisis de orina y
una muestra de heces y entras a un sorteo de una muñeca chochona. Las tapas de yogur, los cartones de
leche, el paquete de arroz o la bolsa de pañales para adultos.
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Y lo peor no es que esos expertos en
marketing pretendan obtenerlo todo a cambio de nada, que ya me jode
bastante, sino que hay gente que gustosamente cede su vida por nada.</div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
Ese es un consumidor <b><a href="http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=estupidez">estúpido</a></b>. No es
<b><a href="http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=idiota">idiota</a></b>, solo estúpido, porque no se da cuenta de que unos señores
con unos trajes muy caros seguirán ganando mucho dinero gracias a
varios miles de consumidores estúpidos que todavía creen en
unicornios rosa.
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
El consumidor puede ser estúpido, pero
no todos son idiotas. Sólo hay que hacerles ver que están haciendo
el tonto y se acabó perder el tiempo en páginas web que, además,
son horribles, hechas con Flash y que en condiciones normales no
serían visitadas más que por los pobres programadores/diseñadoras
a los que les toco hacerlas (vaya aquí mi condolencia para quienes tienen que sufrir tremendos engendros).</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Hasta aquí mis reflexiones sobre las
tapas de yogur, y ahora viene lo bueno: las campañas en Facebook y
la sobreidiotización del consumidor.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Es que resulta que después de comer el
yogur, y cuando la tele me pilló desprevenido sin el mando a mano
para hacer zapping, me tocó sufrir uno de los anuncios más
gilipollas que había visto desde lo último de Wipp Express: las
maquinillas Gillete.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
En ese engendro aparecen al final un
montón de capturas de supuestos “comentarios de Facebook” hechos
por “consumidores” alabando el deslizamiento de la susodicha
maquinilla (que por otra parte es cierto, yo uso el modelo anterior y
va de coña).</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
A ver, señores de Gillete, ¿nos han
tomado a todos por <b><a href="http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=gilipollas">GILIPOLLAS</a></b>?</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Todavía hay gente que no sabe cómo
funciona esto de las redes sociales y podría creérselo a pies
juntillas, igual que los hay que se creen los publirreportajes de la
leche de turno, pero hasta el más cateto se da cuenta de que esos
comentarios o han sido directamente falsificados con el Adobe
Premiere de turno, o existen realmente y han sido puestos por los
publicistas abriendo mil cuentas o porque sus empleados están
obligados por contrato a cantar sus alabanzas en Facebook.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Hay que ser un <b><a href="http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&LEMA=cretinismo">cretino</a></b> integral para ir
a la página de una empresa a cantar las alabanzas de una puta
maquinilla de afeitar. ¿Hay alguien que se crea que eso sucede?</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Si hablásemos de teléfonos móviles,
coches, vibradores... de algo satisfactorio y del que fácilmente
pueden haber grupos de fans... pero, ¿de una maquinilla de afeitar?</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
¿De verdad se creen que somos tan
<b><a href="http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=imb%C3%A9cil">imbéciles</a></b>?</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
El problema, para mí, es que acabo de
recibir un “¡Zas! ¡En toda la boca!”. Acabo de descubrir a unos
16000 idiotas, todos ellos fanáticos de una marca de agua ”ligera”.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
O sea que ahora la pregunta ha
cambiado, ¿cómo ese tipo de gente ha podido reproducirse?</div>
<div style="margin-bottom: 0cm;">
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Y hasta aquí mi disertación de hoy
sobre el advenimiento de la <b><a href="http://es.wikipedia.org/wiki/Idiocracy">idiocracia</a></b>. Cabreado me hallo.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
No tengo intención de poner enlaces a las empresas que menciono, no sólo por hacer campañas de marketing cutres en las que yo no gano nada, sino porque, principalmente, no me da la gana.<br />
</div>
<br /><div style="margin-bottom: 0cm;">
Hace un par de años, en mi temporada
de navegante de Second Life escribí una pequeña serie de artículos
tratando temas similares, pero orientado al marketing en ese entorno
virtual. Para quien le interese: <b><a href="http://ai-designstudio.net/es/docs/sldossier">Estudio totalmente subjetivo sobreSecond Life</a></b>.</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
Salut!</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
<div style="margin-bottom: 0cm;">
<br />
</div>
Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com0tag:blogger.com,1999:blog-8904200486219320800.post-19617774286965131392011-08-29T13:19:00.000+01:002011-08-29T13:19:23.469+01:00Annotations, esas desconocidas en PHPHe de reconocerlo, me encantan las <b><a href="http://en.wikipedia.org/wiki/Java_annotation">annotations</a></b> (<b><a href="http://www.codeproject.com/KB/cs/dotnetattributes.aspx">attributes</a></b> en .NET). Me parecen una de las herramientas mas útiles que nos puede proveer un lenguaje de programación y me pongo burro cuando las veo por algún sitio.<br /><br />Ya me había acostumbrado a ellas en Java hace tiempo cuando comencé con <b><a href="http://www.hibernate.org/">Hibernate</a></b> y más tarde seguí usándolas con .NET. Las annotations, en este caso, eran una manera de los más limpia para no tener que toquetear un xml cada vez que cambiaban los objetos de datos.<br /><br />Creas tu objeto de datos y lo mapeas en dos patadas, tal que así:<br /><br />
<blockquote>
<span style="font-family: "Courier New",Courier,monospace;">@Entity</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">@Table( name = "EVENTS" )</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">public class Event {</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ...</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">}</span></blockquote>
<br />Trabajo terminado.<br /><br />Más o menos hace un año, mientras estaba <b><a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a></b>ificando unga, que está programado, por ahora, con PHP, me surgieron una serie de dificultades:<br />- Necesitaba devolver los resultados en diferentes formatos (XML, JSON, HTML).<br />- PHP es un lenguaje de <b><a href="http://en.wikipedia.org/wiki/Strong_typing">tipado débil</a></b> y sólo en muy contadas ocasiones se puede especificar un tipo de datos.<br />- Con lo anterior tenía problemas para mapear números y cadenas, o incluso tipos de datos binarios sin mantener en algún sitio un objeto de conversión específico para cada tipo de datos. En Java/.NET/etc. es mucho más sencillo pues en cada momento se puede acceder al tipo de cada variable.<br /><br />Cómo pasar, por ejemplo de ésto:<br /><br />
<blockquote style="font-family: "Courier New",Courier,monospace;">
public class Cosa {<br /> public $DatoCadena = ‘pakito’;<br /> public $DatoFloat = 0.123;<br /> public $DatoEntero = 123;<br /> public $ArrayDeObjetos;<br />}</blockquote>
<br />A ésto:<br /><br />
<blockquote style="font-family: "Courier New",Courier,monospace;">
<?xml version="1.0" encoding="UTF-8" ?><br /><Cosa><br /> <DatoCadena>pakito</DatoCadena><br /> <DatoFloat>0.123</DatoFloat><br /> <DatoEntero>123</DatoEntero><br /><br /><ArrayDeObjetos><br /><br /> <Objeto....<br /><br /> ...<br /><br /></ArrayDeObjetos><br /></Cosa></blockquote>
<br />O más difícil aún, ¿cómo hacerlo a la inversa? (de XML a objeto).<br /><br />Recordemos: PHP es un lenguaje de tipado débil, de ahí el problema. Los Javeros, NETeros, C++eros y similares lo tienen algo más sencillo.<br /><br />Hay muchas formas y podrían hacerse muchos tipos de parsers pero siempre vamos a encontrarnos con que esos parsers no van a ser genéricos y requerirán que, cada vez que se modifique una clase, se incluyan sus nuevas propiedades específicas (por ejemplo, DatoPatito, haciendo referencia a objetos de tipo Patito).<br /><br />Podría delegarse la responsabilidad en cada objeto de datos, la cual fue mi primera opción, pero sería un coñazo, con el tiempo, tener que escribir las funciones de serializacion/deserialización cada vez que se crease un tipo de dato nuevo.<br /><br />En mi afán de obtener grandes resultados con el mínimo esfuerzo se me ocurrió que quizás con annotations en PHP podría especificar el tipo de datos de cada propiedad y crear únicamente <b><a href="http://en.wikipedia.org/wiki/Serialization">serializadores</a></b> genéricos que no habrían de ser tocados cada vez que se crease una nueva clase.<br /><br />La clase anterior bien podría quedar tal que así:<br /><br />
<blockquote style="font-family: "Courier New",Courier,monospace;">
class Cosa {<br /> /* @type = ‘string’ */<br /> public $DatoCadena = ‘pakito’;<br /> /* @type = ‘float’ */<br /> public $DatoFloat = 0.123;<br /> /* @type = ‘integer’ */<br /> public $DatoEntero = 123;<br /> /* @type = ‘array’, @object_type=’Objeto’ */<br /> public $ArrayDeObjetos;<br />}</blockquote>
<br />Limpio, claro y sin errores. Y además los componentes que tuviesen que tratar con esos objetos podrían tener especificados el tipo de datos con el que trabajarían y, si algún día hubiese que cambiarlo, sería modificar un simple parámetro. Por ejemplo:<br /><br />
<blockquote style="font-family: "Courier New",Courier,monospace;">
/* @object_type = ‘Cosa’ */<br />public function HacerCosas {...}</blockquote>
<br />Pues sí, aunque conozco a muchos desarrolladores que están en contra de estas cosas tan dinámicas, de construcción automática de código, de mapeos y de cosas así... no puedo evitarlo, a mí me gusta.<br /><br />Si a la supuesta sobrecarga de la “interpretación” de PHP (medio desmentido aquí: <b><a href="http://www.phpclasses.org/blog/post/155-Top-10-Wrong-Ideas-About-PHP-That-You-Should-Get-Right.html">http://www.phpclasses.org/blog/post/155-Top-10-Wrong-Ideas-About-PHP-That-You-Should-Get-Right.html</a></b> ) le añades que antes ha de examinar (reflexión) las clases de datos y decodificarlas la aplicación se morirá de asco.<br /><br />Yo no he notado disminución de rendimiento apreciable y sólo por la comodidad que me ofrece vale la pena la posible “pérdida” que pudiese acarrear. Hay que tener en cuenta que en los entornos de desarrollo yo no uso <b><a href="http://en.wikipedia.org/wiki/List_of_PHP_accelerators">op-code caches</a></b> ni optimizaciones de ningún tipo (memcache, caché de páginas, etc.).<br /><br />Para “escoger” qué solución de Annotations era la más adecuada, en mi caso, me guié por las opciones presentadas aquí: <b><a href="http://www.slideshare.net/stubbles/declarative-development-using-annotations-in-php">declarative development using annotations in php</a></b>. Al final me decidí por <b><a href="http://code.google.com/p/addendum/">Addendum</a></b> porque no todos los hosting tienen la posibilidad de instalar PEAR y porque además podría modificarla a gusto si lo necesitase.<br /><br />En <b><a href="http://sourceforge.net/projects/unga/">unga</a></b> todos los DTOs están “anotados” y me resulta muy sencillo realizar clases de serialización. Por ahora serializa para XML y JSON pero hay un futuro brillante esperando porque la era <b><a href="http://jquerymobile.com/">móvil</a></b> me está obligando a pensarme ciertas cosas sobre la presentación.<br />
<br />Así que sí, PHP tiene Annotations. Y decían que no era un lenguaje serio...<br /><br />Salut!<br /><br />Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com1tag:blogger.com,1999:blog-8904200486219320800.post-73768382340463371632011-08-25T10:57:00.000+01:002011-08-25T10:57:14.276+01:00To REST or not to RESTHay veces en las que no puedo evitar maravillarme por la raza humana. Somos capaces de crear unas herramientas increíbles y extremadamente versátiles, estudiarlas, justificarlas científicamente y analizando los pros (muchos) y los contras(escasos) de su uso... y acto seguido enviarlas a la mierda y condenarlas al ostracismo.<br /><br />REST me parece uno de esos casos.<br /><br />¿Qué es REST? Pues algo similar a ésto, en su forma más pura: <b><a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST en la wikipedia</a></b>.<br /><br />No es muy largo de leer pero por si acaso lo resumo:<br />- La mayor parte de las operaciones que realiza una aplicación es crear, actualizar, consultar y leer tipos de datos (clientes, productos, tweets, mensajitos de facebook, etc.) o “recursos” en la jerga. Lo que se llama <b><a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a></b>.<br />- Si estás trabajando en la web, con el protocolo HTTP, puedes especificar la operación a realizar: get, post, put y delete (entre otras). Eso es el <b><a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods">request method</a></b>.<br />- Sé listo y simplifica tus aplicaciones web, que casi todas son CRUD, y no llenes de mierda las urls. Usa los “request method” http y sé limpio.<br /><br />Pues no hay manera oye. Raro es el servicio web que usa “bien” REST. La gran mayoría te obligan a hacer verdaderas salvajadas del tipo:<br /><i><a href="http://servicio.com/uno/dos/tres/nombredeserviciototalmenteimposibledememorizar?op=1&papepipopu=asdf&pongaaquisusdatosinutiles">http://servicio.com/uno/dos/tres/nombredeserviciototalmenteimposibledememorizar?op=1&papepipopu=asdf&pongaaquisusdatosinutiles</a></i><br /><br />Como mucho se usa POST para enviar datos y GET para leerlos pero el resto de métodos se los han olvidado. Pero ¡ay de ti como se te olvidase la tabla de operaciones del parámetro “op”! (¿borrar era 1 o 4?)<br /><br />Comprendo que quizás hace 5 o 10 años fuese difícil de hacer que un navegador enviase una petición DELETE, pero hace tiempo que estamos en la era <b><a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29">AJAX</a></b> y hacer las cosas bien y claritas no habría de ser tan complicado... ¿o será vagancia?<br /><br />Sea como sea yo me he erigido a título personal en defensor del RESTarismo, soy un RESTafari de pro, y quizás fundamentalista. Desde hace ya tiempo no soporto ver código que no siga las especificaciones REST: si vas a hacer CRUD, hazlo bien, ¡carajo!.<br /><br />Comprendo que hay recursos o servicios que son imposibles o dificilmente expresables usando REST, por ejemplo un servicio de login, pero para todo lo demás, teniendo en cuenta que la mayor parte de lo que hacemos es actualizar objetos : si pretendes que yo use tus APIs, facilítame el trabajo.<br /><br /><br />Al llegar a este punto voy a darme algo de autobombo con <b><a href="http://sourceforge.net/projects/unga/">unga</a></b>, mi mimadito framework PHP, está preparado para REST “puro”: implementar servicios CRUD es tan sencillo como crear un controlador y hacerlo heredar de <i>REST_Controller</i> (sí, mala elección de nombre, ya lo cambiaré).<br /><br />Ese <i>REST_Controller</i> se va ocupar de recoger los parámetros de la url, recoger los datos de la petición (si los hubiese) y redirigir a la función correspondiente (create, retrieve, update, delete) según el “request method”.<br /><br />Lo he hecho tan sencillo, además, que incluso no habrá que teclear ni una línea de código para llevarlo hasta la base de datos: crea una clase <b><a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">Model</a></b>, indícale su nombre al Controlador y éste se encargará de hacerlo todo.<br /><br />Es similar al <b><a href="http://en.wikipedia.org/wiki/Scaffold_%28programming%29">scaffolding</a></b> que te da Ruby on Rails pero un poco más elaborado y, sobre todo, fácilmente modificable.<br /><br />¿Qué quieres obtener un dato? GET a <a href="http://servidor/servicio/objeto/id/xxxx">http://servidor/servicio/objeto/id/xxxx</a><br />¿Que quieres borrar? DELETE hacia <a href="http://servidor/servicio/objeto/id/xxxx">http://servidor/servicio/objeto/id/xxxx</a><br />¿Que quieres crear uno nuevo? POST a <a href="http://servidor/servicio/objeto">http://servidor/servicio/objeto</a><br /><br />Más fácil, imposible. Y si además unimos que se puede filtrar por cualquier campo (id, name, product_name, manzanas, peras...), que admite filtros avanzados (<, >, like...) y que trabaja indistintamente con JSON o XML (con sus restricciones)... Es que cada vez que lo veo me beso a mí mismo.<br /><br />Lástima que no esté todo lo estable que yo desearía, pero todo llegará.<br /><br />En resumen, una buena parte de los servicios que pululan por internet, emulando a algunas pancartas del 15-M “lo llaman REST y no lo es”. Eso es lo que quería dejar claro: en muchos casos estamos infrautilizando la tecnología o arrastrando errores año tras año, por cabezonería (y yo el primero).<br /><br />La próxima vez que tengas que hacer un CRUD: piensa en REST.<br /><br />Salut!<br /><br /><br />Más información:<br /><b><a href="http://www.xfront.com/REST-Web-Services.html">REST Web Services</a></b><br /><b><a href="http://www.infoq.com/articles/rest-introduction">Introducción a REST</a></b><br /><b><a href="http://rest.elkstein.org/">Más REST</a></b><br /><b><a href="http://www.slideshare.net/dnene/rest-representational-state-transfer-explained">Presentación sobre REST</a></b><br />Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com0tag:blogger.com,1999:blog-8904200486219320800.post-44512787599730956182011-08-22T10:00:00.001+01:002011-08-22T10:00:54.775+01:00Entorno de Desarrollo (III) - Eclipse y xdebugTras instalar un entorno donde ejecutar PHP el siguiente paso lógico, tras probar que funciona, sería decidir cómo editar los ficheros (o páginas) que vamos a utilizar.<br /><br />Como ya he dicho hay gente que todavía usa el bloc de notas (o sus equivalentes en Linux, incluyendo vi o Emacs) y algún “avanzado” ha descubierto Notepad++ o Ultraedit (probablemente crackeado, que todavía no conozco a nadie que haya pagado por él).<br /><br />Yo soy algo más pijo y prefiero un entorno “integrado” donde poder ver todo a primera vista, tener arbolitos con mis objetos categorizados y poder navegar con comodidad entre los, habitualmente, cientos de objetos con los que suelo trabajar. Y lo más importante, necesito, o mejor, me es imprescindible el poder depurar el código, porque no siempre un fichero de log te da todo lo que necesitas.<br /><br />Yo para todo esto uso <b><a href="http://www.eclipse.org/projects/project.php?id=tools.pdt">Eclipse PDT</a></b>, que es una especialización de Eclipse para trabajar con PHP. Es lo que YO uso y lo que yo recomiendo a quien me pregunta. Este entorno cubre por completo mis necesidades y además, para los que hemos trabajado con Java, es un entorno casi “de facto” por la cantidad de plugins útiles que tiene para nuestro trabajo diario.<br /><br />Si a alguien le interesan otros entornos, como Zend Studio o similares, no voy a hablar de ellos aquí.<br />
<br />Instalar Eclipse no tiene demasiado secreto:<br />
<ul>
<li>En Windows es bajarse un fichero y descomprimirlo (doy por supuesto que se tiene la máquina virtual de Java).</li>
<li>En Linux suele estar en los <b><a href="https://help.ubuntu.com/community/EclipseIDE%20">repositorios de programas</a></b> y si no, habrá que buscar ayuda en la web de eclipse o preguntando a papá Google.</li>
</ul>
Como ya advertí la información que ofrezco no es para muñones, así que habrá que acostumbrarse a leer, que yo solo soy el padre de mis hijos, no de todo el mundo.<br /><br />Si ya se tiene un Eclipse instalado podría actualizarse para que maneje PHP. En la web de Eclipse nos lo explican de manera bastante sencilla: <b><a href="http://wiki.eclipse.org/PDT/Installation">http://wiki.eclipse.org/PDT/Installation</a></b><br /><br />Cuando hayamos acabado ya podremos acceder a nuestra nueva instalación de Eclipse y editar ficheros como tontos.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSPBPr4fKKkl3_cMIQJgopeCVCgu8mAyMZGTxmiHAc6UMhrSM6KhvHlGZl28nbndOaX3OzPORzdjINxTrCjh6Vfa3DBpRUTfg4Vn_onPLWW-9TEy5XeJwtYLzfj1qK7OvAU-aay8rmzREa/s1600/B00_Eclipse.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSPBPr4fKKkl3_cMIQJgopeCVCgu8mAyMZGTxmiHAc6UMhrSM6KhvHlGZl28nbndOaX3OzPORzdjINxTrCjh6Vfa3DBpRUTfg4Vn_onPLWW-9TEy5XeJwtYLzfj1qK7OvAU-aay8rmzREa/s320/B00_Eclipse.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Entorno Eclipse</td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<span id="goog_1802786147"></span><span id="goog_1802786148"></span> <br />
<span style="font-size: large;">xdebug - depurador y más</span><br />
<br /><b><a href="http://xdebug.org/">xdebug</a></b> es una pequeña maravilla para PHP que nos va a permitir (entre otras cosas):<br />- Depurar código PHP (depuración remota).<br />- Realizar <b><a href="http://en.wikipedia.org/wiki/Profiling_%28computer_programming%29">profiling</a></b> del código ejecutado.<br />- Realizar <b><a href="http://en.wikipedia.org/wiki/Code_coverage">Code coverage</a></b> del código, muy útil para el test unitario.<br /><br />Instalar xdebug es relativamente sencillo y en este enlace de Zend lo explican paso a paso: <b><a href="http://devzone.zend.com/article/2803-Introducing-xdebug">http://devzone.zend.com/article/2803-Introducing-xdebug</a></b>.<br /><br />Para Linux la manera más sencilla es instalando a través de <b><a href="http://pecl.php.net/">PECL</a></b> que es algo así como un macro repositorio de cosas útiles.<br /><br />Para instalar PECL en ubuntu y similares se han de tener instaladas PEAR y las herramientas de desarrollo de php, tal como explican en este enlace: <b><a href="http://www.mkfoster.com/2009/01/04/how-to-install-a-php-pecl-extensionmodule-on-ubuntu/">how to install PECL extensions</a></b>.<br /><br />Realmente debería instalarse con los comandos:<br />
<blockquote>
<span style="font-family: "Courier New",Courier,monospace;">sudo apt-get install php-pear</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sudo apt-get install php5-dev</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sudo pecl install xdebug</span></blockquote>
En Windows hay que tener cuidado ya que se ha de saber con qué versión de Visual C++ ha sido compilada nuestra versión de PHP y si tenemos o no una versión Thread Safe. Para evitarnos problemas en esta página se puede pegar lo que nos devuelve phpInfo y sabremos qué versión descargar: <b><a href="http://xdebug.org/find-binary.php">Find xdebug binary</a></b><br /><br />Tras instalarlo habría que activarlo y configurarlo y para ello hay que editar el fichero php.ini. Su ubicación depende del sistema operativo y el servidor LAMP/WAMP usado.<br />
<ul>
<li>Si se usa Wampserver en Windows se puede acceder a él a través del panel de control.</li>
<li>En Linux suele estar en el directorio /etc/php5/apache2 o alguno similar y si no siempre se puede localizar utilizando estos comandos:</li>
</ul>
<blockquote style="font-family: "Courier New",Courier,monospace;">
sudo updatedb<br />sudo locate php.ini</blockquote>
Una vez editado el fichero php.ini habrá que agregar una línea similar a la siguiente (cambiar las rutas por las que correspondan a la ubicación de la librería xdebug):<br />
<br /><b>Windows</b>:<br />
<blockquote style="font-family: "Courier New",Courier,monospace;">
zend_extension_ts="c:\php\ext\php_xdebug-2.0.1-5.2.1.dll"</blockquote>
<b>Linux</b>:<br />
<blockquote style="font-family: "Courier New",Courier,monospace;">
zend_extension="/usr/lib/apache2/modules/xdebug.so"</blockquote>
<br />Yo suelo ubicarla al final de la definición de las extensiones porque justo después agrego la configuración de xdebug.<br /><br />Existen varios parámetros que se pueden configurar (agregar las líneas indicadas en el php.ini, tras las anteriores), aunque yo, personalmente, sólo suelo incluir los siguientes en una instalación básica:<br /><br />
<blockquote style="font-family: "Courier New",Courier,monospace;">
[xdebug]<br />xdebug.remote_enable=On<br />xdebug.remote_host="localhost"<br />xdebug.remote_port=9000<br />xdebug.remote_handler="dbgp"</blockquote>
Esto nos permite depuración remota desde localhost para el puerto 9000. Todas las opciones de configuración están explicadas en la <b><a href="http://xdebug.org/docs/">documentación de xdebug</a></b> así que sólo me pararé cuando alguna me parezca importante.<br /><br />En mi caso, dado que uso ciertos servicios que trabajan en el puerto 9000 suelo tener que cambiar el parámetro <i>xdebug.remote_port</i> a otro puerto.<br /><br />Ahora ya deberíamos tneer preparado el entorno para depurar y para ello reiniciamos Apache:<br />
<br /><b>Linux</b><br />
<blockquote style="font-family: "Courier New",Courier,monospace;">
sudo service apache2 restart (o su equivalente en otras distribuciones)</blockquote>
<b>Windows</b><br />
<blockquote style="font-family: "Courier New",Courier,monospace;">
Desde el panel de control de WampServer o el que sea.</blockquote>
<br />Al ejecutar <b><a href="http://localhost/info.php">http://localhost/info.php</a></b> (que espero que no se haya borrado) se deberá obtener algo similar a lo mostrado en la figura:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizitma4ji9Vz_9pl4wEd7z8SiVO6jx58wA0jpuFi2AtEiFMyb-qQukYYzC1H2EQ6MYjuZBBD4K0p9t0hQ_UMSif4WyixRcLzaTZVnTXxA9XZ-wiTvZ1kOaLSOocoB_4OHyd-xwWnoRu2VA/s1600/B00_b_PHPInfo1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizitma4ji9Vz_9pl4wEd7z8SiVO6jx58wA0jpuFi2AtEiFMyb-qQukYYzC1H2EQ6MYjuZBBD4K0p9t0hQ_UMSif4WyixRcLzaTZVnTXxA9XZ-wiTvZ1kOaLSOocoB_4OHyd-xwWnoRu2VA/s320/B00_b_PHPInfo1.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">phpInfo + xdebug</td></tr>
</tbody></table>
<i><span style="font-family: "Courier New",Courier,monospace;">This program makes use of the Zend Scripting Language Engine:</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> with Xdebug v2.0.5, Copyright (c) 2002-2008, by Derick Rethans</span></i><br />Y deberá existir una sección xdebug donde se podrán ver todos los parámetros de configuración de la extensión.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw95FynfAVRDrBo3SyouGd414GV5SiEadQvLNDeI13FES2XWoqV0RvYY5n-2f2Ea12QImRH8LRN1cXCrusBS-PTkKYRkrXGnwnMySxxr4bNHbK0uv7tX3krxuJ4Of30LPfAqIplg7r92qh/s1600/B00_b_PHPInfo2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw95FynfAVRDrBo3SyouGd414GV5SiEadQvLNDeI13FES2XWoqV0RvYY5n-2f2Ea12QImRH8LRN1cXCrusBS-PTkKYRkrXGnwnMySxxr4bNHbK0uv7tX3krxuJ4Of30LPfAqIplg7r92qh/s320/B00_b_PHPInfo2.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAF8W50sCjfIyr9aKYLn6UpYxBXjZrrGstVOnv0mydI75iZa5Sx3h8v64R6mJILTCNrYQL2c_N2taRaWG03wirhiYD8jEyj37mhLTiMhVq-Gj2iA8hXbUyZ_nOM8dmP_SRoau6caCN0RT4/s1600/B01_EclipseXDEBUG.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<br />Si el servidor no arrancase habría que examinar los logs de Apache y PHP para averiguar qué extensión está fallando y buscar ayuda en internet. Los errores que me he encontrado yo han sido, casi siempre, librerías de versiones erróneas.<br /><br /><span style="font-size: large;">Depurando con Eclipse</span><br /><br />Llegamos a la parte útil y donde comenzaremos a ver la potencia de xdebug: depurando.<br /><br />En este artículo podemos ver los pormenores de configuración del entorno de depuración, que no es que sea nada del otro mundo: <b><a href="http://devzone.zend.com/article/2930">Debugging PHP Applications with xdebug</a></b><br /><br />La secuencia de pasos está bastante clara y, conociendo un poco Eclipse, se puede averiguar dónde cambiar ciertas opciones de configuración.<br /><br />Por ejemplo, podemos cambiar el depurador o cambiar sus opciones (en el caso de que se cambie el puerto, por ejemplo). O eliminar el check que viene marcado por defecto siempre de “<i>Break at first line</i>” que con proyectos grandes puede hacerse pesado.<br /><br />Todo eso puede hacerse desde la opción PHP de la ventana de preferencias de Eclipse:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAF8W50sCjfIyr9aKYLn6UpYxBXjZrrGstVOnv0mydI75iZa5Sx3h8v64R6mJILTCNrYQL2c_N2taRaWG03wirhiYD8jEyj37mhLTiMhVq-Gj2iA8hXbUyZ_nOM8dmP_SRoau6caCN0RT4/s1600/B01_EclipseXDEBUG.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAF8W50sCjfIyr9aKYLn6UpYxBXjZrrGstVOnv0mydI75iZa5Sx3h8v64R6mJILTCNrYQL2c_N2taRaWG03wirhiYD8jEyj37mhLTiMhVq-Gj2iA8hXbUyZ_nOM8dmP_SRoau6caCN0RT4/s320/B01_EclipseXDEBUG.png" width="320" /></a></div>
<br />
<br />Para averiguar qué efecto causa cada cosa se puede recurrir al clásico “<i>trastear</i>”. No estoy yo para hacer manuales pormenorizados de todo. Si hubiese problemas, internet es una gran fuente de información y casi seguro que los errores que tenemos le han sucedido a alguien ya.<br /><br />El caso es que ya deberíamos haber acabado de configurar Eclipse para que pueda depurar remotamente así que vamos a crear un fichero de prueba llamado <b>simple.php</b> y rellenarlo con este código:<br /><br />
<blockquote>
<span style="font-family: "Courier New",Courier,monospace;"><?php</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">class Pakito {</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> public function show($message) {</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> $result = 'Este es el mensaje: '.$message;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> echo $result;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> }</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">}</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">$clase = new Pakito(); // Agregar punto de parada aquí</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">$clase->show('Chorrada de prueba');</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">?></span></blockquote>
Odio hacer programas de ejemplo así que me he lucido bastante poco con éste. Tampoco es que la calidad vaya a variar mucho en el futuro por muchas críticas que reciba, así que en este caso toca aguantarse con lo que hay.<br /><br />Primero deberíamos poner un punto de parada en la línea que he indicado y eso se hace desde dentro de Eclipse. Deberías saberlo ya: doble click en la zona sombreada del editor de ficheros.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig4YCBLhnZ9TnyCEZ9JrTgho9utGWjMJYBJp9VHNslBj2F0tQdEgwYZ0oYcDFq7CRn85Re-21ibMtsgLrurHrtPMoo00KMV_6PghsxIYD2aOYCN5hyphenhyphenugeQv2-egNAWm_1jlDZwongXkZt6/s1600/B02_Eclipse_breakpoint.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig4YCBLhnZ9TnyCEZ9JrTgho9utGWjMJYBJp9VHNslBj2F0tQdEgwYZ0oYcDFq7CRn85Re-21ibMtsgLrurHrtPMoo00KMV_6PghsxIYD2aOYCN5hyphenhyphenugeQv2-egNAWm_1jlDZwongXkZt6/s320/B02_Eclipse_breakpoint.png" width="320" /></a></div>
<br />
<br />El siguiente paso es lanzar la depuración en sí: botón derecho sobre el fichero (en el árbol de ficheros) y seleccionar la opción de “<i>Debug as</i>” y “<i>PHP Web Page</i>”.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhxRX80BSjwDmVoQVxkkUerRVjHTAxt4wgnn9RgenPy1aXpXnwA-RgYG8eL3zGc6luThipB_TUIxaijN22vxfanIaCwPGd25bekAJ2mlOLTUC859CfHCpffTaX6zHLKcom7jlM5LxDHllX/s1600/B03_Eclipse_debug_launch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhxRX80BSjwDmVoQVxkkUerRVjHTAxt4wgnn9RgenPy1aXpXnwA-RgYG8eL3zGc6luThipB_TUIxaijN22vxfanIaCwPGd25bekAJ2mlOLTUC859CfHCpffTaX6zHLKcom7jlM5LxDHllX/s320/B03_Eclipse_debug_launch.png" width="320" /></a></div>
<br />
<br />Y si todo va bien (que debería) se abrirá la perspectiva de depuración PHP de Eclipse y el depurador se nos parará en el breakpoint indicado en nuestro chorriprograma (o en la primera línea si es que no hemos quitado el check).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg71kOrTbAMOVFk7UywA0k-EKc-4xC8i1or02AFJ8IxoeF6Vm33GpN2krK_TAbr7ltb-nFLS43AaHnQ_C2LBTETX2kg7DAU0org7UBDayaG06DzUeOES3zFd4uj_sMvo_ew-OyJ1Y49ylLb/s1600/B04_Eclipse_debuging.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg71kOrTbAMOVFk7UywA0k-EKc-4xC8i1or02AFJ8IxoeF6Vm33GpN2krK_TAbr7ltb-nFLS43AaHnQ_C2LBTETX2kg7DAU0org7UBDayaG06DzUeOES3zFd4uj_sMvo_ew-OyJ1Y49ylLb/s320/B04_Eclipse_debuging.png" width="320" /></a></div>
<br />Se puede ver que disponemos de las habituales herramientas de depuración de Eclipse, incluidas la pila de llamada y las variables. Como curiosidad se pueden acceder a las variables internas del servidor (por ejemplo <b>$SERVER</b>, <b>$REQUEST</b> o <b>$COOKIES</b>). ¡Semos todopoderosos!<br /><br />Supongo que llegar a este punto no debería haber dado demasiados problemas. Lo que pudiera surgir probablemente sería alguna mala configuración de rutas (por ejemplo la ruta hacia el ejecutable de php) o de puertos. De todas formas: siempre nos quedará internet.<br /><br />xdebug es una herramienta tremendamente potente de depuración y, aunque hablaré de ello en detalle más adelante, aquí van un par de enlaces, además de los presentes en la documentación oficial, para saborear sus posibilidades de <b><a href="http://www.sitepoint.com/faster-php-apps-profile-your-code-with-xdebug/">Profiling</a></b> (mucho cuidado porque se come el disco en un visto y no visto) y <b><a href="http://devzone.zend.com/article/2955">Code Coverage</a></b>.<br />
<br />
En unión con PHPUnit es una herramienta my efectiva para el <b><a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a></b>.<br /><br />En futuros posts ampliaré la parte de Code Coverage con <b><a href="http://www.phpunit.de/manual/current/en/">PHPUnit</a></b> y <b><a href="http://www.phing.info/trac/">Phing</a></b>, el equivalente de ANT para PHP.<br />
<br />
<br />Salut!<br /><br /><br />Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com0tag:blogger.com,1999:blog-8904200486219320800.post-5144265876639449802011-08-19T10:10:00.000+01:002011-08-19T10:10:42.961+01:00Entorno de desarrollo LAMP (II) - Servidores web<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
En este artículo voy a mostrar cómo instalar un servidor <a href="http://es.wikipedia.org/wiki/LAMP">LAMP</a>/WAMP completo: Apache + PHP + MySQL.<br />
<br />
Como no pretendo montar un supertutorial y repetir toda la información disponible por la red sólo voy a comentar los enlaces y dar ciertas indicaciones en casos especiales.<br />
<br />
Tampoco, en este artículo, entraré en discusiones sobre si es mejor Apache como servidor web o debería usar <b><a href="http://www.lighttpd.net/">Lighttpd</a></b> porque es la bomba, o si <b><a href="http://www.mysql.com/">MySQL</a></b>, <b><a href="http://www.oracle.com/us/products/database/index.html">Oracle</a></b> o <b><a href="http://www.postgresql.org/">PostgreSQL</a></b> como motor de base de datos. Mi intención, ahora mismo es tener un entorno (de desarrollo, integración e incluso producción) funcionando. Si el desarrollo se realiza de forma correcta la migración a otros entornos no debería traer demasiados dolores de cabeza.<br />
<br />
Empezaremos con el servidor LAMP/WAMP: Apache, PHP y MySQL. Las instrucciones las daré para Windows y Linux (en principio ubuntu y derivados)<br />
<br />
<span style="font-size: large;">Windows</span><br />
<br />
Para Windows yo suelo utilizar <b><a href="http://www.wampserver.com/en/">WampServer</a></b>, no porque sea mejor o peor sino porque es sencillo de instalar y estoy acostumbrado a su panel de control. A algunos les gusta más <a href="http://www.apachefriends.org/es/xampp.html"><span id="goog_1078061877"></span><b>XAmpp</b></a> <span id="goog_1078061878"></span>pero yo sólo he usado éste para crear “demos” y llevármelas en un lápiz usb.<br />
<br />
Como la página principal es muy explicativa y la instalación es sencillísima no voy a entrar en más detalles. Sólo hay que ir a <a href="http://www.wampserver.com/en/">http://www.wampserver.com/en/</a> y seguir las instrucciones.<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCrhViIepWdEDh2J1CuNEHtmk9KGUiidIVtfhoKgmHXNd3fRlsD1MIQa5Q3ZRliU85et9kDY7Ddq50joUErZHOm_j6M5hNkBQLsqUectybJRSobCsgU4gT7n78kXozd4Rr_sdYWYIvoqfZ/s1600/01_WampServer_web_page.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCrhViIepWdEDh2J1CuNEHtmk9KGUiidIVtfhoKgmHXNd3fRlsD1MIQa5Q3ZRliU85et9kDY7Ddq50joUErZHOm_j6M5hNkBQLsqUectybJRSobCsgU4gT7n78kXozd4Rr_sdYWYIvoqfZ/s320/01_WampServer_web_page.png" width="294" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Página web de WampServer</td></tr>
</tbody></table>
<br />
Tras hacer la instalación tendremos un icono nuevo, llamado WampServer, y al lanzarlo nos aparecerá un nuevo “applet” en la barra de herramientas desde donde podremos lanzar/apagar el servidor y realizar algunas tareas de configuración.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt5IDYpFFCPo44LThspysg9d6V3Vyt85CsCcAFXh6Sv58BHeCa2AJskIf7tBPjoXJjPbn5jUy5wIYkA543DidUctTZFXiA4Uw8PTVtEUSUHUneg8369t-6qfHn3Lbz2NSOwJeNHipZlS4K/s1600/02_WampServer_taskbar_menu.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt5IDYpFFCPo44LThspysg9d6V3Vyt85CsCcAFXh6Sv58BHeCa2AJskIf7tBPjoXJjPbn5jUy5wIYkA543DidUctTZFXiA4Uw8PTVtEUSUHUneg8369t-6qfHn3Lbz2NSOwJeNHipZlS4K/s1600/02_WampServer_taskbar_menu.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Icono WampServer y panel de control</td></tr>
</tbody></table>
<br />
<br />
A través de los menús podremos activar y desactivar módulos de Apache y PHP así como acceder al gestor de bases de datos PHPMyAdmin. Activar un módulo es tan simple como hacer click sobre él; WampServer se reiniciará y el módulo estará disponible al momento.<br />
<br />
También se puede realizar lo mismo a través de los ficheros de configuración correspondientes (httpd.conf, php.ini, my.ini) a los que se puede acceder a través del panel de control de WampServer.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE02_rtyKwIfX9ot3ISWfd7xu5zpLNlRTDCrUNIxw_RaNkuzzPY731prU_Yg-3kMcsfybL4lpwfuiz2yo3RmhSzqVfNj3aLatVbibR6e3Mf_2jt5Tw81aDCQxhp_j358t1d5BW6cw1hHnI/s1600/03_WampServer_httpd_conf.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE02_rtyKwIfX9ot3ISWfd7xu5zpLNlRTDCrUNIxw_RaNkuzzPY731prU_Yg-3kMcsfybL4lpwfuiz2yo3RmhSzqVfNj3aLatVbibR6e3Mf_2jt5Tw81aDCQxhp_j358t1d5BW6cw1hHnI/s320/03_WampServer_httpd_conf.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Editando httpd.conf</td></tr>
</tbody></table>
<br />
Para comprobar que está correctamente instalado (tanto el servidor web como PHP) simplemente se ha de crear un fichero con el nombre, por ejemplo, info.php con el siguiente contenido:<br />
<div style="text-align: left;">
<blockquote style="font-family: "Courier New",Courier,monospace;">
&lt;?phpphpInfo();<br />
?&gt;</blockquote>
</div>
<br />
Este fichero ha de guardarse en el directorio “root” de apache. Si no se han tocado demasiado las rutas será algo como c:\wamp\www. Una vez allí sólo habrá que dirigirse a <b><a href="http://localhost/info.php">http://localhost/info.php</a></b> y comprobar que se obtiene alguna pantalla similar a la mostrada.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7_WFDJNuZCru3kq8hhQgTQ5sQk0Yos_NdclHuVfj1nkRTTmGGkwK9oDSTOpM3NW8KCbDQFmYUxLe1sIu41KeG_lOO4bYnyVgGMKdzwySKCtwzWbzvfZQElIv8OjRwrGmJf-xC9sCrjjr1/s1600/04_PHPInfo.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7_WFDJNuZCru3kq8hhQgTQ5sQk0Yos_NdclHuVfj1nkRTTmGGkwK9oDSTOpM3NW8KCbDQFmYUxLe1sIu41KeG_lOO4bYnyVgGMKdzwySKCtwzWbzvfZQElIv8OjRwrGmJf-xC9sCrjjr1/s320/04_PHPInfo.png" width="295" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">phpInfo()</td></tr>
</tbody></table>
<br />
<br />
Otro paso es comprobar la base de datos y ésto se puede hacer con <b><a href="http://www.phpmyadmin.net/home_page/index.php">phpMyAdmin</a></b> desde el panel de control de WampServer. Debería aparecer algo similar a la imagen de abajo.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_JMHoG4kZ4950o7zeUHZuP9PYBPpPv3kYmc4_qJCDpNry8SHTlwAWHSGf-qA7HLnbq7h3MoAhOI-N301cleZkJZ8XmQAwoE8_1dXSLzl4ZZTSCycN7RTU6kEbs_oVG2F_szOACoHXz1pl/s1600/05_PHPMyAdmin.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="279" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_JMHoG4kZ4950o7zeUHZuP9PYBPpPv3kYmc4_qJCDpNry8SHTlwAWHSGf-qA7HLnbq7h3MoAhOI-N301cleZkJZ8XmQAwoE8_1dXSLzl4ZZTSCycN7RTU6kEbs_oVG2F_szOACoHXz1pl/s320/05_PHPMyAdmin.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">phpMyAdmin</td></tr>
</tbody></table>
<br />
Si algo falla habrá que bucear en internet para descubrir qué es, a menos que uno sea adivino. Se pueden consultar los logs de cada aplicación desde el panel de control de Wamp. Muchas veces serán problemas de módulos de Apache/PHP mal configurados (por lo que recomiendo desactivarlos todos e ir activándolos uno a uno hasta llegar al culpable) o conflictos con puertos (por ejemplo tener instalado el <b><a href="http://es.wikipedia.org/wiki/Internet_Information_Services">IIS</a></b> a la vez que el Wamp)<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAwwnZsU1pM4J0x90K9Gxwtbm73ZPoW3rHA2ekLiCUJw6WzJHU9M0ylTwKwuS4YNmWEpJgFv1UQKUDd-_-M5XAiEQHGWvfwYhkuFPeWLK_pikAcBzr361XIb9_qRL880_HkPXtBOR_hTi5/s1600/06_ApacheErrorLogs.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAwwnZsU1pM4J0x90K9Gxwtbm73ZPoW3rHA2ekLiCUJw6WzJHU9M0ylTwKwuS4YNmWEpJgFv1UQKUDd-_-M5XAiEQHGWvfwYhkuFPeWLK_pikAcBzr361XIb9_qRL880_HkPXtBOR_hTi5/s320/06_ApacheErrorLogs.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Apache error log</td></tr>
</tbody></table>
<br />
<br />
<br />
<br />
<span style="font-size: large;">Linux</span><br />
<br />
Como he dicho me voy a basar en <b><a href="http://www.ubuntu.com/">Ubuntu</a></b> y sus derivadas y presupondré que se saben instalar programas para este sistema operativo. Como no soy tan mala persona como parezco ahí va una pista: en esta página hay muchísima información sobre ubuntu y cómo trastear con él - <b><a href="http://sliceoflinux.com/">Slice of Linux</a></b>.<br />
<br />
Normalmente al instalar Linux se pueden seleccionar los paquetes a agregar así que es probable que alguna parte de los componentes esté presente ya. Aunque se lance la reinstalación la mayoría de sistemas de empaquetado de Linux son lo bastante inteligentes como para comprobar antes si ya existe el programa.<br />
<br />
Yo soy de los que prefiere comenzar con una instalación básica sin demasiada porquería e ir añadiendo a mano lo que necesite. Como buena parte de lo que hago va a estar en servidores y abierto a internet me parece muy peligroso meter toda la mierda de golpe y dejarla descontrolada. Linux es seguro, sí, pero yo no pondría la mano en el fuego porque ningún programa no te vaya a abrir un puerto que no deseas o bajar una configuración que dé acceso a los “programas de hacking” que ejecutan los script kiddies por ahí.<br />
<br />
Por otra parte rara será la empresa de hosting que te ofrezca un terminal remoto o un panel de control aceptable a precio razonable así que considero imprescindible, cuando instalo un entorno de integración o pre-producción, que sea lo más parecido al entorno real, sin aditivos innecesarios. Lo mejor es ver paso a paso <b><a href="http://sliceoflinux.com/2010/06/15/instalar-ubuntu-server-10-04-lts/">cómo instalar un ubuntu server</a></b>.<br />
<br />
También es conveniente ver <b><a href="http://lobotuerto.com/blog/2008/04/30/como-instalar-lamp-en-ubuntu-804/">cómo instalar un sistema “AMP” paso a paso en Ubuntu 11.04</a></b> (vale también para otras versiones). Las diferencias con Debian u otras distribuciones que usan paquetes .deb son mínimas (quizás de versiones). Para el resto de distribuciones, pues habrá que buscar ayuda; yo hace años que no uso CentOS o Fedora. La culpa es vuestra por usarlas :-P<br />
<br />
Es recomendable instalarse phpMyAdmin en Linux ya que, a diferencia de los “AMP” de Windows, no suele estar por defecto.<br />
<br />
Prometo que, por ahora, Canonical no me paga nada para que haga publicidad de Ubuntu. Lo que pasa es que soy un poco muñón cuando toco cosas y si la cago prefiero tener dónde buscar soluciones... y los Ubuntus están hasta en la sopa. Lo fácil que es googlear “lamp ubuntu” y que te devuelva chorrocientos tutoriales y hacer lo mismo con Fedora y que se acaben en la página 1...<br />
<br />
Bien lo importante de esta instalación es recordar que las páginas web deberán alojarse en el directorio “<i>var/www</i>” (o su equivalente que habrá que buscar convenientemente según la distribución usada).<br />
<br />
En este punto tendremos un servidor Apache, con PHP y MySQL así que ya se puede empezar a trastear. Todavía no está “seguro” ya que, por ejemplo, la clave de root en MySQL es probable<br />
que esté en blanco o que sea un verdadero coñazo ejecutar ciertos scripts desde phpMyAdmin.<br />
<br />
<span style="font-size: large;">Bonus - MySQL Workbench</span><br />
<br />
Alguno, sobre todo los que provenimos del mundo Oracle, podría echar de menos el <b><a href="http://www.quest.com/toad/">Toad</a></b>, aunque existe una versión para MySQL. Pero, ¿para qué pagar cuando puedes tener una herramienta similar, o incluso mejor, de forma gratuita?<br />
<br />
De las pocas cosas buenas que hizo Oracle cuando compró MySQL fue unificar todas las herramientas de cliente en una sola: <b><a href="http://dev.mysql.com/downloads/workbench/">MySQL Workbench</a></b>. Entre las cosas malas que hicieron fue subir los precios, pero ya lo criticaré si lo veo conveniente.<br />
<br />
Con esta herramienta se pueden ejecutar scripts, acceder a las base de datos y a sus objetos, diseñar visualmente el modelo de datos e incluso controlar los servidores (start, stop, backups...). Así que recomiendo encarecidamente que cualquiera que vaya a trastear con bases de datos se lo instale.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKOXKcCB2fMMT29KtNS3VN2TxVvG0vMhBB9IIU4p6W2fNiGwHJaCRahrKKJ_dpLsnlSxIAWLI2lsEzf-uMKme4Hdoyz0OeAYIhPbdOoH54gkAodj8JD9v6WfbCjFkqRsGIOp1ltHTj91JJ/s1600/07_MySQL_Workbench.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKOXKcCB2fMMT29KtNS3VN2TxVvG0vMhBB9IIU4p6W2fNiGwHJaCRahrKKJ_dpLsnlSxIAWLI2lsEzf-uMKme4Hdoyz0OeAYIhPbdOoH54gkAodj8JD9v6WfbCjFkqRsGIOp1ltHTj91JJ/s320/07_MySQL_Workbench.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MySQL Workbench. Tomada de www.mysql.com</td></tr>
</tbody></table>
<br />
En Windows es fácil: descargarse el ejecutable y lanzarlo. En Linux o bien está el programa en la lista de “instalables” o habrá de hacerse a mano (ésto para ubuntu <b><a href="https://help.ubuntu.com/community/MySqlWorkBench">https://help.ubuntu.com/community/MySqlWorkBench</a></b>). Lo malo es que es muy probable que después de que Oracle haya metido las zarpas ya no exista un versión Open Source que pueda incluirse en los repositorios.<br />
<br />
<br />
<br />
<span style="font-size: large;">Bonus II - Cambio password de root (mySQL)</span><br />
<br />
Tal como suelen estar las instalaciones por defecto en mysql la verdad es que de seguridad, poca. En Linux es probable que sí haya solicitado una password pero con Windows, y con el WampServer, estoy casi seguro que la password será “en blanco” (no literalmente... password vacía).<br />
<br />
Con phpMyAdmin se puede cambiar la password sin problemas desde la pestaña de Privilegios y editando el usuario afectado.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLsjoOTMcJifX8v663jQ5rEhpGmUEcf9xOZlmZg86KMUQ9rQt8h-lPsyTBv0CM6mdKEpp0KxyklMxyrMZ0AzbEYFt7y6110A08OaUDJoPuPTI5rfTnGXl0VGUsgYjwE_Y3zA4C7F_pbUT5/s1600/08_phpMyAdmin_privileges.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLsjoOTMcJifX8v663jQ5rEhpGmUEcf9xOZlmZg86KMUQ9rQt8h-lPsyTBv0CM6mdKEpp0KxyklMxyrMZ0AzbEYFt7y6110A08OaUDJoPuPTI5rfTnGXl0VGUsgYjwE_Y3zA4C7F_pbUT5/s400/08_phpMyAdmin_privileges.png" width="400" /></a></div>
<br />
<br />
<br />
Tras cambiar la password, phpMyAdmin dejará de funcionar y habrá que editar el archivo config.inc.php para incluir las nuevas credenciales.<br />
<br />
<br />
<span style="font-size: large;">Bonus III - Panel de Control Web en Linux</span><br />
<br />
Cuando trabajo con servidores Linux me resulta un engorro el tener que entrar por telnet para reiniciar servidores o editar ficheros, sobre todo para lo último. Si el ordenador está cerca y es accesible al 100% no hay problema ya que siempre se puede instalar un entorno gráfico y la cosas se facilita. Si el ordenador está a 3000 km en un hosting podemos morirnos con los tiempos de latencia: movemos el ratón y, tras un café o dos, responderá al otro lado (sí, exagero).<br />
<br />
En estos casos “remotos”, si nuestro proveedor de hosting no nos provee de un panel “chachi” como <b><a href="http://www.cpanel.net/">cPanel</a></b> (de pago) tenemos todavía una opción free: <b><a href="http://www.webmin.com/">Webmin</a></b>.<br />
<br />
Con este panel de control podemos controlarlo todo de manera visual y usando un navegador. Usa applets Java (puaj!) para ciertos servicios, pero es un mal menor. No es que la línea de comandos no sea bonita pero si nos ponen las cosas algo más fáciles acabaremos antes.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR66kRIjhG4AqECLyixSDZ00wdH7NhJvYGaZaQboYkh_Yxh_NYWAvkRgKtzb3bm-ZMJl_BvjerZQjTVt7xTvN8r3wiM7nulFtZkmKOk8aa_C3diUOiD-LVDLs57XrmeVj4ye6AUNeL0iwY/s1600/09_Webmin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR66kRIjhG4AqECLyixSDZ00wdH7NhJvYGaZaQboYkh_Yxh_NYWAvkRgKtzb3bm-ZMJl_BvjerZQjTVt7xTvN8r3wiM7nulFtZkmKOk8aa_C3diUOiD-LVDLs57XrmeVj4ye6AUNeL0iwY/s320/09_Webmin.png" width="320" /></a></div>
<br />
<br />
Como ya otros han escrito sobre el tema me ahorro el hacerlo yo. Para instalar: <b><a href="http://sliceoflinux.com/2009/09/07/instalar-webmin-en-ubuntu-paso-a-paso/">http://sliceoflinux.com/2009/09/07/instalar-webmin-en-ubuntu-paso-a-paso/</a></b>. ¡Ojo! hay que tener cuidado con las versiones de Wembin o de sus dependencias. Lo mejor es ir a la página y asegurarse de que estamos descargando la versión más reciente.<br />
<br />
<span style="font-size: large;">Bonus IV - Activar/desactivar módulos de Apache (y PHP)</span><br />
<br />
Usando WampServer en Windows es tan sencillo como poner o quitar el check en el módulo afectado (poner es pulsar una vez, quitar, es pulsar otra vez, el servidor se reiniciará cada vez que se cambie).<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI7ShyphenhyphenR0vTdYG-mGA87bgQOFnL8ju7DSnafcVqZVo0KRZ0LKIiyXATlgAn1DTFKRN_wHj5yDBmfc-ZjoGnE9Yp9sf69ixywdB0khroyVZPOToBL9tUKb3bGTtynVL6nUP_4a8rkK11vvQ-/s1600/10_ApacheModules.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI7ShyphenhyphenR0vTdYG-mGA87bgQOFnL8ju7DSnafcVqZVo0KRZ0LKIiyXATlgAn1DTFKRN_wHj5yDBmfc-ZjoGnE9Yp9sf69ixywdB0khroyVZPOToBL9tUKb3bGTtynVL6nUP_4a8rkK11vvQ-/s320/10_ApacheModules.png" width="320" /></a></div>
<br />
<br />
Sucede lo mismo para activar o desactivar módulos de PHP (excepto algunos que se verán más adelante).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMTOaswSOb2W4GW-lc2IDjfzrjOkvb1xxALyQ1HXrFCZ0eiCZL4LwXL-p-SNG3MhyYlz8On41WsudGk8_FIlfaClcTTQfYQsm2uH4sqoEJWh7mKzK8uUDG0SvBgImVP-exqNekbncfud-N/s1600/11_PHPExtensions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMTOaswSOb2W4GW-lc2IDjfzrjOkvb1xxALyQ1HXrFCZ0eiCZL4LwXL-p-SNG3MhyYlz8On41WsudGk8_FIlfaClcTTQfYQsm2uH4sqoEJWh7mKzK8uUDG0SvBgImVP-exqNekbncfud-N/s320/11_PHPExtensions.png" width="320" /></a></div>
<br />
<br />
Con Linux (basadas en Debian) es similar, pero en vez de usar el ratón se usarán los comandos "<i>a2enmod</i>" (activar) y "<i>a2dismod</i>" (desactivar) seguidos del nombre del comando. Por ejemplo, para activar el módulo rewrite (mod_rewrite):<br />
<blockquote style="font-family: "Courier New",Courier,monospace;">
a2enmod rewrite</blockquote>
<br />
Si nuestro Linux no dispusiese de este comando habría que buscar una alternativa o editar el fichero <i>httpd.conf</i> (normalmente en /etc/apache2) y comentar o descomentar la línea del módulo afectado.<br />
<br />
En el caso de los módulos PHP no recuerdo si existe algún comando similar así que lo que se suele hacer es editar el fichero <i>php.ini</i> (su ubicación cambia según la distribución) y comentar o descomentar “lo que sea”.<br />
<br />
<br />
<br />
<br />
Tras seguir todos estos pasos ya disponemos de la base para ejecutar programas con PHP. Realmente dispondremos de un servidor que podríamos publicar hacia internet y al que se podría acceder (usar la opción “Put Online” o su equivalente en castellano del panel de control de WampServer) desde fuera.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKlwhQJIC1Ih3CccpJmcbDXn2UpL8kjxdFCLtM0bZxsri_QUuCicx5RYZBQm_Q224AmeETm6knB7SA5VnNhVKM1CRky6qjlzjINrtHm43E_Cs8Mu3maecjsGAxg_g3APAHeV-OW7_n9ex0/s1600/12_Wamp_put_online.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKlwhQJIC1Ih3CccpJmcbDXn2UpL8kjxdFCLtM0bZxsri_QUuCicx5RYZBQm_Q224AmeETm6knB7SA5VnNhVKM1CRky6qjlzjINrtHm43E_Cs8Mu3maecjsGAxg_g3APAHeV-OW7_n9ex0/s1600/12_Wamp_put_online.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Dando acceso al servidor para internet</td></tr>
</tbody></table>
<br />
Es más, como tenemos un servidor Apache hecho y derecho, nada nos impediría instalar otros módulos para otros lenguajes, por ejemplo Python o Ruby. En un futuro escribiré algo sobre cómo trastear con ello y cómo trastear con otros servidores web y bases de datos.<br />
<br />
Si a alguien le apetece jugar que pruebe a instalar un gestor de contenidos (CMS), como por ejemplo Drupal. Funcionará seguro, aunque es probable que haya que activar algún módulo.<br />
<br />
Por ahora lo dejo aquí. Espero no haber olvidado nada.<br />
<br />
Salut!<br />
<br />Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com2tag:blogger.com,1999:blog-8904200486219320800.post-64892587433377979132011-08-18T19:16:00.002+01:002011-08-18T19:23:21.953+01:00Una tontería
<br />Una gilipollez que me han pasado y me ha hecho gracia...
<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ny-image1.etsy.com/il_fullxfull.263880517.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 480px; height: 480px;" src="http://ny-image1.etsy.com/il_fullxfull.263880517.jpg" alt="" border="0" /></a>
<br />
<br />Y aquí el original
<br />
<br /><iframe src="http://www.youtube.com/embed/2ImZTwYwCug" allowfullscreen="" frameborder="0" height="345" width="420"></iframe>
<br />
<br />mooooooola
<br />
<br />
<br />
<br />
<br />Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com0tag:blogger.com,1999:blog-8904200486219320800.post-78106938872136286412011-08-18T10:32:00.001+01:002011-08-18T10:32:36.651+01:00¿Sistemas o Desarrollo?El post anterior ha hecho que vuelva a mi mente una pregunta que me hicieron hace años, allá por la prehistoria: <i>¿y tú qué eres? ¿sistemero o picateclas?</i><br /><br />Cuando me la hicieron conteste como buenamente pude porque en esa época todavía había preguntas que me descolocaban. Mi respuesta fue algo así como <i>“persona, soy persona, y tú eres un racista”</i> (y me fui llorando... no estoy orgulloso de ello). En aquella época me negaba a aceptar que alguien que programaba no supiera batirse con la configuración de un servidor, o no supiese instalar, por ejemplo, algo tan simple como una base de datos.<br /><br />He de decir que mi “background” es del mundo del metal. Aparte de que entre mis grupos de cabecera están Metallica, AC/DC y Van Halen mi “otra” parte de metal viene de que durante casi una década me dediqué a cacharrear en las tripas de las máquinas. Me daba igual meterme dentro de un cajero automático, toquetear un S/36 de IBM, untar un cable con vaselina para que pasase por un conducto atestado con otros cables (y algún ente vivo con dientes) o diseñar y configurar un dominio para 100 puestos de trabajo con Windows NT.<br /><br />Lo del desarrollo empezó como un hobby y se fue profesionalizando cuando pude dar <i>“el gran salto”</i>. Hasta el momento saltamontes yo estaba más que acostumbrado a cacharrear, llevarme calambrazos por tocar donde no debía y a tratar de entender en qué coño estaba pensando el tío que diseñó esa manera tan extraña de configurar un programa.<br /><br />Y como los que me rodeaban hacían más o menos lo mismo que yo llegué a creer que si te dedicabas a eso de la informática tenías que saber de todo porque cualquier día podía hacerte falta.<br /><br />Pero he aquí que un día entré profesionalmente en el mundo del desarrollo de software y tenía un alma inocente y muchas ganas de aprender. O sea, era un pardillo.<br /><br />Para mí los programadores eran una élite inalcanzable, con grandes cerebros (y muchas veces, cabezas), capaces de entender conceptos abstractos que al resto de los mortales se nos escapaban (hoy es el día en el que todavía tengo que pensar dos veces cómo hacer una función recursiva), todopoderosos, pues podían controlar y reprogramar cualquier aparato que cayese bajo sus narices. Los que se dedicaban a programar para mí eran <i>“los putos amos”</i>.<br /><br />Esos analistas, hablando de cosas como singletons, multithreading y transacciones. Aquel jefe de arquitectura que se había currado un puente COM/Corba que todavía hoy sé que sigue en producción en algún sitio. Ese programador con años de experiencia, admirado y puesto como ejemplo de eficiencia por tus jefes, que te miraba con suficiencia cuando hacías una pregunta simple sobre JSPs (casi seguro que pensaba “ya viene a tocarme las mandangas el mierdecilla este... así no hay quien chatee a gusto”).<br /><br />Para mí era como estar en Hollywood o en la NASA. Cuando me preguntaban “y tú en que trabajas?” se me llenaba la boca diciendo “soy desarrollador de software” (ahora digo que soy Analista, que parece que tiene más estilo). Las mujeres caían a mis pies, me abrían todas las puertas de las discotecas y andaba como si tuviera una escoba metida por el culo (hasta llevaba traje y tenía el pelo corto).<br /><br />El día que me hicieron la pregunta de<i> “sistemero o picateclas”</i>, tras secarme las lágrimas y dejar de temblar, me puse a reflexionar y a observar a mi alrededor para ubicarme.<br /><br />Todavía hoy me dura el disgusto.<br /><br />A la mayor parte de los que me rodean (y rodeaban) les dices que te configuren un servidor, aunque sea uno como con el que están trabajando cada día, y les da un telele. Yo creo que sacarlos de picar código a cascoporro y ponerlos a resolver una incidencia sencillita de configuración los mataría. Me parece tristísimo, pero la distinción entre técnicos de sistemas y técnicos de desarrollo existe, y la zanja que los separa es lo suficientemente amplia para que se le quiten a uno las ganas de saltar.<br /><br />Ojo que tampoco digo que eso sea malo, cada uno se especializa en lo que quiere o en lo que cree que le va a dar dinero. Hasta ahora ha sido Java y su ecosistema, que das una patada a un edificio y te caen 1000 programadores. Cuando yo empecé era Visual Basic y Clipper (y todavía estaba Cobol).<br /><br />Está claro que no puedes saberlo todo. Si eres <i>la bestia de los EJBs</i> no tienes tiempo para dedicarlo a ser un <i>master del universo</i> en Oracle o un <i>supercertified de la muerte</i> en Windows Azure.<br /><br />Pero aún así a mí me sigue pareciendo extraño que haya personas que usan cosas que no saben como funcionan; bueno no, la analogía no es buena, pues casi todos usamos el coche y no tenemos ni idea de cómo cambiar las bombillas. Es como si te dedicases a construir motores de coches sin tener ni idea de si el chasis va a soportarlo, de dónde va a ir anclado o de si la carrocería es lo suficientemente amplia para que quepa.<br /><br />Hoy yo tengo claro qué respondería a la pregunta de “sistemero o picateclas”. Usaría la definición no oficial de “rol” que me pusieron años ha: soy un <b>asterisco</b>.<br /><br />En mi caso me he negado a especializarme. Lo toco todo y no le tengo miedo a ninguno de los nuevos juguetes que esta profesión nos da (asco sí, miedo no). Quizás he tenido suerte y he caído en departamentos y/o proyectos que me han dejado expresarme como el aprendiz de todo y maestro de nada que soy (sí, y he sido responsable de la arquitectura de varios de ellos).<br /><br />¿Disperso? Quizás. Pero tengo la tranquilidad de saber (por haberlo comprobado) que cuando algo falla yo sé arreglarlo.<br /><br />Y todo este tocho me ha venido a la cabeza por culpa de una pregunta...<br /><br />Salut!<br />Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com4tag:blogger.com,1999:blog-8904200486219320800.post-35463962443416368282011-08-17T17:11:00.001+01:002011-08-17T17:12:51.524+01:00Entorno de Desarrollo LAMP (I) - IntroducciónEl primer paso lógico para empezar a desarrollar <i>lo que sea con lo que sea</i> sería disponer de un entorno de desarrollo. Ese entorno debería ser cómodo de utilizar, debería permitir depurar (porque examinar logs NO es una buena opción mientras desarrollas) y ya si permite esas cosas para frikis de Test unitarios, ayuda a la documentación, compilación, despliegue... vamos, eso es para nota.<br />
<br />
No es que sea imprescindible, claro. Durante una temporada yo estuve programando en C++ editando con el <a href="http://es.wikipedia.org/wiki/Vi">vi</a> directamente en un host HP-UX y todavía sigo aquí. También he conducido coches sin dirección asistida, he tenido bicicletas sin frenos (me dejaba la suela de los zapatos en la rueda de atrás) y tele sin mando a distancia.<br />
<br />
Conozco a algún programador que edita ficheros PHP con el <b>bloc de notas</b> de Windows; conozco a alguno que cuando le enseñé el <b><a href="http://notepad-plus-plus.org/">Notepad++</a></b> casi tuvo un orgasmo mental al ver tantos colorines e incluso he visto los ojos de alguno saliéndose de las órbitas al ver cómo yo depuraba tan tranquilamente con <b><a href="http://xdebug.org/">xdebug</a></b> mientras él sufría leyendo archivos de texto que no daban pistas.<br />
<br />
Lo que quiero decir es que a día de hoy, en el año 2011, con todas las herramientas que tenemos a nuestro alcance los desarrolladores (la mayoría de ellas gratuitas), la potencia de nuestros ordenadores y toda la ayuda que se puede encontrar por internet hay que ser un pedazo de inútil, cenutrio y lerdo para trabajar de manera precaria. Además opino que gente así no debería tener derecho a tocar un ordenador, pero esa es otra historia.<br />
<br />
Podría disculpar a aquel que tiene que aguantarse con las herramientas que su “jefe” le provee. Sí, hay muchos que se hacen llamar “jefes de proyecto” o “gestores” que son capaces de condenar a un equipo de desarrollo a malvivir y maltrabajar por ahorrarse unos euros (o más bien transferirlos a su bolsillo para su viaje a Costa Rica).<br />
<br />
El asunto es que a mí me gusta trabajar a gusto, con las herramientas adecuadas y si puedo ahorrarme tiempo gracias a ello, mejor, porque así podré dedicarlo a mi gran afición: no hacer nada.<br />
<br />
Como éste es el entorno de desarrollo que a MI me gusta voy a usar los siguientes componentes:<br />
<br />
<ul><li><b>Un servidor <a href="http://es.wikipedia.org/wiki/LAMP">LAMP</a></b>, WAMP o como quiera que se llame para Mac, a gusto del consumidor. No soy demasiado racista para los sistemas de escritorio. En el caso de Mac no daré ninguna indicación pues ni tengo ni quiero :-)</li>
<li><b>Varios componentes extra de PHP</b>: xdebug (depuración/caché), <b><a href="http://php.net/manual/es/book.apc.php">APC</a></b> (caché de código), <b><a href="http://memcached.org/">memcached</a></b> (caché, porque yo lo valgo), <b><a href="http://pear.php.net/">PEAR</a></b> (librerías extra)...</li>
<li><b><a href="http://www.eclipse.org/projects/project.php?id=tools.pdt">Eclipse PDT</a></b><b> </b>como entorno de desarrollo. No es que me me disgusten los otros, es que o vienen limitados, o con pocos plugins o, simplemente, son de pago (y yo, pobre).</li>
<li><b>Extensiones para Eclipse</b> (test unitario, documentación, acceso a repositorios de código, etc.)</li>
</ul><br />
Como las cosas al pasarlas al entorno real suelen cascar bastante (me vienen a la cabeza problemas con mayúsculas y minúsculas al pasar de Windows a Linux) también comentaré algo sobre montar un entorno de “integración” usando máquinas virtuales. En este caso usaré <b><a href="http://www.virtualbox.org/">VirtualBox</a></b>, porque me parece bastante ligera y es la única que me ha permitido mantener 4 máquinas virtuales funcionando simultáneamente sin que el ordenador se me muriera de asco. Adiós VMWare.<br />
<br />
Una advertencia: en principio no escribo para cenutrios. Presupongo unos conocimientos mínimos (saber mover el ratón sin tirones, por ejemplo) y espero que los links que voy proveyendo se vayan leyendo porque me niego a repetir cien veces lo que otros ya han explicado.<br />
<br />
De todas formas si alguien necesita ayuda extra yo nunca me niego a trabajar si hay dinero por medio. Mi tiempo no es gratis y lo pierdo como a mí me da la gana.<br />
<br />
El post se me ha quedado demasiado largo así que dejaremos la chicha útil para el siguiente. Eso sí, no prometo que no se me vaya a ir la olla otra vez y me ponga a contar batallitas.<br />
<br />
<br />
Salut!<br />
<br />
<br />
<br />
Pd - Lo que tengo se llama verborrea y está mezclado con dispersión. Es que empiezo a acordarme de cosas y o las pongo o las pongo.Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com0tag:blogger.com,1999:blog-8904200486219320800.post-50290322338505103782011-07-22T09:00:00.001+01:002011-07-22T09:17:31.876+01:00unga, o como complicarse la vida (I)<div style="text-align: justify;">¿Alguien recuerda <a href="http://secondlife.com/">Second Life</a>? Yo todavía estoy por allí, y de vez en cuando cae alguna venta. De hecho hemos llegado a ganar bastante dinero allí dentro. Es un mundo virtual 3D con bastantes posibilidades, si se hubiese explotado bien, no sólo para ver animaciones de muñequitos practicando sexo, sino para educación, representación arquitectónica o incluso juegos.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Pero seguro que muchos no conocen <a href="http://opensimulator.org/">OpenSimulator</a>, que intenta ser algo así como un Second Life open source y añade algunas cosas interesantes y otras realmente horribles. Corre sobre la plataforma .NET/Mono, pero es que nadie es perfecto. Le llamaremos Opensim, porque es un coñazo ir refiriéndose a su nombre oficial todo el rato.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Si algo tienen en común los dos entornos es la evidente falta de buen gusto, al menos visual. No es coña, la mayor parte de lo que allí se ve, construcciones sobre todo, te haría vomitar y arrancarte los ojos si estuvieses en el mundo real. Si el caso es grave en Second Life, mejor no hablemos de Opensimulator, donde el material suele ser creado por... desarrolladores o, en el peor de los casos, por usuarios con ínfulas pero nulo talento.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Que no es que todos los desarrolladores tengan mal gusto; por ejemplo yo tengo un gusto excelente y es una delicia utilizar las aplicaciones que diseño. No tengo abuela, eso no, pero es que ya sería demasiada perfección en una sola persona y no es cuestión de ir humillando al resto de la humanidad. Ante todo uno es humilde y modesto y se compadece de esas pobres mentes inferiores que pululan por este nuestro planeta.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Si quieres conseguir un absoluto fracaso de usabilidad dile a un desarrollador que diseñe el interface gráfico de tu aplicación. Si te gustan las emociones fuertes dile a un desarrollador (que no sea yo, claro) que te diseñe un edificio. Normalmente el resultado es parecido, por su elegancia, a esos engendros mitad orco mitad no se sabe qué que aparecían en el señor de los anillos.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Y me disperso...</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Lo que quería explicar es que yo estuve mezclado en el tema de OpenSim. Hace ya mucho tiempo sugerí e hice las primeras pruebas para utilizar NHibernate, alguien lo implementó y un año después fue deshechado por falta de mantenimiento. La verdad no me importa demasiado porque lo que a mí me importa va por otro lado.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">OpenSim es una especie de servidor de realidad virtual, es decir, que envía texturas, posiciones de objetos, colisiones... a un cliente visual y se encarga de mantener el contenido (persistirlo). Puede ejecutarse en solitario o pueden unirse varios servidores en lo que se viene a llamar un grid, y ahí empieza lo interesante.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Los servidores de Opensim, cuando se conectan entre sí, utilizan a su vez unos servidores de soporte que se encargan de controlar los usuarios, el inventario de objetos, los objetos en sí y la conectividad entre los servidores. Lo interesante de esta parte es que estos servidores utilizan http para comunicarse, por lo que podría usarse sin problemas cualquier servidor web.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">En Opensim como son más chulos que un ocho se han currado sus servidores y se han hecho sus pajas mentales reinventando una arquitectura de plugins, unos servidores dedicados corriendo en .NET y, en mi opinión, es la peor parte del proyecto. Por ejemplo, se ha de usar una consola para realizar cualquier operación (dar de alta usuarios, crear servidores, bloquear usuarios...). O eso o escribes guarramente en la base de datos, que también hay "aplicaciones" que lo hacen... ahí con toda la seguridad.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Claro que ha habido intentos de hacer correr esos servidores de soporte en servidores web y algunos de ellos están funcionando, tanto programados en Perl, como con PHP o Python.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Pero aquí el menda es más chulo que un ocho y no le gustó absolutamente nada de lo que había así que decidió currárselo él solito y, aproximadamente en Marzo o Abril de 2010, presenté <a href="https://sourceforge.net/projects/unga/">unga</a>, mi propuesta de servidores de soporte. El éxito fue tan moderado que sólo lo estoy usando yo, pero el asunto prometía... aunque he de reconocer que me equivoqué en su concepción.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">unga, que al principio era una serie inconexa de servicios, programados en PHP, que usaban XML-RPC y ligeramente jquery y algunos plugins bonitos para hacer ventanitas y efectos visuales, ha evolucionado muchísimo en un año. Este sistema, que al principio únicamente quería para conectarse a servidores Opensim se está convirtiendo en todo un framework o una plataforma, más bien, porque estoy rediseñando incluso la filosofía de funcionamiento.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Está programado con PHP, corre sobre el framework <a href="http://codeigniter.com/">Code Igniter</a> (el más rápido y eficiente que he encontrado), usa intensamente REST (sí, el puro, el que usa los comandos http, no esa paja mental que algunos llaman REST y después no es más que un POST mal entendido), Ajax (con jquery, que es de lo mejorcito), es modular (pegar, activar y a trabajar) y lo he usado para otros proyectos ya, entre ellos un gestor de descargas y una aplicación de control de fabricación.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">De hecho me estoy pensando hasta en crear un módulo de gestión de contenido para poder usarlo como cualquier Drupal de la vida.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Lo interesante para un desarrollador quizás no sea unga en sí sino todas las tecnologías y metodologías que he usado y estoy aplicando en el proyecto, y de ellas voy a hablar en próximas entradas.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Entre los temas que voy a tratar estarán:</div><ul style="text-align: justify;"><li>Configuración de un entorno de desarrollo para PHP (con debugger).</li>
<li>TDD y PHPUnit y ,sobre todo, los problemas de integrarlo con Code Igniter.</li>
<li>Construcción automática, deployment, etc. con Phing.</li>
<li>REST y cómo implementarlo.</li>
<li>Aventuras con jquery o como llevar adelante una arquitectura visual ajax independiente del entorno de servidor.</li>
<li>Migración a Python (Django y Tornado Web).</li>
<li>Por qué Java es el demonio y huyo como de la peste de ese lenguaje.</li>
<li>También programo con C# y todavía no he sido abducido por el lado oscuro de Micro$oft.</li>
<li>¿Tendré huevos para migrar ciertos servicios UDP a Node.js?</li>
</ul><div style="text-align: justify;">Y todo esto amenizado con comentarios sobre cómo configurar servidores Linux, optimizar bases de datos, uso de cache de código, CDNs y demás historias "modelnas" que podrían poner palote a muchos.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Que no es que sea para enseñar a nadie (que realmente dudo que le interese a demasiada gente), es que aquí el amigo escribe y escribe y como soy un figura se me pierden los manuales en el disco duro de no se qué ordenador y no recuerdo nada después. Al menos si lo pongo en internet ya se encargará de buscármelo el señor Google.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Pues nada, que prontito empezaré a guarrear la blogosfera con mi pajerío mental tecnofriki.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Salut!</div>Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com2tag:blogger.com,1999:blog-8904200486219320800.post-83071575468906767462011-07-21T13:53:00.000+01:002011-07-21T13:53:51.629+01:00Cualquier memo se monta un blog<div style="text-align: justify;">Creo que fue allá por el 2006 cuando decidí que tenía que montar un blog. No había ninguna razón, es que todo el mundo lo tenía y yo soy un "culo veo, culo quiero".</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">No pasó de la primera entrada.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Con el tiempo vas madurando y te vas dando cuenta de que hay que valer para escribir un blog. No sólo requiere un dominio mínimo de la palabra sino también tener cosas que decir y que además interesen a alguien. Has de saber recibir críticas y enriquecer tus siguientes entradas con los comentarios que tus lectores te aportan.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">También está el otro grupo de blogeros que se han montado un invento de estos porque tienen ya la espalda destrozada de intentar autofelaciones y prefieren que sus amiguitos virtuales les hagan el trabajo. No tienen gran cosa que decir, pero entre unos amiguitos y otros van creando la gran cadena del "hoy te la como yo, pero mañana te quiero comentando en mi blog". Es algo así como el trenecito chuchú.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Si te lo has imaginado y no has potado, malo malo...</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Según una estadística (creada por mí) los fabricantes de enjuagues bucales han aumentado progresivamente sus ingresos de manera contínua desde el 2004, a razón de un 20% más de ventas anuales. Según otro estudio (hecho por mí también) cada vez que Apple saca una de sus tonterías, en urgencias se registran un 50% más de mandíbulas desencajadas por la cantidad de material que han admitido en su cavidad bucal.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Como decía el anuncio de cierta bebida isotónica con sabor a bicarbonato mezclado con jabón e ingentes cantidades de sacarina: la humanidad es maravillosa. Y yo añado: haciendo estupideces, y no tenemos quien nos supere.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">El caso es presentar este blog al mundo porque tengo la espalda bastante cansada ya y todo el tiempo que he estado practicando no ha servido más que para agravar mi frustración.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Voy a postear lo que me venga en gana hasta que Google me lo censure o algún imbécil con ínfulas me denuncie porque no le ha gustado algo que voy a decir (sí, voy a decir muchas cosas feas) y mis abogados me digan que o lo retiro o me espera la trena y esas cosas.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Escribiré de los temas que, más o menos controlo: el desarrollo de software. Y lo voy a hacer desde mi punto de vista, desde lo que me gusta y criticando lo que me disgusta.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Aunque sé que ésto podría ser mi condena al ostracismo en las diversas consultoras que pululan por ahí, también voy a hablar del mercado de las TIC, de las malas prácticas empresariales y de la gente que me rodea... y no me voy a callar demasiado. Ya soy perro viejo en estos asuntos y realmente me importa bien poco que la cárnica de turno no me quiera contratar... tampoco es mi ideal de vida hacer que otros se hagan ricos mientras yo como mierda.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Así que, amigo lector (en másculino genérico, que ya sé que las mujeres sabéis leer, pero soy bastante clásico y me revientan las estupideces del politicorrectismo) me presento humildemente ante ti.</div><br />
<br />
Deposita tu sacrificio humano por la ranura.Impalahhttp://www.blogger.com/profile/00599443461984598923noreply@blogger.com2