martes, 13 de marzo de 2018

La mejor entrevista que me han hecho como desarrollador en Ruby on Rails

Bueno, no pude evitarlo. Quiero explicar es agradable experiencia independientemente de que continue (que espero que si) o no el proceso.

Tuve una sesion en Skype con el CTO de una gran empresa con sede en Alemania. Empezamos con una breve intro acerca de mi y de el.
Unos minutos despues me dijo que iba a preguntarme algunas preguntas teoricas acerca de ruby y de rails.
Las preguntas no tienen desperdicio:
Empezamos con lo más básico.

Cual es la diferencia entre una clase y un modulo. A groso modo Classes se pueden instanciar y pueden tener herencia de otras clases modulos no. Los modulos sirven más separar codigo y ordenarlo.

Que es un "singleton method" es una forma de "garantizar que una clase sólo tenga una instancia, y proporcionar un punto de acceso global a ella".
Segun wikipedia:


En ingeniería de software, singleton o instancia única es un patrón de diseño que permite restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.
Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.
El patrón singleton se implementa creando en nuestra clase un método que crea una instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con modificadores de acceso como protegido o privado).

Que clases de variables hay en un modulo? Esta pregunta es trampa y no lo habia pensado. De hecho no estoy seguro.  Le dije que obviamente las "instance variables" solo se pueden usar para una clase. Habra que revisar eso. Luego tambien que el alcance de una variable es solo dentro del modulo, nada nuevo en eso.

Cual es la diferencia entre extende e include.
En resumen seria, cuando añadimos un modulo en el objeto con include añadimos metodos en la cadena de herenncia de ese objeto.

Cuando usamos extend es lo mismo que include con el objeto de clase "singleton"
ejemplos.

class A
  include M
end

A.ancestors # => [A, M, Object...]

####
class A
  extend M
end
A.singleton_class.ancestors # =>  [M, Class, Module...]

Auque podemos llamar extend en una instancia asi.
a = A.new

a.extend(M)

> a.singleton_class.ancestors
# => [M, A, Object, Kernel, BasicObject]

Por que usar rspec . Le dije que en lo personal me gusta por que es muy descriptivo y es lo más parecido al pseudocódigo para saber por donde empezar a trabajar haciendo test driven development. adermás de que si estsan bien escritos es muy facil encontrar errores.

Rails. como usar helper? Me preguntó como accedia helper y bueno, me maté la cabeza tratando de entederlo pero simplemente es automatico está incluido detro de rails. Le dije que lo importante aquí es que helper lo usamos para añadir metodos para las vistas y que en los modelos normalmente guardamos la logica y en controller es solo el director de la orquesta que distribuye y lleva los metodos de model a las vistas.

problema de usar n+1 en activerecord queries. Aquí me confundi. Se me habia olvidado este concepto. El final me explico lo que se me habia olvidado. n+1 significa cuado estmos haciendo loops en los datos para tomar un metodo especifico y así obtener un atributo dentro de las peticiones(queries). En lugar de hacer ese loop que es muy costoso en memoria podemos hacer una peticion connnnn where y find. Este tema y los anteriores los desarollare en otros posts. Por ahora quí queda.

Me gusto muchisimo la entrevista. El hombre era humilde directo, con preguntas muy acertadas y encima capaz de empatizar y explicarme en lo que habia fallado.

Por ultimo y algo que me parecio digno también de reconocimiento es que me explico antes de que yo preguntara todo lo que queria saber acerca del workflow, metas y problemas actuales, tecnologias que usan, buenas practicas, arquitectura .

Así fue y para mi gusto, así deberian las entrevistas.

Pragmaticas, constructivas, humildes y trasparentes.

Sin duda alguna, una de las mejores entrevistas que me han hecho, quiza la mejor.

sábado, 3 de marzo de 2018

Instalar Linux desde cero

Elige la distro de tu preferencia, teniendo en cuenta tus GB en RAM, procesador, experiencia en linux y documentación disponible o conociendo que usa tu equipo.

