Powered By Blogger

viernes, 22 de junio de 2012

Jolicloud aterriza en Android para atar en corto a todas tus redes sociales

Filed under:

Jolicloud aterriza en Android para atar en corto a todas tus redes sociales
Si te faltan ojos y horas del día para poder estar atento a todo lo que se cuece en la larga lista de redes sociales de las que eres partícipe, o simplemente quieres tener controlado todo el contenido relacionado contigo que pulula por la red, debes saber que Jolicloud acaba de lanzar una aplicación para Android que presume de poder hacerte la vida un poco más fácil. Dicha herramienta, como ya ocurriera con su beta Jolicloid ME, te permitirá concentrar servicios como Facebook, Twitter, Instagram, Tumblr, Picassa y Flickr en un único lugar para que puedas estar al informado al instante de todo lo que se publica a tu nombre, así como realizar búsquedas relacionadas, te rodea. Según nos cuentan los responsables del proyecto, la app es de carácter gratuito, funciona con dispositivos que ejecuten Android 2.1 o superior y entre sus planes se encuentra ampliar el abanico de plataformas participantes en un futuro no muy lejano.

[Vía The Next Web]

Leer - Descarga desde Google Play
Leer - Blog de Jolicloud
Permalink | Email this | Comments



Identifican la proteína necesaria para la regeneración de nervios dañados en las extremidades

Un grupo de investigadores de la Universidad de Washington ha dado con la proteína necesaria para regenerar los nervios periféricos lesionados. El hallazgo en ratones tendría implicaciones que podrán mejorar la recuperación después de una lesión nerviosa en las extremidades. Además, abre nuevas vías de investigación hacia la regeneración nerviosa en la activación del sistema nervioso central, conocido hasta ahora por su incapacidad para sanar.

Y es que los nervios periféricos proporcionan el sentido del tacto a la vez que “expulsan” a los músculos que mueven los brazos, piernas, manos y pies. A diferencia de los nervios del sistema nervioso central, los nervios periféricos pueden regenerarse después de que se cortan, sin embargo, los mecanismos detrás de esta regeneración no se conocían bien.

Y es aquí donde el estudio adquiere su importancia. Los científicos han identificado a la proteína DLK, la cual regula las señales que indican a la célula nerviosa que se ha lesionado. La proteína muestra el camino a la regeneración.

Según el profesor Aaron DiAnthony:

DLK es una molécula clave que une una lesión en la respuesta del nervio a la lesión, la que permite que los nervios se regeneren. ¿Cómo sabe un nervio lesionado que lo está? ¿cómo entiende la información y la transforma en un programa de regeneración o cómo las conexiones vuelven a crecer? ¿o por qué sólo el sistema nervioso periférico responde de esta forma mientras que el sistema nervioso central no lo hace? Creemos que DLK es la respuesta.

Los investigadores cuentan que el cuerpo de las células que contienen el núcleo de un nervio periférico se encuentran en la médula espinal. Durante el desarrollo temprano los nervios envían una serie de cables largos y finos, una serie de empalmes llamados axones a las puntas de los dedos de las manos o los pies.

Una vez que los axones alcanzan sus objetivos como puede ser un músculo, se detienen y se extienden permaneciendo prácticamente sin cambios en la vida del organismo a menos que estén dañados.

Cuando el axón se corta en algún punto entre el cuerpo de la célula en la médula espinal y el músculo, la pieza de axón que ya no está conectada al cuerpo comienza a desintegrarse.

DiAnthony y sus colegas encontraron que DLK acelera la recuperación del nervio periférico. Según los investigadores:

Ahora, una neurona que ha visto a una lesión anterior, tiene un programa diferente de regeneración sobre uno que nunca ha sido dañado. Esperamos ser capaces de identificar los factores que conducen a la regeneración mejorada después de una segunda lesión. Hemos encontrado que se activa por un factor de DLK y el siguiente paso es activar DLK en una neurona nueva lesionada para ver si tiene una regeneración aún mejor.

El estudio concluye que además de acelerar la recuperación del nervio periférico, la proteína podría tener consecuencias en el sistema nervioso central y una hipotética regeneración.





Google ayuda a preservar lenguas en peligro de extinción

