

Parse Launches Cloud Code to Run Custom Code for Your App - tikhon
http://blog.parse.com/2012/09/11/welcoming-cloud-code-to-the-parse-family/

======
adelevie
This looks incredible. I've been wanting a clean way to select multiple random
objects from my Parse db. Until now, this was the best answer:
<https://parse.com/questions/random-search-its-possibile>.

Also, it seems possible to combine this with IronWorker. You could create a
worker in Ruby, then in the Parse Cloud Code, call that worker's endpoint.
Something like this (rough sketch):

worker.rb:

    
    
      require "some_ruby_email_gem"
      cgi_parsed = CGI::parse(payload)
      email = payload["email"]
      SomeRubyEmailGem.send(email, "Welcome, #{email}!")
    

upload.rb:

    
    
      require 'iron_worker_ng'
      client = IronWorkerNG::Client.new(:token => config['iw']['token'], :project_id => config['iw']['project_id'])
      code = IronWorkerNG::Code::Ruby.new
      code.merge_worker 'worker.rb'
      code.merge_gem "some_ruby_email_gem"
      client.codes.create(code)
    
      url = "https://worker-aws-us-east-1.iron.io/2/projects/#{config['iw']['project_id']}/tasks/webhook?code_name=#{code.name}&oauth=#{config['iw']['token']}"
    
      puts "Add this url to to your Parse Cloud Code:"
      puts url
    

Parse Cloud Code:

    
    
      Parse.Cloud.define("welcome, function(request, response) {
        var user = request.object.get("user");
        var url = "https://worker-aws-us-east-1.iron.io/2..." // the url from upload.rb
        http.open("POST", url+"?email="+user.email, true);
      });
    

