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

### R: Rook – Hello world example – ‘Cannot find a suitable app in file’

Mark Needham - Fri, 08/22/2014 - 12:05

I’ve been playing around with the Rook library and struggled a bit getting a basic Hello World application up and running so I thought I should document it for future me.

I wanted to spin up a web server using Rook and serve a page with the text ‘Hello World’. I started with the following code:

library(Rook)
s <- Rhttpd$new() s$add(name='MyApp',app='helloworld.R')
s$start() s$browse("MyApp")

where helloWorld.R contained the following code:

function(env){
list(
status=200,
'Content-Type' = 'text/html'
),
body = paste('<h1>Hello World!</h1>')
)
}

Unfortunately that failed on the ‘s$add’ line with the following error message: > s$add(name='MyApp',app='helloworld.R')
Error in .Object$initialize(...) : Cannot find a suitable app in file helloworld.R I hadn’t realised that you actually need to assign that function to a variable ‘app’ in order for it to be picked up: app <- function(env){ list( status=200, headers = list( 'Content-Type' = 'text/html' ), body = paste('<h1>Hello World!</h1>') ) } Once I fixed that everything seemed to work as expected:s > s Server started on 127.0.0.1:27120 [1] MyApp http://127.0.0.1:27120/custom/MyApp Call browse() with an index number or name to run an application. Categories: Programming ### Azure: New DocumentDB NoSQL Service, New Search Service, New SQL AlwaysOn VM Template, and more ScottGu's Blog - Scott Guthrie - Thu, 08/21/2014 - 21:39 Today we released a major set of updates to Microsoft Azure. Today’s updates include: • DocumentDB: Preview of a New NoSQL Document Service for Azure • Search: Preview of a New Search-as-a-Service offering for Azure • Virtual Machines: Portal support for SQL Server AlwaysOn + community-driven VMs • Web Sites: Support for Web Jobs and Web Site processes in the Preview Portal • Azure Insights: General Availability of Microsoft Azure Monitoring Services Management Library • API Management: Support for API Management REST APIs All of these improvements are now available to use immediately (note that some features are still in preview). Below are more details about them: DocumentDB: Announcing a New NoSQL Document Service for Azure I’m excited to announce the preview of our new DocumentDB service - a NoSQL document database service designed for scalable and high performance modern applications. DocumentDB is delivered as a fully managed service (meaning you don’t have to manage any infrastructure or VMs yourself) with an enterprise grade SLA. As a NoSQL store, DocumentDB is truly schema-free. It allows you to store and query any JSON document, regardless of schema. The service provides built-in automatic indexing support – which means you can write JSON documents to the store and immediately query them using a familiar document oriented SQL query grammar. You can optionally extend the query grammar to perform service side evaluation of user defined functions (UDFs) written in server-side JavaScript as well. DocumentDB is designed to linearly scale to meet the needs of your application. The DocumentDB service is purchased in capacity units, each offering a reservation of high performance storage and dedicated performance throughput. Capacity units can be easily added or removed via the Azure portal or REST based management API based on your scale needs. This allows you to elastically scale databases in fine grained increments with predictable performance and no application downtime simply by increasing or decreasing capacity units. Over the last year, we have used DocumentDB internally within Microsoft for several high-profile services. We now have DocumentDB databases that are each 100s of TBs in size, each processing millions of complex DocumentDB queries per day, with predictable performance of low single digit ms latency. DocumentDB provides a great way to scale applications and solutions like this to an incredible size. DocumentDB also enables you to tune performance further by customizing the index policies and consistency levels you want for a particular application or scenario, making it an incredibly flexible and powerful data service for your applications. For queries and read operations, DocumentDB offers four distinct consistency levels - Strong, Bounded Staleness, Session, and Eventual. These consistency levels allow you to make sound tradeoffs between consistency and performance. Each consistency level is backed by a predictable performance level ensuring you can achieve reliable results for your application. DocumentDB has made a significant bet on ubiquitous formats like JSON, HTTP and REST – which makes it easy to start taking advantage of from any Web or Mobile applications. With today’s release we are also distributing .NET, Node.js, JavaScript and Python SDKs. The service can also be accessed through RESTful HTTP interfaces and is simple to manage through the Azure preview portal. Provisioning a DocumentDB account To get started with DocumentDB you provision a new database account. To do this, use the new Azure Preview Portal (http://portal.azure.com), click the Azure gallery and select the Data, storage, cache + backup category, and locate the DocumentDB gallery item. Once you select the DocumentDB item, choose the Create command to bring up the Create blade for it. In the create blade, specify the name of the service you wish to create, the amount of capacity you wish to scale your DocumentDB instance to, and the location around the world that you want to deploy it (e.g. the West US Azure region): Once provisioning is complete, you can start to manage your DocumentDB account by clicking the new instance icon on your Azure portal dashboard. The keys tile can be used to retrieve the security keys to use to access the DocumentDB service programmatically. Developing with DocumentDB DocumentDB provides a number of different ways to program against it. You can use the REST API directly over HTTPS, or you can choose from either the .NET, Node.js, JavaScript or Python client SDKs. The JSON data I am going to use for this example are two families: // AndersonFamily.json file {<?xml:namespace prefix = "o" /> "id": "AndersenFamily", "lastName": "Andersen", "parents": [ { "firstName": "Thomas" }, { "firstName": "Mary Kay" } ], "children": [ { "firstName": "John", "gender": "male", "grade": 7 } ], "pets": [ { "givenName": "Fluffy" } ], "address": { "country": "USA", "state": "WA", "city": "Seattle" } } and // WakefieldFamily.json file { "id": "WakefieldFamily", "parents": [ { "familyName": "Wakefield", "givenName": "Robin" }, { "familyName": "Miller", "givenName": "Ben" } ], "children": [ { "familyName": "Wakefield", "givenName": "Jesse", "gender": "female", "grade": 1 }, { "familyName": "Miller", "givenName": "Lisa", "gender": "female", "grade": 8 } ], "pets": [ { "givenName": "Goofy" }, { "givenName": "Shadow" } ], "address": { "country": "USA", "state": "NY", "county": "Manhattan", "city": "NY" } } Using the NuGet package manager in Visual Studio, I can search for and install the DocumentDB .NET package into any .NET application. With the URI and Authentication Keys for the DocumentDB service that I retrieved earlier from the Azure Management portal, I can then connect to the DocumentDB service I just provisioned, create a Database, create a Collection, Insert some JSON documents and immediately start querying for them: using (client = new DocumentClient(new Uri(endpoint), authKey)) { var database = new Database { Id = "ScottsDemoDB" }; database = await client.CreateDatabaseAsync(database); var collection = new DocumentCollection { Id = "Families" }; collection = await client.CreateDocumentCollectionAsync(database.SelfLink, collection); //DocumentDB supports strongly typed POCO objects and also dynamic objects dynamic andersonFamily = JsonConvert.DeserializeObject(File.ReadAllText(@".\Data\AndersonFamily.json")); dynamic wakefieldFamily = JsonConvert.DeserializeObject(File.ReadAllText(@".\Data\WakefieldFamily.json")); //persist the documents in DocumentDB await client.CreateDocumentAsync(collection.SelfLink, andersonFamily); await client.CreateDocumentAsync(collection.SelfLink, wakefieldFamily); //very simple query returning the full JSON document matching a simple WHERE clause var query = client.CreateDocumentQuery(collection.SelfLink, "SELECT * FROM Families f WHERE f.id = 'AndersenFamily'"); var family = query.AsEnumerable().FirstOrDefault(); Console.WriteLine("The Anderson family have the following pets:"); foreach (var pet in family.pets) { Console.WriteLine(pet.givenName); } //select JUST the child record out of the Family record where the child's gender is male query = client.CreateDocumentQuery(collection.DocumentsLink, "SELECT * FROM c IN Families.children WHERE c.gender='male'"); var child = query.AsEnumerable().FirstOrDefault(); Console.WriteLine("The Andersons have a son named {0} in grade {1} ", child.firstName, child.grade); //cleanup test database await client.DeleteDatabaseAsync(database.SelfLink); } As you can see above – the .NET API for DocumentDB fully supports the .NET async pattern, which makes it ideal for use with applications you want to scale well. Server-side JavaScript Stored Procedures If I wanted to perform some updates affecting multiple documents within a transaction, I can define a stored procedure using JavaScript that swapped pets between families. In this scenario it would be important to ensure that one family didn’t end up with all the pets and another ended up with none due to something unexpected happening. Therefore if an error occurred during the swap process, it would be crucial that the database rollback the transaction and leave things in a consistent state. I can do this with the following stored procedure that I run within the DocumentDB service: function SwapPets(family1Id, family2Id) { var context = getContext(); var collection = context.getCollection(); var response = context.getResponse(); collection.queryDocuments(collection.getSelfLink(), 'SELECT * FROM Families f where f.id = "' + family1Id + '"', {}, function (err, documents, responseOptions) { var family1 = documents[0]; collection.queryDocuments(collection.getSelfLink(), 'SELECT * FROM Families f where f.id = "' + family2Id + '"', {}, function (err2, documents2, responseOptions2) { var family2 = documents2[0]; var itemSave = family1.pets; family1.pets = family2.pets; family2.pets = itemSave; collection.replaceDocument(family1._self, family1, function (err, docReplaced) { collection.replaceDocument(family2._self, family2, {}); }); response.setBody(true); }); }); } If an exception is thrown in the JavaScript function due to for instance a concurrency violation when updating a record, the transaction is reversed and system is returned to the state it was in before the function began. It’s easy to register the stored procedure in code like below (for example: in a deployment script or app startup code): //register a stored procedure StoredProcedure storedProcedure = new StoredProcedure { Id = "SwapPets", Body = File.ReadAllText(@".\JS\SwapPets.js") }; storedProcedure = await client.CreateStoredProcedureAsync(collection.SelfLink, storedProcedure); And just as easy to execute the stored procedure from within your application: //execute stored procedure passing in the two family documents involved in the pet swap dynamic result = await client.ExecuteStoredProcedureAsync<dynamic>(storedProcedure.SelfLink, "AndersenFamily", "WakefieldFamily"); If we checked the pets now linked to the Anderson Family we’d see they have been swapped. Learning More It’s really easy to get started with DocumentDB and create a simple working application in a couple of minutes. The above was but one simple example of how to start using it. Because DocumentDB is schema-less you can use it with literally any JSON document. Because it performs automatic indexing on every JSON document stored within it, you get screaming performance when querying those JSON documents later. Because it scales linearly with consistent performance, it is ideal for applications you think might get large. You can learn more about DocumentDB from the new DocumentDB development center here. Search: Announcing preview of new Search as a Service for Azure I’m excited to announce the preview of our new Azure Search service. Azure Search makes it easy for developers to add great search experiences to any web or mobile application. Azure Search provides developers with all of the features needed to build out their search experience without having to deal with the typical complexities that come with managing, tuning and scaling a real-world search service. It is delivered as a fully managed service with an enterprise grade SLA. We also are releasing a Free tier of the service today that enables you to use it with small-scale solutions on Azure at no cost. Provisioning a Search Service To get started, let’s create a new search service. In the Azure Preview Portal (http://portal.azure.com), navigate to the Azure Gallery, and choose the Data storage, cache + backup category, and locate the Azure Search gallery item. Locate the “Search” service icon and select Create to create an instance of the service: You can choose from two Pricing Tier options: Standard which provides dedicated capacity for your search service, and a Free option that allows every Azure subscription to get a free small search service in a shared environment. The standard tier can be easily scaled up or down and provides dedicated capacity guarantees to ensure that search performance is predictable for your application. It also supports the ability to index 10s of millions of documents with lots of indexes. The free tier is limited to 10,000 documents, up to 3 indexes and has no dedicated capacity guarantees. However it is also totally free, and also provides a great way to learn and experiment with all of the features of Azure Search. Managing your Azure Search service After provisioning your Search service, you will land in the Search blade within the portal - which allows you to manage the service, view usage data and tune the performance of the service: I can click on the Scale tile above to bring up the details of the number of resources allocated to my search service. If I had created a Standard search service, I could use this to increase the number of replicas allocated to my service to support more searches per second (or to provide higher availability) and the number of partitions to give me support for higher numbers of documents within my search service. Creating a Search Index Now that the search service is created, I need to create a search index that will hold the documents (data) that will be searched. To get started, I need two pieces of information from the Azure Portal, the service URL to access my Azure Search service (accessed via the Properties tile) and the Admin Key to authenticate against the service (accessed via the Keys title). Using this search service URL and admin key, I can start using the search service APIs to create an index and later upload data and issue search requests. I will be sending HTTP requests against the API using that key, so I’ll setup a .NET HttpClient object to do this as follows: HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("api-key", "19F1BACDCD154F4D3918504CBF24CA1F"); I’ll start by creating the search index. In this case I want an index I can use to search for contacts in my dataset, so I want searchable fields for their names and tags; I also want to track the last contact date (so I can filter or sort on that later on) and their address as a lat/long location so I can use it in filters as well. To make things easy I will be using JSON.NET (to do this, add the NuGet package to your VS project) to serialize objects to JSON. var index = new { name = "contacts", fields = new[] { new { name = "id", type = "Edm.String", key = true }, new { name = "fullname", type = "Edm.String", key = false }, new { name = "tags", type = "Collection(Edm.String)", key = false }, new { name = "lastcontacted", type = "Edm.DateTimeOffset", key = false }, new { name = "worklocation", type = "Edm.GeographyPoint", key = false }, } }; var response = client.PostAsync("https://scottgu-dev.search.windows.net/indexes/?api-version=2014-07-31-Preview", new StringContent(JsonConvert.SerializeObject(index), Encoding.UTF8, "application/json")).Result; response.EnsureSuccessStatusCode(); You can run this code as part of your deployment code or as part of application initialization. Populating a Search Index Azure Search uses a push API for indexing data. You can call this API with batches of up to 1000 documents to be indexed at a time. Since it’s your code that pushes data into the index, the original data may be anywhere: in a SQL Database in Azure, DocumentDb database, blob/table storage, etc. You can even populate it with data stored on-premises or in a non-Azure cloud provider. Note that indexing is rarely a one-time operation. You will probably have an initial set of data to load from your data source, but then you will want to push new documents as well as update and delete existing ones. If you use Azure Websites, this is a natural scenario for Webjobs that can run your indexing code regularly in the background. Regardless of where you host it, the code to index data needs to pull data from the source and push it into Azure Search. In the example below I’m just making up data, but you can see how I could be using the result of a SQL or LINQ query or anything that produces a set of objects that match the index fields we identified above. var batch = new { value = new[] { new { id = "221", fullname = "Jay Adams", tags = new string[] { "work" }, lastcontacted = DateTimeOffset.UtcNow, worklocation = new { type = "Point", coordinates = new [] { -122.131577, 47.678581 } } }, new { id = "714", fullname = "Catherine Abel", tags = new string[] { "work", "personal" }, lastcontacted = DateTimeOffset.UtcNow, worklocation = new { type = "Point", coordinates = new [] { -121.825579, 47.1419814} } } } }; var response = client.PostAsync("https://scottgu-dev.search.windows.net/indexes/contacts/docs/index?api-version=2014-07-31-Preview", new StringContent(JsonConvert.SerializeObject(batch), Encoding.UTF8, "application/json")).Result; response.EnsureSuccessStatusCode(); Searching an Index After creating an index and populating it with data, I can now issue search requests against the index. Searches are simple HTTP GET requests against the index, and responses contain the data we originally uploaded as well as accompanying scoring information. I can do a simple search by executing the code below, where searchText is a string containing the user input, something like abel work for example: var response = client.GetAsync("https://scottgu-dev.search.windows.net/indexes/contacts/docs?api-version=2014-07-31-Preview&search=" + Uri.EscapeDataString(searchText)).Result; response.EnsureSuccessStatusCode(); dynamic results = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result); foreach (var result in results.value) { Console.WriteLine("FullName:" + result.fullname + " score:" + (double)result["@search.score"]); } Learning More The above is just a simple scenario of what you can do. There are a lot of other things we could do with searches. For example, I can use query string options to filter, sort, project and page over the results. I can use hit-highlighting and faceting to create a richer way to navigate results and suggestions to implement auto-complete within my web or mobile UI. In this example, I used the default ranking model, which uses statistics of the indexed text and search string to compute scores. You can also author your own scoring profiles that model scores in ways that match the needs of your application. Check out the Azure Search documentation for more details on how to get started, and some of the more advanced use-cases you can take advantage of. With the free tier now available at no cost to every Azure subscriber, there is no longer any reason not to have Search fully integrated within your applications. Virtual Machines: Support for SQL Server AlwaysOn, VM Depot images Last month we added support for managing VMs within the Azure Preview Portal (http://portal.azure.com). We also released built-in portal support that enables you to easily create multi-VM SharePoint Server Farms as well as a slew of additional Azure Certified VM images. You can learn more about these updates in my last blog post. Today, I’m excited to announce new support for automatically deploying SQL Server VMs with AlwaysOn configured, as well as integrated portal support for community supported VM Depot images. SQL Server AlwaysOn Template AlwaysOn Availability Groups, released in SQL Server 2012 and enhanced in SQL Server 2014, guarantee high availability for mission-critical workloads. Last year we started supporting SQL Availability Groups on Azure Infrastructure Services. In such a configuration, two SQL replicas (primary and secondary), each in its own Azure VM, are configured for automatic failover, and a listener (DNS name) is configured for client connectivity. Other components required are a file share witness to guarantee quorum in the configuration to avoid “split brain” scenarios, and a domain controller to join all VMs to the same domain. The SQL as well as the domain controller replicas are each deployed to an availability set to ensure they are in different Azure failure and upgrade domains. Prior to today’s release, setting up the Availability Group configuration could be tedious and time consuming. We have dramatically simplified this experience through a new SQL Server AlwaysOn template in the Azure Gallery. This template fully automates the configuration of a highly available SQL Server deployment on Azure Infrastructure Services using an Availability Group. You can find the template by navigating to the Azure Gallery within the Azure Preview Portal (http://portal.azure.com), selecting the Virtual Machine category on the left and selecting the SQL Server 2014 AlwaysOn gallery item. In the gallery details page, select Create. All you need is to provide some basic configuration information such as the administrator credentials for the VMs and the rest of the settings are defaulted for you. You may consider changing the defaults for Listener name as this is what your applications will use to connect to SQL Server. Upon creation, 5 VMs are created in the resource group: 2 VMs for the SQL Server replicas, 2 VMs for the Domain Controller replicas, and 1 VM for the file share witness. Once created, you can RDP to one of the SQL Server VMs to see the Availability Group configuration as depicted below: Try out the SQL Server AlwaysOn template in the Azure Preview Portal today and give us your feedback! VM Depot in Azure Gallery Community-driven VM Depot images have been supported on the Azure platform for a couple of years now. But prior to today’s release they weren’t fully integrated into the mainline user experience. Today, I’m excited to announce that we have integrated community VMs into the Azure Preview Portal and the Azure gallery. With this release, you will find close to 300 pre-configured Virtual Machine images for Microsoft Azure. Using these images, fully functional Virtual Machines can be deployed in the Preview Portal in minutes and customized for specific use cases. Starting from base operating system distributions (such as Debian, Ubuntu, CentOS, Suse and FreeBSD) through developer stacks (such as LAMP, Ruby on Rails, Node and Django), to complete applications (such as Wordpress, Drupal and Apache Solr), there is something for everyone in VM Depot. Try out the VM Depot images in the Azure gallery from within the Virtual Machine category. Web Sites: WebJobs and Process Management in the Preview Portal Starting with today’s Azure release, Web Site WebJobs are now supported in the Azure Preview Portal. You can also now drill into your Web Sites and monitor the health of any processes running within them (both to host your web code as well as your web jobs). Web Site WebJobs Using WebJobs, you can now now run any code within your Azure Web Sites – and do so in a way that is readily parallelizable, globally scalable, and complete with remote debugging, full VS support and an optional SDK to facilitate authoring. For more information about the power of WebJobs, visit Azure WebJobs recommended resources. With today’s Azure release, we now support two types of Webjobs: on Demand and Continuous. To use WebJobs in the preview portal, navigate to your web site and select the WebJobs tile within the Web Site blade. Notice that the part also now shows the count of WebJobs available. By drilling into the title, you can view existing WebJobs as well as create new OnDemand or Continuous WebJobs. Scheduled WebJobs are not yet supported in the preview portal, but expect to see this in the near future. Web Site Processes I’m excited to announce a new feature in the Azure Web Sites experience in the Preview Portal - Websites Processes. Using Websites Process you can enumerate the different instances of your site, browse through the different processes on each instance, and even drill down to the handles and modules associated with each process. You can then check for detailed information like version, language and more. In addition, you also get rich monitoring for CPU, Working Set and Thread count at the process level. Just like with Task Manager for Windows, data collection begins when you open the Websites Processes blade, and stops when you close it. This feature is especially useful when your site has been scaled out and is misbehaving in some specific instances but not in others. You can quickly identify runaway processes, find open file handles, and even kill a specific process instance. Monitoring and Management SDK: Programmatic Access to Monitoring Data The Azure Management Portal provides built-in monitoring and management support that makes it easy for you to track the health of your applications and solutions deployed within Azure. If you want to programmatically access monitoring and management features in Azure, you can also now use our .NET SDK from Nuget. We are releasing this SDK to general availability today, so you can now use it for your production services! For example, if you want to build your own custom dashboard that shows metric data from across your services, you can get that metric data via the SDK: // Create the metrics client by obtain the certificate with the specified thumbprint. MetricsClient metricsClient = new MetricsClient(new CertificateCloudCredentials(SubscriptionId, GetStoreCertificate(Thumbprint))); // Build the resource ID string. string resourceId = ResourceIdBuilder.BuildWebSiteResourceId("webtest-group-WestUSwebspace", "webtests-site"); // Get the metric definitions. MetricDefinitionCollection metricDefinitions = metricsClient.MetricDefinitions.List(resourceId, null, null).MetricDefinitionCollection; // Display the available metric definitions. Console.WriteLine("Choose metrics (comma separated) to list:"); int count = 0; foreach (MetricDefinition metricDefinition in metricDefinitions.Value) { Console.WriteLine(count + ":" + metricDefinition.DisplayName); count++; } // Ask the user which metrics they are interested in. var desiredMetrics = Console.ReadLine().Split(',').Select(x => metricDefinitions.Value.ToArray()[Convert.ToInt32(x.Trim())]); // Get the metric values for the last 20 minutes. MetricValueSetCollection values = metricsClient.MetricValues.List( resourceId, desiredMetrics.Select(x => x.Name).ToList(), "", desiredMetrics.First().MetricAvailabilities.Select(x => x.TimeGrain).Min(), DateTime.UtcNow - TimeSpan.FromMinutes(20), DateTime.UtcNow ).MetricValueSetCollection; // Display the metric values to the user. foreach (MetricValueSet valueSet in values.Value ) { Console.WriteLine(valueSet.DisplayName + " for the past 20 minutes:"); foreach (MetricValue metricValue in valueSet.MetricValues) { Console.WriteLine(metricValue.Timestamp + "\t" + metricValue.Average); } } Console.Write("Press any key to continue:"); Console.ReadKey(); We support metrics for a variety of services with the monitoring SDK: Service Typical metrics Frequencies Cloud services CPU, Network, Disk 5 min, 1 hr, 12 hrs Virtual machines CPU, Network, Disk 5 min, 1 hr, 12 hrs Websites Requests, Errors, Memory, Response time, Data out 1 min, 1 hr Mobile Services API Calls, Data Out, SQL performance 1 hr Storage Requests, Success rate, End2End latency 1 min, 1 hr Service Bus Messages, Errors, Queue length, Requests 5 min HDInsight Containers, Apps running 15 min If you’d like to manage advanced autoscale settings that aren’t possible to do in the Portal, you can also do that via the SDK. For example, you can construct autoscale based on custom metrics – you can autoscale by anything that is returned from MetricDefinitions. All of the documentation on the SDK is available on MSDN. API Management: Support for Services REST API We launched the Azure API Management service into preview in May of this year. The API Management service enables customers to quickly and securely publish APIs to partners, the public development community, and even internal developers. Today, I’m excited to announce the availability of the API Management REST API which opens up a large number of new scenarios. It can be used to manage APIs, products, subscriptions, users and groups in addition to accessing your API analytics. In fact, virtually any management operation available in the Management API Portal is now accessible programmatically - opening up a host of integration and automation scenarios, including directly monetizing an API with your commerce provider of choice, taking over user or subscription management, automating API deployments and more. We've even provided an additional SAS (Shared Access Signature) security option. An integrated experience in the publisher portal allows you to generate SAS tokens - so securely calling your API service couldn’t be easier. In just three easy steps: 1. Enable the API on the System Settings page on the Publisher Portal 2. Acquire a time-limited access token either manually or programmatically 3. Start sending requests to the API, providing the token with every request See the REST API reference for full details. Delegation of user registration and product subscription The new API Management REST API makes it easy to automate and integrate other processes with API management. Many customers integrating in this way already have a user account system and would prefer to use this existing resource, instead of the built-in functionality provided by the Developer Portal. This feature, called Delegation, enables your existing website or backend to own the user data, manage subscriptions and seamlessly integrate with API Management's dynamically generated API documentation. It's easy to enable Delegation: in the Publisher Portal navigate to the Delegation section and enable Delegated Sign-in and Sign up, provide the endpoint URL and validation key and you're good to go. For more details, check out the how-to guide. Summary Today’s Microsoft Azure release enables a ton of great new scenarios, and makes building applications hosted in the cloud even easier. If you don’t already have a Azure account, you can sign-up for a free trial and start using all of the above features today. Then visit the Microsoft Azure Developer Center to learn more about how to build apps with it. Hope this helps, Scott P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at:twitter.com/scottgu Categories: Architecture, Programming ### How to move your files to Google Drive Google Code Blog - Thu, 08/21/2014 - 17:00 Posted by Chuck Coulson, Drive Technology Partnerships, Google Google Drive for Work is a new premium offering for businesses that includes unlimited storage, advanced audit reporting and new security controls and features, such as encryption at rest. If you're getting ready to move your company to Drive, one of the first things on your mind is how to migrate all your existing files with as little hassle as possible. It's easy to migrate your files by uploading them directly to Drive or using the Drive Sync client. But, what if you have files stored elsewhere that you want to consolidate? Or what if you want to migrate multiple users at once? Many independent software vendors (ISVs) have built solutions to help organizations migrate their files from different File Sync and Share (FSS) solutions, local hard drives and other data sources. Here are some of the options available for you to use: • Cloud Migrator, by Cloud Technology Solutions, migrates user accounts and files to Google Drive and other Google Apps services. (websiteblogpost) • Cloudsfer, by Tzunami, transfers files from Box, Dropbox and Microsoft OneDrive to Google Drive. (website) • Migrator for Google Apps, by Backupify, migrates and consolidates personal Google Drive or other Google Apps for Business accounts into a single domain. (websiteblogpost) • Mover migrates data from 23 cloud services providers, web services, and databases into Google Drive. (websiteblogpost) • Nava Certus, by LinkGard, provides a migration and synchronization solution for on-premise and cloud-based storage platforms, including Dropbox, Microsoft OneDrive, Amazon S3, as well as local file systems. (website,blogpost) • SkySync, by Portal Architects, integrates existing on-site storage systems as well as other cloud storage providers to Google Drive. (websiteblogpost) These are just a few companies that offer migration solutions. Please visit the Google Apps Marketplace for a complete listing of tools and offerings that add value to the Google Apps platform. Categories: Programming ### Is pairing for everybody? Actively Lazy - Thu, 08/21/2014 - 08:11 Pair programming is a great way to share knowledge. But every developer is different, does pairing work for everyone? Pairing helps a team normalise its knowledge – what one person knows, everyone else learns through pairing: keyboard shortcuts, techniques, practices, third party libraries as well as the details of the source code you’re working in. This pushes up the average level of the team and stops knowledge becoming siloed. Pairing also helps with discipline: it’s a lot harder to argue that you don’t need a unit test when there’s someone sitting next to you, literally acting as your conscience. It’s also a lot harder to just do the quick and dirty hack to get on to the next task, when the person sitting next to you has taken control of the keyboard to stop you committing war crimes against the source code. The biggest problem most teams face is basically one of communication: coordinating, in detail, the activities of a team of developers is difficult. Ideally, every developer would know everything that is going on across the team – but this clearly isn’t practical. Instead, we have to draw boundaries to make it easier to reason about the system as a whole, without knowing the whole system to the same level of detail. I’ll create an API, some boundary layer, and we each work to our own side of it. I’ll create the service, you sort out the user interface. I’ll sort out the network protocol, you sort out the application layer. You have to introduce an architectural boundary to simplify the communication and coordination. Your architecture immediately reflects the relationships of the developers building it. Whereas on teams that pair, these boundaries can be softer. They still happen, but the boundary becomes softer because as pairs rotate you see both sides of any boundary so it doesn’t become a black box you don’t know about and can’t change. One day I’m writing the user interface code, the next I’m writing the service layer that feeds it. This is how you spot inconsistencies and opportunities to fix the architecture and take advantage of implementation details on both sides. Otherwise this communication is hard. Continuous pair rotation means you can get close to the ideal that each developer knows, broadly, what is happening everywhere. However, let’s be honest: pairing isn’t for everyone. I’ve worked with some people who were great at pairing, who were a pleasure to work with. People who had no problem explaining their thought process and no ego to get bruised when you point out the fatal flaw in their idea. People who spot when you’ve lost the train of thought and pick up where you drifted off from. A good pairing session becomes very social. A team that is pairing can sound very noisy. It can be one of the hardest things to get used to when you start pairing: I seem to spend my entire day arguing and talking. When are we gonna get on and write some damned code? But that just highlights how little of the job is actually typing in source code. Most of the day is figuring out which change to make and where. A single line of code can take hours of arguing to get right and in the right place. But programming tends to attract people who are less sociable than others – and let’s face it, we’re a pretty anti-social bunch: I spend my entire day negotiating with a machine that works in 1s and 0s. Not for me the subtle nuances of human communication, it either compiles or it doesn’t. I don’t have to negotiate or try and out politick the compiler. I don’t have to deal with the compiler having “one of those days” (well, I say that, sometimes I swear…). I don’t have to take the compiler to one side and offer comforting words because its cat died. I don’t have to worry about hurting the compiler’s feelings because I made the same mistake for the hundredth time: “yes of course I’m listening to you, no I’m not just ignoring you. Of course I value your opinions, dear. But seriously, this is definitely an IList of TFoo!” So it’s no surprise that among the great variety of programmers you meet, some are extrovert characters who relish the social, human side of working in a team of people, building software. As well as the introvert characters who relish the quiet, private, intellectual challenge of crafting an elegant solution to a fiendish problem. And so to pairing: any team will end up with a mixture of characters. The extroverts will tend to enjoy pairing, while the introverts will tend to find it harder and seek to avoid it. This isn’t necessarily a question of education or persuasion, the benefits are relatively intangible and more introverted developers may find the whole process less enjoyable than working solo. It sounds trite: but happy developers are productive developers. There’s no point doing anything that makes some of your peers unhappy. All teams need to agree rules. For example, some people like eating really smelly food in an open plan office. Good teams tend to agree rules about this kind of behaviour; everyone agrees that small sacrifices for an individual make a big difference for team harmony. However, how do you resolve a difference of opinion with pairing? As a team decision, pairing is a bit all or nothing. Either we agree to pair on everything, so there’s no code ownership, regular rotation and we learn from each other. Or we don’t, and we each become responsible for our own dominion. We can’t agree that those that want to pair will go into the pairing room so as not to upset everyone else. One option is to simply require that everyone on your team has to love pairing. I don’t know about you: hiring good people is hard. The last thing I want to do is start excluding people who could otherwise be productive. Isn’t it better to at least have somebody doing something, even if they’re not pairing? Another option is to force developers to pair, even if they find it difficult or uncomfortable. But is that really going to be productive? Building resentment and unhappiness is not going to create a high performance team. Of course, the other extreme is just as likely to cause upset: if you stop all pairing, then those that want to will feel resentful and unhappy. And what about the middle ground? Can you have a team where some people pair while others work on their own? It seems inevitable that Conway’s law will come into play: the structure of the software will reflect the structure of the team. It’s very difficult for there to be overlap between developers working on their own and developers that are pairing. For exactly the same reason it’s difficult for a group of individual developers to overlap on the same area of code at the same time: you’ll necessarily introduce some architectural boundary to ease coordination. This means you still end up with a collection of silos, some owned by individual developers, some owned by a group of developers. Does this give you the best compromise? Or the worst of both worlds? What’s your experience? What have you tried? What worked, what didn’t? Categories: Programming, Testing & QA ### Help! Too Many Incidents! - Capacity Assignment Policy In Agile Teams Xebia Blog - Wed, 08/20/2014 - 22:26 As an Agile coach, scrum master, product owner, or team member you probably have been in the situation before in which more work is thrown at the team than the team has capacity to resolve. In case of work that is already known this basically is a scheduling problem of determining the optimal order that the team will complete the work so as to maximise the business value and outcome. This typically applies to the case that a team is working to build or extend a new product. The other interesting case is e.g. operational teams that work on items that arrive in an ad hoc way. Examples include production incidents. Work arrives ad hoc and the product owner needs to allocate a certain capacity of the team to certain types of incidents. E.g. should the team work on database related issues, or on front-end related issues? If the team has more than enough capacity the answer is easy: solve them all! This blog will show how to determine what capacity of the team is best allocated to what type of incident. What are we trying to solve? Before going into details, let's define what problem we want to solve. Assume that the team recognises various types of incidents, e.g. database related, GUI related, perhaps some more. Each type of incident will have an associated average resolution time. Also, each type will arrive at the team at a certain rate, the input rate. E.g. database related incidents arrive 3 times per month, whereas GUI related incidents occur 4 times per week. Finally, each incident type will have different operational costs assigned to it. The effect of database related incidents might be that 30 users are unable to work. GUI related incidents e.g. affect only part of the application affecting a few users. At any time, the team has a backlog of incidents to resolve. With this backlog an operational cost is concerned. This operational we want to minimise. What makes this problem interesting is that we want to minimise this cost under the constraint of having limited number of resources, or capacity. The product owner may wish to deliberately ignore GUI type of incidents and let the team work on database related incidents. Or assign 20% of the capacity to GUI related and 80% of the available capacity to database related incidents? Types of Work For each type of work we define the input rate, production rate, cost rate, waiting time, and average resolution time: $\lambda_i = \text{average input rate for type 'i'},$ \lambda_i = \text{average input rate for type '$i$'}, $C_i = \text{operational cost rate for type 'i'},$ C_i = \text{operational cost rate for type '$i$'}, $x_i = \text{average resolution time for type 'i'},$ x_i = \text{average resolution time for type '$i$'}, $w_i = \text{average waiting time for type 'i'},$ w_i = \text{average waiting time for type '$i$'}, $s_i = \text{average time spend in the system for type 'i'},$ s_i = \text{average time spend in the system for type '$i$'}, $\mu_i = \text{average production rate for type 'i'}$ \mu_i = \text{average production rate for type '$i$'} Some items get resolved and spend the time $s_i = x_i + w_i$s_i = x_i + w_i in the system. Other items never get resolved and spend time $s_i = w_i$ s_i = w_i in the system. In the previous blog Little's Law in 3D the average total operational cost is expressed as: $\text{Average operational cost for type 'i'} = \frac{1}{2} \lambda_i C_i \overline{S_i(S_i+T)}$ \text{Average operational cost for type '$i$'} = \frac{1}{2} \lambda_i C_i \overline{S_i(S_i+T)} To get the goal cost we need to sum this for all work types 'i'. System The process for work items is that they enter the system (team) as soon as they are found or detected. When they are found these items will contribute immediately to the total operational cost. This stops as soon as they are resolved. For some the product owner decides that the team will start working on them. The point that the team start working on an item the waiting time $w_i$w_i is known and on average they spend a time $x_i$x_i before it is resolved. As the team has limited resources, they cannot work on all the items. Over time the average time spent in the system will increase. As shown in the previous blog Why Little's Law Works...Always Little's Law still applies when we consider a finite time interval. This process is depicted below: $\overline{M} = \text{fixed team capacity},$ \overline{M} = \text{fixed team capacity}, $\overline{M_i} = \text{team capacity allocated to working on problems type 'i'},$ \overline{M_i} = \text{team capacity allocated to working on problems type '$i$'}, $\overline{N} = \text{total number of items in the system}$ \overline{N} = \text{total number of items in the system} The total number of items allowed in the 'green' area is restricted by the team's capacity. The team may set a WiP limit to enforce this. In contrast the number of items in the 'orange' area is not constrained: incidents flow into the system as they are found and leave the system only after they have been resolved. Without going into the details, the total operational cost can be rewritten in terms of $x_i$x_i and $w_i$w_i: (1) $\text{Average operational cost for type 'i'} = \frac{1}{2} \lambda_i C_i \overline{w_i(w_i+T)} + \mu_i C_i \overline{x_i} \,\, \overline{w_i} + \frac{1}{2} \mu_i C_i \overline{x_i(x_i+T)}$ \text{Average operational cost for type '$i'} = \frac{1}{2} \lambda_i C_i \overline{w_i(w_i+T)} + \mu_i C_i \overline{x_i} \,\, \overline{w_i} + \frac{1}{2} \mu_i C_i \overline{x_i(x_i+T)} What are we trying to solve? Again. Now that I have shown the system, defined exactly what I mean with the variables, I will refine what exactly we will be solving. Find $M_i$M_i such that this will minimise (1) under the constraint that the team has a fixed and limited capacity. Important note The system we are considering is not stable. Therefore we need to be careful when applying and using Little's Law. To circumvent necessary conditions for Little's Law to hold, I will consider the average total operational cost over a finite time interval. This means that we will minimise the average of the cost over the time interval from start to a certain time. As the accumulated cost increases over time the average is not the same as the cost at the end of the time interval. Note: For our optimisation problem to make sense the system needs to be unstable. For a stable system it follows from Little's Law that the average input rate for type i is equal to the average production rate for type 'i'. In case there is no optimisation since we cannot choose those to be different. The ability to choose them differently is the essence of our optimisation problem. Little's Law At this point Little's Law provides a few relations between the variables $M, M_i, N, w_i, x_i, \mu_i, \lambda_i$ M, M_i, N, w_i, x_i, \mu_i, \lambda_i . These relations we can use to find what values of $M_i$M_i will minimise the average total operational cost. As described in the previous blog Little's Law in 3D Little's Law gives relations for the system as a whole, per work item type and for each subsystem. These relations are: $\overline{N_i} = \lambda_i \,\, \overline{s_i}$ \overline{N_i} = \lambda_i \,\, \overline{s_i} $\overline{N_i} - \overline{M_i} = \lambda_i \,\, \overline{w_i}$ \overline{N_i} - \overline{M_i} = \lambda_i \,\, \overline{w_i} $\overline{M_i} = \mu_i \,\,\overline{x_i}$ \overline{M_i} = \mu_i \,\,\overline{x_i} $M_1 + M_2 + ... = M$ M_1 + M_2 + ... = M The latter relation is not derived from Little's Law but merely states that total capacity of the team is fixed. Note that Little's Law also has given us relation (1) above. Result Again, without going into the very interesting details of the calculation I will just state the result and show how to use it to calculate the capacities to allocate to certain work item types. First, for each work item type determine the product between the average input rate ($\lambda_i$\lambda_i) and the average resolution time ($x_i$x_i). The interpretation of this is the average number of new incidents arriving while the team works on resolving an item. Put the result in a row vector and name it 'V': (2) $V = (\lambda_1 x_1, \lambda_2 x_2, ...)$ V = (\lambda_1 x_1, \lambda_2 x_2, ...) Next, add all at the components of this vector and denote this by $||V||$||V||. Second, multiply the result of the previous step for each item by the quotient of the average resolution time ($x_i$x_i) and the cost rate ($C_i$C_i). Put the result in a row vector and name it 'W': (3) $W = (\lambda_1 x_1 \frac{x_1}{C_1}, \lambda_2 x_2 \frac{x_2}{C_2}, ...)$ W = (\lambda_1 x_1 \frac{x_1}{C_1}, \lambda_2 x_2 \frac{x_2}{C_2}, ...) Again, add all components of this row vector and call this $||W||$||W||. Then, the capacity to allocate to item of type 'k' is proportional to: (4) $\frac{M_k}{M} \sim W_k - \frac{1}{M} (W_k ||V|| - V_k ||W||)$ \frac{M_k}{M} \sim W_k - \frac{1}{M} (W_k ||V|| - V_k ||W||) Here, $V_k$V_k denotes the k-th component of the row vector 'V'. So, $V_1$V_1 is equal to $\lambda_1 x_1$\lambda_1 x_1. Likewise for $W_k$W_k. Finally, because these should add up to 1, each of (4) is divided by the sum of all of them. Example If this seems complicated, let's do a real calculation and see how the formulas of the previous section are applied. Two types of incidents As a first example consider a team that collects data on all incidents and types of work. The data collected over time includes the resolution time, dates that the incident occurred and the date the issue was resolved. The product owner assigns a business value to each incident which corresponds to the cost rate of the incident which in this case is measured in the number of (business) uses affected. Any other means of assigning a cost rate will do also. The team consist of 6 team members, so the team's capacity $M$M is equal to 12 where each member is allowed to work on a maximum of 2 incidents. From their data they discover that they have 2 main types of incidents. See the so-called Cycle Time Histogram below. The picture above shows two types of incidents, having typical average resolution times of around 2 days and 2 weeks. Analysis shows that these are related to the GUI and database components respectively. From their data the team determines that they have an average input rate of 6 per week and 2 per month respectively. The average cost rate for each type is 10 per day and 200 per day respectively. That is, the database related issues have: $\lambda = 2 \text{per month} = 2/20 = 1/10 \text{per day}$\lambda = 2 \text{per month} = 2/20 = 1/10 \text{per day} , $C = 200 \text{per day}$ C = 200 \text{per day} , and resolution time $x = 2 \text{weeks} = 10 \text{days}$ x = 2 \text{weeks} = 10 \text{days} . While the GUI related issues have: $\lambda = 6 \text{per week} = 6/5 \text{per day}$ \lambda = 6 \text{per week} = 6/5 \text{per day} , $C = 10 \text{per day}$ C = 10 \text{per day} , and resolution time $x = 2 \text{days}$ x = 2 \text{days} . The row vector 'V' becomes (product of $\lambda$\lambda and $x$x: $V = (1/10 * 10, 6/5 * 2) = (1, 12/5)$ V = (1/10 * 10, 6/5 * 2) = (1, 12/5) , $||V|| = 1 + 12/5 = 17/5$ ||V|| = 1 + 12/5 = 17/5 The row vector 'W' becomes: $W = (1/10 * 10 * 10 / 200, 6/5 * 2 * 2 / 10) = (1/20, 12/25)$ W = (1/10 * 10 * 10 / 200, 6/5 * 2 * 2 / 10) = (1/20, 12/25) , $||W|| = 1/20 + 12/25 = 53/100$ ||W|| = 1/20 + 12/25 = 53/100 Putting this together we obtain the result that a percentage of the team's capacity should be allocated to resolve database related issues that is equal to: $M_\text{database}/M \sim 1/20 - 1/12 *(1/20 * 17/5 - 1 * 53/100) = 1/20 + 1/12 * 36/100 = 1/20 + 3/100 = 8/100 = 40/500$ M_\text{database}/M \sim 1/20 - 1/12 *(1/20 * 17/5 - 1 * 53/100) = 1/20 + 1/12 * 36/100 = 1/20 + 3/100 = 8/100 = 40/500 and a percentage should be allocated to work on GUI related items that is $M_\text{GUI}/M \sim 12/25 - 1/12 *(12/25 * 17/5 - 12/5 * 53/100) = 12/25 - 1/12 * 9/125 = 12/25 - 3/500 = 237/500$ M_\text{GUI}/M \sim 12/25 - 1/12 *(12/25 * 17/5 - 12/5 * 53/100) = 12/25 - 1/12 * 9/125 = 12/25 - 3/500 = 237/500 Summing these two we get as the sum 277/500. This means that we allocate 40/237 ~ 16% and 237/277 ~ 84% of the team's capacity to database and GUI work items respectively. Kanban teams may define a class of service to each of these incident types and put a WiP limit on the database related incident lane of 2 cards and a WiP limit of 10 to the number of cards in the GUI related lane. Scrum teams may allocate part of the team's velocity to user stories related to database and GUI related items based on the percentages calculated above. Conclusion Starting with the expression for the average total operational cost I have shown that this leads to an interesting optimisation problem in which we ant to determine the optimal allocation of a team's capacity to different work item type in such a way that it will on average minimise the average total operation cost present in the system. The division of the team's capacity over the various work item types is determined by the work item types' average input rate, resolution time, and cost rate and is proportional to (4) $\frac{M_k}{M} \sim W_k - \frac{1}{M} (W_k ||V|| - V_k ||W||)$ \frac{M_k}{M} \sim W_k - \frac{1}{M} (W_k ||V|| - V_k ||W||) The data needed to perform this calculation is easily gathered by teams. Teams may use a cycle time histogram to find appropriate work item types. See this article on control charts for more information. ### BE Agile before you Become Agile Xebia Blog - Wed, 08/20/2014 - 20:49 People dislike change. It disrupts our routines and we need to invest to adapt. We only go along if we understand why change is needed and how we benefit from it. The key to intrinsic motivation is to experience the benefits of the change yourself, rather than having someone else explain it to you. Agility is almost an acronym for change. It is critical to let people experience the benefits of Agility before asking them to buy into this new way of working. This post explains how to create a great Agile experience in a fun, simple, cost efficient and highly effective way. BEing agile, before BEcoming agile! The concept of a “Company Innovation Day” Have you seen this clip about Dan Pinks’ Drive? According to him, the key factors for more motivation and better performance are: autonomy, mastery and purpose. If you have some scrum experience this might sound familiar, right? That is because these 3 things really tie in nicely with agile and scrum, for example: Autonomy = being able to self-direct; • Let the team plan their own work • Let the team decide how to best solve problems Mastery = learning, applying and mastering new skills and abilities, a.k.a. "get better at stuff"; • Retrospect and improve • Learn, apply and master new skills to get achieve goals as a team. Purpose = understanding necessity and being as effective as possible; • Write user stories that add value • Define sprint goals that tie in to product- and business goals. In the clip, the company "Atlassian" is mentioned. This is the company that makes "JIRA", one of the most popular Agile support tools. Atlassian tries to facilitate autonomy, mastery and purpose by organizing one day per quarter of “management free” innovation. They call it a “ship it day”. Now this is cool! According to Dan, their people had fun (most important), fixed a whole array of bugs and delivered new product ideas as well. They have to ship all this in one day, again showing similarities with the time boxed scrum approach. When I first saw this, I realized that this kind of fast delivery of value is pretty much something you would like to achieve with Agile Scrum too! Doing Scrum right would feel like a continuous series of ship it days. My own experience with innovation days Recently I organized an innovation day with a client (for tips see on how to organize yours, click here). We invited the whole department to volunteer. If you didn’t feel like it, you could just skip it and focus on sprint work. Next we promoted the day and this resulted in a growing list of ideas coming in. Except for the framing of the day, the formation of ideas and teams was totally self-organized and also result driven as we asked for the expected result. Ultimately we had 20 initiatives to be completed in one day. On the day itself, almost everyone joined in and people worked hard to achieve results at the end of the day. The day ended in presenting the results and having pizzas. Only some ideas just missed the deadline, but most were finished including usable and fresh new stuff with direct business value. When looking at the photos of that day it struck me that 9 out of ten photos showed smiling faces. Sweet! The first innovation day was concluded with an evaluation. In my opinion evaluation is essential, because this is the perfect moment discuss deeper lessons and insights. Questions like; “how can we create the innovation day energy levels during sprints”, and “how can we utilize self-organizing abilities more” are invaluable as they could lead to new insights, inspiration and experiments for day-to-day operations. The value of an innovation day as a starting point for Agile All in all, I think an innovation day is the perfect way to get people experiencing the power of Agile. Doing the innovation day on “day one” offers huge benefits when added to standard stuff like training and games. This is because the context is real. You have a real goal, a real timebox and you need to self-organize to achieve the desired result. People doing the work get to experience their potential and the power of doing stuff within a simplified context. Managers get to experience unleashing the human potential when they focus only on the context and environment for that day. I can only imagine the amazement and renewed joy when people experience the possibilities coming from a strong waterfall setting. All that good stuff from just a one-day investment! Conclusion It would be great if you would start out an Agile change initiative with an innovation day. Get people enthusiastic and inspired (e.g. motivated for change) first and then tell them why it works and how we are going to apply the same principles in day-to-day operations. This will result in less friction and resistance and give people a better sense for where they are heading. Do you want to start doing innovation days or do you want to share your experience, feel free to leave a comment below. ### Xamarin.Forms with Zumero Eric.Weblog() - Eric Sink - Wed, 08/20/2014 - 16:00 I am a Xamarin fanboy, so my excitement about Xamarin.Forms is perhaps unsurprising. But I see an awful lot of potential for this technology. I want to show you some of the stuff we've been doing with Xamarin.Forms here at Zumero. Andrew Jackson in Two Minutes First I am going to race through this demo very quickly. Then I'll circle back around and explain things. STEP ONE: Download ZAG and run it Visit http://zumero.com/dev-center/zss/#zag and download the ZAG application. For this demo, I'm using ZAG on Mac OS X (but you could choose Windows or Linux) and I am targetting iOS (but you could choose Android or Windows Phone). When you run the app, you should see something like this: STEP TWO: New Database Under the "File" menu, choose "New Database...". You should see this dialog: Fill in the Server URL and DBFile exactly as shown in the screen shot (Server URL: "http://demo.zumero.com:8080". DBFile: "demo"). Click the OK button. You should see a dialog asking you where to save the local copy of the database: Click OK. You should see "Syncing with the ZSS Server": And when the sync is complete, at the bottom of the ZAG window, you should see "Sync result: 0 (success)". STEP THREE: Generate Under the "Generate" menu, find and choose the item labeled "Xamarin.Forms C#": You will be asked three questions, and you should be able to just click OK on all three. STEP FOUR: Open the sln file You can quit the ZAG application now. It should have generated a folder somewhere like /Users/eric/Documents/demo.zssdemo/. Under that folder you should find a Xamarin solution tree that looks something like this: Double-click the demo.sln file to open it in Xamarin Studio. You should see four C# projects: a Portable Class Library called "demo.Shared", plus one app target each for iOS, Android, and Windows Phone 8: STEP FIVE: Build and run the app If you build and run the demo.iOS app in the iPhone simulator, you should see something like this: STEP SIX: Sync Click the "Sync" button in the upper right. You should see: The defaults should be fine. Just tap the "Sync Now" button. When the sync is completed, you should see a list of tables: STEP SEVEN: Andrew Jackson Tap the "presidents" table. In an iPad instance of the simulator, you would see this: And tap the seventh item. You should see Andrew Jackson, the only U.S. president ever to kill someone in a duel: What is ZAG? ZAG is short for "ZSS App Generator". It's a desktop app which generates ready-to-build source code and build scripts for mobile apps that sync using ZSS. We think of ZAG as a way for getting people started faster. Many people come to our product without much experience in mobile app development. ZAG can be used to give them a starting point, sort of like sample code that is customized for their data. What is Zumero for SQL Server? Zumero for SQL Server (ZSS) is a solution for data sync between SQL Server and mobile devices. More info from Dan Bricklin about offline in mobile apps: http://bricklin.com/offline.htm More info about Zumero on our website: zumero.com More info about Zumero from my previous blog entry: here What is demo.zumero.com:8080? This is a publicly accessible ZSS server provided so that folks can play with Zumero clients more easily. It contains some basic sample data such as U.S. presidents and the periodic table of the elements. In real-world scenarios, a customer would use ZAG to generate their starter app after they have completed setup of their ZSS server. What is Xamarin? Xamarin is (IMHO) a great solution for building mobile apps. One of the main benefits of the Xamarin platform is the ability to write the non-UI parts of your iOS/Android/WP8 apps in cross-platform code while implementing a native user interface for each mobile environment. But I would use Xamarin even for a single-platform app, simply to get the benefits of working in .NET/C#. More info on the Xamarin website: http://xamarin.com/ What is Xamarin.Forms? Xamarin.Forms is Xamarin's solution for making [most of] your UI code cross-platform as well, while retaining fully native performance and feel. In a nutshell, the coolness of Xamarin.Forms lies in the fact that in the solution generated by ZAG above, the demo.Shared project is a Portable Class Library even though it contains the entire user interface for the app. More info on the Xamarin website: http://xamarin.com/forms What is a Portable Class Library (PCL)? A PCL is a .NET class library that is annotated with information about which platforms it should support. This metadata allows the tooling to enforce portability rules in both the development and the consumption of the library. More info on Scott Hanselman's blog: http://www.hanselman.com/blog/CrossPlatformPortableClassLibrariesWithNETAreHappening.aspx More info on the Xamarin website: http://developer.xamarin.com/guides/cross-platform/application_fundamentals/pcl/introduction_to_portable_class_libraries/ Why does ZAG generate separate projects for iOS, Android, and WinPhone? Xamarin.Forms can make most of your UI code portable, but not all of it. The actual building of the mobile app is specific to each platform. But if you look in the code for each of those platform-specific projects, you'll see that there isn't much there. What dependencies does the ZAG-generated app have? The following NuGet packages will need to be retrieved: • Xamarin.Forms • SQLite-net PCL • SQLitePCL.raw_basic • Zumero What is the "SQLite-net PCL" NuGet package? This is the Portable Class Library (PCL) version of SQLite-net, the popular lightweight SQLite ORM by Frank Krueger (@praeclarum). More info on GitHub: https://github.com/praeclarum/sqlite-net More info on the NuGet website: https://www.nuget.org/packages/sqlite-net-pcl/ What is the "SQLitePCL.raw_basic" NuGet package? SQLitePCL.raw is my Portable Class Library for accessing SQLite from C#. More info on Github: https://github.com/ericsink/SQLitePCL.raw More info on the NuGet website: https://www.nuget.org/packages/SQLitePCL.raw_basic/ What is SQLite? SQLite is the most popular SQLite database for mobile devices. More info on the SQLite website: sqlite.org What is the "Zumero" NuGet package? This is the Zumero Client SDK in the form of a Portable Class Library in a NuGet package. More info on the Zumero website: http://zumero.com/dev-center/zss/ More info on the NuGet website: https://www.nuget.org/packages/Zumero/ What do Zumero's client-side SQLite files look like? As much as possible, they look exactly like they looked in SQL Server. • Table and column names are the same. • All data values are the same (whenever possible). • Foreign keys in SQL Server are reconstructed as foreign keys in SQLite. • Since SQLite does not perform type checking, Zumero adds constraints to do so. And so on... What's happening in step two? ZAG is acting as a Zumero client and synchronizing the data on the server into a local SQLite file. This file is used to obtain information about the tables and columns necessary to generate the mobile app. The same sync is happening in step six, except then it is the mobile app performing the sync instead of ZAG. What were those three questions in step three? The first one is the project name: Then ZAG wants to know the settings for your sync server. These should already be filled in with the ones you entered earlier: Finally, ZAG is asking you where to save the source code and project files for the app to be generated: Does a ZAG-generated app allow modifications to the data? For the Xamarin.Forms C# target, yes. On the item detail page, you should be able to enter new values in text fields and 'Save' the changes. But you should get a permission denied error if you try to sync those changes to our public demo server. :-) Is ZAG generating UI stuff as XAML or as C# code? Currently, it's XAML. You'll find the files in the 'xaml' folder in the demo.Shared project. Does ZAG generate polished ready-to-use apps? Oh definitely not. :-) The output of ZAG should build and run with no errors (if it doesn't, it's a bug, and please let us know), but it's just a starting point for further development. ### Creating a Company Where Everyone Gives Their Best “Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do.” —Steve Jobs What does it take to create a company where everybody gives their best where they have their best to give? It takes empathy. It also takes encouraging people to be zestful, zany, and zealous. It takes bridging the gap between the traits that make people come alive, and the traits that traditional management practices value. In the book The Future of Management, Gary Hamel walks through what it takes to create a company where everyone gives their best so that employees thrive and companies create sustainable competitive advantage. Resilience and Creativity: The Traits that Differentiate Human Beings from Other Species Resilience and creativity are what separate us from the pack. “Ask your colleagues to describe the distinguishing characteristics of your company, and few are likely to mention adaptability and inventiveness. Yet if you ask them to make a list of the traits that differentiate human beings from other species, resilience and creativity will be near the top of the list. We see evidence of these qualities every day -- in ourselves and in those around us. “ We Work for Organizations that Aren't Very Human People are adaptive and creative, but they often work for organizations that are not. “All of us know folks who've switched careers in search of new challenges or a more balanced life. We know people who've changed their consumption habits for the sake of the planet. We have friends and relatives who've undergone a spiritual transformation, or risen to the demands of parenthood, or overcome tragedy. Every day we meet people who write blogs, experiment with new recipes, mix up dance tunes, or customize their cars. As human beings, we are amazingly adaptable and creative, yet most of us work for companies that are not. In other words, we work for organizations that aren't very human.” Modern Organizations Deplete Natural Resilience and Creativity Why do so many organizations underperform? They ignore or devalue the capabilities that make us human. “There seems to be something in modern organizations that depletes the natural resilience and creativity of human beings, something that literally leaches these qualities out of employees during daylight hours. The culprit? Management principles and processes that foster discipline, punctuality, economy, rationality, and order, yet place little value on artistry, nonconformity, originality, audacity, and élan. To put it simply, most companies are only fractionally human because they make room for only a fraction of the qualities and capabilities that make us human. Billions of people show up for work every day, but way too many of them are sleepwalking. The result: organizations that systematically underperform their potential.” Adaptability and Innovation Have Become the Keys to Competitive Success There’s a great big gap between what makes people great and the management systems that get in the way. “Weirdly, many of those who labor in the corporate world--from lowly admins to high powered CEOs--seem resigned to this state of affairs. They seem unperturbed by the confounding contrast between the essential nature of human beings and the essential nature of the organization in which they work. In years past, it might have been possible to ignore this incongruity, but no longer--not in a world where adaptability and innovation have become the sine qua non of competitive success. The challenge: to reinvent our management systems so they inspire human beings to bring all of their capabilities to work every day.” The Human Capabilities that Contribute to Competitive Success Hamel offers his take on what the relative contribution of human capabilities that contribute to value creation, recognizing that we now live in a world where efficiency and discipline are table stakes. Passion 35% Creativity 25% Initiative 20% Intellect 15% Diligence 5% Obedience 0% 100% “The human capabilities that contribute to competitive success can be arrayed in a hierarchy. At the bottom is obedience--an ability to take direction and follow rules. This is the baseline. Next up the ladder is diligence. Diligent employees are accountable. They don't take shortcuts. They are conscientious and well-organized. Knowledge and intellect are on the next step. Most companies work hard to hire intellectually gifted employees. They value smart people who are eager to improve their skills and willing to borrow best practices from others. Beyond intellect lies initiative. People with initiative don't wait to be asked and don't wait to be told. They seek out new challenges and are always searching for new ways to add value. Higher still lies the gift of creativity. Creative people are inquisitive and irrepressible. They're not afraid of saying stupid things. They start a lot of conversations with, 'Wouldn't it be cool if ..." And finally, at the top lies passion.” The Power of Passion Passion makes us do dumb things. But it’s also the key to doing great things. Via Via The Future of Management: “Passion can make people do stupid things, but it's the secret sauce that turns intent into accomplishment. People with passion climb over obstacles and refuse to give up. Passion is contagious and turns one-person crusades into mass movements. As the English novelist E.M. Forster put it, 'One person with passion is better than forty people merely interested.'” Obedience is Worth Zip in Terms of Competitive Advantage Rule-following employees won’t help you change the world. “I'm not suggesting that obedience is literally worth nothing. A company where no one followed any rules would soon descend into anarchy. Instead, I'm arguing that rule-following employees are worth zip in terms of their competitive advantage they generate. In a world with 4 billion nearly distributed souls, all eager to climb the ladder of economic progress, it's not hard to find billable, hardworking employees. And what about intelligence? For years we've been told we're living in the knowledge economy; but as knowledge itself becomes commoditized, it will lose much of its power to create competitive advantage.” Obedience, Diligence, and Expertise Can Be Bought for Next to Nothing You can easily buy obedience, diligence, and expertise from around the world. But that’s not what will make you the next great company or the next great thing or a great place to work. “Today, obedience, diligence, and expertise can be bought for next to nothing. From Bangalore to Guangzhou, they have become global commodities. A simple example: turn over your iPod, and you'll find six words engraved on the back that foretell the future of competition: 'Designed in California. Made in China.' Despite the equal billing, the remarkable success of Apple's music business owes relatively little to the company's network of Asian subcontractors. It is a credit instead to the imagination of Apple's designers, marketers, and lawyers. Obviously not every iconic product is going to be designed in California, not nor manufactured in China. “ You Need Employees that are Zestful, Zany, and Zealous If you want to bring out the best in people and what they are capable of, aim for zestful, zany, and zealous. “The point, though, is this: if you want to capture the economic high ground in the creative economy, you need employees who are more than acquiescent, attentive, and astute--they must also be zestful, zany, and zealous.” If you want to bring out your best, then break our your zest and get your zane on. You Might Also Like The Principles of Modern Management How Employees Lost Empathy for their Work, for the Customer, and for the Final Product No Slack = No Innovation The Drag of Old Mental Models on Innovation and Change The New Competitive Landscape The New Realities that Call for New Organizational and Management Capabilities Who’s Managing Your Company Categories: Architecture, Programming ### Agile 2014 – speaking and attending; a summary Xebia Blog - Tue, 08/19/2014 - 17:14 So Agile 2014 is over again… and what an interesting conference it was. What did I find most rewarding? Meeting so many agile people! My first conclusion was that there were experts like us agile consultants or starting agile coaches, ScrumMasters and other people getting acquainted with our cool agile world. Another trend I noticed was the scaled agile movement. Everybody seems to be involved in that somehow. Some more successful than others; some more true to agile than others. What I missed this year was the movement of scrum or agile outside IT although my talk about scrum for marketing had a lot of positive responses. Everybody I talked to was interested in hearing more information about it. There was a talk maybe even two about hardware agile but I did not found a lot of buzz around it. Maybe next year? I do feel that there is potential here. I believe Fullstack product development should be the future. Marketing and IT teams? Hardware and software teams? Splitting these still sounds as design and developer teams to me. But what a great conference it was. I met a lot of awesome people. Some just entering the agile world; some authors of books I had read which got me further in the agile movement. I talked to the guys from Spotify. The company which is unique in its agile adoption / maturity. And they don’t even think that they are there yet. But then again will somebody ever truly BE agile ..? I met the guys from scrum.inc who developed a great new scaled framework. Awesome ideas on that subject and awesome potential to treat it as a community created open framework; keep your eyes open for that! I attended some nice talks too; also some horrible ones. Or actually 1, which should never have been presented in a 90 minute slot in a conference like this. But lets get back to the nice stories. Lyssa Adkins had a ‘talk’ about conflicts. Fun thing was that she actually facilitated the debate about scaled agile on stage. The session could have been better but the idea and potential of the subject is great. Best session? Well probably the spotify guys. Still the greatest story out there of an agile company. The key take-out of that session for me is: agile is not an end-state, but a journey. And if you take it as serious as Spotify you might be able to make the working world a lot better. Looking at Xebia we might not even be considered to be trying agile compared to them. And that is meant in a humble way while looking up to these guys! - I know we are one of the frontiers of agile in the Netherlands. The greatest question in this session: ‘Where is the PMO in your model….’ Well you clearly understand this … Another inspiring session was the keynote session from the CFO of Statoil about beyond budgeting. This was a good story which should become bigger in the near future as this is one of the main questions I get when implementing agile in a company: “how do we plan / estimate and budget projects when we go and do agile?” Beyond budgeting at least get’s us a little closer. Long story short. I had a blast in Orlando. I learnt new things and met a lot of cool people.My main take out: Our community is growing which teaches us that we are not yet there by a long run. An awesome future is ahead! See you next year! ### AngularJS directives for c3.js Gridshore - Tue, 08/19/2014 - 10:19 For one of my projects we wanted to create some nice charts. Feels like something you often want but do not do because it takes to much time. This time we really needed it. We had a look at D3.js library, a very nice library but so many options and a lot to do yourself. Than we found c3.js, check the blog post by Roberto: Creating charts with C3.js. Since I do a lot with AngularJS, I wanted to integrate these c3.js charts with AngularJS. I already wrote a piece about the integration. Now I went one step further by creating a set of AngularJS directives. You can read the blog on the trifork blog: http://blog.trifork.com/2014/08/19/angularjs-directives-for-c3-js-chart-library/ The post AngularJS directives for c3.js appeared first on Gridshore. Categories: Architecture, Programming ### How to choose the right project? Decision making frameworks for software organizations Software Development Today - Vasco Duarte - Tue, 08/19/2014 - 04:00 Frameworks to choose the best projects in organizations are a dime a dozen. We have our NPV (net present value), we have our customized Criteria Matrix, we have Strategic alignment, we have Risk/Value scoring, and the list goes on and on. In every organization there will a preference for one of these or similar methods to choose where to invest people’s precious time and money. Are all these frameworks good? No, but they aren’t bad either. They all have some potential positive impact, at least when it comes to reflection. They help executive teams reflect on where they want to take their organizations, and how each potential project will help (or hinder) those objectives. So far, so good. “Everybody’s got a plan, until they get punched in the face” ~Tyson Surviving wrong decisions made with perfect data However, reality is seldom as structured and predictable as the plans make it out to be. Despite the obvious value that the frameworks above have for decision making, they can’t be perfect because they lack one crucial aspect of reality: feedback. Models lack on critical property of reality: feedback. As soon as we start executing a particular project, we have chosen a path and have made allocation of people’s time and money. That, in turn, sets in motion a series of other decisions: we may hire some people, we may subcontract part of the project, etc. All of these subsequent decisions will have even further impacts as the projects go on, and they may lead to even more decisions being made. Each of these decisions will also have an impact on the outcome of the chosen projects, as well as on other sub-decisions for each project. Perhaps the simplest example being the conflicts that arise from certain tasks for different projects having to be executed by the same people (shared skills or knowledge). And at this point we have to ask: even assuming that we had perfect data when we chose the project based on one of the frameworks above, how do we make sure that we are still working on the most important and valuable projects for our organization? Independently from the decisions made in the past, how do we ensure we are working on the most important work today? The feedback bytes back This illustrates one of the most common problems with decision making frameworks: their static nature. They are about making decisions "now", not "continuously". Decision making frameworks are great at the time when you need to make a decision, but once the wheels are in motion, you will need to adapt. You will need to understand and harness the feedback of your decisions and change what is needed to make sure you are still focusing on the most valuable work for your organization. All decision frameworks have one critical shortcoming: they are static by design. How do we improve decision making after the fact? First, we must understand that any work that is “in flight” (aka in progress) in IT projects has a value of zero, i.e., in IT projects no work has value until it is in use by someone, somewhere. And at that point it has both value (the benefit) and cost (how much we spend maintaining that functionality). This dynamic means that even if you have chosen the right project to start with, you have to make sure that you can stop any project, at any time. Otherwise you will have committed to invest more time and more money (by making irreversible “big bang” decisions) into projects that may prove to be much less valuable than you expected when you started them. This phenomenon of continuing to invest beyond the project benefit/cost trade-off point is known as Sunk Cost Fallacy and is a very common problem in software organizations: because reversing a decision made using a trustworthy process is very difficult, both practically (stop project = loose all value) and due to bureaucracy (how do we prove that the decision to stop is better than the decision to start the project?) Can we treat the Sunk Cost Fallacy syndrome? While using the decision frameworks listed above (or others), don’t forget that the most important decision you can make is to keep your options open in a way that allows you to stop work on projects that prove less valuable than expected, and to invest more in projects that prove more valuable than expected. In my own practice this is one of the reasons why I focus on one of the #NoEstimates rules: Always know what is the most valuable thing to work on, and work only on that. So my suggestion is: even when you score projects and make decisions on those scores, always keep in mind that you may be wrong. So, invest in small increments into the projects you believe are valuable, but be ready to reassess and stop investing if those projects prove less valuable than other projects that will become relevant later on. The #NoEstimates approach I use allows me to do this at three levels: • a) Portfolio level: by reviewing constant progress in each project and assess value delivered. As well as constantly preparing to stop each project by releasing regularly to a production-like environment. Portfolio flexibility. • b) Project level: by separating each piece of value (User Story or Feature) into an independent work package that can be delivered independently from all other project work. Scope flexibility. • c) User Story / Feature level: by keeping User Stories and Features as small as possible (1 day for User Stories, 1-2 weeks for Features), and releasing them independently at fixed time intervals. Work item flexibility Do you want to know more about adaptive decision frameworks? Woody Zuill and myself will be hosting a workshop in Helsinki to present our #NoEstimates ideas and to discuss decision making frameworks for software projects that build on our #NoEstimates work. You can sign up here. But before you do, email me and get a special discount code. If you manage software organizations and projects, there will be other interesting workshops for you in the same days. For example, the #MobProgramming workshop where Woody Zuill shows you how he has been able to help his teams significantly improve their well-being and performance. #MobProgramming may well be a breakthrough in Agile management. Picture credit: John Hammink, follow him on twitter ### Office Hours for Google’s Udacity MOOCs Google Code Blog - Mon, 08/18/2014 - 16:39 By Peter Lubbers, a Program Manager in charge of Google’s Scalable Developer Programs, which include MOOC developer training. Peter is the author of "Pro HTML5 Programming" (Apress) and, yes, his car's license plate is HTML5! At Google I/O, we launched four new Udacity MOOCs, helping developers learn how to work with Android, Web, UX Design, and Cloud technology. We’re humbled that almost 100,000 students signed up for these new courses since then. Over the next two weeks, we’ll be hosting on-air office hours to help out students who are working through some of these classes. Ask your questions via the Moderator links below, and the Google Experts will answer them live. Please join us if you are taking the class, or just interested in the answers. Class: Web Performance Optimization — Critical Rendering Path Class: Android Fundamentals Class: Building Scalable Apps with Google App Engine You can find all of the Google Udacity MOOCs at www.udacity.com/google. Posted by Mano Marks, Scalable Developer Advocacy Team Categories: Programming ### Taking Action Making the Complex Simple - John Sonmez - Mon, 08/18/2014 - 15:00 On any given day my inbox is full of emails from software developers asking me for advice on all kinds of topics. Even though many of these questions are unique, I’ve found that many of the emails have one root, all-encompassing solution: taking action. Most people never actually do anything with their lives. Most people […] The post Taking Action appeared first on Simple Programmer. Categories: Programming ### Ruby: Create and share Google Drive Spreadsheet Mark Needham - Sun, 08/17/2014 - 22:42 Over the weekend I’ve been trying to write some code to help me create and share a Google Drive spreadsheet and for the first bit I started out with the Google Drive gem. This worked reasonably well but that gem doesn’t have an API for changing the permissions on a document so I ended up using the google-api-client gem for that bit. This tutorial provides a good quick start for getting up and running but it still has a manual step to copy/paste the ‘OAuth token’ which I wanted to get rid of. The first step is to create a project via the Google Developers Console. Once the project is created, click through to it and then click on ‘credentials’ on the left menu. Click on the “Create new Client ID” button to create the project credentials. You should see something like this on the right hand side of the screen: These are the credentials that we’ll use in our code. Since I now have two libraries I need to satisfy the OAuth credentials for both, preferably without getting the user to go through the process twice. After a bit of trial and error I realised that it was easier to get the google-api-client to handle authentication and just pass in the token to the google-drive code. I wrote the following code using Sinatra to handle the OAuth authorisation with Google: require 'sinatra' require 'json' require "google_drive" require 'google/api_client' CLIENT_ID = 'my client id' CLIENT_SECRET = 'my client secret' OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive https://docs.google.com/feeds/ https://docs.googleusercontent.com/ https://spreadsheets.google.com/feeds/' REDIRECT_URI = 'http://localhost:9393/oauth2callback' helpers do def partial (template, locals = {}) haml(template, :layout => false, :locals => locals) end end enable :sessions get '/' do haml :index end configure do google_client = Google::APIClient.new google_client.authorization.client_id = CLIENT_ID google_client.authorization.client_secret = CLIENT_SECRET google_client.authorization.scope = OAUTH_SCOPE google_client.authorization.redirect_uri = REDIRECT_URI set :google_client, google_client set :google_client_driver, google_client.discovered_api('drive', 'v2') end post '/login/' do client = settings.google_client redirect client.authorization.authorization_uri end get '/oauth2callback' do authorization_code = params['code'] client = settings.google_client client.authorization.code = authorization_code client.authorization.fetch_access_token! oauth_token = client.authorization.access_token session[:oauth_token] = oauth_token redirect '/' end And this is the code for the index page: %html %head %title Google Docs Spreadsheet %body .container %h2 Create Google Docs Spreadsheet %div - unless session['oauth_token'] %form{:name => "spreadsheet", :id => "spreadsheet", :action => "/login/", :method => "post", :enctype => "text/plain"} %input{:type => "submit", :value => "Authorise Google Account", :class => "button"} - else %form{:name => "spreadsheet", :id => "spreadsheet", :action => "/spreadsheet/", :method => "post", :enctype => "text/plain"} %input{:type => "submit", :value => "Create Spreadsheet", :class => "button"} We initialise the Google API client inside the ‘configure’ block before each request gets handled and then from ‘/’ the user can click a button which does a POST request to ‘/login/’. ‘/login/’ redirects us to the OAuth authorisation URI where we select the Google account we want to use and login if necessary. We’ll then get redirected back to ‘/oauth2callback’ where we extract the authorisation code and then get an authorisation token. We’ll store that token in the session so that we can use it later on. Now we need to create the spreadsheet and share that document with someone else: post '/spreadsheet/' do client = settings.google_client if session[:oauth_token] client.authorization.access_token = session[:oauth_token] end google_drive_session = GoogleDrive.login_with_oauth(session[:oauth_token]) spreadsheet = google_drive_session.create_spreadsheet(title = "foobar") ws = spreadsheet.worksheets[0] ws[2, 1] = "foo" ws[2, 2] = "bar" ws.save() file_id = ws.worksheet_feed_url.split("/")[-4] drive = settings.google_client_driver new_permission = drive.permissions.insert.request_schema.new({ 'value' => "some_other_email@gmail.com", 'type' => "user", 'role' => "reader" }) result = client.execute( :api_method => drive.permissions.insert, :body_object => new_permission, :parameters => { 'fileId' => file_id }) if result.status == 200 p result.data else puts "An error occurred: #{result.data['error']['message']}" end "spreadsheet created and shared" end Here we create a spreadsheet with some arbitrary values using the google-drive gem before granting permission to a different email address than the one which owns it. I’ve given that other user read permission on the document. One other thing to keep in mind is which ‘scopes’ the OAuth authentication is for. If you authenticate for one URI and then try to do something against another one you’ll get a ‘Token invalid – AuthSub token has wrong scope‘ error. Categories: Programming ### Little's Law in 3D Xebia Blog - Sun, 08/17/2014 - 16:21 The much used relation between average cycle time, average total work and input rate (or throughput) is known as Little's Law. It is often used to argue that it is a good thing to work on less items at the same time (as a team or as an individual) and thus lowering the average cycle time. In this blog I will discuss the less known generalisation of Little's Law giving an almost unlimited number of additional relation. The only limit is your imagination. I will show relations for the average 'Total Operational Cost in the system' and for the average 'Just-in-Timeness'. First I will describe some rather straightforward generalisations and in the third part some more complex variations on Little's Law. Little's Law Variations As I showed in the previous blogs (Applying Little's Law in Agile Games and Why Little's Law Works...Always) Little's Law in fact states that measuring the total area from left-to-right equals summing it from top-to-bottom. Once we realise this, it is easy to see some straightforward generalisations which are well-known. I'll mention them here briefly without ging into too much details. Subsystem Suppose a system that consists of 1 or more subsystems, e.g. in a kanban system consisting of 3 columns we can identify the subsystems corresponding to: 1. first column (e.g. 'New') in 'red', 2. second column (e.g. 'Doing') in 'yellow', 3. third column (e.g. 'Done') in 'green' See the figure on the right. By colouring the subsystems different from each other we see immediately that Little's Law applies to the system as a whole as well as to every subsystem ('red' and 'yellow' area). Note: for the average input rate consider only the rows that have the corresponding color, i.e. for the input rate of the column 'Doing' consider only the rows that have a yellow color; in this case the average input rate equals 8/3 items per round (entering the 'Doing' column). Likewise for the 'New' column. Work Item Type Until now I assumed only 1 type of work items. In practise teams deal with more than one different work item types. Examples include class of service lanes, user stories, and production incidents. Again, by colouring the various work item type differently we see that Little's Law applies to each individual work item type. In the example on the right, we have coloured user stories ('yellow') and production incidents ('red'). Again, Little's Law applies to both the red and yellow areas separately. Doing the math we se that for 'user stories' (yellow area): • Average number in the system (N) = (6+5+4)/3 = 5 user stories, • Average input rate ($\lambda$\lambda = 6/3 = 2 user stories per round, • Average waiting time (W) = (3+3+3+3+2+1)/6 = 15/6 = 5/2 rounds. As expected, the average number in the system equals the average input rate times the average waiting time. The same calculation can be made for the production incidents which I leave as an exercise to the reader. Expedite Items Finally, consider items that enter and spend time in an 'expedite' lane. In Kanban an expedite lane is used for items that need special priority. Usually the policy for handling such items are that (a) there can be at most 1 such item in the system at any time, (b) the team stop working on anything but on this item so that it is completed as fast as possible, (c) they have priority over anything else, and (d) they may violate any WiP limits. Colouring any work items blue that spend time in the expedite lane we can apply Little's Law to the expedite lane as well. An example of the colouring is shown in the figure on the right. I leave the calculation to the reader. 3D We can even further extend Little's Law. Until now I have considered only 'flat' areas. The extension is that we can give each cell a certain height. See the figure to the right. A variation on Little's Law follows once we realise that measuring the volume from left-to-right is the same as calculating it from top-to-bottom. Instead of measuring areas we measure volumes instead. The only catch here is that in order to write down Little's Law we need to give a sensible interpretation to the 'horizontal' sum of the numbers and a sensible interpretation to the 'vertical' sum of the numbers. In case of a height of '1' these are just 'Waiting Time' (W) and 'Number of items in the system' (N) respectively. A more detailed, precise, and mathematical formulation can be found in the paper by Little himself: see section 3.2 in [Lit11]. Some Applications of 3D-Little's Law Value As a warming-up exercise consider as the height the (business) value of an item. Call this value 'V'. Every work item will have its own specific value. $\overline{\mathrm{Value}} = \lambda \overline{V W}$ \overline{\mathrm{Value}} = \lambda \overline{V W} The interpretation of this relation is that the 'average (business) value of unfinished work in the system at any time' is equal to the average input rate multiplied by the 'average of the product of cycle time and value'. Teams may ant to minimise this while at the same time maximising the value output rate. Total Operational Cost As the next example let's take as the height for the cells a sequence of numbers 1, 2, 3, .... An example is shown in the figures below. What are the interpretations in this case? Suppose we have a work item that has an operational cost of 1 per day. Then the sequence 1, 2, 3, ... gives the total cost to date. At day 3, the total cost is 3 times 1 which is the third number in the sequence. The 'vertical' sum is just the 'Total Cost of unfinished work in the system. For the interpretation of the 'horizontal' sum we need to add the numbers. For a work item that is in the system for 'n' days, the total is $1+2+3+...+n$1+2+3+...+n which equals $1/2 n (n+1)$1/2 n (n+1). For 3 days this gives $1+2+3=1/2 * 3 * 4 = 6$1+2+3=1/2 * 3 * 4 = 6. Thus, the interpretation of the 'horizontal' sum is $1/2 W (W+1)$1/2 W (W+1) in which 'W' represents the waiting time of the item. Putting this together gives an additional Little's Law of the form: $\overline{\mathrm{Cost}} = \frac{1}{2} \lambda C \overline{W(W + 1)}$ \overline{\mathrm{Cost}} = \frac{1}{2} \lambda C \overline{W(W + 1)} where 'C' is the operational cost rate of a work item and $\lambda$\lambda is the (average) input rate. If instead of rounds in a game, the 'Total Cost in the system' is measured at a time interval 'T' the formula slightly changes into $\overline{\mathrm{Cost}} = \frac{1}{2} \lambda C \overline{W\left(W + T\right)}$ \overline{\mathrm{Cost}} = \frac{1}{2} \lambda C \overline{W\left(W + T\right)} Teams may want to minimise this which gives an interesting optimisation problem is different work item types have different associated operational cost rates. How should the capacity of the be divided over the work items? This is a topic for another blog. Just-in-Time For a slightly more odd relation consider items that have a deadline associated with them. Denote the date and time of the deadline by 'D'. As the height choose the number of time units before or after the deadline the item is completed. Further, call 'T' the time that the team has taken up to work on the item. Then the team finishes work on this item at time $T + W$ T + W , where 'W' represent the cycle time of the work item. In the picture on the left a work item is shown that is finished 2 days before the deadline. Notice that the height decreases as the deadline is approached. Since it is finished 2 time units before the deadline, the just-in-timeness is 2 at the completion time. The picture on the left shows a work item one time unit after the deadline and has an associated just-in-timeness of 1. $\overline{\mathrm{Just-in-Time}} = \frac{1}{2} \lambda \overline{|T+W-D|(|T+W-D| + 1)}$ \overline{\mathrm{Just-in-Time}} = \frac{1}{2} \lambda \overline{|T+W-D|(|T+W-D| + 1)} This example sounds like a very exotic one and not very useful. A team might want to look at what the best time is to start working on an item so as to minimise the above variable. Conclusion From our 'playing around' with the size of areas and volumes and realising that counting it in different ways (left-to-right and top-to-bottom) should give the same result I have been able to derive a new set of relations. In this blog I have rederived well-known variations on Little's Law regarding subsystems and work items types. In addition I have derived new relations for the 'Average Total Operational Cost', 'Average Value', and 'Average Just-in-Timeness'. Together with the familiar Little's Law these give rise to interesting optimisation problems and may lead to practical guidelines for teams to create even more value. I'm curious to hear about the variations that you can come up with! Let me know by posting them here. References [Lit11] John D.C. Little, "Little’s Law as Viewed on Its 50th Anniversary", 2011, Operations Research, Vol. 59 , No 3, pp. 536-549, https://www.informs.org/content/download/255808/2414681/file/little_paper.pdf ### Ruby: Receive JSON in request body Mark Needham - Sun, 08/17/2014 - 13:21 I’ve been building a little Sinatra app to play around with the Google Drive API and one thing I struggled with was processing JSON posted in the request body. I came across a few posts which suggested that the request body would be available as params['data'] or request['data'] but after trying several ways of sending a POST request that doesn’t seem to be the case. I eventually came across this StackOverflow post which shows how to do it: require 'sinatra' require 'json' post '/somewhere/' do request.body.rewind request_payload = JSON.parse request.body.read p request_payload "win" end I can then POST to that endpoint and see the JSON printed back on the console: dummy.json {"i": "am json"}  curl -H "Content-Type: application/json" -XPOST http://localhost:9393/somewhere/ -d @dummy.json
{"i"=>"am json"}

