Author Archives: Google Developers

#WeArePlay | Meet George from the UK. More stories from Croatia, USA and Kenya.

Posted by Leticia Lago, Developer Marketing

Our celebration of app and game businesses continues with more #WeArePlay stories. Today, we’re starting with George from Bristol, UK - a young entrepreneur taking the streetwear industry by storm.

After spending hours and hours searching for the latest styles in sneakers and streetwear, George realised there’s a market in helping fellow enthusiasts find the latest drops. At just 16 years old, he took it upon himself to learn to code and created his app, Droplist. It points people to upcoming special collections from major labels around the world. Find out more about his story.


Today we also spotlight few more stories from around the world:
  • Anica and Kristijan from an island in Croatia - founders of Dub Studio Productions to help music lovers around the global turn up the bass or lower the treble on their favourite songs.


  • Robert from Wyoming, founder of Bluebird Languages - language learning apps with over 6 million hours of audio lessons spanning 164 languages, from Hungarian to Haitian Creole.


  • And one more new story - because why not! This time, featuring Annabel from Kenya. After struggling to find a mechanic when stuck on the roadside in Nairobi, she and her co-founder created Ziada to help people find local service providers.


Check out all the stories now at g.co/play/weareplay and stay tuned for even more coming soon.

How useful did you find this blog post?

Migrating from App Engine Blobstore to Cloud Storage (Module 16)

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

Introduction and background

The most recent Serverless Migration Station video demonstrated how to add use of the App Engine's Blobstore service to a sample Python 2 App Engine app, kicking off the first of a 2-part series on migrating away from Blobstore. In today's Module 16 video, we complete this journey, arriving at Cloud Storage. Moving away from proprietary App Engine services like Blobstore makes apps more portable, giving them enough flexibility to:


Showing App Engine users how to migrate to Cloud Storage

As described previously, a Blobstore for Python 2 dependency on webapp made the Module 15 content more straightforward to implement if it was still using webapp2. To completely modernize this app here in Module 16, the following migrations should be carried out:

  • Migrate from webapp2 (and webapp) to Flask
  • Migrate from App Engine NDB to Cloud NDB
  • Migrate from App Engine Blobstore to Cloud Storage
  • Migrate from Python 2 to Python (2 and) 3

Performing the migrations

Prior to modifying the application code, a variety of configuration updates need to be made. Updates applying only to Python 2 feature a "Py2" designation while those migrating to Python 3 will see "Py3" annotations.

  1. Remove the built-in Jinja2 library from app.yaml—Jinja2 already comes with Flask, so remove use of the older built-in version which may possibly conflict with the contemporary Flask version you're using. (Py2)
  2. Use of Cloud client libraries (such as those for Cloud NDB and Cloud Storage) require a pair of built-in libraries, grpcio and setuptools, so add those to app.yaml (Py2)
  3. Remove everything in app.yaml except for a valid runtime (Py3)
  4. Add Cloud NDB and Cloud Storage client libraries to requirements.txt (Py2 & Py3)
  5. Create an appengine_config.py supporting both built-in (those in app.yaml) and non built-in (those in requirements.txt) libraries used (Py2)

The Module 15 app already migrated away from webapp2's (Django) templating system to Jinja2. This is useful when migrating to Flask because Jinja2 is Flask's default template system. Switching from App Engine NDB to Cloud NDB is fairly straightforward as the latter was designed to be mostly compatible with the original. The only change visible in this sample app is to move Datastore calls into Python with blocks.

The most significant changes occur when moving the upload and download handlers from webapp to Cloud Storage. The video and corresponding codelab go more in-depth into the necessary changes, but in summary, these are the updates required in the main application:

  1. webapp2 is replaced by Flask. Instead of using the older built-in version of Jinja2, use the version that comes with Flask.
  2. App Engine Blobstore and NDB are replaced by Cloud NDB and Cloud Storage, respectively.
  3. The webapp Blobstore handler functionality is replaced by a combination of the io standard library module plus components from Flask and Werkzeug. Furthermore, the handler classes and methods are replaced by Flask functions.
  4. The main handler class and corresponding GET and POST methods are all replaced by a single Flask function.

