Subscribe: savas
http://savas.parastatidis.name/feeds/atom-1.0.aspx
Added By: Feedage Forager Feedage Grade B rated
Language: English
Tags:
computing  data  expensivetocopy  graph  microsoft  move  new  part  queries  reactgraph part  reactive computing  reactive  savas  time 
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: savas

savas



weblog



Updated: 2017-10-14T01:37:03Z

 



10 years at Microsoft

2017-02-06T22:33:00Z

(image)

Microsoft Human Resources just sent me a note to tell me that I reached 10y with the company!!! It only feels like it was last year that I joined :)

Side note for the non-Microsofties… The company counts the total number of years of service since joining, minus any “sabbatical” …

(image)

Microsoft Human Resources just sent me a note to tell me that I reached 10y with the company!!! It only feels like it was last year that I joined :)

Side note for the non-Microsofties… The company counts the total number of years of service since joining, minus any “sabbatical” at another company.

I joined back in 2005. I left academia, made a huge change in my personal life, came to a new country, made new friends, and created a new home with an amazing partner. It’s been rewarding in so many ways.

I love working on tech. I’m fortunate to be surrounded by awesome people. I feel that I learn something new every day. Here’s to another 10y of building awesome stuff for our users around the world!

Just bought a pound of M&Ms for every year, as per Microsoft tradition. Drop by my office to say hi.




Panama City Beach holiday – Discrimination and profiling (can be subconscious behaviors)

2016-07-17T00:38:52Z

I had a negative experience earlier today while in Florida. Mary and I spent the last week at Panama City Beach for Mary’s family reunion. Even though it wouldn’t have been my first choice for a holiday destination, we had a great week with Mary’s family… all 34 of us! …I had a negative experience earlier today while in Florida. Mary and I spent the last week at Panama City Beach for Mary’s family reunion. Even though it wouldn’t have been my first choice for a holiday destination, we had a great week with Mary’s family… all 34 of us! :-) These are the two houses in which we stayed for a week. Earlier this morning Mary flew out to go to a work-related meeting somewhere in Utah. My flight back to Seattle wasn’t until 12h later so I had plenty of time to kill. I went for a drive to have breakfast at Liza’s Kitchen, a local restaurant which had good reviews. I love smiling people. The food and the service were great. Then back to the Pier Park shopping area, close to the houses where we were staying and on the way to the airport. I caught up with email from a Starbucks for an hour or so and then headed to watch “The Secret Life of Pets” (yeah… I love cartoons and computer animation). I bought my ticket and entered the cinema. As always, I greeted the gentleman who was checking for tickets and asked about his day, just being the usual cheerful self. That’s when it all started. The ticket-checking gentleman informed me that I couldn’t get into the cinema because I was carrying a “backpack”, referring to my courier laptop bag. As he indicated to me, it was the cinema’s policy to not allow backpacks. I informed him that it was my laptop and offered to open it up for him to inspect the contents. Apparently he couldn’t do that. I just had to find a way to leave my bag somewhere. Ok… fair enough… a policy is a policy. My Crumpler laptop bag is very similar to this one… Given that it was already passed the start time of the movie previews, I decided to just return to the ticket office for a refund. I continued to be cheerful since it wasn’t that a big of a deal. On my way out, I noticed a white lady entering with one of those bags that are larger than a suitcase :-) Ok… not as big as a suitcase but noticeably larger than my laptop bag. No questions asked. She was just allowed to enter. No policy enforcement for her. I was surprised and started to get frustrated about what could have been the reason behind the decision to not let ME in. Could it have been profiling? Could I have been discriminated because of my thick accent and the way I look? Big guy with dark skin? (yeah… I do rediscover my darker Mediterranean skin color when I get exposed to the sun for a while :-). I waited in line at the ticket office for the ticket refund. My turn came up and I explained what had happened to justify the refund. The gentleman at the ticket office looked very surprised but confirmed the policy. When I pointed out to him that a white lady, without an accent like mine, was allowed to enter without any questions asked, he couldn’t explain why the policy wasn’t equally applied to both of us. At this point, my voice became louder as I was requesting for an explanation on the policy’s inconsistent enforcement. I asked for the manager. Was I being profiled, even subconsciously, because of my thick accent and darker skin? A gentleman behind me in the ticket line rudely asked me to move over so that he could buy his ticket. I asked him if he had heard about what had just happened. He confirmed that he did. He said that he didn’t care and that all he wanted was to buy a ticket. Another lady behind him piled on and also told me to move over. Argh! People… you need to care about such things, even if—in the large scheme of things—it’s an insignificant incident! It’s behaviors like these that we need to eradicate in this country and around the world. Discrimination MUST NOT be the norm. The manager arrived. She asked me to en[...]



Cortana, I am back!

2016-05-16T20:10:21Z

I had a great time at Facebook. I learned a lot, wrote lots of code, and worked on conversational understanding technologies. I can’t wait to see what the team will do next.

Facebook is a unique organization, with an extraordinary culture. The engineering infrastructure is unbelievable and it enables developers …

I had a great time at Facebook. I learned a lot, wrote lots of code, and worked on conversational understanding technologies. I can’t wait to see what the team will do next.

Facebook is a unique organization, with an extraordinary culture. The engineering infrastructure is unbelievable and it enables developers to move really fast. I loved it. I met some great people there.

Even though I was having fun, I did miss the great team responsible for Cortana and Mike Calcagno’s leadership. So when Mike, Marcus, Jon, and Amit took me out for dinner few weeks ago and asked me to return home in order to do even crazier things with Cortana, I couldn’t resist. So… back at Microsoft… starting Tuesday, May 17th.

(image)

