Skip to content

Software Development Blogs: Programming, Software Testing, Agile Project Management

Methods & Tools

Subscribe to Methods & Tools
if you are not afraid to read more than one page to be a smarter software developer, software tester or project manager!

Programming

Leaflet: Mapping Strava runs/polylines on Open Street Map

Mark Needham - Sat, 04/29/2017 - 16:36

I’m a big Strava user and spent a bit of time last weekend playing around with their API to work out how to map all my runs.

2017 04 29 15 56 06

Strava API and polylines

This is a two step process:

  1. Call the /athlete/activities/ endpoint to get a list of all my activities
  2. For each of those activities call /activities/[activityId] endpoint to get more detailed information for each activity

That second API returns a ‘polyline’ property which the documentation describes as follows:

Activity and segment API requests may include summary polylines of their respective routes. The values are string encodings of the latitude and longitude points using the Google encoded polyline algorithm format.

If we navigate to that page we get the following explanation:

Polyline encoding is a lossy compression algorithm that allows you to store a series of coordinates as a single string.

I tried out a couple of my polylines using the interactive polyline encoder utility which worked well once I realised that I needed to escape backslashes (“\”) in the polyline before pasting it into the tool.

Now that I’d figured out how to map one run it was time to automate the process.

Leaflet and OpenStreetMap

I’ve previously had a good experience using Leaflet so I was keen to use that and luckily came across a Stack Overflow answer showing how to do what I wanted.

I created a HTML file and manually pasted in a couple of my runs (not forgetting to escape those backslashes!) to check that they worked:

blog.html


  
    Mapping my runs
  

  
    
    
    
    

    
    var map = L.map('map').setView([55.609818, 13.003286], 13);
    L.tileLayer(
        'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
            maxZoom: 18,
        }).addTo(map);

    var encodedRoutes = [
      "{zkrIm`inANPD?BDXGPKLATHNRBRFtAR~AFjAHl@D|ALtATj@HHJBL?`@EZ?NQ\\Y^MZURGJKR]RMXYh@QdAWf@[~@aAFGb@?j@YJKBU@m@FKZ[NSPKTCRJD?`@Wf@Wb@g@HCp@Qh@]z@SRMRE^EHJZnDHbBGPHb@NfBTxBN|DVbCBdA^lBFl@Lz@HbBDl@Lr@Bb@ApCAp@Ez@g@bEMl@g@`B_AvAq@l@    QF]Rs@Nq@CmAVKCK?_@Nw@h@UJIHOZa@xA]~@UfASn@U`@_@~@[d@Sn@s@rAs@dAGN?NVhAB\\Ox@@b@S|A?Tl@jBZpAt@vBJhATfGJn@b@fARp@H^Hx@ARGNSTIFWHe@AGBOTAP@^\\zBMpACjEWlEIrCKl@i@nAk@}@}@yBOWSg@kAgBUk@Mu@[mC?QLIEUAuAS_E?uCKyCA{BH{DDgF`AaEr@uAb@oA~@{AE}AKw@    g@qAU[_@w@[gAYm@]qAEa@FOXg@JGJ@j@o@bAy@NW?Qe@oCCc@SaBEOIIEQGaAe@kC_@{De@cE?KD[H[P]NcAJ_@DGd@Gh@UHI@Ua@}Bg@yBa@uDSo@i@UIICQUkCi@sCKe@]aAa@oBG{@G[CMOIKMQe@IIM@KB]Tg@Nw@^QL]NMPMn@@\\Lb@P~@XT",
      "u}krIq_inA_@y@My@Yu@OqAUsA]mAQc@CS@o@FSHSp@e@n@Wl@]ZCFEBK?OC_@Qw@?m@CSK[]]EMBeAA_@m@qEAg@UoCAaAMs@IkBMoACq@SwAGOYa@IYIyA_@kEMkC]{DEaAScC@yEHkGA_ALsCBiA@mCD{CCuAZcANOH@HDZl@Z`@RFh@\\TDT@ZVJBPMVGLM\\Mz@c@NCPMXERO|@a@^Ut@s@p@KJAJ    Bd@EHEXi@f@a@\\g@b@[HUD_B@uADg@DQLCLD~@l@`@J^TF?JANQ\\UbAyABEZIFG`@o@RAJEl@_@ZENDDIA[Ki@BURQZaARODKVs@LSdAiAz@G`BU^A^GT@PRp@zARXRn@`BlDHt@ZlAFh@^`BX|@HHHEf@i@FAHHp@bBd@v@DRAVMl@i@v@SROXm@tBILOTOLs@NON_@t@KX]h@Un@k@\\c@h@Ud@]ZGNKp@Sj@KJo@    b@W`@UPOX]XWd@UF]b@WPOAIBSf@QVi@j@_@V[b@Uj@YtAEFCCELARBn@`@lBjAzD^vB^hB?LENURkAv@[Ze@Xg@Py@p@QHONMA[HGAWE_@Em@Hg@AMCG@QHq@Cm@M[Jy@?UJIA{@Ae@KI@GFKNIX[QGAcAT[JK?OVMFK@IAIUKAYJI?QKUCGFIZCXDtAHl@@p@LjBCZS^ERAn@Fj@Br@Hn@HzAHh@RfD?j@TnCTlA    NjANb@\\z@TtARr@P`AFnAGfBG`@CFE?"
  ]

    for (let encoded of encodedRoutes) {
      var coordinates = L.Polyline.fromEncoded(encoded).getLatLngs();

      L.polyline(
          coordinates,
          {
              color: 'blue',
              weight: 2,
              opacity: .7,
              lineJoin: 'round'
          }
      ).addTo(map);
    }
    
  

