Klipfolio. The KPI Dashboard - Evolved
The KPI Dashboard – Evolved
1-877-233-6149
Contact Us

KlipBlog / development.

The official Klipfolio weblog.

It's been a big year for us here at Klipfolio, and we're ending it on a high note.

Dec 22, 2011, by Jonathan Taylor

Year in review -- Top 5 new features for mobile KPI dashboard

It's been a big year for us here at Klipfolio, and we're ending it on a high note. The latest round of updates added some important new features to the Dashboard that have been requested by our customers. I have to admit I am kind of excited about some of these cool features, and want to share them with you. I've also made a video to show off these features that you can watch on our YouTube channel.

Let's take a look at the top 5 new features and how they affect the way you work in Klipfolio Dashboard:

Top 5 new features

  1. New threshold indicator conditions

  2. Setting a threshold for your Klip is a great way to stay informed on the health of a given metric. A common threshold will cause your value to turn red when it falls below a predetermined number. If you are using a web accessible resource with a refresh rate, then this will happen automatically as changes are made to your source file (such as on Google Docs). The addition of new threshold conditions increases your ability to use indicators to monitor of your operational performance.

  3. Share your Klip when you save it

  4. Good things come in small packages. This is a small change to your work flow, but one that I think everyone will appreciate. After you are finished building your Klip, you will be prompted to share that Klip with other people in your organization. This time-saving feature makes sharing your metrics and KPIs quick and easy. Rather than having to go back and find specific Klips to share with people in your organization, you can share those Klips right away.

  5. New features for table Klips / Spreadsheet selector

  6. Table Klips now support column border control allowing you to customize your tables by emphasizing the role of a certain column. In addition to this, new column header features provides the option to use the first row of data as your header or to exclude the header altogether.

    The spreadsheet sheet selector (say that five times fast) gives you access to all the sheets on any Excel file you are using to build a Klip. This is a pretty cool feature, because it lets you select data from multiple sheets to use in a single Klip. (Check out the how to article)

  7. The Library User Interface

  8. The Library has received an important facelift and as a result is much more streamlined and user friendly. The new user interface provides filtering, sorting, and search functions to help you quickly find your Klips, tabs, and data sources. Also, the Library now provides additional information about each resource you can access. For example, each data source can tell you at a glance what type of resource it is (e.g. Google Docs) and the format of that data (e.g. spreadsheet).

  9. Use Facebook as your data source

  10. As a contributor to Klipfolio's social media presence on Facebook, I can admit my bias when it comes to ranking this feature number one. This feature lets you access any data stored on your Facebook account, plug it into Klipfolio Dashboard as a JSON file, then use it to build a Klip.

    Using the Graph API Explorer or FQL (Facebook Query Language), you can extract lots of great information from Facebook. You can use the Graph API to access your feed and plug it into a News Klip (here's the how to article). Or, you can query Facebook Insights to help you monitor the daily performance of your organization's Facebook page.

Honourable Mention -- Support for first time users

The first time you log into Klipfolio Dashboard you will be able to watch an introductory video overview of the application. If you missed the video on your dashboard, just check the help file home page to watch it for yourself or you can watch it on our YouTube channel. Another cool support feature is the guided walkthrough for getting your data into the application and using that data to build a new Klip. Learning a new application can be a challenge -- our goal is to make it as easy as possible.

posted in:   |   add comment

The "undocumented files": What to do with big, big numbers

Mar 15, 2011, by James Scott

Screen space is a precious commodity. As a KPI dashboard vendor, we understand that.  We are always thinking about how to design for density without compromising usability, experience, and value. So what happens when you are working with very large numbers in tight spaces? All those zeros are just not adding real value. You use an "undocumented feature" called abbreviation (abbr) in your Klip CSS. Here is an example of how you apply it a column of numbers in the style block of your Klip:

<style> revenue {
type: number;
format: "abbr"; }
</style>


This will display values as sortable numbers while automatically displaying "magnitude" as a suffix.

200.5 / 200.5
1500 / 1.5k
2500000 / 2.5M
3500000000 / 3.5G
4500000000000 / 4.5T
5500000000000000 / 5.5P
6500000000000000000 / 6.5E
7500000000000000000000 / 7.5Z
8500000000000000000000000 / 8.5Y

Just a quick caution: This feature is being shared with no additional documentation and ahead of conclusive testing.

 

posted in:   |   1 comments

KPI visualization: I like what I know.

Mar 14, 2011, by Allan Wille

School was a long time ago, and as with most things that history puts in the spin cycle, I have remembered only the brightest and darkest memories. The word play “I know what I like: I like what I know” was one of these memories that continues to help me understand how people approach new ideas, products, and constructs.

I was sitting in on a new customer kick-off meeting last week. In the back-and-forth dialog, it became apparent that they were focused on a particular type of visualization – one their users had become familiar with. There is value in familiarity; tremendous value, in fact. The energy needed to change user behaviour can be quite a hurdle.

However, the use cases that they were sharing with us did not support their chosen visualization. Here is a brief synopsis of their situation:

  • Sizeable and geographically distributed sales organization
  • Three levels of hierarchy, from VP to sales reps
  • Requirement 1: Visualize “performance to plan” and “month over month trend”
  • Requirement 2: Group regions and offer visibility into underlying data
  • Requirement 3: Easily compare regions and reps by performance and trend
Two KPI Klips in one Klipfolio Dashboard

They were familiar with line charts, and as such had managed to plot monthly bookings compared to quota on a monthly basis. This does satisfy requirement 1, and to some extent, number 2 as well. However, this visualization choice does not easily allow users to explore the underlying data, or compare regions and reps.

We showed them an alternative solution; a drill-down Klip, where the data was aggregated first by region, then by rep. The individual regions or reps can be visually compared and sorted against one another with calculated sums and averages. We had opened their eyes to a new way of presenting their sales metrics.

The original question, however, has more to do with influencing behaviour. Our customer could proceed and offer their users only the new Klip. But why not also include the old visualization, as a separate Klip? Each would provide different value and complement one another, after all. And this way the dashboard would be less likely to be perceived as a threat to the familiar, the status quo. Give users something familiar, as well as something new.

As for me, both visualizations have their place on my KPI dashboard.

posted in:   |   1 comments

ODBC XML Path

Mar 03, 2011, by James Scott

It's been a busy week of meeting with clients and prospects here. These meetings are always interesting, and often we end up talking about the same sorts of things - getting data using ODBC being one of the most common.

If you are connecting to a Microsoft SQL Server database through ODBC, you are likely familiar with the unusual "z:row" attribute based formatting of the response. (Or even worse if your column names have spaces or other symbols in them.)

It can be challenging to pick that response apart and get your data into a useful form.

Here is a little known trick that will simplify your Klip building process significantly. By using the Transact-SQL "FOR XML PATH" command, you can have your database return very cleanly formatted XML. This makes it a breeze to write effective CSS.

More details can be found in the MSDN article: What's New in FOR XML in Microsoft SQL Server 2005

Here is an example: Using the AdventureWorks DB sample, add "FOR XML PATH" to the end of the Sales.vSalesPerson view's query and you'll get back XML like this:

<row>
  <SalesPersonID>268</SalesPersonID>
  <FirstName>Stephen</FirstName>
  <MiddleName>Y</MiddleName>
  <LastName>Jiang</LastName>
  <JobTitle>North American Sales Manager</JobTitle>
  <Phone>238-555-0197</Phone>
  <EmailAddress>stephen0@adventure-works.com</EmailAddress>
  <EmailPromotion>0</EmailPromotion>
  <AddressLine1>2427 Notre Dame Ave.</AddressLine1>
  <City>Redmond</City>
  <StateProvinceName>Washington</StateProvinceName>
  <PostalCode>98052</PostalCode>
  <CountryRegionName>United States</CountryRegionName>
  <SalesYTD>677558.4653</SalesYTD>
  <SalesLastYear>0.0000</SalesLastYear>
</row>

<row>
  <SalesPersonID>275</SalesPersonID>
  <FirstName>Michael</FirstName>
  <MiddleName>G</MiddleName>
  <LastName>Blythe</LastName>
  <JobTitle>Sales Representative</JobTitle>
  <Phone>257-555-0154</Phone>
  <EmailAddress>michael9@adventure-works.com</EmailAddress>
  <EmailPromotion>1</EmailPromotion>
  <AddressLine1>8154 Via Mexico</AddressLine1>
  <City>Detroit</City>
  <StateProvinceName>Michigan</StateProvinceName>
  <PostalCode>48226</PostalCode>
  <CountryRegionName>United States</CountryRegionName>
  <TerritoryName>Northeast</TerritoryName>
  <TerritoryGroup>North America</TerritoryGroup>
  <SalesQuota>300000.0000</SalesQuota>
  <SalesYTD>4557045.0459</SalesYTD>
  <SalesLastYear>1750406.4785</SalesLastYear>
</row>

Which is trivial to take apart with Klipfolio Dashboard's CSS processing:


<style>
  SalesPersonID { type: text; itemcol: 1; }
  FirstName { type: text; itemcol: 2; }
  LastName { type: text; itemcol: 4; }
  SalesLastYear { type: number; format: "currency"; itemcol: 5; }
  SalesYTD { type: number; format: "currency"; itemcol: 6; }
  SalesQuota { type: number; format: "currency"; itemcol: 7; }
  row { type: item; definition: all; }
</style>

For reference, here is the new query:

USE AdventureWorks
SELECT  s.SalesPersonID, c.Title, c.FirstName, c.MiddleName, c.LastName, c.Suffix,
        e.Title AS JobTitle, c.Phone, c.EmailAddress, c.EmailPromotion,
        a.AddressLine1, a.AddressLine2, a.City, sp.Name AS StateProvinceName, a.PostalCode, cr.Name AS CountryRegionName, st.Name AS TerritoryName,
        st.[Group] AS TerritoryGroup, s.SalesQuota, s.SalesYTD, s.SalesLastYear
FROM    Sales.SalesPerson AS s INNER JOIN
        HumanResources.Employee AS e ON e.EmployeeID = s.SalesPersonID LEFT OUTER JOIN
        Sales.SalesTerritory AS st ON st.TerritoryID = s.TerritoryID INNER JOIN
        Person.Contact AS c ON c.ContactID = e.ContactID INNER JOIN
        HumanResources.EmployeeAddress AS ea ON e.EmployeeID = ea.EmployeeID INNER JOIN
        Person.Address AS a ON ea.AddressID = a.AddressID INNER JOIN
        Person.StateProvince AS sp ON sp.StateProvinceID = a.StateProvinceID INNER JOIN
        Person.CountryRegion AS cr ON cr.CountryRegionCode = sp.CountryRegionCode
FOR XML PATH

What are your thoughts? Do you have a better way to get at your data? Share it with us, and we'll share it with the community.

posted in:   |   4 comments

Klipfolio Dashboard 6.0 is now available!

Feb 16, 2011, by kfdev

Klipfolio Dashboard version 6.0 is now available. This latest release offers more flexibility, making it simple to refine, filter and find information in Klips on the dashboard.

Selectable date ranges offer greater control over the selection of data for a specified timeframe. In addition to date ranges, conditional filtering provides a powerful way to focus the resulting dataset.

Multiple filters can be applied to text or numbers easily, using contextual variables, making it simple to get a very granular view of business metrics, isolate problems and identify trends.

For a full listing of the new features, refer to the Release Notes.

Don't forget to check out the new and updated how-to articles!

posted in:   |   add comment

Ten Things to Look for when Testing your Klip

Nov 22, 2010, by Peter Matthews

Getting close to unleashing your Klip on the world? Then you're probably in the testing phase. And while you are, take a look at the top ten things we look for when testing every Klip we release.

1. Are all user-configurable settings working?
This seems pretty obvious, but it's easy to overlook small bugs in your script. Does every checkbox add the appropriate content? Does every filter setting work? Try every combination and permutation you can think of. If you don't chances are someone else will.

2. Are all user-configurable settings being saved across sessions?
This one hits Klip developers all the time. Are all configurable settings being saved across sessions? If you set the Klip up a specific way, exit and restart KlipFolio, are the settings intact?

3. How does the Klip look when resized down?
Often when we develop Klips we have them set to be really large onscreen. It's sometimes a surprise to see them resized to smaller dimensions. Are items wrapping when they shouldn't be? Are column priorities appropriate? Try your Klip at all sorts of dimensions and see if it's still usable.

4. Are debug alerts turned off?
No user wants to be interrupted by debug alert dialogs they can't decipher. Make sure all of your alerts are removed or commented out.

5. Are there any typos in the Klip Setup dialog?
Take a minute to read all the text in your Klip. Even simple little typos can have a serious impact on a user's perception of your work. It doesn't take long.

6. Do the "No Data" and "Loading" messages make sense?
By default, Klips will display "No Data." when there are no items to display, and "Loading..." when it's doing work. For your Klip, does it make sense to use custom messages, like: "No new stories.", "Getting the latest forum posts...", or "Loading blog entries..."? Also, if your new Klip is based on another, check that the old Klip's messages aren't out of whack.

7. Do links work?
Admittedly, this looks like a no-brainer. But it's happened to us more than once. When you click on a link in your Klip, does it work like it's supposed to? Do you go to the right page?

8. Is the Klip Setup UI usable?
I know---this is a loaded question. Klip Setup dialogs are easy to code but by their very nature not always the most usable pieces of UI out there. But still, if you throw your Klip at a new user, will they be able to sort it out and accomplish what they set out to do? Try looking at your Klip from the perspective of a new user. You might be surprised. If all else fails, add instructions to your Klip Setup dialog. You can even add a "Help" tab.

9. Are the Klip's Title and Description appropriate?
Klip titles are very important. They're what appear in the Klip's titlebar, so they shouldn't be too long. But they should still be descriptive, so that users on Klipfolio.com can find your Klip. And please, don't include the word "Klip" in the title. Descriptions are very important on Klipfolio.com so spend a few minutes writing a solid one that describes what the Klip will do for users.

10. If the Klip is an upgrade, will all users get it?
When it's time to release a new version of an already-out-there Klip, we check: a) Is the new Klip at the old Klip's "kliplocation", and is the filename right? b) Is the version number for the new Klip higher than the old one? c) Is the Klip on KlipFolio.com the new one?

