These instructions are a great 5 minute guide to using iTunes at work. My mini at home already has SSH access enabled, so fire up Putty, make a tunnel, install the helper app and Boom! You’ve got music at work

 

This is just the weirdest. Not three minutes ago my Norwegian mobile phone that I haven’t had turned on since christmas suddenly turned itself on, and just a second thereafter my smoke alarm went bananas. I can smell no smoke, no smoke outside, no smoke in the entrance, not anywhere. What’s going on? Normally I would just assume it malfunctioned, but my mobile phone turned itself on! It shouldn’t be able to do that??

 

One of my pet project has been FrontRow and using my mini with an Elgato Hybrid and EyeTV as a media centre. At the moment its very quirky since there isn’t much info on making FrontRow plugins, or so I thought. Yesterday I read about PyeTV, an EyeTV integration for FrontRow written in Python using FrontPython. Jay! I love Python! And all this while I had been betting to read about it at Alan’s blog. But he got a girl, so jay for him as well. :-) I’m looking forward to having some time on my hands to use FrontPython and see if I can put together a SNES launcher from FrontRow, integrated with DarwiinRemote. :-) Check out Plugin101 for FrontPython on how to get started. Now, is anyone working on making a clone of the YouTube support that AppleTV has for FrontRow? BTW, check out Sapphire Browser that seems to have started it all

 

 

The Canon EOS 450 was announced today, and now DPReview has made a preliminary review of it. I’m sad it doesn’t go past 1600 ISO. Nikon is going for high ISOs now, and Canon has pretty much stood still since I bought my 20D. My wish for the next camera (Canon 50D?) is higher ISO with low noise (low noise at 6400 ISO, boost ISO to 25600 ISO. I can dream, can’t I? But Nikon has low noise up to 3200 ISO so Canon should do its best to do better) and sensor-based image stabilizing. If you need to cut back, Canon, I can do without live view. :-)

 

Indianapolis Museum of Art has the best dashboard ever. If you’re a happy mac user and working with business intelligence, you’ll want to make dashboards like this! (Thank you DashboardSpy for the link)

 

Time Machine included in Leopard backs up your ~/Library/Caches unless you explicitly ask it not to. Just something to make a choice about when setting up your hourly backups. I do my backups to a remote disk, so I certainly would not like to every hour have my last hour of browsing backuped. ;-)

 

The one thing I don’t get with showers is why there always is water left in them. I mean, I get the physics of it, I just don’t understand why I can’t just press a little lever on the shower battery and make the remaining water flow out in the drain. Then I can be sure that no water will slowly go out of my shower and make a damp bathroom, chalk stains or grow bacteria after I’m done showering.

 

I don’t know if this is bash or an OS X feature, but nonetheless: today I discovered that there’s tab-completion that takes .ssh/config into account! I on-instinct did a tab after writing part of the hostname I wanted and (boom!) there it was, auto-completed with a colon. So to SSH to my mini I did “ssh mi” and go “scp mini:”. If this is the bash-guys or the darwin guys, I don’t know, I hope to find out. Nonetheless: a big thank-you! :-)

 

In Scott Larsons blogpost referenced in my last post he gives a short but important note: his favourite MDX resource. And I agree: a 62 article series in learning MDX. Since I’ve worked with SQL “all my life” I’ve not bothered to much with MDX, but with this series I’m really looking forward to learning it better. To do the tutorials you’ll need the free MS-SQL 2000 samples (that unfortunately aren’t bundled with neither MS-SQL 2005 nor MS-SQL 2008). You can download them from here. I should note that while it compiles fine with VB6, using it with Visual Studio 2005 left me with a pretty large debugging job. But don’t worry, the data sources are included and that really is all you need to work through the tutorials. For the interface, you’ve got BIDS

 

What bugs me very much about working with KPIs in PerformancePoint’s Dashboard is that you cannot do simple calculations. For instance, I have a sales cube that has the measures unit cost and price the unit was sold for. I would like to say that a loss (price/cost < 1) makes the KPI red, a <20% margin makes it yellow and >=20% is green. In Excel this would be trivial: choose the price column, type ‘/’ and choose the cost column: voila, you’ve got your calculation. Not so with Dashboard. As Rex Parker from Microsoft writes in the PerformancePoint Team Blog you’ll have to write an MDX query. I don’t believe MDX is for the average business person that PerformancePoint Dashboard is aimed at. :-) But until MS puts together an expression tool that is as least as understandable as Excel, Scott Larson has put together a nice little tutorial to show how to write such expressions with MDX.

I agree with Scott’s comment: I’m beginning to suspect that the use of PerformancePoint, at least in it’s early releases, will require at least functional knowledge of MDX and PerformancePoint Expression Language (PEL) for PerformancePoint Planning, neither of which are exactly business-user friendly

 

One of my main gripes with Microsoft SSIS is that there is no way to reuse logic. In my data integration task I needed to do the same lookup and translation tasks (typically convert to upper case, replace ” with ‘N/A’, look up column in side table and use the IDs from that table instead) many times, in my case when importing data from an Axapta database. CozyRoc got back to me and told me that they have released an SSIS component that includes new components for reusability of code and flows. Being a coder I had given up on SSIS and rewritten my work in C#/SQL, but next time I’m very much looking forward to using it.

 

At work I’m looking at PerformancePoint, and being a newbie with this product I of course do all the newbie errors. That’s why I was so happy when finding Nick Barclay‘s blogpost where he explains all about the way-to-common connection errors. Big thank you to Nick. :-)

 

Not quite happy with any of the programs I found to identify iTunes duplicates, I spent an hour making my own (beats tracking down duplicates. :-) ) I thought I’d share it with you. It’s my first attempt at using OS X’ ScriptingBridge and written in Python. I have no clue if it runs out of the box, I suppose you should have Developer Tools installed. It’s not the fastest beast either, and Python and iTunes both use 50% CPU. But it gets the job done. :-) If you wonder why I give so many parameters to the track class I should say that I plan on reusing it to do some more iTunes housekeeping. The script will mark all the duplicates with one star. Then I can round them up and delete them afterwards.

import struct
from ScriptingBridge import *

class Track:
   def __init__(self, name, album, artist, size, length, track, path):
     self.name= self.str(name)
     self.album= self.str(album)
     self.artist= self.str(artist)
     self.size = size
     self.length= self.str(length)
     self.track = track
     self.path= self.str(path)

   def str(self, s):
     try:
       return s.encode('utf-8')
     except:
       return "N/A"

   def equals(self, t):
     test = t.name == self.name
     test = test and t.album == self.album
     test = test and t.artist == self.artist
     test = test and t.size == self.size
     test = test and t.length == self.length
     test = test and t.track == self.track
     return test

   def __eq__(self, t):
     return self.equals(t)

iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
lib = iTunes.sources()[0].playlists()[0]
tracks = lib.tracks()
filetracks = lib.elementArrayWithCode_(struct.unpack('>L', 'cFlT')[0])

Tracks = []
Duplicates = []
duplicates = []
for track in filetracks:
  t = Track(track.name(), track.album(), track.artist(), track.size(), track.time(), track.trackNumber(),track.location())
  if(Tracks.__contains__(t)):
    Duplicates.append(t)
    duplicates.append(track)
  else:
    Tracks.append(t)

print len(duplicates)

# Deal with duplicates
for track in duplicates:
   track.setRating_(20)
© 2012 Niklas Saers' blog Suffusion theme by Sayontan Sinha