Of course if I’d just RTFM I could have found this out much more quickly!

Categories: Programming

Mark Needham - Sun, 08/17/2014 - 02:49

I’ve been using the Google Drive gem to try and interact with my Google Drive account and almost immediately ran into problems trying to login.

I started out with the following code:

require "rubygems"

session = GoogleDrive.login("me@mydomain.com", "mypassword")

I’ll move it to use OAuth when I put it into my application but for spiking this approach works. Unfortunately I got the following error when running the script:

/Users/markneedham/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/google_drive-0.3.10/lib/google_drive/session.rb:93:in rescue in login': Authentication failed for me@mydomain.com: Response code 403 for post https://www.google.com/accounts/ClientLogin: Error=BadAuthentication (GoogleDrive::AuthenticationError)
Info=InvalidSecondFactor
from /Users/markneedham/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/google_drive-0.3.10/lib/google_drive/session.rb:86:in login'
from /Users/markneedham/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/google_drive-0.3.10/lib/google_drive.rb:18:in login'
from src/gdoc.rb:15:in <main>'

Since I have two factor authentication enabled on my account it turns out that I need to create an app password to login:

It will then pop up with a password that we can use to login (I have revoked this one!):


require "rubygems"

session = GoogleDrive.login("me@mydomain.com", "tuceuttkvxbvrblf")
Categories: Programming

