Starting RSS Graffiti

29 Nov
2009

A year ago, around January 2009, I was looking for a way to liven up the Fan Page I was maintaining in Facebook for Blues.Gr (the Blues social network I run on Ning). One easy thing to do, was obviously to post to the Facebook Fan Page wall, updates from Blues.Gr so that people can learn about what is going on over at Blues.Gr easily through their daily Facebook activity feeds. Best way to do that of course was to do it automatically by reading the RSS feeds available on Blues.Gr and posting any new entries to the Facebook Fan Page.

So I started looking for a Facebook application that would do just that. To my amazement I discovered that I could not find any application that would do the job in decent way (my definition of “decent” anyway).

Existing applications that I did not like enough included Social RSS, Networked Blogs, Involver, Facebook Notes and some others that I wouldn’t even consider.

I didn’t like Social RSS mainly for two reasons:

  1. I don’t like ugly user interfaces (they don’t make me feel good about myself, my taste etc.)
  2. It didn’t (at the time) use the Facebook Stream API and thus didn’t provide any distribution of posted stories to the news feeds of the Page’s fans etc.

I didn’t like Networked Blogs enough also mainly for two other reasons:

  1. It was a pain for me to claim the RSS feeds from my social network due to a number of silly restrictions that were out of my control including restrictions imposed by Networked Blogs itself.
  2. I felt it was built for a different purpose than the one I needed it for and frankly I didn’t even like the whole concept enough.

I rejected Involver apps because although it was an obviously serious professional effort, I found it to be ridiculously expensive for my non-for-profit activity in Blues.Gr and I was also unhappy with the fact that its functionality was broken down to many different smaller applications that were sold separately.

Facebook Notes was using the Stream API but it was not doing what I wanted to do. I wanted to post news from my site and directly link back to my site from my Fan Page. Notes was copying (importing) the news from my site to Facebook and then was distributing links to those copies instead. That’s not what I wanted. Moreover it didn’t look nice either. The format of the content was being messed during import and display and the whole thing just was out of the question.

So I thought why not write my own application for the job anyway? How hard could that be?

I started (on January 19th 2009), by writing a blog post on the internal blog I maintain for logging ideas with my business partner, and a few days later we decided to work on the project.

So RSS Graffiti was born. We initially called the project RSS Minifeeder (because at the time Facebook was calling the current “news feed” as “minifeed”). Later looking for a better name I came up with the word “graffiti” as representing the activity of writing on a wall (often in an aesthetically pleasing way). The .com domain was free; time was running out; hence the name “RSS Graffiti” was coined although it is not the most clear and straight forward name declaring what the application does.

Me and Dimitris started working on RSS Graffiti on January 21st, 2009, and devoted 16 man-hours per week to the project. RSS Graffiti version 1.0 Alpha was released 24 calendar weeks later (roughly 400 man-hours). RSS Graffiti version 1.2.1 Beta was the first version to be listed on Facebook’s Application Catalog (on August 22nd, 2009) and essentially it was the first version exposed to the open public (and thus we consider August 22nd 2009 to be the starting date of the application).

Four months later, RSS Graffiti is currently added to 17.000 walls, and actively publishes stories from 17.000 feeds to the walls of 2.500 Facebook Profiles, 5.500 Facebook Fan Pages and 500 Facebook Groups. These numbers are obviously a bit rounded up or down to be easier to read. They change by the minute anyway.

RSS Graffiti is still in Beta (current version is 1.8.0 Beta at the time of writing this) and is available as a free beta service while plans for premium services are also being considered for Q1 2010.

Now, before I forget about it, here is an idea that might be good for Spotify to look into: Synchronized streaming.

What would that be?

I think it would be quite cool (and viral) if Spotify allowed any number of users to listen to the same playlist in sync. Some user would start playing it and anybody who joins in would listen to the same thing at the same time as the one that started it first. This way multiple users could listen to the same music while interacting in other ways (i.e. chatting) as if they were in the same room.

Who would use that?

