segunda-feira, 16 de dezembro de 2013

Palavrão - Palavra com muitas letras.

Qual a maior palavra do mundo?


É um insulto nórdico: pionaliopecaedriajerkdivhdjaldkrjanekdociddonamzzaripdeecedeo-
geidofnsyejitecoalemmetpoadeclapenneaemahsjvukdubvgofn-docvirorivobnidpodovusodurnrhyvudoenbhsfciofnpemerohivokri geidofnsyejitecoalemmetpoadeclapenneaemahsjvukdubvgofn-docvirorivobnidpodovusodurnrhyvudoenbhsfciofnpemerohivokrigeidofnsyejitecoalemmetpoadeclapenneaemahsjvukdubvgofn-
docvirorivobnidpodovusodurnrhyvudoenbhsfciofnpemerohivokricom 173 letras. Este palavrão é um xingamento sobre um homem branco ex-escravo porém escravocrata. No entanto, muitos citam como maior a palavra λοπαδο­τεμαχο­σελαχο­γαλεο­κρανιο­λειψανο­δριμ­υπο­τριμματο­σιλφιο­καραβο­μελιτο­κατακεχυ­μενο­κιχλ­επι­κοσσυφο­φαττο­περιστερ­αλεκτρυον­οπτο­κεφαλλιο­κιγκλο­πελειο­λαγῳο­σιραιο­βαφη­τραγανο­πτερύγων
que tem 170 letras no alfabeto grego, e ao ser transliterada, passa a ter 182 letras:
Lopadotemakhoselakhogaleokranioleipsanodrimypotrimmatos-
ilphiokarabomelitokatakekhymenokikhlepikossyphophattoperis-
teralektryonoptekephalliokinklopeleiolagōiosiraiobaphētraganopterygṓn.
Acontece que esta palavra se refere a um prato culinário fictício mencionado na comédia As Mulheres na Assembleia, de Aristófanes, então não vale.

A maior palavra da língua portuguesa registrada em dicionário é pneumoultramicroscopicossilicovulcanoconiótico, com 46 letras. O primeiro registro oficial aconteceu em 2001, no Dicionário Houaiss da Língua Portuguesa a descreve o indivíduo que possui doença pulmonar causada pela inspiração de cinzas vulcânicas. O nome científico dessa doença é silicose. Bem mais fácil, né?

quarta-feira, 4 de dezembro de 2013

LINUX - ESCREVER ARQUIVO HTML COM UM SCRIPT

Here Scripts LINUX 


Here Script (here-document, heredoc, Heres, Here-string ou Here-script) é um arquivo literal ou entrada de fluxo literal: é uma seção de um arquivo de código fonte que é tratado como se fosse um arquivo separado. O termo também é usado para uma forma de strings literais de várias linhas que usam sintaxe semelhante, preservando as quebras de linha e outros espaços em branco (incluindo o recuo) no texto.
Documentos here originam no shell do Unix, e são encontrados em sh, csh , ksh , bash e zsh , entre outros. Strings here literais de estilo documento são encontrados em várias linguagens de alto nível.

Para documentos here, seja tratada como arquivos ou strings, algumas linguagens os trata como um formato string, permitindo a substituição de variáveis ​​e substituição de comandos dentro do literal.

A sintaxe mais comum para documentos here, originários de Unix shells, é << seguido por um identificador de delimitação, seguida, a partir da próxima linha, pelo texto a ser citado, e depois fechada pelo mesmo identificador em sua própria linha .

 Esta sintaxe é porque os documentos here são formalmente um fluxo de literais e o conteúdo do documento é redirecionado para stdin ( entrada padrão) do comando anterior;

 a sintaxe de documentos here é por analogia à sintaxe do redirecionamento de entrada, que é:  < "tomar a entrada a partir da saída da seguinte comando".

