<?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-2720443514548354607</id><updated>2012-02-15T22:10:32.997-08:00</updated><category term='Talend'/><category term='regression testing type1 dimension slowly changing dimension'/><category term='nosql solr'/><category term='javascript'/><category term='solr caching cache details performance improve queryrequesthandler autowarm firstsearcher avgTimePerRequest solr wget'/><category term='Talend Solr ETL SolrJ real-time'/><category term='object'/><category term='tweet twitter talend download warehouse'/><category term='wget twitter'/><category term='Twiiter'/><category term='html decode encode string ssis vb cleanse'/><category term='sql server table level permission securable granular object'/><category term='date'/><category term='sample data generation easy siimple name addresses data'/><category term='copy static dimension data dev test prod'/><category term='jquery'/><category term='google geocode geocoder address latlon talend'/><category term='NaN'/><category term='INFORMATION_SCHEMA information schema sql server objects data type'/><category term='web 2.0'/><category term='toString'/><category term='Zenoss sql server mssql alert monitoring'/><category term='solr jetty windows service'/><category term='create table as SQL Server'/><category term='General Tech'/><category term='Invalid Date'/><category term='Solr'/><title type='text'>Data Catalyst</title><subtitle type='html'>Yash Ranadive's Blog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>51</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-7701140723699181416</id><published>2011-12-05T23:07:00.000-08:00</published><updated>2012-02-15T22:10:33.086-08:00</updated><title type='text'>Machine Learning Stanford Class</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Few months back my friend Vasanth asked me if I'd like to enroll in the machine learning class offered by Stanford university (http://www.ml-class.org/). I'm in my 9th week in to it now and it's been great experience so far. I was always interested in machine learning and never had a chance to take a course in Data Mining.&lt;br /&gt;&lt;br /&gt;This course explains the core concepts of machine learning. Andrew Ng, the instructor, is absolutely phenomenal. I was impressed witth his teaching style and how effective it was.&lt;br /&gt;&lt;br /&gt;Some of the topics we covered in the class are&lt;br /&gt;1. Linear Regression&lt;br /&gt;2. Logistic Regression&lt;br /&gt;3. Regularization&lt;br /&gt;4. Neural Networks&lt;br /&gt;5. Support Vector Machines&lt;br /&gt;6. Clustering&lt;br /&gt;7. Dimensionality Reductions&lt;br /&gt;8. Anomaly Detection&lt;br /&gt;&lt;br /&gt;The exercises took 6-8 hours each week. Most of the exercises are in Octave and the code is heavily commented to help understand the core concepts. Overall it was an amazing class and a great introduction to machine learning.&lt;br /&gt;&lt;br /&gt;So I was keen to know how often statisticians and machine learners use these core algorithms and tweak them up to manipulating stuff at the matrix level. I spoke to a friend who was working at an internet startup doing R for customer/market segmentation and he said he never went down to the matrix level. Seems like R is pretty sophisticated in abstracting the stuff under the hood. Maybe one day I'll get to try it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-7701140723699181416?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/7701140723699181416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/12/machine-learning-stanford-class.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7701140723699181416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7701140723699181416'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/12/machine-learning-stanford-class.html' title='Machine Learning Stanford Class'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-5432554375901474280</id><published>2011-10-06T22:22:00.000-07:00</published><updated>2011-10-06T22:22:00.953-07:00</updated><title type='text'>Been a while</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;It's been a while. A long time. Four months to be precise. I haven't written a single blog entry! As some of you may already know that I moved to San Francisco. I took an offer from &lt;a href="http://www.demandbase.com/"&gt;Demandbase&lt;/a&gt;, a B2B marketing company. I'm working as a Data Engineer. I'm getting my hands dirty with linux (shell scripting is always fun!) and Ruby.&lt;br /&gt;&lt;br /&gt;I've been using Ruby for little over a week now and it is fantabulous! Very easy to learn and the code is concise and up to the point. Look out for more posts on Ruby and data handling using Ruby.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-5432554375901474280?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/5432554375901474280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/10/been-while.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/5432554375901474280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/5432554375901474280'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/10/been-while.html' title='Been a while'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-8915067136722879695</id><published>2011-06-08T22:11:00.001-07:00</published><updated>2011-06-08T22:11:33.800-07:00</updated><title type='text'>Integrating Unstructured Data in a Data Warehouse</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span class="Apple-style-span" style="font-family: Calibri, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 11pt; line-height: 115%;"&gt;I've been meaning to write about this topic for a while. Here's a&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;succinct&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 11pt; line-height: 115%;"&gt;&amp;nbsp;excerpt of my thoughts.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Calibri, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 11pt; line-height: 115%;"&gt;Traditional data warehouses are generally relational and fed by back-end systems which contain structured data. Most often than not this data is generated by internal source systems or arrives as external data from partners. But what about the web? There's tons of data out there. Possibly about your company, competitor or a business trend about your industry..and the list goes on. As we share more data on the web, this list is&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;expanding&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 11pt; line-height: 115%;"&gt;&amp;nbsp;every day. The traditional warehouse is not designed to handle such unstructured data thereby limiting the locus of control of your decision support system.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"&gt;Search engines are good at handling both structured and unstructured information in various formats (e.g. database tables, XML, PDF, DOC, etc.). Case&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px; line-height: 17px;"&gt;&amp;nbsp;in point -&amp;nbsp;We helped a client index almost 75GB of unstructured data stored in .pdf, .doc, text files going as far back as 70 years. The ancient files were scanned pdfs which were later OCRed. &amp;nbsp;This is massively helpful not just from a pure enterprise search standpoint but in the terms of opening up the data to other parts of the organization in an easily accessible fashion. So how does this tie to a warehouse? Well, the search index in itself is a warehouse.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px; line-height: 17px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Calibri, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;So how to access it? - With your existing BI systems. If your tweak your BI tool, you can make REST based HTTP calls to a web server. In goes your query and within a second out comes your data. Search engines are inherently fast! You can use this data for discovering relationships you never thought existed. Obviously &amp;nbsp;this works better with certain types of data than other. I foresee a large interest in this area in the future as &amp;nbsp;enterprises explore more potentially&amp;nbsp;crawl-able&amp;nbsp;publicly available data sources.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px; line-height: 17px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px; line-height: 17px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Calibri, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;&lt;br /&gt;&lt;/span&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/2720443514548354607-8915067136722879695?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/8915067136722879695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/06/integrating-unstructured-data-in-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8915067136722879695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8915067136722879695'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/06/integrating-unstructured-data-in-data.html' title='Integrating Unstructured Data in a Data Warehouse'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-8903254151231712307</id><published>2011-05-24T20:51:00.000-07:00</published><updated>2011-06-03T22:17:03.427-07:00</updated><title type='text'>Using Audit Logs for Data Integration</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Recently we integrated two applicatons with Solr in near real-time: Siebel and Documentum. We achieved this by monitoring the Audit Logs of the applications. Audit logs work great for data integration where you have to push a change in a business object to another system. Audit logs for mature applications like Siebel and Documentum can be configured to write update/delete events. Usually, this is done by reading from the audit log table (without locking to prevent performance issues) to sniff out interesting events/changes to business objects.&lt;br /&gt;&lt;br /&gt;Risks&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;The auditing mechanism must be bug-free and consistently record events - which is mostly the case with mature COTS software systems.&lt;/li&gt;&lt;li&gt;The audit log is generated by the application. So every-time you need to test your integration solution, you have to make changes in the application to see if they come through. Sometimes, developers don't have access to front-end apps which may cause problems.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Also, thorough testing is required from the application front-end perspective. Care must be taken to capture all event log signatures a particular business action in the application &amp;nbsp;can generate.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-8903254151231712307?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/8903254151231712307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/05/using-audit-logs-for-data-integration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8903254151231712307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8903254151231712307'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/05/using-audit-logs-for-data-integration.html' title='Using Audit Logs for Data Integration'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-2010928062011986556</id><published>2011-05-24T20:43:00.000-07:00</published><updated>2011-05-24T20:43:29.038-07:00</updated><title type='text'>Solr Java Service Wrapper restarts after commit</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;We noticed our Solr instance was restarting every few days after optimizing. We use the Java Service Wrapper from Tanuki Software to run our instance as a service. The wrapper has a property for &lt;a href="http://wrapper.tanukisoftware.com/doc/english/prop-ping-timeout.html"&gt;Ping Timeout&lt;/a&gt;. Basically, the wrapper pings the JVM to see if it is still alive every 30 seconds (default). If it does not get a response from the JVM, the wrapper restarts itself.&lt;br /&gt;&lt;br /&gt;Solr optimization is a resource intensive process. I've noticed it used 100% of the CPU for over a minute. This caused the JVM to restart. To go around this issue, I increased the wrapper ping timeout to 120 seconds. This is a quick fix but will not work when the index gets large enough to the point that it takes more than a couple of minutes to optimize. But in that case you are better off looking at some other strategies to speed optimization altogether. &amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-2010928062011986556?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/2010928062011986556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/05/solr-java-service-wrapper-restarts.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2010928062011986556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2010928062011986556'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/05/solr-java-service-wrapper-restarts.html' title='Solr Java Service Wrapper restarts after commit'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-8003716394491378130</id><published>2011-05-24T20:36:00.000-07:00</published><updated>2011-05-24T20:36:42.789-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Talend'/><category scheme='http://www.blogger.com/atom/ns#' term='Twiiter'/><title type='text'>Link Extraction From Tweets using Java Function</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;One of the common problems in analyzing tweets is extracting the links / URLs out of tweets. You can do all sorts of analytics on the links such as determine most popular links for a given day, etc. This can be done with Regex (see RegexParser below) but most of the links shared on Twitter are URL-shortened using services like bit.ly, fb.me, etc. To get a better understanding of the links shared in the tweet, you need to resolve the links and get the actual link they are pointing to. In short, reverse shorten or expand it! The following code gives two functions that allows you to extract and resolve the URL to its final destination URL in JAVA.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: black; font-family: Tahoma; font-size: x-small;"&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color: black; font-family: Tahoma; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;b&gt;package&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; routines;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Tahoma; font-size: x-small;"&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Tahoma; font-size: x-small;"&gt;&lt;div align="left" style="color: black;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;  &lt;u&gt;java.sql.Date&lt;/u&gt;;&lt;/span&gt;&lt;b style="color: black;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: black;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;  java.text.ParseException;&lt;/span&gt;&lt;b style="color: black;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: black;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;  java.util.regex.*;&lt;/span&gt;&lt;b style="color: black;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style="color: black;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div align="left" style="color: black;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; java.net.*;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: x-small;"&gt; Parsers{&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;static&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: x-small;"&gt; String  RegexParser(String stringToParse, String regexPattern) {&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;span style="color: #3f7f5f; font-size: x-small;"&gt;&lt;span style="color: #3f7f5f; font-size: x-small;"&gt;//  Create a pattern to match url&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size: x-small;"&gt;Pattern p = Pattern.&lt;i&gt;compile&lt;/i&gt;(&lt;/span&gt;&lt;span style="color: #2a00ff; font-size: x-small;"&gt;&lt;span style="color: #2a00ff; font-size: x-small;"&gt;"((https?://)?([-\\w]+\\.[-\\w\\.]+)+\\w(:\\d+)?((/)?([-\\w/_\\.]*(\\?\\S+)?)?)*)"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="font-size: x-small;"&gt;Matcher m = p.matcher(stringToParse);&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;if&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: x-small;"&gt; (m.find())&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: x-small;"&gt; m.group(1);&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;&lt;span style="color: #7f0055; font-size: x-small;"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;span style="color: #2a00ff; font-size: x-small;"&gt;&lt;span style="color: #2a00ff; font-size: x-small;"&gt;""&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span class="Apple-style-span" style="color: #3f5fbf; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-family: 'Courier New';"&gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-family: 'Courier New';"&gt;static&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt; String ExpandURL(String urlString) {&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; String resolvedURL = urlString;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-family: 'Courier New';"&gt;try&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt; {&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #3f7f5f; font-family: 'Courier New';"&gt;//Open connection and retry till no longer redirected&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpURLConnection connection = (HttpURLConnection) &lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-family: 'Courier New';"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt; URL(urlString).openConnection();&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.setInstanceFollowRedirects(&lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-family: 'Courier New';"&gt;false&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;);&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.setRequestProperty(&lt;/span&gt;&lt;span style="color: #2a00ff; font-family: 'Courier New';"&gt;"User-Agent"&lt;/span&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;, &lt;/span&gt;&lt;span style="color: #2a00ff; font-family: 'Courier New';"&gt;"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16"&lt;/span&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;);&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-family: 'Courier New';"&gt;while &lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;(connection.getResponseCode() / 100 == 3) {&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&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;resolvedURL = connection.getHeaderField(&lt;/span&gt;&lt;span style="color: #2a00ff; font-family: 'Courier New';"&gt;"location"&lt;/span&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;);&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&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;connection = (HttpURLConnection) &lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-family: 'Courier New';"&gt;new &lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;URL(resolvedURL).openConnection();&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; } &lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-family: 'Courier New';"&gt;catch&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt; (Exception e) {&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="color: #7f0055; font-family: 'Courier New';"&gt;return&lt;/span&gt;&lt;/b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt; resolvedURL;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #7f0055; font-size: xx-small;"&gt;&lt;b&gt;&lt;span style="color: black; font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-8003716394491378130?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/8003716394491378130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/05/link-extraction-from-tweets-using-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8003716394491378130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8003716394491378130'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/05/link-extraction-from-tweets-using-java.html' title='Link Extraction From Tweets using Java Function'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-3602063581852530113</id><published>2011-04-20T16:23:00.000-07:00</published><updated>2011-04-20T16:23:43.337-07:00</updated><title type='text'>SolrMeter - Benchmarking and Monitoring for Solr</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Recently we started using &lt;a href="http://code.google.com/p/solrmeter/"&gt;SolrMeter&lt;/a&gt; for simulating production queries on our test Solr servers. We quickly found out that the tool can be used for more than just simulating queries. It gives very interesting view of your Solr health including graphs of caches, query performance, etc. In order to feed it a good set, you need to cleanse your production Solr request logs to get the select statements only. SolrMeter expects the queries in a certain format. More precisely if your query were&lt;br /&gt;&lt;pre&gt;http://localhost:8080/solr/select?q=type:document AND name:SomeName&lt;/pre&gt;SolrMeter expects&amp;nbsp;type:document AND name:SomeName in the text file.&lt;br /&gt;&lt;br /&gt;To grab and cleanse the production logs, I built a simple utility in .NET that did some regex to extract the required text from the log file. It is usually the text between the ? and &amp;amp;? in the Solr request log. I then fed this newly generated cleansed log file to SolrMeter, set the location of the solr instance, set the query throughput rate (in minutes) and voila! You have a stress test tool ready!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-3602063581852530113?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/3602063581852530113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/04/solrmeter-benchmarking-and-monitoring.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/3602063581852530113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/3602063581852530113'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/04/solrmeter-benchmarking-and-monitoring.html' title='SolrMeter - Benchmarking and Monitoring for Solr'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-4879685974596838401</id><published>2011-04-19T05:44:00.000-07:00</published><updated>2011-04-19T05:44:41.945-07:00</updated><title type='text'>Problems with Solr 1.4.1 Highlighting Query - Running Slow</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I noticed that queries were running really slow on our 1.4.1 Solr instance which we use as Drupal backend for search. Some queries would take as high as 20 seconds!&lt;br /&gt;&lt;br /&gt;So I started taking off parameters from the slow queries one by one until I saw a noticeable difference in query time. I noticed removing the hit highlighting was doing the trick. After a lot of digging around on the internet I found this article:&amp;nbsp;&lt;a href="http://www.mail-archive.com/solr-user@lucene.apache.org/msg28731.html"&gt;http://www.mail-archive.com/solr-user@lucene.apache.org/msg28731.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The problem is the algorithm 1.4 uses for hit highlighting. It is particularly exacerbated when the field you're trying to hit highlight on has large amounts of data. You can work around this issue by creating a copy of the field and restrict the number of characters to 20,000 so that you get a 40K odd field over which Solr will hit highlight. The performance of this new trimmed field for the purposes of the algorithm will be fine. As soon as I made the change by adding a highlight specific field the query performance improved from 20 something seconds to less than a second!&lt;br /&gt;&lt;br /&gt;This doesn't seem to be a problem in 4.x Solr. We have a 4.x in production and it seems to be working fine even for large fields.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-4879685974596838401?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/4879685974596838401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/04/problems-with-solr-141-highlighting.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/4879685974596838401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/4879685974596838401'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/04/problems-with-solr-141-highlighting.html' title='Problems with Solr 1.4.1 Highlighting Query - Running Slow'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-2526864046128050807</id><published>2011-04-04T15:20:00.000-07:00</published><updated>2011-04-04T15:20:16.784-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wget twitter'/><title type='text'>wget for Windows and how to append the response to a file</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;wget&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;I've been meaning to write about wget -The awesome and easy to use webpage getter. Essentially wget goes to a URL and downloads the web response to a local file. This is really useful when you're trying to:&lt;br /&gt;1. Kick off a periodic process that access a web-based application through a URL which then triggers an event in the application.&lt;br /&gt;2. Download stuff off the internet like files, etc.&lt;br /&gt;3. All kinds of stuff that has a web-based API...for e.g tweets!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Usage&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The following downloads the response to a file on your local drive.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;wget http://search.twitter.com/search.json?q=kremlin&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Download&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;You can download wget from &lt;a href="http://gnuwin32.sourceforge.net/packages/wget.htm"&gt;here&lt;/a&gt;.&lt;br /&gt;You can download the manual from &lt;a href="http://www.blogger.com/.http://www.gnu.org/software/wget/manual/wget.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Store Response to Log&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;If your restful web-service returns statuses of commands, try using this in your batch file&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;echo START &amp;gt;&amp;gt; log.txt&lt;br /&gt;echo. &amp;gt;&amp;gt; log.txt&lt;br /&gt;D:\utils\wget\wget --user=blah --password="blah" --no-check-certificate https://someURLyouwanttohit &amp;nbsp;-O - &amp;gt;&amp;gt; log.txt&lt;br /&gt;echo. &amp;gt;&amp;gt; log.txt&lt;br /&gt;echo END &amp;gt;&amp;gt; log.txt&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This will append the response to a log file&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-2526864046128050807?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/2526864046128050807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/04/wget-for-windows-and-how-to-append.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2526864046128050807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2526864046128050807'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/04/wget-for-windows-and-how-to-append.html' title='wget for Windows and how to append the response to a file'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-7043359925305755023</id><published>2011-03-30T21:22:00.000-07:00</published><updated>2011-03-30T21:23:09.499-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><title type='text'>Disable / Enable HTTP Caching Solr</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Sometimes it is better to disable the HTTP caching on Solr, especially when you are updating the index frequently and want to see the changes to the index instantly. To disable HTTP caching find the following lines in SolrConfig.xml&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- &amp;lt;httpCaching never304="true"&amp;gt; --&amp;gt;&lt;br /&gt;&amp;lt;httpCaching lastModifiedFrom="openTime" etagSeed="Solr"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now&amp;nbsp;uncomment the first line "Caching never304...."&amp;nbsp;and comment the next "Caching lastModifiedFrom=...."&lt;br /&gt;Then restart Solr.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-7043359925305755023?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/7043359925305755023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/03/disable-enable-http-caching-solr.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7043359925305755023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7043359925305755023'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/03/disable-enable-http-caching-solr.html' title='Disable / Enable HTTP Caching Solr'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-6873209497992273515</id><published>2011-03-30T20:47:00.000-07:00</published><updated>2011-03-30T21:23:21.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><title type='text'>Index Size vs Disk Space for Solr Optimize</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;You require at least twice as much disk space as the size of the index. This is because of the way Solr optimizes the index. During optimization, Solr creates a copy of the index and when ready replaces the current copy with the new one. An optimize call takes longer than a Commit call. Optimize is cpu/disk/time intensive and must be done infrequently - maybe once a day. Because of the resource intensive nature, optimze must be run during the time of the day when the query volume is low.&lt;br /&gt;&lt;br /&gt;This is apparent when you run large loads using dataimporthandler. Monitor the size of the data\index directory in your solr installation to see the size changes. You can add a querystring argument of optimize=false with your dataimporthandler call to run unoptimized commits when the dataimport finishes.&lt;br /&gt;&lt;br /&gt;For more info on optional attributes of commit and optimize visit :&amp;nbsp;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; color: #333333; font-family: 'trebuchet ms', verdana, arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;http://wiki.apache.org/solr/UpdateXmlMessages#A.22commit.22_and_.22optimize.22&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/2720443514548354607-6873209497992273515?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/6873209497992273515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/03/index-size-vs-disk-space-for-solr.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6873209497992273515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6873209497992273515'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/03/index-size-vs-disk-space-for-solr.html' title='Index Size vs Disk Space for Solr Optimize'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-1072636859304996721</id><published>2011-03-02T20:38:00.000-08:00</published><updated>2011-05-23T19:54:51.860-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nosql solr'/><title type='text'>Translating Many to Many relationship in a relational database to schema-less structure like Solr</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;In a relational schema many to many relationships are generally implemented using intersection tables. Lets say you have two entities Cases and Actions that have many to many relationship. Relationally, you'd create a Case_Action table that stores action_id and case_id. Now, what if you have to represent this relationship in a schema-less data-store like Solr? To start, you'd try to index so that you can get a document of type Case which stores the list of Case fields. This will be your base entity.&lt;br /&gt;&lt;br /&gt;(NOTE: In Solr the term document is equivalent to a database row)&lt;br /&gt;Well, there are several ways of doing this:&lt;br /&gt;1. OPTION A: Create a multivalued field called action_id_list that lists all actions for a particular case. Populate this field for every document of type Case.&lt;br /&gt;2. OPTION B: Create a multivalued field called case_id_list that lists all cases for a particular action. Populate this field for every document of type Action.&lt;br /&gt;3. OPTION C: Don't create a multivalued field, instead, create multiple action documents for each case that the action is related to. This means your id will be a composite string of action_id and case_id&lt;br /&gt;&lt;br /&gt;The option you choose depends on how you want to access the entities in a flattened structure. Option A and Option B are cleaner and easier to implement than C. But they have a limitation.&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Option B should be used only when an action document is expected to store only the case_id and no other case related field. Otherwise, an extra query needs to fetch the required fields from a case document.&lt;/li&gt;&lt;li&gt;Similarly, Option A should be used if no other action field needs to be queried when you query a case document except for the field action_id.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Option C is like a intersection table where it gives you the flexibility to pick whichever fields of the case and action entity. The only drawback is that it makes the id field a little more complicated and perhaps difficult to use in your query.&lt;/li&gt;&lt;/ul&gt;If you find this article confusing, let me know. If enough people are interested, I can illustrate it with a diagram.&lt;br /&gt;&lt;br /&gt;UPDATE: Here are the diagrams as promised. Again,&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;1. OPTION A: Create a multivalued field called action_id_list that lists all actions for a particular case. Populate this field for every document of type Case.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;2. OPTION B: Create a multivalued field called case_id_list that lists all cases for a particular action. Populate this field for every document of type Action.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;3. OPTION C: Don't create a multivalued field, instead, create multiple action documents for each case that the action is related to. This means your id will be a composite string of action_id and case_id&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-HkTFQSRHt5Y/TdscGlSB2pI/AAAAAAAADWY/jzCZzHjC5aI/s1600/RelationalSchema.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="137" src="http://4.bp.blogspot.com/-HkTFQSRHt5Y/TdscGlSB2pI/AAAAAAAADWY/jzCZzHjC5aI/s320/RelationalSchema.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-5UIJhrUKW2Q/TdscTz4bZZI/AAAAAAAADWg/Nw4Ibu1MZBU/s1600/SolrSchema.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="167" src="http://3.bp.blogspot.com/-5UIJhrUKW2Q/TdscTz4bZZI/AAAAAAAADWg/Nw4Ibu1MZBU/s400/SolrSchema.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-1072636859304996721?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/1072636859304996721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/03/translating-many-to-many-relationship.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/1072636859304996721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/1072636859304996721'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/03/translating-many-to-many-relationship.html' title='Translating Many to Many relationship in a relational database to schema-less structure like Solr'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-HkTFQSRHt5Y/TdscGlSB2pI/AAAAAAAADWY/jzCZzHjC5aI/s72-c/RelationalSchema.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-1419405415930131110</id><published>2011-03-02T18:49:00.000-08:00</published><updated>2011-03-02T18:49:28.016-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><title type='text'>Setting Security in Solr running on Jetty using IP Filtering</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;We're are using Jetty as a container for Solr and we've been configuring it heavily first for setting it up as a service and later for adding security. We considered the following options for securing the Solr instance&lt;br /&gt;&lt;br /&gt;1. IP Filtering&lt;br /&gt;2. Basic Username/Password authentication&lt;br /&gt;&lt;br /&gt;We eventually went with IP filtering. IP filtering can be achieved by using the HTAccessHandler. To use the handler you need a .htaccess file which tells Jetty which IPs to allow or block. So your .htaccess file will look&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;Limit&amp;gt;&lt;br /&gt;satisfy all&lt;br /&gt;order deny, allow&lt;br /&gt;deny from all&lt;br /&gt;allow from xxx.xxx.xxx.xxx&lt;br /&gt;&amp;lt;/Limit&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Allowing from localhost or 127.0.0.1 doesn't work in Jetty 6 and I don't think Mortbay is supporting Jetty 6 anymore.&amp;nbsp;With out of the box Solr configuration, Jetty explodes the solr.war file in the webapps folder to load Solr. However, I unzipped the war file (which is essentially a zip file) in to folder named solr in the webapps folder.&lt;br /&gt;&lt;br /&gt;Next, you need to create a solr.xml file that tells Jetty to load a custom context.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;Configure id="solr" class="org.mortbay.jetty.webapp.WebAppContext"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Set name="resourceBase"&amp;gt;&amp;lt;SystemProperty name="jetty.home" default="."/&amp;gt;/webapps/solr&amp;lt;/Set&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Set name="contextPath"&amp;gt;/solr&amp;lt;/Set&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Call name="setSecurityHandler"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Arg&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;New class="org.mortbay.jetty.security.HTAccessHandler"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Set name="protegee"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Ref id="solr"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/Set&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/New&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/Arg&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/Call&amp;gt;&lt;br /&gt;&amp;lt;/Configure&amp;gt;&lt;br /&gt;&lt;/pre&gt;You can place this file in webapps/solr&lt;br /&gt;&lt;br /&gt;Now comment out the redundant deployer org.mortbay.jetty.deployer.WebAppDeployer in etc/jetty.xml. Now, start up solr using java -jar start.jar and you now have a secure Solr instance.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-1419405415930131110?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/1419405415930131110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/03/setting-security-in-solr-running-on.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/1419405415930131110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/1419405415930131110'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/03/setting-security-in-solr-running-on.html' title='Setting Security in Solr running on Jetty using IP Filtering'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-6069465351282518952</id><published>2011-02-27T19:15:00.000-08:00</published><updated>2011-02-27T19:15:06.848-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General Tech'/><title type='text'>Google Fusion Tables</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Apparently Google had developed a basic database and data visualization stack with Google Fusion Tables. Pretty interesting as it has the basic principles of a database and a business intelligence tool with collaborative data commits.&lt;br /&gt;&lt;br /&gt;http://tables.googlelabs.com/&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-6069465351282518952?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/6069465351282518952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/02/google-fusion-tables.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6069465351282518952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6069465351282518952'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/02/google-fusion-tables.html' title='Google Fusion Tables'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-358660923208601573</id><published>2011-02-27T10:53:00.000-08:00</published><updated>2011-02-27T10:53:06.977-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Talend Solr ETL SolrJ real-time'/><title type='text'>Using Talend to do ETL in to Solr</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;After great pain and spending many hours I was finally able to index something in Solr using Talend. Solr and Talend both awesome free tools, are not the easiest to integrate at first. Mainly because in order to user &lt;a href="http://wiki.apache.org/solr/Solrj"&gt;SolrJ&lt;/a&gt; ( which is the Java Library for Solr) you have to import several jars. Using those jars and doing intellisense on the methods in them can be a pain in Talend.&lt;br /&gt;&lt;br /&gt;First, you need to following jars from your solr instance and put them in the lib/java folder in Talend installation. In your job load these using tLibraryLoad component.&lt;br /&gt;&lt;br /&gt;&lt;div class="line874" style="font-family: sans-serif; font-size: 16px;"&gt;From /dist:&lt;span class="anchor" id="line-15"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-16"&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul style="font-family: sans-serif; font-size: 16px;"&gt;&lt;li&gt;apache-solr-solrj-*.jar&lt;span class="anchor" id="line-17"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-18"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="line874" style="font-family: sans-serif; font-size: 16px;"&gt;From /dist/solrj-lib&lt;span class="anchor" id="line-19"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-20"&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul style="font-family: sans-serif; font-size: 16px;"&gt;&lt;li&gt;commons-codec-1.3.jar&lt;span class="anchor" id="line-21"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;commons-httpclient-3.1.jar&lt;span class="anchor" id="line-22"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;commons-io-1.4.jar&lt;span class="anchor" id="line-23"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;jcl-over-slf4j-1.5.5.jar&lt;span class="anchor" id="line-24"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;slf4j-api-1.5.5.jar&lt;span class="anchor" id="line-25"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-26"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="line874" style="font-family: sans-serif; font-size: 16px;"&gt;From /lib&lt;span class="anchor" id="line-27"&gt;&lt;/span&gt;&lt;span class="anchor" id="line-28"&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul style="font-family: sans-serif; font-size: 16px;"&gt;&lt;li&gt;slf4j-jdk14-1.5.5.jar&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-zTINe8HMwls/TWqcDp-QThI/AAAAAAAADVY/VSElBAqfTA0/s1600/TalendSolr.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="138" src="https://lh5.googleusercontent.com/-zTINe8HMwls/TWqcDp-QThI/AAAAAAAADVY/VSElBAqfTA0/s320/TalendSolr.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Start Code of the tJavaFlex&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;// start part of your Java code&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; String url = "http://localhost:8983/solr";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; SolrServer server = new CommonsHttpSolrServer(url);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Main code&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;// here is the main part of the component,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;// a piece of code executed in the row&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;// loop&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SolrInputDocument doc1 = new SolrInputDocument();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;doc1.addField( "id", row1.CustID , 1.0f );&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;doc1.addField( "name", row1.FName, 1.0f ); &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;server.add(doc1);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;End code&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;server.commit();&lt;br /&gt;&lt;br /&gt;In the advanced settings type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import org.apache.solr.client.solrj.*;&lt;br /&gt;import org.apache.solr.common.*;&lt;br /&gt;import org.apache.solr.client.solrj.impl.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I got sample data for 350k customers from&amp;nbsp;&lt;a href="http://www.briandunning.com/sample-data/"&gt;http://www.briandunning.com/sample-data/&lt;/a&gt;&amp;nbsp;and was able to load it at the average rate of 300 recs/second in to Solr. The awesome thing about this is that you can update your solr index in real-time depending on how you plan to do ETL. The dataimporthandler is restrictive in the way that it indexes files of only certain types.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-358660923208601573?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/358660923208601573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/02/using-talend-to-do-etl-in-to-solr.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/358660923208601573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/358660923208601573'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/02/using-talend-to-do-etl-in-to-solr.html' title='Using Talend to do ETL in to Solr'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-zTINe8HMwls/TWqcDp-QThI/AAAAAAAADVY/VSElBAqfTA0/s72-c/TalendSolr.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-6315581741720735164</id><published>2011-02-15T15:26:00.000-08:00</published><updated>2011-02-16T05:59:07.378-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solr caching cache details performance improve queryrequesthandler autowarm firstsearcher avgTimePerRequest solr wget'/><title type='text'>Solr Caching Explained</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The magic is in the Stats&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;You can access the statistics on your solr instance by going to&amp;nbsp;&lt;a href="http://localhost:8983/solr/admin/stats.jsp"&gt;http://localhost:8983/solr/admin/stats.jsp&lt;/a&gt;. The admin console in solr has ton of useful info that can be used to increase performance.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Types of Performance Improvements&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;You can gain improvement on the&amp;nbsp;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;avgTimePerRequest on select queries - which is available on the stats page (You need to know what requesthandler you want to optimize, I look at&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: monospace;"&gt;standard&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;for out-of-the-box config&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;). You can improve performance in terms of time in which the recently committed transaction shows in the index by changing the autowarmcount (this is usually small anyway).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;1. avgTimePerRequest&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;To reduce avgTimePerRequest you need to increase your cache. But beware setting the cache too high can cause performance degradation. This is because solr has to do a lot of cleanup/etc when it starts new searchers (more on this later)The objective here is simple you need to reduce the number of &lt;b&gt;evictions &lt;/b&gt;and keep the &lt;b&gt;hit ratio&lt;/b&gt;&amp;nbsp;high. And you need to do this for every type of cache solr has.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;Solr 4.x has 4 caches out of the box:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;a.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: monospace;"&gt;queryResultCache &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;b.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: monospace;"&gt;fieldCache &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;c.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: monospace;"&gt;documentCache &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;d.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: monospace;"&gt;fieldValueCache &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;a href="http://wiki.apache.org/solr/SolrCaching"&gt;click here&lt;/a&gt; to learn more on solr cache. The query result cache is most lightweight i.e. having a high number does not eat too much RAM. documentCache is memory intensive depending on the number of fields you index per document.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;2. autowarmCount&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;The autowarmCount property for a cache can be set in solrconfig.xml. It is the number of cache entries that are handed over from a dying searcher to a new searcher. Every time you commit to the index, Solr starts a new searcher and copies over the cache from the previous searcher that handles request while the copying takes place. This is called autowarming. You can autowarm firstSearcher which is the searcher that gets started when Solr is started. I'd recommend setting a list of queries to pre-populate your firstSearcher cache so that you are warm enough when Solr starts. This can be done in solrconfig.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;The larger your autowarmCount, the larger will be the&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;warmupTime and hence a larger delay between a commit and the time the recently committed &amp;nbsp;change is available. If the index is getting committed very frequently i.e. every few seconds, it is better to keep the autowarmCount low. Otherwise the searchers will run on top of the other giving you a performance warning in the logs.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Final Words&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;To get the most optimum combination of cache settings try using different combinations and see how the QTime changes. I recommend doing load tests by hitting the index with random queries and monitoring the response time. A quick and dirty way to do it is:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;I created a simple batch file which uses&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Wget"&gt;wget&lt;/a&gt;&amp;nbsp;to query the solr instance for a list of random words. To generate the list of random wget statements I used a simple excel formula. I then compare the log files before and after changing my settings using Notepad ++ (to grep or search the lines that contain QTime) and WinMerge (To compare the results of grep)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;wget "http://1ocalhost/solr/select?q=&lt;i&gt;your random word&lt;/i&gt;&amp;amp;fl=id" -O -&amp;gt;&amp;gt; log.txt&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&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/2720443514548354607-6315581741720735164?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/6315581741720735164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/02/solr-caching-explained.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6315581741720735164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6315581741720735164'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/02/solr-caching-explained.html' title='Solr Caching Explained'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-4159624826193182578</id><published>2011-02-15T06:42:00.000-08:00</published><updated>2011-02-20T09:54:44.005-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql server table level permission securable granular object'/><title type='text'>How to create table level permissions is SQL Server</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Recently I had to create a SQL Server user which was going to be used by OBIEE to writeback to the reporting warehouse. Dangerous you may think. It is dangerous because you're under the risk of altering/deleting information from the warehouse forever - with no chances of recovery.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SQL Server is good in setting permissions with various granularity levels. I created a database role of writeback on the database (not server level) and gave it absolutely no&amp;nbsp;permissions&amp;nbsp;to start with. I then added a Securable (Right click -&amp;gt; Properties -&amp;gt; Securables) by clicking on Add and searching for the staging table in which writebacks'd be written to. Set the required permissions.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JgN8hYy5x1E/TVqQuFjJ1lI/AAAAAAAADUs/9Acdyvg28wE/s1600/writeback1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="269" src="http://1.bp.blogspot.com/-JgN8hYy5x1E/TVqQuFjJ1lI/AAAAAAAADUs/9Acdyvg28wE/s320/writeback1.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now create a database user say writeback_user and map it to the required database with the role of writeback.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FU6JYMRWavw/TVqQz0WYYPI/AAAAAAAADUw/bsjBTNBbF-c/s1600/writeback2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="273" src="http://1.bp.blogspot.com/-FU6JYMRWavw/TVqQz0WYYPI/AAAAAAAADUw/bsjBTNBbF-c/s320/writeback2.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;I'd recommend writebacks to be written to separate staging table and then consolidated later with the data warehouse tables. This way you can do checks on the data if you may before writing to the warehouse tables.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-4159624826193182578?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/4159624826193182578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/02/how-to-create-table-level-permissions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/4159624826193182578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/4159624826193182578'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/02/how-to-create-table-level-permissions.html' title='How to create table level permissions is SQL Server'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-JgN8hYy5x1E/TVqQuFjJ1lI/AAAAAAAADUs/9Acdyvg28wE/s72-c/writeback1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-2625959531988313160</id><published>2011-01-29T21:55:00.000-08:00</published><updated>2011-01-29T21:55:33.532-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tweet twitter talend download warehouse'/><title type='text'>Download tweets using Talend</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Modules in Talend (or components - as they are called in the Talend world) open a new opportunity to slice and dice the massively available web data. A lot of user content is generated everyday. What if you want to monitor this and scrape it.&amp;nbsp;Take for example tweets. Sentiment analysis anyone?&lt;br /&gt;&lt;br /&gt;I built a simple JSON parser with Talend using the tFileInputJSON that takes twitter search results (capped at 1500) and stores it in a file.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_bTp_xVLSr0A/TUT6qNhQ8_I/AAAAAAAADUE/azgybjyOrkU/s1600/TwitterDump.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="http://1.bp.blogspot.com/_bTp_xVLSr0A/TUT6qNhQ8_I/AAAAAAAADUE/azgybjyOrkU/s320/TwitterDump.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;The URL string for tInputFileJson reads:&lt;br /&gt;"http://search.twitter.com/search.json?q=egypt&amp;amp;rpp=100&amp;amp;page="+((Integer)globalMap.get("row1.Page_Max15")).toString()&lt;br /&gt;&lt;br /&gt;Here&amp;nbsp;Page_Max15 is a sequence generated from tRowGen. With a few mods you can run this incrementally to everyday refresh your warehouse. You'll need to capture the&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre-wrap;"&gt;since_id &lt;/span&gt;from the tweets.&lt;br /&gt;&lt;br /&gt;This opens up limitless possibilities to enhance your data warehouse or fetch data for sentiment tracking etc or index it in Solr and make available to your executive team. Kinda nice to walk in to a meeting and say- "Hey! this is what people think about us yesterday!"&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-2625959531988313160?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/2625959531988313160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/01/download-tweets-using-talend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2625959531988313160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2625959531988313160'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/01/download-tweets-using-talend.html' title='Download tweets using Talend'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bTp_xVLSr0A/TUT6qNhQ8_I/AAAAAAAADUE/azgybjyOrkU/s72-c/TwitterDump.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-2384544618729730472</id><published>2011-01-29T10:18:00.000-08:00</published><updated>2011-01-29T10:26:30.336-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google geocode geocoder address latlon talend'/><title type='text'>Custom Google GeoCoder using Talend</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Last month I wrote about how to get geocode information for an address based on zip code using Talend but this approach does not give you the precise address level geocode. You can obtain that using &lt;a href="http://code.google.com/apis/maps/documentation/geocoding/"&gt;Google's GeoCode API&lt;/a&gt;.(keep in mind the usage limits)&lt;br /&gt;&lt;br /&gt;I developed a Talend workflow that uses tFileInputJSON to connect to the API when you pass the concatenated address.&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/_bTp_xVLSr0A/TURYg9QYC-I/AAAAAAAADT8/ex9Fpm7p2no/s1600/GoogleGeoCoder.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="124" src="http://2.bp.blogspot.com/_bTp_xVLSr0A/TURYg9QYC-I/AAAAAAAADT8/ex9Fpm7p2no/s400/GoogleGeoCoder.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;All you need is a input source, tFlowToIterate, tFileInputJSON and ofcourse your output. I wrote it to a buffer so that the result of the iterate flow can be aggregated. In the URL field of the tFileInputJSON component use the following:&lt;br /&gt;&lt;br /&gt;"http://maps.google.com/maps/geo?q="+((String)globalMap.get("Out.ConcatenatedAddress")) +"&amp;amp;output=json&amp;amp;oe=utf8&amp;amp;sensor=false&amp;amp;key=&lt;span class="Apple-style-span" style="color: #93c47d;"&gt;YourGoogleAPIKey&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-2384544618729730472?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/2384544618729730472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/01/custom-google-geocoder-using-talend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2384544618729730472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2384544618729730472'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2011/01/custom-google-geocoder-using-talend.html' title='Custom Google GeoCoder using Talend'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_bTp_xVLSr0A/TURYg9QYC-I/AAAAAAAADT8/ex9Fpm7p2no/s72-c/GoogleGeoCoder.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-7299267368776502448</id><published>2010-12-26T20:49:00.000-08:00</published><updated>2011-02-20T09:55:29.185-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sample data generation easy siimple name addresses data'/><title type='text'>Quick and Dirty Sample Data Generation</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I recently tried the sample data generation engine at &lt;a href="http://www.generatedata.com/#generator"&gt;GenerateData.com&lt;/a&gt;. It is a quick and dirty way to generate sample data like names, addresses, etc. The only drawback is that the data is capped at 200 rows.&lt;br /&gt;&lt;br /&gt;A more advanced and highly customizable way to generate sample data is usine tRowGenerator component in &lt;a href="http://www.talend.com/index.php"&gt;Talend&lt;/a&gt;. You can write your own functions that randomize and create strings from a subset or dynamically generate them.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-7299267368776502448?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/7299267368776502448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/12/quick-and-dirty-sample-data-generation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7299267368776502448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7299267368776502448'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/12/quick-and-dirty-sample-data-generation.html' title='Quick and Dirty Sample Data Generation'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-2612446231740342167</id><published>2010-12-26T20:40:00.000-08:00</published><updated>2010-12-26T20:40:47.673-08:00</updated><title type='text'>Build Solr from Nightly Build</title><content type='html'>To build Solr from nightly build:&lt;br /&gt;&lt;br /&gt;1. Download source code from subversion repository at: https://svn.apache.org/repos/asf/lucene/dev/trunk/&lt;br /&gt;You will need a subversion client like Tortoise SVN.&lt;br /&gt;2. Build example using ant by:&lt;br /&gt;ant example&lt;br /&gt;3.  After the build finishes you can start the solr server by:&lt;br /&gt;java -jar start.jar&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-2612446231740342167?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/2612446231740342167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/12/build-solr-from-nightly-build.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2612446231740342167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2612446231740342167'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/12/build-solr-from-nightly-build.html' title='Build Solr from Nightly Build'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-5818041620972139555</id><published>2010-12-26T19:23:00.000-08:00</published><updated>2011-02-20T09:55:59.578-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google geocode geocoder address latlon talend'/><title type='text'>Geocoding Customer Data using Talend</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Geocoding customer data based on their zip or street address can add value to your data in many ways. For example you can do proximity searches using Solr on your customer data and show them relevant content every time they login to your site.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.talend.com/download"&gt;Talend&lt;/a&gt; makes it real easy and fast to achieve this. You can download a list of US Zip codes and a lat/long mapping at &lt;a href="http://download.geonames.org/export/zip/"&gt;GeoNames.org&lt;/a&gt;. They have geocodes for other countries as well.&lt;br /&gt;&lt;br /&gt;You can then create a basic job in Talend with a two csv input files and a tMap and see the results.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_bTp_xVLSr0A/TRgE7kUesbI/AAAAAAAADTY/oZrybmi9sTM/s1600/talend.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://3.bp.blogspot.com/_bTp_xVLSr0A/TRgE7kUesbI/AAAAAAAADTY/oZrybmi9sTM/s400/talend.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You can use the Google Map API to get more accurate Lat/Long results when you supply the address. The only problem is that there is a limit of 2500 per day. Talend has a connector called &lt;a href="http://www.talendforge.org/exchange/tos/extension_view.php?eid=287"&gt;tGoogleGeoCoder &lt;/a&gt;that does precisely that.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-5818041620972139555?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/5818041620972139555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/12/geocoding-customer-data-using-talend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/5818041620972139555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/5818041620972139555'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/12/geocoding-customer-data-using-talend.html' title='Geocoding Customer Data using Talend'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bTp_xVLSr0A/TRgE7kUesbI/AAAAAAAADTY/oZrybmi9sTM/s72-c/talend.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-7472756958014860048</id><published>2010-12-26T18:37:00.000-08:00</published><updated>2010-12-26T18:37:17.364-08:00</updated><title type='text'>Talend - The open source ETL Tool</title><content type='html'>I've been playing with Talend - an open source ETL tool. Watch this space for more blog posts relating to Talend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-7472756958014860048?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/7472756958014860048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/12/talend-open-source-etl-tool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7472756958014860048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7472756958014860048'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/12/talend-open-source-etl-tool.html' title='Talend - The open source ETL Tool'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-6399786779958201169</id><published>2010-12-22T20:18:00.000-08:00</published><updated>2010-12-22T20:29:22.574-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solr jetty windows service'/><title type='text'>Solr on Jetty as a Windows Service</title><content type='html'>&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;Solr ships with Jetty which is a HTTP Server and servlet cotainer. You can run Solr as a service by either using Tomcat (&lt;/span&gt;&lt;a href="http://wiki.apache.org/solr/SolrTomcat"&gt;http://wiki.apache.org/solr/SolrTomcat&lt;/a&gt;) or you can configure Jetty to run as a service.&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;To run Solr inside of Jetty as a service&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;1. Download the latest stable Jetty distribution&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;2. Copy the bin folder in Jetty over to example folder in your Solr instance&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;3. You will also need to copy&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;lib\win32 folder over to example\lib&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;and&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;etc\jetty-win32-service.xml to example\etc&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;4. Add the following to example\bin\jetty-service.conf&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;after the line:&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;"wrapper.java.additional.2=-Djetty.logs=../logs"&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;wrapper.java.additional.3=-Dsolr.solr.home=../solr&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: x-small;"&gt;5. Now, run the following commands&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;Jetty-Service.exe --install jetty-service.conf&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;net start jetty6-service&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;This installs the instance as a service and starts it. You can now run your Solr instance as a windows service and do a start/stop/restart anytime you like.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse;"&gt;To check if Solr is running you access the solr admin console at&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: verdana, geneva, helvetica, arial, sans-serif; font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="http://10.200.0.83:8983/solr/admin/"&gt;http://localhost:8983/solr/admin/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-6399786779958201169?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/6399786779958201169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/12/solr-on-jetty-as-windows-service.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6399786779958201169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6399786779958201169'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/12/solr-on-jetty-as-windows-service.html' title='Solr on Jetty as a Windows Service'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-6479837096094906372</id><published>2010-10-03T12:16:00.000-07:00</published><updated>2011-02-20T09:56:34.223-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='regression testing type1 dimension slowly changing dimension'/><title type='text'>Regression testing for Type 1 dimensions in the incremental warehouse</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Let's say you have data warehouse that you do an incremental load on every few hours for real-time data. You have your ETL set to run in micro-batches every few hours and it works perfect. Life is nice. Now, you get a request from the business to add new columns to that Type 1 dimension.&lt;br /&gt;&lt;br /&gt;You make changes to the ETL and while testing painstakingly check if the correct column(s) get updated. Well, you don't have to squint your eyes anymore. Checkout the almighty CHECKSUM function!&amp;nbsp;SQL Server and other databases have a checksum function which generate a hash over the set of fields your specify.&amp;nbsp;Run a checksum on the rows that you expect not to be updated and store it somewhere before running the ETL.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New';"&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;span style="color: blue;"&gt;SELECT&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;pk&lt;/span&gt;&lt;span style="color: silver;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: magenta;"&gt;&lt;i&gt;Checksum&lt;/i&gt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;(&lt;/span&gt;&lt;span style="color: maroon;"&gt;mustnotupdatecolumn1&lt;/span&gt;&lt;span style="color: silver;"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;mustnotupdatecolumnn&lt;/span&gt;&lt;span style="color: maroon;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;INTO&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: maroon;"&gt;checksumsbeforeload&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New';"&gt;&lt;span style="font-family: 'Courier New'; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now run the ETL on your test batch and compare the values&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New'; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;SELECT&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: maroon;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;pk&lt;/span&gt;&lt;/span&gt;&lt;span style="color: silver;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: magenta;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Checksum&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;mustnotupdatecolumn1&lt;/span&gt;&lt;/span&gt;&lt;span style="color: silver;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: maroon;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;mustnotupdatecolumnn&lt;/span&gt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;INTO&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: maroon;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;checksumsafterload&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You might also want to use this tactic when you are batch updating a table through ETL and expect that some columns should not change.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-6479837096094906372?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/6479837096094906372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/10/regression-testing-for-type-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6479837096094906372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6479837096094906372'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/10/regression-testing-for-type-1.html' title='Regression testing for Type 1 dimensions in the incremental warehouse'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-8395809405516375544</id><published>2010-10-02T15:29:00.000-07:00</published><updated>2011-02-20T09:57:05.679-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='create table as SQL Server'/><title type='text'>Create Table As (CTAS) in SQL Server</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;An easy way to create a table based on the output of a select statement on another table in SQL Server is to use the into statement&lt;br /&gt;&lt;br /&gt;select fielda, fieldb&lt;br /&gt;into newtable&lt;br /&gt;from originaltable&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-8395809405516375544?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/8395809405516375544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/10/create-table-as-ctas-in-sql-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8395809405516375544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8395809405516375544'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/10/create-table-as-ctas-in-sql-server.html' title='Create Table As (CTAS) in SQL Server'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-6614601775971872659</id><published>2010-09-26T19:26:00.000-07:00</published><updated>2011-02-20T09:57:39.583-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='INFORMATION_SCHEMA information schema sql server objects data type'/><title type='text'>Using INFORMATION_SCHEMA in SQL Server</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;The INFORMATION_SCHEMA in SQL Server is a powerful view to access metadata about the database. It is powerful and can help do quick analysis on metadata, column search, etc.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;1.&amp;nbsp;How about a data dictionary of all fields in your database? Can't remember the name of the field you added in the CUSTOMER entity? Just go to the information schema.&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;SELECT * from INFORMATION_SCHEMA.COLUMNS&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;WHERE table_name = '&lt;i&gt;Your Table'&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;If you want to Find all the places where URL are stored in the database and given that you stick to a convention such as add "URL" as suffix for all fields containing URL, you can run the following query and get quick results&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;SELECT * from INFORMATION_SCHEMA.COLUMNS&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;WHERE column_name like '%URL'&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-6614601775971872659?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/6614601775971872659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/09/using-informationschema-in-sql-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6614601775971872659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6614601775971872659'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/09/using-informationschema-in-sql-server.html' title='Using INFORMATION_SCHEMA in SQL Server'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-5613992718765702272</id><published>2010-08-20T08:19:00.000-07:00</published><updated>2011-02-20T09:58:01.350-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zenoss sql server mssql alert monitoring'/><title type='text'>Using Zenoss to Monitor SQL Server Integration Services ETL Jobs</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;em&gt;&lt;b&gt;&lt;span style="color: black; font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Zenoss&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/em&gt;&lt;span class="apple-converted-space"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="apple-style-span"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;&lt;b&gt;&lt;span style="color: black; font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Zenoss&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/em&gt;&lt;span class="apple-converted-space"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="apple-style-span"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Core) is an open source application, server and network management platform based on the Zope application server.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="apple-converted-space"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Recently our team implemented Zenoss to monitor production servers for a client.&amp;nbsp;This gave us the ability to monitor event logs on servers in near real-time and set rule based email alerts. Also it was a great step in the direction of unified alerting and monitoring for all applications. Zenoss is ideal when your ETL enviroment does not have access to SMTP servers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Design&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_bTp_xVLSr0A/TF9SFw0HeiI/AAAAAAAADQE/EkNlYvIablg/s1600/Zenoss+Overview.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_bTp_xVLSr0A/TF9SFw0HeiI/AAAAAAAADQE/EkNlYvIablg/s320/Zenoss+Overview.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;We have a SSIS package that is triggered every few minutes by a SQL Server Job.When an error occurs in ETL(SSIS), the SQL Server Agent writes an error to the server event log. This event is captured by Zenoss. An alerting rule in Zenoss sends an email to admins that need to be notified.&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Setup Alerting Rules&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_bTp_xVLSr0A/TF9R4emQm3I/AAAAAAAADP8/A4aFwFvybGY/s1600/Configure+Jobs.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_bTp_xVLSr0A/TF9R4emQm3I/AAAAAAAADP8/A4aFwFvybGY/s320/Configure+Jobs.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;To setup an alerting rule in Zenoss, go to Preferences&amp;gt;Alerting Rules&amp;gt;Create a New Rule.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Monitor Jobs&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;After the alerting rules are setup lookout for emails from Zenoss. I usually forward the emails to folder that I monitor regularly. After receiving an error alert:&lt;/div&gt;&lt;div class="MsoNormal"&gt;1. Fix the ETL error&lt;/div&gt;&lt;div class="MsoNormal"&gt;2. &amp;nbsp;Close the event by clicking on the X button - this will tell Zenoss to stop sending you emails for the past error events. A new email will be sent only if the error happens again.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_bTp_xVLSr0A/TF9RliCBEQI/AAAAAAAADP0/1gcOp2VAqmM/s1600/Monitor+Jobs.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_bTp_xVLSr0A/TF9RliCBEQI/AAAAAAAADP0/1gcOp2VAqmM/s320/Monitor+Jobs.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;This approach works well. The only drawback is that depending on the Repeat Time on the job you set, you may be bombarded with emails once an error occurs. A easy fix for that is to simply disable the rule once you have received the error notification.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-5613992718765702272?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/5613992718765702272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/08/using-zenoss-to-monitor-sql-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/5613992718765702272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/5613992718765702272'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/08/using-zenoss-to-monitor-sql-server.html' title='Using Zenoss to Monitor SQL Server Integration Services ETL Jobs'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_bTp_xVLSr0A/TF9SFw0HeiI/AAAAAAAADQE/EkNlYvIablg/s72-c/Zenoss+Overview.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-7796353907449573797</id><published>2010-08-08T16:54:00.000-07:00</published><updated>2010-08-08T16:54:55.492-07:00</updated><title type='text'>Collaborative Mind Mapping</title><content type='html'>Recently I made a vacation trip to England and Scotland. Before setting on my journey I decided to use Facebook to tap in to the wealth of information about the UK. I created two mind maps on Cacoo -an online collaborative drawing tool; took a snapshot of the diagrams and posted it on my FB profile. Each map listed a few places I knew were interesting to see in London and Scotland. I shared the edit rights of the maps with everyone. But Cacoo requires you to create and account, sign in and do all that to edit the diagram.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_bTp_xVLSr0A/TF9DAF3Ou1I/AAAAAAAADPk/SwH1W4kuDEg/s1600/mind+map.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_bTp_xVLSr0A/TF9DAF3Ou1I/AAAAAAAADPk/SwH1W4kuDEg/s320/mind+map.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I posted the diagram on my profile with an edit link and asked my friends for suggestions. Within 30 minutes I had at least 5 comments suggesting awesome places to visit. What I noticed is that nobody tried to edit the map in Cacoo itself. Maybe they were short of time, maybe they didn't want to go through the sign up process, maybe something else. The diagram above is the final version after I added everyone's suggestions.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Last week I tried again. Only this time it was in Google Docs and it was for the plot of the movie Inception. You can set the security features in Google Docs so that drawing/document editors are not required to sign in - anybody with a link can access. Isn't that purely awesome? Love you Google.&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/_bTp_xVLSr0A/TF9DGdKUyHI/AAAAAAAADPs/aS6JvtH6qRw/s1600/InceptionDreamNetwork.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_bTp_xVLSr0A/TF9DGdKUyHI/AAAAAAAADPs/aS6JvtH6qRw/s320/InceptionDreamNetwork.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-7796353907449573797?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/7796353907449573797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/08/collaborative-mind-mapping.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7796353907449573797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7796353907449573797'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/08/collaborative-mind-mapping.html' title='Collaborative Mind Mapping'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_bTp_xVLSr0A/TF9DAF3Ou1I/AAAAAAAADPk/SwH1W4kuDEg/s72-c/mind+map.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-3700619306301214195</id><published>2010-08-08T16:25:00.000-07:00</published><updated>2010-08-08T16:25:20.147-07:00</updated><title type='text'>Select distinct on text field in a data warehouse</title><content type='html'>Have you ever tried doing a select distinct on a text field in SQL Server 2005? You can't. Typically, business intelligence tools like OBIEE do a select distinct query on every field that needs to be reported from the data warehouse. So, how can you have a text column in a table that needs to be reported upon by a reporting layer like OBIEE?&lt;br /&gt;&lt;br /&gt;Make the field varchar(max). This will allow you to run a select distinct on the field. The text field is deprecated in SQL Server 2005.&lt;br /&gt;&lt;br /&gt;Also, this concise, informative article sets all the confusion about when to use varchar(8000), varchar(max) straight:&amp;nbsp;&lt;a href="http://www.teratrax.com/articles/varchar_max.html"&gt;http://www.teratrax.com/articles/varchar_max.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-3700619306301214195?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/3700619306301214195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/08/select-distinct-on-text-field-in-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/3700619306301214195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/3700619306301214195'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/08/select-distinct-on-text-field-in-data.html' title='Select distinct on text field in a data warehouse'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-3749702530785384726</id><published>2010-08-01T17:48:00.000-07:00</published><updated>2010-08-01T17:48:23.093-07:00</updated><title type='text'>3 quick steps before you undertake a SQL Server Integration Services(SSIS) Data Warehouse</title><content type='html'>3 quick steps before you undertake a SQL Server Integration Services (SSIS) Data Warehouse:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Watch Joy Mundy's webcast:&amp;nbsp;&lt;a href="https://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&amp;amp;EventID=1032297073&amp;amp;CountryCode=US"&gt;Loading a Kimball method data warehouse using SQL Server Integration Services&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Use Parent-Child Packages&lt;/li&gt;&lt;li&gt;Choose and stick to a naming convention to name your Tasks and Components. &lt;a href="http://consultingblogs.emc.com/jamiethomson/archive/2006/01/05/ssis_3a00_-suggested-best-practices-and-naming-conventions.aspx"&gt;Click Here&lt;/a&gt; for Jamie Thomson's suggested naming convention.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="https://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&amp;amp;EventID=1032297073&amp;amp;CountryCode=US"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-3749702530785384726?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/3749702530785384726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/08/3-quick-steps-before-you-undertake-sql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/3749702530785384726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/3749702530785384726'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/08/3-quick-steps-before-you-undertake-sql.html' title='3 quick steps before you undertake a SQL Server Integration Services(SSIS) Data Warehouse'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-6888355104997809166</id><published>2010-07-21T13:12:00.000-07:00</published><updated>2010-07-21T13:12:19.439-07:00</updated><title type='text'>Zynga claims to have to one of world's largest data warehouses</title><content type='html'>TDWI interviewed Ken Rudin, general manager of analytics for Zynga. They claim to have one of the world's largest data warehouse running on Vertica back end and Tableau front end.&lt;br /&gt;&lt;br /&gt;Here's a complete transcript of the interview.&lt;br /&gt;http://tdwi.org/articles/2010/07/21/Visual-Access-to-Data-Volumes.aspx&lt;br /&gt;&lt;br /&gt;Its a good read but some parts of it sounds more like a Tableau sales pitch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-6888355104997809166?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/6888355104997809166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/07/zynga-claims-to-have-to-one-of-worlds.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6888355104997809166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6888355104997809166'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/07/zynga-claims-to-have-to-one-of-worlds.html' title='Zynga claims to have to one of world&apos;s largest data warehouses'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-8625837456898991404</id><published>2010-06-25T11:23:00.000-07:00</published><updated>2010-06-25T11:54:34.627-07:00</updated><title type='text'>Querying XML with Ampersands</title><content type='html'>XML does not allow &amp;amp; as values of nodes. For example&lt;br /&gt;&lt;br /&gt;&lt;name&gt;John Smith &amp;amp; John Doe&lt;/name&gt; is not a valid XML. Hence the ampersand &amp;amp; is usually html encoded to "&amp;amp;amp;" &amp;nbsp;for storing the string in XML. And so are less than(&amp;lt;) and greater than(&amp;gt;) in to &amp;amp;lt; and &amp;amp;gt; respectively.&lt;br /&gt;&lt;br /&gt;Now, if we had to search for this node using the contains statement we don't require to html encode the search query. For example, if we want to search for name of a book that contains "This is a &amp;amp;amp; test" in the content node of the following XML&lt;br /&gt;&lt;br /&gt;&lt;root&gt;&lt;/root&gt;&lt;br /&gt;&lt;book&gt;&lt;/book&gt;&lt;br /&gt;&lt;name&gt;Test Book&lt;/name&gt;&lt;br /&gt;&lt;name&gt;&lt;name&gt;&amp;lt;root&lt;/name&gt;&amp;gt;&lt;/name&gt;&lt;br /&gt;&lt;name&gt;&amp;nbsp;&lt;/name&gt;&amp;nbsp;&lt;name&gt;&amp;lt;book&lt;/name&gt;&amp;gt;&lt;br /&gt;&lt;name&gt;&amp;nbsp;&lt;/name&gt;&amp;nbsp;&lt;name&gt;&amp;nbsp;&lt;/name&gt;&amp;nbsp;&lt;name&gt;&amp;lt;name&lt;/name&gt;&amp;gt;Test Book&lt;name&gt;&amp;lt;/name&lt;/name&gt;&amp;gt;&lt;br /&gt;&lt;name&gt;&amp;nbsp;&lt;/name&gt;&amp;nbsp;&lt;name&gt;&amp;nbsp;&lt;/name&gt;&amp;nbsp;&lt;name&gt;&amp;lt;content&lt;/name&gt;&amp;gt;This is a &amp;amp;amp; test&lt;name&gt;&amp;lt;/content&lt;/name&gt;&amp;gt;&lt;br /&gt;&lt;name&gt;&lt;name&gt;&amp;nbsp;&lt;/name&gt;&amp;nbsp;&amp;lt;/book&lt;/name&gt;&amp;gt;&lt;br /&gt;&lt;name&gt;&lt;name&gt;&amp;lt;/root&lt;/name&gt;&amp;gt;&lt;/name&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Our xpath query should look like&lt;br /&gt;root/book[content[contains(.,"This is a &amp;amp; test")]]/name&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-8625837456898991404?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/8625837456898991404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/06/querying-xml-with-ampersands.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8625837456898991404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8625837456898991404'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/06/querying-xml-with-ampersands.html' title='Querying XML with Ampersands'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-4838246601657726747</id><published>2010-06-22T13:06:00.000-07:00</published><updated>2010-06-22T13:06:41.690-07:00</updated><title type='text'>Last Updated Field in Database</title><content type='html'>The most convenient way to populate a last updated/modified or created field in SQL Server is by writing a trigger:&lt;br /&gt;&lt;br /&gt;USE [DatabaseName]&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SET ANSI_NULLS ON&lt;br /&gt;GO&lt;br /&gt;SET QUOTED_IDENTIFIER ON&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;ALTER TRIGGER [dbo].[LastUpdated_TableName] on [dbo].[TableName]&lt;br /&gt;FOR UPDATE, INSERT AS &lt;br /&gt;UPDATE dbo.CaseVoteFact&lt;br /&gt;SET LastUpdatedOn = GetDate()&lt;br /&gt;WHERE PrimaryKeyOfTable in (SELECT PrimaryKeyOfTable FROM inserted)&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can also used GetDate() as a default field but this will only put the date in for inserts and not for updates.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-4838246601657726747?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/4838246601657726747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/06/last-updated-field-in-database.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/4838246601657726747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/4838246601657726747'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/06/last-updated-field-in-database.html' title='Last Updated Field in Database'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-7996258227602864536</id><published>2010-04-08T11:26:00.000-07:00</published><updated>2010-06-06T16:56:58.101-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='copy static dimension data dev test prod'/><title type='text'>Copying static dimension data across environments</title><content type='html'>&lt;div&gt;In a recent deployment of a data warehouse to the TEST environment I wanted to copy all records from the static dimensions table that existed in DEV. Static dimensions store data that changes rarely. For example, the data for entity such as gender rarely changes. Also, static dimensions can be used if there is no easy programmatic way to determine the list of values for an entity.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For this project, during deployment, I first scripted the database schema(tables) and objects such as users, views, stored procedures and triggers in DEV and ran those scripts in TEST. I later deployed the ETL in TEST. In order to run the initial load the data in reference static dimensions had to be populated. Now there are several ways to migrate your data from DEV to TEST but if you have SQL Server Management Studio the one listed below was a quick and easy solution.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Simply copy the entire result set grid of the query in DEV: select * from &lt;dimension&gt;&lt;static&gt;&lt;/static&gt;&lt;/div&gt;&lt;div&gt;2. Right click on the corresponding static dimension in the target environment and click on open table.&lt;/div&gt;&lt;div&gt;3. Paste the contents.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quick and easy!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-7996258227602864536?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/7996258227602864536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/04/copying-static-dimension-data-across.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7996258227602864536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/7996258227602864536'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/04/copying-static-dimension-data-across.html' title='Copying static dimension data across environments'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-499960390246190957</id><published>2010-02-16T14:27:00.000-08:00</published><updated>2010-04-08T13:37:04.627-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html decode encode string ssis vb cleanse'/><title type='text'>Using html decode to transform/cleanse rich text data</title><content type='html'>Recently I was tasked with transforming incoming data from a transactional system. The incoming data was generated by a rich text editor and hence had html tags embedded within it. I wanted to strip the data of the html elements and convert it to pure string. I was accessing a web service that was exposed by the system to get the rich text html data. In addition, the data was html encoded during the SOAP request to the web service.&lt;br /&gt;&lt;br /&gt;For e.g. the string "&lt;b&gt;test&lt;/b&gt;" was stored as : "&lt;b&gt;&amp;amp;lt ;div class="user"&amp;amp;gt ;test&amp;amp;lt ;/div&amp;amp;gt ;&lt;/b&gt;"&lt;br /&gt;&lt;br /&gt;You may notice that the opening and closing angle brackets &lt;&gt; were converted to &amp;lt; and &amp;gt;. To get the string in its original form I used HttpUtility.HtmlDecode() function. Decoding the above string once produced:&lt;b&gt;test&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;. Which was expected but there were certain records which looked like: &lt;/span&gt;&amp;amp;lt ;div class="user"&amp;amp;gt ;Gareth&amp;amp;#8217;s advice was not followed.&amp;amp;lt ;/div&amp;amp;gt ;&lt;/b&gt;&lt;div class="user"&gt;&lt;div&gt;&lt;br /&gt;Decoding them once was no good as the #8217; never got decoded to an apostrophe. I decoded the string once again and got the expected output: &lt;div class="user"&gt;&lt;b&gt;Gareth's advice was not followed.&lt;/b&gt;&lt;div&gt;&lt;br /&gt;Now I had to remove the html tags and extract the text in between them. Here's the VB code for this:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#CC6600;"&gt;        'Delete text between angled brackets&lt;br /&gt;    mStartPos = InStr(strContent, "&lt;")         mEndPos = InStr(strContent, "&gt;")&lt;br /&gt;    Do While mStartPos &lt;&gt; 0 And mEndPos &lt;&gt; 0 And mEndPos &gt; mStartPos&lt;br /&gt;        mString = Mid(strContent, mStartPos, mEndPos - mStartPos + 1)&lt;br /&gt;        strContent = Replace(strContent, mString, "")&lt;br /&gt;        mStartPos = InStr(strContent, "&lt;")             mEndPos = InStr(strContent, "&gt;")&lt;br /&gt;    Loop&lt;br /&gt;&lt;br /&gt;    Do While Left(strContent, 1) = Chr(13) Or Left(strContent, 1) = Chr(10)&lt;br /&gt;        strContent = Mid(strContent, 2)&lt;br /&gt;    Loop&lt;br /&gt;&lt;br /&gt;    txt = strContent&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-499960390246190957?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/499960390246190957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/02/using-html-decode-to-transformcleanse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/499960390246190957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/499960390246190957'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/02/using-html-decode-to-transformcleanse.html' title='Using html decode to transform/cleanse rich text data'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-9195604717151134911</id><published>2010-02-15T08:12:00.000-08:00</published><updated>2010-08-23T11:57:43.161-07:00</updated><title type='text'>Explicit Data Conversion in SSIS Using the Script Component</title><content type='html'>There are several ways to convert data in an data flow in SSIS. Here is an example of Explicit Data Conversion in SSIS Using the Script Component. This piece of visual basic code converts a string in to a datetime or SSIS (DT_DBTIMESTAMP)&lt;br /&gt;&lt;br /&gt;Public Class ScriptMain&lt;br /&gt;Inherits UserComponent&lt;br /&gt;&lt;br /&gt;Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)&lt;br /&gt;'&lt;br /&gt;' Add your code here&lt;br /&gt;'&lt;br /&gt;Stage1Buffer.AddRow()&lt;br /&gt;If Not (String.IsNullOrEmpty(Row.Stage1Date)) Then&lt;br /&gt;Stage1Buffer.Stage1Date = Convert.ToDateTime(Row.Stage1Date)&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;Stage1Buffer.EndOfRowset()&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;The if condition prevents the task from failing if an empty string is encountered at Convert.ToDateTime() call. So make sure to include it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another way to cast DT_STR to a DBTIMESTAMP is by creating a derived column component and adding a new column with the following expression:&lt;br /&gt;CaseAssignedDate == "" ? NULL(DT_DBTIMESTAMP) : (DT_DBTIMESTAMP)CaseAssignedDate&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-9195604717151134911?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/9195604717151134911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/02/explicit-data-conversion-in-ssis-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/9195604717151134911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/9195604717151134911'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/02/explicit-data-conversion-in-ssis-using.html' title='Explicit Data Conversion in SSIS Using the Script Component'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-4832015011074990600</id><published>2010-02-10T16:14:00.000-08:00</published><updated>2010-07-12T09:30:46.768-07:00</updated><title type='text'>MapReduce ETL for Logs</title><content type='html'>I was researching how MapReduce can be applied to ETL in organizations. I found this interesting article which shows how RackSpace.com used MapReduce to search their logs.&lt;br /&gt;&lt;br /&gt;Check it out:&lt;br /&gt;http://highscalability.com/how-rackspace-now-uses-mapreduce-and-hadoop-query-terabytes-data&lt;br /&gt;&lt;br /&gt;One has to consider that RackSpace.com generates several hundred gigabytes of logs everyday which is on an extreme end of data processing considering the data generated in an average organization. So far MapReduce seems to be a good fit for data intensive ETL such as POS data in retail, clickstream data, etc. &lt;br /&gt;&lt;br /&gt;Update: Another interesting article published by the ACM that compares usage of MapReduce and Parallel DBMS. Very interesting read.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://db.csail.mit.edu/pubs/p64-stonebraker.pdf"&gt;http://db.csail.mit.edu/pubs/p64-stonebraker.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-4832015011074990600?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/4832015011074990600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/02/mapreduce-etl-for-logs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/4832015011074990600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/4832015011074990600'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/02/mapreduce-etl-for-logs.html' title='MapReduce ETL for Logs'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-8666425593891220620</id><published>2010-02-08T17:42:00.001-08:00</published><updated>2010-02-08T17:43:55.959-08:00</updated><title type='text'>Real-time Data Warehousing</title><content type='html'>An interesting article regarding various ways of making real-time data warehousing possible. Of course, there are several other technologies which employ map reduce that are not explained in this article as this area remains fairly unexplored in commercial BI. But new companies are coming up in this area making the dream of real-time data warehousing more and more possible.&lt;br /&gt;&lt;br /&gt;http://dssresources.com/papers/features/langseth/langseth02082004.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-8666425593891220620?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/8666425593891220620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/02/real-time-data-warehousing.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8666425593891220620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8666425593891220620'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/02/real-time-data-warehousing.html' title='Real-time Data Warehousing'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-81661753822516389</id><published>2010-01-12T14:47:00.001-08:00</published><updated>2010-01-12T15:03:08.903-08:00</updated><title type='text'>Conditional Split Equivalent in Control Flow SSIS</title><content type='html'>A good way to achieve Control Flow based on a Condition is by using a dummy script task and set the TaskResult property to success.&lt;br /&gt;&lt;br /&gt;Public Class ScriptMain&lt;br /&gt;&lt;br /&gt; Public Sub Main()&lt;br /&gt;  Dts.TaskResult = Dts.Results.Success&lt;br /&gt; End Sub&lt;br /&gt;&lt;br /&gt;End Class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can then add precedence constraints on the Containers/Tasks to direct your control flow. For E.g., Double click on the connecting arrow and Add an Expression as a precedence constraint - &lt;br /&gt;&lt;br /&gt;@[User::RowCount] == 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_bTp_xVLSr0A/S0z_j_00L5I/AAAAAAAAC9c/H5vGb8BIjXM/s1600-h/Example+of+CSPL+in+ControlFlow.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 170px;" src="http://2.bp.blogspot.com/_bTp_xVLSr0A/S0z_j_00L5I/AAAAAAAAC9c/H5vGb8BIjXM/s400/Example+of+CSPL+in+ControlFlow.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5425992644968066962" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-81661753822516389?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/81661753822516389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/01/conditional-split-equivalent-in-control.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/81661753822516389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/81661753822516389'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2010/01/conditional-split-equivalent-in-control.html' title='Conditional Split Equivalent in Control Flow SSIS'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_bTp_xVLSr0A/S0z_j_00L5I/AAAAAAAAC9c/H5vGb8BIjXM/s72-c/Example+of+CSPL+in+ControlFlow.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-481192607147646315</id><published>2009-12-07T10:20:00.000-08:00</published><updated>2010-01-25T11:22:19.077-08:00</updated><title type='text'>SSIS Transformation / Components not showing up</title><content type='html'>I wanted to use a Multicast Transformation in SSIS 2005 but for some reason it never showed up. So I scoured the web for a suitable explanation. To my chagrin I couldn't find it. &lt;br /&gt;&lt;br /&gt;Eventually, I figured out how to make the Multicast show up. Simply, right click on any transformation in the toolbox and click on Reset Toolbox. This will remove any filters applied on the Toolbox and show all out-of-the-box transformations.&lt;br /&gt;&lt;br /&gt;Update: Another way is to click on Tools &gt; Choose Toolbox Items and check the Data Flow/Control Flow component not showing up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-481192607147646315?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/481192607147646315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/12/ssis-transformation-not-showing-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/481192607147646315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/481192607147646315'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/12/ssis-transformation-not-showing-up.html' title='SSIS Transformation / Components not showing up'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-3585503760150572634</id><published>2009-11-09T08:53:00.001-08:00</published><updated>2009-11-09T08:55:20.165-08:00</updated><title type='text'>Appending files in DOS</title><content type='html'>Today I used a command to append all files in a directory to a single file. I was working on consolidating all .xsd files in to a single one and found this command helpful.&lt;br /&gt;&lt;br /&gt;for %f in (*.xsd) do type %f &gt;&gt; aggregate.txt&lt;br /&gt;&lt;br /&gt;This will append all files with .xsd extension in the directory in which the command is run and to aggregate.txt. You can use the aggregate file to do searches/etc. I'm not sure if there's a better way to do this but this was simple and quick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-3585503760150572634?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/3585503760150572634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/11/appending-files-in-dos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/3585503760150572634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/3585503760150572634'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/11/appending-files-in-dos.html' title='Appending files in DOS'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-6133968754891708035</id><published>2009-11-06T06:38:00.000-08:00</published><updated>2009-11-06T06:45:18.208-08:00</updated><title type='text'>Google goes crazy on me</title><content type='html'>Google went crazy on me for a microsecond. Check below. It was back up to its original self right after but I coudn't help blogging this.&lt;br /&gt;&lt;br /&gt;Its probably because I have this ideal view of Google as the savior of the masses by bringing to us free and extremely useful applications. They are good and they are rising fast. They are taking over the world. I'd love to see how long they continue to dominate our lives.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bTp_xVLSr0A/SvQ2GanlnrI/AAAAAAAAClw/T6qMi76DQ5Q/s1600-h/GoogleWentCrazy.PNG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 158px;" src="http://1.bp.blogspot.com/_bTp_xVLSr0A/SvQ2GanlnrI/AAAAAAAAClw/T6qMi76DQ5Q/s320/GoogleWentCrazy.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5401001336976547506" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-6133968754891708035?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/6133968754891708035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/11/google-goes-crazy-on-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6133968754891708035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6133968754891708035'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/11/google-goes-crazy-on-me.html' title='Google goes crazy on me'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bTp_xVLSr0A/SvQ2GanlnrI/AAAAAAAAClw/T6qMi76DQ5Q/s72-c/GoogleWentCrazy.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-6262785153574124724</id><published>2009-10-21T06:43:00.000-07:00</published><updated>2009-10-26T13:08:54.408-07:00</updated><title type='text'>A Cloud Computing Success Story</title><content type='html'>He makes everything sound so easy :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://open.blogs.nytimes.com/2007/11/01/self-service-prorated-super-computing-fun/"&gt;http://open.blogs.nytimes.com/2007/11/01/self-service-prorated-super-computing-fun/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-6262785153574124724?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/6262785153574124724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/cloud-computing-success-story.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6262785153574124724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6262785153574124724'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/cloud-computing-success-story.html' title='A Cloud Computing Success Story'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-2546137381840769613</id><published>2009-10-19T09:23:00.000-07:00</published><updated>2009-10-19T09:37:56.534-07:00</updated><title type='text'>Cognos: Dispatcher not initialized Startup Errors</title><content type='html'>Getting errors accessing the Cognos Dashboard? Do you get a "Dispatcher not initialized error" ?&lt;br /&gt;&lt;br /&gt;Chances are the Cognos service on the box has one of two problems:&lt;br /&gt;1. The SQL Server for Content Manager is not up. &lt;strong&gt;Resolution:&lt;/strong&gt; Start the SQL Server Services manually or using the SQL Server Configuration tool.&lt;br /&gt;2. The Cognos Configuration Manager was not able to start the service correctly and Starting Service from the application returns an error regarding services's configuration. &lt;strong&gt;Resolution:&lt;/strong&gt; Set the timeout setting - "stop wait time in seconds" setting in local configuration pane(left pane) to 200 (max).&lt;br /&gt;&lt;br /&gt;It is better to use Cognos Configuration Manager to start/stop the cognos services rather than starting/stopping them manually.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-2546137381840769613?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/2546137381840769613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/cognos-dispatcher-not-initialized.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2546137381840769613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/2546137381840769613'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/cognos-dispatcher-not-initialized.html' title='Cognos: Dispatcher not initialized Startup Errors'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-6706746743887250743</id><published>2009-10-15T10:37:00.000-07:00</published><updated>2009-10-15T10:44:06.984-07:00</updated><title type='text'>Tableau BI</title><content type='html'>So I checked out the Tableau demo after a co-worker pointed the tool out and I have to say - I'm impressed!&lt;br /&gt;&lt;br /&gt;The tool seems to work effortlessly, especially in the demo. The coolest part is that it allows you to drag and select only certain data point on the chart and drill-down on those. The charts looked neat!&lt;br /&gt;&lt;br /&gt;I will try to download and play with the tool some more and post back more stuff!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-6706746743887250743?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/6706746743887250743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/tableau-bi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6706746743887250743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/6706746743887250743'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/tableau-bi.html' title='Tableau BI'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-1066423070433996086</id><published>2009-10-15T10:28:00.000-07:00</published><updated>2009-10-15T10:34:40.826-07:00</updated><title type='text'>reCAPTCHA - hide email address from bots</title><content type='html'>A product of CMU CS department - this tool will help you hide your email address from bots.&lt;br /&gt;&lt;br /&gt;There are 2 distorted strings displayed in the image. One is the captcha check and the second one is taken from what probably is a result of OCRing a book. You can put a bogus string for the OCR version and the engine wont know. Try it out!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://recaptcha.net/index.html"&gt;http://recaptcha.net/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-1066423070433996086?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/1066423070433996086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/recaptcha-hide-email-address-from-bots.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/1066423070433996086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/1066423070433996086'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/recaptcha-hide-email-address-from-bots.html' title='reCAPTCHA - hide email address from bots'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-281211144443379619</id><published>2009-10-14T09:51:00.000-07:00</published><updated>2009-10-19T13:35:57.673-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='object'/><category scheme='http://www.blogger.com/atom/ns#' term='Invalid Date'/><category scheme='http://www.blogger.com/atom/ns#' term='NaN'/><category scheme='http://www.blogger.com/atom/ns#' term='date'/><category scheme='http://www.blogger.com/atom/ns#' term='toString'/><title type='text'>Javascript Date Validation using toString method</title><content type='html'>If you want to test date objects that are initialized by input from forms (particularly text boxes), the toString method comes handy. But beware, Javascript's Date.toString() function returns different values in IE and Firefox if the object is initiated with invalid date.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;For example:&lt;/strong&gt;&lt;br /&gt;var d = new Date("garbage");&lt;br /&gt;alert(d.toString());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Returns&lt;br /&gt;1. "NaN" (stands for Not a Number) in IE and&lt;br /&gt;2. "Invalid Date" in Firefox&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's a list of all methods for Date objects: &lt;a href="http://www.javascriptkit.com/jsref/date.shtml"&gt;http://www.javascriptkit.com/jsref/date.shtml&lt;/a&gt;&lt;br /&gt;Also, if you're looking for a jquery plugin for a popup calendar, I'd recommend using Kevin Luck's date-picker (&lt;a href="http://www.kelvinluck.com/assets/jquery/datePicker/v2/demo/"&gt;http://www.kelvinluck.com/assets/jquery/datePicker/v2/demo/&lt;/a&gt;). We used this at a client and it worked consistently across IE, FireFox and Chrome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-281211144443379619?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/281211144443379619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/javascript-date-validation-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/281211144443379619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/281211144443379619'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/javascript-date-validation-using.html' title='Javascript Date Validation using toString method'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-8311453625719362547</id><published>2009-10-05T13:22:00.000-07:00</published><updated>2009-10-05T13:25:40.394-07:00</updated><title type='text'>Philip Russom's Next Gen Data Warehousing White Paper</title><content type='html'>TDWI's Philip Russom has written a great white paper about where the data warehousing industry is going in the future. It's a good read check it out:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.101com.com/pub/tdwi/Files/TDWI_BPR_NextGenDWPlatforms_Q4_09.pdf"&gt;http://download.101com.com/pub/tdwi/Files/TDWI_BPR_NextGenDWPlatforms_Q4_09.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-8311453625719362547?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/8311453625719362547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/philip-russoms-next-gen-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8311453625719362547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8311453625719362547'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/philip-russoms-next-gen-data.html' title='Philip Russom&apos;s Next Gen Data Warehousing White Paper'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-8099187516070431151</id><published>2009-10-05T12:27:00.001-07:00</published><updated>2009-10-12T08:57:16.336-07:00</updated><title type='text'>Connect Jquery Datepicker Objects</title><content type='html'>Here's a script that binds / connects a jquery datepicker (Kelvin Luck's jquery datepicker plugin: &lt;a href="http://www.kelvinluck.com/assets/jquery/datePicker/v2/demo/"&gt;http://www.kelvinluck.com/assets/jquery/datePicker/v2/demo/&lt;/a&gt;) instance to another one. This is helpful if the dates in your form need to follow greater/less than rules.&lt;br /&gt;&lt;br /&gt;The script sets the start date of child datepicker to the date selected in the HistoryEnabled datepicker -&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;rePopulateToolTip();&lt;br /&gt;Date.format = 'mm/dd/yyyy';&lt;br /&gt;$('.date-pick').datePicker({ clickInput: true });&lt;br /&gt;$('.date-pickHistoryEnabled')&lt;br /&gt;.datePicker(&lt;br /&gt;{&lt;br /&gt;clickInput: true,&lt;br /&gt;startDate: '01/01/1996'&lt;br /&gt;})&lt;br /&gt;.bind("change", function() {$('.date-pick').datePicker({ startDate: $(this).val() })});&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;Date.format = 'mm/dd/yyyy';&lt;br /&gt;$('.date-pick').datePicker({ clickInput: true });&lt;br /&gt;$('.date-pickHistoryEnabled')&lt;br /&gt;.datePicker(&lt;br /&gt;{&lt;br /&gt;clickInput: true,&lt;br /&gt;startDate: '01/01/1996'&lt;br /&gt;})&lt;br /&gt;.bind("change", function() {$('.date-pick').datePicker({ startDate: $(this).val() })});&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-8099187516070431151?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/8099187516070431151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/connect-jquery-datepicker-objects.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8099187516070431151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/8099187516070431151'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/connect-jquery-datepicker-objects.html' title='Connect Jquery Datepicker Objects'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2720443514548354607.post-4947949369182268737</id><published>2009-10-04T14:14:00.000-07:00</published><updated>2009-10-11T23:53:35.723-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>Using Javascript and HTML to create dynamic pages</title><content type='html'>&lt;div&gt;&lt;i&gt;This article gives a brief introduction to AJAX&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Recently we implemented an AJAX application for our client using C#,  Javascript and JQuery.&lt;/div&gt;JQuery is a lightweight javascript library that enables: easy manipulation of the DOM; and AJAX. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;AJAX enables seamless web applications without the annoying flicker/page refresh that exists in traditional applications. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Traditional Web Applications&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_bTp_xVLSr0A/StLQ6OIXc_I/AAAAAAAACdQ/Cak9mgF6Tm0/s1600-h/Traditional+Static+Page.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 100px;" src="http://4.bp.blogspot.com/_bTp_xVLSr0A/StLQ6OIXc_I/AAAAAAAACdQ/Cak9mgF6Tm0/s320/Traditional+Static+Page.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5391601402560082930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Web 2.0 / AJAX Web Applications&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_bTp_xVLSr0A/StLRKEe9XaI/AAAAAAAACdY/MHSx43gy1dg/s1600-h/Asynchronous+Page+Updates.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_bTp_xVLSr0A/StLRKEe9XaI/AAAAAAAACdY/MHSx43gy1dg/s320/Asynchronous+Page+Updates.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5391601674848394658" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2720443514548354607-4947949369182268737?l=technologyenablingbusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technologyenablingbusiness.blogspot.com/feeds/4947949369182268737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/using-javascript-and-html-to-create.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/4947949369182268737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2720443514548354607/posts/default/4947949369182268737'/><link rel='alternate' type='text/html' href='http://technologyenablingbusiness.blogspot.com/2009/10/using-javascript-and-html-to-create.html' title='Using Javascript and HTML to create dynamic pages'/><author><name>Yash Ranadive</name><uri>http://www.blogger.com/profile/07756830537136925187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_bTp_xVLSr0A/StLQ6OIXc_I/AAAAAAAACdQ/Cak9mgF6Tm0/s72-c/Traditional+Static+Page.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
