Categories
About

Nodeta is a software development company that focuses on web software. We employ a highly agile and effective process. We have worked both on light independent projects and in the environment of large global enterprises.

Archives
Bookmarks
Meta

Flowdock screencast (+700 new invites!)

Mikael Roos, January 20th, 2010

It’s been a crazy busy winter as we’ve been developing our shiny new group collaboration web app, Flowdock. Up till now, we’ve had about 100 teams trying out Flowdock and today marks the moment when we ship out over 700 more invites to people who want to see how Flowdock could make their teams’ lives easier. Haven’t requested an invite yet? Add your email address at flowdock.com.

Here’s something brand new right off the presses: a Flowdock screencast, showing the most important and interesting parts of the app, briefly illustrates how Flowdock can make your teamwork immensely more efficient and simply flowing.

In the following days we’ll be posting about some new things we have in store for our users. So, stay tuned! Also, check out @flowdock on Twitter and our Facebook fan page.

2D Fisheye with JavaScript

Mikael Roos, December 21st, 2009



Well, it’s almost Christmas! With the holidays getting closer, I went through some dusty files and stumbled upon an oldie but goodie: a 2-dimensional fish eye element (technically it’s also quasi-3d, but whatever). It uses Prototype and Scriptaculous and is available on Github here.

It’s something I actually needed to write for work over a year and a half ago – can you imagine?

Merry Christmas to all from everyone at Nodeta!

Here’s the thing with chrismassy icons!

The free Christmas icons can be found from here.

Flowdock went Silicon Valley

Mikael Roos, November 5th, 2009

Me, Otto and Karri spent last week in California around the Bay Area promoting Flowdock and making connections. With us we had veritable crème de la crème of young Finnish entrepreneurs, including the founders of Powerkiss, award winning independent iPhone app developer Elias Pietilä (now from Qvik), and the CEOs from GrowVC and Mysites amongst others.

We had a great time, met awesome people and owe big thanks to the organizers of the trip, Aalto Entrepreneurship Society plus ArcticStartup. We especially want to thank Kristo Ovaska, Krista Kauppinen, Riku Seppälä and everyone who made the trip possible and awesome.

Flowdock went to Silicon Valley with AaltoES and ArcticStartup

Flowdock Press

We did a lot of press contacting to prepare for the public launch of Flowdock later this year and even gave an early video interview to ArcticStartup. Amongst tons of meetings we met with an insightful lady, Tanja Aitomurto, who blogs regularly to Helsingin Sanomat here (in Finnish) about what’s buzzing in the Silicon Valley and got to demo Flowdock to her and get her feedback.

We were also interviewed by Skype Journal in a bit of a controversial situation, where we ended up criticizing Skype as a collaboration tool for its lack of ability to make anything useful out of the information gathered with it.

From Silicon Valley we dove straight back into the slush of Finland’s beginning winter and Slush Helsinki 09, the aptly named startup event where we demoed Flowdock live to the public hordes for the first time ever. Here’s a video interview with Karri pitching Flowdock in Slush by FreejamTV.

How tags changed the way we work

Otto Hilska, October 28th, 2009

Flowdock is a real-time collaboration web app directed to teams. It allows co-workers to work together closely and coexist in the same space within their browser. Right now it’s going through an alpha stage where some 10 companies are trying it out and giving feedback.

The public beta is to be expected later this year. Before that we want to share some of the ways of using Flowdock with you. Today I’ll show you some ways to use one of the coolest features in Flowdock, tagging.

Lowering the barrier

We’ve noticed that lots of useful content is generated in instant Messaging, e-mail, Twitter and other medias. In a couple of minutes it may be totally forgotten, because it’s in no-one’s interest to structure that data to a wiki page, or even worse, to a Word document.

Imagine if logging a simple bug would mean just writing a short description to your group chat and ending the line with a #bug hashtag? With Flowdock’s team chat, that’s exactly how it works.

Flowdock team chat with tags

Tags can be added as hashtags or afterwards with a separate UI by anyone in your team. This helps you to ensure that all relevant content is tagged properly.

