12 Apr 2013

RubyMidwest 2013: Lessons and Reflections

20130411 RubyMidwest 2013 Me, Evan Light and PJ HagertyI attended RubyMidwest and want to share both my impressions and resulting growth. But let’s backup, I had debated whether to drive or to fly out to Kansas City, MO for the conference. With only two weeks to spare, our primary long distance car began having some trouble. So, I looked into the costs of renting a car, the cost of wear and tear on our car, vs the possibility of flying. After tallying up the costs and figuring that I could work part of the day while flying, I booked a ticket for Kansas City. In the future I’ll be more eager to travel by air, given that I can successfully work from anywhere with WiFi or 4G Coverage. To a lesser extent, for non-connected work, I’m also productive without the internet. If my first successful choice was flying, then my second successful choice was when I scheduled my arrival and departure. I flew in the day before the conference and out the day after. By doing this, I was rested going into the conference and able to socialize the night before it started. Flying out the day after the conference had the same effect of enabling more time with the folks that I wanted to see. Now mind you, I find these concepts fairly un-engaging but they’re important for getting the most out of the conference experience. My next big win was staying at the official conference hotel. This means that at 4am when you can barely see straight from tiredness, your bedroom is only an elevator away. Staying at the main hotel also encourages social activity… which is why we’re really at the conference. Yes, it’s more expensive. Yes, it might be a tacky venue. Yes, it’s not all magically hipster delicious. If money’s an issue, post on Twitter that you’re looking to split a room. I had the pleasure of sharing the room with Evan Light because he posted on Twitter about the hotel not having vacancies. Sharing a room’s also a great way to make sure you’re staying in the social mix of the conference rather than scuttling off to a quiet place.

Twitter is the lifeblood of Ruby Conferences.

Add a column in your Twitter client to track the hashtag designated by the conference. This means you can follow the flow and group activities. It’s also a good place to share your enthusiasm for RubyMidwest and ensure that next year has an equally awesome crowd. If you’re shy or want help being social, post something like, “Hey come say hi to me, I’m wearing a Yellow Gnu Linux T-Shirt”. Incidentally, that’s how I met Matthias who is writing this book about the Padrino Framework.

Never Eat Alone

Except for coffee when you’ve just rolled out of bed after 4 hours of sleep. Otherwise, don’t eat alone. This is your magical chance to spend time with people as nerdy or nerdier than you. If you’re stumped for conversation, ask how they started programming, what their favorite Gems are, what tools they use, if they’re part of the 20% of programmers who Raided in World of Warcraft (then judge them according to whether they rolled Horde or Alliance).

Find a Small Group

I preferred the time spent in groups of 2-8 people. This size allows for meaningful conversation between the participants. It’s also easier for those of us who are slightly hard of hearing. Each night of the conference had some conversational highlights. Friday night’s highlights were centered around the balcony at the after-party. @kobier, @elight, @samullen explained to a fellow not from the conference what it was that programmers do. By the end of the conversation, the young man was very enthusiastic about learning to program. I volunteered to help him get started and we’ve been in email contact since the conference ended. This conversation was an impressive display of the welcoming attitude that can exist in the Ruby community. On the last night of the conference, after the energy had worn off, I had some meaningful and insightful conversations. I’m looking at y’all: @Bantik, @zmoazeni, @aspleenic, @ashedryden, @erniemiller, @kerrizor, @theOtherZach, … and more.

Initiate Conversations

I started many conversations at RubyMidwest simply by walking up to people and introducing myself. The odds are that this will lead into a flowing conversation. If it’s stilted and awkward, get the conversation onto technical topics… that’s the bread and butter of conferences. Also, people at regional Ruby Conferences are remarkably friendly.

Company Culture Shows Through Employee Behavior

I’m looking at you genial folks from @Harvest: Zach and Paul. Sending folks who positively represent your company to community conferences is a win-win situation. The devs get to stretch their knowledge and have fun. The company builds a reputation among Ruby’s enthusiastic true believers. Why wouldn’t companies want to recruit from this pool of people?

What Did I Really Learn?

That I’m attending MadisonRuby, SteelCityRuby and DCamp this year. I finally decided to transition from an anonymous icon on Twitter to a goofy pic of myself.  Doing this is a direct result of making #rubyfriends at the conference.  And when they see me on Twitter, I’d rather that they see my face delivering the pithy witticisms. I’ve submitted a conference talk proposal to two venues since returning from RubyMidwest.  I’m also excited about stepping up my programming game and getting more involved in the community. These are my people :).

Thanks

To Wes Garrison of Databasically, Sam Mullen, Ross, Cerner, and everyone who made this event possible.

20 Mar 2013

Pricing a Product: Napkin Math