En mi caso tengo 1GB en RAM y un pentum Celeron ual core a 1.5 , si si lo sé necesito un Portatil/Laptop  nuevo...

Así que mis opciones se estrechan a 4-5 distros decentes.

1. Lubuntu, muy rapido y funcional para un equipo viejo como el mio
2. Xubuntu, Bastante bien de diseño, casi igual que ubuntu, solo que para equipos más viejos.
3. LXLE Una version diferente de Lubuntu, mucho más bonita y funcional
4. Elementary OS, el mejor diseño de los 4 con prestaciones parecidas a Xubuntu pero más moderno y rapido para empezar, aunque luego hace falta un poco más de dedicación para personaizarlo y trabajar con un entrono de desarollador.

Al final me decidí por LXLE aunque tuve problemas con la instalación varias veces e hice un cambio de planes a ultima hora por elementary. Mis unicas quejas son que tuve que costumizar muchos de los shortcuts ya que está pensado mas para usuarios muy principiantes y poco para usuarios de Ubuntu ( que fue y es la distro con la que me siento más comodo pero que no puedo usarla por que piden 2GB en RAM como minimo y 4GB recomendados).

Ok. Así que, una vez instalado Elementary fuí añadiendo cosas:

Temas para Pantheon-Elementary (La terminal por defecto de Elementary OS)
1. https://github.com/Mayccoll/Gogh/blob/master/content/themes.md

Luego para cambiar iconos etc, aquí esta la mejor fuente que he encotrado:
2. http://www.linuxandubuntu.com/home/how-to-install-themes-or-icons-in-elementary-os

Ahor vamos a lo básico como developer.

Felizmente alguien se me adelanto con todo esto, y que mejor que un developer amante de Elementary OS!

https://adam.merrifield.ca/2016/09/20/web-development-on-elementary-os-0-4-0-loki/

Para instalar Rails. Siempre he usado y me ha gustado
https://gorails.com/setup/ubuntu/16.04

Un error común es cuando tenemos instalado Ruby en el sistema operativo por defecto. Por lo menos en RVM hay un problema. Pirmero hay que desinstalar Ruby y luego instalar RVM y ruby desde RVM.

Para Instalar Docker!
https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository

lunes, 27 de marzo de 2017

Como colaborar en un repositorio de código abierto

No es tan sencillo como pensaba, pero tampoco es difícil.

Así es como lo he hecho:1. Se hace fork al proyecto adonde queremos cooperar/colaborar (apretar el boton de fork)

2. Vamos al repositorio que está en nuestra cuenta (el fork en si)
3. git clone nuestro-repo-fork

4. Entramos a nuestra carpeta y vemos que efectivamente esta el remoto vinculado a nuestra cuenta:

git remote -v

3. agregamos el directorio remoto del otro proyecto:

git remote add upstream repositorio-de-la-cuenta-donde-queremos-colaborar

4. Abrimos una rama nueva en nuestra carpeta


git checkout -b 'nueva_rama'

5. Una vez ahí hacemos los cambios que queramos para poder hacer el 'pull-request'

6. hacemos commit:

git add 'lo que queramos agregar'
git commit -m ' nombre del commit'

7. hacemos push al repositorio remoto del que queremos cooperar:

git push upstream nombre-de-mi-rama-con-mis-cambios

8. vamos a github*(en este caso es el ejemplo) y creamos pull request. 'create pull request'

9. Agregamos comentarios y abrimos Pull request.

10. Esperamos la contestación y seguimos con el típico procedimiento de arriba.

lunes, 9 de mayo de 2016

Metodos y Nombres nombres nombres....

He encontrado esto:

- methods that do something should be verbs:
  obj.calculate
  obj.set_name
  obj.get_date

- methods that are accessors (or behave like them) should be nouns:
  foo = obj.name
  puts obj.date
  obj.calculation

- Interrogative methods get phrased as questions:
  obj.date_today?
  obj.name?
  obj.calculation_done?