Looking forward to reconnecting with the Cortana team and to starting the exploration of more crazy ideas around user-centricity and digital companions/friends, enhanced/augmented reality, and AI as the enabling force behind natural human-computer interaction and “ambient intelligence” experiences. There is sooooo much work to do!!!

Very very excited :-)




ReactGraph Part 5 – A user’s feed via “pull” and “push” graph queries

2016-05-12T02:43:09Z

Investigation into bringing together graph and reactive computing. This fifth post in the series showcases slightly more complex LINQ-to-graph and Rx types queries for both “pull” and “push” type computation. ReactGraph Part 1: Graphs and Reactive Computing – Historical Context ReactGraph Part 2: Remote evaluation of continuous queries ReactGraph Part …Investigation into bringing together graph and reactive computing. This fifth post in the series showcases slightly more complex LINQ-to-graph and Rx types queries for both “pull” and “push” type computation. ReactGraph Part 1: Graphs and Reactive Computing – Historical Context ReactGraph Part 2: Remote evaluation of continuous queries ReactGraph Part 3 – The Data Model ReactGraph Part 4 – First (Re)Active Queries Disclaimer Remember that the goal of the investigation is to think about the abstractions. We don’t (yet) deal with implementation issues such as scale, reliability, hot spots, partitioning, locality of access, performance, etc. Those are very very important issues and the most difficult part of any implementation. If you are looking to work with graphs, you should really look at Neo4j. Get the user’s feed In part 4, we saw how we could get a user’s friends and posts. Now, let’s put these together in order to generate a user’s feed. We need to get the N most recent posts from his/her friends and only from those whom he/she follows. var savas = await graph.GetNode("savas"); var feed = savas .Friends() .Where(friend => savas.Follows(friend)) .SelectMany(friend => friend .Posts() .NodeValue() .OrderByDesceding(post => post.PublishedOn) .Take(5)) .OrderByDesceding(post => post.PublishedOn); feed.ToList().ForEach(post => WriteLine($"{post.Text} - by {post.PostedBy}"); //--- Output // Status update 4 - by Jim Webber // Status update 3 - by Erik Meijer // ... The above should be easy to read. From each of Savas’ friends whom he follows, we get the 5 most recent posts. Note the use of the NodeValue operator that projects the value of each INode in IQueryable (returned by Posts()) to a StatusUpdate, producing an IQueryable. And remember… the expression tree is submitted to the store, where the data resides, for evaluation. A special note about post.PostedBy. As an observant reader, you will point out that PostedBy is a property of StatusUpdate. Shouldnt’ we get the name of the author by following an edge (or the reverse of an edge)? Yes, that’s absolutely true. And it’s not the only way. In a future post we will discuss “calculated properties” which are dynamically updated as a reaction to changes in the graph. However, in large graphs, it’s often necessary (for performance reasons) to cache properties or calculate properties based on expressions against the data in the graph (think of Excel cells). We can use the reactive nature of the graph to keep such properties up-to-date. StatusUpdates from all the friends are collected and ordered. StatusUpdate.PostedBy is such a property. Let’s rewrite the above query to make use of anonymous types. var feed = savas .Friends() .Where(friend => savas.Follows(friend)) .SelectMany(friend => friend .Posts() .NodeValue() .OrderByDesceding(post => post.PublishedOn) .Take(5) .Select(post => new { PostedBy = $"{friend.FirstName} {friend.LastName}", Post = post}); .OrderByDesceding(feedEntry => feedEntry.Post.PublishedOn); feed.ToList().ForEach(feedEntry => WriteLine($"{feedEntry.Post.Text} - by {feedEntry.PostedBy}")); Don’t you just love LINQ? :-) This approach doesn’t suffer from performance issues but it does introduce an anonymous type w[...]



ReactGraph Part 4 – First (Re)Active Queries

2016-05-11T22:32:17Z

Investigation into bringing together graph and reactive computing. This fourth post in the series showcases LINQ-to-graph and Rx types queries for both “pull” and “push” type computation. ReactGraph Part 1: Graphs and Reactive Computing – Historical Context ReactGraph Part 2: Remote evaluation of continuous queries ReactGraph Part 3 – The …Investigation into bringing together graph and reactive computing. This fourth post in the series showcases LINQ-to-graph and Rx types queries for both “pull” and “push” type computation. ReactGraph Part 1: Graphs and Reactive Computing – Historical Context ReactGraph Part 2: Remote evaluation of continuous queries ReactGraph Part 3 – The Data Model Disclaimer Remember that the goal of the investigation is to think about the abstractions. We don’t deal with implementation issues such as scale, reliability, hot spots, partitioning, locality of access, performance, etc. Those are very very important issues and the most difficult part of any implementation. If you are looking to work with graphs, you should really look at Neo4j. Adding data I picked a domain familiar to everyone… the social graph. First, let’s add some people… var savas = await graph.NewNode("savas", new Person { FirstName = "Savas", LastName = "Parastatidis" }); var jim = await graph.NewNode("jim", new Person { FirstName = "Jim", LastName = "Webber" }); var erik = await graph.NewNode("erik", new Person { FirstName = "Erik", LastName = "Meijer" }); var adam = await graph.NewNode("adam", new Person { FirstName = "Adam", LastName = "Wolff" }); Now let’s create some relationships between these nodes… await graph.NewEdge( "savas-friend-jim", savas.Id, "friend", jim.Id, new Friend { Since = new DateTime(1995, 10, 1) }, true); // ... More person-friend-person edges await graph.NewEdge( "savas-colleague-erik-1", savas.Id, "colleague", erik.Id, new Coleague { From = new DateTime(2010, 10, 1), Until = new DateTime(2011, 10, 1), Company = "Microsoft" }, true); // ... More person-colleague-person edges Let’s add some posts… var post = await graph.NewNode( "savas-status-update-1", new StatusUpdate { Text = "Status update 1", CreatedOn = DateTime.Now }); await graph.NewEdge( "savas-post-status-update-1", user.Id, "post", post.Id, new Post { PostedOn = DateTime.Now }); // ... More posts In a similar way, we can add comments, representations of photos, likes, pokes, etc. First query First, a note about the difference between nodes/edges and the values they store. You will notice that when we write queries against the ReactGraph store, we are dealing with nodes and edges, not values. We will see operators that help us write queries against those values, taking advantage of LINQ’s deep integration with the language (e.g. inline completion). // Get the INode in the graph with identity "savas" var savasNode = await graph.Get("savas"); // Project the value stored at the INode to an instance of the // type Person. We only need this when we want to deal with the // value inside a node or an edge. var savasValue = savasNode.Value(); Now, let’s get one’s friends. A common theme across all the examples is the heavy use of LINQ and existing query operators wherever possible. This was actually a key goal of this investigation. More specialized/advanced query operators could (and will) be writen. var friends = savas .OutgoingEdges .Where(e => e.Predicate == "friend") .Select(e => e.G[...]



ReactGraph Part 3 – The Data Model

2016-05-11T20:32:40Z

Investigation into bringing together graph and reactive computing. This is the third post in the series and deals with the platform’s data model. ReactGraph Part 1: Graphs and Reactive Computing – Historical Context ReactGraph Part 2: Remote evaluation of continuous queries Nodes and Edges Everything in ReactGraph is a node. …Investigation into bringing together graph and reactive computing. This is the third post in the series and deals with the platform’s data model. ReactGraph Part 1: Graphs and Reactive Computing – Historical Context ReactGraph Part 2: Remote evaluation of continuous queries Nodes and Edges Everything in ReactGraph is a node. A node has an identity and stores a value. An edge is also a node, which means it too has identity and can store a value. Furthermore, an edge describes a directed path from a source to a destination node. The edge also has a predicate that gives some meaning to the path. An edge can be marked as “bidirectional”, which means that it also represents the destination-to-source reverse path. The above shouldn’t be of surprise to anyone who has dealt with the representation of information using graphs. The Neo4j property graph data model is very similar (with the exception of “an edge is also a node” characteristic). Facebook’s graph data model also exhibits similar properties to that of Neo4j. public interface INode { string Id { get; } T Value(); } public interface IEdge : INode { string SourceId { get; } string DestinationId { get; } string Predicate { get; } bool IsBidirectional { get; } } Why treat edges as nodes? So that the can act as the source of destination of other edges. This way there is no need to reify a relationship, if the application designers don’t wish to do so. The data model is flexible. For a discussion on this see my post from 2013 entitled “On Graph Data Model Design – Relationships”. Here’s an example I just discussed with Jim. There are multiple ways to model the data in an application of domain. One might decide to reify relationships by creating extra nodes. The best approach is the one that makes sense for the specific application. (id: jim) -> (id: foo, predicate: watched, on: 10/10/17) -> (id: SW-IV, title: "StarWars Episode IV") (id: savas) -> (id: bar1, predicate: liked) -> (id: foo) (id: savas) -> (id: bar1, predicate: shared, on: 10/11/17) -> (id: foo) Graph Queries and Reactive Computing With the graph data representation in place, we move to the basic abstractions necessary to support both “pull” graph querying and “push” continuous querying (reactive computing). The interface for a node is expanded with four additional properties. public interface INode { string Id { get; } T Value(); IQueryable IncomingEdges { get; } IQueryable OutgoingEdges { get; } IQbservable> ValueChanges { get; } IQbservable EdgeChanges { get; } } The IncomingEdges and OutgoingEdges let us create query expressions that can be submitted for evaluation to the data provider supporting the respective IQueryable interfaces. The properties represent the collection of incoming and outgoing edges respectively. The ValueChanges property allows the construction of Rx expression trees that can be submitted for continuous evaluation at the reactive computing data provider supporting the implementation of the INode interface. The ValueChanges represents the stream of changes to the value that the INode holds. Similarly, the EdgeChanges allows the construction of Rx expression trees that can be submitted for continuous evaluation at the reactive computing data provider supporting the implementation of the INode interface. The EdgeChanges represe[...]



ReactGraph Part 2: Remote evaluation of continuous queries

2017-05-26T15:50:45Z

Investigation into bringing together graph and reactive computing. This is the second post in the series and deals with the remote evaluation of continuous queries. ReactGraph – Part 1: Graphs and Reactive Computing – Historical Context What’s an IQbservable? In my previous post I mentioned that Reactor is based …Investigation into bringing together graph and reactive computing. This is the second post in the series and deals with the remote evaluation of continuous queries. ReactGraph – Part 1: Graphs and Reactive Computing – Historical Context What’s an IQbservable? In my previous post I mentioned that Reactor is based on the IQbservable abstraction. Given the importance of this interface in the exploration for a graph store with both “pull” graph querying and “push” reactive computing capabilities, perhaps we should look at it a bit more closely. The following table is often used in presentations to summarize the LINQ-related interfaces… IEnumerable. Abstraction for pull-based behavior against a collection/data source (e.g. LINQ-to-object) IQueryable. Abstraction for remoting the pull-based behavior against a data source (e.g. LINQ-to-SQL) IObservable. Abstraction for push-based behavior against a sequence of events (a stream) (e.g. Rx) IQbserable. Abstraction for remoting the push-based behavior against a sequence of events (e.g. Rx/Reactor) The top row represents “pull” queries. Such queries consider the data in the collection/data source at the time of their evaluation/execution. If we want to consider changes to the collection/data source since the last evaluation, we have to submit the query again. The second row represents “push” queries, or continuous queries. Such queries consider changes to the data as those changes happen. They operate over streams of data instead of collections of data. If I was to explain the above using code… IEnumerable<Post> feed = savas .Friends() .Where(f => savas.Follows(f)) .SelectMany(f => f.Posts().NodeValue<StatusUpdate>().OrderByDescending(p => p.DatePublished).Take(5)) .OrderByDescending(p => p.DatePublished) // savas.Friends() and f.Posts() are IEnumerables The above LINQ expression will be evaluated against the in-memory data source. If we make savas.Friends() and f.Posts() IQueryables, then the same LINQ expression tree will be sent to the remote data source, where it might be transformed to some other query language (e.g. SQL), for evaluation. In both cases, we trigger the evaluation of the expression via an enumeration operation… var result = feed.ToList(); // or foreach (var post in feed) { ... } If we wanted to observe an information stream in order to receive notifications when something changes in the underlying data, we can write an Rx LINQ expression that looks similar to the above. Since we continuously observe for events, we don’t need to order the data, even though we could create a time-based window and re-order the events. IObservable<Person> feed = savas .Friends() .Where(f => savas.Follows(f)) .Select(f => f.PostStream().NoveValue<StatusUpdate>()) .Merge(); // Friends() is an IObservable<Post> // Person.PostStream() is an IObservable<Post> The above LINQ expression tree represents a continuous query that, once subscribed to, will start emitting a stream of posts that make a user’s feed. When any of the friends create post an update, the subscribers will receive an update. Example: feed.Subscribe(p => Display(p)); The evaluation of the query will happen against the in-memory observable streams. If the Friends() and Person.PostStream() [...]



ReactGraph – Part 1: Graphs and Reactive Computing – Historical Context

2016-05-11T20:28:27Z

Over the last few weeks, as a spare time side project, I’ve been experimenting with a concept that has been circulating in my head for few years now. I’ve been trying to form an opinion, by writing code, around questions such as… What does a graph store with both “pull” …Over the last few weeks, as a spare time side project, I’ve been experimenting with a concept that has been circulating in my head for few years now. I’ve been trying to form an opinion, by writing code, around questions such as… What does a graph store with both “pull” querying and “push” reactive computing capabilities look like? What are the supporting abstractions/interfaces? Can it scale? Over a series of few posts I will explore the outcome of that investigation. My hope is to get feedback on the approach since I would like to capture the results in a paper. But first, some history to put my thinking in context… Project Detroit It was few years ago (2010-2011) when Erik Meijer and I worked on a no-SQL platform for data processing at Microsoft. Our goal was to support on-demand (pull) and continuous querying (push) queries on top of a document store (and eventually a graph store). We had map-reduce, expressed through LINQ, running on top of a distributed document store that also supported Rx for continuous queries. It was beautiful. Unfortunately, the priorities of our parent organization were such that “project Detroit” never became a product. Erik and I went our separate ways but we kept in touch. Zentity My continued fascination with graph stores started way before “project Detroit”, back when I joined Microsoft and Don Box’s group. I was reading a lot on knowledge representation and reasoning at the time. Then I moved to Microsoft Research where I designed and built the “Zentity” graph store to support the needs of the scholarly communication community. Zentity was heavily inspired by the ideas of WinFS and was built on top of the Entity Framework. Bing – Information Platform When I joined Bing, we had another go at a distributed graph store (amongst the other things that I was doing). We even had a natural language to LINQ-over-graph layer working. We supported media-related queries for the Xbox One voice search feature. I even presented the team’s work wearing the organization’s logo at the time :-) Unfortunately, while great technology, the project didn’t make it due to the risk associated with changing the existing, simple-but-not-as-capable platform. It was the right decision at the time. Savas as Shaun the Sheep with Gurdeep Singh Pall (now CVP of Skype) Nevertheless, many of the supporting ideas and code (e.g. the data model, an RDF-like data model, a JSON-based data serialization similar to the later-introduced JSON-LD standard, serialization of query expressions using the same data model) became the foundation of Reactor. Reactor Reactor is Microsoft’s large-scale, distributed stream/event processing platform used by Cortana to handle all types of near-realtime information. It’s based on Rx 3.0 that Bart, I, and others designed and built. Reactor can deal with billions of events, offering “at least once” semantics. Reactor is programmed used Rx queries. Think of Reactor as the execution engine behind an IQbservable interface (actually, there is much more to that but let’s keep the discussion simple for now). src="https://player.vimeo.com/video/90663123" width="640" height="360" frameborder="0" allowfullscreen="allowfullscreen"> The Bing Platform: More Helpful, Personal and Intelligent from Bing on Vimeo. Graph node and edges as information streams In my pre-Cortana presentations about personal digital assistants, I always made the case for them to be built in the cloud, close to a supporting information & knowledge platform that incorporates stream proces[...]



