Blog

Being a Scout

As a quiet CTO, I often don’t initiate conversations with potential partners, advisors, or investors but that doesn’t mean I can’t help our CEO, Sean.

For example, before Dealflicks was a part of 500 startups, we hustled around unsexy.co. We pitched as many batch alumni as we could. Then when walking out of an auditorium we literally stumbled upon some dude coding on the floor. That dude turned out to be the CTO of livingsocial, Aaron Batalion. But neither Sean or I realized who he was at the time. Like a scout, I surreptitiously looked at his name badge. I muttered a quiet suggestion to Sean and before I knew it, Sean marched up to Aaron and introduced himself. Within a few minutes, Sean had received some great feedback about our business and planned on having a call with Aaron ASAP. While I can’t say the Aaron connection got us into 500 Startups, the fact that he was a 500 Startups mentor we could name helped as significantly. I’ll write about how I think we got into 500 startups in a future post.

My scouting skillz also came into play at a theater convention. Knowing who was a decision maker was key due to the limited time the convention allowed for networking. Sean and our SVP of Sales, Kevin, were often so focused on pitching they had little time to scout who they were talking to. I took it upon myself to mention to Sean and Kevin if some head hauncho at a theater chain was strolling by our trade booth. I would also regularly intercept that decision maker and quickly pass them to Sean or Kevin. This strategy ultimately helped us gain a footing in the Texas region.

Scouting doesn’t just take place at conferences. Kevin and I regularly research and qualify investor leads for Sean. Anyone who can help us bridge Hollywood and Silicon Valley is a unicorn, so we all need to keep our eyes peeled. (If you happen to be a unicorn, please email us at founders@dealflicks.com).

I hope this post illustrates that even if you’re a quiet founder you have a lot to contribute. Play to your strengths. For me, that’s being observant at conventions and researching as much as I can.

Sublime Code Intel Ctrl Click on Mac OSX 10.7.4

The default mouse mapping is alt+click for activating the "Jump to Symbol Definition". This didn't to seem to work for me, so I changed it to ctrl+click based on the recommendation in this issue

Here are the steps I took.

NOTE: I'm assuming SublimeCodeIntel is already installed via https://github.com/Kronuz/SublimeCodeIntel )

  • From the Menu bar go to Sublime Text 2 > Preferences > Package Settings > SublimeCodeIntel > Mouse Bindings - Default
  • Change to
    { "button": "button1", "modifiers": ["ctrl"], "command": "goto_python_definition", "press_command": "drag_select" }
    
  • Save the file
  • Restart Sublime Text 2

Now if you hold the ctrl key and the double click a symbol, it should jump to the definition.

Integrating Swiftype and Jekyll

Holey Guacamole, I have search on my site and I don't need my own server!?

Yesterday, I discovered an amazing service called Swiftype that enables search for any site.

My site is entirely hosted on Github Pages which means I don't need to worry about maintaining a server. Unfortunately, that makes implementing features like search very difficult.

But not anymore!

Swiftype is integrated entirely on the client-side.

About 10 minutes after reading about them on Hacker News I had search working on my personal site.

The guys over at Swiftype really make it easy to integrate, but here's how I integrated it with Jekyll just as reference to those trying to do the same.

Step One: Sign-up for Swiftype

  1. Head on over to swiftype.com and register.

  2. Follow the steps outlined in the demo video below. Check out Step Two once you've got all the pages you want indexed in Swiftype.

Step Two: Setup the Main Layout