Según la publicación “The Ethnologue: Languages of the World”, existen en torno a 6.900 lenguas en el mundo entre idiomas y dialectos, una cifra que podría parecer bastante alta (que lo es) pero que realmente no es del todo precisa porque aún existen zonas en el planeta que no han sido lo suficientemente exploradas y en las que existen asentamientos y tribus que no han tenido contacto alguno con la civilización moderna. A pesar de esta enorme riqueza lingüística, el devenir de los años ha provocado que el uso de algunas de estas lenguas haya ido disminuyendo hasta el punto de tan solo ser habladas por grupos cada vez más pequeños de personas que apenas pueden transmitir este conocimiento y cultura a las generaciones venideras. Con la idea de preservar lenguas que se encuentran en peligro de perderse, Google ha decidido sumarse como partner tecnológico al proyecto Idiomas en peligro de extinción con la idea de colaborar en la creación de un banco de conocimiento que permita que estas lenguas no se pierdan.

Este proyecto promovido por la Alianza para la Diversidad Lingüística, tiene como objetivo evitar que desaparezca la herencia cultural de muchos lugares del mundo cuyas lenguas están dejando de hablarse y están desapareciendo a un ritmo extremadamente rápido. Si bien la evolución cultural del ser humano ha provocado la extinción de ciertas lenguas y su evolución, el ritmo actual comenzaba a alertar a los lingüistas y, de hecho, han pronosticado que en los próximos 100 años se perderán alrededor de la mitad de las lenguas catalogadas.

Para preservar estas 3.500 lenguas en peligro de extinción, Google ha dotado al proyecto de un banco de recursos tecnológicos con los que documentar y preservar todas las lenguas en peligro y, con ese fin, ha desarrollado un sitio web en el que se mostrará un mapa con todas las lenguas catalogadas como lenguas en vías de extinción, la severidad de su desaparición, la región en la que se habla y una ficha para cada una de estas lenguas con sus características principales y, lo más importante, una colección de vídeos en la que algunos de sus hablantes se expresan en dicha lengua, artículos que muestran su escritura o documentos sonoros en los que también podremos escuchar estas lenguas.

Documentar las más de 3.000 lenguas que están a punto de desaparecer es un paso importante para preservar la diversidad, honrar los conocimientos de nuestros mayores y enriquecer el futuro de los jóvenes

Precisamente, este banco de conocimiento creo que es una de las piezas clave del proyecto porque, además de preservar estas lenguas en una especie de “cápsula del tiempo” y evitar que se pierdan, servirá para darlas a conocer y mostrar al mundo la riqueza lingüística que posee y que, seguramente, pasa desapercibida para la gran mayoría de personas. Este banco de conocimiento está abierto a la colaboración de los usuarios y, gracias al esfuerzo colectivo, los impulsores del proyecto esperan que cada vez sean más los contenidos preservados.

Vale la pena visitar esta bonita iniciativa, visualizar sobre el mapa las distintas lenguas catalogadas y, seguramente, sorprendernos con lenguas de nuestro país que, quizás, no conocíamos ni tan siquiera su existencia (particularmente, me ha pasado con el Aragonés).





Deus e o Diabo na Terra do Sol [Dvd-Rip][V.O + S.E][1964]



TÍTULO ORIGINAL Deus e o Diabo na Terra do Sol
AÑO 1964
DURACIÓN 120 min.
PAÍS Brasil
DIRECTOR Glauber Rocha
GUIÓN Glauber Rocha
MÚSICA Sérgio Ricardo
FOTOGRAFÍA Waldemar Lima (B&W)
REPARTO Geraldo Del Rey, Yoná Magalhães, Othon Bastos, Maurício do Valle, Lidio Silva, Sonia Dos Humildes, João Gama, Antônio Pinto, Milton Rosa, Roque Santos
PRODUCTORA Banco Nacional de Minas Gerais / Copacabana Filmes / Luiz Augusto Mendes Produções Cinematográficas

SINOPSIS La película se desarrolla en los años 40 y narra la historia de Manuel (Geraldo del Rey) un vaquero que, cansado del maltrato que recibe de manos de su patrón, lo mata y huye con su esposa Rosa. Prófugos de la justicia, Manuel y Rosa recorren las baldías tierras norteñas combatiendo el terror físico y espiritual que parece haber poseído el país.


(Subtitulo dentro de WinRAR)



Test de Turing con humanos: más fácil pasar por gay que por cristiano


Alan Turing se preguntó: ¿pueden pensar las máquinas? Para evitar definir los términos pensar o máquina, decidió crear su famoso test. Si un juez humano no puede distinguir entre una máquina y otro humano, la máquina piensa. Llamó a esta prueba el Juego de la Imitación.

