spam real?

25 11 2009

Você abre a sua caixa de mensagens, e lá está aquela mensagem dizendo: “Emagreça 10 kilos em uma semana”, ou “Tire agora o seu nome do serasa”. Seja qual for o fornecedor do seu email, um endereço novo ou antigo, sempre vai ter um spam na sua caixa de entrada.

Com o tempo, eles foram ficando mais elaborados. Agora não são mais enviados por qualquer adolescente que tenta passar um vírus por email para um usuário desavisado. Spams agora focam no conteúdo. Coisas do seu cotidiano vem escritas nas mensagens. Mas, como eles tiveram acesso a essa informação? Quem passou meu email?

Com a quantidade de serviços disponíveis na internet, qualquer cidadão que acessa a rede passa a ser monitorado. Pare agora e veja quantas abas do seu navegador estão abertas, e quantas delas são da mesma empresa? O monopólio dessa informação pessoal é controlada por uma única empresa. Location-Based Services é o termo usado por serviços focados em localização. Poucas pessoas usam ele atualmente, mas a previsão é que em 2012 sejam mais de 1 trilhão de dispositivos conectados ao LBS.

Revolução na maneira de se locomover, encontrar lojas, amigos e serviços físicos, tudo pelo celular. E de ser encontrado também. Agora supondo que essa empresa que detêm a maior parte das suas informações pessoais, adote também esse serviço. Ela sabe onde você esta e o que você procura. Tudo isso em tempo real.

Quanto surpreendente seria se você entrasse em um pub, ao invés de receber o menu do garçom, já recebesse um chopp escuro sem colarinho, da maneira que você gosta. Muito agradável, de fato. Mas basta estender esse pensamento para notar que as informações gravadas hoje, poderão ser facilmente utilizadas a favor de terceiros. Contratos garantem que, ao apagar sua conta na maioria dessas empresas, seus dados são apagados juntos. Mas até que ponto isso é verdade? E qual será esse impacto? A única certeza é das oportunidades de negócios que se abrem com o LBS.





Dica: ignore o hup (hang up) com o nohup

8 11 2009

A utilização de linha de comando no linux é algo tão comum como o ofertório na missa da igreja católica. Todo mundo usa, e cada um tem seu motivo. O problema, é que as vezes o processo que a gente inicializa demora (ou custa) tempo de mais e você é obrigado a esperar, seja o resultado da computação, ou um arquivo baixado do torrent. Não importa. Quando você habilita um job dessa maneira (via linha de comando), geralmente você deve manter a seção, ou a conexão (ssh, ftp, etc), aberta para não matar o dito cujo. Eis o nosso ponto.

Nem sempre é possível manter esse fluxo aberto. As vezes você mesmo nem quer mante-lo. Deixar o pc de casa ligado por 2 semanas só pra ver se vai aparecer alguma entrada incorreta no programa não é das melhores soluções. Se você fechar a conexão, todos os processos ligados aos seu usuário vão embora junto (estejam eles em foreground ou background). Óbvio! Isso é feito pelo sinal de hang up, emitido pelo próprio sistema operacional.

Uma maneira de ‘driblar’ o hang up, é com a utilização do programa nohup, que provavelmente já deve estar instalado na distribuição linux que você esteja usando. Geralmente, se usa o nohup para rodar processos em background, estilo um daemon. A saída, que normalmente é impressa no terminal, vai para um arquivo chamado nohup.out, isto é, caso você ainda não tenha redirecionado o fluxo.

Supomos que você criou um arquivo de build pro ant. Você executaria da seguinte forma:
$ nohup ant run &

Depois é só fechar a conexão e abrir novamente, checar os processos e confirmar que o seu ainda continua em execução. Ufa!

Até a próxima.

Gustavo H. L. Pinto





Easyrelease: simplifique a distribuição de versões

26 09 2009

A alguns dias atrás, eu já estava meio cansado de ficar distribuindo versões do projeto a cada atualização.

