thegoodfellas/blogset-br huggingface dataset:
O principio da inversao da dependencia, tambem abordado no livro de Martin (2006) e conhecido pela sigla DIP, sugere abstracao de dados. Esse principio estabelece que o codigo cliente conheca um objeto somente por sua interface. De acordo com Martin (2006) modulos de alto nivel nao devem depender de modulos de baixo nivel. Ambos devem depender de abstracoes. Abstracoes nao devem depender de detalhes. Detalhes devem depender de abstracoes. No exemplo a seguir, podemos demonstrar uma violacao de principio com a seguinte implementacao para efetuar copia de arquivo:public class A { public void copia(byte device) { char c; R r = new R(...); W1 w1; W2 w2; if (device == D1) w1 = new W1(....); else w2 = new W2 (...); while ( (c = r.read()) != EOF ) { if (device == D1) w1.write(c); else w2.write(c); } } }Nessa implementacao, a classe A depende das classes R, W1 e W2, classes concretas. O problema esta ocorrendo porque o metodo copia sempre testa qual o dispositivo para saber onde imprimir. Ele entra nos detalhes de cada dispositivo passado como parametro, nesse caso, um metodo de alto nivel esta dependendo de detalhes de um modulo de nivel mais baixo.Verifique agora a solucao do problema:public interface Reader {public char read( );}public interface Writer{public void write(char c);}public class A { public void copia(Reader r, Writer w) { char c; while ( ( c = r.read( )) != EOF ) { w.write(c); } }}Na nova implementacao foram implementadas interfaces especificas para Reader e Writer. Agora o metodo copia nao precisa mais testar o dispositivo antes de realizar a impressao. Essa responsabilidade e de quem chama o metodo copia. Estar de acordo com o DIP facilita a manutencao e traz robustez aos codigos, alem de contribuir com encapsulacao de dados.Referencia:MARTIN, R.C.; MARTIN, M. Agile Principles, Patterns, and Practices in C#. 1. ed. New Jersey: Prentice Hall, 2006. Precisamos obedecer alguns padroes de escrita de acordo com a Code Conventions da Oracle (2016). Na nomeacao das classes, metodos e atributos nao devem ser incluidos numeros ou caracteres especiais como _, #, @, * $, etc. As classes devem ser nomeadas com substantivos e ter sua inicial maiuscula. O nome da classe deve possuir o mesmo nome de seu arquivo, caso contrario, havera erro durante a execucao do aplicativo. Se essa classe possuir um nome composto, por convencao, esse nome devera ter todas as suas iniciais maiusculas. Ex: NomeDaClasse, nao e interessante utilizar hifen ou underline para separar os nomes de uma classe com nome composto.Cada metodo/funcao deve ser nomeado com verbo e ter sua inicial minuscula. O nome dos metodos nao deve ser iniciado ou composto por caracteres especiais. Caso o nome seja composto, a primeira inicial e minuscula e as demais sao letras maiusculas. Ex: nomeDoMetodo. Um atributo pode ser nomeado com um adjetivo ou um substantivo e ter sua inicial minuscula. De igual forma, o nome do atributo nao deve conter caracteres especiais e caso seja composto, devera possuir uma inicial minuscula e todas as demais iniciais das palavras que o compoe em letra maiuscula. Ex:
nomeDoAtributo. De toda forma, e interessante escrever nome do atributo da forma mais simples possivel, entao, em vez de nomeDoAtributo, seria interessante nomea-lo apenas como nome.O nome de uma constante deve ser escrito com todas as letras maiusculas. Caso a constante possua um nome composto, ele deve ser separado pelo caractere underline. Ex: NOME_DA_CONSTANTE. Essa e a unica circunstancia na qual o caractere underline deve ser usado na formacao de nomes.Todas essas regras de nomenclatura sao utilizadas para deixar o codigo da forma mais organizada possivel. Nao devemos declarar variaveis locais com o mesmo nome de variaveis globais. E interessante utilizar sempre identificadores ainda nao utilizados para funcoes, variaveis, metodos e classes. Dessa forma, a manutencao e facilitada ja que poderao ser evitadas situacoes como uma variavel comum ser confundida com uma constante ou que uma variavel local seja confundida com uma variavel global.Referencia:ORACLE. Code Conventions for the Java Programming Language: Contents, 2016. Disponivel em: <http://www.oracle.com/technetwork/java/codeconvtoc-136057.html>. Acesso em: 23 jan.2016.
e o tamanho do string armazenado:public void assign(char[ ] c) {copy(s, c);length = strlen(c);}// Aqui, length e o tamanho do string acrescido de uma unidadepublic void concat(String a, String b){length = a.length + b.length;s = new char[length+1];join(s, a.s, b.s);}Precisamos definir uma unica semantica para o length em todas as operacoes, entao foi registrado na definicao da classe o invariante que estabelece length como o tamanho do String. Verifique a solucao do problema, na nova versao de MyString:class MyString {//Campos Privados de MyStringprivate char[] s;/*Com a definicao do campo length seguida de seu comentario a seguir, ele e registrado como invariante na definicao da classe*/private int length; // length == strlen(s)//Funcoes auxiliaries privadas de MyStringprivate void copy(char[]d,char[]a) throws Erro{int i;if (d==null || a==null) throw new Erro();for(i=0; i<a.length && a[i]!=\0; i++){d[i] = a[i];}if (i < d.length) d[i] =\0;}private void join(char[]d,char[]a,char[]b) throws Erro{int i,j;if (d==null) throw new Erro();if (a==null || b == null) throw new Erro();int nc = strlen(a) + strlen(b) + 1;if (d.length < nc) throw new Erro();for (i=0; i<strlen(a); i++) d[i] = a[i];}for (j=0; j<strlen(b); j++) d[i+j] = b[j];d[i+j] = \0;}private int strlen(char[] a){int i = 0;if ( a == null) return 0;while ((i < a.length) && (a[i]!=\0)) i++;return i;}//Construtoras de MyStringpublic MyString(int n) throws Erro{if (n < 0) throw new Erro();s = new char[n];length = 0;}public MyString( ){ this(80);}public MyString(char[] p) throws Erro {length = strlen(p);s = new char[length + 1];copy(s, p);}public MyString(Mystring str){length = str.length;s = new char[length+1];try {copy(s, str.s);} catch Erro { };}//Operacoes de stringpublic void assign(char[ ] c) throws Erro {copy(s,c); length = strlen(c);}public void print() {int k = strlen(s);for (int i=0; i< k; i++)System.out.print(s[i]);System.out.println();}//Definicao de Stringpublic void concat(MyString a, MyString b){length = a.length + b.length;s = new char[length+1];join(s, a.s, b.s);}public int length(){return length;}}Resumindo em quatro passos o que e preciso fazer para manter a consistencia de estados e interfaces. Primeiro e necessario identificar quais devem ser os invariantes de uma classe, ou seja, quais condicoes devem ser respeitadas durante a representacao ou alteracao de estado de um objeto. Segundo, os estados dos objetos devem ser definidos de forma consistente. Terceiro, a semantica de um campo deve ser a mesma em todas as operacoes nas quais ele esteja envolvido. Quarto, o invariante deve ser registrado na definicao da classe para facilitar a manutencao do codigo.Referencia:CARGILL, T. C++ Programming Style, Reading. 1. ed. Reading, MA: Addison-Welsey, 1992.
Assunto abordado por Cargill (1992) e Meyer (1997), uma funcao produz efeito colateral quando alem de retornar um valor, ela altera o estado do objeto que esta tratando, ou seja, ela muda o valor do objeto em questao. O efeito colateral pode ser necessario em alguns casos, mas, deve ser evitado por ser nocivo de forma geral. Para ilustrar a ocorrencia de efeito colateral, utilizaremos o seguinte exemplo simples:class A{int x = 0;public int calculoX(){ return x = x+1;}}Caso a funcao acima fosse utilizada como o teste de uma condicao, qual seria o resultado de if(a.calculoX() == a.calculoX()), para A? O resultado seria false, pois, na primeira vez em que a funcao e chamada ela retorna um, na segunda ela retorna dois. Nesse caso, as duas chamadas da funcao nao retornarao o mesmo valor. Uma situacao como essa pode prejudicar o raciocinio equacional.Na maior parte das vezes, o efeito colateral nas funcoes deve ser evitado, pois cada funcao deve ser executada em prol de um unico objetivo e sem surpresas a cada nova execucao da mesma. De toda forma, podemos analisar alguns casos onde seria benefico o uso do efeito colateral em funcoes. Depende da finalidade de uso da funcao. Todo objeto tem um estado abstrato e um estado concreto. O estado abstrato e o estado percebido pelo usuario do objeto. O estado concreto e o estado definido pela implementacao do objeto. Mudancas no estado concreto podem ou nao serem percebidas pelo usuario do objeto.O efeito colateral no estado abstrato do objeto e como ocorre no exemplo mostrado, o objeto sofreu um efeito colateral de forma que a cada vez que a funcao for chamada, ela retornara valores diferentes. Mas, no caso de efeito colateral no estado concreto do objeto, esse tipo de efeito colateral produz um efeito interno que nao e percebido externamente e e constantemente utilizado na implementacao de objetos como maquinas de estado. Como exemplo de aplicacao de efeito colateral no estado concreto do objeto, podemos citar o uso de variaveis que armazenam os valores dos ultimos objetos acessados de uma lista para facilitar a pesquisa e a insercao de itens na lista. Esse tipo de efeito colateral nao e nocivo e ajuda a reduzir o custo das operacoes.Outro exemplo muito interessante do uso do efeito colateral apenas no estado concreto e o funcionamento de uma memoria cache em um navegador de internet. Quando acessamos uma pagina web pela primeira vez, o navegador utilizado carrega todos os itens daquela pagina para exibi-lo, mas, ao acessar pela segunda vez, podemos notar que a pagina e carregada de forma mais rapida. Isso ocorre porque o cache trabalha com efeito colateral para armazenar a pagina visitada e exibi-la mais rapido nas proximas vezes em que ela for solicitada ao navegador. Essa e uma forma de utilizar efeito colateral de forma benefica ao resultado da execucao.Referencias:CARGILL, T. C++ Programming Style, Reading. 1. ed. Reading, MA: Addison-Welsey, 1992.MEYER, B. Object-Oriented Software Construction. 2. ed. New Jersey: Prentice Hall, 1997. Assunto abordado por Meyer (1997), um objeto pode assumir diferentes estados ao longo da execucao
Node previous, active, next;//Operacoes de IntList ...}// E criado o nodo Ativo para definir o nodo corrente da listapublic void start( ) throws ActiveError {if (empty( )) throw ActiveError( );previous = null;active = firstElement;next = active.right ;position = 1;}/* Metodo para alterar valor do nodo corrente da lista com custo O(1) */public void changeValue( int v)throws ActiveError {if (offLeft( ) || offRight( ))throw new ActiveError( );active.value = v;}// Metodo para pesquisar item na lista com custo O(n)public boolean search(int v) {try {for (start();!offRight() ; forth())if (active.value = v) return true;}catch(ActiveError e) { }return false;}/* Metodo para inserir item a direita do nodo corrente da lista com custo O(1) */public void insertRight(int v)throws InsertionError {Node node = new Node(v);if (empty() ) {firstElement = node; active = node;previous = null; next = null; position = 1;} else {if (offLeft( ) || offRight( ))throw new InsertionError( );node.right = next; active.right = node;previous = active; active = node;}nElements++;}// Metodo para deletar nodo corrente da lista com custo O(1)public void delete() throws DeletionError {if (offLeft() || offRight() || empty( ))throw new DeletionError( );active = next;if (active != null) next = ative.right;if (position == 1) {firstElement = active;if (firstElement == null) position = 0;} else previous.right = active;nElements--;}Note que a funcao pesquisar produz efeito colateral no objeto no sentido que ela pode alterar o indicador de elemento ativo da lista. Esse efeito esta definido na interface do tipo IntList.// Uso da nova classeclass User {public static void main(String[ ] a) {IntList q; boolean b; int v1=1;int v2=2, v3=3, v4=4, n=5;b = q.search(v1);v4 = q.value();q.go(n);q.insertRight(v2);q.changeValue(v3);q.delete();}}Na nova implementacao acima, apos ser criado o nodo ativo, as operacoes passaram a ser realizadas com base nos estados armazenados pelo nodo. Nesse caso, as novas operacoes, exceto search passaram a ter custo O(1).E interessante implementar objetos como maquinas de estado uma vez que armazenando os estados, e possivel obter melhorias como o acesso mais rapido dos dados em futuras execucoes. O uso dessa pratica proporciona economia no tempo de execucao, ou seja, mais rapidez e eficiencia.Referencias:MEYER, B. Object-Oriented Software Construction. 2. ed. New Jersey: Prentice Hall, 1997.BIGONHA, R.S.; BIGONHA, M. Programacao Modular. Notas de Aula DCC UFMG. Belo Horizonte: 2015.
e a outra truck em seus textos de identificacao. Esta operacao entao deve ser feita na superclasse e simplificada nas subclasses. Vamos entao, mover identify para superclasse e verificar a nova versao das classes Vehicle, Car e Truck no sistema de garagem://Classe veiculoclass Vehicle {private String plate;private String group;public Vehicle(string g, String p){group = g; p = plate;}public Vehicle(string g){this(g,null);}public String identify( ){String p = plate? plate : "<none>";return group + " with plate " + p;}}//Classe Carro, subclasse de Veiculoclass Car extends Vehicle {public Car(String p){super("car", p);}public Car( ){this(null);}}//Classe Caminhao, subclasse de Veiculoclass Truck extends Vehicle {public Truck(String p){super(truck",p);}public Truck( ){this(null);}}Referencia:CARDELLI, L.; WEGNER, P. On understanding types, data abstractions andpolimorphism, ACM Computing Surveys, 17, 451-522. 1985. Disponivel em < http://lucacardelli.name/papers/onunderstanding.a4.pdf>. Acesso em: 24 jan.2016.
O Som que Devia Estar nas Radios! Ola, queria comecar esse post dizendo que na minha lista de "albuns a comentar" estavam o novo album do Soufly (banda de Max Cavalera) e o novo album de Madonna (MDNA). Ouvi o album do Soufly e assisti um clipe da Madonna e os dois tem algo em comum: Nao me inspiraram o minimo de vontade de comentar, nem positivamente, nem negativamente. Mediocres... Vim mesmo e falar da nova banda de Mike Portnoy (ex-baterista do Dream Theater) e Steve Morse (guitarrista do Deep Purple desde 1995). Eles estao junto com Neal Morse (tecladista e cantor, toca com Portnoy numa banda cover de Beatles), Dave LaRue (baixista) e Casey McPherson (Vocal). O disco de estreia, lancado em 27 de marco, traz o nome da banda no titulo. Eu ouvi rapidamente na primeira vez, passando as faixas. Devo dizer que existem muitas introducoes enganosas, pois algumas musicas mudam bruscamente apos alguns segundos. E logico que depois ouvi o album na integra, bem mais de uma vez. O album nao e progressivo, nem um album de metal ou southern rock. E um album de rock, um bom e novo album de rock. Com faixas que se distinguem bem uma da outra, Flying Colors traz cancoes tristes, alegres e empolgantes. Devo destacar a faixa de abertura: Blue Ocean. Linda e empolgante, mostra uma mistura de teclado, guitarra, baixo, bateria... tudo NO PONTO! Kayla tem um pouco de nostalgia dos anos 80, um som energico. Ja The Storm traz uma cancao ao estilo "Coldplay" ou seja la a que banda voce queira comparar. Uma cancao mais lenta, mas sem perder a energia do disco. Uma das coisas que me encantou no disco, e na banda em geral, e que os mais famosos sao Steve Morse e Mike Portnoy, este ultimo um grande icone da bateria de todos os tempos. Mesmo assim o disco nao se prende a um show de bateria e guitarra. Sao cinco musicos fazendo musica. Espero que essa banda dure muito mais que um disco. Essa banda e nova pra mim. O disco e desse ano, de setembro. Incrivel. Tame Impala pode soar "mais do mesmo" se eu te disser que e um som retro e vintage. E a moda hoje em dia, soar como velho. No entanto aconselho que voces baixem Lonerism, oucam, e tirem suas proprias conclusoes. A voz do vocalista Kevin Parker e identica a voz de ninguem mais ninguem menos que John Lennon. E nao e pra imitar nao, voce nota que ele esta sendo natural, ele simplesmente nasceu com essa bencao. O disco em si vem cheio de faixas psicodelicas, como Be Above It, Why Won't They Talk to Me e outras pesadas como Elephant, musica de trabalho do album. Outra coisa que realmente me chamou a atencao, e tem sido um grande quisito pro disco ser bom, na minha opiniao, e que existem faixas muito FMicas, ou seja, uma banda dessas, por mais 'alternativa' que seja, podia muito bem caber no playlist de uma radio relativamente popular. Isso nao e bem
uma resenha do disco, e mais uma dica de um bom som pra se ouvir... principalmente pra quem curte aquele rock fim dos 60, inicio dos 70... e ... bem... John Lennon.Abracos!
Se voce curte games antigos, baixa emuladores, conseguiu aquele cdzinho safado com jogos de NES pra ps2 ou ainda tem uma lembranca clara de jogos de NES (que muitos no Brasil conheceram atraves do Dynavision), voce ja deve ter jogado todos os "Marios" possiveis e entre eles... jogou Super Mario Bros. 2 (que chamaremos de Mario 2) e ter se perguntado QUE MERDA E ESSA?Comeca o jogo, num menu muito bonito, e de cara ja vem a primeira surpresa, principalmente pra queles que jogaram Mario 1, Mario 3, Mario World e nunca tinham jogado o 2: Voce pode escolher entre Mario, Luigi, Toad e a Princesa pra jogar!O jogo comeca, tem uns bichinhos andando, como de costume, voce pula em cima deles e... surpresa no 2: ELES TE CARREGAM! E necessario apertar o B (mesmo botao onde voce corre) para que voce levante o bicho e B novamente pra que voce jogue ele em outro bicho, finalmente o eliminando. Sao esses e outros detalhes que geraram uma troca de cultura radical de Mario 1 para o Mario 2.Outro exemplo de mudanca radical e o tipo de "vida". No Mario 1 era assim: Voce comecava pequeninho, comia um cogumelo e ficava grande. Se um inimigo te atacava voce voltava a ficar pequeno e se fosse atacado novamente, antes de pegar um cogumelo, voce morria. Em Mario 2 voce leva algumas semana (risos) para entender como funciona a vida. Uma painel do lado esquerdo da tela mostra sua vida atraves de bolinhas. Voce raramente acha um cogumelo. Durante sua caminhada nas fases um coracaozinho sobe do chao ate o infinito, se voce o pegar sua vida aumenta. Se voce for atacado vai perdendo as bolinhas ate morrer, obvio.O cenario em Mario 2 e outra coisa que implica muito! Nao ha tijolos e moedas!! Pasmem NAO HA TIJOLOS OU MOEDAS! Os canos foram trocados por JARROS e os inimigos nao sao os mesmo de Mario 1.Que droga e essa? Ja vou te falar...A verdadeira historia, que explica porque Mario 2 e tao diferente assim, e a seguinte.Apos o sucesso de Mario 1 (Super Mario Bros.) em 1985, em 1986 foi desenvolvido no Japao a sequencia do jogo Mario 2. Mas nao era esse Mario 2 do qual a gente falou aqui em cima nao. Era um Mario que seguia todos os padroes do primeiro jogo, mas com grafico um pouco melhor e fases mais dificeis. O jogo foi lancado no Japao e antes de ser lancado nos EUA foi barrado pela Nintendo americana. A Nintendo americana achou o jogo muito dificil e achou melhor nao lanca-lo. Sem tempo para desenvolver um novo jogo a Nintendo dos EUA resolveu que seria melhor pegar um jogo japones desconhecido e adapta-lo para Mario. O jogo escolhido foi Doki Doki Panic (1987). Em DDP (doki doki panic) voce joga com uma familia arabe. Antes de cada fase voce escolhe se quer jogar com o filho, com a irma, com o pai ou com a mae. Isso te lembra alguma coisa? Exatamente. Mario 2, do qual o texto trata, nao
passa de um outro jogo com os personagens trocados para Mario, Luigi, Toad e a princesa. Alguns detalhes pequenos foram mudados para que o jogo ficasse mais familiarizado com a serie, mas mesmo assim o jogo e completamente diferente.Abaixo veja um gameplay de Mario 2 E DDP, respectivamente. Mario 2 foi lancado pela Nintendo dos EUA em 1988, e lancado no Japao com o nome de Mario USA.Super Mario All Star.Apos o sucesso de Super Mario World (1991) no Super Nintendo, a Nintendo resolveu relancar todos os jogos do Mario de NES (8 bit) para o Super Nintendo (ou SNES) em 16 bits.A coletanea lancada foi Super Marios All Stars (1993) e trazia Super Mario Bros, Super Mario Bros 2 e Super Mario Bros 3. Um quarto jogo nesta colecao era Super Mario Bros: Lost Leves (Fases Perdidas) que na verdade e aquele Super Mario Bros 2 feito pelos japas que a Nintendo americana achou muito dificil e nao quis lancar.E ai... voce se lembra desse mario diferentao? COMENTE! (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/pt_BR/all.js#xfbml=1"; fjs.parentNode.insertBefore(js, fjs);}(document, 'script', 'facebook-jssdk'));
Mondeofish, a banda da qual faco parte, lancou seu primeiro single nesta terca-feira. A Tarde Futil e o Cha da Vida que Envenena a Alma fala sobre futilidade de uma maneira simples e direta. Em breve lancaremos o video clip. Fique ligado! Ja fazem mais ou menos 2 anos desde que me interessei por ouvir e procurar alguns artistas de funk/soul (seja la como voce prefere chamar). Queria achar os grandes nomes, os alicerces dessa musica que ate hoje pode ser percebida como influencia desde a musica mais pop de algum videoclipe ate um som mais pesado, de qualquer banda de rock.E claro que nomes como James Brown e Stevie Wonder vieram logo a minha mente, mas ambos possuem uma discografia tao extensa que me desanimaram. Eu era so um iniciante no mundo do Soul.Entao os primeiros que busquei foram as grandes influencias do Red Hot Chilli Peppers: Sly and The Family Stone e Parliament/funckadelic. Fantasticos, ambos. Com aquele ritmo contagiante e inexplicavel do funk, com uma bateria reta, metais animadores e, quase sempre, vozes fantasticas. Depois disso cheguei a conhecer dezenas de artistas do estilo: Wild Cherry, Earth Wind and Fire, Herbie Hancock, Ecstacy Passion & Pain entre outros. O que todas essas musica tem em comum e que sempre possuem um tom muito alegre e animador. Nao e a toa que o estilo esta tao ligado a danca. Quando nao se trata de amor e diversao, os temas sao psicodelicos como a maluquice artistica em Mothership Connection, do Parliament.Estava um dia ouvindo "Let's Get it On" de Marvin Gaye. Sempre achei que ele era um desses caras com musicas cheias de conotacoes sexuais e coisas desse tipo. Ate que, lendo sobre ele na internet, descobri sua obra prima: What's Going On. Um album conceitual que trata de assuntos como a guerra no Vietna, da qual seu irmao era soldado, das relacoes familiares turbulentas, enfim, um retrato de sua vida naquele momento. Alias, "relacao familiar turbulenta" e uma coisa da qual Marvin conhecia bem. Ele e seu pai tinham constantes brigas, que combinadas com a loucura do sucesso e o provavel uso de drogas, faziam com que Marvin tivesse longas crises e depressoes. Mais tarde, em 1984, Marvin estava no fundo do poco de sua depressao e enojado da propria carreira. Foi quando decidiu se mudar pra casa de seus pais. Apos uma discussao com seu pai, foi deitar. Sua mae consolava-o quando seu pai entrou no quarto, segurando a arma presentada pelo proprio filho. Marvin Gaye morreu baleado pelo proprio pai.Esse disco, lancado em 1971, e uma quebra de paradigma, uma vez que seu funk esta recheado de letras tristonhas, filosoficas e questionadoras. E quase que um apelo emocional, uma vez que seu tom melancolico esta combinado com a voz linda de Marvin. Gaye provou a gravadora, a critica e ao publico que nao era apenas um artista com hits saltitantes e parcerias bem sucedidas. Ele tambem lutou pra que os musicos de estudio tivessem reconhecimento, sendo creditados no disco. Sem pretensoes, Gaye acabou se tornando o personagem principal de
sua propria epopeia dramatica. Tudo isso embalado por aquele velho ritmo negro, que botava todo mundo pra dancar e sorrir. E essa a grande magica de What's Going On. E uma ironia artistica, uma historia realista com um final triste. OUCA!