Con el tiempo, el Test de Turing ha demostrado ser una poderosa herramienta. Si bien es cierto que ninguna máquina lo supera en la actualidad en un entorno verbal sin restricciones, cada vez son más las máquinas que lo superan en tareas concretas como jugar al ajedrez.

Ahora el Test de Turing o el Juego de la Imitación ha comenzado a usarse de una forma muy ingeniosa por los sociólogos. Se trata de que una persona se haga pasar por otro tipo de persona y ver si engaña a un juez. De este modo comparamos hasta que punto una persona entiende a las personas que pertenecen a otro grupo social. Para poderme hacer pasar por musulmán, tengo que entender el punto de vista de los musulmanes.

Existen según los sociólogos dos tipos de experiencia. La experiencia contributiva se refiere a los auténticos expertos, físicos, abogados o economistas que aportan nuevos conocimientos y experiencias a su materia. La experiencia interactiva, por el contrario, es la de los expertos que solo rozan el área, hablan con los auténticos expertos y acaban teniendo una buena idea de la materia.

Aplicar el Juego de la Imitación en estos entornos está resultando un experimento sociológico muy fructífero. Harry Collins, sociólogo y autor de estos novedosos estudios, había pasado mucho tiempo trabajando con físicos y se sometió a la prueba. Un físico, el juez, les preguntó a él y a otra persona, un físico auténtico, diversas cuestiones sobre física. Después, las respuestas de ambos, el imitador y el físico, se repartieron entre varios otros físicos que harían de juez. La sorpresa consistió en que el imitador obtuvo mejores resultados que el físico auténtico. Al parecer, lo que más confundió a los jueces es que el físico auténtico dio una respuesta de libro a una pregunta mientras que el imitador proporcionó una respuesta correcta pero inusual. Esto hizo pensar a los jueces que el imitador había elaborado más la respuesta.

Pongámonos en el caso de los ciegos. Han vivido toda la vida en un mundo de videntes. Constantemente escuchan comentarios de personas que ven sobre acontecimientos que pueden ser vistos. El caso contrario es el de las personas que ven y nunca han estado expuestas al mundo de los ciegos. ¿Quién conoce mejor el otro mundo? ¿Quíen engañará a quién? El ciego es muy capaz de engañar al vidente y hacerle creer que ve. El vidente no puede engañar al ciego y hacerle pensar que él también es ciego.

Para medir los resultados se estableció una medida llamada relación de identificación o IR. Con esta medida se ha comenzado a relacionar ámbitos distintos.

Un ámbito estudiado ha sido la homosexualidad. Se da la dramática circunstancia de que Turing era gay y sufrió mucho por ello. Fue condenado a la castración química por ser homosexual y, no pudiendo resistirlo, dos años después se suicidó. Pero la situación en Inglaterra y en la mayoría del mundo ha cambiado. La normalización de la homosexualidad ha permitido que un mundo, antes oculto, sea ahora bien conocido.

Otro ámbito investigado ha sido la práctica religiosa. La sociedad inglesa se ha ido secularizando y los investigadores tenían el interés en saber hasta qué punto. De modo que realizaron el Juego de la Imitación en el que personas no religiosas se hacían pasar por cristianos y fueron evaluados por jueces cristianos.

Y ¿cuál fue el resultado? Entendemos mejor a los gays que a los cristianos. O dicho de otra forma, es más fácil hacerse pasar por lo primero que por lo segundo. O, para ser exactos, las posibilidades que tiene un heterosexual de hacer creer a un gay de que él también lo es son mayores que las posibilidades que tiene un no religioso de hacer creer a un cristiano de que él también es religioso.

El mundo cambia rápidamente pero la utilidad de una buena idea como el Test de Turing permanece.





jueves, 21 de junio de 2012

Screen Scraping with Node.js

You may have used NodeJS as a web server, but did you know that you can also use it for web scraping? In this tutorial, we’ll review how to scrape static web pages – and those pesky ones with dynamic content – with the help of NodeJS and a few helpful NPM modules.



A Bit About Web Scraping

Web scraping has always had a negative connotation in the world of web development – and for good reason. In modern development, APIs are present for most popular services and they should be used to retrieve data rather than scraping. The inherent problem with scraping is that it relies on the visual structure of the page being scraped. Whenever that HTML changes – no matter how small the change may be – it can completely break your code.

Despite these flaws, it's important to learn a bit about web scraping and some of the tools available to help with this task. When a site does not reveal an API or any syndication feed (RSS/Atom, etc), the only option we're left with to get that content… is scraping.