The results

With all the changes implemented, the original Module 15 app still operates identically in Module 16, starting with a form requesting a visit artifact followed by the most recents visits page:
The sample app's artifact prompt page

The sample app's most recent visits page.

The only difference is that four migrations have been completed where all of the "infrastructure" is now taken care of by non-App Engine legacy services. Furthermore, the Module 16 app could be either a Python 2 or 3 app. As far as the end-user is concerned, "nothing happened."

Migrating sample app from App Engine Blobstore to Cloud Storage

Wrap-up

Module 16 featured four different migrations, modernizing the Module 15 app from using App Engine legacy services like NDB and Blobstore to Cloud NDB and Cloud Storage, respectively. While we recommend users move to the latest offerings from Google Cloud, migrating from Blobstore to Cloud Storage isn't required, and should you opt to do so, can do it on your own timeline. In addition to today's video, be sure to check out the Module 16 codelab which leads you step-by-step through the migrations discussed.

In Fall 2021, the App Engine team extended support of many of the bundled services to 2nd generation runtimes (that have a 1st generation runtime), meaning you are no longer required to migrate to Cloud Storage when porting your app to Python 3. You can continue using Blobstore in your Python 3 app so long as you retrofit the code to access bundled services from next-generation runtimes.

If you're using other App Engine legacy services be sure to check out the other Migration Modules in this series. All Serverless Migration Station content (codelabs, videos, source code [when available]) can be accessed at its open source repo. While our content initially focuses on Python users, the Cloud team is working on covering other language runtimes, so stay tuned. For additional video content, check out our broader Serverless Expeditions series.

Google Dev Library Letters — 12th Issue

Posted by Garima Mehra, Program Manager

‘Google Dev Library Letters’ is curated to bring you some of the latest projects developed with Google tech submitted to Google Dev Library Platform. We hope this brings you the inspiration you need for your next project!


Android

Shape your Image: Circle, Rounded Square, or Cuts at the corner in Android by Sriyank Siddhartha

Using the MDC library, shape images in just a few lines of code by using ShapeableImageView.


Foso/Ktorfit by Jens Klingenberg

HTTP client / Kotlin Symbol Processor for Kotlin Multiplatform (Js, Jvm, Android, Native, iOS) using KSP and Ktor clients inspired by Retrofit.

From offstage to onstage, my experience of becoming a Google Developer Expert

Written by Shuyu (Asher) Guo, Dart & Flutter GDE, China

At the end of May 2022, after more than a month of Google Developer Expert interviews, I finally became the fourth Flutter & Dart GDE in China.

I believe that the title of GDE should be very familiar for Android or Machine Learning developers. If you’re not familiar, the Google Developer Experts program is a global network of highly experienced technology experts, influencers, and thought leaders who have expertise in Google technologies, and are active leaders in the space and contribute to the wider developer and startup ecosystem.

My journey to becoming a GDE

In 2013, Android Bus was my first exposure to the Android community and it was at the ApkBus conference that I came into contact with the first GDE I’ve ever met. At that conference, I made Android developer friends and I also met some event organizers who invited me to speak at future events.

After the conference, I started my public speaking journey and spoke about Flutter because of the opportunities that came from networking and meeting the right people. By being more active in the community through speaking, I received an invitation to become a GDE in 2020. However, I learned that the application process is conducted in English and because of this, I ultimately didn’t complete the application process.

In 2021, while I was speaking at the Google DevFest conference, a GDE friend asked me again if I was interested in becoming a GDE, and with the encouragement of a team member from Google, I finally started preparing for the GDE application.

Application process

During the application process, the Google team pays careful attention to two aspects:

  1. Technical competence: your technical expertise in the field you are applying for
  2. Technical influence: such as output in areas such as public speaking, articles, and open source

I was not confident in speaking in English so I practiced before my interviews and I also translated some of my articles and posted them to Medium in English. Then I started my interview journey. The first interviewer mainly focused on the technical content of Flutter and Dart and despite my little experience with Flutter, my first community interview was completed.

