quarta-feira, 14 de março de 2012

Get multiples sequence of Genbank


Neste caso em particular, eu precisava obter uma lista de 150 genes de determinados organismos, usando Bioperl.  

Contando com a super ajuda do Rondon (de novo!)


#!/usr/bin/perl

use warnings;
use strict;
use Bio::SeqIO;
use Bio::DB::GenBank;
use Bio::DB::Query::GenBank;

my @genes = ("ARP3[TITL]", "PAB1[TITL]", "CAR2[TITL]", "SEC24[TITL]", "PRE9[TITL]", "GLC7[TITL]", "BIM1[TITL]", "BET2[TITL]", "ESA1[TITL]", "YSH1[TITL]", "CBR1[TITL]", "RFC4[TITL]", "TOP2[TITL]", "RSP5[TITL]", "BRR2[TITL]", "KIP3[TITL]", "YTA12[TITL]", "HOS2[TITL]", "YAK1[TITL]", "KIC1[TITL]", "YDJ1[TITL]", "TAF5[TITL]", "ROT2[TITL]", "RPN9[TITL]", "SAC1[TITL]", "SUL2[TITL]", "ADK1[TITL]", "BET3[TITL]", "KGD2[TITL]", "PSR1[TITL]", "SUI2[TITL]", "LSC2[TITL]", "MYO2[TITL]", "URA2[TITL]", "ALD5[TITL]", "HAS1[TITL]", "TOP1[TITL]", "SMC4[TITL]", "SER1[TITL]", "SUP35[TITL]", "SSC1[TITL]", "PHB1[TITL]", "FAL1[TITL]", "RFC2[TITL]", "CDC9[TITL]", "ILS1[TITL]", "CCC2[TITL]", "TCP1[TITL]", "PUF3[TITL]", "CRM1[TITL]", "UBA3[TITL]", "SKY1[TITL]", "CDC2[TITL]", "PUP1[TITL]", "MLH1[TITL]", "RPT1[TITL]", "URA6[TITL]", "CDC48[TITL]", "APL4[TITL]", "CLB2[TITL]", "ILV1[TITL]", "MET14[TITL]", "SOD2[TITL]", "RRM3[TITL]", "PIM1[TITL]", "TRM1[TITL]", "IMP4[TITL]", "PRO3[TITL]", "HHT2[TITL]", "YPK1[TITL]", "ALA1[TITL]", "PRP22[TITL]", "GRX4[TITL]", "SEC7[TITL]", "KAR3[TITL]", "CDC39[TITL]", "RSA4[TITL]", "VMA2[TITL]", "MTO1[TITL]", "KRE33[TITL]", "LYS12[TITL]", "VPS60[TITL]", "VAS1[TITL]", "FAA2[TITL]", "FUS3[TITL]", "VAC14[TITL]", "PRX1[TITL]", "NUG1[TITL]", "UTP15[TITL]", "YPT1[TITL]", "CDC47[TITL]", "PDI1[TITL]", "URK1[TITL]", "GLR1[TITL]", "TIM50[TITL]", "KIN28[TITL]", "VMA6[TITL]", "PRP46[TITL]", "PRC1[TITL]", "SSB2[TITL]", "SPT15[TITL]", "PGK1[TITL]", "SMC2[TITL]", "BMS1[TITL]", "TEF1[TITL]", "HMT1[TITL]", "SEC23[TITL]", "SUI3[TITL]", "COP1[TITL]", "RAD54[TITL]", "MCM2[TITL]", "AMD1[TITL]", "SEC26[TITL]", "FAA1[TITL]", "VMA5[TITL]", "VPH1[TITL]", "ADE12[TITL]", "CBK1[TITL]", "MSF1[TITL]", "ENO1[TITL]", "PDB1[TITL]", "BMH2[TITL]", "MIS1[TITL]", "ERG10[TITL]", "ARF2[TITL]", "NBP35[TITL]", "SEC17[TITL]", "LCB2[TITL]", "KRR1[TITL]", "ACT1[TITL]", "RPS3[TITL]", "SEC21[TITL]", "MAP1[TITL]", "CDC19[TITL]", "STT3[TITL]", "ATM1[TITL]", "RIP1[TITL]", "PWP2[TITL]", "HAT2[TITL]", "SER33[TITL]", "CCT5[TITL]", "PYC1[TITL]", "FBP26[TITL]", "TDH3[TITL]", "RET1[TITL]", "MTR4[TITL]", "MEF1[TITL]", "GLE2[TITL]", "DBP2[TITL]", "NMT1[TITL]");

my @organisms = ("Saccharomyces cerevisiae S288c [ORGN]");

