Deep Each in Ruby

I’ve got a project where I’m using a multidimensional array to represent a grid. It’s conceptually simple. The grid would look something like this:

--------------------------
|  1 |  2 |  3 |  4 |  5 |
|  6 |  7 |  8 |  9 | 10 |
| 11 | 12 | 13 | 14 | 15 |
--------------------------

Effectively, the single outer array has three inner arrays.

two_d_grid =
  [
    [ 1,   2,   3,   4,    5 ],
    [ 6,   7,   8,   9,  10 ],
    [ 11, 12, 13, 14, 15]
  ]

My goal is to iterate through each cell in this 2D grid and process the cell. And that could be done like so:

two_d_grid.each do |row|
  row.each do |cell|
    puts "Cell: #{cell}"
  end
end

But what about a 3D grid?

three_d_grid =
  [
    [
      [ 1,  2,  3],
      [ 4,  5,  6]
    ],
    [
      [ 7,  8,  9],
      [10, 11, 12]
    ],
    [
      [13, 14, 15],
      [16, 17, 18]
    ]
  ]

You could think of this as stacking three planes, one behind the other.

The first plane is closest toward you.

----------------
|  1 |  2 |  3 |
|  4 |  5 |  6 |
----------------

With the next plane right behind it.

----------------
|  7 |  8 |  9 |
| 10 | 11 | 12 |
----------------

and the last plane is the one that’s furthest back.

----------------
| 13 | 14 | 15 |
| 16 | 17 | 18 |
----------------

To traverse this array and get each cell, you have to do things a bit differently.

three_d_grid.each do |plane|
  plane.each do |row|
    row.each do |cell|
      puts "Cell: #{cell}"
    end
  end
end

For every dimension you add to the array, you have to add another nested each call. This isn’t very extensible. Not to mention, this approach doesn’t work at all for a data structure that’s unevenly nested.

uneven_dimensional_grid =
  [
    1,
    [2, 3, 4],
    [
      [5, 6, 7],
      [8, 9, 10]
    ],
    11,
    [
      [
        [12],
        13
      ],
      14
    ],
    15
  ]

What I’d really like in an extensible way to iterate through any array and return each cell, regardless of how deeply nested it is.

I’ve lost the original link, and this code is a bit different, but I came across a way to do this using a lamba.

def deep_each(object, &block)
  traverser = lambda do |obj|
    if obj.respond_to?(:each)
      obj.each(&traverser)
    else
      block.call obj
    end
  end

  traverser.call object
end

This method sets up a lambda. This lambda checks whether the object it’s called with responds to each. If that object does, the lambda calls each, passing in the outer block. If the object doesn’t, the lambda calls the block with that object itself.

Now you can deeply iterate over any any object, if it supports it. And if it doesn’t, nothing blows up.

This will iterate over the 2D grid:

deep_each(two_d_grid) do |cell|
  puts "Cell: #{cell}"
end

As well as the 3D grid:

deep_each(three_d_grid) do |cell|
  puts "Cell: #{cell}"
end

And even that uneven multidimensional array:

deep_each(uneven_dimensional_grid) do |cell|
  puts "Cell: #{cell}"
end

If you wanted to monkey-patch Enumerable(be careful!), you can do that too.

module Enumerable
  def deep_each(&block)
    traverser = lambda do |obj|
      if obj.respond_to?(:each)
        obj.each(&traverser)
      else
        block.call obj
      end
    end

    traverser.call self
  end
end

Then you could call it like so

uneven_dimensional_grid.deep_each do |cell|
  puts "Cell: #{cell}"
end

Use this method to iterate over a data structure and process each of the objects contained within it.

Grab the code and give it a test yourself.

Have any feedback about this? Let me know!

Hack on!

The Future Goals Question

Since my last article, a few people have asked a question that’s phrased different ways, but comes back to a central idea.

“What about working toward a goal in the future? I eventually want to do X with my life.”
“Do we need to be unhappy to challenge ourselves for future growth?”
“Are you saying I should be content with where I am and never do anything else?”

The underlying idea is: Can I be happy now, while still wanting something different in the future?