The day after I completed the initial interview, I received a notification that I was assigned an interviewer for the product interview. The content of the product interview mainly revolved around some of my experience with Flutter technology. The interviewer was interested in the content of the books I had written and some awards I won that happened to be in the bookcase behind me, proving to be an excellent conversation starter. The next day, I received an email letting me know that I passed the interview - and after I signed the various agreements and terms and conditions, I had a final meeting with the team to become a GDE! Once I officially received the confirmation email from the GDE program, I was pulled into various groups, Slack, and projects. As a developer, I consider accomplishing the feat of becoming a GDE a major milestone.

Whether it is the GDE community or a Googler conducting the interviews, everyone was very friendly. I received a lot of support throughout my journey to becoming a GDE and offer my support to anyone interested in joining the community. Please feel free to connect with me at https://github.com/carguo!

Firebase Stories: Celebrating our developer community

Posted by Akua Prempeh Developer Marketing

When we ask you what you like best about Firebase, a lot of you tell us it’s the community that makes Firebase special. We are excited to highlight developers in the community who are using Firebase in their apps through a new series called, Firebase Stories.

Firebase Stories celebrates developers whose apps are helping promote positive change in their communities. Starting today, and over the coming months, you'll hear from developers and founders from around the world about their app development journeys. Additionally, these developers will demo how they are using Firebase tools in their projects so you can apply Firebase to your own apps. Everyone can watch the demos together and chat with both the developers and members of the Firebase team along the way. We’ll also share guided codelabs on these Firebase features so you can get hands-on experience with them. Stay tuned for more details!

Lastly, we’d love to hear from you too. Use the hashtag #FirebaseStories on your social channels to share how Firebase empowers you throughout your app development journey. We will regularly select and share some stories on our channels.

To learn more about this campaign, visit our website, follow us on Twitter and subscribe to the Firebase YouTube channel.

Firebase Stories: Celebrating our developer community

Posted by Akua Prempeh Developer Marketing

When we ask you what you like best about Firebase, a lot of you tell us it’s the community that makes Firebase special. We are excited to highlight developers in the community who are using Firebase in their apps through a new series called, Firebase Stories.

Firebase Stories celebrates developers whose apps are helping promote positive change in their communities. Starting today, and over the coming months, you'll hear from developers and founders from around the world about their app development journeys. Additionally, these developers will demo how they are using Firebase tools in their projects so you can apply Firebase to your own apps. Everyone can watch the demos together and chat with both the developers and members of the Firebase team along the way. We’ll also share guided codelabs on these Firebase features so you can get hands-on experience with them. Stay tuned for more details!

Lastly, we’d love to hear from you too. Use the hashtag #FirebaseStories on your social channels to share how Firebase empowers you throughout your app development journey. We will regularly select and share some stories on our channels.

To learn more about this campaign, visit our website, follow us on Twitter and subscribe to the Firebase YouTube channel.

Google Play Indie Games Festival: Finalists revealed

Posted by Patricia Correa, Director, Global Developer Marketing

The Indie Games Festival shines a spotlight on some of the best games on Google Play, and celebrates the passion and creativity that small games studios bring to gamers worldwide. This year we are hosting Festival in South Korea, Japan and Europe, for local developers and gamers from all over the world.

Earlier this summer, we opened submissions, and today we’re revealing the finalists. Scroll down to see the shortlisted games!

Join the finals

September 3rd will be a jam packed day for indie games fans. Everyone is invited to attend the finals for the three Festivals, starting with South Korea at 2pm KST, followed shortly after by Japan at 3pm JST, and wrapping up with Europe at 11am CET.

The finals will be held in a custom virtual world where you can meet the people behind the finalist games, explore the titles, have fun with gamers from around the world, and be the first to discover the winners.

The events will be hosted by Julia Hardy (Europe), Inho Jung (Korea) and Kajisac (Japan).

