November 19, 2008

Well that Shatters One of My Preconception

The thought of creating some visualizations based on this data has crossed my mind in the past. I never would have thought the results were so dramatic. Coincidence? Luck? You decide. Go check this out: Bulls, Bears, Donkeys and Elephants

October 6, 2008

Huge Discount on Data Dynamics Reports & Analysis

Interactive Data Analysis

This summer we released Data Dynamics Analysis. Analysis is something like DynamiCube's pivot table, our original Business Intelligence tool that we started out with at Data Dynamics back in 1996.


With Analysis, the focus is on interactivity and visualization features. You can instantly drag & drop your way through a plethora different charts looking for trends or anomalies in your transactional data. In addition to a completely interactive numerical pivot table, the charts are both easy for an end user to explore and completely interactive. Analysis has some great screencasts to show it to you in action, and with Analysis, seeing it in action is the best way to understand these interactive features that make it unique, so check out the screencasts.

The Most Feature-Rich Reporting Package

Data Dynamics Reports was our new product released last year. Data Dynamics reports is a great tool for high-end, feature-rich reporting on the web. With things like sparkline, bullet chart, calendar, barcodes, data visualizers, KPIs, master reports (think asp.net master pages for reporting), PDF, HTML, XML, and Excel rendering all built in makes Data Dynamics Reports it the most feature-rich reporting package out there.

If you haven't had a chance to check it out, it has a ton of great screencasts from our PM and support team. Please check those out too!

A Powerful Combination

Data Dynamics Analysis and Data Dynamics Reports are a powerful combination. Executive managers need a way to explore data in new ways looking for new opportunities. Analysis gives them a way to do that with it's powerful interactivity features. Mid-level managers need a way to analyze business data (sales numbers, productivity, etc.) in a consistent way to make sure running day-to-day operations are running properly. Data Dynamics Reports offers the most feature-complete reporting package on the market to do just that.


We've decided to offer a fall pricing promotion through November 30 to allow you to get both of these powerful products for only $899! That's an extraordinary price at over 60% off the normal price. We're offering this price for only a short time, so go to our site for more details check out our site and take advantage!

August 11, 2008

More photos from Tokyo

More pictures from Tokyo...

Tokyo: Day 2 (Click to see more)

August 9, 2008

Reporting from Japan

I'm in Japan for the next several days on business and wouldn't you know on the first day my camera stopped working. Luckily, it's not hard to find a replacement here. I went through Beijing airport on the way here and managed to take some photos with my iPhone there:

Beijing Airport on the way to Tokyo (click on photo for more)


The rest are from Japan. I haven't slept in a couple days now so I can't write much now but I wanted to get the photos started at least. So far I've mostly been eating. What great food! A new refreshing palette of tastes. Remind me to tell you about the food and the taxi procedure :)

Tokyo: Day 1 (click on photo for more)

August 2, 2008

The Total Solar Eclipse in Pictures from Novosibirsk

Yesterday I was able to witness a total solar eclipse here in Novosibirsk Russia. First, I must confess that leading up to the day of the eclipse I was not as excited as everyone else was. I planned to watch it with friends, but knowing it would only last a couple minutes, and it is just a spot over the son. Well, it was a lot more interesting than I expected. It was very interesting and if you ever get a chance to witness a total solar eclipse, don't miss your chance!

About Solar Eclipses
There are three main types of eclipses: Partial, Annular and Total. A total eclipse covers the sun completely.
According to the Saros Cycle, which is an accurate way to predict eclipses, an eclipse will reoccur nearly exactly the same way every 18 years 11 days and 8 hours. It is not perfectly accurate but close. Although all conditions are nearly identical (e.g. the moon at nearly the same distance from Earth and at the same time of year), since it is not a whole number of days difference, the earth is rotated differently and thus the eclipse is visible from different parts of the globe (each successive eclipse path is shifted by ~120º westward). However, the same eclipse returns to about the same geographic region every 3 saroses (54 years and 34 days).