The Future Happiness Myth is a realization that I have much to be happy about and thankful for now. My happiness does not lie in the future. My happiness is always and can only be had now. It’s not meant to make me content to live the rest of my life as I am today.

I’ll jump back to my school experience. Yes, school is a stressful period, but I’d tell myself to better appreciate the experience instead of dreading it, hating it, rushing through it, and only looking forward to being done with it. Of course I had the goal to graduate and become a developer professionally. College is a short amount of time, being meant only to prepare you for the workforce. Of course it would never last indefinitely. It’s necessary to have a goal for once it’s finished. But there’s an infinite difference between hating where you are because you’ll only be happy once it’s passed, and appreciating your phase in life but having a goal once it’s over.

If you’re ever to be happy, you must be happy now. That’s not to say you’ll be happy in this same way forever. The world is changing and we are changing. To ignore that is folly.

Said another way, you must prepare to change and think ahead. Life is a series of indefinite phases. You need an idea of where you’re going. Just remember to appreciate the mile marker you’re currently on.

Unhappiness needn’t be the driving force here. Be happy presently, and take a guess at what will make you happy going forward. Work toward it. Precious little is permanent and unchangeable, so don’t be afraid to take risks.

However, if you are unhappy, figure out why. Unhappiness is a calling to change. It’s not a forever, not if looked at in the right way. Decide what’s literally the next and smallest action you can take to put yourself closer to where you want to be. What will make you happier? It might be part of a larger goal, but a goal is a thousand small actions strung together. Take that first step forward. And that’s immediate. The immediacy is important. It shows you’re already on your way. It shows that your happiness is now and not only at the conclusion of your thousand actions.

Keep on dreaming and work toward your goals. But you won’t appreciate your life later unless you appreciate it now. Take a deep, deep breath and notice your surroundings this moment. Really notice them. That’s one small action toward the goal of appreciating your now.

The Future Happiness Myth

Published on December 26, 2013.

tl;dr: Placing your happiness in the future is dangerous; the future never truly arrives. How can we learn to be happy presently?

Today, I read an article that echoes my thoughts and wanted to finally put them into words.

I’ve had the fortune to read several interesting books this year. Snow Crash, Ishmael , The Selfish Gene, My Ishmael, and The Story of B top the list. They’ve all provided insights into what we are as humans, our nature, and the story of how we came to be. They have jumpstarted my thinking in many areas.

The subtleties of my personality interact in interesting ways. Occasionally, I glimpse behaviors I’ve learned and see how they do not contribute to my happiness. Here, I want to explore one behavior in particular. The tendency to think I’ll be happy, but only at some time in the future.

Our species has the advantage that we can see the present and use it to infer the past and the future. A simple example is a hunter coming across tracks in a forest’s floor. He can observe these prints, deduce the animal’s species, where it came from, and where it has likely gone. This ability to imagine the story of the past and how it continues into the future is uniquely human. While limited in scope, to glimpse the world in this way is to sample the power of the gods with their vast, unlimited knowledge.

This ability powered the success of our ancestors and lead us to where we are today. It can however also go awry. While growing up, I placed a lot of pressure on my self scholastically. I hated learning in the fashion that schools use, but I feared how I did in school reflected on my character. Not doing well in school, meant something was wrong with me. This self-imposed pressure to do well meant I spent a lot of time studying, doing homework, and attending classes. The fear of failing as a person drove me to succeed as a student. I thought the reverse of the fear was true too. If I succeeded as a student, I’d succeed as a person. This fear and the pressure did not make me happy. To the contrary, it made me quite unhappy and angry. “But”, I thought, “I will be so much happier when I am done with high school. When I’ve graduated high school, I will have made it.”

Enter college. Though college was a voluntary choice (however influenced by societal and familial norms), I felt it a necessary evil to pursue my career in software. College was much like high school in the departments of the fears and the pressures I felt, only amplified. I slept little (thinking it a waste of time) and studied my little heart out. I didn’t do much of the socialization others did, because not studying would stress me further. I had to study to get good grades. Without those perfect grades, I was a failure. Again, I was miserable in the present. The only thing that got me through was thinking, “It’ll all be better in the future. Once you graduate and get a job, you will be happy.”