We can spin up a Python web server over that HTML file to see how it renders:

$ python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

And below we can see both runs plotted on the map.

2017 04 29 15 53 28 Automating Strava API to Open Street Map

The final step is to automate the whole thing so that I can see all of my runs.

I wrote the following script to call the Strava API and save the polyline for every run to a CSV file:

import requests
import os
import sys
import csv

token = os.environ["TOKEN"]
headers = {'Authorization': "Bearer {0}".format(token)}

with open("runs.csv", "w") as runs_file:
    writer = csv.writer(runs_file, delimiter=",")
    writer.writerow(["id", "polyline"])

    page = 1
    while True:
        r = requests.get("https://www.strava.com/api/v3/athlete/activities?page={0}".format(page), headers = headers)
        response = r.json()

        if len(response) == 0:
            break
        else:
            for activity in response:
                r = requests.get("https://www.strava.com/api/v3/activities/{0}?include_all_efforts=true".format(activity["id"]), headers = headers)
                polyline = r.json()["map"]["polyline"]
                writer.writerow([activity["id"], polyline])
            page += 1

I then wrote a simple script using Flask to parse the CSV files and send a JSON representation of my runs to a slightly modified version of the HTML page that I described above:

from flask import Flask
from flask import render_template
import csv
import json

app = Flask(__name__)

@app.route('/')
def my_runs():
    runs = []
    with open("runs.csv", "r") as runs_file:
        reader = csv.DictReader(runs_file)

        for row in reader:
            runs.append(row["polyline"])

    return render_template("leaflet.html", runs = json.dumps(runs))

if __name__ == "__main__":
    app.run(port = 5001)

I changed the following line in the HTML file:

var encodedRoutes = {{ runs|safe }};

Now we can launch our Flask web server:

$ python app.py 
 * Running on http://127.0.0.1:5001/ (Press CTRL+C to quit)

And if we navigate to http://127.0.0.1:5001/ we can see all my runs that went near Westminster:

2017 04 29 16 32 00

The full code for all the files I’ve described in this post are available on github. If you give it a try you’ll need to provide your Strava Token in the ‘TOKEN’ environment variable before running extract_runs.py.

Hope this was helpful and if you have any questions ask me in the comments.

The post Leaflet: Mapping Strava runs/polylines on Open Street Map appeared first on Mark Needham.

Categories: Programming

Start planning your Google I/O 2017 schedule!

Google Code Blog - Fri, 04/28/2017 - 18:44
Posted by Christopher Katsaros, Product Marketing Manager

Whether you're joining us in person or remotely, we're looking forward to connecting with you at Google I/O, on May 17-19. It's the best way to learn about building apps for the Google Assistant, how to go from Zero to App with Firebase, all of the goodies inside Android O, and much more!

Over 150 Technical Sessions, Livestreamed

The show kicks off at 10AM PDT on Wednesday, May 17 with the Google Keynote, an opportunity to hear about the latest product and platform innovations from Google, helping connect you to billions of users around the world. After that, we'll be diving into all of the ways developers can take advantage of this newness in a Developer Keynote at 1PM PDT. From there, the 14 tracks at Google I/O kickoff, with over 150 technical sessions livestreamed (i.e. all of them!) at google.com/io.

We've just published more talks on the I/O website, so you can start planning your custom schedule ahead of the conference (shhh! we've got a few more sessions up our sleeve, so don't forget to check back directly after the Developer Keynote).

You can also take advantage of Codelabs - self-paced tutorials on a number of technical topics to get you up and running with a Google product or feature. These Codelabs will be available both to those who are joining us in person at Shoreline, and online for those of you tuning in from around the world. More details will be available on the schedule soon.

