Friday, May 11, 2012

[Gd] Fridaygram: App Engine search, rock-tossing chimp, man vs. beast

| More

Google Developers Blog: Fridaygram: App Engine search, rock-tossing chimp, man vs. beast

Author Photo
By Scott Knaster, Google Developers Blog Editor

Google App Engine has a well-deserved reputation for regularly adding cool new features and other improvements. This week the team launched full-text search, which has been a hotly desired feature since the earliest days of App Engine. The new App Engine Search API enables you to search documents using lots of options, including searching specific fields and creating results snippets. At Google, it’s always fun to build new frontiers in search.

The App Engine Search API is a powerful tool indeed, but it probably couldn't defend you against an aggressive chimp that likes to gather and throw stones. The chimp in question, Santino, has apparently been gathering stones for years and then throwing them at intruders. Scientists have debated whether Santino is actually planning for upcoming tantrums when collecting stones. After years of close observation, researchers still disagree on whether Santino is a premeditated stone-thrower. But there is plenty of fascinating evidence, such as Santino stashing his stones beneath piles of hay where nobody will see them. Cat out of the bag, Santino?

Finally, we direct you to this remixed video of a different, stone-free interspecies confrontation. It's weird and funny, and it has special effects – what more could you want? It's a perfect way to spend a minute and ten seconds of your Friday or weekend.


Each week we publish Fridaygram, a post with cool Google and non-Google stuff you might have missed during the week. Fridaygram items aren't necessarily related to developer topics; they’re just interesting to us nerds. As for moving from App Engine Search to Santino the plotting chimp, we’re just trying to maintain our practice of tortured transitions.
URL: http://googledevelopers.blogspot.com/2012/05/fridaygram-app-engine-search-rock.html

[Gd] Pricing plan announced for Google Cloud SQL

| More

Google Developers Blog: Pricing plan announced for Google Cloud SQL

Author Photo
By Joe Faith, Product Manager

Google Cloud SQL provides a fully managed database service for Google App Engine applications. Hosted on Google's infrastructure and based on the familiar MySQL database, Google Cloud SQL automatically provisions and maintains your databases, allowing you to focus on your applications and services.

In March, we were delighted to welcome our 10,000th developer on Google Cloud SQL, joining businesses like Daffodil, who halved their development time by building on Google's platform.

Since the preview launch in October 2011, we’ve been busy working on improving the performance, adding features like scheduled backups, and multihoming to increase availability and improve performance. We are also now offering more powerful instances with up to 4GB of RAM. Today, we are announcing our pricing, with two options to choose from:
  • For developers who want to try out the service, or who have lightweight applications, we offer a flexible "per use" pricing scheme. For example, you can get started with a cloud hosted MySQL database for around a dollar per month. You pay for just what you use.
  • For developers with more traffic, there are package plans that are more economical and help you predict your costs in advance.
We will not start charging for the service until June 12th. Full details of the pricing plans are available here: https://developers.google.com/cloud-sql/docs/billing

Google Cloud SQL is currently in limited preview. If you want to give us a try, start here: https://developers.google.com/cloud-sql/.


Joe Faith is a Product Manager on the Google Cloud Team. In a previous life he was a researcher in machine learning, bioinformatics, and information visualization, and was founder of charity fundraising site Fundraising Skills.

Posted by Scott Knaster, Editor
URL: http://googledevelopers.blogspot.com/2012/05/pricing-plan-announced-for-google-cloud.html

[Gd] Dev Channel Update

| More

Chrome Releases: Dev Channel Update

The Dev channel has been updated to 20.0.1132.3 for Windows, Mac, Linux, and Chrome Frame. This build contains update for several fixes. Full details about what changes are in this build are available in the SVN revision log. Interested in switching release channels? Find out how. If you find a new issue, please let us know by filing a bug.

Dharani Govindan
Google Chrome
URL: http://googlechromereleases.blogspot.com/2012/05/dev-channel-update_11.html

[Gd] Dev Channel Updates for Chromebooks

| More

Chrome Releases: Dev Channel Updates for Chromebooks

The Dev channel has been updated to 20.0.1132.1 (Platform versions: 2268.0.0) for Chromebooks (Acer AC700 , Samsung Series 5, and Cr-48).

This build contains a number of new features, as well as security & stability improvements. Some highlights of these changes are:

  • Bluetooth support for keyboards and mice on Acer Chromebooks. Currently Magic Mouse and Magic Trackpad are currently unsupported.
  • New PKCS #11 library (Chaps) to provide TPM-backed cryptographic services
  • Improvements to Enterprise Network configuration

Known issues:
  • 126079: Problem switching between tabs - new tab goes blank. Workaround: Reload page
  • 126794: Facebook.com photo uploading and Yahoo mail attachment fails
  • 126843: Flash fails to record audio
  • 126338: CWS apps/themes categories do not expand/collapse properly (UI issue)


If you find new issues, please let us know by visiting our help site or filing a bug. Interested in switching channels? Find out how. You can submit feedback using ‘Report an issue’ under the wrench menu.

Josafat Garcia
Google Chrome
URL: http://googlechromereleases.blogspot.com/2012/05/dev-channel-updates-for-chromebooks_11.html

[Gd] Insider Tips for Using Apps Script and Spreadsheets

| More

Google Apps Developer Blog: Insider Tips for Using Apps Script and Spreadsheets

