text:
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!
Software Development Blogs: Programming, Software Testing, Agile Project Management
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!
As promised in my previous post, I just pushed the first version of our "Angular Promise DSL" to Github. It extends AngularJS's $q promises with a number of helpful methods to create cleaner applications.
The project is a V1, it may be a bit rough around the edges in terms of practical applicability and documentation, but that's why it's open source now.
The repository is at¬Ýhttps://github.com/fwielstra/ngPromiseDsl¬Ýand¬Ýlicensed as MIT. It's the first OS project I've created, so bear with me. I am accepting pull requests and issues, of course.
Questions? Ask them on¬Ýthe issues page, ask me via Twitter (@frwielstra) or send me an e-mail. I'd offer you to come by my office too... if I had one.
I presented big data to Amdocs' product group last week. One of the sessions I did was recorded so I might be able to add here later. Meanwhile you can check out the slides.
Note that trying to keep the slide visual I put some of the information is in the slide notes and not on the slides themselves.
If you already use Agile Results as your personal results system, you have a big advantage.
Because most people are running around, scrambling through a laundry list of too many things to do, a lack of clarity around what the end result or outcomes should be, and a lack of clarity around what the high-value things to focus on are. They are using their worst energy for their most important things. They are spending too much time on the things that don't matter and not enough time on the things that do. They are feeling at their worst, when they need to feel at their best, and they are struggling to keep up with the pace of change.
I created Agile Results to deal with the chaos in work and life, as a way to rise above the noise, and to easily leverage the most powerful habits and practices for getting better results in work and life.
Agile Results, in a nutshell, is a simple system for mastering productivity and time management, while at the same time, achieving more impact, realizing your potential, and feeling more fulfillment.
I wrote about the system in the book Getting Results the Agile Way. It's been a best seller in time management.How Does Agile Results Work?
Agile Results works by combining proven practices for productivity, time management, psychology, project management, and some of the best lessons learned on high-performance. And it's been tested for more than a decade under extreme scenarios and a variety of conditions from individuals to large teams.
Work-Life balance is baked into the system, but more importantly Agile Results helps you live your values wherever you are, play to your strengths, and rapidly learn how to improve your results in an situation. When you spend more time in your values, you naturally tap into your skills and abilities that help bring out your best.
The simplest way to think of Agile Results is that it helps you direct your attention and apply your effort on the things that count. By spending more time on high-value activities and by getting intentional about your outcomes, you dramatically improve your ability to get better results.
But none of that matters if you aren't using Agile Results.How Can You Start Using Agile Results?
Start simple.
Simply ask yourself, "What are the 3 wins, results, or outcomes that I want for today?." Consider the demands you have on your plate, the time and energy you've got, and the opportunities you have for today, and write those 3 things down.
That's it. You're doing Agile Results.
Of course, there's more, but that's the single most important thing you can do to immediately gain clarity, regain your focus, and spend your time and energy on the most valuable things.
Now, let's assume this is the only post you ever read on Agile Results. Let's take a fast walkthrough of how you could use the system on a regular basis to radically and rapidly improve your results on an ongoing basis.How I Do Agile Results? …
Here's a summary of how I do Agile Results.
I create a new monthly list at the start of each month that lists out all the things that I think I need to do, and I bubble up 3 of my best things I could achieve or must get done to the top. I look at it at the start of the week, and any time I'm worried if I'm missing something. This entire process takes me anywhere from 10-20 minutes a month.
I create a weekly list at the start of the week, and I look at it at the start of each day, as input to my 3 target wins or outcomes for the day, and any time I'm worried if I'm missing anything. This tends to take me 5-10 minutes at the start of the week.
I barely have to ever look at my lists – it's the act of writing things down that gives me quick focus on what's important. I'm careful not to put a bunch of minutia in my lists, because then I'd train my brain to stop focusing on what's important, and I would become forgetful and distracted. Instead, it's simple scaffolding.
Each day, I write a simple list of what's on my mind and things I think I need to achieve. Next, I step back and ask myself, "What are the 3 things I want to accomplish today?", and I write those down. (This tends to take me 5 minutes or less. When I first started it took me about 10.)
Each Friday, I take the time to think through three things going well and three things to improve. I take what I learn as input into how I can simplify work and life, and how I can improve my results with less effort and more effectiveness. This takes me 10-20 minutes each Friday.How Can You Adopt Agile Results?
Use it to plan your day, your week, and your month.
Here is a simple recipe for adopting Agile Results and using it to get better results in work and life:
There are lots of success stories by other people who have used Agile Results. Everybody from presidents of companies to people in the trenches, to doctors and teachers, to teams and leaders, as well as single parents and social workers.
But none of that matters if it's not your story.
Work on your success story and just start getting better results, right here, right now.
What are the three most important things you really want to accomplish or achieve today?
Hey, it's HighScalability time:
Don't miss all that the Internet has to say on Scalability, click below and become eventually consistent with all scalability knowledge (which means this post has many more items to read so please keep on reading)...
Many large Angular applications tend to see a lot of repetition - same API endpoint, same method of dealing with and transforming data, etcetera. One technique you can use to at least alleviate that is using AngularJS's decorate¬Ýmethod, which allows you to extend, adjust or even fully replace any existing service.
As you'll see in this post, using this allows you to modify and extend¬Ýthe framework you build your app in, which will lead to a cleaner, more legible codebase, written in a more functional style (the what, not the how).
Update 11/8:¬ÝThe follow-up is now live, along with the GitHub repository.
A feature not often used when developing AngularJS applications is the $provide service, which is the primary service used to register components with the $injector. More commonly, a developer would use methods like $provide.service() or $provide.factory to do so, but those are merely utility methods defined in the $provide service and exposed via angular.module().
The main reasons to use $provide over the service()¬Ýand factory() methods is to configure the service before it's instantiated, for example. While there may be more advanced use-cases for using $provide, I haven't yet encountered them while developing regular applications and I'm sure they won't occur often.
One of the methods listed at the very bottom of the $provide documentation is the decorate() method. It doesn't look like much (it's at the bottom, after all), but its documentation hints that it's very powerful:
"A service decorator intercepts the creation of a service, allowing it to override or modify the behaviour of the service. The object returned by the decorator may be the original service, or a new service object which replaces or wraps and delegates to the original service."
Nothing to add there. You can use decorate() to change, add to, or completely replace the behaviour of services without having to edit its code. This can be done on any code not your own - core AngularJS services, but also third-party libraries. It's the equivalent of overriding methods in OO languages or monkey-patching in the more dynamic languages.
"Isn't that evil?", I hear you ask. As with every programming-related question, the only correct answer is: it depends. I'm going to give a few practical examples of when I believe using decorate() is appropriate. In a future blog post, I'll expand on this example, showing how relatively simple code can positively influence your entire application architecture.
Here's a practical example, a neat follow-up on my previous blog about angular promises: decorating $q to add methods to the promise object. The promise API itself defines only one method: then(). $q adds a few simple methods to that like catch() and finally(), but for your own application you can add a few more.
If you've been working with promises for a little while in your AngularJS application, you've probably noticed some operations are pretty common; assigning the promise result to the scope (or any object), logging the result in the console, or calling some other method. Using decorate(), we can add methods to the promise object to simplify those. Here's a bit of code from my previous post; we'll add a method to $q to remove the need for a callback:
CustomerService.getCustomer(currentCustomer) .then(CartService.getCart) .then(function(cart) { $scope.cart = cart; }) .catch($log.error);
First, we'll need to do some boilerplate: we create a function that adds our methods to the promise object, and then we replace all the default promise methods. Note that the decorating function will also apply itself to the given promise.then method again, so that our customisations aren't lost further down a promise chain:
angular.module('ngPromiseDsl', []) .config(function ($provide) { $provide.decorator('$q', function ($delegate, $location) { // decorating method function decoratePromise(promise) { var then = promise.then; // Overwrite promise.then. Note that $q's custom methods (.catch and .finally) are implemented by using .then themselves, so they're covered too. promise.then = function (thenFn, errFn, notifyFn) { return decoratePromise(then(thenFn, errFn, notifyFn)); }; return promise; } // wrap and overwrite $q's deferred object methods var defer = $delegate.defer, when = $delegate.when, reject = $delegate.reject, all = $delegate.all; $delegate.defer = function () { var deferred = defer(); decoratePromise(deferred.promise); return deferred; }; $delegate.when = function () { return decoratePromise(when.apply(this, arguments)); }; $delegate.reject = function () { return decoratePromise(reject.apply(this, arguments)); }; $delegate.all = function () { return decoratePromise(all.apply(this, arguments)); }; return $delegate; }); });
With that boilerplate in place, we can now start adding methods. As I mentioned earlier, one of the most common uses of a then() function is to set the result onto the scope (or some other object). This is a fairly trivial operation, and it's pretty straightforward to add it to the promise object using our decorator, too:
function decoratePromise(promise) { var then = promise.then; promise.then = function (thenFn, errFn, notifyFn) { return decoratePromise(then(thenFn, errFn, notifyFn)); }; // assigns the value given to .then on promise resolution to the given object under the given varName promise.thenSet = function (obj, varName) { return promise.then(function (value) { obj[varName] = value; return value; }); }; return promise; }
That's all. Put this .config block in your application's module definition, or create a new module and add a dependency to it, and you can use it throughout your application. Here's the same piece of code, now with our new thenSet method:
CustomerService.getCustomer(currentCustomer) .then(CartService.getCart) .thenSet($scope, 'cart') .catch($log.error);
This particular example can be extended in a multitude ways to add useful utilities to promises. In my current project we've added a number of methods to the promise object, which allows us to reduce the number of callback definitions in our controllers and thus create cleaner, more legible code.
Replacing custom callbacks with named methods allows for a more functional programming style, and allows readers to read and write code as a list of "whats", instead of "hows" - and it's also fully asynchronous.
Extending $q is just the start though: Every angular service can be extended for various purposes - add performance monitoring and logging to $http, set common prefixes or fixed properties on $resource urls or template paths, you name it. Leave a remark in the comments about how you've used decorate() to create a better application.
Stay tuned for an upcoming post where I release a small open source project that extends angular's promise objects with a number of helpful methods to perform common tasks.
Further reading, resources, helpful links:
Are your management practices long in the tooth?
I think I was lucky that early on, I worked in environments that shook things up and rattled the cage in pursuit of more customer impact, employee engagement, and better organizational performance.
In one of the environments, a manufacturing plant, the management team flipped the typical pyramid of the management hierarchy upside down to reflect that the management team is there to empower and support the production line.
And when I was on the Microsoft patterns & practices team, we had an interesting mix of venture capitalist type management coupled with some early grandmasters of the Agile movement. More than just Agile teams, we had an Agile management culture that encouraged a customer-connected approach to product development, complete with self-organizing, multi-disciplinary teams, empowered people, a focus on execution excellence, and a fierce focus on being a rapid learning machine.
We thrived on change.
We also had a relentless focus on innovation. Not just in our product, but in our process. If we didn't innovate in our process, then we got pushed out of market by becoming too slow, too expensive, or by lacking the quality experience that customers have come to expect.
But not everybody knows what a great environment for helping people thrive and do great things for the world, looks like.
While a lot of people in software or in manufacturing have gotten a taste of Agile and Lean practices, there are many more businesses that don't know what a modern learning machine of people and processes that operate at a higher-level looks like.
Many, many businesses and people are still operating and looking at the world through the lens of old world management principles.
In the book The Future of Management, Gary Hamel walks through the principles upon which modern management is based.The Principles of Modern Management
Hamel gives us a nice way to frame looking at the modern management principles, by looking at their application, and their intended goal.
Most people aren't aware of the principles behind the management beliefs that they practice or preach. But before coming up with new ones, it helps to know what current management thinking is rooted in.
"Have you ever asked yourself, what are the deepest principles upon which your management beliefs are based? Probably not. Few executives, in my experience, have given much thought to the foundational principles that underlie their views on how to organize and manage. In that sense, they are as unaware of their management DNA as they are of their biological DNA. So before we set off in search of new management principles, we need to take a moment to understand the principles that comprise our current management genome, and how those tenets may limit organizational performance."A Small Nucleus of Core Principles
It really comes down to a handful of core principles. These principles serve as the backbone for much of today's management philosophy.
"These practices and processes of modern management have been built around a small nucleus of core principles: standardization, specialization, hierarchy, alignment, planning, and control, and the use of extrinsic rewards to shape human behavior."How To Maximize Operational Efficiency and Reliability in Large-Scale Organizations
It's not by chance that the early management thinkers came to the same conclusions. They were working on the same problems in a similar context. Of course, the challenge now is that the context has changed, and the early management principles are often like fish out of water.
"These principles were elucidated early in the 20th century by a small band of pioneering management thinkers -- individuals like Henri Fayol, Lyndall Urwick, Luther Gullick, and Max Weber. While each of these theorists had a slightly different take on the philosophical foundations of modern management, they all agreed on the principles just enumerated. This concordance is hardly surprising, since they were all focusing on the same problem: how to maximize operational efficiency and reliability in large-scale organizations. Nearly 100 years on, this is still the only problem that modern management is fully competent to address."
If your management philosophy and guiding principles are nothing more than a set of hand me downs from previous generations, it might be time for a re-think.You Might Also Like
Elizabeth Edersheim on Management Lessons of a Lifelong Student
How Employees Lost Empathy for their Work, for the Customer, and for the Final Product
The Drag of Old Mental Models on Innovation and Change
The New Realities that Call for New Organizational and Management Capabilities
A valuable Sprint Review (from now on in this blog referred to as Demo) can be built in three steps. It starts during the Sprint planning session with agreeing on and understanding the user stories on the Sprint backlog. Then, during the Sprint, the team constantly exchanges ideas and results of the realisation of the Story. Finally, during the demo itself, the Product Owner and the rest of the team demo the stories to the stakeholders to display the value delivered and open up for feedback.Planning for a good demo
During the planning session, it is imperative that the Product Owner and the rest of the team understand the stories that will be picked up. This sounds obvious, but it happens often that this is not the case. Stories might be too technical so the Product Owner is disconnected or stories are so high level that it is hard to determine what needs to be done.
Make sure stories are formulated from the perspective of an end-user of the functionality that will be delivered. This could be an actual user, a system that picks up whatever result is created or any other manifestation of who or what will use the result of the story.
Also take care of getting the acceptance criteria clear. This way it will be clear to developers what to build, to testers what to test for and designers what to design. It will help the Product Owner to have a better idea what is in and what might have to be defined in a new/other user story.
It is important that everyone understands the context in which the story 'lives'. What part of the system is touched (end-to-end is preferred but not always possible), which parties are affected by the change, what prerequisites are needed, etc.Building for a great demo
When during the creation of the value of each story the whole team is in constant contact about intermediate results and decisions taken, everyone will be able to add to the value and be aware of what the result of the story will be. It is very important that the whole team is including the Product Owner. When the PO sees the intermediate results, she or he can already create an image of what the result will be like. Also, the PO can contact stakeholders that might have an opinion of what is created and, when needed, adjust the end result to match expectations.Delivering an valuable demo
In the demo, the Product Owner should present to the stakeholders the value of each user story that has been delivered. So, per story, explain what has changed from the perspective of the end-user and have the rest of the team show this. Also, when stories are not done, explain which (sub-)functionality is not yet finished. Make sure to ask for feedback from the end-user or other stakeholders on what is demonstrated.Conclusion
The value of the demo depends largely on the cooperation of the entire team. When the Product Owner and the rest of the team work together on understanding what will be delivered and help each other to get the most value from each story delivered the demo will be focused, valuable and fun.
Scrum has become THE revolution in the world of software development. The main philosophy behind scrum is accepting that a problem cannot be fully understood or defined at start; scrum has the¬Ýfocus on maximizing the team's ability to deliver quickly and respond to emerging requirements. It came as¬Ýtruly refreshing in the time when projects¬Ýwere ruled by procedure and MS-project planning. Because of scrum:
But the central question is: "are we there yet"? And the answer is: "No!". We can optimize scrum by mixing it with kanban, which¬Ýleads to scrumban.
A kanban introduction for scrummers
Instead of scrum, which is a software development framework¬Ýin the widest sense of the term, kanban is a method. It, or instance, does not define ceremonies and project roles. There are two main principles in kanban I would like to highlight:
After all kanban is incredibly simple, but at the same time incredibly powerful.
What's wrong with scrum?
Scrumban: the board of kanban
The first column¬Ýin a scrumban board is reserved for the backlog, where stories are ordered by their respective priority. There are several rules for the kanban backlog:
Next to the backlog-column is the tasking-column, in which¬Ýthere should always be at least one story that is tasked (a minimum WIP-limit). If this isn't the case the team will task after the standup to satisfy this condition.¬ÝA¬Ýstory is picked up from the backlog and is tasked by the team. Tip: put the tasked cards at the back of the story cards. The next columns¬Ýare the realization columns. Each team is free to add, remove or change necessary columns¬Ýso it suits¬Ýthe business. In the realization¬Ýcolumns there should be a maximum number of stories that are worked on. If the maximum limit has not been¬Ýreached, a story can be¬Ýpulled from the tasking column¬Ýand unfolded on the 'to implement' lane. Now the team can work on the tasks of the story. Each task¬Ýthat is implemented can be moved to the 'ready' lane. If all of the tasks are done for a story, the story can be moved to the next lane. When the story and tasks are ready, the cards can be moved to the right bottom of the board, so there is a new horizontal lane available for the next story.
Scrumban: the ceremonies of scrum
With scrumban we only have two types of meetings: the daily standup and the weekly timeblock.¬ÝThe Weeky Timeblock is a recurring meeting used for multiple purposes. It should be set up in the middle of the week. The big advantage¬Ýof the weekly timeblock is that developers are distracted from their work only once a week (instead of the various of meetings with scrum).
The¬ÝWeekly Timeblock contains three¬Ýparts. First there is a demo of the work done. Second, there is a retrospective on the development process of the last week. Third, the team should have a preview of upcoming workitems. The team¬Ýtry¬Ýto understand the intent of each item and¬Ýprovide feedback. The only size-indication a team has¬Ýto make is if the story is small, medium or large. Avoid using poker cards/story points, which are too fine-grained and are to vague.
Scrumban is a mix of the scrum ceremonies and the kanban method. With scrumban we
What data structure does your database use? It's not something the typical database user spends much time pondering. Since data structure is destiny, what data structure your database uses is a key point to consider in your selection process.
We know CouchDB uses a modified B+ tree. We've learned a lot fascinating details over the years about the use of Log-structured merge-trees in Cassandra, HBase and LevelDB. So B+ trees and LSMs seem familiar by now.
What may not be so familiar is Tokutek's Fractal Tree Indexing technology that is supposed to be even better than B+ trees and LSMs.
As a comparison between Fractal Tree Indexing and LSMs, Bradley Kuszmaul, Chief Architect at Tokutek, has written a detailed paper, a must read for the algorithmically inclined or someone interested in database internals: A Comparison of Log-Structured Merge (LSM) and Fractal Tree Indexing.
Here's a quick intro to Fractal Tree (FT) indexes:
We had a successful workshop on DevOpsDays 2014. Our main point was that Kanban should be the default choice for DevOps teams. The presentation can be downloaded here.
DevOpsDays 2014 was a success
On the 19th, 20th & 21st of June 2014 the second edition of DevOpsDays Amsterdam was held in Pakhuis De Zwijger in Amsterdam. This year I was asked to teach a course there on Kanban for DevOps. At the 2013 edition I also gave a presentation about this subject and it was nice to be invited back to this great event.
With the Open Source mindset in mind I teamed up with Maarten Hoppen en Bas van Oudenaarde. Our message: Kanban should be the default choice for DevOps teams.¬Ý
The response to this workshop was very positive and because we received a lot of great feedback I thought I'Äôd share the slide deck. The presentation assumes you are working in an environment where DevOps might work or is already being implemented.¬Ý
Main points of the presentation
DevOps is about Culture, Automation, Measurement and Sharing (CAMS). These four values require a way of working that looks past existing processes, handovers and role descriptions.¬Ý
The Kanban Method is about looking at your organization in a different way. From a point of:
The three different ways the Kanban Method makes you look at your organization makes it an extremely powerful solution for DevOps.
If you are interested to learn more about the workshop, check out the slides here:
Who's Hiring?
If any of these items interest you there's a full description of each sponsor below. Please click to read more...
This past month we've released a number of great enhancements to Microsoft Azure. These include:
All of these improvements are now available to use immediately (note that some features are still in preview). Below are more details about them: Virtual Machines: Support in the new Azure Preview portal
We previewed the new Azure Preview Portal at the //Build conference earlier this year. It brings together all of your Azure resources in a single management portal, and makes it easy to build cloud applications on the Azure platform using our new Azure Resource Manager (which enables you to manage multiple Azure resources as a single application). The initial preview of the portal supported Web Sites, SQL Databases, Storage, and Visual Studio Online resources.
This past month we've extended the preview portal to also now support Virtual Machines. You can create standalone VMs using the portal, or group multiple VMs (and PaaS services) together into a Resource Group and manage them as a single logical entity. You can use the preview portal to get deep insights into billing and monitoring of these resources, and customize the portal to view the data however you want. If you are an existing Azure customer you can start using the new portal today: http://portal.azure.com.
Below is a screen-shot of the new portal in action. The service dashboard showing service/region health can be seen in the top-left of the portal, along with billing data about my subscriptions – both make it really easy for you to see the health and usage of your services in Azure. In the screen-shot below I have a single VM running named "scottguvstest" – and clicking the tile for it displays a "blade" of additional details about it to the right – including integrated performance monitoring usage data:
The initial "blade" for a VM provides a summary view of common metrics about it. You can click any of the titles to get even more detailed information as well.
For example, below I've clicked the CPU monitoring title in my VM, which brought up a Metric blade with even more details about CPU utilization over the last few days. I've then clicked the "Add Alert" command within it to setup an automatic alert that will trigger (and send an email to me) any time the CPU of the VM goes above 95%:
In the screen-shot below, I've clicked the "Usage" tile within the VM blade, which displays details about the different VM sizes available – and what each VM size provides in terms of CPU, memory, disk IOPS and other capabilities. Changing the size of the VM being used is as simple as clicking another of the pricing tiles within the portal – no redeployment of the VM required:
Built-into the Azure Preview Portal is a new "Azure Gallery" that provides an easy way to deploy a wide variety of VM images and online services. VM images in the Azure Gallery include Windows Server, SQL Server, SharePoint Server, Ubuntu, Oracle, Baracuda images.
Last month, we also enabled a new "SharePoint Server Farm" gallery item. It enables you to easily configure and deploy a highly-available SharePoint Server Farm consisting of multiple VM images (databases, web servers, domain controllers, etc) in only minutes. It provides the easiest way to create and configure SharePoint farms anywhere:
Over the next few months you'll see even more items show up in the gallery – enabling a variety of additional new scenarios. Try out the ones in the gallery today by visiting the new Azure portal: http://portal.azure.com/Machine Learning: Preview of new Machine Learning Service for Azure
Last month we delivered the public preview of our new Microsoft Azure Machine Learning service, a game changing service that enables your applications and systems to significantly improve your organization's understanding across vast amounts of data. Azure Machine Learning (Azure ML) is a fully managed cloud service with no software to install, no hardware to manage, and no OS versions or development environments to grapple with. Armed with nothing but a browser, data scientists can log into Azure and start developing Machine Learning models from any location, and from any device.
ML Studio, an integrated development environment for Machine Learning, lets you set up experiments as simple data flow graphs, with an easy to use drag, drop and connect paradigm. Data scientists can use it to avoid programming a large number of common tasks, allowing them to focus on experiment design and iteration. A collection of best of breed algorithms developed by Microsoft Research comes built-in, as is support for custom R code – and over 350 open source R packages can be used securely within Azure ML today.
Azure ML also makes it simple to create production deployments at scale in the cloud. Pre-trained Machine Learning models can be incorporated into a scoring workflow and, with a few clicks, a new cloud-hosted REST API can be created.
Azure ML makes the incredible potential of Machine Learning accessible both to startups and large enterprises. Startups are now able to immediately apply machine learning to their applications. Larger enterprises are able to unleash the latent value in their big data to generate significantly more revenue and efficiencies. Above all, the speed of iteration and experimentation that is now possible will allow for rapid innovation and pave the way for intelligence in cloud-connected devices all around us. Getting Started
Getting started with the Azure Machine Learning Service is easy. Within the current Azure Portal simply choose New->Data Services->Machine Learning to create your first ML service today:
Subscribe to the Machine Learning Team Blog to learn more about the Azure Machine Learning service. And visit our Azure Machine Learning documentation center to watch videos and explore tutorials on how to get started immediately.Event Hub: Preview of new Azure Event Ingestion Service
Today's connected world is defined by big data. Big data may originate from connected cars and thermostats that produce telemetry data every few minutes, application performance counters that generate events every second or mobile apps that capture telemetry for every user's individual action. The rapid proliferation of connected devices raises challenges due to the variety of platforms and protocols involved. Connecting these disparate data sources while handling the scale of the aggregate stream is a significant challenge.
I'm happy to announce the public preview of a significant new Azure service: Event Hub. Event Hub is a highly scalable pub-sub ingestor capable of elastic scale to handle millions of events per second from millions of connected devices so that you can process and analyze the massive amounts of data produced by your connected devices and applications. With this new service, we now provide an easy way for you to provision capacity for ingesting events from a variety of sources, and over a variety of protocols in a secure manner. Event Hub supports a variety of partitioning modes to enable parallelism and scale in your downstream processing tier while preserving the order of events on a per device basis. Creating an Event Hub
You can easily create a new instance of Event Hub from the Azure Management Portal by clicking New->App Services->Service Bus->Event Hub. During the Preview, Event Hub service is available in a limited number of regions (East US 2, West Europe, Southeast Asia) and requires that you first create a new Service Bus Namespace:
Try out the new Event Hub service and give us your feedback! For more information, visit the links below:
A few months ago I announced a preview of Mobile Services with .NET backend support. Today I am excited to announce the general availability of the Mobile Services .NET offering, which makes it an incredibly attractive choice for developers building mobile facing backend APIs using .NET. Using Mobile Services you can now:
You can learn more about Mobile Services .NET from this blog post, and the Mobile Services documentation center. Real-time Push with Mobile Services and SignalR
We recently released an update to our Mobile Services .NET backend support which enables you to use ASP.NET SignalR for real-time, bi-directional communications with your mobile applications. SignalR will use WebSockets under the covers when it's available, and fallback to other "techniques" (i.e. HTTP hacks) when it isn't. Regardless of the mode, your application code stays the same.
The SignalR integration with Azure Mobile Services includes:
Learn more about the SignalR capability in Mobile Services from Henrik's blog. Mobile Services Offline Sync support for Xamarin and native iOS apps
I've blogged earlier about the new Offline Sync feature in Mobile Services, which provides a lightweight, cross-platform way for applications to work with data even when they are offline / disconnected from the network. At that time we released Offline Sync support for Windows Phone and Windows Store apps.
Today we are also introducing a preview of Mobile Services Offline Sync for native iOS apps, as well as Xamarin.iOS, and Xamarin.Android. Mobile Services Accelerators
I'm pleased to also introduce our new Mobile Services Accelerators, which are feature complete sample apps that demonstrate how to leverage the new enterprise features of the Mobile Services platform in an end-to-end scenario. We will have two accelerator apps for you today, available as a source code, as well as published in the app store.
These apps leverage the Mobile Services .NET backend support to handle authenticating employees with Azure Active Directory, store data securely, working with data offline, as well as get reminders via push notifications. We hope you will find these apps useful for your teams as a reference material. Stay tuned, as more accelerators are coming! Notification Hubs: Price reductions and new features
The Azure Notification Hubs service enables large scale cross platform push notifications from any server backend running on-premise or in the cloud. It supports a variety of mobile devices including iOS, Android, Windows, Kindle Fire, and Nokia X. I am excited to announce several great updates to Azure Notification Hubs today:
You can learn more about Azure Notification Hubs at the developer center.SQL Databases: New Geo-Restore, Geo-Replication and Auditing support
In April 2014, we first previewed our new SQL Database service tiers: Basic, Standard, and Premium. Today, I'm excited to announce the addition of more features to the preview:
You can learn even more about these new features here.Redis Cache: Large Cache Sizes, Six New Regions, Redis MaxMemory Policy Support
This past May, we launched the public preview of the new Azure Redis Cache service. This cache service gives you the ability to use a secure, dedicated Redis cache, managed as a service by Microsoft. Using the new Cache service, you get to leverage the rich feature set and ecosystem provided by Redis, and reliable hosting and monitoring from Microsoft.
Last month we updated the service with the following features:
For more information on the Azure Redis Cache, check out this blog post: Lap around Azure Redis Cache. Storage: Support for Zone Redundant Storage
We are happy to introduce a new Azure Storage account offering: Zone Redundant Storage (ZRS).
ZRS replicates your data across 2 to 3 facilities either within a single Azure region or across two Azure regions. If your storage account has ZRS enabled, then your data is durable even in the case where one of the datacenter facilities hosting your data suffers a catastrophic issue. ZRS is also more cost efficient than the existing Global Redundant Storage (GRS) offering we have today.
You can create a ZRS storage account by simply choosing the ZRS option under the replication dropdown in the Azure Management Portal.
You can find more information on pricing for ZRS at http://azure.microsoft.com/en-us/pricing/details/storage/. Azure SDK: WebSites, Mobile, Virtual Machines, Storage and Cloud Service Enhancements
Earlier today we released the Update 3 release of Visual Studio 2013 as well as the new Azure SDK 2.4 release. These updates contain a ton of great new features that make it even easier to build solutions in the cloud using Azure. Today's updates include:
Visual Studio Update 3
Azure SDK 2.4
You can learn all about the updates from the Azure team's SDK announcement blog post.Summary
This most recent release of Azure includes a bunch of great features that enable you to build even better cloud solutions. 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 Azure Developer Center to learn more about how to build apps with it.
Hope this helps,
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
This is a guest post by Michael Schenck, SRE Staff Engineer at Tumblr.
At Tumblr, blogs (or Tumblelog) are one of our most highly trafficked faces on the internet. One of the most convenient aspects of tumblelogs is their highly cacheable nature, which is fantastic because of the high views/post ratio the Tumblr network offers our users. That said, it's not entirely trivial to scale out the perimeter proxy tier, let alone the caching tier, necessary for serving all of those requests.
This article describes the architecture of the portion of our perimeter responsible for blogs serving, one of our more highly trafficked perimeter end-points.
Here's how we do it.Stats
"In most cases being a good boss means hiring talented people and then getting out of their way." -- Tina Fey
The Digital Revolution marked the beginning of the Information Age.
The Information Age, or Digital Age, or New Media Age, is a shift away from the industrial revolution to an economy based on information computerization. Some would say, along with this shift, we are now in a Knowledge Economy or a Digital Economy.
This opens the door to new ways of working and a new world of work to generate new business value and customer impact.
But what did the Industrial Age do to employees and what paradigms could limit us in this new world?
In the book The Future of Management, Gary Hamel walks through how industrialization and large Enterprises have created a disconnect between employees and their customers, their final product, and the big financial picture. And in the process, he argues, this had led to disengaged employees, crippled innovation, and inflexible organizations.
If you don't know Gary Hamel, he's been ranked the #1 influential business thinker by the Wall Street Journal.
According to Hamel, what we traded for scale and efficiencies created gaps between workers and employees and gaps between employees and their customers, the product, the financial impact, and … a diminished sense of responsibility for quality and efficiency.Maybe We Have Managers Because We Have Employees
Do managers exist because employees do?
"Here's a thought. Maybe we need 'managers' because we have 'employees.' (Be patient, this is not as tautological as it sounds.) Think about the way computers are dependent on software. PCs aren't smart enough to write their own operating instructions, and they sit idle until a user sets them to work. Perhaps the same is true for employees."Did We Manufacture a Need for Managers?
When we manufactured employees, did we manufacture a need for managers?
"Earlier, I talked about the invention of 'the employee.' What happened in this process, at the dawn of the 20th century? How did work life change as individuals left their farms and workshops to be absorbed into large-scale organizations? In manufacturing employees, did we manufacture a need for managers as well? I think so. If we understood how this came about, we will gain clues into how we might learn to manage without managers -- or, at least, with a lot fewer of them."Disconnected from the Customer
As the size and scale of industrial organizations grew, so did the disconnect between employees and their final customers.
"In pre-industrial times, farmers and artisans enjoyed an intimate relationship with their customers. The feedback they received each day from their patrons was timely and unfiltered. Yet as industrial organizations grew in size and scale, millions of employees found themselves disconnected from the final customer. Robbed of direct feedback, they were compelled to rely on others who were closer to the customer to calibrate the effectiveness of their efforts and to tell them how they could better please their clients."A Diminished Sense of Responsibility for Producer Quality and Efficiency
Without a connection to the customer, employees lose empathy for their work, for the customer, and for the final product.
"As companies divided themselves into departments and functions, employees also became disconnected from the final product. As tasks became narrower and more specialized, employees lost their emotional bond with the end product. The result? A diminished sense of responsibility for producer quality and efficiency. No longer were workers product craftsmen, now they were cogs in an industrial machine over which they had little control."Employees No Longer Have a System Wide View of the Production Process
It's hard to make changes to the system when you no longer have a system wide view.
"Size and scale also separate employees from their coworkers. Working in semi-isolated departments, they no longer had a system wide view of the production process. If that system was suboptimal, they had no way of knowing it and now way of correcting it."The Gap Widens Between Workers and Owners
People at the top don't hear from the people at the bottom.
"Industrialization also enlarged the gulf between workers and owners. While a 19th-century apprentice would have had the ear of the proprietor, most 20th-century employees reported to low-level supervisors. In a large enterprise a junior employee could work for decades and never have the chance to speak one-on-one with someone empowered to make important policy decisions."The Scoreboard is Contrived
Scoreboards tell employees how they are doing their jobs, but not how the company is doing overall.
"In addition, growing operational complexity fractured the information that was available to employees. In a small proprietorship, the financial scoreboard was simple and real time; there was little mystery about how the firm was doing. In a big industrial company, employees had a scoreboard but it was contrived. It told workers how they were doing their jobs, but little about how the company was doing overall. With no more than a knothole view of the company's financial model, and only a sliver of responsibility for results, it was difficult for an employee to feel a genuine burden for the company's performance."Industrialization Disconnects Employees from Their Own Creativity
Standardizing jobs and processes limits innovation in the jobs and processes. They are at odds.
"Finally, and worst of all, industrialization disconnected employees from their own creativity. In the industrial world, work methods and procedures were defined by experts and, once defined, were not easily altered. No matter how creative an employee might be, the scope for exercising that gift was severely truncated."The Pursuit of Scale and Efficiency Advantages Disconnected Workers from Their Essential Inputs
With the disconnect between employees and their inputs, there was a natural need for the management class.
"To put it simply, the pursuit of scale and efficiency advantages disconnected workers from the essential inputs that had, in earlier times, allowed them to be (largely) self-managing -- and in so doing, it made the growth on an expansive managerial class inevitable."Employees Don't Lack Wisdom and Experience
Employees don't lack wisdom and experience. They just lack information and context.
"To a large extent, employees need managers for the same reason 13-year-olds need parents: they are incapable of self-regulation. Adolescents, with their hormone-addled brains and limited lie experience, lack the discernment to make consistently wise choices. Employees on the other hand, aren't short of wisdom and experience, but they do lack information and context -- since they are so often disconnected from customers, associates, end products, owners, and the big financial picture. Deprived of the ability to exercise control from within, employees must accept control from above. The result: disaffection. It turns out that employees enjoy being treated like 13-year-olds even less than 13-year-olds."Disengaged Employees, Hamstrung Innovation, and Inflexible Organizations
What is the result of all this disconnect? Stifled innovation, rigid organizations, and disinterested employees.
"Disengaged employees. Hamstrung innovation. Inflexible organizations. Although we are living in a new century, we are still plagued by the side effects of a management model that invented roughly a hundred years ago. Yet history doesn't have to be destiny -- not if you are willing to go back and reassess the time-forgotten choices that so many others still take for granted. With the benefit of hindsight, you can ask: How have circumstances changed? Are new approaches possible? Must we be bound by the shackles of the past? These are essential questions for every management innovator."
Does history have to be destiny?
We're writing new chapters of history each and every day.
In all of my experience, where I've seen productivity thrive, people shine, and innovation unleashed, it's when employees are connected with customers, they are empowered and encouraged to make changes to processes and products, and they are part of a learning organization with rapid feedback loops.You Might Also Like
Business Value Generation is the New Bottleneck
Customer-Connected Development
How We Adhered to the Agile Manifesto on the Microsoft patterns & practices Team
Yo has been quite a bit in the news lately. Mainly because it got a lot of investment, which surprised and shocked some people because it all seems too simple. Yo only allows you to send a Yo notification to other users. However, it has a lot of potential to become big while staying that simple.
After reading Why A Stupid App Like Yo May Have Billion-Dollar Platform Potential a few days ago I felt it was time to play around a bit with Yo and it's API.
I came up with 3 very simple use cases that should be simple to solve with Yo:
Time to register a couple of Yo developer usernames. The Yo API is, just like Yo itself, very simple. You register a username from which you want to receive notifications at http://yoapi.justyo.co after which you'll receive an API token for that username. Once you have that, people can subscribe to that username with the Yo app. Then you can send a Yo to either all subscribers or to a single subscribe with a simple POST request and the token. All this is explained at https://medium.com/@YoAppStatus/e7f2f0ec5c3c in more detail.
Let's start with our lunch notifications. I created the TIME2LUNCH username for this. I want my notifications at 12:00pm, since that's the time I go to lunch. So all I need is some service that sends the POST request every day at 12:00pm (for now I don't care about getting one in the weekend as well and I only care about my own time zone, Central European Time). Using NodeJS, it's just a single line of code to do such a request:
require('request') .post('http://api.justyo.co/yoall/', { form: {api_token: 'my_secret_api_token'} } );
Now we need to have a scheduler that executes it every day at 12:00pm. Luckily Heroku has a scheduler that can do exactly that:
So after deploying our javascript file with a single line of code and creating our scheduled job we will receive our daily Yo from TIME2LUNCH. Not bad for a first attempt.
Usually my co-workers will remind me when it's time to go to lunch so let's do something that's actually a bit less useless.
To park my car near the office I always use the Parkmobile service. At the end of the day I have to check out to avoid paying too much. Unfortunately it's an easy thing to forget. Parkmobile knows this and can send sms alerts at a specific time or after parking a certain amount of hours. Unfortunately they charge € 0.25 per sms. They also send e-mails, but they're easier to miss. It would be nice to get a Yo instead, for free of course.
What we need is to send the Yo POST request each time we receive the Parkmobile e-mails. Sounds like we might be able to use IFTTT (if this then that) to accomplish this. When browsing for channels and recipes on IFTTT I saw that they already support Yo as a channel. I thought I was gonna be done fast. Unfortunately it's only possible to use Yo as a trigger (if Yo then that) and not as an action (if this then Yo). So we need another solution here. I couldn't find a way to send a cURL request directly from IFTTT, but when Googling for a solution I found a webhook project: https://github.com/captn3m0/ifttt-webhook. The ifttt-webhook works by acting as a WordPress site, which is something that can act as an action of IFTTT. It then allows us to send a POST request to a specific URL. Not exactly the POST requests that are accepted by the Yo API though. But we already made some NodeJS code to send a Yo request so I'm sure we can add some code to accept a request from the ifttt-webhook and then pass it on to something that Yo does understand.
If we follow the instructions on the Github page and set our username to our Yo username and use our API token as password, then the webhook will send a POST request with a JSON body that looks something like this:
{ user: 'MYUSERNAME', pass: 'ab1234-1234-abcd-1234-abcd1234abcd', title: '' }
We can handle that in NodeJS like this:
var express = require('express'); var bodyParser = require('body-parser') var app = express(); var request = require('request'); app.use(bodyParser.json()); app.post('/api/yo', function (req, res) { var user = req.body.user; var apiToken = req.body.pass; request.post('http://api.justyo.co/yo/', { form: { api_token: apiToken, username: user } }); }); var port = Number(process.env.PORT || 5000); app.listen(port, function() { console.log('Listening on ' + port); });
This is just a simple express web server that listens for POST calls on /api/yo and then uses the user and pass fields from the body to send a POST request to the Yo API.
This is deployed at http://youser.herokuapp.com/ so everyone can use it as a IFTTT to Yo action.
We can now create our IFTTT recipe. Creating the this step is easy. I receive the e-mails from Parkmobile in my Gmail and their e-mail address is email@example.com. So the rule becomes to trigger each time when I receive an email from them. Then in the that step I activate the WordPress channel with the Yo username and api token and in the body I set the http://youser.herokuapp.com/api/yo URL.
Here is the recipe:
The last use case I had is to send a Yo each time a new blog post was posted on this blog. For that I registered the XEBIABLOG username (so make sure to subscribe to that in your Yo app if you want to get Yo'd as well for each new blog post).
Since this blog has an RSS feed, I figured I could poll that once in a while to check for new posts. We also already used the Heroku scheduler, so we might as well use that again. I found a little node library called feed-read that makes reading RSS feeds easy. So here is our little app that runs every hour:
var feed = require("feed-read"); var request = require('request'); var ONE_HOUR = 60 * 60 * 1000; feed("http://blog.xebia.com/feed/", function(err, articles) { if (err) throw err; var lastArticle = articles[0]; if ((new Date() - lastArticle.published) < ONE_HOUR) { console.log('Sending Yo for ' + lastArticle.title); request.post('http://api.justyo.co/yoall/', { form: { api_token: 'my_secret_token' } }); } });
We now have completed our 3 little use cases. Not the most useful things but nice non nonetheless. When looking back on them, we can imagine a couple of improvements. For example for the TIME2LUNCH it would be possible to make a little service where people could register and set their timezone at which they want to receive their notification. We could create a little database that store Yo usernames and the zone. But at this moment it's not possible to verify that USERX is really USERX. Yo doesn't support third party authentication like Facebook and Twitter have with OAuth. Perhaps that's something they will add in the future to make platform more useable for user specific notifications.
I updated my Motivational Quotes page.
I've got more than 100 motivational quotes on the page to help you find your inner-fire.
It's not your ordinary motivational quotes list.
It's deep and it draws from several masters of inspiration including Bruce Lee, Jim Rohn, and Zig Ziglar.
Here is a sampling of some of my personal favorite motivational quotes ..
"If you always put limit on everything you do, physical or anything else. It will spread into your work and into your life. There are no limits. There are only plateaus, and you must not stay there, you must go beyond them." – Bruce Lee
"Knowing is not enough; we must apply. Willing is not enough; we must do." - Johann Wolfgang von Goethe
"Kites rise highest against the wind; not with it." – Winston Churchill
"To hell with circumstances; I create opportunities." – Bruce Lee
"Our greatest glory is not in never falling but in rising every time we fall." – Confucius
"There is no such thing as failure. There are only results." – Tony Robbins
"When it's time to die, let us not discover that we have never lived." -Henry David Thoreau
"People who say it cannot be done should not interrupt those who are doing it." – Anonymous
"Motivation alone is not enough. If you have an idiot and you motivate him, now you have a motivated idiot." – Jim Rohn
"If you love life, don't waste time, for time is what life is made up of." – Bruce Lee
For more quotes, check out my motivational quotes page.
It's a living page and at some point I'll do a complete revamp.
I think in the future I'll organize it by sub-categories within motivation rather than by people.I think at the time it made sense to have words of wisdom by various folks, but now I think grouping motivational quotes by sub-categories would work much better, especially when there is such a large quantity of quotes.
C3js is a graph javascript library on top of D3js. For a project we needed graphs and we ended up using c3js. How this happened and some of the first steps we took is written down by Roberto van der Linden in his blogpost: Creating charts with C3.js
Using C3js without other javascript libraries is of course perfectly doable. Still I think using it in combination with AngularJS is interesting to evaluate. In this blogpost I am going to document some steps I took to go from the basic c3 sample to a more advanced AngularJS powered sample.Setup project – most basic sample
The easiest setup is by cloning by github repository: c3-angular-sample. If you are more the follow a long kind of person, than these are the steps.
We start by downloading C3js, d3 and AngularJS and create the first html page to get us started.
<!doctype html> <html> <head> <meta charset="utf-8"> <link href="css/c3-0.2.4.css" rel="stylesheet" type="text/css"> </head> <body> <h1>Sample 1: Most basic C3JS sample</h1> <div id="chart"></div> <!-- Load the javascript libraries --> <script src="js/d3/d3-3.4.11.min.js" charset="utf-8"></script> <script src="js/c3/c3-0.2.4.min.js"></script> <!-- Initialize and draw the chart --> <script type="text/javascript"> var chart = c3.generate({ bindto: '#chart', data: { columns: [ ['data1', 30, 200, 100, 400, 150, 250], ['data2', 50, 20, 10, 40, 15, 25] ] } }); </script> </body> </html>
Next we introduce AngularJS to create the chart object.Use AngularJS to create the chart
The first step is to remove the script block and add more javascript libraries to load. We load the AngularJS library and our own js file called graph-app-2.js. In the html tag we initialise the AngularJS app using ng-app="graphApp". In the body tag we initialise the Graph controller and call the function when the Angular app is initialised.
<html ng-app="graphApp"> <body ng-controller="GraphCtrl" ng-init="showGraph()">
Now let us have a look at some AngularJS javascript code. Notice that their is hardly a difference between the JavaScript code in both samples.
var graphApp = angular.module('graphApp', []); graphApp.controller('GraphCtrl', function ($scope) { $scope.chart = null; $scope.showGraph = function() { $scope.chart = c3.generate({ bindto: '#chart', data: { columns: [ ['data1', 30, 200, 100, 400, 150, 250], ['data2', 50, 20, 10, 40, 15, 25] ] } }); } });
Still everything is really static, it makes use of mostly defaults. Let us move on and make it possible for the user to make some changes to the data and the type of chart.Give the power to the user to change the data
We have two input boxes that accept common separated data and two drop downs to change the type of the chart. Fun to try out all the different types available. Below first he piece of html that contains the form to accept the user input.
<form novalidate> <p>Enter in format: val1,val2,val3,etc</p> <input ng-model="config.data1" type="text" size="100"/> <select ng-model="config.type1" ng-options="typeOption for typeOption in typeOptions"></select> <p>Enter in format: val1,val2,val3,etc</p> <input ng-model="config.data2" type="text" size="100"/> <select ng-model="config.type2" ng-options="typeOption for typeOption in typeOptions"></select> </form> <button ng-click="showGraph()">Show graph</button>
This should be easy to understand. There are a few fields taken from the model as well as a button that generates the graph. Below is the complete javascript code for the controller.
var graphApp = angular.module('graphApp', []); graphApp.controller('GraphCtrl', function ($scope) { $scope.chart = null; $scope.config={}; $scope.config.data1="30, 200, 100, 200, 150, 250"; $scope.config.data2="70, 30, 10, 240, 150, 125"; $scope.typeOptions=["line","bar","spline","step","area","area-step","area-spline"]; $scope.config.type1=$scope.typeOptions[0]; $scope.config.type2=$scope.typeOptions[1]; $scope.showGraph = function() { var config = {}; config.bindto = '#chart'; config.data = {}; config.data.json = {}; config.data.json.data1 = $scope.config.data1.split(","); config.data.json.data2 = $scope.config.data2.split(","); config.axis = {"y":{"label":{"text":"Number of items","position":"outer-middle"}}}; config.data.types={"data1":$scope.config.type1,"data2":$scope.config.type2}; $scope.chart = c3.generate(config); } });
In the first part we initialise all the variables in the $scope that are used on the form. In the showGraph function we have added a few things compared to the previous sample. We do not use the column data provider anymore, now we use the json provider. therefore we create arrays out of the comma separated numbers string. We also add a label to the y-axis and we set the types of charts using the same names as in the son object with the data. I think this is a good time to show a screen dump, stil it is much nicer to open the index3.html file yourself and play around with it.
Now we want to do more with angular, introduce a service that could obtain data from the server, but also make the data time based data.Introducing time and data generation
The html is very basic, it only contains to buttons. One to start generating data and one to stop generating data. Let us focus on the javascript we have created. When creating the application we now tell it to look for another module called graphApp.services. Than we create the service using the factory and register it with the application. That way we can inject the service later on into the controller.
var graphApp = angular.module('graphApp', ['graphApp.services']); var services = angular.module('graphApp.services', []); services.factory('dataService', [function() { function DataService() { var data = []; var numDataPoints = 60; var maxNumber = 200; this.loadData = function(callback) { if (data.length > numDataPoints) { data.shift(); } data.push({"x":new Date(),"data1":randomNumber(),"data2":randomNumber()}); callback(data); }; function randomNumber() { return Math.floor((Math.random() * maxNumber) + 1); } } return new DataService(); }]);
This service has one exposed method, loadData(callback). The result is that you get back a collection of objects with 3 fields: x, data1 and data2. The number of points is maximised to 60 and they have a random value between 0 and 200.
Next is the controller. I start with the controller, the parameters that are initialised as well as the method to draw the graph.
graphApp.controller('GraphCtrl', ['$scope','$timeout','dataService',function ($scope,$timeout,dataService) { $scope.chart = null; $scope.config={}; $scope.config.data=[] $scope.config.type1="spline"; $scope.config.type2="spline"; $scope.config.keys={"x":"x","value":["data1","data2"]}; $scope.keepLoading = true; $scope.showGraph = function() { var config = {}; config.bindto = '#chart'; config.data = {}; config.data.keys = $scope.config.keys; config.data.json = $scope.config.data; config.axis = {}; config.axis.x = {"type":"timeseries","tick":{"format":"%S"}}; config.axis.y = {"label":{"text":"Number of items","position":"outer-middle"}}; config.data.types={"data1":$scope.config.type1,"data2":$scope.config.type2}; $scope.chart = c3.generate(config); }
Take note of the $scope.config.keys which is used later on in the config.data.keys object. With this we move from an array of data per line to a an object with all the datapoints. The x is coming from the x property, the value properties are coming from data1 and data2. Also take note of the config.axis.x property. Here we specify that we a re now dealing with timeseries data and we format the ticks to show only the seconds. This is logical since we configured the have a maximum of 60 points and we create a new point every second, which we will see later on. The next code block shows the other three functions in the controller.
$scope.startLoading = function() { $scope.keepLoading = true; $scope.loadNewData(); } $scope.stopLoading = function() { $scope.keepLoading = false; } $scope.loadNewData = function() { dataService.loadData(function(newData) { var data = {}; data.keys = $scope.config.keys; data.json = newData; $scope.chart.load(data); $timeout(function(){ if ($scope.keepLoading) { $scope.loadNewData() } },1000); }); }
In the loadNewData method we use the $timeout function of AngularJS. After a second we call the loadNewData again if we did not set the keepLoading property explicitly to false. Note that adding a point to the graph and calling the function recursively is done in the callback of the methode as send to the dataService.
Now run the sample for longer than 60 seconds and see what happens. Below is a screen dump, but is becomes more funny when you run the sample yourself.
That is about it, now I am going to integrate this with my elasticsearch-ui plugin
The post Using C3js with AngularJS appeared first on Gridshore.
Sometimes you are indexing data and want to have as little to do in the input, or maybe even no influence on the input. Still you need to make changes, you want other content, or other fields. Maybe even remove fields. In elasticsearch 1.3 a new feature is introduces called Transform. In this blogpost I am going to show some of the aspects of this new feature.Insert the document with the problem
The input we get is coming from a system that puts the string null in a field if it is empty. We do not want null as a string in elasticsearch index. Therefore we want to remove this field completely when indexing a document like that. We start with the example and the proof that you can search on the field.
PUT /transform/simple/1 { "title":"This is a document with text", "description":"null" }
Now search for the word null in the description.
GET /transform/_search { "query": { "match": { "description": "null" } } }
For completeness I'll show you the response as well.
Response: { "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "failed": 0 }, "hits": { "total": 1, "max_score": 0.30685282, "hits": [ { "_index": "transform", "_type": "simple", "_id": "1", "_score": 0.30685282, "_source": { "title": "This is a document with text", "description": "null" } } ] } }Change mapping to contain transform
Next we are going to use the transform functionality to remove the field if it contains the string null. To do that we need to remove the index and create a mapping containing the transform functionality. We use the groovy language for the script. Beware that the script is only validated when the first document is inserted.
PUT /transform { "mappings": { "simple": { "transform": { "lang":"groovy", "script":"if (ctx._source['description']?.equals('null')) ctx._source['description'] = null" }, "properties": { "title": { "type": "string" }, "description": { "type": "string" } } } } }
When we insert the same document as before and execute the same query we do not get hits. The description field is no longer indexed. An important aspect is that the actual _source is not changed. When requesting the _source of the document you still get back the original document.
GET transform/simple/1/_source
Response: { "title": "This is a document with text", "description": "null" }Add a field to the mapping
To add a bit more complexity, we add a field called nullField which will contain the name of the field that was null. Not very useful but it suits to show the possibilities.
PUT /transform { "mappings": { "simple": { "transform": { "lang":"groovy", "script":"if (ctx._source['description']?.equals('null')) {ctx._source['description'] = null;ctx._source['nullField'] = 'description';}" }, "properties": { "title": { "type": "string" }, "description": { "type": "string" }, "nullField": { "type": "string" } } } } }
Notice that we script has changed, not only do we remove the description field, now we also add a new field called nullField. Check that the _source is still not changed. Now we do a search and only return the fields description and nullField. Before scrolling to the response think about the response that you would expect.
GET /transform/_search { "query": { "match_all": {} }, "fields": ["nullField","description"] }
Did you really think about it? Try it out and notice that the nullField is not returned. That is because we did not store it in the index and it is not obtained from the source. So if we really need this value, we can store the nullField in the index and we are fine.
PUT /transform { "mappings": { "simple": { "transform": { "lang":"groovy", "script":"if (ctx._source['description']?.equals('null')) {ctx._source['description'] = null;ctx._source['nullField'] = 'description';}" }, "properties": { "title": { "type": "string" }, "description": { "type": "string" }, "nullField": { "type": "string", "store": "yes" } } } } }
Than with the match all query for two fields we get the following response.
GET /transform/_search { "query": { "match_all": {} }, "fields": ["nullField","description"] }
Response: { "took": 2, "timed_out": false, "_shards": { "total": 1, "successful": 1, "failed": 0 }, "hits": { "total": 1, "max_score": 1, "hits": [ { "_index": "transform", "_type": "simple", "_id": "1", "_score": 1, "fields": { "description": [ "null" ], "nullField": [ "description" ] } } ] } }
Yes, now we do have the new field. That is it, but wait there is more you need to know. There is a way to check what is actually passed to the index for a certain document.
GET transform/simple/1?pretty&_source_transform
Result: { "_index": "transform", "_type": "simple", "_id": "1", "_version": 1, "found": true, "_source": { "description": null, "nullField": "description", "title": "This is a document with text" } }
Notice the null description and the nullField in the _source.Final remark
You cannot update the transform part, think about what would happen to your index when some documents did pass the transform version 1 and others version 2.
I would be gentile with this feature, try to solve it before sending it to elasticsearch, but maybe you just have the usecase for this feature, now you know it exists.
In my next blogpost I dive a little bit deeper into the scripting module.
The post Transform the input before indexing in elasticsearch appeared first on Gridshore.
Just a few days a go elasticsearch released version 1.3.0 of their flagship product. The first one is the most waited for feature called the Top hits aggregation. Basically this is what is called grouping. You want to group certain items based on one characteristic, but within this group you want to have the best matching result(s) based on score. Another very important feature is the new support for scripts. Better security options when using scripts using sandboxed script languages.
In this blogpost I am going to explain and show the top_hits feature as well as the new scripting support.
Top hits
I am going to show a very simple example of top hits using my music index. This index contains all the songs I have in my itunes library. First step is to find songs by genre, the following query gives (the default) 10 hits based on the match_all query and the terms aggregation as requested.
GET /mymusic/_search { "aggs": { "byGenre": { "terms": { "field": "genre", "size": 10 } } } }
The response is of the format:
{ "hits": {}, "aggregations": { "byGenre": { "buckets": [ {"key":"rock","doc_count":1910}, ... ] } } }
Now we add the query to the request, songs containing the word love in the title.
GET /mymusic/_search { "query": { "match": { "name": "love" } }, "aggs": { "byGenre": { "terms": { "field": "genre", "size": 10 } } } }
Now we have less hits, still a number of buckets and the amount of songs that match our query within that bucket. The biggest change is the score in the returned hits. In te previous query the score was always 1, now the score is different due to the query we execute. The highest score now is the song Love by The Mission. The genre for this song is Rock and the song is from the year 1990. Time to introduce the top hits aggregation. With this query we can return the top song containing the word love in the title per genre
GET /mymusic/_search { "query": { "match": { "name": "love" } }, "aggs": { "byGenre": { "terms": { "field": "genre", "size": 5 }, "aggs": { "topFoundHits": { "top_hits": { "size": 1 } } } } } }
Again we get hits, but they are not different from the query before. The interesting part is in the aggs part. Here we add a sub aggregation to the byGenre aggregation. This aggregation is called topFoundHits of type top_hits. We only return the best hit per genre. The next code block shows the part of the response with the top hits, I did remove the content of the _source field in the top_hits to keep the response shorter.
{ "took": 4, "timed_out": false, "_shards": { "total": 3, "successful": 3, "failed": 0 }, "hits": { "total": 141, "max_score": 0, "hits": [] }, "aggregations": { "byGenre": { "buckets": [ { "key": "rock", "doc_count": 52, "topFoundHits": { "hits": { "total": 52, "max_score": 4.715253, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "4147", "_score": 4.715253, "_source": { "name": "Love", } } ] } } }, { "key": "pop", "doc_count": 39, "topFoundHits": { "hits": { "total": 39, "max_score": 3.3341873, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "11381", "_score": 3.3341873, "_source": { "name": "Love To Love You", } } ] } } }, { "key": "alternative", "doc_count": 12, "topFoundHits": { "hits": { "total": 12, "max_score": 4.1945505, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "7889", "_score": 4.1945505, "_source": { "name": "Love Love Love", } } ] } } }, { "key": "b", "doc_count": 9, "topFoundHits": { "hits": { "total": 9, "max_score": 3.0271564, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "2549", "_score": 3.0271564, "_source": { "name": "First Love", } } ] } } }, { "key": "r", "doc_count": 7, "topFoundHits": { "hits": { "total": 7, "max_score": 3.0271564, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "2549", "_score": 3.0271564, "_source": { "name": "First Love", } } ] } } } ] } } }
Did you note a problem with my analyser for genre? Hint R&B!
More information on the top_hits aggregation can be found here:
Elasticsearch has support for scripts for a long time. The default scripting language was and is mvel up to version 1.3. It will change to groovy in 1.4. Mvel is not a well known scripting language. The biggest advantage is that mvel is very powerful. The disadvantage is that it is to powerful. Mvel does not come with a sandbox principle. Therefore is is possible to write some very nasty scripts even when only doing a query. This was very well shown by a colleague of mine (Byron Voorbach) who created a query to read private keys on developer machines who did not safeguard their elasticsearch instance. Therefore dynamic scripting was switched off in version 1.2 by default.
This came with a very big disadvantage, now it was not possible anymore to use the function_score query without resorting to stored scripts on the server. In version 1.3 of elasticsearch a much better way is introduced. Now you use sandboxed scripting languages like groovy to keep using the flexible approach. Groovy can be configured to include object creation and method calls that are allowed. More information about this is provided in the elasticsearch documentation about scripting.
Next is an example query that is querying my music index. This index contains all the songs from my music library. It queries all he songs after the year 1999 and calculates the score based on the year. So the newest songs get the highest score. And yes I know a sort by year desc would have given the same result.
GET mymusic/_search { "query": { "function_score": { "query": { "range": { "year": { "gte": 2000 } } }, "functions": [ { "script_score": { "lang": "groovy", "script": "_score * doc['year'].value" } } ] } } }
The score now becomes high, since we do a range query we get back only scores of one. Using the function_score as the multiplication of the year with the score, the end score is the year. I added the year as the only field to return, some of the results than are:
{ "took": 4, "timed_out": false, "_shards": { "total": 3, "successful": 3, "failed": 0 }, "hits": { "total": 2895, "max_score": 2014, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "12965", "_score": 2014, "fields": { "year": [ "2014" ] } }, { "_index": "mymusic", "_type": "itunes", "_id": "12975", "_score": 2014, "fields": { "year": [ "2014" ] } } ] } }
Next up is the last sample, a combination of top_hits and scripting.Top hits with scripting
We start with the sample from top_hits using my music index. Now we want to sort the buckets on the score of the best matching document in the bucket. The default is the number of documents in the bucket. As mentioned in the documentation you need a trick to do this.
The top_hits aggregator isn't a metric aggregator and therefor can't be used in the order option of the terms aggregator.
GET /mymusic/_search?search_type=count { "query": { "match": { "name": "love" } }, "aggs": { "byGenre": { "terms": { "field": "genre", "size": 5, "order": { "best_hit":"desc" } }, "aggs": { "topFoundHits": { "top_hits": { "size": 1 } }, "best_hit": { "max": { "lang": "groovy", "script": "doc.score" } } } } } }
The results of this query again with most of the _source taken out is following. Compare it to the query in the top_hits section. Notice the different genres that we get back now. Also check the scores.
{ "took": 4, "timed_out": false, "_shards": { "total": 3, "successful": 3, "failed": 0 }, "hits": { "total": 141, "max_score": 0, "hits": [] }, "aggregations": { "byGenre": { "buckets": [ { "key": "rock", "doc_count": 37, "topFoundHits": { "hits": { "total": 37, "max_score": 4.715253, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "4147", "_score": 4.715253, "_source": { "name": "Love", } } ] } }, "best_hit": { "value": 4.715252876281738 } }, { "key": "alternative", "doc_count": 12, "topFoundHits": { "hits": { "total": 12, "max_score": 4.1945505, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "7889", "_score": 4.1945505, "_source": { "name": "Love Love Love", } } ] } }, "best_hit": { "value": 4.194550514221191 } }, { "key": "punk", "doc_count": 3, "topFoundHits": { "hits": { "total": 3, "max_score": 4.1945505, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "7889", "_score": 4.1945505, "_source": { "name": "Love Love Love", } } ] } }, "best_hit": { "value": 4.194550514221191 } }, { "key": "pop", "doc_count": 24, "topFoundHits": { "hits": { "total": 24, "max_score": 3.3341873, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "11381", "_score": 3.3341873, "_source": { "name": "Love To Love You", } } ] } }, "best_hit": { "value": 3.3341872692108154 } }, { "key": "b", "doc_count": 7, "topFoundHits": { "hits": { "total": 7, "max_score": 3.0271564, "hits": [ { "_index": "mymusic", "_type": "itunes", "_id": "2549", "_score": 3.0271564, "_source": { "name": "First Love", } } ] } }, "best_hit": { "value": 3.027156352996826 } } ] } } }
This is just a first introduction into the top_hits and scripting. Stay tuned for more blogs around these topics.
The post Playing with two most interesting new features of elasticsearch 1.3.0 appeared first on Gridshore.
A lot of people dream of creating the new Facebook, Twitter or Instagram. Nobody knows when they will create it, most of the ideas just came to be big. Personally I do not believe I will ever create such a product. To busy with to much different things, usually based on great ideas of others. One thing I do like is reading about the success stories of others. I read the book about starbucks, microsoft, apple and a few others.
Recently I started reading the Twitter Story. It reeds like an exciting story, nevertheless it is telling a story based on interviews and facts behind one of the most exciting companies on the internet of the last century.
I do not think it is a coincidence that a lot of what I read in the Lean Startup but also the starbucks story is coming back in the twitter story. One thing that struck me in this book is what business does to friendship. It is also showing that people with great ideas are usually not the people that make this ideas into a profitable company.
When starting a company based on your terrific idea, read this book and learn from it. It might make your life a lot better.
The post Review The Twitter Story by Nick Bilton appeared first on Gridshore.


