You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streams.apache.org by sb...@apache.org on 2014/03/29 02:32:02 UTC

[1/3] making activity.links an array of strings, so it's useful adding processor-urls, still debugging

Repository: incubator-streams
Updated Branches:
  refs/heads/springcleaning b59bcd28b -> 9e757aed9


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeDeserializer.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeDeserializer.java b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeDeserializer.java
new file mode 100644
index 0000000..4b3c4d1
--- /dev/null
+++ b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeDeserializer.java
@@ -0,0 +1,32 @@
+package org.apache.streams.jackson;
+
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.ISODateTimeFormat;
+
+import java.io.IOException;
+
+/**
+ * Created by sblackmon on 3/27/14.
+ */
+public class StreamsDateTimeDeserializer extends StdDeserializer<DateTime> {
+
+    public static final DateTimeFormatter ACTIVITY_FORMAT = ISODateTimeFormat.basicDateTime();
+
+    protected StreamsDateTimeDeserializer(Class<DateTime> dateTimeClass) {
+        super(dateTimeClass);
+    }
+
+    @Override
+    public DateTime deserialize(JsonParser jpar, DeserializationContext context) throws IOException, JsonProcessingException {
+        return ACTIVITY_FORMAT.parseDateTime(jpar.getValueAsString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeSerializer.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeSerializer.java b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeSerializer.java
new file mode 100644
index 0000000..b905bf4
--- /dev/null
+++ b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsDateTimeSerializer.java
@@ -0,0 +1,28 @@
+package org.apache.streams.jackson;
+
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.ISODateTimeFormat;
+
+import java.io.IOException;
+
+/**
+ * Created by sblackmon on 3/27/14.
+ */
+public class StreamsDateTimeSerializer extends StdSerializer<DateTime> {
+
+    public static final DateTimeFormatter ACTIVITY_FORMAT = ISODateTimeFormat.basicDateTime();
+
+    protected StreamsDateTimeSerializer(Class<DateTime> dateTimeClass) {
+        super(dateTimeClass);
+    }
+
+    @Override
+    public void serialize(DateTime value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
+        jgen.writeString(ACTIVITY_FORMAT.print(value));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsJacksonModule.java
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsJacksonModule.java b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsJacksonModule.java
new file mode 100644
index 0000000..8edd963
--- /dev/null
+++ b/streams-pojo/src/main/java/org/apache/streams/jackson/StreamsJacksonModule.java
@@ -0,0 +1,16 @@
+package org.apache.streams.jackson;
+
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import org.joda.time.DateTime;
+
+/**
+ * Created by sblackmon on 3/27/14.
+ */
+public class StreamsJacksonModule extends SimpleModule {
+
+    public StreamsJacksonModule() {
+        super();
+        addSerializer(DateTime.class, new StreamsDateTimeSerializer(DateTime.class));
+        addDeserializer(DateTime.class, new StreamsDateTimeDeserializer(DateTime.class));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-pojo/src/main/jsonschema/org/apache/streams/pojo/json/activity.json
----------------------------------------------------------------------
diff --git a/streams-pojo/src/main/jsonschema/org/apache/streams/pojo/json/activity.json b/streams-pojo/src/main/jsonschema/org/apache/streams/pojo/json/activity.json
index 2cdd233..fa74486 100644
--- a/streams-pojo/src/main/jsonschema/org/apache/streams/pojo/json/activity.json
+++ b/streams-pojo/src/main/jsonschema/org/apache/streams/pojo/json/activity.json
@@ -79,7 +79,9 @@
       "type" : "array",
       "description" :"Links between this object and other resources as defined in Web Linking",
       "note": "Tell JSON schema team to not put links inside http://json-schema.org/hyper-schema#properties",
-      "properties" : {"$ref" : "http://json-schema.org/links#properties"}
+      "items": {
+        "type" : "string"
+      }
     }
   },
   "links": [


[3/3] git commit: making activity.links an array of strings, so it's useful adding processor-urls, still debugging

Posted by sb...@apache.org.
making activity.links an array of strings, so it's useful
adding processor-urls, still debugging


Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/9e757aed
Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/9e757aed
Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/9e757aed

Branch: refs/heads/springcleaning
Commit: 9e757aed94d61c93391af2da1f7f3789dbcc1d93
Parents: b59bcd2
Author: sblackmon <sb...@w2odigital.com>
Authored: Fri Mar 28 21:26:49 2014 -0400
Committer: sblackmon <sb...@w2odigital.com>
Committed: Fri Mar 28 21:26:49 2014 -0400

----------------------------------------------------------------------
 streams-contrib/pom.xml                         |   2 +-
 streams-contrib/streams-processor-urls/pom.xml  |  65 ++
 .../main/java/org/apache/streams/urls/Link.java |  57 ++
 .../org/apache/streams/urls/LinkUnwinder.java   | 372 ++++++++++
 .../streams/urls/LinkUnwinderProcessor.java     |  76 ++
 .../streams/urls/TestLinkUnwinderProcessor.java |  76 ++
 .../serializer/DatasiftActivitySerializer.java  |   4 +-
 .../TwitterJsonActivitySerializer.java          | 124 ++++
 .../TwitterJsonTweetActivitySerializer.java     |   6 +-
 .../twitter/test/TweetActivitySerDeTest.java    | 118 ++++
 .../streams/twitter/test/TweetSerDeTest.java    |  14 +
 .../src/test/resources/testtweets.txt           | 695 +++++++++++++++++++
 .../jackson/StreamsDateTimeDeserializer.java    |  32 +
 .../jackson/StreamsDateTimeSerializer.java      |  28 +
 .../streams/jackson/StreamsJacksonModule.java   |  16 +
 .../org/apache/streams/pojo/json/activity.json  |   4 +-
 16 files changed, 1681 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/pom.xml
----------------------------------------------------------------------
diff --git a/streams-contrib/pom.xml b/streams-contrib/pom.xml
index 4f7a22f..67948c2 100644
--- a/streams-contrib/pom.xml
+++ b/streams-contrib/pom.xml
@@ -43,7 +43,7 @@
         <module>streams-persist-hdfs</module>
         <module>streams-persist-kafka</module>
         <module>streams-persist-mongo</module>
-        <module>streams-processor-urlredirect</module>
+        <module>streams-processor-urls</module>
         <module>streams-provider-datasift</module>
         <module>streams-provider-facebook</module>
         <module>streams-provider-google</module>

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-processor-urls/pom.xml
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-processor-urls/pom.xml b/streams-contrib/streams-processor-urls/pom.xml
new file mode 100644
index 0000000..966155f
--- /dev/null
+++ b/streams-contrib/streams-processor-urls/pom.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>streams-processor-urls</artifactId>
+    <version>0.1-SNAPSHOT</version>
+
+    <parent>
+        <groupId>org.apache.streams</groupId>
+        <artifactId>streams-contrib</artifactId>
+        <version>0.1-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.streams</groupId>
+            <artifactId>streams-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.streams</groupId>
+            <artifactId>streams-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.streams</groupId>
+            <artifactId>streams-pojo</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jsonschema2pojo</groupId>
+            <artifactId>jsonschema2pojo-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <sourceDirectory>src/main/java</sourceDirectory>
+        <testSourceDirectory>src/test/java</testSourceDirectory>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+        <testResources>
+            <testResource>
+                <directory>src/test/resources</directory>
+            </testResource>
+        </testResources>
+    </build>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/Link.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/Link.java b/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/Link.java
new file mode 100644
index 0000000..ec282f5
--- /dev/null
+++ b/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/Link.java
@@ -0,0 +1,57 @@
+package org.apache.streams.urls;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+
+public interface Link
+{
+    @JsonProperty("status")
+    public LinkStatus getStatus();
+
+    @JsonProperty("originalUrl")
+    public String getOriginalURL();
+
+    @JsonProperty("wasRedirected")
+    public boolean wasRedirected();
+
+    @JsonProperty("finalUrl")
+    public String getFinalURL();
+
+    @JsonProperty("domain")
+    public String getDomain();
+
+    @JsonProperty("normalizedUrl")
+    public String getNormalizedURL();
+
+    @JsonProperty("urlParts")
+    public List<String> getUrlParts();
+
+    @JsonProperty("finalStatusCode")
+    public String getFinalResponseCode();
+
+    @JsonProperty("isTracked")
+    public boolean isTracked();
+
+    @JsonProperty("redirects")
+    public List<String> getRedirects();
+
+    @JsonProperty("tookInMillis")
+    public long getTookInMillis();
+
+    public void run();
+
+    public enum LinkStatus {
+        SUCCESS,
+        ERROR,
+        MALFORMED_URL,
+        NOT_FOUND,
+        FORBIDDEN,
+        REDIRECT_ERROR,
+        UNAUTHORIZED,
+        LOOP,
+        HTTP_ERROR_STATUS,
+        EXCEPTION
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/LinkUnwinder.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/LinkUnwinder.java b/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/LinkUnwinder.java
new file mode 100644
index 0000000..a4a28f1
--- /dev/null
+++ b/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/LinkUnwinder.java
@@ -0,0 +1,372 @@
+package org.apache.streams.urls;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.*;
+
+/**
+ * References:
+ * Some helpful references to help
+ * Purpose              URL
+ * -------------        ----------------------------------------------------------------
+ * [Status Codes]       http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+ * [Test Cases]         http://greenbytes.de/tech/tc/httpredirects/
+ * [t.co behavior]      https://dev.twitter.com/docs/tco-redirection-behavior
+ */
+
+public class LinkUnwinder implements Link
+{
+    private final static Logger LOGGER = LoggerFactory.getLogger(LinkUnwinder.class);
+
+    private static final int MAX_ALLOWED_REDIRECTS = 30;
+    private static final int DEFAULT_HTTP_TIMEOUT = 5000; //originally 30000
+    private static final String LOCATION_IDENTIFIER = "location";
+    private static final String SET_COOKIE_IDENTIFIER = "set-cookie";
+
+    private Date startTime = new Date();
+    private String originalURL;
+    private LinkStatus status;
+    private String finalURL;
+    private String domain;
+    private boolean wasRedirected;
+    private List<String> redirects = new ArrayList<String>();
+    private boolean isTracked = false;
+    private int finalResponseCode;
+    private Collection<String> cookies;
+
+    private String normalizedUrl;
+    private List<String> urlParts;
+
+    private int redirectCount = 0;
+    private long tookInMillis = 0;
+
+    private static final Collection<String> BOTS_ARE_OK = new ArrayList<String>() {{
+       add("t.co");
+    }};
+
+    private static final Collection<String> URL_TRACKING_TO_REMOVE = new ArrayList<String>() {{
+        /******************************************************************
+         * Google uses parameters in the URL string to track referrers
+         * on their Google Analytics and promotions. These are the
+         * identified URL patterns.
+         *
+         * URL:
+         * https://support.google.com/analytics/answer/1033867?hl=en
+         *****************************************************************/
+
+        // Required. Use utm_source to identify a search engine, newsletter name, or other source.
+        add("([\\?&])utm_source(=)[^&?]*");
+
+        // Required. Use utm_medium to identify a medium such as email or cost-per- click.
+        add("([\\?&])utm_medium(=)[^&?]*");
+
+        // Used for paid search. Use utm_term to note the keywords for this ad.
+        add("([\\?&])utm_term(=)[^&?]*");
+
+        // Used for A/B testing and content-targeted ads. Use utm_content to differentiate ads or links that point to the same
+        add("([\\?&])utm_content(=)[^&?]*");
+
+        // Used for keyword analysis. Use utm_campaign to identify a specific product promotion or strategic campaign.
+        add("([\\?&])utm_campaign(=)[^&?]*");
+    }};
+
+    public boolean isFailure()              { return false; }
+    public String getOriginalURL()          { return this.originalURL; }
+    public LinkStatus getStatus()           { return this.status; }
+    public String getDomain()               { return this.domain; }
+    public String getFinalURL()             { return this.finalURL; }
+    public List<String> getRedirects()      { return this.redirects; }
+    public boolean wasRedirected()          { return this.wasRedirected; }
+    public boolean isTracked()              { return this.isTracked; }
+    public String getFinalResponseCode()    { return Integer.toString(this.finalResponseCode); }
+    public long getTookInMillis()           { return this.tookInMillis; }
+    public String getNormalizedURL()        { return this.normalizedUrl; }
+    public List<String> getUrlParts()       { return this.urlParts; }
+
+    public LinkUnwinder(String originalURL) {
+        this.originalURL = originalURL;
+    }
+
+    public void run() {
+        // we are going to try three times just incase we catch the service off-guard
+        // this is mainly to help us with our tests.
+        for(int i = 0; (i < 3) && this.finalURL == null ; i++) {
+            if(this.status != LinkStatus.SUCCESS)
+                unwindLink(this.originalURL);
+        }
+        this.finalURL = cleanURL(this.finalURL);
+        this.normalizedUrl = normalizeURL(this.finalURL);
+        this.urlParts = tokenizeURL(this.normalizedUrl);
+
+        this.updateTookInMillis();
+    }
+
+    protected void updateTookInMillis() {
+        this.tookInMillis = new Date().getTime() - this.startTime.getTime();
+    }
+
+    public void unwindLink(String url)
+    {
+        // Check to see if they wound up in a redirect loop
+        if((this.redirectCount > 0 && (this.originalURL.equals(url) || this.redirects.contains(url))) || (this.redirectCount > MAX_ALLOWED_REDIRECTS))
+        {
+            this.status = LinkStatus.LOOP;
+            return;
+        }
+
+        if(!this.originalURL.equals(url))
+            this.redirects.add(url);
+
+        HttpURLConnection connection = null;
+
+        try
+        {
+            URL thisURL = new URL(url);
+            connection = (HttpURLConnection)new URL(url).openConnection();
+
+            // now we are going to pretend that we are a browser...
+            // This is the way my mac works.
+            if(!BOTS_ARE_OK.contains(thisURL.getHost()))
+            {
+                connection.addRequestProperty("Host", thisURL.getHost());
+                connection.addRequestProperty("Connection", "Keep-Alive");
+                connection.addRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.48 Safari/537.36");
+                connection.addRequestProperty("Accept-Language", "en-US,en;q=0.8,zh;q=0.6");
+
+                // the test to seattlemamadoc.com prompted this change.
+                // they auto detect bots by checking the referrer chain and the 'user-agent'
+                // this broke the t.co test. t.co URLs are EXPLICITLY ok with bots
+                // there is a list for URLS that behave this way at the top in BOTS_ARE_OK
+                // smashew 2013-13-2013
+
+                if(this.redirectCount > 0 && BOTS_ARE_OK.contains(thisURL.getHost()))
+                    connection.addRequestProperty("Referrer", this.originalURL);
+            }
+
+            connection.setReadTimeout(DEFAULT_HTTP_TIMEOUT);
+            connection.setConnectTimeout(DEFAULT_HTTP_TIMEOUT);
+
+            connection.setInstanceFollowRedirects(false);
+
+            if(this.cookies != null)
+                for (String cookie : cookies)
+                    connection.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
+
+            connection.connect();
+
+            this.finalResponseCode = connection.getResponseCode();
+
+            /**************
+             *
+             */
+            Map<String,List<String>> headers = createCaseInsenitiveMap(connection.getHeaderFields());
+            /******************************************************************
+             * If they want us to set cookies, well, then we will set cookies
+             * Example URL:
+             * http://nyti.ms/1bCpesx
+             *****************************************************************/
+            if(headers.containsKey(SET_COOKIE_IDENTIFIER))
+                this.cookies = headers.get(SET_COOKIE_IDENTIFIER);
+
+            switch (this.finalResponseCode)
+            {
+                case 200: // HTTP OK
+                    this.finalURL = connection.getURL().toString();
+                    this.domain = new URL(this.finalURL).getHost();
+                    this.status = LinkStatus.SUCCESS;
+                    break;
+                case 300: // Multiple choices
+                case 301: // URI has been moved permanently
+                case 302: // Found
+                case 303: // Primarily for a HTTP Post
+                case 304: // Not Modified
+                case 306: // This status code is unused but in the redirect block.
+                case 307: // Temporary re-direct
+                    /*******************************************************************
+                     * Author:
+                     * Smashew
+                     *
+                     * Date: 2013-11-15
+                     *
+                     * Note:
+                     * It is possible that we have already found our final URL. In
+                     * the event that we have found our final URL, we are going to
+                     * save this URL as long as it isn't the original URL.
+                     * We are still going to ask the browser to re-direct, but in the
+                     * case of yet another redirect, seen with the redbull test
+                     * this can be followed by a 304, a browser, by W3C standards would
+                     * still render the page with it's content, but for us to assert
+                     * a success, we are really hoping for a 304 message.
+                     *******************************************************************/
+                    if(!this.originalURL.toLowerCase().equals(connection.getURL().toString().toLowerCase()))
+                        this.finalURL = connection.getURL().toString();
+                    if(!headers.containsKey(LOCATION_IDENTIFIER))
+                    {
+                        LOGGER.info("Headers: {}", headers);
+                        this.status = LinkStatus.REDIRECT_ERROR;
+                    }
+                    else
+                    {
+                        this.wasRedirected = true;
+                        this.redirectCount++;
+                        unwindLink(connection.getHeaderField(LOCATION_IDENTIFIER));
+                    }
+                    break;
+                case 305: // User must use the specified proxy (deprecated by W3C)
+                    break;
+                case 401: // Unauthorized (nothing we can do here)
+                    this.status = LinkStatus.UNAUTHORIZED;
+                    break;
+                case 403: // HTTP Forbidden (Nothing we can do here)
+                    this.status = LinkStatus.FORBIDDEN;
+                    break;
+                case 404: // Not Found (Page is not found, nothing we can do with a 404)
+                    this.status = LinkStatus.NOT_FOUND;
+                    break;
+                case 500: // Internal Server Error
+                case 501: // Not Implemented
+                case 502: // Bad Gateway
+                case 503: // Service Unavailable
+                case 504: // Gateway Timeout
+                case 505: // Version not supported
+                    this.status = LinkStatus.HTTP_ERROR_STATUS;
+                    break;
+                default:
+                    LOGGER.info("Unrecognized HTTP Response Code: {}", this.finalResponseCode);
+                    this.status = LinkStatus.NOT_FOUND;
+                    break;
+            }
+        }
+        catch (MalformedURLException e)
+        {
+            // the URL is trash, so, it can't load it.
+            this.status = LinkStatus.MALFORMED_URL;
+        }
+        catch (IOException ex)
+        {
+            // there was an issue we are going to set to error.
+            this.status = LinkStatus.ERROR;
+        }
+        catch (Exception ex)
+        {
+            // there was an unknown issue we are going to set to exception.
+            this.status = LinkStatus.EXCEPTION;
+        }
+        finally
+        {
+            if (connection != null)
+                connection.disconnect();
+        }
+    }
+
+    private Map<String,List<String>> createCaseInsenitiveMap(Map<String,List<String>> input) {
+        Map<String,List<String>> toReturn = new HashMap<String, List<String>>();
+        for(String k : input.keySet())
+            if(k != null && input.get(k) != null)
+                toReturn.put(k.toLowerCase(), input.get(k));
+        return toReturn;
+    }
+
+    private String cleanURL(String url)
+    {
+        // If they pass us a null URL then we are going to pass that right back to them.
+        if(url == null)
+            return null;
+
+        // remember how big the URL was at the start
+        int startLength = url.length();
+
+        // Iterate through all the known URL parameters of tracking URLs
+        for(String pattern : URL_TRACKING_TO_REMOVE)
+            url = url.replaceAll(pattern, "");
+
+        // If the URL is smaller than when it came in. Then it had tracking information
+        if(url.length() < startLength)
+            this.isTracked = true;
+
+        // return our url.
+        return url;
+    }
+
+    /**
+     * Removes the protocol, if it exists, from the front and
+     * removes any random encoding characters
+     * Extend this to do other url cleaning/pre-processing
+     * @param url - The String URL to normalize
+     * @return normalizedUrl - The String URL that has no junk or surprises
+     */
+    public static String normalizeURL(String url)
+    {
+        // Decode URL to remove any %20 type stuff
+        String normalizedUrl = url;
+        try {
+            // I've used a URLDecoder that's part of Java here,
+            // but this functionality exists in most modern languages
+            // and is universally called url decoding
+            normalizedUrl = URLDecoder.decode(url, "UTF-8");
+        }
+        catch(UnsupportedEncodingException uee)
+        {
+            System.err.println("Unable to Decode URL. Decoding skipped.");
+            uee.printStackTrace();
+        }
+
+        // Remove the protocol, http:// ftp:// or similar from the front
+        if (normalizedUrl.contains("://"))
+            normalizedUrl = normalizedUrl.split(":/{2}")[1];
+
+        // Room here to do more pre-processing
+
+        return normalizedUrl;
+    }
+
+    /**
+     * Goal is to get the different parts of the URL path. This can be used
+     * in a classifier to help us determine if we are working with
+     *
+     * Reference:
+     * http://stackoverflow.com/questions/10046178/pattern-matching-for-url-classification
+     * @param url - Url to be tokenized
+     * @return tokens - A String array of all the tokens
+     */
+    public static List<String> tokenizeURL(String url)
+    {
+        url = normalizeURL(url);
+        // I assume that we're going to use the whole URL to find tokens in
+        // If you want to just look in the GET parameters, or you want to ignore the domain
+        // or you want to use the domain as a token itself, that would have to be
+        // processed above the next line, and only the remaining parts split
+        List<String> toReturn = new ArrayList<String>();
+
+        // Split the URL by forward slashes. Most modern browsers will accept a URL
+        // this malformed such as http://www.smashew.com/hello//how////are/you
+        // hence the '+' in the regular expression.
+        for(String part: url.split("/+"))
+            toReturn.add(part.toLowerCase());
+
+        // return our object.
+        return toReturn;
+
+        // One could alternatively use a more complex regex to remove more invalid matches
+        // but this is subject to your (?:in)?ability to actually write the regex you want
+
+        // These next two get rid of tokens that are too short, also.
+
+        // Destroys anything that's not alphanumeric and things that are
+        // alphanumeric but only 1 character long
+        //String[] tokens = url.split("(?:[\\W_]+\\w)*[\\W_]+");
+
+        // Destroys anything that's not alphanumeric and things that are
+        // alphanumeric but only 1 or 2 characters long
+        //String[] tokens = url.split("(?:[\\W_]+\\w{1,2})*[\\W_]+");
+    }
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/LinkUnwinderProcessor.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/LinkUnwinderProcessor.java b/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/LinkUnwinderProcessor.java
new file mode 100644
index 0000000..45ec04d
--- /dev/null
+++ b/streams-contrib/streams-processor-urls/src/main/java/org/apache/streams/urls/LinkUnwinderProcessor.java
@@ -0,0 +1,76 @@
+package org.apache.streams.urls;
+
+import com.google.common.collect.Lists;
+import org.apache.streams.urls.Link;
+import org.apache.streams.urls.LinkUnwinder;
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.streams.core.StreamsDatum;
+import org.apache.streams.core.StreamsProcessor;
+import org.apache.streams.pojo.json.Activity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+/**
+ * References:
+ * Some helpful references to help
+ * Purpose              URL
+ * -------------        ----------------------------------------------------------------
+ * [Status Codes]       http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+ * [Test Cases]         http://greenbytes.de/tech/tc/httpredirects/
+ * [t.co behavior]      https://dev.twitter.com/docs/tco-redirection-behavior
+ */
+
+public class LinkUnwinderProcessor implements StreamsProcessor
+{
+    private final static String STREAMS_ID = "LinkUnwinderProcessor";
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(LinkUnwinderProcessor.class);
+
+
+
+    @Override
+    public List<StreamsDatum> process(StreamsDatum entry) {
+
+        List<StreamsDatum> result = Lists.newArrayList();
+
+        LOGGER.debug("{} processing {}", STREAMS_ID, entry.getDocument().getClass());
+
+        // get list of shared urls
+        if( entry.getDocument() instanceof Activity) {
+            Activity activity = (Activity) entry.getDocument();
+            List<String> inputLinks = activity.getLinks();
+            List<String> outputLinks = Lists.newArrayList();
+            for( String link : inputLinks ) {
+                try {
+                    LinkUnwinder unwinder = new LinkUnwinder((String)link);
+                    unwinder.run();
+                    if( !unwinder.isFailure()) {
+                        outputLinks.add(unwinder.getFinalURL());
+                    }
+                } catch (Exception e) {
+                    //if unwindable drop
+                    LOGGER.debug("Failed to unwind link : {}", link);
+                    LOGGER.debug("Excpetion unwind link : {}", e);
+                }
+            }
+            activity.setLinks(outputLinks);
+            entry.setDocument(activity);
+            result.add(entry);
+
+            return result;
+        }
+        else throw new NotImplementedException();
+    }
+
+    @Override
+    public void prepare(Object o) {
+    }
+
+    @Override
+    public void cleanUp() {
+
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-processor-urls/src/test/java/org/apache/streams/urls/TestLinkUnwinderProcessor.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-processor-urls/src/test/java/org/apache/streams/urls/TestLinkUnwinderProcessor.java b/streams-contrib/streams-processor-urls/src/test/java/org/apache/streams/urls/TestLinkUnwinderProcessor.java
new file mode 100644
index 0000000..94ae2d2
--- /dev/null
+++ b/streams-contrib/streams-processor-urls/src/test/java/org/apache/streams/urls/TestLinkUnwinderProcessor.java
@@ -0,0 +1,76 @@
+package org.apache.streams.urls;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import org.apache.streams.core.StreamsDatum;
+import org.apache.streams.jackson.StreamsJacksonModule;
+import org.apache.streams.pojo.json.Activity;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+import java.util.List;
+import java.util.Scanner;
+
+/**
+ * Created by rebanks on 2/27/14.
+ */
+public class TestLinkUnwinderProcessor {
+
+    private static String activityString;
+
+    @Test
+    public void testActivityLinkUnwinderProcessorBitly() throws Exception{
+        testActivityUnwinderHelper(Lists.newArrayList("http://bit.ly/1cX5Rh4"), Lists.newArrayList("http://www.wcgworld.com/"));
+    }
+
+    @Test
+    public void testActivityLinkUnwinderProcessorGoogle() throws Exception{
+        testActivityUnwinderHelper(Lists.newArrayList("http://goo.gl/wSrHDA"), Lists.newArrayList("http://www.wcgworld.com/"));
+    }
+
+    @Test
+    public void testActivityLinkUnwinderProcessorOwly() throws Exception{
+        testActivityUnwinderHelper(Lists.newArrayList("http://ow.ly/u4Kte"), Lists.newArrayList("http://www.wcgworld.com/"));
+    }
+
+    @Test
+    public void testActivityLinkUnwinderProcessorGoDaddy() throws Exception{
+        testActivityUnwinderHelper(Lists.newArrayList("http://x.co/3yapt"), Lists.newArrayList("http://www.wcgworld.com/"));
+    }
+
+    @Test
+    public void testActivityLinkUnwinderProcessorMulti() throws Exception{
+        testActivityUnwinderHelper(Lists.newArrayList("http://x.co/3yapt", "http://ow.ly/u4Kte", "http://goo.gl/wSrHDA"), Lists.newArrayList("http://www.wcgworld.com/", "http://www.wcgworld.com/", "http://www.wcgworld.com/"));
+    }
+
+    @Test
+    public void testActivityLinkUnwinderProcessorUnwindable() throws Exception{
+        testActivityUnwinderHelper(Lists.newArrayList("http://bit.ly/1cX5Rh4", "http://nope@#$%"), Lists.newArrayList("http://www.wcgworld.com/"));
+    }
+
+    public void testActivityUnwinderHelper(List<String> input, List<String> expected) throws Exception{
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        mapper.registerModule(new StreamsJacksonModule());
+        Activity activity = new Activity();
+        activity.setLinks(input);
+        StreamsDatum datum = new StreamsDatum(activity);
+        LinkUnwinderProcessor processor = new LinkUnwinderProcessor();
+        processor.prepare(null);
+        List<StreamsDatum> result = processor.process(datum);
+        assertNotNull(result);
+        assertEquals(1, result.size());
+        StreamsDatum resultDatum = result.get(0);
+        assertNotNull(resultDatum);
+        assertTrue(resultDatum.getDocument() instanceof Activity);
+        Activity resultActivity = (Activity) resultDatum.getDocument();
+        assertNotNull(resultActivity.getLinks());
+        List<String> resultLinks = resultActivity.getLinks();
+        assertEquals(expected.size(), resultLinks.size());
+        assertEquals(Sets.newHashSet(expected), Sets.newHashSet(resultLinks));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-provider-datasift/src/main/java/org/apache/streams/datasift/serializer/DatasiftActivitySerializer.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-datasift/src/main/java/org/apache/streams/datasift/serializer/DatasiftActivitySerializer.java b/streams-contrib/streams-provider-datasift/src/main/java/org/apache/streams/datasift/serializer/DatasiftActivitySerializer.java
index 455a579..de65636 100644
--- a/streams-contrib/streams-provider-datasift/src/main/java/org/apache/streams/datasift/serializer/DatasiftActivitySerializer.java
+++ b/streams-contrib/streams-provider-datasift/src/main/java/org/apache/streams/datasift/serializer/DatasiftActivitySerializer.java
@@ -159,8 +159,8 @@ public class DatasiftActivitySerializer implements ActivitySerializer<Datasift>,
         return actObj;
     }
 
-    public static List<Object> getLinks(Interaction interaction) {
-        List<Object> links = Lists.newArrayList();
+    public static List<String> getLinks(Interaction interaction) {
+        List<String> links = Lists.newArrayList();
         return links;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterJsonActivitySerializer.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterJsonActivitySerializer.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterJsonActivitySerializer.java
new file mode 100644
index 0000000..fceff2c
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterJsonActivitySerializer.java
@@ -0,0 +1,124 @@
+package org.apache.streams.twitter.serializer;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.streams.data.ActivitySerializer;
+import org.apache.streams.exceptions.ActivitySerializerException;
+import org.apache.streams.jackson.StreamsJacksonModule;
+import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.pojo.json.Provider;
+import org.apache.streams.twitter.pojo.Delete;
+import org.apache.streams.twitter.pojo.Retweet;
+import org.apache.streams.twitter.pojo.Tweet;
+import org.apache.streams.twitter.provider.TwitterEventClassifier;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.ISODateTimeFormat;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by sblackmon on 3/26/14.
+ */
+public class TwitterJsonActivitySerializer implements ActivitySerializer<String>
+{
+
+    public TwitterJsonActivitySerializer() {
+
+    }
+
+    public static final DateTimeFormatter TWITTER_FORMAT = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss Z yyyy");
+    public static final DateTimeFormatter ACTIVITY_FORMAT = ISODateTimeFormat.basicDateTime();
+
+    public static ObjectMapper mapper;
+    static {
+        mapper = new ObjectMapper();
+        mapper.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        mapper.registerModule(new StreamsJacksonModule() {
+            {
+                addDeserializer(DateTime.class, new StdDeserializer<DateTime>(DateTime.class) {
+                    @Override
+                    public DateTime deserialize(JsonParser jpar, DeserializationContext context) throws IOException, JsonProcessingException {
+                        return TWITTER_FORMAT.parseDateTime(jpar.getValueAsString());
+                    }
+                });
+            }
+        });
+        //AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(mapper.getTypeFactory());
+        //mapper.setAnnotationIntrospector(introspector);
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, Boolean.TRUE);
+        mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, Boolean.TRUE);
+        mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, Boolean.TRUE);
+        mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, Boolean.TRUE);
+        mapper.configure(DeserializationFeature.WRAP_EXCEPTIONS, Boolean.FALSE);
+        mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, Boolean.TRUE);
+        mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
+
+    }
+
+    TwitterJsonTweetActivitySerializer tweetActivitySerializer = new TwitterJsonTweetActivitySerializer();
+    TwitterJsonRetweetActivitySerializer retweetActivitySerializer = new TwitterJsonRetweetActivitySerializer();
+    TwitterJsonDeleteActivitySerializer deleteActivitySerializer = new TwitterJsonDeleteActivitySerializer();
+
+    @Override
+    public String serializationFormat() {
+        return null;
+    }
+
+    @Override
+    public String serialize(Activity deserialized) throws ActivitySerializerException {
+        throw new NotImplementedException();
+    }
+
+    @Override
+    public Activity deserialize(String serialized) throws ActivitySerializerException {
+
+        Class documentSubType = TwitterEventClassifier.detectClass(serialized);
+
+        Activity activity;
+        if( documentSubType == Tweet.class )
+            activity = tweetActivitySerializer.deserialize(serialized);
+        else if( documentSubType == Retweet.class )
+            activity = retweetActivitySerializer.deserialize(serialized);
+        else if( documentSubType == Delete.class )
+            activity = deleteActivitySerializer.deserialize(serialized);
+        else throw new ActivitySerializerException("unrecognized type");
+
+        return activity;
+    }
+
+    @Override
+    public List<Activity> deserializeAll(List<String> serializedList) {
+        throw new NotImplementedException();
+    }
+
+    public static Provider getProvider() {
+        Provider provider = new Provider();
+        provider.setId("id:providers:twitter");
+        return provider;
+    }
+
+    public static void addTwitterExtension(Activity activity, ObjectNode event) {
+        Map<String, Object> extensions = org.apache.streams.data.util.ActivityUtil.ensureExtensions(activity);
+        extensions.put("twitter", event);
+    }
+
+    public static String formatId(String... idparts) {
+        return Joiner.on(":").join(Lists.asList("id:twitter", idparts));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterJsonTweetActivitySerializer.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterJsonTweetActivitySerializer.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterJsonTweetActivitySerializer.java
index 8bcb60b..a038792 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterJsonTweetActivitySerializer.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/serializer/TwitterJsonTweetActivitySerializer.java
@@ -81,8 +81,6 @@ public class TwitterJsonTweetActivitySerializer implements ActivitySerializer<St
         activity.setUrl("http://twitter.com/" + tweet.getIdStr());
         activity.setLinks(getLinks(tweet));
 
-        System.out.println("12");
-
         addTwitterExtension(activity, TwitterJsonActivitySerializer.mapper.convertValue(tweet, ObjectNode.class));
         addLocationExtension(activity, tweet);
         return activity;
@@ -109,8 +107,8 @@ public class TwitterJsonTweetActivitySerializer implements ActivitySerializer<St
         return actor;
     }
 
-    public static List<Object> getLinks(Tweet tweet) {
-        List<Object> links = Lists.newArrayList();
+    public static List<String> getLinks(Tweet tweet) {
+        List<String> links = Lists.newArrayList();
         if( tweet.getEntities().getUrls() != null ) {
             for (Url url : tweet.getEntities().getUrls()) {
                 links.add(url.getExpandedUrl());

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TweetActivitySerDeTest.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TweetActivitySerDeTest.java b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TweetActivitySerDeTest.java
new file mode 100644
index 0000000..494f698
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TweetActivitySerDeTest.java
@@ -0,0 +1,118 @@
+package org.apache.streams.twitter.test;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.commons.lang.StringUtils;
+import org.apache.streams.pojo.json.Activity;
+import org.apache.streams.twitter.pojo.Retweet;
+import org.apache.streams.twitter.pojo.Tweet;
+import org.apache.streams.twitter.provider.TwitterEventClassifier;
+import org.apache.streams.twitter.serializer.TwitterJsonActivitySerializer;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import static java.util.regex.Pattern.matches;
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+/**
+* Created with IntelliJ IDEA.
+* User: sblackmon
+* Date: 8/20/13
+* Time: 5:57 PM
+* To change this template use File | Settings | File Templates.
+*/
+public class TweetActivitySerDeTest {
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(TweetActivitySerDeTest.class);
+
+    private TwitterJsonActivitySerializer twitterJsonActivitySerializer = new TwitterJsonActivitySerializer();
+
+    //    @Ignore
+    @Test
+    public void Tests()
+    {
+        InputStream is = TweetActivitySerDeTest.class.getResourceAsStream("/testtweets.txt");
+        InputStreamReader isr = new InputStreamReader(is);
+        BufferedReader br = new BufferedReader(isr);
+
+        try {
+            while (br.ready()) {
+                String line = br.readLine();
+                if(!StringUtils.isEmpty(line))
+                {
+                    LOGGER.info("raw: {}", line);
+
+                    Class detected = TwitterEventClassifier.detectClass(line);
+
+                    Activity activity = twitterJsonActivitySerializer.deserialize(line);
+
+                    String activitystring = TwitterJsonActivitySerializer.mapper.writeValueAsString(activity);
+
+                    LOGGER.info("activity: {}", activitystring);
+
+                    assertThat(activity, is(not(nullValue())));
+
+                    assertThat(activity.getId(), is(not(nullValue())));
+                    assertThat(activity.getActor(), is(not(nullValue())));
+                    assertThat(activity.getActor().getId(), is(not(nullValue())));
+                    assertThat(activity.getVerb(), is(not(nullValue())));
+                    assertThat(activity.getProvider(), is(not(nullValue())));
+
+                    if( detected == Tweet.class ) {
+                        assertThat(activity.getObject(), is(nullValue()));
+
+                        assertEquals(activity.getVerb(), "post");
+
+                        Tweet tweet = TwitterJsonActivitySerializer.mapper.readValue(line, Tweet.class);
+
+                        if( tweet.getEntities() != null &&
+                            tweet.getEntities().getUrls() != null &&
+                            tweet.getEntities().getUrls().size() > 0 ) {
+
+
+                            assertThat(activity.getLinks(), is(not(nullValue())));
+                            assertEquals(tweet.getEntities().getUrls().size(), activity.getLinks().size());
+                        }
+
+                    } else if( detected == Retweet.class ) {
+
+                        Retweet retweet = TwitterJsonActivitySerializer.mapper.readValue(line, Retweet.class);
+
+                        assertThat(retweet.getRetweetedStatus(), is(not(nullValue())));
+
+                        assertEquals(activity.getVerb(), "share");
+
+                        assertThat(activity.getObject(), is(not(nullValue())));
+                        assertThat(activity.getObject().getObjectType(), is(not(nullValue())));
+                        assertThat(activity.getObject().getObjectType(), is(not(nullValue())));
+
+                        if( retweet.getRetweetedStatus().getEntities() != null &&
+                            retweet.getRetweetedStatus().getEntities().getUrls() != null &&
+                            retweet.getRetweetedStatus().getEntities().getUrls().size() > 0 ) {
+
+                            assertThat(activity.getLinks(), is(not(nullValue())));
+                            assertEquals(retweet.getRetweetedStatus().getEntities().getUrls().size(), activity.getLinks().size());
+                        }
+
+                    }
+
+
+
+                }
+            }
+        } catch( Exception e ) {
+            System.out.println(e);
+            e.printStackTrace();
+            Assert.fail();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TweetSerDeTest.java
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TweetSerDeTest.java b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TweetSerDeTest.java
index c6dc0ad..bc7bcf7 100644
--- a/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TweetSerDeTest.java
+++ b/streams-contrib/streams-provider-twitter/src/test/java/org/apache/streams/twitter/test/TweetSerDeTest.java
@@ -3,6 +3,7 @@ package org.apache.streams.twitter.test;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.base.Optional;
 import org.apache.commons.lang.StringUtils;
 import org.apache.streams.pojo.json.Activity;
 import org.apache.streams.twitter.pojo.Delete;
@@ -21,6 +22,7 @@ import java.io.InputStreamReader;
 
 import static java.util.regex.Pattern.matches;
 import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.Matchers.greaterThan;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -50,6 +52,9 @@ public class TweetSerDeTest {
         InputStreamReader isr = new InputStreamReader(is);
         BufferedReader br = new BufferedReader(isr);
 
+        int tweetlinks = 0;
+        int retweetlinks = 0;
+
         try {
             while (br.ready()) {
                 String line = br.readLine();
@@ -72,6 +77,8 @@ public class TweetSerDeTest {
                         assertThat(tweet.getText(), is(not(nullValue())));
                         assertThat(tweet.getUser(), is(not(nullValue())));
 
+                        tweetlinks += Optional.fromNullable(tweet.getEntities().getUrls().size()).or(0);
+
                     } else if( detected == Retweet.class ) {
 
                         Retweet retweet = mapper.convertValue(event, Retweet.class);
@@ -83,6 +90,8 @@ public class TweetSerDeTest {
                         assertThat(retweet.getRetweetedStatus().getUser().getId(), is(not(nullValue())));
                         assertThat(retweet.getRetweetedStatus().getUser().getCreatedAt(), is(not(nullValue())));
 
+                        retweetlinks += Optional.fromNullable(retweet.getRetweetedStatus().getEntities().getUrls().size()).or(0);
+
                     } else if( detected == Delete.class ) {
 
                         Delete delete = mapper.convertValue(event, Delete.class);
@@ -95,6 +104,7 @@ public class TweetSerDeTest {
                     } else {
                         Assert.fail();
                     }
+
                 }
             }
         } catch( Exception e ) {
@@ -102,5 +112,9 @@ public class TweetSerDeTest {
             e.printStackTrace();
             Assert.fail();
         }
+
+        assertThat(tweetlinks, is(greaterThan(0)));
+        assertThat(retweetlinks, is(greaterThan(0)));
+
     }
 }


[2/3] making activity.links an array of strings, so it's useful adding processor-urls, still debugging

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/9e757aed/streams-contrib/streams-provider-twitter/src/test/resources/testtweets.txt
----------------------------------------------------------------------
diff --git a/streams-contrib/streams-provider-twitter/src/test/resources/testtweets.txt b/streams-contrib/streams-provider-twitter/src/test/resources/testtweets.txt
new file mode 100644
index 0000000..6cb73b6
--- /dev/null
+++ b/streams-contrib/streams-provider-twitter/src/test/resources/testtweets.txt
@@ -0,0 +1,695 @@
+{"contributors":null,"text":"@JasonCalacanis Blade Runner is my favorite movie of all time.  The \"Final Cut\" in HD/BluRay is amazing!","geo":null,"retweeted":false,"in_reply_to_screen_name":"Jason","truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[{"id":1004,"name":"JasonMC","indices":[0,15],"screen_name":"Jasoncalacanis","id_str":"1004"}]},"in_reply_to_status_id_str":"801450173","id":801455863,"source":"web","in_reply_to_user_id_str":"3840","favorited":false,"in_reply_to_status_id":801450173,"retweet_count":0,"created_at":"Thu May 01 20:53:44 +0000 2008","in_reply_to_user_id":3840,"favorite_count":0,"id_str":"801455863","place":null,"user":{"location":"United States","default_profile":false,"profile_background_tile":false,"statuses_count":160,"lang":"en","profile_link_color":"0084B4","id":3569041,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"I am a physician, medical technology e
 xecutive, and an unapologetic techno-geek.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"A8C7F7","name":"Carlos M. Nunez M.D.","profile_background_color":"022330","created_at":"Thu Apr 05 23:48:44 +0000 2007","default_profile_image":false,"followers_count":180,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme15/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme15/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://goo.gl/MBeHL","indices":[0,22],"display_url":"goo.gl/MBeHL","url":"http://t.co/H2xSBV5AfY"}]}},"url":"http://t.co/H2xSBV5AfY","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":26,"profile_sidebar_fill_color":"C0DFE
 C","screen_name":"CNunezMD","id_str":"3569041","profile_image_url":"http://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","listed_count":3,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Installed fish finder on my kayak over the weekend.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":803894383,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Mon May 05 14:32:28 +0000 2008","in_reply_to_user_id":null,"favorite_count":0,"id_str":"803894383","place":null,"user":{"location":"United States","default_profile":false,"profile_background_tile":false,"statuses_count":160,"lang":"en","profile_link_color":"0084B4","id":3569041,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"I am a physician, medical technology executive, and an unapologetic techno-geek.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"A8C7F7","name":"Carlos M. Nunez M.D.","pro
 file_background_color":"022330","created_at":"Thu Apr 05 23:48:44 +0000 2007","default_profile_image":false,"followers_count":180,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme15/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme15/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://goo.gl/MBeHL","indices":[0,22],"display_url":"goo.gl/MBeHL","url":"http://t.co/H2xSBV5AfY"}]}},"url":"http://t.co/H2xSBV5AfY","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":26,"profile_sidebar_fill_color":"C0DFEC","screen_name":"CNunezMD","id_str":"3569041","profile_image_url":"http://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","listed_count":3,"
 is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Flying (back) to Boston today.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":804623799,"source":"<a href=\"http://www.32hours.com/betwitteredinfo/\" rel=\"nofollow\">BeTwittered<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Tue May 06 12:31:14 +0000 2008","in_reply_to_user_id":null,"favorite_count":0,"id_str":"804623799","place":null,"user":{"location":"United States","default_profile":false,"profile_background_tile":false,"statuses_count":160,"lang":"en","profile_link_color":"0084B4","id":3569041,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"I am a physician, medical technology executive, and an unapologetic techno-geek.","verified":false,"contributors_enabled":false,"profile_side
 bar_border_color":"A8C7F7","name":"Carlos M. Nunez M.D.","profile_background_color":"022330","created_at":"Thu Apr 05 23:48:44 +0000 2007","default_profile_image":false,"followers_count":180,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme15/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme15/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://goo.gl/MBeHL","indices":[0,22],"display_url":"goo.gl/MBeHL","url":"http://t.co/H2xSBV5AfY"}]}},"url":"http://t.co/H2xSBV5AfY","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":26,"profile_sidebar_fill_color":"C0DFEC","screen_name":"CNunezMD","id_str":"3569041","profile_image_url":"http://pbs.twimg.com/profile_images
 /1829730845/laptop_stethoscope_normal.jpg","listed_count":3,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Why can't I see my tweets in Twinkle?!  Is anyone else having issues with Twinkle since the last update a few days ago?","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":804863183,"source":"<a href=\"http://twitter.com/twinkleking\" rel=\"nofollow\">Twinkle<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Tue May 06 17:52:40 +0000 2008","in_reply_to_user_id":null,"favorite_count":0,"id_str":"804863183","place":null,"user":{"location":"United States","default_profile":false,"profile_background_tile":false,"statuses_count":160,"lang":"en","profile_link_color":"0084B4","id":3569041,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"I am a physician, medical technology executive, and an unapologet
 ic techno-geek.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"A8C7F7","name":"Carlos M. Nunez M.D.","profile_background_color":"022330","created_at":"Thu Apr 05 23:48:44 +0000 2007","default_profile_image":false,"followers_count":180,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme15/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme15/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://goo.gl/MBeHL","indices":[0,22],"display_url":"goo.gl/MBeHL","url":"http://t.co/H2xSBV5AfY"}]}},"url":"http://t.co/H2xSBV5AfY","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":26,"profile_sidebar_fill_color":"C0DFEC","screen_name":"CNunezMD"
 ,"id_str":"3569041","profile_image_url":"http://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","listed_count":3,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"In South Florida for two days of meetings.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":822771775,"source":"<a href=\"http://twitter.com/twinkleking\" rel=\"nofollow\">Twinkle<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Thu May 29 20:18:52 +0000 2008","in_reply_to_user_id":null,"favorite_count":0,"id_str":"822771775","place":null,"user":{"location":"United States","default_profile":false,"profile_background_tile":false,"statuses_count":160,"lang":"en","profile_link_color":"0084B4","id":3569041,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"I am a physician, medical technology executive, and an unapologetic techno-geek.","verified":false,"contributors_enabled":false,"profile_sideb
 ar_border_color":"A8C7F7","name":"Carlos M. Nunez M.D.","profile_background_color":"022330","created_at":"Thu Apr 05 23:48:44 +0000 2007","default_profile_image":false,"followers_count":180,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme15/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme15/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://goo.gl/MBeHL","indices":[0,22],"display_url":"goo.gl/MBeHL","url":"http://t.co/H2xSBV5AfY"}]}},"url":"http://t.co/H2xSBV5AfY","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":26,"profile_sidebar_fill_color":"C0DFEC","screen_name":"CNunezMD","id_str":"3569041","profile_image_url":"http://pbs.twimg.com/profile_images/
 1829730845/laptop_stethoscope_normal.jpg","listed_count":3,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"If you've never been to the Breakers in Palm Beach, I highly recommend it.  The poolside cabanas are unbelievable!","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":837953391,"source":"<a href=\"http://twitter.com/twinkleking\" rel=\"nofollow\">Twinkle<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Wed Jun 18 17:22:39 +0000 2008","in_reply_to_user_id":null,"favorite_count":0,"id_str":"837953391","place":null,"user":{"location":"United States","default_profile":false,"profile_background_tile":false,"statuses_count":160,"lang":"en","profile_link_color":"0084B4","id":3569041,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"I am a physician, medical technology executive, and an unapologetic te
 chno-geek.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"A8C7F7","name":"Carlos M. Nunez M.D.","profile_background_color":"022330","created_at":"Thu Apr 05 23:48:44 +0000 2007","default_profile_image":false,"followers_count":180,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme15/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme15/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://goo.gl/MBeHL","indices":[0,22],"display_url":"goo.gl/MBeHL","url":"http://t.co/H2xSBV5AfY"}]}},"url":"http://t.co/H2xSBV5AfY","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":26,"profile_sidebar_fill_color":"C0DFEC","screen_name":"CNunezMD","id_
 str":"3569041","profile_image_url":"http://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","listed_count":3,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Leaving for Majorca, Spain to speak at a health care informatics conference.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":842661503,"source":"<a href=\"http://twitter.com/twinkleking\" rel=\"nofollow\">Twinkle<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Tue Jun 24 18:32:13 +0000 2008","in_reply_to_user_id":null,"favorite_count":0,"id_str":"842661503","place":null,"user":{"location":"United States","default_profile":false,"profile_background_tile":false,"statuses_count":160,"lang":"en","profile_link_color":"0084B4","id":3569041,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"I am a physician, medical technology executive, and an unapologetic techno-geek.","verified":false,"contribu
 tors_enabled":false,"profile_sidebar_border_color":"A8C7F7","name":"Carlos M. Nunez M.D.","profile_background_color":"022330","created_at":"Thu Apr 05 23:48:44 +0000 2007","default_profile_image":false,"followers_count":180,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme15/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme15/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://goo.gl/MBeHL","indices":[0,22],"display_url":"goo.gl/MBeHL","url":"http://t.co/H2xSBV5AfY"}]}},"url":"http://t.co/H2xSBV5AfY","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":26,"profile_sidebar_fill_color":"C0DFEC","screen_name":"CNunezMD","id_str":"3569041","profile_image_url":"ht
 tp://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","listed_count":3,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"iPhone firmware 2.0 is buggy for me. ActiveSync deleting appointments from my Outlook calendar and some of the app store apps don't work!","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":856160351,"source":"<a href=\"http://twitterrific.com\" rel=\"nofollow\">Twitterrific<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Sat Jul 12 00:52:22 +0000 2008","in_reply_to_user_id":null,"favorite_count":0,"id_str":"856160351","place":null,"user":{"location":"United States","default_profile":false,"profile_background_tile":false,"statuses_count":160,"lang":"en","profile_link_color":"0084B4","id":3569041,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"I am a physician, medical technology executive, a
 nd an unapologetic techno-geek.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"A8C7F7","name":"Carlos M. Nunez M.D.","profile_background_color":"022330","created_at":"Thu Apr 05 23:48:44 +0000 2007","default_profile_image":false,"followers_count":180,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme15/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme15/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://goo.gl/MBeHL","indices":[0,22],"display_url":"goo.gl/MBeHL","url":"http://t.co/H2xSBV5AfY"}]}},"url":"http://t.co/H2xSBV5AfY","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":26,"profile_sidebar_fill_color":"C0DFEC","screen_
 name":"CNunezMD","id_str":"3569041","profile_image_url":"http://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","listed_count":3,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"@Paulflevy Your special contribution is Transparency as a foundation for safety/quality. Give some fresh cuts from your unique gift there.","geo":null,"retweeted":false,"in_reply_to_screen_name":"Paulflevy","truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[{"id":17668347,"name":"Paul Levy","indices":[0,10],"screen_name":"Paulflevy","id_str":"17668347"}]},"in_reply_to_status_id_str":"1042274173","id":1042786575,"source":"web","in_reply_to_user_id_str":"17668347","favorited":false,"in_reply_to_status_id":1042274173,"retweet_count":0,"created_at":"Sun Dec 07 01:25:27 +0000 2008","in_reply_to_user_id":17668347,"favorite_count":0,"id_str":"1042786575","place":null,"user":{"location":"Southwest Desert - Arizona USA","default_profile":false,"profile_background_tile":false,"statuses_count":83,"lang":"en","profile_link_color":"FF3300","id":16030226,"following":false,"protected":false,"favourites_count":6,"profile_text
 _color":"333333","description":"MBA Physician - pathology, informatics and Lean continuous improvement","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"86A4A6","name":"Peter P Patterson MD","profile_background_color":"8E9770","created_at":"Thu Aug 28 18:00:06 +0000 2008","default_profile_image":false,"followers_count":229,"profile_image_url_https":"https://pbs.twimg.com/profile_images/723673074/P652-LTPP0652117307JCP-2_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme6/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme6/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]}},"url":null,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":52,"profile_sidebar_fill_color":"A0B1C7","screen_name":"IDrPete","id_str":"16030226","profile_image_url":"http://pbs.twimg.com/pr
 ofile_images/723673074/P652-LTPP0652117307JCP-2_normal.jpg","listed_count":4,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"I am enjoying some time off with the family.  Hoping all of you have a safe and joyous holiday season.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1071035551,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Sun Dec 21 20:38:32 +0000 2008","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1071035551","place":null,"user":{"location":"United States","default_profile":false,"profile_background_tile":false,"statuses_count":160,"lang":"en","profile_link_color":"0084B4","id":3569041,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"I am a physician, medical technology executive, and an unapologetic techno-geek.","verified":false,"contributors_enabled":false,"profile_sidebar_bord
 er_color":"A8C7F7","name":"Carlos M. Nunez M.D.","profile_background_color":"022330","created_at":"Thu Apr 05 23:48:44 +0000 2007","default_profile_image":false,"followers_count":180,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme15/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme15/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://goo.gl/MBeHL","indices":[0,22],"display_url":"goo.gl/MBeHL","url":"http://t.co/H2xSBV5AfY"}]}},"url":"http://t.co/H2xSBV5AfY","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":26,"profile_sidebar_fill_color":"C0DFEC","screen_name":"CNunezMD","id_str":"3569041","profile_image_url":"http://pbs.twimg.com/profile_images/1829730
 845/laptop_stethoscope_normal.jpg","listed_count":3,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"@anitasamarth Clinovations web site seems to promise more than it can deliver. I would suggest toning down some of the rhetoric.","geo":null,"retweeted":false,"in_reply_to_screen_name":"anitasamarth","truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[{"id":16257434,"name":"Anita Samarth","indices":[0,13],"screen_name":"anitasamarth","id_str":"16257434"}]},"in_reply_to_status_id_str":"1106542273","id":1106752071,"source":"web","in_reply_to_user_id_str":"16257434","favorited":false,"in_reply_to_status_id":1106542273,"retweet_count":0,"created_at":"Fri Jan 09 14:14:42 +0000 2009","in_reply_to_user_id":16257434,"favorite_count":0,"id_str":"1106752071","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_co
 lor":"333333","description":"Semi-retired University of Michigan Medical School pathologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)
 ","notifications":false,"profile_use_background_image":true,"friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"An academic pathologist, Dr. Tony Killeen, comments on how lab test reference ranges are created (http://twurl.cc/bxe)","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1111123095,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Sun Jan 11 16:13:35 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1111123095","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","description":"Semi-retired University of Michigan Medical School pathologist & informatician. Author of clinical lab & pathology blog
  called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","i
 d_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"UnitedHealth Settles Suit with New York Attorney General Cuomo: I have posted a number of previous notes about t.. http://tinyurl.com/6u8q2x","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1118315383,"source":"<a href=\"http://twitterfeed.com\" rel=\"nofollow\">twitterfeed<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Wed Jan 14 14:20:20 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1118315383","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","description":"Semi-retired University of Michi
 gan Medical School pathologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"
 friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Free Exercise and Nutrition Program Offered in Parks in Brazil: In a previous post, I discussed the very high co.. http://tinyurl.com/86v7kx","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1120906383,"source":"<a href=\"http://twitterfeed.com\" rel=\"nofollow\">twitterfeed<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Thu Jan 15 13:20:26 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1120906383","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","description":"Semi-retired University of Michi
 gan Medical School pathologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"
 friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Extracting Value from Twitter Messages Using Filters: As a relatively recent convert to Twitter, a microblogging.. http://tinyurl.com/73qchn","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1133231679,"source":"<a href=\"http://twitterfeed.com\" rel=\"nofollow\">twitterfeed<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Tue Jan 20 14:24:17 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1133231679","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","description":"Semi-retired University of Michi
 gan Medical School pathologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"
 friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Book Premium for Early Registrants to Lab InfoTech Summit: We are offering a book premium to the first 100 regis.. http://tinyurl.com/c5kpfb","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1152789015,"source":"<a href=\"http://twitterfeed.com\" rel=\"nofollow\">twitterfeed<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Tue Jan 27 18:23:33 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1152789015","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","description":"Semi-retired University of Michi
 gan Medical School pathologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"
 friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Anxiously awaiting the arrival of my new netbook...tomorrow.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1160434255,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Fri Jan 30 01:59:23 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1160434255","place":null,"user":{"location":"United States","default_profile":false,"profile_background_tile":false,"statuses_count":160,"lang":"en","profile_link_color":"0084B4","id":3569041,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"I am a physician, medical technology executive, and an unapologetic techno-geek.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"A8C7F7","name":"Carlos M. Nunez
  M.D.","profile_background_color":"022330","created_at":"Thu Apr 05 23:48:44 +0000 2007","default_profile_image":false,"followers_count":180,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme15/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme15/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://goo.gl/MBeHL","indices":[0,22],"display_url":"goo.gl/MBeHL","url":"http://t.co/H2xSBV5AfY"}]}},"url":"http://t.co/H2xSBV5AfY","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":26,"profile_sidebar_fill_color":"C0DFEC","screen_name":"CNunezMD","id_str":"3569041","profile_image_url":"http://pbs.twimg.com/profile_images/1829730845/laptop_stethoscope_normal.jpg","listed
 _count":3,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"@jenmccabegorman Lab information systems  (LISs) manage manage about 80% of all health information. Also exploring digital pathology.","geo":null,"retweeted":false,"in_reply_to_screen_name":"jensmccabe","truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":"1176600518","id":1177499983,"source":"web","in_reply_to_user_id_str":"14258044","favorited":false,"in_reply_to_status_id":1176600518,"retweet_count":0,"created_at":"Wed Feb 04 20:40:32 +0000 2009","in_reply_to_user_id":14258044,"favorite_count":0,"id_str":"1177499983","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","description":"Semi-retired University of Michigan Medical School pathologist & informa
 tician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":242,"profile_sidebar_fill
 _color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"@scottshreeve If large health systems endorse home health physiologic monitoring, it can succeed -- they can provide needed infrastructure.","geo":null,"retweeted":false,"in_reply_to_screen_name":"scottshreeve","truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[{"id":16059834,"name":"Scott Shreeve, MD","indices":[0,13],"screen_name":"scottshreeve","id_str":"16059834"}]},"in_reply_to_status_id_str":"1183578679","id":1184110279,"source":"web","in_reply_to_user_id_str":"16059834","favorited":false,"in_reply_to_status_id":1183578679,"retweet_count":0,"created_at":"Fri Feb 06 19:00:43 +0000 2009","in_reply_to_user_id":16059834,"favorite_count":0,"id_str":"1184110279","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"
 profile_text_color":"333333","description":"Semi-retired University of Michigan Medical School pathologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Tim
 e (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Live Tweeting from Molecular Summit. For coronary artery stenosis dx, moving from lumen-ology to plaque-ology.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1195927703,"source":"<a href=\"http://twitter.com/devices\" rel=\"nofollow\">txt<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Tue Feb 10 16:30:30 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1195927703","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","description":"Semi-retired University of Michigan Medical School pathologist & i
 nformatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":242,"profile_sideba
 r_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Live Tweeting from Molecular Summit. Jared Schwartz: Many blockbuster drugs show limited efficacy in as many as 70% of pts.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1197125583,"source":"<a href=\"http://twitter.com/devices\" rel=\"nofollow\">txt<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Tue Feb 10 22:35:27 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1197125583","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","description":"Semi-retired University of Michigan Medical School pa
 thologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":242,"p
 rofile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Diagosed today: Unusual presentation. Pt w/ 1st symptom being visual disturbance. Brain biopsy of primary visual cortex: metastatic lung ca.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1197925487,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Wed Feb 11 03:34:13 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1197925487","place":null,"user":{"location":"Springfield, IL","default_profile":false,"profile_background_tile":false,"statuses_count":247,"lang":"en","profile_link_color":"FF0000","id":19749157,"following":false,"protected":false,"favourites_count":4,"profile_text_color":"0C3E53","description":"Neuropathologist","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"F2E195","nam
 e":"Brian Moore","profile_background_color":"BADFCD","created_at":"Fri Jan 30 02:11:17 +0000 2009","default_profile_image":false,"followers_count":523,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme12/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme12/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://neuropathologyblog.blogspot.com","indices":[0,22],"display_url":"neuropathologyblog.blogspot.com","url":"http://t.co/2xdql9mCYM"}]}},"url":"http://t.co/2xdql9mCYM","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":41,"profile_sidebar_fill_color":"FFF7CC","screen_name":"neuropathology","id_str":"19749157","profile_image_url":"http://pbs.t
 wimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","listed_count":27,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"NPR reports on challenge of switching to digital medical records: http://tinyurl.com/cl4a4p","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1216667127,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Mon Feb 16 21:20:41 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1216667127","place":null,"user":{"location":"Springfield, IL","default_profile":false,"profile_background_tile":false,"statuses_count":247,"lang":"en","profile_link_color":"FF0000","id":19749157,"following":false,"protected":false,"favourites_count":4,"profile_text_color":"0C3E53","description":"Neuropathologist","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"F2E195","name":"Brian Moore","profile_background_color":"BADF
 CD","created_at":"Fri Jan 30 02:11:17 +0000 2009","default_profile_image":false,"followers_count":523,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme12/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme12/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://neuropathologyblog.blogspot.com","indices":[0,22],"display_url":"neuropathologyblog.blogspot.com","url":"http://t.co/2xdql9mCYM"}]}},"url":"http://t.co/2xdql9mCYM","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":41,"profile_sidebar_fill_color":"FFF7CC","screen_name":"neuropathology","id_str":"19749157","profile_image_url":"http://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10
 _June_2011_for_twitter_normal.jpg","listed_count":27,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"just signed up for twitter","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1225092359,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Thu Feb 19 01:23:25 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1225092359","place":null,"user":{"location":"Houston, TX","default_profile":true,"profile_background_tile":false,"statuses_count":2,"lang":"en","profile_link_color":"0084B4","id":21263297,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"Ultrarunner, marathoner, neuropathologist","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Kent Heck","profile_background_color":"C0DEED","created_at":"Thu Feb 19 01:20:47 +0000 2009"
 ,"default_profile_image":true,"followers_count":14,"profile_image_url_https":"https://abs.twimg.com/sticky/default_profile_images/default_profile_6_normal.png","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]}},"url":null,"utc_offset":null,"time_zone":null,"notifications":false,"profile_use_background_image":true,"friends_count":17,"profile_sidebar_fill_color":"DDEEF6","screen_name":"nemaline","id_str":"21263297","profile_image_url":"http://abs.twimg.com/sticky/default_profile_images/default_profile_6_normal.png","listed_count":0,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Twitted that is ,  sorry and good night","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1225678863,"source":"<a href=\"http://m.twitter.com/\" rel=\"nofollow\">mobile web<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Thu Feb 19 04:53:54 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1225678863","place":null,"user":{"location":"Seattle","default_profile":false,"profile_background_tile":false,"statuses_count":194,"lang":"en","profile_link_color":"1F98C7","id":21274091,"following":false,"protected":false,"favourites_count":49,"profile_text_color":"663B12","description":"Christian seeker. Loving husband. Proud father. Practicing physician (surgical pathology, hematopathology), Musician (pianist). Chess player. Dem. Apple"
 ,"verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C6E2EE","name":"Charles Simrell","profile_background_color":"C6E2EE","created_at":"Thu Feb 19 04:01:18 +0000 2009","default_profile_image":false,"followers_count":17,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1173141302/image_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme2/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme2/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]}},"url":null,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":94,"profile_sidebar_fill_color":"DAECF4","screen_name":"ChuckSimrell","id_str":"21274091","profile_image_url":"http://pbs.twimg.com/profile_images/1173141302/image_normal.jpg","listed_count":0,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Soup is done, ready for tomorrow.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1235740735,"source":"<a href=\"http://m.twitter.com/\" rel=\"nofollow\">mobile web<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Sun Feb 22 00:24:52 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1235740735","place":null,"user":{"location":"Seattle","default_profile":false,"profile_background_tile":false,"statuses_count":194,"lang":"en","profile_link_color":"1F98C7","id":21274091,"following":false,"protected":false,"favourites_count":49,"profile_text_color":"663B12","description":"Christian seeker. Loving husband. Proud father. Practicing physician (surgical pathology, hematopathology), Musician (pianist). Chess player. Dem. Apple","veri
 fied":false,"contributors_enabled":false,"profile_sidebar_border_color":"C6E2EE","name":"Charles Simrell","profile_background_color":"C6E2EE","created_at":"Thu Feb 19 04:01:18 +0000 2009","default_profile_image":false,"followers_count":17,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1173141302/image_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme2/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme2/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]}},"url":null,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":94,"profile_sidebar_fill_color":"DAECF4","screen_name":"ChuckSimrell","id_str":"21274091","profile_image_url":"http://pbs.twimg.com/profile_images/1173141302/image_normal.jpg","listed_count":0,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Just finished clean up from feeding 160+ church folk and homeless. Very good gathering.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1238561103,"source":"<a href=\"http://m.twitter.com/\" rel=\"nofollow\">mobile web<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Sun Feb 22 23:14:50 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1238561103","place":null,"user":{"location":"Seattle","default_profile":false,"profile_background_tile":false,"statuses_count":194,"lang":"en","profile_link_color":"1F98C7","id":21274091,"following":false,"protected":false,"favourites_count":49,"profile_text_color":"663B12","description":"Christian seeker. Loving husband. Proud father. Practicing physician (surgical pathology, hematopathology
 ), Musician (pianist). Chess player. Dem. Apple","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C6E2EE","name":"Charles Simrell","profile_background_color":"C6E2EE","created_at":"Thu Feb 19 04:01:18 +0000 2009","default_profile_image":false,"followers_count":17,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1173141302/image_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme2/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme2/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]}},"url":null,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":94,"profile_sidebar_fill_color":"DAECF4","screen_name":"ChuckSimrell","id_str":"21274091","profile_image_url":"http://pbs.twimg.com/profile_images/1173141302/image_normal.jpg","listed_count":0,"is_translator
 ":false},"coordinates":null}