About the Solar Eclipse of August 1, 2008
It was a total solar eclipse. It was visible from northern Canada (Nunavut), Greenland, central Russia, eastern Kazakhstan, western Mongolia and China. The greatest eclipse duration was reached near the town of Nadym in Northern Siberia Russia (about 1300 Kilometers from Novosibirsk where I was).
The last solar eclipse was on September 11, 2007. The last total solar eclipse was on March 29, 2006. The next solar eclipse is on January 26, 2009. The next total solar eclipse is on July 22, 2009.
The best page for information on this eclipse is NASA's page. Wikipedia also has a nice short page with more information. There is also a page in Russian here.

Photos of an Eerie Feeling
What was amazing, was just how dark it was! Before the eclipse, even just a couple minutes before the total eclipse it was bright outside. Almost like a normal day:


Then for two minutes it was pitch black outside like the middle of the night. Even street lights and building signs came on, it was noticeably colder and people even shot off fireworks!


Just reminds one how important the sun is. Two minutes later it was a bright sunny day again.

July 30, 2008

Data Dynamics Support Forum Super Search

In addition to the custom Google search for searching Data Dynamics Reports help files, I've added another custom search for Data Dynamics Support Forums. Once you're search results are shown you can also refine the results by each of our products: Data Dynamics Reports, Data Dynamics Analysis, ActiveReports, ActiveBar, ActiveReports (ActiveX/COM/VB6), DynamiCube, or SharpGraph.


Give it a try using the gadget below:


July 28, 2008

Obama Extends an Open Invitation to the Democratic National Convention

A Special Invitation from Barack
Want a free ticket to the DNC? Obama will give you one. A leader who tries to engage everyone. That's a new concept in American politics, and I like it.

July 26, 2008

Performance & The Golden Hammer: Linq

I recently read tiredblogger's IQueryable Methods on ActiveReports ControlCollections post. First of all, I can see how the "find control by name" type of method to our control collection would certainly be useful. We should look at adding it in an efficient way that won't impose overhead when it isn't needed. However, I do have some suggestions that might help in this scenario.

Most importantly, you're not stuck catching exceptions. Allowing exceptions to be thrown is extremely slow, and in the first example tiredblogger noted, this is probably the cause of "destroying performance". If there are hundreds of "indicators" in his example, there may be several to several hundred exceptions being thrown. However, I want to get right into "Linq" and using it as a solution in this case...

In cases such as this, I don't think Linq is appropriate. First, I think it is helpful to define exactly what "Linq" is. There are lots of idioms associated with Linq which I don't think are Linq at all, namely Extension Methods and Lambda Expressions. Both of which Linq relies on heavily, but are not really Linq. Don't get me wrong though, they are extremely useful (arguably more useful than Linq itself), just not really Linq. At its essence, Linq is the language integrated query facility and IQueryable/IQueryable<T> and goes through IQueryProvider and the various IQueryProvider implementations.

It is very interesting to understand what these extension methods are really doing in order to take full advantage of them. Their concise syntax can mislead us into thinking their "query-like" nature are some how performant in scenarios where they are not. In this example the whole interaction with Linq comes down to IQueryable<Label> (where Label happens to be an ActiveReports Label) and the use of SingleOrDefault.

So my first thought was that, SingleOrDefault has no state between each call to it during that loop, so in the best case it is doing a search through the controls list. Another thing might be to just fill up a Dictionary<string,ARControl> with controls keyed by name before doing the loop. With hundreds of indicators the Diciontary<T> lookup should be much faster than repeatedly searching through the control collection with SingleOrDefault. Essentially this comes down to replacing the code to convert/wrap List<T> with an IQueryable<T> instance to convert the List<T> into a Dictionary<T>.

To satisfy my own curiosity, I did some quick testing and as it turns out the point of IQueryable<T> vs Dictionary<T> is more important than I first realized. My test removed ActiveReports from the scenario since my focus is on Linq & performance here.


The first test is to replicate the conditions from tiredblogger's post. First I created some really simple sample data:


private void CreateSampleData()
{
 for (var i = 0; i < indicatorCount; i++)
 {
  _indicators.Add(new Indicator(i));
 }

 for (var i = 0; i < indicatorCount; i = i + 2)
 {
  _controlsSimpleList.Add(new ARControl(i));
 }
 _controlsQueryable = _controlsSimpleList.AsQueryable();
}
Then the test simulating what tiredblogger described which uses the IQueryable<Label> as the source of data used with SingleOrDefault:
private void WithLinqQueryable()
{
 var foundCount = 0;
 foreach (var indicator in _indicators)
 {
  var indicatorHeader = string.Format("i{0}", indicator.Id);
  var indicatorControl = _controlsQueryable.SingleOrDefault(x => x.Name == indicatorHeader);
  if (indicatorControl != null)
  {
   foundCount++;
   indicatorControl.Text = IsSpanish
    ? indicator.SpanishText
    : indicator.EnglishText;
  }
 }
 if (foundCount != indicatorCount/2)
  throw new InvalidOperationException("invalid foundCount");
}

I ran a test that uses 400 "indicators" with half of the SingleOrDefault calls not finding a corresponding Label (i.e. returned null). Running the above test in a 10 iteration loop gives me the result of 17046 milliseconds. Next, I realized that IQueryable<T> is not necessary since SingleOrDefault is available as an extension method for both IQueryable<T> (via System.Linq.Queryable.SingleOrDefault) and IEnumerable<T> (via System.Linq.Enumerable.SingleOrDefault). In the prior example, we're using the System.Linq.Queryable.SingleOrDefault implementation. In the next example we'll use the implementation from System.Linq.Enumerable since the source is _controlsSimpleList and it is merely List<T> (i.e. IEnumerable<T> ):
private void WithLinqExtensionMethods()
{
 var foundCount = 0;
 foreach (var indicator in _indicators)
 {
  var indicatorHeader = string.Format("i{0}", indicator.Id);
  var indicatorControl = _controlsSimpleList.SingleOrDefault(x => x.Name == indicatorHeader);
  if (indicatorControl != null)
  {
   foundCount++;
   indicatorControl.Text = IsSpanish
    ? indicator.SpanishText
    : indicator.EnglishText;
  }
 }
 if (foundCount != indicatorCount / 2)
  throw new InvalidOperationException("invalid foundCount");
}

Under the same conditions this one runs in a shocking 46 milliseconds! MUCH faster. Next I thought I'd compare the result to not using any Linq-related technologies at all, just a boring old Dictionary:

private void NoLinqTest()
{
 var controlLookup = new Dictionary();
 _controlsSimpleList.ForEach(x => controlLookup[x.Name] = x);

 var foundCount = 0;
 foreach (var indicator in _indicators)
 {
  var indicatorHeader = string.Format("i{0}", indicator.Id);
  Label indicatorControl;
  if (controlLookup.TryGetValue(indicatorHeader, out indicatorControl))
  {
   foundCount++;
   indicatorControl.Text = IsSpanish
    ? indicator.SpanishText
    : indicator.EnglishText;
  }
 }
 if (foundCount != indicatorCount/2)
  throw new InvalidOperationException("invalid foundCount");
}

This one runs under the same conditions in only 15 milliseconds.

So the saying goes, "When the only tool you have is a hammer, everything looks like a nail." Linq is another nice tool, but it's not the only tool we have :)


For those of you that want to play around with it, you can download the code here.

July 25, 2008

Facts about Russia (2)

Following up on my first post of Russian facts. Here are some more facts...




  • The "current account balance" (as defined by CIA W.F.B.) of the United States is $-738,600,000,000 with a ranking of 164th in the world (last). [1]
  • The "current account balance" of the Russian Federation is $76,600,000,000 with a ranking of 5th in the world. [1]
  • Russia has the world's greatest reserves of mineral and energy resources. [2]
  • Russia produces one-fifth of the worlds diamonds. [7]
  • There was 418,500 American casualties in World War 2 (0.32% of the total population). [5]
  • There was 23,100,000 Soviet Union Casualties in World War 2 (13.7% of the total population). [5]
  • My fiancé's grandfather told us that of his generation, only 1 in 100 Russians (or Soviets?) survived World War II. We made a toast to him as a survivor.
  • The literacy rate in Russia is 99.4%. [6]
  • The literacy rate in the United States is 99.0. [6]
  • Russia has more post-secondary education graduates than any other country in Europe. [3]
  • Moscow Russia is the most expensive city to live in the world. [8]
  • Russia is in the process of building the Russia Tower in Moscow which, upon completion, will be the tallest building in Europe and the second tallest in the World. [9]
  • There are more billionaires living in Moscow Russia than any other city in the world. [4]
  • Only America has more billionaires than Russia (469 vs. 87). [4]

  • 1 http://en.wikipedia.org/wiki/Russian_language
  • 2 http://en.wikipedia.org/wiki/Russia
  • 3 https://www.cia.gov/library/publications/the-world-factbook/rankorder/2187rank.html
  • 4 http://en.wikipedia.org/wiki/List_of_countries_by_population
  • 5 http://en.wikipedia.org/wiki/List_of_countries_by_literacy_rate
  • 6 http://en.wikipedia.org/wiki/Diamond
  • 7 http://en.wikipedia.org/wiki/Moscow
  • 8 http://en.wikipedia.org/wiki/Russia_Tower
  • 9 http://en.wikipedia.org/wiki/List_of_Russian_billionaires