Joining in person?

We received a lot of great feedback from attendees last year, and have been working hard since then to make sure this is the best Google I/O, yet. To help make it easier to attend your favorite talks and minimize lines, you'll be able to reserve seats across sessions before I/O starts. But don't worry, we're saving a few seats in each session that will be available on a first-come, first-served basis onsite. We've also increased the size of each of the tents this year, giving you more opportunities to see all of your favorite talks in-person.

Finally, we've doubled the number of Office Hours available, since you told us that being able to connect directly with Googlers to get your questions answered was extremely valuable. On top of that, all of the sandbox demo areas will be inside climate-controlled structures, making it easier to avoid the elements (but don't forget to bring your layers – Shoreline Amphitheatre is still an outdoor venue, after all).

See you in 3 weeks!

We're looking forward to seeing you in just a few weeks. We've got a few more updates to share before then; be sure to check out the Google I/O website for more details, or follow the conversation using the #io17 hashtag.


Categories: Programming

SafetyNet attestation, a building block for anti-abuse

Android Developers Blog - Thu, 04/27/2017 - 22:00
Posted by Arindam Basu, Borbala Benko, Alan Butler, Edward Cunningham, William Luh

Building innovative security features for Android app developers and their users continues to be a priority. As part of this effort, we provide SafetyNet attestation, an API for developers to remotely evaluate whether they are talking to a genuine Android device.

SafetyNet examines software and hardware information on the device to assess its integrity. The result is a cryptographically signed statement, attesting basic properties of the device — such as overall integrity and compatibility with Android (CTS) — as well as metadata about your app, such as its package name and signature. The following JSON snippet shows an example of how the API reports this information:

