No planificar es planificar el fracaso, ¿de dónde es este código?

Venimos con una nueva edición de ¿De dónde es este código? en la que curiosamente vamos a resaltar la parte menos técnica del desarrollo software, como es la gestión de proyectos.

Las pistas

La web oficial de este proyecto es bastante autorreferente, ya que no sólo es una instancia del proyecto en sí, sino que además contiene la planificación de su propio desarrollo e incluso su propio código, siendo éstos dos de los módulos fundamentales del mismo.

Se trata de un proyecto muy activo, que en sus algo más de 7 años de vida ha sacado casi un centenar de versiones.

Entre los usuarios más destacados de este software se encuentran Gentoo y Ruby, que a su vez es el principal lenguaje usado en su desarrollo.

El código

Hoy lo vamos a poner fácil, aquí tenéis una de las vistas principales de este proyecto. Se trata de Ruby embebido en HTML y muestra bastante a las claras la funcionalidad de uno de los módulos de este proyecto.

<% @gantt.view = self %>

<% if !@query.new_record? && @query.editable_by?(User.current) %> <%= link_to l(:button_edit), edit_query_path(@query, :gantt => 1), :class => 'icon icon-edit' %> <%= delete_link query_path(@query, :gantt => 1) %> <% end %>

<%= @query.new_record? ? l(:label_gantt) : h(@query.name) %>

<%= form_tag({:controller => 'gantts', :action => 'show', :project_id => @project, :month => params[:month], :year => params[:year], :months => params[:months]}, :method => :get, :id => 'query_form') do %> <%= hidden_field_tag 'set_filter', '1' %> <%= hidden_field_tag 'gantt', '1' %>

"> <%= l(:label_filter_plural) %>
"> <%= render :partial => 'queries/filters', :locals => {:query => @query} %>

<%= gantt_zoom_link(@gantt, :in) %> <%= gantt_zoom_link(@gantt, :out) %>

<%= text_field_tag 'months', @gantt.months, :size => 2 %> <%= l(:label_months_from) %> <%= select_month(@gantt.month_from, :prefix => "month", :discard_type => true) %> <%= select_year(@gantt.year_from, :prefix => "year", :discard_type => true) %> <%= hidden_field_tag 'zoom', @gantt.zoom %> <%= link_to_function l(:button_apply), '$("#query_form").submit()', :class => 'icon icon-checked' %> <%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 }, :class => 'icon icon-reload' %> <% if @query.new_record? && User.current.allowed_to?(:save_queries, @project, :global => true) %> <%= link_to_function l(:button_save), "$('#query_form').attr('action', '#{ @project ? new_project_query_path(@project) : new_query_path }').submit();", :class => 'icon icon-save' %> <% end %>

<% end %>

<%= error_messages_for 'query' %> <% if @query.valid? %> <% zoom = 1 @gantt.zoom.times { zoom = zoom * 2 }

subject_width = 330 header_height = 18

headers_height = header_height show_weeks = false show_days = false

if @gantt.zoom > 1 show_weeks = true headers_height = 2 * header_height if @gantt.zoom > 2 show_days = true headers_height = 3 * header_height end end

# Width of the entire chart g_width = ((@gantt.date_to - @gantt.date_from + 1) * zoom).to_i @gantt.render(:top => headers_height + 8, :zoom => zoom, :g_width => g_width, :subject_width => subject_width) g_height = [(20 * (@gantt.number_of_rows + 6)) + 150, 206].max t_height = g_height + headers_height %>

<% if @gantt.truncated %>

<%= l(:notice_gantt_chart_truncated, :max => @gantt.max_rows) %>

<% end %>

