<?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 blogspot refugee seeking shelter on tumblr.</description><title>Manish Pandit's Tumblr</title><generator>Tumblr (3.0; @mpandit)</generator><link>http://mpandit.tumblr.com/</link><item><title>Migrating a Perforce repo into git</title><description>&lt;p&gt;Here is the git version that I used for this on the Mac running 10.8.3.&lt;/p&gt;
&lt;pre&gt;$ git --version
git version 1.8.2&lt;/pre&gt;
&lt;p&gt;It is pretty much a one liner thereafter.&lt;/p&gt;
&lt;pre&gt;$ git p4 clone //path_to_p4_repo@all /tmp/path_to_git_repo
&lt;/pre&gt;
&lt;p&gt;Note the &lt;em&gt;@all&lt;/em&gt; at the end of the P4 repo, this is so that the clone can grab full commit history of the P4 repo.&lt;/p&gt;
&lt;p&gt;Once the clone is done, you&amp;#8217;ll cd to the git repo and notice the &lt;em&gt;.git&lt;/em&gt; folder there. In order to add this to remote, do this:&lt;/p&gt;
&lt;p&gt;Step 1. Create a remote repo where you&amp;#8217;d be pushing the newly created git repo to. Lets call it &lt;em&gt;some_git_project&lt;/em&gt;. I assume you&amp;#8217;re in the newly created git repo folder for step 2.&lt;/p&gt;
&lt;p&gt;Step 2.  &lt;/p&gt;
&lt;pre&gt;$ git remote add origin http://user@server/path/some_git_project.git&lt;/pre&gt;
&lt;p&gt;Step 3.  &lt;/p&gt;
&lt;pre&gt;$ git push origin master&lt;/pre&gt;
&lt;p&gt;You may see this error during step 3 if the code base and/or the revision history is huge.&lt;/p&gt;
&lt;pre&gt;Delta compression using up to 8 threads.
Compressing objects: 100% (427/427), done.
Writing objects: 100% (2132/2132), 15.92 MiB | 17.65 MiB/s, done.
Total 2132 (delta 1163), reused 2132 (delta 1163)
Unable to rewind rpc post data - try increasing http.postBuffer
error: RPC failed; result=65, HTTP code = 302
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly&lt;/pre&gt;
&lt;p&gt;This can be fixed by running the below, &lt;em&gt;thanks the post &lt;a href="http://blog.lukebennett.com/2011/07/25/git-broken-pipe-error-when-pushing-to-a-repository/" target="_blank"&gt;here&lt;/a&gt;, &lt;/em&gt;and retrying Step 3.&lt;/p&gt;
&lt;pre&gt;git config http.postBuffer 209715200 &lt;/pre&gt;
&lt;p&gt;&lt;span&gt;Enjoy!&lt;/span&gt;&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/47709521010</link><guid>http://mpandit.tumblr.com/post/47709521010</guid><pubDate>Thu, 11 Apr 2013 13:02:00 -0400</pubDate><category>git</category><category>perforce</category><category>p4</category></item><item><title>Cassandra : Demystifying Column Families</title><description>&lt;p&gt;Last 2 posts  were fairly trivial, but now comes the fun part. I am seeing a lot of &lt;em&gt;UTF8Type&lt;/em&gt; and &lt;em&gt;validation_class&lt;/em&gt; type of syntax, which tells me (at least initially) that there is a lot of flexibility when it comes to creating structures and types. I will find out what these things are - but without getting into a lot of details, from whatever documentation I could google, a &lt;em&gt;column family&lt;/em&gt; is what defines the structure of the document. In other words, its a &lt;em&gt;family of columns&lt;/em&gt;, just like a relational table is. For Mongo folks, this would be hard to grasp as there is no concept of a column or a group of columns  there. All Mongo has is a &lt;em&gt;collection&lt;/em&gt; to group a bunch of documents, which in turn, have columns (or keys). So, a family has a name, and you define the columns that form that family. This to me felt super odd till I found out that I can also have dynamic families, where I do not have to specify the columns ahead of time. We&amp;#8217;ll get there, and we&amp;#8217;ll also try to add/delete columns from a family that we declare. &lt;/p&gt;
&lt;p&gt;Initial instinct would be to just declare a column family with no columns.&lt;/p&gt;
&lt;pre&gt;[default@myspace] create column family SomeFamily;
9b08e2e8-f0d8-3788-a23c-0c4a720b766c&lt;/pre&gt;
&lt;p&gt;Apparently it worked. Now, this just means that we&amp;#8217;ve run a SQL similar to &lt;em&gt;create table SomeFamily&lt;/em&gt;. Whats different is that the SQL wont work as we did not specify any columns. &lt;/p&gt;
&lt;p&gt;To insert data into a column family, its similar to inserting data in an map. Lets analyze the below (it will not actually work, we&amp;#8217;ll find out soon).&lt;/p&gt;
&lt;pre&gt;[default@myspace] set SomeFamily['lobster1234']['name']='Manish Pandit';
org.apache.cassandra.db.marshal.MarshalException: cannot parse 'name' as hex bytes&lt;/pre&gt;
&lt;p&gt;Looking at the &lt;em&gt;set&lt;/em&gt; statement, we&amp;#8217;re using a &lt;em&gt;&lt;strong&gt;key&lt;/strong&gt;&lt;/em&gt; (which is my Yahoo! ID, lobster1234) and setting &lt;em&gt;name&lt;/em&gt; to the value of my full name. This looks familiar, doesn&amp;#8217;t it? Like a map of maps or a &lt;em&gt;multimap&lt;/em&gt;. The key is Yahoo! ID, and the value of this key is another map, with key as name and value has the name of the user. I can also add another key-value to the &lt;em&gt;valuemap, &lt;/em&gt;this time adding a gender. Now if I were to extend it, I can keep adding more folks with their Yahoo! IDs as &lt;em&gt;keys&lt;/em&gt; to the multimap, with the value of this key being another map, whose keys are name and gender. A point to be noted here is that this key (lobster1234) is referred to as a &lt;em&gt;&lt;strong&gt;row key&lt;/strong&gt;&lt;/em&gt;, as it identifies the key-value pairs that are mapped to it. Like a key in a multimap.&lt;/p&gt;
&lt;p&gt;In Scala, this is what &lt;em&gt;SomeFamily&lt;/em&gt; boils down to:&lt;/p&gt;
&lt;pre&gt;scala&amp;gt; var someFamily = Map[Any,Map[Any,Any]]()
someFamily: scala.collection.immutable.Map[Any,Map[Any,Any]] = Map()

scala&amp;gt; someFamily = someFamily+("lobster1234"-&amp;gt;Map("name"-&amp;gt;"Manish Pandit"))
someFamily: scala.collection.immutable.Map[Any,Map[Any,Any]] = Map(lobster1234 -&amp;gt; Map(name -&amp;gt; Manish Pandit))

&lt;/pre&gt;
&lt;p&gt;Hope this clarifies or at least gives you an image of what a column family is like. The closest counterpart to this for MongoDB would be a &lt;em&gt;collection&lt;/em&gt;. A &lt;em&gt;collection&lt;/em&gt; contains a bunch of documents, with every document having an &lt;em&gt;_id&lt;/em&gt;, and key-value pairs, where keys are Strings and values can be of the types supported by BSON spec (including another key-value pair).&lt;/p&gt;
&lt;p&gt;In Mongo terms, the above would look like:&lt;/p&gt;
&lt;pre&gt;use  myspace
db.someFamily.save({_id:"lobster1234","name":"Manish Pandit"})
&lt;/pre&gt;
&lt;p&gt;Adding another value to this document will be something like&lt;/p&gt;
&lt;pre&gt; db.someFamily.update({_id:"lobster1234"},{$set:{"gender":"Male"}})
&lt;/pre&gt;
&lt;p&gt;Going back to the error we saw when trying to insert a record in our column family (SomeFamily) - it appears that Cassandra is &lt;em&gt;assuming&lt;/em&gt; that we are providing hex values instead of UTF8. So there has to be some way to tell Cassandra that the column family is expected to hold UTF8 data. Again, Google and Cassandra documentation say that we need to provide additional parameters while creating the column family. Lets try this one more time. We can delete SomeFamily column family so we can use the same name.&lt;/p&gt;
&lt;pre&gt;[default@myspace] drop column family SomeFamily;
36cac489-882a-345f-94f4-10dfb61d9395&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; that column family names are case sensitive - I learnt it by messing with the case of the column family name. &lt;em&gt;SomeFamily&lt;/em&gt; and &lt;em&gt;somefamily&lt;/em&gt; would be two unique column family names in a given keyspace.&lt;/p&gt;
&lt;p&gt;So, lets change our create column family statement to account for UTF8 data as the key as well as value(s), and try to insert a record.&lt;/p&gt;
&lt;pre&gt;[default@myspace] create column family SomeFamily with comparator=UTF8Type and key_validation_class = UTF8Type and default_validation_class=UTF8Type;
27b66cfa-76ce-340c-bd31-4079873368db
[default@myspace] set SomeFamily['lobster1234']['name']='Manish Pandit';
Value inserted.
Elapsed time: 4.1 msec(s).
&lt;/pre&gt;
&lt;p&gt;We added comparator and validation classes to the definition. These are often referred to as &lt;em&gt;comparators&lt;/em&gt; and &lt;em&gt;validators&lt;/em&gt;. The data type of the column &lt;em&gt;name&lt;/em&gt; is called a &lt;strong&gt;comparator&lt;/strong&gt;. For comparison, the comparator in a relational database is always String, because all the column &lt;em&gt;names&lt;/em&gt; in a table have to be a String. A &lt;strong&gt;validator &lt;/strong&gt;defines the data type of the column values. We used &lt;em&gt;key_validation_class&lt;/em&gt; so that the key &lt;em&gt;&amp;#8216;lobster1234&amp;#8217;&lt;/em&gt; can be validated against the specified type, and the &lt;em&gt;default_validation_class&lt;/em&gt; so that the value &lt;em&gt;&amp;#8216;Manish Pandit&amp;#8217;&lt;/em&gt; can be validated against the specified type. &lt;/p&gt;
&lt;p&gt;The default value for comparators and validators is &lt;em&gt;hex byte[]&lt;/em&gt;, hence the error that we saw earlier.&lt;/p&gt;
&lt;p&gt;Cassandra does support type-casting values, so if we did not provide the default_validation_class during the creation of the column family, the following would work:&lt;/p&gt;
&lt;pre&gt;[default@myspace] set SomeFamily['mpandit.meetup']['name']=UTF8('MPandit Meetup');&lt;/pre&gt;
&lt;p&gt;Note the UTF8(..) conversion.&lt;/p&gt;
&lt;p&gt;MongoDB does not need any of this, as it supports the BSON types for the values, and figures the type out at runtime. As long as the provided value is one of the BSON types, MongoDB will not complain. There is no type tied to a value. In other words, a key can have different &lt;em&gt;type&lt;/em&gt; of value in 2 documents within the same collection, like this (note the type of the key someType is an int in one document, and a String in another).&lt;/p&gt;
&lt;pre&gt;&amp;gt; db.test.insert({"someType":2})
&amp;gt; db.test.insert({"someType":"Manish"})
&amp;gt; db.test.find()
{ "_id" : ObjectId("5147d3f995500e98b8f7a6cd"), "someType" : 2 }
{ "_id" : ObjectId("5147d3fd95500e98b8f7a6ce"), "someType" : "Manish" }
&lt;/pre&gt;
&lt;p&gt;Also, the keys (or the names of the keys) in a MongoDB &lt;em&gt;document&lt;/em&gt; can only be&lt;em&gt; Strings.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To keep the discussion lively and post length in check, I&amp;#8217;ll discuss static and dynamic column families, CRUD operations in the next post.&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/45687067794</link><guid>http://mpandit.tumblr.com/post/45687067794</guid><pubDate>Mon, 18 Mar 2013 14:50:00 -0400</pubDate><category>cassandra</category><category>cassandra-cli</category><category>mongodb</category><category>column-families</category></item><item><title>Cassandra-CLI : Do not forget your semicolons!</title><description>&lt;p&gt;I knew it was too good to be true. After being spoilt by Scala, and MongoDB client - I need to sober up and start using semicolons. I really hope there is some kind of switch I can use here but this gets annoying.&lt;/p&gt;
&lt;pre&gt;mpandit$ ./cassandra-cli
Column Family assumptions read from /Users/mpandit/.cassandra-cli/assumptions.json
Connected to: "Test Cluster" on 127.0.0.1/9160
Welcome to Cassandra CLI version 1.2.2

Type 'help;' or '?' for help.
Type 'quit;' or 'exit;' to quit.

[default@unknown] help
...    
...	;
Getting around:
?                       Display this help.
help;                   Display this help.
quit;                   Exit this utility.

[default@unknown] quit
...    
...	
...	
...	;

&lt;/pre&gt;
&lt;p&gt;Now lets build the databases and stick some data in. A &lt;em&gt;db&lt;/em&gt; in Mongo == a &lt;em&gt;keyspace&lt;/em&gt; in Cassandra. So, a Mongo &lt;em&gt;show dbs&lt;/em&gt; is same as &lt;em&gt;show keyspaces;&lt;/em&gt;  (do not forget the semicolon!) in Cassandra. However, this produces huge output and unlike MongoDB it isn&amp;#8217;t JSON, so you &lt;em&gt;cannot&lt;/em&gt; wrap this into a javascript and filter it out. But, more data means more information - reading through the output, I am starting to see the various attributes that can be tuned and configured.&lt;/p&gt;
&lt;p&gt;Creating a DB (keyspace) is &lt;em&gt;&lt;strong&gt;explicit&lt;/strong&gt;&lt;/em&gt;, unlike Mongo where its &lt;em&gt;&lt;strong&gt;implicit&lt;/strong&gt;&lt;/em&gt;. In Mongo you can say &lt;em&gt;use somedb&lt;/em&gt; and the moment you save something in that context, like &lt;em&gt;db.somecollection.save({&amp;#8220;a&amp;#8221;:&amp;#8221;b&amp;#8221;})&lt;/em&gt;, that &lt;em&gt;db&lt;/em&gt; will be created for you. In Cassandra, you create a &lt;em&gt;keyspace&lt;/em&gt; explicitly, like so:&lt;/p&gt;
&lt;pre&gt;[default@unknown] create keyspace myspace;
e5bb6d2e-36ea-365b-85cc-065d9cf15941
&lt;/pre&gt;
&lt;p&gt;This returns a hash, which I am not sure what to do with at this moment. I think its the UUID for every entity that gets created within Cassandra. I could be wrong, we&amp;#8217;ll find out. Maybe its something like MongoDB&amp;#8217;s &lt;a href="http://docs.mongodb.org/manual/reference/method/db.getLastErrorObj/" target="_blank"&gt;&lt;em&gt;getLastErrorObj&lt;/em&gt;&lt;/a&gt; which is returned after every operation.&lt;/p&gt;
&lt;p&gt;Now that we&amp;#8217;ve created a &lt;em&gt;keyspace&lt;/em&gt;, we &lt;em&gt;use&lt;/em&gt; it. Similar to MongoDB&amp;#8217;s &lt;em&gt;use somedatabase, &lt;/em&gt;except that the &lt;em&gt;keyspace has to exist&lt;/em&gt; before using it. &lt;/p&gt;
&lt;pre&gt;[default@unknown] use myspace;
Authenticated to keyspace: myspace
[default@myspace] use myotherspace;
Keyspace 'myotherspace' not found.    
&lt;/pre&gt;
&lt;p&gt;Notice the promot has changed from default@unknown to default@myspace.&lt;/p&gt;
&lt;p&gt;You can then use &lt;em&gt;show schema; &lt;/em&gt;to introspect the keyspace. This is very much like &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/show-create-table.html" target="_blank"&gt;&lt;em&gt;show create table &lt;/em&gt;of MySQL&lt;/a&gt; and I cannot imagine a MongoDB counterpart of this.&lt;/p&gt;

&lt;pre&gt;[default@myspace] show schema;
create keyspace myspace
  with placement_strategy = 'NetworkTopologyStrategy'
  and strategy_options = {datacenter1 : 1}
  and durable_writes = true;

use myspace;
&lt;/pre&gt;
&lt;p&gt;Also you will notice that the create statement has a list of default settings that will show up. Since we used none, this gives an idea of what all options are available.&lt;/p&gt;
&lt;p&gt; In the next post we will create Cassandra counterparts for &lt;em&gt;Collections&lt;/em&gt; and &lt;em&gt;Documents&lt;/em&gt;.&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/45661146815</link><guid>http://mpandit.tumblr.com/post/45661146815</guid><pubDate>Mon, 18 Mar 2013 03:55:00 -0400</pubDate><category>mongodb</category><category>cassandra-cli</category><category>cassandra</category></item><item><title>Tiptoeing on Cassandra after running a MongoDB Marathon </title><description>&lt;p&gt;As mentioned in my previous post, I am weeks away from starting at &lt;a href="http://techblog.netflix.com" target="_blank"&gt;Netflix Engineering&lt;/a&gt;. One of the things that I absolutely have never touched is &lt;a href="http://cassandra.apache.org/" target="_blank"&gt;Apache Cassandra&lt;/a&gt;. While I do not think of myself as a &lt;a href="http://www.10gen.com/presentations/mongosf-2011/using-mongodb-for-ign-social-platform" target="_blank"&gt;NoSQL n00b&lt;/a&gt;, Cassandra is something I really never got around to.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;With this change, I decided to pay around with it, and I&amp;#8217;ll use this blog as a series to post my thoughts with the context of MongoDB inertia. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Getting Started:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As with anything else, the best way to learn is to *not* &lt;a href="http://en.wikipedia.org/wiki/RTFM" target="_blank"&gt;RTFM&lt;/a&gt;. Lets see how far I can get with this.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I downloaded 1.2.2 and extracted it on my Mac. When running&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;bin/cassandra -f&lt;/pre&gt;
&lt;p&gt;&lt;span&gt;I did get a boatload of errors.&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;xss = -ea -javaagent:./../lib/jamm-0.2.5.jar -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms2048M -Xmx2048M -Xmn400M -XX:+HeapDumpOnOutOfMemoryError 

log4j:ERROR setFile(null,true) call failed. java.io.FileNotFoundException: /var/log/cassandra/system.log (No such file or directory)
........
........
INFO 23:54:25,132 Scheduling key cache save to each 14400 seconds (going to save all keys).
 INFO 23:54:25,133 Initializing row cache with capacity of 0 MBs and provider org.apache.cassandra.cache.SerializingCacheProvider
 INFO 23:54:25,141 Scheduling row cache save to each 0 seconds (going to save all keys).
ERROR 23:54:25,167 Failed to create /var/lib/cassandra/data/system/batchlog directory
ERROR 23:54:25,172 Failed to create /var/lib/cassandra/data/system/batchlog directory
ERROR 23:54:25,172 Failed to create /var/lib/cassandra/data/system/batchlog directory
ERROR 23:54:25,173 Failed to create /var/lib/cassandra/data/system/peer_events directory
ERROR 23:54:25,173 Failed to create /var/lib/cassandra/data/system/peer_events directory
ERROR 23:54:25,174 Failed to create /var/lib/cassandra/data/system/hints directory
ERROR 23:54:25,175 Failed to create /var/lib/cassandra/data/system/Schema directory
ERROR 23:54:25,176 Failed to create /var/lib/cassandra/data/system/schema_keyspaces directory
ERROR 23:54:25,177 Failed to create /var/lib/cassandra/data/system/schema_keyspaces directory
ERROR 23:54:25,177 Failed to create /var/lib/cassandra/data/system/schema_keyspaces directory
.....
&lt;br/&gt;&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;Clearly I need to fix the folder locations. Usually all servers have a &lt;em&gt;conf &lt;/em&gt;or &lt;em&gt;config&lt;/em&gt; or &lt;em&gt;settings&lt;/em&gt; folder. So does Cassandra. I found the &lt;em&gt;conf&lt;/em&gt; folder. Looking at the logs, it read the config from a &lt;em&gt;yaml&lt;/em&gt; file. Fortunately there is only one yaml file there. I guessed the log location is in the log4j properties file. Next up, to change locations where the process has permissions to write. &lt;/p&gt;
&lt;pre&gt;README.txt    		cassandra-rackdc.properties	cassandra.yaml
cqlshrc.sample			log4j-tools.properties
cassandra-env.sh		cassandra-topology.properties
commitlog_archiving.properties	log4j-server.properties

&lt;/pre&gt;

&lt;p&gt;&lt;span&gt;I vi&amp;#8217;d the &lt;/span&gt;&lt;em&gt;cassandra.yaml&lt;/em&gt;&lt;span&gt; file and started changing the locations. Same with &lt;/span&gt;&lt;em&gt;log4j*.properties. &lt;/em&gt;&lt;span&gt;Lets try using &lt;/span&gt;&lt;em&gt;~/cassandra/?&lt;/em&gt;&lt;span&gt; instead of &lt;/span&gt;&lt;em&gt;/var/?&lt;/em&gt;&lt;span&gt; and see where we go with it.&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;mpandit$ ./cassandra -f
xss =  -ea -javaagent:./../lib/jamm-0.2.5.jar -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms2048M -Xmx2048M -Xmn400M -XX:+HeapDumpOnOutOfMemoryError
 INFO 00:28:36,783 Logging initialized
 INFO 00:28:36,799 JVM vendor/version: Java HotSpot(TM) 64-Bit Server VM/1.6.0_43
 INFO 00:28:36,799 Heap size: 2105540608/2105540608
 INFO 00:28:36,814 Loading settings from file:/Users/mpandit/software/apache-cassandra-1.2.2/conf/cassandra.yaml
 .....
 ......
 INFO 00:28:39,610 Binding thrift service to localhost/127.0.0.1:9160
 INFO 00:28:39,641 Using TFramedTransport with a max frame size of 15728640 bytes.
 INFO 00:28:39,652 Using synchronous/threadpool thrift server on localhost : 9160
 INFO 00:28:39,653 Listening for thrift clients...
 INFO 00:28:49,628 Created default superuser 'cassandra'
    
&lt;/pre&gt;
&lt;p&gt;Great! looks like we got our Cassandra server working. Next post is where I&amp;#8217;d google around to figure out Cassandra CLI and create the &lt;a href="http://mongodb.org" target="_blank"&gt;MongoDB&lt;/a&gt; equivalent of &lt;em&gt;dbs&lt;/em&gt;, &lt;em&gt;collections&lt;/em&gt;, and &lt;em&gt;documents&lt;/em&gt;. To be honest I&amp;#8217;ve no idea if these constructs are even valid, or make sense in Cassandra world - we will find out.&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/45658758108</link><guid>http://mpandit.tumblr.com/post/45658758108</guid><pubDate>Mon, 18 Mar 2013 02:43:00 -0400</pubDate><category>cassandra</category><category>mongodb</category><category>netflix-engineering</category></item><item><title>So long, IGN - Hello Netflix!</title><description>&lt;p&gt;After a long hiatus from the blogosphere, I am back. A lot has changed. &lt;a href="http://www.bloomberg.com/news/2013-02-04/news-corp-sells-ign-websites-to-j2-global-s-ziff-davis.html" target="_blank"&gt;IGN got acquired by Ziff Davis&lt;/a&gt;, and I, along with a lot of awesome engineers and friends, were let go as a part of the &lt;a href="http://www.ign.com/articles/2013/02/22/ign-layoffs-and-saying-goodbye-to-1up-and-gamespy" target="_blank"&gt;restructuring&lt;/a&gt; during last week of February. Life happens.&lt;/p&gt;
&lt;p&gt;After a few weeks of rigorously interviewing at several companies in the SF Bay Area, I accepted the offer from &lt;a href="http://www.netflix.com" target="_blank"&gt;Netflix&lt;/a&gt;. Not only do I love the product (Netflix subscriber since 2000), but the technology brand that Netflix carries is like none other. Their &lt;a href="http://www.slideshare.net/reed2001/culture-1798664" target="_blank"&gt;culture&lt;/a&gt; and talent density intrigues me, and I cannot wait to start at a company with such well defined, practical values, and a track record of following them religiously. &lt;/p&gt;
&lt;p&gt;Technology wise, Netflix is the &lt;a href="https://www.youtube.com/watch?feature=player_embedded&amp;amp;v=oH3PAGZJewA" target="_blank"&gt;poster child&lt;/a&gt; for AWS deployments, and distributed, highly available architectures. They have also started the &lt;a href="http://netflix.github.com/#repo" target="_blank"&gt;Netflix OSS&lt;/a&gt; initiative. The initiative involves open sourcing parts of Netflix&amp;#8217;s tech stack. The OSS roadmap is very exciting, and so are the projects that have already been open sourced. The number of forks and stars tell the same story. Too bad I was 80 miles north (in SF) when the &lt;a href="http://www.meetup.com/Netflix-Open-Source-Platform/" target="_blank"&gt;OSS meetups&lt;/a&gt; happened in Los Gatos, but now I&amp;#8217;ve all the reasons and more to be a part of them. &lt;/p&gt;
&lt;p&gt;One of the first things I would like to do is &lt;a href="http://jobs.netflix.com/jobsListing.html?function=Engineering" target="_blank"&gt;hiring&lt;/a&gt; - if you want to be a part of Netflix Engineering Team, and are as intrigued about the company and the culture as I am - please let me know. Take a look at the &lt;a href="http://techblog.netflix.com/" target="_blank"&gt;Netflix Technology Blog&lt;/a&gt;, Netflix OSS repos - and drop me a line!  &lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/45657645064</link><guid>http://mpandit.tumblr.com/post/45657645064</guid><pubDate>Fri, 15 Mar 2013 21:00:00 -0400</pubDate><category>netflix</category><category>employment</category><category>technology</category><category>ign</category></item><item><title>On Thursday, 10/04/2012 : Evolving IGN’s API on Scala</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_maywypKaDs1qbee7fo1_250.gif"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;On Thursday, 10/04/2012 : Evolving IGN’s API on Scala&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/32336614199</link><guid>http://mpandit.tumblr.com/post/32336614199</guid><pubDate>Wed, 26 Sep 2012 13:37:37 -0400</pubDate></item><item><title>Happy Birthday to my daughter, Tanvi!</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_m1uh9qij4P1qbee7fo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Happy Birthday to my daughter, Tanvi!&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/20341868897</link><guid>http://mpandit.tumblr.com/post/20341868897</guid><pubDate>Mon, 02 Apr 2012 05:05:00 -0400</pubDate></item><item><title>Lone Hydrant at Yosemite View Lodge in Yosemite, CA</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_m10rsv3ajJ1qbee7fo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Lone Hydrant at Yosemite View Lodge in Yosemite, CA&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/19443384978</link><guid>http://mpandit.tumblr.com/post/19443384978</guid><pubDate>Sat, 17 Mar 2012 04:05:18 -0400</pubDate></item><item><title>Also: BD is the new SEO</title><description>&lt;a href="http://also.roybahat.com/post/19307918051/bd-is-the-new-seo"&gt;Also: BD is the new SEO&lt;/a&gt;: &lt;p&gt;&lt;a class="tumblr_blog" href="http://also.roybahat.com/post/19307918051/bd-is-the-new-seo" target="_blank"&gt;roybahat&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;

&lt;p class="MsoNormal"&gt;Or, the return of the human.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;There was (once upon a time, in the early 2000’s) a generation of Internet products built on the premise that if you mastered Google’s search rankings, you could grow traffic. Services like IMDb, About.com, Wikipedia, etc. provided value to their users, but were…&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://mpandit.tumblr.com/post/19413059847</link><guid>http://mpandit.tumblr.com/post/19413059847</guid><pubDate>Fri, 16 Mar 2012 17:20:21 -0400</pubDate></item><item><title>Anorm rules!</title><description>&lt;p&gt;Tried a few lines of code in Anorm within a PlayFramework 2.0 App. Very impressed.&lt;/p&gt;
&lt;pre&gt;      
DB.withConnection { implicit conn =&amp;gt;
  SQL("select * from person_accounts limit 0,20")
  .apply().foreach(x =&amp;gt; println(x[String]("account_type")))	
}
&lt;/pre&gt;
&lt;p&gt;How cool is that?&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/19388897990</link><guid>http://mpandit.tumblr.com/post/19388897990</guid><pubDate>Fri, 16 Mar 2012 02:48:00 -0400</pubDate><category>PlayFramework</category><category>anorm</category><category>scala</category></item><item><title>Keep your QA close...and your users closer</title><description>&lt;p&gt;Building great products is every engineer&amp;#8217;s passion, more so when the product is going to get millions of visits every day. At &lt;a href="http://www.ign.com" target="_blank"&gt;IGN&lt;/a&gt;, we build such products and work hard to make sure that we have quality, scale, predictability, and stability with our systems. &lt;/p&gt;
&lt;p&gt;One of such systems is our Social API, which gets about 20K requests a minute. Recently we started noticing issues with this API farm going down for no obvious reason. &lt;a href="http://www.newrelic.com" target="_blank"&gt;Newrelic&lt;/a&gt; showed a massive spike getting data from memcached, but thats about all we had. Memcached hit ratio kept dropping whenever this happened - all the way to zero. This started happening at a much greater frequency while we started debugging critical pieces of code that could potentially fail to scale. We started looking at traffic data to see if there is anything unusual. Nothing stood out of the ordinary.&lt;/p&gt;
&lt;p&gt;It was not until one fine morning when I received this from one of our top users, &lt;a href="http://people.ign.com/angrymrbungle" target="_blank"&gt;AngryMrBungle&lt;/a&gt; (read from bottom -&amp;gt; top)&lt;/p&gt;
&lt;p&gt;&lt;img align="middle" height="278" src="https://lh3.googleusercontent.com/-PzTZOeo7ZsM/T0ghIweg0MI/AAAAAAAAT0M/aoU1niUbr_0/s303/Screen+Shot+2012-02-24+at+2.20.51+PM.png" width="303"/&gt;&lt;/p&gt;
&lt;p&gt;This DM woke me up at 7AM, and I thought he could be talking about his browser crashing and not MyIGN. Later did I realize that he never mentioned a browser. Time to get more info.&lt;/p&gt;
&lt;p&gt;&lt;img align="middle" height="464" src="https://lh6.googleusercontent.com/--jVX4vcZe0Q/T0ghI9fANAI/AAAAAAAAT0Q/ubi7FP0j2Y8/s464/Screen+Shot+2012-02-24+at+2.22.10+PM.png" width="299"/&gt;&lt;/p&gt;
&lt;p&gt;That cleared up the entire situation. On my way to work I was able to link this problem to the exact classes and method that needed refactoring. We had a fix in place after a bit of whiteboarding.&lt;/p&gt;
&lt;p&gt;Testing was again a challenge, as I did not want to bother AngryMrBungle, but at the same time we could not figure out to test the site in the right circumstances, fast. Thats one of the challenges with testing &amp;#8220;scalability&amp;#8221; with the right mix of requests. I asked him if he could help us test this and he gladly agreed. We had the team with eyes pinned on NewRelic. Not a blip on NewRelic. In a few minutes I got a DM from him that he did not face any problems like he did earlier.&lt;/p&gt;
&lt;p&gt;&lt;img align="middle" height="284" src="https://lh4.googleusercontent.com/-EhtXl8pjW9g/T0ghJKn36-I/AAAAAAAAT0U/gTRcP6fh8Aw/s302/Screen+Shot+2012-02-24+at+2.31.42+PM.png" width="302"/&gt;&lt;/p&gt;
&lt;p&gt;This was good news for the team, and the refactored architecture will get rolled out to other API layers as well.&lt;/p&gt;
&lt;p&gt;In summary, it is very critical for consumer facing sites to be in constant touch with the users. The users are way more passionate than we as engineers think, and very helpful in charting the feature set they want. We use uservoice and it does not surprise me to see users write detailed feedback and requests, and telling us how we can make the U|X better. We are refactoring quite a bit of technology platforms at IGN and moving to a more API-based, Open Architecture on the back-end, and Widget-based on the front-end. The idea is for us to build a platform to scale for user-base and content growth, and the only way to do this better is to engage with our audience. We take pride in being on top of this, and I thought this incident was something worth mentioning in a blog. Between engaging with our users on &lt;a href="http://www.ign.com/boards" target="_blank"&gt;boards&lt;/a&gt;, &lt;a href="http://my.ign.com" target="_blank"&gt;MyIGN&lt;/a&gt; and twitter - &lt;a href="http://www.uservoice.com" target="_blank"&gt;UserVoice&lt;/a&gt; is something that helps us a lot with getting the pulse of the users, and pretty much have our product featureset &amp;#8220;direction&amp;#8221; on an auto-pilot. &lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll write a separate blog explaining the technical side of this &amp;#8220;scalability bug&amp;#8221; that AngryMrBungle helped uncover.&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/18212857052</link><guid>http://mpandit.tumblr.com/post/18212857052</guid><pubDate>Fri, 24 Feb 2012 18:15:00 -0500</pubDate><category>ign</category><category>engineering</category><category>myign</category><category>apis</category><category>memcached</category><category>newrelic</category><category>social</category><category>community</category></item><item><title>IGN Engineering launches code.ign.com</title><description>&lt;a href="http://code.ign.com"&gt;IGN Engineering launches code.ign.com&lt;/a&gt;</description><link>http://mpandit.tumblr.com/post/18207070271</link><guid>http://mpandit.tumblr.com/post/18207070271</guid><pubDate>Fri, 24 Feb 2012 16:42:00 -0500</pubDate></item><item><title>FML : Java how much I love thee..</title><description>&lt;pre&gt;private List&amp;lt;String&amp;gt; longList2StringList(List&amp;lt;Long&amp;gt; list){
    List&amp;lt;String&amp;gt; toReturn = new ArrayList&amp;lt;String&amp;gt;(list.size());
    for(Long l : list) toReturn.add(l.toString());
    return toReturn;
}
&lt;/pre&gt;
&lt;p&gt;Vs.&lt;/p&gt;
&lt;pre&gt;implicit def longList2StringList(x:List[Long]) 
       = x.map(_.toString)
&lt;/pre&gt;</description><link>http://mpandit.tumblr.com/post/18059827615</link><guid>http://mpandit.tumblr.com/post/18059827615</guid><pubDate>Wed, 22 Feb 2012 01:20:00 -0500</pubDate></item><item><title>Re-architecting how the activity streams work in IGN&amp;#8217;s social platform. Should be interesting...</title><description>&lt;p&gt;Re-architecting how the activity streams work in IGN&amp;#8217;s social platform. Should be interesting next few days. Challenges around push vs. pull, aggregation and sharding top the list for now.&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/17814600635</link><guid>http://mpandit.tumblr.com/post/17814600635</guid><pubDate>Sat, 18 Feb 2012 04:14:14 -0500</pubDate></item><item><title>February bloom in the backyard!</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lzbrh8xL5N1qbee7fo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;February bloom in the backyard!&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/17545361052</link><guid>http://mpandit.tumblr.com/post/17545361052</guid><pubDate>Mon, 13 Feb 2012 04:24:43 -0500</pubDate></item><item><title>Dandelion growing near my mailbox.</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_lyymo3n2kf1qbee7fo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Dandelion growing near my mailbox.&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/17145203136</link><guid>http://mpandit.tumblr.com/post/17145203136</guid><pubDate>Mon, 06 Feb 2012 02:12:03 -0500</pubDate></item><item><title>Tip-toeing node.js</title><description>&lt;p&gt;While writing a &lt;a href="http://code.google.com/p/pubsubhubbub/" target="_blank"&gt;pubsubhubbub&lt;/a&gt; implementation at IGN (which we&amp;#8217;re going to open source!), I decided to write the publisher and the subscribers (callbacks) in node.js. One big reason was that this seemed to be an area where node would really shine, and I was sick of writing Scala for days on end (the &amp;#8220;hub&amp;#8221; is in Scala) and wanted a break.&lt;/p&gt;
&lt;p&gt;What better way to mix it up with a little node.js. I find Javascript pretty cute (having dealt with it as JScript in the 90s and giving up!) and intuitive. I do not (nor will I) have the chops to dish out a killer front end in JS, but server side JS is a match made in heaven. I was able to roll out a simpleton producer and the callback handlers in a few hours and could not have been happier. Keep an eye on &lt;a href="http://www.github.com/ign" target="_blank"&gt;IGN&amp;#8217;s github repo&lt;/a&gt;, as thats where the hub will be published.&lt;/p&gt;
&lt;p&gt;Named &lt;em&gt;Orinoco&lt;/em&gt;, it is destined to solve quite a few problems that a lot of systems face, mostly around polling and batch jobs.&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/16857878931</link><guid>http://mpandit.tumblr.com/post/16857878931</guid><pubDate>Wed, 01 Feb 2012 04:06:00 -0500</pubDate><category>node.js</category><category>scala</category><category>orinoco</category><category>pubsubhubbub</category></item><item><title>Scala, Maven and Tests..</title><description>&lt;p&gt;I moved my sbt project to maven recently and discovered that none of my tests were getting detected when I ran mvn test. &lt;/p&gt;
&lt;p&gt;After looking around a bit, it was a missing annotation on the test class which fixed the problem. I am sure you can google around and its right there, but thought of making a note here as well.&lt;/p&gt;
&lt;pre&gt;package com.ign.orinoco.test
import org.scalatest.matchers.ShouldMatchers
import org.scalatest.FlatSpec
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner

@RunWith(classOf[JUnitRunner])
class OrinocoTest extends FlatSpec with ShouldMatchers{

  it should  "make sure that 2 ones make a 2" in {
    1+1 should equal (2)
  }
 }
&lt;/pre&gt;

&lt;p class="p1"&gt;And this gets detected, and run just fine!&lt;/p&gt;
&lt;pre&gt;-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.ign.orinoco.test.OrinocoTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.559 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
&lt;/pre&gt;</description><link>http://mpandit.tumblr.com/post/16279901824</link><guid>http://mpandit.tumblr.com/post/16279901824</guid><pubDate>Sun, 22 Jan 2012 03:18:36 -0500</pubDate><category>scalatest</category><category>scala</category><category>maven</category></item><item><title>Play!Framework 2.0 Beta : Not happy</title><description>&lt;p&gt;Being a &lt;a href="http://www.slideshare.net/lobster1234/silicon-valley-code-camp-2011-play-as-you-rest" target="_blank"&gt;huge fan of PlayFramework&lt;/a&gt;, I decided to try the &lt;a href="http://playframework.org/2.0" target="_blank"&gt;2.0 beta&lt;/a&gt; today. However, the good ol&amp;#8217; SBT came to haunt me again. I feel really bad for having to say that this is not something I expected from Play!. They should have stayed with the Python tools they had for build management rather than picking such a platform and version dependent tooling system. Or better, they should have bundled a version of SBT that actually works with the distribution. My first few minutes with Play! 2.0 Beta were nowhere close to the first few with Play! Java a few years ago. I was expecting to download, eclipsify and run a sample app in under 5 minutes, just like with Play! 1.2.3. What a disappointment.&lt;/p&gt;
&lt;pre&gt;mpandit-mbp:tmp mpandit$ ~/software/play/play new myapp
       _            _ 
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/ 
             
play! 2.0-beta, &lt;a href="http://www.playframework.org" target="_blank"&gt;http://www.playframework.org&lt;/a&gt;
The new application will be created in /private/tmp/myapp
What is the application name? 
&amp;gt; myapp
Which template do you want to use for this new application? 
  1 - Create a simple Scala application
  2 - Create a simple Java application
  3 - Create an empty project
&amp;gt; 1
OK, application myapp is created.
Have fun!
mpandit-mbp:tmp mpandit$ cd myapp/
mpandit-mbp:myapp mpandit$ ~/software/play/play eclipse
[info] Loading global plugins from /Users/mpandit/.sbt/plugins
[info] Updating {file:/Users/mpandit/.sbt/plugins/}default-31fbe2...
[warn] 	module not found: com.typesafe.sbteclipse#sbteclipse-plugin;2.0.0-M3
[warn] ==== typesafe-ivy-releases: tried
[warn]   &lt;a href="http://repo.typesafe.com/typesafe/ivy-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.9.1/sbt_0.11.0/2.0.0-M3/ivys/ivy.xml" target="_blank"&gt;http://repo.typesafe.com/typesafe/ivy-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.9.1/sbt_0.11.0/2.0.0-M3/ivys/ivy.xml&lt;/a&gt;
[warn]   -- artifact com.typesafe.sbteclipse#sbteclipse-plugin;2.0.0-M3!sbteclipse-plugin.jar:
[warn]   &lt;a href="http://repo.typesafe.com/typesafe/ivy-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.9.1/sbt_0.11.0/2.0.0-M3/jars/sbteclipse-plugin.jar" target="_blank"&gt;http://repo.typesafe.com/typesafe/ivy-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.9.1/sbt_0.11.0/2.0.0-M3/jars/sbteclipse-plugin.jar&lt;/a&gt;
[warn] ==== local: tried
[warn]   /Users/mpandit/software/play/framework/../repository/local/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.9.1/sbt_0.11.0/2.0.0-M3/ivys/ivy.xml
[warn]   -- artifact com.typesafe.sbteclipse#sbteclipse-plugin;2.0.0-M3!sbteclipse-plugin.jar:
[warn]   /Users/mpandit/software/play/framework/../repository/local/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.9.1/sbt_0.11.0/2.0.0-M3/jars/sbteclipse-plugin.jar
[warn] ==== public: tried
[warn]   &lt;a href="http://repo1.maven.org/maven2/com/typesafe/sbteclipse/sbteclipse-plugin_2.9.1_0.11.0/2.0.0-M3/sbteclipse-plugin-2.0.0-M3.pom" target="_blank"&gt;http://repo1.maven.org/maven2/com/typesafe/sbteclipse/sbteclipse-plugin_2.9.1_0.11.0/2.0.0-M3/sbteclipse-plugin-2.0.0-M3.pom&lt;/a&gt;
[warn]   -- artifact com.typesafe.sbteclipse#sbteclipse-plugin;2.0.0-M3!sbteclipse-plugin.jar:
[warn]   &lt;a href="http://repo1.maven.org/maven2/com/typesafe/sbteclipse/sbteclipse-plugin_2.9.1_0.11.0/2.0.0-M3/sbteclipse-plugin-2.0.0-M3.jar" target="_blank"&gt;http://repo1.maven.org/maven2/com/typesafe/sbteclipse/sbteclipse-plugin_2.9.1_0.11.0/2.0.0-M3/sbteclipse-plugin-2.0.0-M3.jar&lt;/a&gt;
[warn] ==== Scala-Tools Maven2 Repository: tried
[warn]   &lt;a href="http://scala-tools.org/repo-releases/com/typesafe/sbteclipse/sbteclipse-plugin_2.9.1_0.11.0/2.0.0-M3/sbteclipse-plugin-2.0.0-M3.pom" target="_blank"&gt;http://scala-tools.org/repo-releases/com/typesafe/sbteclipse/sbteclipse-plugin_2.9.1_0.11.0/2.0.0-M3/sbteclipse-plugin-2.0.0-M3.pom&lt;/a&gt;
[warn]   -- artifact com.typesafe.sbteclipse#sbteclipse-plugin;2.0.0-M3!sbteclipse-plugin.jar:
[warn]   &lt;a href="http://scala-tools.org/repo-releases/com/typesafe/sbteclipse/sbteclipse-plugin_2.9.1_0.11.0/2.0.0-M3/sbteclipse-plugin-2.0.0-M3.jar" target="_blank"&gt;http://scala-tools.org/repo-releases/com/typesafe/sbteclipse/sbteclipse-plugin_2.9.1_0.11.0/2.0.0-M3/sbteclipse-plugin-2.0.0-M3.jar&lt;/a&gt;
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 	::          UNRESOLVED DEPENDENCIES         ::
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 	:: com.typesafe.sbteclipse#sbteclipse-plugin;2.0.0-M3: not found
[warn] 	::::::::::::::::::::::::::::::::::::::::::::::
[warn] 
[warn] 	Note: Some unresolved dependencies have extra attributes.  Check that these dependencies exist with the requested attributes.
[warn] 		com.typesafe.sbteclipse:sbteclipse-plugin:2.0.0-M3 (sbtVersion=0.11.0, scalaVersion=2.9.1)
[warn] 
[error] {file:/Users/mpandit/.sbt/plugins/}default-31fbe2/*:update: sbt.ResolveException: unresolved dependency: com.typesafe.sbteclipse#sbteclipse-plugin;2.0.0-M3: not found
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? q&lt;/pre&gt;
&lt;p&gt;Compare this mess to Play! 1.2.3. As easy as it can get, which is why I am a huge fan of Play!&lt;/p&gt;
&lt;pre&gt;mpandit-mbp:tmp mpandit$ ~/software/play-1.2.3/play new myapp
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.3, &lt;a href="http://www.playframework.org" target="_blank"&gt;http://www.playframework.org&lt;/a&gt;
~
~ The new application will be created in /private/tmp/myapp
~ What is the application name? [myapp] 
~
~ OK, the application is created.
~ Start it with : play run myapp
~ Have fun!
~
mpandit-mbp:tmp mpandit$ cd myapp
mpandit-mbp:myapp mpandit$ ~/software/play-1.2.3/play eclipsify
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.3, &lt;a href="http://www.playframework.org" target="_blank"&gt;http://www.playframework.org&lt;/a&gt;
~
~ OK, the application is ready for eclipse
~ Use File/Import/General/Existing project to import /private/tmp/myapp into eclipse
~
~ Use eclipsify again when you want to update eclipse configuration files.
~ However, it's often better to delete and re-import the project into your workspace since eclipse keeps dirty caches...
~
mpandit-mbp:myapp mpandit$ 

&lt;/pre&gt;
&lt;p&gt;Edit: After following the instructions &lt;a href="https://github.com/skyluc/SandBox/wiki/play-2.0-in-scala-ide-2.0" target="_blank"&gt;here&lt;/a&gt;, I was able to generate an Eclipse project. I will keep blogging about my experiences with Play! 2.0 beta. For now this sure has not been a breeze and playful as Play! &amp;lt; 2.0 was.&lt;/p&gt;

&lt;pre&gt;mpandit-mbp:myapp mpandit$ rm -rf ~/.sbt
mpandit-mbp:myapp mpandit$ rm -rf ~/.sbt.cache.lock 
mpandit-mbp:myapp mpandit$ pwd
/tmp/myapp
mpandit-mbp:myapp mpandit$ ~/software/play/play 
[info] Loading project definition from /private/tmp/myapp/project
[info] Updating {file:/private/tmp/myapp/project/}default-d21f0b...
[info] Done updating.
[info] Compiling 1 Scala source to /private/tmp/myapp/project/target/scala-2.9.1/sbt-0.11.0/classes...
[info] Set current project to myapp (in build file:/private/tmp/myapp/)
       _            _ 
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/ 
             
play! 2.0-beta, &lt;a href="http://www.playframework.org" target="_blank"&gt;http://www.playframework.org&lt;/a&gt;

&amp;gt; Type "help" or "license" for more information.
&amp;gt; Type "exit" or use Ctrl+D to leave this console.
[myapp] $ eclipse
[info] About to create an Eclipse project for you.
[info] Please hang on, because it might be necessary to perform one or more updates and this might take some time ...
[info] Updating {file:/private/tmp/myapp/}myapp...
[info] Done updating.
[info] Successfully created Eclipse project files.

&lt;/pre&gt;</description><link>http://mpandit.tumblr.com/post/15748611786</link><guid>http://mpandit.tumblr.com/post/15748611786</guid><pubDate>Thu, 12 Jan 2012 19:47:00 -0500</pubDate><category>playframework</category><category>scala</category><category>programming</category><category>code</category><category>sbt</category><category>eclipse</category><category>java</category></item><item><title>Evolving Scala Echosystem</title><description>&lt;p&gt;After spending a few months with Scala, I am at a point where I&amp;#8217;ve found quite a bit of tidbits on digging myself in a hole, and managing to get out of it. So far I&amp;#8217;ve found that sbt is a pain in the ass, maven is not as bad as its set out to be, salat is a decent object (well case class) to DBObject mapper, and &lt;a href="http://liftweb.net" target="_blank"&gt;lift&lt;/a&gt; is not that scary to tippie-toe into. &lt;/p&gt;
&lt;p&gt;IGN&amp;#8217;s Video API was the 1st service to roll onto the new stack. We call it v3 (&lt;a href="http://corp.ign.com/engineering/index.html" target="_blank"&gt;apply for a job at IGN Engineering&lt;/a&gt; and I&amp;#8217;d be more than happy to go over v1 and v2, which is a very interesting story I promise).&lt;/p&gt;
&lt;p&gt;The new stack has:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.scalatra.org/" target="_blank"&gt;Scalatra&lt;/a&gt; for the services endpoints&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mongodb.org/" target="_blank"&gt;MongoDB&lt;/a&gt; for persistance&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.elasticsearch.org/" target="_blank"&gt;Elasticsearch&lt;/a&gt; for..well, search&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/novus/salat" target="_blank"&gt;Salat&lt;/a&gt; for Scala &amp;lt;-&amp;gt; DBObject transformation&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/harrah/xsbt" target="_blank"&gt;sbt&lt;/a&gt; as the build system&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;We use &lt;a href="http://www.newrelic.com" target="_blank"&gt;Newrelic&lt;/a&gt; to monitor the performance, and use memcached as our caching layer. The numbers were *very* impressive compared to where we ported the Video services from, and it was a good proof as well as a vote of confidence. Soon enough, we started to roll out this new stack to the new services, as well as porting some old ones to it.&lt;/p&gt;
&lt;p&gt;Along the way, we found that dealing with update-merges and juggling around DBObjects was turning out to be bug-prone and labor intensive. The solution? &lt;a href="http://www.assembla.com/spaces/liftweb/wiki/lift-mongodb-record" target="_blank"&gt;lift-mongodb-record&lt;/a&gt;. No more case classes, and easy transformation to/from JSON to top it. The next set of services are using this when it comes to talking to MongoDB.&lt;/p&gt;
&lt;p&gt;One pain in the ass was sbt, which, when we tried to upgrade, we ran into issues with Idea plugin, and the jetty-web plugin incompatibility.&lt;/p&gt;
&lt;pre&gt;mpandit-mbp:video-api mpandit$ sbt gen-idea
[info] Set current project to default (in build file:/Users/mpandit/.sbt/plugins/)
[info] Set current project to default (in build file:/Users/mpandit/work/git/video-api/project/plugins/)
[info] Set current project to default (in build file:/Users/mpandit/work/git/video-api/)
[info] Trying to create an Idea module default
[error] java.lang.NoSuchMethodError: sbt.Attributed.get(Lsbt/AttributeKey;)Lscala/Option;
[error] Use 'last' for the full log.mpandit-mbp:video-api mpandit$ 
&lt;/pre&gt;
&lt;p&gt;The hacks to fix this (per google search) were too time consuming after many failed attempts and frankly we had to move on - we like to keep things simple, and since we were not writing custom sbt plugins, we&amp;#8217;d rather stick to what works. At this point we decided to brush the dust off maven, and surprise surprise - it worked like a charm. We plan to stick with Maven for now, as we do not touch configuration that often anyway. Also, the &lt;a href="http://scala-ide.org/" target="_blank"&gt;ScalaIDE&lt;/a&gt; 2.0 from Typesafe made Scala development in Eclipse fairly easy (compared to the super buggy earlier releases) and I was able to get back to my favorite IDE for my newfound favorite programming language. &lt;/p&gt;
&lt;p&gt;Its going great so far, and we&amp;#8217;re very happy with the progress along the new stack. Needless to say there is a lot more we can improve on, but thats all the part of learning! I am sure the stack will change going forward as we learn more with pair programming and tech-talks. We are not wrangling implicits and other advanced (academic? cryptic?) scala capabilities yet, but given the progress the team has made so far, its not too far on the horizon.&lt;/p&gt;</description><link>http://mpandit.tumblr.com/post/15717750547</link><guid>http://mpandit.tumblr.com/post/15717750547</guid><pubDate>Thu, 12 Jan 2012 05:08:00 -0500</pubDate><category>scala</category><category>ign</category><category>engineering</category><category>programming</category><category>code</category><category>lift</category><category>sbt</category><category>maven</category><category>elasticsearch</category><category>mongodb</category></item></channel></rss>
