Yesterday, Kawan and I ventured to the Harvard Innovation Lab on a beautiful day in Boston to see the graduating class of Startup Institute Boston’s Spring Track. 50 hard-working and passionate individuals gave unique, expressive one-minute pitches in front of a crowd full of Boston based companies looking to hire.

After each pitch from web developers, sales, marketing, and product design students, a networking session commenced. We met a ton of talented folks and had a great time doing it. As each student talked about their accomplishments, Kawan and I would sort of look at each other with wide eyes because we were so impressed by the amount of life experiences and ambition they had.  We’re excited to be connecting with the Boston startup community.

If you had a fun time and want to chat with us some more, or didn’t get to meet myself or Kawan, venture out to sunny North Station next Friday from 11am to 1pm for our stop on the Startup Walkabout. We’ll be having lunch and beers, so come out and meet the rest of the team!

Posted 1 year ago by ninerr
Embed This

As of May 24th we will no longer support Twitter Embeds.

Embedly is in violation of section 1.4.A of the Twitter Terms of Service by resyndicating their oEmbed API response. With the release of v1.1 of their API we lost our white list status and have been using a stop gap ever since.

Yesterday we got the official word that we must fall in line after a month of trying to work something out.

We had a good run and a pretty good relationship with Twitter.

  • We were white listed to make a high volume of API calls.
  • We were listed as a method to embed tweets on dev.twitter.com before their official embed was released.

Embedly supports embedding content from over 250 different sites and this is the first time that we have ever had to remove a provider. Every other provider we have talked to views Embedly as a method of furthering their reach. More sites where there content can be shared and grow.

So, what does this mean for Embedly users?

Twitter’s Terms of Service does allow us to pass back the tweet id, but we have chosen not to include this in our oEmbed response. The tweet id is fundamentally useless for embedding tweets, especially when you already have the URL.

If you would like to hit Twitter’s oEmbed API directly, please refer to their documentation. It requires oAuth authentication, so disregard the o in oEmbed.

On May 24th we will remove Twitter from our providers list, so if you use the Embedly’s Wordpress Plugin you will need to update your providers list then. Other than that, things will just fail naturally.

I apologize for this one and wish we could have come to a better resolution with Twitter.

The good news here is that Twitter represents only about 0.4% of URLs Embedly processes on a given day.

If you have any questions or concerns you can contact me directly at sean@embed.ly.

Sean

Posted 1 year ago by screeley
Embed This
Tagged:

image

Next Friday, May 3, we are opening our doors to the StartupWalkabout community for a meet and greet with our team from 11am to 1pm. Serving up lunch and some of our personal favorite brews, we’re making our presence known in Boston. 

The Boston Startup Walkabout is a 4-day long city-wide event for job seekers and members of the tech community.  Over the course of the week, some of Boston’s best startups will be opening their doors to network, enjoy some treats and show why you should join their team. With some great names such as TechStars, MassChallenge, and PayPal, you will be wowed by some of the opportunities these Boston startups have to offer.

If you’re in the area and want to get to know the local startup community, looking for a job, or just want to see what we’ve been up to, swing by and grab a bite. We want to get to know our neighbors too so look out for an Embedly employee at some of the walkabout events! Take a look at our jobs page to get a better understanding of what we’re looking for.

Sign up for Embedly’s event here!

Final Note: Space is limited to 20, so snag your spot quick.

Posted 1 year ago by ninerr
Embed This

A few days ago I came across a tweet:

I was pretty pumped because I enjoy seeing what people can do with our API and this was a perfect example. So, I reached out to Blain with a few questions…

What sorts of projects do you generally work on?

My projects are all over. I’ve done a lot of small business websites, SaaS web apps, custom web apps, and large scale websites. Recently I joined MadGlory Interactive as a partner where we build web communities for the gaming industry. Everything from franchise websites to forums and custom leader boards of stats.

What inspired you to create the plugin for Statamic?