I’m facing the novel prospect of pricing a software product. This product is something that I created during evenings and weekends. It’s very specialized for my current industry, so I won’t go into the details of the product. But suffice to say that it sorts data in a time saving way.

Product Benefits

  • Saves 1 to 10 + hours per assignment
  • Each hour saved is worth ~ $30 +
  • Each team member has their own assignment
  • 5 to 10 assignments submitted each week
  • Concept can be applied for other divisions, requiring 60% retooling of the application.
  • Providing difficult to find answers which could avoid legal fees and fines ranging from $10,000 to $1,000,000 or more.

Product Costs

  • Developer’s time, my own = Approximately 240 hours.
  • Ongoing maintenance time = 0.5 hr / wk.
  • Monthly hosting cost = Variable based on capacity but definately < $50 / month
  • Equipment, utilities, etc during development = Not factored into estimates.

Additional Factors

  • Charging for the creativity that provided the impetus.
  • Specialized industry knowledge = Priceless :)

What’s my thought process?

My first thought was to give it away as a way to parlay into a different technical role in my organization. Like a good dealer, the first custom software taste is free, but the rest will “cost ya”. Given further information about pricing dynamics and company response to innovation, this is not seeming to be as appealing a prospect as previously thought.

Cost based pricing

Charge a sum based on the hours invested plus a bit of padding. This is the natural method that comes to mind when I consider pricing. According to RubyFreelancer Podcast, this is the Retail method of pricing. They also explain at length that this is a shortsighted method of pricing a product. The short explanation is that this ties your income to an hourly wage. One can certainly make a solid income off of these numbers. But it’s difficult to transform a product into residual income or a grand success.

Result

240 hrs * $150 / hr = $36,000

Naive Pricing

Price the product at an arbitrary value, such as $5,000. This one is also tempting. This approach seems to reflect ‘Imposter Syndrome’. Pricing arbitrarily doesn’t tie the product’s price to the benefits and savings received by the purchasing organization. Based on the business books and sales books that I’ve read in the last year, this isn’t a likely method for sales success.

Value/Savings Based Pricing

Price the product so that purchaser saves money by using it. 10 assignments/wk * 2 hr savings/assignment * $30 savings/hr = $600/wk savings + Improved chance of avoiding legal fees + Providing more accurate information to company’s client, leading to increased client retention. (Would cost $12M+ to lose a client) = $50k to 100k Savings if my system is implemented beyond our regional office (ie statewide) = ~$6,000/wk on speeding up completion of assignments. This value doesn’t factor in avoiding legal fees or improved client retention.

Conclusion

My plan to learn more about business and sales is already changing the way that I approach the process of selling my product. I’m moving towards value based pricing and considering how to turn the product into a residual income stream. It’s a very exciting time! Note: Just for the record - I intend to retain Intellectual Property rights given that it’s my own work product in off-hours.

09 Mar 2013

Two Factor Authentication for All the Things

I recently went wild with two factor authentication due to reading about Chicago VPS getting hacked. I received the nicest email from LastPass warning me that my email address was among the SQL dump posted by the hacker.

My Response

First off, according to ChicagoVPS all the passwords were in the form of salted hashes. So that’s good! Also, I use unique passwords thanks to LastPass. So losing one password to a SQL dump in the form of a salted hash isn’t a big deal. At least not with ChicagoVPS. Might be a bigger deal if it was Amazon AWS or a Google Account.

Back to the Point

I read a wonderful article, by chance, about a new service called Authy. Authy provides easily integrated Two Factor Authentication services that use your phone as the second factor. Authy either uses a smartphone application or a system based on SMS.

So where did I add it?

Caveats

After turning on Two Factor Authentication with my Google Account, I needed to setup and start using ‘Application Specific Passwords’. They’re a way to have a unique password for specific services that are not setup for the Two Factor Authentication system. To find the settings: Log into Gmail > Settings > Account > Security > 2 Step Verification Settings > Manage Application Specific Passwords > Login Again > Scroll to Bottom of Page. For each item, like Thunderbird, Sparrow App, Android applications, etc, you’ll need to give the specific password a name. Next click ‘Generate Password’. Copy that password into your application. I must say, I’ll be a lot more comfortable with online transactions when most service providers (esp. Banks, Investment Accounts, Amazon.com, etc) offer Two Factor Login options! Let me know if you’ve found any other useful places for using Authy’s wonderful 2 Factor Auth through the comments below or on Twitter @_ZPH. Credit for this article’s inspiration belongs to : This BlogFollow up… Flashed a new Rom to phone and my only hassle was with Amazon Aws 2 factor Auth. Make sure to do Authy backup to simplify this before flashing new Roman.

03 Mar 2013

A Week with ThinkingRock GTD

