MC+A Stream

Our Blog and News Stream

MC+A 5 years old, a time for reflection

June 24th, 2009 | Michael

It’s been 5 years since the current MC+A organization was formed (When we relocated from San Francisco to Chicago, we reorganized).  In that time many changes have begun to surface.  We’ve seen the explosion of Microsoft SharePoint into the once Java dominated portal market.  We’ve seen the Google Search Appliance become the defacto intranet search tool and we are now seeing the extension of portals into commercial SaaS platforms (i.e. mash-up and web 2.0).

The first two years are suppose to be the most difficult.  As many companies across the world can attest to, these last two have been the most difficult for us.  At a certain point only sheer will and determination cause positive outcomes.  I definitely want to thank all of those who are involved in MC+A, my family and my wife for their support and dedication.  We’ve taken a concept that I planned on the beach of Brazil and grown it into a multimillion dollar business with outreach globally.

To our clients and community, I definitely want to thank you for working with us.  In the coming months we’ll be releasing new services and open source code that will help you connect to your information assets.  As always, we see the utilization of these  as being the single most important asset your company retains.

MC+A – Chicago will be celebrating this Friday down at the taste of Chicago.  Email me if you want to meet up at my flat and join us.

Remotely Calling The Google Search Appliance RESTful Web Services When SAML is enabled

June 23rd, 2009 | Michael

Calling the Google Search Appliance when a SAML interface or Forms Authentication security interface is enabled causes a bit of a challenge  from  SharePoint or ASP.NET.  The following is some code that we developed to handle all of the hand shaking from the redirects and cookie exchange.  This will be published shortly as a open source project.