My role in Google Docs is to help manage many projects across Google Docs/Drive. As a part of my job, I ask for a fair amount of data from all of those teams and generate reports on project/feature status. To make this much simpler for everyone involved, I have created a lot of simple tools using Google Spreadsheets and Apps Script (as well as a lot of complex tools) that make it easier for collaborators to enter data and for me to collect that data and create reports. Below is a pair of foundational techniques that I include in nearly every Spreadsheet/Apps Script tool I build.

Load Settings From a Configuration Sheet

I have a dozens of scripts generating reports. I use a technique where I set up a dedicated sheet for script configuration and read values from the sheet during script execution. A simple configuration sheet makes this much more straightforward.

With a globally accessible array, globals, you can then load the “settings” from the configuration (sheet SHT_CONFIG, here) at any entrypoint to the script.


// globally accessible variables
var SHT_CONFIG = 'Config';
var globals = new Array();

function entryPoint() {
globals = (globals.length == 0) ? LoadGlobals(
SpreadsheetApp.getActive(), SHT_CONFIG)
: globals;
// your code goes here
}

The LoadGlobals function, below, parses the data in the first three columns of the workbook and sheet name passed to it. You can even include a fourth column (or more!) explaining what the variables do, and they’ll just be ignored - though hopefully not by your users!


// Generate gloabal variables to be loaded into globals array
function LoadGlobals_(wb, configSheet) {
var configsheet = wb.getSheetByName(configSheet);
var tGlobals = new Array();

// Config data is structured as VARIABLE, ISARRAY, VALUE(S)
// and includes that as the header row
var cfgdata = configsheet.getDataRange().getValues();
for (i = 1; i < cfgdata.length; i++) {
switch (cfgdata[i][1]) {
case 'ARRAY':
// treat as an array - javascript puts a null value in the
// array if you split an empty string...
if (cfgdata[i][2].length == 0) {
tGlobals[cfgdata[i][0]] = new Array();
} else {
tGlobals[cfgdata[i][0]] = cfgdata[i][2].split(',');
}
break;
// Define your own YOURDATATYPE using your customTreatment function (or
// just perform the treatment here)
case 'YOURDATATYPE':
tGlobals[cfgdata[i][0]] = customTreatment(cfgdata[i][2]);
break;
default: // treat as generic data (string)
tGlobals[cfgdata[i][0]] = cfgdata[i][2];
}
}
return tGlobals
}

As long as you’ve loaded the global values during the script execution, you can refer to any of the values with, for example, globals.toList. For instance:


function getToList() {
return globals.toList.join(‘,’);
// or
return globals[‘toList’].join(‘,’);
}

Stop Worrying About Column Numbers

Asking colleagues to enter tracking data so they don’t have to report their own statuses is one thing. Asking them to enter tracking data in a specific format, within a specific column layout, in a way that doesn’t mesh with their existing processes is entirely different. So, I use the following technique, where I rely on column names and not column ordering. The code below lets me do just that by fetching a key-value object for column headings and their position in a worksheet.


// Returns key-value object for column headings and their column number.
// Note that these are retrieved based on the array index, which starts at 0
// the columns themselves start at 1...
// pass header row of data (array) and an array of variables/column names:
// eg: BUG_COL_ARRAY['id'] = 'Id';
function ColNumbers(hArray, colArray) {
for (oname in colArray) {
this[oname] = getColIndex(hArray, colArray[oname]);
}
}

// -----------------------------------------------------------------------------
function getColIndex(arr, val) {
for ( var i = 0; i < arr.length; i++) {
if (arr[i].toLowerCase() == val.toLowerCase()) {
return i;
}
}
return -1;
}

With the associative array defined, below, I can ask Apps product managers to add (or rename) columns to their feature tracking sheets and then extract features from every apps product team in one fell swoop (a future post). Each product team can set their columns up in whatever order works best for them.


// key columns in the app feature sheets
var COLS_KEYAPPCOLS = new Array();
COLS_KEYAPPCOLS[‘feature’] = ‘Feature Title’;
COLS_KEYAPPCOLS[‘desc’] = ‘Description’;
COLS_KEYAPPCOLS[‘visible’] = ‘Visible’;
COLS_KEYAPPCOLS[‘corp’] = ‘Corp Date’;
COLS_KEYAPPCOLS[‘prod’] = ‘Prod Date’;

What does this do for me, really? I reuse this code for every project of this sort. The steps to reuse are then:

  1. Include the code
  2. Build the associative array
  3. Create a new ColNumbers object, as below

var curFeatures = curSheet.getDataRange().getValues();
var curCols = new ColNumbers(curFeatures[0], COLS_KEYAPPCOLS);

I can, from now on, refer to the Description column using something like curCols.desc when referencing any of the products’ data. The Spreadsheets team may list new feature descriptions in the second column, and the Documents team may list new feature descriptions in the fourth column. I no longer worry about that.

As a bonus, I can define the columns and ordering to be used in a report in my config sheet (see above). If I’ve defined reportcols as feature, desc, prod in my config sheet, I can generate a report very simply:


// Iterate through the rows of data, beginning with 1 (0 is the header)
for ( var fnum = 1; fnum < curFeatures.length; fnum++) {
// Iterate through each of the fields defined in reportcols
for ( var cnum = 0; cnum < globals.reportcols.length; cnum++) {
outputvalue = curFeatures[fnum][curCols[globals.reportcols[cnum]]];
// outputvalue is what you want to put in your report.
}
}

