opensource.google.com

Menu

Posts from November 2010

Gulliver powers Lonely Planet’s Trippy travel planning apps

Tuesday, November 30, 2010

Gulliver is an open source platform from Google that helps users plan trips in real time with their friends. Using Gulliver, you can create applications for mobile, iGoogle, and mobile web platforms that make it easy to build and share itineraries using Google Maps resources and Lonely Planet recommended itinerary items.

You can use Gulliver to:
• Create, share, and sync trips between the AppEngine web application, iGoogle, and the Android application
• Create scheduled and unscheduled trips
• See Lonely Planet recommendations for hotels, activities, sights, restaurants, and more for top destinations
• Seamlessly show parallel Google results when there are no Lonely Planet results
• Rate and comment on items
• Create custom items
• On iGoogle, drag and drop items from the map into the itinerary list
• On Android phones, take photos from within the app
A fully functional consumer app has been built on the Gulliver code base: Lonely Planet’s Trippy. Trippy combines the travel expertise of Lonely Planet with the power of Google web search and Google Maps.

Trippy for iGoogle (click image to enlarge)

Trippy for mobile web (click image to enlarge)

Guilliver was created as a 20% time project, a well-known part of our philosophy and company culture which enables engineers to spend one day a week working on projects that aren't necessarily in our job descriptions. We can use the time to develop something new, or if we see something that's broken, we can use the time to fix it. And now you can take these open source apps and run with them! We’re making that possible by rolling them out to the open source community under the Apache license.

Want to get involved with Gulliver and help us make it an even better application? Join the Gulliver team! To get started, just visit our project page, join the community, and download the code.

By David Yu Chen and Alex Cuthbert, Google Gulliver 20% time team

Life after Google Summer of Code

Monday, November 29, 2010

My name is Oscar Castañeda, I am a student from Guatemala currently doing a master’s in Computer Science at Delft University of Technology (TU Delft) in The Netherlands. For the 2010 Google Summer of Code I completed a project with the Google Open Source Programs Office as my mentoring organization and professor Michel van Eeten (TUDelft) and Nitin Bhide (Founder SVNPlot) as my project mentors.

In my research I study behavior in code production for all open source projects in the Apache Software Foundation (ASF) from 2004 to 2009, and this research was the subject of my Google Summer of Code project. I contributed to SVNPlot, a tool that creates various type of graphs and statistics from Subversion logs. My contributions enable SVNPlot users and developers to generate networks of file co-authorship that can be used to study behavior in code production, like the graph below which shows code production in the Apache Hadoop community and sub-communities in 2009.

After having finished my project in August, one remaining goal I had was to give a talk about my project, so presenting at ApacheCon NA this year was a good opportunity to accomplish that task.

I was able to travel to Atlanta and attend ApacheCon thanks to sponsorship from the ASF’s Travel Assistance Committee (TAC). The experience has been outstanding and packed with lots of fun. Other students and open source enthusiasts from all over the world were also sponsored by the ASF. We assembled into what became known as the “TAC Team.” As part of the TAC Team, we were in charge of chairing conference sessions, hosting Meetups and helping out behind the scenes. Best of all, we could attend the full conference and all the fun events that followed.

For me the experience was particularly interesting because I met many of the committers that power the ASF. Having done research on how ASF developers organize into communities, attending ApacheCon allowed me to put faces to usernames several times.

My challenge at ApacheCon was to give a talk to the very people whose code production behavior I had studied. The approach I took was to practice, practice, practice.

BarCamp offered an initial ice breaker in the preparations for my talk. The unconference style of BarCamp made it easy to propose a topic to talk about for 30 minutes. I simply posted a sticky note on the white board with the title “What is Meritocracy?” As soon as my slot started I noticed that BarCamp would be an interesting experience. Rather than just a presentation, the BarCamp talk I had proposed turned into an active exchange of ideas where I received many challenging questions.

Chairing conference sessions also helped me prepare for my talk. As session chair I was introducing speakers and assisting them with time management. In addition, I was sitting in on sessions, and seeing the speakers present helped me get into the flow of speaking at a conference. I found extraordinary examples in talks on Hadoop, Tuscany, and Mahout. And finally, the day came for me to present.

