<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5135528453578823385</id><updated>2012-02-02T18:32:26.468-05:00</updated><category term='ruby'/><category term='modsecurity'/><category term='mod_evasive'/><category term='Technology'/><category term='pentaho'/><category term='connection'/><category term='web'/><category term='SQL Server'/><category term='availability'/><category term='business intelligence'/><category term='api'/><category term='linkedin'/><category term='Oracle'/><category term='Microsoft SQL Server'/><category term='matt casters'/><category term='iphone'/><category term='analysis'/><category term='uptime'/><category term='dos'/><category term='Servers'/><category term='PDI'/><category term='apache'/><category term='linux'/><category term='java'/><category term='pentaho data integration'/><category term='httpd'/><category term='olap4j'/><category term='mdx'/><category term='security'/><category term='economy'/><category term='ssh'/><category term='monitoring'/><category term='olap'/><category term='bi'/><category term='pentaho analysis tool'/><category term='kettle'/><category term='zenoss'/><category term='bfd'/><category term='PAT'/><category term='wabit'/><category term='wabit sqlstream'/><category term='SSAS'/><category term='market'/><category term='apf'/><category term='server'/><category term='Mondrian'/><category term='snmp'/><category term='governance'/><category term='foss'/><category term='jruby'/><category term='parser'/><category term='power*architect'/><category term='.NET'/><title type='text'>The Dev Donkey Blog</title><subtitle type='html'>something something software</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-3503649347357581494</id><published>2011-12-15T22:30:00.000-05:00</published><updated>2011-12-16T20:42:38.735-05:00</updated><title type='text'>Robot 02</title><content type='html'>Last month, I built my second robot, which I cleverly nicknamed Robot 02. Its name stands for... well the name says it all, really.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-jez4V4taPa8/TuqrJgc9pqI/AAAAAAAAAHc/HUCsp14s8dM/s1600/CameraZOOM-20111215211202024.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-jez4V4taPa8/TuqrJgc9pqI/AAAAAAAAAHc/HUCsp14s8dM/s400/CameraZOOM-20111215211202024.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Pictured above, Robot 02 is my second attempt at building an autonomous robot capable of navigating around a room. I wanted it to go around obstacles and detect when it gets stuck so that it can act accordingly. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;b&gt;The hardware&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hardware wise, the robot is quite simple. Its base chassis is a Dagu Rover 5 robot plafrorm. I've discovered that marvelous piece of hardware while searching on the net for robot platforms. This one can use both tracks and wheels, and since it has four independent motors, it can be fitted with &lt;a href="http://en.wikipedia.org/wiki/Mecanum_wheel"&gt;Mecanum wheels&lt;/a&gt; for ultimate traction control.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-GjNYP1-8UKM/Tuqv462MB_I/AAAAAAAAAH0/djyRk6Ijmuk/s1600/screenshot.1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://4.bp.blogspot.com/-GjNYP1-8UKM/Tuqv462MB_I/AAAAAAAAAH0/djyRk6Ijmuk/s400/screenshot.1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Each of the four motors has a dual channel optical encoder built-in. These allow the robot to detect the speed and direction of rotation of each wheel.&lt;br /&gt;&lt;br /&gt;Each motor takes approximately 4 amps when stalling, so the Arduino board cannot possibly drive these 4 babies. To drive them, I'm using a Dagu 4 channel DC motor controller.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-hTjiNSRdoEo/TuqrTNwII_I/AAAAAAAAAHs/Bfcj6S-lXkc/s1600/CameraZOOM-20111215211253181.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-hTjiNSRdoEo/TuqrTNwII_I/AAAAAAAAAHs/Bfcj6S-lXkc/s400/CameraZOOM-20111215211253181.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;This board takes care of driving the motors. It has two separate power inputs at the top left and right corners, one driving the logical components, the other driving the motors themselves. On the top side of the board are pictured the connections to the encoders. We have to provide a 5V power supply to each, and we get back two signal wires per encoder (one per optical lens, if you remembered these are dual encoders).&lt;br /&gt;&lt;br /&gt;On the sides are the power wires running to the motors.&lt;br /&gt;&lt;br /&gt;At the bottom, a ribbon cable sends a mix of digital and analog signals to the Arduino board. It consists of four pins per motor channel. One ground, one digital input that we set to high to reverse the direction, one analog output which varies between 0 and 4.5 volts according to the number of amps the motor uses, and finally one Pulse Width Modulated (PWM) input to control the speed.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bVCyrhesrKQ/TuqrOTI1YVI/AAAAAAAAAHk/amABKY98rUc/s1600/CameraZOOM-20111215211224393.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-bVCyrhesrKQ/TuqrOTI1YVI/AAAAAAAAAHk/amABKY98rUc/s400/CameraZOOM-20111215211224393.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Right beside the DC board a HMC6352 compass. From my experience a compass works much better when it isn't surrounded by a whole bunch of other electronic components and wires. Those interfere easily with the compass readings, and since the robot needs to update frequently its heading, we need fast and accurate results. I've mounted the compass on cable headers which I've hotglued to a plastic board spacer. This setup allows me to update the heading more than 5 times a second with reliable readings. Although, I resorted to doing multiple readings and averaging the results. This gives somewhat more reliable readings since it reduces the noise from possible flukes.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-F5s_x8_Bsyk/Tuqq6cjTcsI/AAAAAAAAAHE/BsF3wHbFuRA/s1600/CameraZOOM-20111215211031943.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-F5s_x8_Bsyk/Tuqq6cjTcsI/AAAAAAAAAHE/BsF3wHbFuRA/s400/CameraZOOM-20111215211031943.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;At the top of the robot are a pair of opposed ultrasonic sensors fixed to a servo motor. These are required to figure out how close the robot is to obstacles in its environment. I used two LV-MaxSonar-EZ0 ultrasonic sensors. These have a range between 6 and 150 inches and a beam width of about 5 inches, so they are perfectly suited for the size of my robot. These little babies can operate in digital and analog mode. The digital mode gives slower but more accurate readings. In digital mode, the component will send a digital pulse each time the echo comes back. After you do the math and factor in the speed of sound, you get the reading you need. In analog mode, the sensor is much faster but less accurate. The analog pin sends a variable voltage which represents the distance of the echo, but an analog output suffers from the noise of the other components of the robot (especially the servo). These range finders also support serial communication, but I haven't experimented with that yet.&lt;br /&gt;&lt;br /&gt;From my experience, I get better results by using the digital mode and I programmed my robot to do multiple readings, which it then averages, to reduce the noise even further. Accuracy and speed are key here.&lt;br /&gt;&lt;br /&gt;The SG-5010 servo can rotate 180 degrees in both direction, but we only really need to spin it in an arc of 135 degrees total, thanks to the twin-mount. Since it scans two directions at a time, scanning all around is done pretty quickly. Again, speed is key when dealing with a single threaded micro-controller.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-F5mT6QQ8yKY/Tuqq-GzttII/AAAAAAAAAHM/PqKfG8Ur7ss/s1600/CameraZOOM-20111215211059328.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-F5mT6QQ8yKY/Tuqq-GzttII/AAAAAAAAAHM/PqKfG8Ur7ss/s400/CameraZOOM-20111215211059328.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;While building my previous robot, I've learned that creating a connection hub with a prototyping board that sits between your components and your micro controller makes your life that much easier. Micro controllers have a limited number of 5V, 3V and ground pins, and this robot requires about a dozen of each. The robot is already clogged with wires; without that board, the robot would looks like a spaghetti ball.&lt;br /&gt;&lt;br /&gt;Good prototyping boards are hard to find in Montreal. If like me you don't know where to get good and cheap ones, you can buy them off the old Chinese chap I've met while I was staying in Toronto last year. He runs a little electronics store and specializes mostly in Arduino and other small PMCs. He also makes these neat prototyping boards that you can order &lt;a href="http://www.creatroninc.com/"&gt;directly form his web site&lt;/a&gt;. Sadly, as I write this post, I realize that his website is offline for maintenance until December 30th. You can always call him directly to pass your order. He has two models, a 2"x1" and a 2"x4", selling for about 3 and 5 dollars respectively. Trust me, they are really worth their price.&lt;br /&gt;&lt;br /&gt;The board will also allow you to mount all your digital and analog inputs on neat wire headers for your micro controller. One thing you don't want is a bunch of loose wires. They get easily disconnected by the moving parts tugging at them every now and then.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-omOeAFEyPPI/Tuqq3VZTM5I/AAAAAAAAAG8/MeBWY7Kb_ac/s1600/CameraZOOM-20111215210917058.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-omOeAFEyPPI/Tuqq3VZTM5I/AAAAAAAAAG8/MeBWY7Kb_ac/s400/CameraZOOM-20111215210917058.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span id="goog_1245070386"&gt;&lt;/span&gt;&lt;span id="goog_1245070387"&gt;&lt;/span&gt;&lt;br /&gt;The brain is an Arduino Mega 2560. It is pictured above as the blue board with a USB connection and a 9V input. This micro controller is an impressive one. 53 digital (about 10 are PWM compatible) and 15 analog inputs, with 5 serial RX/TX pairs. It also supports SDA/SCL, SPDI and some other mostly shady communication protocols. At 16Mhz, it can run up to 256kb of code with 32kb of memory. This is plenty enough for a robot of that size since it currently use about a third of the inputs and barely a quarter of the processing power.&lt;br /&gt;&lt;br /&gt;Sitting right on top of the micro controller is a WiFly shield. Its RN-131G chip uses very little power and has a plethora of features, from wifi network scan to hardware HTTP server. I haven't had time to use it as part of the robot yet, but my plan is to have it serve an HTML page with status information and a manual override of the robot controls. &lt;br /&gt;&lt;br /&gt;Power-wise, I use 12 Ni-Mh 2700mAh AA batteries. Its quite a lot of batteries, but then again, that robot is power hungry. The Hong Kong reseller DealExtreme &lt;a href="http://www.dealextreme.com/p/soshine-2700mah-ni-mh-rechargeable-aa-batteries-with-case-4-battery-pack-12720"&gt;sells these for really cheap&lt;/a&gt; (about 14$, shipping included).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The software&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Software wise, the robot uses a classical&lt;b&gt; &lt;/b&gt;"robot loop". It consists of the three following phases.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Scan the environment.&lt;/li&gt;&lt;li&gt;Analyze and decide what to do next.&lt;/li&gt;&lt;li&gt;Act.&lt;/li&gt;&lt;li&gt;Goto 1.&lt;/li&gt;&lt;/ol&gt;This loop has to be non-blocking, meaning that if the robot has decided to go forward, the loop must still be executed so that the robot can run the scan phase, thus detecting any problems it should act upon.&lt;br /&gt;&lt;br /&gt;I'm programming it in C++ on Eclipse and the AVR plugin. If you are interested the &lt;a href="http://code.google.com/p/devdonkey-arduino/"&gt;source code of the robot&lt;/a&gt; is available on Google code. Arduino boards come with a simple IDE, but I find it to be a bit childish and doesn't offer the productivity tools that you would normally expect from a contemporary IDE. It doesn't have code completion, doesn't let you checkin your files in a SCM, on top of which is a very bad pseudo-file management kinda scheme. I know the ins and outs of Eclipse, so to me this was a no brainer. The effort required to setup Eclipse for AVR development is a bit painful, but nowadays there are &lt;a href="http://www.arduino.cc/playground/Code/Eclipse"&gt;some pretty decent tutorials&lt;/a&gt; that can help you get there. It's definitely worth the effort though.&lt;br /&gt;&lt;br /&gt;As I'm usually working on software only (I'm a software engineer by day...) having to interface with hardware was a brand new experience for me. For one thing, hardware is far from being as precise as simple arithmetics. Most of the components I'm using for this robot have quite a big margin of error when performing measurements. The range finders can give wrong results at random. The compass is easily affected by its surroundings. The servo has to physically turn and you have to account for the time it needs. All these little things add up pretty quickly.&lt;br /&gt;&lt;br /&gt;If you fail to factor in all these little things, your robot will quickly behave erratically. From my experience, it feels like each mistake the robot makes is exponentially affecting the final behavior, as each individual error amplifies the others. Make sure that your code can detect these errors and perform the necessary corrections as it goes along.&lt;br /&gt;&lt;br /&gt;For this iteration (because I do plan to build many more robots) I haven't really used any fancy path finding algorithm. It uses a heuristic algorithm which goes like this.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Scan the surroundings and map the distance available per polar heading, in increments of 45 degrees.&lt;/li&gt;&lt;li&gt;Pick a direction towards which there is a minimum cleared distance and that is closest to the front of the robot (try to turn as little as possible).&lt;/li&gt;&lt;li&gt;Turn the robot either left or right, whichever is the quickest to the desired heading.&lt;/li&gt;&lt;li&gt;Go forward.&lt;/li&gt;&lt;li&gt;While going forward, scan by alternating between the front and either front-left or front-right (at random, in a proportion of 66% to the side where the distance available is the smallest)&lt;/li&gt;&lt;li&gt;Check the polar heading of the robot. If the robot is not headed properly, goto 3.&lt;/li&gt;&lt;li&gt;If it failed to correct the heading for more than X seconds, the robot is most likely stuck. Back up a little and goto 1.&lt;/li&gt;&lt;li&gt;If a collision is imminent, back up a little, and goto 1.&lt;/li&gt;&lt;li&gt;Goto 4. &lt;/li&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/R0UkmfF02nE/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/R0UkmfF02nE?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/R0UkmfF02nE?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I'm planning on implementing something more fancy eventually, but for now it does the job.&lt;br /&gt;&lt;br /&gt;In a near future, I'll spend time finishing the HTTP server. It turns out that because the robot's brain has to run in a non blocking loop, HTTP connections are working only scarcely, if at all. This is a problem I still have to resolve. I have a spare ATMega328 micro controller so it will become dedicated to HTTP and will communicate with the brain through SPDI. I've always wanted to learn SPDI anyways.&lt;br /&gt;&lt;br /&gt;My girlfriend wants us to build a cute robot body for it, so I'll have to spend some time redesigning the wiring in order to make it much more compact. Right now it is in a bulky prototype form, allowing me to change this and that as I tweak it, but soon enough, I won't need to make any changes to the hardware anymore.&lt;br /&gt;&lt;br /&gt;I'll also be spending time perfecting the software, so if you want to collaborate on it, I've made it freely &lt;a href="http://code.google.com/p/devdonkey-arduino/"&gt;available on Google Code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you want more information or need any help with your own design, ask away and maybe we can all benefit from our experiments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-3503649347357581494?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/3503649347357581494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2011/12/robot-02.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/3503649347357581494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/3503649347357581494'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2011/12/robot-02.html' title='Robot 02'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-jez4V4taPa8/TuqrJgc9pqI/AAAAAAAAAHc/HUCsp14s8dM/s72-c/CameraZOOM-20111215211202024.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5949713615317182789</id><published>2011-10-27T13:30:00.001-04:00</published><updated>2011-10-29T00:04:27.337-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='Mondrian'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><title type='text'>A tale of Mondrian and real time analytics</title><content type='html'>Back in April 2008, &lt;a href="http://julianhyde.blogspot.com/"&gt;Julian Hyde&lt;/a&gt;, founder of Mondrian, extends a basic API to control the contents of member caches within the &lt;a href="http://mondrian.pentaho.com/"&gt;Mondrian OLAP engine&lt;/a&gt;. Its name, quite unsurprisingly, is &lt;a href="http://mondrian.pentaho.com/api/mondrian/olap/CacheControl.html"&gt;CacheControl&lt;/a&gt;.There is a basic implementation available, yet that feature remains mostly unknown to most of the community.&lt;br /&gt;&lt;br /&gt;Jump to December 2010. We are brainstorming on Mondrian 3.3 (today this feels like ages ago). We come up with those crazy ideas about enterprise integration, real time analytics and cool APIs / SPIs. One of these crazy ideas is: Wouldn't it be sweet to update Mondrian's member cache and do real time OLAP?&lt;br /&gt;&lt;br /&gt;That's when we remember the old CacheControl API.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&amp;nbsp;A year and a half had passed since the release of the API. After some PR effort, a critical mass of integrators started using it. This gave us incentive to push for that feature and take it over the  final mile. We spent some time testing, fixing what we've found &lt;br /&gt;&lt;br /&gt;In the process, &lt;a href="http://www.willgorman.com/"&gt;Will Gorman&lt;/a&gt;, longtime Mondrian contributor and VP Engineering at Pentaho, writes an example &lt;a href="https://docs.google.com/leaf?id=0B8rYUDFhlV1PN2QxMWE4OTItZGNmYS00YmIyLWE1NWUtOTQyMjM0NzY1M2Fj&amp;amp;hl=en_US"&gt;Pentaho XAction script&lt;/a&gt; to demonstrate how someone can use the API, in Javascript, run by Rhino, within a JVM.&lt;br /&gt;&lt;br /&gt;It starts by a Mondrian schema.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;resources&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;catalog&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;url&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;location&amp;gt;solution:steel-wheels/analysis/steelwheels.mondrian.xml&amp;lt;/location&amp;gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-type&amp;gt;text/xml&amp;lt;/mime-type&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/url&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/catalog&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;lt;/resources&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;To which we add two simple steps, the first of which establishes an OLAP connection.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;action-definition&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;component-name&amp;gt;MDXLookupRule&amp;lt;/component-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action-type&amp;gt;OLAP Connection&amp;lt;/action-type&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action-resources&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;catalog type="resource"/&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/action-resources&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action-outputs&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;prepared_component type="mdx-connection" mapping="shared_olap_connection"/&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/action-outputs&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;component-definition&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;jndi&amp;gt;&amp;lt;![CDATA[SampleData]]&amp;gt;&amp;lt;/jndi&amp;gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;location&amp;gt;&amp;lt;![CDATA[mondrian]]&amp;gt;&amp;lt;/location&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/component-definition&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/action-definition&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;The second contains the juicy part. This is where the magic happens. We use the Javascript step to update Mondrian's caches.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;action-definition&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;component-name&amp;gt;JavascriptRule&amp;lt;/component-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action-type&amp;gt;JavaScript to clear portions of the cache&amp;lt;/action-type&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action-inputs&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;shared_olap_connection type="mdx-connection"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/action-inputs&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action-outputs&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;rule-result type="string"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/action-outputs&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;component-definition&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function cacheControlImpl() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // get access to the necessary cache control API objects&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var conn = shared_olap_connection.shareConnection().getConnection();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var salesCube = conn.getSchema().lookupCube("SteelWheelsSales", true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var schemaReader = salesCube.getSchemaReader(null).withLocus();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var parent = schemaReader.getMemberByUniqueName(Packages.mondrian.olap.Id.Segment.toList("Product", "All Products", "Classic Cars", "Autoart Studio Design"), true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var hierarchy = parent.getHierarchy();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var member = hierarchy.createMember(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; parent,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; parent.getLevel().getChildLevel(),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; "1927 Ford Model T",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; null);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var cacheControl = conn.getCacheControl(null);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // must have mondrian.rolap.EnableRolapCubeMemberCache=false set in&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // pentaho-solutions/system/mondrian/mondrian.properties&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // We could also set it explicitly here by calling:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Packages.mondrian.olap.MondrianProperties.instance().EnableRolapCubeMemberCache.set(false);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var addCommand = cacheControl.createAddCommand(member);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cacheControl.execute(addCommand);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return "Flushed: " + parent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cacheControlImpl();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/component-definition&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/action-definition&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;We're done. The complete script is &lt;a href="https://docs.google.com/leaf?id=0B8rYUDFhlV1PN2QxMWE4OTItZGNmYS00YmIyLWE1NWUtOTQyMjM0NzY1M2Fj&amp;amp;hl=en_US"&gt;available for download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;CacheControl contains methods to perform changes on the member cache,  but the cell cache as well. Using CacheControl to modify the members  caches updates both the member caches and flushes the cell data's cached  regions as well. (This also affects any pluggable SegmentCache you are using by flushing out the regions touched by the members you modify.)&lt;br /&gt;&lt;br /&gt;As mentioned in the script above, you must turn Mondrian's ROLAP member cache off. This means Mondrian must wrap objects as it resolves your query in a thin wrapper. That operation itself takes some time to perform, but allows Mondrian to optimize the members at runtime. Usually, we only wrap them once and cache them, but this leaves out the updates performed by CacheControl. This is a technical debt we pay, but fear not, Mondrian 4.0 will address that issue and remove that layer altogether.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The future&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Our next step will be to expose that functionality through olap4j and make it easily available to ETL tools out there. There is, at the time this article is written, someone working on adding olap4j connections to the Kettle project. I can't specify any release date, but trust me, this opens a whole lot of possibilities. (A Kettle step for a Mondrian cache update would be pretty cool. Contributions are welcome, as always, wink wink.)&lt;br /&gt;&lt;br /&gt;Our final step (i mean long term here...) will be to bubble up those events to the olap4j driver, using the &lt;a href="http://www.olap4j.org/api/org/olap4j/CellSetListener.html"&gt;CellSetListener&lt;/a&gt;. This will allow user interfaces to get notified when new data arrives.&lt;br /&gt;&lt;br /&gt;Full circle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5949713615317182789?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5949713615317182789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2011/10/tale-of-mondrian-and-real-time.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5949713615317182789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5949713615317182789'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2011/10/tale-of-mondrian-and-real-time.html' title='A tale of Mondrian and real time analytics'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5301942596181698199</id><published>2011-04-12T00:01:00.006-04:00</published><updated>2011-04-13T18:46:02.916-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><title type='text'>olap4j 1.0 is here</title><content type='html'>Dear olap4j community,&lt;br /&gt;&lt;br /&gt;It is with immense pride that we deliver to you today version 1.0 of olap4j. Yup. And you should be proud as well. Thanks to you and to the concerted efforts of countless collaborators, advisers, testers, integrators and developers worldwide, we were able to reach this historic milestone.&lt;br /&gt;&lt;br /&gt;If you would allow me to exagerate blatantly for a second, olap4j 1.0 is what I believe the greatest and bestest &lt;i&gt;(yes, you've read it right, bestest)&lt;/i&gt; version to have ever been granted to humanity. &lt;br /&gt;&lt;br /&gt;At this point, I encourage you to go read the &lt;a href="http://www.pentaho.com/news/releases/pentaho-announces-a-new-era-in-open-standards-for-analytics"&gt;official press release&lt;/a&gt; instead of reading my futile efforts at proper journalism. Our fine folks really know how to best express what olap4j represents, why it is important and why it *might* be the bestest thing on Earth. I've also resisted the urge to copy / paste their fabulous text. That said, I'll do my part and get into the more technical details.&lt;br /&gt;&lt;br /&gt;You will first notice that the distribution files have changed. The XML/A driver is now separated from the core API. This is a good thing for the project, as it will allow us to fix issues and release more often. Those of you who are using the JDK 1.4 compatible distribution will still get the XML/A driver in the same library. The four binary libraries are available on our &lt;a href="http://repository.pentaho.org/artifactory/"&gt;Maven repository&lt;/a&gt; and &lt;a href="https://sourceforge.net/projects/olap4j/files/olap4j/olap4j-1.0.0/"&gt;Sourceforge project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Among other changes, the top levels of the connection's metadata have also received some upgrades. A new metadata element was introduced at the top; the Database. We have also removed everything that was marked for deprecation as of 1.0. We therefore encourage people to test carefully while upgrading.&lt;br /&gt;&lt;br /&gt;The reference implementation, Mondrian, is compatible with olap4j 1.0, but only for version 3.3.0.14192 and upwards. This means that if you are using both Mondrian and olap4j, the only compatible build is not certified nor tested anymore than any regular CI release. On production systems, you should abstain from upgrading to Mondrian 3.3.X or risk the consequences, although the 3.3.X series are very similar to what we released with the 3.2.X cousin. Anyhow, bottom line is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; If you're only using olap4j and the XML/A driver, upgrade at will!&amp;nbsp;&lt;/li&gt;&lt;li&gt;If you're using Mondrian too, we suggest waiting for Mondrian 3.3 official. &lt;/li&gt;&lt;li&gt;If you like to live on the edge, grab olap4j 1.0.0.445 and Mondrian 3.3.0.14192. They are both available in our Maven repository.&lt;/li&gt;&lt;/ul&gt;That's it for now. As usual, drop by our forums or mailing list if there is anything we can help with. And again, congratulations to everyone for the hard work.&lt;br /&gt;&lt;blockquote&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;olap4j's&amp;nbsp;&lt;/span&gt;&lt;/u&gt;&lt;span style="font-size: x-small;"&gt;&lt;u&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; maven repository cheat sheet&lt;/span&gt;&lt;/u&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;url: &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://repository.pentaho.org/artifactory/&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;group: &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; org.olap4j&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;artifacts:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; olap4j&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; olap4j-xmla&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; olap4j-jdk14&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; olap4j-tck&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5301942596181698199?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5301942596181698199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2011/04/olap4j-10-is-here.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5301942596181698199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5301942596181698199'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2011/04/olap4j-10-is-here.html' title='olap4j 1.0 is here'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-7249216678636263888</id><published>2011-03-01T12:34:00.000-05:00</published><updated>2011-03-01T12:40:45.400-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='Mondrian'/><title type='text'>Mondrian High Cardinality Dimensions Demystified</title><content type='html'>Performance is the buzz word in Analysis these days. Real time, MapReduce, scalability. Mondrian is no exception in this trend. As the worldwide pool of data grows, our analysis software must follow in its wake. I often get questions related to Mondrian performance, and most of the time, people expect a magic answer to their performance issues. The answer to solve them all.&lt;br /&gt;&lt;br /&gt;Mondrian, like other ROLAP engines, are notoriously hard to fine tune for performance. There are many pieces of technology collaborating together, and the final performance will be that of the weakest link. In Mondrian's case, the performance must therefore be taken into account at all levels:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We must perform efficient internal processing&lt;/li&gt;&lt;li&gt;We use the leanest internal data structures&lt;/li&gt;&lt;li&gt;We must generate 'scalable' SQL queries&lt;/li&gt;&lt;li&gt;Many many other things...&lt;/li&gt;&lt;/ul&gt;The two first points are easy enough to understand. Good software is lean and efficient. There is no black magic here. The third, on the other end, sounds like nothing more than a marketing buzzword, eh? Well... there is more to it. As I said earlier, the total performance will be that of the weakest link. It follows that Mondrian, being a ROLAP engine, must at all times issue the best SQL queries possible to the underlying RDBMS, or suffer the consequences. Why 'scalable', and what does it mean here?&lt;br /&gt;&lt;br /&gt;When designing a data warehouse, the number of records in your fact / dimensions tables will greatly influence the overall system performance. Again, no voodoo dolls here, just plain commonsense. Some dimensions are huge. We're talking millions of members. We call those High Cardinality Dimensions (HCD). They are in fact a common occurrence. A popular website's data warehouse and their user's dimension table is very likely to contain millions of rows. A reseller will have a products dimension table just as big, or more. A common way to safeguard the performance of those tables is to use &lt;a href="http://en.wikipedia.org/wiki/Partition_%28database%29"&gt;table partitioning&lt;/a&gt;. In short, this means your RDBMS will split the table in logical sections. When queried, the RDBMS will only scan the partitions relevant to the query, therefore leaving alone most of the data. This all sounds good in theory, but there is a very important implied requirement here. The SQL queries must take this into account. Issuing a &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SELECT COUNT(*)&lt;/span&gt; on the table will require the RDBMS to scan all partitions, thus eliminating the advantage gained by partitioning the table. &lt;br /&gt;&lt;br /&gt;So. Today's article will cover Mondrian's means to leverage the table partitioning of the underlying RDBMS. We will only cover the case of HCD. Not the fact table. I might write something later, but in the meanwhile, there are some &lt;a href="http://itxpander.wordpress.com/2010/03/20/mysql-partition-prunning-and-mondrian/"&gt;very good articles&lt;/a&gt; out there on the subject. &lt;br /&gt;&lt;br /&gt;Paradigm shift. We are a user. We are seated in front of an OLAP exploration tool. It is connected to a Mondrian instance. We drag the customer's dimension in the grid along with the regions and sales measure. We press the execute button. The query takes 10 seconds to return. We are frustrated. We blame the guy responsible for the Mondrian instance.&lt;br /&gt;&lt;br /&gt;Paradigm shift. We are the guy who administers the Mondrian instance. Looking at the SQL logs, we see the following:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;select &lt;br /&gt;&amp;nbsp; r.region_name, c.customer_name, sum(f.sales)&lt;br /&gt;from &lt;br /&gt;&amp;nbsp; sales_fact f, regions r, customers c&lt;br /&gt;where &lt;br /&gt;&amp;nbsp; f.region_id = r.id and f.customer_id = c.id&lt;br /&gt;group by &lt;br /&gt;&amp;nbsp; r.region_name, c.customer_name&lt;/blockquote&gt;Remember my &lt;a href="http://devdonkey.blogspot.com/2011/02/mondrian-spi-segmentcache.html"&gt;previous post about segments&lt;/a&gt; and internal cell data representation within Mondrian? The query above is due to Mondrian's decision to create a single segment based on the query the user issued. This query looks great, right? No. Well, it depends. It's fine IF none of the tables here are partitioned. If they were, the query would scan all partitions. This is where Mondrian HCD capabilities come in. Mondrian schemas have an attribute on the CubeDimension element class to instruct it to switch to HCD mode when dealing with that particular dimension. It is &lt;a href="http://mondrian.pentaho.com/documentation/xml_schema.php#CubeDimension"&gt;detailed here&lt;/a&gt;. The end result is that the single segment is split in smaller segments, each covering a single tuple. The SQL generated becomes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;select &lt;br /&gt;&amp;nbsp; r.region_name, c.customer_name, sum(f.sales)&lt;br /&gt;from &lt;br /&gt;&amp;nbsp; sales_fact f, regions r, customers c&lt;br /&gt;where &lt;br /&gt;&amp;nbsp; f.region_id = r.id and f.customer_id = c.id&lt;br /&gt;&amp;nbsp; and r.region_id = 42 and c.customer_id = 1&lt;br /&gt;group by &lt;br /&gt;&amp;nbsp; r.region_name, c.customer_name&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;&amp;nbsp; r.region_name, c.customer_name, sum(f.sales)&lt;br /&gt;from &lt;br /&gt;&amp;nbsp; sales_fact f, regions r, customers c&lt;br /&gt;where &lt;br /&gt;&amp;nbsp; f.region_id = r.id and f.customer_id = c.id&lt;br /&gt;&amp;nbsp; and r.region_id = 42 and c.customer_id = 2&lt;br /&gt;group by &lt;br /&gt;&amp;nbsp; r.region_name, c.customer_name&lt;br /&gt;&lt;br /&gt;(...)&lt;br /&gt;&lt;br /&gt;select &lt;br /&gt;&amp;nbsp; r.region_name, c.customer_name, sum(f.sales)&lt;br /&gt;from &lt;br /&gt;&amp;nbsp; sales_fact f, regions r, customers c&lt;br /&gt;where &lt;br /&gt;&amp;nbsp; f.region_id = r.id and f.customer_id = c.id&lt;br /&gt;&amp;nbsp; and r.region_id = 42 and c.customer_id = &lt;i&gt;N&lt;/i&gt;&lt;br /&gt;group by &lt;br /&gt;&amp;nbsp; r.region_name, c.customer_name&lt;/blockquote&gt;We are now assured that each query touches one and only one partition. It might seem less than optimal to issue so many queries, but when you get down to benchmarking it, the performance is quite good. Not only do small queries take a very small amount of time to execute on the RDBMS side, they are very lightweight and can be handled by Mondrian extremely efficiently. As a matter of fact, in most cases where I tested this, it was more efficient to issue all of those small queries than the cross-partition big wooping query.&lt;br /&gt;&lt;br /&gt;But we can do better. By changing the value of the &lt;a href="http://mondrian.pentaho.com/headapi/mondrian/olap/MondrianProperties.html#HighCardChunkSize"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mondrian.result.highCardChunkSize&lt;/span&gt; property&lt;/a&gt;, we can batch X tuples per segment, compared to a single one. Setting it to 5 would result in queries looking similar to this:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;select &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;  &amp;nbsp; r.region_name, c.customer_name, sum(f.sales&lt;/span&gt;)&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;  from &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;  &amp;nbsp; sales_fact f, regions r, customers c&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;  where &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;  &amp;nbsp; f.region_id = r.id and f.customer_id = c.id&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;  &amp;nbsp; and r.region_id = 42 &lt;br /&gt;&amp;nbsp; and c.customer_id in (1,2,3,4,5)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;  group by &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;  &amp;nbsp; r.region_name, c.customer_name&lt;/span&gt; &lt;/blockquote&gt;The chances that the customer_id predicate overlaps over two different partitions are quite small. Even if it was to happen, it would still touch no more than two partitions as compared to all of them previously. There are more ways to optimize Mondrian for HCDs, but that's it for today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-7249216678636263888?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/7249216678636263888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2011/03/mondrian-high-cardinality-dimensions.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/7249216678636263888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/7249216678636263888'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2011/03/mondrian-high-cardinality-dimensions.html' title='Mondrian High Cardinality Dimensions Demystified'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-8905732995359140012</id><published>2011-02-13T12:38:00.000-05:00</published><updated>2011-02-13T12:38:19.659-05:00</updated><title type='text'>Welcome!</title><content type='html'>I was searching the internet for some technical documents and stumbled on this website where the documents were behind a password prompt. What struck me is the weird password prompt, which was not the standard Firefox BASIC authentication prompt. Using curl, I discovered this gem &lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;SCRIPT language="JavaScript"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;!--hide&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;var password;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;var pass="[redacted]";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;password=prompt('Enter password:',' ');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;if (password==pass)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; alert('Welcome!');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;window.location="errorframe.asp";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;//--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/SCRIPT&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;Welcome indeed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-8905732995359140012?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/8905732995359140012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2011/02/i-was-searching-internet-for-some.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/8905732995359140012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/8905732995359140012'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2011/02/i-was-searching-internet-for-some.html' title='Welcome!'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-435218934824080795</id><published>2011-02-03T16:26:00.000-05:00</published><updated>2011-02-03T23:40:53.456-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='Mondrian'/><title type='text'>Mondrian SPI SegmentCache</title><content type='html'>Fellow Mondrian developers and users,&lt;br /&gt;&lt;br /&gt;One month has already passed since the new year festivities, and while most of you have been trying to renew your gym membership or hold on to your new year resolutions the best you could, so did the Mondrian team. Our resolutions, although not requiring personal sacrifices, are none the less starting to bear fruit.&lt;br /&gt;&lt;br /&gt;For you see, our resolution for the year was to provide Mondrian developers and integrators means to achieve better understanding, scalability and control. We have many ideas on how to reach those goals. Some of them are still in their infancy, yet some of them have already been committed to the source. Last month, we worked on the first phase. We added means for system architects to externalize and share a&amp;nbsp; pluggable segment cache. What does this mean exactly? Let's take a step back in order to better understand.&lt;br /&gt;&lt;br /&gt;Internally, Mondrian splits the tuples in segments. A typical segment could be described as a measure crossjoined by a series of predicates. As an example, a textual representation of a segment contents could be:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Measure = [ Sales ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Predicates = {&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[ Products = * ],&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ State = California ],&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ Gender = Male ] }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Data = [ 1346.34, 234.00, ... ]&lt;/span&gt;&lt;/blockquote&gt;In the case above, the segment would represent the Sales data of all males in California, for all products. It is a lot more effective to deal with those data structures. If Mondrian was to internally represent each data cell individually, the unique identifier of that cell would be of a greater size than the data itself, thus creating a whole lot more problems in terms of data efficiency. This is therefore why Mondrian deals with groups of cells, which it loads in batches, rather than individually. There is a lot of voodoo magic and heuristics in the background trying to figure out how best to group those segments and how to reduce the number of segments to load, ultimately reducing the number of SQL queries to be executed. Mondrian will group all segments with the same predicates but with a different measure into a segment group. Mondrian will also tend to remove as many predicates as it possibly can in order to optimize the data payload. Lets say that a segment covers all products except a single one, Mondrian will still include the product in the segment but filter it out when a specific query requires it. &lt;br /&gt;&lt;br /&gt;Once those segments are populated, Mondrian keeps those in a collection of weak references in local memory. All required segment references are pinned down during the resolving of a particular query, but as soon as the query is done executing, the references are returned to their weak state, thus ready to be garbage collected if needed. This simple mechanism allows Mondrian to answer just about any query, as long as the memory allocated is big enough to answer that particular query. This works really well in fact, since in most small deployments, the maximum amount of memory is never reached. And if it ever gets filled, old segments will be evicted to make some room for the new ones.&lt;br /&gt;&lt;br /&gt;Now, there are obvious gotchas. First off, what if it takes a long time for a segment to be populated by the RDBMS. This means that if a particular segment ever gets picked up by the garbage collector, the MDX query sent to Mondrian *might* take longer to execute, whether it was in the segment cache or not. This is not acceptable, simply because this makes all performance predictions impossible.&lt;br /&gt;&lt;br /&gt;This is where the SegmentCache SPI comes in. It is essentially a pluggable cache for segments. The algorithm behind the segment loader becomes this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lookup segments in local cache and pin those required. &lt;/li&gt;&lt;li&gt;Optimize / group segments&lt;/li&gt;&lt;li&gt;Lookup segments from the SPI cache&lt;/li&gt;&lt;li&gt;Load the segments found from the SPI&amp;nbsp; cache&lt;/li&gt;&lt;li&gt;Populate the remaining unloaded segments from the RDBMS&lt;/li&gt;&lt;li&gt;Put the segments which come from the RDBMS into the SPI cache &lt;/li&gt;&lt;li&gt;Pin all loaded segments&lt;/li&gt;&lt;li&gt;Resolve the query&lt;/li&gt;&lt;li&gt;Unpin all segments in the local cache&lt;/li&gt;&lt;/ul&gt;But wait! There is more! The SegmentCache SPI is trivial to implement.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Future&amp;lt;Boolean&amp;gt; contains(SegmentHeader header);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Future&amp;lt;SegmentBody&amp;gt; get(SegmentHeader header);&lt;br /&gt;Future&amp;lt;List&amp;lt;SegmentHeader&amp;gt;&amp;gt; getSegmentHeaders();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Future&amp;lt;Boolean&amp;gt; put(&lt;br /&gt;&amp;nbsp; SegmentHeader header,&lt;br /&gt;&amp;nbsp; SegmentBody body);&lt;br /&gt;void tearDown();&lt;/span&gt;&lt;/blockquote&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_qNJXxQcuKDM/TUtk3p9so8I/AAAAAAAAAEI/lHcS8yzIq0k/s1600/MondrianSegmentCacheSPI.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="191" src="http://1.bp.blogspot.com/_qNJXxQcuKDM/TUtk3p9so8I/AAAAAAAAAEI/lHcS8yzIq0k/s400/MondrianSegmentCacheSPI.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 1. Mondrian Segment Loader Architecture&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;span id="goog_1496644437"&gt;&lt;/span&gt;&lt;span id="goog_1496644438"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are two assumptions that are made towards the implementation. The first obvious one is that the cache must assume that many Mondrian instances might access the cache concurrently, form different threads. We therefore recommend using the Actor Pattern or anything similar in order to enforce thread safety. &lt;strike&gt;The second is that SegmentCache implementations will be instantiated very often. We therefore recommend using a facade object which relays calls to the actual segment cache code.&lt;/strike&gt; &lt;i&gt;Update: This was redesigned so that a singleton is created and used throughout Mondrian's internals.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;As for the storage of the SegmentHeader and SegmentBody objects, we tried to make it as simple and flexible as possible. Both objects are fully serializable and are immutable. They are also specially crafted to use dense arrays of primitive data types. We also tried to make extensive use of Java native functions when copying the data to / from the cache within Mondrian internals.&lt;br /&gt;&lt;br /&gt;The bottom line is that from now on the Mondrian community will be free to implement segment caches to fit their needs. We will be rolling out a few default implementations and examples, obviously. One neat implementation could be one which pages the segments to a super fast array of SSD drives. Another one could be to store the segments in Terracota or ehCache or Infinispan, or just about any scalable caching system there is out there. So if any of you out there are interested in implementing this SPI for your business and would like to either share your experiences or contribute those implementations, don't hesitate to contact us. Or me directly.&lt;br /&gt;&lt;br /&gt;There is more goodness to come, but that's it for now. Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-435218934824080795?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/435218934824080795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2011/02/mondrian-spi-segmentcache.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/435218934824080795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/435218934824080795'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2011/02/mondrian-spi-segmentcache.html' title='Mondrian SPI SegmentCache'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_qNJXxQcuKDM/TUtk3p9so8I/AAAAAAAAAEI/lHcS8yzIq0k/s72-c/MondrianSegmentCacheSPI.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5489686743872377916</id><published>2010-11-01T12:11:00.000-04:00</published><updated>2010-11-01T12:11:30.389-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><title type='text'>olap4j 1.0 - The long road to LTS</title><content type='html'>Last summer, we at olap4j announced that we would release olap4j 1.0 on October 31st 2010. Now is November 1st and olap4j is still not out of the door. Here's why.&lt;br /&gt;&lt;br /&gt;Our reference implementation, the Mondrian project, suffered from delays in the release dates and had to be pushed back. All this kept us very busy and scrambling to make the best of it for a while. But fear not! This very week, the Mondrian team is running QA tests on a 3.2.1-GA build and as soon as it gets the green light, we will be able to put the finishing touches to olap4j 1.0. Why are these projects tied so closely? one might ask. Legitimate question.&lt;br /&gt;&lt;br /&gt;You see, every API is a better API if there is at least one reference implementation existing in the wild. For many reasons actually. It allows us to architect, develop and test in a real environment, with real constraints and real data. Several APIs have failed in the past because in the end they were overly complicated for the end user. Some were so overly complicated that in the end, they failed to deliver what an API is supposed to be; a simple interface to a given system. Having a reference implementation mitigates the risk by allowing us to release by little increments and release often, but most importantly, release &lt;i&gt;testable code that works&lt;/i&gt;. Another huge advantage is that for every part of the API, there is at least one fully functioning implementation out there, freely available as open sourced software, which implementers can refer to. This is a huge advantage in terms of both project sustainability and project adoption.&lt;br /&gt;&lt;br /&gt;So stay tuned, because olap4j 1.0, despite some delays, is right around the corner!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5489686743872377916?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5489686743872377916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2010/11/olap4j-10-long-road-to-lts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5489686743872377916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5489686743872377916'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2010/11/olap4j-10-long-road-to-lts.html' title='olap4j 1.0 - The long road to LTS'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5385296164983885761</id><published>2010-09-21T18:17:00.000-04:00</published><updated>2010-09-21T18:17:03.259-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foss'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><title type='text'>olap4j tutorial</title><content type='html'>Behold! I finally had some time to put the finishing touches to my tutorial for olap4j. It took a year but here it is. Sorry for the delay. I know, I know. I promised it a year ago, but a lot of stuff has been going on since then. Two new jobs, two moving to a different city (and once more next month...). So without further delay, enjoy!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://olap4j-demo.googlecode.com/svn/trunk/doc/Olap4j_Introduction_An_end_user_perspective.pdf"&gt;http://olap4j-demo.googlecode.com/svn/trunk/doc/Olap4j_Introduction_An_end_user_perspective.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5385296164983885761?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5385296164983885761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2010/09/olap4j-tutorial.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5385296164983885761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5385296164983885761'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2010/09/olap4j-tutorial.html' title='olap4j tutorial'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5431589665240834512</id><published>2010-07-21T05:33:00.000-04:00</published><updated>2010-09-06T17:05:48.812-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><title type='text'>From the olap4j team</title><content type='html'>I posted this message today on the olap4j mailing list. In the interest of reaching a broader audience, I will copy it here as well.&lt;br/&gt;&lt;br/&gt;Cheers!&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Dear olap4j community members,&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;As we previously discussed  on this mailing list, we are planning to make the final push towards a  1.0 specification. In order to perform those much needed changes and  still maintain compatibility as much as possible, the olap4j team  proposes the following transition plan.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;4th week of July - Release of olap4j 0.9.8&lt;/strong&gt;&lt;br/&gt;A first  initial release, coded 0.9.8, will be performed during the days to  come. This release is mostly a wrap-up of the unofficial releases we  have put in the Maven repository. Notable changes include compatibility  with SAP BW, contextual drill-through for the Query Model, along with  various other compatibility fixes.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Month of August&lt;/strong&gt;&lt;br/&gt;During the month of August, the  olap4j community will have a chance to comment the proposed changes to  the 1.0 final draft. We will provide an updated functional specification  document as well as a complete list of the changes that will be  required. Should you judge that some items are still missing, or that  some should be modified or removed altogether, you are encouraged to let  us know. The mailing list is the best place to hold those discussions,  or you can also use our forums.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;September 1st - Release of 0.9.9&lt;/strong&gt;&lt;br/&gt;September 1st is  the date that marks the end of our discussions. After that, all the  changes that we agreed upon will be implemented in the API, as well as  the Mondrian and XML/A implementations of the driver. The 0.9.9 release  will include those changes, but &lt;u&gt;will still maintain  retro-compatibility&lt;/u&gt;. Some API calls will be marked for deprecation,  new ones will be present as well. The 0.9.9 release will be the last  available before 1.0. Everything that is marked for deprecation will be  removed as of 1.0, so users will have a chance to convert their code  base progressively.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;October 31st - Release of 1.0&lt;/strong&gt;&lt;br/&gt;We are planning to  release olap4j 1.0 on October 31st. &lt;u&gt;All methods that have been marked  as deprecated, whether by the 0.9.9 release or any other previous 0.X  release will be removed.&lt;/u&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;A proposed updated functional specification document, as  well as a detailed list of API changes will be sent in the following  days, right after the 0.9.8 release. We strongly encourage the users of  olap4j to express any concerns or ideas that might arise.&lt;br/&gt;&lt;br/&gt;Sincerely yours&lt;br/&gt;&lt;font color="#888888"&gt;&lt;br/&gt;&lt;em&gt;Luc Boudreau, for  the olap4j development team&lt;/em&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5431589665240834512?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5431589665240834512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2010/07/from-olap4j-team.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5431589665240834512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5431589665240834512'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2010/07/from-olap4j-team.html' title='From the olap4j team'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-1580086602431783663</id><published>2010-06-29T19:33:00.000-04:00</published><updated>2010-09-06T17:14:39.271-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pentaho'/><category scheme='http://www.blogger.com/atom/ns#' term='market'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><title type='text'>Pentaho’s Road To Profitability - Take 2</title><content type='html'>Tom Barber, a collaborator of mine,  one of the most active community member of the Pentaho project, posted a &lt;a href="http://pentahomusings.blogspot.com/2010/06/pentahos-road-to-profitability.html" title="Pentaho's road to profitability"&gt; very interesting blog entry&lt;/a&gt; this week. He is looking back at the path  of &lt;a href="http://pentaho.com/"&gt;Pentaho Corporation&lt;/a&gt;, a commercial open source business intelligence  company, and their latest strategies for growth. He notes that in the  past months, Pentaho has put a lot of effort in marketing initiatives  and hired many big wigs in their marketing staff. In his opinion, this  is somewhat against the ideals of commercial OSS development.&lt;br /&gt;&lt;br /&gt;The commercial open  source business model is still very young and has not encountered many  great challenges up to now. Nor has it sailed in very troubled waters.  Yet some signs are already warning people to be very careful with the  years to come. Sun Microsystems (now Oracle) was surviving thanks to donations. Compiere  recently made the news for all the bad reasons. Red Hat is doing pretty well  though. In a nutshell, anything is still possible; good or bad.&lt;br /&gt;&lt;br /&gt;Tom’s wish was that  Pentaho would rather focus on paying skilled engineers rather than sales  people. Now, as much as somewhat agree with the general idea, one must  keep in mind that there is no correlation between the number of talented  people getting paid to be on a project and it’s success. Some  notoriously successful projects depend almost entirely on it’s community  base. Mozilla Corporation to name only one. Others employ thousands of  employees, yet achieve mediocre results. One could also argue that an  effective marketing campaign will in fact boost people’s awareness, thus  getting more talented people to join the community base. There is no  tested and fail proof recipe so far. As I said earlier, everything goes.&lt;br /&gt;&lt;br /&gt;I worked for the past  months for a commercial open source company, and the same questions and  uncertainties were part of every day discussions. How can a software  company making no revenues on licensing be profitable? &lt;a href="http://www.sqlpower.ca/" title="SQL Power Group"&gt;SQL Power Group&lt;/a&gt;,  my employer, sponsors the only open source data modeling tool that works  cross-platforms and offers, for free, the majority of the functionality included in widely known proprietary tools like ErWin.  There are on a weekly basis between five hundred and a thousand  downloads of &lt;a href="http://www.sqlpower.ca/page/architect" title="SQL Power Architect"&gt;SQL Power Architect&lt;/a&gt;. This is a lot for an OSS project in  such a narrow niche. Yet a very small proportion of those are actually  paying for support/consultancy, or making donations. &lt;br /&gt;&lt;br /&gt;There are a lot of  factors in play. First off, people willingly using OSS have overall  better technical skills than others. To be fair, not every OSS is of  acceptable quality, but you get to try as many as you want. Proprietary  software is not better in any way, but you won’t get to try many of  them, short of having very good contacts and/or deep pockets. This is  one reason why reaching the tipping point of adoption is very hard for  an OSS company. The percentage of OSS users ready to pay instead of  figuring things by themselves is low. Way low. Waaayyy loooww. If you  paid for software, you want support (and vice versa). You feel obliged  to use the software because you already invested much in it. (Yes, money  is time, time is money.) If you didn’t pay for the software and you hit  a snag, you are far more likely to stop using it altogether. By  abandoning it, you feel like you are exercising damage control, since  you save time (thus money). You didn’t pay so why invest time? I’m fully  aware that once you do the math, you realize that it’s the exact  opposite. People usually don’t.&lt;br /&gt;&lt;br /&gt;What does all that have to do with Tom? Well  first thing first. Starting next week, I’ll be an employee of Pentaho  Corporation. Yup. Am I a big wig? Nope. Am I a marketing guy? Well, I’m  good looking, but not good enough with oxymoron. Am I a marketer?  I’m having trouble making this blog post interesting, so nope, not a  marketer either. I’m just some skilled dude who got his hands dirty for  years and now decided that he would devote some serious time to make  things better. &lt;br /&gt;&lt;br /&gt;Look  at it this way. In Tom’s vision of Pentaho, my ass is on the line. I  deeply respect his insights on the market and software development in  general. Yet here I am, proud as a peacock on a Sunday brunch, about to  be part of this fantastic project. Am I worried? Hell no. I’m very  enthusiastic about Pentaho having enough budget for marketing  initiatives. This is exactly what OSS companies need; market awareness.  People need to know you exist and that you are just as good as all those  Fortune 100 companies. Even better than these. It has nothing to do  with being a sell out. Marketing is not bad for your grassroots values,  unless you make it so. Then again, you have only yourself to blame.&lt;br /&gt;&lt;br /&gt;OSS companies need to  reach the critical mass of contributors and adoption needed to survive.  There is simply no other way. OSS users are picky, grumpy, bitchy and  unforgiving. I know that for a fact. You want to thrive in that market  share? You need two things. Proper marketing and skilled engineers. I’ll  be doing my part in the later, and I’m very confident that the good  people at Pentaho have picked skilled people to cover the former. &lt;br /&gt;&lt;br /&gt;We are competing  against giants, so let’s give them a ride for their money.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-1580086602431783663?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/1580086602431783663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2010/06/pentahos-road-to-profitability-take-2.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/1580086602431783663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/1580086602431783663'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2010/06/pentahos-road-to-profitability-take-2.html' title='Pentaho’s Road To Profitability - Take 2'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-8806019023957427154</id><published>2010-05-05T05:38:00.000-04:00</published><updated>2010-09-06T17:05:48.722-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='wabit'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><title type='text'>Monkey Business</title><content type='html'>Last week we worked on a guerilla-marketing video for Wabit. I'll let you be the judge of that.&lt;br/&gt;&lt;br/&gt;&lt;object width="100%" &gt;&lt;param name="movie" value="http://www.youtube.com/v/Gnqrd0v4t2c&amp;hl=en_US&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Gnqrd0v4t2c&amp;hl=en_US&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="100%"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-8806019023957427154?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/8806019023957427154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2010/05/monkey-business.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/8806019023957427154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/8806019023957427154'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2010/05/monkey-business.html' title='Monkey Business'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-7889797696310929732</id><published>2010-04-12T05:49:00.000-04:00</published><updated>2010-09-06T17:05:48.708-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mdx'/><category scheme='http://www.blogger.com/atom/ns#' term='parser'/><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><title type='text'>mdx4j - MDX query language parser</title><content type='html'>Last week I launched a spin off of the olap4j parser. Mdx4j wraps olap4j's MDX parser and makes it available to code, without the need of an olap connection.&lt;br/&gt;&lt;br/&gt;Why?&lt;br/&gt;&lt;br/&gt;Although olap4j contains a SPI parser, we don't want to promote any particular MDX syntax. I therefore packaged it as a separate project so that everyone can have a piece of the pie!&lt;br/&gt;&lt;blockquote&gt;final String query =&lt;br/&gt;"SELECT{} ON COLUMNS FROM CUBE";&lt;br/&gt;&lt;br/&gt;final MdxParser parser =&lt;br/&gt;Mdx4jParserFactory.createMdxParser();&lt;br/&gt;&lt;br/&gt;final ParseTreeNode tree =&lt;br/&gt;parser.parseSelect(query);&lt;/blockquote&gt;&lt;br/&gt;&lt;a href="http://code.google.com/p/mdx4j/" title="Google code project"&gt;http://code.google.com/p/mdx4j/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-7889797696310929732?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/7889797696310929732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2010/04/mdx4j-mdx-query-language-parser.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/7889797696310929732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/7889797696310929732'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2010/04/mdx4j-mdx-query-language-parser.html' title='mdx4j - MDX query language parser'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-879043016741247323</id><published>2009-09-30T07:44:00.000-04:00</published><updated>2010-09-06T17:05:48.694-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='wabit sqlstream'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><title type='text'>All in one BI tool for the non-geeks</title><content type='html'>A colleague of mine once asked me if I knew a program that can connect to almost all relational databases and offers MsAccess like features to build queries. Sure thing says I. Wabit.&lt;br/&gt;&lt;p style="text-align: center" align="left"&gt;&lt;a href="http://www.sqlpower.ca/page/wabit?slide=1"&gt;&lt;img src="http://www.sqlpower.ca/images/headings/wabit.0001.png" border="0" height="343" width="501" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;So he downloads it and installs it in 5 minutes. It's free and open source. No hassle. He then creates his connections and manages to do everything he needs to fulfil his duties as a business analyst. Pretty kewl story, heh? Short too. But that's a good sign because as a developer on this project, I can confirm first hand that this is exactly what we aimed for. Making business intelligence easy and painless.&lt;br/&gt;&lt;br/&gt;The Wabit is more than that. It's also an OLAP data warehouse &lt;a href="http://www.sqlpower.ca/page/wabit?slide=3"&gt;browsing&lt;/a&gt; and&lt;a href="http://www.sqlpower.ca/page/wabit?slide=5"&gt; reporting&lt;/a&gt; tool. It creates &lt;a href="http://www.sqlpower.ca/page/wabit?slide=6"&gt;charts&lt;/a&gt; in 10 seconds and features a &lt;a href="http://www.sqlpower.ca/page/wabit?slide=7"&gt;template engine&lt;/a&gt; for easy corporate branding. Version 1.0 will feature a server repository for multi-user collaboration and incremental saves, scheduling and fine grained security. The enterprise server is not open sourced though, but the Wabit client is a fully featured platform. You can still save all your queries and reports as an XML file for easy import and export and share it with your fellow co-workers.&lt;br/&gt;&lt;br/&gt;The Wabit approaches 1.0 now. We need to reinforce the community around it and we need more feedback. The Wabit works on all platforms with a Java JVM, so whatever your background is, I'm sure that we can make good use of your comments or contributions. You are a GUI designer or a BI consultant or even just the regular Java developer, we have need of your help.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://code.google.com/p/wabit/"&gt;Wabit on Google Code&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.sqlpower.ca/page/wabit"&gt;Wabit homepage&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a name='more'&gt;&lt;/a&gt;For the geeks out there, here are some of the technical details.&lt;br/&gt;&lt;br/&gt;The Wabit is a Java thick client. It requires a Java 5 JVM or better. Java 6 is recommended. There are OS specific installers available, or a generic package that is platform agnostic. They are available on the Wabit Google Code site.&lt;br/&gt;&lt;br/&gt;In order to connect to your data sources, the Wabit requires a JDBC or olap4j compliant database driver.The Wabit comes with some of them, like MySQL and SQL Server. One could also use Sun's ODBC driver and access OS provided datasources.&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Edit&lt;/em&gt;&lt;br/&gt;&lt;em&gt;I forgot to mention that it can query against SQL Stream real time queries as well.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;Units of work are separated in workspaces. One can open/save his workspace XML files and work on multiple workspaces at any given time. A workspace includes queries, reports, images, charts and templates.&lt;br/&gt;&lt;br/&gt;I'm pretty sure you can lean the rest by yourself from there. There are no video tutorials yet available, but it is on the TO DO pile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-879043016741247323?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/879043016741247323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2009/09/all-in-one-bi-tool-for-non-geeks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/879043016741247323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/879043016741247323'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2009/09/all-in-one-bi-tool-for-non-geeks.html' title='All in one BI tool for the non-geeks'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5100916108216707653</id><published>2009-09-09T07:06:00.000-04:00</published><updated>2010-09-06T17:05:48.654-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><title type='text'>Olap4j vs. Oracle and Ruby</title><content type='html'>During my monthly checkup of this blog analytics data (thank you Google Analytics), I discovered a new trend. More and more, people are searching for information on olap4j's compatibility.Here are the interesting keywords used and the number of occurrences for the last month.&lt;ul&gt;	&lt;li&gt;"olap4j ruby" - 28 occurrences&lt;/li&gt;	&lt;li&gt;"olap4j oracle" - 3 occurrences&lt;/li&gt;&lt;/ul&gt;Oracle; I can understand. Olap4j is picking up momentum and is more widely adopted. We support both Microsoft Analysis Services and Mondrian via XMLA. Oracle does have an XMLA server, Hyperion Essbase, although we never tested it with olap4j. If one of you reading this post happens to be a Oracle wizard, please contact us so we can have a chat. The more OLAP servers we support the better.Ruby; now that's intriguing. Ruby can run in a JVM thanks to the JRuby project. Would olap4j work well with JRuby? probably. Are there are any OLAP API for Ruby? Google says no. Digging further in the analytics data didn't reveal to me the actual intent of those who are searching for "olap4j ruby" keywords. What a mystery... I therefore send out there a general call to anyone interested in using olap4j inside JRuby, for we might have common interests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5100916108216707653?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5100916108216707653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2009/09/olap4j-vs-oracle-and-ruby.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5100916108216707653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5100916108216707653'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2009/09/olap4j-vs-oracle-and-ruby.html' title='Olap4j vs. Oracle and Ruby'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5252292736587040088</id><published>2009-08-28T05:09:00.000-04:00</published><updated>2010-09-06T17:05:48.621-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='power*architect'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><title type='text'>Creating Mondrian Schemas with Power*Architect</title><content type='html'>Since I don't have time to write much software myself these days, I figured I'd share this gem with you all. &lt;a href="http://www.sqlpower.ca" target="_blank"&gt;SQL Power&lt;/a&gt;, the Canadian Business Intelligence Authority (that's their tag line these days...), sponsors many open source projects. One of them is called Power*Architect; a marvellous cross-platform data modelling tool.&lt;img src="http://www.sqlpower.ca/images/pa-250.jpg" align="right" border="0" height="220" hspace="10" vspace="10" width="300" /&gt;&lt;br/&gt;&lt;br/&gt;As far as I know, there are close to none "enterprise ready" data modelling tools that work on Linux and Mac. I also suspect none are free, whatever the platform. Visio is certainly not one of them.&lt;br/&gt;&lt;br/&gt;Why is it so wonderful? Well, to start with, it can retro/forward engineer most JDBC compatible databases. That's a big plus. And it gets better. You can also use it to create a Mondrian schema. Yep. The team at SQL Power published &lt;a href="http://sqlpowergroup.blogspot.com/2009/08/creating-mondrian-star-schemas-with.html" target="_blank"&gt;a tutorial&lt;/a&gt; for that last week.&lt;br/&gt;&lt;br/&gt;I do have to disclose that I will be working on their projects starting in October. I'm not trying to sell it to you; it's free anyways.  One thing is for sure though. I can't wait to get my hands in there. So I encourage everyone to grab a copy &lt;a href="http://download.sqlpower.ca/architect/current.html" target="_blank"&gt;here &lt;/a&gt;and fill as many&lt;a href="http://bugs.sqlpower.ca/" target="_blank"&gt; bug reports&lt;/a&gt; as you can. It's not 1.0 yet, so community contributions are a must. Having worked with the team for three weeks back in July, I can guarantee that each and every reported bug and suggested feature is closely studied by the development team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5252292736587040088?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5252292736587040088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2009/08/creating-mondrian-schemas-with.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5252292736587040088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5252292736587040088'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2009/08/creating-mondrian-schemas-with.html' title='Creating Mondrian Schemas with Power*Architect'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5702204879896337411</id><published>2009-08-20T09:52:00.000-04:00</published><updated>2010-09-21T19:13:24.417-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><title type='text'>olap4j - A comprehensive tutorial</title><content type='html'>I've been very busy lately with the new job comming up and many other changes in my personal life, but fear not; I'm cooking something up for you people. I'm working on a comprehensive guide to olap4j. Many people have expressed a need for a more step-by-step introduction on olap4j, what it is, and how to unleash it's raw power. In the next few weeks, I should be able to finally put some more time on it and release a first final draft. Until then, take care!&lt;br /&gt;&lt;br /&gt;&lt;i&gt;UPDATE: I finally finished the tutorial. See &lt;a href="http://devdonkey.blogspot.com/2010/09/olap4j-tutorial.html"&gt;http://devdonkey.blogspot.com/2010/09/olap4j-tutorial.html&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5702204879896337411?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5702204879896337411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2009/08/olap4j-comprehensive-tutorial.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5702204879896337411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5702204879896337411'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2009/08/olap4j-comprehensive-tutorial.html' title='olap4j - A comprehensive tutorial'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-7910749080306253867</id><published>2009-05-21T05:38:00.000-04:00</published><updated>2010-09-06T17:05:48.524-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='connection'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='SSAS'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><title type='text'>Connect Microsoft SQL Server from olap4j</title><content type='html'>Browsing my Google Analytics statistics, I realized there is a lot of people out there that are searching for ways to connect Microsoft SQL Server with olap4j.&lt;br/&gt;&lt;br/&gt;Here is a nice example.&lt;br/&gt;&lt;code language="java"&gt;&lt;br/&gt;// We must use the XMLA driver.&lt;br/&gt;Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;// This code is for Java 5. With Java 6, you can directly&lt;br/&gt;// unwrap the underlying connection with the .unwrap() call.&lt;br/&gt;OlapConnection connection =&lt;br/&gt;(OlapConnection) DriverManager.getConnection(&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;// This is the SQL Server service end point.&lt;br/&gt;"jdbc:xmla:Server=http://example.com/olap/msmdpump.dll"&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;// Tells the XMLA driver to use a SOAP request cache layer.&lt;br/&gt;// We will use an in-memory static cache.&lt;br/&gt;+ ";Cache=org.olap4j.driver.xmla.cache.XmlaOlap4jNamedMemoryCache"&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;// Sets the cache name to use. This allows cross-connection&lt;br/&gt;// cache sharing. Don't give the driver a cache name and it&lt;br/&gt;// disables sharing.&lt;br/&gt;+ ";Cache.Name=MyNiftyConnection"&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;// Some cache performance tweaks.&lt;br/&gt;// Look at the javadoc for details.&lt;br/&gt;+ ";Cache.Mode=LFU;Cache.Timeout=600;Cache.Size=100",&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;// XMLA is over HTTP, so BASIC authentication is used.&lt;br/&gt;"username",&lt;br/&gt;"password" );&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;&lt;br/&gt;// We can execute a query. MDX of course.&lt;br/&gt;CellSet set = connection.createStatement().executeOlapQuery(&lt;br/&gt;"SELECT {} ON COLUMNS FROM CUBE");&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Update : Some useful links&lt;/em&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ms143764.aspx" target="_blank"&gt;How to: Install Analysis Services by Using Setup&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ms174518.aspx" target="_blank"&gt;SSAS Clients Architecture&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://ci.pentaho.com/view/Analysis/job/OLAP4J/" target="_blank"&gt;Olap4j latest builds&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-7910749080306253867?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/7910749080306253867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2009/05/connect-microsoft-sql-server-from.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/7910749080306253867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/7910749080306253867'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2009/05/connect-microsoft-sql-server-from.html' title='Connect Microsoft SQL Server from olap4j'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-7081879928024789217</id><published>2009-05-20T10:51:00.000-04:00</published><updated>2010-09-06T17:05:48.509-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PAT'/><category scheme='http://www.blogger.com/atom/ns#' term='pentaho'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='pentaho analysis tool'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><title type='text'>PAT 0.3 - Integration and nifty features…</title><content type='html'>Pentaho Analysis Tool sprint 2 is now over and released since a few weeks. We're currently in the process of wrapping up the third sprint. What's new? What new features will there be?&lt;br/&gt;&lt;br/&gt;Nothing very spectacular really. Yet there are a few nice features worth mentioning.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Integration with the Pentaho BI server&lt;/strong&gt;&lt;br/&gt;PAT can now run embedded in the Pentaho User Console and be configured remotely. It only supports XMLA connections for this first draft, but don't worry; more compatible connection types are to be supported in the medium term. This also means that you can seamlessly use &lt;strong&gt;any&lt;/strong&gt; XMLA provider. Sql Server? Essbase? Mondrian? You choose. All that thanks to olap4j. If you want specific details on this, Gretchen Moran has written a &lt;a href="http://gretchenmoran.blogspot.com/2009/05/pentaho-analysis-tool-integrated-as.html" target="_blank"&gt;bunch of documentation&lt;/a&gt; on this. Congratulations to Paul Stoellberger and Gretchen Moran for this feature.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Create multiple queries at once&lt;/strong&gt;&lt;br/&gt;This was a requirement that was passed to us by Pentaho's engineering team. People want to build and use more than one query at a time without concurrency issues. That was not properly supported by the age old JPivot application. Now and then we encountered some problems with multiple queries, so this was something pretty high on our features list. The backend supported that since sprint 1 , but there was higher priorities for the GUI components.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;OlapTableModel first draft&lt;/strong&gt;&lt;br/&gt;The Java API doesn't include a proper TableModel for OLAP data, so we're planning to write one. We still have lots of things to figure out on this subject, but we're planning to mock a draft specification before the sprint 3 deadline.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Our initial intent for the third sprint was to make the GUI nicer, but we're still trying to figure out if XUL would be a better generation tool than SWT. We are waiting for developments between the GWT-Mosaic team and Nick Baker of Pentaho and hope that all those nice gents would team up and cook something up to their talent. Fingers crossed here. :)&lt;br/&gt;&lt;br/&gt;Also worth mentioning,  we started talks to review the Query model currently residing in olap4j. This is a soon to be major component as it will provide developers and GUI enthusiasts with a properly abstracted API to build queries against a data warehouse. Olap4j is  very great API for low level stuff, but it still needs an abstraction layer for the common folks. Building queries should not require in-depth knowledge of MDX, for you cannot expect all business analysts to master MDX anyways. Anyone who wants to participate in the process is warmly invited to manifest himself. We are really looking for input on this, whatever your background is. (As long as it's related to BI I guess...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-7081879928024789217?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/7081879928024789217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2009/05/pat-03-integration-and-nifty-features.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/7081879928024789217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/7081879928024789217'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2009/05/pat-03-integration-and-nifty-features.html' title='PAT 0.3 - Integration and nifty features…'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-3828900270185903209</id><published>2009-04-13T09:18:00.000-04:00</published><updated>2010-09-06T17:05:48.479-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='Mondrian'/><category scheme='http://www.blogger.com/atom/ns#' term='pentaho'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='pentaho analysis tool'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><title type='text'>Pentaho Analysis Tool - Final push for sprint 2</title><content type='html'>I've been really busy lately working on sprint 2 of Pentaho Analysis Tool. We almost reached all our goals for this sprint and are hoping to wrap it all up in the next two weeks. There is still time to add a few late requirements in this sprint so if anyone has a very special wish, now is the time to express it.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;About Pentaho Analysis Tool (PAT)&lt;br/&gt;&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;PAT is an attempt to replace the good ol' JPivot application, widely used in the Java world, as a web based browser for OLAP data. There are quite a few similar projects out there, yet none of them quite make the cut in terms of enterprise requirements.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Ad-hoc connections&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;ACL management&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;User defined connections saved for later use&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Saved queries&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Multiple queries editing at once&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[ insert even more entreprise software mumbo jumbo here]&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;We're writing a Google Web Toolkit (GWT) front-end and a Spring based backend as a core. All data manipulations are possible thanks to the Olap4j API. There was talk of a Json bridge later on in development, but this requirement is not part of any sprint planning for now.&lt;br/&gt;&lt;br/&gt;The project is hosted on &lt;a href="http://code.google.com/p/pentahoanalysistool/"&gt;Google code&lt;/a&gt; and all the project management is done in the &lt;a href="http://jira.pentaho.com/browse/PAT"&gt;Jira tracker&lt;/a&gt;. If you have any further questions about our project or want to chat for whatever reasons, we can be reached via the&lt;a href="http://groups.google.com/group/pentahoanalysistool-dev"&gt; mailing list&lt;/a&gt; or&lt;a href="irc://irc.freenode.net/pentaho.pat"&gt; ##pentaho.pat&lt;/a&gt; on freenode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-3828900270185903209?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/3828900270185903209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2009/04/pentaho-analysis-tool-final-push-for.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/3828900270185903209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/3828900270185903209'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2009/04/pentaho-analysis-tool-final-push-for.html' title='Pentaho Analysis Tool - Final push for sprint 2'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5873418653948763426</id><published>2009-03-25T05:47:00.000-04:00</published><updated>2010-09-06T17:05:48.395-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uptime'/><category scheme='http://www.blogger.com/atom/ns#' term='server'/><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='zenoss'/><category scheme='http://www.blogger.com/atom/ns#' term='snmp'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='Servers'/><category scheme='http://www.blogger.com/atom/ns#' term='monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='availability'/><title type='text'>Of easy and painless systems monitoring</title><content type='html'>I'm not a systems administrator. I only have 8 servers to babysit and it used to be enough to be a time consuming problem. You might not be a systems administrator either, nor have many machines / services / websites to monitor, yet the fact remains that as IT professionals we need to keep a close eye on what's going on. I'm not talking about 99.999% uptime here, but a 1% downtime is enough to make a lot of customers, clients and managers angry; especially since outages have a way to happen exactly when it should not.&lt;br/&gt;&lt;br/&gt;What are your options? How much does it cost? What can you monitor? These are all questions I'll try to shed a light on. The solution I'm proposing today is one I used myself for years. I'm not legally obliged to 5-9 availability, yet this is what I achieved with a total cost of 0. Yep, z.e.r.o. zero. El zilcho.&lt;br/&gt;&lt;br/&gt;I'm not saying this will work for anybody, neither am I pretending to be an expert on the issue at hand, but I learned a lot in a few years on the subject so here it is.&lt;br/&gt;&lt;br/&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Innovation comes from the needs&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;First thing first. These are the questions you absolutely need to answer before putting your automated monitoring solution together.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;em&gt;If any abnormality is discovered&lt;/em&gt;&lt;em&gt;, who will be reached and  how ?&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Will you setup rounds of monitoring among your partners or employees? Do you have cell phones that can receive emails? Are you using pagers? If you can't answer to these questions, stop now. Monitoring is not for you apparently. You either don't have the resources or the availability to do so.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;em&gt;What needs to be  monitored?&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;There is a whole list of things that can be monitored. As a matter of fact, pretty much anything can. Room and server temperatures, machine responses to arbitrary queries,query execution times, memory and disk usage, network throughput... the list long. As I said, I'll show you how to monitor all these things, but you need to know what is critical and what is not. You can try to monitor everything, sure, but keep in mind that the whole point of automated systems monitoring is being reliable and saving time. Therefore, you'll fail in the later. Make a list.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;The tools of the trade&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;There are lots of monitoring systems out there. Most are expensive, lots are hard to setup. I'm not interested in either one of those categories. I guess you're not. My tools stack is this :&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Zenoss Core : Monitoring platform.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; SNMP : Monitoring communications standard I use.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;a href="http://www.zenoss.org" title="Zenoss Core community page"&gt;Zenoss Core&lt;/a&gt; is a free (as in free speech or free beer) open source monitoring platform. It's distributed under the GPL license and &lt;a href="http://www.zenoss.com/download/links" title="Zenoss download links"&gt;available for download&lt;/a&gt; in a plethora of package formats. RPM, VMWare virtual appliance, source tarball, zip files, whatever. This is the core of my monitoring solution.&lt;br/&gt;&lt;br/&gt;I suggest installing it on a cheap commodity PC with &lt;a href="http://centos.org/" title="CentOS, the free RHEL OS"&gt;CentOS&lt;/a&gt;. Everyone has one of those old machines lying around somewhere in a closet or a warehouse. Find one, plug it, setup the OS of your choice (preferably CentOS, since it's Red Hat binary compatible and FOSS). My preferred way to monitor is through a network via SNMP (I'll get to that later on), so you need a network card on it. If you want it to send messages to pagers, you'll obviously need a modem. That's all the hardware you need.&lt;br/&gt;&lt;br/&gt;Getting Zenoss up and running is pretty straight forward and &lt;a href="http://downloads.sourceforge.net/zenoss/Zenoss_Core_Installation_2.3.0.pdf.zip"&gt;well documented&lt;/a&gt;. CentOS is a RPM based system, so one or two command lines usually does the trick.If you did choose CentOS, as I strongly suggested, checkout chapter 5 of the &lt;a href="http://downloads.sourceforge.net/zenoss/Zenoss_Core_Installation_2.3.0.pdf.zip"&gt;installation guide&lt;/a&gt;. Installation should be a trivial matter and takes somewhere around two minutes. Literally.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;SNMP - Simple Network Management Protocol&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;I mentioned SNMP as a monitoring communication standard. What is SNMP exactly? It's a simple way of querying appliances and getting information in the form of a numeric tree. This is where you need to do your homework. It is vital that you understand at least a little what SNMP is and how it works. Don't be afraid though. It's widely used, documented and simple enough to be understood in a 30 minutes research. Skip your favorite TV program tonight, and read a little. 30 minutes of reading will save you hours of problems down the road; your call.&lt;br/&gt;&lt;br/&gt;SNMP is supported by a wide variety of devices. Windows Servers, Linux servers, routers, switches, printers, UPCs, name it. It's easy to activate and allows you to monitor pretty much anything.&lt;br/&gt;&lt;br/&gt;On the downside, SNMP might not be the most secure monitoring solution, but it does the job fairly well. You can secure it further through firewalls and other such devices later on.&lt;br/&gt;&lt;br/&gt;Installation on a Windows machine is easy. Go to the &lt;em&gt;Add/Remove Programs&lt;/em&gt; utility, open the list of Windows components, look in the &lt;em&gt;Management and Monitoring Tools&lt;/em&gt; and activate &lt;em&gt;Simple Network Management Protocol&lt;/em&gt;. You can &lt;a href="http://www.google.com/search?q=install+snmp+windows"&gt;Google for it&lt;/a&gt; if you need more help. It should appear in the services management utility under &lt;em&gt;SNMP Service&lt;/em&gt;, which you can fire-up by typing '&lt;em&gt;services.msc&lt;/em&gt;' in the &lt;em&gt;Run&lt;/em&gt; dialog.&lt;br/&gt;&lt;br/&gt;Linux servers need to install &lt;a href="http://www.net-snmp.org/"&gt;NET-SNMP&lt;/a&gt;. Again, I won't go through the details, since the installation process depends on your Linux flavor, but it's usually a trivial matter. Google for it if you need help. It's usually included in your distro base packages. Zenoss offers a &lt;a href="http://www.zenoss.com/community/docs/howtos/configuration-of-netsnmp-for-use-with-zenoss/"&gt;nice howto&lt;/a&gt; that might be of great help.&lt;br/&gt;&lt;br/&gt;Whatever platform you setup, make sure to allow network traffic on the port 161 in UDP.  This is the usual port that SNMP agents use. It can be configured to be something else in your respective SNMP agent configuration.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Putting it all together&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;The hardest part is over. You can go grab a beer and celebrate. Don't celebrate too much though, because you're not done yet. We still need to fire up Zenoss, configure what we want to monitor and setup alerting rules. I'll go through the basic steps very quickly, but there are tons of documentation out there. I suggest using the &lt;a href="http://www.zenoss.com/community/docs/zenoss-guide/2.3.0/"&gt;Administration Guide&lt;/a&gt; as a helper.&lt;br/&gt;&lt;br/&gt;Zenoss runs by default on HTTP port 8080. Navigate to&lt;br/&gt;&lt;blockquote&gt;http://[your-server]:8080&lt;/blockquote&gt;&lt;br/&gt;As of version 2.3, the default login is '&lt;em&gt;admin&lt;/em&gt;' and the default password is '&lt;em&gt;zenoss&lt;/em&gt;'. You're now taken to the dashboard. Pretty slick heh? Select '&lt;em&gt;Add device&lt;/em&gt;' from the menu on the left.&lt;br/&gt;&lt;br/&gt;Fill the following fields.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Device name : This is either a DNS or IP that points to the machine you want to monitor.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Device class path : Choose this value carefully. In the drop-down list, you need to select what describes best the device you want to monitor. If it's a Linux server, choose /Server/Linux. Guess what is the best choice for Windows servers?&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;SNMP community : This is the name of your SNMP community that you specified in your SNMP agent configuration. It's usually something like &lt;em&gt;private&lt;/em&gt; or &lt;em&gt;public&lt;/em&gt;, but some people like to use secret values.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Everything else can be ignored for now. As you master Zenoss, you'll find those extra fields most useful. Everything comes in good time, so keep focusing on the task at hand for now : press '&lt;em&gt;Add device&lt;/em&gt;'.&lt;br/&gt;&lt;br/&gt;The next screen will slowly fill up with log messages. Zenoss is currently discovering your device and has a lot of values to checkup, so let it finish it's job. If everything goes well, you'll see a link to navigate to the device at the end of the log window.&lt;br/&gt;&lt;br/&gt;If you get error messages, you did something bad. Start by checking the troubleshooting section of the &lt;a href="http://www.zenoss.com/community/docs/howtos"&gt;Zenoss howtos&lt;/a&gt;. Most issues can be solved with the information provided there. If the problem persists, there is still your good friend Google.&lt;br/&gt;&lt;br/&gt;By default, Zenoss will monitor disk usage, memory usage, CPU usage, system load, network throughput and a few other things. Once you have a first device setup, you can tweak the alerting rules in the '&lt;em&gt;Settings&lt;/em&gt;' section of your Zenoss installation.&lt;br/&gt;&lt;br/&gt;That's it for now. Get familiar with Zenoss and devices discovery.  This is your homework for this week. Next up, I'll tell you how to monitor IP services, temperatures and even more sexy stuff.&lt;br/&gt;&lt;br/&gt;Cheers!&lt;br/&gt;&lt;br/&gt;RESOURCES&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.zenoss.com/community/docs/howtos"&gt;Zenoss How-To's&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://downloads.sourceforge.net/zenoss/Zenoss_Core_Installation_2.3.0.pdf.zip"&gt;Zenoss Installation guide&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://downloads.sourceforge.net/zenoss/ZenossAdminGuide-2.2.4.pdf.zip"&gt;Zenoss Administration guide&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; &lt;a href="http://www.howtoforge.com/installation-guide-centos5.1-desktop"&gt;CentOS installation guide&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5873418653948763426?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5873418653948763426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2009/03/of-easy-and-painless-systems-monitoring.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5873418653948763426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5873418653948763426'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2009/03/of-easy-and-painless-systems-monitoring.html' title='Of easy and painless systems monitoring'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5216812249095400882</id><published>2009-03-16T06:13:00.000-04:00</published><updated>2010-09-06T17:05:48.263-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dos'/><category scheme='http://www.blogger.com/atom/ns#' term='mod_evasive'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='Servers'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='httpd'/><title type='text'>Evading (D)DOS attacks with Apache HTTPD</title><content type='html'>Just a quick tech-tip. Ever wondered how to prevent your HTTPD server from being knocked off the net by a DOS (Denial Of Service) attack? Check this nifty little module.&lt;br/&gt;&lt;p align="center"&gt;&lt;a href="http://www.zdziarski.com/projects/mod_evasive/" target="_blank"&gt;Mod Evasive&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;&lt;p align="left"&gt;Its pretty easy to setup. Compile the module as you would normally do for HTTPD modules and create a configuration file. There are many options available. Here's an example of how to configure it.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;br/&gt;&lt;p align="left"&gt;&amp;lt;IfModule mod_evasive20.c&amp;gt;&lt;br/&gt;DOSHashTableSize 3097&lt;br/&gt;DOSPageCount 6&lt;br/&gt;DOSSiteCount 100&lt;br/&gt;DOSPageInterval 2&lt;br/&gt;DOSSiteInterval 2&lt;br/&gt;DOSBlockingPeriod 600&lt;br/&gt;DOSEmailNotify "my-monitoring-contact@domain.com"&lt;br/&gt;DOSWhitelist  192.168.*.*&lt;br/&gt;&amp;lt;/IfModule&amp;gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;p align="left"&gt;More details on the configuration and how each parameter will affect the module behavior can be found out there on the net.&lt;/p&gt;&lt;br/&gt;&lt;p align="left"&gt;Beware though, before installing this, make sure you won't blacklist some legitimate users. For example, if you have a AJAX application that sends a burst of requests once in a while, it might get blacklisted. Make sure you test it in a development environment so you get the thresholds right.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5216812249095400882?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5216812249095400882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2009/03/evading-ddos-attacks-with-apache-httpd.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5216812249095400882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5216812249095400882'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2009/03/evading-ddos-attacks-with-apache-httpd.html' title='Evading (D)DOS attacks with Apache HTTPD'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-4432249571687897536</id><published>2009-02-12T06:00:00.000-05:00</published><updated>2010-09-06T17:05:48.244-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='governance'/><category scheme='http://www.blogger.com/atom/ns#' term='economy'/><title type='text'>Of economic opinions and commentators</title><content type='html'>There is a lot of blogging being done out there in these times of economical crisis -- yes, it is a crisis. Most of it is utter garbage, mixing opinions with specifically picked facts to serve a given purpose, yet somehow,  I still find it important to read it all. There is an old saying that goes something like : "Fool is the one who ignores what he considers not worthy, for wise is the one who can learn from anything."&lt;br/&gt;&lt;br/&gt;Most of the wisest things i read were published in my favorite monthly publication, &lt;a href="http://www.monde-diplomatique.fr/" title="Le Monde Diplomatique - there is an english translation available too." target="_blank"&gt;Le Monde Diplomatique&lt;/a&gt;. On the counterpart, a hellish lot of garbage can be found pretty much anywhere. Then again, during one of my many news scavenging sessions, I was genuinely surprised to find &lt;a href="http://www.counterpunch.org/roberts02092009.html" target="_blank"&gt;this little post&lt;/a&gt; from a man i never noticed before. I do believe this man has a proper sense of economical and political analysis. Here's an excerpt.&lt;br/&gt;&lt;blockquote&gt;&lt;em&gt;&lt;font size="-1" face="Verdana, Arial, Helvetica, sans-serif"&gt;US policymakers have ignored the fact that consumer demand in the 21st century has been driven, not by increases in real income, but by increased consumer indebtedness.  This fact makes it pointless to try to stimulate the economy by bailing out banks so that they can lend more to consumers.  The American consumers have no more capacity to borrow. &lt;/font&gt;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&lt;font size="-1" face="Verdana, Arial, Helvetica, sans-serif"&gt;With the decline in the values of their principal assets--their homes--with the destruction of half of their pension assets, and with joblessness facing them, Americans cannot and will not spend. &lt;/font&gt;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;font size="-1" face="Verdana, Arial, Helvetica, sans-serif"&gt;&lt;em&gt;Why bail out GM and Citibank when the firms are moving as many operations offshore as they possibly can?&lt;/em&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;(...)&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&lt;font size="-1" face="Verdana, Arial, Helvetica, sans-serif"&gt;The US government really has only two possibilities for financing its budget deficit.  One is a second collapse in the stock market, which would drive the surviving investors with what they have left into “safe” US Treasury bonds.  The other is for the Federal Reserve to monetize the Treasury debt. &lt;/font&gt;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&lt;font size="-1" face="Verdana, Arial, Helvetica, sans-serif"&gt;Monetizing the debt means that when no one is willing or able to purchase the Treasury’s bonds, the Federal Reserve buys them by creating bank deposits for the Treasury’s account.   &lt;/font&gt;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&lt;font size="-1" face="Verdana, Arial, Helvetica, sans-serif"&gt;In other words, the Fed “prints money” with which to buy the Treasury’s bonds. &lt;/font&gt;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&lt;font size="-1" face="Verdana, Arial, Helvetica, sans-serif"&gt;Once this happens, the US dollar will cease to be the reserve currency.   &lt;/font&gt;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&lt;font size="-1" face="Verdana, Arial, Helvetica, sans-serif"&gt;In addition, China, Japan and Saudi Arabia, countries that hold enormous quantities of US Treasury debt in addition to other US dollar assets, will sell, hoping to get out before others.   &lt;/font&gt;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&lt;font size="-1" face="Verdana, Arial, Helvetica, sans-serif"&gt;The US dollar will become worthless, the currency of a banana republic.&lt;/font&gt;&lt;/em&gt;&lt;/blockquote&gt;&lt;br/&gt;I'll keep on the lookout for more interresting articles on this. I beleive that the current economical difficulties are of enoumous importance to us all. Not only are we at risk of loosing big, decisions will soon be made that will dictate the governance of our everyday life for decades to come. I might don't think much of the last decades of governance we just endured, but I certainly won't fallback to cynicism and apathy.&lt;br/&gt;&lt;br/&gt;Comments? More reading suggestions?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-4432249571687897536?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/4432249571687897536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2009/02/of-economic-opinions-and-commentators.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/4432249571687897536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/4432249571687897536'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2009/02/of-economic-opinions-and-commentators.html' title='Of economic opinions and commentators'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-8896752256053480252</id><published>2008-11-11T11:35:00.000-05:00</published><updated>2010-09-06T17:05:48.142-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Mondrian'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='SSAS'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><title type='text'>Of OLAP and the importance of open standards</title><content type='html'>In these times of economical crisis, many companies will turn to business intelligence (BI) as a source of wisdom and counsel. Millions of dollars will be invested in an effort to understand the extend of their respective problems and find solutions based on accurate and decision oriented datasets.&lt;br/&gt;&lt;br/&gt;Since I have a fairly good amount of experience with work in heterogeneous environments and tackling data integration challenges, I thought I'd pitch in my two cents.&lt;br/&gt;&lt;h3&gt;Why developers and project managers will have a hard time&lt;/h3&gt;&lt;br/&gt;The root of the problem is this. The Microsoft OLAP toolkit does not integrate so well with anything else than .NET technologies. SAS offers a Java API, yet it is not ready for production. (I worked with it for two years, and believe me, they are still a fairly long way to production quality code.) As a matter of fact, most software vendors in the OLAP world distribute some API to integrate their technologies, but you often end up with black boxes of questionable quality, flexibility or performance. Some even go as far as to obfuscate their libraries... this really doesn't help in the end.&lt;br/&gt;&lt;br/&gt;Some vendors like Oracle went for the all-in-the-box solution. They offer a "complete" solution that can fit every possible need. Then again, what they are telling you is: if we don't have it, you probably don't need it."Probably"? You got to be kidding. Since when does software vendors know what you need and what your future will be? Better switch &lt;em&gt;probably&lt;/em&gt; for &lt;em&gt;hopefully&lt;/em&gt;.&lt;br/&gt;&lt;br/&gt;In the best case, in order to meet your needs, you'll hack your way through at the expense of your project specifications. The final result can be nothing but deceiving. Your celebration will be bitter and probably short lived, I fear.&lt;br/&gt;&lt;h3&gt;&lt;strong&gt;About the importance of collective work&lt;br/&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;br/&gt;You have a brand new application. Hooray! This is where the production phase kicks in.&lt;br/&gt;&lt;br/&gt;What if you need to move your datamart to another OLAP server? What if there are not enough connections licenses to allow both production connections and all of your maintenance personnel on the OLAP server and they are forced to take turns to debug? What if the CEO decides to migrate to a new platform? What if [insert random but oh so frequent unforeseen event here]? Your thousand dollar code is now rendered useless; you can start crying now, you deserve it. In your quest for more money making, you've created a monster that was expensive and will continue to pump the money out of your institution pockets.&lt;br/&gt;&lt;br/&gt;If you were good enough in systems design, you thought about a data layer. The data layer still remains to be rewritten entirely and it often represents at least a third of the overall effort. Close, but no cigar. This might sound like a catastrophic scenario, but it is oh so frequent.&lt;br/&gt;&lt;br/&gt;Many people got tired of all this non-sense we decided to work together. We decided that enough time and money was wasted on individual efforts that were ruined in the end.  It was time to agree on standards and share the product of our collective effort.&lt;br/&gt;&lt;br/&gt;Take Hibernate for example. It is now a&lt;em&gt; de facto&lt;/em&gt; standard when it comes to data mappers. For the Java version alone, it represents 859 thousand lines of code worth 12.8 million dollars in work hours. Think you can top that with your in-house data layer in times of economical crisis?&lt;br/&gt;&lt;h3&gt;About Java OLAP&lt;/h3&gt;&lt;br/&gt;OLAP is a world in itself. You can't take relational paradigms and apply them to the multidimensional world. The .NET toolbox does have very nice libraries to do some neat OLAP stuff, then again, you're locked-in with SSAS. This is a no-no.&lt;br/&gt;&lt;br/&gt;On the Java side, things are even worse. There is currently a big void in the Java OLAP market. No OLAP standard emerged at all. Thanks to the selfishness of the big players of the industry, the JOLAP initiative was a total failure. It never reached the final version, so the JSR-69 specification died quietly.&lt;br/&gt;&lt;br/&gt;We at Olap4j tried to fill that gap with an open initiative. Everyone can pitch in. And I mean EVERYONE.&lt;br/&gt;&lt;h3&gt;What makes Olap4j so kewl&lt;/h3&gt;&lt;br/&gt;You know the expression &lt;em&gt;vendor lock-in&lt;/em&gt;? I hope you do, I *really* do, or else you'll learn it the hard way. Olap4j aims at solving exactly this problem. You can develop applications on it's API and switch the underlying OLAP engine without rewriting a single line of code. Not bad heh? Olap4j is more than a database driver. It is an open API built right on top of the JDBC industry standard where everyone collaborates to specify a common base onto which to build.&lt;br/&gt;&lt;br/&gt;It even includes transformation libraries and testing facilities.&lt;br/&gt;&lt;h3&gt;I want to kick the tires and use it right now&lt;/h3&gt;&lt;br/&gt;So far, it has two implementations ready to use. The Mondrian driver allows you to run the much acclaimed Mondrian open source OLAP engine as an in-process data provider.&lt;br/&gt;&lt;br/&gt;There is also the XML/A generic driver that can connect to pretty much anything that talks XML/A, whether it's over HTTP or anything else you fancy using. This particular driver allows you to build applications that can switch to and from any of these OLAP engines :&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Hyperion Essbase&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Microsoft SQL Server Analysis Services&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Infor&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Mondrian&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Palo&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;The Olap4j project is gaining momentum and we truly hope to see it become the standard in the Java world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-8896752256053480252?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/8896752256053480252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2008/11/of-olap-and-importance-of-open.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/8896752256053480252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/8896752256053480252'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2008/11/of-olap-and-importance-of-open.html' title='Of OLAP and the importance of open standards'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-3586682984236060957</id><published>2008-09-24T04:18:00.000-04:00</published><updated>2010-09-06T17:05:48.128-04:00</updated><title type='text'>Chain blog… they cought me.</title><content type='html'>&lt;p align="left"&gt;If you're reading this, you've been included in this blog chain.&lt;img src="http://blog.devdonkey.org/wp-content/uploads/2008/09/photo.jpg" alt="ChainBlog picture" vspace="10" width="200" align="right" hspace="10" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;Take a picture of yourself right now.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Don’t change your clothes, don’t fix your hair... just take a picture.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Post that picture with NO editing.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Post these instructions with your picture.&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;p align="left"&gt;I was caught by three techno blogs I follow, so don't be mad at me, Thanks to &lt;a href="http://julianhyde.blogspot.com/2008/09/chain-blog.html" target="_blank"&gt;Julian&lt;/a&gt;, &lt;a href="http://www.ibridge.be/?p=134" target="_blank"&gt;Matt &lt;/a&gt;and &lt;a href="http://www.nicholasgoodman.com/bt/blog/2008/09/22/off-topic-meme-me/" target="_blank"&gt;Nick&lt;/a&gt;. I had no webcam at hand but i thought about my phone, so there it is: Luc at the office Wednesday morning, before his coffee.&lt;/p&gt;&lt;br/&gt;&lt;p align="left"&gt;Cheers!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-3586682984236060957?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/3586682984236060957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2008/09/chain-blog-they-cought-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/3586682984236060957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/3586682984236060957'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2008/09/chain-blog-they-cought-me.html' title='Chain blog… they cought me.'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-7873632380721531109</id><published>2008-08-11T06:52:00.000-04:00</published><updated>2010-09-06T17:05:48.113-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='kettle'/><category scheme='http://www.blogger.com/atom/ns#' term='matt casters'/><category scheme='http://www.blogger.com/atom/ns#' term='pentaho'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='pentaho data integration'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PDI'/><title type='text'>Data integration challenges tackled</title><content type='html'>&lt;img src="http://blog.devdonkey.org/wp-content/uploads/2008/08/logo_kettle_lrg.png" alt="logo_kettle_lrg.png" align="right" hspace="10" vspace="10" /&gt;Data integration in business environments can be a painful task. I mean REAL painful. The volume of data is huge, it does not cross-validate, it is dispersed in many heterogeneous formats, yadi yada. You know the song. Some day, I stumbled on &lt;a href="http://kettle.pentaho.org/"&gt;Pentaho Data Integration&lt;/a&gt; (PDI).This was a real breakthrough.&lt;br/&gt;&lt;br/&gt;First thing first, it's not subject to "vendor lock-in". It can read most data formats out there and can write it back to pretty much anything. This is a huge plus because gives it the ability to be used by a plenitude of user types and environments. Being written in Java also gives it an edge as an enterprise tool, for it is platform agnostic.&lt;br/&gt;&lt;br/&gt;But the real advantages are not those trivial specifications. My love for PDI has much deeper roots. Simply put : it's powerful. Creating an integration process is a trivial matter. Drag and drop. Link. Execute. Those three simple steps will cover most of your business needs. Really, I mean it. Never again will I write a snippet of code to read a CSV file and write it's content in a database. Mark my words; NEVER! This is a waste of time and a developer who lives with his times should know that.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;What about the real juicy stuff ?&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;As you suspected, there is much more to PDI than meets the eye. It can be clustered, it can use a database based repository for all processes, there are automatic documentation generation tools and is supported by a huge community. Many tutorials exist to address most business needs and challenges. It's well made, very stable and easily expandable with plugins for power users.&lt;br/&gt;&lt;br/&gt;I strongly recommend to give it a try. The next version should be released soon and it will include many great new features. I met &lt;a href="http://www.ibridge.be/"&gt;Matt Casters&lt;/a&gt; last June and had the chance to see for myself all the new functionalities that will make it to the next release. We're talking about visual performance bottleneck exploration and some more neat stuff you won't find anywhere else.&lt;br/&gt;&lt;br/&gt;Cheers, and have a good time integrating !!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-7873632380721531109?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/7873632380721531109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2008/08/data-integration-challenges-tackled.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/7873632380721531109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/7873632380721531109'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2008/08/data-integration-challenges-tackled.html' title='Data integration challenges tackled'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-8120329580380788790</id><published>2008-07-29T10:38:00.000-04:00</published><updated>2010-09-06T17:05:48.065-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='pentaho'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><title type='text'>Pentaho on the iPhone</title><content type='html'>&lt;img src="http://blog.devdonkey.org/wp-content/uploads/2008/07/iphone_report_01.jpg" alt="iphone_pentaho" align="right" hspace="10" vspace="10" /&gt;I successfully added the iPhone extension to my Pentaho platform today and I was more then impressed with the ease with which we can enable the whole platform to work seamlessly on those nifty little phones.&lt;br/&gt;&lt;br/&gt;Oh yeah, I bought an iPhone too...&lt;br/&gt;&lt;br/&gt;I'm slowly discovering the fun of having a cellular phone in my pocket. This is something that I never experienced before; never had a cell phone. I have to say that I'm glad it's a good phone, and sexy too.&lt;br/&gt;&lt;br/&gt;The bottom line is : get one.&lt;br/&gt;&lt;br/&gt;For those interested, here's &lt;a href="http://wiki.pentaho.com/display/COM/Enabling+the+iPhone+BI+Extension" target="_blank"&gt;the wiki page that says it all&lt;/a&gt;. Thanks to Will Gorman, senior developer at Pentaho,  who put this all up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-8120329580380788790?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/8120329580380788790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2008/07/pentaho-on-iphone.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/8120329580380788790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/8120329580380788790'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2008/07/pentaho-on-iphone.html' title='Pentaho on the iPhone'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-3735205948472004909</id><published>2008-07-21T07:31:00.000-04:00</published><updated>2010-09-06T17:05:48.048-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bfd'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='apf'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='Servers'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='httpd'/><category scheme='http://www.blogger.com/atom/ns#' term='modsecurity'/><title type='text'>Field lessons - Securing a Linux server</title><content type='html'>There is this old saying which goes like :&lt;br/&gt;&lt;p align="center"&gt;"&lt;em&gt;Linux is safe enough to keep it vanilla. Anything you add weakens it's security&lt;/em&gt;."&lt;/p&gt;&lt;br/&gt;Okay, this is not an actual popular saying, but since most Linux server I saw in my career were configured in conformity to this piece of wisdom (sic), I decided to share some experience with basic and mandatory security measures to add on a Linux server... I'm just sooo tired of fixing broken servers that have been hacked.&lt;br/&gt;&lt;br/&gt;There is a simple suite of programs to install and you'll be at the very least secured against kiddies and the like. Here it goes.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Securing the OS &lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Most of the time, the piece of software that was hacked was the OS itself. Not because there are awful flaws in Linux (or just any OS as a matter of fact), but because simple rules were not respected. How many of you who have configured servers can certify that they are protected against brute force attacks ? How many are protected against DoS attacks ? Linux, nor any other OS I've seen so far (correct me as you wish...) don't come with DoS or BF detection. Having a secured SSH access is mandatory these days, but what's the point of setting passwords when a simple brute force attack will break it.&lt;br/&gt;&lt;br/&gt;Here are some solutions. The &lt;em&gt;&lt;a href="http://www.rfxnetworks.com/apf.php"&gt;Advanced Policy Firewall (APF)&lt;/a&gt;&lt;/em&gt; is a simple Linux firewall that uses the &lt;a href="http://www.netfilter.org/projects/iptables/index.html"&gt;&lt;em&gt;iptables&lt;/em&gt;&lt;/a&gt; utility to create firewall rules on your system. Why APF and not iptables alone ? Because it integrated with a DoS detection tool and &lt;a href="http://www.rfxnetworks.com/bfd.php"&gt;&lt;em&gt;Brute Force Detection (BFD)&lt;/em&gt;&lt;/a&gt;. The DoS tool will detect any Denial of Service attacks while BFD will monitor incoming connections and ban any IP who breaks easy to setup access throttling rules All these tools are free and compatible with most Linux flavors. Try em out! There are many more available from R-fx Networks, the company that maintains them.&lt;br/&gt;&lt;br/&gt;As for the setup instructions, &lt;a href="http://www.google.ca/search?hl=en&amp;amp;q=apf+bfd+ddos+tutorial"&gt;google for them&lt;/a&gt;; as always. There are many nifty tutorials out there and I won't copy them here :P&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Web Applications Security&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;What if I told you that there is a generic way of applying a minimum security level to all your web applications at the OS level, thus simplifying the life of anyone who administers web servers. You might get frustrated by the fact that you didn't know this at the time you got hacked. You might even wonder how wonderful this would be for your web hosting server.&lt;br/&gt;&lt;br/&gt;Well, I'm doing it.&lt;br/&gt;&lt;br/&gt;I'll say it.&lt;br/&gt;&lt;br/&gt;Ready ? There it is.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.modsecurity.org/"&gt;ModSecurity&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Okay, this was the hard part. Now it will be much easier. It's a simple Apache HTTPD module that you add to your web server configuration and it will validate all requests against a set of nifty threat detectors. It uses regular expression to protect your applications against overflows, injections and whatever might be dangerous for them.&lt;br/&gt;&lt;br/&gt;There is even a console available to monitor many installations and keep an eye out for alerts.&lt;br/&gt;&lt;br/&gt;Easy to understand, easy to install. As always, &lt;a href="http://www.google.ca/search?q=modsecurity+howto"&gt;google has all your answers&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;The bottom line&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;The lesson to remember is that these tools take half a day of work to setup and they will save you sooo much trouble in the future that it is worthless to discuss the pertinence of using them. The tools are out there, for free. You'd be a fool not to use them.&lt;br/&gt;&lt;br/&gt;CQFD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-3735205948472004909?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/3735205948472004909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2008/07/field-lessons-securing-linux-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/3735205948472004909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/3735205948472004909'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2008/07/field-lessons-securing-linux-server.html' title='Field lessons - Securing a Linux server'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5135528453578823385.post-5071040781779072054</id><published>2008-07-15T06:53:00.000-04:00</published><updated>2010-09-06T17:05:48.019-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='olap'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='bi'/><category scheme='http://www.blogger.com/atom/ns#' term='olap4j'/><category scheme='http://www.blogger.com/atom/ns#' term='business intelligence'/><title type='text'>Olap4j and XML/A - One more step towards a true olap systems
integration API</title><content type='html'>&lt;img src="http://blog.devdonkey.org/wp-content/uploads/2008/07/olap4j_logo.png" alt="olap4j_logo" align="right" hspace="10" vspace="10" /&gt;I've been working for a month now on some enhancements to the &lt;a href="http://www.olap4j.org" title="The Olap4j API project" target="_blank"&gt;Olap4j&lt;/a&gt; project to make it more powerful and compatible. The good news is, I succeeded. The previous version, 0.9.5, lacked some basic functionalities which you would expect from a production ready XML/A driver.&lt;br/&gt;&lt;br/&gt;For one, it's HTTP proxy didn't support cookies. his was a big problem since the myriad of requests required to populate Olap4j's meta data objects each created a new user session on the web service back-end. This was a no-no, but now it's fixed and kicking ass.&lt;br/&gt;&lt;br/&gt;I also worked on a SOAP query cache. This is was a big piece of software engineering,  since I'm not used to thread safe coding. Thread safe thignys are usually in the lower levels of BI application servers and those issues are tackled from the start. Thanks to Java's &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html" target="_blank" title="the said package API"&gt;java.util.concurrent package&lt;/a&gt;, this was a breeze.&lt;br/&gt;&lt;br/&gt;Those changes are not part of any release nor in the SVN yet. I'm still waiting for peer review before the whole commit, but for people eager to see what it looks like, I've created a &lt;a href="http://devdonkey.org/olap4j/CacheCookiesAndMore-src.zip" title="modifications source code is here"&gt;neat little package&lt;/a&gt; for y'all.&lt;br/&gt;&lt;br/&gt;Now I can move back to my next release of the University of Montreal's Pentaho platform... all work and no play makes Luc a dull boy.&lt;br/&gt;&lt;br/&gt;Cheers !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5135528453578823385-5071040781779072054?l=devdonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devdonkey.blogspot.com/feeds/5071040781779072054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://devdonkey.blogspot.com/2008/07/olap4j-and-xmla-one-more-step-towards.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5071040781779072054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5135528453578823385/posts/default/5071040781779072054'/><link rel='alternate' type='text/html' href='http://devdonkey.blogspot.com/2008/07/olap4j-and-xmla-one-more-step-towards.html' title='Olap4j and XML/A - One more step towards a true olap systems&#xA;integration API'/><author><name>Luc Boudreau</name><uri>http://www.blogger.com/profile/17962022808245057116</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_qNJXxQcuKDM/TRogCyrYXYI/AAAAAAAAADY/JfKdkOhkF-c/S220/me-2.1.jpg'/></author><thr:total>0</thr:total></entry></feed>