text:
This week, I put a timer up on my Smart Board while we were packing up for the day. If every friend was sitting at their desk by the time the bell went off on the timer, they got 1 minute of chit chat time! You would have thought that little "prize" was equivalent to one million dollars. #itsthelittlethings
My question for the week: Do you have a "pack up" tip or trick you would like to share with everyone? Leave a comment below and then check out all the other great links for this week's Wordless Wednesday!

subset: commoncrawl


text:
Pleasure is often spoiled by describing it.
Beauty is the promise of happiness.
A very small degree of hope is sufficient to cause the birth of love.
The pleasures of love are always in proportion to our fears.
Power, after love, is the first source of happiness.
Photographs by Roberto Badin
Quotes by Stendhal
Categories: Art, Photography


text:
Michael J. Martineck reviews Then Will The Great Ocean Wash Deep Above.
A Nice Little FindMarch 24, 2014
Wizard's TowerMarch 21, 2014
Interzone ebooks are now available through Wizard's Tower Books.
This is a seriously well-stocked bookshop and I'd strongly advise you to check it out here.
Ship ItMarch 19, 2014
Lulu is offering free shipping on orders over £100 until 24th March with the code SHIPIT318.
Stock up with books, basically.
TangentMarch 9, 2014
SuperMarch 8, 2014
Lulu is having a flash sale: 20% off all orders with the code SUPER20.
Sale ends 10th March.