I was scheduled for the first morning session in the community track. It was a pleasant surprise to see that over 30 attendees showed up for my talk. All of them were well-prepared with mugs full of coffee, ready to listen to my morning talk. And in the end I found that practice does pay off. I wasn’t nervous and felt confident giving my presentation, a feeling that was reinforced when I saw that the audience was actually awake! However, deeper into the session I lost track of time. Luckily a fellow TAC team flashed the 20 minutes card, showing me that I could finish all my slides and still leave time for questions. The slides and a recording of my talk are available for those who want to know more.

Overall the experience has been very gratifying. I met lots of interesting people and learned more about open source and new developments there from the developers themselves. I highly recommend future Google Summer of Code students to consider including presenting their project at a conference as one of their project goals.

By Oscar Castañeda, 2010 Google Summer of Code Student

Objects in mirror...

Wednesday, November 24, 2010

Nearly a year in the making, kernel.org has announced four new machines coming online in November of 2010. This is quite the change in infrastructure, covering two new "heavy lifting machines" and two new backend machines to round out kernel.org's infrastructure of 12 boxes running worldwide.

As many people know, particularly if you are reading this blog, kernel.org runs the infrastructure that the Linux Kernel community uses to develop and maintain a core piece of the operating system. That said, kernel.org provides a lot more services than just a couple of git repositories and a place to download kernel releases. It hosts the Android source, provides Internet bootable utilities and installers, one of the fastest and most comprehensive mirrors of Linux distros, a plethora of wikis, and the Linux Kernel bugzilla. It also hosts and maintains a variety of other websites that are central to the development of the Linux Kernel or to the greater Linux ecosystem.

The four new machines that have fully come online in November were donated by Google with a generous discount from HP, and they are some impressive pieces of hardware to say the least!

Mirrors1 and Mirrors2, the two machines in the United States that service mirrors.kernel.org, fully replace machines that had been in service for 5 years. The new machines live up to their names of the “heavy lifting machines” (both because they move the most data for kernel.org, but lifting 6-10u worth of equipment is actually quite heavy)! Specs for those are:

Mirrors1:
DL380 G7
2 x E5640 Intel Xeon Processors
144GB DDR3 ECC RAM
2 x MSA70 external drive chassis
2 x P812 Array controllers
66 x 300GB 10K RPM SAS drives

Mirrors2:
DL380 G6
2 x X5550 Intel Xeon Processors
144GB DDR3 ECC RAM
2 x MSA70 external drive chassis
2 x P812 Array controllers
66 x 300GB 10K RPM SAS drives

Each setup uses up 6u of space now, saving us about 4u per-setup over our old equipment, and they give us a lot more storage space and a lot more RAM to be able to handle mirroring for so many people.

We also upgraded the master backend machine for kernel.org, and took our still-awesome previous master backend and turned it into a live spare should anything ever happen to the primary machine. We added a second dynamic web infrastructure box as well, to help host the wikis and things like bugzilla, giving us an active fail over as well as a load balanced system.

With these two additional boxes coming online, kernel.org reached a milestone as we now have a redundant machine for everything currently in our inventory. We've been quite successful with the redundancy we have with our frontend facing machines, and now we have that same level of redundancy available to us on our backend machines.

master:
DL380 G6
2 x X5550 Intel Xeon Processors
32G DDR3 ECC RAM
1 x MSA60 external drive chassis
2 x P812 Array controllers
8 x 300G 10K RPM SAS drives
12 x 300G 15K RPM SAS drives

dynamic web box 2:
DL380 G6
2 x X5550 Intel Xeon Processors
32G DDR3 ECC RAM
1 x MSA60 external drive chassis
1 x P812 Array controller
8 x 300G 10K RPM SAS drives

Needless to say we can talk a lot about specs and numbers. But really, a photo is worth a thousand words:


Those are the new backend boxes hosted at OSUOSL.

Our thanks go out to Google and HP for helping make this happen, with special thanks going to
Chris DiBona of Google for making this happen, Shawn Pearce of Google for putting up with with me through all of this, and Bdale Garbee of HP for helping us get the equipment we need and being such a great friend of kernel.org for so many years!

To quote our saying on mirrors.kernel.org, “Objects in mirrors may be closer than they appear!”

By John “Warthog9” Hawley, Chief Kernel.org Administrator

Google Code-in: Contest is Open!

Monday, November 22, 2010



