Jun 09

A pesar de que Rails 3 aun esta en beta (beta 4 y rc pronto), en la pagina oficial de Ruby on Rails en la seccion de screencast se ha publicado una serie de videos sobre esta version.

Pueden verlos accediendo a http://rubyonrails.org/screencasts/rails3/, estan todos en Ingles. El video introductorio habla sobre nuevos atajos para comandos comunes, cambios en la sintaxis, mejoras y en general sobre las novedades que se podran encontrar.

Dec 24

Grupo de videos creados por “The Japanese Foundation“, la primera serie (Basic I) fue creado entre 1984 y 1985. Presentado por Mary Atlhaus utiliza sketchs con la participacion de Mine-san (Yusuke Mine), Sugihara-san (Miki Sugihara), y Kaihô-san (Hiroyuki Kaihô), estos sketchs ayudan a memorizar y tambien practicar el uso de nuevas palabras y estructuras gramaticales. La serie tambien sigue la historia de Yan, un personaje que llega a Japon para trabajar como arquitecto.

La segunda serie (Basic II) fue creada en 1995 y es presentada por Tae Umino, esta vez los sketchs son realizados por Andô-san (Seiji Andô), Koyanagi-san (Chinatsu Koyanagi) y Kodama-san (Yorinobu Kodama). En esta serie la historia de Yan continua.

Algunas screenshots de un episodio de la primera serie


La presentadora de la primera serie Mary Atlhaus,

Sugihara-san y Mine-san

Mine-san y Kaihô en un sketch

Y a lo que vinimos, las descargas:

Basic I

1. I’m Yan.
Tamaño: 77.1 mb | Formato: .avi

2. What’s that?
Tamaño: 81.9 mb | Formato: .avi

3. There’s a cat.
Tamaño: 77.2 mb | Formato: .avi

4. Where is it?
Tamaño: 75.1 mb | Formato: .avi

5. Please give me some stamps.
Tamaño: 68.1 mb | Formato: .avi

6. Please turn left at the next corner.
Tamaño: 61.9 mb | Formato: .avi

7. May I look at this?
Tamaño: 69.2 mb | Formato: .avi

8. May I write with a pencil?
Tamaño: 66.3 mb | Formato: .avi

9. She gets up at 6 o’clock every morning.
Tamaño: 67.5 mb | Formato: .avi

10. He doesn’t drink milk.
Tamaño: 81.0 mb | Formato: .avi

11. I went to Nikkō.
Tamaño: 60.5 mb | Formato: .avi

12. When did you go?
Tamaño: 63.3 mb | Formato: .avi

13. They’re watching a baseball game.
Tamaño: 66.0 mb | Formato: .avi

14. He’s drinking beer while watching TV.
Tamaño: 69.1 mb | Formato: .avi

15. It’s hot every day.
Tamaño: 74.0 mb | Formato: .avi

16. Is it hot enough?
Tamaño: 65.1 mb | Formato: .avi

17. I want to drink some cold beer.
Tamaño: 74.2 mb | Formato: .avi

18. Do you dislike fish?
Tamaño: 68.5 mb | Formato: .avi

19. Mt Fuji will come into view before long.
Tamaño: 66.4 mb | Formato: .avi

20. It looks good.
Tamaño: 82.7 mb | Formato: .avi

21. I can’t speak English.
Tamaño: 62.4 mb | Formato: .avi

22. Is it possible to see the model room?
Tamaño: 64.7 mb | Formato: .avi

23. Why aren’t cars passing?
Tamaño: 87.5 mb | Formato: .avi

24. We’re a little late so let’s hurry
Tamaño: 90.6 mb | Formato: .avi

25. What’s in the briefcase?
Tamaño: 70.4 mb | Formato: .avi

26. Do you remember
Tamaño: 98.4 mb | Formato: .avi

Basic II

1. I think I can be there by 4 PM
Tamaño: 114.4 mb | Formato: .avi

2. Maybe you should go and meet her soon
Tamaño: 82.5 mb | Formato: .avi