You could do that a lot more simply, but if we want to use the ‘Corp Date’ I only need to change the value in the config sheet to feature, desc, corp and I’m done - you’d have to change the code.

Collecting and crunching data in a Google Spreadsheet becomes a lot easier if you use Apps Script. Trust me, it makes your life a lot easier. Try it now by copying this spreadsheet



Keith Howson  

Editor’s Note: Keith is a Technical Program Manager with the Google Docs teams. He is a heavy user of Apps Scripts and Spreadsheets, and leverages the two to help the Docs teams run at full steam. He also just completed his first triathlon with Team in Training, to raise money for the Leukemia and Lymphoma Society - Go TEAM!


URL: http://googleappsdeveloper.blogspot.com/2012/05/insider-tips-for-using-apps-script-and.html

Thursday, May 10, 2012

[Gd] Cloud SQL: pick the plan that fits your app

| More

Google App Engine Blog: Cloud SQL: pick the plan that fits your app

One of the most requested additions to the Google App Engine platform has been a SQL database, and more than 10,000 developers have signed up for the Google Cloud SQL service since the preview launch last October. Google Cloud SQL automatically provisions and maintains your databases, allowing you to focus on your applications and services.




Since launch, we’ve been busy working on improving the performance, and adding features like scheduled backups and multihoming to increase availability and improve performance. We are also now offering more powerful instances with up to 4GB of RAM. 


Today we are announcing our pricing, which will take effect on June 12th with two options to choose from:



  • For developers who want to try out the service, or who have lightweight applications - we offer a flexible “per use” pricing scheme. For example, you can get started with a cloud hosted MySQL database for around a dollar per month. You pay for just what you use.



  • For developers with more traffic, there are packages that offer a discount and help you predict your costs in advance.



Google Cloud SQL is currently in limited preview. If you want to give us a try, start here https://developers.google.com/cloud-sql/.

Posted by Joe Faith on behalf of the Google Cloud SQL team
URL: http://googleappengine.blogspot.com/2012/05/cloud-sql-pick-plan-that-fits-your-app.html

[Gd] New Google Analytics Easy Dashboard Library

| More

Google Developers Blog: New Google Analytics Easy Dashboard Library

Jeetendra
Nick
By Jeetendra Soneja and Nick Mihailovski,
Google Analytics API Team


Many developers save time by using the Google Analytics API to automate Analytics reporting tasks. For example, you can use the API to create a dashboard to report data across multiple profiles. The Google Analytics Apps Gallery includes many 3rd party solutions that do this.

What if you want to build something quickly that’s custom-tailored to your business? You would typically have to spend time learning the API, figuring out how to handle authorization, then deciding how to integrate this data with a visualization library. You could build a custom solution, but it would take a lot of effort – until now, thanks to the Google Analytics Easy Dashboard Library.

Four months ago we started a project with a team of University of California Irvine students to simplify all of these steps. As part of this project, together we built the Google Analytics Easy Dashboard Library. This library makes it easy to use the Google Analytics API by distilling the process into three easy steps:
  1. Register with Google APIs Console.
  2. Copy and paste the JavaScript code.
  3. Configure this code to query your data and choose a chart type to visualize it.
So now you can create custom Google Analytics dashboards very quickly, with minimal code.

Here’s a quick example. Say you want to create a line chart plotting visitors and visits for the last 30 days. Besides including the library, the only code required is:

<div id="chart1"></div>
<script>
var chart1 = new gadash.Chart({
'type': 'LineChart',
'divContainer': 'chart1',
'last-n-days':30,
'query': {
'ids': TABLE_ID,
'metrics': 'ga:visitors,ga:visits,ga:pageviews',
'dimensions': 'ga:date',
'sort': 'ga:date'
},
'chartOptions': {
hAxis: {title:'Date'},
vAxis: {title:'Visits'},
}
}).render();
</script>

Using the code above will create the following chart.

Analytics chart

It’s that easy! To find out more about using the Easy Dashboard Library, read our Getting Started guide.

While the current library is very useful, we think we can add more features and make it even easier to use. To reach this goal, we’ve started working with another group of UC Irvine students, this time for three academic quarters. This new project's main goal will be to further simplify the library. We want the students we're working with to engage with you and implement your feature requests, if possible. If you use this library, we'd love to hear how you think it can be improved. Feel free to send any feedback to through our new GA-easy-dash-feedback Google Group.

We hope this library saves you time and helps you get more out of Google Analytics.


Jeetendra Soneja is the Technical Engineering Lead on the Google Analytics API team. He's a big fan of cricket – the game, that is. :)

Nick Mihailovski is a Senior Developer Programs Engineer working on the Google Analytics API. In his spare time he likes to travel around the world.


Posted by Scott Knaster, Editor
URL: http://googledevelopers.blogspot.com/2012/05/new-google-analytics-easy-dashboard.html

[Gd] Sorting and Filtering Results in Custom Search

| More

Google Custom Search: Sorting and Filtering Results in Custom Search

Using Custom Search Engine (CSE), you can create rich search experiences that make it easier for visitors to find the information they’re looking for on your site. Today we’re announcing two improvements to sorting and filtering of search results in CSE.

First, CSE now supports UI-based results sorting, which you can enable in the Basics tab of the CSE control panel. Once you’ve updated the CSE element code on your site, a “sort by” picker will become visible at the top of the results section.


