Too many startups that don’t really start!

A thought struck me just today when I was thinking about a guy who pitched me an interesting idea in the education sector. He was young and was almost finishing up college. He had a team of five guys who were all going to work together to put out a working product in a short time (like six weeks). Then I never heard from the guy and later found out that nothing really happened.

We live in a time where startups are a sexy thing. Now I am not sure if it had always been this way or it’s just more ubiquitous now. Either way I see and hear about too many interesting startups that never even make it past the idea stage. I think larger part of the problem is this perception about starting up. Everyone wants to do it because it is cool to be a entrepreneur or a startup guy. Rarely you see a guy who really wants to solve some specific problem and truly care about the end user having that problem solved.

Startups are hard. Really really hard. Really really really really hard. There are too many times and reasons where giving up seems like the right thing to do. There will be people around you, sometimes your team, sometimes your alter-ego telling you that it’s time to pack up. And then it will happen again the next day. And the day after. To be able to persevere through all that every other day is when you even have the probability of succeeding. To have this sort of perseverance you truly need to be passionate and care about your solution and your customer who needs your solution.

So here’s something to think about. Next time you wanna tell someone that you are doing a startup you better be sure for yourself that you actually are doing it! And that is not because you had an idea, not because you started working on something, not because someone said your idea/product was cool or interesting, not because you got selected to a competition or accelerator, and even not because you launched! It has to be because you had some real validation. Real validation is when someone will put money on the table for your work (customer or investor), not because they are your rich cousin but because they don’t give a flying rats ass about you but they have fallen in love with your work!

Advertisements

Empathy: A skill every good leader must possess.

EmpathizeMutual empathy is a feature of any successful relationship, may it be romantic, family or professional. It is more crucial in some relationship than others. The importance of this skill for a leader is quite critical.

Just think about it, how does it make you feel when someone just “gets” you. It makes your life simpler and makes you feel comfortable around that person. As a leader it is essential for you to keep your subordinates comfortable and concern free. People are productive and perform the best when their minds are cleared of any concern or worry and empathizing with them will help you as a leader to clear their concerns, solve their problems and help them see things clearly. So how does empathy work?

Listen to what they say

To understand is to first know. If you don’t know then you never will understand. The gap between knowing something and understanding it well is effective communication. People may not always talk about concerns/problems or worries they have. But when they do, listening to them and devoting the time to it should be the highest priority in your list as a leader. Selflessly involve yourself in their concern and care about it. Try hard to understand their situation. There may be a thousand other things on your plate but this comes first.

Make it easier for them to talk

It’s not easy for someone to talk to you about their concern, may it be professional or personal. It is your duty to make them feel you are there if they want to do so. The relationship you build with your subordinate creates and facilitates the climate for this. The culture and environment in your team plays an important role. You have to constantly assure directly or indirectly that you care and want to help.

Listen to what they don’t say

You need to constantly pay attention to the behavior of your subordinates. There are people who talk and there are those who don’t. Some naturally exhibit their concerns and worries through different behavioral traits, negative or positive. Though perceiving this is not an easy task, it’s important to pay attention. You should be careful not to assume the scenario based on behavior but this serves as an important channel to initiate communication. Little differences in people’s behavior will tell you that something is not right.

Sometimes people try to communicate indirectly. If you are not paying attention you may never know and they may never want to try again. This too serves as a great channel to initiate communication.

Put yourself in their shoes

It doesn’t matter how much you communicate with someone. If you are not trying to understand the situation being in their shoes you are not really empathizing. Imagination is important. Every other person thinks different and understands the world around them differently. This may be due to their culture, exposure/experiences, beliefs and other factors. You as a leader have to take the effort to imagine, see and feel what they do as people. You are probably never going to see it or feel it exactly the way they do, but the amount of effort you put in understanding and imagining may take you close to what they see and feel.

Acquiring the skill