O processo é mais ou menos o seguinte: Desenvolvo, mando pro controle de versão, atualizo nos servidores. Essa parte de mandar pro servidor, nada mais é de copiar daqui, e colar ali. O problema é que são 3 máquinas servidoras, o que torna a tarefa ainda mais chata. Agora é só fazer umas contas. Digamos que eu faço 5 commits por dia, em uma semana somam 20, multiplicado pelas 3 máquinas, da mais ou menos 60 cópias de arquivo. Sem contar com as outras pessoas que trabalham no projeto. Bacana,heim?

O easyrelease nasceu por essa necessidade e eu gostaria de compartilhar esse programinha com vocês, já que agora não tem mais aquela parte chata do trabalho :)

O easyrelease está escrito em Python e conta com somente dois arquivos: o easyrelease.py e e o easyrelease.conf. Ambos podem ser baixados aqui. No primeiro fica o código, e no segundo as informações sobre o arquivo e os destinatários. A baixo um exemplo de configuração:

EnderecoExecutavel /home/gustavo/workspace/tagmoes/dist
NomeExecutavel tagmoes.jar

NumeroHosts 2

HostDestino1 10.1.1.20
UsuarioHost1 gustavo
PastaDestinoHost1 /home/ppginf/gustavo

HostDestino2 gustavopinto.org
UsuarioHost2 gustavo
PastaDestinoHost2 /home/gustavo/tagmoes

Depois de configurado, fica a seu critério a melhor forma de como utilizar, seja fazendo um agendamento de tarefas, integrando com o seu controle de versão, ou usar da mesma maneira que eu uso:

gustavo@zeus:~$ easyrelease.py

Algumas duvidas:

P: Posso armazenar a senha no arquivo de configuração?:

R: Não, por questões de segurança, a senha é sempre requisitada no momento da cópia.

P: Tenho uma máquina só aceita ftp, posso usar ele também?

R: Inicialmente não. O ftp é um protocolo que transmite os arquivos, e a senha, de forma desencriptada. Algumas técnicas para aumentar a segurança do ftp foram criadas, como a utilização a partir de um túnel de ssh. Mas como o ssh já está sendo usado, não acredito que faça sentido esse tipo de abordagem.

Até a próxima.

Gustavo H. L. Pinto





Construtor privado: Porque você existe?

24 09 2009

A alguns dias, em uma lista de discussão que eu assino, foi levantada uma questão sobre o porque da utilização de um construtor privado, que no fim, se tornou um papo bastante enriquecedor, que eu gostaria de compartilhar com vocês a partir de agora.

Bom, o primeiro grande motivo, pelo menos o mais conhecido, para utilização de um construtor privado é para utilização do padrão de projetos singleton. Para quem não conhece o singleton, ele garante a existência de uma, e somente uma, instância de uma classe, mantendo um ponto global de acesso a esse objeto.

Em outras palavras, digamos que você está codificando o jogo do livro ‘Senhor dos Anéis’ que, em resumo, a história toda se passa na tentativa de evitar que esse anel, que tem poderes mirabolantes, caia nas mãos erradas. Como na narrativa existe um, e apenas um, anel do poder, o que aconteceria se no meio do seu jogo aparecesse outra instancia da classe AnelDoPoder? Por essas e outras o padrão singleton é facilmente adotado.