Outras linguagens costumam usar sintaxe substancialmente similar, mas os detalhes de sintaxe e funcionalidade real pode variar significativamente. 
Quando usado simplesmente para strings literais, o << não indica indireto, mas é simplesmente uma convenção delimitador inicial. 
Em algumas linguagens, como o Ruby, << também é usado para redirecionamento de entrada, resultando ser usado << duas vezes se se deseja redirecionar a partir de um documento here string literal.

Construindo uma aplicação útil, escrevendo um arquivo HTML com um script.

Esta aplicação produzi um documento HTML que contém informações sobre o sistema. 
Um arquivo HTML formatado corretamente contém o seguinte conteúdo:
<HTML>
<HEAD>
    <TITLE>
    O título da página.
    </TITLE>
</HEAD>

<BODY>
    O conteúdo da página.
</BODY>
</HTML>
Podemos escrever um script para produzir o conteúdo abaixo:
#!/bin/bash

# make_page - A script para produzir um arquivo HTML

echo "<HTML>"
echo "<HEAD>"
echo "  <TITLE>"
echo "  O título da página"
echo "  </TITLE>"
echo "</HEAD>"
echo ""
echo "<BODY>"
echo "  O conteúdo da página."
echo "</BODY>"
echo "</HTML>"
       
Este script pode ser executado assim:

[alex@linux]$ make_page > page.html

Fazendo códigos que salvam seus trabalhos por si mesmos.

O primeiro aprimoramento será trocar o uso repetido do comando echo por um script, assim: 
#!/bin/bash

# make_page - Um script para produzir um arquivo HTML

cat << _EOF_
<HTML>
<HEAD>
    <TITLE>
    O título da página
    </TITLE>
</HEAD>

<BODY>
    O conteúdo da página.
</BODY>
</HTML>
_EOF_
       

Um script here(algumas vezes chamada de here document) é uma forma adicional de redirecionamento I/O . Este permite uma maneira de incluir conteúdo que será fornecido a um comando de entrada de dados padrão. No caso do script acima, o comando cat forneceu um fluxo de dados de entrada a partir do script para a entrada de dados padrão.

Um here script é construído assim:
command << token
content to be used as command's standard input
token
       
token can be any string of characters. I use "_EOF_" (EOF is short for "End Of File") because it is traditional, but you can use anything, as long as it does not conflict with a bash reserved word. The token that ends the here script must exactly match the one that starts it, or else the remainder of your script will be interpreted as more standard input to the command.
There is one additional trick that can be used with a here script. Often you will want to indent the content portion of the here script to improve the readability of your script. You can do this if you change the script as follows:
#!/bin/bash

# make_page - A script to produce an HTML file

cat <<- _EOF_
    <HTML>
    <HEAD>
        <TITLE>
        The title of your page
        </TITLE>
    </HEAD>

    <BODY>
        Your page content goes here.
    </BODY>
    </HTML>
_EOF_
       
Changing the the "<<" to "<<-" causes bash to ignore the leading tabs (but not spaces) in the here script. The output from the cat command will not contain any of the leading tab characters.
O.k., let's make our page. We will edit our page to get it to say something:
#!/bin/bash

# make_page - A script to produce an HTML file

cat <<- _EOF_
    <HTML>
    <HEAD>
        <TITLE>
        My System Information
        </TITLE>
    </HEAD>

    <BODY>
    <H1>My System Information</H1>
    </BODY>
    </HTML>
_EOF_
       
In our next lesson, we will make our script produce real information about the system.

terça-feira, 3 de dezembro de 2013

Ruby 5 - METAPROGRAMAÇÃO

Ruby Metaprogramming


Metaprogramação

Metaprogramação é a codificação de programas de computador que escrevem ou manipulam outros programas (ou a si próprios), como seus dados, ou que fazem parte do trabalho em tempo de compilação, que poderiam ser feito em tempo de execução.

Em alguns casos, isso permite que os programadores para minimizar o número de linhas de código para expressar uma solução (reduzindo assim o tempo de desenvolvimento), ou dá programas de maior flexibilidade para lidar eficientemente com situações novas sem recompilação.

