The Mass Effect 3 Controversy

I have recently sumbled across something called the “Mass Effect 3 Controversy” where the Mass Effect series of games made the player’s choice a key element in shaping the story of its 100+ hour saga. But the disappointing endings (because they all render the decisions you made along the game irrelevant and basically boil down to a different color tint in the ending sequence) to the game left many fans unhappy.

In their unhappiness fans tuned creative. For example there was a $80k Child’s Play fund raiser and a huge cup cake delivery to Bioware.

But the real question remains: did they really screw up the ending (I can’t reproduce the link to a forum thread where a member of the writer team disclosed some insider info about the process the ending got written) and by the help of resourceful fans have a way of mending it with a genius twist or they really had a good ending, but cut it short in order to sell it as additional DLC?

At this point, I don’t know what I wish to be true. That Bioware just screwed up the finale the old fashioned way, or that they had a brilliant ending, cut it and made what they did show cryptic in order to sell DLC down the line. In my eyes, either situation is equally tragic.

Forbes

Sortable Columns Across Tables

If you follow Railscast 228 you get sortable table columns for your model. But what if you don’t want to expose the name of the actual database columns or more interesting if you want to sort across tables? Here is how I do it.

In your controller add order or reorder if you already have an order clause in one of the used scopes (default_scope counts too).

class AttendeesController < ApplicationController
  def index
    @attendances = @conference.attendances.reorder(sort_query).page(params[:page])
  end

  # ...
end

As I’m using this mechanism in different controllers I added the common functionality to the application_controller.rb file.

class ApplicationController < ActionController::Base
  helper_method :navigation_params, :sort_column, :sort_direction

  protected

  # supports only attendances for now
  ALLOWED_SORT_COLUMNS = {
    "fee_payed" => "fee_payed",
    "fee_payed_on" => "fee_payed_on",
    "name" => "users.last_name, users.first_name",
    "payment_confirmation_sent_at" => "payment_confirmation_sent_at",
    "registered_at" => "registered_at",
    "registration_confirmation_sent_at" => "registration_confirmation_sent_at",
    "town" => "users.town"
  }

  # use this in views
  def sort_column
    ALLOWED_SORT_COLUMNS.keys.include?(params[:sort]) ? params[:sort] : "name"
  end

  def sort_direction
    %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
  end

  def navigation_params
    { direction: params[:direction], page: params[:page],  sort: params[:sort] }
  end

  def sort_query
    sort_query_column.split(',').map{ |column| column + ' ' + sort_direction }.join(', ')
  end

  # use this in controllers
  def sort_query_column
    ALLOWED_SORT_COLUMNS[sort_column]
  end
end

This will use the ALLOWED_SORT_COLUMNS hash to map between user visible and actual database sort columns. Adding sort_query also allows us to sort by multiple columns at once. navigation_params is a shortcut I use when generating URLs (e.g. in link_to) and I want to preserve pagination, sorting, filters/searches, etc. across pages.

  def link_to_sortable(column, title = nil)
    title ||= column.titleize
    sort_icon = column == sort_column ? content_tag(:i, nil, class: (sort_direction == "asc" ? "icon-chevron-down" : "icon-chevron-up")) : ""
    direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
    link_to (title+" "+sort_icon).html_safe, params.merge(sort: column, direction: direction, page: nil)
  end

Note that sort_icon assumes you are using Bootstrap.

Now we can have sortable columns in our views:

<%= link_to_sortable "name" %>
...

Debugging SASL

If you are using Cyrus SASL with your Postfix you might feel the need to debug what SASL does in the background. But SASL does not log into /var/log/mail.*. 🙁

So after some research I fount a way …

/etc/init.d/saslauthd stop

Stop the SASL daemon and start it by hand:

saslauthd -d -a pam -r -c -m /var/spool/postfix/var/run/saslauthd

Consult the MECHANISMS and OPTIONS settings in /etc/defaults/saslauthd for which options to use in your case.
But the most important option is -d. It will run the daemon in the foreground and make it more verbose.

Now it will show you everything it does. 😀

Don’t forget to start the actual daemon once you are done debugging:

/etc/init.d/saslauthd start