text:
Square Enix Announces Hitman: Sniper for Mobile Devices
Just when you thought Agent 47 was on the go, he has brought a sniper rifle to finish up the rest of his assassinations from afar.
Just when you thought Agent 47 was on the go, he has brought a sniper rifle to finish up the rest of his assassinations from afar.
Be ready to slingshot your way through the Golden Island in this newest addition to the Angry Birds universe.
These apps represent the best of the best when it comes to last year's top applications for Apple devices.
Just when you thought the undead have roamed into every area of gaming, this pinball game reminds us that we haven't seen it all.
With an estimated 46 million monthly users, Candy Crush Saga is an unmitigated triumph of commercialism over quality.
'Harry and the Hendersons' and Pokemon Snap collide in Bigfoot Hunter.
The saga continues in Angry Birds Star Wars II: Rise of the Clones. Get ready for more lightsabers, blasters and Force powers, oh my.
After being left beaten and bloody, Bigby is back in this new trailer for The Wolf Among Us: Episode 4 - In Sheep's Clothing.
Just when you thought there weren't enough Flappy Bird clones out there, Epic Games raised the bar using its Unreal Engine 4.
AiAi, MeeMee, Baby and GonGon are going to roll their way onto mobile devices and tablets quite soon.
Moneyhorse Games has released a new trailer for their upcoming PC and mobile game, Glorious Leader!
He announced Flappy Bird would be back at some point, but now Dong Nguyen has set an official timeframe for his addictive surprise hit to return.