That's it! Don't forget to test your Klip after uploading it to KlipFolio.com, to make sure it's the right one.

posted in:   |   add comment

Klipfolio Dashboard Developer Edition - Demo now available

Nov 09, 2010, by Terry Brown

Your chance to become a data
visualisation superhero!

The introduction of Klipfolio Dashboard Developer Edition in September has been so well received by developers that they are being hailed as data visualisation superheroes by their companies as they can develop new Klips so rapidly! We too, are doing our part and have now made the developer edition available for evaluation, free for thirty days.

Build and deploy better Klips. Faster.

Klipfolio Dashboard Developer Edition is a rapid development environment designed to simplify the development of new Klips for business users. Full featured, the Developer Edition includes step-by-step workflow, templates, debugging tools, code samples, demonstrations, and documentation in an easy-to-use development environment specifically designed to streamline Klip production.

One-stop Klip development.

Use the step-by-step workflow and see for yourself how simple it is to develop exciting new Klips, using your own data sources. You can be a data “superhero” - use the evaluation as an initial proof of concept (POC) development platform to showcase to business users the power of visualising their data. The rest, as they say, is easy!

Developer Edition can now be downloaded as a fully functional, thirty day trial version. Download now.

 

posted in:   |   add comment

Klipfolio Dashboard 5.5 is Now Available!