This mode of thinking is tricky though. I’m coining this the Future Happiness Myth. It allowed me to live in the present, however miserably, because I hoped the future would be better. Except, I only live in the present. I never arrive in the future. There’s always a future relative to my present. Even when I get to a time where, in the past, I thought I’d be happy, my viewpoint has shifted, and happiness lies further ahead yet. The future holding that happiness is a long-distant one with no clear path to it.

Even these days, I struggle with this same mentality. I’ve graduated college and entered industry as a Software Engineer. While in school, that’s what I thought would make me happy. But then, I wasn’t happy at that company. So I learned a new technology stack and got a job that suits me better. Now, it’s easy to think I’d be happy after I’ve started my own company. Or I’ll be happy once I’ve written a book. The difference is that I now see how those things won’t lead to me being happy if I don’t know how to be happy. Or if I don’t allow myself to be happy presently.

The largest obstacle to my happiness is my mind. I have literally nothing to complain about right now. I am on vacation, from a dream job, in my parents’ home, with food abundant, spending time with my loving family, and was just given some cool gifts for Christmas. So why am I not elated? Why am I not supremely relaxed? Because I have difficulty appreciating the present. I don’t know how to be happy now. I only know how I’ll be happy in the future.

To date, I can say that I’ve identified an issue. Seen a part of me that I need to work on (one of many). I’m not exactly sure of the steps I need to take to appreciate the present more, but I have identified my Future Happiness Myth. I won’t ever be happy if I keep this same mindset, because the future never arrives. This post is meant to explore the problem. Solving it is another matter all together, and an ongoing project. I hope to unlearn these habits of thought and replace them with new ones which allow me to appreciate my life more.

I have a lot to be thankful for, I can see that. But actually feeling that thankfulness can be challenging. Of the things I’ve tried so far, talking with counselors, meditation/mindfulness, and yoga have made the largest impact on my life. As I enter into the new year, I’m going to give a resolution a try. I will begin practicing yoga again. It’s an activity to center yourself on the now. To recognize and appreciate how you are mentally and physically. This seems like a perfect habit to cultivate if I want to live more in the now.

I know others who have the same symptoms. Maybe they focus on level of physical fitness, or they put up with unhappiness now because they believe they’ll get their true reward in heaven. Our culture perpetuates the Future Happiness Myth by advertising products and services that purport to make you happier. I’ve noticed those fixes aren’t lasting ones. I’m working to be more presently-focused and happy with where I am. To allow myself happiness now. I’m excited and already feel my mood changing for the better.

Refactoring a Ruby Case Statement to a Hash

What follows is a refactoring I discovered recently and have found useful. Recording it here so that I can refer to it in the future and perhaps others will find it helpful. The example is simplified, but I hope it serves the purpose of illustration.

The Setup

I have processing I need to do based on some input. The value of the input determines which class I’m going to use to process it. In this example, I need to chew some fruit based on a code given to me.

The Case Statement Way

The way I’ve done it before was to use a case statement to determine the type of the fruit I need. After that, I can chew that particular kind of fruit. If I didn’t get a code, I don’t chew anything.

def eat(fruit_code)
  fruit_type = 
    case fruit_code
     when 'a'
       Apple
     when 'b'
      Banana
     when 'c'
      Coconut
     when 'o'
      Orange
    end

  fruit_type.new.chew if fruit_type
end

The Hash Way

But I’ve discovered there’s a more succinct way to do this using a hash instead.

FRUIT_TYPES=
  { 'a' => Apple, 'b' => Banana, 'c' => Coconut, 'o' => Orange }.
    freeze

def eat(fruit_code)
  fruit_type = FRUIT_TYPES[fruit_code]

  fruit_type.new.chew if fruit_type
end  

I like this refactoring because it allows me to condense several lines of code into one or a few. And it’s apparent, we’re looking up the fruit’s class.

Notes

This works when the interface on the classes is the same. The case statement only determines the class type and the processing is the same after that.

I’ve continued to use the case statement way when the number of arguments for initializing each class varies, since it didn’t seem apparent how I could do that in the hash.

Conclusion

Does this seem like something you’d find helpful? Are there other means of accomplishing this goal that I haven’t considered? I’ve love to hear to hear any feedback.