Is empathy really a skill, and can it be acquired? Yes it can. For some people it comes naturally, but like any other skill practicing is the key to acquiring this one as well. It requires an undivided level of patience and care to constantly practice this. It is a difficult thing to practice if you are not good at it. You need to keep remembering to pay attention, listen and spend time on the relationship. It may take a long period of time to be good at it but constantly practicing is the key.

Empathy is probably the most important and most difficult people skill a leader must have. So don’t give up!

“To perceive is to suffer” – Aristotle.

Image Credit - http://www.artefactgroup.com/content/tool/from-theory-to-practice-designing-for-empathy-toolkit/

Using WDS to create a Wireless Bridge/Repeater

The term WDS (Wireless Distribution System) might be a familiar one if you have meddled with standard wifi routers/access points that are available nowadays. The concept is quite simple – the system enables the router/access point to act as a bridge or a repeater. Now as simple as it may sound, trying to get WDS working to extend your wifi network or to bridge your wifi to a wired network is not considered nearly as easy as it sounds.

It all started when I wanted to extend my home wifi network to the living room where I have my NAS and an Android based device running XBMC, both of which don’t have wifi capability. So I needed the wifi to be bridged to enable a wired network as well. Since the signal in the living room wasn’t great, extending the wifi made sense. What better than using one of the old routers I already had, to get this done right? So began the hunt for a hack. The more I looked on the internet I could not get a simple set of instructions which told me how to get this done. There were many articles elaborating on the concept like this one but nothing clearly said how to do it. Yet alone most of the discussions suggested the setting up WDS was most unlikely under many different conditions.

I had to give it a shot. So I took out three different models of the old routers I had and started messing with them. Changing the settings on them and trying different levels of changes to get them working. It didn’t take long before I could get a elaborate setup working that utilized WDS. However this was quite tricky and I picked up a few things on the way. So here it goes.

Following tips are based on the assumption that two routers/access points are used to extend and bridge a wireless network. Both devices are expected to have WDS capability.

1. Set the IP of both devices in the same subnet

Set static IP’s for both devices which belong to the same subnet. If you set the main device (lets call it AP1) to have the IP 192.168.1.1, you can set the secondary device (lets call it AP2) to have the IP 192.168.1.2 or something similar. In this case we will setup AP2 to extend the network from AP1.

2. Setup only one DHCP server

If you require a DHCP server in your network it should ideally be setup on AP1. Disable the DHCP server on AP2. If AP2 supports DHCP relay, you may want to switch that on. Once you’re done with the full setup, one DHCP server should be able to assign and manage IP’s for all devices in the network.

3. Enable wifi and set the SSID

Enable wifi on both AP1 and AP2. The SSID of both AP1 and AP2 can be same or different. This doesn’t really affect the WDS setup since WDS uses your BSSID (the MAC address) to identify the devices. This decision depends on how you want to identify your network. If you want the wifi repeating to be smooth and you actually want to see your whole network with one SSID then you set the same SSID on both AP1 and AP2. If you want to identify AP1 and AP2 separately then you would want to assign two different SSIDs. What I did was have different SSID’s when setting up the network and then once I was done I switched both AP’s to the same SSID.

4. Set your wifi security to WEP

Set the wifi security on both AP1 and AP2 to use WEP. Also set the authentication to Open Authentication with a 128bit encryption. The authentication keys on both APs must be exactly the same. It’s essential that all settings be exactly the same on both APs.

5. Other wifi settings

Like I said, successfully setting up WDS to work means matching the settings on both AP’s to work the exact same way. If you have problems in getting WDS to work this is one area you can explore and tweak. As a thumb rule avoid having settings that are not absolute and can change. What I mean here is settings that are set to “Auto” or set to a range of values from which the AP can decide to choose such as “802.11b/g/n”. Following are a few of wifi settings you have to look into.

  • Wifi Mode – The mode has to be same on both APs and must be an exact value which is either 802.11g or 802.11n. If all your devices and both the APs fully support 802.11n, you can go ahead with that. However if you have difficulties getting it to work you can switch to 802.11g which has a better chance of working
  • Channel – The channel has to be the same. Having the channel set to Auto is not going to work. You can use a tool to check which channels have the minimum interference in your environment and pick the best channel. Set the channel to the same value on both AP’s.
  • Transmit Power – This shouldn’t ideally affect, however having this set to 100% on both AP’s will let you achieve the best range.