We’re pleased to announce that today marks the start of the Google Code-in contest. Students who are at least 13 years old and not more than 18 years old and are currently enrolled in a pre-university school on November 22, 2010 are eligible to participate. Start claiming tasks to work on for our participating mentor organizations right now.

Tasks are sorted according to organization, difficulty level, type of task, and point value. If you are considering participating, take a look at the tasks list and see what you’re interested in claiming. You can comment on the task if you have questions about the task for the organization.

For successful completion of just one task you will receive a t-shirt and certificate of participation. For every three tasks you complete you’ll receive $100, up to a maximum of $500. Our 10 contestants with the most points at the end of the contest win the Grand Prize: an all-expenses paid trip with a family member to Google’s Headquarters in Mountain View, California!

The contest ends on January 10, 2011. So don’t delay, claim a task today!

If you have questions, please review our Frequently Asked Questions and the Rules page, or take a look at the video above. You can also join our discussion list and ask your question there.

Have fun, and meet you on the list or in Mountain View!
By Carol Smith, Open Source Team

TYPO3’s Huge Summer Success

Friday, November 19, 2010

After having participated in Google Summer of Code for the second time, TYPO3 is now looking back at a truly successful summer where five students worked on projects for TYPO3 4.x, FLOW3, and TYPO3 5.0. Now that the summer has come to an end, we would like to give you an overview of the achievements our students made this summer.

Enhanced Usability for the List Module
Nuwan's proposal for the project included ideas to introduce collapsing and expanding tables in the list module by using AJAX, introducing modal dialogs for detailed information instead of the currently used pop-up windows, in-place editing, drag & drop sorting, and a quick search feature. At the end of the summer Nuwan completed all the tasks except the quick search, but added dynamic selection of columns to display on top of the planned feature set. Being completely new to TYPO3 Nuwan first struggled with current documentation, missing tutorials, and getting into TYPO3 development in general. Thanks to the help by his mentors, Thomas and Tobias, he got moving in the right direction. The feature is available as an extension and Nuwan is looking forward to finishing the missing features and providing more extensions for the core.

Generic i18n and l10n strategy for FLOW3 and TYPO3 v5
Karol reports that Google Summer of Code was a great experience, as it made him learn many new things and improved his programming skills. Looking back to his initial proposal he completed most of the tasks. Some details changed during implementation while others became harder than expected and again other tasks turned out to be easier. For more details you can take a look at Karol's weekly reports. As it looks now, Karol will also stay around with the FLOW3 project, taking further care of his project. All of Karol’s code has been integrated into FLOW3.

Enhanced Media Content Element with oEmbed
Aishwarya was not able to reach all of the goals for the enhanced media content element, but the finished ones are quite nice. It now supports oEmbed, which allows you to use a video's page URL like YouTube URLs to embed the video on a page, whereas before you needed to know the exact URL of the video file itself. For such videos the media content element will now also fetch preview thumbnails where possible. The feature is integrated in TYPO3 core and will ship with version 4.5 in January 2011.

Modular Community System
Pascal managed to create a community extension based on extbase and fluid. As he had experience with the new MVC framework for extension development he found it quite easy. Most of the basic features for a community system are implemented. However, to eventually make everything work we need to wait for two issues in extbase to be fixed. The extension is available at http://forge.typo3.org/projects/show/extension-community.

Private Resource Handling for FLOW3 / TYPO3 5.0
Andreas and his mentor Robert discussed implementing a solution for content security in general, as resources in FLOW3 are represented by persisted “Resource” objects. They came to the conclusion to first implement a solution for generic security policies for persistable objects. Andreas found a solution to automatically rewrite queries by using FLOW3's AOP mechanism so that now there is no need to explicitly write security constraints for queries to the persistence layer anymore. The publishing process is also intercepted using AOP and their publishing path is being extended by a security component to eventually protect private resources from unauthorized access. The publishing feature was finished for the FLOW3 release at T3CON10 in Frankfurt.
Looking back at what has been achieved by the students and having won new contributors for the TYPO3 project we see this year's Google Summer of Code as a huge success for TYPO3 and its community. Students come for the code, then stay for the fun and the great community. All the students passed the final evaluation, so congrats to all of them! We’d also like to express thanks to the mentors who helped the students to find their way into TYPO3 and offering a guiding hand.

