Category Archives: Google Developers Blog

News and insights on Google platforms, tools and events

What is black and white and read all over?

Noto emoji, a new black and white emoji font with less color, may gain us more in the long run

Posted by Jennifer Daniel, Creative Director - Emoji & Expression

Seven different black and white emojis in 5 collumns: cat, donut, chicken, flower, sheep, mouse, donut, doll 

In 1999 — back when Snake ? was the best thing about your phone ? — there were three phone carriers in Japan ? . On these phones were tiny, beautiful pictures called emoji (meaning “picture” and “character” in Japanese ?). These 176 images were very simple — think 8-bit tech — and as a result were exquisitely abstract and tremendously useful when texting Twenty years later ??????????????, emoji are a global phenomenon ?. Now, our phones have fancy retina screens and somewhere along the way an important part of what made emoji so handy was left by the wayside: their simplicity. That’s why we’ve created a new emoji font: a monochrome Noto Emoji (a black and white companion to Noto Emoji Color).

Noto Emoji works like any other font you might use: You can change any character's color, size and weight. Download it and give it a whirl.

Noto Emoji webpage

What’s old is new again ?

Over time, emoji have become more detailed. Instead of representing broad concepts there has been a trend to design emoji to be hyper realistic. This wouldn't be a problem except skeuomorphism's specificity has resulted in the exclusion of other similar concepts in your keyboard. Today we have "?" … but what about other types of dance? Hula dancing? Belly dancing? Salsa dancing? Boogie woogie? By removing as much detail as possible, emoji could be more flexible, representing the idea of something instead of specifically what is in front of you (that … is what your camera is for ?).

Example of Noto Emoji cycling through different customizations like font color, size, and variable weights 

We also want to make sure emoji keep up with platform technology. We’ve got dark mode … we’ve got light mode … and now you can change the color of your emoji font so it can operate with the same dynamism as your operating system. Noto Emoji is also a variable font — opt for a "light" grade if it appears small ? or "bold" if you want them to have some weight. ? .

When translating our color emoji to black and white: some details can be removed, others will need to be completely redrawn. 

New designs, fewer details

To design something simple seems like it would be … well, simple … but it's deceptively complex ?

At first the approach seemed obvious — simply redraw the Noto Emoji Color designs in black and white. They are iconic, they will be legible. Done deal. Easy peasy, lemon squeezy. Not so fast. The removal of color is no trivial task. Take for example: Flags.

four flags in color - Sweeden, Denmark, USA, Brazil. Then four flags in black and white - SE, DK, US, BR.

You can't simply convert flags into black and white. You wouldn't be able to tell the difference between Finland and Sweden. You could redraw the flags but that puts them at risk of being incorrect. Instead, we leveraged the ISO's country codes. These sequences of letters are unique and represent each country. As a result, black and white flags have a much more contemporary aesthetic — kind of like bumper stickers ?.

Let's also take a look at the process involved to redesign the people emoji. For some characters, color is baked into the concept (like skin tone or hair color). It simply didn’t look right to replace color with hash marks or polka dots. And that my dear is how the blobs came back. Say hello (again) to our little friends.

Early sketch as we explored black and white designs

Likable. Nostalgic. Relatable without maintaining a distinction between genders. Google’s blob emoji were really something special. Cute, squishy, and remarkably friendly. We were able to bring back a little bit of what made them special while simultaneously discarding the parts that weren’t working. Most notably, the blobs’ facial expressions were wildly inconsistent but that was very easily fixed in black and white mode. It’s important emoji work cross-platform. The real world is not black and white but in emoji land we can finally have our favorite little dancer back ?.

So here we are today, dancing into the future with our favorite new emoji font. We can't wait to see how you use it. Visit Google Fonts to download or embed onto your website. Happy emoji-ing! ????

How can App Engine users take advantage of Cloud Functions?

Posted by Wesley Chun (@wescpy), Developer Advocate, Google Cloud

Introduction

Recently, we discussed containerizing App Engine apps for Cloud Run, with or without Docker. But what about Cloud Functions… can App Engine users take advantage of that platform somehow? Back in the day, App Engine was always the right decision, because it was the only option. With Cloud Functions and Cloud Run joining in the serverless product suite, that's no longer the case.

Back when App Engine was the only choice, it was selected to host small, single-function apps. Yes, when it was the only option. Other developers have created huge monolithic apps for App Engine as well… because it was also the only option. Fast forward to today where code follows more service-oriented or event-driven architectures. Small apps can be moved to Cloud Functions to simplify the code and deployments while large apps could be split into smaller components, each running on Cloud Functions.

Refactoring App Engine apps for Cloud Functions

Small, single-function apps can be seen as a microservice, an API endpoint "that does something," or serve some utility likely called as a result of some event in a larger multi-tiered application, say to update a database row or send a customer email message. App Engine apps require some kind web framework and routing mechanism while Cloud Function equivalents can be freed from much of those requirements. Refactoring these types of App Engine apps for Cloud Functions will like require less overhead, helps ease maintenance, and allow for common components to be shared across applications.

Large, monolithic applications are often made up of multiple pieces of functionality bundled together in one big package, such as requisitioning a new piece of equipment, opening a customer order, authenticating users, processing payments, performing administrative tasks, and so on. By breaking this monolith up into multiple microservices into individual functions, each component can then be reused in other apps, maintenance is eased because software bugs will identify code closer to their root origins, and developers won't step on each others' toes.

Migration to Cloud Functions