3. He said he’s going to Nagasaki today
Tamaño: 68.4 mb | Formato: .avi

4. I got them from a friend
Tamaño: 67.0 mb | Formato: .avi

5. We’re thinking of singing Beethoven’s ninth
Tamaño: 70.0 mb | Formato: .avi

6. Try reading the Japanese
Tamaño: 74.4 mb | Formato: .avi

7. It’s nice and clean now
Tamaño: 85.4 mb | Formato: .avi

8. Will you turn up the volume on the TV a little bit?
Tamaño: 83.3 mb | Formato: .avi

9. Turn the stove off when you leave the room
Tamaño: 84.8 mb | Formato: .avi

10. I’m so bored I don’t know what to do
Tamaño: 76.5 mb | Formato: .avi

11. Shall I change the towel?
Tamaño: 78.5 mb | Formato: .avi

12. Mr.Terada has been taking care of me
Tamaño: 75.3 mb | Formato: .avi

13. If this design is chosen, I’ll go back to my country
Tamaño: 88.4 mb | Formato: .avi

14. You mustn’t tell Yan
Tamaño: 111.3 mb | Formato: .avi

15. He doesn’t seem to be there
Tamaño: 79.3 mb | Formato: .avi

16. Even if we invite him, I don’t think he’ll come
Tamaño: 93.2 mb | Formato: .avi

17. I was in a hurry, so I couldn’t buy it
Tamaño: 76.3 mb | Formato: .avi

18. I’m planning to see the sea, visit old houses and so on.
Tamaño: 86.4 mb | Formato: .avi

19. It’s hard, working like that in this snow
Tamaño: 82.2 mb | Formato: .avi

20. What’s this fish called?
Tamaño: 88.3 mb | Formato: .avi

21. The sakura hasn’t bloomed yet, has it?
Tamaño: 125.0 mb | Formato: .avi

22. There’s only one bottle left
Tamaño: 112.5 mb | Formato: .avi

23. We’ll miss you when you’ve gone
Tamaño: 107.4 mb | Formato: .avi

24. I’ve never traveled abroad before
Tamaño: 79.2 mb | Formato: .avi

25. Give it to him when he’s come down
Tamaño: 92.1 mb | Formato: .avi

26. If you’re ever in Japan again please stop by
Tamaño: 106.9 mb | Formato: .avi

Saludos.

Dec 22

Ruby ofrece estructuras condicionales o de control como if/else, case(switch) y otras que vere en esta entrada.

Declaracion if

Un bloque de codigo dado es ejecutado solo si la condicion es verdadera(true).

if condicion
   # codigo a ejecutar si la condicion es verdadera
end

Por ejemplo:

edad = 23
if edad >= 18
   puts "Mayor de edad."
end
Mayor de edad.

En ruby es considerado verdadero todo aquello que no sea false o nil.

Declaracion if…else

Se puede definir un bloque de codigo a ser ejecutado cuando la condicion no se cumpla usando else(si no):

if condicion
   # codigo a ejecutar si la condicion es verdadera
else
   # codigo a ejecutar si la condicion es falsa
end

Por ejemplo:

edad = 15
if edad >= 18
   puts "Mayor de edad."
else
   puts "Menor de edad."
end
Menor de edad.

Declaracion if…elsif…else

Mediante el uso de elsif podemos agregar condiciones con su respectivo bloque de codigo:

if condicion1
   # codigo a ejecutar si condicion1 es verdadera
elsif condicion2
   # codigo a ejecutar si condicion 1 es falsa y condicion2 verdadera
else
   # codigo si ninguna de las condiciones anteriores era verdadera
end

Por ejemplo:

idioma = "es"
if idioma == "en"
   puts "Welcome to my website."
elsif idioma == "es"
   puts "Bienvenido a mi sitio."
else
   puts "Idioma desconocido."
end
Bienvenido a mi sitio.

Ojo que es elsif y NO elseif como se podria esperar.

Otra cosa importante a notar es que se puede separar la condicion del codigo a ejecutar de tres formas diferentes, con una nueva linea como en los ejemplos, mediante el uso de la palabra clave then(entonces) luego de la condicion, o usando punto y coma.