Oct 12, 2010, by kfdev

Klipfolio Dashboard 5.5 offers many new features including additional formatting options for the bullet charts, new keyboard shortcuts, and support for varied depth of levels in drill down Klips.

We are also expanding our support for large charts with the line chart and the horizontal bar chart. You can now combine the existing large vertical bar charts with line chart as well.

For a full listing of the new features, refer to the Release Notes.

Don't forget to check out the new and updated how-to articles!


 

posted in:   |   add comment

Klipfolio Dashboard 5.4 is Now Available!

Mar 25, 2010, by kfdev

In addition to the bar charts, sparklines and full-frame pie charts previously available in Klipfolio Dashboard, this latest release expands its support for more chart types:

- bullet charts
- stacked bar charts
- column charts
- win/lose charts
- full-frame vertical bar charts

Also available in version 5.4 are the new APIs that allows you to create a Drill Across Klip and an enhanced filtering capabilities for the Klip's Find field.

Check out the new how-to articles on all of these new features!

posted in:   |   add comment

Documentation Updates for Klipfolio Dashboard v5.3

Jan 18, 2010, by kfdev

Klipfolio Dashboard v5.3 comes with several exciting new features including support for pie charts and the ability to specify colours for a range of values in bar graphs. Be sure to check out the latest Klip Developer Guide, API docs and the list of how-to articles to find out how to incorporate them into your Klips.