One Assistant, Personalized, Device Ubiquity, All Services

2016-05-09T20:56:41Z

I couldn’t agree more with Viv‘s principles as articulated by Dag Kittlaus in his presentation earlier today. I met with the Viv team about 2 years ago. I was very impressed by their leadership team and their work. However, Facebook managed to persuade me to join them instead.…

I couldn’t agree more with Viv‘s principles as articulated by Dag Kittlaus in his presentation earlier today. I met with the Viv team about 2 years ago. I was very impressed by their leadership team and their work. However, Facebook managed to persuade me to join them instead.

(image)

I totally subscribe to the vision of a single digital companion that follows the user across devices, across environments and contexts. Natural user interfaces will be the norm for interacting with services and information/knowledge.

The opportunities, challenges, and possibilities fascinate me!




Application protocol over a WebSocket?

2016-04-27T22:43:43Z

While working on a demonstrator app for the Reactive + Graph system I’ve been building in my spare time, I found myself wanting to implement a RESTful app protocol on top of WebSockets for in-browser app <-> service communication. I actually searched for “HTTP over WebSockets” but couldn’t find anything …

While working on a demonstrator app for the Reactive + Graph system I’ve been building in my spare time, I found myself wanting to implement a RESTful app protocol on top of WebSockets for in-browser app <-> service communication. I actually searched for “HTTP over WebSockets” but couldn’t find anything promising.