6. Set the WDS settings

Enable WDS on both APs. Depending on the device rest of the settings can vary. It essentially boils down to assigning the MAC address/BSSID of the devices to one another in the WDS settings. So in the WDS settings of AP1, you will need to assign the BSSID of AP2 and in the WDS settings of AP2, you will need to assign the BSSID of AP1. Different devices allow you to do this in different ways. You might see one of the following methods in each of you AP’s WDS settings.

  1. You may have to select the SSID of the other AP from a list (upon scanning for available networks).
  2. You may have to select the SSID of the other AP from a list which will reveal the BSSID.
  3. You may have to type in the SSID of the other AP
  4. You may have to type in the BSSID of the other AP

If either of your AP’s use method 1 or similar, you may have to have different SSID’s for AP1 and AP2 to ensure you can select them.

7. Set the correct security settings for WDS

Some devices require you to select the wifi security settings when setting up WDS. If this is the case you will need to put in the exact same settings you did in tip 4.

8. Don’t keep the APs too close to each other

When you are setting up the APs try and keep them away from each other. Keeping the APs too close to each other can cause interference which may not let either of the APs to perform.

There may be other factors that matter when it comes to setting up your WDS which I would love to know about as well. If you do find any other tips that may be useful please write them in comments section. Hope this helps someone save some time 🙂

Drawing network diagrams can be quite helpful when setting up even a simple network. Creately can be a very useful tool for drawing network diagrams. Give it a shot, its free to use.

Gmail is sending me other peoples mail!!

I have been receiving few emails from a guy about some book order. First time I saw it naturally my thought was SPAM. However today when I go a message from the same guy I had a proper look at it since it was showing up on my “Primary” mailbox again. It actually is a mail that is supposed to go to some guy/girl who has the address “hira.ash@gmail.com”. Now I own an email address which is pretty much the same but without the dot (.) in the middle. I have the mail forwarded from that particular account to my current email address.

It seems like this particular person has mailed someone about a book on the classified site http://www.kijiji.ca. The seller however when replied to the mail saying its not available it landed in my inbox. Today I got another reply saying the book is available for $45. Now the craziest thing out of all this is that the to address of both of these mails show as “hira.ash@gmail.com” which is not my email address.

I have just reported this to google and also forwarded the mail to the address that is supposed to receive it. Below is the email trail and the mail detail which shows the to address.

The mail trail:

wrong_email

The to address:

address_proof

This is quite a scary thing to see! I sure hope my email is not lading in someone else’s mailbox!!

UPDATE:

I think I was too soon to post this. As I searched I found the following article which clearly mentions that Gmail does not recognise dots(.). This clearly means that someone has misspelt their email address.

https://support.google.com/mail/answer/10313?hl=en

MySQL PDO for the default installation of PHP on Mac OSX

Quite a few times I have come across the problem of enabling the PDO drivers for MySQL on the Mac. I keep resolving this but every other time don’t remember how I did it. So I thought I’d write a about this so I can refer my own post when I need it 🙂

Initially the understanding that I had based on most of the posts and discussions around this topic is that the OSX does not contain the PDO drivers in it’s default PHP installation. Most solutions were talking about recompiling PHP with the PDO driver specifically for this purpose. But after much search I stumbled on this post which clearly mentions that the OSX Lion (10.7) ships with the PDO drivers by default. After playing around on Mountain Lion (10.8) I realised that this is the same case.