To try Klipfolio Dashboard v5.3, download Klipfolio Dashboard Demo or contact us.

posted in:   |   add comment

Klipfolio Dashboard 5.3 is Now Available!

Nov 24, 2009, by kfdev

Here are some of the new features in Klipfolio Dashboard 5.3:

- You can display the values in a column as a pie chart using the new XML parameter, asset.
- In addition to Microsoft Excel 2003 and earlier spreadsheets with the .xls file extension, Klipfolio Dashboard now supports Excel 2007 files with the .xlsx extension. For details on how to write your own Excel Klip, read our how-to article .
- The height property can be used with type: text and type: number in addition to the already supported type: image. Set it to 1, 2 or 3 to display the values of the column in one line, two line or three line height, respectively.
- The colour of your bar graph using indicator: bar can now be set to one of the seven colours available for the XML parameter assets.

For a complete list of new features, enhancements, and bug fixes, refer to the Release Notes.

Be sure to also check the Klip Developer Guide , API documentation , How-To Articles, and Forum for updates.

posted in:   |   add comment

Klipfolio Dashboard 5.2 is Now Available!

May 26, 2009, by kfdev
Klipfolio Dashboard 5.2 is now available for download. In addition to the new and exciting addition of graphing support, the following new features and enhancements are included in this version:

- Support for an Excel worksheet (.xls) as the Klip's data source.
- Drag & drop support for adding Klips directly to the UI of Klipfolio Dashboard.
- Automatic removal of the "Open Link" menu options for items with no link attribute.
- Send to Friend option in Klipfolio Dashboard that allows Klip users to send individual item data to an email address.
- A new CSS attribute, format: "nolocaltime", for type: date.
For a complete list of new features, enhancements, and bug fixes, refer to the Release Notes .

Be sure to also check the Klip Developer Guide , API documentation , Cookbook , and Forum for updates.
posted in:   |   add comment

Klipfolio Dashboard 5.1 is Now Available!

May 26, 2009, by kfdev

Klipfolio Dashboard 5.1 is now available for download. In addition to the new and exciting addition of graphing support, the following new features and enhancements are included in this version:

- An 8-fold performance improvement in CSV/TSV data parsing, as well as much improved support for data in quoted strings in CSV/TSV data.
- A new "collabel" attribute that allows Klip authors to specify a column label that is different than the label displayed in the tooltip.
- Support for using a 3-line tall number instead of an image in card layout.
- The ability to specify prefixes and suffixes for numerical data, such as currency symbols or units of measure.
- A way to specify the input format for type: date so that a Klip can read any date format.
- A new feature that allows Enterprise customers to send notifications and alerts to all of their users.

For a complete list of new features, enhancements, and bug fixes, refer to the Release Notes.

Be sure to also check the Klip Developer Guide, API documentation , Cookbook, and Forum for updates.

posted in:   |   add comment

Klipfolio Dashboard 5 - Debug Window

Mar 10, 2009, by kfdev
One of the new features introduced in Klipfolio Dashboard 5 is a new and much-improved Debug Window. Find out more, including tips and tricks, in Appendix A, A Tour Of The Debug Window in the Klip Developer Guide.
posted in:   |   add comment

Klipfolio Dashboard 5 has officially been released!

Dec 10, 2008, by kfdev
Klipfolio Dashboard 5 is now generally available for download. Be sure to check out the updated Developer Guide, API documentation, Cookbook articles, and Forum for new features.
posted in:   |   add comment

Using Klipfolio to parse HTML content

Feb 08, 2008, by Fred Dixon

Many times the information you want to track is embedded within a web page. The site may offer an RSS feed that you can monitor (but giving you no control over the contents of the feed). In most cases, you don't have a feed and must manually revisit the site to scan for changes.

Sounds like a job for a Klip.

This article shows how to create a Klip that can parse an HTML page and extract specific content, in this example from an HTML table. The techniques in this article can be applied to any content in an HTML page.

HTML is XML

HTML is commonly referred to as a subset of XML, but there is a problem: most HTML on the web is not well-formed XML. You see this by saving an HTML page to your hard disk with the extension .xml and opening it with your web browser. Your web-browser will attempt to validate and start displaying errors.