{
  "nonce": "R2Rra24fVm5xa2Mg",
  "timestampMs": 9860437986543,
  "apkPackageName": "com.package.name.of.requesting.app",
  "apkCertificateDigestSha256": ["base64 encoded, SHA-256 hash of the
                                  certificate used to sign requesting app"],
  "apkDigestSha256": "base64 encoded, SHA-256 hash of the app's APK",
  "ctsProfileMatch": true,
  "basicIntegrity": true,
}
The contents of an example attestation response, providing information about the calling app and the integrity and compatibility of the device.

The SafetyNet attestation API can help your server distinguish traffic coming from genuine, compatible Android devices from traffic coming from less-trusted sources, including non-Android devices. This classification helps you better understand the risks associated with each device so that you can fine-tune preventive or mitigative actions in case of abuse or misbehavior.

We encourage developers to use SafetyNet attestations to augment their anti-abuse strategy. Combine SafetyNet attestation with other signals, such as your existing device-side signals and behavioral signals about what the user is trying to do, in order to build robust, multi-tier protection systems.

For further information, check the recently updated documentation and see the SafetyNet API Samples on GitHub.
Categories: Programming

Python: Flask – Generating a static HTML page

Mark Needham - Thu, 04/27/2017 - 21:59

Whenever I need to quickly spin up a web application Python’s Flask library is my go to tool but I recently found myself wanting to generate a static HTML to upload to S3 and wondered if I could use it for that as well.

It’s actually not too tricky. If we’re in the scope of the app context then we have access to the template rendering that we’d normally use when serving the response to a web request.

The following code will generate a HTML file based on a template file templates/blog.html:

from flask import render_template
import flask

app = flask.Flask('my app')

if __name__ == "__main__":
    with app.app_context():
        rendered = render_template('blog.html', \
            title = "My Generated Page", \
            people = [{"name": "Mark"}, {"name": "Michael"}])
        print(rendered)

templates/index.html



  
	{{ title }}
  
  
	{{ title }}
  
    {% for person in people %}
  • {{ person.name }}
  • {% endfor %}

If we execute the Python script it will generate the following HTML:

$ python blog.py 


  
	My Generated Page
  
  
	My Generated Page
  
  • Mark
  • Michael


And we can finish off by redirecting that output into a file:

$ python blog.py  > blog.html

We could also write to the file from Python but this seems just as easy!

The post Python: Flask – Generating a static HTML page appeared first on Mark Needham.

Categories: Programming

The Google Play Awards are returning to Google I/O

Android Developers Blog - Thu, 04/27/2017 - 18:33
Posted by Purnima Kochikar, Director, Apps and Games Business Development, Google Play


Drum roll please! The Google Play Awards are back again this year and will take place Thursday, May 18th at 6:30pm (Pacific Time) during Google I/O, our annual developer festival.

The annual ceremony is a great opportunity for the industry to recognize outstanding developers that continue to set the bar for quality apps and games showing a passion for driving innovation and adoption of new platforms and user experiences.

This year we'll be honoring partners across 12 award categories, some familiar and some new. Nominees were selected much like last year by cross-functional teams throughout Google who work hand-in-hand with the relevant categories and product areas. While category specific criteria can be found below, the common requirements across all categories focused on high star rating, technical performance and freshness, requiring a launch or major update since April 2016. The winners of each category will be announced at Google I/O in May.

The full list of categories and nominees are below and can also be found at g.co/play/GPA2017:
Standout Indie

Games from indie developers that focus on artistic design, gameplay mechanics and overall polish. And the nominees are…… 

 Standout Indie
Standout Startup Apps from new developers that offer a unique experience while achieving strong organic install growth. And the nominees are……  Standout Startup

Best Android Wear Experience New wear 2.0 apps offering great design, user delight and functionality. And the nominees are…  Best Android Wear Experience

Best TV Experience Apps or games leveraging innovative features for the large-screen format while providing an immersive and intuitive experience. And the nominees are…  Best TV Experience

Best VR Experience Highly engaging and immersive experience with optimal use of Daydream UI. And the nominees are…  Best VR Experience

Best AR Experience Apps or games harnessing the creative and imaginative technology of AR. And the nominees are…  Best AR Experience

Best App for Kids Apps or games with family friendly design that encourage creativity, exploration and education. And the nominees are…  Best App for Kids

Best Multiplayer Game

Games built to connect gamers in competitive and engaging multiplayer experiences. And the nominees are…

 Best Multiplayer Game

Best App A true representation of beautiful design, intuitive UX and high user appeal. And the nominees are…  Best App

Best Game Games with strong mechanics, stellar graphics and strong engagement and retention tactics. And the nominees are...  Best Game

Best Accessibility Experience Apps or games enabling device interaction in an innovative way that serves people with disabilities or special needs. And the nominees are…  Best Accessibility Experience

Best Social Impact Apps that creates meaningful social impact for a broad spectrum of people around the world. And the nominees are…  Best Social Impact

Join us live at the ceremony May 18th at 6:30 pm PDT at Google I/O or via the live stream to see who wins.


How useful did you find this blogpost?


Categories: Programming

Introducing the Google Assistant SDK

Google Code Blog - Thu, 04/27/2017 - 18:01
Posted by Chris Ramsdale, Product Manager

When we first announced the Google Assistant, we talked about helping users get things done no matter what device they're using. We started with Google Allo, Google Home and Pixel phones, and expanded the Assistant ecosystem to include Android Wear and Android phones running Marshmallow and Nougat over the last few months. We also announced that Android Auto and Android TV will get support soon.

Today, we're taking another step towards building out that ecosystem by introducing the developer preview of the Google Assistant SDK. With this SDK you can now start building your own hardware prototypes that include the Google Assistant, like a self-built robot or a voice-enabled smart mirror. This allows you to interact with the Google Assistant from any platform.

The Google Assistant SDK includes a gRPC API, a Python open source client that handles authentication and access to the API, samples and documentation. The SDK allows you to capture a spoken query, for example "what's on my calendar", pass that up to the Google Assistant service and receive an audio response. And while it's ideal for prototyping on Raspberry Pi devices, it also adds support for many other platforms.

To get started, visit the Google Assistant SDK website for developers, download the SDK, and start building. In addition, Wayne Piekarski from our Developer Relations team has a video introducing the Google Assistant SDK, below.


And for some more inspiration, try our samples or check out an example implementation by Deeplocal, an innovation studio out of Pittsburgh that took the Google Assistant SDK for a spin and built a fun mocktails mixer. You can even build one for yourself: go here to learn more and read their documentationon Github. Or check out the video below on how they built their demo from scratch.


This is a developer preview and we have a number of features in development including hotword support, companion app integration and more. If you're interested in building a commercial product with the Google Assistant, we encourage you to reach out and contact us. We've created a new developer community on Google+ at g.co/assistantsdkdev for developers to keep up to date and discuss ideas. There is also a stackoverflow tag [google-assistant-sdk] for questions, and a mailing list to keep up to date on SDK news. We look forward to seeing what you create with the Google Assistant SDK!
Categories: Programming

New OnDemand Course - 10x Software Development, 2nd Edition

10x Software Development - Steve McConnell - Wed, 04/26/2017 - 11:54

How do you maximize team productivity? Decades of research have found at least a ten-fold—“10x”—difference in productivity and quality between the best teams and the worst. The studies have collectively involved hundreds of professional programmers across a spectrum of programming activities. Specific differences range from about 5:1 to about 25:1, and in my judgment, that collectively supports the 10x claim. Moreover, the research finding is consistent with my experience, in which I have personally observed 10x differences (or more) between different programmers.

Fully updated from beginning to end, our 10x Software Development, Second Edition online course describes the Eight Key Principles of 10x software development—how the most effective teams approach their work. The principles are: 

  • Avoid minus-x software development
  • Set direction
  • Attack uncertainty
  • Tailor the solution to the problem
  • Seek ground truth
  • Make decisions with data
  • Minimize unintentional rework
  • Grow capability

You’ll gain a deep understanding of these principles in this course, and you’ll learn specific tactics for turning your team into a 10x team.

New for the second edition are multiple activities to deepen your learning experience, including case studies, exercises, and quizzes; a reassessment and refreshing of every lesson in the course via full in-studio production (no “voice over PowerPoint”); and the addition of tactic-specific resources to help you take your learning beyond our course. There’s literally nothing about this course that we haven’t improved!

Because 10x software development requires all roles to be strong, this course is appropriate for Managers, Technical Leads, Quality Leads, Test Leads, Developers, Testers, and other software project stakeholders. In other words, this is a good course for software development teams as well as individual practitioners.

After you complete this course, you will be able to: 

  • Apply tactics to address the classic mistakes your team is making
  • Identify the development fundamentals you need to grow
  • Make decisions that will stick

After your team completes this course, it will be able to:

  • Confirm that you are all aligned on the project’s objectives
  • Match your development lifecycle to your work rather than the other way around
  • Apply risk management appropriately
  • Plan the right kind of early defect detection
  • Review and enhance your feedback loops

If you’re not already a member of Construx OnDemand, start a free trial today and take your first steps toward 10x excellence!

For a description of the body of research proving the existence of the 10x phenomenon, see my earlier blog post “Origins of 10X – How Valid is the Underlying Research?”

SE-Radio Episode 289: James Turnbull on Declarative Programming with Terraform

James Turnbull rejoins the show with Robert Blumen for a conversation mostly about Terraform, as well as a bit about Puppet. Terraform is a declarative programming tool for automating infrastructure resource creation; it targets resource providers, such as Amazon AWS, Microsoft Azure, Digital Ocean, and other cloud and SAAS back ends. The discussion explores the […]
Categories: Programming

Eight Characteristics of Successful Software Projects

Xebia Blog - Sun, 04/23/2017 - 09:21

We do a lot of software projects at Xebia Software Development. We work most of the time at our client’s location, in their teams. Together we improve the quality of their software, their process, and engineering culture. As such, we’ve seen a lot of projects play out. Most of these efforts succeeded but some failed. […]

The post Eight Characteristics of Successful Software Projects appeared first on Xebia Blog.

Being an Agile Security Officer: user stories

Xebia Blog - Sat, 04/22/2017 - 14:28

This is the fourth part of my 'Being an Agile Security Officer series'. In this blog post I will go deeper into the details of how user stories are created and what role security stakeholders should play in that. The Epic Within Agile, work is usually defined in user stories. These are minimal and defined […]

The post Being an Agile Security Officer: user stories appeared first on Xebia Blog.

Cheating and building secure iOS games

Xebia Blog - Fri, 04/21/2017 - 07:53

You probably have one of the million games where you earn achievements and unlock specials on your iPad or iPhone. If you develop games, you've probably wondered about people cheating your games? In this blog we're going to show you how to try cheating out yourself and how to build secure iOS games.The actual question […]

The post Cheating and building secure iOS games appeared first on Xebia Blog.

Using field masks with update requests to Google APIs

Google Code Blog - Fri, 04/21/2017 - 04:00
Originally posted on the G Suite Developers Blog
Posted by Wesley Chun (@wescpy), Developer Advocate, G Suite

We recently demonstrated how to use field masks to limit the amount of data that comes back via response payloads from read (GET) calls to Google APIs. Today, we'll focus on a different use case for field masks: update requests.

In this scenario, field masks serve a different, but similar purpose—they still filter, but function more like bitmasks by controlling which API fields to update. The following video walks through several examples of update field mask usage with both the Google Sheets and Slides APIs. Check it out.


In the sample JSON payload below, note the request to set the cells’ bold attribute to true (per the cell directive below), then notice that the field mask (fields) practically mirrors the request:

{
"repeatCell": {
"range": {
"endRowIndex": 1
},
"cell": {
"userEnteredFormat": {
"textFormat": {
"bold": true
}
}
},
"fields": "userEnteredFormat/textFormat/bold",
}
}

Now, you might think, "is that redundant?" Above, we highlighted that it takes two parts: 1) the request provides the data for the desired changes, and 2) the field mask states what should be updated, such as the userEnteredFormat/textFormat/bold attribute for all the cells in the first row. To more clearly illustrate this, let's add something else to the mask like italics so that it has both bold and italic fields:

        "fields": "userEnteredFormat/textFormat(bold,italic)"
