<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>A gentleman and a scholar … or an idiot, I’ve been called both.</description><title>Abhinay Mehta</title><generator>Tumblr (3.0; @fingertap)</generator><link>http://blog.fingertap.org/</link><item><title>Word Cloud Generator</title><description>&lt;p&gt;I made a &lt;a href="http://wordcloud.forward.co.uk/" title="Word Cloud Generator" target="_blank"&gt;Word Cloud Generator&lt;/a&gt; at &lt;a href="http://forwardtechnology.co.uk/" title="Forward Technology" target="_blank"&gt;work&lt;/a&gt; for the use of our Analysts. It&amp;#8217;s not as fully featured as &lt;a href="http://www.wordle.net/" title="Wordle" target="_blank"&gt;Wordle&lt;/a&gt; but doesn&amp;#8217;t use a Java Applet on the client side and lets you download the word cloud as an image.&lt;/p&gt;
&lt;p&gt;It has NOT been tested on ANY version of IE, looks terrible but if you need to generate a word cloud image then give our &lt;a href="http://wordcloud.forward.co.uk/" title="Word Cloud Generator" target="_self"&gt;Word Cloud Generator&lt;/a&gt; a shot.&lt;/p&gt;</description><link>http://blog.fingertap.org/post/14986086612</link><guid>http://blog.fingertap.org/post/14986086612</guid><pubDate>Thu, 29 Dec 2011 19:24:00 +0000</pubDate></item><item><title>JMapReduce: Easy MapReduce with Hadoop on the JVM</title><description>&lt;p&gt;&lt;a href="https://bitbucket.org/abhinaymehta/jmapreduce"&gt;JMapReduce&lt;/a&gt; is a &lt;a href="https://github.com/forward/mandy"&gt;Mandy&lt;/a&gt; inspired library that lets you quickly write and run &lt;a href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt; MapReduce scripts in &lt;a href="http://jruby.org/"&gt;JRuby&lt;/a&gt;. The main difference between JMapReduce and Mandy is that JMapReduce runs in a JVM using JRuby and Mandy runs using Hadoop&amp;#8217;s &lt;a href="http://hadoop.apache.org/common/docs/r0.20.2/streaming.html"&gt;Streaming API&lt;/a&gt; in Ruby. The main aim of writing JMapReduce was that I needed Mandy like MapReduce scripts that could also make use of Java libraries and therefore needed something that runs in the JVM.&lt;/p&gt;
&lt;p&gt;For a quick introduction to terms like Hadoop, MapReduce and Mandy, I would recommend reading my colleague &lt;a href="http://twitter.com/pingles"&gt;Paul Ingles&lt;/a&gt; blog post &lt;a href="http://oobaloo.co.uk/articles/2010/1/12/mapreduce-with-hadoop-and-ruby.html"&gt;MapReduce with Hadoop and Ruby&lt;/a&gt; from early 2010.&lt;/p&gt;
&lt;p&gt;Here is a word count example:&lt;/p&gt;
&lt;script src="https://gist.github.com/1239241.js?file=wordcount.rb"&gt;&lt;/script&gt;&lt;p&gt;You can also chain MapReduce jobs like so:&lt;/p&gt;
&lt;script src="https://gist.github.com/1239269.js?file=gistfile1.rb"&gt;&lt;/script&gt;&lt;p&gt;Mappers and Reducers can emit Integers, Floats, Strings, Arrays and Hashes, but the very last emit of the very last job should be a String otherwise you will see binary data in your eventual result.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href="https://bitbucket.org/abhinaymehta/jmapreduce"&gt;main page&lt;/a&gt; for more information and examples.&lt;/p&gt;</description><link>http://blog.fingertap.org/post/10650032392</link><guid>http://blog.fingertap.org/post/10650032392</guid><pubDate>Sun, 25 Sep 2011 18:59:30 +0100</pubDate><category>jruby</category><category>hadoop</category></item><item><title>Hive Thrift client</title><description>&lt;p&gt;Assumptions made: you know what &lt;a title="Hive" target="_blank" href="http://wiki.apache.org/hadoop/Hive"&gt;Hive&lt;/a&gt; is, you know what &lt;a title="Thrift" target="_blank" href="http://incubator.apache.org/thrift/"&gt;Thrift&lt;/a&gt; is and you know how to install and start the &lt;a title="Hive Thrift Server" target="_blank" href="http://wiki.apache.org/hadoop/Hive/HiveServer"&gt;Hive Thrift server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To query the Hive server in a language that doesn&amp;#8217;t run on the Java Virtual Machine and therefore can&amp;#8217;t easily make use of the JBDC drivers, you will need to generate a Thrift client library in your chosen language to use the &lt;a title="Hive Thrift Server" target="_blank" href="http://wiki.apache.org/hadoop/Hive/HiveServer"&gt;Thrift Server&lt;/a&gt;; as long Thrift has &lt;a title="Thrift Language Generators" target="_blank" href="http://wiki.apache.org/thrift/LibraryFeatures?action=show&amp;amp;redirect=LanguageSupport"&gt;generators&lt;/a&gt; for your language of course.&lt;/p&gt;
&lt;p&gt;I couldn&amp;#8217;t find much documentation online on exactly how to go about this, therefore I thought I&amp;#8217;d document the steps I took to generate the Ruby thrift client for Hive, in case someone somewhere wanted to do the same:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a title="Thrift Installation" target="_blank" href="http://wiki.apache.org/thrift/ThriftInstallation"&gt;Install Thrift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Get the Hive thrift files by downloading the Hive source code using one of the methods described here: &lt;a href="http://hadoop.apache.org/hive/version_control.html"&gt;http://hadoop.apache.org/hive/version_control.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Then run the following commands, replacing &amp;#8216;rb&amp;#8217; with the language of your choice&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;cd PATH_TO_HIVE_SOURCE_CODE &lt;br/&gt;thrift &amp;#8212;gen rb -I service/include metastore/if/hive_metastore.thrift &lt;br/&gt;thrift &amp;#8212;gen rb -I service/include -I . service/if/hive_service.thrift &lt;br/&gt;thrift &amp;#8212;gen rb service/include/thrift/fb303/if/fb303.thrift &lt;br/&gt;thrift &amp;#8212;gen rb serde/if/serde.thrift &lt;br/&gt;thrift &amp;#8212;gen rb ql/if/queryplan.thrift &lt;br/&gt;thrift &amp;#8212;gen rb service/include/thrift/if/reflection_limited.thrift&lt;/blockquote&gt;
&lt;ul&gt;&lt;li&gt;Your thrift client will be in the folder: &lt;span&gt;PATH_TO_HIVE_SOURCE_CODE/gen-rb &lt;/span&gt;(again replace &lt;em&gt;&lt;strong&gt;rb &lt;/strong&gt;&lt;/em&gt;in the generated folder name with your language)&lt;/li&gt;
&lt;li&gt;You can now copy the generated code around and start using the library to connect with your Hive server&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;&lt;/ol&gt;&lt;p&gt;In Ruby you would use the generated code as follows:&lt;/p&gt;
&lt;script src="http://gist.github.com/599867.js?file=hive.rb"&gt;&lt;/script&gt;&lt;p&gt;Or you could use our Ruby thrift client library, we&amp;#8217;ve written a thin layer on top of the thrift code to make things a little easier. Feel free to browse and download the code from here:  &lt;a href="http://github.com/forward/rbhive"&gt;http://github.com/forward/rbhive&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.fingertap.org/post/1255463384</link><guid>http://blog.fingertap.org/post/1255463384</guid><pubDate>Wed, 06 Oct 2010 13:37:00 +0100</pubDate><category>ruby</category><category>hadoop</category><category>hive</category><category>thrift</category></item><item><title>Ultimate nginx config for Phusion Passenger</title><description>&lt;h2&gt;Main nginx.conf:&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;worker_processes  1;&lt;br/&gt;events {&lt;br/&gt;    worker_connections  1024;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;http {&lt;br/&gt;  include       mime.types;&lt;br/&gt;  default_type  application/octet-stream;&lt;br/&gt;&lt;br/&gt;  sendfile        on;&lt;br/&gt;  keepalive_timeout  65;&lt;br/&gt;&lt;br/&gt;  gzip  on;&lt;br/&gt;  gzip_http_version 1.0;&lt;br/&gt;  gzip_comp_level 2;&lt;br/&gt;  gzip_buffers 16&amp;#160;8k;&lt;br/&gt;  gzip_proxied any;&lt;br/&gt;  gzip_min_length 360;&lt;br/&gt;  gzip_types      text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;&lt;br/&gt;  proxy_set_header    Accept-Encoding  &amp;#8220;&amp;#8221;;&lt;br/&gt;&lt;br/&gt;  passenger_root /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.10;&lt;br/&gt;  passenger_ruby /usr/local/bin/ruby;&lt;br/&gt;&lt;br/&gt;  include /path/to/your/app/config/nginx.conf;&lt;br/&gt;  client_max_body_size 10M;&lt;br/&gt;  client_body_buffer_size 128k;&lt;br/&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Your application&amp;#8217;s nginx.conf:&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;server {&lt;br/&gt;  listen 80;&lt;br/&gt;  server_name website.com;&lt;br/&gt;  rewrite ^/(.*) &lt;a href="https://www.website.com/%241"&gt;https://www.website.com/$1&lt;/a&gt; permanent;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;server {&lt;br/&gt;  listen 443;&lt;br/&gt;  server_name &lt;a href="http://www.website.com"&gt;www.website.com&lt;/a&gt;;&lt;br/&gt;&lt;br/&gt;  root   /path/to/your/public/folder;&lt;br/&gt;  passenger_enabled on;&lt;br/&gt;&lt;br/&gt;  access_log  /path/to/your/log/folder/nginx_access.log;&lt;br/&gt;  error_log  /path/to/your/log/folder/nginx_error.log;&lt;br/&gt;&lt;br/&gt;  ssl         on;&lt;br/&gt;  ssl_certificate      /etc/ssl/certs/your-website.crt;&lt;br/&gt;  ssl_certificate_key  /etc/ssl/private/your-website.key;&lt;br/&gt;&lt;br/&gt;  location ~* ^.+&amp;#46;(jpg|jpeg|gif|css|png|js|ico)$ {&lt;br/&gt;    root  /path/to/your/public/folder;&lt;br/&gt;    expires max;&lt;br/&gt;    break;&lt;br/&gt;  }&lt;br/&gt;}&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://blog.fingertap.org/post/870362990</link><guid>http://blog.fingertap.org/post/870362990</guid><pubDate>Wed, 28 Jul 2010 12:10:00 +0100</pubDate><category>nginx</category><category>passenger</category><category>ruby</category></item><item><title>Thoughts on team management</title><description>&lt;p&gt;I am currently in a software development team that works very differently to other teams that I have been on. This has allowed us to successfully deliver project after project in a timely and efficient manner whilst only being together for a year.&lt;br/&gt;&lt;br/&gt;We&amp;#8217;ve been able to achieve this after receiving blessings from the Hindu God Ganesha &amp;#8230; err actually no. It mostly comes down to how our team is managed, or not managed as it&amp;#8217;ll become clear. Using a silly analogy, my high street grinds to a halt every morning due to traffic, the only mornings it has been free flowing is when the traffic lights stop working. There&amp;#8217;s nothing to stop the cars so no queues build up. Yes its a dangerous scenario and you hope that most drivers that morning are competent and alert. Management gives order and control to how projects progress but over-management can slow things down.&lt;br/&gt;&lt;br/&gt;When you have competent and skillful &amp;#8216;drivers&amp;#8217; in your team, minimal red tape can really let them flow. There is no real hierarchy in our team of 7, everyone is a team lead and everyone is experienced enough to be trusted. And let me be clear, we don&amp;#8217;t have people in the team that don&amp;#8217;t exist elsewhere. We all got hired because the company thought we were competent engineers, so they proved it by putting their trust in us. Our manager is the person that understands the business inside out and is in charge for giving and discussing the business requirements. We tackle business problems in small chunks and how we solve those problems is left up to us, the engineers. Whether we write a framework or a dirty script, whether we write tests or not, whether we write the solution in Ruby or Clojure, whether we pair on the problem or whether we re-write solutions from the ground up is our call.&lt;br/&gt;&lt;br/&gt;We don&amp;#8217;t bank on any golden hammer to solve problems, we&amp;#8217;ve used Ruby, JRuby, Clojure, Java, MapReduce using Hadoop, Hive and others I&amp;#8217;m probably forgetting, to solve problems in the most appropriate way. It keeps things exciting and interesting, and the whole company is now reaping the benefits of all the work. But none of this would have happened if we were not allowed to explore and do what we thought was best in stead of having old plans, procedures, approved technologies, etc in place to chain down the creative minds of the people that work here.&lt;br/&gt;&lt;br/&gt;Some other IT teams in my company still have traditional structures because not all scenarios will fit the working styles my team employs. And this post is in no way suggesting that management is a bad thing, in fact good management is essential to the success of any team, including ours. Good management also involves knowing when you&amp;#8217;re getting in the way and when to have faith in the people you hired. From experience I can say working in rigid or a tightly controlled environment makes for a mundane and less fun place to work, and the best employees will look to avoid just those places.&lt;br/&gt;&lt;br/&gt;So far it&amp;#8217;s been all well and good the way we are working and i&amp;#8217;m sure problems will surface in the months/years to come resulting from the way we do things because I know life isn&amp;#8217;t that nice (f**k you life). But I&amp;#8217;m not sure if they will be big enough to out-weigh the benefits it has to the business. Oh and by the way my company has roughly 200 employees so it&amp;#8217;s not a multi-national yet, and what I&amp;#8217;ve just said is probably a unrealistic idea in a multi-national (or is it?) but anyway that&amp;#8217;s my two cents.&lt;/p&gt;</description><link>http://blog.fingertap.org/post/628162117</link><guid>http://blog.fingertap.org/post/628162117</guid><pubDate>Mon, 24 May 2010 14:18:49 +0100</pubDate><category>management</category></item></channel></rss>