By default CSE supports sorting by date and relevance. In the control panel, you can specify additional “sort by” keys that are based on the structure of your site’s content, giving users more options to find the results that are most relevant to them. For example, if you’ve marked up pages for product rich snippets, you could enable sorting based on price as shown below:


Second, we’re introducing compact queries for filtering by attribute. Currently you can issue a query like
[more:pagemap:product-description:search more:pagemap:product-description:engine]
which will only show pages with a ‘product-description’ attribute that contains both ‘search’ and ‘engine’. With a compact query, you can issue the same request as:
[more:p:product-description:search*engine]

We hope these new features help you create richer and more useful search experiences for your visitors. As always, if you have any questions or feedback please let us know via our Help Forum.

Posted by Roger Wang, Software Engineer
URL: http://googlecustomsearch.blogspot.com/2012/05/sorting-and-filtering-results-in-custom.html

[Gd] Beta Channel Update

| More

Chrome Releases: Beta Channel Update

The Beta channel has been updated to 19.0.1084.46 for Windows, Mac, Linux, and Chrome Frame. 

Take a look at the changelog to see what happened in this release.

If you'd like to get on the Beta channel, you can download it from our Beta download page. If you find a new issue, please let us know by filing a bug.

Anthony Laforge
Google Chrome
URL: http://googlechromereleases.blogspot.com/2012/05/beta-channel-update_09.html

[Gd] Beta Channel Update

| More

Chrome Releases: Beta Channel Update

The Beta channel has been updated to 19.0.1084.46 for Windows, Mac, Linux, and Chrome Frame. 

Take a look at the changelog to see what happened in this release.

If you'd like to get on the Beta channel, you can download it from our Beta download page. If you find a new issue, please let us know by filing a bug.

Anthony Laforge
Google Chrome
URL: http://googlechromereleases.blogspot.com/2012/05/beta-channel-update_09.html

Wednesday, May 9, 2012

[Gd] Using DialogFragments

| More

Android Developers Blog: Using DialogFragments

[This post is by David Chandler, Android Developer Advocate — Tim Bray]

Honeycomb introduced Fragments to support reusing portions of UI and logic across multiple activities in an app. In parallel, the showDialog / dismissDialog methods in Activity are being deprecated in favor of DialogFragments.

In this post, I’ll show how to use DialogFragments with the v4 support library (for backward compatibility on pre-Honeycomb devices) to show a simple edit dialog and return a result to the calling Activity using an interface. For design guidelines around Dialogs, see the Android Design site.

The Layout

Here’s the layout for the dialog in a file named fragment_edit_name.xml.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/edit_name"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:orientation="vertical" >

<TextView
android:id="@+id/lbl_your_name" android:text="Your name"
android:layout_width="wrap_content" android:layout_height="wrap_content" />

<EditText
android:id="@+id/txt_your_name"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:inputType=”text”
android:imeOptions="actionDone" />
</LinearLayout>

Note the use of two optional attributes. In conjunction with android:inputType=”text”, android:imeOptions=”actionDone” configures the soft keyboard to show a Done key in place of the Enter key.

The Dialog Code

The dialog extends DialogFragment, and since we want backward compatibility, we’ll import it from the v4 support library. (To add the support library to an Eclipse project, right-click on the project and choose Android Tools | Add Support Library...).

import android.support.v4.app.DialogFragment;
// ...

public class EditNameDialog extends DialogFragment {

private EditText mEditText;

public EditNameDialog() {
// Empty constructor required for DialogFragment
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_edit_name, container);
mEditText = (EditText) view.findViewById(R.id.txt_your_name);
getDialog().setTitle("Hello");

return view;
}
}

The dialog extends DialogFragment and includes the required empty constructor. Fragments implement the onCreateView() method to actually load the view using the provided LayoutInflater.

Showing the Dialog

Now we need some code in our Activity to show the dialog. Here is a simple example that immediately shows the EditNameDialog to enter the user’s name. On completion, it shows a Toast with the entered text.

import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
// ...

public class FragmentDialogDemo extends FragmentActivity implements EditNameDialogListener {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
showEditDialog();
}

private void showEditDialog() {
FragmentManager fm = getSupportFragmentManager();
EditNameDialog editNameDialog = new EditNameDialog();
editNameDialog.show(fm, "fragment_edit_name");
}

@Override
public void onFinishEditDialog(String inputText) {
Toast.makeText(this, "Hi, " + inputText, Toast.LENGTH_SHORT).show();
}
}

There are a few things to notice here. First, because we’re using the support library for backward compatibility with the Fragment API, our Activity extends FragmentActivity from the support library. Because we’re using the support library, we call getSupportFragmentManager() instead of getFragmentManager().

After loading the initial view, the activity immediately shows the EditNameDialog by calling its show() method. This allows the DialogFragment to ensure that what is happening with the Dialog and Fragment states remains consistent. By default, the back button will dismiss the dialog without any additional code.

Using the Dialog

Next, let’s enhance EditNameDialog so it can return a result string to the Activity.

