New Year Resolutions

Only two resolutions I have this year:

  • Wake up early.
  • Wake up happy.

There is no point in starting a day late or depressed.

Happy 2012!

Starting With Google AdWords

Few weeks ago I decided to try my first adwords campaign for The Booking Bee beta sign up. I wanted to try this MVP thing everyone speaks about and really see if I’ll get some interest for the product before I really throw myself into it and build it. It was the first time I had to deal with AdWords. Knowing nothing about it I thought it would be enough doing my usual: scan the software, try out a few commands and usually getting the hang of it (or a general idea how to operate it) quite soon. Ad Words is a different beast, though. It is quite complex and it has a whole lot of terms that one needs to learn. It is not an afternoon job – it is more like a week (or two) project by itself. Not to mention the whole SEO thing (if you really want to do a good job). Here was my plan of action:

  1. get a nice template for the landing page from Themeforest
  2. modify it so that it suits Booking Bee better
  3. create adwords campaign
  4. profit!

The first two bullet points were no brainer for me. Third and fourth are turning out to be a bit harder than originaly planned.

I got a really nice template and tweaking it was not really a problem. Even completely changing the icons for features list was easy. Writing the copy, on the other hand, turned out to be harder. Specialy if you want to say something meaningful and would like to avoid the usual selling buzzwords. I am not very well versed in that, unfortunatelly, thus i spent a great deal just staring at the screen with a blank head.

On to setting up AdWords.

I found a great blog by Octoclick helping me to understand what all the major options meant. Still the biggest problem I had was to find the right keywords.

What do people search for when they want to find a software helping them manage bookings and expenses for their vacation rentals? No idea. I set up some basic words and phrases that i thought would bring users to my site and make then sign up: vacation lettings, landlord, booking calendar, vacation expenses … How wrong I was! Yes, majority of them did bring traffic to my site, but they weren’t relevant enough! All they did was eating up money from my day limit so the add stopped showing after few clicks! And I only realized that three days into the campaing. As soon as I removed them and added more relevant set to the campaing i was paying much less for a bigger click through rate (but still very low). No sign ups, yet, though.

Another mistake was to set only one version of the text ad. No! You want to have different variations of it so that different sets of keywords trigger the display of the most appropriate add. Again, it took me 6 days to finaly correct this.

Third mistake: The title of the add. Initially it was the name of the web app – The Booking Bee. This meant nothing to anybody. When I changed it to something more relevant to the search (Vacation Rental Software) my keywords started to have much bigger quality score, meaning that i could also drop the bid price. Too bad it already cost me more than a half of my budget for this experiment and one week was wasted.

Sumary so far:

  1. initial budget: £35
  2. impressions: 20,592
  3. clicks: 43
  4. CTR: 0.21%
  5. money spent: £24.31
  6. time running: 1 week
  7. beta sign ups: 2

The Most Difficult Thing Is …

Why is inertia so difficult to overcome?

Everything would be so much easier:

  • all these app ideas that are popping into my head? Done. 
  • the ebook i am trying to write? Phew, piece of cake - done.
  • broken heart? No worries, recovered in a lightning speed.
  • all the illustrations that started back to from in my head? Done.
  • the messy flat? Ha, all shiny now!

Instead? Nada. Zip. I’ve done nothing.
Oh, i have to-do lists long to the moon and back, but actual stuff done? Err .. ok, I’ve started some … but not finished anything yet. And the most difficult part? The paradox? The insurmountable mountain? One fights inertia with “just start doing it”. Yeah. To actually go somewhere, you have to start walking.

Really, Don’t Panic

Yet again I managed to neglect my duties towards Heroes Never Panic. I always seem to fall into same patterns of procrastination. I am hopeless :)

I finally let go of a relationship that, even though the person meant everything for me for the last 4 years, it was not meant to be and I am starting to feel happier and lighter again. The hardest part is to prevent yourself from thinking about it. And force yourself to get busy.

While I was fighting against myself, some projects have piled up on my desk so I need to sort myself out and start working on them seriously.

The Booking Bee

Oh, my dear little bee. I was so excited when i started working on this project and look at it now! It has been months since I touched it! Yesterday I rolled up the sleeves and started fixing bugs and polishing code. And before you know it, it was 11pm!! Where did Sunday go? 

Still a lot of features (critical ones) missing before I can open up the beta for the public, but I was surprised to see that it was not THAT bad after all. And I am all hooked up again!

Tag Penny

