<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2002573816058150704</atom:id><lastBuildDate>Mon, 18 May 2009 19:15:40 +0000</lastBuildDate><title>Guy's Thoughts</title><description /><link>http://blog.sayar.com/</link><managingEditor>noreply@blogger.com (Guy Sayar)</managingEditor><generator>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/GuysThoughts" type="application/rss+xml" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-1387574587179188438</guid><pubDate>Tue, 03 Jun 2008 22:02:00 +0000</pubDate><atom:updated>2008-06-03T23:05:09.161+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">VB Space API</category><category domain="http://www.blogger.com/atom/ns#">GigaSpaces</category><category domain="http://www.blogger.com/atom/ns#">VBA</category><category domain="http://www.blogger.com/atom/ns#">Excel</category><category domain="http://www.blogger.com/atom/ns#">GSIterator</category><title>VBA GSIterator</title><description>&lt;span style="font-family:verdana;"&gt;VB Space API v1.2 is &lt;a href="http://www.openspaces.org/display/VBS/VB+Space+API"&gt;released&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A nice addition to the release is the native support for &lt;a href="http://www.gigaspaces.com/wiki/display/GS6/JavaSpaces+Iterator"&gt;GSIterator&lt;/a&gt;, which enabled reading large sets of data in a manageable manner. The ReadWrite example file includes a usage scenario.&lt;br /&gt;&lt;br /&gt;-Guy&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-1387574587179188438?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/g6P_6TIm938/vba-gsiterator.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.sayar.com/2008/06/vba-gsiterator.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-3827872002673915097</guid><pubDate>Fri, 30 May 2008 18:12:00 +0000</pubDate><atom:updated>2008-05-30T19:35:30.145+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">XMLA</category><category domain="http://www.blogger.com/atom/ns#">GigaSpaces</category><category domain="http://www.blogger.com/atom/ns#">ActivePivot</category><category domain="http://www.blogger.com/atom/ns#">Excel</category><title>Realtime Aggregations</title><description>&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;a href="http://www.quartetfs.com/index.html" target="_blank"&gt;Quartet Financial&lt;/a&gt; provide a very appealing product called &lt;a href="http://www.quartetfs.com/activepivot.html" target="_blank"&gt;ActivePivot&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;ActivePivot offloads pivot calculations and aggregations from the client process to a backend server. It exposes &lt;a href="http://en.wikipedia.org/wiki/XML_for_Analysis" target="_blank"&gt;XMLA&lt;/a&gt; interface (among others), which means that if you are an Excel user, you simply define a pivot table and point the data source to the ActivePivot server. From that point onwards, Excel interacts with ActivePivot natively.&lt;br /&gt;&lt;br /&gt;The result is a very thin Excel spreadsheet which only displays the aggregated result, and all the number crunching and aggregations take place at the server side. When the user interacts with the pivot table, Excel queries ActivePivot and display the next level. Very nice!&lt;br /&gt;&lt;br /&gt;ActivePivot provides hooks for the correlation and aggregation execution, so custom logic can easily be applied.&lt;br /&gt;&lt;br /&gt;ActivePivot stores the aggregated cube in memory, which allows it to update the cube and respond to market events, and by that provide intra-day aggregations.&lt;br /&gt;&lt;br /&gt;The real time bit is where GigaSpaces fits in&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_PnUbZmC-tMk/SEBHESiybJI/AAAAAAAAAdI/0IM66Av7VqI/s1600-h/ap.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5206239308263091346" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_PnUbZmC-tMk/SEBHESiybJI/AAAAAAAAAdI/0IM66Av7VqI/s400/ap.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Market data feeds are written into a space using one of GigaSpaces' APIs (JMS, Remoting, JavaSpaces, etc'), and ActivePivot connect to the space and register for space events. When a tick is updated in the space, the space sends a notification to ActivePivot which in turn re-aggregates the relevant cube branch. This means that the aggregated cube is always updated and reflects the latest market state. In addition ActivePivot queries the space for the raw data when Excel sends a drill-down request, which allows ActivePivot a very quick response time.&lt;br /&gt;&lt;br /&gt;ActivePivot can be applied at different areas and provide real time P&amp;amp;L, real time Risk, etc'&lt;br /&gt;&lt;br /&gt;-Guy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-3827872002673915097?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/wDTgR5ESF0Q/realtime-aggregations.html</link><author>noreply@blogger.com (Guy Sayar)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_PnUbZmC-tMk/SEBHESiybJI/AAAAAAAAAdI/0IM66Av7VqI/s72-c/ap.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.sayar.com/2008/05/realtime-aggregations.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-7417724300963720367</guid><pubDate>Fri, 23 May 2008 17:10:00 +0000</pubDate><atom:updated>2008-05-30T19:38:36.451+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GigaSpaces</category><category domain="http://www.blogger.com/atom/ns#">Scalability</category><title>Deployment Predictability</title><description>&lt;span style="font-family:verdana;"&gt;My colleague Uri &lt;/span&gt;&lt;a href="http://uri-cohen.blogspot.com/2008/05/about-predictability-and-traceability.html"&gt;&lt;span style="font-family:verdana;"&gt;raised an interesting point in his post&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;. I completely agree with Uri, and would like to give an example.&lt;br /&gt;&lt;br /&gt;I have been involved in a project for a mobile operator in the UK during the second half of last year. We built a scale-out SOA activation platform for a new mobile device launch using GigaSpaces. The GigaSpaces platform replaced an existing system.&lt;br /&gt;&lt;br /&gt;The original system was built using JBoss as a backend server. Predictions were for a huge increase in activation-requests the system had to handle due to the new device launch. While the system worked fine using the JBoss as a platform, there was no way these guys could predict how many instances of JBoss they would need to run in order to cope with anticipated load. They started to do some benchmarking and performance testing to figure out where the system's limits were, but they soon found out, that the process was leading them nowhere. This is mainly because the JBoss's were inconsistent and they hit the scalability ceiling using a few (very few…) nodes. When adding more instances, the overhead of synchronising the JBoss cluster grow exponentially as suggested by &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Ahmdal%27s_Law"&gt;&lt;span style="font-family:verdana;"&gt;Ahmdal's Law&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;, so the gain in TP that each instance added varied depending on the cluster size and other nodes' load, which kills predictability all together.&lt;br /&gt;&lt;br /&gt;JBoss is just an example in this case. It's not a JBoss specific flaw, but rather a tier based approached which imposes a limited architecture.&lt;br /&gt;&lt;br /&gt;They then came to us to resolves the predictability challenge.&lt;br /&gt;&lt;br /&gt;We did an exercise to figure out how the deployment would look like using GigaSpaces, and came up with a linear formula of the HW and number of instances needed to support the given load. More than that, they knew that if the business predictions had been pessimistic, supporting extra load would mean simply deploying more spaces... On top of that, their back office systems did not support HA, and would explode if load increased suddenly, so GigaSpaces also provided HA and throttling for the backend servers. During one overnight test the database failed for about 4 hours, and the system was fully functional and completed users' requests, while completed requests waited for the database to be brought up again to complete the archiving process. The customer was truly impressed!&lt;br /&gt;&lt;br /&gt;Needless to say that the launch went flawless, and there were no issues what so ever with the GigaSpaces based system.&lt;br /&gt;&lt;br /&gt;So, yes – Uri makes a good point. GigaSpaces' customers can predict and properly plan ahead the deployment needed to support their business.&lt;br /&gt;&lt;br /&gt;-Guy&lt;br /&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-7417724300963720367?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/zsgh9MZ96jQ/deployment-predictability.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.sayar.com/2008/05/deployment-predictability.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-2149792677201236685</guid><pubDate>Mon, 19 May 2008 21:52:00 +0000</pubDate><atom:updated>2008-05-30T19:39:13.515+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GigaSpaces</category><category domain="http://www.blogger.com/atom/ns#">Scalability</category><category domain="http://www.blogger.com/atom/ns#">Gaming</category><title>Let's play...</title><description>&lt;span style="font-family:verdana;"&gt;I have been involved in a nice gaming project in the last couple of weeks.&lt;br /&gt;&lt;br /&gt;In the first meeting, giving an overview, the prospect presented their challenge:&lt;br /&gt;&lt;br /&gt;"We store game data in memory as we need very fast response time, and we are reaching our limits in terms of supporting our business. We are launching games which support many thousands of users and we are not able to store a game's data in a single server.&lt;br /&gt;&lt;br /&gt;We tried using a database and running our aggregations against it. The response time we got was not acceptable. We want to store game's data across multiple JVM, but how will which JVM stores which pieces of the data?"&lt;br /&gt;&lt;br /&gt;Well, aggregations and data partitioning go very well together if you have the right technology in hand. &lt;/span&gt;&lt;a href="http://www.gigaspacesblog.com/2007/03/24/partitioning-scalability-but-what-about-aggregation/"&gt;&lt;span style="font-family:verdana;"&gt;Nati Shalom wrote a good post on this subject&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;.&lt;br /&gt;&lt;br /&gt;The interesting thing is that GigaSpaces supports aggregation since way before the Map/Reduce term was even thought of… When using &lt;/span&gt;&lt;a href="http://www.gigaspaces.com/docs/JavaDoc6/com/j_spaces/core/IJSpace.html#readMultiple(net.jini.core.entry.Entry,"&gt;&lt;span style="font-family:verdana;"&gt;JavaSpaces' readMultiple API against a clustered space&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;, the read request is broadcasted to all the cluster members, who execute the request (locally) in parallel, the client side receives back an array of responses which it then needs to aggregate (Reduce). With OpenSpaces, we have Springified this and it is also supported through &lt;/span&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/GS6/OpenSpaces+Remoting+Component+-+Sync+Remoting"&gt;&lt;span style="font-family:verdana;"&gt;Spring Remoting with a pluggable reducer at the client side&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;.&lt;br /&gt;&lt;br /&gt;A couple of hours after the dev was kicked off, we were able to demo how a single game can span multiple JVMs, aggregate the game's data in a simple fashion, and display the aggregated result. The system, which was limited to x10,000 concurrent users, can now scale to x100,000 and x1,000,000 linearly using GigaSpaces.&lt;br /&gt;&lt;br /&gt;Bingo!&lt;br /&gt;&lt;br /&gt;-Guy&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-2149792677201236685?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/AgfegYQG-i4/lets-play.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.sayar.com/2008/05/lets-play.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-4209367120225483014</guid><pubDate>Wed, 07 May 2008 10:40:00 +0000</pubDate><atom:updated>2008-05-30T19:40:22.256+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">VB Space API</category><category domain="http://www.blogger.com/atom/ns#">GigaSpaces</category><category domain="http://www.blogger.com/atom/ns#">VBA</category><category domain="http://www.blogger.com/atom/ns#">Excel</category><title>GigaSpaces VB API Beta Release</title><description>&lt;p&gt;&lt;span style="font-family:verdana;"&gt;GigaSpaces VB API version 1.0 is now available under &lt;/span&gt;&lt;a href="http://www.openspaces.org/display/VBS/VB+Space+API" target="_blank"&gt;&lt;span style="font-family:verdana;"&gt;OpenSpaces.org.&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;Up and above some enhancements and stability fixes, the main addition in this release is native notification support for VBA applications.&lt;br /&gt;&lt;br /&gt;The distribution includes a comprehensive example of notifications, which includes also (as a side effect) interoperability with Java. It is a simulation of FXSpot Pricing System in which prices are updated by an external system (the Java feeder in our case), and at the other end there is a spreadsheet which is listening to the FXSpot updates.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Here are the basics of the example:&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;FXSpot POJO:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="BACKGROUND: silver;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;pre style="MARGIN: 0px"&gt;@SpaceClass(persist = &lt;span style="color:blue;"&gt;false&lt;/span&gt;, fifo = &lt;span style="color:blue;"&gt;false&lt;/span&gt;, replicate = &lt;span style="color:blue;"&gt;false&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; FXSpot {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt; fxName;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;double&lt;/span&gt; modified;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;span style="color:blue;"&gt;private&lt;/span&gt; float value;    &lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt; @SpaceId(autoGenerate = &lt;span style="color:blue;"&gt;false&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt; getFxName() {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;  &lt;span style="color:blue;"&gt;return&lt;/span&gt; fxName;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;span style="color:blue;"&gt;public&lt;/span&gt; void setFxName(&lt;span style="color:blue;"&gt;String&lt;/span&gt; _fxName) {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;  fxName = _fxName;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; @SpaceProperty(nullValue = &lt;span style="color:#a31515;"&gt;"0"&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;double&lt;/span&gt; getModified() {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;  return&lt;/span&gt; modified;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;span style="color:blue;"&gt;public&lt;/span&gt; void setModified(&lt;span style="color:blue;"&gt;double&lt;/span&gt; _modified) {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;  modified = _modified;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; @SpaceProperty(nullValue = &lt;span style="color:#a31515;"&gt;"0"&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;span style="color:blue;"&gt;public&lt;/span&gt; float getValue() {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;  &lt;span style="color:blue;"&gt;return&lt;/span&gt; value;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;span style="color:blue;"&gt;public&lt;/span&gt; void setValue(float _value) {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;  value = _value;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;&lt;strong&gt;The counterpart PONO&lt;/strong&gt; (I have omitted the COM methods):&lt;/span&gt;&lt;/p&gt;&lt;div style="BACKGROUND: silver;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; com.mycompany.trading.fx&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;{&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    [&lt;span style="color:#2b91af;"&gt;ClassInterface&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ClassInterfaceType&lt;/span&gt;.AutoDual), &lt;span style="color:#2b91af;"&gt;ComVisible&lt;/span&gt;(&lt;span style="color:blue;"&gt;true&lt;/span&gt;)]&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FXSpot&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    {        &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; _fxName;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;double&lt;/span&gt; _modified;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;float&lt;/span&gt; _value;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;   &lt;span style="color:blue;"&gt;public&lt;/span&gt; FXSpot()&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;            _fxName     = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;            _modified   = 0;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;            _value      = 0;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;        [&lt;span style="color:#2b91af;"&gt;SpaceID&lt;/span&gt;(AutoGenerate = &lt;span style="color:blue;"&gt;false&lt;/span&gt;)]&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        [&lt;span style="color:#2b91af;"&gt;SpaceProperty&lt;/span&gt;(AliasName = &lt;span style="color:#a31515;"&gt;"fxName"&lt;/span&gt;, NullValue = &lt;span style="color:#a31515;"&gt;""&lt;/span&gt;)]&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; FXName&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;            &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _fxName; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;            &lt;span style="color:blue;"&gt;set&lt;/span&gt; { _fxName = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        } &lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;        [&lt;span style="color:#2b91af;"&gt;SpaceProperty&lt;/span&gt;(AliasName = &lt;span style="color:#a31515;"&gt;"modified"&lt;/span&gt;, NullValue = 0)]&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;double&lt;/span&gt; Modified&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;            &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _modified; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;            &lt;span style="color:blue;"&gt;set&lt;/span&gt; { _modified = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        } &lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;        [&lt;span style="color:#2b91af;"&gt;SpaceProperty&lt;/span&gt;(AliasName = &lt;span style="color:#a31515;"&gt;"value"&lt;/span&gt;, NullValue = 0)]&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;float&lt;/span&gt; Value&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        {&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;            &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _value; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;            &lt;span style="color:blue;"&gt;set&lt;/span&gt; { _value = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    }&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;}&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;br /&gt; &lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;&lt;strong&gt;Java feeder &lt;/strong&gt;– After looking up the space, and initializing Random helpers and currency names, it looks like:&lt;/span&gt;&lt;/p&gt;&lt;div style="BACKGROUND: silver;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;while&lt;/span&gt;(&lt;span style="color:blue;"&gt;true&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;{&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    FXSpot spot = &lt;span style="color:blue;"&gt;new&lt;/span&gt; FXSpot();&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    spot.setFxName(fxNames[ccyRand.nextInt(10)]); &lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;double&lt;/span&gt; modified = (&lt;span style="color:blue;"&gt;double&lt;/span&gt;)System.currentTimeMillis(); &lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:green;"&gt;// convert to Excel date&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    modified = (modified + 7200000) / 86400000 + 25569;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;    spot.setModified(modified);&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    spot.setValue(valuesRandom.nextFloat());&lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;    System.&lt;span style="color:blue;"&gt;out&lt;/span&gt;.println(&lt;span style="color:#a31515;"&gt;"Writing spot = "&lt;/span&gt; + spot); &lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;    spaceProxy.write(spot, &lt;span style="color:blue;"&gt;null&lt;/span&gt;, Lease.FOREVER);&lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;    Thread.sleep(sleepTime);&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Up until now, nothing new really… Now begins the interesting bit!&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;After omitting the initialization parts of the VBA code, what we have is the following:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Registration &lt;/strong&gt;function:&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BACKGROUND: silver;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;Function&lt;/span&gt; RegisterNotifications(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; sRng &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;If&lt;/span&gt; GigaSpace &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;Call&lt;/span&gt; Init&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; rng &lt;span style="color:blue;"&gt;As&lt;/span&gt; range&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    rng = range(sRng)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; Template &lt;span style="color:blue;"&gt;As&lt;/span&gt; FXObjects.FXSpot&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    Template = &lt;span style="color:blue;"&gt;New&lt;/span&gt; FXObjects.FXSpot&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    Template.fxName = rng.Value&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; modifiers &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Integer&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    modifiers = NotificationModifiers.Update &lt;/pre&gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;Call&lt;/span&gt; GigaSpace.RegisterNotification(Template, &lt;span style="color:#a31515;"&gt;"Notify"&lt;/span&gt;, modifiers, sRng)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:verdana;"&gt;It is very easy to explain the code. If you have ever read the docs or used GigaSpaces’ notifications API, you should feel pretty comfortable here. Same rules apply… If you haven’t, a quick browse &lt;/span&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/OLH/JavaSpaces+Notifications" target="_blank"&gt;&lt;span style="font-family:verdana;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; will help understanding the API and terminology better.&lt;br /&gt;&lt;br /&gt;You simply invoke GigaSpace.RegisterNotification method with a template to match, the name of your notify function, notify modifiers (take, write, update, all), and last argument which is not part of GigaSpaces notify API is called vbHint. It can hold any object the user wishes to receive back when the notify function is triggered for this specific registration (i.e. template match and operation match). In this example I have iterated through a list of currencies, and I pass the cell address of the specific currency to the registration so that when my &lt;strong&gt;Notify&lt;/strong&gt; method is invoked, I can lookup the relevant cell easily.&lt;br /&gt;&lt;br /&gt;My &lt;strong&gt;Notify &lt;/strong&gt;function:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BACKGROUND: silver;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;Function&lt;/span&gt; Notify(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; eventType &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Long&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; pono &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Object&lt;/span&gt;, &lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; vbHint &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Object&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; sRng &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;String&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    sRng = vbHint&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; rng &lt;span style="color:blue;"&gt;As&lt;/span&gt; range&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    rng = range(sRng)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;Dim&lt;/span&gt; spot &lt;span style="color:blue;"&gt;As&lt;/span&gt; FXObjects.FXSpot&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    spot = pono&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt; &lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    rng.Offset(0, 1).Value = spot.Value&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    rng.Offset(0, 2).Value = spot.Modified&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:Verdana;"&gt;Note the &lt;strong&gt;Notify&lt;/strong&gt; signature. When registering to notifications, the notify function must have this signature in terms of the types it takes as arguments. The &lt;strong&gt;eventType&lt;/strong&gt; represents the space operation which triggered the notification, and the &lt;strong&gt;pono&lt;/strong&gt; is the object which matched the registration’s template and triggered the notify.&lt;br /&gt;&lt;br /&gt;In this example, I take the values from the notification object, and update the relevant Excel cells (I use the &lt;strong&gt;vbHint&lt;/strong&gt; for that).&lt;br /&gt;&lt;br /&gt;The example includes a button to &lt;strong&gt;UnRegisterNotifications&lt;/strong&gt;.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BACKGROUND: silver;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; UnReg()&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; (GigaSpace &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;) &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;Call&lt;/span&gt; GigaSpace.UnRegisterNotifications&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;The &lt;strong&gt;UnRegisterNotifications&lt;/strong&gt; method removes all registrations for the invoking Excel from the space.&lt;br /&gt;&lt;br /&gt;One more thing to note is the termination of the Excel process. As notifications require some daemon threads to run at the background, the Excel needs to invoke &lt;strong&gt;GigaSpace.Terminate&lt;/strong&gt; function which cleans up these threads and frees some resources. Failing to invoke the method could result a hanging Excel process. As a best practice, you should catch the Excel workbook close event and call the terminate method.&lt;br /&gt;&lt;br /&gt;Example (at the workbook level):&lt;/span&gt;&lt;/p&gt;&lt;div style="BACKGROUND: silver;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;br /&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;Private&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Workbook_BeforeClose(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Cancel &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;Call&lt;/span&gt; TerminateGigaSpace&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;Which invokes the &lt;strong&gt;Terminate&lt;/strong&gt; method:&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="BACKGROUND: silver;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt; TerminateGigaSpace()&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;If&lt;/span&gt; &lt;span style="color:blue;"&gt;Not&lt;/span&gt; (GigaSpace &lt;span style="color:blue;"&gt;Is&lt;/span&gt; &lt;span style="color:blue;"&gt;Nothing&lt;/span&gt;) &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;Call&lt;/span&gt; GigaSpace.Terminate&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;The example with inline comments and documentation is packed in the setup. After &lt;a href="http://www.openspaces.org/display/VBS/Project+Downloads" target="_blank"&gt;downloading&lt;/a&gt; and completing the installation process, the example Excel can be run from &lt;start&gt;--&gt; Programs --&gt; VB Space API --&gt; Examples --&gt; FXSpot Notify. The example is located under &lt;vbspaceapi_install_dir&gt;\Examples\FXPrices. Follow the readMe.txt to run and change the example.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;-Guy&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-4209367120225483014?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/wotK_SOtT5I/gigaspaces-vb-api-beta-release.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.sayar.com/2008/05/gigaspaces-vb-api-beta-release.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-5517184830377860754</guid><pubDate>Sat, 26 Apr 2008 18:54:00 +0000</pubDate><atom:updated>2008-05-30T19:40:03.159+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">VB Space API</category><category domain="http://www.blogger.com/atom/ns#">VBA</category><category domain="http://www.blogger.com/atom/ns#">COM</category><category domain="http://www.blogger.com/atom/ns#">Excel</category><title>Dealing With Excel Arrays</title><description>&lt;span style="font-family:verdana;"&gt;One of the nice things in Excel is the ability to treat scalar, any size vector, and any size matrix in the same way (from the developer's perspective). This is very powerful, and saves a lot of development time.&lt;br /&gt;&lt;br /&gt;It gets interesting when you add COM and C# into the picture… I am working on a demo which includes Excel and C# (more on the demo in a different post), and one of the things we needed to do is pass arrays from the spreadsheet to our C# logic. We are using COM for the interaction. This is where the problem starts. When you fill up an array in Excel and pass it over COM, it is received at the other side as an object, not as an array, and you can not access the array's elements.&lt;br /&gt;&lt;br /&gt;The solution for that is to use reflection and to interrogate the object using simple array methods. It took us some time to find how this should be done properly (thanks to PK), and this is it:&lt;br /&gt;&lt;br /&gt;First of all, let's assume we have a range of doubles in your spreadsheet. I named the range "double_range":&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5193614039044262130" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_PnUbZmC-tMk/SBNsc5m3CPI/AAAAAAAAASM/e5v7LxpV_ho/s400/define_array.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Next, I have a utility function which populates a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;VBA&lt;/span&gt; array with the values:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_PnUbZmC-tMk/SBN0GJm3CVI/AAAAAAAAAS8/WXf5UkXpo-Y/s1600-h/ReadRangeDouble.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5193622444295260498" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_PnUbZmC-tMk/SBN0GJm3CVI/AAAAAAAAAS8/WXf5UkXpo-Y/s400/ReadRangeDouble.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;My &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;VBA&lt;/span&gt; code which passes the array, looks like: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5193615078426347794" alt="" src="http://2.bp.blogspot.com/_PnUbZmC-tMk/SBNtZZm3CRI/AAAAAAAAASc/79hLFovM1hg/s400/vba_code.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;My C# object does not use an attribute setter, but rather have a setter method which invokes a translator utility function:&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5193615082721315106" alt="" src="http://3.bp.blogspot.com/_PnUbZmC-tMk/SBNtZpm3CSI/AAAAAAAAASk/i8WR6ZslwBI/s400/dotnet_setter.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Translator function is the most important piece of this puzzle:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_PnUbZmC-tMk/SBNztZm3CUI/AAAAAAAAAS0/EEBTTA0TBn8/s1600-h/dotnet_convert.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5193622019093498178" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_PnUbZmC-tMk/SBNztZm3CUI/AAAAAAAAAS0/EEBTTA0TBn8/s400/dotnet_convert.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have uploaded the code snippets into a &lt;a href="http://guy.sayar.googlepages.com/code.txt"&gt;text file here&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;The &lt;a href="http://openspaces.org/display/VBS/VB+Space+API"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;VBSpaceAPI&lt;/span&gt;&lt;/a&gt; will include such helpers in its next release and &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;Will&lt;/span&gt; support arrays &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;natively&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-Guy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-5517184830377860754?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/lE2PGSsPngE/excel-arrays.html</link><author>noreply@blogger.com (Guy Sayar)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_PnUbZmC-tMk/SBNsc5m3CPI/AAAAAAAAASM/e5v7LxpV_ho/s72-c/define_array.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.sayar.com/2008/04/excel-arrays.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-7581922805822406363</guid><pubDate>Sat, 12 Apr 2008 15:22:00 +0000</pubDate><atom:updated>2008-05-30T19:41:26.708+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">VB Space API</category><category domain="http://www.blogger.com/atom/ns#">Inno Setup</category><category domain="http://www.blogger.com/atom/ns#">GigaSpaces</category><category domain="http://www.blogger.com/atom/ns#">VBA</category><category domain="http://www.blogger.com/atom/ns#">Excel</category><title>VB Space API Alfa Release</title><description>&lt;span style="font-family:verdana;"&gt;An Alfa release of the Space VB API is now available at &lt;a href="http://openspaces.org/display/VBS/VB+Space+API" target="blank"&gt;OpenSpaces.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are a number of changes in this build. Main ones are a new installer, a fix for &lt;a href="http://blog.sayar.com/2008/04/vb-space-api-01-is-released.html"&gt;default value in read and take APIs&lt;/a&gt;, and a more comprehensive example and documentation pages.&lt;br /&gt;&lt;br /&gt;You can read more about it in the project pages, but one thing I want to specifically mention in my experience with the installer program.&lt;br /&gt;&lt;br /&gt;It has been very long since the last time I had to compile an installer program. Actually, it was around 1998, where I created a setup for a university project. It was based on InstallShield, which made the entire process long and painful! This time it was very different. I used a utility called &lt;a href="http://www.jrsoftware.org/isinfo.php" target="blank"&gt;Inno Setup&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;, a very lightweight and simple installer. It took me no more than 10 minutes to create the first run of the setup, and another half an hour or so to customise it with my own specific stuff (making sure GigaSpaces is installed, invoking the example at the end of the setup, etc'), which was also straight forward to do thanks to the detailed help files provided.&lt;br /&gt;&lt;br /&gt;Now, surely InstallShield could do everything I needed and much more, but it would have been much harder and a longer process... Kudos to Jordan Russell for the well designed and implemented installer utility!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Enjoy!&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;-Guy&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-7581922805822406363?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/qdhTus9E6YU/vb-space-api-alfa-release.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.sayar.com/2008/04/vb-space-api-alfa-release.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-7657231787859857652</guid><pubDate>Tue, 08 Apr 2008 22:49:00 +0000</pubDate><atom:updated>2008-04-08T23:58:23.032+01:00</atom:updated><title>Google's Cloud Is Now Public</title><description>&lt;span style="font-family:verdana;"&gt;Well almost...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Google has announced &lt;a href="http://appengine.google.com/" target="blank"&gt;AppEngine&lt;/a&gt;, which is, in essence, a platform for developing web applications using Google's platform, and deploying them into Google's cloud.&lt;br /&gt;&lt;br /&gt;Google like Google, released AppEngine in a very controlled way, granting access to the first 10,000 users who registered to the Beta program. Too bad I wasn't quick enough… I am sure that the user-experience and the set of features provided will make developing and deploying web apps into Google an easy and nice experience.&lt;br /&gt;&lt;br /&gt;As for the release being a Beta, that's also a nice trick by Google. It really doesn’t mean that AppEngine is not mature yet, it's just a way to lower our expectation a bit I guess. Take &lt;a href="http://www.gmail.com/" target="blank"&gt;GMail&lt;/a&gt; for instance, it's still at Beta stage!&lt;br /&gt;&lt;br /&gt;A very detailed description of the offering from &lt;a href="http://radar.oreilly.com/archives/2008/04/app-engine-host-your-python-apps-with-google.html" target="blank"&gt;Brady Forrest&lt;/a&gt;, which also discusses some differences between AppEngine and &lt;a href="http://www.amazon.com/gp/browse.html?node=3435361" target="blank"&gt;Amazon's AWS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-Guy&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-7657231787859857652?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/WdFcg4-G5uM/googles-cloud-is-now-public.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.sayar.com/2008/04/googles-cloud-is-now-public.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-2203348084222483657</guid><pubDate>Mon, 07 Apr 2008 21:08:00 +0000</pubDate><atom:updated>2008-04-07T21:31:28.832+01:00</atom:updated><title>VB Space API 0.1 Is Released</title><description>&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;I have released the first version of the VB API as a &lt;/span&gt;&lt;a href="http://www.openspaces.org/display/VBS/VB+Space+API" target="blank"&gt;&lt;span style="font-family:verdana;"&gt;Pre-Alfa under OpenSpace.org&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;. The main purpose of this early release is to gather feedback from prospective users, and build-up a proper roadmap. The backlog is filling up with stuff such as install program, batch operations, notification, and additional space functionality, and I'd appreciate your input and rating as to those or other items.&lt;br /&gt;&lt;br /&gt;The release includes a nice little Excel file as an example, where you can interact with the space to write and read Person objects. The Excel file includes comments which explain how the example should be used, whereas the code, being very simple and self-explanatory, does not require extra elaboration in my opinion. Follow the &lt;/span&gt;&lt;a href="http://www.openspaces.org/display/VBS/Project+Documentation" target="blank"&gt;&lt;span style="font-family:verdana;"&gt;installation and example instructions&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; and give it a try. Comments are welcomed!&lt;br /&gt;&lt;br /&gt;Technical background and limitations – The VB API uses GigaSpaces C# API over COM. This means that I have a C# class which wraps GigaSpaces' C# API, and is exposed as a COM class. From this point onwards, the VB application communicates with my C# layer using COM.&lt;br /&gt;&lt;br /&gt;There is a number of VB / COM limitations which I had to work around. I am still looking for ways to overcome these issues. One of the things you will note is that the &lt;strong&gt;&lt;em&gt;Read&lt;/em&gt;&lt;/strong&gt; API takes two arguments: a template, and a default value (there is an overloaded &lt;strong&gt;&lt;em&gt;Read&lt;/em&gt;&lt;/strong&gt; which also takes a blocking timeout as a parameter):&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5186599071562556274" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; alt: " src="http://4.bp.blogspot.com/_PnUbZmC-tMk/R_qAYDTbY3I/AAAAAAAAARs/yFzpcAPlaO0/s400/read-arguments.bmp" border="0" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;This is because VB over COM does not allow you (or I haven’t yet found the proper way) to return a null value from the C# layer and set it to the Response object, nor did I find a way to cast COM's return value. So when there is no result back for the template match in the space, I could not simply return null. I am looking at generics support for VB / COM, in which case the problem is solved as I can do something like: &lt;strong&gt;&lt;em&gt;return default(T)&lt;/em&gt;&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;Another limitation I found is the inability to specify a VB class as serializable, which means that you need to declare your business classes using C#. It's a fairly quick and straight forward task, though I am still googling for a proper solution which will allow users to stay in the VB environment from start to end. If that proves to be impossible I can think of means such as generators to ease this process.&lt;br /&gt;&lt;br /&gt;In next posts I will demonstrate how to create a full example from scratch.&lt;br /&gt;&lt;br /&gt;-Guy&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-2203348084222483657?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/i1JjZd5uekQ/vb-space-api-01-is-released.html</link><author>noreply@blogger.com (Guy Sayar)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_PnUbZmC-tMk/R_qAYDTbY3I/AAAAAAAAARs/yFzpcAPlaO0/s72-c/read-arguments.bmp" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.sayar.com/2008/04/vb-space-api-01-is-released.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-493230667430930418</guid><pubDate>Fri, 04 Apr 2008 17:32:00 +0000</pubDate><atom:updated>2008-04-04T17:47:04.861+01:00</atom:updated><title>GigaSpaces VB API</title><description>&lt;span style="font-family:verdana;"&gt;GigaSpaces provides scaling solutions for Excel, a.k.a. "&lt;a href="http://www.gigaspaces.com/wiki/display/OLH/The+GigaSpaces+Excel+that+Scales+Solution" target="blank"&gt;Excel That Scales&lt;/a&gt;"&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;A lot have been said and written about it, and there is plenty of collaterals, examples, and webcasts. That's all good and fine, but what I would like to suggest in this post is a simplified way to access the space from within an Excel spreadsheet and / or any other VB application.&lt;br /&gt;&lt;br /&gt;I am targeting Excel or VB developers who require simple means to interact with the space, and prefer not to exhaust their C# skill-set.&lt;br /&gt;&lt;br /&gt;As an example, say you want to write a Person object into the space. Using the C# as an access layer to the space, you will need to implement your Person C# class, and space accessibility methods. &lt;a href="http://www.gigaspaces.com/wiki/display/OLH/RTD+and+UDF+Examples+-+GigaSpaces-Excel+Integration#RTDandUDFExamples-GigaSpaces-ExcelIntegration-HelloUDFPerformingExcelFunctionsinSpace" target="blank"&gt;See the following example for more details&lt;/a&gt; (replace HelloMsg with Person…)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;What if you could work with the space API from within your Excel code without having to develop an access function (WritePerson() in our case) in C#? I.e. What if you had a reference to VB Space proxy? Think of your code looking something like the following (using the Person example):&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="PADDING-LEFT: 25pt;color:#3333ff;" &gt;Sub&lt;/span&gt; WriteToSpace()&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt;color:#3333ff;" &gt;Dim&lt;/span&gt; aPerson &lt;span style="color:#3333ff;"&gt;As&lt;/span&gt; Person&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt;color:#3333ff;" &gt;Set&lt;/span&gt; aPerson = &lt;span style="color:#3333ff;"&gt;New&lt;/span&gt; Person&lt;br /&gt;&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt"&gt;aPerson.FirstName = ActiveCell.Offset(1, 0).Value&lt;/span&gt;&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt"&gt;aPerson.LastName = ActiveCell.Offset(2, 0).Value&lt;/span&gt;&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt"&gt;aPerson.Age = ActiveCell.Offset(3, 0).Value&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt;color:#3333ff;" &gt;Call&lt;/span&gt; GigaSpace.Write(aPerson)&lt;br /&gt;&lt;span style="PADDING-LEFT: 25pt;color:#3333ff;" &gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;And to read a Person object, you'd have to do something like the following (note that I filter the person according to the current user's selection as first name, and then just print the last name and age):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="PADDING-LEFT: 25pt;color:#3333ff;" &gt;Sub&lt;/span&gt; ReadFromSpace()&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt;color:#3333ff;" &gt;Dim&lt;/span&gt; Template &lt;span style="color:#3333ff;"&gt;As&lt;/span&gt; Person&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt;color:#3333ff;" &gt;Set&lt;/span&gt; Template = &lt;span style="color:#3333ff;"&gt;New&lt;/span&gt; Person&lt;br /&gt;&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt"&gt;Template.FirstName = ActiveCell.Value&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt;color:#3333ff;" &gt;Dim&lt;/span&gt; Response &lt;span style="color:#3333ff;"&gt;As&lt;/span&gt; Person&lt;br /&gt;&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt;color:#3333ff;" &gt;Set&lt;/span&gt; Response = GigaSpace.Read(Template)&lt;br /&gt;&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt"&gt;ActiveCell.Offset(1, 0).Value = Response.LastName&lt;/span&gt;&lt;br /&gt;&lt;span style="PADDING-LEFT: 70pt"&gt;ActiveCell.Offset(2, 0).Value = Response.Age&lt;/span&gt;&lt;br /&gt;&lt;span style="PADDING-LEFT: 25pt;color:#3333ff;" &gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In this example all you need to do is define your Person object (as a space class using C#), and include it in your COM libraries. The rest is your good old VB code working with the space API…&lt;br /&gt;&lt;br /&gt;If you like this approach, stay tuned. I am working on the first version of the API, which will be released fairly soon.&lt;br /&gt;&lt;br /&gt;-Guy&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-493230667430930418?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/t4Evi6VTLlQ/gigaspaces-vb-api.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.sayar.com/2008/04/gigaspaces-vb-api.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-7695349055183564535</guid><pubDate>Sat, 29 Mar 2008 15:48:00 +0000</pubDate><atom:updated>2008-03-29T18:50:50.888Z</atom:updated><title>Why Did Commons Cache Die (II)?</title><description>&lt;span style="font-family:verdana;"&gt;It has been a while since I've posted the &lt;a href="http://blog.sayar.com/2007/12/why-did-commons-cache-die.html"&gt;first part of this discussion&lt;/a&gt;, and I would like to complete it now.&lt;br /&gt;&lt;br /&gt;In the post itself, you can read interesting views and thoughts from my colleagues. My personal view is basically an aggregation of these thoughts.&lt;br /&gt;&lt;br /&gt;In my opinion, a standard Caching API would only emerge and be adopted if the following conditions are satisfied: (a) the standardising organisation needs to be technology and vertical agnostic, and needs to include different stakeholders. Key players should be users and not vendors, and (b) the caching and grid markets need to further mature.&lt;br /&gt;&lt;br /&gt;Point (a) is easy to explain and understand.&lt;br /&gt;&lt;br /&gt;What I specifically mean in point (b) is that there are too many players in the market (as Jim mentions), none really dominates the market, and each of them provides different functionality and address a different set of use-cases.&lt;br /&gt;&lt;br /&gt;In addition to that, there are still significant latency and throughput differences between the various products out there. As long as these differences can be used as differentiators it is harder to envision a unified API.&lt;br /&gt;&lt;br /&gt;When the time is right (Nati hints for mid 2008…), and the market is more mature, we will start to see more demand for such API. In my opinion, there will always be differences between the various vendors, but these will be implemented on top of the standard. As an analogy, think of SQL and JDBC, as Nati noted, (or J2EE for that sake) there is a standard and a set of basic features defined, but each vendor implements much more than the standard as its basic offering. When defined, Cache API will be just the same. We will have specs which define simple Put/Get functionality, but all the sophisticated query capabilities and scalability models will make the difference.&lt;br /&gt;&lt;br /&gt;For these reasons, I do not think that "vendor locking" (or unlocking) will be a driver for a standard Caching API.&lt;br /&gt;&lt;br /&gt;Regardless of me being a GigaSpaces employee, I think that GigaSpaces is well positioned, in terms of its technology offering, for a standard Caching API. GigaSpaces is based on the &lt;a href="http://en.wikipedia.org/wiki/Tuple_space" target="blank"&gt;Linda Tuple&lt;/a&gt; model (&lt;a href="http://java.sun.com/developer/technicalArticles/tools/JavaSpaces/" target="blank"&gt;aka JavaSpaces from Sun&lt;/a&gt;), which allows GigaSpaces to expose its data set using different APIs (I like to call them views), in a simple way. GigaSpaces provides the underlying scalable middleware, which can be accessed using different APIs and technologies. When the Caching API becomes real, it will be fairly simple for GigaSpaces to implement the API on top of the space as it does with Map, JDBC, JMS, Remoting, C++, C#, and other APIs.&lt;br /&gt;&lt;br /&gt;The answer to Mickey's question can be concluded from the above. My question is, how long will that stage last before Caching API standardisation kicks off?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a name="_MailAutoSig"&gt;&lt;span style="font-family:verdana;"&gt;-Guy&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-7695349055183564535?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/A81A26rpvYE/why-did-commons-cache-die-ii.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.sayar.com/2008/03/why-did-commons-cache-die-ii.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-7968395232389869860</guid><pubDate>Wed, 16 Jan 2008 21:44:00 +0000</pubDate><atom:updated>2008-01-16T21:53:40.271Z</atom:updated><title>Fly BEA</title><description>&lt;span style="font-family:verdana;"&gt;I'm on my way back home from a meeting in Helsinki. While leafing through BA's air magazine during takeoff I've hit the following ancient ad:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_PnUbZmC-tMk/R457gnha4eI/AAAAAAAAAME/7Oq4H5XK-tI/s1600-h/fly-bea.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5156194423680983522" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_PnUbZmC-tMk/R457gnha4eI/AAAAAAAAAME/7Oq4H5XK-tI/s320/fly-bea.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;It was too funny to see! What's funny is that we were called to see the customer here because they have latency and scalability issues with their current 3 tier architecture, and they've hit the wall in terms of being able to grow their business. And guess what, BEA is their current J2EE container…&lt;br /&gt;&lt;br /&gt;Our meeting was great. These guys seem to know exactly where their limitations are, and what they need to do in order to eliminate them. I gave a thorough walk-through of our feature set and demonstrated real cross technology interoperability on top of the space (Plain Java, JMS, Spring Remoting, JDBC, C#, and C++ clients sharing data and logic seamlessly through the space). That is, of course, in addition to usual HA, scalability, and our beautiful OpenSpaces programming model.&lt;br /&gt;&lt;br /&gt;It sure looks like an interesting project to get involved in… I can't really name the customer as of now, all I can say is that on top of their mainstream business activities, they also make tires. Knowing who they are, I would have never guessed that they did… Luckily, I had a nice taxi driver, taking me to the airport, who shared this anecdote with me J.&lt;br /&gt;&lt;br /&gt;So, similarly to BA, which has shortened the flight time from London to Stockholm by roughly a half by upgrading its fleet (not sure whether changing the name really helped here, but anyhow…), our customers shorten their processing time by upgrading their architecture from their ancient, 3-tier, J2EE architecture to GigaSpaces. GigaSpaces allows you to truly linearly scale your application w/o paying any penalty in latency (we refer to that as the share-nothing and parallel processing approach).&lt;br /&gt;&lt;br /&gt;After seeing what we have, these guys don’t want to fly BEA anymore. Do you?&lt;br /&gt;&lt;br /&gt;-Guy &lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-7968395232389869860?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/VAUg4AizeIo/fly-bea.html</link><author>noreply@blogger.com (Guy Sayar)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_PnUbZmC-tMk/R457gnha4eI/AAAAAAAAAME/7Oq4H5XK-tI/s72-c/fly-bea.bmp" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.sayar.com/2008/01/fly-bea.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-8924834518451080574</guid><pubDate>Sun, 02 Dec 2007 11:33:00 +0000</pubDate><atom:updated>2007-12-02T19:24:29.610Z</atom:updated><title>Why Did Commons Cache Die?</title><description>&lt;span style="font-family:verdana;"&gt;There have been a number of attempts to create a uniform caching API in the last couple of years. None has succeeded.&lt;br /&gt;&lt;br /&gt;A fairly known one is &lt;/span&gt;&lt;a href="http://java-source.net/open-source/cache-solutions/jcache"&gt;&lt;span style="font-family:verdana;"&gt;JCache&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; which is based on &lt;/span&gt;&lt;a href="http://jcp.org/en/jsr/detail?id=107"&gt;&lt;span style="font-family:verdana;"&gt;JSR 107&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; for Java users. JSR 107 has been “in progress” for a few years now…&lt;br /&gt;&lt;br /&gt;Another initiative which failed was to “common” the Java cache API. The &lt;/span&gt;&lt;a href="http://commons.apache.org/sandbox/cache"&gt;&lt;span style="font-family:verdana;"&gt;Commons Cache&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; project has been declared end-of-life after not being able to ramp up.&lt;br /&gt;&lt;br /&gt;Failing to create a standard cache API would not have been odd to me and I wouldn’t have spent my free CPU cycles around it, unless thinking of the cache selection process in banks, for instance. It strikes me that maybe there is a need for such an API. Banks, looking to select a data-grid solution, usually go through a very similar process. More than that, they design, implement, and run their “very specific” test harness. At the end of the day, they all look alike and have the exact same methods and semantics.&lt;br /&gt;&lt;br /&gt;Would a uniform cache API help these banks execute their exercise and ease their selection process?&lt;br /&gt;&lt;br /&gt;Moreover, is such an API needed in our industry?&lt;br /&gt;&lt;br /&gt;I have my views and thoughts, but I'm very interested to hear yours before posting those. Feel free to leave a comment or email me to guy dot sayar at gmail dot com.&lt;br /&gt;&lt;br /&gt;-Guy&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-8924834518451080574?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/9rI886UHyGM/why-did-commons-cache-die.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.sayar.com/2007/12/why-did-commons-cache-die.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-7428682003818437582</guid><pubDate>Thu, 15 Nov 2007 14:24:00 +0000</pubDate><atom:updated>2007-11-15T17:35:02.818Z</atom:updated><title>What's in an ESB?</title><description>&lt;p&gt;&lt;span style="font-family:verdana;"&gt;A number of times now I have had meeting where I have been asked to describe how Gigaspaces integrates with ESBs. Some have even gone farther and sketched how they envision their ideal architecture. They put the database, business logic pieces, an ESB and the Space in between. We were then asked to explain how GigaSpaces would help in achieving their goal – Implementing an SOA based application. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;After asking some leading questions about the application and its use-cases, it became clear (at least to me) that what they were really after was an SOA approach and not necessarily an ESB. People tend to confuse the two and refer to ESB as the underlying basis for an SOA based design.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;So… When should one really use an ESB and how is different from an SOA approach? There are a few interesting articles and posts around that topic. Check these out. &lt;/span&gt;&lt;a href="http://www.infoworld.com/article/05/04/29/HNesb_1.html" target="blank"&gt;&lt;span style="font-family:verdana;"&gt;Just what is an ESB, anyway?&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;, &lt;/span&gt;&lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=30536" target="blank"&gt;&lt;span style="font-family:verdana;"&gt;What is the business case for ESB?&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;, and the wikipedia take on &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Enterprise_service_bus" target="blank"&gt;&lt;span style="font-family:verdana;"&gt;ESB &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;and &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture" target="blank"&gt;&lt;span style="font-family:verdana;"&gt;SOA&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;My take is that an ESB is a blueprint rather than a product. There is a number of implementations which, in essence, implement the concepts of ESB. An ESB can comply with your SOA, should you choose to use one. But, moving forward, you should know that there are other, sometime more appropriate, alternatives to implementing SOA.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;One of them is to use GigaSpaces. GigaSpaces provides all the facilities needed to implement an SOA. GigaSpaces provides a distributed, highly-available, stateful execution environment combined with location transparent synchronous and asynchronous invocation mechanism, and an in-memory data-access. Check out the &lt;/span&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/GS6/Open+Spaces+Frequently+Asked+Questions#OpenSpacesFrequentlyAskedQuestions-HowdoesOpenSpacesrelatetoEDAandSOA%3F" target="blank"&gt;&lt;span style="font-family:verdana;"&gt;FAQ entry&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;, &lt;/span&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/GS6/Open+Spaces+Overview#OpenSpacesOverview-DevelopingHighThroughputEDA%2FSOAApplicationsusingOpenSpacesandSpaceBasedArchitecture" target="blank"&gt;&lt;span style="font-family:verdana;"&gt;and the example&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;In case you conclude that you do require an ESB because you have backend systems that an ESB provides adaptors to, check out the open-source &lt;/span&gt;&lt;a href="http://mule.mulesource.org/display/MULE/Home" target="blank"&gt;&lt;span style="font-family:verdana;"&gt;Mule project&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;, which provides a variety of adaptors and recently announced a &lt;/span&gt;&lt;a target="blank" href="http://mule.mulesource.org/display/MULE/Mule-SF+Connector+Samples"&gt;&lt;span style="font-family:verdana;"&gt;SalesForce.com adaptor&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;, and how &lt;/span&gt;&lt;a href="http://www.gigaspaces.com/wiki/display/GS6/Gigaspaces-Mule+Integration+Package+-+6.0" target="blank"&gt;&lt;span style="font-family:verdana;"&gt;GigaSpaces integrates with Mule&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; to provide the scalability and state-management capabilities. &lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-7428682003818437582?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/pRO_W0v1l4M/whats-in-esb.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.sayar.com/2007/11/whats-in-esb.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2002573816058150704.post-3820141121777674103</guid><pubDate>Sat, 10 Nov 2007 16:52:00 +0000</pubDate><atom:updated>2007-11-10T16:56:57.657Z</atom:updated><title>My Blog</title><description>&lt;span style="font-family:verdana;"&gt;So…&lt;br /&gt;&lt;br /&gt;I've been thinking about blogging for a while now, and finally decided to join the bloggers community. I will be blogging about distributed computing, software architecture, general java stuff and other happenings which keep my wheels rolling.&lt;br /&gt;&lt;br /&gt;I work for &lt;a href="http://www.gigaspaces.com"&gt;GigaSpaces&lt;/a&gt; where I am a part of a field team working with prospects and customers across Europe. There are many exciting experiences working in this field, and I enjoy the opportunity to participate in various interesting projects. I will not be mentioning names etc' but will share my experiences and thoughts here.&lt;br /&gt;&lt;br /&gt;Stay tuned.&lt;br /&gt;&lt;br /&gt;Guy&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2002573816058150704-3820141121777674103?l=blog.sayar.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GuysThoughts/~3/NJbY_NZodQw/my-blog.html</link><author>noreply@blogger.com (Guy Sayar)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.sayar.com/2007/11/my-blog.html</feedburner:origLink></item></channel></rss>