text:
CLOSED: Thanksgiving
Start Date: November 28, 2013 10:00 AM
End Date: November 30, 2013 9:00 PM
Location: Does Not Apply
The Eckhart Public Library campus will be closed November 28 - November 30, 2013 in observance of Thanksgiving. Have a happy holiday!
Our virtual branch is open 24/7 to download eBooks and audiobooks!
|Wednesday, November 26th
|5:00 PM Library Closing Early: Thanksgiving
|Thursday, December 4th
|6:00 PM Knifty Knitters
|Tuesday, December 9th
|6:00 PM Board of Trustees Meeting - December
|Tuesday, December 9th
|6:30 PM Creative Writing Group
|Wednesday, December 10th
|1:00 PM Meet the Author: Hardwood Glory: Sports Legend John Wooden and His Hoosier Roots
|Thursday, December 11th
|6:30 PM Better Off Read: A Christmas Carol
|Wednesday, December 17th
|12:00 PM Turn a Page with Anni: Christmas Sweater
|Thursday, December 18th
|10:15 AM Creative Writing Group
|Thursday, December 18th
|6:00 PM Knifty Knitters
|Tuesday, December 23rd
|5:00 PM Library Closing Early: Christmas


text:
Joshua M. Brown
I'm a New York City-based financial advisor at Ritholtz Wealth Management. I help people invest and manage portfolios for them.
As Seen On
Subscribe & Reform
Today's Hot Links
- Fund managers' exposure to US stocks is at a 15 month high (Fat Pitch)
- Strategic beta works really well, if you can control yourself. (Irrelevant Investor)
- Stock buybacks boost returns — but often cover up sins (MarketWatch)
- The latest M&A boom is going to end badly - Hulbert (MarketWatch)
- Vince Farrell was a smart market commentator, a good investor and a gentleman. RIP (ValueWalk)