In this latest episode of Serverless Migration Station, a Serverless Expeditions mini-series focused on modernizing serverless apps, we take a closer look at this product crossover, covering how to migrate App Engine code to Cloud Functions. There are several steps you need to take to prepare your code for Cloud Functions:

  • Divest from legacy App Engine "bundled services," e.g., Datastore, Taskqueue, Memcache, Blobstore, etc.
  • Cloud Functions supports modern runtimes; upgrade to Python 3, Java 11, or PHP 7
  • If your app is a monolith, break it up into multiple independent functions. (You can also keep a monolith together and containerize it for Cloud Run as an alternative.)
  • Make appropriate application updates to support Cloud Functions

    The first three bullets are outside the scope of this video and its codelab, so we'll focus on the last one. The changes needed for your app include the following:

    1. Remove unneeded and/or unsupported configuration
    2. Remove use of the web framework and supporting routing code
    3. For each of your functions, assign an appropriate name and install the request object it will receive when it is called.

    Regarding the last point, note that you can have multiple "endpoints" coming into a single function which processes the request path, calling other functions to handle those routes. If you have many functions in your app, separate functions for every endpoint becomes unwieldy; if large enough, your app may be more suited for Cloud Run. The sample app in this video and corresponding code sample only has one function, so having a single endpoint for that function works perfectly fine here.

    This migration series focuses on our earliest users, starting with Python 2. Regarding the first point, the app.yaml file is deleted. Next, almost all Flask resources are removed except for the template renderer (the app still needs to output the same HTML as the original App Engine app). All app routes are removed, and there's no instantiation of the Flask app object. Finally for the last step, the main function is renamed more appropriately to visitme() along with a request object parameter.

    This "migration module" starts with the (Python 3 version of the) Module 2 sample app, applies the steps above, and arrives at the migrated Module 11 app. Implementing those required changes is illustrated by this code "diff:"

    Migration of sample app to Cloud Functions

    Next steps

    If you're interested in trying this migration on your own, feel free to try the corresponding codelab which leads you step-by-step through this exercise and use the video for additional guidance.

    All migration modules, their videos (when published), codelab tutorials, START and FINISH code, etc., can be found in the migration repo. We hope to also one day cover other legacy runtimes like Java 8 as well as content for the next-generation Cloud Functions service, so stay tuned. If you're curious whether it's possible to write apps that can run on App Engine, Cloud Functions, or Cloud Run with no code changes at all, the answer is yes. Hope this content is useful for your consideration when modernizing your own serverless applications!

How GDSC students are using their skills to support communities in Ukraine

Posted by Laura Cincera, Program Manager Google Developer Student Clubs, Europe

Revealing character in moments of crisis

The conflict in Ukraine is a humanitarian crisis that presents complex challenges. During this time of uncertainty, communities of student developers are demonstrating extraordinary leadership skills and empathy as they come together to support those affected by the ongoing situation. Student Patricijia Čerkaitė and her Google Developer Student Club (GDSC) community at the Eindhoven University of Technology in the Netherlands organized Code4Ukraine, an international hackathon that brought diverse groups of over 80 student developers together on March 3-4, 2022, to develop technology solutions to support people affected by the conflict in Ukraine.

Even far from the conflict in the Netherlands, they felt compelled to make an impact. “I have relatives in Ukraine; they live in Crimea,” says Patricijia. “In my childhood, I used to spend summer holidays there, eating ice cream and swimming in the Black Sea.”

Patricijia sitting at desk in black chair looking back and smiling

Patricijia working on the details for Code4Ukraine.

Rushing to help others in need with technology

Time was of the essence. The organizing team in Eindhoven contacted other students, connected with communities near and far, and sprang into action. The team invited Ukrainian Google Developer Expert Artem Nikulchenko to share his technology knowledge and first-hand experience of what is happening in his country. Students discussed issues faced by Ukrainians, reviewed problems citizens faced, and ideated around technology-centric solutions. Feelings of exasperation, frustration, and most importantly, hope became lines of code. Together, students built solutions to answer the call: Code4Ukraine.

Blue and yellow emblem that says Code 4 Ukraine

Then, gradually, through a collaborative effort, problem solving, and hours of hard work, the winners of the Code4Ukraine Hackathon emerged: Medicine Warriors, a project built by a diverse, cross-cultural group of undergraduate students and IT professionals from Ukraine, Poland, and Georgia, aiming to address the insulin shortage in Ukraine. The project gathers publicly available data from Ukrainian government notices on insulin availability across Ukraine and presents it in an easily readable way.

Photograph of the Medicine Warriors application design

Photograph of the Medicine Warriors application design

Helping: at the heart of their community

One member of the winning team is the GDSC chapter lead at the National Technical University of Ukraine Kyiv Polytechnic Institute, Ekaterina Gricaenko. “In Ukraine, there is a saying: ‘друг пізнається в біді,’ which translates to, ‘you will know who your friends are when the rough times arrive,’” says Ekaterina. “And now, I can say that the GDSC community is definitely on my family list.”

Photograph of Ekaterina Gricaenko, GDSC Lead

Ekaterina Gricaenko, GDSC Lead, Kyiv Polytechnic Institute

The Code4Ukraine initiative's goal of bringing others together to make an impact offers a prime example of what the Google Developer Student Clubs (GDSC) program aims to achieve: empowering student developers in universities to impact their communities through technology.

Reflecting on her experience leading the Kyiv GDSC chapter, Ekaterina says, “I started my journey with GDSC as a Core Team member, and during that time, I fell in love with our community, goals, and key concepts. Then, I decided to become a lead, to share my enthusiasm and support students as they pursue their professional dreams.

The Kyiv GDSC has organized over 18 workshops, written over 200 articles, run multiple study groups, and reached over a thousand followers on social media. “It’s incredible to realize how far we have come,” Ekaterina says.

A visual collage displays multiple activities organized by GDSC KPI

A visual collage displays multiple activities organized by GDSC KPI, led by Ekaterina Gricaenko.

Getting involved in your community

Through efforts like Code4Ukraine and other inspiring solutions like the 2022 Solution Challenge, students globally are giving communities hope as they tackle challenges and propose technical solutions. By joining a GDSC, students can grow their knowledge in a peer-to-peer learning environment and put theory into practice by building projects that solve for community problems and make a significant impact.