Aside from being close friends with the creators of Statamic, I really believe in it. I also believe that in order for any new CMS to be successful it needs a really broad range of open source plugins available to extend its functionality. Embedly is a great service to extend Statamic to allow its user to easily publish media from all over the web without being technical. Embedly deserves to be a part of every CMS to make embedding easy.

What did you like about using the API?

Not only is the API easy to use, the extensive list of media providers is amazing. It really makes integrating media from other sources such a seamless and uniform experience.

What would you like to see from Embedly after working on this project or in general?

In general, I would love to see Embedly in the media more. I read a lot of articles on Hacker News, Smashing Magazine, and Slashdot, and other sources, but I haven’t seen much from Embedly on there. Embedly really deserves a lot of recognition for the service it provides.

Wow, what encouraging words! Make sure to take a look at the plugin.

This post is part of our spotlight series.  Let us know what you’ve created with Embedly- small project or a massive endeavor- we want to hear about it.  If you haven’t tried the API yet, you can get started now.

Posted 1 year ago by ninerr
Embed This

Embedly was selected to present our APIs and offer support as an ambassador at the 2013 hackNY.  There was lots of energy in the room, with a focus on projects being awesome, rather than chasing hockey stick growth.  They even had a hardware hacking room with 3D printers. 

image

image

image

One of the projects, Edison Encryption, used the Embedly Extract API as one of the steps for an encryption algorithm.  The team consisted of Eric Schles, Dan Cohen, Chris Williams, and Danny Padawer.

Details of the algorithm are provided on Github

The algorithm currently adds padding to plaintext in such a way that makes cryptanalysis more difficult. This is because it pads based on a given corpus (chosen by the encrypter) and mimics that frequency. This makes discerning the true plaintext difficult. In order decrypt, you need a series of offsets, for each actual plaintext character. By combining both of these, we have an easy to decrypt and relatively cheap encryption algorithm.

When I saw the project presentation I was curious how Embedly was used in it.  Eric got back to us, mentioning that Embedly Extract was used specifically to parse an article and get the content. From Eric: 

We used embedly to get corpus’ of a specific kind.  We then did frequency analysis(similar to what is done in cryptanalysis) on the corpus in order to determine likely frequency patterns, making it difficult to tell which letters are part of the plaintext and which are part of the ciphertext.

According to Eric, the team doesn’t plan on stopping now, and has some pretty admirable ambitions.

We plan to expand this hack and turn it into a cryptographic standard that makes the internet a safer better place.

When we built Extract, we knew it would be used in natural language processing applications, but we never imagined it would be used for encryption.  Pretty cool seeing how people use the Extract API!

If you’d like to start using Extract, you can sign up free, and get started with some demos and tutorials

HackNY was a great time.  If you’re having a hackathon, let us know, we’d love to come by.

Update (04/18/13):  Danny got back to us on what it was like using the Extract API:

We only used the extraction API, but it was very nice, easy, simple to use. It returned everything we needed.

No complaints, and it worked quickly, which is always nice at a Hackathon - minimal time was needed to get it doing everything we needed.

Great to hear!

Posted 1 year ago by whichlight
Embed This

The third post in our series on Ember will continue to work from the development environment that we worked on in the first and second posts.

As promised last time, this post will dive into views and controllers. Here is where the magic happens. We’ll also touch on models, but we’ll save the bulk of the models work for our next post.

Controllers

This time let’s try and fill in some details on the about page. Since it needs to be about something, let’s create a fictitious organization called Jubarian. We’ll create a simple controller to display information about the organization and add it to index.html.

    // app/scripts/modules/about.js
    App.AboutController = Em.Controller.extend({
      name: 'jubarian.org',
      description: 'A non-profit organization of peopled dedicating to spreading joy.'
    });

    // app/index.html
    __snip__
    <script src="scripts/modules/about.js"></script>
    __snip__

    // app/templates/about.handlebars
    <h1>About {{name}}</h1>
    <p>{{description}}</p>

