<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    

    <meta name="author" content="The Apache Software Foundation">

    
      <meta name="keywords" content="python,libcloud,cloud,cloud computing,rackspace,amazon ec2,cloudfiles,openstack,cloudstack" />
    

    
      <title>Google Summer of Code 2012 | Apache Libcloud</title>
    

    <!-- fav icons -->
    <link rel="shortcut icon" href="/images/favicon.png" />
    <link rel="apple-touch-icon" href="/images/apple-touch-icon.png" />
    <link rel="apple-touch-icon-precomposed" href="/images/apple-touch-icon.png" />

    <link href="/blog/atom.xml" type="application/atom+xml" rel="alternate" title="Apache Libcloud Blog Feed" />

    <!-- Facebook OpenGraph tags -->
    <meta content="Apache Libcloud" property="og:site_name">
    
      <meta content="Google Summer of Code 2012" property="og:title">
    

    

    

    
      <meta content="website" property="og:type">
    

    
      <meta content="https://libcloud.apache.org/gsoc-2012" property="og:url">
    
    

    

    <link href='/assets/global-1768bfa479597eed443be67c5aec2edc.css' rel='stylesheet' type='text/css' />
  </head>

  <body data-spy="scroll" data-target=".sidebar-nav" data-offset="80">
    <nav class="navbar navbar-fixed-top navbar-inverse" role="navigation">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="/"><img src="/images/libcloud_logo.png" class="navbar-logo" /> Apache Libcloud</a>
        </div>
        <div class="collapse navbar-collapse navbar-ex1-collapse">
          <ul class="nav navbar-nav">
            
            
              
              <li ><a href="/" >Home</a></li>
            
              
              <li ><a href="/about.html" >About</a></li>
            
              
              <li ><a href="/getting-started.html" >Quick Start</a></li>
            
              
              <li ><a href="https://libcloud.readthedocs.org/en/stable/" target="_blank">Documentation</a></li>
            
              
              <li ><a href="/downloads.html" >Downloads</a></li>
            
              
              <li ><a href="/community.html" >Community</a></li>
            
              
              <li ><a href="/blog/" >Blog</a></li>
            
          </ul>

          <div class="material-switch pull-right">
              <input id="theme-switch" name="theme-switch" type="checkbox" onclick="modeSwitcher()"/>
              <label for="theme-switch" class="label-default"></label>
              <span id="theme-toggle" class="theme-switch">Dark mode</span>
          </div>

        </div><!-- /.navbar-collapse -->
      </div><!-- /.container -->
    </nav>

    <div class="container main-container">
      <div class="row section page-content">
  <div class="col-lg-8 col-lg-offset-2">
    <h1 id="google-summer-of-code-2012">Google Summer of Code 2012</h1>

<p>Google Summer of Code is a program where Google sponsors students from around
the world to spend their summer working on open-source projects. Student is
paid 5000$ if they successfully complete all of their evaluations. More
information about the program can be found on the <a href="http://google-melange.appspot.com/gsoc/homepage/google/gsoc2012">project website</a>.</p>

<p><a href="http://google-melange.appspot.com/gsoc/homepage/google/gsoc2012" target="_blank">
<img src="/images/gsoc/gsoc2012.png" class="img-responsive inline center" /></a></p>

<h2 id="accepted-projects">Accepted Projects</h2>

<h3 id="libcloud-rest">Libcloud REST</h3>

