Oferta de empleo. Programador PHP Junior.
Mar/101
Hace unos meses escribía sobre como pondría yo un anuncio buscando programador Junior. Un poco después comentaba la cantidad de proyectos en los que estoy metido. En aquella época llegó a mi un grandisimo compañero, una persona que dejó un trabajo fijo para arriesgarse a mi lado y aprender lo poco que yo le pueda ofrecer, así que mi primer gracias para José Villalobos. Ahora veo que el trabajo sigue creciendo y que nosotros dos solos no damos a basto, así que me alegra comentar que volvemos a abrir la oferta de trabajo.
Solo que esta vez la oferta es algo más seria, así que allá vamos.
Programador Web Junior
| Fecha de la oferta: | 03-03-2010 |
| Nombre de la empresa: | En vías de formalizar la SL |
Ubicación
| Población: | Madrid (Tetuan). |
| Provincia: | Madrid. |
| País: | España. |
Descripción
| Puesto vacante: | Programador Web Junior |
| Categorías: | Informática y telecomunicaciones – Administración de bases de datos |
| Nivel: | Junior (no se requiere experiencia previa, aunque si conocimientos básicos) |
| Personal a cargo: | Ninguna |
| Número de vacantes: | 2 |
| Descripción de la oferta: | Actualmente nos encontramos en el proceso de creación de una empresa basada en el desarrollo web avanzado, es decir, en crear proyectos donde la calidad sea el máximo exponente. El número de clientes interesados en esta idea no es bajo y por lo tanto necesitamos gente con ganas de aprender y avanzar con nosotros.
Buscamos gente joven para el puesto vacante de Programador Web Junior, no se requieren experiencia previa en puestos de programación (aunque serán valorados) sino ganas de aprender y avanzar en un sector con bastante share de mercado, nosotros te damos los medios y la formación, tu nos traes tu personalidad e interés. |
Requisitos
| Estudios mínimos: | Indiferente – Aunque preferiblemente gente en últimos años de carrera informática o recién licenciados. |
| Experiencia mínima: | Si tienes más de 2 años de experiencia posiblemente esta oferta no sea para ti |
| Requisitos mínimos: |
|
| Requisitos deseados: |
|
Contrato
| Tipo de contrato: | Autónomo dependiente (contrato indefinido)
Nuestra asesoría se podrá encargar gratuitamente de todos los trámites, tanto de alta como mensuales/trimestrales. |
| Jornada laboral: | Flexible (puedes querer intensiva, flexible para compaginar con estudios o como quieras… Creo que el tener horario fijo más que ayudar entorpece en estos casos) |
| Horario: | Abrimos a las 8 cerramos a las 20, dentro de esa franja cuando quieras |
Salario
| Salario: | 1.000 € – 1.400 € Bruto/mes + IVA (se hará factura mensual) |
Todas las personas que estén interesadas en el puesto vacante, solo tienen que mandar un correo a alquesada AT gmail DOT com contando un poco tu experiencia y tus inquietudes o intereses y adjuntando tu CV.
PS: Este proceso lleva activo ya un tiempo, si ya me enviaste tu CV no hace falta que lo reenvíes, porque tengo en cuenta el anterior.
Recordándoos
Feb/1010
Agotado, casi sin fuerzas y con la pierna destrozada1 aprovecho que el móvil se quedó sin batería hace un rato para escribir estas lineas mientras espero el tren que me lleva a mi casita.
En estas dos semanas he sumado unos cuantos miles de quilometros a mi espalda, he conocido y me han conocido personas muy especiales, tanto a nivel personal como profesional. He disfrutado y reido, he trabajado a destajo, aprendido y apenas he dormido.
Empezamos el martes 16 de Febrero con un viaje en tren a Bilbao, eventosfera pedía una reunión a gritos de los 3 socios y así lo intentamos.
Aprovechamos el viaje para visitar Santander y asistir a Iniciador Cantabria. De la mano de Rosa Poo pudimos entablar conversación con Berto Pena y llevarnos de regalo su libro dedicado2, una cena de lujo y una próxima comida pendiente con Berto y Javier Martín en Madrid.
Esa noche apenas dormimos 3 horas, nos tocó recuperar el tiempo perdido y los trabajos pendientes. Y con apenas unas horas de sueño pudimos sentarnos los socios de eventosfera y planear el futuro a corto plazo. Después desde Santander avión de vuelta a Madrid y a intentar recuperar más tiempo perdido.
Cinco días por medio, de estrés, reuniones y trabajo, trabajo, trabajo para volver a coger la maleta y meterme en un bus dirección a Talavera de la Reina, tocaba estrenarme (y estrenarnos) como coorganizador de Iniciador Toledo/Talavera. Quedaban pocas horas y muchas cosas pendientes por cerrar antes de recibir al ponente de lujo con el que contabamos para el primer iniciador; el padre de internet en España, Rodolfo Carpintier (muchas gracias por todo! un autentico placer contar con tu presencia)
El evento debio ser un éxito, pues no hemos tenido malas criticas y si mucha presencia, aunque de forma “velada”, en los medios regionales. El mayor fallo fue el no grabar el streaming improvisado que tuvimos, me hubiera gustado verme atacado de nervios y pasandolas canutas en algunos momentos… Ya será en el siguiente!
Después de los nervios y el networking pudimos cenar con los amigos3 y disfrutar de una noche de risas (ri- sas-), relajación y cubatas.
Esta mañana y tras pocas horas de sueño, nos hemos ido al tercer evento en menos de 15 días y el quinto en lo que llevamos de mes, el #eatsAndTwitts Madrid.
La verdad es que han sido unas horas de felicidad, risas, relax y abrazos, sobretodo abrazos. Donde he tenido la extraña sensación de abrazar y conocer a gente que ya quería y conocía. Y también de echar de menos a gente que apenás conozco y que ya se que quiero mucho. La magia de twitter se vive al ciento diez por cien en el #eatsAndTwitts sin lugar a dudas!
Todo esto me ha hecho pensar y encender la mecha para volver a ponerme las pilas. Me ha servido para humanizar a gurús4 y para darme ánimos a mi mismo en mis proyectos.
Ahora toca reflexionar sobretodo esto y aprovecharlo al máximo… Pero esto ya lo contaré en otro post.
Mientras tanto muchas gracias a todXs los que os habéis cruzado o twittercruzado conmigo estos días!!!
@eventosfera, @elenamui, @JulioUsandizaga, @rosapoo (la grandisima Rosa Poo!), @mr_villa, @aartiles24, @bertop, @jzabalo, @loogic, @RCarpintier, @marta_rruiz, @milrayas, @mausant, @luisso, @cuasante @begonamiguel, @patriciaaraque, @perezsusana, @designtock, @estudiodos, @luisriverag, @tetuanValley y @abarrera entre tantos otros!!!
También agradecer a nuestra @comunicatelo, la alegría de Iniciador Toledo! @erodrigo, @sorprendida y @fmlopez48 porque con un abrazo me habéis demostrado más amistad que la que dan mil palabras, que ganas tenía de conoceros! Y a mi gran ausente, la loca más cariñosa de todo Oslo, @elenaenriquez.
Y sobretodo a la que es mi otra pata, @javimonsalupe y nuestras dos respectivas mitades, que nos soportan, nos aguantan y nos quieren! Y sin las que no seríamos nada @bearufo y mi niña, @cyn_cv.
Y si no hay AJAX?
Nov/096
Recientemente escribí un comentario en el blog de Alfredo Artiles1, Bitácora de Webmaster, en un artículo relacionado con la nueva propuesta de los señores de google para hacer indexable un site en Ajax. En su artículo Alfredo resumía que aunque vayan por el buen camino al intentarlo, el uso de las técnicas que proponía Google para conseguirlo no le parecía muy adecuado. Yo voy un paso más allá y diría que sería todo un error implementar las opciones que comenta Google, pero esto daría para otro artículo2.
La cuestión es que su post viene a cuento porque hace tiempo que os quería comentar como, creo, que debería hacerse una web con contenido en AJAX y creo que este sería el mejor momento para ello.
Lo primero, comentaros que el problema de AJAX no solo está con los buscadores, sino principalmente con la usabilidad y accesibilidad. Ese pequeño porcentaje de usuarios que llega al site desde navegadores especiales para discapacitados, o desde navegadores solo texto, o incluso en un porcentaje mayor, aquellos que acceden desde su móvil, ellos son el principal objetivo a solventar cuando se desarrolla en AJAX, no los buscadores que en este caso creo que son secundarios (aunque también salgan muy beneficiados).
Bueno, entonces la panacea al respecto, cual sería? Simple, no desarrollar en AJAX!
Esto que parece una perogrullada es realmente la mejor solución para corregir el problema, desarrollar sin AJAX y añadir la capa de AJAX a posteriori. Con esto conseguimos crear una navegación lo más sólida posible fuera de todo JavaScript, y una vez creada añadimos mediante JS la capa AJAX, a base de modificar los enlaces internos por llamadas asíncronas al servidor y un par más de detalles en el código. Así, si un navegador sin JS o un Bot llegan a tu site con ganas de recorrerlo entero no tendrán ningún problema y podrán navegar por todo el site de forma perfecta.
También están los beneficios añadidos, como poder abrir enlaces en pestañas/ventanas nuevas, crear otra capa de independencia entre la Vista y los Scripts (digamos MVSC), o uno más importante aun el de poder enlazar directamente una página interna desde cualquier lado sabiendo que va a llegar a dicho enlace.
Nota: A partir de aquí el asunto se pone muy denso, así que si lo tuyo no es la programación front o bakend o la maquetación o si no comprendes algo de AJAX, mejor quédate con la idea vista hasta ahora y mira ejemplos en, por ejemplo, la web de Coleccionismo Baral
Lo primero que haremos será dar por sentado unos conceptos de la programación del site:
- Se programa OOP (aunque en este caso no sea necesario, pero así vamos inculcando las nociones básicas mínimas)
- Usamos el patrón de diseño de software MVC, separando la Vista y el Control sobretodo.
- Usamos también el patrón Façade para tener así un único punto de entrada al código.
- Usamos URLs SEO friendly del tipo http://host/casa/coche que luego pasarán a ser http://host#casa/coche
Bueno, una vez está claro esto, empezamos con la programación del site, creamos la navegación básica, la lógica interna del site, los modelos,… En fin todo el desarrollo pero sin incluir nada de AJAX por ahora. Una vez realizada la navegación y teniendo en cuenta que usamos los patrónes Façade y MVC incluimos un pequeño script3 al código del site similar al siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | //Script File // variable general que nos servirá para chequear si hay que cambiar contenidos por AJAX var navAjaxCheck = false; // Función goto, encargada de hacer la llamada asíncrona // La variable jsonValue incorpora toda la información necesaria var goto = function (jsonValue) { // Posibles excepciones a la navegación por AJAX if (location.hash.test("signup")) return false; //waiter es para añadir el típico efecto de sombreado en el site mientras se cambia el contenido. jsonValue.waiter = jsonValue.waiter === false ? false : true; //update es el id del contenedor a remplazar // (false en caso de no quere actualizar nada y "contenedor general" en caso de "null") jsonValue.update = jsonValue.update ? jsonValue.update : (jsonValue.update === false ? false : 'contenedor_general'); // El nuevo valor del href jsonValue.href = jsonValue.href.test("#") ? " " : jsonValue.href; new Request.HTML({ // Aquí está el punto importante, mandamos toda la info a /ajax/ url: '/ajax/'+JSON.encode(jsonValue), /* Se desactiva por fallos con el IE. update: $(jsonValue.update), useWaiter: jsonValue.waiter, waiterOptions: { baseHref: '/', img: { src: 'img/loader.gif', styles: { width: '220', height: '20' } }, layer: { background: '#fff', opacity: 0.9 } }, waiterTarget: jsonValue.update, */ // Una vez completado guardamos el href y la información donde corresponde onComplete: function(responseTree, responseElements, responseHTML, responseJavaScript){ $(jsonValue.update).set('html',responseHTML); //reseteamos el init() ya que hay contenido nuevo en el site. init(); if (jsonValue.href && jsonValue.replace) location.hash = "#"+ jsonValue.href.replace(jsonValue.replace,""); //reseteamos la variable navAjaxCheck para contener la información del site actual navAjaxCheck = location.hash; } }).send(); }; //Función recursiva encargada de hacer de watchdog para la navegación asíncrona (dotando de la opción de retroceder/avanzar) var navAjax = function() { // Posibles excepciones a la navegación por AJAX if (location.href.test("signup")) return false; // Esto se da en el caso de que estemos en una URL normal tipo /casa/coche, que rápidamente la formateamos a // #casa/coche para que siga la lógica de navegación asíncrona. if (location.pathname != '/') { var href = location.href; var value = 'http://'+WEBHOST+'/'; // WEBHOST es una variable definida anteriormente location.href = href.replace(value,value+"#"); // por compatibilidad con IE // Comprobamos con el check generado si ha cambiado el hash de la URL, // en cuyo caso llamamos a goto con el nuevo hash }else if (location.hash != navAjaxCheck) { var href = location.hash; var value = '#'; goto({ href: href.replace(value,''), waiter:false, replace:"" }); } }; //Función principal encargada de cambiar todos los enlaces internos por llamadas asíncronas. var addAjax = function () { // Usamos una frase de testeo simple, el dominio del site (también podría ser algo más complicado mediante exp. regulares) var replace = 'http://'+WEBHOST+'/'; // Buscamos todos los enlaces del site $$('a').each(function(el) { var href = el.href; // Buscamos los que enlazan dentro del site y evitamos los marcados como "noAjax" // a los encontrados así les quitamos la opción por defecto y añadimos la opción de Ajax if (href.test(replace) && el.className != "noAjax") el.addEvent('click', function(event) { event.preventDefault(); goto({href: href, replace: replace}); }); }); // función con las llamadas necesarias al cargar el site (incluir el navAjax, chequear variables...) var init = function() { // Añadimos el ajax addAjax(); // .... } // Añadimos los eventos justo cuando el DOM ya se haya cargado. window.addEvent('domready', function() { // Lanzamos el control de AJAX con un periodical para que se ejecute continuamente // el tiempo aproximado depende de la carga de JS del site y al gusto de cada uno (entre 1 y 5 segundos) navAjax.periodical(1000); // Cargamos el init con la información necesaria. init(); // Cargamos el resto de funcionalidades que solo son necesarias una vez. } }; |
Como podréis ver, este JS está bastante mal codificado, lo suyo sería crear una clase completa que se encargue de toda la parte de navegación AJAX y hacerle mucho refactoring para conseguir algo decente, pero la idea es explicar los principios de acción, no daros un código 100% válido y correcto.
Ahora, solo tendremos que añadir al controller de la aplicación un método para cuando llegue por “/ajax/” que:
- Defina la constante
AJAX = TRUE4. - Coja la información pasada por la variable json del segundo parámetro y cambie la REQUEST_URI por la url del mismo.
1 2 3 4 5
//Algo similar a esto debería valer $json = /* variable con la información */ $ajax = json_decode(stripslashes($json), TRUE); $url = $ajax["href"] ? $ajax["href"] : $_SERVER["HTTP_REFERER"]; $_SERVER['REQUEST_URI'] = str_replace("http://".$_SERVER['SERVER_NAME'], '', $url);
- Continue de forma normal con el controller
Ahora la navegación para el resto del código es normal, hasta que llegamos a la parte de vista, donde utilizando la contante definida AJAX para saber si el usuario está utilizando AJAX o no y en caso afirmativo mostrar solo la información referente al AJAX que queremos, evitando mostrar por ejemplo la sección de “header” o las secciones fijas del template como el footer… Eso a gusto.
Como veis no es tan difícil añadir después la capa de AJAX y así se consigue una navegación con y sin JS casi-perfecta que facilitará y mucho la vida a navegadores y buscadores.
TODO: como observaréis el código JS está muy sucio y habría que hacer un refactoring completo de él. También habría que añadirle la posibilidad de controlar las anclas que ya existieran en el código (por ejemplo quitándolas y añadiendo un efecto de movimiento en la página al clicar sobre el enlace).
La parte del Controller y la de Vista las he dejado muy abiertas, esto es porque aquí cada maestrillo tiene su librillo, así que no he querido meterme mucho en como lo hago yo para no complicar más las cosas.
Y por último decir que en mi caso empecé usando una constante para definir el AJAX, pero rápidamente deseché esta opción ya que es posible que sobre una página se realicen llamadas sobre distintas secciones por ejemplo y al definir solo una constante esto no se cumple. Aquí lo que suelo hacer5 es pasar la información a través de la variable json(“update”) los campos a modificar, e incluir un código similar a este en el método que controla el AJAX para pasarlo a la parte de vista.
if ($ajax["update"]) { $zonas = explode ("::",$ajax["update"]); foreach ($zonas as $key => $value) $ajax[$value] = true; }
- aka @aartiles ↩
- Solo diré que con lo fácil de modificar que dicen que es, por qué los señores de Google no han realizado ya los cambios en su código? ↩
- Ojo, que estamos trabajando con Mootools y ClientCide y con un código bastante sucio y obsoleto, por cierto ↩
- Esto es ligeramente más complicado, pero para simplificar dejemoslo así por ahora ↩
- Aunque también habría que refactorizar ya que no me llega a convencer ↩
Baq.be – “mi” nueva generación de acortadores de url.
Oct/094
Bueno, hoy toca presentar mi último “campo de cultivo“: Baq.Be
Aunque, en principio, viendo el estado actual del site1, más que hablaros de que es Baq.Be os voy a hablar de porque lo estoy empezando a desarrollar2 y a donde quiero llegar con él.
El por qué lo estoy desarrollando es fácil de explicar. Porque me da la gana.
Hace ya un tiempo que la mayoría de los desarrollos que me llegan me los piden sobre Drupal y claro, ahí lo de analizar, desarrollar y pensar, pues como que no. Más bien se juega a colocar y configurar cosas para que esté como al cliente le gusta. Así que decidí no enquilosarme y me puse con uno de los tantos proyecto/pruebas que tengo pendientes.
La idea de Baq.Be es desarrollar un site para acortar URLs como tantos otros que hay en el mercado. Desarrollar un portal con un API abierta para que cualquier desarrollador pueda usar Baq.Be como pasarela para acortar URLs, como tantos otros. Llenarlo de estadísticas, enlazarlo con Twitter y Facebook, permitir guardar perfiles de visitantes, como tantos otros. Subir imágenes y archivos, comprobar estadísticas de los mísmos, o modificarlos si es necesario. Si, como tantos otros.
Entonces que aporta Baq.Be frente al resto de sites que ya hacen esto? Que tiene de nuevo? Pues poca cosa, la verdad. Más bien nada nuevo para la red.
Por eso, como ya avisaba antes, lo hago porque quiero, porque así pruebo un montón de cosas que tenía en el tintero y que si no es por cosas como estas no voy a usar nunca y porque así desconecto un poco de los gestores prefabricados, vuelvo con mis librerías y las refino un poco más.
Y sobretodo, porque me gusta trastear!
Así que nada, si queréis tener una cuenta de acceso a la versión “Alfa -1” de Baq.Be e ir comprobando las novedades poco a poco, solo tenéis que mandar un correito a hola EN baq.be DOT com y os daré user/pass tan rápido como pueda.
- Después abandonar muchos proyectos por falta de tiempo para completarlos lo suficiente como para sacar algo 100% funcional, he decidido con Baq.Be, cambiar las formas y sacarlo nada más tener lo básico y así obligarme a ir actualizandolo y subiendo los cambios para que la gente los vea, pueda conseguir un mayor feedback y motivación para acabarlo del todo. ↩
- Actualmente lleva menos de 15 horas de desarrollo, creo que lo más justo es decir “empezando a desarrollar” ↩
Script para encontrar dominios vacíos a lo bestia
Oct/094
Este fin de semana estaba un pelín aburrido, así que tras leer un tweet de Alfredo Artiles @aartiles decidí hacer y preparar un proyectito que tenía en mente desde hacía tiempo y que como tantos otros, estaba en el cajón de TODOs.
El proyecto, del que ya hablaré detalladamente más adelante, es un acortador de url como tantos otros, vamos un campo de juegos donde ir haciendo pruebas. La cuestión es que para que fuese bueno, cuanto más corto fuese el domino mejor1 y me puse a buscar uno, claro que entre 2 y 3 caracteres, sin tener nada pensado de antes y yendo uno a uno, puede ser una locura. Así que decidí una alternativa para tener un listado más detallado y de forma automática, y me marqué este pseudo-script2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | <?php echo "Script para buscar todos los whois de los dominos"; $letras = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'); $dominios = array( // 'be' => array("precio" =>'7,95', "registered" => "/Status: registeredED/", "free" => "/Status: FREE/", "invalid" => "/% Invalid pattern/"), 'tv' => array("precio" =>'20,95', "registered" => "/Status: CLIENT-XFER-PROHIBITED/", "free" => "/No match for/", "invalid" => "/Status: CLIENT-DELETE-PROHIBITED/"), 'eu' => array("precio" =>'6,95', "registered" => "/Registrant:/", "free" => "/Status: AVAILABLE/", "invalid" => "/Invalid pattern/"), // 'asia' => array("precio" =>'10,95', "registered" => "//", "free" => "//", "invalid" => "//"), 'at' => array("precio" =>'16,95', "registered" => "/registrant:/", "free" => "/% nothing found/", "invalid" => "/% nothing found/"), 'bz' => array("precio" =>'16,95', "registered" => "/Status:OK/", "free" => "/NOT FOUND/", "invalid" => "/Status:CLIENT DELETE PROHIBITED/"), 'ca' => array("precio" =>'12,95', "registered" => "/Domain status: EXIST/", "free" => "/Domain status: AVAIL/", "invalid" => "/Error code:/"), 'cc' => array("precio" =>'16,95', "registered" => "/Registrant:/", "free" => "/No match for /", "invalid" => "/XXXXXXXXXXXXXX/"), // 'ch' => array("precio" =>'27,95', "registered" => "//", "free" => "//", "invalid" => "//"), 'cn' => array("precio" =>'28,95', "registered" => "/Domain Name/", "free" => "/no matching record/", "invalid" => "/Sorry,/"), 'de' => array("precio" =>'7,95', "registered" => "/Domain: /", "free" => "/not found in database/", "invalid" => "/XXXXXXXXXXXXX/"), // 'dk' => array("precio" =>'12,95', "registered" => "//", "free" => "//", "invalid" => "//"), // 'fr' => array("precio" =>'15,95', "registered" => "//", "free" => "//", "invalid" => "//"), // 'it' => array("precio" =>'15,95', "registered" => "//", "free" => "//", "invalid" => "//"), 'in' => array("precio" =>'12,95', "registered" => "/Domain ID:/", "free" => "/NOT FOUND/", "invalid" => "/XXXXXXXXXXXXXXXX/"), 'li' => array("precio" =>'24,95', "registered" => "/Domain name:/", "free" => "/We do not have an entry/", "invalid" => "/XXXXXXXXXXXXXXXXXXXXXXXX/"), /* 'me' => array("precio" =>'16,95', "registered" => "//", "free" => "//", "invalid" => "//"), 'nl' => array("precio" =>'7,95', "registered" => "//", "free" => "//", "invalid" => "//"), 'us' => array("precio" =>'9,95', "registered" => "//", "free" => "//", "invalid" => "//"), 'ws' => array("precio" =>'15,95', "registered" => "//", "free" => "//", "invalid" => "//" */ ); $resultados = fopen ("./resultados_positivos.csv", "w+"); $excepciones = fopen ("./resultados_fallados.txt", "w+"); $listado = array(); print "Creamos el abecedario \n"; foreach ($letras as $letra1) { $listado[] = $letra1; foreach ($letras as $letra2) { $listado[] = $letra1.$letra2; foreach ($letras as $letra3) $listado[] = $letra1.$letra2.$letra3; } } print "Empezamos la busqueda \n"; foreach ($listado as $nombre) { sleep(10); print "Cambiamos de nombre del abecedario. El nuevo nombre es {$nombre}. \n"; foreach ($dominios as $dominio => $values) { sleep(5); print "Empezamos la busqueda de {$nombre}.{$dominio}\n"; $whois = shell_exec("whois {$nombre}.{$dominio}"); foreach ($values as $keyStatus => $mach) { if ($keyStatus == "precio") continue; if (preg_match($mach, $whois)) { //Escribes y borras el $whois; fwrite ($resultados, "\"{$nombre}.{$dominio}\", \"{$keyStatus}\", \"{$values[precio]}\", \"{$dominio}\" ;\n"); $whois = ""; break; } } //Error si $whois no está en blanco. if (!empty($whois)) { $tmp = "Hubo un error para el dominio {$nombre}.{$dominio}\n"; fwrite ($excepciones, "{$tmp}\n{$whois}\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); } } } fclose ($resultados); fclose ($excepciones); http://storage.alquesada.com/whois/ print "\n"; ?> |
Como veréis el script es muy sencillito, lo único que hace es crear una tabla de combinaciones con las letras del abecedario y para cada palabra creada así se pone a recorrer los distintos dominios buscando coincidencias sobre si está libre, está ocupado o da un error conocido el comando “whois“. Si lo consigue clasificar lo añade aun archivo CSV, sino guarda toda la información del whois en un archivo de excepciones para mirarlo después a mano.
El script es muy facilón y no me he molestado demasiado en las expresiones regulares, la forma de hacerlo era tan fácil como lanzar varios “whois” para cada tipo de dominio y ver que devolvía cada uno, coger la frase más significativa y meterla en la expresión regular, sin tratarla ni nada3.
Detalles:
- Debido a las restricciones de los distintos servidores whois he metido en el script varios “sleep” para que no se quejen mucho. El problema es que esto retrasa enormemente los tiempos (en 24 horas no había llegado a los dominios “eb”). Aquí podéis jugar con los tiempos para acortar el proceso (sobretodo con el segundo “sleep“) a vuestro gusto.4
- El script debido a lo que consume y tarda deberíais lanzarlo en linea de comandos. Si lo lanzáis a través de Apache parará al rato y no acabará.
- Está demás decir que podéis jugar a comentar y descmentar los tipos de dominio que queráis, podéis añadir nuevos, cambiar las expresiones regulares por algo más fuerte… Libre albedrío!
- Bueno, a los señorXs Windowseros, decirles que según creo recordar el comando “whois” no está por defecto. Ahí tendréis que ajustar parametros o descargarlo de donde sea.
- Los precios que indico ahí son los precios para registros en DonDominio.com. Ni es mejor, ni peor que otras compañías, simplemente es la que yo uso.
- El archivo de resultados positivos es un CVS. Es decir, lo podéis abrir con cualquier “spreadsheet” ya sea Excel, OOspreadsheet o el que tengáis. También lo podéis subir a bbdd y usarlo desde ahí.
- OJO, esto no es la panacea y da falsos positivos, habría quizás que cambiar el orden en el array de dominios y poner “invalid” antes que “free” para recortar ciertos casos de falsos positivos, pero aun así no es seguro 100%5.
Y por último.
El archivo php lo podéis descargar de aquí:
http://storage.alquesada.com/whois/whois_script.txt
Y el archivo con los dominios hasta “eaw.tv” lo tenéis aquí:
http://storage.alquesada.com/whois/resultados_positivos.csv
Nota: no busquéis el dominio baq.be que es el que me he quedado yo al final
![]()
Usabilidad, semántica web y SEO Orgánico
Oct/096
Vamos a intentar explicar, e interrelacionar entre si, estos tres conceptos que a priori son tan distintos que incluso los skils de los profesionales relacionados a cada uno pueden ser completamente diferentes entre si, y sin embargo la interrelación entre ellos es sumamente fuerte.
El concepto de usabilidad en España es algo muy “novedoso“1 por desgracia, y realmente no se encuentran muchas empresas que realmente aporten este valor a sus proyectos. Dependiendo la mayoría de lo “usable” que sea el diseño que un artista plasma en su boceto. Lo peor de todo, es que posiblemente sea el punto más importante para que un desarrollo llegue a buen término. A más fácil de usar, más gente lo usará2
Según la Wikipedia 3 usabilidad se define como:
La facilidad con que las personas pueden utilizar una herramienta particular o cualquier otro objeto fabricado por humanos con el fin de alcanzar un objetivo concreto. La usabilidad también puede referirse al estudio de los principios que hay tras la eficacia percibida de un objeto.
Sobre la definición de “Semántica Web” o “web semánticamente correcta” se podría hablar largo y tendido ya que para un único concepto, IMHO entiendo que hay varias definiciones que vienen a ser todas las misma pero en distinto grado de complejidad. El concepto más básico y libre4, para web semánticamente correcta podría ser:
La correcta estructuración del código XHTML de un site de forma que se distinga correctamente el contenido del diseño y los scripts, las distintas secciones de la página y su relación en el proyecto, además del correcto uso de los ‘tags’ del XHTML con respecto a sus definiciones y significados.
Un concepto más amplio y complejo lo encontramos en la Wikipedia:
Se basa en la idea de añadir metadatos semánticos y ontológicos a la World Wide Web. Esas informaciones adicionales —que describen el contenido, el significado y la relación de los datos— se deben proporcionar de manera formal, para que así sea posible evaluarlas automáticamente por máquinas de procesamiento. El objetivo es mejorar Internet ampliando la interoperabilidad entre los sistemas informáticos usando “agentes inteligentes”. Agentes inteligentes son programas en las computadoras que buscan informacion sin operadores humanos.
O la más utópica y generalista que da la W3C en su guía breve de web semántica.
El principal problema que nos encontramos aquí es que al igual que la usabilidad, la semantica web pasa totalmente desapercibida en el 90% de los proyectos webs. Poca gente, por no decir ninguna, se dedica a mirar todo el código generado por el programador para una determinada página HTML. Mientras que la web se asemeje a lo que ha realizado el diseñador es más que suficiente.
Esto es normal en prácticamente todo lo que nos rodea, no nos molestamos en mirar como han arreglado nuestro coche, solo sabemos que funciona, por ejemplo. Por lo que aquí es el propio programador o maquetador la persona responsable de realizar un código de calidad que nunca o casi nunca será recompensado como se merece, pero que sin duda, como veremos después, tiene mucha importancia.
Sobre el SEO5 poco podemos decir que no se sepa ya. Según la Wikipedia:
El posicionamiento en buscadores o posicionamiento web es el resultado de la recuperación de información en la base de datos de los grandes Motores de Búsqueda de Internet por el uso de algoritmos de búsqueda en el software.
Este termino es por todos conocidos, desde el jefe hasta el becario y es una cosa que todo el mundo querría vender y hacer bien. Y es aquí donde una buena interrelación de los tres conceptos puede dar su mayor potencial, ya que hacer webs que sean óptimas para el SEO sin ser semánticamente correctas es bastante más complicado, y claro, una buena usabilidad del proyecto ayudará a crear más fácilmente una semántica más correcta.
Bueno, y según hemos visto, como se deben interrelacionar entre si para ayudarse? Veámoslo:
- La Usabilidad es el primer estado de un proyecto, su objetivo es simplificar el uso de un producto o proyecto. Se podría decir que estructurarlo de forma cómoda para el usuario. Pues ahí está la primera ventaja, al estructurarlo para el usuario, ayudas enormemente a la estructuración semánticamente correcta del site. Al definir tanto el proyecto ayudas al programador/maquetador a distinguir entre las diferentes zonas del proyecto, que cambios tendrán y como se deberían estructurar, creando así una semántica web más solida y completa.
- Como hemos dicho antes, una semántica web correcta, en su caso más básico, es una válida estructuración del código indicando las distintas secciones del proyecto. Pero esto más que para los usuarios es para los buscadores, que son realmente quienes ven el código y no el diseño. Luego es fácil pensar que si separamos bien contenido de información, cabecera y navegación del cuerpo y demás secciones, los buscadores entenderán perfectamente las distintas secciones, pondrán el peso correcto a cada sección y entenederán lo “puntos fuertes” del contenido, facilitando así el SEO Orgánico del site y su rápida indexación.
- En el sentido contrario, tenemos que a la hora de crear una semántica web correcta, el tener buenas nociones de SEO puede ayudarnos y mucho, ya que la interrelación de Tips de SEO y secciones de la web no son pocas, fortaleciendo así la interrelación entre ambas6
- Y en la otra parte, también tenemos que a la hora de crear la Usabilidad del site, tener nociones de semántica web, maquetación y diseño online, ayudarán y mucho a saber como crear estructuras, que secciones son factibles a la hora de pasarlo a la web, cuales no son recomendables por la complejidad que atañen o como poner las secciones para entregar el peso adecuado a cada una según el SEO Orgánico del proyecto.
Conclusión: Uno no puede ser experto en todos los ámbitos, pero si es necesario conocerlos lo suficiente para poder interrelacionar su trabajo con todo lo que hay alrededor del mismo. En este caso nos encontramos con tres sectores muy distintos, a los que llegan expertos de distintas ramas como informática, marketing, humanidades,… pero que deberían tener nociones básicas sobre los demás sectores para poder hacer un trabajo mucho más optimo en general.
- Véase que no le hemos hecho ni pizca de caso antes ↩
- Simple, verdad ↩
- Que recordemos no es la RAE, pero si un buen punto de partida ↩
- Ojo, que la definición es mia, no la toméis por axioma ↩
- En este caso nos centraremos solo sobre el SEO Orgánico ↩
- Por ejemplo, puede ayudar a la hora de poner la sección de navegación, el saber que un buscador no entiende varios divs seguidos como una correlación, sino que para esto es necesario un “UL” ↩
Sintiéndome orgulloso de mi padre.
Oct/095
Nota: Mi intención con este blog nunca ha sido la de mostrar sentimentalismos, para eso ya tenía mi otro blog que “murió” precisamente por no escribir mucho en él. Pero aun así creo que necesario hacer este pequeño homenaje a una de las personas que más a influenciado en mi vida… Sino la que más.
Quería hacerle un homenaje, pero creo que el mejor homenaje es simplemente reproducir la serie de correos que me llegaron hoy a mi cuenta.
El primero venía de mi padre, era esta “simple” presentación que ya nos hemos pasado muchas veces entre nosotros… Solo que esta vez venía en bonito, con más colores y más vistosa.
La diferencia esta vez fue la respuesta de una de sus propias hermanas, mi tía, que entre lágrimas solo podía preguntarle a mi padre Si él “había visto tanto, tanto, y todo eso que explica el archivo”…
La respuesta de mi padre no se hizo esperar y esta prefiero transcribirla literal.
Podría escribir un libro de las noches que estando oficialmente de vacaciones que me he tirado en la playa para controlar los alijos, de los cientos de kilos de droga que tengo cogidos en mi haber y de los que estoy felicitado de forma oficial, de los rescates de ahogados de los que tengo concedida una medalla de protección civil, de las familias que han dormido en mi casa tras sufrir algún accidente de trafico donde han perdido a algún familiar, de algún tiroteo que he mantenido con extorsionadores a los que detuve tras herir a uno y por tanto sufrir el oportuno juicio del que quede indemne, de tantos y tantos delincuentes detenidos tras persecuciones espectaculares con el coche oficial, de tantos gitanos detenidos con sus furgonetas llenas de artículos robados por importes elevadisimos y que en una ocasión particular le habían robado al propio alcalde de Jumilla (mi localidad de destino), de extorsionadores amenazando de secuestro de su hijo a un director de banco. y tantos y tantos etc. que ni ahora recuerdo ni quiero relatar pues podría significar prepotencia.
Es cierto que de esto nunca he comentado y toda la familia desconoce tanto la Quesada como la Nieto, y que solo habéis tenido conocimiento debido a este mensaje que si no nunca lo hubierais sabido pues ya me conocéis, no soy de comentar estas peculiaridades del servicio.
Besos a todo
Dios, solo de recordar aquellos tiempos me pongo malo… Pero lo que le falta añadir a mi padre es como ha dejado todo eso por lo que él ha vivido y luchado para venirse a Madrid, a unas oficinas, y así poder darles a sus hijos un futuro mejor. O cuantas noches su mujer ha dormido sola mientras el estaba fuera haciendo el servicio de un guardia más para llegar a casa y sin descansar ni 4 horas volverse a poner otra vez el uniforme de Oficial para trabajar sus 8 horas correspondientes… Estando más de 16 horas continuas de servicio. O como la familia entera hemos tenido que relegar su gran labor a un simple “puesto de funcionario” de cara a la gente e incluso a los amigos porque el puesto de Guardia Civil estaba mal visto… O tantas otras…
Solo añadir que cuando a mi me preguntan que quieres ser de mayor o que quieres hacer con tu vida, yo solo puedo pensar una cosa:
“Ser digno hijo de mi padre“
TODO LIST
Ago/092
Bueno, después de unas vacaciones por media Europa (Londres, París y Bruselas en 11 días), unos días en la playa (aunque estos ya si, currando) y un montón de “novedades” internas por venir que me tienen completamente absorbido, saco 5 minutos para transcribir1 un TODO List con los artículos que tengo en mente/preparados para ir sacando.
Nota: Eso si, actualmente me va a costar bastante sacar tiempo para escribirlos. Así que por desgracia me queda mucho tiempo hasta que vuelva a llevar un ritmo constante de Post y más todavía para llevar el ritmo de uno/dos post semanales que quisiera.
Ni que decir tiene, que no están escritos en un orden de preferencia predefinido. Así que si a alguien le interesa alguno, decirlo y lo intentaré preparar de los primeros.
Artículos de empresa
- Lo que se pide, lo que se paga, lo que se obtiene. O como quere un superSenior, pagando por un Junior y luego extrañarnos de los fallos dos años después.
- Como facturar de forma legal sin ser autónomo. No más leyendas urbanas de facturas de menos de 3.000 euros, de forma legal y bien explicadito.
- How to check the developer’s Job. Continuando con mi mal ingles y la serie “One Company, one work’s infrastructure” veremos de forma simple, sin demasiados tecnicismos, las ventajas de la estructura a la hora de checkear los trabajos.
- Social branding. O la facilidad para hablar con los peces grandes y chicos a través de la web.
Artículos técnicos:
- PHP – Magic Methods. Seríe básica – y en español
– sobre estos métodos, que aunque bastante gente los usa, poco o nada se ha escrito de ellos en castellano. - PHP – SPL. Otro de los grandes desconocidos en PHP. Cierto es que de esto se ha escrito más así que seré breve y creo que solo enlazaré los artículos
- PHP – OOP vs Funcional. Esto puede ser tremendamente extenso, así que veré que punto o puntos cojo al respecto y como los explico. Cojo un par de puntos y los desarrollo o hago como tantos otros post existentes, un megaresumen de porque es mejor la OOP??
- Y si no hay Ajax? O, que ve google de tu código? Porque no te indexa los artículos? Y como solucionarlo
- Usabilidad, semantica web y SEO. Como deberíamos interrelacionarlos todos desde la base, desde el principio, para que el proyecto salga lo mejor posible.
- Optimizando el código html. Para todos aquellos que alguna vez hemos sufrido de “divitis”, tenemos que ver como solucionarlo y sobretodo por qué.
- Presentación en sociedad de dos de mis proyectos personales. Primero los tendré que dejar en una versión 0.1 válida. Luego tener tiempo para dedicarles y luego presentarlos en sociedad para que todos los critiquéis, mejoréis o destrocéis
Como véis no son pocos y no son poco densos. Así que nada, espero cumplir esta TODO List2 e ir agregando nuevos artículos entre medias con todas las novedades.
Cuando las cosas se hacen bien, salen bien.
Jun/090
Bueno, como hablar de algo sin demostrarlo, es como no hablar de nada, vamos a centrarnos un poco en enseñar como entendemos y programamos un proyecto web desde la nuezAzul. Principalmente porque esta es mi área.
También es cierto que toco un poco algunas de las demás partes de un proyecto; maquetación, accesibilidad y usabilidad (de esto poquito), SEO y SEM, branding online,…. Pero de estas prefiero ir dejando pequeños apuntes técnicos sueltos y centrarme en lo que realmente es mi fuerte, la Programación Web Avanzada. Y si, se puede decir esto y sumarle PHP sin restar el más mínimo poder a la frase.
Y para ello, lo primero es desmitificar a los que piensan que PHP es inseguro y poco profesional; el inseguro y poco profesional es el programador, no el lengjuaje.
El primer problema que encontramos con PHP es su mayor virtud. La anarquía del lenguaje. Este lenguaje se creó principalmente con una máxima; la mayor libertad posible. No es necesario definir variables, no tiene una estructura de programación definida, puede mezclarse dentro de código html o html dentro de código php…
Esto ha hecho que desde un principio, PHP fuese muy suculento para todo el mundo. Tanto programadores profesionales, como amateurs e incluso completos “novatos” de la programación pueden hacer en PHP sus pinitos y programar cualquier cosa.
Claro, esto ha dado muchas lineas de código a PHP, de las cuales la mayoría se podría decir que son basura “no reutilizable” y sobretodo muy inseguras y difíciles de auditar/ampliar. Pero claro, no todo es culpa del código, no se le puede pedir a un newbie que entienda de “Sql Injection” o de calidad de código.
Y como se podría solucionar este problema? Bueno, lo primero aquí es saber que se quiere y distinguir los casos.
- Si eres un newbie, que solo quiere hacer sus pinitos, adelante, este es tu lenguaje y esto es todo lo que deberías leer de este blog.
- Si realmente quieres realizar código de calidad y reutilizable, empieza por lo básico. Se lo más estricto posible, estructura el código, declara las varibles al principio de cada método, usa patrones de programación y nunca olvides la flexibilidad de PHP, pero no supedites la calidad a la flexibilidad, hazlo al revés, supedita la flexibilidad a la calidad
El segundo problema es la rápida evolución del lenguaje frente a la lenta o inexistente evolución del programador. Tanto PHP como Apache y las bases de datos han tenido una evolución estos últimos años bastante fuerte, pasando de, por ejemplo, la programación funcional hasta la implementación de la OOP por parte de PHP, el famoso mod_rewriter de Apache o la potencia de las bases de datos relacionales. Todo esto implica un continuo esfuerzo por parte del programador para estar al día con todo lo que le rodea. Cosa que muchas veces no pasa, encontrandonos con que, por ejemplo, PHP4 no llega a desaparecer ya que implicaría restructurar mucho código o que no existan todavía casi ninguna aplicación que sea 100% OOP sino hibridos entre funcional y OOP.
Solucionar este problema es algo más complicado, cada día vemos actualizaciones de PHP, nuevas funcionalidades y otras decrépitas. Estar al día en esto podría ser algo fácil, pero si además hay que sumar el estar al día en las aplicaciones que usas, en Apache, en la base de datos con la que trabajas, revisando tu código para actualizarlo, … La cosa se complica un poco. Lo malo, esta es la única forma de solucionar el problema, es decir, si quieres realmente hacer buen código cada día, debes emplear cada día en formarte un poco más, y para esto no hay ayudas externas. Cada uno debe tener intención de leer y aprender cada día, sino, en poco más de un año, tu también estarás “decrepit“.
Otro de los defectos es la falta de estructura a la hora de programar, la falta de profesionalidad y de “seguridad de código” en lo que uno hace. Conozco muchos casos en los que un programador, que entiende y usa la OOP, deja esto de lado porque un “proyecto es pequeño” o porque “no es necesario“. Creando archivos faraónicos, sin estructura alguna en la programación, sin revisar los posibles bugs de la aplicación, … Esto siempre es un error, pero es más error cuando esto pasa de ser para “proyectos pequeños” (Aunque nunca llegue a entender que es eso de proyectos pequeños) y se utiliza en todos los proyectos que uno hace.
El mayor problema que esto acarrea es la imposibilidad del posterior mantenimiento del site, los problemas y el tiempo perdido a la hora de implementar nuevas funcionalidades, o simples cambios en el diseño. Como siempre, el mayor problema aquí es la desfatachez del programador al pensar en el hoy y no el mañana. El mañana serán problemas para el cliente, no para el programador.
Y por último, otro de los grandes errores con PHP, es la suma de todo lo anterior, es encontrarnos proyectos “cajón de sastre” en los cuales, los programadores con buenas ideas y sin tiempo para pensarlas bien, crean proyectos, donde se mezcla funcional con OOP, viendo funciones sueltas entre clases, donde no hay una estructura definida correctamente, donde no se tratan los objetos por paquetes como cualquier otro lenguaje de programación orientado a objetos. Donde se ven funciones obsoletas o donde se ven mezclados, entre grandes ideas, código y html. Dando así grandes “cajones de sastre” de los que no se puede reutilizar gran cosa…
Como se podría solucionar? Lo primero es obviar la programación para todas las versiones y centrarse en PHP5 o superior. Versión a partir de la cual se puede hablar realmente de OOP. Y después de esto, aprender de los demás lenguajes de programación, aprender realmente lo que es el paradigma MVC (o cualquier otro que sea válido) y ponerlo en práctica, no pensar que existe un proyecto pequeño, todos son igual de importantes, pues son tu carta de presentación, usar PHP igual que usarías Java o C++ y sobretodo
TENER RESPETO, MUCHO RESPETO, TANTO A TU TRABAJO, COMO A QUIEN PAGA POR ÉL.