Does anyone know of anything in this space?

The idea is to use one-way messaging as the foundation and build request-response pattern on top. This way I can implement a “subscribe” operation which is necessary for streaming of messages from the service to the browser (and the other way around at some point :-)

My head got filled up with memories of all the discussions around SOAP/REST and Jim’s and my work on MEST and SSDL (cached version of the original site which is no longer on the web) from more than 10 years ago. Fun times.

Update: I should really be looking at an implementation of HTTP/2 since it has everything I need… single connection, one-way messaging, push from the server, and the familiar verbs/resource-oriented nature of HTTP over the same single connection.




The “A” in AI should stand for “Aspirational”

2016-03-26T04:51:58Z

Over the last few weeks, a lot of enthusiasm about the state of “Artificial Intelligence” (AI) radiated from the popular press as a result of AlphaGo’s win over the current world champion in Go, Lee Sedol. I remember a similar spark in the AI hype gauge when DeepBlue won …Over the last few weeks, a lot of enthusiasm about the state of “Artificial Intelligence” (AI) radiated from the popular press as a result of AlphaGo’s win over the current world champion in Go, Lee Sedol. I remember a similar spark in the AI hype gauge when DeepBlue won against Garry Kasparov. The reality, however, is that we are very far from building truly intelligent software. Many experts agree and have tried to manage down the generated hype. “However, we’re still a long way from a machine that can learn to flexibly perform the full range of intellectual tasks a human can—the hallmark of true artificial general intelligence.” Source: “What we learned in Seoul with AlphaGo” – Demis Hassabis, CEO and Co-Founder of DeepMind Few days ago we were treated with an “intelligent” chat bot called “Tay” from Microsoft. “Twitter taught [it] to be a racist asshole in less than a day“. A coordinated attack demonstrated how easy it is for Machine Learning-based software to fall over. This is because we are still lacking the ability to teach computers how to reason over basic philosophical concepts. That’s not to say that we can’t have a bot with racist personality. If that’s how it’s “brought up”, if those are the “values” that is given, then that’s fine. We still have lots of work to do in order to put such concepts in place. I applaud Microsoft for trying. Yes, they had an issue with their system which allowed attackers to move the focus away from the real goal of the experiment. I hope Microsoft returns to the experiment once a fix is in place. Building self-evolving, self-learning systems is an important step towards the advancement of such “intelligent” experiences. The situation reminded me of a slide I have been using for 6-7 years now in some of my presentations. Here’s a copy of it from my 2013 QCon presentation on “A Platform for all that we know”. (Variations of this spectrum have been used extensively in the literature. I am not the one who came up with it.) We are far away from building truly intelligent experiences. Perhaps the “A” in “AI” should stand for “Aspirational”, at least for few more years :-) [...]