Photo of students in class in the upper right hand corner with a sign in the center that says Become a leader at your university

Learn more about Google Developer Student Clubs

If you feel inspired to make a positive change through technology, applications for GDSC leads for the upcoming 2022-2023 academic year are now open. Students can apply at goo.gle/gdsc-leads. If you’re passionate about technology and are ready to use your skills to help your student developer community, then you should consider becoming a Google Developer Student Clubs Lead!

We encourage all interested students to apply here and submit their applications as soon as possible. The applications in Europe will be open until 31st May 2022.

GDE community highlight: Nishu Goel

Posted by Monika Janota, Community Manager

Red graphic image shows woman holding microphone on stage next to some gears and the GDE logo

Nishu Goel is a renowned web engineer from India, Google Developer Expert for Angular and web technologies, Microsoft Most Valuable Professional. She’s the author of Step by Step Angular Routing (BPB, 2019) and A Hands-on Guide to Angular (Educative, 2021) as well as the author of Web Almanac 2021 JavaScript chapter. Nishu currently works at epilot GmbH as a full stack engineer. She told us about her community involvement, career plans and the best ways to learn web development.

Monika: Let’s start with your story. What inspired you to become a developer and take on an active role within dev communities?

Nishu: I got my bachelor’s degree in computer science, we studied data structures, and that’s where the interest in programming started. During the third year of engineering, a connection with the developer community was established through my participation in the Microsoft Imagine Cup Nationals competition where we presented solutions through code. The idea of the application we built was to bring educational opportunities to local students, especially girls. I met some very inspiring people, both contestants and organizers in this journey.

In 2018, my professional career took off, and I started working with Angular. Angular became the primary technology that connected me to the GDE program. Around the same time, I started writing blog posts and creating content around the subject I was working on and learning . Dhananjay Kumar helped me get started on this journey and ensured to keep me on track. My first articles tackled the basics of Angular. Soon after I started speaking at events-the first one being ngNepal, Nepal’s Angular Conference. This led to more speaking invitations about Angular and web technologies.

GDE Nishu Goel stands in the middle of the photo with 4 men on her left and 4 men on her right. They all look into the camera with half smiles

Monika: What’s your professional experience technology-wise?

Nishu: It was all about Angular and web components for the first two years. I was using Angular for building the web, but soon I decided to go beyond that and explore other fields. I didn’t want to limit myself in case I’d have to switch projects. That’s how I started creating web components in Angular to use in other frameworks.

The first thing I did was to create web components using Angular. I published it to npm and used it as a demo in a React project. I’ve discussed this during some of my talks and presentations later. My next job required using React and Typescript. Now, because I was working with React, I wasn’t just using one framework anymore, but the web in general. At that moment I learned a lot about the web, especially web performance. That’s when I had to start thinking about the Largest Contenful Paint (LCP) or First Contentful Paint (FCP), which means how much time it will take your application to load or what’s going to be the maximum time for the page to render. I have been working towards choosing best practices and an improved performance of the applications.

Because of this interest in web performance, I got involved in the Web Almanac and wrote the JavaScript chapter. Web Almanac is an annual report on the state of the web in general — it tells us how people are using different features. Last year 8.6 million websites were screened, the data was analyzed and presented in the report. The report includes statistics like the usage of the async and defer attributes in a <script> element. How many websites are using them correctly, how many are not using that at all, and how many improved those compared to 2020. The last Web Almanac report mentioned that around 35% of websites used two attributes on the same script, which was an anti-pattern, decreasing the performance. This was pointed out last year, and this year we tried to see if the situation improved. I also spoke at ngConf and Reliable Dev Summit, where I focused on the performance of the web.

Close up of the front of a book titled 2021 Web Almanac, HTTP Archive's Annual state of the web report

Monika: You’re also very much involved in giving back to the community. Lately you’ve been volunteering with a Ugandan NGO YIYA — how did it start and what was the main point of that cooperation?

Nishu: It started with the GDE team informing us about the volunteering opportunity with YIYA. The Ugandan NGO was looking for engineers to help them with either the content preparation or technical features. The program aims to empower school-aged children in Uganda and offer them education opportunities using the technologies available locally — not computers or textbooks, but rather basic keypad phones and radios. The children would dial a certain number and receive a set of information, dial another one for more insights, and so on. It became even more useful during the pandemic.

Since I’ve always been involved with the community and sustainable development goals, I decided to reach out. After a meeting with the YIYA team, I offered my help with the Python scripts or any bugs they came up with, any issues with the portal. We worked together for a brief amount of time.

Monika: What are your plans for 2022? Is there anything you’re focusing on in particular?

Nishu: I’m switching jobs and moving to another country. I’ll be working on the web in general, improving the site performance, and also on the backend, using Golang. I’ll continue to zero in on the web performance area since it’s very interesting and complex, and there’s a lot to understand and optimize. Even now, after dedicating a lot of my time to that, there’s still so much to learn. For example, I’d love to understand how using a CDN for my image resources would help me make my app even faster. I want to become THE expert of web performance — I’m gradually getting there, I like to believe :)

Monika: You’ve mentioned starting to write at a point when you were not an expert, you were just writing what you were learning. What would your advice be to new developers coming through and feeling they don’t have anything to share?

Nishu: That’s exactly how I felt when I started writing. I thought that maybe I should not put this out? Maybe it’s just wrong? I was worried my writing was not going to help the readers. But the important thing was that my writing was helping me. I would forget things after some time and then come back to something I wrote earlier. Writing things down is a great idea.

Close up of the front of a book titled Step-by-step Angular Routing, authored by Nishu Goel

So I would suggest everyone — just write, at whatever stage. Even if you’ve only finished one part of a course you’re going through — you’re learning by writing it down. A piece of information that you got to know at some point may be useful to others who don’t know that yet. You don’t need to be an expert. Writing will help you. And anyone, at any stage of their career.