import android.support.v4.app.DialogFragment;
// ...
public class EditNameDialog extends DialogFragment implements OnEditorActionListener {

public interface EditNameDialogListener {
void onFinishEditDialog(String inputText);
}

private EditText mEditText;

public EditNameDialog() {
// Empty constructor required for DialogFragment
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_edit_name, container);
mEditText = (EditText) view.findViewById(R.id.txt_your_name);
getDialog().setTitle("Hello");

// Show soft keyboard automatically
mEditText.requestFocus();
getDialog().getWindow().setSoftInputMode(
LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditText.setOnEditorActionListener(this);

return view;
}

@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (EditorInfo.IME_ACTION_DONE == actionId) {
// Return input text to activity
EditNameDialogListener activity = (EditNameDialogListener) getActivity();
activity.onFinishEditDialog(mEditText.getText().toString());
this.dismiss();
return true;
}
return false;
}
}

For user convenience, we programmatically focus on the EditText with mEditText.requestFocus(). Alternatively, we could have used the <requestFocus/> tag in the layout XML to do this; however, in some cases it’s preferable to request focus programmatically. For example, an OnFocusChangeListener added in the Fragment’s onCreateView() method won’t get called if you request focus in the layout XML.

If the user focuses on an EditText, the soft keyboard will automatically appear. In order to force this to happen with our programmatic focus, we call getDialog().getWindow().setSoftInputMode(). Note that many Window operations you might have done previously in a Dialog can still be done in a DialogFragment, but you have to call getDialog().getWindow() instead of just getWindow(). The resulting dialog is shown on both a handset and tablet (not to scale):

The onEditorAction() method handles the callback when the user presses the Done key. It gets invoked because we’ve set an OnEditorActionListener on the EditText. It calls back to the Activity to send the entered text. To do this, EditNameDialog declares an interface EditNameDialogListener that is implemented by the Activity. This enables the dialog to be reused by many Activities. To invoke the callback method onFinishEditDialog(), it obtains a reference to the Activity which launched the dialog by calling getActivity(), which all Fragments provide, and then casts it to the interface type. In MVC architecture, this is a common pattern for allowing a view to communicate with a controller.

We can dismiss the dialog one of two ways. Here we are calling dismiss() within the Dialog class itself. It could also be called from the Activity like the show() method.

Hopefully this sheds some more light on Fragments as they relate to Dialogs. You can find the sample code in this blog post on Google Code.

References for learning more about Fragments:

URL: http://android-developers.blogspot.com/2012/05/using-dialogfragments.html

[Gd] Experience Google I/O 2012 anywhere

| More

Google Developers Blog: Experience Google I/O 2012 anywhere

Dylin
Robert
By Robert Do and Dylin Martin, Google I/O Team

In 2011, Google I/O hosted 5,500 developers from 65 countries in San Francisco, but this audience was dwarfed by the more than 1 million developers from 161 countries tuning in via livestream. Next month developers worldwide will come together for three days of coding, sharing and inspiration in this year’s keynotes, sessions and Sandbox demos. And if you’re not joining us in person on June 27-29, this year’s I/O Extended and I/O Live will be even bigger and better, with more I/O Extended locations and more sessions streamed live.

Get together locally: I/O Extended

With I/O Extended, organizers can take the reins and use the momentum behind Google I/O to bring people together. If you’re interested in hosting an event, check out our planning site here. Otherwise, wherever you are, chances are good that there's a community of passionate developers like you already gathering at an I/O Extended event. Find a location near you and RSVP to let us know you’re coming!


I/O Extended 2011 in many cities

Watch sessions live online: I/O Live

Can’t make it to an I/O Extended location? Or feel like staying in with pizza and beer? Bring the party to you with I/O Live, where the keynote and select sessions will be livestreamed on June 27-28. Bookmark developers.google.com/io where we’ll be posting the livestream schedule, as well as the video feed.

This year we’ve doubled the number of sessions that will be streamed, and we will be featuring 4 channels of programming. All sessions, including those not livestreamed, will be recorded and will be available online within 48 hours.

For more info on I/O Extended and I/O Live, keep an eye on the usual places: the Google I/O site, this blog, and +Google Developers.


Robert Do is an Associate Product Marketing Manager on the Developer Marketing Team. He works on helping developers find the tools they need on https://developers.google.com. He also produces hip hop music.

Dylin Martin works with the Developer Marketing and Developer Relations Teams on Google I/O.

Posted by Scott Knaster, Editor
URL: http://googledevelopers.blogspot.com/2012/05/experience-google-io-2012-anywhere.html

[Gd] Going beyond the basics: putting Drive features to work at Lucidchart

| More

Google Apps Developer Blog: Going beyond the basics: putting Drive features to work at Lucidchart

Editor’s note: This is a guest post by Ben Dilts, CTO & Co-founder of Lucidchart.
-- Steve Bazyl

The release of Drive SDK allowing deep integration with Google Drive shows how serious Google is about making Drive a great platform for third parties to develop.

There are a handful of obvious ways to use the SDK, such as allowing your users to open files from Drive in your application, edit them, and save them back. Today, I'd like to quickly cover some less-obvious uses of the Drive API that we’re using at Lucidchart.

Automated Backups

Applications have the ability to create new files on Google Drive. This is typically used for content created by applications. For example, an online painting application may save a new PNG or JPG to a user's Drive account for later editing.

One feature that Lucidchart has long provided to its users is the ability to download their entire account's content in a ZIP file, in case they (or we!) later mess up that data in some way. These backups can be restored quickly into a new folder by uploading the ZIP file back to our servers. (Note: we’ve never yet had to restore a user account this way, but we provided it because customers said it was important to them.)