July 22, 2008

Facts about Russia (1)

In total now, I decided I've spent at least one year living in Russia in spans anywhere from a few weeks through going on three months now. As you might expect, after being so close to a country, I've read and learned a thing here and there that I thought might be interesting to share. I'm choosing facts I would have probably not have known had it not been for my personal interest in Russia. I hope and expect at least a couple of my fellow American comrades to find a thing or two listed here interesting.

  • The actual country name is Russian Federation. [2]
  • Russia is the largest country in the world by land mass (by far). [1]
  • Russia occupies nearly twice as much land area (17,098,242 km2 vs 9,629,091 km2) as the USA and has about half of the population (142m vs ~300m). [1]
  • Russia Occupies 11.5% of world's land area.  [1]
  • The next closest is Canada with 6.7%. [1]
  • The population of Russia is 142 million. [3], [5]
  • The Russian language is the largest native language in Europe. [6]
  • Russian scientist Dmitri Ivanovich Mendeleev (Дмитрий Иванович Менделеев) created the periodic table of the elements. [4]
  • Most Russian's (even university graduates) won't know what a "Periodic Table of the Elements" is. They refer to it only as it's official name: "Mendeleev's Table".
  • Some of my colleagues were shocked (and maybe a bit offended) that we were not taught it as "Mendeleev's Table".

  • 1 http://en.wikipedia.org/wiki/List_of_countries_and_outlying_territories_by_total_area
  • 2 http://en.wikipedia.org/wiki/Russia
  • 3 http://en.wikipedia.org/wiki/Dmitri_Mendeleev
  • 4 http://en.wikipedia.org/wiki/World_War_II_casualties
  • 5 http://en.wikipedia.org/wiki/Education_in_Russia
  • 6 http://en.wikipedia.org/wiki/Russian_language

I'll post a more in the next couple days.

May 21, 2008

Super Search for Data Dynamics Reports Help


I've found that the best way to search the online help for Data Dynamics Reports is to search it from Google. Incidentally, I've found that is the best way to search the help of any product (especially MSDN). I simply add the site: search operator to my google search to find what I need. Now I've done one better, I have a google custom search for it so I don't have to type in site: followed by the lengthy URL each time. I have also added several other intresting pages about Data Dynamics Reports to it too so it searches the help and other informative pages such as the Frequently Asked Questions. Now I'll share it by embedding it below:



May 18, 2008

Every child is an artist...


Every child is an artist. The problem is how to remain an artist once he grows up.
- Pablo Picasso

May 13, 2008

Note to Self: Use Firefox on Mac not Safari


Approximately once per month I switch from Firefox to Safari for a day or so on my Mac. Safari is sleek (clean, only has the things you need, nothing extraneous), extremely fast, and very pleasant to use. So every time I switch back to Safari within the first several hours of using it I switch my default system browser from Firefox to Safari and think to myself: "I've done this before. I wonder why I stopped using Safari last time."

I've done this again last night and today I know the reason: Stability. Use Safari for about two days instead and you'll find Safari regularly crashes on some sites, and soon when you try to start it again it just immediately crashes. Firefox is not as fast and clean as Safari and uses a lot more memory, but it almost never crashes. There is not a more valuable feature than not crashing.

May 6, 2008

The SlashDocs C# XML Comment Add In Updated for Visual Studio 2008