Are you using a digital personal assistant?

2016-02-25T06:10:01Z

One of the design principles we established early with Cortana was the fact that a personal digital assistant is much more than just speech and conversational understanding, more than questions & answers, more than command & control of a device. By creating a deep understanding of the human over a …

One of the design principles we established early with Cortana was the fact that a personal digital assistant is much more than just speech and conversational understanding, more than questions & answers, more than command & control of a device. By creating a deep understanding of the human over a time can result in highly personalized experiences across user experiences, spanning devices and applications. I find myself having to explain this point all the time because it’s not immediate obvious to all. Many associate digital companions with cute conversational experiences that can give you the current time when you ask them, the weather in Seattle (a frequent question to Cortana during her early days of development), the score to the last Seahawks game, or a curated joke. Yes, all those are basic capabilities and are expected by digital companions these day. However, we can do so much better than that and, indeed, the current generation of digital assistants have already taken the first steps towards trully personalized experiences.

I asked few people today at Facebook… all iPhone users… “How often do you use Siri?”. I ask you to consider the same question. In most likelihood you are going to say “almost never” or “not that often”. However, you are using Siri’s capabilities more often than you realize. In fact, many times in a day.

Do you scroll from your app launcher screen down to reveal the search box for apps? Do you see the app suggestions there? Do you scroll to the left to reveal the suggested apps, contacts, and news? Have you noticed who powers these personalized and highly contextual experiences? Here’s a screenshot from my iPad as I type this post. Suggested contacts based on my phone and email conversations, app recommendations, recommended things around my locations, news…

(image)

Notice anything at the top left of the screenshot? Let me zoom in for you…

(image)

Yes… Apple has given a name to the “intelligence” that powers these suggestions. In fact, rumours today suggest that Apple is bringing Siri to the MacOS, a similar move to Microsoft’s introduction of Cortana to Windows. Yes… “intelligent” experiences have a name, a personality (sometimes… i am looking at you Google Now), and follow us across devices, screens, operating systems. And I argue that’s good for us.

Digital companions are more than natural user interfaces and question/answers, even though these are important-to-have capabilities. They earn our trusts by using that deep understanding for our benefit, by being useful and contextually relevant all the time, by being our life companions in the digital realm.




Sharing my thanks… PCs for my primary school

2015-10-29T19:10:44Z