text:
Kukla's Korner Hockey
Roloson Done For The Series
by Paul on 06/06/06 at 12:07 AM ET
Comments (0)
Q. How concerned is the status of Dwayne right now? CHRIS PRONGER: Well, it's a tough loss. I've been through it before, with the infamous Nick Kypreos on Grant Fuhr, but we have two guys that we've got a lot of confidence in. You know, they have not played that much the last two or three months, but at the same time, they have seen them in practice, they have been working hard trying to stay sharp and they will do a good job.more in the comments...
Filed in: | KK Hockey | Permalink
Be the first to comment.
Add a Comment
Please limit embedded image or media size to 575 pixels wide.
Add your own avatar by joining Kukla's Korner, or logging in and uploading one in your member control panel.
Captchas bug you? Join KK or log in and you won't have to bother.
Most Recent Blog Posts
Trade Options For The Edmonton Oilers
Why The World Cup Of Hockey Is A Good Idea
After Montreal's 5-0 Loss To The New York Rangers Last Night
Video- Mike Smith With The Bad Goal Of The Night
Video- Review Of The NHL Games On Sunday
Viktor Tikhonov Dead At Age 84
Reto Berra Not Living Up To Expectations In Denver
Video- How Bad Is It In Edmonton?
About Kukla's Korner Hockey
Paul Kukla founded Kukla's Korner in 2005 and the site has since become the must-read site on the 'net for all the latest happenings around the NHL.
From breaking news to in-depth stories around the league, KK Hockey is updated with fresh stories all day long and will bring you the latest news as quickly as possible.
Email Paul anytime at firstname.lastname@example.com


