Introducing Friends!

The Friends Service provides an API for interacting with your social
networks. The friends service uses microblogging accounts configured in
Ubuntu Online Accounts.

Currently there are friends plugins for facebook, twitter, flickr,
foursquare and identica.

Sound familiar? Friends is actually a rewrite of the Gwibber service. It
began as an attempt to port gwibber-service to python3 and add testing, but
it quickly became obvious that it would be easier to start over. Credit for
the rewrite goes to Barry Warsaw and Robert Park, they rocked friends!

Impressively, Barry got the rewrite started by writing the test suite and using test
driven development, what a hero! Friends now has an extensive test suite and truly 
beautiful code.

The service provides a Dee.SharedModel that contains the aggregated feed
from all of your enabled accounts. Any application can connect to this
model and provide a user interface to display the feed. You can create
filtered models off that shared model to sort or limit the results to specific
accounts, types, etc. Your application never actually talks directly to the
web API provided by the social network, it would just interact with Friends.

This Dee model is currently used in the Friends lens, People lens and Gwibber.

The Friends service also provides APIs for sharing images, posting status
updates, replies, liking posts, retweet, contact sync, etc.

GObject APIs are provided by libfriends, including vala and GIR bindings (plus some GTK widgets). There is also a QML plugin, qml-friends.

All the packages are available in universe for raring, and for quantal in the super-friends PPA.

Here’s an example using Friends from QML posting a status update:


import QtQuick 2.0
import Ubuntu.Components 0.1
import Friends 0.1

MainView {
    applicationName: "poster"

    width: units.gu(50)
    height: units.gu(20)

    FriendsDispatcher {
        id: friends
        // use this to check if the send was successfull
        onSendComplete: {
             if (success) {
                 activitySpinner.visible = false;
                 entry.text = "";
                 console.log ("Send completed successfully");
             } else {
                 activitySpinner.visible = false;
                 console.log ("Send failed: " + errorMessage);
             }
         }
    }

    Column {
        anchors.centerIn: parent
        width: units.gu(40)
        spacing: units.gu(2)

        TextArea {
            id: entry
            objectName: "entry"
            anchors {
                left: parent.left
                leftMargin: units.gu(1)
                right: sendButton.left
                rightMargin: units.gu(1)
                bottomMargin: units.gu(1.5)
            }
            focus: true
            font.pixelSize: FontUtils.sizeToPixels("medium")
            font.family: "Ubuntu"
            // send message if return was pressed
            Keys.onReturnPressed: sendButton.clicked(null)
            Keys.onEscapePressed: text = ""
            height: units.gu(4)
            placeholderText: i18n.tr("Compose")
            autoSize: true
            maximumLineCount: 0
            ActivityIndicator {
                id: activitySpinner
                objectName: "activitySpinner"
                anchors.centerIn: entry
                visible: false
                running: visible
            }
        }
        Button {
            id: sendButton
            objectName: "sendButton"
            anchors {
                right: parent.right
                rightMargin: units.gu(1)
                left: entry.right
                bottom: entry.bottom
            }
            width: units.gu(9)
            height: units.gu(4)
            color: "#dd4814"
            text: i18n.tr("Send")
            onClicked: {
                console.log ("Post: " + entry.text);
                activitySpinner.visible = true
                friends.sendAsync(entry.text);
            }
        }
    }
}

Posted in GNOME, gwibber, ubuntu, unity | Leave a comment

New project, a dirt bike for Ashlyn

This year I’ve been getting my kids into riding dirt bikes.  I’ve had motorcycles most of my life, since I was about 6, so naturally I want more excuses to get out and ride.

I have a Yamaha TTR-250, and we had gotten a PW50 for Kaden (age 4) and CRF50 clone for Drew (age 7).  Of course Ashlyn (age 9) couldn’t possible let her brothers do anything without her, so she has been tagging along and riding Drew’s 50 every chance she could.  She is a older and a little taller than Drew, I figured I should look for something a little more advanced for her.  Drew’s bike has an automatic clutch, so next step up would be a manual clutch.