Few years ago, the 3rd graders (at the time) from my primary school in Petinos (my village) reached out to me for a conversation/interview over Skype. I started following their progress and even visited them at the school on occassions. When I was in primary school, we didn’t have any …Few years ago, the 3rd graders (at the time) from my primary school in Petinos (my village) reached out to me for a conversation/interview over Skype. I started following their progress and even visited them at the school on occassions. When I was in primary school, we didn’t have any computers. I didn’t get exposed to home computers until I went to high school and only because of my parents and my love for arcade games (that’s a story for another time). It seemed that the situation didn’t really improve over the years even though there are more students at the school now. So I promised the 3rd graders that I would do my best to fix the situation.   (from my previous visit) The same kids are now in the 6th grade and the school has PCs, laptops, tablets, and networking infrastructure to help both the teachers and the students. Greece is in need of investments. I trully believe that there is no better investment than education and the young generation. Many thanks to Microsoft for matching my first of the two gifts (the process started last year) and to the Hellenic Cultural Center, through their Adopt a Greek School program, who helped me coordinate the donation here in the US and the transfer of the funds to Greece so that all the computer equipment could be purchased. Special thanks to Prof. Ioannis Kakadiaris and his daughter for making it happen. My biggest thanks goes to the school’s principal, Koula Tsiftsidou, for the wonderful work that she’s doing at the Petinos primary school :-) In my recent trip to Greece I got to visit the school and the kids again. They honored me by naming their small computer class after me. I was very touched. (photo credit www.xanthipress.gr) In the local news (in Greek) Local TV channel report www.xanthipress.gr article www.empros.gr article [...]



Wearable devices and natural user interfaces

2016-01-11T20:42:32Z

As an advertisement, I find the video below really bad. However, the portrayed product features are an example of the transition towards more advanced and standalone wearable technology. Device form factors get smaller and can host software that is capable of addressing many of our communication, entertainment, and information consumption/publishing …

As an advertisement, I find the video below really bad. However, the portrayed product features are an example of the transition towards more advanced and standalone wearable technology. Device form factors get smaller and can host software that is capable of addressing many of our communication, entertainment, and information consumption/publishing needs. Watches and other wearables, or even implants, are getting smaller, smarter, and more general purpose. Furthermore, they are getting decoupled from smartphones, in the same way that the smartphones today no longer depend on a desktop or laptop, as it was the case only few years ago.

class='youtube-player' type='text/html' width='700' height='424' src='http://www.youtube.com/embed/yybvO6KOU68?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent' allowfullscreen='true' style='border:0;'>

It’s a topic that I’ve touched in the past many times, both in presentations and in posts here. I don’t claim to have a great new insight. The transition to wearable technologies and implants has been extensively discussed by many. Nevertheless, I keep coming back to this because I am such a strong believer that speech, natural language understanding, and “intelligent” digital experiences are amongst the key enablers for the wide adoption of wearable (and implantable) technologies in the very near future. There is so much that we need to get right. I am excited about all the great things we can do!

Photo credit: adafruit / Foter / CC BY-NC-SA




Playing with move semantics in C++ – Part 2

2015-06-08T06:53:23Z

(Playing with move semantics in C++ – Part 1) In this second part, we take a look at what happens when an object stores a reference to another one, effectively not controlling its lifetime. An rvalue reference is required as an argument in order to convey the “I …(Playing with move semantics in C++ – Part 1) In this second part, we take a look at what happens when an object stores a reference to another one, effectively not controlling its lifetime. An rvalue reference is required as an argument in order to convey the “I am taking control of the object’s lifetime” semantics. Of course, a shared_ptr or unique_ptr could have also been used and some might prefer it, especially if access to the referred object is still required outside the context of the newly constructed one. We assume the same ExpensiveToCopy class from part 1. We first introduce the KeepsEtcRef class, instances of which need to refer to an ExpensiveToCopy instance. class KeepsEtcRef { public: KeepsEtcRef() = delete; KeepsEtcRef(ExpensiveToCopy& etcArg): etc(etcArg) { cout << "KeepsEtcRef: costructor" << endl; } ~KeepsEtcRef() { cout << "KeepsEtcRef: destructor" << endl; } void print() { etc.print(); } private: ExpensiveToCopy& etc; }; Let’s instantiate both classes making sure that the ExpensiveToCopy instance doesn’t get destructed while the KeepsEtcRef instance is still around. { cout << "KeepsEtcRef" << endl; ExpensiveToCopy etc; KeepsEtcRef k(etc); k.print(); } // output KeepsEtcRef ExpensiveToCopy (1.0): constructor KeepsEtcRef: costructor ExpensiveToCopy (1.0): contains 2 messages KeepsEtcRef: destructor ExpensiveToCopy (1.0): destructor What if the Large instance went away somehow? { cout << "KeepEtcRef outlives ExpensiveToCopy" << endl; ExpensiveToCopy* etc = new ExpensiveToCopy(); KeepsEtcRef k(*etc); delete etc; k.print(); } KeepEtcRef outlives ExpensiveToCopy ExpensiveToCopy (1.0): constructor KeepsEtcRef: costructor ExpensiveToCopy (1.0): destructor ExpensiveToCopy (0.0): contains 0 messages KeepsEtcRef: destructor No surprise! The data is gone. The KeepsEtcRef object outlives that to which it maintains a reference. While the program doesn’t crash in this case (since the vector object still exists), something more catastrophic could have happened. Resources were released. We could have ended up with an ugly crash. Can move help us? Let’s rewrite the container class… class KeepsEtc { public: KeepsEtc() = delete; KeepsEtc(ExpensiveToCopy&& etc): large(move(etc)) { cout << "KeepsEtc: costructor" << endl; } ~KeepsEtc() { cout << "KeepsEtc: destructor" << endl; } void print() { large.print(); } private: ExpensiveToCopy large; }; Notice the constructor requiring an rvalue, instead of a reference, as an argument. { cout << "KeepsEtc" << endl; ExpensiveToCopy etc; KeepsEtc k(move(etc)); k.print(); } // output KeepsEtc ExpensiveToCopy (1.0): constructor ExpensiveToCopy (1.1): move constructor (cheap) KeepsEtc: costructor ExpensiveToCopy (1.1): contains 2 messages KeepsEtc: destructor ExpensiveToCopy (1.1): destructor ExpensiveToCopy (1.0): destructor No surprises here. Worked like a charm this time :-) We do end up creating a copy of the object but we use the move constructor, which is cheap. What would have happened if we were to explicitly destruct the ExpensiveToCopy object after the move (i.e. not waiting for it to go out[...]



