Invitación de Grupos de Google: [off-topic]Blog_ruby

The nuevo spanish blog is here http://ruidorojo.herokuapp.com/

there is a lot of work to do, so, contributions are welcome

First Article by Heliogábalo Santos

Heliogábalo Santos cogió un teclado y escribió:

···

Te paso los artículos. El tuyo y el mío.

Me queda la duda de si al aplicar la cursiva *cursiva*. y poner justo
detrás un punto, una coma o cualquier otro símbolo, las markdown
serán interpretadas correctamente ??? ¿es así?

NDT: he anotado algo al final de tu post, quítalo. Está comentado en c++.

El 16 de marzo de 2015, 22:21, Lázaro Armando <lazaro@hcg.sld.cu> escribió:

> el artículo que habías escrito está bueno. Ya se me acabó la cuota por > > hoy (no tengo internet). Solo hazlo en mardown... > > > > > > Heliogábalo Santos cogió un teclado y escribió:
> >
> > ok, si tienes prisa lo hago ahora, si no, lo dejo para mañana y depaso
> > pienso en algo para publicar. quizas una traducción.
> >
> > El 16 de marzo de 2015, 20:04, Lázaro Armando <lazaro@hcg.sld.cu> > > escribió:
> >
> > > tranquilo, te dije que me dejaras a mi la infraestructura, yo la
> > > desplegaré en heroku
> > >
> > > no te fajes con eso
> > >
> > > preocupate por escribir los artículos en en metaformato de octopress
> > >
> > > te mando una entrada
> > >
> > >
> > > Olvida los headers, yo me ocupo de ellos, mira el formato de markdown,
> > > observa las partes de sintáxis de código
> > >
> > >
> > > ---
> > > layout: post
> > > title: "rails sin turbolinks"
> > > date: 2015-02-22 02:48:23 -0500
> > > comments: true
> > > categories:
> > > encoding: utf-8
> > > ---
> > >
> > > Una de las cosas que más me gusta de Rails 4.2 es que al fin se pueden
> > > crear
> > > aplicaciones SIN Turbolink. En versiones anterior estábamos obligados a
> > > deshabilitarlo luego de inicializada una App nueva y las cosas no
> siempre
> > > salían
> > > como esperábamos.
> > >
> > > Una de las características de las que se jacta la [asset pipeline](
> > > http://guides.rubyonrails.org/asset_pipeline.html\) de rails
> > > es que los Sprockets cargan de manera individual para cada
> controlador...
> > >
> > > Al menos eso dicen...
> > >
> > > Pero con la introducción de Turbolinks y con el cuento de la
> comprimidera,
> > > se
> > > cargan todos los Srockets de todos los controladores; formando tremenda
> > > morsilla.
> > >
> > > A todas esas, necesitas execjs instalado y por supuesto, nodejs o el
> > > dichoso
> > > therubyracer (ambos me caen como una patada en un cordal).
> > >
> > > Los que usan CoffeScript (le tienen miedo a JavaScript puro) necesitan
> > > toda esa
> > > porquería y por otra parte, al que no le guste andar enseñando su
> código
> > > JavaScript (porque son unos egoístas) Turbolinks y Uglifier les
> comprime y
> > > les
> > > hace tremenda morsilla ilegible a simple vista. Fíjese que bien le
> queda el
> > > nombre a la gema que comprime el JavaScript "uglifier", algo así como
> > > "afeador".
> > >
> > > Este cubano que está aquí, prefiere los ".js.erb" constantes y
> sonantes.
> > > Así que
> > > se pueden meter Turbolinks donde mejor le quepa. Mis ".js" están bajo
> la
> > > GPL y
> > > bien comentados, para todo el que quiera leerlos.
> > >
> > > Entonces vamos crear una App de rails, libre de Turbolinks,
> CoffeScript y
> > > demás
> > > gangárreas.
> > >
> > > ### rails new ejemplo -T --skip-turbolinks
> > >
> > > Al Gemfile le quitamos la porquería, a mi me quedó así:
> > >
> > > ```ruby "Gemfile"
> > > #source 'https://rubygems.org'
> > > source "file:///media/sdb1/ruby/repo/"
> > >
> > > # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
> > > gem 'rails', '4.2.0'
> > >
> > > # Use sqlite3 as the database for Active Record
> > > gem 'sqlite3'
> > >
> > > # Use jquery as the JavaScript library
> > > gem 'jquery-rails'
> > > ```
> > >
> > > Bueno corre bundle install y terminamos la primera fase.
> > >
> > > Los próximo será localizar el layout principal y decirle que en que
> > > incluye solo
> > > los Sprockets que macheen a este controlador.
> > >
> > > Lo que teníamos así:
> > >
> > > ```html "application.html.erb ORIGINAl"
> > > <!DOCTYPE html>
> > > <html>
> > > <head>
> > > <title>Ejemplo</title>
> > > <%= stylesheet_link_tag 'application', media: 'all' %>
> > > <%= javascript_include_tag 'application' %>
> > > <%= csrf_meta_tags %>
> > > </head>
> > > <body>
> > >
> > > <%= yield %>
> > >
> > > </body>
> > > </html>
> > > ```
> > >
> > > Nos debe quedar así:
> > >
> > > ```html "application.html.erb MODIFICADO"
> > > <!DOCTYPE html>
> > > <html>
> > > <head>
> > > <title>Ejemplo</title>
> > > <%= stylesheet_link_tag 'application' %>
> > > <%= javascript_include_tag 'application' %>
> > > <%= stylesheet_link_tag params[:controller] %>
> > > <%= javascript_include_tag params[:controller] %>
> > > <%= csrf_meta_tags %>
> > > </head>
> > > <body>
> > >
> > > <%= yield %>
> > >
> > > </body>
> > > </html>
> > > ```
> > >
> > > NO QUITAMOS el 'application', si no cargará SOLAMENTE los del
> controlador
> > > y nos
> > > interesa que a través de application se carguen otros; por ejemplo,
> > > nuestra css
> > > principal que debe estar presente en todas las rutas.
> > >
> > > OJO! Ahora debemos quitar el require_tree en 'application' de los
> > > sprockets,
> > > tanto CSS como JS. Ya que si no, sería lo mismo, al cargar
> application, se
> > > cargarían TODOS los Sprockets.
> > >
> > >
> > > Además, seguro tiene tu CSS que quieres usar en TODO tu proyecto. Las
> > > declaramos
> > > ahí.
> > >
> > > ```js "application.js ANTES"
> > > // This is a manifest file that'll be compiled into application.js,
> which
> > > will include all the files
> > > // listed below.
> > > //
> > > // Any JavaScript/Coffee file within this directory,
> > > lib/assets/javascripts, vendor/assets/javascripts,
> > > // or any plugin's vendor/assets/javascripts directory can be
> referenced
> > > here using a relative path.
> > > //
> > > // It's not advisable to add code directly here, but if you do, it'll
> > > appear at the bottom of the
> > > // compiled file.
> > > //
> > > // Read Sprockets README (
> > > GitHub - sstephenson/sprockets: Rack-based asset packaging system) for
> details
> > > // about supported directives.
> > > //
> > > //= require jquery
> > > //= require jquery_ujs
> > > //= require_tree . // esto lo quitamos
> > > ```
> > >
> > > Quitando la porquería:
> > >
> > > ```js "application.js DESPUÉS"
> > > //= require jquery
> > > //= require jquery_ujs
> > > ```
> > >
> > > Ahora hacemos lo mismo con las CSS
> > >
> > >
> > > ```css "application.css ANTES"
> > > /*
> > > * This is a manifest file that'll be compiled into application.css,
> which
> > > will include all the files
> > > * listed below.
> > > *
> > > * Any CSS and SCSS file within this directory, lib/assets/stylesheets,
> > > vendor/assets/stylesheets,
> > > * or any plugin's vendor/assets/stylesheets directory can be
> referenced
> > > here using a relative path.
> > > *
> > > * You're free to add application-wide styles to this file and they'll
> > > appear at the bottom of the
> > > * compiled file so the styles you add here take precedence over styles
> > > defined in any styles
> > > * defined in the other CSS/SCSS files in this directory. It is
> generally
> > > better to create a new
> > > * file per style scope.
> > > *
> > > *= require_tree .
> > > *= require_self
> > > */
> > > ```
> > >
> > > Luego de la dieta
> > >
> > > ```css "application.css DESPUÉS
> > > /*
> > > *= require_self
> > > *= require tu_css_general
> > > */
> > > ```
> > >
> > > Hasta aquí todo está lindo, pero resulta que al pasar por el pipeline,
> te
> > > dice
> > > una asset del controlador se filtro pa afuera y no será servida. Pero
> > > además da
> > > palo!
> > >
> > >
> > > Hay 2 maneras de solucionar esto.
> > >
> > > - La fácil de copiar y manter; pero difícil de entender
> > > - La que viene por defecto, fácil de entender y difícil de recordar
> > > mantener
> > >
> > >
> > > Una manera, compleja y absoluta:
> > >
> > > Una vez más, los initializer salvan el día. Al initializers de las
> assets
> > > le agregamos esto:
> > >
> > > ```ruby "config/initializers/assets.rb"
> > > # Be sure to restart your server when you modify this file.
> > >
> > > # Version of your assets, change this if you want to expire all your
> > > assets.
> > > Rails.application.config.assets.version = '1.0'
> > >
> > > # Add additional assets to the asset load path
> > > # Rails.application.config.assets.paths << Emoji.images_path
> > >
> > > # Precompile additional assets.
> > > # application.js, application.css, and all non-JS/CSS in app/assets
> folder
> > > are already added.
> > > # Rails.application.config.assets.precompile += %w( search.js )
> > >
> > > # AQUÍ
> > > # le agregamos esto, tal como sale en la documentación oficial
> > > #
> The Asset Pipeline — Ruby on Rails Guides
> > > Rails.application.config.assets.precompile << Proc.new do |path|
> > > if path =~ /\.(css|js)\z/
> > > full_path = Rails.application.assets.resolve(path).to_path
> > > app_assets_path = Rails.root.join('app', 'assets').to_path
> > > if full_path.starts_with? app_assets_path
> > > true
> > > else
> > > false
> > > end
> > > else
> > > false
> > > end
> > > end
> > > ```
> > >
> > > En la documentación oficial sale ese burumba como remiendo para
> compilar
> > > todas
> > > las Assets pero tiene un logger true y false; lo cual da palo en rails
> 4.2
> > > (y
> > > creo que en todos). Además, para que loguear que se compiló toda es
> mierda
> > > si la
> > > fallar la compilación; será logueado por el controlador :wink:
> > >
> > >
> > > La simple y difícil de mantener:
> > >
> > > Sin la brujería anterior, habría que usar lo que dice el comentario y
> > > poner junto a
> > > search.js el resto de las assets. Quizás usted tú uses su CSS en solo
> > > fichero,
> > > siendo el caso, con añadir ese solo fichero, resolvió el problema.
> > >
> > > El rollo vendrá en que si agrega una CSS mś tarde, no se recordará que
> debe
> > > compilarla; agregando el nombre al array donde está search.js.
> > >
> > > Nota para lo imbéciles: El fichero "search.js" es un ejemplo. Quítalo y
> > > pon el
> > > nombre de tu Asset
> > >
> > > A mi me quedó así:
> > >
> > > ```ruby "config/initializers/assets.rb"
> > > Rails.application.config.assets.version = '1.0'
> > > Rails.application.config.assets.precompile += %w( tu_css_general.css
> > > tu_framework.js )
> > > ```
> > >
> > > ¿Por qué esto es tan complejo? Porque Rails exhorta a sus usaurios a
> usar
> > > Turbolinks (realmente es la mejor opción) y la configuración por
> defecto,
> > > deja
> > > que Turbolinks se ocupe de esas cosas.
> > >
> > > ### Turbolink es una muy buena opción!
> > >
> > > Sobre todo para aplicaciones de cara a internet o bien de cara a una
> red
> > > lenta
> > > (infomed u otro PPP de Cuba). A mi en los personal Turbolinks me
> resulta un
> > > estorbo a la hora de desplegar una aplicación de rails en una máquina
> que
> > > carece de nodejs. Por ejemplo, algunos de mis clientes usan Ubuntu del
> año
> > > 4.
> > >
> > > ### En mi opinión:
> > >
> > > - therubyracer es un asco, tiene que mejorar mucho todavía
> > >
> > > - CoffeScript sobra, al final debes saber JavaScript para programar
> con
> > > Coffe
> > >
> > >
> > > {% blockquote Murphy, Ley de Turbolinks %}
> > > Donde V8 o nodejs sean un problema, turbolinks lo será.
> > > {% endblockquote %}
> > >
> > >
> > >
> > >
> >
> >
> > --
> > Equipo
> >
> > EscenarioDeJuego <http://EscenarioDeJuego.blogspot.com.es/&gt;
>

--
Equipo

EscenarioDeJuego <http://EscenarioDeJuego.blogspot.com.es/&gt;

---
layout: post
title: "rails sin turbolinks"
date: 2015-02-22 02:48:23 -0500
comments: true
categories:
encoding: utf-8
---

Una de las cosas que más me gusta de *Rails 4.2* es que al fin se pueden crear
aplicaciones SIN *Turbolink*. En versiones anterior estábamos obligados a
deshabilitarlo luego de inicializada una *App* nueva y las cosas no siempre
salían como esperábamos.

Una de las características de las que se jacta la [asset pipeline](http://guides.rubyonrails.org/asset_pipeline.html\) de rails es que los Sprockets cargan de manera individual para cada
*controlador* ...

Al menos eso dicen...

Pero con la introducción de *Turbolinks* y con el cuento de la comprimidera, se
cargan todos los *Sprockets* de todos los controladores; formando tremenda
*morsilla*.

A todas esas, necesitas *execjs* instalado y por supuesto, *nodejs* o el dichoso
*therubyracer* ( *ambos me caen como una patada en un cordal* ).

Los que usan *CoffeScript* (le tienen miedo a *JavaScript* puro) necesitan toda
esa porquería y por otra parte, al que no le guste andar enseñando su código
*JavaScript* (porque son unos *egoístas* ) *Turbolinks* y *Uglifier* les comprime
y les hace tremenda *morsilla* ilegible a simple vista. Fíjese que bien le queda
el nombre a la gema que comprime el *JavaScript* "*uglifier*", algo así como
"*afeador*".

Este cubano que está aquí, prefiere los *.js.erb* constantes y sonantes. Así que
se pueden meter *Turbolinks* donde mejor le quepa. Mis "*.js*" están bajo la *GPL*
y bien comentados, para todo el que quiera leerlos.

Entonces vamos crear una *App* de *rails*, libre de *Turbolinks*, *CoffeScript*
y demás *gangárreas*.

### rails new ejemplo -T --skip-turbolinks

Al Gemfile le quitamos la porquería, a mi me quedó así:

# source 'https://rubygems.org'

source "file:///media/sdb1/ruby/repo/"

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.0'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use jquery as the JavaScript library
gem 'jquery-rails'

Bueno corre bundle install y terminamos la primera fase.

Lo próximo será localizar el *layout* principal y decirle que en que incluye
solo los *Sprockets* que *macheen* a este *controlador*.

Lo que teníamos así:

<!DOCTYPE html>
<html>
<head>
  <title>Ejemplo</title>
  <%= stylesheet_link_tag    'application', media: 'all' %>
  <%= javascript_include_tag 'application' %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

Nos debe quedar así:

<!DOCTYPE html>
<html>
<head>
  <title>Ejemplo</title>
  <%= stylesheet_link_tag    'application' %>
  <%= javascript_include_tag 'application' %>
  <%= stylesheet_link_tag params[:controller] %>
  <%= javascript_include_tag params[:controller] %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

NO QUITAMOS el *application*, si no cargará SOLAMENTE los del *controlador* y nos
interesa que a través de *application* se carguen otros; por ejemplo, nuestra
*CSS* principal que debe estar presente en todas las rutas.

OJO! Ahora debemos quitar el *require_tree* en *application* de los *sprockets*,
tanto *CSS* como *JS*. Ya que si no, sería lo mismo, al cargar *application*, se
cargarían TODOS los *Sprockets*.

Además, seguro tiene tu *CSS* que quieres usar en TODO tu proyecto. Las declaramos
ahí.

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, 
// vendor/assets/javascripts, or any plugin's vendor/assets/javascripts directory 
// can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at 
// the bottom of the compiled file.
//
// Read Sprockets README 
// (https://github.com/sstephenson/sprockets#sprockets-directives) for details 
// about supported directives.
//
//= require jquery
//= require jquery_ujs
//= require_tree . // esto lo quitamos

Quitando la porquería:

//= require jquery
//= require jquery_ujs

Ahora hacemos lo mismo con las *CSS*

/*
 * This is a manifest file that'll be compiled into application.css, which will 
 * include all the files listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, 
 * vendor/assets/stylesheets, or any plugin's vendor/assets/stylesheets directory 
 * can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at 
 * the bottom of the compiled file so the styles you add here take precedence 
 * over styles defined in any styles defined in the other CSS/SCSS files in this 
 * directory. It is generally better to create a new file per style scope.
 *
 *= require_tree .
 *= require_self
 */

Luego de la dieta

/*
 *= require_self
 *= require tu_css_general
 */

Hasta aquí todo está lindo, pero resulta que al pasar por el *pipeline*, te dice
una *asset* del controlador se *filtro pa afuera* y no será servida. Pero además
da palo!

Hay 2 maneras de solucionar esto.

   - La fácil de copiar y manter; pero difícil de entender
   - La que viene por defecto, fácil de entender y difícil de recordar mantener

Una manera, compleja y absoluta:

Una vez más, los initializer salvan el día. Al initializers de las assets le
agregamos esto:

# Be sure to restart your server when you modify this file.

# Version of your assets, change this if you want to expire all your assets.
Rails.application.config.assets.version = '1.0'

# Add additional assets to the asset load path
# Rails.application.config.assets.paths << Emoji.images_path

# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are 
# already added.
# Rails.application.config.assets.precompile += %w( search.js )

# AQUÍ
# le agregamos esto, tal como sale en la documentación oficial
# http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

Rails.application.config.assets.precompile << Proc.new do |path|
  if path =~ /\.(css|js)\z/
    full_path = Rails.application.assets.resolve(path).to_path
    app_assets_path = Rails.root.join('app', 'assets').to_path
    if full_path.starts_with? app_assets_path
      true
    else
      false
    end
  else
    false
  end
end

En la documentación oficial sale ese *burumba* como remiendo para compilar todas
las *Assets* pero tiene un *logger true y false*; lo cual da palo en *rails 4.2*,
(y creo que en todos). Además, para que loguear que se compiló toda es *mierda*
si al fallar la *compilación*; será logueado por el *controlador* )

La simple y difícil de mantener:

Sin la brujería anterior, habría que usar lo que dice el comentario y poner junto a
*search.js* el resto de las *assets*. Quizás usted tú uses su *CSS* en solo fichero,
siendo el caso, con añadir ese solo fichero, resolvió el problema.

El rollo vendrá en que si agrega una *CSS* mś tarde, no se recordará que debe
*compilarla*; agregando el nombre al *array* donde está *search.js*.

**Nota** para los *imbéciles*: El fichero *search.js* es un ejemplo. Quítalo y
pon el nombre de tu *Asset*

A mi me quedó así:

Rails.application.config.assets.version = '1.0'
Rails.application.config.assets.precompile += %w( tu_css_general.css tu_framework.js )

¿Por qué esto es tan complejo? Porque *Rails* exhorta a sus usaurios a usar
*Turbolinks* (realmente es la mejor opción) y la configuración por defecto, deja
que *Turbolinks* se ocupe de esas cosas.

### Turbolink es una muy buena opción!

Sobre todo para aplicaciones de cara a *internet* o bien de cara a una red lenta
(*infomed* u otro *PPP* de Cuba). A mi en lo personal *Turbolinks* me resulta un
estorbo a la hora de desplegar una aplicación de *rails* en una máquina que
carece de *nodejs*. Por ejemplo, algunos de mis clientes usan *Ubuntu* del año 4.

### En mi opinión:

   - *Therubyracer* es un asco, tiene que mejorar mucho todavía

   - *CoffeScript* sobra, al final debes saber *JavaScript* para programar con *Coffe*

   {% blockquote Murphy, Ley de Turbolinks %}
   Donde V8 o nodejs sean un problema, turbolinks lo será.
   {% endblockquote %}

/////////////////////////////////////////////////////////////////////////
//NDT(nota del traductor): Si te refieres al dicho popular *contantes y sonantes*
//el dicho se refiere al dinero, las monedas. Que son contantes, pueden ser
//contadas, 1,2,3,4 etc; y sonantes, que hacen ruido al caer, clink, clink.
//lol --- si te refieres a otra cosa, voy a releer el art. ahora mismo.
/////////////////////////////////////////////////////////////////////////

---
layout: post
title: "Verano de Codigo 2015"
date: 2015-03-17 17:20:00 -0500
comments: true
categories:
encoding: utf-8
---

Verano de Código 2015

Es un programa [global](https://www.google-melange.com/gsoc/homepage/google/gsoc2015\), promovido por *Google*. Ofrece a los estudiantes y
desarrolladores, mayores de *18 años*, la oportunidad de implicarse en
proyectos de *código abierto* y ganar estupendos premios.

Durante un período de tres meses, se ha trabajado para identificar y
descubrir proyectos de *código abierto*, *software libre* y *grupos de tecnología*
relacionados.

Desde su creación en *2005*, el programa ha reunido a más de *8.500* implicados
estudiantes, procedentes de *101* países y, más de *8.300* mentores.
Al rededor de *50 millones* de líneas, han sido escritas durante este tiempo.

Por medeio de esta iniciativa de *Google*, los estudiantes seleccionados, son
emparejados con uno o varios mentores, ganando acceso a las plataformas de
desarrollo de software, en el país de *Todos*.

Creándose una especie de *punto de encuentro*, entre desarrolladores. Algunos
aspirantes, otros experimentados. El beneficio es mutuo y, el resultado habla
por sí, mismo. **Código libre*, *libertad para todos*.

Montones y montones de líneas de *código*, presentadas ante la humanidad, como
patrimonio exclusivo, para el uso del *humano*. Sin restricciones impuestas, por
compañías supestamente *supranacionales*.

### Matz Ruby interpreter [MRI](Create new page · rubygsoc/rubygsoc Wiki · GitHub)

Sin lugar a dudas, una de las propuestas mas jugosas y tentadoras, es el
proyecto *Ruby*. Concretamente, el *interprete de Ruby*, comúnmente llamado,
*C Ruby*.

*MRI*, trata de desarrollar un novedoso sistema de bloqueo, capaz de dividir
el *GVL* en bloqueos más precisos para diferentes subsistemas, en una
máquina virtual.

El *intérprete global de bloqueo* o *GIL* (Global Interpreter Lock) es una
funcionalidad utilizada en los lenguajes de programación, que trata de
sincronizar los *hilos* de ejecución, para que sólamente un *hilo*, pueda ser
ejecutado, al mismo tiempo.

>...Si los procesos que están en [condición de carrera](https://es.wikipedia.org/wiki/Cierre_de_exclusión_mutua\) de carrera no son correctamente
sincronizados, puede producirse una corrupción de datos, que puede ser
aprovechada por exploits locales para vulnerar los sistemas...
>

Resulta una desafienate tarea, que implica detectar primero, qué sistemas
del *MRI* necesitan bloqueos específicos y, también la concreción de un modelo
de memoria *Ruby*, a un alto nivel de abstracción.

[Proyecto Ruby-4](Create new page · rubygsoc/rubygsoc Wiki · GitHub)