However, while both elements are in the field mask, we've only provided the update data for bold. There's no data for italic setting specified in the request body. In this case, italics for all cells will be reset, meaning if the cells were originally italicized, those italics will be removed after this API request completes. And vice versa, if the cells were not italicized to begin with, they'll stay that way. This feature gives developers the ability to undo or reset any prior settings on affected range of cells. Check out the video for more examples and tips for using field masks for update requests.

To learn more about using field masks for partial response in API payloads, check out this video and the first post in this two-part series. For one of the most comprehensive write-ups on both (read and update) use cases, see the guide in the Google Slides API documentation. Happy field-masking!
Categories: Programming

App onboarding for kids: how Budge Studios creates a more engaging experience for families

Android Developers Blog - Thu, 04/20/2017 - 17:26
Posted by Josh Solt (Partner Developer Manager, Kids Apps at Google Play) and Noemie Dupuy (Founder & Co-CEO at Budge Studios)

Developers spend a considerable amount of resources driving users to download their apps, but what happens next is often the most critical part of the user journey. User onboarding is especially nuanced in the kids space since developers must consider two audiences: parents and children. When done correctly, a compelling onboarding experience will meet the needs of both parents and kids while also accounting for unique considerations, such as a child's attention span.

Budge Studios has successfully grown their catalog of children's titles by making onboarding a focal point of their business. Their target demographic is three to eight-year olds, and their portfolio of games include top titles featuring Strawberry Shortcake, Hello Kitty, Crayola, Caillou and The Smurfs.