### Creativity, INC. – by Ed Catmull

Gridshore - Fri, 08/15/2014 - 20:39

A colleague of mine, Ronald Vonk, recommended this book to me. It is a book by one of the founders of Pixar, you know from all those fantastic computer animated movies. At pixar they created an continuous changing environment where creativity should excel. It is a very interesting read if you are interested in management books that are not to heavy on theories. Ed explains very well and entertaining how they went from a small company with a vision to a huge company with a vision.

Without to much spoilers, you really need to reed the book yourself, I want to mention a few things that I remembered after reading the book.

The team is more important than the idea’s or the talent of the separate people. Take care of the team, make sure they function well and give them responsibility. Make them feel proud when they finished what they wanted to create. Always put people first.

This is something I ran into in my normal working life as well. I do think you have to enable the teams to adept and to stay as a good team. The challenge is to get others in to learn and later on replace team members or start their own team.

We would never make a film that way again. It is the managements job to take the long view, to intervene and protect our people from their willingness to pursue excellence at all costs. Not to do so would be irresponsible.

This was a remark after delivering a movie under great time stress. They pulled through, but at a cost.

Braintrust – Group of people giving feedback and ideas for improvements on a certain idea. Important is that the feedback is meant to improve the idea, not to bully the person(s) the idea originated from. It is very important that everybody is open to the feedback and not defensive. In the end it is not the braintrust that makes a decision, it is the person in charge for the product. Still this group of people is kind of the first user and therefore the feedback should not be taken to lightly.

