As an intern, I tend to get extremely excited about the little things, those things that others in the office are pretty used to after some time. This on the other hand, is no little thing. We’re pretty pumped about the kinds of things you can build with machine learning and text analysis. So much so that we’re sponsoring the Boston NLP/ML Hackday in a couple of weeks.

Boston NLP/ML Hackday is a single day hackathon centered around NLP/ML and Elasticsearch with free food and exceptionally interesting folks in attendance. The event will be hosted by Elasticsearch, co-sponsored by Traackr and space will be provided to us thanks to Hack/Reduce. If you’re into it, that’s great, because we are too. Join us on March 16 from 9AM to 9PM in Cambridge. Registrations are limited so mosey your way on over to the eventbrite page before that other hacker does.

Eventbrite: http://elasticsearchbostonnlphackday-es2004.eventbrite.com/?rank=1

But wait…there’s more.

Over the last several months we’ve written a classifier to determine if a URL is an article or not, and a related articles engine based on LSI Topic Modeling. We’ve also included entity and keyword extraction, and language detection in the API. Along the way we wrote a parser for articles, easily allowing one to pull the content from any article - an essential step when performing any sort of text analysis on a corpus of web articles.

All of these features will be available to use at the Hackday, and we’ll be helping out, giving tips and advice using the tools. Hope to see you there!

Posted 1 year ago by embedly-team
Embed This

Colors!

Happy Valentine’s Day! Whether you’re living it up with your significant other, making out in public, or planning which pint of Ben & Jerry’s ice cream you’re going to be shoveling down while watching the Notebook tonight, alone, we can all agree that this day has one awesome mood booster for all, which is the fabulous color of red. 

Red, commonly associated with passion, fire, beauty and sometimes communism (but we won’t talk about that), has earned it’s highly coveted title as the color of love. Now what’s all this jibber jabber about love and caring, we’re an API company with better things to do than canoodle around with colors that exude feelings? Wrong! We are huge fans of color and that’s why we’re going to show you what you can do with it, using one of our nifty features, conveniently named, Colors.

The feature itself provides our users with the ability to extract up to 5 dominant colors in any given image. Such a simple outcome but the necessity of it is key. Colors play an extremely important role in user satisfaction and retention on a web page. Colors relay emotion and can very easily make something a lot more interesting. If you’re not using colors then you’re probably doing something wrong. Furthermore, understanding which one’s to use when creating something, so as to match your given color options, can be tricky and that’s where our feature comes into play.

Now for the fun part, John, our genius color man, located all the trending images under the color red and we decided to go with the cliche Valentine’s Day images so as to encourage you to be a little bit more cheesy today. Happy Vday, enjoy!

Image Credits: Instagram, Designbolts.com, Flickr, Ow.ly

Check out the feature here and email support@embed.ly for some Beta access.

Posted 1 year ago by embedly-team
Embed This

We came, we saw, we hacked…along with an office full of excited hackers at  DowncityJS in Providence, RI this past weekend. Huge thanks to Betaspring for hosting, Chris Meiklejohn of Basho and all the other sponsors.

A great crowd came out on a chilly weekend to see what hackers from as far as DC could conjure up in a mere 24-hour JavaScript Hackathon. One of the standout projects, David Trejo put together a simple and easy to use color identifier with some surprisingly useful features called Colorslice. Our own Art Gibson created, Grillin Mah Bus, a real time feed which tracks social media interactions of people on a public transit bus.

We provided our API for the event and some prizes for best use of our API as a solo participant and as a group, we were pleased with the outcome!

The winners?

Best use of our API: Cheer Me Üp, a service which allows you to send a friendly and uplifting message to someone having a tough time. They’ll receive it with cat gifs and all, embedded from sites like Tumblr and Reddit using the Embedly API.

Best Solo: Thom Nichols for Xirq.us, they used Embedly to embed photos and media within curated tweets by the location they’re near to let you know in one convenient spot what exactly is going on in an area.