idioma = "es"
if idioma == "en" then puts "Welcome to my website."
elsif idioma == "es" then puts "Bienvenido a mi sitio."
else puts "Idioma desconocido." end

La esctructura que obtenemos es “si (condicion) entonces (codigo)“. Como else no requiere condicion, se puede escribir el codigo junto sin necesidad de usar un separador, y el end tambien se puede agregar en la misma linea.

Y luego el tercer caso usando punto y coma.

idioma = "es"
if idioma == "en" ; puts "Welcome to my website."
elsif idioma == "es" ; puts "Bienvenido a mi sitio."
else puts "Idioma desconocido." end

Como nota, el uso de punto y coma en general se puede utilizar para escribir multiples lineas en una sola, por ejemplo:

numero = 12 ; puts "El numero es #{numero}"
El numero es 12

Declaracion unless

Esta declaracion que significa “a menos que” ejecuta un bloque de codigo si la condicion es falsa o nil.

unless condicion
   # codigo a ejecutar si la condicion es falsa o nil
end

Por ejemplo:

edad = 15
unless edad > 18
   puts "No puedes acceder a este sitio para mayores."
end
No puedes acceder a este sitio para mayores.

Declaracion unless…else

Asi como if, unless tambien dispone de else.

unless condicion
   # codigo a ejecutar si la condicion es falsa o nil
else
   # codigo a ejecutar si la condicion es verdadera
end

Por ejemplo:

edad = 20
unless edad > 18
   puts "No puedes acceder a este sitio para mayores."
else
   puts "Bienvenido al sitio."
end
Bienvenido al sitio.

Modificadores para if y unless

Ruby dispone de los llamados “modifiers” que permiten mover la estructura de control al final de la expresion, en esta entrada solo vere los modificadores de if y unless pero tambien hay para while y until, veamos la estructura.

codigo if condicion

La idea con if sigue siendo la misma, ejecutar el “codigo” si la condicion es verdadera, por ejemplo:

puntaje = 75
puts 'Aprobado.' if puntaje >= 60
Aprobado.

Para unless seria:

puntaje = 75
puts 'Aprobado.' unless puntaje < 60
Aprobado.

Esto nos permite poner el codigo de una forma un poco mas leible, este ultimo ejemplo se podria leer como “Escribir Aprobado a menos que el puntaje sea menor a 60″.

Declaracion case

Esta nos permite probar “casos” al comparar la expresion dada en “case” con las expresiones dadas en “when” y luego ejecutando el codigo correspondiente. En caso que ningun caso coincida se ejecuta el bloque de codigo bajo else:

case expr0
when expr1, expr2
   # codigo a ejecutar si expr0 coindice con expr1 o expr2
when expr3
   # codigo a ejecutar si expr0 coincide con expr3
else
   # codigo a ejecutar si no coindice con ningun caso
end

Por ejemplo:

puntaje = 75
case puntaje
when 100
   puts "Puntaje perfecto"
when 80..100
   puts "Excelente"
when 60..80
   puts "Aprobado"
else
   puts "Reprobado"
end
Aprobado

En este ejemplo hay 3 casos definidos ademas del else, el primero compara “puntaje” con el valor 100, el siguiente con el rango de 80 a 100 y el tercero con el rango de 60 a 80. Cabe mencionar que cuando un when es exitoso los demas casos no son evaluados.

Tambien aprovecho de mencionar que al igual que en la estructura if, la expresion puede ser separada del codigo mediante una linea nueva, la palabra clave then o un punto y coma.

Operador ternario

Ruby tambien cuenta con el operador ternario que nos provee de un atajo para tomar decisiones, la estructura es la siguiente:

( condicion ) ? expresion si verdadero : expresion si falso

La condicion es evaluada y devuelve “expresion si verdadero” cuando es verdadera y “expresion si falso” cuando es falsa, veamos un ejemplo:

edad = 17
puts ( edad >= 18 ) ? "Es mayor" : "No es mayor"
No es mayor