text:
Read and Share DVD Bible Volume #4
- Occasion▼▲
- Audience▼▲
- Format▼▲
- Language▼▲
- Media Type▼▲
- Series▼▲
- Guides & Workbooks▼▲
- Author / Artist▼▲
- Publisher▼▲
- Top Rated▼▲
- Price▼▲
- Discount▼▲
In This Series
Product Description
DVD Features:
- Dolby 5.1 surround sound
- Widescreen/Fullscreen
- Interviews with "real kinds"
- "Behind-the-Scenes"
- Trailers
- Coloring pages
- Auto-start: kids can watch by simply inserting the DVD
Product Information
|Format: DVD
Vendor: Thomas Nelson
Publication Date: 2009
Availability: In Stock
Series: Read and Share
Related Products
Read and Share DVD Bible: EasterGwen EllisThomas Nelson / 2010 / DVD$8.19 Retail:4.5 Stars Out Of 5 5 Reviews
$9.99Save 18% ($1.80)Availability: In StockCBD Stock No: WW314478
Read and Share: Jesus Series - Life and Miracles DVDThomas Nelson / 2010 / DVD$8.19 Retail:4 Stars Out Of 5 17 Reviews
$9.99Save 18% ($1.80)Availability: In StockCBD Stock No: WW314690Video
Read and Share DVD Bible: ChristmasGwen EllisThomas Nelson / 2009 / DVD$8.19 Retail:5 Stars Out Of 5 1 Reviews
$9.99Save 18% ($1.80)Availability: In StockCBD Stock No: WW314461Video
Read and Share DVD Bible Volume #3Gwen EllisThomas Nelson / 2009 / DVD$8.19 Retail:5 Stars Out Of 5 3 Reviews
$9.99Save 18% ($1.80)Availability: In StockCBD Stock No: WW313051Video
Publisher's Description
Share the joy and wonder of God's Word with the children in your life.
Thirteen essential lessons of scripture starring the Bible's best-known characters. The Read and Share Bible on DVD combines an enchanting art style with a warm narrator and gentle musical underscore to transport kids back to Biblical times. The bite-size vignettes are perfect for the attention span of little ones, and give parents maximum flexibility to fit any time-frame.
Stories include: Gideon, Hannah's Prayer, The Wisest Man, Seven Dips in the Jordan River, Writing on the Wall (Daniel), Jonah, Where is Jesus?, Jesus Walks on the Water, A Very Poor Woman, Jesus' Best Friends, Philip, Peter in Jail, New Heaven and Earth, and A Promise to God's Children
Author Bio
Product Reviews
Love JesusFloridaAge: 55-65Gender: female5 Stars Out Of 5Keeps my grand daughter's attention!!September 30, 2011Love JesusFloridaAge: 55-65Gender: femaleQuality: 4Value: 4Meets Expectations: 5I bought these DVD's due to having vol. 1 & 2 and got 3 & 4 to complete the set. It holds my grand daughter's attention and that speaks volume to me. She really enjoys the videos and she is 5 yrs. old. The story line is a little different from the bible in some of them but it has the same truth.
jenbrownAge: 25-34Gender: female5 Stars Out Of 5Great for my kids!January 20, 2011jenbrownAge: 25-34Gender: femaleQuality: 5Value: 5Meets Expectations: 5My kids have loved these videos so much, and ask to watch them everyday! They are 2 and 3 years old. Even my 8 year old enjoys watching them. These videos are well done nd entertaining for the kids. Best of all they encourage a love for Jesus!
TracyT5 Stars Out Of 5May 7, 2010TracyTMy grandkids and Sunday School class LOVE this series! Awesome animation, well done. My 3 year old grandson amazes people with his Bible story knowledge because of these!
Janet Christenson5 Stars Out Of 5February 1, 2010Janet ChristensonLove these short vignettes. The length of each story is perfect! I hope that they continue to produce more volumes!
Nicole Grieshop5 Stars Out Of 5January 27, 2010Nicole GrieshopReally love these videos! My kids are 2 and 3 and especially the 3 year old loves watching these! They are so helpful in going over what they learn in Sunday school and our children's Bible we read them. Highly recommend these to everyone!
Ask Christianbook
Q: Read and Share Stories Are the sets similar or do they have all different stories? I am looking at buying Vol 1 but am looking at what the difference in the stories buying the full set.
Each volume in the set has different stories that cover both Old and New testament. We sell the individual volumes separately, so this vol. 4 is the same as vol. 4 in the 4 volume set (WW14539X).
Ask Christianbook
Other Customers Also Purchased
The Story of the Empty Tomb: John 20 for Children Easter Arch BooksBryan Davis, Len EbertConcordia Publishing House / 1998 / Trade Paperback$2.29 Retail:5 Stars Out Of 5 2 Reviews
$2.49Save 8% ($0.20)Availability: In StockCBD Stock No: WW75440
Adventures in Odyssey The Imagination Station ® #13: The Redcoats are Coming!Tyndale House / 2014 / Trade Paperback$3.99 Retail:5 Stars Out Of 5 11 Reviews
$4.99Save 20% ($1.00)Availability: In StockCBD Stock No: WW977747
Veggies in Space: The Fennel Frontier, DVDWord Entertainment Inc / 2014 / DVD$9.99 Retail:4.5 Stars Out Of 5 2 Reviews
$14.99Save 33% ($5.00)Availability: In StockCBD Stock No: WW137397Video
Theo: God's Truth Home Edition, DVDWhitestone Media / DVD$10.99 Retail:
$12.99Save 15% ($2.00)Availability: In StockCBD Stock No: WW199593
Find Related Products
- Bible Studies & Curriculum >> Video Curriculum >> Biblical Subjects
- Bible Studies & Curriculum >> Video Curriculum >> Christian Life
- Children >> Bible Studies & Curriculum
- Children >> DVDs >> Biblical Stories
- Church & Pastoral >> Kid's Ministry >> Devotionals
- Church & Pastoral >> Small Group Resources >> Video Curriculum
- DVDs >> Children >> Animated
- DVDs >> Children >> Biblical Stories
- DVDs >> Church & Pastoral >> Kid's Ministry
- DVDs >> Video Curriculum >> Small Group Resources >> Biblical Subjects
- DVDs >> Video Curriculum >> Small Group Resources >> Christian Life
- Start A New Search