<p>HTTP interface for Libcloud (http://libcloud.apache.org/) which exposes
all the Libcloud functionality through a RESTful API. Currently Libcloud
has a big limitation - you can only use it with Python. Adding a REST
interface would allow users to leverage Libcloud functionality through an
arbitrary language which knows how to talk HTTP.</p>

<p><strong>Mentor</strong>: Tomaz Muraus<br />
<strong>Student</strong>: Ilgiz Islamgulov<br />
<strong>Application</strong>: https://docs.google.com/document/d/1XdncChipJS0B7jP7p6jcQi1PZbUbsB0y7gKehxjw8ZU<br />
<strong>Strategic plan</strong>: <a href="https://docs.google.com/document/d/1P9fIxILn-WdgpkXDPydHB_dghGs-BYuoSmkFwh0Y36w">click</a></p>

<p>Project progress can be tracked on <a href="https://github.com/islamgulov/libcloud.rest">Github</a> and weekly updates are sent to
the mailing list.</p>

<h2 id="project-ideas">Project Ideas</h2>

<p>Some of the existing project ideas proposed by Libcloud developers can be found
on our <a href="http://s.apache.org/lcgsoc2012tasks">ticket tracker</a>. Students are also more than welcome to propose
their own ideas.</p>

<h2 id="available-mentors">Available Mentors</h2>

<ul>
  <li>Tomaz Muraus (tomaz) - UTC -8</li>
  <li>Roman Bogorodsky (rbogorodskiy) - UTC +4</li>
  <li>Jed Smith (jed) - UTC -8</li>
</ul>

<h2 id="student-applications">Student Applications</h2>

<p>Application template can be found in the section bellow. Before submitting
your application please start a discussion about the project idea on our
mailing list (dev@libcloud.apache.org).</p>

<h2 id="student-application-template">Student Application Template</h2>

<ul>
  <li>Name and surname</li>
  <li>E-mail address</li>
  <li>Blog / homepage (if you have one)</li>
  <li>IRC nick and network</li>
  <li>Google+ handle / Skype handle</li>
  <li>Name of school/  university, country, year, your average grade (and describe what this grade means)</li>
  <li>Age</li>
  <li>Which languages do you actively speak (and write)?</li>
  <li>Project / proposal title</li>
  <li>Project / proposal description</li>
  <li>Project / proposal schedule. How long will the project take? When can you begin work?</li>
  <li>Availability. How many hours per week can you spend working on this? What other obligations do you have this summer?</li>
  <li>Deliverables. It is very important to list quantifiable results here, for example:
    <ul>
      <li>Improve X modules in ways Y and Z.</li>
      <li>Write 3 new documentation pages for the new interfaces.</li>
      <li>Improve test coverage by writing X more unit/regression tests.</li>
      <li>Improve performance in FOO by X%.</li>
    </ul>
  </li>
  <li>How do you plan to continue with your project / proposal and within the Apache Libcloud community after GSoC?</li>
  <li>Benefits to the Free Software Community, who would gain from your project?</li>
  <li>Biography and Free Software experiences. Who are you? What makes you the best person to work on this project/proposal? What free and/or open source projects have you participated in? Please describe your contributions with references.</li>
</ul>


  </div>
</div>


      <hr />

      <footer>
        <div class="row">
          <div class="col-lg-12 text-center">
            <div class="footer-links">
  <p><a href="http://www.apache.org/licenses/">License</a> | <a
  href="/security.html">Security</a> | <a
  href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a> |
  <a href="http://www.apache.org/foundation/thanks.html">Thanks</a> |
  <a href="https://www.apache.org/events/">Events</a> |
  <a href="/credits.html">Credits</a> | <a href="/media.html">Media</a>
</div>

<div class="footer-text">
  <p><a class="acevent" data-format="wide"></a></p>
  <p class="">Copyright &copy; 2009-2023 <a href="https://www.apache.org/" target="_blank">The Apache Software Foundation</a></p>
  <p class="">Apache Libcloud, Libcloud, Apache, the Apache feather, and the Apache Libcloud project logo are trademarks of the Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
  <p class="">Site last updated on 2023-09-09 21:33:21 +0000</p>
</div>

          </div>
        </div>
      </footer>

    </div><!-- /.container -->

    <!-- JavaScript -->
    <script src='/assets/global-20157a00c0e17a775f45ed99ccdf79d7.js' type='text/javascript'></script>

    

    <script type="text/javascript">
  var _paq = window._paq = window._paq || [];
  /* tracker methods like "setCustomDimension" should be called before
"trackPageView" */
  /* We explicitly disable cookie tracking to avoid privacy issues */
  _paq.push(['disableCookies']);
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u="https://analytics.apache.org/";
    _paq.push(['setTrackerUrl', u+'matomo.php']);
    _paq.push(['setSiteId', '7']);
    var d=document, g=d.createElement('script'),
s=d.getElementsByTagName('script')[0];
    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
  })();
</script>

    <script src="https://www.apachecon.com/event-images/snippet.js"></script>

  </body>
</html>
