noizZze

NR Time for Mac OS X

Free notepad for your tasks with time tracking.

Learn More

Filling the Gap

Today during a long walk with son I had time to think what is it that’s missing that I can’t make a profitable product (or to put it precisely, to make a product profitable). I have plenty of ideas for tools and services, but no matter how I try to make the product nice and usable, it’s usually not enough to attract users. What I think is missing is even basic “marketing” and “customer development” education.

I’m a hardcore technology geek who can create things, but have no idea how to promote, market and sell them. That’s sad. Whole last year I dedicated to working on user experience of products and services to make them usable, not just functional. Now it seems to be a good idea to switch focus to my newly discovered underdeveloped skill.

One resource that looks specifically helpful is Mixergy. Before subscribing I watched several free interviews and the amount of useful data was just overwhelming. If you happen to know any other master-classes and courses on the subject (promotion, marketing, ads, interviewing, surveys, customer development, networking etc) drop me a line (in comments or personal). I will appreciate it greatly.

Ok, back to viewing and note taking!

Going Static

You may have noticed a change in the graphics design and slight functionality changes. That’s because today I moved on from Wordpress to a fully static website. The website now is generated from the collection of layouts and articles every time I change something and then deployed to the server as a bunch of HTML, CSS and JavaScript files along with some assets.

Monit, Jenkins and Ruby on Rails

My latest challenge was setting up a continuous integration environment on one of the staging servers. If you don’t know what CI is, allocate a couple of hours to study the concept. If you are in software development, my bet is you need the thing, and it will probably change the way you look at your project release cycle forever.

I chose Jenkins for its ease of installation and extensive plugin net. You’ll need Java 1.5+ for it, but that’s rarely is a problem. I just grabbed a copy from java.com and got it all up and running in less than 5 minutes on our CentOS 5.4 box. Previously we tried CruiseControl.rb and it worked well for some time, but as I started linking it to our Rails 3 projects, I figured that it’s easier to try something else than make the tool work. I’m sure it’s a great tool and all, just didn’t work for me.

Monit Configuration for Rails Stack

It’s more like a self-note, but also an answer to a question what I like to monitor on the servers where we run Rails apps and how. Thought that it could save some time to anyone. Let me know if you have any questions. I like to create the directory for Monit configuration bits and keep different services separate. It easier to update and reuse this way.

HTML5 Mobile Pro Desktop Edition? Really?

Disclaimer: Here comes an angry and seriously disappointed customer. If you are fan or a friend of authors stop reading here. I’m expressing some strong opinions. You’ve been warned.

Another disclaimer: There is a line you don’t cross… even if it’s beta… even if you cut those $30 off. There’s no preview (for a reason), and I had to trust your word. Which was a mistake.

A while back I was lured into purchase of a video workshop named “HTML5 Mobile Pro Desktop Edition” by Amy Hoy and Thomas Fuchs. The thought that people behind Letsfreckle and zepto.js released a 3+ hour workshop for a “bargain” price of US$99 (only for a limited period while in beta) didn’t let me sleep at night. And so I figured I’d better grab a copy before it jumps to insane US$129 in August. (Note that I’m writing it in the dead of September and it’s still in beta.)

MongoDB: Queries Against Arrays and Plain Fields

Did you know that with MongoDB you can easily run queries against fields that vary in type, like this?

> db.m.insert({ body: '1', phone_id: 1 })
> db.m.insert({ body: '2', phone_id: [ 1, 2 ]})

> db.m.find({ phone_id: 1 })
{ "_id" : ObjectId("4e56089fbdfcdc0f68c894ae"), "body" : "1", "phone_id" : 1 }
{ "_id" : ObjectId("4e5608afbdfcdc0f68c894af"), "body" : "2", "phone_id" : [ 1, 2 ] }

> db.m.find({ phone_id: 2 })
{ "_id" : ObjectId("4e5608afbdfcdc0f68c894af"), "body" : "2", "phone_id" : [ 1, 2 ] }

What’s curious is that when I query for “phone_id: 1”, it looks into the array of IDs as well as into the integer field. Quite a flexibility!

Amazingly, indexing is supported as well.

Google+ Share Page Extension for Chrome & Co

Update: I wasn’t aware but now I know that the extension works for Chrome and everything Chromium-based equally well.

Just put together a simple extension for Chrome and company to share any page through an active Google+ account. Just install it and look for the “+” icon in the address bar. Clicking on it brings a popup that loads the official button with the counter and everything.

Please note that sharing is possible for public pages only. For private pages you’ll probably see an error from G+. Enjoy.

Download and Install the Chrome extension

Bug reports and suggestions are welcome!

Adding Audio Track to Video With Ffmpeg

I enjoy many TV Shows, but it’s hard to find an acceptable (read respectable) quality, and so recently I downloaded a translated version of Stargate Atlantis but with an original English track sitting in a separate MP3 file. I’m on Mac OS X and love using VLC for playing media, and to give it a credit, it supports this scenario, but in an inconvenient way – you have to choose two files manually each time. That’s when the grey matter comes in.

We Require…

I have just been contacted with a job offer through a respectable web site that read like this.

We require a high-skilled RoR developer who can help us with our … site, which is under construction now. You will be working with one more developer, but most of your work will be independent. You should be able to quickly learn and understand existing code, suggest improvements, add new features and functionality. We work in short iterations and all your tasks will be listed in Pivotal Tracker, so you should be able to take an assigned story using this service. You will get very clear and very detailed specifications for all functions and we will be available for questions whenever you have them (you should feel free to ask us in English, Ukrainian or German). Besides, you should be able to deliver code in an efficient and high-quality manner to our production server.

If you are interested, please, send us only relevant samples of your work. We would like to see Rails applications that you have built, especially code samples where we can see the quality of Code, written by you. If you want to send us applications developed by you in collaboration with other programmers, tell us about your participation in this project and part of work done personally by you.

Are you already itching to join their team? You should… you should… you should…, send us…, tell us. Now, how about you tell me what is so exciting about your product that I need to drop everything I have on the table and join your “one more” developer on this quest? A challenge, a relocation, heck, if it’s just money I would love to know that. If you are looking for someone having hard time to find anything to get them busy with and feeling it’s an exciting offer, you have missed the door. Highly skilled people don’t look for work as desperately as you could have imagined. I think I’ll pass on this one, no matter how appealing taking an assigned Pivotal story sounds.

To top things, there were neither a greeting, nor a signature. How embarrassing is that?

Redis and Resque Customizations

For one of the projects I’m working on for my clients we need a robust and easy to use queue. Redis and Resque is a great combination that fits us well except that we can’t:

  • Vary the interval between polling queues. When you know how much exactly you have to sleep before the next job can be picked for execution, there’s no need to waste precious time waiting longer than that.
  • Skip queues under certain conditions. If you know you need to pause a queue (throttling, for example), you couldn’t do it without hacks. Now you can.
  • Expand queue name patterns into the real queue names. Sometimes we don’t know which queues we’ll use (dynamic names), but we know the pattern (say, ‘mt_*’). You can write your custom queue lister that will convert any notation you want into the list of queues at run time (before the polling begins).
  • Specify the target queue when scheduling a job. Say, I have a SendMessage job and I want to prioritize the delivery for certain recipients.

To address these problems I forked the Resque repository. The results you can find in my fork with nice documentation and full test suite.

I’m also thinking of adding queue meta-data functionality to let workers / jobs assign bits of information to the queues for later reference. In my case, I want to know when the last job was processed in this queue to be able to skip over the queues crossing the throttling threshold.