Bem, mas como o modificador de acesso para construtores deve ter sido desenvolvido muito antes do padrão singleton ser elaborado, para outro fim ele servir! E, colocando em míudos tudo o que foi discutido e explanado na lista, os pontos mais interessantes da utilização de um construtor privado são enumerados a seguir:

  1. Controlar o número de instâncias de uma classe. Digamos que na sua aplicação, você queria que apenas x instâncias estejam disponíveis na memória. Isso é válido quando queremos, por exemplo, controlar o acesso ao banco de dados. Dessa maneira, não afogamos o banco com mais conexões que ele suporta, mas também não desperdiçamos todo o recurso com apenas um único acesso. Mas, como foi discutido na lista, essa não é a maneira mais elegante, pois esse trabalho poderia (e deveria) ser feito através de uma classe externa, uma Factory por exemplo.
  2. Evitar que um construtor seja usado por fora da classe, mas em compensação, seja usado dentro da classe. É meio óbvio, mas esse caso é pouco utilizado. Ocorre quando se deseja que somente a própria classe faça a manipulação desse objeto.
  3. Em classes utilitárias. Geralmente essas classes são criadas para auxiliar nas tarefas mais corriqueiras, e mormalmente possuem 100% de seus métodos estáticos. Instanciar pra que?
  4. Classes que contem somente constantes. Em Java é bastante comum ter uma única classe que centralize todas as variáveis globais do projeto, essas sempre definidas como static final. Nesse caso, não há nenhuma razão para criar esse objeto, dentro ou fora da classe.

E você, conhece outro uso para construtores privados?

Até a próxima.

Gustavo H. L. Pinto





Coding Dojo

24 09 2009

Levando em consideração o post de TDD do Gustavo, venho a dizer que esta prática para programadores não adaptados com esse paradigma de desenvolvimento, sentem bastante dificuldade em seus primeiros projetos. Devido a este cenário apresento-lhes o conding dojo, que é uma espécie de treinamento para programadores, cujo seus valores foram absorvidos das artes marciais japonesas, onde o treinamento leva a perfeição, o espírito competitivo e individualista dar lugar ao espírito colaborativo entre outras coisas que o Ohashi pode falar melhor já que ele é mais japa que eu.

O coding dojo possui algumas regras que são:

  • Desenvolvimento guiado por testes: Consiste em primeiro a luz vermelha depois a luz verde, ou seja, primeiro devemos construir o teste, neste ponto todos podem dar palpite, após rodar o teste e a luz ficar vermelha, somente os programadores da vez podem falar e construir o código para passar no teste e a luz ficar verde.
  • “Passos de bebê”: Não importam quantas POGs tenha o código, importa que ele passe no teste, depois de se obter a luz verde é que vamos refatorar o código.
  • Pair programming: A programação é feita em dupla, constituída de um pilo e com co-piloto. Ambos pensam em como passar no teste, mas somente o piloto digita. Cada par tem em média de 5 a 10 minutos no seu turno. Quando o tempo acaba acontece o rodízio:
    • O piloto volta para a platéia
    • O co-piloto assume o lugar do piloto
    • Um novo co-piloto vem da platéia
  • Todos devem entender: O piloto e o co-piloto sempre devem explicar o que estão tentando fazer para solucionar o problema, sendo livre para a platéia perguntar se não estiver entendendo.
  • Ciclo de vida: O coding dojo sempre está em algum dos três estados dependendo do estado dos testes:
    • Vermelho: Se pelo menos um dos testes não estiver passando. Nesta etapa a platéia não pode falar e nem perguntar nada.
    • Verde: Se e somente se todos os testes estiverem passando.  Nesta etapa a platéia pode dar sugestões para refatorar o código.
    • Cinza: Quando o código estiver sendo refatorado antes de rodar os testes novamente. Nesta etapa a platéia pode perguntar, mas não pode dar sugestões.

Agora é só marcar o dia para praticar e se divertir bastante, eu pessoalmente depois que me acostumei com o TDD me divirto muito mais programando em busca da luz verde. Outro ponto positivo além da diversão, é que o dojo permite que a gente aprenda outras linguagens de programação de forma colaborativa, tirando do programador o espírito individualista.

- Renato Hidaka





TDD: Desenvolvimento guiado por teste

23 09 2009

Desenvolver, Testar, Implantar.