Playing with move semantics in C++ – Part 1

2015-06-08T06:50:03Z

(Kjell Schubert contributed to these posts with ideas, discussion, feedback, and corrections). I did a lot of C++ programming back in the 90s when the language didn’t have universal references, move semantics, lambdas, shared_ptrs, or any of the cool features that have been introduced since then. I moved to C# …(Kjell Schubert contributed to these posts with ideas, discussion, feedback, and corrections). I did a lot of C++ programming back in the 90s when the language didn’t have universal references, move semantics, lambdas, shared_ptrs, or any of the cool features that have been introduced since then. I moved to C# since it first became available and that was my programming language of choice until I joined Facebook. Oh boy am I old! :-) As a way of getting a deeper understanding of some of the new C++ features, I’ve been experimenting by writing toy code. I am sharing some of my notes related to C++’s move() and rvalue references so that experts can correct me or in case other C++ newbies find them useful. BTW… there is ton of related information on the web and in books… Just a search away. Let’s assume the ExpensiveToCopy class, instances of which are… expensive to copy (e.g. because they maintain millions of strings). class ExpensiveToCopy { public: ExpensiveToCopy() { log("constructor"); } ~ExpensiveToCopy() { log("destructor"); evolution = 0; } ExpensiveToCopy(const ExpensiveToCopy& etc): msgs(etc.msgs), evolution(floor(etc.evolution + 1)) { log("copy constructor (expensive)"); } ExpensiveToCopy& operator=(const ExpensiveToCopy& rhs) { msgs = rhs.msgs; evolution = floor(rhs.evolution + 1); log("copy operator="); return *this; } ExpensiveToCopy(ExpensiveToCopy&& etc) noexcept: msgs(move(etc.msgs)), evolution(etc.evolution + 0.1) { log("move constructor (cheap)"); } ExpensiveToCopy& operator=(ExpensiveToCopy&& rhs) { msgs = move(rhs.msgs); evolution = rhs.evolution + 0.1; log("move operator="); return *this; } void print() const { log("contains " + to_string(msgs.size()) + " messages"); } private: float evolution = 1.0; vector msgs {"hello", "world"}; void log(const string& str) const { cout << " ExpensiveToCopy (" << fixed << setprecision(1) << evolution << "): " << str << endl; } }; Let’s see what happens when we call a function that returns a closure. The closure captures an instance of the above class by value. auto func1() { ExpensiveToCopy expensiveToCopy; return [etc = expensiveToCopy] { etc.print(); }; }; { cout << "Get lambda with value capture" << endl; auto f = func1(); cout << "call lambda" << endl; f(); } //output Get lambda with value capture ExpensiveToCopy (1.0): constructor ExpensiveToCopy (2.0): copy constructor (expensive) ExpensiveToCopy (1.0): destructor Call lambda ExpensiveToCopy (2.0): contains 2 messages ExpensiveToCopy (2.0): destructor So, the object (evolution: 1.0) constructed in func1() was copied (evolution 2.0 created), then destructed, then the closure was returned, and then the copy was destructed. Can we avoid the expensive copy? One might immediately think to capture the etc instance by reference. auto func2() { ExpensiveToCopy expensiveToCopy; return [&etc = expensiveToCopy] { etc.print(); }; } { /[...]



We need all disciplines

2015-03-09T08:11:27Z

The “revenge of the nerds” short economist post links to a report about the “return of investment” for college degrees  There is absolutely no doubt in my mind that education is important and that it should be easily accessible to everyone. My concern about the economist’s tone in …

The “revenge of the nerds” short economist post links to a report about the “return of investment” for college degrees  There is absolutely no doubt in my mind that education is important and that it should be easily accessible to everyone. My concern about the economist’s tone in the post is that it promotes, perhaps unintentionally, science and engineering above other disciplines. Yes, I love science and I am a software engineer, so I am most likely one of the blue dots in the top right.

I am strong believer that for humanity to go forward we need all disciplines to be rewarded equally, we need arts as much as we need science, we need the humanities as much as we need computer science. We should be using such data to drive change instead of implying that science and engineering are a better option for the younger generation thanks to the promise of better financial rewards.

(image)

(image source: “Revenge of the nerds“)




Leadership insights from a NASA flight director

2015-03-04T06:26:55Z

(image)

Earlier today, I attended a talk by Gene Kranz (NASA flight
director during the Gemini
and Apollo programs).
I seriously enjoyed his insights into leadership, teamwork, org structure,
determination, focus, and TRUST amongst teammates. It was interesting to hear about
how information flowed to the mission’s leaders and how decisions …

(image)