At the European finals we will also reveal the class of 2022 of the Indie Games Accelerator, a program that helps small game studios take their game to the next level by providing them training and mentorship.

Without further ado, please meet the finalists and join us in congratulating them!

Europe

(in alphabetical order, also in this collection)

Blacken Slash

DT Space Races

Dungeons of Dreadrock

Find Hidden Objects Game (AR)

Fury Unleashed

Get Together: A Coop Adventure

Gladiators: Survival in Rome

Hygge is...

Kingdom: Idle Gold Tycoon

Kitty Q

Light It Up: Energy Loops

Luna Ravel

Paths: Beatrice's adventure

Pawnbarian

Please, Touch The Artwork

Quadline

Rhythmer_

Square Valley

sugar game

Wingspan

—--

Japan

(in alphabetical order)

A Year of Springs

Attack on Tankette

Brave Farm Survival

Cards and Dragons Sealed

Catastrophe Restaurant

Crazy Donuts

DeathAntique (Early Access not yet available globally)

Dungeon and Gravestone

exp!A

GenEi AP: Empty Heart

HUNGRY PIG

Jack & Detectives

Raspberry Mash

SOULVARS

Statute of Limitations "1 minute" world

SUSHI ALONE

Sushi Food Cart

Time for Coffee in the Strange Forest

Train's Run

UnionShooter360

—--

Korea

(in alphabetical order)

Bingo Star

Calibur League

Connect

Counting Star

Cube Of Life: Resurrection

Drawing Beats!

Dungeon Rogue

FIND ALL 3D

Idle Ghost Hotel

Lost Pages

Meow Tower: Nonogram

Merge of Mini : with your legion

Pa!nt

Random Card

Shambles

Soul Launcher

SuperBattle

The Greater

Uglyhood

Undead vs Demon

More about the Indie Games Festival and the Indie Games Accelerator