public  string SecureSearch(string term)
        {
            try
            {
                StringBuilder defaultquery = new StringBuilder();
                defaultquery.Append(ConfigurationManager.AppSettings["GSADEVICEURL"]);
                defaultquery.Append("/search?q=" + term);
                defaultquery.Append("&client=" + ConfigurationManager.AppSettings["GSAFRONTEND"]);
                defaultquery.Append("&output=xml_no_dtd");
                defaultquery.Append("&site=" + ConfigurationManager.AppSettings["GSACOLLECTION"]);
                defaultquery.Append("&access=a");
                defaultquery.Append("&entqr=3&ud=1&oe=UTF-8&ie=UTF-8");
                defaultquery.Append("&filter=" + ConfigurationManager.AppSettings["GSASEARCHFILTER"]);
                defaultquery.Append("&num=" + ConfigurationManager.AppSettings["RESULTSPERPAGE"]);
               
                Regex cookieCheck = new Regex("googlecookiecheck", RegexOptions.IgnoreCase);

                log.Info("Step 1 Call GSA for secure query");
                string loginurl = callGSA(defaultquery.ToString(), false);

                //if the return url has the cookie check added, send the url back to the gsa
                //the cookie check cookie will be attached
                if (cookieCheck.Match(loginurl).Success)
                {
                    //send the url returned with cookiecheck back to GSA
                    log.Info("Step 2 Call GSA for secure doc, respond to cookiecheck request");
                    loginurl = callGSA(ConfigurationManager.AppSettings["GSADEVICEURL"] + loginurl, false);
                    if (!gsaResultsReturned)
                    {
                        log.Info("Step 3 Call GSA for secure only with redirect from cookiecheck request");
                        loginurl = callGSA(ConfigurationManager.AppSettings["GSADEVICEURL"] + loginurl, false);
                    }
                }

                if (!gsaResultsReturned)
                {
                    log.Info("Step 4 Call GSA to get result set");
                    loginurl = callGSA(loginurl, true);
                }
                log.Info("Step 5 COMPLETE");
               
               
            }
            catch (Exception ex)
            {
                log.Error("btnSearch_Click", ex);
            }

            return results.OuterXml.ToString();
        }

        private string callGSA(string url, bool allowredirect )
        {
            gsaResultsReturned = false;

            string returnURL = string.Empty;
            try
            {
                log.Error("callGSA() url ->" + url);
                HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create(url);
                HttpWReq.KeepAlive = true;
                HttpWReq.Accept = "*/*";
                HttpWReq.Headers.Add("Accept-Language", "en-us");
                HttpWReq.Headers.Add("Accept-Encoding", "gzip, deflate");
                HttpWReq.AllowAutoRedirect = allowredirect;
                HttpWReq.CookieContainer = cookieC;
                HttpWReq.Credentials = System.Net.CredentialCache.DefaultCredentials;
                HttpWReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)";
                if (allowredirect)
                {
                    HttpWReq.MaximumAutomaticRedirections = 10;
                }

                CookieCollection mycookies = HttpWReq.CookieContainer.GetCookies(new Uri(ConfigurationManager.AppSettings["GSACOOKIEURL"]));
               

                HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();
                log.Info("......callGSA response http status = " + HttpWResp.StatusCode);
                //get header collection 
                WebHeaderCollection col = HttpWResp.Headers;
                if (HttpWResp.StatusCode.Equals(HttpStatusCode.Found))
                {
                    //get location and make request
                    string[] redirectURL = col.GetValues("Location");
                    returnURL = redirectURL[0];
                    log.Debug("......callGSA() found redirect URL from GSA to->" + redirectURL[0]);
                }
                //logHeader(col);
                CookieCollection csk = new CookieCollection();

                csk = HttpWResp.Cookies;
                for (int i = 0; i < csk.Count; i++)
                {
                    log.Debug("............. callGSA response cookies " + csk[i].Name + " value " + csk[i].Value);
                    log.Debug("............. callGSA response cook domain " + csk[i].Domain);
                    log.Debug("............. callGSA response cook Path " + csk[i].Path);
                    log.Debug("............. callGSA response cook expires " + csk[i].Expires.ToLongTimeString());
                    log.Debug("............. callGSA response cook secure " + csk[i].Secure.ToString());

                    String[] values = col.GetValues("Set-Cookie");
                    if (null != values && values.Length > 0)
                    {
                        for (int j = 0; j < values.Length; j++)
                        {
                            Uri cookuri = new UriBuilder("http", csk[i].Domain, 80).Uri;
                            log.Info("......callGSA moving cookie " + cookuri.ToString() + " " + values[j]);
                            cookieC.SetCookies(cookuri, values[j]);
                        }
                    }
                }

                //this is the final step, we have a result set from the GSA
                if (HttpWResp.StatusCode.Equals(HttpStatusCode.OK) ||
                    (returnURL.Equals(string.Empty)))
                {
                    gsaResultsReturned = true;
                    Stream receiveStream = HttpWResp.GetResponseStream();
                    Encoding UTF8_Encoding = System.Text.Encoding.GetEncoding("utf-8");
                    StreamReader readStream = new StreamReader(receiveStream, UTF8_Encoding);
                    //get the response and display
                    results.LoadXml(readStream.ReadToEnd());
                   
                }
            }
            catch (Exception ex)
            {
                log.Error("CallGSA ", ex);
            }

            return returnURL;
        }

Michael Cizmar interview by IT Knowledge Exchange

June 12th, 2009 | John

In a recent article on IT Knowledge Exchange, The impending cloud MC+A’s president, Michael Cizmar discussed the position of VAR’s and cloud solutions.

Excerpt:

Cizmar thinks that value-added partners — those who integrate disparate services and applications, those who build applications, and those who support customers — will be more valuable than ever in a cloudy future. And that will be true whether the infrastructure provider of choice is Salesforce.com, Amazon.com, Microsoft, NetSuite, add-your-own-favorite-company here.

“Solution providers provide [domain] and technology implementation expertise. That will still be needed. Look at Salesforce.com or NetSuite. We are a tech company and we have a partner that implements our NetSuite solution,” he notes.

Google Geo Api 3.0 released to Labs

May 28th, 2009 | Michael