KlipFolio’s XML parser, however, is non-validating and very forgiving. Unlike an XML parser that uses a complex Document Object Model (DOM) API for extracting content, KlipFolio offers a very powerful, yet very simple, Cascading Style Sheet-like syntax for parsing XML.

Here is a sample HTML page with an embedded table.

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Untitled Document</title> </head> <body> <h1>Table Example </h1> <table width="341" border="1"> <tr> <td width="66"> </td> <td width="35"><strong>East</strong></td> <td width="46"><strong>West</strong></td> <td width="77"><strong>North</strong></td> <td width="83"><strong>South</strong></td> </tr> <tr> <td><strong>Region 1 </strong></td> <td><div align="right">12.3</div></td> <td><div align="right">34.5</div></td> <td><div align="right">33.2</div></td> <td><div align="right">901</div></td> </tr> <tr> <td><strong>Region 2 </strong></td> <td><div align="right">83</div></td> <td><div align="right">32</div></td> <td><div align="right">34</div></td> <td><div align="right">98</div></td> </tr> </table> </body> </html>

Here's what the table looks like:

1

 

You can load this table from http://www.serence.com/support/samples/table_1.html.

Let’s build a Klip to monitor changes to this table.

Parsing an HTML table

To parse an XML source – any source – KlipFolio needs to know, at a minimum, two pieces of information specified in CSS. First, it needs to know the enclosing XML around each item (or row) of data. This lets it find items in the XML.

Second, it needs to know the enclosing XML around each element of data within an item. This lets it extract the data that comprises an item which the users see as a column in the klip or row in an item’s tooltip.

Looking at our example HTML table, let’s start with the data. We see the data for each row of the table is enclosed in

<td> </td>

so it’s not difficult to pull out (we’ll show how in a moment). The HTML table itself contains two rows of data, each enclosed in

<tr> </tr>

When parsing HTML, a typical web page usually contains many tables. So we need to be specific in which table we want to extract the. Looking at our example HTML, we see the tr’s enclosed in this table

<table width="341" border="1"> ... </table>

The attribute width="341" is specific to this table, so we can use that attribute to uniquely identify this table. Here’s a first cut at the Klip

 

<klip> <identity> <title> Get Stats </title> </identity> <locations> <contentsource> http://www.serence.com/support/samples/table_1.html </contentsource> <icon> http://www.serence.com/support/samples/images/sample_icon.png </icon> <banner> http://www.serence.com/support/samples/images/sample_banner.png </banner> </locations> <style> table[width="341"] { type: item; } tr { itemcol: 1; noterow: 1; content: cdata; } </style> </klip>

 

Here’s the results.

1

At this point, don’t worry if were not getting the proper data yet. The key is to get a Klip working that finds the proper table and extracts some data you can verify.

Our Klip has picked out the first row of data in the table, and we can see the raw XML because we specified the property content: cdata in the CSS.

        tr {
            itemcol: 1;
            noterow: 1;

content: cdata;
        }

This instructs KlipFolio’s XML parser to not do any processing on the extracted data. Just display its contents. This mode is very is very helpful in parsing HTML as it let’s you see exactly what KlipFolio is extracting before it strips out XML elements or processes XML entities.

OK, we can the raw data, but the Klip only extracted one row. Why? The answer is didn’t get the specification for item quite right. Note the specification of item is as follows:

        table[width="341"]  {
            type: item;
        }


This reads the item is enclosed within

<table width="341"> </table>

That’s not quite specific enough: the item is enclosed within a

<tr>

which is enclosed within

<table width="341">

Here’s the correct specification for item.

        table[width="341"] tr  {
            type: item;
        }

td {
            itemcol: 1;
            noterow: 1;

content: cdata;
        }


Reload the Klip. It now shows the following:

2

Looking better. We now we see three items. The CSS rule for td is extracting out the contents of the first td in each row. But why are there three rows?

It’s because the table does have three rows: one header and two rows of data. We want to skip the first row and just extract the two data. Let’s look again at the HTML for the table.

<table width="341" border="1">
  <tr>
    <td width="66"> </td>
    <td width="35"><strong>East</strong></td>
    <td width="46"><strong>West</strong></td>
    <td width="77"><strong>North</strong></td>
    <td width="83"><strong>South</strong></td>
  </tr>
  <tr>
    <td><strong>Region 1 </strong></td>
    <td><div align="right">12.3</div></td>
    <td><div align="right">34.5</div></td>
    <td><div align="right">33.2</div></td>
    <td><div align="right">901</div></td>
  </tr>



Notice the

<td>

elements for the first row also specify the attribute width, as in

<td width=N>

We want to match those td's that do not have this attribute. (For the remainder of this article, we'll referr to XML elements without the brackets.)

Modify the CSS definition for td to td:not([width]).

        table[width="341"] tr  {
            type: item;
        }

td:not([width]) {
    itemcol: 1;
    noterow: 1;

content: cdata;
}    

And let’s reload the Klip.


3

We now have just the rows of data, but only the first column (the first td). Let’s now extract the second td.

To extract the second td we add the following rule

        td + td:not([width]) {
            itemcol: 2;
            noterow: 2;

content: cdata;
        }

Which reads (from right to left) look for the first td that does not have a width attribute that is preceded td.

Reload the Klip and we now see the following.


4