Well people do chat a lot. Many do group chats too. Especially younger people. They all have various IM clients to do it or go to online chat rooms etc. It would be very nice for people to be able to share music while sharing an activity like chat. They can share Spotify Playlists now but they cannot listen to the same thing at the same time without having all of them to synchronise manually for each song or playlist.

There are other uses I could think of but I think this generic case is good enough. For instance I would love to have that ability in the chat room of my blues music related social network where we meet and talk about music.

How would that work?

Well Spotify should be able to figure that out, but I guess a fairly straight forward way would be to have a special decorator on a regular Spotify URL that will instruct Spotify client to start playing the playlist not from its beginning, but from a specific point in a specific song designated by the server. The server syncs everybody’s client. This way, anybody that opens the playlist will hear the same thing as anybody else who is currently playing it.

Why would a thing like that succeed?

Well since Spotify works only through a client, it can be transparently available to all its users regardless of the thing they are doing. A feature like that will essentially integrate the use of Spotify with any collaborative activity, any of their users have, in any of the other independent systems they use. For instance chat on Windows Live Messenger while listening to music like they were on the same room. Users tend to get the easy solution to issues. And this is a really easy solution that catches most if not all similar uses.

What good would this do for Spotify?

Well if you read the paragraph above, it’s maybe obvious that Spotify will have a good shot of becoming  de facto standard in music sharing across any collaborative app. This will be a clear competitive advantage and will probably increase revenue by increasing listening hours and thus exposure to advertising for non premium members. Moreover if they get such a placement they could start working with some of the IM market players towards a technical integration too which could allow them to serve better targeted ads to their audience (though this can get too tricky). I’m sure they can think of even more benefits than these.

So, there you have it. If you like the idea then tweet about it or share anyway you please. It might reach the ears of Spotify and they might even like it too.

My social toolbox

10 Jul
2009

I started working on a map of my social toolbox in mindmeister. The purpose is to lay the tools I use out on a piece of “paper” and try to repurpose them, get rid of obsolete or redundant tools and arrive to a more usable and concise tools box.

The mind map is by no means complete but this initial version lays out the main tools I use to publish content, push news, share thoughts and interact with the world online.

Explore my social toolbox either in the embedded map bellow or by following this link to a full screen view.

 

That’s a famous quote by Voltaire, but sometimes I say it too. :-p

The problem is: I can’t always practice what I preach.

So, it’s been over a year since I last updated my blog! Mostly because I wanted to make it better. Bottom line? If you have a look at my blog so far, it can barely be called a blog. I posted 37 items including this one in 5 years! That’s one every other month or so.

Ok. I done a lot of things in the meantime. I never intended to be a blogger anyway. These are comforting thoughts. Nevertheless I wanted to have a good blog. And I always had lots of interesting things to share. Practical stuff and theoretical stuff too.

Anyway. I will take a note of my mistakes as far as my blog and my related activities are concerned, try to correct them and move on. So here is the list:

  • High expectations
    resulting in increased number of man-hours needed to accomplish the goals.
  • Indecisiveness
    resulting in an overload of tools and a lack of clarity in their roles.
  • Bad time management
    resulting in lack of a regularly allocated time-window for accomplishing goals.

Of these mistakes, the most critical was the last one: bad time management. The truth is I tried to correct this mistake in October 2008. I allocated three man-hours every Sunday night for working on lower priority personal projects. Nevertheless I had a more important project to which I diverted my attention since then (Blues.Gr) which had to take precedence because it involved people other than me. Still the mistake remains the same: bad (or “inadequate” to put it more gently) time management.

Indecisiveness was not so critical because had I allocated enough time for the for the job, I would have cleared things out first. What I could not decide about was what tools I should use and how to purpose them. There is a plethora of tools on the web for doing variations of mostly the same thing: publishing stuff. Eager to try new stuff I would very often add a new “must have” tool in my toolset making the function, purpose and utility of the rest of my tools obscure or even obsolete sometimes. I guess this is a common problem to a lot of people and actually I wanted to blog about the tools I use on the web and the purpose I have assigned to each of them.

