Posted 18 days back at Jay Fields Thoughts
I recently typed out a long, thoughtful response in a textarea. I clicked submit, like I've done millions of times, and I got the dreaded "session expired" error message. This happens very, very rarely, but it's devastating when it does. Creating long & thoughtful responses isn't something that comes naturally for me. I crossed my fingers and clicked back. No luck, web 2.0 dynamically created text boxes ensured Chrome had no chance to preserve my editing state.
My first reaction was: I guess I'm not responding after all. Then it occurred to me, DevTools must have my data somewhere, right? Lucky for me, the answer was yes.
There might be easier ways, this is what worked for me:
- open DevTools
- go to the "Network" tab.
- look for the row with the method POST.

- If you don't see a POST row, try refreshing the page. With any luck you'll get a repost confirmation dialog, giving you some hope that your data is still around. (You'll want to allow the data repost)
- click on the POST row, and scroll down till you see "Form Data". If you've gotten this far, hopefully you'll find your data in clear text and able to be copied.
The examples from this post are from following the instructions above and logging in to
twitter.com. If you've ever lost post data in the past, you may want to give these directions a dry-run now.
Posted 19 days back at The Chris O Show - Home
Ever want to fill up the screen with a Google Map and make it the background? We wanted to do that for the picture page on HitMeUp.
Here’s an example of what I’m talking about: https://hitmeup.co/hits/et
Turns out it’s pretty easy to do.
Let’s say you have basic markup like this:
<script src="https://gist.github.com/thechrisoshow/964d05d45902079f7f52.js?file=map.html"></script>
And the standard javascript like:
<script src="https://gist.github.com/thechrisoshow/964d05d45902079f7f52.js?file=application.js"></script>
Then what you want to do is absolutely position the map, and pin it to the top/left/right/bottom sides. The container div is where you put everything that you want to float on top of the map.
<script src="https://gist.github.com/thechrisoshow/964d05d45902079f7f52.js?file=application.css"></script>
And boom – you’ve got a Google Map in the background that looks like:

Posted 19 days back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home
Episode 47: Two hours per minute:
In this episode, recorded at RailsConf 2013, Ben Orenstein is joined by Ryan Bates of RailsCasts. Ben and Ryan discuss Ryan’s transition to working on RailsCasts full time, staying up to date on the latest technology, how his coding style has changed, maintaining his open source, the process of producing RailsCasts, why he doesn’t speak at conferences, the latest technology he is excited about, and much more
Posted 19 days back at Phusion Corporate Blog
Phusion Passenger is software that deploys Ruby and Python web apps, by integrating into Apache and Nginx and turning them into a fully-featured application server. It is very fast, stable and robust and thus used by the likes of New York Times, AirBnB, Symantec, Pixar, etc. It comes with many features that makes your life easier and your application perform better.
After a period of being in beta, we’re proud to announce the first stable release of the Phusion Passenger 4 series. The 4.x series is a huge improvement over the 3.x series: during the development of 4.0, we’ve introduced a myriad of changes which we’ve covered in past beta preview articles:
The beta period took a while because we wanted to ensure that the first stable release is indeed rock solid. People tend to say that one should skip “x.0.0″ releases and wait until “x.0.1″ for the first bug fixes. But we’re confident enough about the stability of the 4.x series that we gave this first release the version number 4.0.1.
Changes in 4.0.1
Compared to 4.0.0 RC 6, the following changes have been introduced:
- Fixed a crasher bug in the Deployment Error Resistance feature.
- Fixed a bug in PassengerDefaultUser and PassengerDefaultGroup.
- Fixed a bug which could cause application processes to exit before they’ve finished their request.
- Fixed some small file descriptor leaks.
- Bumped the preferred Nginx version to 1.4.0.
- Editing the Phusion Passenger Standalone Nginx config template is no longer discouraged.
- Improved documentation.
Installing and testing 4.0.1
Quick install/upgrade
Phusion Passenger Enterprise users can download the Enterprise version of 4.0.1 from the Customer Area.
Open source users can install the open source version of 4.0.1 with the following commands:
gem install passenger
passenger-install-apache2-module
passenger-install-nginx-module
You can also download the tarball at Google Code. All our gems and tarballs can be cryptographically verified.
In-depth instructions
In-depth installation and upgrade instructions can be found in the Installation section of the documentation. The documentation has been updated to cover 4.0 changes, including Enterprise features. You can view them online here:
Final
We would like to thank everybody who has helped with testing the betas and release candidates so far, and we would like to thank our Enterprise customers. We couldn’t have done it without you!
4.0.1 is just the beginning though. We have many excited changes on the pipeline. Want to stay up to date? Fill in your name and email address below and sign up for our newsletter. We won’t spam you, we promise.
Posted 19 days back at Railscasts
With the release of Rails 4.0.0.rc1 it's time to try it out and report any bugs. Here I walk you through the steps to upgrade a Rails 3.2 application to Rails 4.
Posted 20 days back at Mike Clark
<iframe src="http://player.vimeo.com/video/65509381" width="640" height="360" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
After several late snowstorms, it feels like spring has finally arrived.
And that means young critters are coming out of their dens for the first time!
Nicole and I have been studying a red fox family: mom, dad, and their
five new pups. When it's time to come out and play, it's non-stop
running, jumping, and wrestling as they practice the skills they'll need
for life on their own. A scavenged tennis ball rolled down the hill makes for
a fun game of catch the "prey".
Posted 20 days back at 赖洪礼的 blog
It has been a while since I’ve joined the #passenger channel on irc.freenode.net, but I notice that people regularly join that channel for support. It would be a shame if a user joins the channel, asks a question, then leaves frustration because nobody responds. However I cannot watch IRC all day. How do we solve this problem?
Luckily there are programs that can aid me in this. Luuk uses a so-called “IRC bouncer” to stay online even when his client is disconnected. The bouncer runs on a Unix server, and the client connects to the bouncer instead of the IRC server. When he connects his client the bouncer will replay messages that he missed.
There are many IRC bouncers out there. After some research it would appear that ZNC is the most actively maintained one. It’s written in C++ and is extensible through C++, Python and Perl.
Armed with ZNC, I’ve setup the following things:
- I’ve configured ZNC to automatically set me away on IRC when my last client disconnects. My away message tells the user that my timezone is in Europe, and kindly refers him to the Phusion Passenger support page in case I don’t respond quickly enough.
- I’ve also setup my IRC client to display a notification whenever my nick is mentioned in the channel, in case I am behind (or nearby) the computer but not watching the IRC window.
- Finally, I’ve setup a channel topic that welcomes users, and tells them to mention my nick in their message to nudge me.
So far so good, but this alone isn’t enough. Not all IRC clients display away users in a special way, so users may not be aware that I am away. Also they may not read the channel topic when they enter the channel. ZNC doesn’t have any built-in functionality that can aid me further, so that’s when I decided to write some ZNC modules. Their API looks fairly easy.
The result is on Github. I’ve written two modules:
- channel_away.cpp: if I’m away, then whenever someone sends a channel message that starts with my nick, ZNC will send an autoreply.
- welcome_to_passenger.cpp: whenever someone joins #passenger, ZNC will send that person a welcome message, encouraging that person to ask a question and explaining to that person that I may be away, so please visit the support website if nobody answers.
I hope that #passenger has become a much friendlier place now and that my ZNC modules are useful to other people.
Posted 22 days back at 赖洪礼的 blog
My blog has been down for a while because of a DNS problem. It’s finally fixed.
Posted 22 days back at Mike Clark
Came across an unexpected traveler in the field headed for the greener
waters of a new pond.
Up close, he resembles of Jabba the Hut.
Posted 22 days back at Ruby5
News from RailsConf, Rails 4.0rc1, and our usual selection of interesting gems and articles from the Ruby Community.
Listen to this episode on Ruby5
This episode is sponsored by New Relic
You should be using NewRelic by now, but do you regularly check out their blog? They have a great series of tech tips for Ruby going on right now, celebrating RailsConf. The most recent one is “Debugging Stuck Ruby Processes – what to do before you kill -9”
There are 7 great articles in the series so far, and more to come!
If you just haven’t gotten around to checking out NewRelic yet, now’s the time. As always, your free account is waiting for you.
Rails 4.0 RC1
Rails 4 release candidate 1 is out! check it out and report any problems. If all goes well, we'll have a final release in 3-4 weeks!
Happiness
As developers, we spend a lot of time optimizing. We optimize our code, our editor, our seatcushions, but in this blog entry, Earnie Miller talks about the most important optimization of all.
RailsGirls SOC
This summer RailsGirls are trying to bring more women into the Rails community. They are currently asking for project submissions.
An ideal project should be simple enough that a beginner could complete in three months or less. But they are hoping to make a valuable and significant contribution to a project.
RailsConf links
Eric Oestrich has been collecting links from the happenings at RailsConf and publishing them on the SmartLogic Solutions blog. We'll feature the first day as the story link, and add the other days as comments on this story.
XRAY-RAILS
XRAY-RAILS is a new development tool that reveals your UI’s bones. it lets you visualize the higher level components of your UI including Controllers, templates, partials and even Backbone views.
It draws shiny red rectangles around the different sections of the page revealing which views or partials generated it. it already supports rails views, partials and backbone views
MAD LIBS
This was a fun story to record. I'm not even going to describe it here so you have to listen to it.
SinglePageApp Book
Mikito Takada has written the book he wishes he had when he started developing single page apps. This is a book to help people understand the concepts and patterns for building single page apps, where most of the functionality is on one javascript-heavy page interacting with the server in the background.
Posted 23 days back at Jay Fields Thoughts
When I was doing a fair bit of Ruby I often used the TextMate's shortcut (Ctrl+:) to convert a Ruby String to a Symbol or a Ruby Symbol to a String. It's something I've periodically missed while doing Clojure, and yesterday I found myself in the middle of a refactoring that was going to force the conversion of 5+ Clojure Keywords to Strings.
The following emacs lisp is my solution for toggling between Clojure Strings and Keywords. The standard disclaimers apply - it works on my machine, and I've never claimed to know emacs lisp well.
<script src="https://gist.github.com/jaycfields/5502257.js"></script>
A quick video of the behavior:
<iframe width="560" height="315" src="http://www.youtube.com/embed/UQU7xasn3eA" frameborder="0" allowfullscreen=""></iframe>
Posted 24 days back at GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS - Home
Besides moving attribute whitelisting to the controller rather than the model,
Rails 4’s move to
Strong Parameters
over attr_accessible provides great documentation about the data with which
records are being created.

Here is an example of a controller many of us have written, using
strong_parameters:
class CommentsController < ApplicationController
respond_to :html
def create
@comment = Comment.create!(comment_params)
respond_with @comment
end
private
def comment_params
params.
require(:comment).
permit(:body).
merge(user: current_user, commentable: commentable)
end
def commentable
# find and return a commentable record
end
end
Notice how the comment_params method tells you at a glance what object’s
parameters this controller/action cares about (comment), the specific data
being used (body), and the extra information being added. After glancing at
the method, you hardly have to concern yourself with the rest of the class:
everything just makes sense.
strong_parameters will be standard in Rails 4.0, but they can be used now in
Rails 3.*.
Written by Caleb Thompson
P.S. You can include ActiveModel::ForbiddenAttributesProtection on a
model-by-model basis, but given the level of awesomeness provided I wouldn’t
recommend it.
Posted 24 days back at igvita.com
Deploying new image formats on the web is a challenge, but not an unsolvable one, and one that would pay high dividends in terms of performance. In fact, there are many ways to tackle the problem: client-side logic, server negotiation, and hybrid strategies. There is a time and place for each one - they are not exclusive.
Having said that, I'm partial to server negotiation as it requires the least amount of work to move the web forward in a significant way: a single flip of a switch by a CDN or a large hosting provider, instantly enabling significant byte savings for all of their users. Computers are great at performing routine negotiation work, humans are not: we get bored, we get lazy, we routinely forget to optimize our images.
WebP deployment checklist
As a hands on example, let's take a look at what we would need to enable Accept negotiation for deploying WebP:
- User agents which support WebP should advertise it in the
Accept header
- Servers and caches should use the
Accept header to serve appropriate assets
- Origin servers must specify
Vary: Accept in generated responses
Most importantly, notice what's missing: there is no mention of having to modify the markup or logic of millions of individual web applications. Having said that, the above steps still require some work, let's dig a bit deeper.
Configuring Accept negotiation in Nginx
The great news is that Chrome Canary is now advertising image/webp in its Accept header for all image requests - with that in place, we can check off the first item on our checklist above. Now, we need to configure our Nginx server to automatically serve the right file. To start, let's assume we have a pre-generated a WebP asset on disk:
location / {
# check Accept header for webp, check if .webp is on disk
if ($http_accept ~* "webp") { set $webp T; }
if (-f $request_filename.webp) { set $webp "${webp}T"; }
# if WebP is supported, and WebP is on disk, serve it!
if ($webp = TT) {
add_header Vary Accept;
rewrite (.*) $1.webp break;
}
# ...
}
First, we check if the Accept header is advertising WebP. Then we check if there is a corresponding file with a .webp extension on disk. If both conditions match, we serve the WebP asset and add Vary: Accept - done.
Now, let's consider the case where Nginx acts as a proxy cache. Here we need to teach Nginx to cache and serve multiple variants of the same image (WebP and non-WebP versions) based on the value of the Accept header:
server {
location / {
# lookup inbound requests with exta WebP flag if advertised in Accept
if ($http_accept ~* "webp") { set $webp T; }
proxy_cache_key $scheme$proxy_host$request_uri$webp;
# proxy requests to remote servers
proxy_pass http://backend;
proxy_cache my-cache;
}
}
Not much different from the previous example! Instead of checking the local disk for the asset, we pass the request through to some set of backends, and append the WebP bit to our cache key - that's all there is to it.
Accept fragmentation and Key
Wait, why didn't we just append the $http_accept variable to our proxy cache key above? Unfortunately, the Accept header varies from browser to browser, which means that using the raw header would unnecessarily fragment the cache. Hence, we scan for WebP support in the header and add an additional bit to the cache key.
However, wouldn't it be nice if we had a standard mechanism to define a custom cache key? Well, good news, there is work underway on the new Key response header, which will act as a smart replacement to Vary:
The 'Key' header field for HTTP responses allows an origin server to describe the cache key for a negotiated response: a short algorithm that can be used upon later requests to determine if the same response is reusable.
IE is special, as always!
Unfortunately, Vary support in IE, even in the latest versions, remains very poor: IE does not cache outbound headers, which means it cannot perform the appropriate matching algorithm, and is forced to issue a revalidation request on any asset with Vary. As a result, to avoid the extra requests, we can create a special case for IE:
if ($http_user_agent ~* "(?i)(MSIE)") {
# drop Vary for IE users, mark resource as private
proxy_hide_header Vary;
add_header Cache-Control private;
}
With the above configuration in place, IE users won't see Vary, and resource is marked as private: it can still be cached on the client, but it won't be cached by any other intermediate proxy.
The "action plan", continued...
Small steps, but we're heading in the right direction. We've addressed the issue on the client, we know how to configure our servers, now we need to push for better support by proxies and CDN's - ideally, by deploying support for Key! The good news is, this requires work, but it is not rocket science. As a case in point, CDNConnect recently enabled transparent Accept+WebP negotiation for all of their users.
Finally, let's take a look at Facebook's recent experiment with WebP, as summarized by ArsTechnica:
It turns out that Facebook users routinely do things like copy image URLs and save images locally... As a result, users were left with unusable URLs and files; files they couldn't open locally, and URLs that didn't work in Internet Explorer, Firefox, or Safari.
URL sharing is not an issue if Accept negotiation is configured correctly - see instructions above. Next, once a file is saved locally, you need a local WebP codec or viewer. The good news is, Chrome just landed a patch to register itself as a default WebP handler across all platforms - if you have Chrome, you can view local WebP files, and there is a growing list of editors, viewers, and plugins. Also, there are ongoing discussions about enabling the browser to save a "safe copy" of the asset to mitigate the problem entirely. One step at a time, we're getting there!
Posted 25 days back at mir.aculo.us - Home
In our app Freckle Time Tracking we’re sending out weekly reports to users by email, reporting to them what they achieved last week.
Our emails not only include a report, listing all entries they logged, but also our “Mini-Pulse”, a graphical representation of how much they worked for each project.
Here’s how a typical email we send out looks like:

Now, generating a table and styling it for the HTML email is (relatively) easy, and beyond the scope of this article, but let’s have look at the charts in the email. We already generate the Mini-Pulse graph in our web app—we use an ancient version of Raphael.js to generate SVG, and this gets the job done nicely (SVG works on practically every modern browser, and Raphael falls back to VML on older Internet Explorer versions). Of course, you could use Canvas or any other HTML supported by WebKit just as well.
This is all great in your web browser, but not for emails. First off, obviously, JavaScript
is disabled in HTML emails, so we can’t use that to generate the SVG on the fly; moreover
SVG only works in a handful of email clients.
The only image formats that reliably work in HTML emails are GIF, PNG and JPEG, which means we have to dynamically generate such an image containing the charts and refer to it from the email.
There’s two possible ways to do this:
- Reimplement the logic and rendering with a tool specifically made for generating chart images
- Reuse the existing JavaScript/SVG code in a headless web browser and make “screenshots”
We chose to reuse the code we have, so we can easily adapt and extend both the web app and the HTML emails in the future (plus no need to learn yet another tool!).
A great way to create screenshots of the graphs is to use PhantomJS, which is a headless WebKit with an API that has support for taking screenshots.
We also have the following requirements for our report emails:
- Don’t generate the Mini-Pulse if the email is never opened, to conserve server resources
- Cache the generated image once the email was opened once
- Securely serve the image and use encrypted URLs with embedded authentication (the user the email was sent to may no longer have permission to access Freckle at the time the email is opened)
- Charts should be retinafied (your HTML emails are retinafied, are they?)
- File size of image should be small so it loads fast on mobile email clients
To fulfill these requirements, here’s what happens when a user opens an email that has a chart embedded:
- HTML email is shown
- Email client or browser accesses URL in the form of https://app.letsfreckle.com/m/xxxx/yyy.gif
- If there’s a cached version of the image serve it and go to step 10, otherwise continue to step 4
- Rails app decrypts account ID, user ID, chart type and date range from the given encrypted URL*
- Rails app calls internal PhantomJS web service with a URL to call to generate the chart
- PhantomJS web service calls the Freckle Rails app internally
- Rails app serves Raphael.js, and our chart generation code and the data needed for it. (We use a special, stripped-down layout that only serves the chart and doubles resolution on everything to simulate rendering on a high-density screen (a feature that Raphael.js doesn’t yet directly support).
- PhantomJS renders the page
- PhantomJS returns a GIF to Rails (the call from step 4)
- Rails returns the GIF and caches it into a file (Rails page caching)
- Email client or web browser renders the GIF
All this sounds pretty complex, but it’s actually implemented in just about a hundred lines of code.
There’s a few tricky things you have to deal with when installing Phantom.js on a Linux server, such as adding fonts that may not be part of your default Linux server setup, but it’s pretty easy to get going. For Ubuntu 10.04, you can check out this gist with instructions on getting decent rendering quality.
*To accommodate passing parameters along from an HTML email to our Rails app, I’ve released URLcrypt, an open-source, MIT-licensed Ruby library for ‘elegant’ encrypted URLs. Alternatively, you could also use a table the holds tokens, but I find encrypting the account/user id information a more scalable solution.
Posted 25 days back at Jay Fields Thoughts
The average lifespan for a software engineering job is 4 years. Okay, I've never actually seen proof (or contradiction), but that's the general feeling in the groups I associate with. Perhaps that's selection bias - my employer has generally changed on year 3 or 4. Perhaps this is the exception and not the rule, in that case feel free to simply read this as an experience report. However, I do think it's somewhat common for developers to leave around year 3 or 4. This entry contains speculation on why they leave, and offers one idea on what employers can do to break that cycle.
My 4 year employment cycle generally looks like this
- Year One: "I'm in over my head. My semi-bluff was in-fact a bluff. They're going to fire me any day."
- Year Two: "It's nice to feel like a productive team member"
- Year Three: "This is fun, and I'm not bad at it. It's satisfying to pass on knowledge to teammates."
- Year Four: "This feels repetitive, that grass over there sure looks greener"
I expect that I, like many programmers, probably undervalue my contribution in the early days and overvalue my contribution in the latter days.
In Year Three and Four at
DRW I spent some time thinking about how I felt, and observing the behavior of some colleagues that were also on year three and four. A few things stood out to me.
- A company you don't work at always seems to have infinite possibilities; however, after a few years with an employer, it's extremely clear what your options are. More importantly, it's very clear what limitations will likely always be there.
- A company you don't work at contains no code you're responsible for. Conversely, any company you've been with for 4 years probably has plenty of code you're not proud of. If you're responsible for that code, it's a constant reminder of your previous limitations. If you're not responsible for it, your co-workers aren't likely to let you forget about it anytime soon.
- There's always someone willing to pay you more than you're worth. After several years with a company it's likely that they're going to pay you what you're worth, but not what some other company thinks you're worth. I'm surprised that more companies don't pay (the employees they want to keep) what their "flawless market value" would be. In other words, what would you pay them if they interviewed, you determined what they knew, you determined what value they would bring, and you were completely ignorant of their flaws? That's what your competition is likely doing. That's what you're fighting against if you want to keep them around.
- A new job often offers a new challenge. Once you feel like you've given that challenge your best shot, what remains? If you did a great job, it's likely that you'll have plenty of other options. However, if you've done a good job, you may be stuck in a spot where there aren't as many open doors and challenges to choose from - not nearly as many as a position at another company will appear to offer.
I was recently in Punta Cana for wedding, and I was on the beach - working on my laptop. My wife asked: don't you want some time off? My response was short and immediate: no. Later that evening my wife and I discussed my work situation. I observed that I'm in Year Five at DRW and I'm happy, happier than ever, strange - given my previous experiences. She asked if I thought that I was working too much, and if I thought that I would burn out. I remarked: I'd rather have a job that I love, that I don't like to be away from, than a job where I feel like I need a week or two off.
I hear you, nice work if you can get it. I don't have a general recipe for getting there, but I know how I got there.
Back in 2009 I interviewed at DRW. At the time I was working for
ThoughtWorks, and my client was
Forward. I considered the founder of Forward to be a friend and someone I would gladly work for. I decided it was time to leave ThoughtWorks (after 3.5 years), and I was sure that Forward would be my future home. I remarked to my DRW recruiter "H" (who also happened to be a friend from my ThoughtWorks days) that one of the best things about Forward was knowing that I liked and trusted the man who ran Forward. H said nothing, but made a brilliant move.
In my interview I was grilled, killed even, and then things turned. I met with a guy who asked me a few questions and then told me about the company: the vision, the people, and where I could fit in. He was smart, easy to talk to, and someone I related to. We discussed things casually, it didn't feel like a company pitch in any way at all, it felt like small-talk - something I was very grateful for after the beating I'd taken previously in of the day. After everything concluded I hit the bar with my friends, including H. At that point they revealed to me that the guy I'd met was the partner at the firm that was (among other things) responsible for the firm's technology. I'd also met the CTO, and various other people responsible for technology in the firm. H had shown me that DRW, just like Forward, had what I like to call Awesome All the Way Up.**
Awesome All the Way Up has served me very well at DRW. To this day I remain in fairly common contact with the CTO and several of DRW's partners. About 6 months ago I asked 3 favors. First of all, I asked for enough money to pay someone's salary for 6 months. I identified a project that I wanted to undertake, and I needed help to complete it. Then things got unconventional, I asked if I could create a contract-to-hire situation. Even more unconventional, I pursued a friend and previous colleague who lived in Austin, Texas. DRW rarely uses contractors, and has no other remote employees that I'm aware of. An appropriate amount of questions were asked, but in the end my request was granted.
The experiment is on-going, but I'm very happy with our progress so far. That's all well-and-good, but the support of DRW is the important aspect of the story. I'm confident that their support of my unconventional requests was a major factor in ensuring my happiness in Year Five. We recently hired
John Hume, thus declaring success at some level already. However, if things had gone poorly, both parties could have gone their separate ways with little lost and lessons learned. More importantly to me, DRW would have continued to give me confidence that they were willing to take chances to provide me with opportunities and ensure my continued happiness at the firm.
There's a similar discussion around DRW allowing me to use Clojure as my primary development language. I'll spare you the long version. tl; dr: They gave me a reasonable amount of space to try something new, and supported me appropriately as we found more and more success.
Not all of my experiments are green-lighted, and I've also had unsuccessful outcomes. DRW has done a good job of not setting me up to fail; my ideas that have a low probability of succeeding are fleshed out and appropriately shot down. All experiments have risk measures put in place, limited downside, and are reassessed constantly. It's great to have support when things are going well, and it's essential to have support when things don't go as planned.
For me, that's been the secret for keeping me around more than 4 years: An appropriate amount of trust and a willingness to experiment.
A foreign thought also recently came to mind. For the first time in my life I can say that I see myself happy and successful at my current employer in 10 years. This is a question I've asked many people since it occurred to me. To date, +AdeOshineye (http://www.oshineye.com/) is the only person who's responded affirmatively. The results aren't surprising to me, but I do wonder why more employees and employers aren't looking for ways to extend relationships.
Perhaps the secret for keeping me around is more broadly applicable; however, simply asking what will keep an individual around is probably the more important message in this entry. It's good to know what will make someone happy now, but it seems like it's equally important to know what will make them happy in the long term. I suspect the answers will be at least a little, if not very different.
The way things currently stand, I'm looking forward to writing about Year Six.
** DRW became my home in the end; however, Forward continues to do well. I suspect Awesome All the Way Up would have ensured happy and gainful employment at either destination. I remain in regular contact with my friends at Forward.