Monika: It’s best to follow people who just learned something because they know all the things they had to figure out. Once you’re an expert, it’s hard to remember what it was like when you were new. And any advice for someone who’s just getting into web development?

Nishu: Many people ask which framework they should choose when they’re starting, but I think that’s not the right question. Whatever we are learning at any point should be useful at a later stage as well. I would advise anyone to drop the limitations and start with HTML or JavaScript — that’s going to be profitable in the future.

And then take any opportunity that comes your way. This happened to me when I stumbled upon information about the Web Almanac looking for authors. I just thought, “oh, this is interesting, this may help everyone with the performance side of things”. That’s how I became a content lead for the JavaScript chapter, and I’ve spent six months writing it. So I think it’s just about grabbing the opportunities and working hard.

Monika: Do you have any predictions or ideas about the future of web technology in general? What’s going to be the next hot topic? What’s going to be growing fast?

Nishu: I love the fact that we’re able to run servers within browsers now, this is a great advancement. For example, running Node.js from the browser has been introduced lately, meanwhile in the past we could not run anything without having Node.js installed in our systems. Now we can do anything from the browser. This is a huge step further in the web ecosystem. And the OMT — Off the Main Thread. Working on the threads is going to be much improved as well. Web Assembly is advancing and enables developers to do that, and I think that is the future of the web ecosystem.

Exploring accessibility through community with Pescara’s Google Developer Group

Posted by Alessandro Palmieri, Regional Lead, Europe, Google Developer Groups

Blue banner with text that reads Exploring accessibility through community in GDG Pescara. Includes an image of two men giving standing in front of a projector screen

You never quite know exactly how someone else experiences the world - but making an effort to connect and understand others remains a hallmark of a strong community. In November 2019, Google Developer Group Pescara invited backend developer Filippo Tenaglia to speak at a local DevFest program, as part of the global developer event. The group turned the lights down and connected Filippo’s PC to the room’s speakers, and Filippo told attendees about his life as a visually impaired developer. He let them hear what he hears when he works with the code and let them hear the different speech synthesizers he uses: the one he uses to browse on the Internet, as well as the one that he uses to read source code, that reads any punctuation character.

One attendee asked Filippo how many lines of code he’s able to remember without seeing them, and Filippo answered, “I have to remember the whole block. I can’t see the code, so I memorize it. Usually, I can remember 20, even 30 lines of code.” The attendee replied, “you’re a dragon,” alluding to folklore that the mystical creatures have strong memories. Filippo laughed, and his colleague, Gregorio Palama, leader of GDG Pescara, says he got goosebumps.

Gregorio met Filippo when the two worked together at an IT consultancy. Filippo brought his guide dog Lila to work and impressed Gregario with his remarkable ability to memorize 20-30 lines of code at a time. Filippo used assistive technology, like speech synthesizers and screen readers, as well as his extraordinary memorization ability, to code. Through his friendship with Filippo, Gregorio came to understand the importance of accessibility.

Gregorio uses his Google Developer Group (GDG) Pescara community, in a small city in the central part of Italy, to advocate for people with disabilities and educate other developers about the technical tools needed to make programming, websites, and software truly accessible for the visually impaired.

Leveraging tools to stay connected

Developers with visual impairments similar to Fillipo can leverage assistive technology in Chrome like screen readers and magnifiers. When browsing the web using various accessibility extensions, there are ways for people with visual impairments to make the browser more accessible, without installing external software.

Through their friendship, Filippo continued to educate Gregorio about accessibility when he called Gregorio to volunteer for more GDG Pescara events in Italy. Filippo explained that he was calling because the group’s community messaging platform and application, where they post calls for volunteers and share event details, isn’t accessible, so Fialippo can’t see the posted information and needs to use a different method of staying up to date on GDG activities.

Using community to share the importance of accessibility

GDG Pescara plans to host a DevFest focused accessibility and other selected topics. The organizers are thinking of having a hackathon that could expose developers to Google’s accessibility tools, like the ChromeVox screen reader, which developers can use to test the accessibility of their web apps, or Chrome’s documentation on designing accessible extensions. With this community-led programming, Gregorio and his team hope to inspire other developers to build new accessibility tools, like a better community platform.

Through his friendship with Filippo, Gregorio learned the importance of accessibility. Now, he is using his GDG community and a suite of tools to help educate about accessibility and advocate for people with disabilities.

If you’re inspired to lead fellow developers into an exploration of accessibility in technology, we encourage you to join a GDG near you, or consider leading a GDG chapter. You can learn more about Google’s accessibility initiatives and developer tools here and check out an upcoming GDG community accessibility awareness event here.

Machine Learning Communities: Q1 ‘22 highlights and achievements

Posted by Nari Yoon, Hee Jung, DevRel Community Manager / Soonson Kwon, DevRel Program Manager

Let’s explore highlights and accomplishments of vast Google Machine Learning communities over the first quarter of the year! We are enthusiastic and grateful about all the activities that the communities across the globe do. Here are the highlights!

ML Ecosystem Campaign Highlights

ML Olympiad is an associated Kaggle Community Competitions hosted by Machine Learning Google Developers Experts (ML GDEs) or TensorFlow User Groups (TFUGs) sponsored by Google. The first round was hosted from January to March, suggesting solving critical problems of our time. Competition highlights include Autism Prediction Challenge, Arabic_Poems, Hausa Sentiment Analysis, Quality Education, Good Health and Well Being. Thank you TFUG Saudi, New York, Guatemala, São Paulo, Pune, Mysuru, Chennai, Bauchi, Casablanca, Agadir, Ibadan, Abidjan, Malaysia and ML GDE Ruqiya Bin Safi, Vinicius Fernandes Caridá, Yogesh Kulkarni, Mohammed buallay, Sayed Ali Alkamel, Yannick Serge Obam, Elyes Manai, Thierno Ibrahima DIOP, Poo Kuan Hoong for hosting ML Olympiad!