Looking good Huston. Now, since were getting data, let’s drop the content: cdata and just view the text.

        table[width="341"] tr  {
            type: item;
        }

td:not([width]) {
            itemcol: 1;
            noterow: 1;
        }

td + td:not([width]) {
            itemcol: 2;
            noterow: 2;
        }

Reload the Klip.

5


Wait! Where did the data go? Why did taking content: cdata cause all the data to disappear.

The reason is the default setting for the content property is content: firstchild. This means KlipFolio only takes the first child of a matching element. To see why it’s empty, look at the contents of the first td

<td><div align="right">12.3</div></td>

The first child after td is an empty node – it’s between the >< in

<td><strong>

It’s the same for the second td node. This causes both the first and second cells to be empty in the item. When KlipFolio tries to add the second empty item, it already finds one in the table, so it overwrites it. The result: a Klip with no data that has one unread item.

Why does KlipFolio have a default as content: firstchild? There are two reasons. First, when parsing XML, an element usually just contains data, as in.

<td>Region 1</td>

Here, the first child is the text node Region 1. Second, picking out the first node saves processing time because KlipFolio does not need to scan for the closing td. When parsing large sets of XML, this optimization saves CPU time.

But, HTML tables are usually very small, and since the HTML contains formatting that we don’t care about in the Klip, we need to tell KlipFolio to do a bit extra work.

To tell KlipFolio to scan for the enclosing td and process everything in between, we specify the content as content: text.

Here’s the updated CSS.

        table[width="341"] tr  {
            type: item;
        }

td:not([width]) {
            itemcol: 1;
            noterow: 1;

content: text;
        }

td + td:not([width]) {
            itemcol: 2;
            noterow: 2;

align: right;
            content: text;
        }

Reload the Klip. We now see our data.

5

It’s looking good. Let’s add the CSS entries to extract the contents of the third and forth td from the data.

        table[width="341"] tr  {
            type: item;
        }

td:not([width]) {
            itemcol: 1;
            noterow: 1;

content: text;
        }

td + td:not([width]) {
            itemcol: 2;
            noterow: 2;

align: right;
            content: text;
        }

td + td + td:not([width]) {
            itemcol: 3;
            noterow: 3;

align: right;
            content: text;
        }

td + td + td + td:not([width]) {
            itemcol: 4;
            noterow: 4;

align: right;
            content: text;
        }

td + td + td + td + td:not([width]) {
            itemcol: 5;
            noterow: 5;

align: right;
            content: text;
        }

Reload. Here’s the resulting Klip.

6

At this point the core of the Klip is working. We’re finding the right table and extracting only the rows of the data. Let’s take a look at the tooltip (referred to as note).


7


By default, KlipFolio uses the CSS matching criteria as the label for a note. Let’s use notelabel to make our Klip a bit more expressive.

        table[width="341"] tr  {
            type: item;
        }

td:not([width]) {
            itemcol: 1;
            noterow: 1;

content: text;

notelabel: false;
            emphasis: strong;
            label: 'Region';
        }

td + td:not([width]) {
            itemcol: 2;
            noterow: 2;

align: right;
            content: text;
            label: 'East';
        }

td + td + td:not([width]) {
            itemcol: 3;
            noterow: 3;

align: right;
            content: text;
            label: 'West';
        }

td + td + td + td:not([width]) {
            itemcol: 4;
            noterow: 4;

align: right;
            content: text;
            label: 'North';
        }

td + td + td + td + td:not([width]) {
            itemcol: 5;
            noterow: 5;

align: right;
            content: text;
            label: 'South';
        }

Reload and we now see the Klip has labels for each row. We used notelabel: false to hide the label for the first row and set the emphasis: strong to make it a title.


397

Since the Klip is going to monitor a table for changes, we want to make it a dashboard Klip. We explain how a dashboard klip works in cookbook article http://www.klipfolio.com/index.php?action=dev,cookbook_item&item=15& .

In short, you need only add some JavaScript that uses the KlipFolio API to make a Klip a dashboard Klip.

Here’s the full Klip with JavaScript.

<klip>
	<identity>
		<title>
			Get Stats
		</title>
	</identity>
	<locations>
		<contentsource>
			http://www.serence.com/support/samples/table_1.html
		</contentsource>
		<icon>
			http://www.serence.com/support/samples/images/sample_icon.png
		</icon>
		<banner>
			http://www.serence.com/support/samples/images/sample_banner.png
		</banner>
	</locations>
	<style>
		table[width="341"] tr  {
			type: item;
		}

		td:not([width]) {
			itemcol: 1;
			noterow: 1;
			
			content: text;
			
			notelabel: false;
			emphasis: strong;
			label: 'Region';
		}

		td + td:not([width]) {
			itemcol: 2;
			noterow: 2;

			align: right;
			content: text;
			label: 'East';
		}

		td + td + td:not([width]) {
			itemcol: 3;
			noterow: 3;

			align: right;
			content: text;
			label: 'West';
		}
		
		td + td + td + td:not([width]) {
			itemcol: 4;
			noterow: 4;

			align: right;
			content: text;
			label: 'North';
		}

		td + td + td + td + td:not([width]) {
			itemcol: 5;
			noterow: 5;

			align: right;
			content: text;
			label: 'South';
		}
	
	</style>
	<klipscript>
      <![CDATA[
 
function onRefresh()
{
    Items.autoremove = false;
    
    var req = Engines.HTTP.newRequest (Prefs.contentsource);
    if (!req.send()) 
    {
        return false;
    }
        
    var data = req.response.data;
    if (!data.length || req.response.status != 200) 
    {
        return (req.response.status != 304);
    }
    
    // Show only current items in source
    Items.purge (true);
    
    return Engines.KlipFood.process (data);
}

      ]]>
      </klipscript>