This was something I had a long thought about, my conclusion was that I am not really good at this. I often do feel that my ideas are my babies that need to be defended. First persuade me I am wrong, o sorry, an idea that someone had was not the best.

I did not want to become a manager, I just wanted to be one of the boys and do research. When we became bigger I realised I became more important and new people did not see me as a peer or one of the guys. I realised things were starting to get hidden from me. It is no problem as long as you trust people will tell someone else that will tell the most important things to me again.

Couldn’t agree more.

You can have this very nice polished finely tuned locomotive. People think that being the driver of the train is giving them power. They feel that driving the train in the end is shaping the company. The truth is, it’s not. Driving the train does not set it’s course. The real job is laying the track.

This was an eye opener a well, something you know but is hard to put into words.

At pixar they do not have contracts. They feel that employment contracts both hurt the employer as well as the employee. If someone had a problem with the company, there wasn’t much point in complaining because they were under contract. If someone didn’t perform well, on the other hand, there was no point in confronting them about it; their contract simply wouldn’t be renewed, which might be the first time they heard about their need to improve. The whole system discouraged and devaluated day-to-day communication and was culturally dysfunctional. But since everybody was used to it, they were blind to the problem.

This is a long one, have thought about it for a while. I think for now I would be to scared to do this in a company, still I like the idea.