Information always accessible

All tagged content, including chat, files, content from e-mails etc. can be found using Flowser, an app-in-app of Flowdock for information management. When a bug is closed, for example, the user can simply remove the #bug tag.

When I’m looking for a screenshot of Flowdock for a blog post, I’m going to open Flowser and search for #screenshot. If I wanted to find screenshots only about our future promo site, I could just search for #screenshot #promo.

Searching for screenshots in Flowdock

All this has truly changed our way of working. Now I’ll never forget who’s managing contracts at one of our customers, because that information is tagged in our flow. And tagging that information didn’t cost me anything.

The Mentality of Incrementality

Mikael Roos, October 24th, 2009
Photo by ElbridgeGerry
Photo by ElbridgeGerry

We here at Nodeta work incrementally. We standardly split all of our development efforts into smaller and smaller increments in order to better grasp what is planned, what is achieved and how well the two match. We do small things to get big things done.

When you’re making a piece of software, the first version usually sucks. It doesn’t matter, if you whipped the software up in an afternoon, or if you spent thousands of man months to develop it from point Nothing to point Done, it’s gonna suck. Instead, you need to do it in small increments, and then you need to throw most of those increments away and do them again. The bigger the increment is, the more likely it is that it will be made of suck, and you’ll need to do it again.

You need to start with minimal features, then build. Test your ideas early with real users when possible and use that feedback to re-create.

In a personal sense, it’s not always so simple to adopt the concept of incrementality to your work process. Many would like to have their handiwork done, polished, framed and fixated before showing it to anyone.

Team members and incrementality

In Scrum, stories (which group smaller tasks in a single sprint) are given acceptance criteria, so that it’s easy to check how well the story has been completed or implemented. You can use these following criteria to either test your team or potential members for their abilities to work incrementally.

You, as a software developer, need to realize that your code is not valuable in itself, it is only valuable in what it can do, and if what it does is not useful that week, it has no value. No matter how long you pondered to find the best and most beautiful solution to the problem you had. Not even if your code flows down the misty meadows like a clear and concise natural language, if it is not a part of a proven feature, it’s worthless. You need to remove it and move on. Move to the next piece of code. You need to start feeling good about your ability to produce good code, and not about your code itself. Code proudly with the backspace!

You, as a manager, need to understand that your funky new features are worthless if the previous features haven’t been proven good by testing them with actual customers and actual users. Features have no inherent value. If you have a feature that reaks, you need to kill it fast and hop on the do-over train. You also need to appreciate the value of incremental development, and mold the day-to-day working environment to support it.

You, as a product owner, need to be able to plan well often and in variable scopes. Any project should have a road map, on what is sometimes called ‘epic level’. That means you take the contents of the project and try to define them in as broad as terms possible, without restricting development paths. Then you need to be able to chop these epic features up into pieces with the team, and prioritize, prioritize, prioritize.

Special feature

In software development, there are no manufacturing costs. That’s why do-overs are not only possible but smart. Incrementality is a special feature of software development, and one of the reasons why any comparisons to, say, construction development, lead to horrendous distortions of the truth. Think about it, if you could start building your house by simply setting up the planned facade and if you could then change it without material costs, wouldn’t you do it like that? Of course you would.

Meet Scalandra: Scala wrapper for Cassandra

Ville Lautanala, August 28th, 2009

Developing Flowdock, a real-time environment allowing teams to work together seamlessly, we needed a database able to scale horizontally for huge amount of write operations. Cassandra’s data model and performance characteristics made it a perfect fit for our needs. It is a distributed database with a data model slightly like Google’s BigTable. Cassandra was originally developed by Facebook to run their in-site messaging system, Inbox. If you want to learn more about Cassandra, Evan Weaver’s up and running with Cassandra is a good place to start.

In the beginning of July when we started to use Cassandra, there wasn’t any usable bindings for  Scala, which we use for Flowdock back-end, and hence we decided to develop our own. Two months later, the Thrift API is barely recognizable, but still bag of hurt in Scala. Others have also noticed this and developed their own bindings for Scala, but they all have slightly different approaches.