Last but not least (which brings us back to the subject of this post) was my megalomania (to exaggerate a bit my thirst for notable accomplishments or even greatness). I always like to ask a bit more of myself than usual. Raise the bar a bit. It brings a challenge to everything and makes life more interesting. Nevertheless I didn’t hit the balance right on this one. I wanted to excel in my online interaction with the rest of the world, so I kept adding requirements and dependencies to all the tasks that related to my publishing activities.

So there you have it: Not a single blog post for over a year.

I’m not really all that fair to myself with this critique. To give me some credit I kept trying all this time to improve things on all fronts and I actually I achieved a number of goals. Still, I have to do better. So top priority now is get my online act together:

  • Drop any expectations that are unrealistic.
  • Clarify the utility of each of my tools and make the best of them.
  • Make some more time in my weekly “personal projects” time-slot by moving the Blues.Gr project out of it and delegating some of the maintenance work it requires to qualified volunteering members of the site.

These will allow my online presence activities to fit into the allocated time frame and hopefully I will have a more concise, consistent and admirable online presence.

Moving on.

ECDIS software

17 Mar
2008

I am working on two ECDIS projects in parallel. Both have to do with monitoring sea traffic.

As some details of the projects are confidential, I am not currently able to release any details on the projects themselves. But I can talk about my work in those two projects.

Project A:

The goal is to create a system that will help track ships that are involved in, or responsible for different types of events that can happen in the seas. For instance: an oil spill is located and reported somewhere. Authorities need to identify the vessels, suspect for causing the environmental damage.

The project approaches the problem by creating a system that will allow for sea traffic monitoring and then, correlating that information with earth observation (EO) data to produce a list of suspect vessels. Vessels are ranked by certain qualitative, quantitative and spatial criteria to help the user make the final decisions and identify the offending vessel using the hints provided by the system along with his/her experience and best knowledge.

What I am building for this project is a custom ECDIS system that implements all the functionality required for this application.

Sea traffic is monitored using a network of AIS receivers. AIS messages are temporarily recorded in local databases and transmitted in real time to a central database through web services over a VPN.

The ECDIS software I am building is using AIS signals to mark the positions of different vessels at specific points in time. It also provides a mechanism for importing and recoding vector data that come form EO sources (processed satellite imagery). EO data are used to identify event locations and possibly other detected targets in the area of the event during data capture.

The concept of the software developed is described below. I will post some screen-shots or a screen-cast when possible to support the description below:

The application window is divided vertically into two panes. The main pane (on the left) is the map pane where the ENC is displayed. The second narrower pane on the right is used for context sensitive information display. Both panes are tabbed for better information and functionality grouping. Application commands are available through main and context menus and toolbars.

Below the ENC pane there is a set of playback controls much similar to those you see in video players: a Play/Pause button, a timeline you can scroll, a playback speed selector etc.

All data recorded in the system (be them AIS messages, EO data or Events) are tied to a specific point in time and space.

The concept is that while the system’s database maintains historical sea traffic data for long periods of time, the user only needs to focus on a specific subset of those data related to a particular event. To enable this approach the application allows the user to select one of the recorded events to focus on. Focusing on an event implicitly means filtering AIS and EO data to a specific point in time and space. More accurately: around a specific point in time and space. This way the system loads only relevant data from the database which makes processing faster and consumes less system resources. Selection of the timeframe and area is made either implicitly and explicitly by the user during the selection of the event under investigation.

So keep in mind two concepts here:

  • the “investigated time-frame” which is essentially a period determined by a staring date/time and a length (duration)
  • and the “investigated area” determined by the central location of the event and a range in nautical miles around it.

All data that fall into the selected time and space are loaded into in memory data sets. But not all those data are concurrently displayed in the ENC pane. The AIS and EO data displayed in the ENC pane at any given time is a subset of the loaded data and is determined by:

  • the “focus time”
  • the length of the “visible time-frame”
  • and the view-port (which is identified by its center coordinates and range)

The “focus time” is equivalent to the playback position in a video player. As the user scrolls the timeline control to the left or right, the focus time changes.

The length of the “visible time-frame” refers to the time span before focus time during which all recorded signals should be visualized. For instance if the visible time-frame is set to 1 hour then the track behind a vessel’s “current” position will be displayed for the last hour (“current” being determined by “focus-time”).