What is the point of hiring smart people if you don’t empower them to fix what’s broken? Often to much time is lost in making sure no mistakes will be made. Often however, it just takes a few days to find solutions for mistakes.

Keeps coming back to the same point, a manager is a facilitator, nothing more nothing less. It is a very important role, just like all the others. Think about it, it is the team, the complete team.

The post Creativity, INC. – by Ed Catmull appeared first on Gridshore.

Categories: Architecture, Programming

### How Often Should I Blog

Making the Complex Simple - John Sonmez - Thu, 08/14/2014 - 15:00

In this video I talk about how often you should blog and why blogging more often is better as long as you can maintain a consistent level of quality.

The post How Often Should I Blog appeared first on Simple Programmer.

Categories: Programming

### Where does r studio install packages/libraries?

Mark Needham - Thu, 08/14/2014 - 11:24

As a newbie to R I wanted to look at the source code of some of the libraries/packages that I’d installed via R Studio which I initially struggled to do as I wasn’t sure where the packages had been installed.

I eventually came across a StackOverflow post which described the .libPaths function which tells us where that is:

> .libPaths()
[1] "/Library/Frameworks/R.framework/Versions/3.1/Resources/library"

If we want to see which libraries are installed we can use the list.files function:

> list.files("/Library/Frameworks/R.framework/Versions/3.1/Resources/library")
[1] "alr3"         "assertthat"   "base"         "bitops"       "boot"         "brew"
[7] "car"          "class"        "cluster"      "codetools"    "colorspace"   "compiler"
[13] "data.table"   "datasets"     "devtools"     "dichromat"    "digest"       "dplyr"
[19] "evaluate"     "foreign"      "formatR"      "Formula"      "gclus"        "ggplot2"
[25] "graphics"     "grDevices"    "grid"         "gridExtra"    "gtable"       "hflights"
[31] "highr"        "Hmisc"        "httr"         "KernSmooth"   "knitr"        "labeling"
[37] "Lahman"       "lattice"      "latticeExtra" "magrittr"     "manipulate"   "markdown"
[43] "MASS"         "Matrix"       "memoise"      "methods"      "mgcv"         "mime"
[49] "munsell"      "nlme"         "nnet"         "openintro"    "parallel"     "plotrix"
[55] "plyr"         "proto"        "RColorBrewer" "Rcpp"         "RCurl"        "reshape2"
[61] "RJSONIO"      "RNeo4j"       "Rook"         "rpart"        "rstudio"      "scales"
[67] "seriation"    "spatial"      "splines"      "stats"        "stats4"       "stringr"
[73] "survival"     "swirl"        "tcltk"        "testthat"     "tools"        "translations"
[79] "TSP"          "utils"        "whisker"      "xts"          "yaml"         "zoo"

We can then drill into those directories to find the appropriate file – in this case I wanted to look at one of the Rook examples:

$cat /Library/Frameworks/R.framework/Versions/3.1/Resources/library/Rook/exampleApps/helloworld.R app <- function(env){ req <- Rook::Request$new(env)
res <- Rook::Response$new() friend <- 'World' if (!is.null(req$GET()[['friend']]))
friend <- req$GET()[['friend']] res$write(paste('<h1>Hello',friend,'</h1>\n'))
res$write('What is your name?\n') res$write('<form method="GET">\n')
res$write('<input type="text" name="friend">\n') res$write('<input type="submit" name="Submit">\n</form>\n<br>')
res\$finish()
}`
Categories: Programming