Yesterday on the Google Geo Developers blog, Google announced the availability of a new api for Google Geo mashups.  From the blog post, the major improvements are:

  • Chrome and iPhone Safari mobile added to our supported browsers. Your mashups will also work on Android-based phones with the recent update, but you may notice some issues, like the “View/Save Image” dialog showing unexpectedly. We’re working with the Android team to fix this and improve the end user’s experience in interacting with the map. We could’ve waited until it’s perfect, but we really wanted to get an early release in your hands and start getting feedback while we fix up a few remaining issues.
  • No keys required. You can now copy ‘n paste code easily or embed in RSS readers, for example, without getting key errors.
  • MVC-based architecture. This allowed us to significantly reduce the size of our initial JavaScript download. We found it to be simple and powerful.
  • Default UI is enabled automatically. We’ll provide default UI controls and behavior (and we’ll update them) so your mashup can keep up with the latest and greatest changes we make to Google Maps. Of course, if you’ve got customized controls you’re happy with, you can disable the default UI updates.
  • Namespaces. Everything is always in the google.maps.* namespace and there is no “G” prefixed variables in the global scope.
  • Geocoding API has been overhauled based on the feedback we’ve received with the existing implementation over the past three years

We’ll be incorporating this new API into our physican finder as soon as the API is a little more baked.

Google Apps to get scripting

May 27th, 2009 | Michael

 Today Google posted on their enterprise blog an announcement  about a long awaited feature for scripting Google Apps.   You’ll have to sign up to be part of the beta before it’s released widely.

Here is a video describing the new feature:

Wonder wheel – The New Vanity Search

May 27th, 2009 | Michael

Something pretty cool to check out:

http://www.google.com/search?hl=en&rls=com.microsoft%3Aen-us&tbo=1&tbs=ww%3A1&q=michael+cizmar&tbo=1

Looks like it’s been out for a few months.  You get your terms in the middle and then the related topic outward.  Neat!

Jira Excludes For Google Search Appliance Crawler

May 23rd, 2009 | Michael

Rather than learning by Trial and Error, here are some excludes that you will want to add to your Google Search Appliance configuration if you are trying to crawl Jira Studio:

#workday/jira excludes

contains:delete

contains:Delete

contains:create

contains:Create

contains:edit

contains:Edit

contains:configureReport!

contains:reset

contains:lazyloader

contains:ViewUserIssueColumns!

contains:SaveAsFilter!

contains:ProjectRepositoryPermissions!Anon

contains:AddComment

contains:AddPortlet

contains:AttachFile

contains:ConfigurePortalPages

http://mcplusa.jira.com/secure/admin/

(replace mcplusa.jira.com with your site to not crawl the administrative pages)

Gartner says you can save $250,000 by Federating Your Search Technology…

May 6th, 2009 | Michael

Gartner has released a report detailing how you can save $250,000 by selecting tactical measures in your federation strategy.

Our suggestion would be to to look at the Google Search Appliance or try our Search Best Practices health check.

Troubleshooting Your Google Sharepoint Sitemap Continued

May 5th, 2009 | Angelo

Continuing from our previous troubleshooting post.

Step 2: Check the appliance’s configuration

If the links are functioning properly in your Google Sitemap, but there is still no SharePoint content being crawled, then you should check to which URLs are being crawled.

Often time’s people make the mistake of entering the URL of their SharePoint site and not the URL of their GSS. Ensure that this is not the case by opening the administrative console of your appliance and going to Crawl and Index > Crawl URLs. You should find the URL of your GSS in the top two fields. If it is not there enter it.

1

Now, select Freshness Tuning from the options on the left. Enter the URL of your GSS and then select Recrawl These URL Patterns. Allow 20-25 minutes for the changes to take effect.

21

Then, go to Status and Reports > Crawl Diagnostics and check to see if your GSS’s URL is listed. If you see the sitemap’s URL listed proceed to the next step. Otherwise contact MC+A support.

3

Now, run a search for content that would be found in your SharePoint site. If the appropriate search results are not returned contact MC+A support for further assistance.

4

CIO Synergy Chicago Wrap Up

May 4th, 2009 | Michael

Thanks to all who attended the Chicago CIO Synergy Event.  It was great to see so many people brave venture out during the Bulls play off season and the recent health scares. 

The discussion was very invigorating.  It was good to see our friend Michael Lock, from Google Enterprise, as well as the other panel speakers: Willian Farrow, Surinder Kumar and Hardik Bhatt give there insights on how companies can innovate.

Stay tooned!  We will be following up with a series of executive topics in the coming months.  If you have any thoughts you would like to share, drop us a line via the contact us form on website.

Subscription

Stream Contributors

Tagged Content

Stream Archives

Stream Topics

Add to Technorati Favorites
Follow MC+A on Twitter