text:
Home Page
Flag Football Freshman AFC Playoff Bracket
Flag Football Freshman NFC Playoff Bracket
Flag Football JV AFC Playoff Bracket
Flag Football JV NFC Playoff Bracket
Flag Football Varsity AFC Playoff Bracket
Flag Football Varsity NFC Playoff Bracket
Winter Clinic and Spring Baseball Now Open
LSW Sports Winter Clinic and Intramural Kickball, T-ball, Baseball, Softball and Senior Baseball Registration is Now Open. Please visit our Registration Page for forms or Click below to register online.
Flag Football Season Update!
Click here to go to season schedule.
The 2nd Half Schedules for the JV and Varsity Divisions are now posted please go to the Flag Football page to view the schedules.
Team Rosters are now online. Please go to the Division page your child is in to see which team they are on and see the posted schedule. If you are unable to contact your team coach please go down to the field for your game this Sunday.
Congratulations LSW Astros Blue 12u for Winning the East Meadow Fall Tournament!
Lsw Blue Wins East Meadow Fall Tournament
Congratulations 10ua Champion Lsw Astros Red 2014
Great job on Fantastic Spring & Summer Travel Baseball Season . Your hard work & dedication was proven with a 16-0-1 record.With the end result being the Champions of the 10ua Division . A big Thank you to a Great Coaching Staff, a great bunch of boys & there wonderful families .
Hi LSW Sports in Wantagh Seaford Levittown has one of their own players at this year's All-Star game. The All-Star press release went out June 30th and he participated in the Hit Pitch Run Competition and won and is representing Seaford Long Island and will be announced at the game. Joseph Thatcher in the 7-8 yr old category from Seaford and won at Citi Field representing the Mets.
He was seen on TV in last night's Home Run Hitting contest.
Congratulations to Joe Thatcher on Winning First Place at the Team Championship. He competed at the two previous qualifying events the first one held right here at our own Alken Ave Field. He is now eligible to be selected to be introduced at this Years Major League Allstar Game.
A special thanks to our own volunteer coaches Pete Gaglio and Gene Dellitallia who organized our 2nd Annaul Pitch Hit and Run Competition this year and the other parents and coaches who helped throughout the day.
LSW Field Locations
Daily Rainout Notice
YoWindow.com Forecast by NWS
Memorial Day Tournament Images