- methods that modify the object (or caller) itself, should be
exclamations:
  obj.truncate!
  obj.remove_name!
  obj.date! "Julian" # I wish I could do obj.date "Julian"!, instead.

Ah, well.
Fuente: https://www.ruby-forum.com/topic/898325

No hay mucha información acerca de esto, pero esimportantisimo... Hay solo que ver este artículo:
http://www.itworld.com/article/2833265/cloud-computing/don-t-go-into-programming-if-you-don-t-have-a-good-thesaurus.html

martes, 3 de noviembre de 2015

Mi primer rspec en Rails

Bueno, ¡Ya va siendo hora de hacer tests! Por que, nos aseguramos de que nuestro codigo funciona en cada nuevo cambio que hacemos o incluso antes de hacerlo. hay varios tipos de tests en rails, el que esta por defecto es el unity test, pero Rspec es el más famoso por se fácil de interpretar y de entender, aunque, eso si, un poco largo, Es una muy buena practica y podeis empezar con este tutorial, a hacer test driven developmnent!

Empezamos, con los más básico, vamos a isntalar el Gem o libreria dentro de nuestor proyecto.
en mi caso, uso rails 3.2.13 el rspec compatible, teneis que buscar cual es la compatibilidad en vuestro caso, ya sea en Rubygems  es  gem 'rspec-rails', '~> 3.2', '>= 3.2.1'
Otra cosa a tomar en cuenta es si necesitamos require 'spec_helper' o 'rails_helper' en el archivo spec.
Si falla algo lo mejor es ir buscando ell error en algun buscador, pero creo que no os he dicho nada nuevo ^^.
ejecuto para actualizar la libreria o gems:

bundle

Si la acualización de los gems fue bien,  ahora genero con rails los archivos para empezar a utilizar rspec.
rails generate rspec:install

Si creamos un modeo nuevo con rails generate model, nos generará unos archivos para poder hacer los tests y migrará los test también, si ya lo tenemos generado, tendremos que migrar los test (que es es este caso) nosotros mismos así:

bundle exec rake db:test:prepare

Usando el modelo hecho en el anterior post crearemos un archivo dentro de rspec/model/

un archivo con el nombre:

setup_rspec.rb

Y de contenido:

require "rails_helper"

RSpec.describe Setup, type: :model do

  before(:all)do
    @setup = Setup.new(title:"My Body")
    @sb4_setup = Sb4_Setup.new(san_type:"123456")
  end
  it "should have a matching title" do
    expect(@setup.title).to eq("My Body")
  end
  it "should have a matching san_type" do
    expect(@sb4_setup.san_type).to eq("123456")
  end
end

Ahora trata primero o escribelo y a ver si falla. Es bueno que falle. Así nos entrenaremos a hacer primero los tests y luego el codigo.
Y bueno, esa seria la primera versión, pero nos faltaria hacer tests de validators y de controllers.
Eso sera en el siguiente post :)

martes, 27 de octubre de 2015

Crear un projecto test para ver como funcionan las herencias dentro de un modelo (inheritance)

Voy a crear un  proyecto de cero para ver como y si funcionan las herencias dentro de las classes de un determinado modelo.

Asi que:


rails new single_t_inheritance_rails_test

ahora genero un modelo con scaffold generators:

rails generate model Setup setup_installations:string type:string
Es la forma más fácil de crear un proyecto.

Ahora migramos la base de datos:

bundle exec rake db:migrate

Vamos a usar herencias dentro del modelo, aquí esta la explicación en ingles con otro ejemplo


Ahora queremos migrar de un supuesto producto 1 en nombre del cliente. que seria, Customer, por ejemplo.

rails generate migration AddCustomerToProduct1Setup

Y vamos a:
db/migrations/add_customer...setup.rb
cambiamos.

def change 
  add_column :setups :customer :string 
end

bundle exec rake db:migrate

*tambien podemos hacer bundle exec rake:rollback y poner el nuevo atributo dentro de la primera migración, lo hago así para que saber como hacer en caso de que queramos agregar más atributos.

