diff options
Diffstat (limited to 'pt-br')
24 files changed, 3951 insertions, 150 deletions
| diff --git a/pt-br/amd.html.markdown b/pt-br/amd.html.markdown new file mode 100644 index 00000000..690fc8da --- /dev/null +++ b/pt-br/amd.html.markdown @@ -0,0 +1,218 @@ +--- +category: tool +tool: amd +contributors: +    - ["Frederik Ring", "https://github.com/m90"] +translators: +    - ["Felipe Tarijon", "http://nanoincub.com/"] +lang: ptr-br +filename: learnamd-pt.js +--- + +## Começando com AMD + +A API de Definição de Módulos Assíncrona **Asynchronous Module Definition**  +especifica um mecanismo para definição de módulos em JavaScript para os quais o +módulo e suas dependências podem ser carregados de forma assíncrona. Isso é +particularmente bem adequado para o ambiente do browser onde o carregamento de +módulos de forma síncrona fica sujeito a problemas de performance, usabilidade, +debugging e problemas de acesso em requisições cross-domain. + +### Conceito básico +```javascript +// O básico da API de AMD consiste de nada mais que dois métodos: `define` e `require` +// e isso é tudo sobre a definição de módulo e consumo: +// `define(id?, dependências?, factory)` define um módulo +// `require(dependências, callback)` importa uma série de dependências e +// consome elas no callback passado como parâmetro. + +// Vamos começar usando o define para definir um novo módulo +// que não tem dependências. Nós vamos fazer isso passando um nome +// e uma função factory para definir: +define('awesomeAMD', function(){ +  var isAMDAwesome = function(){ +    return true; +  }; +  // O valor retornado da função de factory do módulo é +  // o que os outros módulos ou chamadas de require irão +  // receber quando requisitarem nosso módulo `awesomeAMD`. +  // O valor exportado pode ser qualquer coisa, (construtor) funções, +  // objetos, primitives, até mesmo undefined (apesar de que não irão ajudar muito). +  return isAMDAwesome; +}); + +// Agora, vamos definir outro módulo que depende do nosso módulo `awesomeAMD`. +// Perceba que existe um argumento adicional definindo nossas dependências do +// módulo agora: +define('loudmouth', ['awesomeAMD'], function(awesomeAMD){ +  // dependências serão passadas como argumentos da factory +  // na ordem que elas forem especificadas +  var tellEveryone = function(){ +    if (awesomeAMD()){ +      alert('Isso é tãaaao loko!'); +    } else { +      alert('Bem estúpido, né não?'); +    } +  }; +  return tellEveryone; +}); + +// Agora que nós sabemos como usar o define, vamos usar o `require` para +// começar nosso programa. A assinatura do `require` é `(arrayDedependências, callback)`. +require(['loudmouth'], function(loudmouth){ +  loudmouth(); +}); + +// Para fazer esse tutorial executável, vamos implementar uma versão muito básica +// (não-assíncrona) de AMD bem aqui nesse lugar: +function define(nome, deps, factory){ +  // perceba como os módulos sem dependências são manipulados +  define[nome] = require(factory ? deps : [], factory || deps); +} + +function require(deps, callback){ +  var args = []; +  // primeiro vamos recuperar todas as dependências necessárias +  // pela chamada requerida +  for (var i = 0; i < deps.length; i++){ +    args[i] = define[deps[i]]; +  } +  // corresponder todas as dependências da função de callback +  return callback.apply(null, args); +} +// você pode ver esse código em ação aqui: http://jsfiddle.net/qap949pd/ +``` + +### Uso na vida real com require.js + +Em contraste com o exemplo introdutório, `require.js` (a biblioteca mais popular de AMD) na verdade implementa o **A** do **AMD**, permitindo que você carregue os módulos e suas +dependências via XHR: + +```javascript +/* file: app/main.js */ +require(['modules/algumaClasse'], function(AlgumaClasse){ +  // o callback é deferido até que a dependencia seja carregada +  var coisa = new AlgumaClasse(); +}); +console.log('Então aqui estamos nós, esperando!'); // isso vai rodar primeiro +``` + +Por convenção, você geralmente guarda um módulo em um arquivo. `require.js` pode resolver nome de módulos baseado no caminho das pastas, então você não precisa nomear os seus módulos, mas sim simplesmente referenciar eles usando sua origem. No exemplo `algumaClasse` é adotado a pasta `modules`, relativa a configuração da sua `baseUrl`: + +* app/ +  * main.js +  * modules/ +    * algumaClasse.js +    * algunsHelpers.js +    * ... +  * daos/ +    * coisas.js +    * ... + +Isso significa que nós podemos definir `algumaClasse` sem especificar o id de um módulo: + +```javascript +/* arquivo: app/modules/algumaClasse.js */ +define(['daos/coisas', 'modules/algunsHelpers'], function(coisasDao, helpers){ +  // definição de módulo, claro, irá acontecer também de forma assíncrona +  function AlgumaClasse(){ +    this.metodo = function(){/**/}; +    // ... +  } +  return AlgumaClasse; +}); +``` +Para alterar o comportamento padrão de mapeamento de caminho de pastas utilize +`requirejs.config(configObj)` em seu `main.js`: + +```javascript +/* arquivo: main.js */ +requirejs.config({ +  baseUrl : 'app', +  paths : { +    // você pode também carregar módulos de outros locais +    jquery : '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min', +    coolLibFromBower : '../bower_components/cool-lib/coollib' +  } +}); +require(['jquery', 'coolLibFromBower', 'modules/algunsHelpers'], function($, coolLib, helpers){ +  // um arquivo `main` precisa chamar o require pelo menos uma vez, +  // caso contrário, o código jamais rodará +  coolLib.facaAlgoDoidoCom(helpers.transform($('#foo'))); +}); +``` +Apps baseados em `require.js` geralmente terão u´m único ponto de acesso (`main.js`) que é passado à tag script do `require.js` como um data-attribute. Ele vai ser automaticamente carregado e executado com o carregamento da página: + +```html +<!DOCTYPE html> +<html> +<head> +  <title>Umas 100 tags de script? Nunca mais!</title> +</head> +<body> +  <script src="require.js" data-main="app/main"></script> +</body> +</html> +``` + +### Otimizando um projeto inteiro utilizando r.js + +Muitas pessoas preferem usar AMD para sanar a organização do código durante o desenvolvimento, mas continuam querendo colocar um único arquivo de script em produção ao invés de realizarem centenas de requisições XHRs no carregamento da página. + +`require.js` vem com um script chamado `r.js` (que você vai provavelmente rodar em node.js, embora Rhino suporte também) que você pode analisar o gráfico de dependências de seu projeto, e fazer em um único arquivo contendo todos os seus módulos (corretamente nomeados), minificados e prontos para serem consumidos. + +Instale-o utilizando `npm`: +```shell +$ npm install requirejs -g +``` + +Agora você pode alimentá-lo com um arquivo de configuração: +```shell +$ r.js -o app.build.js +``` + +Para o nosso exemplo acima a configuração pode ser essa: +```javascript +/* file : app.build.js */ +({ +  name : 'main', // nome do ponto de acesso +  out : 'main-built.js', // nome o arquivo para gravar a saída +  baseUrl : 'app', +  paths : { +    // `empty:` fala para o r.js que isso ainda deve ser baixado da CDN, usando +    // o local especificado no `main.js` +    jquery : 'empty:', +    coolLibFromBower : '../bower_components/cool-lib/coollib' +  } +}) +``` + +Para usar o arquivo gerado, em produção, simplesmente troque o `data-main`: +```html +<script src="require.js" data-main="app/main-built"></script> +``` + +Uma incrível e detalhada visão geral [de build options](https://github.com/jrburke/r.js/blob/master/build/example.build.js) está disponível no repositório do GitHub. + +### Tópicos não abordados nesse tutorial +* [Plugins de carregamento / transforms](http://requirejs.org/docs/plugins.html) +* [CommonJS style carregamento e exportação](http://requirejs.org/docs/commonjs.html) +* [Configuração avançada](http://requirejs.org/docs/api.html#config) +* [Shim configuration (carregando módulos sem AMD)](http://requirejs.org/docs/api.html#config-shim) +* [Carregando e otimizando CSS com require.js](http://requirejs.org/docs/optimization.html#onecss) +* [Usando almond.js para builds](https://github.com/jrburke/almond) + +### Outras leituras: + +* [Especificação oficial](https://github.com/amdjs/amdjs-api/wiki/AMD) +* [Por quê AMD?](http://requirejs.org/docs/whyamd.html) +* [Universal Module Definition](https://github.com/umdjs/umd) + +### Implementações: + +* [require.js](http://requirejs.org) +* [dojo toolkit](http://dojotoolkit.org/documentation/tutorials/1.9/modules/) +* [cujo.js](http://cujojs.com/) +* [curl.js](https://github.com/cujojs/curl) +* [lsjs](https://github.com/zazl/lsjs) +* [mmd](https://github.com/alexlawrence/mmd) diff --git a/pt-br/asymptotic-notation-pt.html.markdown b/pt-br/asymptotic-notation-pt.html.markdown new file mode 100644 index 00000000..2e299d09 --- /dev/null +++ b/pt-br/asymptotic-notation-pt.html.markdown @@ -0,0 +1,159 @@ +--- +category: Algorithms & Data Structures +name: Asymptotic Notation +contributors: +    - ["Jake Prather", "http://github.com/JakeHP"] +translators: +    - ["João Farias", "https://github.com/JoaoGFarias"] +lang: pt-br +--- + +# Notação Assintótica + +## O que é? + +Notação Assintótica é uma linguagem que nos permite analisar o tempo de execução + de um algoritmo através da indentificação de seu comportamento com o + crescimento da entrada oferecida. Isso também é conhecido como taxa de + crescimento do algoritmo. O algoritmo de repente torna-se lento quando o + tamanho da entrada cresce? O algoritmo mantém, em geral, seu tempo de execução + rápido mesmo com aumento da entrada? Notação Assintótica nos dá a habilidade de + responder estas questões. + +## Quais são as alternativas para responder a estas questões? + +Um modo seria contar o número de operações primitivas com diferentes tamanhos de + entrada. Apesar desta ser uma solução válida, o trabalho que ela requer, mesmo para algoritmos simples, não a justifica. + + Outro modo é fisicamente medir a quantidade de tempo que um algoritmo requer + para terminar com diferentes tamanhos de entrada. Entretanto, a precisão e + relatividade (tempo obtido seria relativo apenas à máquina onde ocorreu a +   execução) deste método está limitado a variáveis de ambiente, como hardware, +   poder de processamento, etc. + +## Tipos de Notação Assintótica + +Na primeira seção desse documento, descrevemos como Notação Assintótica identifica o comportamento de um algoritmo + a medida que o tamanho da entrada cresce. Imaginemos um algoritmo como uma função + *f*, *n* como o tamanho da entrada e *f(n)* sendo o tempo de execução. Então, + para dado algoritmo *f*, com entrada de tamanho *n*, você terá tempo de execução + *f(n)*. Isto resulta em um gráfico onde a coordernada Y é o tempo de execução +, a coordernada X representa o tamanho da entrada e os pontos representao o tempo +de execução para dado tamanho de entrada. + +Você pode representar a função, ou o algoritmo, com Notação Assintótica de várias +maneiras. Você pode representar um algoritmo nas formas de Melhor Caso, Pior Caso +ou Caso Médio. +A maneira mais comum de analisar um algoritmo é pelo Pior Caso. Você tipicamente +não avalia o melhor caso, porque essas condições não são atingidas com frequência. +Um bom exemplo disto seria em algoritmos de ordenação; especificamente, na adição +de elementos à árvores. O melhor caso na maioria de algoritmos pode ser de apenas +uma operação. Entretanto, na maioria dos casos, o elemento a ser adicionado terá +que percorrer a árvore de forma apropriada, o que pode causar a analise de um +ramo inteiro. +Este é o pior caso, e isto é o que você está se preparando. + +### Tipos de funções, limites e simplificação + +``` +Função Logarítmica - log n +Função Linear - an + b +Função Quadrática - an^2 + bn + c +Função Polinomial - an^z + . . . + an^2 + a*n^1 + a*n^0, onde *z* é uma constante +Função Exponencial -  a^n, onde a é alguma constante +``` +Estas são as funções básicas de crescimento usadas em várias notações. A lista + começa com a de crescimento mais lento (logarítima, a de execução mais rápida) +e segue para a de crescimento mais rápido (exponencial, de execução mais lenta). +Repare que enquando *n*, a entrada, cresce, cada uma dessas funções cresce mais +rápido que quadrático, polinimial e exponencial, comparadas com logaritma e linear. + +Uma nota extremamente importante para notações é tentar usar os termos mais simples. +Isto significa descartar constantes e termos de ordem mais baixa, pois quando o +tamanho da entrada cresce para o infinito (limites matemáticos), os termos de ordem +mais baixa e constantes tornam-se irrelevantes. Por exemplo, se você tiver uma +constante muito grande, 2^9001, a simplificação não afeterá sua notação. + +Já que queremos as formas mais simples, mudemos nossa tabela um pouco... + +``` +Função Logarítmica - log n +Função Linear - n +Função Quadrática - n^2 +Função Polinomial - n^z, onde *z* é uma constante +Função Exponencial - a^n, onde *a* é uma constante +``` + +### Big-O + +Big-O, também escrita como O, é uma Notação Assintótica para o pior caso. Digamos +*f(n)* seja o tempo de exeução de um algoritmo e *g(n)) um tempo de complexidade +arbritário que você quer relacionar com seu algoritmo. *f(n)* é O(g(n)), se, para +quando constante real c (c > 0), *f(n)* <= *c g(n)* para todo tamanho de entrada +n (n > 0). + + +*Exemplo 1* + +``` +f(n) = 3log n + 100 +g(n) = log n +``` + +`f(n)` é O(g(n))? + +`3 log n + 100` é  O(log n)? + +Vejamos a definição de Big-O: + +``` +3log n + 100 <= c * log n +``` + +Há alguma constante c que satisfaça a definição para todo n? + +``` +3log n + 100 <= 150 * log n, n > 2 (Indefinido em n = 1) +``` + +Sim! A definição de Big-I for atentida, portante `f(n)` é `O(g(n))`. + +*Exemplo 2* + +``` +f(n) = 3*n^2 +g(n) = n +``` + +`f(n)` é O(g(n))? + +`3 * n^2` é O(n)? +Vejamos a definição de Big-O: + +``` +3 * n^2 <= c * n +``` + +Há alguma constante c que satisfaça a definição para todo n? + +Não, não há. `f(n)` não é O(g(n)). + +### Big-Omega +Big-Omega, também escrita como Ω, é uma Notação Assintótica para o melhor caso. + +`f(n)`é Ω(g(n)), se para qualquer constante real c (c > 0), `f(n)` é >= `c g(n)` para todo tamanho de entrada n (n > 0). + +Sinta-se livre para adicionar mais exemplos. Big-O é a notação primária usada para medir complexidade de algoritmos. + +### Notas Finais +É difícil manter esse tipo de tópico curto e você deveria ler os livros e artigos listados abaixo. Eles cobrem muito mais profundamente definições e exemplos. Mais x='Algoritms & Data Structures' virá; teremos um documento sobre analisar código em breve. + +## Livros + +* [Algorithms](http://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X) +* [Algorithm Design](http://www.amazon.com/Algorithm-Design-Foundations-Analysis-Internet/dp/0471383651) + +## Artigos Online + +* [MIT](http://web.mit.edu/16.070/www/lecture/big_o.pdf) +* [KhanAcademy](https://www.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/asymptotic-notation) diff --git a/pt-br/asymptoticnotation-pt.html.markdown b/pt-br/asymptoticnotation-pt.html.markdown new file mode 100644 index 00000000..c5299a11 --- /dev/null +++ b/pt-br/asymptoticnotation-pt.html.markdown @@ -0,0 +1,161 @@ +--- +category: Algorithms & Data Structures +name: Asymptotic Notation +contributors: +    - ["Jake Prather", "http://github.com/JakeHP"] +translators:  +    - ["Carolina Knoll", "http://github.com/carolinaknoll"] +lang: pt-br +--- + +# Aprenda X em Y minutos +## Onde X=Notação Assintótica + +# Notações Assintóticas +## O que são? + +Notações assintóticas são notações matemáticas que nos permitem analisar tempo de execução   +de um algoritmo, identificando o seu comportamento de acordo como o tamanho de entrada para   +o algoritmo aumenta. Também é conhecido como taxa de "crescimento" de um algoritmo. O algoritmo   +simplesmente se torna incrivelmente lento conforme o seu tamanho aumenta? Será que pode-se na   +maior parte manter o seu tempo de execução rápido mesmo quando o tamanho de entrada aumenta?   +A notação assintótica nos dá a capacidade de responder a essas perguntas.  + +## Além desta, existem outras alternativas para responder a essas perguntas? + +Uma forma seria a de contar o número de operações primitivas em diferentes tamanhos de entrada.  +Embora esta seja uma solução válida, a quantidade de trabalho necessário, mesmo para algoritmos  +simples, não justifica a sua utilização. + +Outra maneira é a de medir fisicamente a quantidade de tempo que leva para se executar um algoritmo  +de diferentes tamanhos. No entanto, a precisão e a relatividade (já que tempos obtidos só teriam  +relação à máquina em que eles foram testados) deste método estão ligadas a variáveis ambientais,  +tais como especificações de hardware, poder de processamento, etc. + +## Tipos de Notação Assintótica + +Na primeira seção deste documento nós descrevemos como uma notação assintótica identifica o comportamento   +de um algoritmo como as alterações de tamanho de entrada (input). Imaginemos um algoritmo como uma função   +f, n como o tamanho da entrada, e f (n) sendo o tempo de execução. Assim, para um determinado algoritmo f,   +com tamanho de entrada n você obtenha algum tempo de execução resultante f (n). Isto resulta num gráfico,   +em que o eixo Y representa o tempo de execução, o eixo X é o tamanho da entrada, e os pontos marcados são   +os resultantes da quantidade de tempo para um dado tamanho de entrada. + +Pode-se rotular uma função ou algoritmo com uma notação assintótica de diversas maneiras diferentes.   +Dentre seus exemplos, está descrever um algoritmo pelo seu melhor caso, pior caso, ou caso equivalente.   +O mais comum é o de analisar um algoritmo pelo seu pior caso. Isso porque você normalmente não avaliaria   +pelo melhor caso, já que essas condições não são as que você está planejando. Um bom exemplo disto é o de   +algoritmos de ordenação; especificamente, a adição de elementos a uma estrutura de tipo árvore. O melhor   +caso para a maioria dos algoritmos pode ser tão simples como uma única operação. No entanto, na maioria    +dos casos, o elemento que você está adicionando terá de ser ordenado de forma adequada através da árvore,   +o que poderia significar a análise de um ramo inteiro. Este é o pior caso, e é por ele que precisamos seguir.   + +### Tipos de funções, limites, e simplificação + +``` +Função Logaritmica - log n   +Função Linear - an + b   +Função Quadrática - an^2 + bn + c   +Função Polinomial - an^z + . . . + an^2 + a*n^1 + a*n^0, onde z é uma constante   +Função Exponencial - a^n, onde a é uma constante   +``` + +Estas são algumas classificações básicas de crescimento de função usados em várias notações. A lista   +começa com a função crescimento mais lento (logarítmica, com tempo de execução mais rápido) e vai até   +a mais rápida (exponencial, com tempo de execução mais lento). Observe que 'n', ou nossa entrada,   +cresce em cada uma dessas funções, e o resultado claramente aumenta muito mais rapidamente em função   +quadrática, polinomial e exponencial, em comparação com a logarítmica e a linear. + +Uma observação de boa importância é que, para as notações a serem discutidas, deve-se fazer o melhor   +para utilizar termos mais simples. Isto significa desrespeitar constantes, e simplificar termos de   +ordem, porque, como o tamanho da entrada (ou n no nosso f (n) exemplo) aumenta infinitamente (limites   +matemáticos), os termos em ordens mais baixas e constantes são de pouca ou nenhuma importância. Dito   +isto, se você possui constantes com valor 2^9001, ou alguma outra quantidade ridícula, inimaginável,   +perceberá que a simplificação distorcerá a precisão de sua notação. + +Já que nós queremos a forma mais simples, vamos modificar nossas funções um pouco. + +``` +Logaritmica - log n   +Linear - n   +Quadrática - n^2   +Polinomial - n^z, onde z é uma constante   +Exponencial - a^n, onde a é uma constante +``` + +### O Grande-O + +Grande-O, geralmente escrita como O, é uma Notação Assintótica para o pior caso para uma dada função. Digamos   +que `f(n)` é o tempo de execução de seu algoritmo, e `g(n)` é uma complexidade de tempo arbitrário que você está   +tentando se relacionar com o seu algoritmo. `f(n)` será O(g(n)), se, por qualquer constante real c (c > 0),   +`f(n)` <= `c g(n)` para cada tamanho de entrada n (n > 0).   + +*Exemplo 1* + +``` +f(n) = 3log n + 100   +g(n) = log n +``` + +É `f(n)` um O(g(n))?   +É 3 `log n + 100` igual a O(log n)?   +Vamos checar na definição de Grande-O.   + +``` +3log n + 100 <= c * log n +``` + +Existe alguma constante c que satisfaça isso para todo n? + +``` +3log n + 100 <= 150 * log n, n > 2 (indefinido em n = 1) +``` + +Sim! A definição de Grande-O foi satisfeita. Sendo assim, `f(n)` é O(g(n)). + +*Exemplo 2* + +``` +f(n) = 3 * n^2 +g(n) = n +``` + +É `f(n)` um O(g(n))?  +É `3 * n^2` um O(n)?  +Vamos ver na definição de Grande-O. + +``` +3 * n^2 <= c * n +``` + +Existe alguma constante que satisfaça isso para todo n?  +Não, não existe. `f(n)` NÃO É O(g(n)). + +### Grande-Omega + +Grande-Omega, comumente escrito como Ω, é uma Notação Assintótica para o melhor caso, ou   +uma taxa de crescimento padrão para uma determinada função. + +`f(n)` é Ω(g(n)), se, por qualquer constante c real (c > 0), `f(n)` é >= `c g(n)` para cada   +tamanho de entrada n (n > 0). + +Sinta-se livre para pesquisar recursos adicionais e obter mais exemplos sobre este assunto!   +Grande-O é a notação primária utilizada para tempo de execução de algoritmos, de modo geral.   + +### Notas de Finalização + +É complicado exibir este tipo de assunto de forma tão curta, então é definitivamente recomendado   +pesquisar além dos livros e recursos on-line listados. Eles serão capazes de analisar o assunto com   +uma profundidade muito maior, além de ter definições e exemplos. Mais sobre onde X="Algoritmos e   +Estruturas de Dados" está a caminho: Haverá conteúdo focado na análise de exemplos de códigos reais   +em breve.  + +## Livros + +* [Algorithms] (http://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X)   +* [Algorithm Design] (http://www.amazon.com/Algorithm-Design-Foundations-Analysis-Internet/dp/0471383651) + +## Recursos Online + +* [MIT] (http://web.mit.edu/16.070/www/lecture/big_o.pdf)   +* [KhanAcademy] (https://www.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/asymptotic-notation) diff --git a/pt-br/bash-pt.html.markdown b/pt-br/bash-pt.html.markdown new file mode 100644 index 00000000..ae18435a --- /dev/null +++ b/pt-br/bash-pt.html.markdown @@ -0,0 +1,282 @@ +--- +category: tool +tool: bash +contributors: +    - ["Max Yankov", "https://github.com/golergka"] +    - ["Darren Lin", "https://github.com/CogBear"] +    - ["Alexandre Medeiros", "http://alemedeiros.sdf.org"] +    - ["Denis Arh", "https://github.com/darh"] +    - ["akirahirose", "https://twitter.com/akirahirose"] +    - ["Anton Strömkvist", "http://lutic.org/"] +translators: +    - ["Davidson Mizael", "https://github.com/davidsonmizael"] +filename: LearnBash-pt_br.sh +lang: pt-br +--- + +Tutorial de shell em português + +Bash é o nome do shell do Unix, que também é distribuido como shell do sistema  +operacional GNU e como shell padrão para Linux e Mac OS X. Praticamente todos  +os exemplos abaixo podem fazer parte de um shell script e pode ser executados +diretamente no shell. + +[Leia mais sobre](http://www.gnu.org/software/bash/manual/bashref.html) + +```bash +#!/bin/bash +# A primeira linha do script é o shebang, que conta para o sistema como executar +# o script: http://en.wikipedia.org/wiki/Shebang_(Unix) +# Como você já deve ter percebido, comentários começam com #.  +# Shebang também é um comentário. + +# Exemplo simples de hello world: +echo Hello World! + +# Cada comando começa com uma nova linha, ou após um ponto virgula: +echo 'Essa é a primeira linha'; echo 'Essa é a segunda linha' + +# A declaração de variáveis é mais ou menos assim +Variavel="Alguma string" + +# Mas não assim: +Variavel = "Alguma string" +# Bash interpretará Variavel como um comando e tentará executar e lhe retornar +# um erro porque o comando não pode ser encontrado. + +# Ou assim: +Variavel= 'Alguma string' +# Bash interpretará 'Alguma string' como um comando e tentará executar e lhe retornar +# um erro porque o comando não pode ser encontrado. (Nesse caso a a parte 'Variavel='  +# é vista com uma declaração de variável valida apenas para o escopo do comando 'Uma string'). + +# Usando a variável: +echo $Variavel +echo "$Variavel" +echo '$Variavel' +# Quando você usa a variável em si — declarando valor, exportando, etc — você escreve +# seu nome sem o $. Se você quer usar o valor da variável você deve usar o $. +# Note que ' (aspas simples) não expandirão as variáveis! + +# Substituição de strings em variáveis +echo ${Variavel/Alguma/Uma} +# Isso substituirá a primeira ocorrência de "Alguma" por "Uma" + +# Substring de uma variável +Tamanho=7 +echo ${Variavel:0:Tamanho} +# Isso retornará apenas os 7 primeiros caractéres da variável + +# Valor padrão de uma variável +echo ${Foo:-"ValorPadraoSeFooNaoExistirOuEstiverVazia"} +# Isso funciona para nulo (Foo=) e (Foo=""); zero (Foo=0) retorna 0. +# Note que isso apenas retornar o valor padrão e não mudar o valor da variável. + +# Variáveis internas +# Tem algumas variáveis internas bem uteis, como +echo "O ultimo retorno do programa: $?" +echo "PID do script: $$" +echo "Numero de argumentos passados para o script $#" +echo "Todos os argumentos passados para o script $@" +echo "Os argumentos do script em variáveis diferentes: $1, $2..." + +# Lendo o valor do input: +echo "Qual o seu nome?" +read Nome # Note que nós não precisamos declarar a variável +echo Ola, $Nome + +# Nós temos a estrutura if normal: +# use 'man test' para mais infomações para as condicionais +if [ $Nome -ne $USER ] +then +	echo "Seu nome não é o seu username" +else +	echo "Seu nome é seu username" +fi + +# Tem também execução condicional +echo "Sempre executado" || echo "Somente executado se o primeiro falhar" +echo "Sempre executado" && "Só executado se o primeiro NÃO falhar" + +# Para usar && e || com o if, você precisa multiplicar os pares de colchetes +if [ $Nome == "Estevao"] && [ $Idade -eq 15] +then +	echo "Isso vai rodar se $Nome é igual Estevao E $Idade é 15." +fi + +fi [ $Nome == "Daniela" ] || [ $Nome = "Jose" ]  +then +	echo "Isso vai rodar se $Nome é Daniela ou Jose." +fi + +# Expressões são denotadas com o seguinte formato +echo $(( 10 + 5)) + +# Diferentemente das outras linguagens de programação, bash é um shell, então ele  +# funciona no diretório atual. Você pode listar os arquivos e diretórios no diretório +# atual com o comando ls: +ls + +#Esse comando tem opções que controlam sua execução +ls -l # Lista todo arquivo e diretorio em linhas separadas + +# Os resultados do comando anterior pode ser passado para outro comando como input. +# O comando grep filtra o input com o padrão passado. É assim que listamos apenas +# os arquivos .txt no diretório atual: +ls -l | grep "\.txt" + +# Você pode redirecionar o comando de input e output (stdin, stdout e stderr). +# Lê o stdin até ^EOF$ e sobrescreve hello.py com as linhas entre "EOF": +cat > hello.py << EOF +#!/usr/bin/env python +from __future__ imprt print_function +import sys +print("#stdout", file=sys.stdout) +print("stderr", file=sys.stderr) +for line in sys.stdin: +	print(line, file=sys.stdout) +EOF + +# Rode hello.py com várias instruções stdin, stdout e stderr: +python hello.py < "input.in" +python hello.py > "ouput.out" +python hello.py 2> "error.err" +python hello.py > "output-and-error.log" 2>&1 +python hello.py > /dev/null 2>&1 +# O erro no output sobrescreverá o arquivo se existir, +# se ao invés disso você quiser complementar, use ">>": +python hello.py >> "output.out" 2>> "error.err" + +# Sobrescreve output.out, complemente para error.err e conta as linhas +info bash 'Basic Shell Features' 'Redirections' > output.out 2>> error.err +wc -l output.out error.err + +#Roda um comando e imprime o desencriptador (e.g. /dev/fd/123) +# veja: man fd +echo <(echo "#helloworld") + +# Sobrescreve ouput.out com "#helloworld": +cat > output.out <(echo "#helloworld") +echo "#helloworld" > output.out +echo "#helloworld" | cat > output.out +echo "#helloworld" | tee output.out > /dev/null + +# Limpa os arquivos temporários detalhando quais foram deletados (use '-i' para confirmar exclusão) +rm -v output.out error.err output-and-error.log + +# Comando podem ser substituídos por outros comandos usando $( ): +# O comando a seguir mostra o número de arquivos e diretórios no diretorio atual +echo "Existem $(ls | wc -l) itens aqui." + +# O mesmo pode ser feito usando crase `` mas elas não podem ser aninhadas - dá se  +# preferência ao uso do $( ) +echo "Existem `ls | wc -l` itens aqui." + +# Bash usa o comando case que funciona de uma maneira similar ao switch de Java e C++: +case "$Variavel" in +	# Lista de parametros para condições que você quer encontrar +	0) echo "Isso é um Zero.";; +	1) echo "Isso é um Um.";; +	*) echo "Isso não é null.";; +esac + +# loops for iteragem para quantos argumentos passados: +# O conteudo de $Variavel é exibido três vezes. +for Variavel in {1..3} +do +	echo "$Variavel" +done + +# Ou use o loop da "maneira tradicional": +for ((a=1; a <= 3; a++)) +do +	echo $a +done + +# Eles também podem ser usados em arquivos... +# Isso irá rodar o comando 'cat' em arquivo1 e arquivo2 +for Variavel in arquivo1 arquivo2 +do +	cat "$Variavel" +done + +# ...ou o output de um comando +# Isso irá usar cat no output do ls. +for Output in $(ls) +do +	cat "$Output" +done + +# loop while: +while [ true ] +do +	echo "corpo do loop aqui..." +	break +done + +# Você também pode usar funções +# Definição: +function foo() { +	echo "Argumentos funcionam bem assim como os dos scripts: $@" +	echo "E: $1 $2..." +	echo "Isso é uma função" +	return 0 +} + +# ou simplesmente +bar () { +	echo "Outro jeito de declarar funções!" +	return 0 +} + +# Chamando sua função +foo "Meu nome é" $Nome + +# Existe um monte de comandos úteis que você deveria aprender: +# exibe as 10 ultimas linhas de arquivo.txt +tail -n 10 arquivo.txt +# exibe as primeiras 10 linhas de arquivo.txt +head -n 10 arquivo.txt +# ordena as linhas de arquivo.txt +sort arquivo.txt +# reporta ou omite as linhas repetidas, com -d você as reporta +uniq -d arquivo.txt +# exibe apenas a primeira coluna após o caráctere ',' +cut -d ',' -f 1 arquivo.txt +# substitui todas as ocorrencias de 'okay' por 'legal' em arquivo.txt (é compativel com regex) +sed -i 's/okay/legal/g' file.txt +# exibe para o stdout todas as linhas do arquivo.txt que encaixam com o regex +# O exemplo exibe linhas que começam com "foo" e terminam com "bar" +grep "^foo.*bar$" arquivo.txt +# passe a opção "-c" para ao invês de imprimir o numero da linha que bate com o regex +grep -c "^foo.*bar$" arquivo.txt +# se você quer literalmente procurar por uma string, +# e não pelo regex, use fgrep (ou grep -F) +fgrep "^foo.*bar$" arquivo.txt + + +# Leia a documentação interna do shell Bash com o comando interno 'help': +help +help help +help for  +help return +help source +help . + +# Leia a página principal da documentação com man +apropos bash +man 1 bash +man bash + +# Leia a documentação de informação com info (? para ajuda) +apropos info | grep '^info.*(' +man info +info info  +info 5 info  + +#Leia a documentação informativa do Bash: +info bash +info bash 'Bash Features' +info bash 6 +info --apropos bash  +``` diff --git a/pt-br/brainfuck-pt.html.markdown b/pt-br/bf.html.markdown index 9e4b458d..d6d7c6e9 100644 --- a/pt-br/brainfuck-pt.html.markdown +++ b/pt-br/bf.html.markdown @@ -1,5 +1,5 @@  --- -language: brainfuck +language: bf  contributors:      - ["Prajit Ramachandran", "http://prajitr.github.io/"]      - ["Mathias Bynens", "http://mathiasbynens.be/"] diff --git a/pt-br/c++-pt.html.markdown b/pt-br/c++-pt.html.markdown index 61e267f5..e2e95268 100644 --- a/pt-br/c++-pt.html.markdown +++ b/pt-br/c++-pt.html.markdown @@ -490,7 +490,7 @@ bool doSomethingWithAFile(const char* filename)  {      FILE* fh = fopen(filename, "r"); // Abra o arquivo em modo de leitura      if (fh == nullptr) // O ponteiro retornado é nulo em caso de falha. -        reuturn false; // Relate o fracasso para o chamador. +        return false; // Relate o fracasso para o chamador.      // Suponha cada função retorne false, se falhar      if (!doSomethingWithTheFile(fh)) { @@ -511,7 +511,7 @@ bool doSomethingWithAFile(const char* filename)  {      FILE* fh = fopen(filename, "r");      if (fh == nullptr) -        reuturn false; +        return false;      if (!doSomethingWithTheFile(fh))          goto failure; @@ -581,6 +581,31 @@ void doSomethingWithAFile(const std::string& filename)  //   vetor (i.e. array de autodimensionamento), mapas hash, e assim por diante  //   tudo é automaticamente destruído quando eles saem de escopo  // - Mutex usa lock_guard e unique_lock + + +///////////////////// +// Templates +///////////////////// + +// Templates em C++ são utilizados para programação genérica, ou seja, +// utilizar um tipo de dado genérico onde possa suportar qualquer entrada. +// Por exemplo, invés de criar uma função que apenas some inteiros, você +// poderá fazer uma função que soma double, float e inteiros em uma única +// definição para reutilizar código. + +// Definimos um função que utiliza um "typename" +template<class T> +T soma(T a, T b) { +  return A + B; +} + +// E agora para executá-la +int i=5, j=6, k; +double f=2.0, g=0.5, h; +k=sum<int>(i,j); +h=sum<double>(f,g); + +// Deste modo, não precisamos fazer overload nas funções! (:  ```  Leitura Adicional: diff --git a/pt-br/c-pt.html.markdown b/pt-br/c-pt.html.markdown index 43688724..2c274f12 100644 --- a/pt-br/c-pt.html.markdown +++ b/pt-br/c-pt.html.markdown @@ -7,29 +7,30 @@ contributors:  translators:      - ["João Farias", "https://github.com/JoaoGFarias"]      - ["Elton Viana", "https://github.com/eltonvs"] +    - ["Cássio Böck", "https://github.com/cassiobsilva"]  lang: pt-br  filename: c-pt.el  ---  Ah, C. Ainda é **a** linguagem de computação de alta performance. -C é a liguangem de mais baixo nível que a maioria dos programadores -irão usar, e isso dá a ela uma grande velocidade bruta. Apenas fique -antento que este manual de gerenciamento de memória e C vai levanter-te -tão longe quanto você precisa.  +C é a linguagem de mais baixo nível que a maioria dos programadores +utilizarão, e isso dá a ela uma grande velocidade bruta. Apenas fique +atento se este manual de gerenciamento de memória e C vai te levar +tão longe quanto precisa.  ```c  // Comentários de uma linha iniciam-se com // - apenas disponível a partir do C99  /* -Comentários de multiplas linhas se parecem com este.  +Comentários de múltiplas linhas se parecem com este.  Funcionam no C89 também.  */  // Constantes: #define <palavra-chave>  #definie DAY_IN_YEAR 365 -//enumarações também são modos de definir constantes. +//enumerações também são modos de definir constantes.  enum day {DOM = 1, SEG, TER, QUA, QUI, SEX, SAB};  // SEG recebe 2 automaticamente, TER recebe 3, etc. @@ -54,13 +55,13 @@ int soma_dois_ints(int x1, int x2); // protótipo de função  // O ponto de entrada do teu programa é uma função  // chamada main, com tipo de retorno inteiro  int main() { -	// Usa-se printf para escrever na tela,  +	// Usa-se printf para escrever na tela,  	// para "saída formatada"  	// %d é um inteiro, \n é uma nova linha      printf("%d\n", 0); // => Imprime 0  	// Todos as declarações devem acabar com  	// ponto e vírgula -	 +      ///////////////////////////////////////      // Tipos      /////////////////////////////////////// @@ -78,7 +79,7 @@ int main() {      // longs tem entre 4 e 8 bytes; longs long tem garantia      // de ter pelo menos 64 bits      long x_long = 0; -    long long x_long_long = 0;  +    long long x_long_long = 0;      // floats são normalmente números de ponto flutuante  	// com 32 bits @@ -93,7 +94,7 @@ int main() {      unsigned int ux_int;      unsigned long long ux_long_long; -	// caracteres dentro de aspas simples são inteiros  +	// caracteres dentro de aspas simples são inteiros  	// no conjunto de caracteres da máquina.      '0' // => 48 na tabela ASCII.      'A' // => 65 na tabela ASCII. @@ -104,7 +105,7 @@ int main() {  	// Se o argumento do operador `sizeof` é uma expressão, então seus argumentos  	// não são avaliados (exceto em VLAs (veja abaixo)). -	// O valor devolve, neste caso, é uma constante de tempo de compilação.  +	// O valor devolve, neste caso, é uma constante de tempo de compilação.      int a = 1;  	// size_t é um inteiro sem sinal com pelo menos 2 bytes que representa  	// o tamanho de um objeto. @@ -120,7 +121,7 @@ int main() {  	// Você pode inicializar um array com 0 desta forma:      char meu_array[20] = {0}; -	// Indexar um array é semelhante a outras linguages +	// Indexar um array é semelhante a outras linguagens  	// Melhor dizendo, outras linguagens são semelhantes a C      meu_array[0]; // => 0 @@ -129,7 +130,7 @@ int main() {      printf("%d\n", meu_array[1]); // => 2  	// No C99 (e como uma features opcional em C11), arrays de tamanho variável -	// VLA (do inglês), podem ser declarados também. O tamanho destes arrays  +	// VLA (do inglês), podem ser declarados também. O tamanho destes arrays  	// não precisam ser uma constante de tempo de compilação:      printf("Entre o tamanho do array: "); // Pergunta ao usuário pelo tamanho      char buf[0x100]; @@ -144,14 +145,14 @@ int main() {      // > Entre o tamanho do array: 10      // > sizeof array = 40 -	// String são apenas arrays de caracteres terminados por um  +	// String são apenas arrays de caracteres terminados por um  	// byte nulo (0x00), representado em string pelo caracter especial '\0'.  	// (Não precisamos incluir o byte nulo em literais de string; o compilador  	// o insere ao final do array para nós.) -    char uma_string[20] = "Isto é uma string";  +    char uma_string[20] = "Isto é uma string";  	// Observe que 'é' não está na tabela ASCII  	// A string vai ser salva, mas a saída vai ser estranha -	// Porém, comentários podem conter acentos  +	// Porém, comentários podem conter acentos      printf("%s\n", uma_string); // %s formata a string      printf("%d\n", uma_string[17]); // => 0 @@ -175,7 +176,7 @@ int main() {      ///////////////////////////////////////      // Atalho para multiplas declarações: -    int i1 = 1, i2 = 2;  +    int i1 = 1, i2 = 2;      float f1 = 1.0, f2 = 2.0;      int a, b, c; @@ -206,7 +207,7 @@ int main() {      2 <= 2; // => 1      2 >= 2; // => 1 -	// C não é Python - comparações não se encadeam. +	// C não é Python - comparações não se encadeiam.      int a = 1;      // Errado:      int entre_0_e_2 = 0 < a < 2; @@ -231,7 +232,7 @@ int main() {      char *s = "iLoveC";      int j = 0;      s[j++]; // => "i". Retorna o j-ésimo item de s E DEPOIS incrementa o valor de j. -    j = 0;  +    j = 0;      s[++j]; // => "L". Incrementa o valor de j. E DEPOIS retorna o j-ésimo item de s.      // o mesmo com j-- e --j @@ -308,7 +309,7 @@ int main() {          exit(-1);          break;      } -     +      ///////////////////////////////////////      // Cast de tipos @@ -327,8 +328,8 @@ int main() {  	// Tipos irão ter overflow sem aviso      printf("%d\n", (unsigned char) 257); // => 1 (Max char = 255 se char tem 8 bits) -	// Para determinar o valor máximo de um `char`, de um `signed char` e de  -	// um `unisigned char`, respectivamente, use as macros CHAR_MAX, SCHAR_MAX  +	// Para determinar o valor máximo de um `char`, de um `signed char` e de +	// um `unisigned char`, respectivamente, use as macros CHAR_MAX, SCHAR_MAX  	// e UCHAR_MAX de <limits.h>  	// Tipos inteiros podem sofrer cast para pontos-flutuantes e vice-versa. @@ -341,7 +342,7 @@ int main() {      ///////////////////////////////////////  	// Um ponteiro é uma variável declarada para armazenar um endereço de memória. -	// Seu declaração irá também dizer o tipo de dados para o qual ela aponta. Você +	// Sua declaração irá também dizer o tipo de dados para o qual ela aponta. Você  	// Pode usar o endereço de memória de suas variáveis, então, brincar com eles.      int x = 0; @@ -363,13 +364,13 @@ int main() {      printf("%d\n", *px); // => Imprime 0, o valor de x  	// Você também pode mudar o valor que o ponteiro está apontando. -	// Teremo que cercar a de-referência entre parenteses, pois +	// Temos que cercar a de-referência entre parênteses, pois  	// ++ tem uma precedência maior que *.      (*px)++; // Incrementa o valor que px está apontando por 1      printf("%d\n", *px); // => Imprime 1      printf("%d\n", x); // => Imprime 1 -	// Arrays são um boa maneira de alocar um bloco contínuo de memória +	// Arrays são uma boa maneira de alocar um bloco contínuo de memória      int x_array[20]; // Declara um array de tamanho 20 (não pode-se mudar o tamanho      int xx;      for (xx = 0; xx < 20; xx++) { @@ -379,7 +380,7 @@ int main() {  	// Declara um ponteiro do tipo int e inicialize ele para apontar para x_array      int* x_ptr = x_array;  	// x_ptr agora aponta para o primeiro elemento do array (o inteiro 20). -	// Isto funciona porque arrays são apenas ponteiros para seu primeiros elementos. +	// Isto funciona porque arrays são apenas ponteiros para seus primeiros elementos.  	// Por exemplo, quando um array é passado para uma função ou é atribuído a um  	// ponteiro, ele transforma-se (convertido implicitamente) em um ponteiro.  	// Exceções: quando o array é o argumento de um operador `&` (endereço-de): @@ -395,7 +396,7 @@ int main() {      printf("%zu, %zu\n", sizeof arr, sizeof ptr); // provavelmente imprime "40, 4" ou "40, 8"  	// Ponteiros podem ser incrementados ou decrementados baseado no seu tipo -	// (isto é chamado aritimética de ponteiros +	// (isto é chamado aritmética de ponteiros      printf("%d\n", *(x_ptr + 1)); // => Imprime 19      printf("%d\n", x_array[1]); // => Imprime 19 @@ -413,9 +414,9 @@ int main() {  	// "resultados imprevisíveis" - o programa é dito ter um "comportamento indefinido"      printf("%d\n", *(my_ptr + 21)); // => Imprime quem-sabe-o-que? Talvez até quebre o programa. -	// Quando termina-se de usar um bloco de memória alocado, você pode liberá-lo, +	// Quando se termina de usar um bloco de memória alocado, você pode liberá-lo,  	// ou ninguém mais será capaz de usá-lo até o fim da execução -	// (Isto cham-se "memory leak"): +	// (Isto chama-se "memory leak"):      free(my_ptr);  	// Strings são arrays de char, mas elas geralmente são representadas @@ -537,7 +538,7 @@ int area(retan r)      return r.largura * r.altura;  } -// Se você tiver structus grande, você pode passá-las "por ponteiro"  +// Se você tiver structus grande, você pode passá-las "por ponteiro"  // para evitar cópia de toda a struct:  int area(const retan *r)  { @@ -554,8 +555,8 @@ conhecidos. Ponteiros para funções são como qualquer outro ponteiro  diretamente e passá-las para por toda parte.  Entretanto, a sintaxe de definição por ser um pouco confusa. -Exemplo: use str_reverso através de um ponteiro  -*/	 +Exemplo: use str_reverso através de um ponteiro +*/  void str_reverso_através_ponteiro(char *str_entrada) {      // Define uma variável de ponteiro para função, nomeada f.      void (*f)(char *); //Assinatura deve ser exatamente igual à função alvo. @@ -575,7 +576,7 @@ typedef void (*minha_função_type)(char *);  // Declarando o ponteiro:  // ... -// minha_função_type f;  +// minha_função_type f;  //Caracteres especiais:  '\a' // Alerta (sino) @@ -586,7 +587,7 @@ typedef void (*minha_função_type)(char *);  '\r' // Retorno de carroça  '\b' // Backspace  '\0' // Caracter nulo. Geralmente colocado ao final de string em C. -     //   oi\n\0. \0 é usado por convenção para marcar o fim da string.  +     //   oi\n\0. \0 é usado por convenção para marcar o fim da string.  '\\' // Barra invertida  '\?' // Interrogação  '\'' // Aspas simples @@ -606,7 +607,7 @@ typedef void (*minha_função_type)(char *);  "%p"    // ponteiro  "%x"    // hexadecimal  "%o"    // octal -"%%"    // imprime %  +"%%"    // imprime %  ///////////////////////////////////////  // Ordem de avaliação diff --git a/pt-br/csharp.html.markdown b/pt-br/csharp.html.markdown new file mode 100644 index 00000000..547f4817 --- /dev/null +++ b/pt-br/csharp.html.markdown @@ -0,0 +1,896 @@ +--- +language: c# +filename: csharp-pt.cs +contributors: +    - ["Robson Alves", "http://robsonalves.net/"]     +lang: pt-br +--- + +C# é uma linguagem elegante e altamente tipado orientada a objetos que permite aos desenvolvedores criarem uma variedade de aplicações seguras e robustas que são executadas no .NET Framework. + +[Read more here.](http://msdn.microsoft.com/pt-br/library/vstudio/z1zx9t92.aspx) + +```c# +// Comentário de linha única começa com // +/* +Múltipas linhas é desta forma +*/ +/// <summary> +/// Esta é uma documentação comentário XML que pode ser usado para gerar externo +/// documentação ou fornecer ajuda de contexto dentro de um IDE +/// </summary> +//public void MethodOrClassOrOtherWithParsableHelp() {} + +// Especificar qual namespace seu código irá usar +// Os namespaces a seguir são padrões do .NET Framework Class Library  +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Net; +using System.Threading.Tasks; +using System.IO; + +// Mas este aqui não é : +using System.Data.Entity; +// Para que consiga utiliza-lo, você precisa adicionar novas referências +// Isso pode ser feito com o gerenciador de pacotes NuGet : `Install-Package EntityFramework` + +// Namespaces são escopos definidos para organizar o códgo em "pacotes" or "módulos" +// Usando este código a partir de outra arquivo de origem: using Learning.CSharp; +namespace Learning.CSharp +{ +    // Cada .cs deve conter  uma classe com o mesmo nome do arquivo +    // você está autorizado a contrariar isto, mas evite por sua sanidade. +    public class AprenderCsharp +    { +        // Sintaxe Básica - Pule para as CARACTERÍSTICAS INTERESSANTES se você ja usou Java ou C++ antes. +        public static void Syntax() +        { +            // Use Console.WriteLine para apresentar uma linha +            Console.WriteLine("Hello World"); +            Console.WriteLine( +                "Integer: " + 10 + +                " Double: " + 3.14 + +                " Boolean: " + true); + +            // Para apresentar sem incluir uma nova linha, use Console.Write +            Console.Write("Hello "); +            Console.Write("World"); + +            /////////////////////////////////////////////////// +            // Tpos e Variáveis +            // +            // Declare uma variável usando <tipo> <nome> +            /////////////////////////////////////////////////// + +            // Sbyte - Signed 8-bit integer +            // (-128 <= sbyte <= 127) +            sbyte fooSbyte = 100; + +            // Byte - Unsigned 8-bit integer +            // (0 <= byte <= 255) +            byte fooByte = 100; + +            // Short - 16-bit integer +            // Signed - (-32,768 <= short <= 32,767) +            // Unsigned - (0 <= ushort <= 65,535) +            short fooShort = 10000; +            ushort fooUshort = 10000; + +            // Integer - 32-bit integer +            int fooInt = 1; // (-2,147,483,648 <= int <= 2,147,483,647) +            uint fooUint = 1; // (0 <= uint <= 4,294,967,295) + +            // Long - 64-bit integer +            long fooLong = 100000L; // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807) +            ulong fooUlong = 100000L; // (0 <= ulong <= 18,446,744,073,709,551,615) +            // Numbers default to being int or uint depending on size. +            // L is used to denote that this variable value is of type long or ulong + +            // Double - Double-precision 64-bit IEEE 754 Floating Point +            double fooDouble = 123.4; // Precision: 15-16 digits + +            // Float - Single-precision 32-bit IEEE 754 Floating Point +            float fooFloat = 234.5f; // Precision: 7 digits +            // f is used to denote that this variable value is of type float + +            // Decimal - a 128-bits data type, with more precision than other floating-point types, +            // suited for financial and monetary calculations +            decimal fooDecimal = 150.3m; + +            // Boolean - true & false +            bool fooBoolean = true; // or false + +            // Char - A single 16-bit Unicode character +            char fooChar = 'A'; + +            // Strings - ao contrário dos anteriores tipos base, que são todos os tipos de valor, +            // Uma string é um tipo de referência. Ou seja, você pode configurá-lo como nulo +            string fooString = "\"escape\" quotes and add \n (new lines) and \t (tabs)"; +            Console.WriteLine(fooString); + +            //  Você pode acessar todos os caracteres de string com um indexador:  +            char charFromString = fooString[1]; // => 'e' +            // Strings são imutáveis: você não pode fazer fooString[1] = 'X'; + +            // Compare strings com sua atual cultura, ignorando maiúsculas e minúsculas +            string.Compare(fooString, "x", StringComparison.CurrentCultureIgnoreCase); + +            // Formatando, baseado no sprintf +            string fooFs = string.Format("Check Check, {0} {1}, {0} {1:0.0}", 1, 2); + +            // Datas e formatações +            DateTime fooDate = DateTime.Now; +            Console.WriteLine(fooDate.ToString("hh:mm, dd MMM yyyy")); + +            // Você pode juntar um string em mais de duas linhas com o símbolo @. Para escapar do " use "" +            string bazString = @"Here's some stuff +on a new line! ""Wow!"", the masses cried"; + +            // Use const ou read-only para fazer uma variável imutável +            // os valores da const são calculados durante o tempo de compilação +            const int HoursWorkPerWeek = 9001; + +            /////////////////////////////////////////////////// +            // Estrutura de Dados +            /////////////////////////////////////////////////// + +            // Matrizes - zero indexado +            // O tamanho do array pode ser decidido ainda na declaração +            // O formato para declarar uma matriz é o seguinte:  +            // <tipodado>[] <var nome> = new <tipodado>[<array tamanho>]; +            int[] intArray = new int[10]; + +            // Outra forma de declarar & inicializar uma matriz +            int[] y = { 9000, 1000, 1337 }; + +            // Indexando uma matriz - Acessando um elemento +            Console.WriteLine("intArray @ 0: " + intArray[0]); +            // Matriz são alteráveis +            intArray[1] = 1; + +            // Listas +            // Listas são usadas frequentemente tanto quanto matriz por serem mais flexiveis +            // O formato de declarar uma lista é o seguinte: +            // List<tipodado> <var nome> = new List<tipodado>(); +            List<int> intList = new List<int>(); +            List<string> stringList = new List<string>(); +            List<int> z = new List<int> { 9000, 1000, 1337 }; // inicializar +            // O <> são para genéricos - Confira está interessante seção do material + +            // Lista não possuem valores padrão. +            // Um valor deve ser adicionado antes e depois acessado pelo indexador +            intList.Add(1); +            Console.WriteLine("intList @ 0: " + intList[0]); + +            // Outras estruturas de dados para conferir: +            // Pilha/Fila +            // Dicionário (uma implementação de map de hash) +            // HashSet +            // Read-only Coleção +            // Tuple (.Net 4+) + +            /////////////////////////////////////// +            // Operadores +            /////////////////////////////////////// +            Console.WriteLine("\n->Operators"); + +            int i1 = 1, i2 = 2; // Forma curta para declarar diversas variáveis + +            // Aritmética é clara +            Console.WriteLine(i1 + i2 - i1 * 3 / 7); // => 3 + +            // Modulo +            Console.WriteLine("11%3 = " + (11 % 3)); // => 2 + +            // Comparações de operadores +            Console.WriteLine("3 == 2? " + (3 == 2)); // => falso +            Console.WriteLine("3 != 2? " + (3 != 2)); // => verdadeiro +            Console.WriteLine("3 > 2? " + (3 > 2)); // => verdadeiro +            Console.WriteLine("3 < 2? " + (3 < 2)); // => falso +            Console.WriteLine("2 <= 2? " + (2 <= 2)); // => verdadeiro +            Console.WriteLine("2 >= 2? " + (2 >= 2)); // => verdadeiro + +            // Operadores bit a bit (bitwise) +            /* +            ~       Unário bitwise complemento +            <<      Signed left shift +            >>      Signed right shift +            &       Bitwise AND +            ^       Bitwise exclusivo OR +            |       Bitwise inclusivo OR +            */ + +            // Incrementações +            int i = 0; +            Console.WriteLine("\n->Inc/Dec-rementation"); +            Console.WriteLine(i++); //i = 1. Post-Incrementation +            Console.WriteLine(++i); //i = 2. Pre-Incrementation +            Console.WriteLine(i--); //i = 1. Post-Decrementation +            Console.WriteLine(--i); //i = 0. Pre-Decrementation + +            /////////////////////////////////////// +            // Estrutura de Controle +            /////////////////////////////////////// +            Console.WriteLine("\n->Control Structures"); + +            // Declaração if é como a linguagem C +            int j = 10; +            if (j == 10) +            { +                Console.WriteLine("I get printed"); +            } +            else if (j > 10) +            { +                Console.WriteLine("I don't"); +            } +            else +            { +                Console.WriteLine("I also don't"); +            } + +            // Operador Ternário +            // Um simples if/else pode ser escrito da seguinte forma +            // <condição> ? <verdadeiro> : <falso> +            int toCompare = 17; +            string isTrue = toCompare == 17 ? "True" : "False"; + +            // While loop +            int fooWhile = 0; +            while (fooWhile < 100) +            { +                //Iterated 100 times, fooWhile 0->99 +                fooWhile++; +            } + +            // Do While Loop +            int fooDoWhile = 0; +            do +            { +                // Inicia a interação 100 vezes, fooDoWhile 0->99 +                if (false) +                    continue; // pule a intereção atual para apróxima + +                fooDoWhile++; + +                if (fooDoWhile == 50) +                    break; // Interrompe o laço inteiro + +            } while (fooDoWhile < 100); + +            //estrutura de loop for  => for(<declaração para começar>; <condicional>; <passos>) +            for (int fooFor = 0; fooFor < 10; fooFor++) +            { +                //Iterado 10 vezes, fooFor 0->9 +            } + +            // For Each Loop +            // Estrutura do foreach  => foreach(<Tipo Iterador> <Nome do Iterador> in <enumerable>) +            // O laço foreach  percorre sobre qualquer objeto que implementa IEnumerable ou IEnumerable<T> +            // Toda a coleção de tipos  (Array, List, Dictionary...) no .Net framework +            // implementa uma ou mais destas interfaces. +            // (O ToCharArray() pode ser removido, por que uma string também implementa IEnumerable) +            foreach (char character in "Hello World".ToCharArray()) +            { +                //Iterated over all the characters in the string +            } + +            // Switch Case +            // Um switch funciona com os tipos de dados byte, short, char, e int. +            // Isto também funcional com tipos enumeradors (discutidos em Tipos Enum), +            // A classe String, and a few special classes that wrap +            // tipos primitívos: Character, Byte, Short, and Integer. +            int month = 3; +            string monthString; +            switch (month) +            { +                case 1: +                    monthString = "January"; +                    break; +                case 2: +                    monthString = "February"; +                    break; +                case 3: +                    monthString = "March"; +                    break; +                // You can assign more than one case to an action +                // But you can't add an action without a break before another case +                // (if you want to do this, you would have to explicitly add a goto case x +                case 6: +                case 7: +                case 8: +                    monthString = "Summer time!!"; +                    break; +                default: +                    monthString = "Some other month"; +                    break; +            } + +            /////////////////////////////////////// +            // Converting Data Types And Typecasting +            /////////////////////////////////////// + +            // Converting data + +            // Convert String To Integer +            // this will throw a FormatException on failure +            int.Parse("123");//returns an integer version of "123" + +            // try parse will default to type default on failure +            // in this case: 0 +            int tryInt; +            if (int.TryParse("123", out tryInt)) // Function is boolean +                Console.WriteLine(tryInt);       // 123 + +            // Convert Integer To String +            // Convert class has a number of methods to facilitate conversions +            Convert.ToString(123); +            // or +            tryInt.ToString(); + +            // Casting +            // Cast decimal 15 to a int +            // and then implicitly cast to long +            long x = (int) 15M; +        } + +        /////////////////////////////////////// +        // CLASSES - see definitions at end of file +        /////////////////////////////////////// +        public static void Classes() +        { +            // See Declaration of objects at end of file + +            // Use new to instantiate a class +            Bicycle trek = new Bicycle(); + +            // Call object methods +            trek.SpeedUp(3); // You should always use setter and getter methods +            trek.Cadence = 100; + +            // ToString is a convention to display the value of this Object. +            Console.WriteLine("trek info: " + trek.Info()); + +            // Instantiate a new Penny Farthing +            PennyFarthing funbike = new PennyFarthing(1, 10); +            Console.WriteLine("funbike info: " + funbike.Info()); + +            Console.Read(); +        } // End main method + +        // CONSOLE ENTRY A console application must have a main method as an entry point +        public static void Main(string[] args) +        { +            OtherInterestingFeatures(); +        } + +        // +        // INTERESTING FEATURES +        // + +        // DEFAULT METHOD SIGNATURES + +        public // Visibility +        static // Allows for direct call on class without object +        int // Return Type, +        MethodSignatures( +            int maxCount, // First variable, expects an int +            int count = 0, // will default the value to 0 if not passed in +            int another = 3, +            params string[] otherParams // captures all other parameters passed to method +        ) +        { +            return -1; +        } + +        // Methods can have the same name, as long as the signature is unique +        // A method that differs only in return type is not unique +        public static void MethodSignatures( +            ref int maxCount, // Pass by reference +            out int count) +        { +            count = 15; // out param must be assigned before control leaves the method +        } + +        // GENERICS +        // The classes for TKey and TValue is specified by the user calling this function. +        // This method emulates the SetDefault of Python +        public static TValue SetDefault<TKey, TValue>( +            IDictionary<TKey, TValue> dictionary, +            TKey key, +            TValue defaultItem) +        { +            TValue result; +            if (!dictionary.TryGetValue(key, out result)) +                return dictionary[key] = defaultItem; +            return result; +        } + +        // You can narrow down the objects that are passed in +        public static void IterateAndPrint<T>(T toPrint) where T: IEnumerable<int> +        { +            // We can iterate, since T is a IEnumerable +            foreach (var item in toPrint) +                // Item is an int +                Console.WriteLine(item.ToString()); +        } + +        public static void OtherInterestingFeatures() +        { +            // OPTIONAL PARAMETERS +            MethodSignatures(3, 1, 3, "Some", "Extra", "Strings"); +            MethodSignatures(3, another: 3); // explicity set a parameter, skipping optional ones + +            // BY REF AND OUT PARAMETERS +            int maxCount = 0, count; // ref params must have value +            MethodSignatures(ref maxCount, out count); + +            // EXTENSION METHODS +            int i = 3; +            i.Print(); // Defined below + +            // NULLABLE TYPES - great for database interaction / return values +            // any value type (i.e. not a class) can be made nullable by suffixing a ? +            // <type>? <var name> = <value> +            int? nullable = null; // short hand for Nullable<int> +            Console.WriteLine("Nullable variable: " + nullable); +            bool hasValue = nullable.HasValue; // true if not null + +            // ?? is syntactic sugar for specifying default value (coalesce) +            // in case variable is null +            int notNullable = nullable ?? 0; // 0 + +            // IMPLICITLY TYPED VARIABLES - you can let the compiler work out what the type is: +            var magic = "magic is a string, at compile time, so you still get type safety"; +            // magic = 9; will not work as magic is a string, not an int + +            // GENERICS +            // +            var phonebook = new Dictionary<string, string>() { +                {"Sarah", "212 555 5555"} // Add some entries to the phone book +            }; + +            // Calling SETDEFAULT defined as a generic above +            Console.WriteLine(SetDefault<string,string>(phonebook, "Shaun", "No Phone")); // No Phone +            // nb, you don't need to specify the TKey and TValue since they can be +            // derived implicitly +            Console.WriteLine(SetDefault(phonebook, "Sarah", "No Phone")); // 212 555 5555 + +            // LAMBDA EXPRESSIONS - allow you to write code in line +            Func<int, int> square = (x) => x * x; // Last T item is the return value +            Console.WriteLine(square(3)); // 9 + +            // ERROR HANDLING - coping with an uncertain world +            try +            { +                var funBike = PennyFarthing.CreateWithGears(6); + +                // will no longer execute because CreateWithGears throws an exception +                string some = ""; +                if (true) some = null; +                some.ToLower(); // throws a NullReferenceException +            } +            catch (NotSupportedException) +            { +                Console.WriteLine("Not so much fun now!"); +            } +            catch (Exception ex) // catch all other exceptions +            { +                throw new ApplicationException("It hit the fan", ex); +                // throw; // A rethrow that preserves the callstack +            } +            // catch { } // catch-all without capturing the Exception +            finally +            { +                // executes after try or catch +            } + +            // DISPOSABLE RESOURCES MANAGEMENT - let you handle unmanaged resources easily. +            // Most of objects that access unmanaged resources (file handle, device contexts, etc.) +            // implement the IDisposable interface. The using statement takes care of +            // cleaning those IDisposable objects for you. +            using (StreamWriter writer = new StreamWriter("log.txt")) +            { +                writer.WriteLine("Nothing suspicious here"); +                // At the end of scope, resources will be released. +                // Even if an exception is thrown. +            } + +            // PARALLEL FRAMEWORK +            // http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx +            var websites = new string[] { +                "http://www.google.com", "http://www.reddit.com", +                "http://www.shaunmccarthy.com" +            }; +            var responses = new Dictionary<string, string>(); + +            // Will spin up separate threads for each request, and join on them +            // before going to the next step! +            Parallel.ForEach(websites, +                new ParallelOptions() {MaxDegreeOfParallelism = 3}, // max of 3 threads +                website => +            { +                // Do something that takes a long time on the file +                using (var r = WebRequest.Create(new Uri(website)).GetResponse()) +                { +                    responses[website] = r.ContentType; +                } +            }); + +            // This won't happen till after all requests have been completed +            foreach (var key in responses.Keys) +                Console.WriteLine("{0}:{1}", key, responses[key]); + +            // DYNAMIC OBJECTS (great for working with other languages) +            dynamic student = new ExpandoObject(); +            student.FirstName = "First Name"; // No need to define class first! + +            // You can even add methods (returns a string, and takes in a string) +            student.Introduce = new Func<string, string>( +                (introduceTo) => string.Format("Hey {0}, this is {1}", student.FirstName, introduceTo)); +            Console.WriteLine(student.Introduce("Beth")); + +            // IQUERYABLE<T> - almost all collections implement this, which gives you a lot of +            // very useful Map / Filter / Reduce style methods +            var bikes = new List<Bicycle>(); +            bikes.Sort(); // Sorts the array +            bikes.Sort((b1, b2) => b1.Wheels.CompareTo(b2.Wheels)); // Sorts based on wheels +            var result = bikes +                .Where(b => b.Wheels > 3) // Filters - chainable (returns IQueryable of previous type) +                .Where(b => b.IsBroken && b.HasTassles) +                .Select(b => b.ToString()); // Map - we only this selects, so result is a IQueryable<string> + +            var sum = bikes.Sum(b => b.Wheels); // Reduce - sums all the wheels in the collection + +            // Create a list of IMPLICIT objects based on some parameters of the bike +            var bikeSummaries = bikes.Select(b=>new { Name = b.Name, IsAwesome = !b.IsBroken && b.HasTassles }); +            // Hard to show here, but you get type ahead completion since the compiler can implicitly work +            // out the types above! +            foreach (var bikeSummary in bikeSummaries.Where(b => b.IsAwesome)) +                Console.WriteLine(bikeSummary.Name); + +            // ASPARALLEL +            // And this is where things get wicked - combines linq and parallel operations +            var threeWheelers = bikes.AsParallel().Where(b => b.Wheels == 3).Select(b => b.Name); +            // this will happen in parallel! Threads will automagically be spun up and the +            // results divvied amongst them! Amazing for large datasets when you have lots of +            // cores + +            // LINQ - maps a store to IQueryable<T> objects, with delayed execution +            // e.g. LinqToSql - maps to a database, LinqToXml maps to an xml document +            var db = new BikeRepository(); + +            // execution is delayed, which is great when querying a database +            var filter = db.Bikes.Where(b => b.HasTassles); // no query run +            if (42 > 6) // You can keep adding filters, even conditionally - great for "advanced search" functionality +                filter = filter.Where(b => b.IsBroken); // no query run + +            var query = filter +                .OrderBy(b => b.Wheels) +                .ThenBy(b => b.Name) +                .Select(b => b.Name); // still no query run + +            // Now the query runs, but opens a reader, so only populates are you iterate through +            foreach (string bike in query) +                Console.WriteLine(result); + + + +        } + +    } // End LearnCSharp class + +    // You can include other classes in a .cs file + +    public static class Extensions +    { +        // EXTENSION FUNCTIONS +        public static void Print(this object obj) +        { +            Console.WriteLine(obj.ToString()); +        } +    } + +    // Class Declaration Syntax: +    // <public/private/protected/internal> class <class name>{ +    //    //data fields, constructors, functions all inside. +    //    //functions are called as methods in Java. +    // } + +    public class Bicycle +    { +        // Bicycle's Fields/Variables +        public int Cadence // Public: Can be accessed from anywhere +        { +            get // get - define a method to retrieve the property +            { +                return _cadence; +            } +            set // set - define a method to set a proprety +            { +                _cadence = value; // Value is the value passed in to the setter +            } +        } +        private int _cadence; + +        protected virtual int Gear // Protected: Accessible from the class and subclasses +        { +            get; // creates an auto property so you don't need a member field +            set; +        } + +        internal int Wheels // Internal: Accessible from within the assembly +        { +            get; +            private set; // You can set modifiers on the get/set methods +        } + +        int _speed; // Everything is private by default: Only accessible from within this class. +                    // can also use keyword private +        public string Name { get; set; } + +        // Enum is a value type that consists of a set of named constants +        // It is really just mapping a name to a value (an int, unless specified otherwise). +        // The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong. +        // An enum can't contain the same value twice. +        public enum BikeBrand +        { +            AIST, +            BMC, +            Electra = 42, //you can explicitly set a value to a name +            Gitane // 43 +        } +        // We defined this type inside a Bicycle class, so it is a nested type +        // Code outside of this class should reference this type as Bicycle.Brand + +        public BikeBrand Brand; // After declaring an enum type, we can declare the field of this type + +        // Decorate an enum with the FlagsAttribute to indicate that multiple values can be switched on +        [Flags] // Any class derived from Attribute can be used to decorate types, methods, parameters etc +        public enum BikeAccessories +        { +            None = 0, +            Bell = 1, +            MudGuards = 2, // need to set the values manually! +            Racks = 4, +            Lights = 8, +            FullPackage = Bell | MudGuards | Racks | Lights +        } + +        // Usage: aBike.Accessories.HasFlag(Bicycle.BikeAccessories.Bell) +        // Before .NET 4: (aBike.Accessories & Bicycle.BikeAccessories.Bell) == Bicycle.BikeAccessories.Bell +        public BikeAccessories Accessories { get; set; } + +        // Static members belong to the type itself rather then specific object. +        // You can access them without a reference to any object: +        // Console.WriteLine("Bicycles created: " + Bicycle.bicyclesCreated); +        public static int BicyclesCreated { get; set; } + +        // readonly values are set at run time +        // they can only be assigned upon declaration or in a constructor +        readonly bool _hasCardsInSpokes = false; // read-only private + +        // Constructors are a way of creating classes +        // This is a default constructor +        public Bicycle() +        { +            this.Gear = 1; // you can access members of the object with the keyword this +            Cadence = 50;  // but you don't always need it +            _speed = 5; +            Name = "Bontrager"; +            Brand = BikeBrand.AIST; +            BicyclesCreated++; +        } + +        // This is a specified constructor (it contains arguments) +        public Bicycle(int startCadence, int startSpeed, int startGear, +                       string name, bool hasCardsInSpokes, BikeBrand brand) +            : base() // calls base first +        { +            Gear = startGear; +            Cadence = startCadence; +            _speed = startSpeed; +            Name = name; +            _hasCardsInSpokes = hasCardsInSpokes; +            Brand = brand; +        } + +        // Constructors can be chained +        public Bicycle(int startCadence, int startSpeed, BikeBrand brand) : +            this(startCadence, startSpeed, 0, "big wheels", true, brand) +        { +        } + +        // Function Syntax: +        // <public/private/protected> <return type> <function name>(<args>) + +        // classes can implement getters and setters for their fields +        // or they can implement properties (this is the preferred way in C#) + +        // Method parameters can have default values. +        // In this case, methods can be called with these parameters omitted +        public void SpeedUp(int increment = 1) +        { +            _speed += increment; +        } + +        public void SlowDown(int decrement = 1) +        { +            _speed -= decrement; +        } + +        // properties get/set values +        // when only data needs to be accessed, consider using properties. +        // properties may have either get or set, or both +        private bool _hasTassles; // private variable +        public bool HasTassles // public accessor +        { +            get { return _hasTassles; } +            set { _hasTassles = value; } +        } + +        // You can also define an automatic property in one line +        // this syntax will create a backing field automatically. +        // You can set an access modifier on either the getter or the setter (or both) +        // to restrict its access: +        public bool IsBroken { get; private set; } + +        // Properties can be auto-implemented +        public int FrameSize +        { +            get; +            // you are able to specify access modifiers for either get or set +            // this means only Bicycle class can call set on Framesize +            private set; +        } + +        // It's also possible to define custom Indexers on objects. +        // All though this is not entirely useful in this example, you +        // could do bicycle[0] which yields "chris" to get the first passenger or +        // bicycle[1] = "lisa" to set the passenger. (of this apparent quattrocycle) +        private string[] passengers = { "chris", "phil", "darren", "regina" }; + +        public string this[int i] +        { +            get { +                return passengers[i]; +            } + +            set { +                return passengers[i] = value; +            } +        } + +        //Method to display the attribute values of this Object. +        public virtual string Info() +        { +            return "Gear: " + Gear + +                    " Cadence: " + Cadence + +                    " Speed: " + _speed + +                    " Name: " + Name + +                    " Cards in Spokes: " + (_hasCardsInSpokes ? "yes" : "no") + +                    "\n------------------------------\n" +                    ; +        } + +        // Methods can also be static. It can be useful for helper methods +        public static bool DidWeCreateEnoughBycles() +        { +            // Within a static method, we only can reference static class members +            return BicyclesCreated > 9000; +        } // If your class only needs static members, consider marking the class itself as static. + + +    } // end class Bicycle + +    // PennyFarthing is a subclass of Bicycle +    class PennyFarthing : Bicycle +    { +        // (Penny Farthings are those bicycles with the big front wheel. +        // They have no gears.) + +        // calling parent constructor +        public PennyFarthing(int startCadence, int startSpeed) : +            base(startCadence, startSpeed, 0, "PennyFarthing", true, BikeBrand.Electra) +        { +        } + +        protected override int Gear +        { +            get +            { +                return 0; +            } +            set +            { +                throw new InvalidOperationException("You can't change gears on a PennyFarthing"); +            } +        } + +        public static PennyFarthing CreateWithGears(int gears) +        { +            var penny = new PennyFarthing(1, 1); +            penny.Gear = gears; // Oops, can't do this! +            return penny; +        } + +        public override string Info() +        { +            string result = "PennyFarthing bicycle "; +            result += base.ToString(); // Calling the base version of the method +            return result; +        } +    } + +    // Interfaces only contain signatures of the members, without the implementation. +    interface IJumpable +    { +        void Jump(int meters); // all interface members are implicitly public +    } + +    interface IBreakable +    { +        bool Broken { get; } // interfaces can contain properties as well as methods & events +    } + +    // Class can inherit only one other class, but can implement any amount of interfaces +    class MountainBike : Bicycle, IJumpable, IBreakable +    { +        int damage = 0; + +        public void Jump(int meters) +        { +            damage += meters; +        } + +        public bool Broken +        { +            get +            { +                return damage > 100; +            } +        } +    } + +    /// <summary> +    /// Used to connect to DB for LinqToSql example. +    /// EntityFramework Code First is awesome (similar to Ruby's ActiveRecord, but bidirectional) +    /// http://msdn.microsoft.com/en-us/data/jj193542.aspx +    /// </summary> +    public class BikeRepository : DbContext +    { +        public BikeRepository() +            : base() +        { +        } + +        public DbSet<Bicycle> Bikes { get; set; } +    } +} // End Namespace +``` + +## Topics Not Covered + + * Attributes + * async/await, yield, pragma directives + * Web Development + 	* ASP.NET MVC & WebApi (new) + 	* ASP.NET Web Forms (old) + 	* WebMatrix (tool) + * Desktop Development + 	* Windows Presentation Foundation (WPF) (new) + 	* Winforms (old) + +## Further Reading + + * [DotNetPerls](http://www.dotnetperls.com) + * [C# in Depth](http://manning.com/skeet2) + * [Programming C#](http://shop.oreilly.com/product/0636920024064.do) + * [LINQ](http://shop.oreilly.com/product/9780596519254.do) + * [MSDN Library](http://msdn.microsoft.com/en-us/library/618ayhy6.aspx) + * [ASP.NET MVC Tutorials](http://www.asp.net/mvc/tutorials) + * [ASP.NET Web Matrix Tutorials](http://www.asp.net/web-pages/tutorials) + * [ASP.NET Web Forms Tutorials](http://www.asp.net/web-forms/tutorials) + * [Windows Forms Programming in C#](http://www.amazon.com/Windows-Forms-Programming-Chris-Sells/dp/0321116208) + * [C# Coding Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx) diff --git a/pt-br/css-pt.html.markdown b/pt-br/css-pt.html.markdown index ed6f6c4c..b1fbd961 100644 --- a/pt-br/css-pt.html.markdown +++ b/pt-br/css-pt.html.markdown @@ -159,11 +159,11 @@ seletor {      color: # FF66EE; /* Formato hexadecimal longo */      color: tomato; /* Uma cor nomeada */      color: rgb (255, 255, 255); /* Como valores rgb */ -    cor: RGB (10%, 20%, 50%); /* Como porcentagens rgb */ -    cor: rgba (255, 0, 0, 0,3); /* Como valores RGBA (CSS 3) NOTA: 0 <a <1 */ +    color: RGB (10%, 20%, 50%); /* Como porcentagens rgb */ +    color: rgba (255, 0, 0, 0,3); /* Como valores RGBA (CSS 3) NOTA: 0 <a <1 */      color: transparent; /* Equivale a definir o alfa a 0 */ -    cor: HSL (0, 100%, 50%); /* Como porcentagens HSL (CSS 3) */ -    cor: HSLA (0, 100%, 50%, 0,3); /* Como porcentagens HSLA com alfa */ +    color: HSL (0, 100%, 50%); /* Como porcentagens HSL (CSS 3) */ +    color: HSLA (0, 100%, 50%, 0,3); /* Como porcentagens HSLA com alfa */      /* Imagens como fundos de elementos */      background-image: url (/img-path/img.jpg); /* Citações dentro url () opcional */ diff --git a/pt-br/elixir.html.markdown b/pt-br/elixir.html.markdown new file mode 100644 index 00000000..b4ca8a52 --- /dev/null +++ b/pt-br/elixir.html.markdown @@ -0,0 +1,411 @@ +--- +language: elixir +contributors: +    - ["Joao Marques", "http://github.com/mrshankly"] +    - ["Dzianis Dashkevich", "https://github.com/dskecse"] +translators: +    - ["Rodrigo Muniz", "http://github.com/muniz95"] +filename: learnelixir-pt.ex +--- + +Elixir é uma linguagem funcional moderna construída no topo da Erlang VM. +É totalmente compatível com Erlang, porém conta com uma sintaxe mais padronizada +e muitos outros recursos. + +```elixir + +# Comentários de linha única começam com um símbolo de número. + +# Não há comentários de múltiplas linhas, +# mas você pode empilhar os comentários. + +# Para usar o shell do elixir use o comando `iex`. +# Compile seus módulos com o comando `elixirc`. + +# Ambos devem estar em seu path se você instalou o Elixir corretamente. + +## --------------------------- +## -- Tipos Básicos +## --------------------------- + +# Há números +3    # integer +0x1F # integer +3.0  # float + +# Atoms, que são literais, uma constante com nome. Elas começam com `:`. +:hello # atom + +# Tuplas que são guardadas contiguamente em memória. +{1,2,3} # tupla + +# Podemos acessar um elemento de uma tupla om a função `elem`: +elem({1, 2, 3}, 0) #=> 1 + +# Listas que são implementadas como listas ligadas. +[1,2,3] # lista + +# Podemos acessar a primeira posição (head) e o resto (tail) de uma lista como a seguir: +[head | tail] = [1,2,3] +head #=> 1 +tail #=> [2,3] + +# Em elixir, bem como em Erlang, o sinal `=` denota pattern match, +# e não uma atribuição. +# +# Isto significa que o que estiver à esquerda (pattern) é comparado com o que +# estiver à direita. +# +# É assim que o exemplo acima de acesso à head e tail de uma lista funciona. + +# Um pattern match retornará erro quando os lados não conferem, como neste exemplo +# onde as tuplas tem diferentes tamanhos. +# {a, b, c} = {1, 2} #=> ** (MatchError) no match of right hand side value: {1,2} + +# Também há binários +<<1,2,3>> # binary + +# Strings e char lists +"hello" # string +'hello' # char list + +# Strings de múltiplas linhas +""" +Strings +de múltiplas +linhas. +""" +#=> "Strings\nde múltiplas\nlinhas" + +# Strings são sempre codificadas em UTF-8: +"héllò" #=> "héllò" + +# Strings são de fato apenas binários, e char lists apenas listas. +<<?a, ?b, ?c>> #=> "abc" +[?a, ?b, ?c]   #=> 'abc' + +# `?a` em elixir retorna o valor ASCII para a letra `a` +?a #=> 97 + +# Para concatenar listas use `++`, para binários use `<>` +[1,2,3] ++ [4,5]     #=> [1,2,3,4,5] +'hello ' ++ 'world'  #=> 'hello world' + +<<1,2,3>> <> <<4,5>> #=> <<1,2,3,4,5>> +"hello " <> "world"  #=> "hello world" + +# Ranges são representados como `início..fim` (ambos inclusivos) +1..10 #=> 1..10 +menor..maior = 1..10 # Pattern matching pode ser usada em ranges também +[lower, upper] #=> [1, 10] + +## --------------------------- +## -- Operadores +## --------------------------- + +# Matemática básica +1 + 1  #=> 2 +10 - 5 #=> 5 +5 * 2  #=> 10 +10 / 2 #=> 5.0 + +# Em elixir o operador `/` sempre retorna um float. + +# Para divisão de inteiros use `div` +div(10, 2) #=> 5 + +# Para obter o resto da divisão use `rem` +rem(10, 3) #=> 1 + +# Há também operadores booleanos: `or`, `and` e `not`. +# Estes operadores esperam um booleano como primeiro argumento. +true and true #=> true +false or true #=> true +# 1 and true    #=> ** (ArgumentError) argument error + +# Elixir também fornece `||`, `&&` e `!` que aceitam argumentos de qualquer tipo. +# Todos os valores exceto `false` e `nil` serão avaliados como true. +1 || true  #=> 1 +false && 1 #=> false +nil && 20  #=> nil +!true #=> false + +# Para comparações temos: `==`, `!=`, `===`, `!==`, `<=`, `>=`, `<` e `>` +1 == 1 #=> true +1 != 1 #=> false +1 < 2  #=> true + +# `===` e `!==` são mais estritos ao comparar integers e floats: +1 == 1.0  #=> true +1 === 1.0 #=> false + +# Podemos comparar também dois tipos de dados diferentes: +1 < :hello #=> true + +# A regra de ordenação no geral é definida abaixo: +# number < atom < reference < functions < port < pid < tuple < list < bit string + +# Ao citar Joe Armstrong nisto: "A ordem de fato não é importante, +# mas que uma ordem total esteja bem definida é importante." + +## --------------------------- +## -- Fluxo de Controle +## --------------------------- + +# expressão `if`  +if false do +  "Isso nunca será visto" +else +  "Isso será" +end + +# Também há `unless` +unless true do +  "Isso nunca será visto" +else +  "Isso será" +end + +# Lembra do patter matching? Muitas estruturas de fluxo de controle em elixir contam com ela. + +# `case` nos permite comparar um valor com muitos patterns: +case {:um, :dois} do +  {:quatro, :cinco} -> +    "Isso não corresponde" +  {:um, x} -> +    "Isso corresponde e vincula `x` a `:dois`" +  _ -> +    "Isso corresponde a qualquer valor" +end + +# É comum vincular o valor a `_` se não precisamos dele. +# Por exemplo, se apenas a head de uma lista nos interessa: +[head | _] = [1,2,3] +head #=> 1 + +# Para melhor legibilidade podemos fazer o seguinte: +[head | _tail] = [:a, :b, :c] +head #=> :a + +# `cond` nos permite verificar várias condições ao mesmo tempo. +# Use `cond` em vez de aninhar vários `if`'s. +cond do +  1 + 1 == 3 -> +    "Nunca serei visto" +  2 * 5 == 12 -> +    "Nem eu" +  1 + 2 == 3 -> +    "Mas eu serei" +end + +# É comum definir a última condição igual a `true`, que sempre irá corresponder. +cond do +  1 + 1 == 3 -> +    "Nunca serei visto" +  2 * 5 == 12 -> +    "Nem eu" +  true -> +    "Mas eu serei (isso é essencialmente um else)" +end + +# `try/catch` é usado para capturar valores que são lançados, também suporta uma +# cláusula `after` que é invocada havendo um valor capturado ou não. +try do +  throw(:hello) +catch +  message -> "Deu #{mensagem}." +after +  IO.puts("Sou o after.") +end +#=> Sou o after +# "Deu :hello" + +## --------------------------- +## -- Módulos e Funções +## --------------------------- + +# Funções Anônimas (repare o ponto) +square = fn(x) -> x * x end +square.(5) #=> 25 + +# Elas também aceitam várias cláusulas e guards. +# Guards permitem ajustes finos de pattern matching, +# sendo indicados pela palavra `when`: +f = fn +  x, y when x > 0 -> x + y +  x, y -> x * y +end + +f.(1, 3)  #=> 4 +f.(-1, 3) #=> -3 + +# Elixir também fornece várias funções embutidas. +# Estas estão disponíveis no escopo atual. +is_number(10)    #=> true +is_list("ola") #=> false +elem({1,2,3}, 0) #=> 1 + +# Você pode agrupar algumas funções em um módulo. Dentro de um módulo use `def` +# para definir suas funções. +defmodule Math do +  def sum(a, b) do +    a + b +  end + +  def square(x) do +    x * x +  end +end + +Math.sum(1, 2)  #=> 3 +Math.square(3) #=> 9 + +# Para compilar o módulo Math salve-o como `math.ex` e use `elixirc` +# em seu terminal: elixirc math.ex + +# Dentro de um módulo podemos definir funções com `def` e funções privadas com `defp`. +# Uma função definida com `def` pode ser invocada por outros módulos, +# já uma função privada pode ser invocada apenas localmente. +defmodule PrivateMath do +  def sum(a, b) do +    do_sum(a, b) +  end + +  defp do_sum(a, b) do +    a + b +  end +end + +PrivateMath.sum(1, 2)    #=> 3 +# PrivateMath.do_sum(1, 2) #=> ** (UndefinedFunctionError) + +# Declarações de funções também suportam guards cláusulas múltiplas: +defmodule Geometry do +  def area({:rectangle, w, h}) do +    w * h +  end + +  def area({:circle, r}) when is_number(r) do +    3.14 * r * r +  end +end + +Geometry.area({:rectangle, 2, 3}) #=> 6 +Geometry.area({:circle, 3})       #=> 28.25999999999999801048 +# Geometry.area({:circle, "not_a_number"}) +#=> ** (FunctionClauseError) no function clause matching in Geometry.area/1 + +# Devido à imutabilidade, recursão é uma grande parte do elixir +defmodule Recursion do +  def sum_list([head | tail], acc) do +    sum_list(tail, acc + head) +  end + +  def sum_list([], acc) do +    acc +  end +end + +Recursion.sum_list([1,2,3], 0) #=> 6 + +# Módulos do elixir suportam atributos, hpa atributos embutidos e você +# pode também adicionar os seus próprios. +defmodule MyMod do +  @moduledoc """ +  Este é um atributo embutido em um módulo de exemplo. +  """ + +  @my_data 100 # Este é um atributo customizado. +  IO.inspect(@my_data) #=> 100 +end + +## --------------------------- +## -- Structs e Exceptions +## --------------------------- + +# Structs são extensões no topo de mapas que trazem valores padrão, +# garantias em tempo de compilação e polimorfismo para o Elixir. +defmodule Pessoa do +  defstruct nome: nil, idade: 0, peso: 0 +end + +joe_info = %Pessoa{ nome: "Joe", idade: 30, peso: 180 } +#=> %Pessoa{idade: 30, peso: 180, nome: "Joe"} + +# Acessa o valor de nome +joe_info.name #=> "Joe" + +# Atualiza o valor de idade +older_joe_info = %{ joe_info | idade: 31 } +#=> %Pessoa{idade: 31, peso: 180, nome: "Joe"} + +# O bloco `try` com a palavra `rescue` é usado para manipular exceções +try do +  raise "algum erro" +rescue +  RuntimeError -> "resgatado um erro em tempo de execução" +  _error -> "isso resgatará qualquer erro" +end + +# Toda exceção possui uma mensagem +try do +  raise "algum erro" +rescue +  x in [RuntimeError] -> +    x.message +end + +## --------------------------- +## -- Concorrência +## --------------------------- + +# Elixir conta com o modelo de ator para concorrência. Tudo o que precisamos para +# escrever programas concorrentes em elixir são três primitivos: spawning processes, +# sending messages e receiving messages. + +# Para iniciar um novo processo usamos a função `spawn`, a qual leva uma função +# como argumento. +f = fn -> 2 * 2 end #=> #Function<erl_eval.20.80484245> +spawn(f) #=> #PID<0.40.0> + +# `spawn` retorna um pid (process identifier), você pode usar esse pid para enviar +# mensagens ao processo. Para envio de mensagens usamos o operador `send`. +# Para tudo isso ser útil precisamos estar aptos a receber mensagens. Isto é +# realizado com o mecanismo `receive`: +defmodule Geometry do +  def area_loop do +    receive do +      {:rectangle, w, h} -> +        IO.puts("Area = #{w * h}") +        area_loop() +      {:circle, r} -> +        IO.puts("Area = #{3.14 * r * r}") +        area_loop() +    end +  end +end + +# Compile o módulo e crie um processo que avalie `area_loop` no shell +pid = spawn(fn -> Geometry.area_loop() end) #=> #PID<0.40.0> + +# Envia uma mensagem ao `pid` correspondente a um pattern na declaração de recebimento +send pid, {:rectangle, 2, 3} +#=> Area = 6 +#   {:rectangle,2,3} + +send pid, {:circle, 2} +#=> Area = 12.56000000000000049738 +#   {:circle,2} + +# O shell também é um processo, você pode usar `self` para obter o pid atual +self() #=> #PID<0.27.0> +``` + +## Referências + +* [Getting started guide](http://elixir-lang.org/getting_started/1.html) da [página do elixir](http://elixir-lang.org) +* [Elixir Documentation](http://elixir-lang.org/docs/master/) +* ["Programming Elixir"](https://pragprog.com/book/elixir/programming-elixir) por Dave Thomas +* [Elixir Cheat Sheet](http://media.pragprog.com/titles/elixir/ElixirCheat.pdf) +* ["Learn You Some Erlang for Great Good!"](http://learnyousomeerlang.com/) por Fred Hebert +* ["Programming Erlang: Software for a Concurrent World"](https://pragprog.com/book/jaerlang2/programming-erlang) por Joe Armstrong diff --git a/pt-br/git-pt.html.markdown b/pt-br/git-pt.html.markdown index 981da503..907892b1 100644 --- a/pt-br/git-pt.html.markdown +++ b/pt-br/git-pt.html.markdown @@ -5,8 +5,12 @@ lang: pt-br  filename: LearnGit.txt  contributors:      - ["Jake Prather", "http://github.com/JakeHP"] +    - ["Leo Rudberg" , "http://github.com/LOZORD"] +    - ["Betsy Lorton" , "http://github.com/schbetsy"] +    - ["Bruno Volcov", "http://github.com/volcov"]  translators:    - ["Suzane Sant Ana", "http://github.com/suuuzi"] +  - ["Bruno Volcov", "http://github.com/volcov"]  ---  Git é um sistema distribuido de gestão para código fonte e controle de versões. @@ -28,7 +32,7 @@ a um arquivo ou conjunto de arquivos ao longo do tempo.  de arquivos.  * Controle de versão distribuído foca em compartilhar alterações. Cada  alteração é associada a um *id* único. -* Sistemas distribuídos não tem estrutura definida. É possivel ter um sistema +* Sistemas distribuídos não têm estrutura definida. É possivel ter um sistema  centralizado ao estilo SVN usando git.  [Informação adicional (EN)](http://git-scm.com/book/en/Getting-Started-About-Version-Control) @@ -52,7 +56,7 @@ referências. Pode ser descrito como uma estrutura de dados de código fonte  com a particularidade de cada elemento do código fonte permitir acesso ao  histórico das suas alterações, entre outras coisas. -Um repositório git é constituido pelo diretório .git e a *working tree* +Um repositório git é constituído pelo diretório .git e a *working tree*  ### Diretório .git (componente do repositório) @@ -84,6 +88,11 @@ Um *branch* é essencialmente uma referência que aponta para o último *commit*  efetuado. Na medida que são feitos novos commits, esta referência é atualizada  automaticamente e passa a apontar para o commit mais recente. +### *Tag* + +Uma tag é uma marcação em um ponto específico da história. Geralmente as +pessoas usam esta funcionalidade para marcar pontos de release (v2.0, e por aí vai) +  ### *HEAD* e *head* (componentes do diretório .git)  *HEAD* é a referência que aponta para o *branch* em uso. Um repositório só tem @@ -131,10 +140,10 @@ Para visualizar rapidamente o detalhamento de cada comando ou apenas lembrar da  # Ver rapidamente os comandos disponiveis  $ git help -# Ver todos os comandos disponiveis +# Ver todos os comandos disponíveis  $ git help -a -# Usar o *help* para um comando especifico +# Usar o *help* para um comando específico  # git help <comando_aqui>  $ git help add  $ git help commit @@ -149,7 +158,7 @@ do repositório) e o *commit* da *HEAD* atual.  ```bash  # Apresenta o *branch*, arquivos não monitorados, alterações e outras -# difereças +# diferenças  $ git status  # Para aprender mais detalhes sobre git *status* @@ -196,6 +205,29 @@ $ git branch -m myBranchName myNewBranchName  $ git branch myBranchName --edit-description  ``` +### Tag + +Gerencia as *tags* + +```bash +# Listar tags +$ git tag +# Criar uma tag anotada. +# O parâmetro -m define uma mensagem, que é armazenada com a tag. +# Se você não especificar uma mensagem para uma tag anotada, +# o Git vai rodar seu editor de texto para você digitar alguma coisa. +$ git tag -a v2.0 -m 'minha versão 2.0' +# Mostrar informações sobre a tag +# O comando mostra a informação da pessoa que criou a tag, +# a data de quando o commit foi taggeado, +# e a mensagem antes de mostrar a informação do commit. +$ git show v2.0 +# Enviar uma tag para o repositório remoto +$ git push origin v2.0 +# Enviar várias tags para o repositório remoto +$ git push origin --tags +``` +  ### checkout  Atualiza todos os arquivos no diretório do projeto para que fiquem iguais @@ -368,7 +400,7 @@ perigoso quando não há certeza do que se está fazendo.  ```bash  # Restabelece a camada intermediária de registo para o último -# commit (o directório fica sem alterações) +# commit (o diretório fica sem alterações)  $ git reset  # Restabelece a camada intermediária de registo para o último commit, e diff --git a/pt-br/hy-pt.html.markdown b/pt-br/hy-pt.html.markdown index 4230579d..5fa4df75 100644 --- a/pt-br/hy-pt.html.markdown +++ b/pt-br/hy-pt.html.markdown @@ -171,6 +171,6 @@ Este tutorial é apenas uma introdução básica para hy/lisp/python.  Docs Hy: [http://hy.readthedocs.org](http://hy.readthedocs.org) -Repo Hy no Github: [http://github.com/hylang/hy](http://github.com/hylang/hy) +Repo Hy no GitHub: [http://github.com/hylang/hy](http://github.com/hylang/hy)  Acesso ao freenode irc com #hy, hashtag no twitter: #hylang diff --git a/pt-br/java-pt.html.markdown b/pt-br/java-pt.html.markdown index a884f273..db087a5f 100644 --- a/pt-br/java-pt.html.markdown +++ b/pt-br/java-pt.html.markdown @@ -214,42 +214,42 @@ public class LearnJava {              //Iteração feita 10 vezes, fooFor 0->9          }          System.out.println("Valor do fooFor: " + fooFor); -         -        // O Loop For Each  + +        // O Loop For Each          // Itera automaticamente por um array ou lista de objetos.          int[] fooList = {1,2,3,4,5,6,7,8,9};          //estrutura do loop for each => for(<objeto> : <array_de_objeto>)          //lê-se: para cada objeto no array          //nota: o tipo do objeto deve ser o mesmo do array. -         +          for( int bar : fooList ){              //System.out.println(bar);              //Itera 9 vezes e imprime 1-9 em novas linhas          } -         +          // Switch          // Um switch funciona com os tipos de dados: byte, short, char e int          // Ele também funciona com tipos enumerados (vistos em tipos Enum)          // como também a classe String e algumas outras classes especiais          // tipos primitivos: Character, Byte, Short e Integer -        int mes = 3;  -        String mesString;  -        switch (mes){  +        int mes = 3; +        String mesString; +        switch (mes){              case 1: -                    mesString = "Janeiro";  +                    mesString = "Janeiro";                      break;              case 2: -                    mesString = "Fevereiro";  +                    mesString = "Fevereiro";                      break;              case 3: -                    mesString = "Março";  +                    mesString = "Março";                      break;              default: -                    mesString = "Algum outro mês";  +                    mesString = "Algum outro mês";                      break;          }          System.out.println("Resultado do Switch: " + mesString); -         +          // Condição de forma abreviada.          // Você pode usar o operador '?' para atribuições rápidas ou decisões lógicas.          // Lê-se "Se (declaração) é verdadeira, use <primeiro valor> @@ -287,9 +287,9 @@ public class LearnJava {          // Classes e Métodos          /////////////////////////////////////// -        System.out.println("\n->Classes e Métodos");  +        System.out.println("\n->Classes e Métodos"); -        // (segue a definição da classe Bicicleta)  +        // (segue a definição da classe Bicicleta)          // Use o new para instanciar uma classe          Bicicleta caloi = new Bicicleta(); // Objeto caloi criado. @@ -318,9 +318,9 @@ class Bicicleta {      // Atributos/Variáveis da classe Bicicleta.      public int ritmo;          // Public: Pode ser acessada em qualquer lugar. -    private int velocidade;    // Private: Apenas acessível a classe.  +    private int velocidade;    // Private: Apenas acessível a classe.      protected int catraca; // Protected: Acessível a classe e suas subclasses. -    String nome;               // default: Apenas acessível ao pacote.  +    String nome;               // default: Apenas acessível ao pacote.      // Construtores são uma forma de criação de classes      // Este é o construtor padrão. @@ -388,7 +388,7 @@ class Bicicleta {  // Velocipede é uma subclasse de bicicleta.  class Velocipede extends Bicicleta {      // (Velocípedes são bicicletas com rodas dianteiras grandes -    // Elas não possuem catraca.)  +    // Elas não possuem catraca.)      public Velocipede(int ritmoInicial, int velocidadeInicial){          // Chame o construtor do pai (construtor de Bicicleta) com o comando super. @@ -405,6 +405,219 @@ class Velocipede extends Bicicleta {  } +// Interfaces +// Sintaxe de declaração de Interface +// <nível de acesso> Interface <nome-da-interface> extends <super-interfaces> { +// // Constantes +// // Declarações de método +//} + +// Exemplo - Comida: +public interface Comestivel { +    public void comer(); // Qualquer classe que implementa essa interface, deve +                        // Implementar este método. +} + +public interface Digestivel { +    public void digerir(); +} + + +// Agora podemos criar uma classe que implementa ambas as interfaces. +public class Fruta implements Comestivel, Digestivel { + +    @Override +    public void comer() { +        // ... +    } + +    @Override +    public void digerir() { +        // ... +    } +} + +// Em Java, você pode estender somente uma classe, mas você pode implementar muitas +// Interfaces. Por exemplo: +public class ClasseExemplo extends ExemploClassePai implements InterfaceUm, +    InterfaceDois { + +    @Override +    public void InterfaceUmMetodo() { +    } + +    @Override +    public void InterfaceDoisMetodo() { +    } + +} + +// Classes abstratas + +// Sintaxe de declaração de classe abstrata +// <Nível de acesso> abstract <nome-da-classe-abstrata> extends <estende super-abstratas-classes> { +// // Constantes e variáveis +// // Declarações de método +//} + +// Marcar uma classe como abstrata significa que ela contém métodos abstratos que devem +// ser definido em uma classe filha. Semelhante às interfaces, classes abstratas não podem +// ser instanciadas, ao invés disso devem ser extendidas e os métodos abstratos +// definidos. Diferente de interfaces, classes abstratas podem conter uma mistura de +// métodos concretos e abstratos. Métodos em uma interface não podem ter um corpo, +// a menos que o método seja estático, e as variáveis sejam finais, por padrão, ao contrário de um +// classe abstrata. Classes abstratas também PODEM ter o método "main". + +public abstract class Animal +{ +    public abstract void fazerSom(); + +    // Método pode ter um corpo +    public void comer() +    { +        System.out.println("Eu sou um animal e estou comendo.");   +        //Nota: Nós podemos acessar variáveis privadas aqui. +        idade = 30; +    } + +    // Não há necessidade de inicializar, no entanto, em uma interface +    // a variável é implicitamente final e, portanto, tem +    // de ser inicializado. +    protected int idade; + +    public void mostrarIdade() +    { +        System.out.println(idade);   +    } + +    //Classes abstratas podem ter o método main. +    public static void main(String[] args) +    { +        System.out.println("Eu sou abstrata"); +    } +} + +class Cachorro extends Animal +{ + +    // Nota: ainda precisamos substituir os métodos abstratos na +    // classe abstrata +    @Override +    public void fazerSom() +    { +        System.out.println("Bark"); +        // idade = 30;    ==> ERRO!  idade é privada de Animal +    } + +    // NOTA: Você receberá um erro se usou a +    // anotação Override aqui, uma vez que java não permite +    // sobrescrita de métodos estáticos. +    // O que está acontecendo aqui é chamado de "esconder o método". +    // Vejá também este impressionante SO post: http://stackoverflow.com/questions/16313649/ +    public static void main(String[] args) +    { +        Cachorro pluto = new Cachorro(); +        pluto.fazerSom(); +        pluto.comer(); +        pluto.mostrarIdade(); +    } +} + +// Classes Finais + +// Sintaxe de declaração de classe final +// <nível de acesso> final <nome-da-classe-final> { +// // Constantes e variáveis +// // Declarações de método +//} + +// Classes finais são classes que não podem ser herdadas e são, portanto, um +// filha final. De certa forma, as classes finais são o oposto de classes abstratas +// Porque classes abstratas devem ser estendidas, mas as classes finais não pode ser +// estendidas. +public final class TigreDenteDeSabre extends Animal +{ +    // Nota: Ainda precisamos substituir os métodos abstratos na +     // classe abstrata. +    @Override +    public void fazerSom(); +    { +        System.out.println("Roar"); +    } +} + +// Métodos Finais +public abstract class Mamifero() +{ +    // Sintaxe de Métodos Finais: +    // <modificador-de-acesso> final <tipo-de-retorno> <nome-do-método>(<argumentos>) + +    // Métodos finais, como, classes finais não podem ser substituídas por uma classe filha, +    // e são, portanto, a implementação final do método. +    public final boolean EImpulsivo() +    { +        return true; +    } +} + + +// Tipo Enum +// +// Um tipo enum é um tipo de dado especial que permite a uma variável ser um conjunto de constantes predefinidas. A  +// variável deve ser igual a um dos valores que foram previamente definidos para ela. +// Por serem constantes, os nomes dos campos de um tipo de enumeração estão em letras maiúsculas. +// Na linguagem de programação Java, você define um tipo de enumeração usando a palavra-chave enum. Por exemplo, você poderia +// especificar um tipo de enum dias-da-semana como: + +public enum Dia { +    DOMINGO, SEGUNDA, TERÇA, QUARTA, +    QUINTA, SEXTA, SABADO  +} + +// Nós podemos usar nosso enum Dia assim: + +public class EnumTeste { + +    // Variável Enum +    Dia dia; + +    public EnumTeste(Dia dia) { +        this.dia = dia; +    } + +    public void digaComoE() { +        switch (dia) { +            case SEGUNDA: +                System.out.println("Segundas são ruins."); +                break; + +            case SEXTA: +                System.out.println("Sextas são melhores."); +                break; + +            case SABADO:  +            case DOMINGO: +                System.out.println("Finais de semana são os melhores."); +                break; + +            default: +                System.out.println("Dias no meio da semana são mais ou menos."); +                break; +        } +    } + +    public static void main(String[] args) { +        EnumTeste primeiroDia = new EnumTeste(Dia.SEGUNDA); +        primeiroDia.digaComoE(); // => Segundas-feiras são ruins. +        EnumTeste terceiroDia = new EnumTeste(Dia.QUARTA); +        terceiroDia.digaComoE(); // => Dias no meio da semana são mais ou menos. +    } +} + +// Tipos Enum são muito mais poderosos do que nós mostramos acima. +// O corpo de um enum pode incluir métodos e outros campos. +// Você pode ver mais em https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html +  ```  ## Leitura Recomendada @@ -413,11 +626,11 @@ Os links fornecidos aqui abaixo são apenas para ter uma compreensão do tema, u  Outros tópicos para pesquisar: -* [Tutorial Java para Sun Trail / Oracle](http://docs.oracle.com/javase/tutorial/index.html)  +* [Tutorial Java para Sun Trail / Oracle](http://docs.oracle.com/javase/tutorial/index.html)  * [Modificadores de acesso do Java](http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html) -* [Coceitos de Programação Orientada à Objetos](http://docs.oracle.com/javase/tutorial/java/concepts/index.html):  +* [Coceitos de Programação Orientada à Objetos](http://docs.oracle.com/javase/tutorial/java/concepts/index.html):      * [Herança](http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html)      * [Polimorfismo](http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html)      * [Abstração](http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) @@ -433,3 +646,9 @@ Outros tópicos para pesquisar:  Livros:  * [Use a cabeça, Java] (http://www.headfirstlabs.com/books/hfjava/) + +Apostila: + +* [Java e Orientação a Objetos] (http://www.caelum.com.br/apostila-java-orientacao-objetos/) + +* [Java para Desenvolvimento Web] (https://www.caelum.com.br/apostila-java-web/) diff --git a/pt-br/javascript-pt.html.markdown b/pt-br/javascript-pt.html.markdown index 406042fa..e337f4bc 100644 --- a/pt-br/javascript-pt.html.markdown +++ b/pt-br/javascript-pt.html.markdown @@ -197,7 +197,6 @@ myObj.myFourthKey; // = undefined  // A sintaxe para essa seção é quase idêntica a maioria das linguagens. -// The `if` structure works as you'd expect.  // A estrutura `if` funciona como deveria ser.  var count = 1  if (count == 3){ @@ -219,9 +218,6 @@ do {      input = getInput();  } while (!isValid(input)) -// The `for` loop is the same as C and Java: -// initialisation; continue condition; iteration. -  // O loop `for` é o mesmo de C e Java:  // inicialização, condição para continuar; iteração  for (var i = 0; i < 5; i++){ @@ -436,7 +432,6 @@ var myPrototype = {  myObj.__proto__ = myPrototype;  myObj.meaningOfLife; // = 42 -// This works for functions, too.  // Isto funciona para funções, também.  myObj.myFunc(); // = "olá mundo!" @@ -506,7 +501,7 @@ String.prototype.firstCharacter = function(){  // Havíamos mencionado que `Object.create` não estava ainda disponível em   // todos as implementações, mas nós podemos usá-lo com esse polyfill: -if (Object.create === undefined){ // don't overwrite it if it exists +if (Object.create === undefined){ // Não o sobrescreve se já existir      Object.create = function(proto){          // faz um construtor temporário com o prototype certo          var Constructor = function(){}; @@ -520,13 +515,13 @@ if (Object.create === undefined){ // don't overwrite it if it exists  ## Leitura Adicional  O [Mozilla Developer -Network](https://developer.mozilla.org/en-US/docs/Web/JavaScript) dispõe de uma +Network](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript) dispõe de uma  excelente documentação sobre Javascript e seu uso nos browsers. E mais,   é uma wiki, portanto conforme você vai aprendendo, mais você pode ir ajudando  os outros compartilhando do seu conhecimento.  [Uma re-introdução do JavaScript pela MDN] -(https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript) +(https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/A_re-introduction_to_JavaScript)  cobre muito dos conceitos abordados aqui em mais detalhes. Este guia fala  somente sobre a linguagem JavaScript em si; se você quiser aprender mais  sobre e como usar o JavaScript em páginas na web, comece aprendendo sobre @@ -543,5 +538,5 @@ profundo de todas as partes do JavaScript.  / livro de referência.   Parte desse artigo foi adaptado do tutorial de Python do Louie Dinh que está -nesse site e do [Tutorial de JS](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript) +nesse site e do [Tutorial de JS](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/A_re-introduction_to_JavaScript)  da Mozilla Developer Network. diff --git a/pt-br/json-pt.html.markdown b/pt-br/json-pt.html.markdown index e4f10a61..fd822c03 100644 --- a/pt-br/json-pt.html.markdown +++ b/pt-br/json-pt.html.markdown @@ -3,6 +3,7 @@ language: json  contributors:    - ["Anna Harren", "https://github.com/iirelu"]    - ["Marco Scannadinari", "https://github.com/marcoms"] +  - ["Francisco Marques", "https://github.com/ToFran"]  translators:    - ["Miguel Araújo", "https://github.com/miguelarauj1o"]  lang: pt-br @@ -12,10 +13,16 @@ filename: learnjson-pt.json  Como JSON é um formato de intercâmbio de dados, este será, muito provavelmente, o  "Learn X in Y minutes" mais simples existente. -JSON na sua forma mais pura não tem comentários em reais, mas a maioria dos analisadores  -aceitarão comentários no estilo C (//, /\* \*/). Para os fins do presente, no entanto,  -tudo o que é vai ser 100% JSON válido. Felizmente, isso meio que fala por si. +JSON na sua forma mais pura não tem comentários, mas a maioria dos analisadores  +aceitarão comentários no estilo C (//, /\* \*/). No entanto estes devem ser evitados para otimizar a compatibilidade. +Um valor JSON pode ser um numero, uma string, um array, um objeto, um booleano (true, false) ou null. + +Os browsers suportados são: Firefox 3.5+, Internet Explorer 8.0+, Chrome 1.0+, Opera 10.0+, e Safari 4.0+. + +A extensão dos ficheiros JSON é “.json” e o tipo de mídia de Internet (MIME) é “application/json”. + +Mais informação em: http://www.json.org/  ```json  { @@ -57,6 +64,6 @@ tudo o que é vai ser 100% JSON válido. Felizmente, isso meio que fala por si.    , "outro comentário": "que bom"    }, -  "que foi curto": "E, você está feito. Você já sabe tudo que JSON tem para oferecer.". +  "que foi curto": "E, você está feito. Você já sabe tudo que JSON tem para oferecer."  }  ``` diff --git a/pt-br/markdown-pt.html.markdown b/pt-br/markdown-pt.html.markdown index 4030ce3c..f22093f9 100644 --- a/pt-br/markdown-pt.html.markdown +++ b/pt-br/markdown-pt.html.markdown @@ -56,7 +56,7 @@ __E este também está._  *--Danouse! Este também__*  <!-- Em GitHub Flavored Markdown, que é usado para processar arquivos Markdown  -Github, nós também temos: -->  +GitHub, nós também temos: -->   ~~Este texto é processado com tachado.~~ @@ -148,7 +148,7 @@ dentro do seu código -->  John não sabia nem o que o função 'goto()' fazia! -<!-- Em Github Flavored Markdown, você pode usar uma sintaxe especial para o código --> +<!-- Em GitHub Flavored Markdown, você pode usar uma sintaxe especial para o código -->  \`\`\`ruby <!-- exceto remover essas barras invertidas quando você faz isso, apenas ```  ruby! -->  @@ -157,7 +157,7 @@ def foobar  end  \`\`\` <!-- Aqui também, não barras invertidas, apenas ``` --> -<-- O texto acima não requer recuo, mas o Github vai usar a sintaxe  +<-- O texto acima não requer recuo, mas o GitHub vai usar a sintaxe   destacando do idioma que você especificar após a ``` -->  <!-- Regra Horizontal (<hr />) -->  @@ -230,7 +230,7 @@ Quero digitar * Este texto entre asteriscos *, mas eu não quero que ele seja  em itálico, então eu faço o seguinte: \*Este texto entre asteriscos \*.  <!-- Tabelas -->  -<!-- Tabelas estão disponíveis apenas no Github Flavored Markdown e são ligeiramente  +<!-- Tabelas estão disponíveis apenas no GitHub Flavored Markdown e são ligeiramente   complicadas, mas se você realmente quer: -->  | Col1         | Col2     | Col3          | diff --git a/pt-br/paren-pt.html.markdown b/pt-br/paren-pt.html.markdown new file mode 100644 index 00000000..464a69d2 --- /dev/null +++ b/pt-br/paren-pt.html.markdown @@ -0,0 +1,196 @@ +--- +language: Paren +filename: learnparen-pt.paren +contributors: +  - ["KIM Taegyoon", "https://github.com/kimtg"] +translators: +    - ["Claudson Martins", "https://github.com/claudsonm"] +lang: pt-br +--- + +[Paren](https://bitbucket.org/ktg/paren) é um dialeto do Lisp. É projetado para ser uma linguagem embutida. + +Alguns exemplos foram retirados de <http://learnxinyminutes.com/docs/racket/>. + +```scheme +;;; Comentários +# Comentários + +;; Comentários de única linha começam com um ponto e vírgula ou cerquilha + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 1. Tipos de Dados Primitivos e Operadores +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; Números +123 ; inteiro +3.14 ; double +6.02e+23 ; double +(int 3.14) ; => 3 : inteiro +(double 123) ; => 123 : double + +;; O uso de funções é feito da seguinte maneira (f x y z ...) +;; onde f é uma função e x, y, z, ... são os operandos +;; Se você quiser criar uma lista literal de dados, use (quote) para impedir +;; que sejam interpretados +(quote (+ 1 2)) ; => (+ 1 2) +;; Agora, algumas operações aritméticas +(+ 1 1)  ; => 2 +(- 8 1)  ; => 7 +(* 10 2) ; => 20 +(^ 2 3) ; => 8 +(/ 5 2) ; => 2 +(% 5 2) ; => 1 +(/ 5.0 2) ; => 2.5 + +;;; Booleanos +true ; para verdadeiro +false ; para falso +(! true) ; => falso +(&& true false (prn "não chega aqui")) ; => falso +(|| false true (prn "não chega aqui")) ; => verdadeiro + +;;; Caracteres são inteiros. +(char-at "A" 0) ; => 65 +(chr 65) ; => "A" + +;;; Strings são arrays de caracteres de tamanho fixo. +"Olá, mundo!" +"Sebastião \"Tim\" Maia"   ; Contra-barra é um caractere de escape +"Foo\tbar\r\n" ; Inclui os escapes da linguagem C: \t \r \n + +;; Strings podem ser concatenadas também! +(strcat "Olá " "mundo!") ; => "Olá mundo!" + +;; Uma string pode ser tratada como uma lista de caracteres +(char-at "Abacaxi" 0) ; => 65 + +;; A impressão é muito fácil +(pr "Isso é" "Paren. ") (prn "Prazer em conhecê-lo!") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 2. Variáveis +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Você pode criar ou definir uma variável usando (set) +;; o nome de uma variável pode conter qualquer caracter, exceto: ();#" +(set alguma-variavel 5) ; => 5 +alguma-variavel ; => 5 + +;; Acessar uma variável ainda não atribuída gera uma exceção +; x ; => Unknown variable: x : nil + +;; Ligações locais: Utiliza cálculo lambda!  +;; 'a' e 'b' estão ligados a '1' e '2' apenas dentro de (fn ...) +((fn (a b) (+ a b)) 1 2) ; => 3 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 3. Coleções +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; Listas + +;; Listas são estruturas de dados semelhantes a vetores. (A classe de comportamento é O(1).) +(cons 1 (cons 2 (cons 3 (list)))) ; => (1 2 3) +;; 'list' é uma variação conveniente para construir listas +(list 1 2 3) ; => (1 2 3) +;; Um quote também pode ser usado para uma lista de valores literais +(quote (+ 1 2)) ; => (+ 1 2) + +;; Você ainda pode utilizar 'cons' para adicionar um item ao início da lista +(cons 0 (list 1 2 3)) ; => (0 1 2 3) + +;; Listas são um tipo muito básico, portanto existe *enorme* funcionalidade +;; para elas, veja alguns exemplos: +(map inc (list 1 2 3))          ; => (2 3 4) +(filter (fn (x) (== 0 (% x 2))) (list 1 2 3 4))    ; => (2 4) +(length (list 1 2 3 4))     ; => 4 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 3. Funções +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Use 'fn' para criar funções. +;; Uma função sempre retorna o valor de sua última expressão +(fn () "Olá Mundo") ; => (fn () Olá Mundo) : fn + +;; Use parênteses para chamar todas as funções, incluindo uma expressão lambda +((fn () "Olá Mundo")) ; => "Olá Mundo" + +;; Atribuir uma função a uma variável +(set ola-mundo (fn () "Olá Mundo")) +(ola-mundo) ; => "Olá Mundo" + +;; Você pode encurtar isso utilizando a definição de função açúcar sintático: +(defn ola-mundo2 () "Olá Mundo") + +;; Os () acima é a lista de argumentos para a função +(set ola +  (fn (nome) +    (strcat "Olá " nome))) +(ola "Steve") ; => "Olá Steve" + +;; ... ou equivalente, usando a definição açucarada: +(defn ola2 (nome) +  (strcat "Olá " name)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 4. Igualdade +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Para números utilize '==' +(== 3 3.0) ; => verdadeiro +(== 2 1) ; => falso + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 5. Controle de Fluxo +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; Condicionais + +(if true 				; Testa a expressão +    "isso é verdade"	; Então expressão +    "isso é falso") 	; Senão expressão +; => "isso é verdade" + +;;; Laços de Repetição + +;; O laço for é para número +;; (for SÍMBOLO INÍCIO FIM SALTO EXPRESSÃO ..) +(for i 0 10 2 (pr i "")) ; => Imprime 0 2 4 6 8 10 +(for i 0.0 10 2.5 (pr i "")) ; => Imprime 0 2.5 5 7.5 10 + +;; Laço while +((fn (i) +  (while (< i 10) +    (pr i) +    (++ i))) 0) ; => Imprime 0123456789 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 6. Mutação +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Use 'set' para atribuir um novo valor a uma variável ou local +(set n 5) ; => 5 +(set n (inc n)) ; => 6 +n ; => 6 +(set a (list 1 2)) ; => (1 2) +(set (nth 0 a) 3) ; => 3 +a ; => (3 2) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 7. Macros +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Macros lhe permitem estender a sintaxe da linguagem. +;; Os macros no Paren são fáceis. +;; Na verdade, (defn) é um macro. +(defmacro setfn (nome ...) (set nome (fn ...))) +(defmacro defn (nome ...) (def nome (fn ...))) + +;; Vamos adicionar uma notação infixa +(defmacro infix (a op ...) (op a ...)) +(infix 1 + 2 (infix 3 * 4)) ; => 15 + +;; Macros não são higiênicos, você pode sobrescrever as variáveis já existentes! +;; Eles são transformações de códigos. +``` diff --git a/pt-br/php-pt.html.markdown b/pt-br/php-pt.html.markdown index 0e710742..8a1c956e 100644 --- a/pt-br/php-pt.html.markdown +++ b/pt-br/php-pt.html.markdown @@ -7,7 +7,7 @@ translators:      - ["Abdala Cerqueira", "http://abda.la"]      - ["Raquel Diniz", "http://twitter.com/raquelrdiniz"]  lang: pt-br -filename: learnphp-pt.php +filename: php-pt.html.markdown  ---  Este documento descreve PHP 5+. @@ -20,21 +20,23 @@ Este documento descreve PHP 5+.  // Duas barras iniciam o comentário de uma linha. -# O hash (aka pound symbol) também inicia, mas // é mais comum +# O hash (aka pound symbol) também inicia, mas // é mais comum.  /*       O texto envolto por barra-asterisco e asterisco-barra -     faz um comentário de múltiplas linhas +     faz um comentário de múltiplas linhas.  */ -// Utilize "echo" ou "print" para imprimir a saída -print('Olá '); // Imprime "Olá " sem quebra de linha +// Utilize "echo" ou "print" para imprimir a saída. +print('Olá '); // Imprime "Olá " sem quebra de linha. +print 'Olá '; // Não tem a necessidade de utilizar as chaves.  // () são opcionais para print e echo -echo "Mundo\n"; // Imprime "Mundo" com quebra de linha -// (Todas as declarações devem terminar com um ponto e vírgula) +echo "Mundo\n"; // Imprime "Mundo" com quebra de linha. +echo ("Mundo\n"); // Podemos tambem utilizar com chaves no echo. +// (Todas as declarações devem terminar com um ponto e vírgula.) -// Qualquer coisa fora da tag <?php é impresso automaticamente +// Qualquer coisa fora da tag <?php é impresso automaticamente.  ?>  Olá mundo novamente!  <?php @@ -48,7 +50,7 @@ Olá mundo novamente!  // Um nome de variável válido se inicia com uma letra ou sublinhado,  // seguido por qualquer quantidade de letras, números ou sublinhados. -// Valores booleanos não diferenciam maiúsculo de minúsculo (case-insensitive) +// Valores booleanos não diferenciam maiúsculo de minúsculo (case-insensitive).  $boolean = true;  // ou TRUE ou True  $boolean = false; // ou FALSE ou False @@ -63,8 +65,8 @@ $float = 1.234;  $float = 1.2e3;  $float = 7E-10; -// Excluir variável -unset($int1) +// Excluir variável. +unset($int1);  // Aritmética  $soma      = 1 + 1; // 2 @@ -79,17 +81,19 @@ echo $numero++;    // Imprime 1 (incrementa após a avaliação)  echo ++$numero;    // Imprime 3 (incrementa antes da avaliação)  $numero /= $float; // Divide e atribui o quociente de $numero -// Strings podem ser colocadas entre aspas simples +// Strings podem ser colocadas entre aspas simples.  $sgl_quotes = '$String'; // => '$String'  // Evite o uso de aspas duplas, exceto para incorporar outras variáveis  $dbl_quotes = "Esta é uma $sgl_quotes."; // => 'Esta é uma $String.' -// Os caracteres especiais só são escapados entre aspas duplas -$escapado    = "Este contém um \t caractere tab."; -$naoescapado = 'Este contém somente a barra e o t: \t'; +// Os caracteres especiais só são escapados entre aspas duplas. +$escapado    = "Este contém um \t caractere tab.";  +echo $escapado; //Imprime: Este contém um     caractere tab. +$naoescapado = 'Este contém somente a barra e o t: \t';  +echo $naoescapado; //Imprime: Este contém somente a barra e o t: \t -// Coloque uma variável entre chaves se necessário +// Coloque uma variável entre chaves se necessário.  $dinheiro = "Eu tenho $${numero} no banco.";  // Desde o PHP 5.3, nowdocs podem ser usados para múltiplas linhas sem análise @@ -105,7 +109,7 @@ $sgl_quotes  FIM;  // Concatenação de string é feita com . -echo 'Esta string ' . 'é concatenada'; +echo 'Esta string ' . 'é concatenada'; //Imprime: 'Esta string é concatenada'  /******************************** @@ -120,7 +124,7 @@ echo 'Esta string ' . 'é concatenada';  define("FOO",     "alguma coisa");  // Acesso a uma constante é possível usando diretamente o nome escolhido -echo 'Isto sairá '.FOO; +echo 'Isto sairá '.FOO; //Imprime: Isto sairá alguma coisa  /******************************** @@ -135,16 +139,16 @@ $associativo = array('Um' => 1, 'Dois' => 2, 'Tres' => 3);  // PHP 5.4 introduziu uma nova sintaxe  $associativo = ['Um' => 1, 'Dois' => 2, 'Tres' => 3]; -echo $associativo['Um']; // imprime 1 +echo $associativo['Um']; // Imprime 1.  // Uma lista de literais atribui chaves inteiras implicitamente  $array = ['Um', 'Dois', 'Tres']; -echo $array[0]; // => "Um" +echo $array[0]; // Imprime => "Um"  // Adiciona um elemento no final do array  $array[] = 'Quatro'; -// Remove um elemento do array +// Remove um elemento do array.  unset($array[3]);  /******************************** @@ -155,12 +159,12 @@ echo('Olá Mundo!');  // Imprime Olá Mundo! para stdout.  // Stdout é uma página web se executado em um navegador. -print('Olá Mundo!'); // O mesmo que o echo +print('Olá Mundo!'); // O mesmo que o echo.  // echo é atualmente um construtor de linguagem, então você pode   // remover os parênteses. -echo 'Olá Mundo!'; -print 'Olá Mundo!'; // O print também é +echo 'Olá Mundo!'; // Imprime: Olá Mundo! +print 'Olá Mundo!'; // O print também é - Imprime: Olá Mundo!   $paragrafo = 'parágrafo'; @@ -181,11 +185,11 @@ $z = &$y;  // $z irá mudar o valor de $y também, e vice-versa.  // $x irá permanecer inalterado com o valor original de $y -echo $x; // => 2 -echo $z; // => 2 +echo $x; // Imprime => 2 +echo $z; // Imprime => 2  $y = 0; -echo $x; // => 2 -echo $z; // => 0 +echo $x; // Imprime => 2 +echo $z; // Imprime => 0  // Despeja tipos e valores de variável para o stdout  var_dump($z); // imprime int(0) @@ -222,13 +226,13 @@ assert(1 !== '1');  // As variáveis podem ser convertidas entre tipos, dependendo da sua utilização.  $inteiro = 1; -echo $inteiro + $inteiro; // => 2 +echo $inteiro + $inteiro; // Imprime => 2  $string = '1'; -echo $string + $string; // => 2 (strings são coagidas para inteiros) +echo $string + $string; // Imprime => 2 (strings são coagidas para inteiros)  $string = 'one'; -echo $string + $string; // => 0 +echo $string + $string; // Imprime => 0  // Imprime 0 porque o operador + não pode fundir a string 'um' para um número  // Tipo de fundição pode ser utilizado para tratar uma variável  diff --git a/pt-br/python3-pt.html.markdown b/pt-br/python3-pt.html.markdown new file mode 100644 index 00000000..c5a3c020 --- /dev/null +++ b/pt-br/python3-pt.html.markdown @@ -0,0 +1,746 @@ +--- +language: python3 +contributors: +    - ["Louie Dinh", "http://pythonpracticeprojects.com"] +    - ["Steven Basart", "http://github.com/xksteven"] +    - ["Andre Polykanine", "https://github.com/Oire"] +    - ["Zachary Ferguson", "http://github.com/zfergus2"] +translators: +    - ["Paulo Henrique Rodrigues Pinheiro", "http://www.sysincloud.it"] +language: pt-br +filename: learnpython3-pt.py +--- + +Python foi criado por Guido Van Rossum nos anos 1990. Ele é atualmente uma +das mais populares linguagens em existência. Eu fiquei morrendo de amor +pelo Python por sua clareza sintática. É praticamente pseudocódigo executável. + +Suas opiniões são grandemente apreciadas. Você pode encontrar-me em +[@louiedinh](http://twitter.com/louiedinh) ou louiedinh [em] +[serviço de e-mail do google]. + +Observação: Este artigo trata de Python 3 especificamente. Verifique +[aqui](http://learnxinyminutes.com/docs/pt-br/python-pt/) se você pretende +aprender o velho Python 2.7. + +```python + +# Comentários em uma única linha começam com uma cerquilha (também conhecido por sustenido). + +""" Strings de várias linhas podem ser escritas +    usando três ", e são comumente usadas +    como comentários. +""" + +#################################################### +## 1. Tipos de dados primitivos e operadores +#################################################### + +# Você usa números normalmente +3  # => 3 + +# Matemática é como você espera que seja +1 + 1   # => 2 +8 - 1   # => 7 +10 * 2  # => 20 + +# Números inteiros por padrão, exceto na divisão, que retorna número +# de ponto flutuante (float). +35 / 5  # => 7.0 + +# O resultado da divisão inteira arredonda para baixo tanto para números +# positivos como para negativos. +5 // 3       # => 1 +5.0 // 3.0   # => 1.0 # funciona em float também +-5 // 3      # => -2 +-5.0 // 3.0  # => -2.0 + +# Quando você usa um float, o resultado é float. +3 * 2.0  # => 6.0 + +# operador módulo +7 % 3  # => 1 + +# Exponenciação (x**y, x elevado à potência y) +2**4  # => 16 + +# Determine a precedência usando parêntesis +(1 + 3) * 2  # => 8 + +# Valores lógicos são primitivos (Atenção à primeira letra maiúscula) +True +False + +# negação lógica com not +not True   # => False +not False  # => True + +# Operadores lógicos +# Observe que "and" e "or" são sensíveis a maiúsculas e minúsculas +True and False  # => False +False or True   # => True + +# Observe a utilização de operadores lógicos com números inteiros +0 and 2     # => 0 +-5 or 0     # => -5 +0 == False  # => True +2 == True   # => False +1 == True   # => True + +# Igualdade é == +1 == 1  # => True +2 == 1  # => False + +# Diferença é != +1 != 1  # => False +2 != 1  # => True + +# Mais comparações +1 < 10  # => True +1 > 10  # => False +2 <= 2  # => True +2 >= 2  # => True + +# Comparações podem ser agrupadas +1 < 2 < 3  # => True +2 < 3 < 2  # => False + +# (operador 'is' e operador '==') is verifica se duas referenciam um +# mesmo objeto, mas == verifica se as variáveis apontam para o +# mesmo valor. +a = [1, 2, 3, 4]  # Referência a uma nova lista, [1, 2, 3, 4] +b = a             # b referencia o que está referenciado por a +b is a            # => True, a e b referenciam o mesmo objeto +b == a            # => True, objetos a e b tem o mesmo conteúdo +b = [1, 2, 3, 4]  # Referência a uma nova lista, [1, 2, 3, 4] +b is a            # => False, a e b não referenciam o mesmo objeto +b == a            # => True, objetos a e b tem o mesmo conteúdo + +# Strings são criadas com " ou ' +"Isto é uma string." +'Isto também é uma string.' + +# Strings também podem ser somadas! Mas tente não fazer isso. +"Olá " + "mundo!"  # => "Olá mundo!" +# Strings podem ser somadas sem usar o '+' +"Olá " "mundo!"    # => "Olá mundo!" + +# Uma string pode ser manipulada como se fosse uma lista de caracteres +"Isso é uma string"[0]  # => 'I' + +# .format pode ser usado para formatar strings, dessa forma: +"{} podem ser {}".format("Strings", "interpoladas")  # => "Strings podem ser interpoladas" + +# Você pode repetir os argumentos para digitar menos. +"Seja ágil {0}, seja rápido {0}, salte sobre o {1} {0}".format("Jack", "castiçal") +# => "Seja ágil Jack, seja rápido Jack, salte sobre o castiçal Jack." + +# Você pode usar palavras-chave se quiser contar. +"{nome} quer comer {comida}".format(nome="Beto", comida="lasanha")  # => "Beto quer comer lasanha" + +# Se você precisa executar seu código Python3 com um interpretador Python 2.5 ou acima, você pode usar a velha forma para formatação de texto: +"%s podem ser %s da forma %s" % ("Strings", "interpoladas", "antiga")  # => "Strings podem ser interpoladas da forma antiga" + + +# None é um objeto +None  # => None + +# Não use o operador de igualdade "==" para comparar objetos com None +# Use "is" para isso. Ele checará pela identidade dos objetos. +"etc" is None  # => False +None is None   # => True + +# None, 0, e strings/listas/dicionários vazios todos retornam False. +# Qualquer outra coisa retorna True +bool(0)   # => False +bool("")  # => False +bool([])  # => False +bool({})  # => False + + +#################################################### +## 2. Variáveis e coleções +#################################################### + +# Python tem uma função print +print("Eu sou o Python. Prazer em conhecer!")  # => Eu sou o Python. Prazer em conhecer! + +# Por padrão a função print também imprime o caractere de nova linha ao final. +# Use o argumento opcional end para mudar o caractere final. +print("Olá, Mundo", end="!")  # => Olá, Mundo! + +# Forma simples para capturar dados de entrada via console +input_string_var = input("Digite alguma coisa: ") # Retorna o que foi digitado em uma string +# Observação: Em versões antigas do Python, o método input() era chamado raw_input() + +# Não é necessário declarar variáveis antes de iniciá-las +# È uma convenção usar letras_minúsculas_com_sublinhados +alguma_variavel = 5 +alguma_variavel  # => 5 + +# Acessar uma variável que não tenha sido inicializada gera uma exceção. +# Veja Controle de Fluxo para aprender mais sobre tratamento de exceções. +alguma_variavel_nao_inicializada  # Gera a exceção NameError + +# Listas armazenam sequencias +li = [] +# Você pode iniciar com uma lista com alguns valores +outra_li = [4, 5, 6] + +# Adicionar conteúdo ao fim da lista com append +li.append(1)    # li agora é [1] +li.append(2)    # li agora é [1, 2] +li.append(4)    # li agora é [1, 2, 4] +li.append(3)    # li agora é [1, 2, 4, 3] +# Remover do final da lista com pop +li.pop()        # => 3 e agora li é [1, 2, 4] +# Vamos colocá-lo lá novamente! +li.append(3)    # li agora é [1, 2, 4, 3] novamente. + +# Acessar uma lista da mesma forma que você faz com um array +li[0]   # => 1 +# Acessa o último elemento +li[-1]  # => 3 + +# Acessando além dos limites gera um IndexError +li[4]  # Gera o IndexError + +# Você pode acessar vários elementos com a sintaxe de limites +# (É um limite fechado, aberto pra você que gosta de matemática.) +li[1:3]   # => [2, 4] +# Omitindo o final +li[2:]    # => [4, 3] +# Omitindo o início +li[:3]    # => [1, 2, 4] +# Selecione cada segunda entrada +li[::2]   # => [1, 4] +# Tenha uma cópia em ordem invertida da lista +li[::-1]  # => [3, 4, 2, 1] +# Use qualquer combinação dessas para indicar limites complexos +# li[inicio:fim:passo] + +# Faça uma cópia profunda de um nível usando limites +li2 = li[:]  # => li2 = [1, 2, 4, 3] mas (li2 is li) resultará em False. + +# Apague elementos específicos da lista com "del" +del li[2]  # li agora é [1, 2, 3] + +# Você pode somar listas +# Observação: valores em li e other_li não são modificados. +li + other_li  # => [1, 2, 3, 4, 5, 6] + +# Concatene listas com "extend()" +li.extend(other_li)  # Agora li é [1, 2, 3, 4, 5, 6] + +# Verifique se algo existe na lista com "in" +1 in li  # => True + +# Examine  tamanho com "len()" +len(li)  # => 6 + + +# Tuplas são como l istas, mas imutáveis. +tup = (1, 2, 3) +tup[0]      # => 1 +tup[0] = 3  # Gera um TypeError + +# Observe que uma tupla de tamanho um precisa ter uma vírgula depois do +# último elemento mas tuplas de outros tamanhos, mesmo vazias, não precisa,. +type((1))   # => <class 'int'> +type((1,))  # => <class 'tuple'> +type(())    # => <class 'tuple'> + +# Você pode realizar com tuplas a maior parte das operações que faz com listas +len(tup)         # => 3 +tup + (4, 5, 6)  # => (1, 2, 3, 4, 5, 6) +tup[:2]          # => (1, 2) +2 in tup         # => True + +# Você pode desmembrar tuplas (ou listas) em variáveis. +a, b, c = (1, 2, 3)  # a é 1, b é 2 e c é 3 +# Por padrão, tuplas são criadas se você não coloca parêntesis. +d, e, f = 4, 5, 6 +# Veja como é fácil permutar dois valores +e, d = d, e  # d é 5, e é 4 + +# Dicionários armazenam mapeamentos +empty_dict = {} +# Aqui está um dicionário preenchido na definição da referência +filled_dict = {"um": 1, "dois": 2, "três": 3} + +# Observe que chaves para dicionários devem ser tipos imutáveis. Isto é para +# assegurar que a chave pode ser convertida para uma valor hash constante para +# buscas rápidas. +# Tipos imutáveis incluem inteiros, flotas, strings e tuplas. +invalid_dict = {[1,2,3]: "123"}  # => Gera um TypeError: unhashable type: 'list' +valid_dict = {(1,2,3):[1,2,3]}   # Já os valores, podem ser de qualquer tipo. + +# Acesse valores com [] +filled_dict["um"]  # => 1 + +# Acesse todas as chaves como um iterável com "keys()". É necessário encapsular +# a chamada com um list() para transformá-las em uma lista. Falaremos sobre isso +# mais adiante. Observe que a ordem de uma chave de dicionário não é garantida. +# Por isso, os resultados aqui apresentados podem não ser exatamente como os +# aqui apresentados. +list(filled_dict.keys())  # => ["três", "dois", "um"] + + +# Acesse todos os valores de um iterável com "values()". Novamente, é +# necessário encapsular ele com list() para não termos um iterável, e sim os +# valores. Observe que, como foi dito acima, a ordem dos elementos não é +# garantida. +list(filled_dict.values())  # => [3, 2, 1] + + +# Verifique a existência de chaves em um dicionário com "in" +"um" in filled_dict  # => True +1 in filled_dict      # => False + +# Acessar uma chave inexistente gera um KeyError +filled_dict["quatro"]  # KeyError + +# Use o método "get()" para evitar um KeyError +filled_dict.get("um")      # => 1 +filled_dict.get("quatro")     # => None +# O método get permite um parâmetro padrão para quando não existir a chave +filled_dict.get("um", 4)   # => 1 +filled_dict.get("quatro", 4)  # => 4 + +# "setdefault()" insere em dicionário apenas se a dada chave não existir +filled_dict.setdefault("cinco", 5)  # filled_dict["cinco"] tem valor 5 +filled_dict.setdefault("cinco", 6)  # filled_dict["cinco"] continua 5 + +# Inserindo em um dicionário +filled_dict.update({"quatro":4})  # => {"um": 1, "dois": 2, "três": 3, "quatro": 4} +#filled_dict["quatro"] = 4        #outra forma de inserir em um dicionário + +# Remova chaves de um dicionário com del +del filled_dict["um"]  # Remove a chave "um" de filled_dict + + +# Armazenamento em sets... bem, são conjuntos +empty_set = set() +# Inicializa um set com alguns valores. Sim, ele parece um dicionário. Desculpe. +some_set = {1, 1, 2, 2, 3, 4}  # some_set agora é {1, 2, 3, 4} + +# Da mesma forma que chaves em um dicionário, elementos de um set devem ser +# imutáveis. +invalid_set = {[1], 1}  # => Gera um TypeError: unhashable type: 'list' +valid_set = {(1,), 1} + +# Pode definir novas variáveis para um conjunto +filled_set = some_set + +# Inclua mais um item no set +filled_set.add(5)  # filled_set agora é {1, 2, 3, 4, 5} + +# Faça interseção de conjuntos com & +other_set = {3, 4, 5, 6} +filled_set & other_set  # => {3, 4, 5} + +# Faça união de conjuntos com | +filled_set | other_set  # => {1, 2, 3, 4, 5, 6} + +# Faça a diferença entre conjuntos com - +{1, 2, 3, 4} - {2, 3, 5}  # => {1, 4} + +# Verifique a existência em um conjunto com in +2 in filled_set   # => True +10 in filled_set  # => False + + + +#################################################### +## 3. Controle de fluxo e iteráveis +#################################################### + +# Iniciemos um variável +some_var = 5 + +# Aqui está uma expressão if. Indentação é significante em python! +# imprime "somevar é menor que10" +if some_var > 10: +    print("some_var é absolutamente maior que 10.") +elif some_var < 10:    # Esta cláusula elif é opcional. +    print("some_var é menor que 10.") +else:                  # Isto também é opcional. +    print("some_var é, de fato, 10.") + + +""" +Laços for iteram sobre listas +imprime: +    cachorro é um mamífero +    gato é um mamífero +    rato é um mamífero +""" +for animal in ["cachorro", "gato", "rato"]: +    # Você pode usar format() para interpolar strings formatadas +    print("{} é um mamífero".format(animal)) + +""" +"range(número)" retorna um iterável de números +de zero até o número escolhido +imprime: +    0 +    1 +    2 +    3 +""" +for i in range(4): +    print(i) + +""" +"range(menor, maior)" gera um iterável de números +começando pelo menor até o maior +imprime: +    4 +    5 +    6 +    7 +""" +for i in range(4, 8): +    print(i) + +""" +"range(menor, maior, passo)" retorna um iterável de números +começando pelo menor número até o maior númeno, pulando de +passo em passo. Se o passo não for indicado, o valor padrão é um. +imprime: +    4 +    6 +""" +for i in range(4, 8, 2): +    print(i) +""" + +Laços while executam até que a condição não seja mais válida. +imprime: +    0 +    1 +    2 +    3 +""" +x = 0 +while x < 4: +    print(x) +    x += 1  # Maneira mais curta para for x = x + 1 + +# Lide com exceções com um bloco try/except +try: +    # Use "raise" para gerar um erro +    raise IndexError("Isto é um erro de índice") +except IndexError as e: +    pass                 # Pass é um não-operador. Normalmente você usa algum código de recuperação aqui. +except (TypeError, NameError): +    pass                 # Varias exceções podem ser gerenciadas, se necessário. +else:                    # Cláusula opcional para o bloco try/except. Deve estar após todos os blocos de exceção. +    print("Tudo certo!")   # Executa apenas se o código em try não gera exceção +finally:                 #  Sempre é executado +    print("Nós podemos fazer o código de limpeza aqui.") + +# Ao invés de try/finally para limpeza você pode usar a cláusula with +with open("myfile.txt") as f: +    for line in f: +        print(line) + +# Python provê uma abstração fundamental chamada Iterável. +# Um iterável é um objeto que pode ser tratado como uma sequência. +# O objeto retornou a função range, um iterável. + +filled_dict = {"um": 1, "dois": 2, "três": 3} +our_iterable = filled_dict.keys() +print(our_iterable)  # => range(1,10). Esse é um objeto que implementa nossa interface iterável. + +# Nós podemos percorrê-la. +for i in our_iterable: +    print(i)  # Imprime um, dois, três + +# Mas não podemos acessar os elementos pelo seu índice. +our_iterable[1]  # Gera um TypeError + +# Um iterável é um objeto que sabe como criar um iterador. +our_iterator = iter(our_iterable) + +# Nosso iterador é um objeto que pode lembrar o estado enquanto nós o percorremos. +# Nós acessamos o próximo objeto com "next()". +next(our_iterator)  # => "um" + +# Ele mantém o estado enquanto nós o percorremos. +next(our_iterator)  # => "dois" +next(our_iterator)  # => "três" + +# Após o iterador retornar todos os seus dados, ele gera a exceção StopIterator +next(our_iterator)  # Gera StopIteration + +# Você pode capturar todos os elementos de um iterador aplicando list() nele. +list(filled_dict.keys())  # => Retorna ["um", "dois", "três"] + + +#################################################### +## 4. Funções +#################################################### + +# Use "def" para criar novas funções. +def add(x, y): +    print("x é {} e y é {}".format(x, y)) +    return x + y  # Retorne valores com a cláusula return + +# Chamando funções com parâmetros +add(5, 6)  # => imprime "x é 5 e y é 6" e retorna 11 + +# Outro meio de chamar funções é com argumentos nomeados +add(y=6, x=5)  # Argumentos nomeados podem aparecer em qualquer ordem. + +# Você pode definir funções que pegam um número variável de argumentos +# posicionais +def varargs(*args): +    return args + +varargs(1, 2, 3)  # => (1, 2, 3) + +# Você pode definir funções que pegam um número variável de argumentos nomeados +# também +def keyword_args(**kwargs): +    return kwargs + +# Vamos chamá-lo para ver o que acontece +keyword_args(peh="grande", lago="ness")  # => {"peh": "grande", "lago": "ness"} + + +# Você pode fazer ambos simultaneamente, se você quiser +def all_the_args(*args, **kwargs): +    print(args) +    print(kwargs) +""" +all_the_args(1, 2, a=3, b=4) imprime: +    (1, 2) +    {"a": 3, "b": 4} +""" + +# Quando chamar funções, você pode fazer o oposto de args/kwargs! +# Use * para expandir tuplas e use ** para expandir dicionários! +args = (1, 2, 3, 4) +kwargs = {"a": 3, "b": 4} +all_the_args(*args)            # equivalente a foo(1, 2, 3, 4) +all_the_args(**kwargs)         # equivalente a foo(a=3, b=4) +all_the_args(*args, **kwargs)  # equivalente a foo(1, 2, 3, 4, a=3, b=4) + +# Retornando múltiplos valores (com atribuição de tuplas) +def swap(x, y): +    return y, x  # Retorna múltiplos valores como uma tupla sem os parêntesis. +                 # (Observação: os parêntesis foram excluídos mas podem estar +                 # presentes) + +x = 1 +y = 2 +x, y = swap(x, y)     # => x = 2, y = 1 +# (x, y) = swap(x,y)  # Novamente, os parêntesis foram excluídos mas podem estar presentes. + +# Escopo de função +x = 5 + +def setX(num): +    # A variável local x não é a mesma variável global x +    x = num    # => 43 +    print (x)  # => 43 + +def setGlobalX(num): +    global x +    print (x)  # => 5 +    x = num    # variável global x agora é 6 +    print (x)  # => 6 + +setX(43) +setGlobalX(6) + + +# Python tem funções de primeira classe +def create_adder(x): +    def adder(y): +        return x + y +    return adder + +add_10 = create_adder(10) +add_10(3)   # => 13 + +# Também existem as funções anônimas +(lambda x: x > 2)(3)                  # => True +(lambda x, y: x ** 2 + y ** 2)(2, 1)  # => 5 + +# TODO - Fix for iterables +# Existem funções internas de alta ordem +map(add_10, [1, 2, 3])          # => [11, 12, 13] +map(max, [1, 2, 3], [4, 2, 1])  # => [4, 2, 3] + +filter(lambda x: x > 5, [3, 4, 5, 6, 7])  # => [6, 7] + +# Nós podemos usar compreensão de lista para interessantes mapas e filtros +# Compreensão de lista armazena a saída como uma lista que pode ser uma lista +# aninhada +[add_10(i) for i in [1, 2, 3]]         # => [11, 12, 13] +[x for x in [3, 4, 5, 6, 7] if x > 5]  # => [6, 7] + +#################################################### +## 5. Classes +#################################################### + + +# Nós usamos o operador "class" para ter uma classe +class Human: + +    # Um atributo de classe. Ele é compartilhado por todas as instâncias dessa +    # classe. +    species = "H. sapiens" + +    # Construtor básico, é chamado quando esta classe é instanciada. +    # Note que dois sublinhados no início e no final de uma identificados +    # significa objetos ou atributos que são usados pelo python mas vivem em +    # um namespace controlado pelo usuário. Métodos (ou objetos ou atributos) +    # como: __init__, __str__, __repr__, etc. são chamados métodos mágicos (ou +    # algumas vezes chamados métodos dunder - "double underscore") +    # Você não deve usar nomes assim por sua vontade. +    def __init__(self, name): +        @ Atribui o argumento ao atributo da  instância +        self.name = name + +    # Um método de instância. Todos os métodos tem "self" como primeiro +    # argumento +    def say(self, msg): +        return "{name}: {message}".format(name=self.name, message=msg) + +    # Um método de classe é compartilhado por todas as instâncias +    # Eles são chamados com a classe requisitante como primeiro argumento +    @classmethod +    def get_species(cls): +        return cls.species + +    # Um método estático é chamado sem uma referência a classe ou instância +    @staticmethod +    def grunt(): +        return "*grunt*" + + +# Instancie uma classe +i = Human(name="Ian") +print(i.say("oi"))     # imprime "Ian: oi" + +j = Human("Joel") +print(j.say("olá"))  # imprime "Joel: olá" + +# Chama nosso método de classe +i.get_species()  # => "H. sapiens" + +# Altera um atributo compartilhado +Human.species = "H. neanderthalensis" +i.get_species()  # => "H. neanderthalensis" +j.get_species()  # => "H. neanderthalensis" + +# Chama o método estático +Human.grunt()    # => "*grunt*" + + +#################################################### +## 6. Módulos +#################################################### + +# Você pode importar módulos +import math +print(math.sqrt(16))  # => 4 + +# Você pode importar apenas funções específicas de um módulo +from math import ceil, floor +print(ceil(3.7))   # => 4.0 +print(floor(3.7))  # => 3.0 + +# Você pode importar todas as funções de um módulo para o namespace atual +# Atenção: isso não é recomendado +from math import * + +# Você pode encurtar o nome dos módulos +import math as m +math.sqrt(16) == m.sqrt(16)  # => True + +# Módulos python são apenas arquivos python comuns. Você +# pode escrever os seus, e importá-los. O nome do +# módulo é o mesmo nome do arquivo. + +# Você pode procurar que atributos e funções definem um módulo. +import math +dir(math) + + +#################################################### +## 7. Avançado +#################################################### + +# Geradores podem ajudar você a escrever código "preguiçoso" +def double_numbers(iterable): +    for i in iterable: +        yield i + i + +# Um gerador cria valores conforme necessário. +# Ao invés de gerar e retornar todos os valores de uma só vez ele cria um em +# cada interação. Isto significa que valores maiores que 15 não serão +# processados em double_numbers. +# Nós usamos um sublinhado ao final do nome das variáveis quando queremos usar +# um nome que normalmente colide com uma palavra reservada do python. +range_ = range(1, 900000000) +# Multiplica por 2 todos os números até encontrar um resultado >= 30 +for i in double_numbers(range_): +    print(i) +    if i >= 30: +        break + + +# Decoradores +# Neste exemplo beg encapsula say +# beg irá chamar say. Se say_please é verdade então ele irá mudar a mensagem +# retornada +from functools import wraps + + +def beg(target_function): +    @wraps(target_function) +    def wrapper(*args, **kwargs): +        msg, say_please = target_function(*args, **kwargs) +        if say_please: +            return "{} {}".format(msg, "Por favor! Eu sou pobre :(") +        return msg + +    return wrapper + + +@beg +def say(say_please=False): +    msg = "Você me paga uma cerveja?" +    return msg, say_please + + +print(say())                # Você me paga uma cerveja? +print(say(say_please=True)) # Você me paga uma cerveja? Por favor! Eu sou pobre :( +``` + +## Pronto para mais? + +### Free Online + +* [Automate the Boring Stuff with Python](https://automatetheboringstuff.com) +* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/) +* [Dive Into Python](http://www.diveintopython.net/) +* [Ideas for Python Projects](http://pythonpracticeprojects.com) +* [The Official Docs](http://docs.python.org/3/) +* [Hitchhiker's Guide to Python](http://docs.python-guide.org/en/latest/) +* [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182) +* [Python Course](http://www.python-course.eu/index.php) +* [First Steps With Python](https://realpython.com/learn/python-first-steps/) +* [A curated list of awesome Python frameworks, libraries and software](https://github.com/vinta/awesome-python) +* [30 Python Language Features and Tricks You May Not Know About](http://sahandsaba.com/thirty-python-language-features-and-tricks-you-may-not-know.html) +* [Official Style Guide for Python](https://www.python.org/dev/peps/pep-0008/) + +### Dead Tree + +* [Programming Python](http://www.amazon.com/gp/product/0596158106/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596158106&linkCode=as2&tag=homebits04-20) +* [Dive Into Python](http://www.amazon.com/gp/product/1441413022/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1441413022&linkCode=as2&tag=homebits04-20) +* [Python Essential Reference](http://www.amazon.com/gp/product/0672329786/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0672329786&linkCode=as2&tag=homebits04-20) diff --git a/pt-br/ruby-ecosystem-pt.html.markdown b/pt-br/ruby-ecosystem-pt.html.markdown new file mode 100644 index 00000000..da4f6f37 --- /dev/null +++ b/pt-br/ruby-ecosystem-pt.html.markdown @@ -0,0 +1,147 @@ +--- +category: tool +tool: ruby ecosystem +contributors: +    - ["Jon Smock", "http://github.com/jonsmock"] +    - ["Rafal Chmiel", "http://github.com/rafalchmiel"] +translators: +    - ["Claudson Martins", "http://github.com/claudsonm"] +lang: pt-br + +--- + +Pessoas utilizando Ruby geralmente têm uma forma de instalar diferentes versões +do Ruby, gerenciar seus pacotes (ou gemas) e as dependências das gemas. + +## Gerenciadores Ruby + +Algumas plataformas possuem o Ruby pré-instalado ou disponível como um pacote. +A maioria dos "rubistas" não os usam, e se usam, é apenas para inicializar outro +instalador ou implementação do Ruby. Ao invés disso, rubistas tendêm a instalar +um gerenciador para instalar e alternar entre diversas versões do Ruby e seus +ambientes de projeto. + +Abaixo estão os gerenciadores Ruby mais populares: + +* [RVM](https://rvm.io/) - Instala e alterna entre os rubies. RVM também possui +  o conceito de gemsets para isolar os ambientes dos projetos completamente. +* [ruby-build](https://github.com/sstephenson/ruby-build) - Apenas instala os +  rubies. Use este para um melhor controle sobre a instalação de seus rubies. +* [rbenv](https://github.com/sstephenson/rbenv) - Apenas alterna entre os rubies. +  Usado com o ruby-build. Use este para um controle mais preciso sobre a forma +  como os rubies são carregados. +* [chruby](https://github.com/postmodern/chruby) - Apenas alterna entre os rubies. +  A concepção é bastante similar ao rbenv. Sem grandes opções sobre como os +  rubies são instalados. + +## Versões do Ruby + +O Ruby foi criado por Yukihiro "Matz" Matsumoto, que continua a ser uma espécie +de [BDFL](https://en.wikipedia.org/wiki/Benevolent_Dictator_for_Life), embora +isso esteja mudando recentemente. Como resultado, a implementação de referência +do Ruby é chamada de MRI (Matz' Reference Implementation), e quando você ver uma +versão do Ruby, ela está se referindo a versão de lançamento do MRI. + +As três principais versões do Ruby em uso são: + +* 2.0.0 - Lançada em Fevereiro de 2013. Maioria das principais bibliotecas e  +  suporte a frameworks 2.0.0. +* 1.9.3 - Lançada em Outubro de 2011. Está é a versão mais utilizada pelos rubistas +  atualmente. Também [aposentada](https://www.ruby-lang.org/en/news/2015/02/23/support-for-ruby-1-9-3-has-ended/). +* 1.8.7 - O Ruby 1.8.7 foi +  [aposentado](http://www.ruby-lang.org/en/news/2013/06/30/we-retire-1-8-7/). + +A diferença entre a versão 1.8.7 para 1.9.x é muito maior do que a da 1.9.3 para +a 2.0.0. Por exemplo, a série 1.9 introduziu encodes e uma VM bytecode. Ainda +existem projetos na versão 1.8.7, mas eles estão tornando-se uma pequena minoria +pois a maioria da comunidade migrou para a versão, pelo menos, 1.9.2 ou 1.9.3. + +## Implementações Ruby + +O ecossistema Ruby conta com várias diferentes implementações do Ruby, cada uma +com pontos fortes e estados de compatibilidade. Para ser claro, as diferentes +implementações são escritas em diferentes linguagens, mas *todas elas são Ruby*. +Cada implementação possui hooks especiais e recursos extra, mas todas elas +executam arquivos normais do Ruby tranquilamente. Por exemplo, JRuby é escrita +em Java, mas você não precisa saber Java para utilizá-la. + +Muito maduras/compatíveis: + +* [MRI](https://github.com/ruby/ruby) - Escrita em C, esta é a implementação de +  referência do Ruby. Por definição, é 100% compatível (consigo mesma). Todos os +  outros rubies mantêm compatibilidade com a MRI (veja [RubySpec](#rubyspec) abaixo). +* [JRuby](http://jruby.org/) - Escrita em Java e Ruby, esta implementação +  robusta é um tanto rápida. Mais importante ainda, o ponto forte do JRuby é a +  interoperabilidade com JVM/Java, aproveitando ferramentas JVM, projetos, e +  linguagens existentes. +* [Rubinius](http://rubini.us/) - Escrita principalmente no próprio Ruby, com +  uma VM bytecode em C++. Também madura e rápida. Por causa de sua implementação +  em Ruby, ela expõe muitos recursos da VM na rubyland. + +Medianamente maduras/compatíveis: + +* [Maglev](http://maglev.github.io/) - Construída em cima da Gemstone, uma +  máquina virtual Smalltalk. O Smalltalk possui algumas ferramentas impressionantes, +  e este projeto tenta trazer isso para o desenvolvimento Ruby. +* [RubyMotion](http://www.rubymotion.com/) - Traz o Ruby para o desenvolvimento iOS. + +Pouco maduras/compatíveis: + +* [Topaz](http://topazruby.com/) - Escrita em RPython (usando o conjunto de +  ferramentas PyPy), Topaz é bastante jovem e ainda não compatível. Parece ser +  promissora como uma implementação Ruby de alta performance. +* [IronRuby](http://ironruby.net/) - Escrita em C# visando a plataforma .NET, +  o trabalho no IronRuby parece ter parado desde que a Microsoft retirou seu apoio. + +Implementações Ruby podem ter seus próprios números de lançamento, mas elas +sempre focam em uma versão específica da MRI para compatibilidade. Diversas +implementações têm a capacidade de entrar em diferentes modos (1.8 ou 1.9, por +exemplo) para especificar qual versão da MRI focar. + +## RubySpec + +A maioria das implementações Ruby dependem fortemente da [RubySpec](http://rubyspec.org/). +Ruby não tem uma especificação oficial, então a comunidade tem escrito +especificações executáveis em Ruby para testar a compatibilidade de suas +implementações com a MRI. + +## RubyGems + +[RubyGems](http://rubygems.org/) é um gerenciador de pacotes para Ruby mantido +pela comunidade. RubyGems vem com o Ruby, portanto não é preciso baixar separadamente. + +Os pacotes do Ruby são chamados de "gemas", e elas podem ser hospedadas pela  +comunidade em RubyGems.org. Cada gema contém seu código-fonte e alguns metadados, +incluindo coisas como versão, dependências, autor(es) e licença(s). + +## Bundler + +[Bundler](http://bundler.io/) é um gerenciador de dependências para as gemas. +Ele usa a Gemfile de um projeto para encontrar dependências, e então busca as +dependências dessas dependências de forma recursiva. Ele faz isso até que todas  +as dependências sejam resolvidas e baixadas, ou para se encontrar um conflito. + +O Bundler gerará um erro se encontrar um conflito entre dependências. Por exemplo,  +se a gema A requer versão 3 ou maior que a gema Z, mas a gema B requer a versão  +2, o Bundler irá notificá-lo que há um conflito. Isso se torna extremamente útil +quando diversas gemas começam a referenciar outras gemas (que referem-se a outras +gemas), o que pode formar uma grande cascata de dependências a serem resolvidas. + +# Testes + +Testes são uma grande parte da cultura do Ruby. O Ruby vem com o seu próprio  +framework de teste de unidade chamado minitest (ou TestUnit para Ruby versão 1.8.x).  +Existem diversas bibliotecas de teste com diferentes objetivos. + +* [TestUnit](http://ruby-doc.org/stdlib-1.8.7/libdoc/test/unit/rdoc/Test/Unit.html) -  +  Framework de testes "Unit-style" para o Ruby 1.8 (built-in) +* [minitest](http://ruby-doc.org/stdlib-2.0.0/libdoc/minitest/rdoc/MiniTest.html) -  +  Framework de testes para o Ruby 1.9/2.0 (built-in) +* [RSpec](http://rspec.info/) - Um framework de testes que foca na expressividade +* [Cucumber](http://cukes.info/) - Um framework de testes BDD que analisa testes Gherkin formatados + +## Seja Legal + +A comunidade Ruby orgulha-se de ser uma comunidade aberta, diversa, e receptiva. +O próprio Matz é extremamente amigável, e a generosidade dos rubistas em geral +é incrível. diff --git a/pt-br/ruby-pt.html.markdown b/pt-br/ruby-pt.html.markdown index 89a051d4..eeb51bec 100644 --- a/pt-br/ruby-pt.html.markdown +++ b/pt-br/ruby-pt.html.markdown @@ -4,6 +4,7 @@ lang: pt-br  filename: learnruby-pt.rb  contributors:    - ["Bruno Henrique - Garu", "http://garulab.com"] +  - ["Jean Matheus Souto", "http://jeanmatheussouto.github.io"]  translators:    - ["Katyanna Moura", "https://twitter.com/amelie_kn"]  --- @@ -100,7 +101,7 @@ caminho_para_a_raiz_do_projeto = '/bom/nome/'  caminho = '/nome/ruim/'  # Símbolos (são objetos) -# Símbolos são imutáveis, são constantes reutilizáveis representadadas +# Símbolos são imutáveis, são constantes reutilizáveis representados  # internamente por um valor inteiro. Eles são frequentemente usados no  # lugar de strings para transmitir com eficiência os valores específicos  # e significativos @@ -161,9 +162,6 @@ hash['numero'] #=> 5  hash['nada aqui'] #=> nil  # Interar sobre hashes com o método #each: -hash.each do |k, v| -  puts "#{k} is #{v}" -end  hash.each do |k, v|    puts "#{k} é #{v}" @@ -262,7 +260,7 @@ somar 3, 4 #=> 7  somar(3,4), 5 #=> 12  # yield -# Todos os métodos possuem implicitamente um paramêntro opcional que é um bloco +# Todos os métodos possuem implicitamente um paramêtro opcional que é um bloco  # ele pode ser chamado com a palavra chave 'yield'  def ao_redor @@ -287,7 +285,7 @@ class Humano    # Inicialização básica (contructor)    def initialize(nome, idade=0) -    # Atribui o argumento para a variável de instancia "nome" do objeto +    # Atribui o argumento para a variável de instância "nome" do objeto      @nome = nome      # Se a idade não for passada, nós definimos um valor padrão na lista de argumentos      @idade = idade @@ -303,7 +301,7 @@ class Humano      @nome    end -  # Um método de classe usa a palavra chave self para se defenciar dos métodos de instância. +  # Um método de classe usa a palavra chave self para se diferenciar dos métodos de instância.    # Ele só pode ser chamado na classe, não na instancia    def self.diz(msg)      puts "#{msg}" @@ -364,7 +362,7 @@ Trabalhador.foo # 0  Humano.foo = 2 # 2  Trabalhador.foo # 2 -# Uma variável de instância não é compartilhada por suas classes decendentes. +# Uma variável de instância não é compartilhada por suas classes descendentes.  class Humano    @bar = 0 @@ -385,3 +383,11 @@ Humano.bar # 0  Doutor.bar # nil  ``` + +## Mais sobre Ruby + +- [Documentação oficial](http://www.ruby-doc.org/core-2.1.1/) +- [Aprenda Ruby com desafios](http://www.learneroo.com/modules/61/nodes/338) - Uma coleção de desafios para testar a linguagem. +- [Ruby a partir de outras linguagens](https://www.ruby-lang.org/en/documentation/ruby-from-other-languages/) +- [Programming Ruby](http://www.amazon.com/Programming-Ruby-1-9-2-0-Programmers/dp/1937785491/)- Um mais antigo [free edition](http://ruby-doc.com/docs/ProgrammingRuby/) e tambem uma versão online disponível. +- [Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide) - Uma versão colaborativa de um *style-guide* diff --git a/pt-br/sass-pt.html.markdown b/pt-br/sass-pt.html.markdown index 105896b2..3d91f1ca 100644 --- a/pt-br/sass-pt.html.markdown +++ b/pt-br/sass-pt.html.markdown @@ -6,6 +6,7 @@ contributors:    - ["Sean Corrales", "https://github.com/droidenator"]  translators:    - ["Gabriel Gomes", "https://github.com/gabrielgomesferraz"] +  - ["Cássio Böck", "https://github.com/cassiobsilva"]  lang: pt-br  --- @@ -155,16 +156,6 @@ body {    background-color: rgba(0, 0, 0, 0.75);  } -/* You may also define your own functions. Functions are very similar to -   mixins. When trying to choose between a function or a mixin, remember -   that mixins are best for generating CSS while functions are better for -   logic that might be used throughout your Sass code. The examples in -   the Math Operators' section are ideal candidates for becoming a reusable -   function. */ - -/* This function will take a target size and the parent size and calculate -   and return the percentage */ -  /* Você também pode definir suas próprias funções. As funções são muito semelhantes aos     mixins. Ao tentar escolher entre uma função ou um mixin, lembre-     que mixins são os melhores para gerar CSS enquanto as funções são melhores para @@ -319,11 +310,6 @@ ol {    padding: 0;  } -/* Sass offers @import which can be used to import partials into a file. -   This differs from the traditional CSS @import statement which makes -   another HTTP request to fetch the imported file. Sass takes the -   imported file and combines it with the compiled code. */ -  /* Sass oferece @import que pode ser usado para importar parciais em um arquivo.     Isso difere da declaração CSS @import tradicional, que faz     outra solicitação HTTP para buscar o arquivo importado. Sass converte os @@ -354,12 +340,6 @@ body {  ==============================*/   - -/* Placeholders are useful when creating a CSS statement to extend. If you -   wanted to create a CSS statement that was exclusively used with @extend, -   you can do so using a placeholder. Placeholders begin with a '%' instead -   of '.' or '#'. Placeholders will not appear in the compiled CSS. */ -  /* Os espaços reservados são úteis na criação de uma declaração CSS para ampliar. Se você     queria criar uma instrução CSS que foi usado exclusivamente com @extend,     Você pode fazer isso usando um espaço reservado. Espaços reservados começar com um '%' em vez @@ -396,11 +376,6 @@ body {  ============================== * / -/* Sass provides the following operators: +, -, *, /, and %. These can -   be useful for calculating values directly in your Sass files instead -   of using values that you've already calculated by hand. Below is an example -   of a setting up a simple two column design. */ -  /* Sass fornece os seguintes operadores: +, -, *, /, e %. estes podem     ser úteis para calcular os valores diretamente no seu Sass arquivos em vez     de usar valores que você já calculados pela mão. Abaixo está um exemplo diff --git a/pt-br/typescript-pt.html.markdown b/pt-br/typescript-pt.html.markdown new file mode 100644 index 00000000..f072b257 --- /dev/null +++ b/pt-br/typescript-pt.html.markdown @@ -0,0 +1,179 @@ +--- +language: TypeScript +filename: learntypescript-pt.ts +contributors: +    - ["Philippe Vlérick", "https://github.com/pvlerick"] +translators: +  - ["Gabriel Gomes", "https://github.com/gabrielgomesferraz"] +lang: pt-br +--- + +TypeScript is a language that aims at easing development of large scale applications written in JavaScript. +TypeScript adds common concepts such as classes, modules, interfaces, generics and (optional) static typing to JavaScript. +It is a superset of JavaScript: all JavaScript code is valid TypeScript code so it can be added seamlessly to any project. The TypeScript compiler emits JavaScript. + +This article will focus only on TypeScript extra syntax, as opposed to [JavaScript] (../javascript/). + + +Typescript é uma linguagem que visa facilitar o desenvolvimento de aplicações em grande escala escritos em JavaScript. +Typescript acrescenta conceitos comuns como classes, módulos, interfaces, genéricos e (opcional) tipagem estática para JavaScript. +É um super conjunto de JavaScript: todo o código JavaScript é o código do texto dactilografado válido para que possa ser adicionados diretamente a qualquer projeto. O compilador emite typescript JavaScript. + +Este artigo irá se concentrar apenas em texto datilografado sintaxe extra, ao contrário de [JavaScript](javascript-pt.html.markdown). + +Para testar compilador do texto datilografado, de cabeça para o [Parque](http://www.typescriptlang.org/Playground), onde você vai ser capaz de escrever código, ter auto conclusão e ver diretamente o JavaScript emitida. + +```js +// Existem 3 tipos básicos no TypeScript +var isDone: boolean = false; +var lines: number = 42; +var name: string = "Anders"; + +// Quando é impossível saber, há o "Qualquer" tipo +var notSure: any = 4; +notSure = "maybe a string instead"; +notSure = false; // Ok, definitivamente um boolean + +// Para coleções, não são matrizes e matrizes genéricas digitado +var list: number[] = [1, 2, 3]; +// Como alternativa, usando o tipo de matriz genérica +var list: Array<number> = [1, 2, 3]; + +// Para enumerações: +enum Color {Red, Green, Blue}; +var c: Color = Color.Green; + +// Por último, "vazio" é utilizado no caso especial de uma função que não retorna nada +function bigHorribleAlert(): void { +  alert("I'm a little annoying box!"); +} + +// Funções são cidadãos de primeira classe, apoiar a sintaxe lambda "seta gordura" e +// Tipo de uso inferência + +// A seguir são equivalentes, a mesma assinatura será inferido pelo +// Compilador, e mesmo JavaScript será emitido +var f1 = function(i: number): number { return i * i; } +// Tipo de retorno inferida +var f2 = function(i: number) { return i * i; } +var f3 = (i: number): number => { return i * i; } +// Tipo de retorno inferida +var f4 = (i: number) => { return i * i; } +// Tipo de retorno inferido, one-liner significa nenhuma palavra-chave retorno necessário +var f5 = (i: number) =>  i * i; + +// Interfaces são estruturais, qualquer coisa que tenha as propriedades é compatível com +// A interface +interface Person { +  name: string; +  // Propriedades opcionais, marcado com um "?" +  age?: number; +  // E de funções curso +  move(): void; +} + +// Objeto que implementa a "Pessoa" Interface +// Pode ser tratado como uma pessoa desde que tem o nome e mover propriedades +var p: Person = { name: "Bobby", move: () => {} }; +// Os objetos que têm a propriedade opcional: +var validPerson: Person = { name: "Bobby", age: 42, move: () => {} }; +// Não é uma pessoa porque a idade não é um número +var invalidPerson: Person = { name: "Bobby", age: true }; + +// Interfaces também pode descrever um tipo de função +interface SearchFunc { +  (source: string, subString: string): boolean; +} +// Somente tipos dos parâmetros são importantes, os nomes não são importantes. +var mySearch: SearchFunc; +mySearch = function(src: string, sub: string) { +  return src.search(sub) != -1; +} + +// Classes - membros são públicos por padrão +class Point { +  // Propriedades +    x: number; + +    // Construtor - the public/private keywords in this context will generate +    // o código clichê para a propriedade e a inicialização no +    // construtor. +    // Neste exemplo, "y" será definida como "X" é, mas com menos código +    // Os valores padrão também são suportados. + +    constructor(x: number, public y: number = 0) { +        this.x = x; +    } + +    // Funções +    dist() { return Math.sqrt(this.x * this.x + this.y * this.y); } + +    // Membros Estáticos +    static origin = new Point(0, 0); +} + +var p1 = new Point(10 ,20); +var p2 = new Point(25); //y será 0 + +// Herança +class Point3D extends Point { +    constructor(x: number, y: number, public z: number = 0) { +        super(x, y); // Chamada explícita para o construtor da super classe é obrigatória +    } + +    // Sobrescrever +    dist() { +        var d = super.dist(); +        return Math.sqrt(d * d + this.z * this.z); +    } +} + +// Módulos, "." pode ser utilizado como separador de sub módulos +module Geometry { +  export class Square { +    constructor(public sideLength: number = 0) { +    } +    area() { +      return Math.pow(this.sideLength, 2); +    } +  } +} + +var s1 = new Geometry.Square(5); + +// Alias no local para fazer referência a um módulo +import G = Geometry; + +var s2 = new G.Square(10); + +// Genericos +// Classes +class Tuple<T1, T2> { +    constructor(public item1: T1, public item2: T2) { +    } +} + +// Interfaces +interface Pair<T> { +    item1: T; +    item2: T; +} + +// e funções +var pairToTuple = function<T>(p: Pair<T>) { +    return new Tuple(p.item1, p.item2); +}; + +var tuple = pairToTuple({ item1:"hello", item2:"world"}); + +// Incluindo referências a um arquivo de definição: +/// <reference path="jquery.d.ts" /> + +``` + +## Leitura adicional + * [TypeScript site oficial](http://www.typescriptlang.org/) + * [TypeScript especificações de idioma (pdf)](http://go.microsoft.com/fwlink/?LinkId=267238) + * [Anders Hejlsberg - Apresentando texto datilografado no Canal 9](http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript) + * [Código fonte no GitHub](https://github.com/Microsoft/TypeScript) + * [Definitivamente datilografado - repositório de definições de tipo](http://definitelytyped.org/) diff --git a/pt-br/yaml-pt.html.markdown b/pt-br/yaml-pt.html.markdown new file mode 100644 index 00000000..341ae675 --- /dev/null +++ b/pt-br/yaml-pt.html.markdown @@ -0,0 +1,142 @@ +--- +language: yaml +contributors: +  - ["Adam Brenecki", "https://github.com/adambrenecki"] +translators: +  - ["Rodrigo Russo", "https://github.com/rodrigozrusso"] +filename: learnyaml-pt.yaml +lang: pt-br +--- + +YAML é uma linguagem de serialização de dados projetado para ser diretamente gravável e +legível por seres humanos. + +É um estrito subconjunto de JSON, com a adição de sintaticamente +novas linhas e recuo significativos, como Python. Ao contrário de Python, no entanto, +YAML não permite caracteres de tabulação literais em tudo. + +```yaml +# Commentários em YAML são como este. + +################### +# TIPOS ESCALARES # +################### + +# Nosso objeto raiz (que continua por todo o documento) será um mapa, +# o que equivale a um dicionário, hash ou objeto em outras linguagens. +chave: valor +outra_chave: Outro valor vai aqui. +u_valor_numerico: 100 +notacao_cientifica: 1e+12 +boleano: true +valor_nulo: null +chave com espaco: valor +# Observe que strings não precisam de aspas. Porém, elas podem ter. +porem: "Uma string, entre aspas." +"Chaves podem estar entre aspas tambem.": "É útil se você quiser colocar um ':' na sua chave." + +# Seqüências de várias linhas podem ser escritos como um 'bloco literal' (utilizando |), +# ou em um 'bloco compacto' (utilizando '>'). +bloco_literal: | +    Todo esse bloco de texto será o valor da chave 'bloco_literal', +    preservando a quebra de com linhas. + +    O literal continua até de-dented, e a primeira identação é  +    removida. + +        Quaisquer linhas que são 'mais identadas' mantém o resto de suas identações -  +        estas linhas serão identadas com 4 espaços. +estilo_compacto: > +    Todo esse bloco de texto será o valor de 'estilo_compacto', mas esta +    vez, todas as novas linhas serão substituídas com espaço simples. + +    Linhas em branco, como acima, são convertidas em um carater de nova linha. + +        Linhas 'mais-indentadas' mantém suas novas linhas também - +        este texto irá aparecer em duas linhas. + +#################### +# TIPOS DE COLEÇÃO # +#################### + +# Texto aninhado é conseguido através de identação. +um_mapa_aninhado: +    chave: valor +    outra_chave: Outro valor +    outro_mapa_aninhado: +        ola: ola + +# Mapas não tem que ter chaves com string. +0.25: uma chave com valor flutuante + +# As chaves podem ser também objetos multi linhas, utilizando ? para indicar o começo de uma chave. +? | +    Esta é uma chave +    que tem várias linhas +: e este é o seu valor + +# também permite tipos de coleção de chaves, mas muitas linguagens de programação +# vão reclamar. + +# Sequências (equivalente a listas ou arrays) semelhante à isso: +uma_sequencia: +    - Item 1 +    - Item 2 +    - 0.5 # sequencias podem conter tipos diferentes. +    - Item 4 +    - chave: valor +      outra_chave: outro_valor +    - +        - Esta é uma sequencia +        - dentro de outra sequencia + +# Como YAML é um super conjunto de JSON, você também pode escrever mapas JSON de estilo e +# sequencias: +mapa_json: {"chave": "valor"} +json_seq: [3, 2, 1, "decolar"] + +########################## +# RECURSOS EXTRA DO YAML # +########################## + +# YAML também tem um recurso útil chamado "âncoras", que permitem que você facilmente duplique +# conteúdo em seu documento. Ambas estas chaves terão o mesmo valor: +conteudo_ancora: & nome_ancora Essa string irá aparecer como o valor de duas chaves. +outra_ancora: * nome_ancora + +# YAML também tem tags, que você pode usar para declarar explicitamente os tipos. +string_explicita: !! str 0,5 +# Alguns analisadores implementam tags específicas de linguagem, como este para Python de +# Tipo de número complexo. +numero_complexo_em_python: !! python / complex 1 + 2j + +#################### +# YAML TIPOS EXTRA # +#################### + +# Strings e números não são os únicos que escalares YAML pode entender. +# Data e 'data e hora' literais no formato ISO também são analisados. +datetime: 2001-12-15T02: 59: 43.1Z +datetime_com_espacos 2001/12/14: 21: 59: 43.10 -5 +Data: 2002/12/14 + +# A tag !!binary indica que a string é na verdade um base64-encoded (condificado) +# representação de um blob binário. +gif_file: !!binary | +    R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5 +    OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+ +    +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC +    AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs= + +# YAML também tem um tipo de conjunto, o que se parece com isso: +set: +    ? item1 +    ? item2 +    ? item3 + +# Como Python, são apenas conjuntos de mapas com valors nulos; o acima é equivalente a: +set2: +    item1: nulo +    item2: nulo +    item3: nulo +``` | 