After a couple months of watching for the right bike on craigslist, I found just what I was looking for.

KC Motorsports (honda clone) 70cc motocross style dirt bike, looked a bit rough but in decent shape.

What did it have? Motocross style rear swing arm, disc brakes, 70 cc engine with manual clutch.

The frame had a little rust and the seat was nothing more than the plastic seat frame wrapped in tape. The engine ran fine, but needed a tune up and a little TLC. The rear brakes didn’t work, probably just a bad master cylinder.

The bike has plenty of potential, it really only needs a little work to get it out tearing up the trails.  I’m sure we’ll pass it down to her brothers when she out grows it, so I don’t mind putting a bit more work into it. So lets trick it out and make it look great!

So far I’ve replaced the rear brake line, changed the oil, replaced the seat, and the plastics. The original plastics that were on Drew’s 50 when he got it (replaced with green ones) are in great shape still, and much better than what was on this 70.  Not as flashy looking, we’ll get her a whole new set of plastics and decals.  She is looking for something pink, but the boys want her to do black with skulls.  I suspect she won’t be aiming to please her brothers.

This is enough to get her out riding and have some fun it. I’ve given her a quick lesson on using the clutch and she got in a little practice in the back yard. Next weekend we’ll take it to NC Outdoor Adventures and we’ll see if Drew’s 50 can hang with her on the trails.

This winter I am hoping to completely tear it down and make it really shine:

  • Paint or powder coat the frame
  • Replace the current 12″ front and 10″ rear rims with a 14″ front and 12″ rear
  • Engine dress up kit
  • Replace all the bolts, cables and hoses
  • Performance CDI
  • New pipe
Posted in Family, kids, motorcycles | Leave a comment

Gwibber logo concepts, opinions?

I’ve had a number of people suggest Gwibber could use a new logo, but nobody has actually stepped up and designed anything.  Recently I had the good fortune to chat with Abi Rasheed on IRC who volunteered to help.  He has put together a couple of great concepts, and we would like to gather some feedback.

I’ve posted the concepts on the wiki, please check them out and provide some feedback.

Thanks!

 

Posted in GNOME, gwibber, ubuntu, unity | Tagged , , , | Leave a comment

Social Networking in Ubuntu 11.10

Today I hosted an Ubuntu Open Week session on social networking in Ubuntu 11.10.  I decided to convert my notes from the session into a blog post, enjoy!

Ubuntu includes a social networking desktop service, Gwibber. Gwibber isn’t new to Ubuntu, it has been included for quite a while now. The intent isn’t just to provide a twitter or facebook client, but it is to provide a means for you to interact with your favorite social networks.

Gwibber does include a client application that aggregates the social networking sites you love to use, into one convenient place as well as allow you to post to multiple accounts simultaneously.

For 11.10, the Gwibber client received a complete face lift, in fact a complete re-write. The previous version had many great features, but ended up being quite limiting when we wanted to improve the overall user experience.

With the new Gwibber client, there aren’t really many new “features” however it is important to note not all previous features made it in. The most notable missing feature is the multi-column view, we’ll work hard to make sure it returns in Gwibber 3.4 in Ubuntu 12.04.

Now lets talk a bit about other ways you can use your favorite social networking services from Ubuntu.

Ubuntu Integration

Messaging Menu

  • Displays unseen counts
  • Update Status

Continue reading

Posted in Geek, GNOME, gwibber, ubuntu, unity | Tagged , , , | Leave a comment

Unity meet XChat-GNOME

Everyone already knows there is plenty of nice bling in Unity and we love it.  Well now we can get a little more, in the form of information displayed on top of the launcher icons.

This is a very simple addition that looks nice and adds useful information where it is easily visible without having to focus the application.  This is done using the new Launcher API in libunity.