The “view-port” is nothing more that the visible area of the ENC and is defined by means of panning and zooming the map.

Probably you are already getting the “big picture“: A system that will playback what happened around an event (i.e. an oil spill) and allow you to watch it like you would watch a video. What you see is what you would see if you were flying with a plane over the event at the selected time, only mapped in ENC, loaded with useful information and of course: interactive.

During playback, you can move around the map by zooming and panning, change the playback speed and generally interact fully with the application (all functionality remains available).

By pointing your mouse to a vessel’s latest signal or track you can see relevant information on the right pane of the application. Information available for each vessel includes all category 5 AIS message fields (ship static and voyage information), all fields of categories 1, 2 & 3 of AIS messages (position reports) and derived information based on algorithms and ranking databases, that help classify the ship and rank the probability of it being the offending vessel.

At the time of writing this project is in its final stages. It has been demonstrated to the customer and given their satisfaction it is pending some further development and optimizations before it is officially presented and delivered.

Project B:

Project B is an entirely independent project from Project A. Nevertheless, it is so relevant in context, that it is being developed in parallel. Actually so far I did not see a need to even branch the first project. Minor behavioral differences are handled very effectively through configuration files.

The goal of this project is to use AIS, VTS radar and EO data to identify certain types of vessels in the context of naval security.

AIS, VTS and EO data are correlated with data fusion algorithms and the results are again ranked by risk level.

My work in this project involves the creation of the visualization console. Data acquisition and fusion is handled by other project parties and the results of their work is just input data for my application.

The main difference from Project A is that this time, the software must be used mainly for near real-time monitoring. Playback is just a useful feature.

This project uses more sophisticated data sets and also includes estimated data. There are also considerable differences in data formats. All these had being handled properly during the design phase of the software and provisions where made so that it can read a wider variety of different data sources.

This project is also approaching its demonstration phase.

Technologies used in both projects include:

Apart from the above technologies these projects required extensive understanding of ECDIS, ENCs, AIS, VTS and EO related literature and of course engineering know-how in both software and earth sciences.

Both systems are being developed using Microsoft Visual Studio 2005 and C#.

XML CV

17 Mar
2008

This one is a personal project. It started a few years ago (somewhere in mid 2003), when I created my previous web site (same address, older technology), which was based on Windows SharePoint Services version 2.0.

Goal of the project was to create a single source CV for multiple platforms and applications.

Requirements:

  • Edit the CV content only once
  • Maintain the CV in two languages (English & Greek)
  • Use everywhere
    • web for online reading,
    • MS Word & Adobe PDF for distributing and printing,
    • whichever else application comes along as need

Obvious solution was: use XML and XSLT.

After browsing around for standards I discovered (back then), the XMLRésuméLibrary Project which defined an XML vocabulary for CVs along with a set of tools for visualizing and printing them.

I didn’t like the tools they provided as I wanted to approach the whole thing "the Microsoft way". So I just took the DTD from there.

First thing I tried was to create an InfoPath form from the DTD, but converting the DTD to XSD did not yield a solid reasonable schema. Would be nice to have an InfoPath form for editing my CV but the time needed to be devoted in creating a solid result was not worth the try. So I scratched that effort and decided to edit in straight XML.

Next thing I had to do was create an XSL transformation to visualize my CV on my web site. I wanted to maintain the layout and style of the CV I already had in Word format so I created the XSLT from scratch.

Now I had another problem to solve: I needed two versions of the CV in two different languages. There were three solutions to that problem. There was no provision for multilingualism in the XMLRésuméLibrary DTD so I either had:

  • to alter the DTD,
  • trick it somehow (using the "targets" attribute),
  • or just maintain two different XML sources one for each language.

I opted for the third approach (because actually I did not think of the second one at the time).

Maintaining two XML files was not the actual "problem". The problem now was maintaining a single XSLT as apart from content provided in XML I had to translate the static text of the CV (labels etc.)

