From Fedora Project Wiki


Revision as of 20:27, 30 March 2011 by Pcalarco (talk | contribs)

Fedora Weekly News Issue 269

Welcome to Fedora Weekly News Issue 269[1] for the week ending March 30, 2011. What follows are some highlights from this issue.

An audio version of some issues of FWN - FAWN - are available! You can listen to existing issues[2] on the Internet Archive. If anyone is interested in helping spread the load of FAWN production, please contact us!

If you are interested in contributing to Fedora Weekly News, please see our 'join' page[3]. We welcome reader feedback:

FWN Editorial Team: Pascal Calarco, Adam Williamson

Fedora In the News

In this section, we cover news from the trade press and elsewhere that is re-posted to the Fedora Marketing list[1].

Contributing Writer: Pascal Calarco

Red Hat Proves That Open Source Is Good for Business (PC World)

Rahul Sundaram forwarded[1] a posting on btrfs and its relation to ext4 in RHEL and Fedora:

"Critics of free and open source software are fond of making the argument that software must be locked up, patented and jealously guarded if it is to serve as the basis for a successful business. Well, Red Hat just refuted such claims in a big way this week with its fourth quarter earnings report, which blew away analysts' expectations and placed the company well on track for billion-dollar revenues in the upcoming year."

Based in North Carolina, Red Hat is the company behind both the Fedora and the Red Hat Enterprise Linux (RHEL) Linux distributions. Fedora is the free, community version of the software, while RHEL is sold as acommercial product with support and services."

The full article is available[2].


This section covers the news surrounding the Fedora Ambassadors Project[1].

Contributing Writer: Sankarshan Mukhopadhyay

Welcome New Ambassadors

This week the Fedora Ambassadors Project had a couple of new members joining.

Everton Cardoso from Brazil mentored by Daniel Bruno

Summary of traffic on Ambassadors mailing list

Christoph Wickert raised [1] some questions regarding the budget [2] Max Spevack provided [3] actual figures from the expenses. David Nalley mentioned [4] that some of the issues raised in the mail were also part of the Board IRC meeting and, discussions were ongoing as the same was an agenda item in the upcoming Board meeting.

Onyeibo Oku asked [5] if there was an existing print-ready, A5 sized booklet covering the basics of Fedora for handing out at events. Zoltan Hopper responded [6] about a scratch document available at the Marketing Page. There was further discussion around the difference between a Quick-Start and a Handbook [7] and the possibility of building a Quick Start Guide [8] based upon the SXSW Materials [9]

Christoph Wickert posted [10] Minutes of EMEA Ambassadors Meeting [11] The thread [12] had additional discussion around allocation of funds under budget line items and, expense planning based on projected needs. The decision making process within FAmSCo was also discussed.

David Ramsey posted [13] meeting notes [14] from the APAC Ambassadors meeting on 2011-03-19

David Ramsey informed [15] about an upcoming Power Management Test Day [16] and subsequently posted [17] about the Printing and ABRT Retrace Server Test Days

Máirín Duffy asked [18] if there was a group photograph from a recent event with the aim of updating the FUDCon Zurich group phot that is on page

Christoph Wickert posted [19] a 'Last Call for Orders" for F14 media for any event at EMEA and added a link to the Inventory [20] for helping to search for the nearest anchor point

Pierros Papadeas posted [21] Meeting Minutes for FAmSCo meeting of 2011-03-26

Buddhika Kurera requested help [22] in finding a co-speaker for CLT2011

Paul Mellors posted [23] about an idea for a documentary [24] similar to "Revolution OS"

Adam Miller put out a last call for funding for Texas Linux Fest 2011 [25]


Summary of events reported on Ambassadors mailing list

Christoph Wickert reported [1] on the Chemnitzer Linuxtage event with more details about undertaking similar tasks using different distributions.

Fabian Affolter summarized [2] all the CLT2011 reports

Summary of traffic on FAmSCo mailing list

Pierros Papadeas posted [1] the Agenda for the FAmSCo meeting of 2011-03-26 [2]

Joerg Simon, as the Fedora Ambassador Membership Administrator, informed FAmSCo [3] about existing continuous violations of Fedora Ambassador Conduct [4] Follow-up discussions happened on the ticket and the thread [5]