Highlights and Achievements of ML Communities

TFUG organizer Ali Mustufa Shaikh (TFUG Mumbai) and Rishit Dagli won the TensorFlow Community Spotlight award (paper and code). This project was supported by provided Google Cloud credit.

ML GDE Sachin Kumar (Qatar) posted Build a retail virtual agent from scratch with Dialogflow CX - Ultimate Chatbot Tutorials. In this tutorial, you will learn how to build a chatbot and voice bot from scratch using Dialogflow CX, a Conversational AI Platform (CAIP) for building conversational UIs.

ML GDE Ngoc Ba (Vietnam) posted MTet: Multi-domain Translation for English and Vietnamese. This project is about how to collect high quality data and train a state-of-the-art neural machine translation model for Vietnamese. And it utilized Google Cloud TPU, Cloud Storage and related GCP products for faster training.

Kaggle announced the Google Open Source Prize early this year (Winners announcement page). In January, ML GDE Aakash Kumar Nain (India)’s Building models in JAX - Part1 (Stax) was awarded.

In February, ML GDE Victor Dibia (USA)’s notebook Signature Image Cleaning with Tensorflow 2.0 and ML GDE Sayak Paul (India) & Soumik Rakshit’s notebook gaugan-keras were awarded.

TFUG organizer Usha Rengaraju posted Variable Selection Networks (AI for Climate Change) and Probabilistic Bayesian Neural Networks using TensorFlow Probability notebooks on Kaggle. They both got gold medals, and she has become a Triple GrandMaster!

TFUG Chennai hosted the two events, Transformers - A Journey into attention and Intro to Deep Reinforcement Learning. Those events were planned for beginners. Events include introductory sessions explaining the transformers research papers and the basic concept of reinforcement learning.

ML GDE Margaret Maynard-Reid (USA), Nived P A, and Joel Shor posted Our Summer of Code Project on TF-GAN. This article describes enhancements made to the TensorFlow GAN library (TF-GAN) of the last summer.

ML GDE Aakash Nain (India) released a series of tutorials about building models in JAX. In the second tutorial, Aakash uses one of the most famous and most widely used high-level libraries for Jax to build a classifier. In the notebook, you will be taking a deep dive into Flax, too.

ML GDE Bhavesh Bhatt (India) built a model for braille to audio with 95% accuracy. He created a model that translates braille to text and audio, lending a helping hand to people with visual disabilities.

ML GDE Sayak Paul (India) recently wrote Publishing ConvNeXt Models on TensorFlow Hub. This is a contribution from the 30 versions of the model, ready for inference and transfer learning, with documentation and sample code. And he also posted First Steps in GSoC to encourage the fellow ML GDEs’ participation in Google Summer of Code (GSoC).

ML GDE Merve Noyan (Turkey) trained 40 models on keras.io/examples; built demos for them with Streamlit and Gradio. And those are currently being hosted here. She also held workshops entitled NLP workshop with TensorFlow for TFUG Delhi, TFUG Chennai, TFUG Hyderabad and TFUG Casablanca. It covered the basic to advanced topics in NLP right from Transformers till model hosting in Hugging Face, using TFX and TF Serve.

Getting started is the hardest part: Find inspiration with Apps Script samples

Posted by Kara Ireland, Technical Writer & Charles Maxson, Developer Advocate

Google Apps Script is a hosted JavaScript development environment that makes it easy for anyone to build custom business solutions across several Google products. Figuring out where to begin can be a hurdle for such an expansive tool, so we've recently released 10 new inspirational sample solutions to help you get started. These additions bolster the Apps Script documentation, which now hosts more than 30 sample solutions.

Apps Script welcomes developers of all skill levels, from beginners to professionals. We’re consistently impressed with the creative and innovative ways developers have automated business processes with Apps Script–from published add-ons that help millions of users to simple automations that help small teams do big things. People all over the world use Apps Script to make work easier in ways we never could have imagined.

If you’re new to Apps Script, or simply looking for new ideas, we invite you to check out the sample solutions in our documentation.

Here are a few use cases our newest sample solutions address:

Summarize data from multiple sheets

Apps Script project type: Custom function

Coding level: Beginner

Custom functions can reduce spreadsheet complexity by replacing numerous built-in Sheets functions. If you have similarly structured data on multiple sheets in a spreadsheet, you can use this custom function to create a summary of each sheet.

You’ll learn how to programmatically:

  • Iterate through sheets in a spreadsheet to perform custom calculations.
  • Exclude specific sheets from your calculations.
  • Process spreadsheet data using optimized array objects.

Try this solution >>

Upload files to Google Drive from Google Forms

Project type: Automation with an event-driven trigger

Coding level: Beginner

Automations can programmatically perform tasks across Google products and can be set in motion by custom menus, buttons, user actions, or a time-based schedule. Use this automation to simultaneously upload and organize files in Drive using Forms. The customizable sample form includes inputs for the files to upload and how to organize them.

You’ll learn how to programmatically:

  • Implement a trigger to run a script with every form submission.
  • Capture and process user inputs from a form.
  • Organize uploaded files within Drive.

Try this solution >>

Clean up data in a spreadsheet

Project type: Editor Add-on

Coding level: Intermediate

Editor Add-ons are highly customizable and can automate common tasks in Google Docs, Sheets, Slides, or Forms. With this add-on, you can clean up spreadsheet data in Sheets by automatically removing empty rows and columns, cropping the spreadsheet to the edges of the data range, and filling in gaps in the data.

You’ll learn how to programmatically:

  • Use arrays to efficiently identify and delete empty rows and columns.
  • Fill in data gaps without overwriting non-empty cells.
  • Build an Editor Add-on menu that displays under the Extensions menu in Sheets.