</klip>

In summary, when parsing HTML, don’t worry about extracting all the data at first; instead, focus on uniquely identifying the specific table you want to match. There are usually attributes in the table that make it easy to locate.

To show some data, you can usually use the following CSS specification for td

        td {
            itemcol: 1;
            noterow: 1;

content: cdata;
        }


Which just shows the raw contents of the first td. Remember: you need to both match the specific table and include a tr to specify an item as being contained with a row.

        table[width="341"] tr  {
            type: item;
        }

The rest is just iteratively refining the CSS specifications to extract the contents of each row. Switch to content: text to have KlipFolio convert the raw XML to text. You can usually specify a specific td by enumerating the number of td's that precedes it. If there is something unique about the td, such as a style or attribute, you can use that as the matching criteria instead.

 


posted in:   |   add comment

The Dark Horse and Other Happenings

Mar 28, 2007, by awille

First of all let me share with you two recent musings about KlipFolio. NoHeat.com sticks it to the big boys in an article entitled Klipfolio takes on Microsoft and Google with a solid sidebar, and Simon Dickson at BT Broadband Office calls us the "dark horse" among sidebars (a title we take as quite the compliment) in this article called Enhance your Productivity with a Bit on the Side.

Also, in an effort to continually improve the KlipFolio.com experience, and to add features that will drive Klip downloads for authors, here are two recent additions to KlipFolio.com:

1. Klip Localization. Klip authors can set the language, country and now even your Klip's specific location. Doing this will make sure your Klips are being seen by the right people.

2. Klip Screenshots. Check out the Tagesschau.de and the KlipFolio Forum Klips to see this in action. Authors can now upload up to 3 screenshots of their Klip. Klips with screenshots get more downloads, so don't delay.

posted in:   |   add comment

New in KlipFolio 4: Sidebar

Nov 05, 2006, by peterM

We've got another KlipFolio 4 preview for you! Here's the brand new KlipFolio 4 sidebar. Now you'll be able to keep an eye on your Klips at all times and leave plenty of screen real estate to get stuff done.

In the tradition of all things KlipFolio, this sidebar can be resized to be really, really small, with your Klips remaining visible and usable. So there won't be a need to minimize anything, restore anything or bring anything up just to stay informed; it'll all be right there, using up just the tiniest amount of screen real estate, keeping you connected.

More previews and sneak peeks throughout the day!

posted in:   |   add comment

KlipFolio 4.0 and Real-Time System Monitoring

Oct 20, 2006, by peterM

Time for another sneak peek at KlipFolio 4.0! This week we've got system monitors for you. With 4.0 you'll be able to monitor your CPU and memory usage as well as the strength of the WiFi signal of the access point you're connected to.

KF 4.0 System Monitors Screenshot 

One of the key things here is that Klips will no longer have to refresh to do stuff. It's a new timer event. It opens up the door to lots of new Klip presentation capabilities.

There's lots more 4.0 on the way. Stay tuned!

 PS. Check out the new Flickr Klip on KlipFolio.com

posted in:   |   5 comments

New Developer Section

Sep 22, 2006, by awille

As mentioned last week, we've been cranking on a Dev Section overhaul. The coolest addition is a Cookbook, a collection of short how-to code examples. It's the cut-and-paste programmer's dream come true. Currently there are only three lonely "recipes" listed, but it's open to your input also. If there is a bit of code that you think other developers should know about, get it up there!

Also new are Dev Section Articles. More in-depth than Cookbook items, these will focus more on cool stuff we are doing at Serence, the most important things you should know about KlipFolio or Klips or best-practices when developing Klips. The first article up there right now, 10 Things to Look for When Testing your Klip, is a good read for any Klip developer.

One last small announcement, we've released a small update to KlipFolio that fixes some image downloading issues. Here are the release notes for KlipFolio 3.1, build 25.

Have a great weekend everyone!

posted in:   |   add comment

3.1 Response

Aug 24, 2006, by awille

Just over a week later, and the uptake of KlipFolio 3.1 is amazing. We're getting lots of new users, traffic is way up on our website (have you noticed it being a little slow... we have!), and we're getting lots of blog mentions. Again, thanks to all of our dedicated users who helped us test it while in Beta.

Now as you may or may not know, we've already started developing the next release - and it's going to be huge! Once again, we owe much of our future direction to the input we've received from KlipFolio users.  

Cheers

posted in:   |   add comment

Weekly Rundown

Jul 14, 2006, by awille

Just a quick note before the weekend officially starts. For starters, we've just posted a job opening for a project manager. Take a look here and let us know if you fit the bill or if you know someone who does.

We've also published an update to the multi-feed template Klip. This is a great Klip for publishers who have multiple rss feeds and want to build them all into one Klip. Jeremy (one of the new guys here) is posting an introduction to the Klip on the forum right now. And he's just posted it.

We're cranking on getting KlipFolio 3.1 out the door (a minor update with some nice stability / performance improvements), and we've officially started negotiating what will make it into KlipFolio 3.5 (or whatever we call it). We now have a wall full of 36 post-it notes full of cool features (no, not all of them will make the cut).