No geral, esse é o início da rotina de desenvolvimento da maioria dos projetos de software que não trabalham com alguma metodologia, seja ela ágil, ou baseada nas burocracias da engenharia de software. Eu digo início, pois após a fase de implantação, fases como ’socorrer bugs imprevistos’, ou ‘não sei o que pode estar acontecendo’ se tornam também presente no desenvolvimento, e o que era pra se tornar um ciclo, acaba se tornando uma curva exponêncial que tende ao infinito.

Esse problema é tão grave, que uma estimativa feita pelo Departamento de Comércio dos EUA em 2002, afirma que falhas de software causam em torno de 60 bilhões de dólares em prejuizo, por ano, para e economia Estadounidense. Não que eu esteja sensibilizado pelo problema que os nossos colegas da parte de cima do hemisfério estão passando. Mas é simples perceber que esse é um problema que também afeta o nosso mercado, pois (1) somos de um país que ainda importa muito quando se fala de software, não somente como produto final, mas também como tecnologias de meio (frameworks, ambientes computacionais e dentre vários outros), e (2) pelo descaso que é dado à etapa de testes. Como agravante, calcula-se que atualmente cerca de 50% dos defeitos são encontrados nas fases finais do projeto, ou após os sistemas começarem a ser usados em produção. O que nos leva a duas grandes perguntas:

  • É possível identificar e remover defeitos de software mais cedo e de uma maneira mais eficaz?
  • Defeitos são imprevisíveis?

Segundo Myers, a atividade de teste é um elemento crítico para garantia de qualidade do software e pode consumir até 40% do esforço no desenvolvimento desse produto. Nesse caso, não está sendo estimado o esforço gasto pela re-implementação de funcionalidades que foram entregues mas que não estavam de acordo com a especificação. Nesse momento, abro aspas para o apelo do nosso amigo Martin Fowler: “Sempre que estiver tentado a escrever um print(), ou uma expressão de depuração, escreva um teste.”

Junto com o manifesto ágil várias foram as abordagens desenvolvidas na tentativa de agregar maior valor ao processo de desenvolvimento, gerando assim, um produto final com mais qualidade. Dentre essas abordagens, o Test-Driven Development (TDD) vem ganhando bastante notoriedade nos últimos anos. E o porque é simples. Essa técnica, como diversas outras, é baseada em pequenas implementações por ciclo, onde a resolução incial do problema deve começar com uma pergunta, formalizada em teste escrito. Aquele mesmo que antes era deixado para o final do projeto.

Em resumo, o TDD é uma prática que foi elaborada no XP, mas que tem sido adotada rapidamente adotada em várias outras metodologias ágeis. Contudo, o TDD não se trata sobre como testar seu software, mas sim, sobre a elaboração do seu projeto orientado aos testes. Esse ponto é muito importante de se compreender, pois muito tem-se visto que TDD é uma maneira de como testar o software. Errado!

Em poucas palavras o TDD é simplesmente você escrever o código de teste antes de codificar o requisito do programa. A princípio isso pode parecer estranho, mas diversas são as vantagens com a utilização dessa metodologia, como por exemplo:

  • Mantém os programadores centrados no que exatamente eles precisam fazer;
  • Eliminação dos defeitos mais cedo;
  • Refatorações mais seguras: Após uma refatoração, como os testes já estão escritos, será muito mais facil apontar se aquela alteração na funcionalidade apresentou alguma mudança no comportamento da aplicação;
  • Os testes, quando bem escritos, são mais simples de se entender do que o próprio código. Dessa maneira, os testes podem servir como documentação para os próprios programadores.

Para tal, o TDD é baseado em três leis básicas:

  • Não escreva código de negócios, antes de escrever um teste que falhe
  • Escreva somente o suficiente no teste para demonstrar uma falha.
  • Escreva somente o suficiente no código para passar no teste.

Note que é frizado o quanto de código que você deve escrever. Essa prática deve ser seguida a risca e seus benefícios vão muito além do que somente a redução de linhas de código, mas também a eliminação da duplicidade, redundância, métodos centralizadores longos, etc.

Voltando ao íncio do texto, o ciclo tradicional que geralmente é assim:

tradicional
se tornou assim:

novo

Veja que após a implementação do código, a refatoração é necessária sempre. O principal ganho do leitor até esse momento, é entender as principais características do TDD, e abrir o coração e adotar a metodologia :)

O Próximo passo será aplicar toda essa teoria na prática. Será apresentado um estudo de caso incial, que vai demonstrar como é possível se trabalhar com TDD nos seus projetos. Nesse exemplo, será utilizada a linguagem Python, que por padrão, já possui imbutido uma suite de testes (unittest). Diversos são os tipos de testes que podem ser aplicados, mas nesse contexto, será trabalhado os testes de unidade. Para quem ainda não está familiarizado com a linguagem, indico este livro como uma breve introdução.

Imagine que você está de volta aos seus primeiros passos na programação. Provavelmente, um dos primeiros exercícios que foram codificados por você foi a aquela nossa velha e boa calculadora com as operações aritiméticas básicas. Como o domínio do nosso problema não é muito extenso, em poucos testes você já dar ínicio a todo o processo.

O primeiro passo, é pensar na solução do problema. Esse é simples, implementar alguns métodos que façam a soma, subtração, divisão, etc. Como foi visto, o desenvolvimento começa sempre pelo teste, então vamos lá:

1° Passo: Crie sua classe de teste (testCalc.py)
import unittest
from Calc import Calc

class TestCalc(unittest.TestCase):
def testSoma(self):
calc = Calc()
resultado = calc.soma(5, 10)
self.assertEqual(15, resultado)

if  name == ” main ”:
unittest.main()

Nesse momento, para quem não tem muita conhecimento na linguagem, pode ter uma certa dificuldade, se você souber pode passar direto para o 2° Passo. Em bom português, as duas primeiras linhas fazem o import do suite de teste, e da classe que será testada, respectivamente. Uma classe chamada TesteCalc é criada, sendo ela filha da classe TestCase (herança). É criado o método testSoma, e dentro dele é instanciado a classe Calc e é chamado o método que vai finalmente realizar a soma soma. Por fim, é comparado o valor esperado com o valor recebido. As linhas finais são responsáveis pela execução do programa.

2° Passo: Veja o teste falhar
Veja o teste falhar
$ python testCalc.py
Traceback (most recent call last):
File ”testCalc.py”, line 2, in <module>
from Calc import Calc
ImportError: No module named Calc

Nesse momento, o programa é executado o resultado nada mais é, do que o esperado, certo? O Código de negócios ainda não foi criado, logo não existe módulo nenhum a ser importado. Prosseguimos criando o código que está faltando.

3° Passo: Crie a classe da calculadora (Calc.py)
class Calc:

def soma(self, x, y):
return x + y

Lembre-se sempre: Crie somente o código suficiente! Continuamos..

4° Passo: Rode seu teste novamente
$ python testCalc.py
.
——————————————————
Ran 1 test in 0.000s
OK

Pronto, o nosso primeiro requisto implementado com sucesso.

5° Passo: Acrescente um novo teste
De agora em diante, eu deixo esse trabalho de dar vida ao ciclo para vocês.

Depois de diversas implementações, vocês devem ter nas mãos um processo como esse:

ciclo

O exemplo descrito aqui utilizou a linguagem Python, mas nada impede que você utilize na linguagem que você trabalha mais usualmente, visto que o TDD está mais para um conceito do que para uma tecnologia. Para quem quiser saber mais, o livro Test Driven: TDD and Acceptance TDD for Java Developers apresenta uma base teórica muito mais profunda, e diversos exemplos utilizando a linguagem Java. Livros com foco em outras linguagens eu ainda não encontrei, mas se alguem souber, sinta-se avontade em divulgar por aqui também.

Abraços, e bons códigos a todos.

Gustavo H. L. Pinto





Project Natal + Peter Molyneux = Imersão inovadora

23 09 2009