Using this simple API, I added the unseen message count to the Unity launcher in xchat-indicator.  We’ll get similar support in empathy and evolution soon.  The API currently includes support for adding a count, progress bar, and quicklists.

If you want to try it out in xchat or xchat-gnome, packages are available in Natty.  Simply install xchat-gnome-indicator for xchat-gnome or xchat-indicator for xchat and enable the message indicator plug-in in the preferences.  You will get message notifications in the messaging menu as well as the count in the Unity launcher.

Posted in canonical, Geek, GNOME, ubuntu, unity | Tagged , , , | Leave a comment

Gwibber and Facebook, call for help!

For some time now I have been struggling with getting Gwibber working reliably with facebook.  Since Gwibber was included by default in Ubuntu, usage has gone way up and we quickly exceeded our API request allocation with Facebook.  Facebook allocations are per application, not per user, which means Facebook blocks API requests for everyone, not just the users which are refreshing too often, etc.

I have been desperately attempting to contact anyone from facebook to help figure out the best way to solve the problem and have been mostly ignored.  I did get one reply from their developer relations stating that they don’t “support embedding video content in our website at this time”.  Clearly they didn’t even read my email 🙁

I understand their need for allocations and to throttle as needed, however the numbers really don’t add up.  They are really skewed, there is one API request that we make which is way over the allocation, but the others are barely even on the chart.

Facebook just announced “Operation Developer Love” where they state they will stop ignoring developers and triage bugs.  Please help us get to the bottom of this by voting on this bug.

Posted in canonical, General, GNOME, gwibber, ubuntu | Tagged , , , | Leave a comment

I love what I do!

When people ask me what I do, I frequently answer with “The same thing I would do if I didn’t need to work for a living”.  I feel so lucky to have the opportunity to work full time on free software, and as I love to describe it, “helping to make the world a better place”.  I am just a small part in the effort to make free software common place, and I am proud to do my part.

Enough with the feel good stuff… What do I “really” do? 🙂

My role with Ubuntu is described as an Integration Engineer, what the heck does that mean?  Glad you asked, I work on the Ubuntu Desktop team, to help integrate the amazing work going on in the Design, Desktop Experience, and Ubuntu One teams into Ubuntu.  I help package their software, distribute updates, and advise and assist with design/architecture as it applies to how the software will be consumed by the user.  I care very much about how new features will affect existing and new users and how they will discover the new features.

As you can probably imagine, this is a lot of fun for someone like me.  I get to play around with new stuff that isn’t ready for the distro yet, helping out with testing and figuring out how it impacts our users.  Being a naturally born tinkerer, this is simply an awesome experience for me.

I also drive the Social from the start initiative in Ubuntu, trying to bring social experiences closer to the desktop, making the integration of their daily computer usage and their social life feel more natural.  I have very strong beliefs about web technologies and experiences, buy me a beer sometime and I can rant for a while.  Long story short, to provide the best possible experiences we need to remove the need to use the browser.  I don’t hate the browser, we can’t live without it.  But the best way to interact with your friends on social networks needs to be more contextual.  For example, you see a friend posted some new photos in an album.  You should be able to view that album in your local photo album viewer, as well as tag friends and comment on photos.  Why not do it in the browser you ask?

  1. Your browser probably already has a dozen tabs open doing anything from shopping for new shoes to making a reservation for dinner this weekend.  Do you really need another tab viewing photos?  What does that have to do with anything else your doing in that browser session?
  2. Perhaps your viewing photos of a friend’s kid’s first birthday party, you might want to view photos of your own child’s first birthday to reminisce.

Trying to make this possible, I spend as much time as I can contributing to Gwibber, trying to generalise as much as I can to make it a desktop service that can be easily used by any application.  Gwibber is a natural fit for this, since it aggregates multiple services, which is key to pulling this all together as a central service to handle this for the user.  Gwibber is also a great upstream project to contribute to, lead by the always awesome Ryan Paul.  He’s very open to my ideas, and easy to work with.  At the beginning of each development cycle I get to brainstorm ideas with him and figure out how I can best contribute to making the road map a reality.