[caption id=“attachment_529” align=“alignright” width=“300”] By: Thomas van de Weerd[/caption]

The Good

My first week with ThinkingRock has gone REALLY well for adding tasks. I sit at the computer for much of the day and when a GTD task comes to mind I dump it via Cmd-Space GTD "description of task".

The Bad

Having a very efficient system for adding tasks paired with a HORRIBLY inefficient method of processing tasks causes my GTD Inbox to overflow.It’s like having a firehose flowing at full strength and routing it into a gardenhose.

The Analysis

The method that I’m using for adding tasks is very well optimized and uses a decoupled system. Being able to send emails from any device and having the subject and content dropped into ThinkingRock as a pending task is GREAT. When I go to sort the tasks, I’m stuck with a system that very literally follows GTD principles, but doesn’t have sufficient keyboard shortcuts. Processing 35 items by tabbing through textboxes and radio boxes isn’t my idea of an efficient system. It also makes me wonder if other people are painstakingly mousing through the interface.

The Answer

Dig into the source files for ThinkingRock and add enough keyboard shortcuts to “get things done”. I started this yesterday on the plane to California and I’ll post back when I have a chance to work on it more. Given that I don’t know any Java (other than a session at the LeanDog CodeRetreat with Steve), this will be an interesting challenge :).

23 Feb 2013

Benchmarking GTD

[caption id=“attachment_533” align=“alignright” width=“300”] By: Rubbermaid Products[/caption] I’ve been working with RescueTime for the past week and I’m VERY happy. First off, I don’t have to change a thing to make use of the system. It’s a great way to benchmark my own time spending habits on the computer. It’s well setup to allow individual configuration of what you believe is productive and non-productive. During setup, I thought about all the facets of business and independent projects. I concluded that email is a neutral value of productivity, while programming is +2 and reading HackerNews is -2. I’m happy to share this chart for my first week of use: [caption id="" align=“aligncenter” width=“1035”] RescueTime - 1st Week[/caption] Notice that I tagged email and meetings as a productivity of 0 because so little useful action comes out of them. Frequently meetings would be best accomplished in short bursts and email involves _LOTS_ of needless repetition. Given that email accounted for 6 hours of my workweek, I decided to improve the efficiency of my email process. I setup my email account with OtherInbox. OtherInbox is an email sorting service that does awesome things with Google Labels. Next I added two key combinations for Sparrow.app. One key combination opens a new email from ANY application while the other key combo brings Sparrow to forefront or hides it again. These two changes have saved me lots of time so far and reduced the effort related to context switching. Share your tips for email hacks and productivity (GTD) hacks! I can be reached via the comments and as [@_ZPH] on Twitter.

21 Feb 2013

Finite Keystrokes Before Death : Making the Most of Them

[caption id=“attachment_526” align=“alignleft” width=“300”] By: ericnvntr[/caption] The idea that we possess a finite number of keystrokes to consume before death is an ominous consideration. That’s the concept mentioned in one of RubyFreelancer’s archived shows by Eric Davis (if I remember correctly). I believe he’s quoting another person in the episode when he talks about having a finite number of keystrokes remaining. I’ve been using a text expander, i.e. snippet application, to help manage the repetitive work of typing. Common phrases or sentences that I use are added as re-usable phrases to a handy program called Dash. Dash observes when keystrokes are entered and if a trigger keyword is used, such as ‘iirc’, the program replaces that text with ‘if I recall correctly’. Dash also allows the phrase to have replaceable variables, just like you would expect fom ‘Yasnippet’ or ‘Snipmate’. As a bonus feature, Dash serves the dual purpose of being a ‘Heads Up Display’ style documentation viewer. It’s a great way to lookup STDLIB info from Ruby or CSS info. The only drawback that I’ve found is needing to manually generate Rdocs since my system settings for RVM do not install them. I accomplished this using the following script:   I’ve used the text expansion feature to save thousands of keystrokes in repetitive form entries where other automated solutions are not available. Try it out and let me know what you think in the comments or on Twitter @_ZPH. Oh yeah and map the HUD to something easy to remember like CMD-CTRL-SHIFT D. I keep all of my system-wide shortcuts on the same triple modifier chord so that they’re unlikely to overwrite standard shortcuts :). What other methods do you have for reducing repetition?

20 Feb 2013

ThinkingRock GTD: Torn Apart

GTD FTW!

Why am I engaging in this hipster habit of using Covey’s ‘Getting Things Done’ methodology? Because there’s something very valuable to it!

The analogies that Stephen Covey uses in his book hit home for geeks. He describes the working memory we humans possess as Random Access Memory, which requires energy to sustain it. Furthermore, he reminds the reader that if the RAM is busy, other thoughts can’t percolate through that stage of consciousness?