Summary: The SlashDocs addin for Visual Studio was updated to support Visual Studio 2005 and Visual Studio 2008. Go to the bottom to download the latest version.




One of the most useful features introduced with C# and Visual Studio.NET was the embedded XML Documentation Comments feature. Although exactly the same in concept as Java's venerable "JavaDoc" feature C#'s more structured and intuitive XML-based syntax, ability to deploy the standardized "compiled" XML output files, stellar IDE support, and compiler-enforced checking made it a nice evolution of what Java started with JavaDoc.



Few know that there is a way to write the compiler-verified C# XML Documentation Comments could be written in a separate XML file and still linked to the source code with the <include...> element. While not useful in many cases (i.e. when only the programmer writes and edits documentation), for a commercial team like ours at Data Dynamics we produce full production quality class library reference documentation using expert Technical Writers from our User Education (aka UE) team. In the early days of working on ActiveReports for .NET we lightly used these comments to enable the developers to write the class library documentation. Then the UE Technical Writers edited it (fixed spelling, and grammar, added more details, i.e. made it readable :) ). However, we quickly discovered neither the programmers nor UE wanted UE to edit the source code files. As much as you tell everyone "calm down, its just comments, it's okay for them to edit it; trust each other, etc." everyone was still uncomfortable, and what it eventually turned into is developers writing a "first draft" which was quickly abandoned while Technical Writers just started editing their own copy. This left the docs unchecked by the C# compiler and updates from the developers were not pushed back to UE so transparently. What a loss!



So when we started working on Data Dynamics Reports, I was a big advocate of using the <include...> element to enable writing the documentation in separate files from the source. This way dev's could check it and UE could edit it in separate directories from the source code itself. The immediate problem was that there was no IDE support for writing the documentation comments or even to generate the include links. So, like any geek would do, I added it. Back when VS 2003 was cool - I wrote a Visual Studio addin to aid in moving and linking these separate documentation files to the source. You can read more about it and see some screenshots in my original announcement of the project at the following location: http://blogs.pingpoet.com/overflow/archive/2005/11/29/15568.aspx.
Once I made a couple hacks to get it working in VS2005 but didn't publish it. Now I changed the add-in model completely to the new one introduced in Visual Studio 2005 and made it work in Visual Studio 2005 and Visual Studio 2008. I fixed a couple bugs people reported, but didn't add any new features other than support for VS2005/2008.






Get the latest version by clicking here!

April 8, 2008

'..resgen.exe' failed to start... The system cannot find the file specified

Do you get an error with nant that looks like this:


[nant] C:\projects\...\Build-Scripts\......nant.build build
Buildfile: file:///C:/projects/.../Build-Scripts/....nant.build
Target framework: Microsoft .NET Framework 2.0
Target(s) specified: build


build:

[echo] Building '...': build.defines:'DEBUG;TRACE', dir.builddestination:'C:\projects\...\Source\build\...-debug-bin', build.debug:False
[csc] Compiling 17 files to 'C:\projects\...\Source\build\...-debug-bin\....dll'.

BUILD FAILED

'C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin\resgen.exe' failed to start.
The system cannot find the file specified



I ran into this because I only installed VS2008 on this machine and a whacky VS2005 shell gets installed by SQL 2005 that has screwed up multiple tools, one of them is nant. To fix nant do the following:
Find NAnt.exe.config in the same directory as nant.exe. Find the element that begins

<framework
name="net-2.0"
...


Within that element you'll find the following:


<project>
<readregistry
property="installRoot"
key="SOFTWARE\Microsoft\.NETFramework\InstallRoot"
hive="LocalMachine" />
<readregistry
property="sdkInstallRoot"
key="SOFTWARE\Microsoft\.NETFramework\sdkInstallRootv2.0"
hive="LocalMachine"
failonerror="false" />
</project>




Note how it looks in the registry for sdkInstallRootv2.0. In my registry that was pointed to a VS2005 directory which doesn't actually have a full SDK. I pointed it to the new SDK paths Microsoft is using, in my case C:\Program Files\Microsoft SDKs\Windows\v6.0A\ , and then my project worked (well at least it got further than it did :) )



I hope this saves somebody some time!