Initially when PHP is setup and working I was constantly getting the following PDO error

PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock)

This lead me believe that the problem was actually with the PDO. However later I realised that the problem was lot simpler than it seemed. The actual sock file was missing as the error says and this can be found in your /tmp folder in the Mac (at least for the 10.7 and 10.8 versions of OSX). To resolve the issue all you have to do is

  1. Locate the php.ini file on your Mac (/etc/php.ini)
  2. Replace all instances of /var/mysql/mysql.sock to /tmp/mysql.sock
  3. Save the file and restart Apache.

Why Real-time Collaboration? – Creately

After a prolonged wait we have finally taken up the time to implement Real-time Collaboration for Creately. Right now the feature is in Beta and can be used by anyone who wishes to take it for a spin. The real question is why did we not do it all this time? and why have we finally done it?

For those who dont know what im talking about, real-time collaboration is the concept of being able to edit a document/file at the same time from multiple different computers while seeing changes from each editor in real-time.

It’s true that the buzz around real-time collaboration was really a while before. But thats all about the coolness of being able to work with people located in a different parts of the world at the same time on the same document and see the changes happen like magic. It was a big deal for application developers to get this working in their tools and specially when it is a cloud app. We felt the same way back when we started Creately. We had to have it because it was cool and it can create lots of buzz. But we were blocked by many factors.

What does the user really want?

From the early days we have prioritized the road map of the product based on what our users wanted. This is one of the key success factors of Creately. We payed lots of attention to support requests, discussion forums and user votes on features. This almost always decided what went into each release of Creately. Real-time collaboration as a feature did have lots of attention as well from our users. But it was not always the burning problem. Smooth collaboration was a burning problem but that didn’t always mean real-time is required. We learnt this as we started improving the collaboration features. Users wanted to be able to easily share to edit or view, to easily embed and interactively view the diagram, to be able to discuss and notify users on changes and work together. We built features that enabled all of these. Real-time collaboration always seemed like that “cool” feature and didn’t convince us a as a burning problem over most other requirements in the diagraming space.

Revenue does matter!

Thats right, you know it! Real-time collaboration as a feature didn’t make revenue sense as much as most other development we have done around Creately. Series of the initiatives we did were to deliver Creately to bug tracking and wiki platforms like Confluence, JIRA and FogBugz and also build a desktop version of Creately. It would only make sense to hit the numbers while building and delivering great products. This added on to the delays.

Why now?

Creately is doing GREAT! While things are going well we wanted to get this feature out, a long lasted wish. But most importantly as we improved collaboration features we realized always something was missing. Collaborating in real-time is not about seeing the changes and feeling the magic (so to speak), but getting something done fast and getting it done easy. The real utility in words doesn’t seem a big deal, but when you are really using it you feel the difference. It makes life just so much easier.

Lets think back. When we didn’t have cloud applications it was all emails going around with attached files. Soon you had multiple versions going around with different users edits on them. This was solved by collaborating online. You had one file that was being changed. But still you had to go back and forth after making the change to communicate with the team. This can lead to lots of time wastage if you are not communicating well. With real-time you are seeing what’s happening and ideas are communicated well and all in one session you get to create and communicate what you want. You really dont have to worry much. To feel the difference, it has to be experienced.

We are glad we did this and we have lots more planned for this year. Stay tuned!

Scaling BlazeDS with Servlet 3 (Concurrency)

One of the well known issues of BlazeDS is it’s limitation in scaling. To be more specific, if you are using BlazeDS for HTTP steaming using AMF, the number of concurrent streaming connections will be limited to 100s. The exact number would be dependent on multiple factors such as the capacity of the server and configuration settings on Tomcat or whatever the application server you are using. When it comes to streaming each connection would be opened and held until the client closes or the connection times out. In the case of BlazeDS this directly relates to the number of threads consumed due to how Servlets operate. Servlet consumes a thread per request and holds the thread until the request is committed. During streaming, a request is kept open throughout the streaming session which makes the servlet hold the thread through out. This particular problem cannot be solved with servlet 2.5 or before due to the limitation in Servlets itself. However Servlet 3.0 supports asynchronous requests which can be utilized efficiently to scale the same servers to support 1000s of concurrent connections.