<% position:relative;" style += "height: #{t_height + 24}px;" style += "width: #{subject_width + 1}px;" %> <%= content_tag(:div, :style => style) do %> <% right:-2px;" style += "width: #{subject_width}px;" style += "height: #{headers_height}px;" style += 'background: #eee;' %> <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> <% right:-2px;" style += "width: #{subject_width}px;" style += "height: #{t_height}px;" style += 'border-left: 1px solid #c0c0c0;' style += 'overflow: hidden;' %> <%= content_tag(:div, "", :style => style, :class => "gantt_hdr") %> <%= content_tag(:div, :class => "gantt_subjects") do %> <%= @gantt.subjects.html_safe %> <% end %> <% end %>
<% width: #{g_width - 1}px;" style += "height: #{headers_height}px;" style += 'background: #eee;' %> <%= content_tag(:div, ' '.html_safe, :style => style, :class => "gantt_hdr") %> <% ###### Months headers ###### %> <% month_f = @gantt.date_from left = 0 height = (show_weeks ? header_height : header_height + g_height) %> <% @gantt.months.times do %> <% width = (((month_f >> 1) - month_f) * zoom - 1).to_i left: #{left}px;" style += "width: #{width}px;" style += "height: #{height}px;" %> <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> <%= link_to h("#{month_f.year}-#{month_f.month}"), @gantt.params.merge(:year => month_f.year, :month => month_f.month), :title => "#{month_name(month_f.month)} #{month_f.year}" %> <% end %> <% left = left + width + 1 month_f = month_f >> 1 %> <% end %> <% ###### Weeks headers ###### %> <% if show_weeks %> <% left = 0 height = (show_days ? header_height - 1 : header_height - 1 + g_height) %> <% if @gantt.date_from.cwday == 1 %> <% # @date_from is monday week_f = @gantt.date_from %> <% else %> <% # find next monday after @date_from week_f = @gantt.date_from + (7 - @gantt.date_from.cwday + 1) width = (7 - @gantt.date_from.cwday + 1) * zoom - 1 left: #{left}px;" style += "top: 19px;" style += "width: #{width}px;" style += "height: #{height}px;" %> <%= content_tag(:div, ' '.html_safe, :style => style, :class => "gantt_hdr") %> <% left = left + width + 1 %> <% end %> <% while week_f <= @gantt.date_to %> <% width = ((week_f + 6 <= @gantt.date_to) ? 7 * zoom - 1 : (@gantt.date_to - week_f + 1) * zoom - 1).to_i left: #{left}px;" style += "top: 19px;" style += "width: #{width}px;" style += "height: #{height}px;" %> <%= content_tag(:div, :style => style, :class => "gantt_hdr") do %> <%= content_tag(:small) do %> <%= week_f.cweek if width >= 16 %> <% end %> <% end %> <% left = left + width + 1 week_f = week_f + 7 %> <% end %> <% end %> <% ###### Days headers ####### %> <% if show_days %> <% left = 0 height = g_height + header_height - 1 wday = @gantt.date_from.cwday %> <% (@gantt.date_to - @gantt.date_from + 1).to_i.times do %> <% width = zoom - 1 left: #{left}px;" style += "top:37px;" style += "width: #{width}px;" style += "height: #{height}px;" style += "font-size:0.7em;" clss = "gantt_hdr" clss << " nwday" if @gantt.non_working_week_days.include?(wday) %> <%= content_tag(:div, :style => style, :class => clss) do %> <%= day_letter(wday) %> <% end %> <% left = left + width + 1 wday = wday + 1 wday = 1 if wday > 7 %> <% end %> <% end %> <%= @gantt.lines.html_safe %> <% ###### Today red line (excluded from cache) ###### %> <% if Date.today >= @gantt.date_from and Date.today <= @gantt.date_to %> <% today_left = (((Date.today - @gantt.date_from + 1) * zoom).floor() - 1).to_i position: absolute;" style += "height: #{g_height}px;" style += "top: #{headers_height + 1}px;" style += "left: #{today_left}px;" style += "width:10px;" style += "border-left: 1px dashed red;" %> <%= content_tag(:div, ' '.html_safe, :style => style, :id => 'today_line') %> <% end %> <% position: absolute;" style += "height: #{g_height}px;" style += "top: #{headers_height + 1}px;" style += "left: 0px;" style += "width: #{g_width - 1}px;" %> <%= content_tag(:div, '', :style => style, :id => "gantt_draw_area") %>
<%= link_to_content_update("\xc2\xab " + l(:label_previous), params.merge(@gantt.params_previous)) %> <%= link_to_content_update(l(:label_next) + " \xc2\xbb", params.merge(@gantt.params_next)) %>

<% other_formats_links do |f| %> <%= f.link_to 'PDF', :url => params.merge(@gantt.params) %> <%= f.link_to('PNG', :url => params.merge(@gantt.params)) if @gantt.respond_to?('to_image') %> <% end %> <% end # query.valid? %>

<% content_for :sidebar do %> <%= render :partial => 'issues/sidebar' %> <% end %>

<% html_title(l(:label_gantt)) -%>

<% content_for :header_tags do %> <%= javascript_include_tag 'raphael' %> <%= javascript_include_tag 'gantt' %> <% end %>

<%= javascript_tag do %> var issue_relation_type = <%= raw ▒▒▒▒▒▒▒::Helpers::Gantt::DRAW_TYPES.to_json %>; $(document).ready(drawGanttHandler); $(window).resize(drawGanttHandler); $(function() { $("#draw_relations").change(drawGanttHandler); $("#draw_progress_line").change(drawGanttHandler); }); <% end %>

El reto

Ya sabéis que no nos conformamos con que adivinéis el proyecto (algunos se contentan con buscar el código en Google, pero eso tiene poca emoción), sino que nos gusta descubrir más curiosidades sobre él, así que allá van:

  • Una empresa australiana, agradecida por el beneficio que le supuso utilizarlo, abrió en 2010 un servicio por el que hospeda gratuitamente 18000 micrositios gestionados con este software. ¿Qué empresa es y cómo se llama su servicio?

  • En 2011 apareció un fork a raíz de las discrepancias de varios colaboradores con la "falta de metodología clara" existente en el proyecto, según ellos. ¿Qué nombre recibió ese fork y qué nombre recibe ahora para evitar suspicacias con el original?

Solución al anterior reto

Los lectores cinéfilos fueron los primeros en adivinar que la película donde aparecía el código era Conspiración en la red (Antitrust), en la que aparecían el creador de GNOME Miguel de Icaza y el cofundador de Sun Microsystems Scott McNealy.

Y el código concreto que os mostrábamos no era el del software de comunicaciones SYNAPSE (principalmente porque es un software ficticio), sino el de bzip2, basado en el algoritmo de compresión de Burrows-Wheeler y la codificación de Huffman. Otros ejemplos de código que se pueden ver en los títulos de crédito o en la propia película son:

  • HTML de la página de IMDb.

  • Jigsaw, un servidor web

  • lnx4win (Linux for Windows)

Ver todos los comentarios en https://www.genbeta.com

VER 0 Comentario

Portada de Genbeta