Working with Prose in Vim

Vim for Code

I use vim to write code every day. There’s an established and sensible convention that lines of code should be no more than 80 characters wide. Many people adhere to this convention, and I particularly like it because I can have vim vertically-split on my monitor and see two full-width files right next to one another. This is particularly helpful when working on a spec and its implementation.

Vim for Prose

But what about using vim to write prose? Lately, I’ve been writing some documentation for a feature I’m developing. The documentation is written in Markdown, processed by Jekyll, and in a git repository. With vim’s support of Markdown syntax highlighting, it makes sense to use it as an editor for this documentation.

(You can try vim’s Markdown syntax highlighting with :set filetype=markdown. I’m using MacVim and tried this on a hunch. I was surprised to find it actually worked!)

Code vs Documentation

One main difference between code and documentation though, is that documentation is written sentence by sentence, paragraph by paragraph, where code is generally written line by line, block by block. Normally, I navigate source code with hjkl. In fact, I have my arrow keys disabled. Vim also wraps long lines by inserting soft breaks so I can see all the text on the screen, even if it’s wider than the window.

Navigating

j and k

But these soft breaks don’t work when navigating with j and k. j and k both work on the hard line, which may be several soft lines. Particularly if you’re writing a paragraph that is all one hard line. Today, I’ve come across two options for solving this issue.

gj and gk

The first option: using gj and gk will move you up and down a line, respectively, while completely respecting soft lines. That’s awesome!

It’s nice because it just works, nothing to add to the .vimrc. The disadvantage here is that it’s now double the number of keys to simply navigate. But at least it’s possible!

textwidth

The second option: setting textwidth in the .vimrc.

I already had this chunk of code in my .vimrc, but I tweaked it to add markdown.

if has("autocmd")
" For all text files set 'textwidth' to 78 characters.
autocmd FileType text,markdown setlocal textwidth=78
endif " has("autocmd")

This forces all lines to break on whitespace so they are no more than 78 characters wide. This actually works as you’re typing, so you don’t have to manually do it. This is nice because it allows you to use j and k normally because the paragraph you end up typing is made up of hard lines. The downside is that going back and editing a paragraph can be annoying, since it doesn’t always seem to reformat things as one might expect. The hard lines become apparent. Update: Once you go back and edit the paragraph, the formatting might get out of wack. You can use gq{motion} to do format the text to match textwidth again. gq} will format the entire paragraph forward. gggqG will take you to the top and format the entire document. (Thanks @jasonkarns for the tip!)

Conclusion

I came across these two options earlier when looking into how to use vim for writing markdown. Hopefully they help you get a bit more out of vim. I’m hoping I’ll discover some better ways to use vim for prose as I go along. When I do, I’ll be sure to share. Let me know if you’ve got some tricks that would help here. Thanks for taking the time to read!

Using Node.js to inspect Webhook calls

The Idea

Recently, I needed a simple HTTP server. I’ve done a little fiddling with Node.js lately, so I thought it’d be a good use case. What did I need it for? I needed an endpoint for some Webhook functionality. At this endpoint, I wanted to be able to print out the contents of the POST calls to the webhook URL.

This is what I ended up with:

Installation

First, install Node.js. (My version is 0.10.17) On a mac: brew install node

Then, clone the gist above to your machine.

git clone https://gist.github.com/6530914.git node-http-post-listener

Running

Next, cd into the directory and run the code.

cd node-http-post-listener node node-http-post-listener.js

The server is set to listen on port 9000 and will return a 200 code when called. This is indicated by the output when the server starts:

Listening to port 9000
Returning status code 200

Testing

Finally, you can check to make sure it’s listening properly with a POST message.

From another terminal window:

curl -X POST localhost:9000 -H 'Content-Type: application/json' -d '{"payload":"test"}'

Everything is working right if you see the following output from the server:

Received body data:
{"payload":"test"}

Customizing

It’s easy to change app.listen to listen on another port.

If you want to respond with an error code to test the error handling ability of the calling Webhook code, you can change statusCode to be 500, 404, or whatever you need.

Feedback

I’d love to get your feedback on if you’ve used something like this before. If you’d like to make a change to the code, feel free to as well.