"First impressions matter, as do users' first experience with your app. In fact, 70%1 of users who delete an app will do so within a day of having downloaded it, leaving little time for second chances. As an expert in kids' content, Budge tapped into our knowledge of kids to improve and optimize the onboarding experience, leading to increased initial game-loop completion and retention." - Noemie, Founder & Co-CEO at Budge Studios
Three key ways Budge Studios designs better onboarding experiences:
1. Make sure your game is tailor-made for kids

When Budge released their app Crayola Colorful Creatures, they looked at data to identify opportunities to create a smoother onboarding flow for kids. At launch, only 25% of first-time users were completing the initial game loop. Budge analyzed data against gameplay and realized the last activity was causing a drastic drop-off. It required kids to use the device's microphone, and that proved too challenging for very young kids. Budge was able to adjust the initial game loop so that all the activities were accessible to the youngest players. These adjustments almost tripled the initial loop completion, resulting in 74% of first-time users progressing to see additional activities.

2. Earn parents trust by providing real value upfront

Budge has a large of portfolio of apps. Earning parents' trust by providing valuable and engaging experiences for kids is important for retaining users in their ecosystem and achieving long term success.

With every new app, Budge identifies what content is playable for free, and what content must be purchased. Early on, Budge greatly limited the amount of free content they offered, but over time has realized providing high quality free content enhances the first-time user experience. Parents are more willing to spend on an app if their child has shown a real interest in a title.

Working with top kids' brands means that Budge can tap into brand loyalty of popular kids characters to provide value. To launch Strawberry Shortcake Dreams, Budge decided to offer Strawberry Shortcake, the most popular character in the series, as a free character. Dress Up Dreams is among the highest converting apps in the Budge portfolio, indicating that giving away the most popular character for free helped conversions rather than hurting it.

3. Test with real users

Budge knows there is no substitute for direct feedback from its end-users, so Budge involves kids every step of the way. Budge Playgroup is a playtesting program that invites families to try out apps at the alpha, beta and first-playable development stages.

The benefits from early testing can be as basic as understanding how the size and coordination of kids' hands affect their ability to complete certain actions or even hold the device, and as specific as pinpointing a less-than-effective button.

In the testing stages of Strawberry Shortcake Holiday Hair, Budge caught an issue with the main menu of the app, which would not have been evident without observing kids using the app.

Prior to Playtesting:
After Playtesting:
In the original design, users were prompted to start gameplay by audio cues. During testing, it was clear that the voiceover was not sufficient in guiding kids to initiate play, and that additional visual clues would significantly improve the experience. A simple design change resulted in a greatly enhanced user experience.

The onboarding experience is just one component of an app, but just like first impressions, it has a disproportionate impact on your users' perception of your app. As Budge has experienced, involving users in testing your app, using data to flag issues and providing real value to your users upfront, creates a smoother, more accessible onboarding experience and leads to better results.

For more best practices on developing family apps and games, please check out The Family Playbook for developers. And visit the Android Developers website to stay up-to-date with features and best practices that will help you grow a successful business on Google Play.