By Ingo Renner, TYPO3 Google Summer of Code Mentor

Cross posted from the TYPO3 blog

A name check, no more

Monday, November 15, 2010

When we first launched Google Project Hosting back in 2006, we wanted to do what we could to encourage best practices around open source development. This was expressed in a variety of ways, one of which was tied into SourceForge’s namespace.

Here's how it used to work: people would create a project on Google Project Hosting, and if that project’s name was already in use at SourceForge, we would email that project’s administrator and ask them if it was cool to use the name again. Most of the time, the person creating the project on Google Project Hosting was the same person on SourceForge, looking to reserve the name on both.

Sometimes though, the project on SourceForge was inactive or had never been active, so we would manually approve the name on Google Project Hosting. In the last few years, it's almost always been the latter case where people want to use a name that has never been active, so we've stepped in to allocate that name to the new project leader.

Since this is, by a long shot, how most of these name arbitration requests have turned out, in the spirit of efficiency we've decided to shut down the SourceForge name check on November 22nd.

Happy hacking this Thanksgiving* and we hope you enjoy Google Project Hosting!

By Chris DiBona for the Google Project Hosting Team

Announcing Google Refine 2.0, a power tool for data wranglers

Wednesday, November 10, 2010


Our acquisition of Metaweb back in July also brought along Freebase Gridworks, an open source software project for cleaning and enhancing entire data sets. Today we’re announcing that the project has been renamed to Google Refine and version 2.0 is now available.

Google Refine is a power tool for working with messy data sets, including cleaning up inconsistencies, transforming them from one format into another, and extending them with new data from external web services or other databases. Version 2.0 introduces a new extensions architecture, a reconciliation framework for linking records to other databases (like Freebase), and a ton of new transformation commands and expressions.

Freebase Gridworks 1.0 has already been well received by the data journalism and open government data communities (you can read how the Chicago Tribune, ProPublica and data.gov.uk have used it) and we are very excited by what they and others will be able to do with this new release. To learn more about what you can do with Google Refine 2.0, watch the following screencasts:

http://www.youtube.com/watch?v=yNccGtn3Wb0 (7 min)



http://www.youtube.com/watch?v=45EnWK-fE9k (9 min)



http://www.youtube.com/watch?v=m5ER2qRH1OQ (6 min)



The project is open source and its code and downloads are available here. Changes from version 1.1 to 2.0 are listed here.

Adding Robots to Wave in a Box


Starting this past July, I had the opportunity to spend some time "Down Under" working as an intern on Google Wave. Since I had worked with Google before on building the open source software that runs the Google Summer of Code and Google Code-in, I joined the Wave open source effort this time. I was primarily focused on open sourcing the Robots API, so that non-Google wave servers could support robots for their users.


One month into my internship, Google announced its plan to discontinue developing Wave as a standalone product, however Wave technology will continue to move forward as an open source project.

The Wave open source project, renamed Wave in a Box, is aiming to become a server for hosting waves inside a small company or community. With a few extra steps you will even be able to talk to other wave servers all over the world, based on a concept called “federation.” Over the past few months the Wave in a Box team has made a lot of improvements, for instance the panel for viewing waves now supports much more of the functionality from Google Wave, and it looks better and is a lot faster too!

The Robots API has now also been included in Wave in a Box and has most of the functionality available on Google Wave. One of our example robots, Echoey, for Google Wave also works on Wave in a Box. This robot -- as the name might suggest -- echoes whatever is being typed. Due to the realtime nature of Wave, the echoing happens while you type!

Wave in a Box still has a ways to go and the future of the project is being discussed at this week’s Wave Summit in San Francisco. Keep an eye on the Wave in a Box website for videos of the sessions. If you are interested in running your own wave server or want to help make Wave in a Box better, take a look at our repository and mailing list.

Announcing Accepted Organizations for Google Code-in

Friday, November 5, 2010


We’re pleased to announce that today we have chosen 20 open source organizations to participate as mentoring organizations in Google Code-in.

Here’s a list of our participating organizations this year:

1. The Apertium Project
2. The Battle for Wesnoth
3. Debian Project
4. Dragonfly BSD
5. Drupal
6. GNOME
7. Haiku
8. KDE
9. LimeSurvey
10. MoinMoin
11. Mono Project
12. OSUOSL
13. Parrot Foundation and The Perl Foundation
14. Plone Foundation
15. RTEMS Project
16. Sahana Software Foundation
17. Tux4Kids
18. VideoLAN
19. WordPress
20. WorldForge