Try this solution >>

Schedule meetings from Google Chat

Project type: Google Chat app

Coding level: Intermediate

Google Chap apps provide a conversational interface that lets Chat users interact with services as if the service were a person. Use this Chat app to schedule a meeting in Google Calendar from within a direct message or a space in Chat. You can set specific details for the meeting, such as subject, start time, or duration, or use the default settings for instant meeting scheduling.

You’ll learn how to programmatically:

  • Send a response when a Chat app is messaged or added to a space.
  • Gather user inputs with a custom dialog.
  • Add a new Calendar event and respond in Chat with the event URL.

Try this solution >>

Copy macros to other spreadsheets

Project type: Google Workspace Add-on
Coding level: Intermediate

Google Workspace Add-ons offer a standardized user interface and can be used across several Google Workspace applications. With this add-on, you can automatically copy a script project and attach it to a specified spreadsheet. Though this add-on focuses on Sheets macros, you can use it to copy and share any container-bound script.

You’ll learn how to programmatically:

  • Create a card-based interface for a Google Workspace Add-on.
  • Copy files from a container-bound Apps Script project.
  • Create a new container-bound Apps Script project and add the copied files.

Try this solution >>

Find more samples and connect with us

The above is just a sampling (pun intended) of the solutions we’ve built for our developer community. To get inspired for your next Apps Script project, view all the sample solutions in our documentation. Also, check out the latest feature updates of the Apps Script IDE to help you build quickly and easily.

We’d love to know what you think. To give feedback on a sample, at the top of the documentation page, click Send feedback. For more updates and news about the Google Workspace Platform, subscribe to our developer newsletter.

Announcing the Apps Script connector for AppSheet: Automate workflows for Google Workspace

Posted by Mike Procopio, Senior Staff Software Engineer

This week, we launched the Apps Script connector for AppSheet, which now makes it possible to call Apps Script code functions from a no-code AppSheet app. This greatly extends the abilities of AppSheet apps by letting them access the power that Apps Script provides. For example, an AppSheet app can now use Apps Script to automate workflows with Google Workspace using the Workspace APIs for Drive, Docs, Sheets, and Admin SDK, and more – as well as other Google services like YouTube, Google Analytics, and BigQuery.

Google AppSheet

AppSheet is Google’s platform for building no-code custom apps and workflows to automate business processes. It lets app creators build and deploy end-to-end apps and automations without writing code.


Editing an App Definition in Google Appsheet


Overview of No-Code

Before we dive into the Apps Script connector feature, let’s take a look at what we mean by no-code. No-code platforms like AppSheet enable citizen developers to quickly build apps automatically through data analysis using web-based user interfaces. These are typically built on top of a data source like Google Sheets, MySQL, Salesforce, or other database. Creating these apps doesn’t require a traditional software engineering background; business technologists and analysts with a wide range of skill sets can build apps that make their work easier and more efficient.

In a no-code platform like AppSheet, an app creator uses a web-based editor UI to define how the app should behave, instead of writing specific code to achieve that. They’ll specify things like what the app should do, what data source it's built on, what the data means, what UI the user sees, what events to listen for and what actions to take when they occur, and so on. The app is then deployed in production as an end-to-end, data-driven app with a UI, all without “writing” any actual code. This is all transparent to the end user, who simply sees a standard web or native app.


Why No-Code Works Well

In practice, no-code platforms work very well for a large class of apps. Why? Because many apps are functionally very similar – in particular those that implement internal business processes. These apps share many common traits: A data source for storing data, a concept of a data “record,” UIs and forms to collect and edit data, user-specific views of that data, expressions to define transformations of data, actions to take when data is changed, admin controls to manage permissions, and so on.

For example, consider an app for creating and approving an employee travel request. This app shares many common traits with an app for, say, creating and approving expense reports. In both apps, an employee creates a record which gets reviewed and annotated, users are notified when changes are made, and eventually the request is completed and closed out. Similarly, an internal app for tracking employees’ assigned computer equipment has a lot in common with any generic inventory tracking, fulfillment, and ordering system.

A no-code platform’s challenge is always balancing expressiveness with high-level abstraction. Fortunately, business processes tend to conform to a well-understood core set of expectations around data, data lifecycle, and process. This is why no-code platforms perform well in this space. However, there may be times when the requirements of the app go beyond what a no-code platform can provide. The new Apps Script connector greatly improves the expressiveness (capabilities) of a no-code app – ensuring that the app can grow to accommodate changing requirements or business processes as they evolve.


Google Workspace, Workspace APIs, and Apps Script

Google Workspace is Google’s cloud-based productivity suite, enabling teams of all sizes to connect, create, and collaborate. You may be familiar with many of these apps, like Gmail, Calendar, Drive, Docs, Sheets, Slides, and others. Each of these apps also comes with a powerful developer API that lets app developers programmatically integrate with it. For example, the Drive API allows its users to upload and download files with code, the Gmail API lets apps integrate with its messaging functions, and the Google Docs API allows script-based editing of Google Docs.


Using Google Workspace integrating Chat, Gmail, and document previews


Apps Script is a low-code platform that makes it quick and easy to build business solutions that integrate, automate, and extend Google Workspace. It does this by providing easy-to-use high-level “wrappers” around APIs, enabling custom integrations with Google Workspace and external services. Apps Script also integrates with Google services such as YouTube, Google Analytics, and BigQuery. It is a powerful platform, enabling script authors to implement complex business logic and macros and call external services, for example a third-party vendor’s data exchange system or a machine learning classification service.


Editing a script in the Google Apps Script code editor


Introducing the Apps Script connector for AppSheet