Earlier today, I attended a talk by Gene Kranz (NASA flight
director during the Gemini
and Apollo programs).
I seriously enjoyed his insights into leadership, teamwork, org structure,
determination, focus, and TRUST amongst teammates. It was interesting to hear about
how information flowed to the mission’s leaders and how decisions were made.
Every aspect of the mission had to be analyzed and documented (side note: nothing
beats good documentation), processes were designed and captured for every
single aspect of the mission, checklists were created in advance, everyone was
the best at what they did, multidisciplinary teams, and so much more. It’s
amazing how many similarities exist in the way successful teams operate and the
attributes that make good leaders, irrespective of the discipline or the era.
His talk was based on his book “Failure is not an option: Mission Control from Mercury to Apollo 13 and Beyond“. 

Image source: Wikipedia




Hey Facebook

2015-01-06T05:35:28Z

Few weeks ago I said farewell to Microsoft. Today, while at the beautiful island of Grenada where Mary and I have been relaxing for the last week, I decided that it was time to write few words about my next chapter. Well, I will be joining Facebook at …Few weeks ago I said farewell to Microsoft. Today, while at the beautiful island of Grenada where Mary and I have been relaxing for the last week, I decided that it was time to write few words about my next chapter. Well, I will be joining Facebook at their headquarters in Menlo Park, CA. My start date is Jan 12th. For a software engineer who loves to work on services that need to scale and operate over huge amounts of data, Facebook represents the ultimate playground. One gets to work on all sorts of data graphs, information streams, near realtime processing, personalization, artificial intelligence, machine learning, knowledge representation & reasoning, proactive experiences (i.e. working on behalf of the user), and so much more. All with an aim to keep billions of people connected. I decided to join Facebook because of the opportunity to learn. I really wanted to get out of my comfort zone in terms of the technologies I use on a daily basis. I feel lucky to have been exposed to Bing’s world-class platform (not without its faults) for operating an always-on service at Internet scale. Now, I want to learn more about the decisions, technologies, infrastructure, and people behind yet-another world-class service, one that is being used by close-to-a-billion users on a daily basis. I have many ideas about new experiences and infrastructure services. All in due time, though. First, I have to go through Facebook’s bootcamp process. If Facebook crashes in the coming weeks, it’s probably going to be my code :-) I have already met some of the leaders at Facebook and, I must say, I am extremely impressed. I am looking forward to the many more new people I am going to meet and from whom I am looking to learn. I am also looking forward to experiencing the Silicon Valley vibe. I will be relocating to CA this coming weekend. I am going to miss Seattle so much! The move to a new company coupled with a relocation to a new state represents a huge risk, both professionally and personally. Wish me luck!   PS (internal joke, please proceed only if your name is Jim): Even though not part of my decision process, an added benefit of my move to Facebook is that I won’t be working for a software-producing or online service company that K is using. As a result, I cannot be blamed anymore for any issues, as Jim assured me :-) For the record, I will try my best to produce products that K will like or, even better, that young B will like when he gets older :-) Love you guys! [...]



Farewell Microsoft

2014-12-19T19:52:53Z

It’s been a wonderful 9 year-long stretch at Microsoft. I’ve had the honor of working with incredibly smart people. I learnt a lot. From Newcastle To Seattle I was a researcher at the University of Newcastle, working for Paul Watson (@paulwatsonncl). I will never forget the day …It’s been a wonderful 9 year-long stretch at Microsoft. I’ve had the honor of working with incredibly smart people. I learnt a lot. From Newcastle To Seattle I was a researcher at the University of Newcastle, working for Paul Watson (@paulwatsonncl). I will never forget the day that I received an email from Don Box (@donbox) telling me that he was “building a new tribe” and asking me whether I was interested in joining it. I was in London, at a workshop. I remember checking with Jim Webber to make sure that it wasn’t a hoax email since he knew I was a Microsoft and Don fan :-) I had to consider other job opportunities at the time, including a position at Microsoft Research in Cambridge. I asked various people for advice, including Jim Gray. As it was often the case, Jim’s message was short and to the point… “come to the mothership”. So I did. I relocated to Seattle in September 2005. Back then I didn’t know how to build products, I wasn’t familiar with the corporate world, I was impatient, and perhaps felt entitled. I learnt a lot during the first year working closely to Don, especially how to build a fun team culture. Microsoft Research I went back to a research environment after Tony Hey‘s invitation and Jim Gray’s encouragement. I joined Tony in Microsoft Research, which is an amazing organization. The concentration of research talent is unparalleled. I think it’s by far the best computer science research organization in the industry. We built new tools and systems to help researchers/e-scientists. I worked closely with the wonderful Lee Dirks and Alex Wade whom I consider my good friends. Unfortunately, Lee—an amazing person—died with his wife at a road accident while visiting Peru :-( Back to product groups Few years later, I returned to building products… Amongst my proud achievements, not all of which were released to the public: a cloud-based data-processing platform; an actor-based large-scale document store with reactive capabilities together with Erik Meijer (@headinthebox); speech and conversational understanding for Xbox One; the initial prototype work for Insight for Office; a distributed graph store and query engine; an industry-first distributed stream processing engine based on an evolution of Rx capable of hosting 100s of millions (and billions next year) standing queries, currently powering Cortana; and much more. My time in product groups has had its ups and downs. Success stories and disappointments. Some personal conflicts and many friendships. Definitely some mistakes on my part. Low and high points. Every single moment a learning opportunity. I now know to be humble, to provide and accept advice, to lead and follow, to build stuff instead of just talk about ideas, to put the team first, to be patient, to be a good mentor, to value life-long learning, and so much more. Cortana And then came the opportunity to build one of my dreams during my time in Microsoft Research… bring together systems that provide access to the world’s knowledge, are capable of understanding speech/language/conversations, can understand the user, can support processing of the world’s events in near real-time and at an incredible scale, plus all those other [...]