Since every page on my site uses the layout default.html, I put the bulk of the Swiftype code here.

  1. To create my search box, I added the following form to my bootstrap navbar in default.html.

    1 <form>
    2 	<input type="text" id="st-search-input" class="st-search-input navbar-search"/>
    3 </form>
    

    Note: I added the additional class "navbar-search" for bootstrap styling.

  2. I then added the Swiftype javascript.

    I chose to have Swiftype show results on a separate page, which means that I needed to do a check in default.html to load slightly different javascript when rendering for the results page.

     1 {% if page.url == '/results/index.html' %}
     2 
     3 <!-- Begin Results Swifttype -->
     4 <script type="text/javascript">
     5   var Swiftype = window.Swiftype || {};
     6   (function() {
     7     Swiftype.key = 'ENGINE_KEY';
     8     Swiftype.inputElement = '#st-search-input';
     9     Swiftype.resultContainingElement = '#st-results-container';
    10     Swiftype.attachElement = '#st-search-input';
    11     Swiftype.renderStyle = "inline";
    12 
    13     var script = document.createElement('script');
    14     script.type = 'text/javascript';
    15     script.async = true;
    16     script.src = "//swiftype.com/embed.js";
    17     var entry = document.getElementsByTagName('script')[0];
    18     entry.parentNode.insertBefore(script, entry);
    19   }());
    20 </script>
    21 <!-- End Results Swifttype -->
    22 
    23 {% else %}
    24 
    25 <!-- Begin Swifttype -->
    26 <script type="text/javascript">
    27   var Swiftype = window.Swiftype || {};
    28   (function() {
    29     Swiftype.key = 'ENGINE_KEY';
    30     Swiftype.inputElement = '#st-search-input';
    31     Swiftype.resultContainingElement = '#st-results-container';
    32     Swiftype.attachElement = '#st-search-input';
    33     Swiftype.renderStyle = "new_page";
    34     Swiftype.resultPageURL = "/results/";
    35 
    36     var script = document.createElement('script');
    37     script.type = 'text/javascript';
    38     script.async = true;
    39     script.src = "//swiftype.com/embed.js";
    40     var entry = document.getElementsByTagName('script')[0];
    41     entry.parentNode.insertBefore(script, entry);
    42   }());
    43 </script>
    44 <!-- End Swifttype -->
    45 
    46 {% endif %}
    
  3. Be sure to replace ENGINE_KEY with your actual engine key. This can be found in the Swiftype console.

Step Three: Setup the Results Page

  1. I created the following file for my results page.

    1 /results/index.html 
    

    You can change the name of this file to whatever you want. If you do so, be sure to update Swiftype.resultPageURL in the javascript you included in your main layout, aka, default.html.

    1 Swiftype.resultPageURL = "/results/";
    

    Also, make sure to change the string in the liquid if statement.

    1 {% if page.url == '/results/index.html' %}
    
  2. Finally in /results/index.html, I created the container to load the results onto my results page.

    1 ---
    2 layout: default
    3 title: Results
    4 ---
    5 
    6 <div id="st-results-container"></div>
    

In Conclusion

I hope this post will make it easier to integrate Swiftype with Jekyll.

Seriously, if you've been waiting to integrate search into your site, now is the time. It doesn't get any easier than Swiftype.

A New Approach

To get something you never had, you have to do something you never did.

Unknown

Impact.

Whether it improves the lives of many or a few, I want to make an impact in the work I do.

When I started out in startups, I was shortsighted like many other entrepreneurs. I jumped on the first idea that seemed plausible. I wanted to get rich as fast as a miner during the gold rush.

After my first go around, I realized this get rich quick mentality doesn't work. I took a step back and focused on learning from the people around me who were where I wanted to be. Time and time again, I started to hear work on your passion.

I believe I figured out what my passion is.

It's not to get rich, it's to make an impact. I want to bring an idea that has yet to be seen to fruition. Perhaps this is the only reason anyone should be an entrepreneur. (I think Dustin Moskovitz and Phil Libin agree.)

But to bring an idea to fruition I need to change my approach.

Previously, my approach to startups was talking to lots of people and trying to inspire them to work with me. But today, my new approach is to build the prototypes myself and inspire others by showing them my awesome work.

I relish the opportunity to return to my hermit ways, something I haven't been able to do since I was in 3rd grade building K-NEX in my room for hours.