Código Ruby pode modificar programaticamente, em tempo de execução, aspectos de sua própria estrutura que seriam fixados em línguas mais rígidas, tais como definições de classe e método. Este tipo de metaprogramação pode ser usado para escrever códigos mais concisos e ampliar eficazmente a linguagem.

Por exemplo, o seguinte código Ruby gera novos métodos para a classe interna String, com base em uma lista de cores. Os métodos envolvem o conteúdo da string com uma tag HTML estilizada com a respectiva cor:

COLORS = { black:   "000",
           red:     "f00",
           green:   "0f0",
           yellow:  "ff0",
           blue:    "00f",
           magenta: "f0f",
           cyan:    "0ff",
           white:   "fff" }
 
class String
  COLORS.each do |color,code|
    define_method "in_#{color}" do
      "<span style=\"color: ##{code}\">#{self}</span>"
    end
  end
end
Os métodos gerados podem então ser usados assim:
"Hello, World!".in_blue
 => "<span style=\"color: #00f\">Hello, World!</span>"
Para implementar o equivalente em outras línguas, o programador teria que escrever cada método (in_black, in_red, in_green, etc) separadamente.
Alguns outros usos possíveis para o Ruby metaprogramação incluem:
  • interceptar e modificar chamadas de método.
  • implementação de novos modelos de herança.
  • gerar dinamicamente as classes a partir de parâmetros.
  • serialização automática de objetos.
  • ajuda interativa e depuração.

Ruby 4 - Classes

Ruby 

 

Classes em Ruby