+{"contributors":null,"text":"I guess I'm an official \"TWIT\" now.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1241067119,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Mon Feb 23 15:16:03 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1241067119","place":null,"user":{"location":"Northeast Kingdom of VT","default_profile":false,"profile_background_tile":false,"statuses_count":200,"lang":"en","profile_link_color":"0084B4","id":21651866,"following":false,"protected":false,"favourites_count":3,"profile_text_color":"333333","description":"Feral pathologist. (In the wild...)","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"FFFFFF","name":"Robert W. McDowell","profile_background_color":"9AE4E8","created_at":"Mo
 n Feb 23 13:26:56 +0000 2009","default_profile_image":false,"followers_count":14,"profile_image_url_https":"https://pbs.twimg.com/profile_images/531893711/100_3967a_normal.JPG","geo_enabled":true,"profile_background_image_url":"http://a0.twimg.com/profile_background_images/378800000138452440/NG96U6hr.jpeg","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/378800000138452440/NG96U6hr.jpeg","follow_request_sent":false,"entities":{"description":{"urls":[]}},"url":null,"utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":12,"profile_sidebar_fill_color":"DDFFCC","screen_name":"msie01","id_str":"21651866","profile_image_url":"http://pbs.twimg.com/profile_images/531893711/100_3967a_normal.JPG","listed_count":3,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"@UMHealthSystem Community benefit. I am still timing out on server www2.med.umich.edu 24 hours later.","geo":null,"retweeted":false,"in_reply_to_screen_name":"UMHealthSystem","truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[{"id":15457383,"name":"U-M Health System","indices":[0,15],"screen_name":"UMHealthSystem","id_str":"15457383"}]},"in_reply_to_status_id_str":"1241366607","id":1243544607,"source":"web","in_reply_to_user_id_str":"15457383","favorited":false,"in_reply_to_status_id":1241366607,"retweet_count":0,"created_at":"Tue Feb 24 03:40:14 +0000 2009","in_reply_to_user_id":15457383,"favorite_count":0,"id_str":"1243544607","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","desc
 ription":"Semi-retired University of Michigan Medical School pathologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":f
 alse,"profile_use_background_image":true,"friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"@hiphopoptamus Korean named president of Dartmouth College: http://www.dartmouth.edu/presidentelect/","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[{"id":129898249,"name":"KingAdobo","indices":[0,14],"screen_name":"Hiphopoptamus","id_str":"129898249"}]},"in_reply_to_status_id_str":null,"id":1275422599,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Tue Mar 03 20:37:14 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1275422599","place":null,"user":{"location":"Springfield, IL","default_profile":false,"profile_background_tile":false,"statuses_count":247,"lang":"en","profile_link_color":"FF0000","id":19749157,"following":false,"protected":false,"favourites_count":4,"profile_text_color":"0C3E53","description":"Neuropathologist","verified":false,"contribut
 ors_enabled":false,"profile_sidebar_border_color":"F2E195","name":"Brian Moore","profile_background_color":"BADFCD","created_at":"Fri Jan 30 02:11:17 +0000 2009","default_profile_image":false,"followers_count":523,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme12/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme12/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://neuropathologyblog.blogspot.com","indices":[0,22],"display_url":"neuropathologyblog.blogspot.com","url":"http://t.co/2xdql9mCYM"}]}},"url":"http://t.co/2xdql9mCYM","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":41,"profile_sidebar_fill_color":"FFF7CC","screen_name":"neurop
 athology","id_str":"19749157","profile_image_url":"http://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","listed_count":27,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"@cosmeticclinic Tummy Tuck 101: http://tinyurl.com/cnyjdu._Lee","geo":null,"retweeted":false,"in_reply_to_screen_name":"cosmeticclinic","truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[{"id":22731442,"name":"Mississauga Cosmetic","indices":[0,15],"screen_name":"cosmeticclinic","id_str":"22731442"}]},"in_reply_to_status_id_str":"1277166229","id":1278479255,"source":"web","in_reply_to_user_id_str":"22731442","favorited":false,"in_reply_to_status_id":1277166229,"retweet_count":0,"created_at":"Wed Mar 04 13:43:27 +0000 2009","in_reply_to_user_id":22731442,"favorite_count":0,"id_str":"1278479255","place":null,"user":{"location":"Springfield, IL","default_profile":false,"profile_background_tile":false,"statuses_count":247,"lang":"en","profile_link_color":"FF0000","id":19749157,"following":false,"protected":false,"favourites_count":4,"profile_text_color":"0C3E53","description":"Neuropathologist","verified":false,"c
 ontributors_enabled":false,"profile_sidebar_border_color":"F2E195","name":"Brian Moore","profile_background_color":"BADFCD","created_at":"Fri Jan 30 02:11:17 +0000 2009","default_profile_image":false,"followers_count":523,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme12/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme12/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://neuropathologyblog.blogspot.com","indices":[0,22],"display_url":"neuropathologyblog.blogspot.com","url":"http://t.co/2xdql9mCYM"}]}},"url":"http://t.co/2xdql9mCYM","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":41,"profile_sidebar_fill_color":"FFF7CC","screen_name"
 :"neuropathology","id_str":"19749157","profile_image_url":"http://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","listed_count":27,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"RT @jamesbyers: RT @CRAIGLSANDERS  \"One of the greatest success secrets is uninterrupted time given to a specific task.\" - Steve Chandler","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[{"id":17050074,"name":"James Byers","indices":[3,14],"screen_name":"jamesbyers","id_str":"17050074"},{"id":20658282,"name":"Craig L. Sanders","indices":[19,33],"screen_name":"CRAIGLSANDERS","id_str":"20658282"}]},"in_reply_to_status_id_str":null,"id":1279318623,"source":"<a href=\"http://www.tweetdeck.com/\" rel=\"nofollow\">TweetDeck<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Wed Mar 04 17:09:24 +0000 2009","in_reply_to_user_id":null,"favorite_count":1,"id_str":"1279318623","place":null,"user":{"location":"Springfield, IL","default_profile":false,"profile_background_tile":false,"statuses_co
 unt":247,"lang":"en","profile_link_color":"FF0000","id":19749157,"following":false,"protected":false,"favourites_count":4,"profile_text_color":"0C3E53","description":"Neuropathologist","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"F2E195","name":"Brian Moore","profile_background_color":"BADFCD","created_at":"Fri Jan 30 02:11:17 +0000 2009","default_profile_image":false,"followers_count":523,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme12/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme12/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://neuropathologyblog.blogspot.com","indices":[0,22],"display_url":"neuropathologyblog.blogspot.com","url":"http://t.co/2xdql9mCYM"}]}},"url":"http://t.
 co/2xdql9mCYM","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":41,"profile_sidebar_fill_color":"FFF7CC","screen_name":"neuropathology","id_str":"19749157","profile_image_url":"http://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","listed_count":27,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Using an iPhone for Review or Diagnosis of Pathology Images: In a recent blog note (see: iPhone, the Fifth Most .. http://tinyurl.com/aszn4f","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1283235239,"source":"<a href=\"http://twitterfeed.com\" rel=\"nofollow\">twitterfeed<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Thu Mar 05 13:26:18 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1283235239","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","description":"Semi-retired University of Michi
 gan Medical School pathologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"
 friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"@JayOatway Totally agree. One other reason. Twitter positioning itself to supply local news linked to revenue-generating classifieds.","geo":null,"retweeted":false,"in_reply_to_screen_name":"JayOatway","truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[{"id":616173,"name":"Jay Oatway","indices":[0,10],"screen_name":"JayOatway","id_str":"616173"}]},"in_reply_to_status_id_str":"1306339770","id":1306463087,"source":"web","in_reply_to_user_id_str":"616173","favorited":false,"in_reply_to_status_id":1306339770,"retweet_count":0,"created_at":"Tue Mar 10 17:56:46 +0000 2009","in_reply_to_user_id":616173,"favorite_count":0,"id_str":"1306463087","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333
 ","description":"Semi-retired University of Michigan Medical School pathologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notificat
 ions":false,"profile_use_background_image":true,"friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Few Vendors Deliver an Integrated RIS/PACS Solution According to KLAS: I have been a strong advocate for the mer.. http://tinyurl.com/cpu5nj","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1310116663,"source":"<a href=\"http://twitterfeed.com\" rel=\"nofollow\">twitterfeed<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Wed Mar 11 11:28:55 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1310116663","place":null,"user":{"location":"Ann Arbor, Michigan, USA.","default_profile":true,"profile_background_tile":false,"statuses_count":1440,"lang":"en","profile_link_color":"0084B4","id":18653047,"following":false,"protected":false,"favourites_count":14,"profile_text_color":"333333","description":"Semi-retired University of Michi
 gan Medical School pathologist & informatician. Author of clinical lab & pathology blog called Lab Soft News.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bruce Friedman","profile_background_color":"C0DEED","created_at":"Tue Jan 06 00:16:41 +0000 2009","default_profile_image":false,"followers_count":890,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://www.labsoftnews.com","indices":[0,22],"display_url":"labsoftnews.com","url":"http://t.co/9wOtT2Lwcm"}]}},"url":"http://t.co/9wOtT2Lwcm","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"
 friends_count":242,"profile_sidebar_fill_color":"DDEEF6","screen_name":"labsoftnews","id_str":"18653047","profile_image_url":"http://pbs.twimg.com/profile_images/1120324523/baf_normal.jpg","listed_count":29,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Why lucid interval after epidural hematoma trauma? Initial blow causes concussion.  Pt wakes.  Bleed pressure: loss of consciousness again.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1321360735,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Fri Mar 13 12:23:12 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1321360735","place":null,"user":{"location":"Springfield, IL","default_profile":false,"profile_background_tile":false,"statuses_count":247,"lang":"en","profile_link_color":"FF0000","id":19749157,"following":false,"protected":false,"favourites_count":4,"profile_text_color":"0C3E53","description":"Neuropathologist","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"F2E195","name
 ":"Brian Moore","profile_background_color":"BADFCD","created_at":"Fri Jan 30 02:11:17 +0000 2009","default_profile_image":false,"followers_count":523,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme12/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme12/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://neuropathologyblog.blogspot.com","indices":[0,22],"display_url":"neuropathologyblog.blogspot.com","url":"http://t.co/2xdql9mCYM"}]}},"url":"http://t.co/2xdql9mCYM","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":41,"profile_sidebar_fill_color":"FFF7CC","screen_name":"neuropathology","id_str":"19749157","profile_image_url":"http://pbs.tw
 img.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","listed_count":27,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Finishing a gel.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1324179463,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Fri Mar 13 21:51:44 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1324179463","place":null,"user":{"location":"","default_profile":true,"profile_background_tile":false,"statuses_count":3,"lang":"en","profile_link_color":"0084B4","id":24262686,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bradley Miller","profile_background_color":"C0DEED","created_at":"Fri Mar 13 21:50:32 +0000 2009","default_profile_image":true,"followers_count":6,"profil
 e_image_url_https":"https://abs.twimg.com/sticky/default_profile_images/default_profile_0_normal.png","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]}},"url":null,"utc_offset":null,"time_zone":null,"notifications":false,"profile_use_background_image":true,"friends_count":1,"profile_sidebar_fill_color":"DDEEF6","screen_name":"miller2865","id_str":"24262686","profile_image_url":"http://abs.twimg.com/sticky/default_profile_images/default_profile_0_normal.png","listed_count":0,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Reviewing a case.  Just did a frozen. Going back to the dentist today","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1388548023,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Wed Mar 25 15:39:16 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1388548023","place":null,"user":{"location":"Indiana/ North Carolina","default_profile":false,"profile_background_tile":false,"statuses_count":487,"lang":"en","profile_link_color":"9EDEF5","id":26316026,"following":false,"protected":false,"favourites_count":4,"profile_text_color":"333333","description":"I am an American Forensic Pathologist, and Fitness Activist, who likes to write and race bicycles.","verified":false,"contributors_enabled":false,"profile_sidebar_border_c
 olor":"9CEE72","name":"Scott Wagner M.D.","profile_background_color":"C9FAFD","created_at":"Tue Mar 24 20:29:03 +0000 2009","default_profile_image":false,"followers_count":85,"profile_image_url_https":"https://pbs.twimg.com/profile_images/139026389/At_work2.1_normal.JPG","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://Pathfor.com","indices":[0,22],"display_url":"Pathfor.com","url":"http://t.co/ckrct3sKAd"}]}},"url":"http://t.co/ckrct3sKAd","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":239,"profile_sidebar_fill_color":"EFFFCC","screen_name":"sawagnermd","id_str":"26316026","profile_image_url":"http://pbs.twimg.com/profile_images/139026389/At_work2.1_nor
 mal.JPG","listed_count":2,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Thinking about sleep.","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1391418135,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Thu Mar 26 00:27:06 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1391418135","place":null,"user":{"location":"","default_profile":true,"profile_background_tile":false,"statuses_count":3,"lang":"en","profile_link_color":"0084B4","id":24262686,"following":false,"protected":false,"favourites_count":0,"profile_text_color":"333333","description":"","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"C0DEED","name":"Bradley Miller","profile_background_color":"C0DEED","created_at":"Fri Mar 13 21:50:32 +0000 2009","default_profile_image":true,"followers_count":6,"p
 rofile_image_url_https":"https://abs.twimg.com/sticky/default_profile_images/default_profile_0_normal.png","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]}},"url":null,"utc_offset":null,"time_zone":null,"notifications":false,"profile_use_background_image":true,"friends_count":1,"profile_sidebar_fill_color":"DDEEF6","screen_name":"miller2865","id_str":"24262686","profile_image_url":"http://abs.twimg.com/sticky/default_profile_images/default_profile_0_normal.png","listed_count":0,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"Mayo Clinic Medical Education Reform Summit April 26-28 http://tinyurl.com/dj3uwl","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1391798423,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Thu Mar 26 01:41:14 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1391798423","place":null,"user":{"location":"Springfield, IL","default_profile":false,"profile_background_tile":false,"statuses_count":248,"lang":"en","profile_link_color":"FF0000","id":19749157,"following":false,"protected":false,"favourites_count":4,"profile_text_color":"0C3E53","description":"Neuropathologist","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"F2E195","name":"Brian Moore","profile_background_color":"BADFCD","creat
 ed_at":"Fri Jan 30 02:11:17 +0000 2009","default_profile_image":false,"followers_count":526,"profile_image_url_https":"https://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011_for_twitter_normal.jpg","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme12/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme12/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://neuropathologyblog.blogspot.com","indices":[0,22],"display_url":"neuropathologyblog.blogspot.com","url":"http://t.co/2xdql9mCYM"}]}},"url":"http://t.co/2xdql9mCYM","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":41,"profile_sidebar_fill_color":"FFF7CC","screen_name":"neuropathology","id_str":"19749157","profile_image_url":"http://pbs.twimg.com/profile_images/1453301647/Moore_Brian_10_June_2011
 _for_twitter_normal.jpg","listed_count":28,"is_translator":false},"coordinates":null}
+{"contributors":null,"text":"On call...first case delayed already!","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1400537143,"source":"web","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Fri Mar 27 12:25:36 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1400537143","place":null,"user":{"location":"Indiana/ North Carolina","default_profile":false,"profile_background_tile":false,"statuses_count":487,"lang":"en","profile_link_color":"9EDEF5","id":26316026,"following":false,"protected":false,"favourites_count":4,"profile_text_color":"333333","description":"I am an American Forensic Pathologist, and Fitness Activist, who likes to write and race bicycles.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"9CEE72","name":"Scott Wag
 ner M.D.","profile_background_color":"C9FAFD","created_at":"Tue Mar 24 20:29:03 +0000 2009","default_profile_image":false,"followers_count":85,"profile_image_url_https":"https://pbs.twimg.com/profile_images/139026389/At_work2.1_normal.JPG","geo_enabled":false,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"expanded_url":"http://Pathfor.com","indices":[0,22],"display_url":"Pathfor.com","url":"http://t.co/ckrct3sKAd"}]}},"url":"http://t.co/ckrct3sKAd","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","notifications":false,"profile_use_background_image":true,"friends_count":239,"profile_sidebar_fill_color":"EFFFCC","screen_name":"sawagnermd","id_str":"26316026","profile_image_url":"http://pbs.twimg.com/profile_images/139026389/At_work2.1_normal.JPG","listed_count":2,"is_tr
 anslator":false},"coordinates":null}
+{"contributors":null,"text":"Biked 12.00 miles\r\n in 1h 00m. Spinning Class","geo":null,"retweeted":false,"in_reply_to_screen_name":null,"truncated":false,"lang":"en","entities":{"symbols":[],"urls":[],"hashtags":[],"user_mentions":[]},"in_reply_to_status_id_str":null,"id":1402341623,"source":"<a href=\"http://www.beginnertriathlete.com\" rel=\"nofollow\">BeginnerTriathlete.com<\/a>","in_reply_to_user_id_str":null,"favorited":false,"in_reply_to_status_id":null,"retweet_count":0,"created_at":"Fri Mar 27 17:51:33 +0000 2009","in_reply_to_user_id":null,"favorite_count":0,"id_str":"1402341623","place":null,"user":{"location":"Seattle Area","default_profile":false,"profile_background_tile":false,"statuses_count":560,"lang":"en","profile_link_color":"088253","id":16283736,"following":false,"protected":false,"favourites_count":89,"profile_text_color":"634047","description":"Pathologist developing innovative digital pathology solutions to connect patients around the world with the highest 
 quality diagnosticians.","verified":false,"contributors_enabled":false,"profile_sidebar_border_color":"D3D2CF","name":"Gregory S Henderson","profile_background_color":"EDECE9","created_at":"Sun Sep 14 15:19:36 +0000 2008","default_profile_image":false,"followers_count":1349,"profile_image_url_https":"https://pbs.twimg.com/profile_images/339777194/Henderson-Gregory-IMG_4461B_normal.jpg","geo_enabled":true,"profile_background_image_url":"http://abs.twimg.com/images/themes/theme3/bg.gif","profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme3/bg.gif","follow_request_sent":false,"entities":{"description":{"urls":[]},"url":{"urls":[{"ex

<TRUNCATED>