Kind and Kinder

For as long as I can remember, I’ve been a person to judge quickly. However I came to do it, it is now habit. And habits are hard to break. Events in my life, though, have lead me to question what I think, how I feel, and what ways I react to situations. Through this introspection, I have noticed just how quickly and intensely I can judge a person. It is quite easy to think that anyone different from me is annoying. That my way is the best and only way. Have you ever felt the same? Could it be generational? Cultural? National? Mostly personal? Whatever the cause, I’ve thought more about what it means to judge people.

What I’ve found is that we control very little in our lives. We choose next to nothing about who we are.

Most fundamentally, we don’t even choose to be born. Our parents brought us into being through no input of our own. The same parents we had no choice of. The Selfish Gene calls our bodies survival machines. Procreation is a genetically-driven endeavor meant to allow the survival of our genes. We’re a by-product of whatever genes are attempting to survive. Meaning we don’t choose or genes, we don’t choose our species. The fact my parents were human determined my species. That’s a humbling thought. Combine it with the fact that nearly all the matter on Earth was forged from lighter elements inside stars over billions of years and I am humbled further.

Next, we choose neither the time nor the place we are born. This impacts many facets of life. Our culture, nation, economy, social structure, morality, religion, and language, among others. Some of these things are left up to our parents, but, then again, they had the same issue when they were born. So it’s likely they pass on to us most of what was passed on to them.

The question of nature versus nurture is fascinating, but what I’m most interested in is how we control little of either. As shown above, we choose very little of our nature (genes, environment, etc). Nurture is similar. We can’t control how our parents raise us. For instance, parenting styles vary widely. Had I been raised in a different manner, I could have turned out a feral child and been nearly indistinguishable from a child with developmental disabilities. My parents taught me English. Language has been shown to influence the way and what we can think. Speaking Persian as a first language would have wired my brain differently. Most of our familial relations are outside of our choosing, and this impacts what we see and expereince as we grow up. I had loving parents who wanted to and were able to spend a lot of time with my sisters and me. Part of that interaction has lead to my love of reading and my skills with technology. Thanks to all that has happened to me, I am who I am.

No one has chosen their skin color, height, eye color, body type, smile, crooked teeth, or whether they need glasses in order to see. It’s a rare thing for people to even choose their name. No one chose the social class they were born into, the education system (or lack thereof) they are enrolled in, or how much time their parents spent with them. We can’t even control what happens to us on a minute-by-minute basis This knowledge breeds a deep empathy for the human race, but also every living creature.

This is not to say we are completely powerless. We’ve chosen how we react since being a child. Sure, a lot of that might be genetic predisposition or learned habits, but we can choose how we react when we desire. We choose who we marry, our preferences, hobbies, hair style, and the clothes we wear. We also choose to some extent who we surround ourselves with, what our purpose in life is, and how we handle stress.

In my mind, I explain away my own behavior by blaming it on the situation, whereas if it were someone else’s behavior, I’d blame it on their personality. This is exactly the Actor-observer bias and Fundamental attribution error. I’m aware of those biases now. For example, if I encounter a waiter who seemed rude, I try to keep in mind that he could be having a terrible day. Perhaps after learning his uninsured car was totaled in an accident he was not at fault in. He could also be a generally rude person, but his attitude is likely more influenced by the situation than his personality.

I feel more compassion for my fellow humans after seeing how little control we have over who we are and where we are now. I am hard on myself, so I’m sure others are just as hard on themselves. All these things combined have made me realize that most people are out there trying to live life the best way they know how. Just as I am.

It’s not that my way is the only way. It’s just that my was has worked for me. That’s a topic for another day though.

I’m much less likely to be frustrated with others now, with this new-found empathy and compassion. The world’s hard enough. My thoughts are one of the few things I have some control over, so I’m happy to break my judgmental habits and think in a manner that results in me being happier. I’ll leave you with what I’ve boiled this all down to.

Be kind to yourself; be kinder to others.

Return to Writing

I have not written with any regularity in several years. It doesn’t matter how long exactly, because once I get out of a groove it might as well be one thousand years. It takes an incredible amount of willpower and exertion to get back into a habit. I’ve written things on-and-off, of course, but nothing to completion. And I’m miss that.