O código a seguir define uma classe chamada Person. Além de inicializar, o construtor usual cria novos objetos, ele tem dois métodos: 

  1. um para substituir o <=> operador de comparação (assim Array # sort pode classificar por idade)
  2. outro para substituir o método to_s (assim Kernel # puts pode formatar a sua saída).

Aqui, attr_reader é um exemplo de metaprogramação em Ruby: attr_accessor define métodos getter e setter de variáveis ​​de instância, mas attr_reader somente os métodos getter. 

A última declaração avaliada em um método é seu valor de retorno, permitindo a omissão de uma instrução de retorno explícita.

class Person
  attr_reader :name, :age
  def initialize(name, age)
    @name, @age = name, age
  end
  def <=>(person) # the comparison operator for sorting
    age <=> person.age
  end
  def to_s
    "#{name} (#{age})"
  end
end
 
group = [
  Person.new("Bob", 33),
  Person.new("Chris", 16),
  Person.new("Ash", 23)
]
 
puts group.sort.reverse
O código anterior exibe três nomes em ordem reversa de idade:
Bob (33)
Ash (23)
Chris (16)
 Person é uma constante e é uma referência a um objeto class.


Classes abertas


Em Ruby, as classes nunca estão fechadas: métodos podem sempre ser adicionados a uma classe existente. Isso se aplica a todas as classes, incluindo o padrão, classes internas.

Tudo que é necessário fazer é abrir uma definição de classe para uma classe existente e os novos conteúdos especificados serão adicionados aos conteúdos existentes.

Um exemplo simples de adicionar um novo método à classe Time da biblioteca padrão:

# re-open Ruby's Time class
class Time
  def yesterday
    self - 86400
  end
end
 
today = Time.now                            # => 2013-09-03 16:09:37 +0300
yesterday = today.yesterday                 # => 2013-09-02 16:09:37 +0300

Adicionando métodos a classes previamente definidas é freqüentemente chamado de monkey-patching (uma maneira de estender ou modificar o código em tempo de execução de linguagens dinâmicas, sem alterar o código fonte original). No entanto, se realizada de forma imprudente, essa prática pode levar a colisões de comportamento e resultados inesperados subsequentes e problemas com escalabilidade código.

Tratamento de Exceções


Uma exceção pode ser tratada com uma chamada raise:

raise
Uma mensagem opcional pode ser adicionada a exceção:
raise "This is a message"
Exceções pode também ser especificadas pelo programador:
raise ArgumentError, "Illegal arguments!"
Como alternativa, uma instância de exceção pode se passada ao método raise:
raise ArgumentError.new("Illegal arguments!")
Esta última estrutura é útil quando uma classe de exceção personalizada com um construtor que toma mais que um argumento precisa ser gerada:
class ParseError < Exception
  def initialize input, line, pos
    super "Could not parse '#{input}' at line #{line}, position #{pos}"
  end
end
 
raise ParseError.new("Foo", 3, 9)

Exceções poder ser tratadas com a cláusula rescue; esta cláusula pode captar exceções que herdam StandardError. Outra palavras chaves de controle de fluxo que pode ser usadas quando fizer tratamento de exceções são else e ensure : 
begin
  # do something
rescue
  # handle exception
else
  # do this if no exception was raised
ensure
  # do this whether or not an exception was raised
end
 É um erro comum tentar captar todas as exceções com uma simples cláusula rescue. Para captar todas as exceções, deve-se escrever:
begin
  # do something
rescue Exception
  # Exception handling code here.
  # Don't write only "rescue"; that only catches StandardError, a subclass of Exception.
end
Ou captar exceções particulares:
begin
  # do something
rescue RuntimeError
  # handle only RuntimeError and its subclasses
end
Também é possível especificar que o objeto exceção seja disponível para a cláusula de tratamento:
begin
  # do something
rescue RuntimeError => e
  # handling, possibly involving e, such as "puts e.to_s"
end
Alternativamente, a exceção mais recente é armazenada no genérico $. Muitas exceções pode ser também captadas:
begin
  # do something
rescue RuntimeError, Timeout::Error => e
  # handling, possibly involving e
end






Ruby 3

Blocos e iteradores em Ruby


As duas sintaxes para criar um bloco de código:
{ puts "Alô, Mundo!" } # note as chaves
# ou:
do
  puts "Alô, Mundo!"
end
Um bloco de código pode ser passado a um método com um argumento opcional do bloco. Várias métodos internos possuem tais argumentos:
File.open('file.txt', 'w') do |file|       # 'w' denota "modo de escrita"
  file.puts 'Wrote some text.'
end                                  # o arquivo é automaticamente fechado aqui
 
File.readlines('file.txt').each do |line|
  puts line
end
# => Escreveu algum texto.
Passagem de um parâmetro de um bloco com fechamento:
(também fechamento lexical ou fechamento de função) é uma função ou referência a uma função, juntamente com um ambiente de referência. Um fechamento, ao contrário de uma função simples ponteiro permite que uma função possa acessar essas variáveis ​​não-locais, mesmo quando chamado fora de seu escopo lexical imediato.
# In an object instance variable (denoted with '@'), remember a block.
def remember(&a_block)
  @block = a_block
end
 
# Invoke the preceding method, giving it a block which takes a name.
remember {|name| puts "Hello, #{name}!"}
 
# Call the closure:
@block.call("Jon")   # => "Hello, Jon!"
Criado uma função anônima:
proc {|arg| puts arg}
Proc.new {|arg| puts arg}
lambda {|arg| puts arg}
->(arg) {puts arg}         # introduced in Ruby 1.9
Retornando o fechamento de um método:
def create_set_and_get(initial_value=0) # note the default value of 0
  closure_value = initial_value
  return Proc.new {|x| closure_value = x}, Proc.new { closure_value }
end
 
setter, getter = create_set_and_get  # returns two values
setter.call(21)
getter.call      # => 21
 
# Parameter variables can also be used as a binding for the closure,
# so the preceding can be rewritten as:
 
def create_set_and_get(closure_value=0)
  return proc {|x| closure_value = x } , proc { closure_value }
end
Cedendo o fluxo de controle do programa para um bloco que foi fornecido no momento da chamada:
def use_hello
  yield "hello"
end
 
# Invoke the preceding method, passing it a block.
use_hello {|string| puts string}  # => 'hello'
Iterações sobre enumerações e arrays utilizando blocos:
array = [1, 'hi', 3.14]
array.each {|item| puts item }
# prints:
# 1
# 'hi'
# 3.14
 
array.each_index {|index| puts "#{index}: #{array[index]}" }
# prints:
# 0: 1
# 1: 'hi'
# 2: 3.14
 
# The following uses a Range
(3..6).each {|num| puts num }
# prints:
# 3
# 4
# 5
# 6
Um método como inject pode aceitar ambos, um parâmetro e um bloco. Ele faz iteração sobre cada membro da list, executa algumas funções nele enquanto mantem um agregado.
[1,3,5].inject(10) {|sum, element| sum + element}   # => 19
Na primeira passagem, o bloco recebe 10 (o argumento para inject) como soma, e um (o primeiro elemento da array) como element. Isso retorna 11, que torna-se então soma na próxima passagem. Ele é adicionado a 3 para obter 14, que é então adicionada a 5 no terceiro passo, para finalmente voltar 19.
Usando uma enumeração e um bloco ao quadrado os números de 1 a 10 (com um intervalo):
(1..10).collect {|x| x*x}  # => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Ou invoca um método a cada item (map é um sinônimo para collect):

(1..5).map(&:to_f)  # => [1.0, 2.0, 3.0, 4.0, 5.0]





Função anônima (também função constante, função literal ou função lambda) é uma função (ou uma sub-rotina) definida, e possivelmente chamada, sem estar vinculado a um identificador. 

Funções anônimas são convenientes para passar como um argumento para uma função de ordem superior e são onipresentes em línguas com funções de primeira classe. 
É uma forma de função aninhada, na medida em que permitem o acesso a variáveis ​​no escopo da função que contém (variáveis ​​não- locais). Ao contrário das funções aninhadas nomeadas, elas não podem ser recursiva sem a assistência de um operador fixpoint ( também conhecido como um fixpoint anônimo ou recursão anônimo) .

Ruby 2

Ruby



Sintaxe do Ruby


  • A sintaxe de Ruby é muito semelhante ao de Perl e Python. 
  • As definições de classe e método são sinalizadas por palavras-chave. Em contraste com Perl, variáveis ​​não são obrigatoriamente prefixada com um sigil ($, etc). Quando utilizado, o sigil muda a semântica do escopo da variável.
  • Uma diferença de C e Perl é que as palavras-chave são normalmente usados ​​para definir blocos de código lógicas, sem chaves (ou seja , um par de { e } ).
  • Para fins práticos, não há distinção entre as expressões e declarações.
  • As quebras de linha são significativas e tomado como o fim de uma instrução; um ponto e vírgula podem ser usados ​​de forma equivalente.
  • Ao contrário de Python , o recuo não é significativo.
  • Uma das diferenças do Ruby em comparação com Python e Perl é que o Ruby mantém todas as suas variáveis ​​de instância completamente privadas para a classe e só as expõe através de métodos de acesso ( attr_writer, attr_reader , etc.).
  • Ao contrário dos " getter " e " setter " métodos de outras linguagens como C++ ou Java, métodos de acesso em Ruby pode ser criado com uma única linha de código via metaprogramação, no entanto, métodos de acesso também pode ser criada na forma tradicional de C++ e Java.
  • Como invocação desses métodos não requer o uso de parênteses, é trivial para mudar uma variável de instância em uma função cheia, sem modificar uma única linha de código ou ter que fazer qualquer refatoração para alcançar as funcionalidade semelhante aos membros de propriedade do C# e VB.NET. 
  • Descritores de propriedade do Python são semelhantes, mas vêm com uma trade-off(perde-ganha) no processo de desenvolvimento.
  • Se alguém começa em Python usando uma variável de instância exposto publicamente, e mais tarde muda a implementação para usar uma variável de instância privada exposta através de um descritor de propriedade, o código interno para a classe poderá ter de ser ajustado para usar a variável privada ao invés da propriedade pública.
  • Projeto de Ruby obriga todas as variáveis ​​de instância a serem privadas, mas também fornece uma maneira simples de declarar métodos set e get. Isto está de acordo com a ideia de que em Ruby, nunca se acessa diretamente os membros internos de uma classe de fora dela, mas sim, passa uma mensagem para a classe e recebe uma resposta .

Os Diferentes Comportamentos Comparado a Outras Linguagens



  • A sintaxe da linguagem é case sensitive em todos os casos que tratam variáveis ​​maiúsculas como constantes.
  • Nomes de classe e módulos são constantes e se referem a objetos derivados destes.
  • Sigil $ e @ não indicam o tipo de variáveis de dados como em Perl, mas funcionam como operadores de resolução de escopo.
  • Pontos flutuantes literais devem ter dígitos em ambos os lados do ponto decimal: nem .5 nem 2. são  pontos flutuantes literais de válidos, mas  deve ser usado 0.5 e 2.0 (Em Ruby, literais inteiros são objetos que podem ter métodos aplicam-se a eles, de modo que requer um dígito após um ponto decimal para ajudar a esclarecer se 1.e5 deve ser analisado de forma análoga à 1.to_f ou como o formato exponencial flutuante 1.0e5 literal. A razão para a necessidade de um dígito antes do ponto decimal é menos clara, que poderia dizer respeito a invocação de método novo, ou talvez para o .. e ... os operadores , por exemplo, no fragmento de 0,1 ... 3 . )
  • Tipos de dados  booleanos não-booleanos são permitidos em contextos booleanos (ao contrário por exemplo, Java), mas seu mapeamento para valores booleanos difere marcadamente de alguns outras linguagem: 0 e "vazio" (por exemplo, lista vazia , string ou array associativo ), todos avaliados como verdade, alterando assim o significado de algumas expressões idiomáticas comuns em línguas relacionadas ou similares, tais como Lisp , Perl e Python.
  • Uma consequência desta regra é que os métodos de Ruby por convenção - por exemplo, de buscas por expressão regular - retorna números, strings, listas ou outros valores não- falsos em caso de sucesso, mas nil em caso de falha.
  • A indicação da notação até a expressão não executar a instrução se a expressão já é verdade. ( O comportamento é como Perl, mas ao contrário de declarações equivalentes de outras línguas, por exemplo, fazer declaração { } while ( (expressão) ); 
  • Devido ser as constantes referências a objetos, mudar a referência de uma constante gera um aviso, mas alterar o objeto em si não gera. Por exemplo, Saudação << " mundo! " se saudação == " Olá " não gera um erro ou aviso.
  • Isto é semelhante às variáveis ​​finais em Java ou a um ponteiro constante para um objeto não-constante em C++, mas o Ruby fornece a funcionalidade para "congelar" um objeto, ao contrário de Java.
  • Os operadores usuais de expressões condicionais, and e or, não seguem as regras normais de precedência: and não tem liga mais firme do que or. Rubi também tem operadores de expressão ||&& que funcionam como o esperado.

Interação


A distribuição oficial Rubi inclui um intérprete de linha de comando interativa, irb que pode ser usado para testar rapidamente o código. O seguinte fragmento de código representa uma sessão de amostra usando irb:

$ irb
irb(main):001:0> puts "Hello, World"
Hello, World
 => nil
irb(main):002:0> 1+2
 => 3 


Ruby Interative Shell (irb) é a interação da linguagem de script objeto orientado Ruby.

O IRB sigla vem do fato de que a extensão do arquivo para Ruby é ". Rb".
O programa é iniciado a partir de uma linha de comando e permite a execução de comandos de Ruby com resposta imediata, executado em tempo real.
Possui histórico de comandos, capacidades de edição de linha e controle de trabalho, e é capaz de se comunicar diretamente como um script shell através da Internet e interagir com um servidor ao vivo. 
Sintaxe de uso do programa:
irb [ options ] [ programfile ] [ argument... ]
Exemplo de sintaxe:
irb(main):001:0> n = 5
=> 5
irb(main):002:0> def fact(n)
irb(main):003:1>   if n <= 1
irb(main):004:2>     1
irb(main):005:2>   else
irb(main):006:2*     n * fact(n - 1)
irb(main):007:2>   end
irb(main):008:1> end
=> nil
irb(main):009:0> fact(n)
=> 120

Exemplos

Estes exemplos podem ser executados em um Ruby shell como irb, ou salvo em um arquivo e executado em uma linha de comando digitando ruby<filename>. Clássico Hello world : 
puts "Hello World!"
Código Básico Ruby:
# Everything, including a literal, is an object, so this works:
-199.abs                                             # => 199
"ice is nice".length                                 # => 11
"ruby is cool.".index("u")                           # => 1
"Nice Day Isn't It?".downcase.split("").uniq.sort.join    
                                           # => " '?acdeinsty"
Conversões:
puts "Give me a number"
number = gets.chomp
puts number.to_i
output_number = number.to_i + 1
puts output_number.to_s + ' is a bigger number.'

String

Há várias maneiras de definir strings em Ruby.
As seguintes atribuições são equivalentes e suportam interpolação de variáveis: 
variable interpolation (também a substituição de variáveis ​​ou a expansão de variáveis​​) é o processo de avaliação de uma expressão ou string literal contendo uma ou mais variáveis​​, gerando um resultado em que as variáveis ​​são substituídas por seus valores correspondentes na memória. É uma instância especializada de concatenação.
a = "\nThis is a double-quoted string\n"
a = %Q{\nThis is a double-quoted string\n}
a = %{\nThis is a double-quoted string\n}
a = %/\nThis is a double-quoted string\n/
a = <<-BLOCK
 
This is a double-quoted string
BLOCK
Raw strings (strings brutas) - Algumas linguagens fornecem um método de especificar que um literal é para ser processado sem qualquer interpretação específica da linguagem. Isto evita a necessidade de escape, e produz strings mais legíveis.
Strings brutas são particularmente úteis quando um caractere comum precisa usar escape, especialmente em expressões regulares, onde barra invertida \ é amplamente utilizado, e em caminhos de DOS/Windows, onde barra invertida é usada como separador de caminho. 
A profusão do invertidas é conhecida como síndrome de inclinar-se palito, e pode ser reduzido pelo uso de strings brutas. Compare escapes e caminho bruto:
 "The Windows path is C:\\Foo\\Bar\\Baz\\"
 r"The Windows path is C:\Foo\Bar\Baz\"
Os seguintes atributos são equivalentes e produz raw strings:
a = 'This is a single-quoted string'
a = %q{This is a single-quoted string}

Collections

Construindo e usando um array:
a = [1, 'hi', 3.14, 1, 2, [4, 5]]
 
a[2]                    # => 3.14
a.[](2)                 # => 3.14
a.reverse               # => [[4, 5], 2, 1, 3.14, 'hi', 1]
a.flatten.uniq          # => [1, 'hi', 3.14, 2, 4, 5]
Construindo e usando um  associative array (em Ruby, chamado de hash):
Array associativa, mapa, tabela de símbolos, ou dicionário é um tipo abstrato de dados composto por uma coleção de (chave, valor) pares, de modo que cada chave possível aparecer no máximo uma vez na coleção.
hash = Hash.new     # equivalent to hash = {}

# makes the previous line redundant as we are now
hash = { :water => 'wet', :fire => 'hot' }

# assigning hash to a new, separate hash object
puts hash[:fire] # prints "hot"
 
# or: hash.each do |key, value|
hash.each_pair do |key, value| puts "#{key} is #{value}" end # returns {:water=>"wet", :fire=>"hot"} and prints: # water is wet # fire is hot  
# deletes the pair :water => 'wet' and returns "wet"
hash.delete :water  

# deletes the pair :fire => 'hot' and returns {}
hash.delete_if {|key,value| value == 'hot'}