foreach my $orgn_query (@organisms){
  my $seq_out = Bio::SeqIO -> new  (-format => 'fasta',
   -file => ">$orgn_query.fasta");
  foreach my $nucleotide (@genes){
    my $db_obj = Bio::DB::GenBank->new;
    my $query_obj = Bio::DB::Query::GenBank->new( -db    => 'nucleotide',
 -query => "$orgn_query AND $nucleotide" );
    my $gb_obj = Bio::DB::GenBank->new;
    my $stream_obj = $gb_obj->get_Stream_by_query($query_obj);
while (my $seq_obj = $stream_obj->next_seq) {
 $seq_out -> write_seq($seq_obj);
}
    }
}
exit;

segunda-feira, 27 de fevereiro de 2012

Um guia compreensivo dos grandes genomas de animais: o que sabemos e para onde estamos indo.


Resumo: O estudo da diversidade de tamanhos de genomas é um campo cada vez maior e altamente relevante no atual cenário do sequenciamento de DNA, cada vez mais rápido e eficiente. Os tamanhos de genomas animais variam de 0,02 a 132,83 pg (1pg = 978Mb) mas a maioria dos genomas animais são pequenos, com tamanho máximo inferior a 5 pg. Animais com grandes genomas (>10 pg) estão espalhados entre os invertebrados (incluindo os Platelmintos, Crustáceos e Orthoptera) e também entre os vertebrados (incluindo os Actinopterygii, Chondrichthyes e alguns anfíbios). Neste artigo, vamos explorar as conexões entre tamanho do genoma com fenótipo, fisiologia e ecologia destes organismos. Discutimos também, alguns dos mecanismos moleculares de redução e expansão do genoma obtido através de estudos comparativos entre espécies com sequências genômicas completas e como isso pode se aplicar às espécies com grande genomas. Como a maioria dos genomas das espécies animais sequenciados até o momento são genomas pequenos (especialmente invertebrados), devido aos custos de sequenciamento e das dificuldades associada com montagens de genoma de grandes dimensões, uma compreensão da composição estrutural deste grandes genomas é necessária. Estudos utilizando sequenciamento de nova geração (NGS) estão sendo utilizados pela primeira vez em animais com grandes genomas. Tais análises usando baixa cobertura genômica estão oferecendo uma visão da composição de elementos repetitivos em animais com genomas mais complexos. Estudos futuros permitirão uma melhor compreensão dos fatores que levam à obesidade genômica em animais.

France Dufresne & Nicholas Jeffer


sábado, 18 de fevereiro de 2012

Além do Ateu e do Ateísmo

Somos todos ateus perante o deus do outro.

"O Homem é quem faz a religião, e não a religião que faz o Homem. A religião é auto consciência e sentimento do Homem. O Homem é o mundo do homem, o estado e a sociedade. O estado e a sociedade inventam a religião."
Carl Max




quarta-feira, 15 de fevereiro de 2012

Curiosidades do Universo com Stephen Hawking.


Deus criou o Universo? A ciência te oferece uma outra explicação. E acredite, você será capaz de entender! Aprendamos um pouco com o Prof. Stephen Hawking.




terça-feira, 14 de fevereiro de 2012

Script Codon Usage


Esse script carrega em um hash a tabela de codon usage (reference) de 6.222 ORF's de leveduras, depois conta a frequência de códons de um arquivo de genes (query) e compara a frequência de códons da query x reference.

Versão beta (com super auxílio do Rondon)


#!/usr/bin/perl
use strict;
use warnings;
use Bio::SeqIO;
# use diagnostics;

die "\nUSAGE::: perl $0 [query.fasta] [reference.fasta(optional)]\n\n" if !$ARGV[0];

#gera tabela de codon usage para a query
my $query_file = $ARGV[0];
my %aux_query1= %{usage ($query_file)};

open(FILE, 'table_yeast_usage_parsed.txt') or die;

my %table_usage;

foreach my $line (<FILE>){
    chomp $line;
    if    ( $line =~ /^Codon/ ) { next }
    elsif ( $line !~ /\w/   ) { next }
    my ($codon,$aa,$contagem,$fraction) = split ('\t', $line);
#     print "$fraction'\n";
    $table_usage{$codon}{aa}=$aa;
    $table_usage{$codon}{contagem}=$contagem;
    $table_usage{$codon}{fraction}=$fraction;
}

# my $contagem_total = %{%usage_reference};

my $ref = contagem_aa_totais( \%aux_query1 );
my %hash = %{$ref};

my $ref2 = gera_valor_normalizado_reference(\%hash);
my %fraction_query = %{$ref2};

foreach my $key(sort {$fraction_query{$a}{aa} cmp $fraction_query{$b}{aa}} keys %fraction_query){ #acessar os valores dentro do hash
     print "$key\t$fraction_query{$key}{aa}\t$fraction_query{$key}{normalizado}\t$table_usage{$key}{fraction}\n";
  }

close FILE;

exit;