I have an idea for a web services oriented toward creative types (initially writers). I hope to make it easy for people to take an idea, flesh it out, receive feedback from others, and take that idea to completion. This is something I’ve wanted to use so I can write and share with my friends. In addition, I’m trying to learn Ruby on Rails, so this seems like a perfect project to tackle. To be sure I design and build something useful, I need to be a writer and user of the product. I’m hoping others will find it useful as well.

My goals aren’t grandiose. I simply wish to chronicle my thoughts and learn more about them. How often have I half-thought some idea but not solidified it in my mind? There mere act of putting my thoughts into words has a profound effect on teaching me what I actually think.

The format I envision is small pieces, articles, blogs – whatever name will work. Bits of information about what I’m thinking or what I have discovered so far in my life. None of this will be any more than my opinion. My thoughts in many areas have changed significantly over the last several years, and I don’t expect that trend to change. It’d be silly to think my mind will solidify now. This means I expect things written in the future may not agree with what I wrote in the past. That is fine with me. Life is an experience and I hope to grow and work new information into my mind as I encounter it.

I’d like to write small bits that can be references and linked to one another. I don’t see this being a single tome. Short pieces will help my focus stay tight. If I wish to explore branching or interleaving ideas, I will, but in a different piece.

This will also help me write more, improve my writing abilities, evolve my thoughts over time. Eventually, I’d like to have all this hosted on the web service I’m trying to build. I’d love to use it to receive feedback on what I write.

I’m writing to scratch an itch. Maybe someone else will find it useful as well.

Twikini Releases v1

Listen to this Reading

Kyle Tolle reading ‘Twikini Releases v1′

Update:

As per the instructions on the Twikini website, I emailed CJ about this blog post. Within minutes he responded and sent out my serial number for v1.0. I can also happily say that it installed and connected to Twitter perfectly. I entered the serial number and am good to go. Very excited to test out all the new features I’ve not had a chance to see yet!  I take back what I said about the customer support: I’m quite impressed.

Twikini is a Windows Mobile Twitter client written in C++.  It’s lightweight, quick but is decently powerful. Twikini v1.0 just released and I’m hoping to give it a try soon.  I had downloaded v0.6 and really enjoyed it, but v0.8 never did work. I had upgraded because of DM (Direct Message) support.  Same bones with v0.9. Keeps saying there’s no network to connect to. I am hoping that I can get v1.0 to work.  I’d recommended Twikini in a tweet and Aoss tried it out.

A screen shot of Twikini

A screen shot of Twikini

Trinket Software, the people who make Twikini, just introduce a pricing plan for the product, and I’m hoping to get a copy for writing this blog post. Did I mention I’m crossing my fingers that it works this time? I’ve @’d Twikini several times about my issues, but haven’t ever heard back. Customer service could be a bit better…

Have you heard of Twikini? Have you tried it out? What are your impressions? Have any of you had the same issue with getting it to connect to the internet? Please tell me I’m not alone!

Update on OSU Email

Listen to this Reading

Kyle Tolle reading ‘Update on OSU Email’

What Happened

Last night I wrote the post “Forwarding BuckeyeMail” and tweeted it to 8Help, OSU’s IT service desk.  In just a few short hours, I got a tweet from 8Help, a comment from Chuck, and a detailed email from 8Help, which is included at the bottom of this post.

From the email, we see there is actually an article about forwarding BuckeyeMail, but it’s not listed on the main FAQs. Instead, it’s listed on a page of a huge number of other articles, which is why I missed it.

I’m a bit confused because they say BuckeyeMail isn’t required, but if they’re getting rid of WebMail, what other choice do you have? I guess it’s not required in the same sense that WebMail isn’t required: You can forward your email to another account, so you don’t have to use it?

What I Learned

From the feedback, I’ve gathered some insight on this whole process.

  • OSU still uses your name.##@osu.edu address for all mailings. Whew!
  • Setting up BuckeyeMail changes your osu.edu email redirect policy, and forwards all @osu.edu mail to @buckeyemail.osu.edu automatically. I really wish they would have an option to keep this from happening when you’re actually setting up BuckeyeMail, or at least a more apparent notification that this user-given value will be overwritten.
  • Forwarding BuckeyeMail isn’t as clean a process as I thought it was.
  • There’s still hope, because we can avoid most of that mess by just changing where our @osu.edu address forwards.