Meu nome é Jean Patrick e como primeiro post no amazontic irei reproduzir um e-mail que enviei para um grupo de pesquisa ao qual faço parte, o INARA(Inteligência Artificial Aplicada, www.inara.eti.br) onde falo sobre o Project Milo. Boa leitura.

Pessoal,

uma notícia do mundo gamer, minha especialidade (e vício), na E3 desse ano (feira anual de games norte americana) a Microsoft demostrou um acessório para o XBOX 360 chamado de Natal Project (que por acaso é coordenado por um brasileiro, e que nasceu em Natal) onde possibilitaria os jogos de XBOX reconhecerem movimentos e outros padrões dos jogadores, no momento que vi pensei “ahh querem copiar a Nintendo e o seu controle!”, mas no vídeo de demostração algo chamou a minha atenção, foi uma breve demonstração onde uma mulher mostrava um papel para o acessório e um muleque virtual fazia o movimento como se pegasse o papel e lia o que estava escrito nele!!! No entanto só mostraram esse pedaço do jogo, mostraram outros, mas nenhum tão intrigante, a não ser que jogar jogos de corrida sem controle e apenas fazendo os movimentos do volante no ar seja algo incrível (pf), e isso ficou martelando na minha cuca desde então….

E então, hoje , alguns minutos antes de escrever este eu achei uma entrevista com um dos gênios do mundo dos games, o nome dele é Peter Molyneux, o cara faz jogos desde antes de alguns de nós termos nascido, e digo mais! Os jogos mais recentes dele usa e abusa de IA!! Black & White, Fable, The Movies são alguns jogos dele que utilizam várias técnicas de IA, Black & White principalmente, que com certeza utiliza RNA (em outro e-mail eu falo sobre isso). Voltando ao foco, nessa entrevista ele fala sobre um projeto dele chamado Dimitri Project ou agora rebatizado de Milo, este dito cujo é justamente o jogo que vi um micro pedaço na E3, e galera…. o jogo faz muito mais coisas loucas para nós amantes de IA, o Milo, que é o nome do tal muleque virtual, conversa com o jogador, chama pelo nome, sabe se a pessoa está  triste e tudo mais!!! Leiam a entrevista e vejam o vídeo!!!!

Entrevista
http://www.eurogamer.net/articles/e3-project-natals-molyneux-and-milo-interview

Video
http://www.eurogamer.net/videos/e3-project-natal-milo-demo





Linguagem R

21 09 2009

Neste primeiro post vou descrever uma das tecnologias que mais utilizo atualmente, a linguagem de programação R. Tive o primeiro contato com R em 2005, quando estive em Portugal pela 1ª vez, já na época fiquei impressionado com as facilidades que esta linguagem possui, é interativa (como uma shell), funcional, orientada a objetos (tudo é um objeto), possui uma grande quantidade de funções implementadas (grande parte desenvolvida pela comunidade) e tem uma API gráfica que a destaca  em relação as outras linguagens. R não deve ser comparada com outras linguagens de programação, como Java, Python, C++, …, simplesmente porquê tem finalidades diferentes. A linguagem R deve ser comparada a um nicho mais específico, voltado a analise estatística, analise de dados, inteligência artificial, mineração de dados, etc.. Seria mais prudente comparar com: Weka, SPSS, Matlab e/ou RapidMiner.

A linguagem foi anunciada no artigo “R: A Language for Data Analysis and Graphics” em 1996 dos autores R. Ihaka and R. Gentleman, sendo desde então mantida pela comunidade (R core group e demais contribuidores). Atualmente a linguagem está disponivel para várias plataformas: Windows, Linux, FreeBSD e Mac; e possui uma grande comunidade de grandes projetos que contribuem para o rápido desenvolvimento da linguagem (principalmente através dos pacotes): CRAN, BioConductor, R-forge e Omegahat. Justamente uma das grandes dificuldades do R, é encontrar alguma funcionalidade  especifica, dado que existem uma quantidade muito grande de pacotes desenvolvidos pela comunidade. Algumas vezes acaba-se optando por implementar a funcionalidade, dado que é simples e rápido programar em R.