Best Design: Aaron and Aaron created Meet, a dating app that won’t allow you to talk to your match before meeting up with them, it cuts to the chase by only providing the option to meet your match.

Best Team: Ryan Laughlin, Liz Neu, and Kyle Nichols for Thumbwar, which allows users to sync up with a friend over mobile, tablet or laptop connection to play a bundle of mini games with each other to pass the time or to unleash that competitive side if only for a few seconds.


The bottom line is, we had a blast! The four of us, Art, Andy, Kawan and myself enjoyed an engaging and often silly weekend with some new friends and replenished our creativity tanks.Shout out to Gabe, Giles, Samuel, Graham and Vinh 
of Cheer Me Üp and Aaron and Aaron for Meet. We’re looking forward to seeing the real thing and will definitely be sending some pleasant messages to some unsuspecting mopes.

 

Posted 1 year ago by embedly-team
Embed This

Hackers, makers, and designers in Providence, we’re pumped about DowncityJS this weekend.  DowncityJS is a 24-hour hackathon in Providence starting on Saturday and going into Sunday. 

We love using javascript in our applications. In particular, we use NodeEmberjs, and D3, and build it all with Yeoman.  What else do we love about JS? Everything is async.  Also, you can close the gap in the creative process- you change something and immediately see the results. 

Andy, Art, Nina, and I will be coming from the Embedly team.  We’re happy to help out if you want to play with the API, from throwing around ideas to pro-tips.  

Embedly does all the parsing for you, pulling relevant information for embeds given any url.  You can get started by taking a look at some of our endpoints, in particular the power that is objectify. One of my favorite features is the Article Extractor, which parses an article or blog post given a url.   This is great for getting tons of articles ready for some heavy NLP.  Play with the article and media links in your Twitter stream. The best part is that everything supports JSONP, so you can easily build beautiful JS client heavy apps. 

Oh yeah, one more thing.  There will be several special features you can use that we will talk about at the hackathon, so swing by and get a sneak peek.

Update: I’m bringing a Kinect and Andy will be bringing a helicopter. 

Posted 1 year ago by embedly-team
Embed This

I had the best conversation this morning while getting off the train. During off-peak hours, the Embedly customer service number goes directly to my cell phone. Any time I don’t recognize a number, I put on my nice voice and answer.

This time it was a nice elderly man from PA, that we will call Gerald. After a rather awkward start, Gerald says he’s having problems with his computer. He says he’s getting annoying popups asking him to allow a video to play and Gerald doesn’t want that. He just wants to watch the video, no questions asked.

Side note: I actually thought someone was messing with me at this point. “Uncle Bill, is that you? You got me good you wanker”

Gerald, obviously frustrated, wants someone to fix this, but I have absolutely no idea what he’s talking about. Apparently this happens every time he goes to his favorite website and clicks on an embedded video. He then admits, he’s “not all that great with computers”. 

Ok, so is this favorite website using Embedly? Has he figured out how to install the Twitter plugin? Are some of the embeds we are serving showing nasty error messages to users? How did Gerald get this number? Why are we doing this to Gerald? WHY WOULD WE DO THAT TO A NICE OLD MAN WITH 8 GRANDCHILDREN THAT LOVE HIM DEARLY AND CALL HIM POP POP?

Making a guess I ask if he’s running Windows and Internet Explorer. He knows he’s running Windows 7, but he’s not quite sure about this Internet Explorer thing. Well Gerald, it’s probably in your Internet Explorer privacy settings to always allow these types of videos to run, but I have no working knowledge on the matter. I still don’t know if that’s the right answer by the way.

Gerald: “Am I even calling the right person?”

Sean: “No, I’m just general tech support at this point.”

Gerald apologizes, thanks me for my time, we say our goodbyes and the conversation ends.

Why did Gerald and I have a five minute conversation this morning? 

Gerald, so fed up with his problem, starts Binging around and finds Embedly. He then spends time digging through the site to find a phone number, which is not an easy feat because ours is buried. A man “not so good with computers”, but so determined to fix his pain proves he isn’t exactly bad either. 

