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' %>
<%= gantt_zoom_link(@gantt, :in) %> <%= gantt_zoom_link(@gantt, :out) %>
<% 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