Well, as you could observe, I wasn’t able to finish it last November. But i did finish the mockups, bought the domain and set up a blog (that nobody updates). If i really get myself to start working on it, I think it has potential. Maybe even more than Booking Bee.

E-Book

Got this idea that maybe I fancy to try writing. It was always a thing at the back of my head but never really thought I’d do it. Well, up until now. I know few people that are starting a business (or have a business) and feel lost when they need to hire or deal with a developer. I guess I could do worse than writing a little ebook guide about it. What you need to know, how to manage the project, how to communicate with developers, traps that you can fall into… I set up a survey over at Wufoo.com and got some replies back (not many, but enough that I could see the common pattern). Trying to figure out a structure of the guide now :)

Hey, it is still up and I am always glad to get more input: http://bit.ly/ffBJuN

Mongolia

Don’t ask me why or how, but this summer I go to Mongolia. Somehow friends persuaded me to just dive in and join them on this adventure. I know it is something I desperately need, something completely different and unknown.
It’s going to be just for 12 days but I know I’ll come back revitalised. I already have an idea for a web app! See, we are now group mailing among us about all the stuff that needs to be done and organized before the trip. I looked online and yes, there are few group trip management apps out there, but none of them is particularly suited to what we need. So i thought that it could be a nice opportunity to build something quick. And as I was trying to find something to build to learn node.js, this could be the right thing to do.

Time to Build and Launch an App

It is November. This means long nights, rain and wind (at least in Scotland). But it also means that the HN November Launch Pad has started.

I decided to join in with a little idea that popped into my head couple of weeks ago - just around the time when i resigned from my current job.

The problem: I need to be as frugal as possible and have a simple tool to track my expenses.

The solution: Tag Penny.

The name is not finalized yet. Well, to be honest, it is still all mostly at the idea stage. But i got two domains that I just bought and now I have this dilema: which name is better? Expenseplan.com? Tagpenny.com? None? Anyway, I will just continue with the development and maybe the perfect name will crystalize as I go along.

Something to Remember

For attractive lips, speak words of kindness.
For lovely eyes, seek out the good in people.
For a slim figure, share your food with the hungry.
For beautiful hair, let a child run his/her fingers through it once a day.
For poise, walk with the knowledge that you never walk alone. 

People, even more than things, have to be restored, renewed, revived, reclaimed, and redeemed; never throw out anyone. Remember, if you ever need a helping hand, you will find one at the end of each of your arms. As you grow older, you will discover that you have two hands; one for helping yourself, and the other for helping others.

Audrey Hepburn

Learning Haskell - Types and Functions

Haskell is a strongly typed static language.

This means that Haskell will not automatically cast one type into another. In other words, you can’t expect it to treat an integer as a float. If you define a function that takes a float parameter and you feed it an integer afterwards, Haskell will complain. Having static types means that the compiler knows the type of every value and expression at compile time. Before anything is executed. So if we try and use types in an expression that don’t match (say, trying to add a string “3” to an integer 5), Haskell will complain. But there is a bonus: Haskell has type inference. Meaning, Haskell will deduce the type of a value or expression for us everywhere it can. This makes type declaration optional.

Continuing my journey into the abyss of Haskell, it occured to me that we all already learned functional programming. Do you still remember the basic Algebra classes in your elementary school? Well, that is just it - functional programming. And Haskell’s syntax is just like algebra. With some extra sugar and batteries included (yes, i took that last part from Python … i just couldn’t resist).

At the algebra classes we learned that functions return values. Later we were spoiled by imperative programming languages and the returning values became an option explicitly stated with return keyword. Not in Haskell. All functions return values, because they are expressions. Always. And we don’t need the return anymore because we get it implicitly. Oh, and did I tell you that there are no objects in Haskell? Just functions!

To define a function that returns a sum of two numbers I could write something like the following: add a b = a + b Here I tell Haskell that add takes two parameters and it should return a sum of the two. I didn’t have to declare the types of the parameters, nor the returned value. And i could have, if I weren’t so lazy! But I am safe anyway. If i try to pass two strings to the function, Haskell will yell at me. That’s inference at work.

Let’s say that i want to be a good citizen and declare the types as well, but being new to Haskell i just am not really sure what they could be. Well, I can always check it out after I write my function down with the help of the interpreter. ghci> :t add ghci> add :: (Num a) => a -> a -> a Haskell is telling us that for him, the add function can take any two parameters that are of the same type and it will return a value of the same type back, but the type must be of a Number typeclass. Ok, I had some hard time to decipher it as well, so let me rephrase this a little bit. The (Num a) part is telling us that for all the “a”s that follow they must be of a numeric type. The part “a->a->a” is simplified like this: the last a is the return value, while the first two are function arguments. So, armed with this insight i can go back and modify my function so that it has a type declaration as well. add :: (Num a) => a -> a -> a add a b = a + b