These organizations will be creating tasks for the student participants in the contest to work on and submit to earn prizes. We’ll be having tasks from all 8 categories in our task tracker: code, documentation, outreach, quality assurance, research, training, translation, user interface.

We encourage you to sign up now if you would like to participate in the contest! Simply visit Melange and click on “Sign In.” Log in or create a Google account, and then click on “Create Profile” on the left. Once you’ve done that you’re ready to start claiming tasks on November 22!

GitTogether ‘10 at Google

Thursday, November 4, 2010

Last week around 30 Git developers and users gathered for GitTogether ‘10 at Google’s headquarters in Mountain View, CA for three days of hacking, sharing ideas, and making plans for the future of Git and its supporting tool ecosystem. This was the third time we’ve hosted a GitTogether, and we were really excited about the turnout this year. Based on attendees’ $DAY_JOB employers, Git is becoming much more popular in commercial development organizations, demonstrating yet-again how open source can be an effective alternative to traditional propriety development methods.


Here at Google we use Git on our big open source projects like Android and Chromium OS, but also for smaller projects like Gerrit Code Review or the Eclipse Git plugin, as well as our continuing contributions to the Linux Kernel. During my last 2 years at Google, I ( Shawn) have been working on Gerrit Code Review (a web based code review system for Git), as well as maintaining and improving JGit (a pure Java reimplementation of Git). Junio C Hamano, one of the earliest Git contributors and the current Git maintainer, also joined Google last May and continues to contribute to Git as part of his job duties.

The schedule for the three day conference was determined in “unconference” style, with topics for discussion originally suggested on the wiki and later developed in-person through sticky notes posted on a white board. Attendees also took advantage of the #gittogether IRC channel on freenode and an Etherpad server hosted by the OSUOSL, allowing individuals who couldn’t make it in-person to at least have a virtual presence.


The session scheduling process

In addition to the technical discussions, we had a chance to get to know each other socially, enjoying lunches in Google cafés and dinners at some local restaurants. Unfortunately the group failed to develop a “patch of questionable value,” where in prior years Sverre wore a hat, diff learned --pirate, bash completion earned a splash screen, and git auto-upgraded itself.

Photo by Thomas Rast

by Shawn Pearce, Open Source Team

Test your app from right to left

Wednesday, November 3, 2010

Can you spot the error in the following webpage?


Unless you are one of the 56 million Internet users who read Arabic, the answer is probably no. But BidiChecker, a tool for checking webpages for errors in handling of bidirectional text, can find it:


Oops! The Arabic movie title causes the line to be laid out in the wrong order, with half of the phrase "57 reviews" on one side of it and half on the other.

As this example demonstrates, text transposition errors can occur even if your web application is entirely in a left-to-right language. If the application accepts user input or displays multilingual content, this data may be in one of the right-to-left languages, such as Arabic, Hebrew, Farsi or Urdu. Displaying right-to-left text in a left-to-right environment, or vice versa, is likely to cause text garbling if not done correctly. So most user interfaces, whether left-to-right or right-to-left, need to be able to deal with bidirectional (BiDi) text.

Handling BiDi text can be tricky and requires special processing at every appearance of potentially BiDi data in the UI. As a result, BiDi text support often regresses when a developer adds a new feature–and fails to include BiDi support in the updated code.

Called from your automated test suite, BidiChecker can catch regressions before they go live. It features a pure JavaScript API which can easily be integrated into a test suite based on common JavaScript test frameworks such as JSUnit. Here's a sample test for the above scenario:


// Check for BiDi errors with Arabic data in an English UI.
function testArabicDataEnglishUi() {



 // User reviews data to display; includes Arabic data.



 var reviewsData = [



 

 {'title': 'The Princess Bride', 'reviews': '23'},


 

 {'title': '20,000 Leagues Under the Sea', 'reviews': '17'},


 

 {'title': 'ستار تريك', 'reviews': '57'} // “Star Trek”



 ];





 // Render the reviews in an English UI.


 var app = new ReviewsApp(reviewsData, testDiv);


 app.setLanguage('English');



 app.render();







 // Run BidiChecker.



 var errors = bidichecker.checkPage(/* shouldBeRtl= */ false, testDiv);



 // This assertion will fail due to BiDi errors!



 assertArrayEquals([], errors);

}