1.http://www.cmswire.com/customer-experience/mobile-app-retention-5-key-strategies-to-keep-your-customers/

How useful did you find this blogpost?
 

Categories: Programming

SE-Radio Episode 288: Francois Raynaud on DevSecOps

Francois Raynaud and Kim Carter discuss what’s wrong with the traditional delivery approach and why we need to change. They explore the dangers of retrofitting security to the end of projects, how to combine development, operations, and security people into the same development teams and why, along with cost-benefit analysis. Francois and Kim discuss the […]
Categories: Programming

Android Developer Story: Robinhood uses Android Studio to quickly build and test new features

Android Developers Blog - Mon, 04/17/2017 - 17:45
Posted by Christopher Katsaros, Developer Marketing, Android

Robinhood allows users to buy and sell stocks commission-free* in the US. It is designed to make financial investment easy for all users, even if you’ve never traded before.

With a team of two Android developers, the company has relied on fast tools like Android Studio to build rich new features, which have helped make Robinhood the highest-rated stock brokerage app on Google Play.

Watch Robinhood's Joe Binney, VP of Product Engineering, and Dan Hill, Android Developer, talk about how Android Studio is helping them achieve strong growth on Android.


The top Android developers use Android Studio to build powerful and successful apps on Google Play; learn more about the official IDE for Android app development and get started for yourself.

Get more tips and watch other success stories in the Playbook for Developers app.

*Free trading refers to $0 commissions for Robinhood Financial self-directed individual cash or margin brokerage accounts that trade U.S. listed securities via mobile devices. SEC & FINRA regulatory fees may apply.

 How useful did you find this blogpost?

Categories: Programming

5 tips for indie game success, from indie game developers

Android Developers Blog - Mon, 04/17/2017 - 17:37

Posted by Sarah Thomson, BD Partnerships Lead, Indies, Google Play Games

Mobile gaming is a fun place to be right now. It's a landscape seeing tremendous success year after year with great potential for additional growth and innovation. It's also a space where developers can express themselves with creative game styles, mechanics, design and more. This is what the indie community does best.

Here are 5 tips for indies by indies, shared by our gaming partners at 505 Games, About Fun, Disruptor Beam, Klei Entertainment, and Schell Games.


1. Embrace being indie
Indies are inherently smaller operations and should embrace their agility and ability to take risks. Petr Vodak, CEO at About Fun, recommends getting your product out there so you can start taking feedback and apply your learnings to future projects. Don't be afraid to fail! Remaining flexible and building in modularity so you can evolve with the business needs is a strategy embraced by Pete Arden, CMO at Disruptor Beam. For instance, with their game Star Trek Timelines, the initial user experience was tailored to avid Star Trek fans. Over time, as user acquisition costs increased, they've changed the new player experience to appeal to their evolving user base of gamers looking for a fun entertainment experience and less the specific Star Trek IP.

2. Find a way to stand out
To help stand out in the ultra competitive mobile space, Jesse Schell, CEO of Schell Games, recommends doing something clever or very different. This strategy has led them to explore the growth areas of new platforms such as AR & VR. While new platforms present a field for opportunity and creativity, they're best to be approached with the long term in mind allowing you to sustain the business until critical mass is reached.

3. Build a community
There are many ways to build communities. If you have an existing fan base on other platforms, cross-promote to drive awareness of your mobile offerings. You can also look at porting titles over, but be aware of the differences in mobile gaming habits and ensure you adapt your game accordingly.

4. Engage after install
Both 505 Games and Klei Entertainment recommend running your premium titles as a service. Through monitoring user reviews you can gain invaluable feedback and trends helping you better understand user pain points and desires. In addition, by releasing regular content updates and in-game events you create reason for users to get back in the game. This not only drives reengagement, but 505 Games also sees strong spikes in new installs aligned with major game updates.

5. Monetize in different ways
Similar strategy to above, dropping regular content refreshes and game updates while offering a variety of monetization options gives users more ways to engage with your game. Keeping your games fresh gives users reason to come back and builds loyalty so you can cross-promote to your users with future game launches.

If you're looking for a fun new game to play, check out the great selection on Indie Corner on Google Play. And if you're working on a new indie game of your own, nominate your title for inclusion.

Watch more sessions from Google Developer Day at GDC17 on the Android Developers YouTube channel to learn tips for success. Visit the Android Developers website to stay up-to-date with features and best practices that will help you grow a successful business on Google Play.


How useful did you find this blogpost?

Categories: Programming

A New Issue Tracker for our AOSP Developers

Android Developers Blog - Mon, 04/17/2017 - 06:33
Posted by Sandie Gong, Developer Relations Program Manager & Chris Iremonger, Android Technical Program Manager