Up to BlazeDS 4 there has not been support for endpoints that utilizes servlet 3.0. BlazeDS 4.0 turnkey ships with Tomcat 6 which uses servlet 2.5. There has been rumors that BlazeDS 4.5 will have endpoints that utilize the capability of Servlet 3.0. Still this is just a rumor and cannot be depended on. Given the current state of affairs and the growth of other frameworks and technologies I would not expect much. There have been solutions for the problem that uses various technologies and my picks are below.

  • MuleRTMP – A Google code project that uses the capabilities of Red5 streaming server and streams to AMF clients over RTMP.
  • A polling solution that uses Jetty 7 Continuations to provide an endpoint for BlazeDS
  • The Farata Systems’ solution which uses again Jetty 7 and Servelet 3 to provide a streaming endpoint for BlazeDS.
  • blazeds-servlet3-support – Another Google Code project that is a simple BlazeDS streaming endpoint that utilizes Servlet 3.

I have been personally working on the blazeds-servlet3-support project by contributing code. Right now the code looks quite messy but it works. I had to fix some of the issues and currently it is able to reliably stream messages on Tomcat 7 without causing any trouble. What this does is simply utilize the Async capability of Servlet 3 to isolate all the pushing functions into one single thread. Requests are handled and then immediately the Context of the request is handed to a the pushing thread, enabling the thread that handled the request to complete and return to the pool. This approach pretty much would allow your same server that was limited to 100s of connections to boost up to 1000s of connections. This is however not tested yet and will be done once I have completed work on the endpoint. I will run some load tests and post it up. If you wish to give this a test run here is what you need to do.

  1. Install Tomcat 7 and Blaze DS 4. The turnkey install of BlazeDS 4 is not going to work since it ships with Tomcat 6.
  2. Once you have Tomcat and BlazeDS working fine, change the Tomcat Connector configuration to use the NIO connector instead of the BIO conntector. The setting is in the server.xmland should be changed as follows.
    <!--<Connector port="8400" protocol="HTTP/1.1"
     connectionTimeout="20000" redirectPort="8443"/>-->
    <Connector connectionTimeout="20000" port="8400" 
     protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
  3. In your Tomcat BlazeDS application context change the Servlet configuration to allow asynchronous capability for the MessageBrokerServlet. This should be done in the web.xml as follows.
    <servlet>
      <servlet-name>MessageBrokerServlet</servlet-name>
      <display-name>MessageBrokerServlet</display-name>
      <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
      <init-param>
        <param-name>services.configuration.file</param-name>
        <param-value>/WEB-INF/flex/services-config.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
      <async-supported>true</async-supported>
    </servlet>
    <filter>
      <filter-name>springSecurityFilterChain</filter-name>
      <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
      <async-supported>true</async-supported>
    </filter>
  4. Copy the compiled blazeds-servlet3-support jar file to the WEB-INF/lib folder of the context.
  5. Change the WEB-INF/flex/service-config endpoint as follows.
    <channel-definition id="amf-stream" class="mx.messaging.channels.StreamingAMFChannel">
      <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf" 
         class="org.iobit.servlet3.endpoint.AMFServlet3Endpoint"/>
      <properties>
        <idle-timeout-minutes>3</idle-timeout-minutes>
        <max-streaming-clients>10000</max-streaming-clients>
        <server-to-client-heartbeat-millis>500</server-to-client-heartbeat-millis>
      </properties>
    </channel-definition>
  6. Restart Tomcat and you should be good to go!

Since I am continuing to work on this I would very much appreciate any feedback you might have. Please let me know your thoughts in the comments.