Note: If you can't get the information you require through an API or a feed, it's a good sign that the owner does not want that information to be accessible. However, there are exceptions.


Why use NodeJS?

Scrapers can be written in any language, really. The reason why I enjoy using Node is because of its asynchronous nature, which means that my code is not blocked at any point in the process. I'm quite familiar with JavaScript so that's an added bonus. Finally, there are some new modules that have been written for NodeJS that makes it easy to scrape websites in a reliable manner (well, as reliable as scraping can get!). Let's get started!


Simple Scraping With YQL

Let's start with the simple use-case: static web pages. These are your standard run-of-the-mill web pages. For these, Yahoo! Query Language (YQL) should do the job very well. For those unfamiliar with YQL, it's a SQL-like syntax that can be used to work with different APIs in a consistent manner.

YQL has some great tables to help developers get HTML off a page. The ones I want to highlight are:

Let's go through each of them, and review how to implement them in NodeJS.

html table

The html table is the most basic way of scraping HTML from a URL. A regular query using this table looks like this:

  select * from html where url="http://finance.yahoo.com/q?s=yhoo" and xpath='//div[@id="yfi_headlines"]/div[2]/ul/li/a'  

This query consists of two parameters: the "url" and the "xpath". The url is self-explanatory. The XPath consists of an XPath string telling YQL what section of the HTML should be returned. Try this query here.

Additional parameters that you can use include browser (boolean), charset (string), and compat (string). I have not had to use these parameters, but refer to the documentation if you have specific needs.

Not comfortable with XPath?

Unfortunately, XPath is not a very popular way of traversing the HTML tree structure. It can be complicated to read and write for beginners.

Let's look at the next table, which does the same thing but lets you use CSS instead

data.html.cssselect table

The data.html.cssselect table is my preferred way of scraping HTML off a page. It works the same way as the html table but allows you to CSS instead of XPath. In practice, this table converts the CSS to XPath under the hood and then calls the html table, so it is a little slower. The difference should be negligible for scraping needs.

A regular query using this table looks like:

  select * from data.html.cssselect where url="www.yahoo.com" and css="#news a"  

As you can see, it is much cleaner. I recommend you try this method first when you're attempting to scrape HTML using YQL. Try this query here.

htmlstring table

The htmlstring table is useful for cases where you are trying to scrape a large chunk of formatted text from a webpage.

Using this table allows you to retrieve the entire HTML content of that page in a single string, rather than as JSON that is split based on the DOM structure.

For example, a regular JSON response that scrapes an <a> tag looks like this:

  "results": {     "a": {       "href": "...",       "target": "_blank",       "content": "Apple Chief Executive Cook To Climb on a New Stage"      }   }  