É possível fazer o download da versão mais atual da linguagem do site http://www.r-project.org/, siga as instruções de instalação de acordo com a sua plataforma. Depois de instalado basta abrir o terminal e digitar R, deve aparecer algo semelhante a figura a baixo.

tradicional

Experimentando algum código:
Digite, x <- 12. Você está criando a variável x e atribuindo o valor 12.

> x <- 12

Se você digitar x e depois Enter, o R vai imprimir o conteúdo da variável.

> x
[1] 12

Digite rnorm(10), a função rnorm retorna um vector com 10 números aleatórios, o R automaticamente imprime este resultado na shell.

>rnorm(10)
[1] 0.5448456 -0.4374159  0.1317178  1.5713699 -0.3652318  0.6482785
[7] 0.1462111 -0.6536810 -1.2742581 -0.389005
7

Se você quiser guardar este resultado para realizar alguma operação em seguida é necessário armazenar em uma variável, como: y <- rnorm(10). O R não vai imprimir nada na shell, e o vector com 10 números aleatórios será armazenado na variável y, para ver o conteúdo digite y. Os valores são diferentes, porque a função foi executada novamente e gerou novos números aleatórios.

> y <- rnorm(10)
> y
[1]  0.8311523 -0.1689783  1.9819967  0.8487052  1.0599116 -0.0932907
[7] -0.4878711  0.3392773 -0.7435711  1.7775609

Para saber mais sobre um objeto ou função do R, como saber mais informações sobre a função rnorm, basta digitar ?rnorm. Na figura a baixo é possível visualizar as informações do help da função, outra maneira de atingir o mesmo objetivo é através da função help, digite help(“rnorm”). Para sair do help da função basta digitar q.

Para finalizar este post vamos mostrar algo característico da linguagem e quem pensa em trabalhar com R, deve se acostumar a trabalhar pensando em objetos vectorizados. Se você digitar a função ls. O R vai listar todos os objetos na sessão, digite ls().

tradicional

> ls()
[1] “x” “y”

Existem duas variáveis x e y. O x possui o número 12 criado ainda a pouco e o y possui 10 valores aleatórios.

> x
[1] 12
> y
[1]  0.8311523 -0.1689783  1.9819967  0.8487052  1.0599116 -0.0932907
[7] -0.4878711  0.3392773 -0.7435711  1.7775609

Se você executar y * x, o R vai multiplicar o conteúdo da variável y pelo conteúdo da variável x. O ponto interessante aqui é como em R tudo é baseado em vector (matrizes) o valor de x é multiplicado por cada um dos valores de y, e o retorno na verdade é um vector com 10 valores, onde cada valor de y foi multiplicado por 12 (valor de x).

> y * x
[1]  9.973828 -2.027740 23.783961 10.184462 12.718940 -1.119488 -5.854453
[8]  4.071328 -8.922853 21.330731

Como em R os objetos são passados por valor, x e y continuam com seus valores inalterados.

> x
[1] 12
> y
[1]  0.8311523 -0.1689783  1.9819967  0.8487052  1.0599116 -0.0932907
[7] -0.4878711  0.3392773 -0.7435711  1.7775609

O mesmo principio se aplica para outras operações y + x, y – x ou y / x

> y + x
[1] 12.83115 11.83102 13.98200 12.84871 13.05991 11.90671 11.51213 12.33928
[9] 11.25643 13.77756
> y – x
[1] -11.16885 -12.16898 -10.01800 -11.15129 -10.94009 -12.09329 -12.48787
[8] -11.66072 -12.74357 -10.22244
> y / x
[1]  0.069262694 -0.014081526  0.165166395  0.070725432  0.088325970
[6] -0.007774225 -0.040655927  0.028273109 -0.061964258  0.148130073

- Orlando Ohashi