The problem with this arrangement is that users have to remember to do regular backups, since there's no way for us to automatically force them to download a backup frequently and put it in a safe place. With Google Drive, we now have access to a reliable, redundant storage mechanism that we can push data to as often as we would like.

Lucidchart now provides automated backups of these ZIP files to Google Drive on a daily or weekly basis, using the API for creating new files on Drive.

Publishing Content

Another use for the files.create call is to publish finished content. Lucidchart, like most applications, stores its editable files in a custom format. When a user completes a diagram or drawing, they often download it as a vector PDF, image, or Microsoft Visio file to share with others.

Lucidchart is now using the create file API to export content in any supported format directly to a user's Google Drive account, making it easy to sync to multiple devices and later share those files.

Indexable Text

Google Drive can't automatically index content created by Lucidchart, or any other application that saves data in a custom format, for full-text search. However, applications now have the ability to explicitly provide HTML content to Google Drive that it can then index.

Indexable text provided to the Drive API is always interpreted as HTML, so it is important to escape HTML entities. And if your text is separated into distinct pieces (like the text in each shape in Lucidchart), you can improve full-text phrase searching by dividing your indexable text into one div or paragraph element per piece. Both the files.create and files.update calls provide the ability to set indexable text.

We hope that this overview helps other developers implement better integrations into the Google Drive environment. Integrating with Drive lets us provide and improve a lot of functionality that users have asked for, and makes accessing and using Lucidchart easier overall. We think this is a great result both for users and web application developers and urge you to check it out.


Ben Dilts

Ben is the co-founder and CTO of Lucidchart, an online diagramming application built in HTML5 that features real-time collaboration. Previously, he was CTO of Zane Benefits where he led the development of an online health benefits administration platform which was featured on the front page of The Wall Street Journal. Ben holds a BS in Computer Science from Brigham Young University.

URL: http://googleappsdeveloper.blogspot.com/2012/05/going-beyond-basics-putting-drive.html

[Gd] Dev Channel Update

| More

Chrome Releases: Dev Channel Update

The Dev channel has been updated to 20.0.1130.1 for Windows, Mac, Linux, and Chrome Frame. This build contains update for V8 - 3.10.8.4 and several stability fixes. Full details about what changes are in this build are available in the SVN revision log. Interested in switching release channels? Find out how. If you find a new issue, please let us know by filing a bug.

Dharani Govindan
Google Chrome
URL: http://googlechromereleases.blogspot.com/2012/05/dev-channel-update_08.html

[Gd] Looking for search? Find it on Google App Engine

| More

Google App Engine Blog: Looking for search? Find it on Google App Engine

For almost as long as we can remember, full text search has been one of the top feature requests for Google App Engine. Since our talk at Google I/O last year, we’ve been hard at work getting search ready for our developers, and today we’re happy to announce that we are making it available as an Experimental feature.


The Search API, like many other features of Google App Engine, allows you to take advantage of parts of Google’s infrastructure to add full text search to your application. This release includes a host of features including searching specific fields and ranges as well as more advanced features like scoring and snippeting. Whether you want to index products and search price ranges or just match keywords over articles and comments, the Search API is ready for you to test drive.

To help you start integrating search into your application, we’ve created a sample application and walkthrough and documented our known issues. We are extending a limited free quota for testing during our Experimental period.

As always, we’re grateful to all of our trusted testers for their patience and feedback in preparation for this launch, and we look forward to your feedback on the groups. Happy searching (and finding)!


- Posted by the Google App Engine Full Text Search Team
URL: http://googleappengine.blogspot.com/2012/05/looking-for-search-find-it-on-google.html

[Gd] Sorting and Filtering Results in Custom Search

| More

Official Google Webmaster Central Blog: Sorting and Filtering Results in Custom Search

Webmaster level: All

Using Custom Search Engine (CSE), you can create rich search experiences that make it easier for visitors to find the information they’re looking for on your site. Today we’re announcing two improvements to sorting and filtering of search results in CSE.

First, CSE now supports UI-based results sorting, which you can enable in the Basics tab of the CSE control panel. Once you’ve updated the CSE element code on your site, a “sort by” picker will become visible at the top of the results section.


By default CSE supports sorting by date and relevance. In the control panel, you can specify additional “sort by” keys that are based on the structure of your site’s content, giving users more options to find the results that are most relevant to them. For example, if you’ve marked up pages for product rich snippets, you could enable sorting based on price as shown below:


Second, we’re introducing compact queries for filtering by attribute. Currently you can issue a query like
[more:pagemap:product-description:search more:pagemap:product-description:engine]
which will only show pages with a ‘product-description’ attribute that contains both ‘search’ and ‘engine’.

With a compact query, you can issue the same request as:
[more:p:product-description:search*engine]

We hope these new features help you create richer and more useful search experiences for your visitors. As always, if you have any questions or feedback please let us know via our Help Forum.

Posted by Roger Wang, Software Engineer
URL: http://googlewebmastercentral.blogspot.com/2012/05/sorting-and-filtering-results-in-custom.html

Tuesday, May 8, 2012

[Gd] Apps Script Dashboard and Quotas

| More

Google Apps Developer Blog: Apps Script Dashboard and Quotas

Apps Script developers have consistently expressed the need to monitor the health of various Apps Script services. Additionally, at every forum, event, hackathon or hangout, we have heard you express a need to know and understand the quota limits in Apps Script.

Apps Script Dashboard is born!