In Flowdock we use Scalandra to handle three tasks: wrap the Thrift API in a more painless interface, manage connections efficiently using a pool and to serialize and deserialize byte arrays, which are used in Cassandra to store data. In Scalandra you can use three levels of serialization to support all possible combinations of different data types in Cassandra data model.

Scalandra has two levels of interaction. At the lower level, it provides a similar API to the Thrift interface with commands for get, slice, insert, remove and count operations. Client API is meant to be used together with connection pooling to make sure that only a reasonable amount of sockets is opened. Unfortunately for our purposes, Scala doesn’t have RAII and because of that connections have to be managed more explicitly.

Assuming that we had a Cassandra instance running at localhost and it is configured to contain a standard column family “Users” in keyspace “Keyspace1″, we could use the Scalandra API to insert and read data like the following example.

import com.nodeta.scalandra._
import com.nodeta.scalandra.serializer.StringSerializer
import com.nodeta.scalandra.pool.StackPool

val pool = StackPool(ConnectionProvider("localhost", 9160))

pool { connection =>
  // Let's create a client which assumes everything is a String
  val client = Client(connection, "Keyspace1", StringSerializer)

  // Let's insert some data to Cassandra
  client.insertNormal(
    ColumnParent[String]("Users", "jsmith"),
    Map("first" -> "John", "last" -> "Smith")
  )

  // Slice all results from Column Parent
  // None parameters are lower and upper bounds for slice
  client.slice(
    ColumnParent[String]("Users", "jsmith"),
    None,
    None,
    Ascending
  )
  // Returns data from previous insert

  client.get(ColumnPath("Users", "jsmith", "first"))
  // Returns Some("John")

  client.get(ColumnPath("Users", "jsmith", "nonexistent"))
  // Returns None
}

As the Casssandra data model is basically a multi-dimensional map, we’ve built a Map-like interface to Cassandra. It is not very polished in its current state. Mutations work, but are not always intuitive to work with because they might require a Scalandra Map object as parameter. Using the previously inserted data, the map model could be used like this:

import com.nodeta.scalandra.map.StandardRecord
import com.nodeta.scalandra.ColumnParent

class User(protected val connection : Connection, key : String
 ) extends StandardRecord[String, String] {
  protected val path = ColumnParent[Any]("Standard1", key)
  protected val keyspace = "Keyspace1"
  protected val columnSerializer = StringSerializer
  protected val valueSerializer = StringSerializer
}

pool { connection =>
  val user = new User(connection, "jsmith")

  // User is basically the same map as inserted before
  user("first") // returns "John"

  // But also, slice actions exist
  user.slice("bar", "foo")
  // Returns Map("first" -> "John")

  // Insert value
  user("age") = "53"

  // John doesn't need to have a last name so let's remove it
  user -= "last"
}

Scalandra Git repository is located at Github. We’ve also generated Scaladocs to help with usage information.

If you have any comments or use this, please drop us a line. Also, patches are welcome :)

Flowdock update: Time-lapsed daily scrums

Karri Saarinen, July 21st, 2009

A quick update. Along with elegant git branching, we’ve been busy taking Flowdock forward.

To show you a bit about our processes, we have been recording our daily scrum stand-ups and now compiled it all to a single time-lapsed video.

As you can see in the video, in start of each sprint we have our stories, represented as white A5s and tasks as Post-its on the left side of the whiteboard. Stories are prioritized from top to down, top being the most important.

When a task—for example, “make a time-lapse video”—is put on the board, it’s moved from left to right according to the approximate amount of work done, measured in Zörgöns. On the most right is the “done” column, where tasks regarded as complete are moved.

Video holds about 4,5 sprints (10 weeks) of daily Scrums in 30 seconds. Check it out below.

Read the rest of this entry »

Announcing Flowdock – Real-time collaboration for teams

Karri Saarinen, July 5th, 2009