sub contagem_aa_totais {
#Faz a contagem total das aparicoes dos aa pra normalizar os valores. Pega o hash de dados da Referencia e insere os resultados na mesma tabela.

        my $ref = shift;
        my %usage_reference = %{$ref};

        #Gera array com os aa usados
        my @aa;
        while (my ($codon, $ref) = each %usage_reference) {
                my %valores = %{$ref};
                foreach my $key (keys %valores){
                        if ($key eq "aa") { push @aa, $valores{$key} }
                }
        }

        #soma o total de cada aa
        foreach my $a (@aa) {
                my $sum = 0;
                #soma cada aa
                foreach my $codon (keys %usage_reference){
                        if ( $a eq $usage_reference{$codon}{aa} ) { $sum += $usage_reference{$codon}{contagem} }
                }
                #insere o valor no hash
                foreach my $codon (keys %usage_reference){
                        if ( $a eq $usage_reference{$codon}{aa} ) { $usage_reference{$codon}{aa_totais} = $sum }
                }
        }
        return \%usage_reference;
}

sub gera_valor_normalizado_reference {

        my $ref = shift;
my %usage_reference = %{$ref};

        foreach my $codon (keys %usage_reference) {
                $usage_reference{$codon}{normalizado} = $usage_reference{$codon}{contagem} / $usage_reference{$codon}{aa_totais};
        }
        return \%usage_reference;
}

sub conta_codons {
# conta os codons de um arquivo fasta
        my $file_name = shift;

        my $file_obj = Bio::SeqIO -> new ( -file => $file_name,
                                           -format => 'fasta'   );

        #gera hash com a quantidade de vezes que cada codon aparece.
        my %codons;
        while (my $inseq = $file_obj->next_seq) {
                        # grava cada seq na variavel $sequence
                my $sequence = $inseq->seq();
                #anda de 3 em 3 (tem q ver se da certo)
                for(my $i=0; $i < (length($sequence) - 2) ; $i += 3){
                my $codon = substr($sequence,$i,3);
                #se o codon for novo na tabela, ele recebe o valor 1
                        if (!defined $codons{$codon}) { $codons{$codon} = 1 }
                        # se ele for recorrente, apenas soma 1.
                        else { $codons{$codon}++; }
                }
        }
        return \%codons;
}

sub gera_valor_normalizado_query {
#insere na tabela da query, qual e a freq normalizada (em %) de cada codon
# essa subrotina recebe dois valores: has_query e hash_referencia

        my $ref_query = shift;
        my %usage_query = %{$ref_query};

my $ref_reference = shift;
  my %usage_reference = %{$ref_reference};

        foreach my $codon (keys %usage_query) {
                $usage_query{$codon}{freq_codon_normalizada} = $usage_reference{$codon}{normalizado};
        }
        return \%usage_query;
}