EDIT: HTTP requests to 3rd parties within Cloud Code are not possible _yet_ ,
but Parse will add the feature soon.
(<http://twitter.com/ParseIt/status/245584646686003200>)

------
scottfr
This looks great and should solve a number of issues with the current API.

I have an app that basically tracks donations for different campaigns. Getting
total donations per campaign isn't easy with the current API. There is nothing
like a "select sum()" statement in Parse. Basically I currently have to run a
cron job on my machine that will periodically download all donations by
campaign and update the total donations field on the campaign (the regular
user account doesn't have privileges to edit the campaign object).

This seems like it will be a much cleaner, saner way to take care of this type
of task.

------
pbreit
It seems like Parse will be in a never-ending battle to continue adding
functionality on the back-end to approach what one gets when they simply run
their own back-end. Surely there is a happier medium?

~~~
qhoxie
I think Cloud Code is a good example of why this is not the case. The more
flexibility and customization they allow in the platform, the fewer long tail
features they need to implement because people will be able to do it
themselves.

~~~
saurik
I imagine the argument is "once you add Cloud Code and people start using it
to solve problems, you have pretty much re-built Google App Engine"; it means
the only thing that separates Parse/StackMob/CloudMine (which now all have
this feature) is that they come with a simple default app which provides an
HTTP API to the data store that is used by an even simpler client library.

~~~
mariusandreiana
Except Parse is much more usable and more productive than AppEngine for
regular folks who build mobile and web apps.

~~~
saurik
Right, because they provide the two things I stated: a default app on the
other side that provides fairly liberal access to your schema, and a library
that can be used on the client that provides a fairly reasonable API (maybe
even CoreData integration; I know some of their competitors do this) to access
that API.

Neither of these, however, are that complex to do, and the value of both of
these drops dramatically once you start writing server-side logic in Java.

------
msie
Finally! I can run server code! I just might take another look at them now!

Edit: Huh? Why was this downvoted? The problem I've had with Parse for a long
time was that I still needed a separate server to do some backend processing
that was not feasible to do on a client. Now I may no longer have need for
that server.

~~~
frankdenbow
My thoughts exactly! This makes it much more appealing to me now. If they add
in some helpers for Core Data I would be even more excited to try it.

------
facorreia
It seems to make sense. Looks similar to the way Windows Azure Mobile Services
lets you run JavaScript code on the server.

[http://weblogs.asp.net/scottgu/archive/2012/08/28/announcing...](http://weblogs.asp.net/scottgu/archive/2012/08/28/announcing-
windows-azure-mobile-services.aspx)

------
julianpye
This is great! And perfect timing! Just today I was starting to write a set of
external hosted scripts to generate XML from my Parse objects, but this makes
everything much easier. Parse is just terrific!

------
aherlambang
This definitely lifts off the cons I've had so far with Parse, adding logic to
the backend instead of just a pure data storage. Awesome job to the Parse team

------
jawngee
This is great news.

I've been using parse on a project and was missing this functionality.

As a side note, I'm loving parse, but their iOS SDK is poorly designed. Like
really badly designed. I had a few email exchanges with one of their devs, but
it didn't really seem to go anywhere. You can't create subclasses of any of
their objects because they like using static methods versus singleton
instances. It's really stupid and it really ties you to using parse. You also
have shit like this everywhere:

    
    
        NSString *someval=[pfobject objectForKey:@"shit"];
    

Where this would be preferred:

    
    
        NSString *someval=mySubclass.shit;
    

So you can create a wrapper/shim for PFObject, but that doesn't float across
queries returning arrays of objects.

And, yes, I considered writing my own wrapper around their REST API but I
don't have that kind of time.

~~~
lacker
Helping subclassing to work more smoothly is definitely on our minds. A lot of
people do subclass PFObject right now, and as you point out that means you
need to handle queries in a slightly different way. It could be nicer, though,
and we intend to make it nicer.

------
nbclark
This is great, but not quite what I had hope for. Yes you can run custom code,
but only what their current API allows. It just saves time by not having to
transfer data to the client to aggregate.

Step in the right direction though.

------
thedangler
Yeah! I requested this when I first started using parse a long time ago. I'm
so happy that I can now implement hooks for syncing other db's.

------
amirhirsch
how is this priced?

a cloud code request probably can't fit within the pricing model posted on the
parse site as a single API request because it may presumably have huge
variance in resource consumption. like what's to stop someone from use parse's
resources to run bitcoin miners?

~~~
TazeTSchnitzel
It looks to me like these are going to be short-running, on-request
computations, that might timeout. Not long-running back-end code.

Edit: Confirmed! <https://news.ycombinator.com/item?id=4506783>

------
alexchamberlain
How do they secure this?

~~~
lacker
The environment is based on V8, which provides a lot of tools to sandbox
javascript code. There's some other pretty cool technology there - we might
write a more detailed blog post about it if folks are interested.

~~~
tlack
I would love to read that. Having a strong sandbox as a tool makes all kinds
of interest things possible.

p.s. My last name is Lackner. Glad to meet someone else with the unfortunate
Lack- prefix.

~~~
lacker
Unfortunate? Psh. When I was a little kid I liked "Lacker" because it rhymes
with "Hacker". Then I grew up and became a computer programmer. See also:

<http://en.wikipedia.org/wiki/Nominative_determinism>

------
jordibunster
I assume there're execution limits to avoid while(true) {}. Can't seem to find
information on that though.

~~~
lacker
Yes, each request is limited to a few seconds. We should make that more clear
in the documentation - thanks for the feedback.

------
lucian1900
I wish them luck securing that. Even app engine had security trouble at first
:)

------
majorapps
What now is an API call that counts towards your quota? An API call to the
Cloud Code from the client, or each call to a Parse method within the Cloud
SDK?

~~~
lacker
Each of these counts as an API call. It's a good question - we should make
this more clear in our documentation.

------
deepGem
This is good news. I had to move away from Parse just because I had to do some
computation at the backend. Will try out the new feature.

------
millerm
Is there any mechanism for specifying the HTTP method or is every function
mapped to POST? I'm not complaining, I'm just curious.

------
densone
Does parse talk about how they run their backend? I feel like it's a lot of
mongodb...

~~~
sargun
They use MongoDB, and MySQL. This worries me immensely. The Mongo part more
than MySQL, only because historically, MongoDB has not had a great story
around HA, and reliability...

------
juanbyrge
Sweet! Parse is one step closer to being as powerful as my dream host vps was
10 years ago! Congrats guys!

------
don_draper
How is it everyone's opinion of PaaS went sour when Google AppEngine
readjusted its pricing to reflect costs. Now someone else comes along and PaaS
is the greatest thing since sliced bread.

These guys will never be bought by a bigger company with nothing but profits
in mind?