text:
Receiving two free airline tickets sounds too good to be true because it is
Receiving two free tickets from Southwest Airlines for simply following an online link sounds too good to be true.
That's because it is.
A "phishing" scam promising two free airline tickets has made its way back to Facebook.
The scam has managed to make multiple appearances on Facebook and via email since it began in November 2011, according to Snopes.com.
"Southwest Airlines is currently working to squash several scams involving 'two free tickets.' Please do not click on these links, or give away any of your personal information," Southwest said on its official Facebook page.
Users are asked to "share" the scam on Facebook in order to receive the tickets, tricking them into spreading it to their friends. They are then asked to input personal information, like name, age, address and phone numbers.
But that personal information is then used for telemarketing, which is included in the fine print.
Newer versions of the scam include a "lifejacking" attack, or a malicious script that sends the scam to their friends without permission.
Other airlines have been the subjects of online scams as well, according to the Dallas Morning News.
"These messages may claim that you have purchased a Delta ticket, a credit card has been charged, order has been completed, an invoice/receipt is attached to an email or (a) website may offer free flights for following or liking an account. If you see or receive one of these messages, do not open attachments as it may contain potentially dangerous viruses or harm your computer," Delta Air Lines told the Dallas Morning News in a statement.
Some Facebook users are calling for tighter regulations to avoid scams like these.
"FB should tighten their security," said Pandi Perumal, a Facebook user who commented on the Southwest fan page. "There seems to be some loophole in their security. SW Airline should lodge an official complaint to FB."
EMAIL: email@example.com
TWITTER: @joeyferguson
- The most expensive homes in Utah in 2014
- 4 unexpected health risks of smartphone use
- There's more to Black Friday than getting a...
- Why 'Shark Tank' investor Barbara Corcoran...
- How actress Blake Lively's family saves money...
- 5 easy ways to make your money work for you
- Why you need to stop buying your kids so many...
- In our opinion: Fear, intentions can result...
- Pope demands just distribution of... 6
- Ford's new F-150 to get 26 mpg, tops... 4
- Gift Guide: 3 ways to watch streaming... 3
- Minivans do poorly in new crash tests 2
- When low-income housing is converted... 2
- How to keep information overload from... 1
- 5 reasons not planning could help you... 1
- How are holiday shoppers spending their... 1