Gerald, you are a good man.

When you are so close to a problem one can sometimes forget people like Gerald exist. Just a man trying to watch a video on his favorite site. Gerald, I hear you buddy and I want to make your life better.

Sean

Posted 1 year ago by embedly-team
Embed This
Tagged:

Low and behold Twitter has officially joined the world of video and we’re happy to say we’re right behind them as we add Vine to our list of providers. The video service allows users to create and share a short looping video (no longer than 6 seconds) on their twitter feed. Pretty nifty huh?

Vine co-founder and general manager Dom Hofmann explains on USA Today

"Posts on Vine are about abbreviation — the shortened form of something larger. They’re little windows into the people, settings, ideas and objects that make up your life. They’re quirky, and we think that’s part of what makes them so special.

Now go enjoy this Peanuts Vine embed!

Posted 1 year ago by embedly-team
Embed This

We’re about a month into the new year and changes are already rolling out of the Embedly office. Embedly jQuery got a much needed refresh over the holiday season. Long story short, we had a bunch of legacy code in there and it was a pain to deal with all the query params, so we tweaked it.

With the new version we dropped support for everything below jQuery 1.5 to take advantage of jQuery’s deffered objects. I’ll give two quick examples here and and you can check it out for yourself on the fancy new docs at: http://embedly.github.com/embedly-jquery/

The selectors work much the same, but we have modified the input to take in a query hash. This allows the library to be more future proof as we add query arguments.

// Key
$.embedly.defaults.key = 'Your Embedly Key'
// Replace a tags with embeds.
$('#content a').embedly({query: {maxwidth:500, autoplay:true}});

You can also use the API directly and this is where the Deffered object comes in.

// Key
$.embedly.defaults.key = 'Your Embedly Key'

$.embedly.preview(['http://embed.ly', 'http://twilio.com/'])
  .progress(function(obj){
    // Called once per URL after Emebdly has returned data.
    console.log(obj.title);
  })
  .done(function(results){
    // Called once with a list of all the data returned.
    $.each(results, function(i, obj){console.log(obj.title)})
  });

That’s our quick little update to Embedly services, now go checkout the code and demo. Let us know what you think:

Code: https://github.com/embedly/embedly-jquery

Demo: http://embedly.github.com/embedly-jquery/inline.html

Sean

Posted 1 year ago by embedly-team
Embed This

Earn engagement, don’t force it.

Instagram removed Twitter Cards from their site, the internet freaks out. My god, they are turning their back on the social network that helped them become a billion dollar company.

Every content network was built on the back of a social network. YouTube grew on MySpace. SoundCloud grew on Facebook. Instagram grew on Twitter. The only difference here is that Instagram is leaving. 

Instagram’s problem isn’t Twitter, it’s the medium in which they operate. YouTube and SoundCloud have very rich embeds that users can interact with and be drawn back to thier web properties. Images however, are very static. They take about a second to view and then the user moves on. There is no way to monetize images embedded on other sites; once they go out, not one comes home. They’re kids from Northern Maine.

So, Instagram’s fix for this is to just remove the images, forcing users back to its own properties. If you look at their profile pages, they are optimized to engage users. Heart, Comment, Sign In, DOWNLOAD THE DAMN APP. Discovery is also built right in. Clicking on an avatar brings up more photos and allows me to follow them. Down the rabbit hole we go.

Actions

This is a “Growth Hacker’s” dream.

I’m sure that Instagram is going to be better off in the short term with this change. Page views, Downloads and Follows via the web are all going to be up and to the right. Maybe even the old hockey stick, but they should feel dirty. Like walking out of a strip club at 4am dirty.

SoundCloud has taken the exact opposite approach. Their embed contains much, if not all, of what’s found on the site. They earn every click to their property by getting the user interested in the product. Hell, you can even comment directly within the embed. They earn their success the hard way, but I bet they sleep better at night.