Sound too esoteric?

Let’s get down to bare metal. Or brass tacks. Or any other colloquialism that suits.

Throughout the day I have ideas. Many of them are good ideas :). Many of these good ideas percolate to the surface at inopportune moments… like meetings, reviewing reports, or writing code. These ideas are GREAT but what’s their value if they disappear before I can act on them?

Nothing. That’s how much value these ideas have if they flit right back out of my consciousness. Might not be a big deal if it’s remembering a food item to pick-up on the way home. Might be a huge deal if it’s a programming or business idea that could be implemented and turned into a product!

What’s the solution?

I mentioned using ThinkingRock GTD system in this post. ThinkingRock v2.1 is an open-source project hosted on SourceForge.

ThinkingRock does the usual stuff that one would expect from a GTD program: * Collect Thoughts in an Inbox * Processing * Organization * Reviewing * Action

What’s the killer feature of this app for my workflow?

That ideas can be dumped into it using the universal communication currency of our age, EMAIL!

My goal is to reduce the friction in the GTD system so that I waste as little energy as possible on the process itself.

Email input is a very powerful feature. I’ve setup a dedicated email account for receiving GTD tasks and then configured ThinkingRock to import tasks from there every 15 minutes.

The next step in this process was writing a short commandline script that is prefilled with the GTD email address. The script combines all commandline input less the scriptname itself and uses that value as the subject line of the email. This makes for an incredibly fluid system of GTD task entry.

Here’s the simple Ruby script for this task (note that auth info is placed in ~/.gmailrc):

But wait, there’s more! If you keep reading this blog post, you’ll receive more time saving advice at no additional cost. That’s “#{SOME_MADE_UP_VALUE}”!

Back to the point, I integrated this script into Alfred.app. Now the tasks can be entered directly from Alfred!

I’ve only scratched the surface so far with getting back into the GTD methodology… but I’m excited! Having better programming chops this time when approaching GTD is certainly improving the process :).

Still to come:

I discussed in this post that I wanted to use the open-source version rather than the newer closed source version because of having the ability to dig into the code. In an upcoming post I’ll discuss how the open-source program allowed me to investigate the data structure used for ThinkingRock in a way that would be much more challenging if I lacked access to the project source-code!

Let me know in the comments or on Twitter (@_ZPH) if you have ideas on how to improve the process.

18 Feb 2013

Executing Ruby from Vim

Want to run a Ruby script in Vim? Maybe you’re testing a little commandline snippet. Maybe you want to run a quick query against a webpage. Maybe it’s none of my business why you want to run the Ruby script!

Well here’s a little selection of my Vimscript that accomplishes just that:

Typing your leader key (mapped to ’’ by default but remapped to ‘,’ by you, right? ) and hitting ‘rr’ in quick sequence will execute the current file using your Ruby interpreter. If you’re using RVM to manage your Rubies, you might also want to consider adding the vim-rvm extension to use the ‘correct’ Ruby.

18 Feb 2013

Making Marked.app Work with Vim

I found the delightful ‘Marked.app’ for OSX recently. It takes any Markdown file and parses it using a few standard Markdown interpreters, displaying a live view of the text as html.

Of course I wanted to use it everywhere. And by everywhere, I mean in Vim. And by that I mean @JEG2 posted the idea on Twitter:

Open an Emacs file in Marked.app:github.com/JEG2/dotfiles/…

— James Edward Gray II (@JEG2) January 25, 2013

And I ported it into a couple of lines in my .vimrc:

Enjoy seeing your markdown render while typing in a 30+ year old text editor =D.

18 Feb 2013

Making Thinking Rock v2.1 Work on OSX 10.8

So, PRODUCTIVITY, GTD, BUZZWORDS HERE. I’ve used ThinkingRock before when on a GTD kick a few years back. I liked how strictly it followed GTD. I liked being able to email myself thoughts to act on later, since email is the universal currency. I liked the tickle feature. I’m certainly willing to pay for software, as evidenced even by my donations to VIM, but I like the flexibility that’s available with open source software. The older version, v2.1, of ThinkingRock is available on SourceForge along with the source files. Given that I know zero Java, I thought it would be fun to have the source available for any program that I’m regularly using. So that leaves me with installing v2.1 on OSX 10.8 rather than the newer version. Unfortunately, while the newer version installs quite nicely and opens as you’d expect, v2.1 throws an error : unable to locate jdkhome, use –jdkhome switch. I Googled around and found this explanation of the JDK location and combined it with this explanation in order to come up with the following solution: hard code the bin/tr shell script to include the appropriate jdkhome location. Here’s the modified file:Note that line 21 is the modified line. Now on to revive my 3 year old GTD files, do some major deleting, get email dumps setup, and Get Things Done.