Hello, my name is Ren Provey. I am a full stack web software developer with a deep interest in user experience and web analytics.
Sidekiq ProTip #1
Is Sidekig giving you: TypeError: can't dump anonymous class Class? aka the most helpful error message in the world?
It takes some digging, but here is the deal: Sidekiq's .delay method only works with Ruby 1.9.3. So if you're doing @user.delay.some_long_running_method, it'll fail unless you're on 1.9.3. See: Sidekiq Issue #84.
At work, I've been lucky enough to be developing an entirely event driven application (more on that in the future). I knew it would be an interesting challenge, but I didn't realize how much I'd enjoy it.
Being a green field app, we're using a number of technologies and services that have me excited. While it took me a bit of diliberation to decide on, the piece that has really surpised me and expanded my architectural thinking is PostgreSQL's hstore. In hindsight the fact that hstore is allowing us the flexibility to prototype quickly, is less surprising than the fundamental shift in how I've started thinking about storing an retrieving data.
If you're interested in checking out hstore, I recommend the following stops:
The one bit that took me some time to find was about getting hstore running in my Rails test environment. Rails' default schema load doesn't enable the Postgres extension (as happens in rake db:test:prepare). To have hstore enabled you'll need to uncomment or add the following line in config/application.rb:
config.active_record.schema_format = :sql
This will change your schema dumps from Ruby to SQL. If you're unsure about the implications of this change, you can learn more in this Rails Guide.
The cat is officially out of the bag. After a healthy amount of collective anguishing, Candice has accepted the position of Associate Chaplain at Yale University. We're dreading leaving Durham, excited to explore New Haven, and thrilled that Yale and Duke share similar color schemes.
To this end, if you know of great places to live in New Haven, interesting places to work, or people who enjoy eating pizza as much as I do – please let me know.
After reading Mark O'Connor's post about swapping his MacBook for an iPad+Linode, I decided to give the setup a whirl. For reasons that probably defy logic (what can I say, I'm a slave to fashion), I substituted Panic's Prompt for the recommended iSSH and have yet to feel any pain from the decision.
Mark covers a lot of the setup for a Linode server in his follow-up post. For now, I am just SSHing to my home machine via no-ip.com, and the only real fiddly bit that I needed to add was the following in my vimrc:
The key thing here is to force solarized to use the let g:solarized_termcolors=256 even if vim is running in a terminal. Panic's Prompt by default will register itself as a 16 color terminal, to get 256 colors working (and the beautiful Solarized color scheme), I added export TERM=xterm-256color to the login script which can be configured in Prompt's individual machine settings.
We'll see how the setup works out, for now it is nice to just be traveling around with only an iPad.
While reading the HCD Toolkit, I've noticed that each section is roughly the same size. Don't get me wrong, each section has been a small wonder-world of information, but I couldn't help wonder if the Deliver section had been hardest of all to trim down. It covers a lot of ground and not a word was wasted. To summarize it would be to re-write it, but the pieces of the section which really resonated with me were:
Mini-Pilots & Pilots - These seek to allow understand and refine the solution, its context, and support system as well as possible. I especially liked the idea of mini-pilots that focused on a subset of the solution and/or allowed participants a deeper understanding by taking them out of their traditional roles.
On-going Learning & Iteration - This is something that I think is so often missed, or haphazardly bolted on at the end of a implementation. This involves revisiting stories from the Hear phase as well as collecting new ones while continually refining the solution.
Page 97 of the IDEO Toolkit
Measuring Impact - The toolkit does a great job of diving in to indicators like leading and dynamic changes (both positive and negative), assessing outcomes, and strategies for measuring the impact of a solution in a holistic fashion.
As you can tell, I am a big fan of the upfront work and the continual learning presented. I think companies all too often equate a customer's final product with their final product. A great product doesn't end with ending up in the customer's hands. Putting a product in a customers hands is an opportunity to learn more about the product, evolve the product (see the product lines here), and recognize the new opportunities a strong product creates.
While I can't do the toolkit justice in my notes, I fount the Create section to be a real gem. The goal of the Create phase is to synthesize the research of the Hear phase, identify opportunities, brainstorm solutions, and create prototypes with the purpose of eliciting feedback. Through the create process, don't focus on feasibility and viability, instead focus on desirability.
Story Sharing - These are stories collected from in the Research phase. When sharing, remember to be specific and be descriptive (use physical senses, cover who, what, why, when, where, and how). No judgement. Create post-it notes of key pieces of information.
Pattern Identification - Select the most surprising and provocative post-it notes, grouping them into related thoughts. Create a succinct "insight statements" for each post-it group which summarizes the take-away.
Find Themes - Sort the insight statement cards in to themes and evaluating each to make sure they are on the same level. Some themes may need to be generalized, while others may need to broken apart.
Create a Visual Framework - A framework is a visual representation of a system, often a framework will take one of the following structures:
Page 70 of the IDEO Toolkit
Create opportunity areas - Ask the question "How might we..." (HMW) - Opportunity areas are not solutions, but questions to spur idea generation and the brainstorm of multiple solutions.
Brainstorm! - Brainstorming makes us think expansively and without constraints, so there are no bad ideas and wild ideas are encouraged. Build on ideas using AND rather than BUT. Go for quantity, 15-30 minutes per HMW. The practice of generating impractical solutions often sparks ideas that are relevant and reasonable. The toolkit provides a rough rule of thumb, that out of 100 ideas 3 may be truly useful.
Prototype - Make solutions tangible in a rapid and low-investment way. Prototypes are disposable, they should be built as roughly and as rapidly as possible.
Feedback - Feedback brings constituents directly back in to the design process. Presenting multiple prototypes/ideas allows people to easily give honest feedback via comparing and contrasting. For each prototype identify 3-4 questions you'd like to answer.
As the toolkit is meant to, the Hear section is very focused on working with folks in under resourced areas of the world, but I found a few principles which are easily extended to a process working with a broader group. The goal of the Hear phase is to gain a strong understanding of an audience's needs, barriers, and constraints.
Engage in context - While this section is called Hear, context is the reoccuring theme. The way a person presents a narrative, can differ from actual observation, especially when a person is learning a new skill or process. So, hear with all five senses, and hear in the actual environment a person will be operating in.
Be qualitative - Seek a broad understanding. Work to understand a person's social, political, economic, and cultural oppertunities as well as barriers. Analyze the relational dynamics in a system (eg., people, places, objects, and institiutions).
Testing - This is the chance to validate assumptions and preconceptions, be very intentional about letting any through without verfiying them.
Framing - Challenges and statements should all be framed from constituents point of view.
Inspiration - Look for inspiration in new places, search for similar problems in different contexts. The concept seems so incredibly straight forward, but rarely to I take the time to intentionally think about parallels of a design problem. The toolkit gives the example of hospital staff visiting a hardware store to gain insight about organizing supplies.
The toolkit goes in to excellent detail on how to identifying a challenge, recognizing existing knowledge, research, interview, immerse, and document.
The toolkit was funded by the Bill & Melinda Gates Foundation, targeting organizations that work in Africa, Asia, and Latin America. I am not going to lie, while traveling to Asia would be wonderful, I am reading the toolkit hoping to draw out some more general lessons of the human centered design process.
The Three Lenses of Human Centered Design
The HCD process examines starts with the people being designed for, examining thier needs, dreams, and behaviors. The process steps through the following 'lenses':
Desirability - What do people desire?
eg. Rocket pants, space cars, unicorns, and sporks. To be desired something dosen't necessarily have to be feasible, which brings us to...
Feasibility - What is technically and organizationally feasible?
And now we have to cross rocket pants, space cars, and unicorns off the list, leaving us to examinine the viability of sporks.
Viability - What can be financially viable?
So, I am assuming the spork business is pretty competative and covered by many interenational patents and we're back to the drawing board.
"The premise of the system is ideally suited to rapid prototyping, but it would work equally well when integrated into a production environment. There are printable sketch sheets, design layouts, and a CSS file that have identical measurements." - http://960.gs/
What the hey? Sounds good enough to me, lets give it a whirl. Since this site is heavily gridded, I decided to convert it.
For starters I added the following a wrapping div <div class="container_12">, you could go with 16 column grid: <div class="container_16"> and was in business.
Basically, moving items about the grid, is dead simple, above is my introduction: <h1 class="grid_5 prefix_7 clearfix">Hello, my name is ... and technology.</h1>.
The class grid_5 places the element across 5 elements of the grid. I added a class of prefix_7, which shifts the element to the right by 7 grid columns.
By using the grid, prefixsuffix, classes you can position elements about the grid. The last bit to remember is that if a continer has a grid within it, attach a class of alpha and omega to the last.
HTML5 Audio Tag
<audio src="happyhappyjoyjoy.mp3" controls></audio> — Like many HTML5 tag attributes, by simply being there, controls is true. Something like controls="false" would still display controls (we're looking at if the attribute exists, not what it is set to). If you don't want them, just leave controls out.
The preload attribute can be set to one of the following:
none — don't preload until specifically asked,
auto — preload as much as possible,
or metadata — (default) load metadata and first frame of video.
Other attributes are autoplay and loop. For obvious reasons, never tell anyone that either of those exist.
<audio> also has a long form for specifying fallbacks when an audio format is not supported:
At this point in the discussion, HTML5 For Web Designers author, Jeremy Keith, has a cheeky little bit about OGG not being "crippled" by software patents, so I'll add a cheeky little link here. Good luck finding the comments section!
HTML5 Video Tag
Video is very similar with a few extra helpful attributes: <video src="happyhappyjoyjoy.mp4" controls width="300" height="200" poster="placeholder.png"></video> — all those should be self explanatory, poster is what allows you to specify a placeholder image.
We interrupt your regularly scheduled programming to bring you this Heroku Pro Tip. If you're getting errors caused by Heroku installing your dev or test groups from bundler, run: heroku config:add BUNDLE_WITHOUT="test development" --app app_name