Una vez tenemos migrados los datos tenemos que crear las classes heredadas(Inherit classes).
En este caso.

single_t_inheritance_rails_test/app/models/product_1.rb

Y adentro

class Product_1 < Setup
  attribute_accessor :customer
end
Y Ahora podemos probar si funciona en la consola dentro de la terminal y nuestro proyecto:

rails console

Setup.create(setup_installations:"instalation 4")
Funciona.
Setup.create(customer:"New Customer 1")
protected attribute....
No tendria que funcionar
Es correcto! No podemos guardarlo por que solo podemos acceder si creamos una nueva clase.

Setup.create(customer:"New Customer 1")
Funciona!

Ahora ya sabes como crear herencias :). Ahun así ten en cuenta los pros y contras de estas.



jueves, 8 de octubre de 2015

Como fusionar o hacer "merge" en Git si tengo muchos cambios en diferentes ramas. Mi opción favorita

Este es un problema común si por alguna razón te enfermaste o hiciste muchos cambios en diferentes ramas con diferentes commits y evitar tener conflictos antes de intentar subir tus cambios a master.

Imaginemos que tengo La rama A, B y Master

Nuestro master esta actualizado (already updated)

En A tengo los commits: A5,A4,A3,A2,A1 adelante de master(ahead master)
En B tengo los commits: B2, B1 adelante de master(ahead master)

A es mucho más grande pero eso nos da igual. Lo primero que tenemos que tener claro es que las 2 ramas ya han sido revisadas y aprobadas por nosotros a algún otro compañero y están preparadas para enviar(ready to ship).

Pasos.

1. Hacer rebase en una de las ramas

git checkout A

usamos rebase y por ejemplo usamos "squash", aqui puedes ver la documentación:

git rebase -i HEAD~5

m A5 "el primero"
squash A4
s AX
s ""
...

realizar los cambios en nuestor editor de texto y guardarlo para convertir todo un solo commit.
Este commit lo puedo usar ahora en otra rama.

2. Hacer rebase en la otra rama.

git checkout B

ahora hago el mismo procedimiento que arriba, la diferencia es que ahora solo son 2 commits.

Esto lo hago por que una vez que pase un commit a la rama que hare merge en master no podre cambiar los commits anterirores al comit que copiare de una de las ramas y lo pasare a la que quiero enviar el codigo a master. Así quedará todo más limpio


3. Elegir cual de las 2 hare merge.
Aconsejo usar la rama más importante de las 2. En caso de que las 2 sean imporantes también puedes crear una nueva rama  prepararla explicarlo todos los cambios de las otras 2 . Para evitar malentendidos con los comapañeros lo mejor es poner los 2 links en comentarios en las 3 y cerrar las otras 2 dejando solo la nueva. 

En este caso suponemos que B es solo una serie de bugs(errores) y A es la imporante.

4. elegír commit (cherry-pick), pasarlo y resolver conflictos.

git checkout B

Copiar el los comentarios del commit en si en algún lugar, más adelante lo podras usar.
Copiar numero de commit, será algo así como "asgfh3658" al lado del commit a la derecha.

git checkout A

git cherry-pick #num_del_commit

Ahora, cruza los dedos a ver si no hay ningun conflicto, sino, no pasa nada, a resolver conflictos :). Borra una de las 2 opciones dejando la otra y borrando las lineas extra.

Una vez resueltos los conflictos:

git add .
git commit -m "aquí pega los comentarios, si todo está en ordén tienes que poner la misma info del commit" 

5. Pequeños detalles finales como cambiar info del commit y fecha de publicación.

cambiar la info del ultimo commit:

git commit --amend -m "nuevo commit" ó
git commit --amend 
Con este ultimo te lleva a tu editor predeterminado, puedes borrar parte del commit antiguo y dejar el resto.

Listo!
No fue tan difícil verdad? Quiza es un poco lio, pero creeme, es una de las formas más sencillas de hacerlo.