At Google Play we’re committed to helping developers of all sizes succeed on our platform. Programs like the Festival and the Accelerator are here to help small games studios:

  • Festival | Promotions & prizes that put your game in the spotlight: This contest is your chance to showcase your game to industry experts and players worldwide, and win prizes that will celebrate your art and promote your game.
  • Accelerator | Training and mentorship to supercharge your growth: Over a period of 10 weeks, you will get tailored online training sessions and mentorship from industry and Google experts to help you polish your game and scale with Google Play.

    Learn more about the programs.

    For more updates about all of our programs, resources and tools for indie game developers, follow us on Twitter @GooglePlayBiz and Google Play business community on LinkedIn.

    How useful did you find this blog post?

    Meet the 2022 Code Jam World Finalists!

    Posted by Julia DeLorenzo, Program Manager, Coding Competitions

    The Code Jam World Finals returns!

    Over the past several months, participants have worked their way through multiple rounds of algorithmic coding challenges, and solved some of the most challenging competitive programming problems. The field has been narrowed down from tens of thousands of participants, to the top competitors who will face off at the World Finals on August 5th, 2022

    Join us 16:30 UTC for a livestream to see which one of these finalists will be crowned the Code Jam 2022 World Champion, winning the grand prize of $15,000 USD!

    Here are this year's finalists sharing their favorite music genres, tips, fun facts, and more.

    This year's Code Jam World Finalists are:


    Antonio Molina Lovett

    Handle: y0105w49

    What's your favorite music to listen to while coding?
    “Always looping the Vicious Delicious album by Infected Mushroom.”

    Yuhao Du

    Handle: xll114514

    Code Jam claim to fame:
    This is Yuhao’s second time at the Code Jam World Finals, previously competing in the 2021 World Finals.

    Benjamin Qi

    Handle: Benq

    What's your favorite 2022 Code Jam Problem?
    “Qualification Round - Twisty Little Passages. First time I used importance sampling in a contest!”

    Sangsoo Park

    Handle: molamola

    What does your handle mean?
    "1. I personally like sunfish :)
    2. I like the way it sounds.
    3. Mola is pronounced "몰라" in Korean, which means "I don't know".”

    Daniel Rutschmann

    Handle: dacin21

    What's the best coding competition advice you've ever received?
    “Have fun and always try to challenge yourself by solving problems that seem too difficult at first.”

    Mingyang Deng

    Handle: CauchySheep

    What's an interesting and fun fact about yourself?
    “I love random walking.”

    Gennady Korotkevich

    Handle: Gennady.Korotkevich

    What’s your favorite 2022 Code Jam Problem?
    Saving the Jelly from Round 2 took the most creativity to solve!”

    Alexander Golovanov

    Handle: Golovanov399

    What's an interesting and fun fact about yourself?
    “I have 11 musical instruments, most of which I can only play on a level "may accompany in a song I know."

    Andrew He

    Handle: ecnerwala

    Code Jam claim to fame:
    This will be Andrew’s fourth time competing in the Code Jam World Finals, having competed in 2019, 2020, and 2021 previously.

    Aleksei Esin

    Handle: ImBarD

    What's an interesting and fun fact about yourself?
    “I love bungee jumping.”

    Lingyu Jiang

    Handle: jiangly

    What's an interesting and fun fact about yourself?
    This is Lingyu’s first time competing in the Code Jam World Finals.

    Kevin Sun

    Handle: ksun48

    Code Jam claim to fame:
    This will be Kevin’s third time competing in the Code Jam World Finals, having competed in 2019 and 2020 previously.

    Lukas Michel

    Handle: lumibons

    What does your handle mean?
    “It's a combination of letters from my name and the name of the village where I grew up.”

    Matvii Aslandukov

    Handle: BigBag

    What's an interesting and fun fact about yourself?
    “I enjoy playing sports such as tennis, table tennis, volleyball, football, as well as playing piano and guitar.”

    Borys Minaiev

    Handle: qwerty787788

    What's an interesting and fun fact about yourself?
    “A year ago I started doing buildering and we created a chat with just 3 people in it. Now there are almost 100 participants. Who could imagine it would grow so fast?”

    Yahor Dubovik

    Handle: mhg

    What's your favorite music to listen to while coding?
    “Red Hot Chilli Peppers.”

    Mateusz Radecki

    Handle: Radewoosh

    What's the best coding competition advice you've ever received?
    “Becoming good isn't about creating a chance to solve a problem. It's about removing a chance to not solve a problem.”

    Nikolay Kalinin

    Handle: KalininN

    What's an interesting and fun fact about yourself?
    “I'm an experimentalist in laser physics, also I love traveling and photography.”

    Simon Lindholm

    Handle: simonlindholm

    What's an interesting and fun fact about yourself?
    “I've been really into the Super Mario 64 A Button Challenge recently, and N64 game decompilation. Also, mushroom hunting.”

    Kento Nikaido

    Handle: Snuke

    What's an interesting and fun fact about yourself?
    “I'm a cat. My recent hobby is Sed Puzzle

    Tiancheng Lou

    Handle: ACRushTC

    Code Jam claim to fame:
    This will be Tiancheng’s eighth Code Jam World Finals, having previously competed in the World Finals in 2006, 2008, 2009, 2010, 2011, 2019, 2021.

    Aleksei Daniliuk

    Handle: Um_nik

    What’s your favorite 2022 Code Jam Problem?
    "I, O Bot from Round 2, because it was actually a competitive programming problem”

    Yuta Takaya

    Handle: yutaka1999

    What’s your favorite 2022 Code Jam Problem?
    Saving the Jelly. It is mainly because I solved it in the last five minutes of the contest.”

    Konstantin Semenov

    Handle: zemen

    Code Jam claim to fame:
    This will be Konstantin’s third Code Jam World Finals, having previously competed in the World Finals in 2017 and 2018.

    Watch the Code Jam World Finals Livestream 

    Join us on August 5 at 16:30 UTC for a livestream of the Code Jam 2022 World Finals. 

    Watch all the action unfold as the Code Jam team broadcasts live from Google New York. You'll have an opportunity to hear from our team, see Code Jam engineers explain the problems from the round, and watch live as we reveal the scoreboard and announce this year's winners!

    At the end, one of these finalists will be crowned the Code Jam 2022 World Champion, winning the grand prize of $15,000 USD. Good luck to all the finalists and as always, happy coding!

    RandoTek: Traveling around Tunisia to share technical knowledge

    Posted by Salim Abid, Regional Lead. Middle East & North Africa, Google Developers

    Training young Tunisian developers in remote areas

    On weekends, the volunteers would travel for hours to new regions, sometimes on bumpy roads and on crowded, rickety buses. Their purpose? To inspire others around the country and teach them about new technologies. When the members of two Google Developer Groups (GDG) in the Beja and Sousse regions of Tunisia came together to address the challenge that many of their fellow Tunisian citizens had limited access to technology. They decided to make a difference by launching Randotek, a program in Tunisia to help train young developers that gets its name from the French word randonne, which means to hike.

    Many community members from these chapters, including Alaedeen Eloueryemmi of GDG Sousse and Yasmina Rebai of GDG Beja, support the initiative. Alaedeen, a software engineer, joined GDG Sousse in 2021, after graduating from university, where he co-founded the ESSTHS Google Developer Student Club. Yasmina joined GDG Beja at the suggestions of a software engineer friend.

    Sharing technology knowledge and building community

    The origin story for GDG RandoTek goes back to January 2022, when Alaedeen gave a talk at DevFest Beja. During his talk, he and the other members of the GDG Beja and GDG Sousse teams noticed many students couldn't follow his talk because of their lack of familiarity with Google technologies. Acknowledging that many of their fellow Tunisian citizens need more access to technology, the GDG RandoTek volunteers began teaching workshops in February 2022.

    “We wanted to give others an overview of the community and the new technologies out there,” says Alaedeen. “We want to build a strong community of developers and allow people to achieve their dreams. In Tunisia, people don’t always have access to courses or materials, so we bring that to them.”

    Positive impacts for the community

    To date, the program generated positive impacts, in Tunisia including:

    • The organizers hosted nine sessions for over 412 developers in eight regions of Tunisia and five cities.
    • The community initiative has run many four-hour workshops on Google technologies including Flutter; Go; Angular; progressive web apps; AI and machine learning; TensorFlow; Google Cloud Platform; and DevOps.
    • Attendees expressed interest in learning more about specific technologies, like Flutter and Cloud, and in joining a GDG group.
    • GDG RandoTek members continue to be asked to give additional workshops, online and in-person, making it a powerful learning experience for them as well.

    Building a tech community in Tunisia

    The GDG RandoTek organizers note that as more young developers receive training on various technologies, they will feel inspired to form new developer communities in their own local area. The more of those types of groups there are, the easier it will be to reach even more people in Tunisia. “That’s what we want to spread in Tunisia–to have more than one GDSC in every region, and more than one chapter in every place,” says Yasmina. The RandoTek team remains motivated to share knowledge and expand the community with new members.

    “What we wanted to do during this program is to share the knowledge,” says Alaedeen. “Share the spirit of community work and get together and learn stuff.” The organizers all seem to share a mutual admiration for helping others. “Seeing how the world evolves each day and the need for technologies in our daily life, I would advise anyone, especially students, to learn as much technology as possible because they’re going to use them someday, somehow,” Yasmina says.

    What’s next for GDG RandoTek in Tunisia

    For organizers like Aladeen, Yasmina, and their collaborators, the GDG community unlocks potential, creates leaders, and helps people relate to each other through technology. It creates a way to motivate others to become teachers and share technical knowledge and build skills.

    “For me, if it wasn’t for GDG, I wouldn’t be the person I am today,” says Alaedeen. “It improved my career, my management skills, and my technical skills, and I want everyone to have that opportunity.”

    Visit the Google Developer Groups page and find out how to join a Google Developer Community near you!

    How to use App Engine Blobstore (Module 15)

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

    Introduction and background

    In our ongoing Serverless Migration Station mini-series aimed at helping developers modernize their serverless applications, one of the key objectives for Google App Engine developers is to upgrade to the latest language runtimes, such as from Python 2 to 3 or Java 8 to 17. Another goal is to demonstrate how to move away from App Engine legacy APIs (now referred to as "bundled services") to Cloud standalone replacement services. Once this has been accomplished, apps are much more portable, making them flexible enough to:

    Developers building web apps that provide for user uploads or serve large files like videos or audio clips can benefit from convenient "blob" storage backing such functionality, and App Engine's Blobstore serves this specific purpose. As mentioned above, moving away from proprietary App Engine services like Blobstore makes user apps more portable. The original underlying Blobstore infrastructure eventually merged with the Cloud Storage service anyway, so it's logical to move completely to Cloud Storage when convenient, and this content is inform on this process.

    Showing App Engine users how to use its Blobstore service
    In today's Module 15 video, we begin this journey by showing users how to add Blobstore usage to a sample app, setting us up for our next move to Cloud Storage in Module 16. Similar videos in this series adding use of an App Engine bundled service start with a Python 2 sample app that has already migrated web frameworks from webapp2 to Flask, but not this time.

    Blobstore for Python 2 has a dependency on webapp, the original App Engine micro framework replaced by webapp2 when the Python 2.5 runtime was deprecated in favor of 2.7. Because the Blobstore handlers were left "stuck" in webapp, it's better to start with a more generic webapp2 app prior to a Flask migration. This isn't an issue because we modernize this app completely in Module 16 by:

    • Migrating from webapp2 (and webapp) to Flask
    • Migrating from App Engine NDB to Cloud NDB
    • Migrating from App Engine Blobstore to Cloud Storage
    • Migrating from Python 2 to Python (2 and) 3

    We'll go into more detail in Module 16, but it suffices to say that once those migrations are complete, the resulting app becomes portable enough for all the possibilities mentioned at the top.

    Adding use of Blobstore

    The original sample app registers individual web page "visits," storing visitor information such as the IP address and user agent, then displaying the most recent visits to the end-user. In today's video, we add one additional feature: allowing visitors to optionally augment their visits with a file artifact, like an image. Instead of registering a visit immediately, the visitor is first prompted to provide the artifact, as illustrated below.

    The updated sample app's new artifact prompt page

    The end-user can choose to do so or click a "Skip" button to opt-out. Once this process is complete, the same most recent visits page is then rendered, with one difference: an additional link to view a visit artifact if one's available.

    The sample app's updated most recent visits page

    Below is pseudocode representing the core part of the app that was altered to add Blobstore usage, namely new upload and download handlers as well as the changes required of the main handler. Upon the initial GET request, the artifact form is presented. When the user submits an artifact or skips, the upload handler POSTs back to home ("/") via an HTTP 307 to preserve the verb, and then the most recent visits page is rendered as expected. There, if the end-user wishes to view a visit artifact, they can click a "view" link where the download handler which fetches and returns the corresponding artifact from the Blobstore service, otherwise an HTTP 404 if the artifact wasn't found. The bolded lines represent the new or altered code.

    Adding App Engine Blobstore usage to sample app

    Wrap-up

    In this "migration," we added Blobstore usage to support visit artifacts to the Module 0 baseline sample app and arrived at the finish line with the Module 15 sample app. To get hands-on experience doing it yourself, do the codelab by hand and follow along with the video. Then you'll be ready to upgrade to Cloud Storage should you choose to do so. 

    In Fall 2021, the App Engine team extended support of many of the bundled services to 2nd generation runtimes (that have a 1st generation runtime), meaning you are no longer required to migrate to Cloud Storage when porting your app to Python 3. You can continue using Blobstore in your Python 3 app so long as you retrofit the code to access bundled services from next-generation runtimes

    If you do want to move to Cloud Storage, Module 16 is next. You can also try its codelab to get a head start. All Serverless Migration Station content (codelabs, videos, source code [when available]) can be accessed at its open source repo. While our content initially focuses on Python users, the Cloud team is working on covering other language runtimes, so stay tuned. For additional video content, check out our broader Serverless Expeditions series.