The Apps Script connector for AppSheet, launched this week, ties everything together: AppSheet, Apps Script, Google Workspace, and Google Workspace’s many developer APIs. This integration lets no-code app developers using AppSheet greatly extend the capabilities of their no-code apps by allowing them to call and pass data to Apps Script functions. One way to think about this integration is that it bridges no-code (AppSheet) with low-code (Apps Script). Importantly, the person who writes the Apps Script script doesn’t have to be the same as the no-code AppSheet app creator that calls the script (and often won’t be).

From the Apps Script developer perspective, this opens the door to some important capabilities. One of AppSheet’s biggest benefits is that it allows you to easily deploy an actual end-to-end app with a UI (frontend). With the new ability to call your existing Apps Script code, creating or replacing any existing front-end with a no-code AppSheet app becomes a potentially game-changing option.


Using the Apps Script connector for AppSheet

In AppSheet, configuring this is straightforward and requires no code other than the script itself. The core idea is that the app creator chooses the Apps Script script to call by configuring an AppSheet “Task,” which is an action taken when an AppSheet Automation is triggered.

Such an action typically occurs in the context of a specific data row in AppSheet’s data source; for example, an automation could be triggered when a new data record is created by one of the app’s end users. Finally, the app creator can specify values to pass in to the parameters of the Apps Script function based on values in the active data record.


Editing an Automation Task in Google AppSheet


Here’s how to set this up in five easy steps:

  1. In AppSheet, select the Automation screen, create a new Bot with an associated Event to listen for, and finally and choose the Call a script option for the Task:

    Configuring an AppSheet Automation Task to call an Apps Script function

  2. Then, under “Apps Script Project,” choose the script to call. This code will be created using the Apps Script editor, and will be in App Creator’s Google Drive (it can be shared with them by someone else):

    Choosing the Apps Script Project to call from Google Drive

  3. Once selected, a list of the available functions in the Apps Script project will be shown in the Function name dropdown. Here, choose the function to call from AppSheet.
  4. After the function to call is selected, a list of its parameters — additional data passed in when calling the function – is then shown.

    Displaying the parameters to pass to the logTravelRequestUpdate() Apps Script function

  5. For each function parameter, use the AppSheet Expression Assistant to specify what value to pass for the parameter when the automation is called. An expression can be a simple column in the AppSheet app’s data source, or a more complex function or computation involving multiple columns.

  6. Using the AppSheet Expression Assistant to choose which values to pass to the Apps Script function parameters

Finally, save the Task in the AppSheet Editor using the Save button.

And that’s it! When the automation is triggered (for example, when a user adds a new data row), the AppSheet automation engine will call the specified Apps Script function, passing in the values from the evaluated expressions as function arguments. Details about the function call will be available in the AppSheet Automation Monitor.


Example Code

Here’s a simple example you can try on your own based on a Travel Request Tool AppSheet app shown in the above screenshots. (More examples are also given in the Sample Scripts section below.) The code below is an Apps Script function that adds details about an employee travel request to a Google Docs document simulating an “audit log”. It uses the Google Docs API via the DocumentApp wrapper library available in Apps Script.


 TravelRequestAuditLogger.gs 

function logTravelRequestUpdate(RequestDate, Requestor, Origin, ...) {
var TRAVEL_REQUEST_AUDIT_LOG_DOCID = 'your_docid_here'
var doc = DocumentApp.openById(TRAVEL_REQUEST_AUDIT_LOG_DOCID)
var body = doc.getBody();

var dataParagraph = body.insertParagraph(0, '');
var headerText = dataParagraph.appendText('*** NEW AUDIT LOG ENTRY ***\n');
headerText.setBold(true);

// Add in the audit log entry metadata.
dataParagraph.appendText('New Travel Request Tool audit log entry...\n');

dataParagraph.appendText('RequestDate: ' + RequestDate + '\n');
dataParagraph.appendText('Requestor: ' + Requestor + '\n');
dataParagraph.appendText('Origin: ' + Origin + '\n');

// ... additional values here to append to Google Doc
}

When this function is called, for example from an AppSheet automation when a new travel request is created, text will be added to the Google Docs document based on values passed in from AppSheet. The document will look similar to below when it is updated:


Example Google Docs document output, created from using the Google Docs API in Apps Script with values passed in from AppSheet


Getting Started

We’ve created a list of resources to help you quickly get started and get community support.


Sample Scripts

Here are three sample scripts we’ve created to help you get started.

Sample Google Workspace Project - Create a Doc, Sheet, Slide or send an Email.

Create a Calendar Event - Create a customizable Calendar event.

Send an interactive Chat message - Send a message in Google Chat that opens a link or displays an image.

We’re very excited about this announcement and we can’t wait to see what you build for Google Workspace! To stay in the loop on announcements about AppSheet and the Google Workspace Platform, please subscribe to our developer newsletter.

How is Dev Library useful to the open-source community?

Posted by Ankita Tripathi, Community Manager (Dev Library)


Witnessing a plethora of open-source enthusiasts in the developer ecosystem in recent years gave birth to the idea of Google’s Dev Library. The inception of the platform happened in June 2021 with the only objective of giving visibility to developers who have been creating and building projects relentlessly using Google technologies. But why the Dev Library?

Why Dev Library?

Open-source communities are currently at a boom. The past 3 years have seen a surge of folks constantly building in public, talking about open-source contributions, digging into opportunities, and carving out a valuable portfolio for themselves. The idea behind the Dev Library as a whole was also to capture these open-source projects and leverage them for the benefit of other developers.

This platform acted as a gold mine for projects created using Google technologies (Android, Angular, Flutter, Firebase, Machine Learning, Google Assistant, Google Cloud).

With the platform, we also catered to the burning issue – creating a central place for the huge number of projects and articles scattered across various platforms. Therefore, the Dev Library became a one-source platform for all the open source projects and articles for Google technologies.

How can you use the Dev Library?

“It is a library full of quality projects and articles.”