So Instagram, let’s talk about these embeds. How about making them an iframe or script tag embed like Twitter? Here, I made you this.

Default View:

Embed_small

When a user hovers over the embed:

Embed_full_small

And it looks nice inside Twitter:

Twitter_example

I didn’t do anything special here, I literally just put your photo page in Pixelmator and started cropping. Seems like you guys could do this and start earning those clicks. You would make users and the internet happy again. No one likes it when Mom and Dad fight.

<3

Sean

Posted 1 year ago by embedly-team
Embed This
Mid-Movember Mustache ManiaOur familes are not happy and our face is pretty itchy, but we are sticking with Movember. Before we all sit down with our extended families to reveal what we&#8217;ve been growing for the last 21 days, our team would like to send you off on your Thanksgiving holiday with a laugh.

Mid-Movember Mustache Mania

Our familes are not happy and our face is pretty itchy, but we are sticking with Movember. Before we all sit down with our extended families to reveal what we’ve been growing for the last 21 days, our team would like to send you off on your Thanksgiving holiday with a laugh.

Posted 1 year ago by embedly-team
Embed This

Lets talk about the latest hotness. Embedly has tried a lot of new tech over the years, Node, Ember, Cassandra, Membase and even had a short stint with ____ when it was the second coming. In this episode, Go has set the internet neck beards ablaze, so I decided to give it a try.

Embedly uses Google’s Safe Browsing API to check for malicious URLs and the initital implementation was written before I got here in Python and gevent. It was also poorly written, so as traffic went up, the Safebrowse service went down. 

All the service needs to do is make a few HTTP calls, persist some data and respond to incoming requests. Go seemed like a good fit, at least from what I knew at the time. The following is sort of a recap; what I liked, what I didn’t and at some point I’ll answer the question:

Was Go a good fit?

The Basics

Let’s take a look at the basics of Go: packages, types, goroutines and error handling.

> built-in packages:

Go has a pretty solid set of built-in packages. Coming from Google, it’s not a surprise that Go has a nice set of web-related packages (net/http, net/url, and net in general). http.ListenAndServe() is awesome. I had a simple server running in minutes, and I haven’t had to make any changes even as I put it in to production.

The net packages also include a straightforward HTTP client. Nothing fancy here; it just works.

For dealing with strings, Go defers to the polished wisdom of a family of C-like printf() style functions. I like the control of printf() style format strings, especially when debugging and dealing with binary data.

The strings package provides a good swiss army knife of string manipulation. Split, Join, Trim, HasSuffix, Contains, et cetera. Score 1 for python-like convenience.

So Go survives the test of string manipulation and both creating and handling HTTP requests. Good so far.

Next, we’ll need to interact with our database, Redis. Go is young, so how hard will this be? Fortunately not very; Go’s userbase is strong, and already has a few Redis drivers available.

> package imports and go get:

I was confused when I first looked up how to grab a Go redis package:

import "github.com/simonz05/godis/redis"

What about the package manager? gip, maybe? Nope. I appreciate pypi, but the easy_install versus pip issue sucks, so building package management in to the standard go toolchain is a step forward in my book.

When you run ‘go get’ in the directory of a Go project with this import, the Go toolchain will pull the repository from github, and install the package globally for all of your Go programs to use. This also works with google code, and maybe other sources as well.

How about dealing with those binary HTTP responses?

> strings, bytes, buffers, and slices, oh my!:

Go has strong types. If you want to add a uint32 to an int64, you’d better be explicit about what you want to cast, otherwise the compiler will yell at you.

This C-like behavior forces you to think about the potential overflow or other issues that can be caused by mixing types. It also makes sure you’re doing what you mean to with each individual byte.

This is super important for a language with aspirations to be a systems language. 

The strong typing has also kept me in line when stuffing data into Redis. Types need to agree everywhere. Expressions, function arguments; everywhere. None of this wishy-washy, “whatever, man” python stuff. Now I can be sure that when I pull something out of Redis, it will be what I expect.