Likewise, we've been making great progress on fixing bugs and adding small features for KlipFolio.com.

All in a weeks work. Enjoy the weekend!

Allan 

posted in:   |   5 comments

New Klips and RSS Feeds on the Way

Jun 09, 2006, by peterm

We're working on a new suite of Klips for KlipFolio.com, including:

- New & Updated Klips on KlipFolio.com (now with language and adult content filtering)
- Klip Tracker (to monitor downloads, comments, ratings, etc. for specific Klips and sets)
- KlipBlog (updated to the new system and already released)
- Klip Statistics (to monitor detailed stats for a specific Klip--you'll have to log in with this one)

Time permitting, we're also looking at Klips for most popular tags and/or most popular sets.

For Klip developers who want to play around with their own KlipFolio.com Klips, we've built RSS feeds for every Klip. They can be accessed through:

http://www.klipfolio.com/phplib/scripts/rss/klip_rss.php?kid=####
(Where #### is the Klip's ID number)

Also, you can retrieve information about multiple Klips by comma-seperating IDs, like so:
http://www.klipfolio.com/phplib/scripts/rss/klip_rss.php?kid=####,####,####,#### ...

We'll be using this feed sepcifically in the Klip Tracker, due soon.

posted in:   |   1 comments

New KlipFarm on the Way

Feb 21, 2006, by awille

KlipFarm.com is only a few weeks away from a major upgrade---you won't even recognize it. In fact, it won't even be called KlipFarm anymore. It'll be easier to find great Klips, you'll be able to provide feedback for Klip authors, you'll have the ability to mark Klips as favourites and even put together sets of Klips you like using and share them with friends.

Everything to do with KlipFolio will be under one roof. No more going to Serence for support, KlipFarm for Klips and Klip Provider for documentation. It'll all be together.

The site is being built from scratch using PHP and Ajax, and this time we're using lots of slick CSS to define layouts instead of tables. All that, plus a new, optimized database, means the site is fast fast fast.

In the next few weeks we're going to launch a beta of the new site. Stick around for more info!

posted in:   |   add comment

Under the Hood

Aug 21, 2005, by

Ever wonder what the KlipFolio development team is working on at this moment? More often than not, it?s dealing with some detail that hopefully no one ever sees.

Building a platform for intelligent awareness means dealing with hundreds of minor issues. If we make the right design choices, all the complexity is hidden from the developer and seamless to the user.

On of those (rather big) details is to handle double-byte languages seamlessly. Today, KlipFolio already supports over 37 languages.

This is great, true double-byte language support must be seamless. Take the Google news for example. It can show you news in 22 languages, and KlipFolio supports them all in the Klip. That's good. However, in our current Beta B, if you choose the language in the Klip Setup, you don't see the proper encoding of the language in the ListControl.

KlipFolio 3.0 Beta B

That's bad. We've just fixed this in the upcoming Beta C. Now, all the Klip UI controls can be created and updated using any of the hundreds of supported codepages and the full Unicode character set.

Now, when the Klip needs to display double-byte characters in a UI control, you now see this

KlipFolio 3.0 Beta C (upcoming)

That's good. Lots of things are going on under the hood to make this work seamlessly, and they are all hidden from the Klip developer. Not having to worry about how your application will handle other languages or network connections or XML parsing lets you focus on the important part : your content.

It just works, and that's the way we like it.

posted in:   |   add comment

Where is the server?

Aug 21, 2005, by fdixon

Where is the server?

Occasionally, we get asked by prospects `Where is your server for KlipFolio? How much does it cost? They see the rich output of Klips, such as the weather, news, stocks, sports, etc. and would like to put their content on their user's desktops in a similar manner. But they first they want to know the cost of our server and how it creates RSS feeds from their data.

There is no server, we say.

Long pause. The Klip has all the intelligence to access and display the data. There is no server required.

But how does the Klip get the RSS feed? they ask.

The Klip does not need an RSS feed, we reply.

Another long pause. A Klip can read any XML. This means it can read an RSS feed just fine, thank you, but it can read any XML your servers create (including HTML, since HTML is really a form of XML).

At that point, we usually give an example. Suppose in your company has a web-based CRM application that supports 200 concurrent users. Each user has a login screen and password. Trouble is, the CRM information changes so frequently that sometimes agents miss important customer follow-ups. You want the critical CRM information for each agent visible on their desktop as a dashboard so nothing is missed. Well, you must need another server right?

No. Since the user already uses their web browser to login with authentication (and the CRM application is showing them only the data they have permission to see) a Klip can automate this login process. (Our HotMail Klip automates the authentication with Microsoft Passport, for example). A Klip can then parse the XML (including HTML) to extract out the key data for the user. From that point onward, all the built-in data processing and display capabilities of a Klip take over. The Klip now automates the users effort to monitor quickly changing data.

There is no server that needs to 'pre chew' the data so its dumbed-down RSS. The Klip can parse structured data from your existing server, display it in columns, and let each user filter it according to their needs.

There are times when you need a server, such as the data does not exist anywhere on the web. More often, if you can create a simple program that extracts the data and updates an XML file on a web server, then you are done. The Klip can monitor the XML file for changes.

So there is no server to buy. The intelligence is in the Klip.

posted in:   |   add comment