Flowdock
Today, we are happy announce our next product, Flowdock.

Flowdock is a real-time collaboration app that lets you work together as a team and talk things over smoothly and easily, all in the web browser.

What we want is to create a place for your team to share thoughts and work with each other, either formally or more casually over the web without the hassle of installing clients, fiddling with user names or zapping your productivity with annoying interruptions.

Armed with unobtrusive group messaging and a JavaScript platform for real-time collaborative apps, which we hope to help your team focus on your real goals. Flowdock can be used by just a one team or group inside your company—converting the whole company is not necessary.

In addition, Flowdock will present a full-fledged API at the disposal of third-party developers, allowing everyone to take advantage of our collaborative platform to the fullest extent.

Making web collaboration work

We are really excited about how Flowdock could change the process of communicating and working together at the office. Anyone working in a company without an IRC channel knows how hard it is to do even the most basic things like sharing interesting (*cough* youtube) links or figuring out the time and place for a lunch.

Also, when you’re drafting an important document, the chances are there are several people to have their say about it. Without a smart version control,  it’s rather painful. You send the document back and forth and at some point, somebody drops the ball and you’re all confused about which is the most recent version.

Usually you don’t know that well what others are doing unless you’re practicing Scrum, or a similar model with daily meetings. Even in that case you can’t be sure what others are working on right now, without bugging them about it.

Ville guiding Hannu and Raine through the inner workings of Flowdock

Ville guiding Hannu and Raine through the inner workings of Flowdock

Trying to solve these problems for ourselves last fall, we grew tired of the tools available and decided to make our own, starting with research on various Comet technologies, super-scalable message queuing and distribution, asynchronous storage and so on. Needless to say, implementing all this into web environment has not been trivial.

However, we put our man, Ville Lautanala, to work full-time on the research, and he subsequently started working on a Rails prototype. Now, with the help of the APIdock team we have managed develop a few sprints of alpha versions and at the time of writing, we are using it internally.

Flowdock will be available in this fall. Right now, you can go to our splash page and show your interest by subscribing to our mailing list. Later on, we’ll be able to let you know when we are ready to unveil the awesomeness we’ve been working on for the past year!

Also, you can subscribe to this blog or follow us on twitter to stay tuned on future developments, feature highlights and technical behind-the-scenes information.

Avoiding Rails session race conditions – now with PostgreSQL

Otto Hilska, March 27th, 2009

Long story short: Ruby on Rails session handling does have some concurrency problems. Especially with AJAX requests this is a very potential scenario:

  1. Request 1 loads user session
  2. Request 2 loads user session
  3. Request 1 stores something to the session
  4. Request 2 stores something to the session
  5. Request 1 writes its session data to the database
  6. Request 2 writes its session data to the database

Now, of course whatever request 1 wrote there is pretty much lost. These bugs are hard to find, and in my case the site had been in production use for 18 months before this really became a problem.

I soon found out that Frederick Cheung had already written a plugin called Smart Session Store to handle these race conditions by locking the session row when needed. However, it didn’t work with the latest PostgreSQL drivers.

I’ve fixed this to work with combinations of the pg/postgers driver and Rails 2.2/2.3 in my smart_session_store fork. The tests are also now actually testing something. I’ve sent a pull request, so everyone should be able to enjoy it soon.

It’s really a good practice to somehow handle session concurrency even before it’s a problem, because these kinds of bugs tend to appear when you least expect it.

We can test this by adding two actions to our controller. They should both write something to the session, and the other one should sleep a while to make sure that its changes are likely to be lost.

Search APIdock with Ubiquity

Mikael Roos, March 20th, 2009

The Firefox plugin, Ubiquity, is an awesome extendable Swiss knife command line of the web. The other day I noticed that Jack Dempsey had written a Ubiquity command for searching the Ruby documentation from APIdock. After quick googling, I found out that different people had done the same for Rails and RSpec as well, based on Jack’s command. Talk about community effort! Here are links to the Ubiquity commands (you need to have Ubiquity installed):