In this section, we cover the activities of the QA team[1]. For more information on the work of the QA team and how you can get involved, see the Joining page[2].

Contributing Writer: Adam Williamson

Test Days

Thursday 2011-03-24 was power management Test Day[1]. The event produced a great turnout of testers who provided results on a wide range of hardware, and the developers are already looking at the bugs filed. Thanks to everyone who came out to help.

This Tuesday, 2011-03-29, was printing Test Day[2]. The turnout was a little smaller than we hoped, but the testers who did come managed to find lots of bugs, and Fedora's printing maintainer, Tim Waugh, was very happy with all the results.

This Thursday, 2011-03-31, will be ABRT Test Day[3]. As well as checking that ABRT (Fedora's automated crash report tool) is working as expected for Fedora 15, we'll be testing out a big new feature, the retrace server[4]. This allows you to submit crash reports to a remote server which will generate the backtrace - avoiding the need for you to download and install often large debuginfo packages in order to submit reports. Please come along and help us test this exciting new feature!

There is currently no Test Day planned for next Thursday, 2011-04-07. Take the day off!

Anaconda testing

James Laska requested testing of an installer image which included updated versions of anaconda and lorax that needed testing before being approved as stable updates[1]. Several testers responded, and the updates were soon approved.

GNOME Tweak Tool testing

Michel Salim announced that GNOME Tweak Tool, an application for tweaking various advanced settings in GNOME 3, was now available for testing[1]. Several group members thanked Michel for the announcement and provided feedback on the tool.

Fedora 15 Beta preparation

The third Beta blocker/nice-to-have review meeting took place on 2011-03-25[1], and the team worked through the full list of proposed Beta blocker and nice-to-have bugs. The first test compose was scheduled for Tuesday 2011-03-22, but could not be completed on that day due to various outstanding bugs and the lack of the planned NetworkManager 0.9 packages. At a special release schedule meeting on Wednesday 2011-03-23[2], the QA and release engineering teams, and the Fedora Project Leader, agreed that the late arrival of NetworkManager 0.9 justified a one week slip in the release schedule. The first test compose was then set for Tuesday 2011-03-29.

Improving pre-release download page

Tim Flink passed on some feedback[1] he had received from a new tester who had downloaded a pre-release and asked some questions in the #fedora IRC channel, which does not handle pre-release issues. He suggested that it would be a good idea to add some text to the pre-release download page[2] explaining the right places to go to post feedback and get help with pre-release issues. Jóhann Guðmundsson and Adam Williamson both suggested filing a request with the websites team, and Tim reported[3] that he had filed a ticket[4].

Security Advisories

In this section, we cover Security Advisories from fedora-package-announce from the past week.

Contributing Writer: Pascal Calarco

Fedora 15 Security Advisories

Fedora 14 Security Advisories

Fedora 13 Security Advisories

LATAM Fedora!

LATAM Fedora is a regular column of Spanish language contributions around open source software. It is our first expansion into incorporating foreign language content into FWN.

This week's contribution is from Guillermo Gómez, a second installment primer on Ruby. Enjoy!

Ruby Capítulo 2 : Una clase algo más completa

Siguiendo nuestra secuencia al estilo tutorial, en esta edición vamos a completar un poco más nuestras clases, introduciresmo los conceptos de métodos y variables de clase.

Una variable de clase es una variable compartida de la clase misma. Sólo existe una copia de una variable de clase en particular para una clase dada. Los nombres de las variables de clase comienzan con @@ tal como en @@reproducciones.

1 class Cancion
2   @@reproducciones = 0
4   def Cancion.reproducciones
5     @@reproducciones
6   end
8   def reproducir
9     @@reproducciones =+ 1
10   end
11 end

A diferencia de las variables de instancia y variables globales, las variables de clase deben se inicializadas antes de poder ser utilizadas, usualmente se hace con una declaración simple en el cuerpo de la definición de la clase. En el código anterior igualmente se ha introducido el concepto de método de clase. Un método de clase es un método que no necesita que se instancie la clase para ser invocado, es decir, "son métodos propios de la clase y no de sus objetos".

Su utilidad es obvia en el ejemplo, se quiere saber cuántas reproducciones se han hecho en total en nuestro reproductor de música. Esta información no es específica a una canción en particular, es decir, no es sujeto de las instancias sino de la clase misma. La diferencia al momento de declarar el método de clase es que debe anteponer el nombre de la clase al método, tiene dos opciones, o usar explícitamente Cancion, o self. El uso de *self" da mayor flexibilidad ya que permite cambiar el nombre de la clase sin mayores traumas.

1 class Cancion
2   @@reproducciones = 0
4   def self.reproducciones
5     @@reproducciones
6   end
8   def reproducir
9     @@reproducciones =+ 1
10   end
11 end

Constantes vs variables

Las variables y constantes en Ruby mantienen referencias a objetos. Las variables no poseen un tipo intrínseco, a cambio el tipo es únicamente definido por los mensajes a los que responde el objeto referenciado.

Una constante en Ruby también es una referencia a un objeto. Las constantes son creadas cuando son asignadas por primera vez, a diferencia de otros lenguajes Ruby le permite alterar el valor de las constantes si bien ello provocará un mensaje de alerta. En general usted no debe alterar una constante en tiempo de ejecución y debería evitarlo a toda costa.

2 => 1
4 (irb):23: warning: already initialized constant MI_CONSTANTE
5 => 2

Note como las constantes pueden declararse dentro de la definición de clase lo que nos lleva a la definición de constante de clase y a la noción de espacios de nombres por la forma en que nos referimos a dichas constantes.

1 class Cancion 
2   VERSION="1.0" 
3 end

1 >> Cancion::VERSION
2 => "1.0" 
4 => "1.8.7" 

Note que VERSION no referencia ni colisiona con Cancion::VERSION.

El poder de herencia

Tal vez el santo grial de la programación es el principio DRY, "Don Repeat Yourself". Una forma de evitar repetirse, es escribir código reusable, cada vez que estamos escribiendo nuevo código y tenemos esa sensación de deja-vu de que ya esto lo hicimos una vez en el pasado, es porque no estamos reusando nuestro código de forma inteligente. En POO la herencia es una excelente forma de mantener el código reusable sin mayores repeticiones.

La herencia le permite crear clases que sean refinamientos o especializaciones de otra clase. Por ejemplo, y siguiendo el ejemplo de Cancion en nuestro reproductor de música ahora a alguien se le ocurrió que sería interesante que se incluyera el soporte para canciones de tipo Karaoke. La única diferencia con las otras canciones es que las canciones Karaoke tienen asociadas la letra de la canción en conjunto con infomación de sincronización para reproducir las letras del Karaoke en nuestro flamante reproductor ahora con una gran pantalla de video.

1 class Karaoke < Cancion
2   def initialize(nombre, artista, duracion, letra)
3     super(nombre, artista, duracion)
4     @letra = letra
5   end
6 end

El "< Cancion" en la definición de la clase le indica a Ruby que Karaoke es un subclase de Cancion, o en dirección opuesta, Cancion es la superclase de Karaoke. De esta forma la clase hija hereda todos los métodos y declaraciones de variables de su padre. Al invocar un método sobre un objeto o clase, Ruby defiere su ubicación hasta el momento de ejecución, en dicho momento Ruby primero mira en la clase para determinar si existe el método invocado, si no es así, intenta en el padre, y así atravesando todos los ancestros de la clase hasta ubicar el método invocado. Si se acaban los ancestros donde buscar, Ruby ejecuta una acción especial que puede ser interceptada si se desea Object#method_missing, si no, produce un error.

Cada clase especializada maneja sus detalles, para el resto se utiliza super, es decir, el método del padre o de su ancestro. De esta forma, por ejemplo, en nuestra definición de Karaoke#initialize dejamos que la inicialización de todo lo común a Cancion ocurra igual que antes por medio de la llamada a super con los respectivos parámetros necesarios, luego inicializamos los datos específicos a nuetras clase Karaoke.

Espacios de nombres

En la medida que escriba programas Ruby cada vez más grandes, usted naturalmente se encontrará con código reusable, librerías de rutinas relacionadas entre sí por ejemplo. Usted deseará separar dicho código en distintos archivos separados de tal forma que el contenido pueda ser reusado entre diferentes programas Ruby. Frecuentemente este código será organizado en clases.

Otras veces ello simplemente no es conveniente o no aplica, son un grupo de métodos que desea reusar, usted puede simplemente colocarlos en un archivo y cargar dicho archivo en su programa con load o require. Esto funciona pero tiene un problema, digamos que se crea una librería para cocinar con los métodos calentar , mezclar, amasar en un archivo cocina.rb y otra librería para atletas con los métodos calentar, correr, descansar en el archivo atleta.rb. Si carga ambos archivos uno después del otro, simplemente el método calentar colisiona y sólo el más recientemente cargado tendrá la definicón actual del método, el otro simplemente será olvidado, en resumen la colisión en los nombres es el problema.

La respuesta es el mecanismo de modulos. Los modulos definen un espacio de nombres en donde sus métodos y constantes pueden aplicar sin tener que preocuparse en colisionar con otros métodos y constantes:

 1 module Cocina
 2   ESCUELA="Latinoamericana" 
 3   def Cocina.calentar(x)
 4    # Se espera que x sea un valor númerico para representar temperatura en ºC
 5    # ..
 6   end
 7 ...
 8 end
10 module Atleta
11   ESCUELA="Simón Bolívar" 
12   def Atleta.calentar(t)
13     # Se espera que t sea un valor numérico que represente tiempo en segundos
14     # ..
15   end
16 end

1 >> Cocina::ESCUELA
2 => "Latinoamericana" 
3 >> Atleta::ESCUELA
4 => "Simon Bolivar" 
5 >> include Atleta
6 => Object
7 >> Atleta.calentar(1000)
8 calentando 1000 segundos
9 => nil
10 >> include Cocina
11 => Object
12 >> Cocina.calentar(10)
13 => 10

Ahora entonces tiene mucho menos probabilidades de provocar colisiones, note que debe cargar el código, y luego include para usar las funcionalidades del módulo. Herencia múltiples vs Mixins¶

Algunos lenguajes orientados a objetos, tales como C++, soportan herencia múltiple en donde una clase puede tener más de una superclase heredando funcionalidad de cada una de ellas. Si bien potente, esta técnica puede ser peligrosa ya que la jerarquía puede tener ambigüedades. Otros lenguajes como java y C# soportan sólo herencia simple. Si bien más limpia y simple, la herencia simple también tiene sus desventajas, en la realidad los objetos heredan atributos de múltiples fuentes en el mundo real.

Ruby ofrece una alternativa interesante y poderosa que le ofrece la simplicidad de la herencia simple y el poder la herencia múltiple. Una clase Ruby tiene una única clase padre, en consecuencia Ruby es un lenguaje con herencia simple, sin embargo, las clases Ruby pueden incluir la funcionalidad de cualquier cantidad de mixins (un mixin es una especie de definición parcial de clase). Nuevamente dejemos que Ruby hable, creemos nuestro archivo con la definición de módulo y un par de clases tontas que lo usen como mixin:


 1 module Debug
 2   def quien_soy?
 3     "#{} (\##{self.objet_id}): #{self.to_s}" 
 4   end
 5 end
 7 class Cocina
 8   include Debug
 9   def estilo
10     puts "Italiana" 
11   end
12 end
14 class Nevera
15   include Debug
16   def capacidad
17     puts "150 pies cúbicos" 
18   end
19 end

Si ahora cargamos dichas definiciones de módulo y clases en irb, podemos evidenciar y experimentar con el uso de los mixins (note que le voy a pasar la forma de hacerlo):

1 $ irb 
2 >> load 'mixin_module.rb'
3 => true
4 >> nevera =
5 => #<Nevera:0xb7587b38>
6 >> cocina =
7 => #<Cocina:0xb7585c5c>
8 >> nevera.quien_soy?
9 => "Nevera (#-609469028): #<Nevera:0xb7587b38>" 
10 >> cocina.quien_soy?
11 => "Cocina (#-609472978): #<Cocina:0xb7585c5c>" 

Bien, es todo por hoy, nos recontraremos en un tercer capítulo dedicado a métodos en una próxima edición de esta serie dedicada a aprender Ruby.

Este artículo se mantiene en línea en para posibles mejoras y erratas.

Guillermo Gómez