Like many other issue trackers at Google, we're upgrading our Android Open Source Project (AOSP) issue tracking system to Issue Tracker. We are hoping to facilitate a better collaboration between our developers and our Android product teams by using a tool we use internally at Google to track bugs and feature requests during product development.

Starting today, all issues formerly at code.google.com/p/android/issues will migrate to Issue Tracker under the Android Public Tracker component. You may have noticed that we are already using the new tool to collect feedback on the O Developer Preview!

What has been migrated

Getting started with Issue Tracker
You can learn more about navigating our Issue Tracker from our developer documentation. By default, Issue Tracker displays only the issues assigned to you. You can easily change that to show a hotlist of your choice, a bookmark group, or a saved search. You can also adjust notification settings by clicking the gear icon in the top right corner and selecting Settings.

The mappings in Issue Tracker are also slightly different than code.google.com so make sure to check out Life of a Bug to learn more about what the various statuses mean.



Searching for component specific issues
Opening a code.google.com issue link will automatically redirect you to the new system. We've cleaned up some of the spam, but you'll be able to find all of the other issues from code.google.com in Issue Tracker, including any issue you've reported, commented on, or starred.

You can view all reported Android issues in the Android Public Tracker component and drill down to see reported issues for specific categories of issues, such as Tools and Support Libraries, by searching for specific components.
Filing a bug or feature request
Before filing a new issue, please check if it is already reported in the issues list. Let us know what issues are important to you by starring an existing issue.

Submitting a new issue is easy. Once you click "Create Issue", search for the appropriate component for your issue. Alternatively, you can just follow the correct issue creation link for each component listed in Report Bugs.

Here's some helpful links to get you started! table, th, td { border: 1px solid black; }
Topic Relevant Links Navigating and creating issues in the Android component Navigating Google Issue Tracker Google Issue Tracker announcements for other products
Categories: Programming

Java 8 Language Features Support Update

Android Developers Blog - Fri, 04/14/2017 - 21:00
Posted by James Lau, Product Manager

Yesterday, we released Android Studio 2.4 Preview 6. Java 8 language features are now supported by the Android build system in the javac/dx compilation path. Android Studio's Gradle plugin now desugars Java 8 class files to Java 7-compatible class files, so you can use lambdas, method references and other features of Java 8.

For those of you who tried the Jack compiler, we now support the same set of Java 8 language features but with faster build speed. You can use Java 8 language features together with tools that rely on bytecode, including Instant Run. Using libraries written with Java 8 is also supported.

We first added Java 8 desugaring in Android Studio 2.4 Preview 4. Preview 6 includes important bug fixes related to Java 8 language features support. Many of these fixes were made in response to bug reports you filed. We really appreciate your help in improving Android development tools for the community!

It's easy to try using Java 8 language features in your Android project. Just download Android Studio 2.4 Preview 6, and update your project's target and source compatibility to Java version 1.8. You can find more information in our preview documentation.

Happy lambda'ing!
Categories: Programming

Business Analysis Manifesto: the changing role of Business Analysis in an Agile organization

Xebia Blog - Fri, 04/14/2017 - 20:00

  The other day a discussion moved towards the -changing- role of Business Analysts in an Agile environment. I referred to the Business Analysis Manifesto. Created by and for Business Analysts, but never published. I realized I could share it with ‘the world’ and wrap it in blog-paper. So, this Business Analysis Manifesto is not […]

The post Business Analysis Manifesto: the changing role of Business Analysis in an Agile organization appeared first on Xebia Blog.

Future of Java 8 Language Feature Support on Android

Android Developers Blog - Fri, 04/14/2017 - 17:48
Posted by James Lau, Product Manager 

At Google, we always try to do the right thing. Sometimes this means adjusting our plans. We know how much our Android developer community cares about good support for Java 8 language features, and we're changing the way we support them.

We've decided to add support for Java 8 language features directly into the current javac and dx set of tools, and deprecate the Jack toolchain. With this new direction, existing tools and plugins dependent on the Java class file format should continue to work. Moving forward, Java 8 language features will be natively supported by the Android build system. We're aiming to launch this as part of Android Studio in the coming weeks, and we wanted to share this decision early with you.

We initially tested adding Java 8 support via the Jack toolchain. Over time, we realized the cost of switching to Jack was too high for our community when we considered the annotation processors, bytecode analyzers and rewriters impacted. Thank you for trying the Jack toolchain and giving us great feedback. You can continue using Jack to build your Java 8 code until we release the new support. Migrating from Jack should require little or no work.

We hope the new plan will pave a smooth path for everybody to take advantage of Java 8 language features on Android. We'll share more details when we release the new support in Android Studio.
Categories: Programming