See how the attributes are defined as properties? Instead, the response from the htmlstring table would look like this:

  "results": {    "result": {      "<a href=\"…\" target="_blank">Apple Chief Executive Cook To Climb on a New Stage</a>     }  }  

So, why would you use this? Well, from my experience, this comes in great use when you're trying to scrape a large amount of formatted text. For example, consider the following snippet:

  <p>Lorem ipsum <strong>dolor sit amet</strong>, consectetur adipiscing elit.</p>  <p>Proin nec diam magna. Sed non lorem a nisi porttitor pharetra et non arcu.</p>  

By using the htmlstring table, you are able to get this HTML as a string, and use regex to remove the HTML tags, which leaves you with just the text. This is an easier task than iterating through JSON that has been split into properties and child objects based on the DOM structure of the page.


Using YQL with NodeJS

Now that we know a little bit about some of the tables available to us in YQL, let's implement a web scraper using YQL and NodeJS. Fortunately, this is really simple, thanks to the node-yql module by Derek Gathright.

We can install the module using npm:

  npm install yql  

The module is extremely simple, consisting of only one method: the YQL.exec() method. It is defined as the following:

  function exec (string query [, function callback] [, object params] [, object httpOptions])  

We can use it by requiring it and calling YQL.exec(). For example, let's say we want to scrape the headlines from all the posts on the Nettuts main page:

  var YQL = require("yql");    new YQL.exec('select * from data.html.cssselect where url="http://net.tutsplus.com/" and css=".post_title a"', function(response) {        //response consists of JSON that you can parse    });  

The great thing about YQL is its ability to test your queries and determine what JSON you are getting back in real-time. Go to the console to try this query out, or click here to see the raw JSON.

The params and httpOptions objects are optional. Parameters can contain properties such as env (whether you are using a specific environment for the tables) and format (xml or json). All properties passed into params are URI-encoded and appended to the query string. The httpOptions object is passed into the header of the request. Here, you can specify whether you want to enable SSL, for instance.

The JavaScript file, named yqlServer.js, contains the minimal code required to scrape using YQL. You can run it by issuing the following command in your terminal:

  node yqlServer.js  

Exceptions and other notable tools

YQL is my preferred choice for scraping content off static web pages, because it's easy to read and easy to use. However, YQL will fail if the web page in question has a robots.txt file that denies a response to it. In this case, you can look at some of the utilities mentioned below, or use PhantomJS, which we’ll cover in the following section.

Node.io is a useful Node utility that is specifically designed for data scraping. You can create jobs that take input, process it and return some output. Node.io is well-watched on Github, and has some helpful examples to get you started.

JSDOM is a very popular project that implements the W3C DOM in JavaScript. When supplied HTML, it can construct a DOM that you can interact with. Check out the documentation to see how you can use JSDOM and any JS library (such as jQuery) together to scrape data from web pages.


Scraping Pages With Dynamic Content

So far, we've looked at some tools that can help us scrape web pages with static content. With YQL, it's relatively easy. Unfortunately, we are often presented with pages that have content which is loaded dynamically with JavaScript. In these cases, the page is often empty initially, and then the content is appended afterwards. How can we deal with this issue?

An Example

Let me provide an example of what I mean; I have uploaded a simple HTML file to my own website, which appends some content, via JavaScript, two seconds after the document.ready() function is called. You can check out the page here. Here's what the source looks like:

  <!DOCTYPE html>  <html>      <head>          <title>Test Page with content appended after page load</title>      </head>        <body>          Content on this page is appended to the DOM after the page is loaded.            <div id="content">            </div>        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>      <script>          $(document).ready(function() {                setTimeout(function() {                  $('#content').append("<h2>Article 1</h2><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p><h2>Article 2</h2><p>Ut sed nulla turpis, in faucibus ante. Vivamus ut malesuada est. Curabitur vel enim eget purus pharetra tempor id in tellus.</p><h2>Article 3</h2><p>Curabitur euismod hendrerit quam ut euismod. Ut leo sem, viverra nec gravida nec, tristique nec arcu.</p>");              }, 2000);            });      </script>      </body>  </html>  

Now, let's try scraping the text inside the <div id="content"> using YQL.

  var YQL = require("yql");    new YQL.exec('select * from data.html.cssselect where url="http://tilomitra.com/repository/screenscrape/ajax.html" and css="#content"', function(response) {        //This will return undefined! The scraping was unsuccessful!      console.log(response.results);    });  

You'll notice that YQL returns undefined because, when the page is loaded, the <div id="content"> is empty. The content has not been appended yet. You can try the query out for yourself here.

Let's look at how we can get around this issue!

Enter PhantomJS

PhantomJS can load web pages and mimic a Webkit-based browser without the GUI.

My preferred method for scraping information from these sites is to use PhantomJS. PhantomJS describes itself as a "headless Webkit with a JavaScript API. In simplistic terms, this means that PhantomJS can load web pages and mimic a Webkit-based browser without the GUI. As a developer, we can call on specific methods that PhantomJS provides to execute code on the page. Since it behaves like a browser, scripts on the webpage run as they would in a regular browser.

To get data off our page, we are going to use PhantomJS-Node, a great little open-source project that bridges PhantomJS with NodeJS. Under the hood, this module runs PhantomJS as a child process.

Installing PhantomJS

Before you can install the PhantomJS-Node NPM module, you must install PhantomJS. Installing and building PhantomJS can be a little tricky, though.

First, head over to PhantomJS.org and download the appropriate version for your operating system. In my case, it was Mac OSX.

After downloading, unzip it to somewhere such as /Applications/. Next, you want to add it to your PATH:

  sudo ln -s /Applications/phantomjs-1.5.0/bin/phantomjs /usr/local/bin/  

Replace 1.5.0 with your downloaded version of PhantomJS. Be advised that not all systems will have /usr/local/bin/. Some systems will have: /usr/bin/, /bin/, or usr/X11/bin instead.

For Windows users, check the short tutorial here. You'll know you're all set up when you open your Terminal and write phantomjs, and you don't get any errors.

If you are uncomfortable editing your PATH, make a note of where you unzipped PhantomJS and I'll show another way of setting it up in the next section, although I recommend you edit your PATH.

Installing PhantomJS-Node

Setting up PhantomJS-Node is much easier. Provided you have NodeJS installed, you can install via npm:

  npm install phantom  

If you did not edit your PATH in the previous step when installing PhantomJS, you can go into the phantom/ directory pulled down by npm and edit this line in phantom.js.

  ps = child.spawn('phantomjs', args.concat([__dirname + '/shim.js', port]));  

Change the path to:

  ps = child.spawn('/path/to/phantomjs-1.5.0/bin/phantomjs', args.concat([__dirname + '/shim.js', port]));  

Once that is done, you can test it out by running this code:

  var phantom = require('phantom');  phantom.create(function(ph) {    return ph.createPage(function(page) {      return page.open("http://www.google.com", function(status) {        console.log("opened google? ", status);        return page.evaluate((function() {          return document.title;        }), function(result) {          console.log('Page title is ' + result);          return ph.exit();        });      });    });  });  

Running this on the command-line should bring up the following:

  opened google?  success  Page title is Google  

If you got this, you're all set and ready to go. If not, post a comment and I'll try to help you out!

Using PhantomJS-Node

To make it easier for you, I've included a JS file, called phantomServer.js in the download that uses some of PhantomJS' API to load a webpage. It waits for 5 seconds before executing JavaScript that scrapes the page. You can run it by navigating to the directory and issuing the following command in your terminal:

  node phantomServer.js  

I'll give an overview of how it works here. First, we require PhantomJS:

  var phantom = require('phantom');  

Next, we implement some methods from the API. Namely, we create a page instance and then call the open() method:

  phantom.create(function(ph) {    return ph.createPage(function(page) {        //From here on in, we can use PhantomJS' API methods      return page.open("http://tilomitra.com/repository/screenscrape/ajax.html",          function(status) {                //The page is now open              console.log("opened site? ", status);            });      });  });  

Once the page is open, we can inject some JavaScript into the page. Let's inject jQuery via the page.injectJs() method:

  phantom.create(function(ph) {    return ph.createPage(function(page) {      return page.open("http://tilomitra.com/repository/screenscrape/ajax.html", function(status) {        console.log("opened site? ", status);                         page.injectJs('http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js', function() {                  //jQuery Loaded                  //We can use things like $("body").html() in here.                });      });    });  });  

jQuery is now loaded, but we don't know whether the dynamic content on the page has loaded yet. To account for this, I usually put my scraping code inside a setTimeout() function that executes after a certain time interval. If you want a more dynamic solution, the PhantomJS API lets you listen and emulate certain events. Let's go with the simple case:

  setTimeout(function() {      return page.evaluate(function() {            //Get what you want from the page using jQuery.          //A good way is to populate an object with all the jQuery commands that you need and then return the object.            var h2Arr = [], //array that holds all html for h2 elements          pArr = []; //array that holds all html for p elements            //Populate the two arrays          $('h2').each(function() {              h2Arr.push($(this).html());          });            $('p').each(function() {              pArr.push($(this).html());          });            //Return this data          return {              h2: h2Arr,              p: pArr          }      }, function(result) {          console.log(result); //Log out the data.          ph.exit();      });  }, 5000);  

Putting it all together, our phantomServer.js file looks like this:

  var phantom = require('phantom');  phantom.create(function(ph) {    return ph.createPage(function(page) {      return page.open("http://tilomitra.com/repository/screenscrape/ajax.html", function(status) {        console.log("opened site? ", status);                         page.injectJs('http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js', function() {                  //jQuery Loaded.                  //Wait for a bit for AJAX content to load on the page. Here, we are waiting 5 seconds.                  setTimeout(function() {                      return page.evaluate(function() {                            //Get what you want from the page using jQuery. A good way is to populate an object with all the jQuery commands that you need and then return the object.                          var h2Arr = [],                          pArr = [];                          $('h2').each(function() {                              h2Arr.push($(this).html());                          });                          $('p').each(function() {                              pArr.push($(this).html());                          });                            return {                              h2: h2Arr,                              p: pArr                          };                      }, function(result) {                          console.log(result);                          ph.exit();                      });                  }, 5000);                });      });      });  });  

This implementation is a little crude and disorganized, but it makes the point. Using PhantomJS, we are able to scrape a page that has dynamic content! Your console should output the following:

  → node phantomServer.js  opened site?  success  { h2: [ 'Article 1', 'Article 2', 'Article 3' ],    p:     [ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',       'Ut sed nulla turpis, in faucibus ante. Vivamus ut malesuada est. Curabitur vel enim eget purus pharetra tempor id in tellus.',       'Curabitur euismod hendrerit quam ut euismod. Ut leo sem, viverra nec gravida nec, tristique nec arcu.' ] }  

Conclusion

In this tutorial, we reviewed two different ways for performing web scraping. If scraping from a static web page, we can take advantage of YQL, which is easy to set up and use. On the other hand, for dynamic sites, we can leverage PhantomJS. It's a little harder to set up, but provides more capabilities. Remember: you can use PhantomJS for static sites too!

If you have any questions on this topic, feel free to ask below and I'll do my best to help you out.



Países del ALBA rechazan maniobra de juicio político contra Presidente paraguayo


- Correo del Orinoco - http://www.correodelorinoco.gob.ve - Comunicado:| Países del ALBA rechazan maniobra de juicio político contra Presidente paraguayo Los países que integran la Alianza Bolivariana para los Pueblos de Nuestra América (ALBA) rechazaron este jueves la maniobra política de los[...]

Dinamarca descarta los avisos por compartir archivos lanzando iniciativas de servicios legales


Dinamarca ha dado un paso al frente en lo que se refiere a la lucha por la infracción en el intercambio de archivos. Si en Europa y resto del mundo parecen instaurarse regulaciones tipo “three strikes” o Hadopi, donde se persigue al usuario con advertencias y penas, el país abandona la idea centrándose en una nueva iniciativa. “Pirate Package” impulsará el desarrolló de la innovación con iniciativas legales y debates entre todas las partes, incluyendo a los propios usuarios.

Y es que tras varios años donde el gobierno ha buscado la mejor solución a la mal llamada piratería, el gobierno actual anunciará una nueva estrategia contra el uso del intercambio de archivos no autorizado.

Un modelo bajo el título de “Pirate Package” que tira la anterior propuesta, el llamado “modelo a la carta” con el que se pretendía enviar una serie de advertencias a los usuarios con posteriores penalizaciones.

La nueva iniciativa contra la “piratería” busca promover el desarrollo y la creación de ofertas legales. Una propuesta que constaría de varios apartados:

El primero sería el denominado Foro de Innovación. Se trata de una plataforma que ofrecerá un diálogo y apoyará la innovación a todos aquellos que busquen crear y desarrollar modelos de negocio digitales en diferentes campos creativos.

Según el gobierno:

El propósito de este foro ayudará a crear una base para una futura colaboración entre las industrias y todos los protagonistas con el objetivo común de garantizar que los consumidores tengan igualdad y fácil acceso de tantos contenidos creativos como sea posible.

Otro de los apartados sería el denominado como “educación de los consumidores”. En este caso el ministerio de Cultura se unirá a la industria de las telecomunicaciones, los titulares de derechos y el Consejo de Consumidores para poner en marcha un proyecto de sensibilización conjunta, un espacio para informar a los consumidores donde también se promoverá los servicios legales de aquellos que no lo son.

Además, según ha contado el ministerio, uno de los problemas en el consumo de “piratería” de música y películas es que el público no entiende el significado y las consecuencias de estas acciones. Se propone por tanto que los titulares de derechos intervengan sobre las masas con un amplio debate:

Los titulares de derechos han declarado que tomarán la iniciativa creando grupos de trabajo informativos que, de manera pro-activa, se comunicarán con los usuarios tanto en las plataformas como en los foros pertinentes.

Este punto significa que los titulares de derecho tratarán de crear un debate y un diálogo público en todas las plataformas (como pueden ser BiTtorrent) para intercambiar opiniones.

Los ISP promoverán en las facturas de sus clientes avisos sobre el buen uso de medios legales sobre las plataformas “piratas”.

Por último, existirá un código de conducta, un acuerdo al que habrían llegado los proveedores y los titulares de derechos sobre la censura de los sitios. En el mismo se habla de que si los titulares quieren bloquear un sitio, tendrán que emprender acciones legales contra un proveedor de Internet. Los proveedores aceptan que lo que decida el tribunal será el resultado final.

Un último punto controvertido, ya que todo dependerá de un tribunal y su “juicio” sobre cada caso. El código de conducta al que se ha llegado elimina la posibilidad a que un proveedor se niegue a bloquear un sitio.

En cualquier caso, el paso dado por Dinamarca podríamos considerarlo de pionero, eliminando las cartas o avisos y buscando soluciones alternativas donde se promueve la innovación y el feedback entre todas las partes.





lunes, 18 de junio de 2012

Así funciona Junior, el navegador para iPad de Mozilla

Lo que vemos en las imágenes es una demostración del navegador Junior que prepara Mozilla para el iPad. Una herramienta que poco tiene que ver con Firefox debido a que Apple no permite ninguna tecnología en iOS fuera de Webkit. Se suprimen muchas de las características del famoso navegador (y de la gran mayoría) por una experiencia sencilla a pantalla completa.

Definiendo la experiencia de Safari en el iPad como “miserable”, Alex Limi y Trond Werner Lansen, del equipo de diseño de productos y estrategias de Mozilla, presentaron a Junior en acción.

Una muestra de más de media hora donde mostraron los cambios que existirán entre Firefox y Junior. Básicamente y debido a que no han podido utilizar su propio motor para el navegador, desde Mozilla han simplificado la experiencia al máximo.

Principalmente se “eliminan” la barra de direcciones, las pestañas y la barra de búsqueda para mostrar un navegador a pantalla completa. Esto no quiere decir que Junior no tenga estas opciones, lo que ocurre es que estarán disponibles en un botón que Mozilla sitúa en el extremo del lado derecho.

Este botón nos llevará a un historial de las últimas páginas visitadas, pestañas, buscador y a la barra de direcciones para poder acudir a cualquier sitio.

Un segundo botón en el extremo izquierdo nos permitirá retroceder a la página anterior que visitábamos. Una pulsación larga de este botón nos abrirá nuevas funciones como la recarga de una página.

La idea como digo es simplificar y dejar en un plano secundario la mayoría de acciones estándar de los navegadores de hoy con dos únicos botones secundarios que nos llevan a la mayoría de características de los navegadores actuales.

Aún sin fecha oficial de lanzamiento, los desarrolladores de Mozilla cuentan que el diseño actual de los navegadores es obsoleto y piensan que el iPad es una gran oportunidad para experimentar.





i-SODOG, la mascota robot que conquistará tu corazoncito (vídeo)

Filed under:

i-SODOG, la mascota robot que conquistará tu corazoncito (vídeo)
Es un robot, representa a un animal, y sin embargo no es ni de lejos intimidatorio, o al menos no como lo puede ser un cuadrúpedo como los que hemos podido ver desde estas líneas. Ha sido bautizado como i-SODOG y presentado en el marco del Tokio International Toy Show y enseguida nos ha enternecido. Pero nuestro nuevo amigo no es sólo una mascota entrañable: es también todo un despliegue de tecnología que encantará a los amantes de este tipo de productos. i-SODOG llega repleto de sensores al tacto, 15 servos y un micrófono de forma que pueda obedecer hasta a 50 órdenes de viva voz que le demos. Cuenta con un sistema básico de inteligencia artificial que le permite modificar su comportamiento en base a las órdenes de su dueño. Nuestro nuevo amigo cuenta con una app con la que podemos controlarlo y está disponible tanto para Android como para iOS. Saldrá a la venta a comienzos de 2013 por un precio de 31.500 yenes (unos 400 dólares/321 euros) aunque por el momento únicamente en Japón. Te dejamos con un vídeo tras el salto.

Continue reading i-SODOG, la mascota robot que conquistará tu corazoncito (vídeo)

Read | Permalink | Email this | Comments



Dropbox no incluirá la carpeta pública en las cuentas creadas a partir del 31 de julio

Filed under: ,

Dropbox no incluirá la carpeta pública en cuentas nuevas a partir del 31 de julio
Nuevos usuarios de Dropbox deberán prepararse para un cambio que está siendo anunciado con mucha anticipación: a partir del 31 de julio las nuevas cuentas serán creadas sin la carpeta pública. Insistimos aclarando que las cuentas creadas con anticipación no verán nada distinto y además, hay que considerar que funcionalidad similar a la ofrecida por la carpeta pública ha estado disponible desde hace algún tiempo con la opción de compartir enlaces; es cierto que no funcionan exactamente igual a la carpeta pública, pero también debemos admitir que el efecto final es muy similar.

No sabemos a ciencia cierta la razón que llevó a Dropbox a implementar este cambio, y esperamos que sea importante porque ha generado un descontento que no ha tardado en hacerse oír. Por suerte la nueva configuración no es retroactiva, y eso lo decimos a pesar de que desde hace meses no usamos nuestra cuenta porque siempre terminamos llenándola con archivos inútiles.

[Vía SlashGear]
Read | Permalink | Email this | Comments