So, yes, Go was a fine fit for this problem. But so would be a bunch of other languages.

Does Go add any extra secret sauce?

Of course it does! Here’s a big one:

> goroutines:

Go’s most lauded feature.

The Safebrowse implementation doesn’t require a lot of asynchronous behavior, but I managed to squeeze it in in 2 places:

  • http.ListenAndServe()
  • Periodically making an API call

The first one is obvious, and a freebie.

Every time my Go program serves a request, http.ListenAndServe() spawns a goroutine of the appropriate handler function, which can do it’s thing asynchronously. It took me literally zero extra lines of code to go from serving the most basic, single request, to hitting this code with requests from hundreds of client processes.

Next, Safebrowse requires talking to an external API on a schedule that changes with each API call.

It would have been nasty to set this up as a cron job, so instead I wrote a short runner program to run the periodic API call. It works like this:

// Create a channel for passing wait times
next_update := make(chan time.Duration)

// Create a channel for indicating whether finished
finished := make(chan bool)

for { // what an odd way to spell 'while True:'
    // Spawn a goroutine of the API caller, passing the two channels
    go PeriodicAPICall(next_update, finished)

    // Listen for the wait time
    sleep_duration := <-next_update

    // Sleep the runner for the wait time
    time.Sleep(sleep_duration)

    // On wake up, listen for the 'finished' signal
    // (For my application, it's necessary that the previous API
    // caller has finished before doing another API call)
    <-finished
}

This has worked well, and I haven’t noticed a memory leak, which is always a concern with long-running processes. I’m really happy with this. Go++ (Nobody actually make this a language, please. Yuck.).

This next one is more of a caveat, but it’s important.

> GOMAXPROCS:

With concurrency being a big feature for Go, there’s a good chance you’ll want to give your Go code the reins to your entire processor.

The current default is for a Go program to use only 1 logical CPU. You can change this using runtime.GOMAXPROCS(), or by invoking your Go program with the environment variable GOMAXPROCS set to something greater than 1. You can check how many logical CPUs a box has with runtime.NumCPU(). 

So now, you’re all like “Wow, Go sounds awesome, lets never use anything else!”.

A Rainy Day

Time to rain some reality on this parade. 

> functional programming basics:

Python has spoiled me with built-in comprehensions. A few times I found myself tossed back to the days of setting up an entire for loop for a simple one-line loop body.Map and filter would be nice.

As nice as that extra LOC padding is, these fingers only have so many characters in them. And these eyes… only so many levels of indentation.

This next one is a doozie.

> if err != nil {} (error handling):

I’ve read a bit of discussion of try/catch exceptions versus checking return values, and it feels like one of those programmer wars (e.g. tabs versus spaces).

Throughout development, I would often write

if err != nil {}

as a stub for me to search for later to deal with error conditions.

It felt a lot slower.

In running a web API, you never want some obscure condition to cause an unhandled exception and kill an entire response. I find exceptions to be easier to apply at a high level, then, if necessary, drill down to more specific levels of error handling. With Go (and C) style error handling, you’re forced to handle every individual error separately.

An example of why this bothers me:

If I’m trying to parse a string and 3 integers out of a byte slice, I really don’t want to write the error handling for each integer conversion separately. I’d rather wrap all 3 in a try/catch and deal with the more general error of -any- of them failing.

That said, you do feel a sense of robustness knowing that you’ve at least tried to handle each little error condition; just don’t get caught ignoring (by assigning to _) error return values. This feels like something a systems programming language should do.

So, Go, you win some, you lose some.

The Wrap

Overall, I’m really happy with the completeness of Go.

I didn’t have to reinvent the wheel while solving my problem, and I get good performance (I wish I could quantify this better right now, but for now my confidence in Go will have to do).

A lot of the core web functionality that Python does a good job of providing is also available in Go. This, combined with the care required with a C-like language, makes Go feel like a strong candidate for robust, high performance web programming. The kind of stuff people expect from Google.

Posted 1 year ago by embedly-team
Embed This