What To Do Now

So here’s a list of new steps to take:

  1. Again, forward @osu.edu email to another account of your choice. This re-establishes the  forwarding you may have had before. It bypasses the BuckeyeMail system all together.
  2. Since there is a chance someone could decide to email your BuckeyeMail address, there’re a few options.
    • Have Gmail check your BuckeyeMail. Since there won’t be much mail going here, it’s okay that Gmail only checks once an hour.
    • Set up an autoresponder in BuckeyeMail to tell the sender you’re not using that address. This feature only works in IE though, which is stupid. (I hate MS and their IE only garbage. It doesn’t even “degredate” to other browsers. It just doesn’t work.)
    • Send your BuckeyeMail to another account. There are a number of caveats with this method that I didn’t know before:
      1. Forwarded email is sent as a “Fwd:” from your BuckeyeMail account instead of transparently passed along, as I’ve come to expect Forwarding to mean. This archaic “Forwarding” is automating you opening up the email, hitting Forward and typing in the other address – so it comes from your @buckeyemail.osu.edu account. Addresses from the original email are in the body of the email, but it kills the work flow of just hitting reply, since it’s sent from your buckeyemail.
      2. Redirected mail completely kills the email headers, so you can’t tell if it was sent to anyone other than yourself. Not sure why this would even be useful since it modifies the original message by killing the headers.

Why I Screwed Up

I thought forwarding from BuckeyeMail was a transparent process, because before I set up the inbox rule I had resubmitted the @osu.edu forwarding form, and then tried sending test emails to my @osu.edu address.  I thought this form was obsolete, however, meaning I thought all OSU mail went to BuckeyeMail regardless. Since this isn’t so, the test emails never actually reached the BuckeyeMail servers, so I didn’t see the wonky forwarding setup there.

Here’s the email I got from 8Help. Very detailed and concise – These guys rock!

The Email from 8Help

Kyle,

Thanks for sharing your blog post with instructions on forwarding Buckeye Mail. We have a similar article we’ve had available for just under two weeks at http://8help.osu.edu/4093.html that goes into a little more depth and includes some warnings.

Just to clarify – students are not required to use Buckeye Mail – all official university communications should be going to your tollename.##@osu.edu address for you to read, and from there forwarding to @gmail.com.

If someone (another student, perhaps, or someone you e-mailed from Buckeye Mail hitting reply, etc.) “guesses” and tries to mail you directly at tolle.23@buckeyemail.osu.edu, however, that wouldn’t be forwarded using that process. There are a couple options for taking care of messages that might be missed due to this.

One is setting up Gmail to POP your messages from Buckeye Mail, per http://8help.osu.edu/4070.html

Another is to set up an Automatic Reply in Buckeye Mail basically saying “I don’t use this address, make sure to mail me at name.##@osu.edu (or even Gmail directly if you prefer).

Another is to setup Inbox Rules that automatically forward or redirect all incoming mail to another address, per http://8help.osu.edu/4093.html

The warnings for this are spelled out in the article – but because of your blog post, I just want to make sure you’re aware that messages *forwarded* int his manner will appear “From” your Buckeye Mail address – NOT the original sender, so you won’t be able to just hit This option behaves just like hitting forward on a message from an e-mail client. The Subject is also appended with “FW: ”

If you choose to Redirect instead of Forward, there are other issues – the original sender and subject are preserved, so that you can hit reply and have it go back to the sender … BUT… if there were other recipients on the message (other To or Cc addresses), those are NOT preserved – so hitting reply-all would only reach the original sender – you won’t be aware of other people who may have been a part of the conversation.

That’s a lot to digest, so hopefully it all makes sense – let me know if you have any questions.


Max Treboni
IT Service Desk, OSU Office of Information Technology
Request forms and knowledge base articles are available on the web at http://8help.osu.edu
Service hours are available on the web at http://8help.osu.edu/1691.html