Yes, it is weird at first. But quite soon it starts to make sense, trust me. And wait till next week when i show you patterns and guards!

Learning Haskell - First Date

Monday is here and so I met for the first time with Haskell.

Installation went quickly and without any problems (installed the Haskell platform for macosx). You get a compiler, a bunch of standard modules and an interactive interpreter. I like having the interpreter as a way to quickly try out stuff in Python, so the fact that Haskell has its own as well immediately gained points with me :)

It is much more convenient while you learn to have an immediate feedback than having to type some code to a file and compiling.

First thing you try is the “command line calculator”. Haskell is behaving as you would expect it to behave: ghci> 2 + 4 ghci> 6

All the usual suspects are here: addition, multiplication, subtraction … nothing differs from Python. But then quickly the similarities stop to be, well, similar.

Haskell is a functional language and as such it does not modify state. That, translated to something meaningful to me is: variables are just symbols that hold values. Once you assign a value to a variable you can’t change it. Variables in Python and variables in Haskell are not the same. At the moment it is still difficult for me to grasp what this mean and how it can be useful. But right now I am still looking and evaluating Haskell from the imperative languages point of view. Also the fact that Haskell is known to be lazy is somehow odd, but then it sounds like a cool feature - the fact that it won’t bother to compute things until it is really forced to do so.

This means that you can create lists with infinite number of elements and Haskell it is quite happy to create them for you. Fast. Well, unless you try to create them at the interactive interpreter. You will have to stop it from spitting all the numbers till the end: ghci> [1..]

Lists.

They can have unlimited amounts of elements. But the elements must be all of the same type. Strings as we know them are lists of chars so the following examples are all the same to Haskell: ghci> “hello” ghci> [“h”,”e”,”l”,”l”,”o”]

If you want quickly construct a list of ranges you can do: [1..100]. This will create a list of numbers from 1 to 100. You can specify a step to the range as well: [1,3..20]. This will create the following list: [1,3,5,7,9,11,13,15,17,19].

For concatenating strings or lists you would use: [1,2] ++ [3,4] or “hello” ++ “ “ ++ “world”. Basically the ++ function inserts the stuff on the right (which must be a list) at the end of the list on the left side. But what if i want to insert something at the beginning? I can do that: ghci> a:[b,c,d] ghci> [a,b,c,d]

The only difference: the thing you insert is a single element. Not a list.

If you want to get the second element from a list (the indices start at 0) you would use the !! (yes, that is double exclamation mark): ghci> [1,2,3,4]!!1 ghci> 2

There is a whole bunch of functions to manipulate lists and they all sound quite exotic (although I did remembered my CS semester of Prolog while trying some of them out). Let’s say you want the first element from the list: ghci> head [1,2,3,4] ghci> 1

What about the last? ghci> last [1,2,3,4] ghci> 4

To get everything but the first element you use tail: ghci> tail [1,2,3,4] ghci> [2,3,4]

And everything but the last element? init. ghci> init [1,2,3,4] ghci> [1,2,3]

There is a lot of very well written and comprehensible material online that i am using as a learning material. Some of the best resource that I found are:

All in all, I enjoyed my Monday evening. Haskell does feel strange for now and I can’t possibly think of how i would go on about writing real life programs with it. But hey, it is only my first Monday :)

Ada Lovelace Day 2010

Today is the Ada Lovelace Day - a day to celebrate women in technology and science.

Although I am not much into dividing people into groups based on gender, race, religion, etc, it is a very noticeable fact that there simply are too few women in technology. I noticed it since I first developed an interest for computers, I continued to notice it during the university (hey, in the first year there were maybe 10 girls out of 100 students!) and it is a regular fact in every job that I had. Usually, I was one of the few female programmers, sometimes the only one.

I would like to bring attention to one of my heroes from the BSD community: Dru Lavigne.

Dru is an authority in the BSD world. She is a network and systems administrator, IT instructor and technical writer. She has written several books on BSD, the most famous one, BSD Hacks I happen to own, and has been my reference for most things BSD. I’ve read it cover to cover several times during my early years when I was learning FreeBSD.

Dru writes regulary on her technical blog A Year in the Life of a BSD Guru