To do that I used a separate XML (which I named Resources.XML) with a schema I defined for that purpose. This XML file included all static text in translated versions distinguished by a "language" attribute. The Resources.XML file was included by the XSLT using xsl:include and was referenced wherever needed being passed a parameter that specified the selected language.

So far I had the following files:

  • "My Resume.Greek.XML" containing the Greek version of my CV.
    This file had to be edited every time I needed to update my CV in Greek.
  • "My Resume.English.XML" containing the English version of my CV.
    This file had to be edited every time I needed to update my CV in English.
  • Resources.XML containing the labels used in my CV localized in both languages.
    This was a static file created once and never really had to be altered. Here is a sample part of the file:
    <?xml version="1.0" encoding="windows-1253" ?>
    <resources>
      <strings>
        <string key="CV">
          <translation language="Greek">Βιογραφικό Σημείωμα</translation>
          <translation language="English">Curriculum Vitae</translation>
        </string>
      </strings>
    </resources>
  • "My Resume.XSL" containing all the XSL transformation required to convert either language source of my CV to DHTML. This was a static file created once and only had to be altered whenever I needed to improve the style and layout of the output. Here is the rough structure of the XSL file:
    <?xml version="1.0" encoding="windows-1253" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html" encoding="greek" indent="yes"/>
      <xsl:key name="lookup-string" match="string"use="@key"/>
      <xsl:variable name="string-resources" select="document('http://rousso.gr/CV/resources.xml')//resources/strings"/>
      <xsl:template name="root" match="/">
        <xsl:param name="target" select="'freelancer'"/>
        <xsl:param name="language" select="'Greek'"/>
        <div id="myResume">
        </div>
      </xsl:template>
    </xsl:stylesheet>
  • "My Resume.Greek.XSL" which is a minimal file that just stets a variable indicating the selected language to Greek and includes "My Resume.XSL" to do the actual transformation. This file is static and never needs to be edited either. Here is the content of this XSL file:
    <?xml version="1.0" encoding="windows-1253" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html" encoding="greek" indent="yes"/>
      <xsl:variable name="language" select="'Greek'"/>
      <xsl:include href="http://rousso.gr/CV/My Resume.xsl"/>
      <xsl:template match="/">
        <xsl:call-template name="root">
          <xsl:with-param name="language" select="$language"/>
        </xsl:call-template>
      </xsl:template>
    </xsl:stylesheet>
  • "My Resume.English.XSL" which is a minimal file that just stets a variable indicating the selected language to English and includes "My Resume.XSL" to do the actual transformation. This file is static and never needs to be edited either. The content of this file is analogous to it’s Greek equivalent displayed right above. It just changes the value of the "language" variable to English.

These are the basic elements of my first XML CV solution. In practice I maintained a different XSLT for use in MS Word because the XSLT for the web included DHTML interactivity (JavaScript) and slightly different styling than what looked best for print.

All these were not as easy or straight forward as they seem. Problems I was faced with included:

  • Issues with MS Word integration:
    • CSS needed some tweaking to produce the results I wanted in Word.
    • I also had to have an automatically updating Word document. So I used just a Word field to include the XML and transform it on the fly and I also used a Word macro to to automatically update the field every time someone opened the file. Here is the field code:
      { INCLUDETEXT http://rousso.gr/CV/My Resume.English.xml
                 \c  XML
                 \t "http://rousso.gr/CV/My Resume.Word.English.xsl" }
  • Issues with SharePoint integration when moving to WSS 3.0:
  • See this relevant post for a clue.
  • Issues with PDF transformation:

    I never really tried to solve this one. I am still creating PDF versions by hand (by saving to PDF through MS Word 2007). I will have to look for an automated solution for this one in the future.

All these pretty much remain under investigation since they need some time and effort which the for the moment are not practically worth for.

So this about sums it up for the first phases of this project. Which brings us to 2008. Many things have changed since 2003 that all this started and even since 2006 when migration to WSS 3.0 caused me to re-investigate some of the projects details.

Today we have new things like: Europass, hResume and microformats, HR-XML specs, Linked-In, Xing and other Web 2.0 stuff. So the project is again being revisited these days on any spare time I can get a hold of for it.