We’ve just released BidiChecker as an open source project on Google Code, so web developers everywhere can take advantage of it. We hope it makes the web a friendlier place for users of right-to-left languages and the developers who support them.

By Jason Elbaum, Internationalization Team

2010 Google Summer of Code Mentor Summit

Tuesday, November 2, 2010

The 2010 Google Summer of Code Mentor Summit was held Saturday and Sunday, October 23rd and 24th, 2010 at Google’s headquarters (the “Googleplex”) in Mountain View, California. 230 Mentors and Organization Admins from over 120 open source projects attended the summit, once again demonstrating how productive, vibrant, and creative our community is.

The conference was organized as an "unconference," where attendees were responsible for deciding on and providing content for sessions on site. This format works very well because FOSS community members naturally seem to enjoy taking initiative to effect positive change. From organizing conference sessions, to solving logistical issues, to cleaning up conference rooms after the event, everyone helped to efficiently get things done.

The major activities of the conference can be summed up in three words: fellowship, food, and fun.

Attendees began arriving on Friday evening to the meet-and-greet party by the hotel pool, where old friendships were renewed and new ones were formed. Guests turned in relatively early though, as two very full days lay ahead...

Saturday Highlights

• Saturday morning breakfast and lunch at Charlie's Cafe at the Googleplex. Great fuel!
Saturday unconference session selection process - A surprisingly efficient way to schedule conference sessions very quickly, and with good humor.
• 56 scheduled conference sessions were interesting and well-attended. Notes from many sessions are on the Mentor Summit wiki.
• Although it was a rainy Saturday night, you would never have known it from the amount of fun we had at the hotel. Massive amounts of pizza (and quite a bit of beer) was consumed while equally impressive amounts of social and technical networking was happening at tables in the lounge, in the hot tub, and in the covered tents around the pool.
• Live musical entertainment was provided by Bart Massey, David Percy, myself, and lots of people who sat in on guitar, bass, and keyboards. Thank you all!

Sunday Highlights:

• More great sessions!
• The Google on-site store was open for business and many summit attendees loaded up with top quality swag. Android figurines proved to be extremely popular this year.
• A guided tour of the Googleplex.
• We received our 2010 Mentor Summit t-shirts!
• The summit wrap-up session was built around the question "How can we make the Mentor Summit better?" Many interesting suggestions were discussed during this introspective, conversational talk, and will no doubt be incorporated into future mentor summits.

Some unusual, but very popular summit sessions:

• A chocolate session was presented by Robert Kaye of MusicBrainz. This mouth-watering session included massive amounts of chocolate combined with stimulating discussion of the many merits and uses of this wonderful confection.
• An Advanced Trolling Session, presented by Bart Massey, Jonathan "Duke" Leto, and Selena Deckelmann, explored the fine art of trolling, complete with live examples, and demonstrations of how to deflect, defeat, or subvert trolls, while protecting the host venue. This session was great fun with a serious message.

Some things we learned about ourselves:

• We are part of an incredibly energetic and self-motivated community.
• Given minimal structure we are able to create a productive and enjoyable event.
• There is magic in getting together so many passionate, productive FOSS community members in one place, and allowing them the space to network and create together.
• We can squeeze a lot of practical work and good fun into just two days.
• We are always looking to improve, and given the opportunity we can create solutions and invent better ways of doing things.
• One attendee described the mentor summit as "a rare place where pretty much everybody understands what you're talking about when you discuss code and community."

Major Thanks:

• To the Google Open Source Programs Office for providing the venue, meals, travel reimbursements, and local transportation for the weekend. Special thanks go out to Carol Smith and Cat Allman for all the energy and care they put into the event.
• To OSUOSL for for ongoing hosting of the Google Summer of Code Wiki and setting up an EtherPad instance for note taking use during the conference!
• To the organization Mentors and Admins who attended for making this another productive Mentor Summit!
• To everyone who has supported Google Summer of Code through the years -- you have made a big difference countless ways!

We’re already looking forward to next year!

By Marty Connor, Corporate Operations Engineering team
.