This works, but it’s not very MVC. We shouldn’t be adding our data directly to our controller. Our controller should only contain data directly relevant to display concerns.

Controllers in Ember are a little different then what you may be used to in more traditional MVC frameworks. Usually, they are implemented as proxies to a model and passed to the view using an ObjectController or ArrayController. The view will never interact with the model directly, only through the controller proxy. This allows us to have a clean separation of data concerns and display concerns. The controller decorates the model with display logic. Let’s implement something to make things more clear.

ObjectController

There are two main types of controllers that are most common in Ember applications, the ObjectController and the ArrayController. In this case, we’ll use an ObjectController, since there is only a single organization being displayed. We’ll create a naively simple model to hold our data and connect it to the controller in the router.

     // app/scripts/modules/about.js
     App.Fixtures = App.Fixtures || {};

     // our model
     App.Fixtures.Org = {
       name: 'jubarian.org',
       description: 'A non-profit organization of peopled dedicating to spreading joy.'
     }

     App.AboutController = Em.ObjectController.extend({})

     App.AboutRoute = Em.Route.extend({
       model: function() {
         return App.Fixtures.Org;
       }
     });

Properties of Ember objects aren’t set directly. We always use set(name) and get(name) functions to allow Ember to notify the objects observers of property changes. This is what allows Ember to automatically update views when properties change. Since our Org object is not an Ember object, Ember won’t be able to detect changes to it. We’ll cover a more robust way of doing thing in the next post, when we cover models and ember-data.

We’ll need to wire up our Org to the AboutController. We do this by defining a method function property on our AboutRoute object. ObjectControllers are different then a regular controller because they proxy all of their undefined properties to the object defined as their content property. Ember will automatically call the model function and set the result to the content property of the controller.

Our controller, as it stands, doesn’t do anything. Before we created it we were using an auto-generated controller of type Controller. Since it wasn’t an ObjectController, it didn’t proxy to the content property. Now that we’ve defined it as an ObjectController, all undefined properties pass through to the content property, our org fixture.

Let’s add some state to the display so the controller has something to do. We’ll add a list of team members with a toggle for displaying or hiding it. This will also give us a chance to setup an ArrayController and see how that works. But first let’s just create a static view. And modify the AboutController to handle the team display logic.

      // app/templates/team.handlebars
      <ul>
        <li>Bob</li>
        <li>Andy</li>
      </ul>

      // app/templates/about.handlebars
      _snip_
      <p>
        <a href="#" {{action toggleTeam}}>{{toggleTeamLabel}}</a>
      </p>

      {{view App.TeamView isVisibleBinding="teamVisible"}}


      // app/scripts/modules/about.js
      _snip_
      App.AboutController = Em.ObjectController.extend({
        teamVisible: false,
        toggleTeam: function() {
          this.set('teamVisible', !this.get('teamVisible'));
        },
        toggleTeamLabel: function() {
          var vis = this.get('teamVisible');
          return vis ? 'hide team' : 'show team';
        }.property('teamVisible')
      });

      App.TeamView = Em.View.extend({
        templateName: 'team'
      })

You’ll notice that we had to explicitly create the TeamView object. That is because it wasn’t generated through the router so the template name isn’t automatically discovered.

Properties

toggleTeamLabel is a good example of a dynamic property. When controller.get('toggleTeamLabel') is called, the function will be used to generate toggleTeamLabel’s value. To denote this, the property function is called on the function. The property function takes a list of arguments that define it’s dependencies. This is important for observers of the property, and to allow Ember to cache the property result. Ember knows that when teamVisible changes, so does toggleTeamLabel.

In our about template, we have created an anchor tag that fires toggleTeam on AboutController whenever it is clicked using the action helper. We are using the toggleTeamLabel as the display name of the tag. We use the view helper to insert the TeamView into our template. isVisibleBinding="teamVisible" is a special attribute that binds the isVisible attribute of TeamView to the teamVisible property of the current scope, which happens to be AboutController. Now, whenever teamVisible changes, so will isVisible. isVisible is a builtin property of every View that controls whether or not it is visible.