El parentesis no es obligacion. Al evaluar “edad >=18″ que resulta ser verdadero el operador ternario devuelve “Es mayor”, esto lo muestro en pantalla anteponiendo el metodo puts, tambien podria almacenar el resultado en una variable como:

edad = 17
es_o_no = ( edad >= 18 ) ? "Es mayor" : "No es mayor"
puts es_o_no

Que daria el mismo resultado, y asi acaba esta entrada.

etiquetas: , , , , , , ,

Dec 18

En Ruby un array es una coleccion de referencias a objetos, la referencia se hace mediante un indice numerico entero. Comencemos viendo como crear un array.

Crear un array

Una de las formas de crear un Array en Ruby es usar square brackets(los corchetes), simplemente ponemos los elementos separados por coma(si es mas de uno):

lista1 = [ ] # array vacio
lista2 = [ 1, 3, 5, 7, 11 ] # array con elementos tipo Fixnum
lista3 = [ 8, 'manzana', 3.14 ] # con distintos tipos de objetos (Fixnum, String, Float)
p lista1, lista2, lista3 # uso 'p' en vez de 'puts' para inspeccionar
[]
[1, 3, 5, 7, 11]
[8, "manzana", 3.14]

Otra forma es usando Array.new:

lista1 = Array.new # array vacio
lista2 = Array.new(5) # array con 5 elementos
lista3 = Array.new(3, 'test') # array con 3 elementos
p lista1, lista2, lista3
[]
[nil, nil, nil, nil, nil]
["test", "test", "test"]

Aca pueden notar que por defecto el array lista2 se llena de objetos nil ya que no se le ha dado un valor por defecto como en lista3.

Tambien existe un atajo para crear un array con valores tipo String, por ejemplo:

colores1 = [ 'rojo', 'verde', 'azul', 'amarillo' ] # usando brackets
colores2 = %w{ rojo verde azul amarillo } # usando el atajo %w
p colores1, colores2
["rojo", "verde", "azul", "amarillo"]
["rojo", "verde", "azul", "amarillo"]

Como ven son equivalentes, este atajo nos ahorra la tediosa tarea de escribir las comillas para cada elemento.

Cantidad de elementos en un array

Para conocer la cantidad de elementos en un array tenemos dos metodos, size y length:

nada = []
nums = [1, 3, 5, 7]
puts nada.size, nums.size # tambien puedo usar 'length'
0
4

Acceder a los objetos

Para acceder a un elemento en particular se puede hacer mediante su indice, en ruby los indices parten desde 0:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
puts colores[0] # el indice 0 corresponde al primer elemento
puts colores[3] # por tanto el indice 3  corresponde al ultimo elemento
# al usar un indice negativo se cuenta desde el final
puts colores[-1] # el ultimo elemento
puts colores[-2] # el penultimo
rojo
cafe
cafe
verde

Tambien es posible acceder usando el formato [inicio, cantidad] como se muestra:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
p colores[0,2] # desde el indice 0 mostrar 2
p colores[1,3] # desde el indice 1 mostrar 3
p colores[-2,2] # desde el penultimo mostrar 2
["rojo", "azul"]
["azul", "verde", "cafe"]
["verde", "cafe"]

Una tercera forma es usando rangos, [desde..hasta] o [desde...hasta], por si no se nota la diferencia es un punto. Al usar tres puntos, se excluye al ultimo elemento:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
p colores[0..2] # desde elemento con indice 0 al con indice 2(incluido)
p colores[0...2] # desde elemento con indice 0 al con indice 2(excluido)
# tambien se pueden usar numeros negativos aqui
p colores[-2..-1] # del penultimo al ultimo(incluido)
p colores[0...-1] # del primero al ultimo(excluido)
["rojo", "azul", "verde"]
["rojo", "azul"]
["verde", "cafe"]
["rojo", "azul", "verde"]

Y una forma mas es el uso de los metodos first y last:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
p colores.first # el primero
p colores.first(3) # los primeros 3
p colores.last # el ultimo
p colores.last(2) # los ultimos 2
"rojo"
["rojo", "azul", "verde"]
"cafe"
["verde", "cafe"]