What do I currently do?

  • I am making a new XSL to convert from XMLResume to Europass layout.

    This is being done purely for practical reasons.

  • I am considering the problems of integrating with Europass specs in general.

    This has a lot of implications as the two formats have fundamental differences. HR-XML is considered also along this path.

  • I am about to implement hResume in my existing and new XSL transforms.
  • I am considering the problem of integrating with Linked-In.

There are a lot of thoughts on these issues but I will not make more comments on them until I feel I have something concrete to say about them.

I decided to start posting about my current projects. Lot’s of times I promise myself that "I will publish something about this great project after I finish it". But, I never managed to keep those promises.

Why? Simply because there is always a next big thing after the last.

I came to realize that if I talk about my work a posteriori, then I have to make a case out of it and present it as such. That’s a big project on its own and needs time I don’t usually manage to find and devote. That’s often called marketing.

Still, work in progress is always worth a look at and at the same time is often more relevant to what other people are currently doing. So why waste all the energy I put in my projects, in just developing them, instead of adding a tiny extra bit of effort to let others know what work is in progress. That will add up to less than the time I need to publish a posteriori and at the same time, solve the problem of "no marketing".

The simple implementation of my "what do I do" series is just:

  1. use my blog
  2. add two or three categories to it

So I am adding these categories to my blog and start ASAP, then take it as it comes:

  1. Current Projects
  2. Projects On-Hold
  3. Past Projects

Work under way is going to be published under "Current Projects". As soon as something is history, it will move to the "Past Projects" category. Finally, as some projects are occasionally put on hold while others take precedence, I thought of adding a third category for them to move in and out.

This post will remain for reference as the oldest post in all three categories.

So here we go…

Well I might be silly, but I had not run-up to this one yet. Until just now:

You cannot change the accessibility level of a class member by means of hiding when inheriting from a generic type.

Consider this example. A simple console application using two classes: MyList inherits from List and My2ndList inherits from MyList. Generic type List has a public method named Add that is not declared as virtual.

My intention was to completely hide the base implementation of the Add method in my derived class. In other words, let’s assume that I want MyList class to not expose an Add method. What one would normally do in this case, would be to hide the method by using the new modifier and changing its access modifier from public to private like I tried to do in line 32 of the code snippet that follows.

Well. Guess what. This does not work if you are inheriting from a Generic Type. Try the code bellow then try to play around with the access modifiers in lines 32 and 47. Although I would normally assume that the code bellow would not even compile, it does!

using System;
using System.Collections.Generic;
using System.Text;

namespace TestGenerics
{
    class Program
    {
        static void Main(string[] args)
        {
            MyList myList = new MyList();
            myList.Add(1);
            myList.Add(2);
            myList.Add(3);

            myList.Print();

            Console.WriteLine("Now the 2nd List");

            My2ndList my2ndList = new My2ndList();
            my2ndList.Add(1);
            my2ndList.Add(2);
            my2ndList.Add(3);

            my2ndList.Print();
        }

    }

    public class MyList : List<int>
    {
        new private void Add(int item)
        {
            item *= 10;
            base.Add(item);
        }

        public void Print()
        {
            foreach (int item in this)
                Console.WriteLine(item.ToString());
        }
    }

    public class My2ndList : MyList
    {
        new private void Add(int item)
        {
            item *= 100;
            base.Add(item);
        }
    }
}

So why am I posting about this?

Well… I didn’t come across any comments on the subject on the Internet for the little I looked around and I thought it was an interesting thing to talk about.

If you know of any links discussing the subject and explaining the internals of the compiler or generics implementation in C#, then by all means please do leave a comment to this post.

If you’d like to copy paste the code above then go get it here.

I just discovered Leica TITAN Network. A geospatial data sharing, communication and collaboration network by Leica Geosystems.

Maybe you want to have a look at it here. It’s a free download.

fires.eware.gr

28 Aug
2007

A friend and I, just created a community web site dedicated to open discussions about the situation in Greece as it evolves from the flames that stormed the country these days. Find it in http://fires.eware.gr/.

top