For someone like me, it is pretty easy to have fuzzy lines between what I do during my day job and what I do just for fun.  In the evenings or over weekends, when I am not off hanging out with the family, I usually end up hacking on Gwibber or libgwibber for fun. 🙂

Posted in canonical, free software, General, gwibber, ubuntu | Tagged , , , | Leave a comment

Introducing libgwibber, lets make the Desktop social!

For a while now I have wanted to make it easier for desktop applications to integrate more with social networks, enabling users to easily interact with their friends in many different contexts.  Could be posting a status update based on the context they are in right now, commenting on a friends photo while browsing their Facebook photo album in Shotwell, etc.  Let me introduce libgwibber!

A brief introduction to libgwibber, a library (C, vala, mono, and python) for using the Gwibber Service as well as provide some GTK widgets to easily embed into existing GTK applications.  Bindings for as many languages as possible was very important to me, I really want to make it as easy as possible for any desktop application to use Gwibber as a desktop service.

The API currently provides access to the common things an application developer might care about:

  • signals for service availability and account changes
  • refresh
  • start and stop gwibber-service
  • retrieving accounts
  • toggling send_enabled status on an account
  • looking up an account
  • posting a status update
  • URL shortening
  • retrieving the version of the current running gwibber-service

I just finished porting the MeMenu from the Ayatana project to use libgwibber, which will be in the next release.

So far libgwibber-gtk includes just one widget, a posting entry.  This widget includes:

  • A TextView
    • with an overlay character counter
    • built in URL shortening
    • integrated with NetworkManager, disabled when in offline mode
  • AccountTargetBar
    • includes toggle buttons for each account, connected to signals to track the current status globally
  • Send button

Some examples of the Gwibber entry widget can already be found embedded in the Ubuntu Software Center and the Ubuntu One Music Store plugin in rhythmbox.

Other widgets I hope to add in the future include:

  • stream view (message view of any stream)
  • stream navigation
  • search
  • friend browser (browse friends based on type of content, like friends with images that can be displayed in shotwell or f-spot)
  • profile (view your own or someone else’s profile)
  • comment (comment on various types of shared content, photos, links, etc)
  • image uploader

I would love suggestions for these or others, please let me know!

Some GTK examples:

C example

entry-c.c
To build entry-c.c:

gcc `pkg-config --cflags gwibber-gtk` entry-c.c `pkg-config --libs gwibber-gtk` -o entry-c

Vala example

entry-vala.vala
To build entry-vala.vala:

valac --pkg gtk+-2.0 --pkg gwibber --pkg gwibber-gtk entry-vala.vala

Mono example

entry-mono.cs
To build entry-mono.cs

gmcs -target:exe -out:entry.exe -pkg:gwibber-gtk-sharp-0.0 entry-mono.cs

Python example

entry-python.py
Nothing to build, so just run it with:

python entry-python.py

Here are some examples of using libgwibber with python and gobject introspection:

# Import Gwibber using introspection
from gi.repository import Gwibber
# Get a service object
service = Gwibber.Service()
# Get the current Gwibber version
version = service.version()
# Make the Gwibber service refresh
service.refresh()
# Post a status update to all your enabled accounts
service.send_message("Something very interesting here, blah, blah, blah")

Some applications I would love to see use libgwibber:

Shotwell and F-Spot: Browse online photos from your social networks from right inside you existing photo library tool.  Including the ability to comment, tag, like and share.

gnome-utils: Add image upload support to gnome-screenshot

Evolution: Display the last status update from a contact when viewing an email or browsing contacts.

GTG: Status updates when tasks are complete