Modificar los objetos

Para modificar un valor en particular:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[2] = 'naranja' # cambio el tercer valor
colores[-1] = 'amarillo' # y el ultimo
p colores
["rojo", "azul", "naranja", "amarillo"]

Tambien puedo usar el mismo formato [indice, largo] para modificar el array:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[1,2] = 'naranja' # dos elementos a partir del indice 1
p colores
["rojo", "naranja", "cafe"]

Pueden notar que en este caso se redujo el tamaño del array, esto es porque indique que los dos valores a partir del indice 1 se vieran reemplazados por un solo valor ‘naranja’, si quisiera mantener la cantidad deberia usar un array como en el siguiente ejemplo:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[1,2] = ['naranja', 'amarillo']
p colores
["rojo", "naranja", "amarillo", "cafe"]

Ahora si los dos valores centrales fueron reemplazados por dos nuevos valores. Tambien se podria incrementar el tamaño del array si se quiere:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[1,2] = ['naranja', 'amarillo', 'gris']
p colores
["rojo", "naranja", "amarillo", "gris", "cafe"]

En este caso indique que los dos valores a partir del indice 1 se vieran reemplazados por 3 valores nuevos, esto hizo que el valor ‘cafe’ se desplazara una posicion a la derecha aumentando el tamaño del array.

Esto mismo se puede hacer con los rangos vistos antes, por ejemplo:

colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[0..2] = ['naranja', 'amarillo', 'gris']
p colores
["naranja", "amarillo", "gris", "cafe"]

Aqui el rango indica modificar los primeros tres valores(indices 0 a 2) por tres nuevos valores, por lo que el tamaño del array queda intacto.

Array como una pila (stack, LIFO)

Existen dos metodos que permiten agregar y eliminar elementos desde el final de un array, estos son push y pop respectivamente, veamos un ejemplo:

pila = [] # comienzo con un array vacio
pila.push 'uno'
pila.push 'dos'
pila.push 'tres'
p colores # a esta altura tiene 3 elementos
puts pila.pop # voy quitando desde el ultimo
puts pila.pop
puts pila.pop
p colores
["uno", "dos", "tres"]
tres
dos
uno
[]

El array que comenzo vacio termino vacio debido a que use el metodo pop tres veces, utilize puts para verificar el elemento que es eliminado cada vez que utilizo pop.

Arrays como una cola (queue FIFO)

Tambien existen dos metodos para agregar y remover desde el inicio de un array, estos son unshift y shift, veamos un ejemplo:

colores = [] # comienzo con un array vacio
colores.unshift 'azul'
colores.unshift 'verde'
colores.unshift 'rojo'
p colores # a esta altura tiene 3 elementos
puts colores.shift # voy quitando el primero
puts colores.shift
puts colores.shift
p colores
["rojo", "verde", "azul"]
rojo
verde
azul
[]

Como ven el array resultante es inverso al del ejemplo anterior, pues los nuevos elementos son agregados al inicio del array.

Ahora, para obtener el comportamiento de una cola(queue) es necesario combinar push que agrega los elemento al final y shift que elimina desde el inicio:

cola = []
cola.push 'cliente1'
cola.push 'cliente2'
cola.push 'cliente3'
p cola # el que llego ultimo queda al ultimo
puts cola.shift # el que llego primero se va primero
puts cola.shift
puts cola.shift
p cola
["cliente1", "cliente2", "cliente3"]
cliente1
cliente2
cliente3
[]

Eso seria por esta entrada, para saber mas sobre arrays pueden visitar la documentacion sobre Arrays para Ruby 1.9.

Dec 18

Documentos en español con los kanjis separados en los grados escolares (1 a 6 primaria y 7A, 7B, 7C secundaria), en la imagen la primera pagina del primer grado.

Descargar archivo
Tamaño: 1.7 mb | Formato: .zip -> .pdf(9)

Desconozco el creador de estos documentos, si alguien lo sabe le agradezco si me lo indica.

Saludos.

etiquetas: ,