External developers cannot construe Dev Library as the first platform for blog posts or projects, but the vision is bigger than being a mere platform for the display of content. It envisages the growth of developers along with tech content creation. The uniqueness of the platform lies in the curation of its submissions. Unlike other platforms, you don’t get your submitted work on the site by just clicking ‘Submit’. Behind the scenes, Dev Library has internal Google engineers for each product area who:

  • thoroughly assess each submission,
  • check for relevancy, freshness, and quality,
  • approve the ones that pass the check, and reject the others with a note.

It is a painstaking process, and Dev Library requires a 4-6 week turnaround time to complete the entire curation procedure and get your work on the site.

What we aim to do with the platform:

  • Provide visibility: Developers create open-source projects and write articles on platforms to bring visibility to their work and attract more contributions. Dev Library’s intention is to continue to provide this amplification for the efforts and time spent by external contributors.
  • Kickstart a beginner’s open-source contribution journey: The biggest challenge for a beginner to start applying their learnings to build Android or Flutter applications is ‘Where do I start my contributions from’? While we see an open-source placard unfurled everywhere, beginners still struggle to find their right place. With the Dev Library, you get a stack of quality projects hand-picked for you keeping the freshness of the tech and content quality intact. For example, Tomas Trajan, a Dev Library contributor created an Angular material starter project where they have ‘good first issues’ to start your contributions with.
  • Recognition: Your selection of the content on the Dev Library acts as recognition to the tiring hours you’ve put in to build a running open-source project and explain it well. Dev Library also delivers hero content in their monthly newsletter, features top contributors, and is in the process to gamify the developer efforts. As an example, one of our contributors created a Weather application using Android and added a badge ‘Part of Dev Library’.

    With your contributions at one place under the Author page, you can use it as a portfolio for your work while simultaneously increasing your chances to become the next Google Developer Expert (GDE).

Features on the platform

Keeping developers in mind, we’ve updated features on the platform as follows:

  • Added a new product category; Google Assistant – All Google Assistant and Smart home projects now have a designated category on the Dev Library.
  • Integrated a new way to make submissions across product areas via the Advocu form.
  • Introduced a special section to submit Cloud Champion articles on Google Cloud.
  • Included displays on each Author page indicating the expertise of individual contributors
  • Upcoming: An expertise filter to help you segment out content based on Beginner, Intermediate, or Expert levels.

To submit your idea or suggestion, refer to this form, and put down your suggestions.

Contributor Love

Dev Library as a platform is more about the contributors who lie on the cusp of creation and consumption of the available content. Here are some contributors who have utilized the platform their way. Here's how the Dev Library has helped along their journey:

Roaa Khaddam: Roaa is a Senior Flutter Mobile Developer and Co-Founder at MultiCaret Inc.

How has the Dev Library helped you?

“It gave me the opportunity to share what I created with an incredible community and look at the projects my fellow Flutter mates have created. It acts as a great learning resource.”


Somkiat Khitwongwattana: Somkiat is an Android GDE and a consistent user of Android technology from Thailand.

How has the Dev Library helped you?

“I used to discover new open source libraries and helpful articles for Android development in many places and it took me longer than necessary. But the Dev Library allows me to explore these useful resources in one place.”


Kevin Kreuzer: Kevin is an Angular developer and contributes to the community in various ways.

How has the Dev Library helped you?

“Dev Library is a great tool to find excellent Angular articles or open source projects. Dev Library offers a great filtering function and therefore makes it much easier to find the right open source library for your use case.”



What started as a platform to highlight and showcase some open-source projects has grown into a product where developers can share their learnings, inspire others, and contribute to the ecosystem at large.

Do you have an Open Source learning or project in the form of a blog or GitHub repo you'd like to share? Please submit it to the Dev Library platform. We'd love to add you to our ever growing list of developer contributors!

Use OAuth 2.0 tokens on your website, app, and servers

Posted by Peter Jacobsen, Technical Writer

OAuth 2.0 is an open standard authorization framework for token-based authorization on the internet. An OAuth 2.0 access token is a string that the OAuth 2.0 client uses to make requests to the resource server, and hides the user's identity or other information from the OAuth 2.0 client. Only use access tokens to make requests to the resource server.

Offline refresh tokens

Access tokens periodically expire and become invalid credentials for a related API request. If you requested offline access to the scopes associated with the token, you can refresh an access token without prompting the user for permission, even when the user isn't present.

As a best practice, set the expiration time for refresh tokens for a little longer than the access tokens. For example, if you set the expiration to 30 minutes for an access token, set the refresh token's expiration to 24 hours or longer.

For more information, see Refreshing an access token (offline access).

Online access

Some apps may request that the user reauthenticate after a shorter period of time, which relies on the access token alone rather than a refresh token. These apps have online access as opposed to those that have a refresh token and are considered to have offline access.

For more information, see Refreshing an access token (offline access) and Refresh tokens.

JSON Web Token (JWT) and token expiration

To authenticate to Cloud IoT, each device must prepare a JWT. JWTs are used for short-lived authentication between devices and the MQTT or HTTP bridges.

JWTs are composed of three sections: a header, a payload that contains a claim set, and a signature. The header and payload are JSON objects that are serialized to UTF-8 bytes and then encoded with Base64 URL encoding.

The JWT's header, payload, and signature are concatenated with periods. As a result, a JWT typically takes this form:

{Base64url encoded header}.{Base64url encoded payload}.{Base64url encoded signature}

For more information, see Using JSON Web Tokens (JWTs) and Managing JWT token expiration.

Common token expiration paradigms

There are different policies and strategies that you can use to manage token expiration. You can:

  • Monitor your HTTP responses, look for 401 HTTP responses, and respond accordingly.
  • Check the token's expiration date proactively to determine the validity of the token before you make an HTTP request to the resource server.
  • Combine the previous two strategies to handle expirations where a valid token can expire during the request that causes a 401 HTTP Response.