We heard your message loud and clear, so we started working on a dashboard for Apps Script. Today, we are launching the Google Apps Script Dashboard. This experimental dashboard can be used to monitor the health of 10 major services. It also provides a detailed view into the quota restrictions in Apps Script.

Features of the Apps Script Dashboard

  1. The dashboard offers a view into past and present states of 10 major Apps Script services. The past view goes back one week.
  2. Each Apps Script service has three states on the dashboard: Normal Service, Known Issues and Investigating.
  3. The Known Issues state signals that we know about the issues in that service and are working to fix them.
  4. Quotas are displayed for three different types of user accounts: Consumer accounts (for example @gmail.com accounts), Google Apps (free) accounts, and Google Apps for Business, EDU and Government accounts.

Interesting Facts About Quotas

Did you know that consumer accounts (for example @gmail.com accounts) have quota of 1 hour of CPU time per day for executing triggers? Imagine the extent of automation that can happen for each user with triggers. And how about 20,000 calls to any external APIs. Now that packs in a lot of 3rd party integration with the likes of Salesforce.com, Flickr, Twitter and other APIs. So, if you are thinking of building extensions in Google Apps for your product, then don’t forget to leverage the UrlFetch Service which has OAuth built-in. Event managers can create 5,000 calendar events per day and SQL aficionados get 10,000 JDBC calls a day.

Check out the Dashboard for more.



Saurabh Gupta profile | twitter | blog

Saurabh is a Developer Programs Engineer at Google. He works closely with Google Apps Script developers to help them extend Google Apps. Over the last 10 years, he has worked in the financial services industry in different roles. His current mission is to bring automation and collaboration to Google Apps users.


URL: http://googleappsdeveloper.blogspot.com/2012/05/apps-script-dashboard-and-quotas.html

[Gd] Navigation, Dashboard and Home page

| More

Official Google Webmaster Central Blog: Navigation, Dashboard and Home page

Webmaster level: All

After announcing Webmaster Tools spring cleaning earlier this quarter, it’s time to do the job. There are a few changes coming along: an updated navigation, revamped dashboard, and a compact view for the home page site-list.

Here's the new sample Webmaster Tools Dashboard for www.example.com

We’ve regrouped the features in Webmaster Tools to create an improved navigation structure (shown on the left-hand side of the above image). We distinguished the following groups: Configuration, Health, Traffic and Optimization. Each group represents a related set of functionality:
  • Configuration: Things you configure and generally don’t change very often.
  • Health: Where you look to make sure things are OK.
  • Traffic: Where you go to understand how your site is doing in Google search, who’s linking to you; where you can explore the data about your site.
  • Optimization: Where you can find ideas to enhance your site, which enables us to better understand and represent your site in Search and other services.

If you have a moment, please take time to familiarize yourself with the new Webmaster Tools navigation. Some features were slightly renamed, such as HTML Suggestions became HTML Improvements, however the functionality remains the same.

Hoping you’ll find the new navigation useful, we also think you’ll like the new Dashboard. At the top of the Dashboard you can see recent, important, prioritized messages regarding your site. Just below that, you’ll find another section which provides a brief summary of the current status of your site. There are three widgets displayed: Crawl Errors, Search Queries and Sitemaps each representing a different navigation group: Health, Traffic and Optimization (respectively). We know your time is valuable. With the new Dashboard, we've surfaced more messages and charts to let you see how your site is doing at a glance. Take a quick look before diving into the details

Finally, those of you who manage a large number of sites can choose to view your site-list in a 'Compact' layout, without the large site-preview thumbnails. Don't worry, if you want the more expanded layout you can always switch back.

Compact layout of the Home page

If you have questions or comments about these changes please post them in our Help Forum.

Written by Kamila Primke, Software Engineer, Webmaster Tools
URL: http://googlewebmastercentral.blogspot.com/2012/05/navigation-dashboard-and-home-page.html

Sunday, May 6, 2012

[Gd] Dev Channel Updates for Chromebooks

| More

Chrome Releases: Dev Channel Updates for Chromebooks


The Dev channel has been updated to 20.0.1123.3 (Platform version: 2227.1.0) for Chromebooks (Acer AC700, Samsung Series 5, and Cr-48). This release contains functional and stability improvements.

Known issues:
  • 30496 - OpenVPN currently does not function
  • 30339 - Uploading photos to some site like Facebook and Yahoo! may fail
If you find new issues, please let us know by visiting our help site or filing a bug. Interested in switching to the Beta channel? Find out how. You can submit feedback using ‘Report an issue’ under the wrench menu.

Danielle Drew
Google Chrome
URL: http://googlechromereleases.blogspot.com/2012/05/dev-channel-updates-for-chromebooks.html

[Gd] Fridaygram: Doodle competition, nasty prehistoric fleas, cupcake map

| More

Google Developers Blog: Fridaygram: Doodle competition, nasty prehistoric fleas, cupcake map

Author Photo
By Scott Knaster, Google Developers Blog Editor

Everybody likes Google Doodles, those creative modifications of the Google logo that appear every so often on google.com and other Google search homepages. To let budding artists try their hand at doodling, we’ve hosted various Doodle 4 Google competitions around the world. This year’s Doodle 4 Google was open to U. S. students enrolled in schools serving grades K-12.



This week we announced the 50 state finalists, divided by grade group, and they’re very creative. Take a look, but more than that, you can vote for your favorites, one per grade group. Voting is open until May 10th. And after you’ve looked at this year’s student entries, you can spend time reliving old favorites on our Doodles archive site.