ArrayController

Now let’s convert the static template, team, into a proper ArrayController. Since we want the view to have it’s own controller, and not share a controller with AboutView, we’ll change it from a {{view}} to a {{render}}. This will allow us to wire up the array of team members to an ArrayController and associate it with the view.

    // app/modules/about.js
    App.Fixtures.Team = [
      { name: 'Bob' },
      { name: 'Andy' },
      { name: 'John' },
      { name: 'Kawan' },
      { name: 'Nina' },
      { name: 'Sean' },
      { name: 'Art' },
    ];
    
    _snip_

    App.Team Controller = Em.ArrayController.extend({
      needs: 'about',
      about Binding: 'controllers.about'
    });

    App.TeamView = Em.View.extend({
      isVisibleBinding: 'controller.about.teamVisible'
    });

    // app/template/about.handlebars
    _snip_

    {{render "team" App.Fixtures.Team}}

    _snip_

    // app/templates/team.handlebars
    <ul>
      {{#each controller}}
        <li>{{name}}</li>
      {{/each}}
    </ul>

The render helper will automatically find the correct view and controller based on the first parameter, the template name. The second parameter will be used as the model.

The way we are binding AboutController’s teamVisible property to TeamView is a bit contrived, but it shows how controllers can be bound together. We declare that TeamController needs AboutController and that the about property of TeamController is bound the AboutController. We then bind TeamView’s isVisible property to AboutController’s teamVisible property.

Since TeamController is now an ArrayController, we can iterate over it’s content with the each helper. each will iterate over the collection putting it in scope for the contained template, in this case <li>{{name}}</li>.

Conclusion

With a few lines of code we’ve made a dynamic, data driven about page and demonstrated the power of Ember views and controllers. You can find the source for the project on github  This wraps up our brief intro to views and controllers. Our next blog in the series will give an introduction to ember-data, a web ORM for ember. See you next time!

Posted 1 year ago by dokipen
Embed This

Our users are what keeps us going so we’ve decided to start a weekly user spotlight series to showcase your projects and creations.

First up is Fetchnotes. An app that’s core mission is to make productivity as simple as a tweet. When using Fetchnotes, your tasks are grouped by hashtags, as in #todo, #email, #groceries, and #buy. As you place hashtags on each task, they are grouped by the hashtag and you can access them more clearly via your phone or dashboard. Pretty slick.

So, how do they use Embedly? Fetchnotes founder and CEO, Alex Schiff filled us in,

"Embedly makes it easy for our users to act on the notes they take, so it directly supports that goal of helping people execute. When they save a YouTube link, Embedly allows them to watch it from directly within our app - no extra steps. When they save an article to read later, it previews it and gives them relevant context. It cuts down on the steps from "I want to…" to "done."

The original feature of Embed being put to use, to help you finish that growing to do list that’s probably making you sick.

Last thing we’d like to add is what Fetchnotes is hoping to see from us in the near future. We build for you, so when you ask us to create something we always try our best to deliver. What is Fetchnotes hoping for?

"One thing I’d love to see from Embedly is to pull in similar results without needing the link itself. So rather than needing the link to a song on Rdio to pull in the preview, it would be awesome if it could find it based off of having the artist name or song in the text."

We’ll be sure to add that to our to do list (cleverly placed statements are my speciality, look out). Awesome to see such a dynamic app using our API and we hope to see more. Make sure to take a look at Fetchnotes to kickstart your productivity. And if you’re using Embedly, let me know, I’ll be diligently writing posts for as long as you contribute! Feel free to email me directly at nina@embed.ly.

Interested in what you could create with Embed? Check it out here, mosey on over to the sign up and start using Embedly for free.

Posted 1 year ago by ninerr
Embed This

As you may know, we co-sponsored a hackday with Traackr and Elasticsearch at Hack/Reduce.  A one-day event centered around Machine Learning and Natural Language Processing that turned out to be a hit.

The event host, George Stathis of Traackr had a few favorites but one stood out to us: Alex Lambert from Spindle. He processed articles from the Economist from the past 5 years and rated them on 3 different mood scales from the Affective Norms for English Words (ANEW) word scores to see if indeed the world is coming to an end, no joke. Thankfully, he came to the conclusion that the world is not ending, so we are all safe…for now.

Embedly’s own Andy and Art created their own “NFL coach”. This one hit close to home as many of the guys in the office, including my lady self, are pretty big NFL fans. They took 10 years worth of very detailed NFL play data and used it to train an ML algorithm to predict what play should be called. Once it was trained, they tested to see how often it made the same call as a professional coach would. The results? Out of 44 thousand plays a year in the NFL, their algorithm would give 1 out of 11 options, out of all of those options, they would get around 22 thousand right. So 50% for a bot acting like a pro football coach? Not bad.

John and Kawan gave a talk at the beginning to get the ideas going. They went in depth on how we use machine learning and NLP in-house to build some of Embedly’s features, including parts of our new product, Extract.

image

The winner of the Best Use of the Embedly API was Sands Fish. I had the pleasure of interviewing him about his project.

Sand’s idea was to use a large amount of data that he had in the form of 15,000+ tweets from this year’s SXSW conference and “write a service to aggregate all of the tweets containing #SXSWi and #SXSWedu”. He said, “my main goal was to enrich the data as much as possible so I could paint a more complete picture of what happened [at the conference] and get some insight into what ideas, people, and companies were being talked about the most”. Pretty nifty.

"The embedly API was a great fit…while I was only able to enrich tweets that contained links, there were more than 5,000 in this category, and for each of them, the API provided me with a wealth of data about the resources linked to in the tweet". Sands created an image-wall with the data, keeping time in mind, this was the most he felt comfortable creating. Sands mentioned that he had "many ambitions for the data-set" and you better believe we’re excited to see what he comes up with given the luxury of time, post hackday.

Posted 1 year ago by ninerr
Embed This

As reported by Pingdom, Embedly’s uptime for the month of April has been 100%. We pay Pingdom to manage these checks and have configured them to properly monitor the API’s health.

We were pretty surprised when Verelo started reporting on Twitter that we were down. If you have never heard of Verelo (neither had I), they monitor uptime like Pingdom and were recently acquired by Dyn.

Apparently they are also into public shaming to try to drum up business, so we are going to return the favor.

Verelo runs a site called whatsdowntoday.com where they hook up their services to a bunch of sites without notifying them first. They ping them and tweet out at @verelostatus when one fails to pass it’s status check.

They nicely have Tweet and Facebook buttons to share downtime, but no links to the service they are actually checking.

Embedly’s API is one of these services, however, their check is not configured correctly. Verelo does not include an API key in the URL, so when they hit our usage limit for unauthenticated requests we throw errors. If you rely on Verlo we have been down for most of the last 2 days.

Funny enough, this is their API call:

http://api.embedly.com/1/oembed?&maxwidth=400&maxheight=300&urls=https://t.co/04SmeCDl

That t.co url redirects to a reddit post for their own press release: https://t.co/04SmeCDl. Zero comments, whomp whomp.

I’m all for trying to to acquire new business, but by publicly shaming people via whatsdowntoday.com is down right dirty.

Attracting customers starts with building relationships, not alienating your target market. Your viral growth hack has turned into spam, time to go back to the drawing board.

If you would like to see Embedly’s actual status, you can check out Pingdom: http://stats.pingdom.com/q1pr2ct042w3

Posted 1 year ago by screeley
Embed This
Tagged:

This is the second post in our series on Ember. We will be building off the development environment we set up in the first post.

In practice, everything is based off the router and templates. Ember handles the dynamic creation of views and controllers. You really don’t need them until you start dealing with data and events.

By default Ember sets up two routes for you: application and index. application is the container for your entire application while index is the route for the root of your site ‘/’. You can create the two templates for these routes in the templates directory.

$ touch app/templates/application.handlebars
$ touch app/templates/index.handlebars

And for good measure we will create a global nav.

$ touch app/templates/nav.handlebars

The application template is a good place to create scaffolding; things that need to be on every page and also inside the scope of the application. Here is our simple application.handlebars:

{{ render "nav" }}
<div class="row">
 <div class="large-12 columns">
  {{outlet}}
 </div>
</div>

We just introduced two handlebars helpers that Ember uses: render and outletHandlebars helpers are a part of the Handlebars template language that is included with Ember. The render and outlet helpers are added by Ember.

About render from the docs:

Renders the named template in the current context using the singleton instance of the same-named controller.

render allows you to include one template into another. It’s much like the template helper, but also allows you to pass data along. In this case you could use either.

outlet is a placeholder that allows you to specify where the child node’s content will be rendered. They are much like {% block %} tags in Django or <%= yield ==%> in ERB.

Since application.handlebars is the base route the content from index.handlebars will be rendered where this outlet is. We can create a simple index.handlebars to prove this.

$ echo "<h1>Welcome To My App</h1>" > app/templates/index.handlebars

Routes

Routes are URL paths. To add a new page, you need to add a new route. So to add our about page, we need to add a route to our router.

App.Router.map(function(){
  this.route('about');
});

Ember is creating AboutRoute, AboutView, and AboutController. We don’t really need those for this exercise, but we do need a template with some content.

$ echo "<h1>About To My App</h1>" > app/templates/about.handlebars

If you visit ‘/#/about’ you will see the content.

Resources

When you want to start grouping routes, i.e. “/company/contact” and “/company/team” resources come in to play. The benefit here is that they share common templates. While you could so something like this:

App.Router.map(function(){
  this.route('contact', {path:'/company/contact'});
  this.route('team', {path:'/company/team'});
});

It becomes a mess really quickly. Instead you should use a resource.

App.Router.map(function(){
  this.resource('company', function(){
    this.route('contact');
    this.route('team');
  });
});

It is however a little more confusing when it comes to templates. Like the application route, we need to create a base container for all the leaf routes. This could be as simple as:

$ echo "{{outlet}}" > app/templates/company.handlebars

In this case, everything will just be added to the outlet in the application.handlebars. If you want every company page to have common display attributes, you can change the template:

<h1>Company</h1>
<div class="row">
  <div class="large-9 columns">
    {{outlet}}
  </div>
  <div id="sidebar" class="large-3 columns">
    {{outlet sidebar}}
  </div>
</div>

You’ll notice here that we added a named outlet. By default all content from the leaf routes will go into the {{outlet}} unless we tell it to go somewhere else instead.

We can then create the leaf templates.

$ mkdir app/templates/company
$ touch app/templates/company/index.html
$ touch app/templates/company/contact.html
$ touch app/templates/company/team.html

This is one of the nice things about having ember_templates set up and compiling templates for you. Ember expects the templates to be put into EM.TEMPLATES hash as ‘resource/route’ or you need to declare the templateName on the view. The former is less code.

Custom Routes

We set up that outlet earlier, it’s time that we use it. In order to use named outlets we need to modify the Routes behavior. Here we will change that Company Team Route to add a sidebar. In the main.js file we are going to add:

App.CompanyTeamRoute = Em.Route.extend({
  renderTemplate: function(controller, model){
    // Render the base template
    this._super(controller, model);
    // Render the bios template into the sidebar
    this.render('bios', {outlet: 'sidebar'});
  }
});

And then add the bios template:

$ echo "<h2>Bios</h2>" > app/templates/bios.handlebars

When you visit /#/company/team you will see the bios section in the template.

Alright, that was a quick primer into the Router and Templates, you can see the final code here: https://github.com/screeley/ember-demo-environment/tree/router. Next week, we’ll go into using View and Controllers.

Posted 1 year ago by screeley
Embed This