sub table_aa {
#Verifica e salva quais sao os aa dos codons e suas freq
        my $ref = shift;
        my %codons = %{$ref};

        my %usage;
        foreach my $codon (keys %codons) {

        if ( $codon =~ /GC./i)        { $usage{$codon}{aa}= "ala"; $usage{$codon}{contagem}= $codons{$codon}; }    # Alanine
     elsif ( $codon =~ /TG[TC]/i)     { $usage{$codon}{aa}= "cys"; $usage{$codon}{contagem}= $codons{$codon}; }    # Cysteine
     elsif ( $codon =~ /GA[TC]/i)     { $usage{$codon}{aa}= "aca"; $usage{$codon}{contagem}= $codons{$codon}; }    # Aspartic Acid
     elsif ( $codon =~ /GA[AG]/i)     { $usage{$codon}{aa}= "glu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glutamic Acid
     elsif ( $codon =~ /TT[TC]/i)     { $usage{$codon}{aa}= "phe"; $usage{$codon}{contagem}= $codons{$codon}; }    # Phenylalanine
     elsif ( $codon =~ /GG./i)        { $usage{$codon}{aa}= "gly"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glycine
     elsif ( $codon =~ /CA[TC]/i)     { $usage{$codon}{aa}= "his"; $usage{$codon}{contagem}= $codons{$codon}; }    # Histidine
     elsif ( $codon =~ /AT[TCA]/i)    { $usage{$codon}{aa}= "iso"; $usage{$codon}{contagem}= $codons{$codon}; }    # Isoleucine
     elsif ( $codon =~ /AA[AG]/i)     { $usage{$codon}{aa}= "lys"; $usage{$codon}{contagem}= $codons{$codon}; }    # Lysine
     elsif ( $codon =~ /TT[AG]|CT./i) { $usage{$codon}{aa}= "leu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Leucine
     elsif ( $codon =~ /ATG/i)        { $usage{$codon}{aa}= "met"; $usage{$codon}{contagem}= $codons{$codon}; }    # Methionine
     elsif ( $codon =~ /AA[TC]/i)     { $usage{$codon}{aa}= "asp"; $usage{$codon}{contagem}= $codons{$codon}; }    # Asparagine
     elsif ( $codon =~ /CC./i)        { $usage{$codon}{aa}= "pro"; $usage{$codon}{contagem}= $codons{$codon}; }    # Proline
     elsif ( $codon =~ /CA[AG]/i)     { $usage{$codon}{aa}= "glu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glutamine
     elsif ( $codon =~ /CG.|AG[AG]/i) { $usage{$codon}{aa}= "arg"; $usage{$codon}{contagem}= $codons{$codon}; }    # Arginine
     elsif ( $codon =~ /TC.|AG[TC]/i) { $usage{$codon}{aa}= "ser"; $usage{$codon}{contagem}= $codons{$codon}; }    # Serine
     elsif ( $codon =~ /AC./i)        { $usage{$codon}{aa}= "thr"; $usage{$codon}{contagem}= $codons{$codon}; }    # Threonine
     elsif ( $codon =~ /GT./i)        { $usage{$codon}{aa}= "val"; $usage{$codon}{contagem}= $codons{$codon}; }    # Valine
     elsif ( $codon =~ /TGG/i)        { $usage{$codon}{aa}= "try"; $usage{$codon}{contagem}= $codons{$codon}; }    # Tryptophan
     elsif ( $codon =~ /TA[TC]/i)     { $usage{$codon}{aa}= "tyr"; $usage{$codon}{contagem}= $codons{$codon}; }    # Tyrosine
     elsif ( $codon =~ /TA[AG]|TGA/i) { $usage{$codon}{aa}= "stp"; $usage{$codon}{contagem}= $codons{$codon}; }    # Stop
     else { $usage{$codon}{aa}= "err"; $usage{$codon}{contagem}= $codons{$codon}; } # base diferente
     }

     return \%usage;
}

sub usage {
#conta codons num arquivo fasta ou multifasta e gera tabela com codon, aa e freq e outros dados
my $query_file = shift;

#fre de codons
my %codons = %{conta_codons($query_file)};

#associa a contagem dos codons com os aminoacidos
my %usage = %{table_aa(\%codons)};

return \%usage;
}

quarta-feira, 8 de fevereiro de 2012

quinta-feira, 2 de fevereiro de 2012

O passado é uma possibilidade

Se podemos apenas saber que uma partícula viajou de um ponto A a um ponto B, mas não observamos o caminho que ela fez para chegar ao seu destino, é possível concluir que ela, simultaneamente, fez todos os trajetos possíveis para construir a trajetória. Esse é um princípio da mecânica quântica, que explica: se qualquer evento no passado não foi observado e registrado, ele é tão indefinido quanto um evento futuro. Dessa forma, não se pode dizer que ele aconteceu de determinada maneira, e sim de todas as maneiras possíveis ao mesmo tempo. Loucura, totalmente plausível do Stephen Hawking não?

Contagem de códons em um genoma, usando Perl.


Carreguei um arquivo multifasta de genes, contei as trincas de códons, e joguei num hash com os códons, aminoácidos e frequência de cada códon.


#!/usr/bin/perl
use Bio::SeqIO;
use strict;
use warnings;

my $ref1 = conta_codons("genes_yeast.ffn");
my %codons = %{$ref1};

my $ref2 = table_aa(\%codons);
my %usage = %{$ref2};

my $last="a";

foreach my $codon (sort {$usage{$a}{name} cmp $usage{$b}{name}} keys %usage) {
if ($last eq $usage{$codon}{name}){ print "$codon\t$usage{$codon}{name}\t$usage{$codon}{contagem}\n";}
else { print "\n$codon\t$usage{$codon}{name}\t$usage{$codon}{contagem}\n"; }
$last = $usage{$codon}{name};
}

exit;

sub conta_codons {

my $file_name = shift;

        my $file_obj = Bio::SeqIO -> new ( -file => $file_name,
                                           -format => 'fasta'   );

        #gera hash com a quantidade de vezes que cada codon aparece.
        my %codons;
        while (my $inseq = $file_obj->next_seq) {
                        # grava cada seq na variavel $sequence
                my $sequence = $inseq->seq();
                #anda de 3 em 3 (tem q ver se da certo)
                for(my $i=0; $i < (length($sequence) - 2) ; $i += 3){
                my $codon = substr($sequence,$i,3);
                #se o codon for novo na tabela, ele recebe o valor 1
                        if (!defined $codons{$codon}) { $codons{$codon} = 1 }
                        # se ele for recorrente, apenas soma 1.
                        else { $codons{$codon}++; }
                }
        }
return \%codons;
}


sub table_aa {
     
my $ref = shift;
my %codons = %{$ref};

my %usage;
foreach my $codon (keys %codons) {

        if ( $codon =~ /GC./i)        { $usage{$codon}{name}= "ala"; $usage{$codon}{contagem}= $codons{$codon}; }    # Alanine
     elsif ( $codon =~ /TG[TC]/i)     { $usage{$codon}{name}= "cys"; $usage{$codon}{contagem}= $codons{$codon}; }    # Cysteine
     elsif ( $codon =~ /GA[TC]/i)     { $usage{$codon}{name}= "aca"; $usage{$codon}{contagem}= $codons{$codon}; }    # Aspartic Acid
     elsif ( $codon =~ /GA[AG]/i)     { $usage{$codon}{name}= "glu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glutamic Acid
     elsif ( $codon =~ /TT[TC]/i)     { $usage{$codon}{name}= "phe"; $usage{$codon}{contagem}= $codons{$codon}; }    # Phenylalanine
     elsif ( $codon =~ /GG./i)        { $usage{$codon}{name}= "gly"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glycine
     elsif ( $codon =~ /CA[TC]/i)     { $usage{$codon}{name}= "his"; $usage{$codon}{contagem}= $codons{$codon}; }    # Histidine
     elsif ( $codon =~ /AT[TCA]/i)    { $usage{$codon}{name}= "iso"; $usage{$codon}{contagem}= $codons{$codon}; }    # Isoleucine
     elsif ( $codon =~ /AA[AG]/i)     { $usage{$codon}{name}= "lys"; $usage{$codon}{contagem}= $codons{$codon}; }    # Lysine
     elsif ( $codon =~ /TT[AG]|CT./i) { $usage{$codon}{name}= "leu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Leucine
     elsif ( $codon =~ /ATG/i)        { $usage{$codon}{name}= "met"; $usage{$codon}{contagem}= $codons{$codon}; }    # Methionine
     elsif ( $codon =~ /AA[TC]/i)     { $usage{$codon}{name}= "asp"; $usage{$codon}{contagem}= $codons{$codon}; }    # Asparagine
     elsif ( $codon =~ /CC./i)        { $usage{$codon}{name}= "pro"; $usage{$codon}{contagem}= $codons{$codon}; }    # Proline
     elsif ( $codon =~ /CA[AG]/i)     { $usage{$codon}{name}= "glu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glutamine
     elsif ( $codon =~ /CG.|AG[AG]/i) { $usage{$codon}{name}= "arg"; $usage{$codon}{contagem}= $codons{$codon}; }    # Arginine
     elsif ( $codon =~ /TC.|AG[TC]/i) { $usage{$codon}{name}= "ser"; $usage{$codon}{contagem}= $codons{$codon}; }    # Serine
     elsif ( $codon =~ /AC./i)        { $usage{$codon}{name}= "thr"; $usage{$codon}{contagem}= $codons{$codon}; }    # Threonine
     elsif ( $codon =~ /GT./i)        { $usage{$codon}{name}= "val"; $usage{$codon}{contagem}= $codons{$codon}; }    # Valine
     elsif ( $codon =~ /TGG/i)        { $usage{$codon}{name}= "try"; $usage{$codon}{contagem}= $codons{$codon}; }    # Tryptophan
     elsif ( $codon =~ /TA[TC]/i)     { $usage{$codon}{name}= "tyr"; $usage{$codon}{contagem}= $codons{$codon}; }    # Tyrosine
     elsif ( $codon =~ /TA[AG]|TGA/i) { $usage{$codon}{name}= "stp"; $usage{$codon}{contagem}= $codons{$codon}; }    # Stop
     else { print STDERR "Bad codon \"$codon\"!!\n" }
     }

     return \%usage;
 }

terça-feira, 31 de janeiro de 2012

Imagine, junto com John Lennon 

"Imagine o mundo sem ataques suicidas, sem o 11/9, sem o 7/7 londrino, sem as Cruzadas, sem caça às bruxas, sem a Conspiração da Pólvora, sem a partição da Índia, sem as guerras entre israelenses e palestinos, sem massacres sérvios/croatas/muçulmanos, sem a perseguição de judeus como "assassinos de Cristo", sem os "problemas" da Irlanda do Norte, sem "assassinatos em nome da honra", sem evangélicos televisivos de terno brilhante e cabelo bufante tirando dinheiro dos ingênuos. Imagine o mundo sem o Talibã para explodir estátuas antigas, sem decapitações públicas de blasfemos, sem o açoite da pele feminina pelo crime de ter se mostrado em um centímetro."
Richard Dawkins. Deus, um Delírio. página 24. 
Salvar um nome para um ip e conectar via ssh sem senha (via Cacique Raony)


Primeiro vamos editar e salvar o arquivo de hosts em /etc  (na sua máquina), adicionando os ips seguidos dos nomes dos servidores:

$ vi /etc/hosts


150.164.37.241 chaves
150.164.37.168 kiko

Ao conectar use o nome ao invés do ip, ex:

$ ssh -X thiagomafra@kiko

Agora, para conectar sem ter que digitar a senha:


No seu computador:


$ ssh-keygen -t rsa
$ scp ~/.ssh/id_rsa.pub user@example.com:~/
$ ssh user@host


No computador de destino:


$ mkdir .ssh
$ cat id_rsa.pub >> .ssh/authorized_keys
$ rm id_rsa.pub

$ chmod go -w ~
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssg/authorized_keys




Ou então, mais fácil ainda:

$ ssh-copy-id user@host

segunda-feira, 30 de janeiro de 2012

Python e Bioinformática

Bioinformatics Programming Using Python!





"It is undeniable that Python is catching up, although some areas seem to be still much more better served by Perl. As a Python fan now learning Perl, what I see may decide what language will be more popular in the future is going to be played between Perl's broader base of code versus Python's more readable and 'logical' (to my mind at least) code. I'll bet on Python becoming more popular just because, having learned it, you can really express yourself naturally without straining your mind and I believe that this is going to be more important for that class of people described as 'non-typical programmers', among which science students and researchers belong most of the time, having had no formal and solid programming teaching."

quarta-feira, 18 de janeiro de 2012

Carregar e ordenar uma matriz em Perl

Estava precisando carregar uma matriz 15x10 e ordenar os números desta matriz em ordem crescente.


#!/usr/bin/perl


use strict;
use warnings;


open INFILE, '<matriz.txt' or die $!;


  my @matriz=<INFILE>;
  close INFILE;
    print " Matriz desordenada \n\n @matriz\n\n";
      print " Matriz ordenada \n\n";
#ordenar a matriz
      foreach my $linha (@matriz){
 chomp $linha;
 my @numeros =  split " ", $linha;
 my @matriz_ordenada = sort @numeros;
 foreach my $numeros_ordenados (@matriz_ordenada) {
     print " $numeros_ordenados "
    }
print "\n";
}
exit;  


Output do script abaixo:

Matriz desordenada

 03 16 15 11 10 06 21 08 14 01 09 24 19 18 20
 24 22 13 03 05 21 17 18 19 20 04 11 02 25 14
 05 20 15 04 09 07 22 13 24 16 11 21 01 10 14
 03 07 24 19 08 01 11 23 22 14 16 15 02 25 18
 04 06 12 22 07 21 20 09 15 03 14 24 10 18 02
 22 18 03 08 04 21 19 06 02 25 23 10 09 16 15
 10 21 25 01 22 18 13 02 16 06 07 14 08 19 09
 17 04 20 21 16 10 19 13 12 03 22 23 25 14 08
 04 14 25 08 23 05 13 03 01 10 02 07 20 06 09
 08 24 15 23 02 18 11 21 25 20 17 14 22 05 10
 15 17 08 16 11 24 14 22 05 23 02 13 06 03 10

 Matriz ordenada

01 03 06 08 09 10 11 14 15 16 18 19 20 21 24
02 03 04 05 11 13 14 17 18 19 20 21 22 24 25
01 04 05 07 09 10 11 13 14 15 16 20 21 22 24
01 02 03 07 08 11 14 15 16 18 19 22 23 24 25
02 03 04 06 07 09 10 12 14 15 18 20 21 22 24
02 03 04 06 08 09 10 15 16 18 19 21 22 23 25
01 02 06 07 08 09 10 13 14 16 18 19 21 22 25
03 04 08 10 12 13 14 16 17 19 20 21 22 23 25
01 02 03 04 05 06 07 08 09 10 13 14 20 23 25
02 05 08 10 11 14 15 17 18 20 21 22 23 24 25
02 03 05 06 08 10 11 13 14 15 16 17 22 23 24

quarta-feira, 26 de janeiro de 2011

Filosofia do Sucesso

Quando estava no 1º ano do ensino médio, isso em meados de 1998 (putz, faz tempo!) tive aula de Literatura com a saudosa professora Lígia Mattos. Apesar de nossa amizade antiga, ela sempre foi muito exigente, e me recordo com louvor de um momento em sala de aula que vou partilhar aqui:


Liginha nos passou um texto para decorar e ser proclamado em sala de aula. Claro que não seria possível que todos os 40 alunos apresentassem o texto, e já prevendo isso, fui crente que eu não seria escolhido para tal. Resultado: me ferrei! Ela me chamou e eu não havia decorado o texto. Além do puxão de orelha (que sempre esteve presente em todos os momentos da minha vida acadêmica) fui escalado para a próxima aula, e assim, obrigado a decorar o texto. Detalhe: digitei o texto no Windows 95 e o tenho até hoje em meus arquivos.


Nunca esqueci este texto. Faz parte da minha vida, e sempre recordo, com muito carinho, da FILOSOFIA DO SUCESSO.


Se você pensa que é um derrotado,
você será derrotado.
Se não pensar, quero a qualquer custo,
Não conseguirá nada.
Mesmo que queira vencer, mas pensa que
não vai conseguir,
A vitória não sorrirá para você.


Se você fizer as coisas pela metade
Você  será um fracassado.
Nós descobrimos neste mundo
que o sucesso começa pela intenção da gente,
e tudo se determina pelo nosso espírito.



Se você pensa que é um malogrado,
você se torna como tal.
Se você almeja atingir uma posição mais elevada
Deve, antes de obter a vitória
Dotar-se da convicção de que conseguirá infalivelmente.


A luta pela vida, nem sempre é vantajosa
aos fortes, nem aos espertos.
Mais cedo ou mais tarde,
Quem cativa a vitória é aquele que crê plenamente:
"EU CONSEGUIREI"



Napoleon Hill

sexta-feira, 31 de dezembro de 2010

Fim da década 00

Último dia do ano, último dia da década. Havia reservado esse dia pra uma postagem "especial", avaliando e planejando um novo ano. Mas muita coisa aconteceu essa última semana, e apesar de estar aqui postando, estou um pouco sem paciência pra tentar escrever tudo que gostaria. Any way!

2010 foi um ano incrível pra mim. Muita coisa boa aconteceu. Acho que as coisas boas superaram de longe as coisas ruins, e farei de tudo pra 2011 ser muito melhor do que foi esse ano. Meus pais estão bem, com saúde. Meu irmão formou, está empregado (e bem empregado!), projeto aceito no CNPq, passei no doutorado, fiz novos amigos, estou muito bem adaptado em BH e principalmente, a Ju finalmente está perto de mim.

Mas nem tudo são flores no jardim da vida: o Flamengo teve um ano péssimo!

Tenho algumas metas pra 2011 e fiz questão de postá-las no twitter pra eu mesmo não me esquecer. Tomara que consiga alcançar a maioria dessas 10 metas. http://twitter.com/#!/thiagomaframg/status/19164903357030400

Mas a principal meta pra minha vida nesse novo ano, é ser uma pessoa melhor. Melhor para minha namorada, melhor para meus pais, pro meu irmão, melhor para meus amigos (novos e antigos), melhor pra mim mesmo. Cada dia que passa me convenço de que quanto mais velho ficamos, mais difícil é fazer (bons) amigos, e se não cultivarmos os bons e antigos, ficar sozinho acaba sendo nossa sentença de vida.

Enfim, falta inspiração. Quando ela voltar, volto junto.

Feliz 2011 a todos. Muitos sonhos e principalmente, muita garra pra realizá-los. Tudo de melhor, sempre!

quinta-feira, 9 de dezembro de 2010

Eu sei, mas não devia.

Eu sei que a gente se acostuma, mas não devia.


"A gente se acostuma a morar em apartamentos de fundos e a não ter outra vista que não as janelas ao redor. E porque não tem outra vista, logo se acostuma a não olhar para fora. E porque não olhar para fora, logo se acostuma a não abrir de todo as cortinas. E porque não abre as cortinas, logo se acostuma a acender mais cedo a luz. E à medida que se acostuma, esquece o sol, esquece o ar, esquece a amplidão.

A gente se acostuma a acordar de manhã, sobressaltado porque está na hora. A tomar café correndo porque está atrasado. A ler o jornal no ônibus, não dá para almoçar. A sair do trabalho porque já é noite. A cochilar no ônibus porque está cansado. A deitar cedo e dormir pesado sem ter vivido o dia.

A gente se acostuma a abrir o jornal e ler sobre a guerra. E aceitando a guerra aceita os mortos e que haja números para os mortos. E aceitando as negociações de paz aceita ler todo dia, de guerra, dos números, da longa duração.

A gente se acostuma a esperar o dia inteiro e ouvir no telefone: hoje não posso ir. A sorrir para as pessoas sem receber um sorriso de volta. A ser ignorado quanto precisava tanto ser visto.

A gente acostuma andar na rua e ver cartazes. A abrir as revistas e ver anúncios, a ligar a televisão e assistir a comerciais. A ir ao cinema e engolir publicidade. A ser instigado, conduzido, esnorteado, lançado na infindável catarata dos produtos.

A gente se acostuma a pagar por tudo o que deseja e o que necessita. E a lutar por ganhar o dinheiro com que paga. E a ganhar menos do que precisa. E a fazer fila para pagar. E a pagar mais do que as coisas valem. E a saber que cada vez pagará mais. E a procurar mais trabalho, para ganhar mais dinheiro, para ter com que pagar nas filas em que se cobra.

A gente se acostuma à poluição. À luz artificial de ligeiro tremor. Ao choque que os olhos levam na luz natural. Às bactérias de água potável, à contaminação da água do mar. À lenta morte dos rios. Se acostuma a não ouvir passarinhos, a não ter galos na madrugada, a temer a hidrofobia dos cães, a não colher fruta do pé, a não ter sequer uma planta.

A gente se acostuma a coisas demais, para não sofrer. Em doses pequenas, tentando não perceber, vai afastando uma dor aqui, um ressentimento ali, uma  revolta acolá. Se o cinema está cheio, a gente senta na primeira fila e torce um pouco o pescoço. Se a praia está contaminada, a gente molha só o pé e sua no resto do corpo. Se o trabalho está duro, a gente se consola pensando no fim de semana. E se no fim de semana não há muito o que fazer, a gente vai dormir cedo e ainda fica satisfeito porque tem sempre sono atrasado.

A gente se acostuma para não se ralar na aspereza, para preservar a pele. Se acostuma para evitar feridas, sangramentos, para esquivar-se da faca e da baioneta, para poupar o peito. A gente se acostuma para poupar a vida. Que aos poucos se gasta, e que de tanto acostumar, se perde de si mesma."


Marina Colasanti - extraído do livro "Eu sei, mas não devia", Editora Rocco - Rio de Janeiro, 1996, pág. 09.


PS.: Agradeço ao @leocarnevalli pela referência e pelo puxão de orelha!

terça-feira, 7 de dezembro de 2010

The Beggining


Motivado pelo Dr. @leocarnevalli, decide criar um blog, como parte integrante dos planos pra 2010. Aqui vou tentar falar um pouco de tudo, ou pelo menos de tudo que me interesse ou rodeie. Pra começar, texto sempre bom de ler, em quaisquer circunstância.

Sigam-me os bons @thiagomaframg


"Depois de algum tempo, você aprende a diferença, a sutil diferença, entre dar a mão e acorrentar uma alma. E você aprende que amar não significa apoiar-se, e que companhia nem sempre significa segurança. E começa a aprender que beijos não são contratos e presentes não são promessas. E começa a aceitar suas derrotas com a cabeça erguida e olhos adiante, com a graça de um adulto e não com a tristeza de uma criança.


E aprende a construir todas as suas estradas no hoje, porque o terreno do amanhã é incerto demais para os planos, e o futuro tem o costume de cair em meio ao vão. Depois de um tempo você aprende que o sol queima se ficar exposto por muito tempo. E aprende que não importa o quanto você se importe, algumas pessoas simplesmente não se importam... E aceita que não importa quão boa seja uma pessoa, ela vai feri-lo de vez em quando e você precisa perdoá-la, por isso. Aprende que falar pode aliviar dores emocionais.

Descobre que se levam anos para se construir confiança e apenas segundos para destruí-la, e que você pode fazer coisas em um instante das quais se arrependerá pelo resto da vida. Aprende que verdadeiras amizades continuam a crescer mesmo a longas distâncias. E o que importa não é o que você tem na vida, mas quem você tem na vida. E que bons amigos são a família que nos permitiram escolher. Aprende que não temos que mudar de amigos se compreendemos que os amigos mudam, percebe que seu melhor amigo e você podem fazer qualquer coisa, ou nada, e terem bons momentos juntos.

Descobre que as pessoas com quem você mais se importa na vida são tomadas de você muito depressa, por isso sempre devemos deixar as pessoas que amamos com palavras amorosas, pode ser a última vez que as vejamos. Aprende que as circunstâncias e os ambientes tem influência sobre nós, mas nós somos responsáveis por nós mesmos. Começa a aprender que não se deve comparar com os outros, mas com o melhor que pode ser. Descobre que se leva muito tempo para se tornar a pessoa que quer ser, e que o tempo é curto. Aprende que não importa onde já chegou, mas onde está indo, mas se você não sabe para onde está indo, qualquer lugar serve. Aprende que, ou você controla seus atos ou eles o controlarão, e que ser flexível não significa ser fraco ou não ter personalidade, pois não importa quão delicada e frágil seja uma situação, sempre existem dois lados.

Aprende que heróis são pessoas que fizeram o que era necessário fazer, enfrentando as conseqüências. Aprende que paciência requer muita prática. Descobre que algumas vezes a pessoa que você espera que o chute quando você cai é uma das poucas que o ajudam a levantar-se.

Aprende que maturidade tem mais a ver com os tipos de experiência que se teve e o que você aprendeu com elas do que com quantos aniversários você celebrou. Aprende que há mais dos seus pais em você do que você supunha. Aprende que nunca se deve dizer a uma criança que sonhos são bobagens, poucas coisas são tão humilhantes e seria uma tragédia se ela acreditasse nisso.

Aprende que quando está com raiva tem o direito de estar com raiva, mas isso não te dá o direito de ser cruel. Descobre que só porque alguém não o ama do jeito que você quer que ame, não significa que esse alguém não o ama, contudo o que pode, pois existem pessoas que nos amam, mas simplesmente não sabem como demonstrar ou viver isso.
Aprende que nem sempre é suficiente ser perdoado por alguém, algumas vezes você tem que aprender a perdoar-se a si mesmo. Aprende que com a mesma severidade com que julga, você será em algum momento condenado. Aprende que não importa em quantos pedaços seu coração foi partido, o mundo não pára para que você o conserte. Aprende que o tempo não é algo que possa voltar para trás.

Portanto... plante seu jardim e decore sua alma, ao invés de esperar que alguém lhe traga flores. E você aprende que realmente pode suportar... que realmente é forte, e que pode ir muito mais longe depois de pensar que não se pode mais. E que realmente a vida tem valor e que você tem valor diante da vida!"

William Shakespeare