Now travel back in time to an age even before there were Google Doodles, when huge dinosaurs roamed the Earth. According to fossils found by Chinese scientists, these enormous beasts were bothered by Pseudopulex jurassicus and Pseudopulex magnus, giant insects 10 times the size of modern fleas that crawled on dinosaurs and packed a painful bite. So it turns out that being a dinosaur wasn’t all fun and games.

Finally, don’t you love it when two great things get mashed up together? Here’s an awesome example: a map of the world, made out of cupcakes. Enjoy!


Each week we publish Fridaygram, a post with cool Google and non-Google stuff you might have missed during the week. Fridaygram items aren’t necessarily related to developer topics; they’re just interesting to us nerds. Hat tip to Andres Ferrate and Mike Pegg for the link to the cupcake map. By the way, happy Star Wars Day, and May the 4th be with you.
URL: http://googledevelopers.blogspot.com/2012/05/fridaygram-doodle-competition-nasty.html

[Gd] Google Plugin for Eclipse now provides richer tooling for Cloud SQL and Google APIs

| More

Google Developers Blog: Google Plugin for Eclipse now provides richer tooling for Cloud SQL and Google APIs

Author PhotoBy Sriram Saroop, Product Manager

We are pleased to announce the latest release of Google Plugin for Eclipse (GPE 2.6) with improved tooling for Cloud SQL and Google APIs. GPE 2.6 introduces the following features:
Tooling for using Java Persistence API (JPA) to access Cloud SQL

Object-Relational Mapping (ORM) frameworks are very popular in the Java community for accessing relational databases. The Eclipse Web Tools Platform offers a robust set of tools to configure and use JPA with an implementation of your choice. With the new Google Plugin for Eclipse (GPE) 2.6, you can now take advantage of these tools with Cloud SQL and Google App Engine. In any GPE project, JPA can now be enabled and configured as a project facet. The screenshot below shows the JPA facet configuration for a GPE project.



Importing the latest Google APIs into your GPE project

With GPE 2.6, you now have access to all the latest Google APIs at the click of a button within Eclipse. You can now download the latest Google APIs Java client library with the required dependencies to access Google APIs right within your App Engine project using GPE. Update notifications for API version changes will appear in your App Engine project, so you can easily keep your client libraries updated all the time. The screenshot below shows the GPE UI for adding a Google API to a GPE project.



The next time we update the App Engine Engine SDK, you will be happy to see an update notification within Eclipse prompting you to update to the latest SDK.

Please go ahead and install GPE 2.6 by following the instructions here. You can start using the ORM tooling for Cloud SQL and the latest Google APIs for your App Engine projects. We always love to hear your feedback and the GPE group is a great place to share your thoughts.


Sriram Saroop is the Product Manager for the Google Plugin for Eclipse and the Google Admin APIs. He has been a software engineer in his previous life and he is now working toward creating an awesome developer experience for Google products.

Posted by Scott Knaster, Editor
URL: http://googledevelopers.blogspot.com/2012/05/google-plugin-for-eclipse-now-provides.html

[Gd] Using Google BigQuery to learn from GitHub data

| More

Google Developers Blog: Using Google BigQuery to learn from GitHub data

Author Photo
By Ilya Grigorik, Web Performance Engineer

Open-source developers all over the world contribute to millions of projects every day: writing and reviewing code, filing and discussing bug reports, updating documentation and project wikis, and so forth. The data generated from this activity can reveal interesting trends across many industries, including popularity of programming languages over time, defect rates, contribution metrics, and popularity of specific frameworks and libraries.

The challenge in extracting these trends is gathering the data. Each project has its own distributed workflow, code repositories, and conventions. Having hosted dozens of my own projects on GitHub, I've long wanted to analyze the developer activity from the 2.6M+ public projects hosted on GitHub. Hence, earlier this year GitHub Archive was born!

GitHub Archive is a project to record the public GitHub timeline, archive it, and make it easily accessible for further analysis. Each day it archives over 120,000 public activities, ranging from new commits and fork events to opening and closing tickets, each with detailed metadata.

Once I collected the data, I needed a tool to analyze it, and that is when I found Google BigQuery. Based on the research behind Dremel, a popular internal tool at Google for analyzing web-scale datasets, BigQuery allowed me to easily import the entire dataset and use a familiar SQL like syntax to comb through the gigabytes of data in seconds. Plus the tool will scale to terabyte datasets, so there is plenty of room to grow!

The best news is that thanks to collaboration from the GitHub and BigQuery teams, the GitHub dataset is now public and available for you to slice and dice in any way you like. No need to worry about data gathering or database schemas: BigQuery will do all the heavy lifting, and you can just compose your queries to be executed in realtime.

Here's a real-world example. What are the most popular programming languages on GitHub over the past month?


chart showing number of commits by language

If you are curious for more, sign up for BigQuery and follow the instructions on githubarchive.org to access the GitHub dataset. You can use the free 100GB query quota to run your analysis and perhaps even win some of the prizes from the GitHub Data Challenge!


Ilya Grigorik is a Web Performance Engineer and Advocate at Google, an open-source evangelist, and an analytics geek. You can find him on GitHub under igrigorik, and blogging about web performance at igvita.com.

Posted by Scott Knaster, Editor
URL: http://googledevelopers.blogspot.com/2012/05/using-google-bigquery-to-learn-from.html