I am generating gtk-doc docs for libgwibber, but they aren’t very useful yet.  libgwibber is written in vala and I haven’t figured out a way to get docstrings to pass from vala to the generated C.  If anyone knows how to do that, please let me know.

Hopefully people find libgwibber useful, please let me know if you have suggestions, bug reports, or want to contribute!

Posted in Geek, General, GNOME, gwibber, ubuntu | Tagged , , | 2 Comments

XChat-Indicator

I recently released a plugin for XChat-GNOME (and XChat) which adds support for the messaging menu in Ubuntu. This was a fun little side project of mine, I use xchat-gnome very heavily and have really been craving integration with the messaging menu.

When I started working on this, I wanted to make sure it was a standalone plugin that didn’t need to be built inline with xchat sources and didn’t require changes to xchat. In the process I ran accross a couple pieces of the XChat plugin API that hadn’t been implemented in xchat-gnome yet. This meant of course I needed to patch xchat-gnome, and send those patches upstream.

Both of these were trivial changes to xchat-gnome, and I didnt expect any problem getting them accepted. I had to implement the “GUI FOCUS” command which has been merged already (bug).   And I had implement the win_ptr argument to xchat_get_info, which lets the plugin get a pointer to the GtkWindow (bug).

Overall I am very impressed with the plugin API for XChat, it is really awesome to be able to get access to the GtkWindow.

Messaging Indicator with XChat-GNOME

If you are running Lucid or Karmic, you can install it from from my xchat-gnome PPA:

sudo add-apt-repository ppa:ken-vandine/xchat-gnome
sudo apt-get update
sudo apt-get install xchat-gnome-indicator

If you use xchat instead of xchat-gnome, just change the package name in that last command:

sudo apt-get install xchat-indicator

To get the source, file bug reports or feature requests, check out the project page on launchpad.

Posted in GNOME, ubuntu | Tagged , , | Leave a comment

Gran Canaria Desktop Summit 2009

I really enjoyed my week in Gran Canaria with all the desktop hackers, it was a great event. Such a great location for a conference. It is great to see such innovative stuff going on for the desktop. This year it was a joint event between GNOME and KDE, which I think was a great idea. However, I really don’t feel like I had enough opportunity to mingle with KDE folks and attend their sessions. I hope we can do more in the future to encourage that.

I think the most interesting thing for me was Telepathy. The telepathy sessions were very impressive, and I spent some great time with the awesome team at Collabora, keep up the great work! I’ll just say it… tubes just make me drool, so much potential to be tapped into. Hopefully after this week, more people are inspired to go out and create amazing stuff that uses telepathy.

Zeitgeist really interests me as well, I have been wanting an easier way for users to interact with their data. Personally I think all interaction with data should be contextual, present the data to the user based on what they most likely want. I can’t wait to see Zeitgeist become integrated in the desktop and really start to blow the socks off of our users.

GNOME Shell is certainly interesting, I am very excited to see people trying to really change they way the desktop behaves. Lets not be afraid to shake things up a bit. However, I am not sold on it yet though. I think there are many issues that still need to be worked out, can’t imagine it can be designed properly and implemented in time for 2.28. I know it won’t be default in 2.28, but I think some of the basic work flow stuff needs to be nailed down before it can be released. It really seems far from that now. It will be exciting to watch it evolve and see how it ends up.

Last but certainly not least, CouchDB. There was some cool demos showing live bookmark syncing in firefox as well as contacts shared between both GNOME and KDE applications (evolution and akonadi). Using CouchDB as a common desktop database for storing configuration and application data makes it very easy to synchronise that data between multiple computers. Just imagine having the same bookmarks, contacts, photos, music, etc all shared between all your computers automatically.

Of course there were plenty of great parties and hacking sessions. The Igalia and Collabora parties were a blast, and two nights we spent hacking on stuff in the hacking room all night. Who needs sleep?

Posted in GNOME, ubuntu | Tagged , , , | Leave a comment