Installing Xcode 4.3 with Command Line Tools, Need Mac OS X 10.7.3

  1. Update to Mac OS X 10.7.3

  2. Download Xcode 4.3 from http://developer.apple.com/downloads

  3. Open xcode_4.3_for_lion.dmg

  4. Drag xcode icon into applications directory.

  5. Double-click xcode icon in applications directory.

  6. Agree to whatever Apple tells you, yadda, yadda. 

  7. Choose "move to trash"  for xcode 4.2 and anything else listed.

  8. Open xcode

  9. Go to preferences > Downloads

  10. Find "Command Line Tools" in the list and click install (now you get the awesomes stuff described here http://kennethreitz.com/xcode-gcc-and-homebrew.html)

  11. In Terminal, run the following to fix any 3rd party stuff that needs /Developer
    sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
    

Teach Kids to Code

They need to teach kids how to code like they teach kids math. It's just too important. 

Pin It Bookmarklet

Pinterest's bookmarklet only allows you to pin photos that are within an img tag. This means photos that are included as CSS backgrounds will not be viewable for pinning.  

Every day you discover ... a new problem or a new opportunity to fit these things together a little differently.

Many companies get the disease of thinking that a really great idea is 90 percent of the work. And if you just tell all these other people here’s this great idea then of course they can go off and make it happen. And the problem with that is that there’s just a tremendous amount of craftsmanship in between a great idea and a great product. Designing a product is keeping five thousand things in your brain and fitting them all together in new and different ways to get what you want. And every day you discover something new that is a new problem or a new opportunity to fit these things together a little differently.

Steve Jobs

Why is programming so wordy?

Why is programming so wordy?

My Girlfriend

Stubborn on Vision, Flexible on Ideas

It does fit into my view. Our first shareholder letter, in 1997, was entitled, “It’s all about the long term.” If everything you do needs to work on a three-year time horizon, then you’re competing against a lot of people. But if you’re willing to invest on a seven-year time horizon, you’re now competing against a fraction of those people, because very few companies are willing to do that. Just by lengthening the time horizon, you can engage in endeavors that you could never otherwise pursue. At Amazon we like things to work in five to seven years. We’re willing to plant seeds, let them grow—and we’re very stubborn. We say we’re stubborn on vision and flexible on details.

Jeff Bezos

http://www.wired.com/magazine/2011/11/ff_bezos/all/1

Square Cubed

Square is awesome.

Here's why.

  • Square is the cheapest POS out there. Merchant's can process credit cards easily and without having to deal with the headaches of merchant accounts. This makes Square the easy POS decision when opening up a small business.
  • Square wraps credit cards. Instead of trying to reinvent the way merchants and consumers can transact, square leverages existing payment methods. This limits the effect the credit card lobbyists have on changing the laws that affect their core business.
  • Square is the ultimate small business CRM. Now a business can manage all his customers in one place. The growing set of data becomes more data that a business can utilize. As square grows, the amount of analytical tools Square can upsell to merchants will increase.
  • Square has an awesome API waiting to happen. I'm not talking about some payment taking API that other app developers can utitlize. I'm talking about all the metadata square is gathering. Square's POS is a means to collecting the inventory of a brick and mortar business. For instance, Square now knows the entire menu of your favorite restaurant. Now, when that restaurant wants to do online ordering, they don't have to reinput their menu. It's just there. They already inputted it for Square.

Can't wait till they IPO...

Better Budgeting

Import transactions from Mint. Based on budget, show sliding 30 day window of how much I can actually spend safely.

Managing Budgets

Sliding window of transactions. Better management than Mint budgets.

Visual OOP

Use graphs to model how methods and objects relate to one another.

Software is Music

Write software that you would want just like a musican writes music he would want to listen to.

API Smash

Why can't we smash together API's like legos? Why is it so hard to connect the pieces to produce something simple and profound?

Upgrading Openssl on Mac OS X 10.6.6 for Node 0.4.1

I recently ran into the following error when trying to use connect for node:

node-crypto : Unknown message digest sha256

The problem was that my machine's openssl version did not support sha256.

The solution? Upgrade openssl and then recompile node.



Upgrading Openssl

  1. Download and unzip openssl-1.0.0d.tar.gz
  2. cd into the freshly unzipped folder

  3. configure for installation by running the following command:

    ./config
    

    (by default openssl is installed into /usr/local/ssl)

  4. setup the make file by running the following command:

    make
    

  5. install by running the following command:

    sudo make install 
    

  6. add the following to your PATH environment variable:

    /usr/local/ssl/bin 
    



Recompiling Node:

  1. I use the package manager homebrew so to uninstall node I simply needed to remove the folder containing the version of node I wanted to recompile. I ran the following command:

    rm -rf /usr/local/Cellar/node/0.4.1
    

  2. Then I simply reinstalled via brew:

    brew install node
    

Guide for Installing Box2D on Mac OS X

Here's how I setup Box2D on Mac OS X (Snow Leopard 10.6.6)

  1. I'm not sure if this is required, but I already had XCode v 4.0+ installed.

  2. Install CMake cmake-2.8.4-Darwin-universal.dmg

  3. Step 2: Download Box2D Box2D_v2.1.2.zip and unzip

  4. open CMake.

    Fill in the "Where is the source code:" input with the path to the Box2D folder.

    Fill in the "Where to build the binaries:" input with the path to Box2D/Build folder

    Then click 'Generate'

    This will create all the Makefiles

  5. Open terminal and cd into the Box2D/Build folder.

  6. Run the following command:

    	cmake -DBOX2D_INSTALL=ON -DBOX2D_BUILD_SHARED=ON ..
    	
    

  7. Run the following command:

    	make 
    	
    

  8. Run the following command:

    	sudo make install
    	
    

  9. That's it!

  10. (optional) You can checkout the demo programs by changing into the Box2D/Build/Testbed.

  11. (optional) Run the following command:

     
    	./Testbed 
    	
    

MongoDB is Web Scale

 

Java changed my life

It's hard to believe that there is a programming language that changed my life, but Java did. Perhaps the language itself did not but the class that first exposed me to Java, COMPSCI 100, did.

I always thought I would be a mechanical engineer or architect.  God bless my loving sister who bought me my first K-NEX set on my seventh birthday.  I built that K-NEX airplane in less than an hour and wanted more.  Eventually I would build structures much taller than me and would build contraptions such as a ball machine that would switch the light off in my room.  In high school I took this passion further and became heavily involved in the robotics club.  My primary role was in designing and building the various mechanical appendages of our robot. But my attentive mother, new that she needed to expose me to more.

In the seventh grade I attended the California State Summer School for Mathematics and Science, COSMOS.  There I befriended Kevin and became intrigued by his constant ramblings on video cards and overclocking.  He was a gamer and the best gamers were the ones who built and modified their computers for optimal performance.  I bothered him like a little brother to teach me about computers.  And when the summer program ended I told my mom I wanted to build one.  

My resourceful mother found a church parishioner who had a computer repair shop and convinced him to teach me how to build computers.  On a Saturday, I built my first computer and installed my first OS, Windows 2000 Professional.  I walked through the process of screwing in the motherboard, connecting the various drives, and setting the proper jumpers.  I stepped through the BIOS to tell it to boot off the CD-ROM and inserted the Windows 2000 disk.  But this was not the magical moment that changed my life.  In fact, I realized quickly soon after that even though I could build computers and set up networks, I did not enjoy it.  So what else was there to do with computers?

In eighth grade, my mother convinced the local high school to let me take AP Computer Science.   AP Computer Science was my "Hello, World." into programming.  I was as interested in it as I was in music and tennis. They were just activities I did, but my passion was still in building mechanical gadgets.  

In the tenth grade, my mother enrolled me at the Jisan Research Institute.  There I got more exposure to programming by building various genetic algorithms in C.  This was the first time I saw the cleverness of algorithms and was involved in larger scale software projects. My fellow researchers at Jisan were brilliant.  In fact, I was intimated by those there who could hack into your computer and send you random messages. Some friends there were already being paid top dollar to work for web consulting companies.  In addition, there were other programming geniuses at my high school too.  One friend in particular ran a web hosting company, won various programming competitions, and later went on to receive a Microsoft scholarship. How could I ever compare to these guys?  

When I finally entered college, I was going to study biomedical engineering.  I wanted to build nano-robots to cure diseases.  The more I researched nano-robotics, the more I realized how much I needed to learn about materials and electrical engineering.  I then decided to double major in electrical engineering and one of the requisite courses was COMPSCI 100.

COMPSCI 100 was the first class where I attended every lecture (sorry Mom).  I could not resist the entertainment of Owen Astrachan dancing around the room as he described tree traversal.  Solving the problem sets was fun because they required real ingenuity.  I loved learning about Big-O notation. I loved algorithms.  And with Eclipse it was easy to program, intellisense made it easy to remember the various methods.  The Java APIs made it easy to utilize many of the data structures we had learned about.  Everything just made sense.  

With engineering you begin with a problem, you design a solution, you build it, you test it, and iterate until the problem is solved.  With software engineering, the fast development time makes it that much more rewarding.  There's, for the most part, instant gratification.  And even bigger projects can be broken down into discrete tasks that have immediate results. 

Software engineering, to me, is the ideal form of engineering.  It has given me the ability to explore my ideas to solving big ideas.  And it's not a matter of being the best at software engineering, it's about solving problems I find interesting and fun. For that I am thankful for taking COMPSCI100 and for Java for opening that door for me.

Visual Menus

 

Introduction

One of the coolest things I ever built at Fooala was visual menus.  

Our motivation for building visual menus was to provide more restaurant content quickly.  Entering menus is tedious, and we felt it was only beneficial if the restaurant happened to also accept online orders through our platform.  With visual menus, we simply have to scan, straighten, crop, and then upload the image.  

In addition, diners looking to find a restaurant can quickly scan through visual menus.  Not only do they get to see what food is served, but they also get a feel for the gestalt of the restaurant based on the menu's design.

Technology

I wanted to do something more than simply scanning in an image of the menu.  Luckily, Microsoft released a javascript library of their deep zoom imaging technology, Seadragon. All I needed to do was create image tiles at various zoom levels. 

First, I had to figure out how to upload the high resolution images.  Since the image files are at 600DPI, the resulting files sizes are sometimes 100MB+.  I used the s3-swf-upload-plugin by GreenAsJade. The plugin uses a Flash widget to upload directly to S3 from the client's browser instead of via the application server  like thoughtbot's Paperclip.  (Since building visual tools, an improved s3-swf-upload-plugin is available from nathancolgate.)

Once the high resolution image is uploaded, a delayed job is spawned that slices the image into image tiles at various zoom levels.  The script is largely based on a script from the openzoom project. I modified the script to also apply a watermark.

The resulting image tiles are stored on S3 and served through their content distribution network, Cloudfront.  

A collection of deep zoom images defines a visual menu.  Each deep zoom image tries to capture what it is like opening the menu one page at a time.  The user interface I built, has a thumbnail carousel that allows for easy switching between deep zoom images.  The widget is then served through an iFrame on our publisher widget.

iPhone Enhances Everyday Learning

When I read, I always stop when I come across a word or concept foreign to me.  I dutifully research the unknown idea.  If I don't then I might as well not be reading. 

Notes I want to take while reading can be burdensome, too.  But if I don't have something to remind me of what I learned, then I might as well not be reading.

This is where the iPhone has been a big help.  I can quickly Google a word I don't know and take a photo of some sentence worth remembering.  I don't need to reposition myself just to use my laptop or to jot down a note. I can do all my auxiliary reading tasks while remaining in the same reading position!

So now, reading is more enjoyable and less tedious.  

Obviously researching and annotating are not limited to books.  Now, whenever I have a need to satisfy my curiosity, my iPhone is at my fingertips waiting to help me.  

The iPhone has truly helped enhance everyday learning.  

But the iPhone is just the beginning of what ubiquitous computing can do.

Soon our curiosities will be answered automatically when we come across a foreign idea.  The act of being confused will have a certain electromagnetic signature in our brains which our devices can detect.  From there, our devices will sense what we are experiencing, research those things we may not understand, and push the result to our augmented reality displays

5 Things I Wish I Knew Before Applying to Colleges

5. Make yourself unique.

School's like their student population to be well-rounded, not one student to be well-rounded. They want each student to be a master of one. Think about it, if a school had a bunch of students that were each a jack of all trades, then the school would remain average. No individual student would excel. What they want is one student who is a grandmaster at chess and another who is a published author. Each excels in a particular area making the school, as a whole, above average.

Try to find something with national exposure that you can really excel at and work your hardest to be the best at it. Even if you are not the best, you will learn so much about yourself that your experiences will make you unique.

I had a friend in high school who was really good at programming. Even though his grades were not the best, many schools wanted to recruit him. He even went on to receive a Microsoft scholarship.

4. Persistence

Nothing in the world can take the place of persistence. Talent will not; nothing is more common than unsuccessful men with talent. Genius will not; unrewarded genius is almost a proverb. Education will not; the world is full of uneducated derelicts. Persistence and determination alone are omnipotent

Calvin Coolidge

Call it hard work, dedication, or whatever else, persistence is the most important trait a person must have to succeed. Take your favorite athlete. She or he did not achieve greatness simply through talent alone. A persistent person knows their goals and works steadily to achieve them.

Be persistent. Recognize that the hard work you put in will pay off. Persistence will help you overcome challenges and overcoming challenges makes you a more competitive applicant.

3. Time Management

Waiting till the last minute produces inferior results. (Hold yourself to a higher standard, an inferior result is one below your full potential not a result that is worse compared to your peer's results.) Last minute heroics are nice, but planning ahead and avoiding the need to be heroic is by far more important.

I remember how cool it was in high school to get a good grade on an assignment after procrastinating to complete it. I seemed to be the master at this skill. What I did not realize was that waiting to the last minute was an excuse. I was afraid that if I spent significant amounts of energy working on an assignment I would still receive an average grade. The extra energy spent would have been in vain. Waiting till the last minute meant that if I got a bad grade I could always look at it and say actually it's a good grade for the amount of time I dedicated. Clearly this mentality limited my potential. I understand now why my parents and teachers were so frustrated with me. I did not work consistently and therefore I wasn't achieving what they knew I could achieve.

Manage your time so that you can produce the best results possible!

2. Read a lot

I did not realize how important reading was for the longest time. Read anything you like. Just read! Reading comprehension is a vital skill that helps you teach yourself. Nowadays, I am forced to do lots of research which requires a lot of reading. Learning how to read and comprehend will prove vital in college and later in your career. It is the basis for gaining knowledge. And knowledge is critical to success.

1. Pursue your passion, improve your options.

You might know exactly where you want to be in five years, you might have absolutely no idea. In either case, my suggestion is to follow your interests. Because when you follow your interests you are more likely to remain happy.

Inevitably when pursuing any passion, you must make a decision on how best to proceed. My advice is to pick the option with the most available options after. This is rather vague advice, but say you are deciding on a college. You want to do engineering. You might get accepted to the university rated highest in engineering and you might also be accepted to a university rated second highest in engineering but also highly ranked in other areas. Either way you are going to get a top education in engineering. But on the off chance you don't like engineering wouldn't you rather hedge your bets and attend the second university?

How Fooala SCRUMs

In this post, I would like to touch on how we use SCRUM to manage our development @Fooala. And expound on the lessons I have learned as the SCRUM master. (If you are not familiar with SCRUM check out this video. Also, here's a useful diagram.)

(Note: while SCRUM master, I maintain a development role as well. I am liaison between business development and software development making sure both align.)

How do we SCRUM?

Our daily SCRUM occurs at 2:15PM.

Sprints are 4-7 days long. Stabilization sprints are 1-3 days.

Releases every 2-3 weeks.

We implemented SCRUM without any software. We use a whiteboard and post-its.

Post-its define tasks. Each task is placed on the white board and belongs to a developer. As the task progresses, it moves states as follows: "Backlog", "In Progress", "To Verify", and "Done!"

We write the expected amount of hours each task will take on each post-it and modify them every day during the daily SCRUM.

Different colored post-its are used for each of our products.

We also maintain another whiteboard that keeps the task backlogs for the next two sprints.

I have stapled legal paper around our whiteboards in order to group tasks together.

Finally, we maintain a sprint burndown chart in excel and print charts every day or two.

Why keep SCRUM physical?

By keeping SCRUM physical, the tasks feel more tangible and have weight. It is also easier to visualize our progress. Often times, I catch another cofounder working on development turn around from his desk only to stare pensively at the SCRUM board. For him, seeing the tasks move from left to right is a physical movement that parallels our development progress.

Adding tasks to the SCRUM board requires physical effort so tasks are not added without some consideration. This helps to keep tasks focused, relevant, and manageable. However if we are away from the office, SCRUM tasks are emailed to me but I enforce that task be defined only in the subject line of the email.

Why SCRUM at 2:15PM?

The afternoon daily SCRUM is largely due in part to our developer's vampire-like work schedule. As a manager, I would love to have the daily SCRUM at 10:15AM and keep core hours 10AM-4PM. However, fighting the developers would be futile. Core hours are Noon to 6PM. Typically, the developers are up till 3AM, get to the office by Noon, have lunch, work till 6PM, have dinner and relax, then start working again around 10PM. SOOO, I have no choice but to work around the developers schedule. Having it at 2:15 makes sure the developers are awake.

Tasks vs. Features

Sometimes a task is added that is expected to take 20+ hours. When a task is expected to take 20+ hours, it is more likely a feature. Hence, a feature should be broken down into several tasks. When I realize a task is really a feature, I ask my developers break down the feature. If they can't do it, that usually means a design meeting needs to be held.

The dreaded task pushback

At times, it is necessary to take a task out of the current sprint and move it back to the next sprint/release. It is tough to know when to do this, but this is where the burndown chart helps.

The burndown chart illustrates how much effort is left. If i realize that physically there is not enough time left in the sprint to accomplish that much effort, then I know something's gotta give. Largely based on business goals, I move tasks back or mandate certain ones be given priority. And if need be I proclaim that tonight is going to be a late night at the office meaning dinner at the office, coding party till 5-6AM.

Releases

Planning a release starts by first evaluating how the last release went. We do a release post-mortem answering questions like: 'What went well this release? What can we do better?'

Then we start with what are the business goals we need to accomplish. We then select the features that align with our business goals. Finally we breakdown the features into tasks. The tasks can be pre-existing (either pushed back or on one of the legal pieces of paper). However if a new feature is being developed, a design meeting is scheduled.

We end our releases with a Release Demo. I try to add weight to the Release Demos by inviting our advisors. Usually a business/sales person produces a slide deck and gives the presentation. My belief is that if our business people don't understand what the developers have done and the impact of their work, then the overall vision of the company cannot be aligned. Also, by emphasizing the importance of the Release Demo and including our advisors helps motivates everyone both developers and business people.

Sprints

Like releases, sprints start by evaluating how the last sprint went. Mostly I see what has been pushed back from the previous sprint and whether it is still important.

Sprints end with a demo day that includes only the developers. Each developer spends 10 minutes demo-ing their work. (Applause is encouraged)

Stabilization Sprints

Finally, at the end of the release, we have a stabilization sprint. This sprint is meant as a buffer to help clean up code before it is rolled out to production. Admittedly, this sprint should not exist and should be taken care of while a task is being verified. However, I find it is necessary to keep up the extreme pace of development.

Distributed System for Photo Mosaic Processing

My passion for photo mosaics and highly scalable distributed systems has led me to ponder about a distributed system for photo mosaics. Here's a first go of how it would work.

Assume the photos reside in some warehouse available via a REST interface. Assume also that all the photo indices can be received in one get request.

For now, we will assume a star topology with a master node that distributes all work to several worker nodes.

Abstract

A collection of photos is defined. The photos are distributed to several workers. The workers measure the "colorness" of each image and store the colorness with each image locally. The images are then sorted locally and a parallel sorting algorithm is used to sort images globally. Each worker receives subsections of the global image and determines the "colorness" of each subsection. The subsections are then sorted locally and a parallel sorting algorithm is used to sort subsections globally. The subsections and the images and then paired based on their order after sorting. Finally the images are assembled based on their paired subsections original global image placement.

There is no formula

I recently watched the documentary Before the Music Dies. The documentary had many insightful comments about the record industry. In particular it focused on how the quarter-by-quarter profit mongering corporations sucked the life from music by caring only about the bottom-line.

With companies like clear channel focusing more on playing music that the masses "won't dislike rather than music the masses might like", music has become stagnate, at least popular music. But welcome the internet and music post-Napster.

Musicians now can produce a high quality album with only a few thousand dollars. They can market their music on myspace and youtube, spread their fame through Facebook, and reap profits on iTunes. This method works well for smaller artists whose music cannot be found on torrents for the most part. And even for the big names whose music is spread across the torrent cloud, they make reasonable profits from legitimate sales on iTunes or rhapsody or amazon.

I'm curious if record labels have decided to raise concert ticket prices to make up for the income they have lost from selling multi-platinum records. It would make sense to try although it might just annoy consumers who will relive their live experiences on youtube.

This documentary shed some light on what's broken with the music industry, or rather what has changed. Record labels can no longer force consumers to listen to what they deem is cool in order to sell more pepsi products. There now exists a meritocracy within music where only the most talented, or by today's terms, most viral musicians survive, e.g., 'Chocolate Rain'. But 'Chocolate Rain' is crap as is most viral music which is why we still need record labels to help consumers filter. But I argue that this is all a record label should do. Filter for talented artists and potentially great music and provide for them a nurturing environment rather than exploiting musicians for the sake of selling an ad.

On the other end, musicians need to write music that matters to them, that they connect with and not worry about catering to the masses in the hopes of making it rich. If by writing for themselves, they are able to connect with 1 or 1 million other persons then they have achieved their goal. Music comes form their heart, as in many of life's passions. You can not calculate it. There is no formula.

LaTeX + Evernote = better math notes

Evernote is a great way to push your notes to the cloud. And the content you create is indexed for later searching. LaTeX is the standard document markup language used in scientific research papers, or any other document that requires some math. However taking notes in LaTeX is not really feasible since it is not very easy to type documents on the fly. Even editors that provide buttons to insert symbols are hard to use and slow down note taking speed. The ideal solution is to simply be able to write notes like with a tablet. However the notes you take should use some sort of recognition to convert the notes into LaTex. From there, the documents should be uploaded to evernote and indexed.

Pervasive Computing 2.0

Currently, I am taking a course titled Emerging Mobile and Distributed Systems. The class focuses on pervasive or ubiquitous computing. The fields founder, Mark Weiser, once described how "the most profound technologies are those that disappear. They weave themselves into the fabric of everyday life until they are indistinguishable from it." Weiser's very apt and concise comments have inspired several engineers but I highly doubt ubiquitous computing will reach the level he conceived. The problem? Social ignorance and selfishness.

Let me first describe the notion of social selfishness. Individuals act greedily, acting upon impulses with foreseeable, immediate benefit. Systems where users provide information that other users can then use later, such as Cooltown, will ultimately fail unless each provider gains something. What will work is a system where users gain something immediately, i.e., entertainment, money, a relationship, or perhaps a service. If a user is to post something for the benefit of others he must find at the very least some entertainment value. He should consider his work as fun and therefore his time spent worthwhile.

My second argument is social ignorance. Let me briefly describe what I mean by it. Concerns over privacy, client thickness, energy management, etc... do not really matter as long as what's available is the social norm. For example if a battery only lasts 10 minutes when running GPS, Satellite TV, and radio, but every device on the market has the same limitation, then users will not care. A more important example, is privacy. If every location based application requires full disclosure of location, then no user will worry about sacrificing his privacy. But, the applications must provide some value or else why sacrifice privacy at all in the first place.

To understand how these two social constructs will hinder ubiquitous computing, let me argue against the CarTel system. CarTel is a system where by users with GPS tracked cars relay their position through open WAPs The system works great if enough cars have enabled GPS but most don't. And social ignorance will make users not pay more for GPS unless either it's standard in every GPS device or they reap more benefit than simply knowing traffic patterns (social selfishness). Arguably one could use a GPS enabled smart phones but proliferation might take a while.

Another example is LBS social networking. Users willing to participate in a LBS social network like Loopt receive benefits of knowing which friends are nearby, ratings of nearby restaurants, taxi hiring, ridesharing, and neighborhood announcements. Arguably each of these applications can be designed separately except the nearby friends feature. I argue this feature is not enough to persuade millions to use Loopt. Having friends or family know exactly where one is at all times is not necessary and has more risk than reward. Loopt mix however that allows users to meet new users with similar interests could work if meeting someone online had less stigma. However, if meeting someone online was the norm then social ignorance would precede past judgment and users would use the service.

A final example is the omniscient pervasive computer much like HAL 9000 from 2001: A Space Odyssey. HAL would never work. Mostly because humans cannot design a system smarter than a human. HAL would have to differentiate human emotion, something humans have difficulty deciphering. Furthermore, unless there was a standardization across all platforms of technology, HAL would not have the contextual awareness or balanced proactivity to help users without annoying them. Again HAL must act smarter than humans. A simple version of HAL might be the robot in the fifth element that automatically cleans up broken glass. To create such a system would require either excessive technology or extensive training neither of which would coincide well with social selfishness.

What will work in ubiquitous computing? Arguably no application that tries to connect a room full of strangers will ever work. Society will never allow random individuals to meet random individuals. It's the same reason we don't introduce ourselves to every living being we can see. Hence social network used as a filter not a connector is what will matter. Secondly notions of publicly shared hardware will never work again because of social selfishness. Hence what needs to happen is the growth and development of mobile devices. We are already seeing this with Android and iPhone. However application development should be cross-platform and until we see a standardization on platforms, perhaps even just a JVM social applications will not reach critical mass. Only social applications with enough mutual benefit will work. And ubiquitous systems that try to connect users to the physical environment must not only be seamless as Weiser wisely describes, but have a significant benefit.

In conclusion, a large part of Ubiquitous computing tries to design a system that allows people to either be more time efficient or to allow effective use of slivers of time. Ultimately the most pervasive system is Mother Nature. Not until embedded systems make me wonder my existence or impress upon me a ray of warm sunshine will I agree that ubiquitous computing has succeeded.

Lost in Hulu

After watching a movie on Hulu I am determined to never watch another movie on their site again. They simply place too many ads within the movie. The flow of the movie is lost and I simply lose the surreal atmosphere the movie tried to create. Arguably, this is the same reason why I don't like watching movies on television. The commercials destroy the movie!

I would much rather sit through a round of previews or at the very least, they could combine commercial slots. Even doubling the number of commercials per break would reduce the interruptions by half. I really hate when the indie soundtrack that puts me in an euphoric trance is interrupted by a silly girl making me feel guilty for "destroying" the environment. Or another silly girl making me feel guilty for the foreclosure of her little doll house. Or a group of bored teenage boys distraught over their lack of a recreation center. Hulu get it right! Don't simply take the commercial cuts the television networks have added. You might as well pour water on my face right in the middle of the movie every five minutes or so. While your model works for tv shows that plan for commercial breaks in their scripting, it does not work for movies.

Lost in translation? Lost in Hulu.

Everyone Else in the Room

In my freshman year of high school, the robotics team took a trip to Seattle for a FIRST robotics competition.  This was the year Dean Kamen had announced the Segway.  Him and Woz took every opportunity to run around the arena on their new toy.  I took a chance and asked Dean if I could take a test ride.  He didn't say no.  But he did say that I had to first convince everyone else in the room that they should let me ride it.  

This is me convincing everyone else in the room.