Comentários Etapa2 / Testes cliente e servidor

por André Meneghelli -

Olá, tive alguns problemas para conseguir fazer os testes adequados do servidor/cliente na Etapa2. Como ainda não vi nenhum comentário sobre esta etapa estou preocupado quanto este tópico.

Como deve ser um teste para cliente/servidor?

Palestra do Maurício Aniche amanhã

por Alfredo Goldman -

Olá Pessoal,

    Amanhã, na última aula do curso, teremos a visita do Maurício. Ele é um super especialista em testes e autor de um livro sobre TDD. Para quem quiser ver algo antes da aula, basta procurar
 no google pelo nome dele.

Abraço,

Alfredo

Palestra do Alexandre Freire amanhã

por Alfredo Goldman -

Olá Pessoal,

    Amanhã teremos um hands-on com o Alexandre Freire no CEC, sala 02 às 10hs.

Quem quiser já dar uma olhada em alguma das palestras dele, basta procurar no google por Alexandre Freire Agile.

Abraço,

Alfredo

ps: Segue a lista com as senhas para usar amanhã

 

 

Como deixar o servidor acessível, sem ser pelo local host?

por Fernanda de Camargo Magano -

Olá pessoal!

Vocês sabem como permitir a visibilidade do servidor para outras máquinas, além do local host?

Tentamos "app.run('0.0.0.0', 8080)" e 'app.run('0.0.0.0', debug=False)'

mas ocorrem erros com o cliente.

Alguém sabe como resolver?

pokemon.xsd

por André Meneghelli -

Olá, usei a biblioteca lxml para validar o XSD e fiz duas alterações para funcionar e modifiquei o nome pra battle_state.xsd. Já que se trata de um estado de batalha e não um pokémon.

  1. Limitei o id dos ataques pra [1-4]. O id 0 está servindo de acesso ao struggle como sugerido aqui.
  2. Limitei os tipos dos ataques para apenas uma ocorrência.

Estão corretas estas modificações? Posso mantê-las?

Outro detalhe é a instalação do lxml e do flask. Consegui instalar o lxml apenas no python3.2 e o flask apenas no 3.4. Obviamente isso não está dando certo e pretendo substituir o flask e continuar trabalhando com o lxml. Alguém fez isso, tem alguma sugestão?

Estrutura xml

por Giovana Delfino -

Olá pessoas.

Temos uma dúvida sobre o arquivo .xsd, no modelo fornecido temos o seguinte código para  se referir à vida do pokemon:

<xs:element name="health" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="255"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

Porém não temos o valor deste atributo, assim como em todos os outros. Supusemos que o arquivo dado era apenas o modelo e logo, nós deveríamos inserir os valores, dessa forma, pensamos que bastaria adicionar o campo "value" na estrutura, obtendo algo como:

<xs:element name="health" value="1000" minOccurs="1" maxOccurs="1">

e nesse caso as demais linhas permanecem as mesmas. A pergunta é: é dessa forma mesmo que deve ser feito?

@Properties vs Getters e Setters

por Christian Massao Tsujiguchi Takagi -

Gostaria de saber se há algum problema para o curso, utilizar properties nos nossos códigos. Parece que é a maneira pythonica de se trabalhar com as variáveis, tratando de limitadores, etc. com a vantagem de ser uma forma mais intuitiva para o usuário.

Eu sei que teoricamente quebramos o escopo, mas já vimos que em python, na verdade, tudo é público mesmo...

miniep6 prazo

por André Meneghelli -

Olá, estive pensando em arrumar o meu primeiro código em python para o miniep6. (um reprodutor de eventos de teclado e mouse)

Mas certamente não conseguirei finalizar no prazo.

A etapa2 inteira teve minieps durante o período em que esteve disponível.

Será possível adiar o miniep6 pra semana do break?

Ataques dos pokemons

por André Meneghelli -

Meu projeto possui algumas classes que visavam a ocorrencia de movimentos que não diminuissem HP.

Como isso não será utilizado gostaria de rever as classes envolvidas, mas pra isso é interessante ter a lista de ataques permitidos.

Será que é possível passa-la antes de ter que entregar a etapa 2?

Duvida HTTP requests e FLASK

por Eric Lee -

Pelo que eu entendi o flask não chega a fazer requests só receber e analisa-los, por isso usei um outro modulo (requests) para fazer isso. Quando uso uma rota gerada pelo flask para fazer um request (get ou post) em outras páginas tudo ocorre bem, mas usando em uma URL gerada pelo próprio flask a página fica em loading e nada acontece.

Tentei usar os responses do flask mas também não funcionou. Alguem pode me ajudar?

Exemplo de XML e duvidas sobre o XSD

por Eric Kenji Yoshikawa -

Criei um exemplo simples de XML, no caso tem 2 pokemons , mas pode facilmente ser testado com 1 só.

Fiz o teste de validação com o arquivo .xsd  disponibilizado  e funcionou, mas tenho algumas duvidas:

1- No trecho:

         <xs:element name="power" minOccurs="1" maxOccurs="1">
                    <xs:simpleType>
                      <xs:restriction base="xs:integer">
                        <xs:minInclusive value="0"/>
                        <xs:maxInclusive value="100"/>
                      </xs:restriction>
                    </xs:simpleType>
        </xs:element>

Não tenho certeza, mas o power dos moves dos pokemons não pode ser maior que 100?

2- Com relação ao HP, eu estava utilizando o valor bruto, no caso HP = 400, mas aparentemente existe uma fórmula que calcular o valor do HP de acordo com um valor entre 0-255. Não tinha visto isso antes.

3- No caso dos ataques:

<xs:element name="type" minOccurs="1" maxOccurs="2">

Cada ataque tem somente 1 tipo ou existem ataques de 2 tipos?

 

De qualqer forma o arquivo em anexo é compativel com o pokemon.xsd

Dinamica cliente-servidor - ep parte 2

por Giovana Delfino -

Oi pessoas.

Não sabemos se estamos fazendo a interação cliente-servidor corretamente. O enunciado não ficou claro, então seria:

1- o servidor é iniciado primeiro,ele lê o próprio pokemon e fica aguardando

2- o cliente é iniciado, lê o proprio pokemon e o envia para o servidor via POST em um objeto battle_state contendo apenas o proprio pokemon (do cliente)

3- servidor responde com objeto battle_state contendo dois pokemons com o ataque cliente-servidor já contabilizados se o servidor começa (caso contrario devolve os dois pokemons sem alteracao)

4- a partir disso o cliente envia o ataque desejado e o servidor contabiliza e responde com o seu ataque tambem calculado

Se essa for a forma correta nosso programa deve ler (via linha de comando, talvez) se deve inicializar modo servidor ou cliente, certo? Nesta lógica como garantiremos que ao inicializar como cliente o oponente iniciará como servidor e vice-versa?

Dúvidas XML

por Eduardo Bier -

Olá! Estamos com dúvida com relação ao arquivo XML. Quem é responsável por editar? Somente o servidor ou o cliente também pode/deve alterar? Caso ele não possa, como se dá a comunicação entre eles? Além disso, seria possivel postar o material da aula do dia 07/11? 

yacc.parse()

por André Meneghelli -

Eu gostaria de conseguir retornar o resultado do analisador e não imprimir. De preferência sem fazer alguma gambiarra mirabolante.

Procurei bastante e não encontrei nada de como fazer isso, alguém sabe?

Miniep 5 - Números negativos

por André Meneghelli -

Estive pensando e números negativos causariam ambiguidade. Por exemplo:

calc> 2 3 4 * - 2 / - 2 *

Poderia resultar tanto em 10 como 16.

Pensei em duas soluções:

  1. Operador para número negativo: Colocando um operador a mais como \- que simboliza o número negativo resolveria o problema;
  2. Não existem números negativos: Então para utilizar um número negativo basta inserir algo como 0 2 - ao invés de -2.

Qual solução devo utilizar? Existe alguma outra?

Etapa 2 do Projeto

por Eric Lee -

Vai ter alguma aula aprofundando um pouco o assuntos que a etapa 2 abrangem, como os http requests e o flask?

miniep 5

por Eric Lee -

Algumas dúvidas sobre o miniep5,

devo implementar também cálculos com váriaveis?

alem do lex do pacote posso usar o yacc a vontade?

no meu código deve estar bem definido as regras do algoritmo de conversão da para notação posfixa, ou posso fazer como no exemplo do PLY?

 

Mensagem sobre RDs

por Alfredo Goldman -

Olá Pessoal,

   Segue abaixo a mensagem que recebi. Vamos conversar a respeito amanhã na aula.

Alfredo

Boa tarde, professoras e professores,
 
Nos dias 17, 18 e 19 de Novembro serão realizadas as eleições para Representantes Discentes (RD) no instituto. Visando uma maior adesão do corpo discente a essas vagas, o CAMat, junto aos atuais representantes, organizará um evento para divulgar informações a respeito de RD's, tais como as suas funções e para que serve cada uma das comissões e colegiados, além de como os estudantes devem proceder para se candidatarem a essas vagas.
Tendo em vista a notável importância de RD's dentro do instituto, uma vez que são encarregados de defender os interesses e pautas dos estudantes por estarem em contato com as exigências cotidianas desse meio estudantil, é fundamental que este evento seja amplamente divulgado. Nesse sentido, gostaríamos de solicitar, se for possível, que cada docente avise nas salas durante as aulas sobre o evento em questão, mencionando a data, o horário e, principalmente, sua importância. Além disso, gostaríamos de avisar que passaremos rapidamente em sala nos próximos dias para ampliar a divulgação.
 
Conforme o cartaz em anexo, seguem as informações do evento:
 
Palestra: Entenda a função RD
Data: Quarta-feira (05/11)
Horário: Às 13h e às 18h
Local: Saguão do bloco B
 
Agradecemos a colaboração,
Atenciosamente CAMat

Etapa 2 do projeto - Struggle

por Gabriel Ogawa -

Olá, 

Como struggle é um ataque de certa forma especial, podemos convencionar que o ID 5 na request de ataque indica o uso de struggle?

(supondo que os id significa a posição do ataque numa lista de ataques que normalmente vai de 1 à 4)

Mini ep 5

por Gabriel Ogawa -

Olá!

No post do fórum e na página de entrega do mini EP 5 foi dito que é um EP de flex e Bison, mas o enunciado fala para fazer completamente em Python usando o PLY. 

Só para confirmar, é para o EP ser feito com o PLY?

Ops - Data de entrega da Etapa1 do Projeto

por Christian Massao Tsujiguchi Takagi -

Professor... então...

Sabe como dessa vez, diferentemente das outras vezes, o horário de entrega ficou para as 00:00, contra os costumeiros 23:55? Pois é, pensamos que fosse para entregar hoje e nem nos preocupamos em conferir, porque não teria aula hoje nem terça.

Era pra entregar até ontem mesmo? Só nós cometemos esse erro? perplexo

Aulas essa semana

por Alfredo Goldman -

Olá Pessoal,

    Apenas avisando, as aulas voltam ao normal essa semana. Na quarta vou ensinar mais um padrão de projeto e na sexta, graças a pedidos, combinei uma aula com um guru de
 Python, o Luciano Ramalho.

   Preparem as suas dúvidas mais profundas de Python!

Abraço,

Alfredo

Entrada pela linha de comando

por Thiago Gomes -

Como nessa fase nosso programa recebe dois pokemons de uma vez, pois o usuário vai jogar contra ele mesmo com pokemons diferentes a cada turno, eu queria saber se ao invés de usar o stdin:

python3 main.py < pokemon1.txt pokemon2.txt

Eu não posso usar argv, e aí o usuário entra com dois arquivos de pokemons:

python3 main.py pokemon1.txt pokemon2.txt

Pelo menos acho mais ideal para essa fase, até porque eu testei python3 main.py < pokemon1.txt pokemon2.txt e apenas o primeiro é redirecionado para o stdin.

Redirecionamento do stdout

por Christian Massao Tsujiguchi Takagi -

Olá. Estou com um problema e gostaria de saber se alguém tem uma idéia pra me ajudar.

Preciso testar uma função que é basicamente um show(), ou seja, uma coletânia de print()'s.
Para tanto, pensei em redirecionar o stdout da seguinte maneira:

sys.stdout = open('file', 'w')

Então, quando rodo uma função que imprime um texto com print(), o texto vai diretamente para o arquivo file.
Meu problema é que, depois de imprimir as informações, recebo um erro estranho:


AttributeError: '_io.TextIOWrapper' object has no attribute 'getvalue'


Minha dúvida é de onde vem esse erro, pois meu chute é que seja do unittest. Se for isso mesmo, como posso testar valores do stdout com o unittest, sem fazer essa "gambi"?

Turno

por André Meneghelli -

Bom, depois de ler a respeito, não me contentar e instalar o Pokemon Red no meu celular percebi que alterar a ordem do ataque não é suficiente já que o Quick Attack que gostaríamos de implementar sofre o desempate por velocidade apenas quando ambos pokemons a utilizam.

Então fiz uma classe pra controle do turno que gerencia a ordem de duas habilidades usadas pelos dois pokemons do duelo.

Isso fez com que a ordem de escolha dos ataques seja irrelevante o que me fez alterar um pouco a dinâmica do meu programa (sem a marcação de quem é o turno, já que isso não faz sentido):

26 - Rattata
31 - Charmander

Ataques de Rattata
1 - Tackle (20/20)
2 - Quick Attack (40/40)
Selecione um ataque para Rattata: 1

Ataques de Charmander
1 - SCRATCH (20/20)
2 - GROWL (40/40)
Selecione um ataque para Charmander: 1

Charmander used SCRATCH!
Critical hit!
Rattata fainted!

Batalha encerrada!

Posso manter desta forma? Se não, como fazer pra resolver o problema da prioridade de ataque?

EOF obtido através de redirecionamento

por Leonardo Pereira Macedo -

Olá,

O enunciado do EP diz que devemos ler os Pokémons e o ataque desejado, durante a batalha, pela entrada padrão.

Para facilitar a execução do programa, redirecionei a entrada para arquivos contendo as informações sobre os Pokémons, mas ocorre um EOFError quando o primeiro input de ataque é pedido por conta da entrada ter ficado vazia.

Há algum modo de retornar a entrada padrão para o teclado após terminar de ler os arquivos? Ou devo pressupor que redirecionamento não deve ser usado?

A única solução que pensei foi passar os arquivos contendo os dados dos Pokémons por linha de comando, mas isso iria contra o que é pedido no enunciado.

Counter

por André Meneghelli -

Não entendi o que ocorre quando o usuário é colocado pra dormir ou congelado e nem o que ocorre quando o inimigo usa item de recuperação de HP.

 

EP1 - Dúvida quanto ao modificador de tipo

por Frederico Lage Ferreira -

No cálculo do dano, ao calcular o modificador, temos que levar em consideração o tipo do ataque e o tipo do pokemon atacado (ataque de água causa mais dano a um pokemon de fogo e etc). Para tanto, tem uma tabela que estabelece as relações entre os tipos ( http://bulbapedia.bulbagarden.net/wiki/Type/Type_chart#Generation_I ). Porém, na primeira geração tinham alguns erros não intencionais nessa tabela, como o tipo fantasma ter 0x contra psíquicos, quando a intenção era que fosse 2x (dentro do jogo era dito que fantasmas eram bons contra psíquicos, mas o que foi implementado foi diferente). Esses erros foram corrigidos na geração dois. Minha dúvida é se, uma vez que estamos usando apenas as mecânicas da geração 1, também devemos usar a tabela "errada" que ela usava ou se pode ser usada a tabela da geração 2 (obviamente, desconsiderando os tipos dark e steel)

Fórmula do Dano

por Taís Pinheiro -

Professor/Monitores/Colegas,

A fórmula do dano passada no enunciado não está clara e encontrei diferentes fórmulas na internet.

Poderia colocar aqui uma explicação para fórmula ou uma nova fórmula que possa ser aplicada?

 

Grata,

 

Arquivo Pokemon

por André Meneghelli -

No enunciado está escrito que o pokemon deve ser carregado de um arquivo com a seguinte sintaxe:

<NOME>  (do pokemon ou da raça?)
<LVL>
<HP>
<ATK>
<DEF>
<SPD>
<SPC>
<TYP1>
<TYP2>
<NUM ATKS>
<NOME>
<TYP>
<ACU>
<PWR>
<PP>
...
<NOME>
<TYP>
<ACU>
<PWR>
<PP>

No entanto não está claro se o nome é o nome do pokemon ou a raça (se bem que raça no sentido biológico não se aplica a estes nossos amiguinhos virtuais). 

Encapsulamento

por Bruno Sesso -

Surigiram algumas dúvidas a respeito de encapsulamento.  Pelo que eu entendi, devemos usar métodos para acessar os atributos de uma classe, assim não os acessamos diretamente.


Não entendi direito se o problema é acessar os atributos diretamente, ou se é o fato de termos de acessa-los, ou ambos!
Ou seja, se eu tenho uma classe com 5 atributos, seria ruim eu ter getters and setters para todos eles? isso quebraria o encapsulamento?

Post do Luciano

por Alfredo Goldman -

Olá Pessoal,

   Segue abaixo o e-mail que o Luciano Ramalho mandou para a lista do CCSL. Vale olhar.

 

Abraço,
Alfredo

 

A O'Reilly pediu para eu escrever um blog post com algum assunto do
meu livro, então escrevi esse:

http://radar.oreilly.com/2014/10/python-tuples-immutable-but-potentially-changing.html

O código-fonte da marcação do post está no Github:

https://github.com/fluentpython/orablog/blob/master/changing-tuples.rst

Quem quiser traduzir para compartilhar com alunos pode me mandar um
pull-request que eu publico. A licença é CC-BY-SA.

A mesma historinha pode ser adaptada para Java, Ruby, C++ ou qualquer
linguagem que tenha variáveis de referência.

[ ]s
Luciano

PS. Existe uma tradução bem aceita em português para "aliasing" no
sentido de "apelidamento"? Eu adoraria conhecer!

Fórmulas - projeto - etapa 1

por Cesar Cano de Oliveira -

Queria saber se é possível deixarem aqui as fórmulas que a gente precisa usar pra calcular dano, como vai usar accuraccy, etc, porque como estamos nos baseando na gen1-2 eu fui procurar fórmula pra usar aquele stat Special e não achei como ele entra dentro do dano que o atk vai causar... É possível deixar as fórmulas aqui pra gente usar? Valeu

miniEP4

por Christian Massao Tsujiguchi Takagi -

Não entendi a função da constante epsilon.
Para truncar um valor, a maneira que prefiro usar é a conversão em string, por exemplo para o número 123.456789:

    >>> numero = "%.3f" % 123.456789
    >>> numero
    '123.457'

Onde epsilon não precisaria ser usado.

A exigência do epsilon seria para arredondamento, portanto? Ou devo criar uma função própria de truncamento, utilizando divisões, etc? Se sim, posso usar o módulo math, com funções outras, que não as que serão testadas?

- Extra offtopic: Aqui no PACA não tem como eu adicionar um código sem formatação, sem precisar editar código HTML e incluir a tag <pre>?

Dúvidas iniciais em relação ao projeto

por Gabriel Ogawa -

Olá!

No enunciado do projeto dentre os tipos descritos há um tipo 6:Bird. Esse tipo não existe no jogo, deverá existir no projeto? Além disso, faltam os tipos Steel e Fairy.

Além disso, o enunciado diz que apenas ataques de dano direto devem ser implementados. Ataques com turno de recharge (como Hyper Beam) devem ser implementados? Ataques que tem efeitos secundários como burn, paralysis, poison devem ter o efeito secundário ignorado? Ataques que tem efeitos negativos para o usuário ou alvo além do dano (como Mud Bomb que tem chance de diminuir Accuracy) devem ter os efeitos ignorados? Ataques que tem prioridade (Quick Attack) devem ser ignorados? Afinal, quais ataques devem ser implementados e quais devem ficar de fora, mais especificamente?

Na descrição de ataques, não há um campo para se o ataque é especial ou físico. Isso deve ser ignorado, ou definido apenas pelo tipo como era até a Gen IV? 

Na descrição dos Pokémon, há apenas o campo 'especial' que seria a forma obsoleta da gen I/gen II. É para seguir as regras/fórmulas do jogo da gen II? Sobre as fórmulas, é necessário utilizar valores de EV e IV para calcular os valores reais dos stats a partir dos valores base, isso deve ser adicionado? Ou ignorado na fórmula? Ou salvamos os valores diretamente sem usar fórmula nenhuma e uma vez criado o pokémon isso nunca muda (cada pokémon instanciado com valores específicos para os stats, ao invés de pegar os base da espécie e calcular os stats de acordo)? Pelo o enunciado, me parece que o pokémon é criado completamente a partir dos valores passados pela entrada, ou seja, sem ter restrição nenhuma quanto à veracidade dos stats e espécie do pokémon (que nem está nos atributos), é isso mesmo?

 

O que é pra testar no miniep4?

por Gustavo Estrela de Matos -

No fim do enunciado do ep4 está escrito que devemos usar uma constante eps para testar as respostas das funções matemáticas. Isso dá a entender que precisamos fazer funções fazem as mesmas coisas que a biblioteca matemática faz e depois comparar os resultados, o que, pra mim, não faz sentido, porque se já fizemos essas funções, pra que usar a biblioteca matemática aprovo?
Acho que parece muito mais justo ver se os resultados fazem algum sentindo, como algum outro colega propos num post comparar sen(a+b) usando cos, ou ver se as funções levantam exceções quando mandamos um valor onde a função não está definida.
O que vocês acham? 

[Mini-EP3] Entrada e saída

por Thiago Gomes -

Eu não entendi muito bem o enunciado da opção 2 do mini-ep3. O script deve receber somente entradas do tipo A e transformar em PTR, ou ele pode receber entradas PTR que devam ser transformadas em A?

Arquivos de testes

por Christian Massao Tsujiguchi Takagi -

Estou acostumado a ter arquivos de teste para poder testar os eps, mas a gente não vai nos mini-eps?
Por exemplo, nesse mini-ep3, poderiam ter disponibilizado um arquivo de teste para cada opção, não?

ipython notebook

por Alfredo Goldman -

Olá Pessoal,

   Acabo de descobrir que além do ipython, tem também o ipython notebook que abre um servidor local no navegador e dá um ambiente bem agradável. É útil
 inclusive para gerar relatórios. Vocês já conheciam?

Abraço,

Alfredo

Exceções para a opção 1 do miniep3

por André Meneghelli -

Olá, acho que finalizei o EP. Seguem minhas ultimas dúvidas:

  1. Referência circular?
    No caso de referência circular eu imprimi, além da ordem correta de inserção pras outras tabelas, um alerta contendo as referências que não podem ser resolvidas.
  2. Recriação de uma tabela?
    Quando uma tabela é recriada no script de estruturas eu mantenho a mais recente e não aviso o usuário.
  3. Delimitador?
    Não tratei a possibilidade de troca de delimitador.
  4. Arquivo de uma linha?
    Consigo trabalhar bem este tipo de arquivo, foi necessário?

miniEP 3 - Entrada - Restauracao de banco

por Eric Kenji Yoshikawa -

Na descrição do EP está dizendo que o arquivo deve ser passado por parâmetro.

Porém, no exemplo dado, parece que um diretório é passado...

 

O programa recebe o "estruturas.sql" como parametro, ou um diretório que contêm este arquivo?

 

E tambem
CONSTRAINT '<restricao>' FOREIGNKEY
('camp') REFERENCES 'tabela_de_origem'
('campo_da_tabela_de_origem')

Não deveria ter em algum lugar qual a tabela atual?

Por exemplo, a tabela X tem um campo <idX> e a tabela Y tambem tem um campo <idX> e X deve ser inserido antes de Y.

em estruturas.sql vai ter algo assim:


CONSTRAINT '<restricao>' FOREIGNKEY
('idX') REFERENCES 'X'
('idX')

Eu sei que alguem depende de X, mas quem?

Sobre a Beautiful Soup

por Rafael Higa -

Nao estou conseguindo instalar a biblioteca. sempre retorna ImportError: No module named 'bs4'
Alguma ideia?

Apostila/Tutorial de Scripts

por Rafael Miller -

Estou com dificuldade em achar tutoriais/apostilas de shell script ou outros tipos de scripts.

Alguém tem alguma bibliografia boa?

 

Status 403

por Guilherme Schützer -

Estou tentando me conectar com as páginas dos cardápios com http.client, mas recebo 403 - Forbidden de status. Com o urllib3, então, quando dou read() e imprimo, tenho uma string vazia... alguém teve problemas semelhantes?

Maiúsculas e minúsculas em EP2

por Isabella Mendonça -

Na primeira opção, ao comparar o nome, deve-se considerar que "Fulano Tal" é igual a "Fulano tal" que é igual a "fulano tal"? Ou maiúsculas e minúsculas podem ser consideradas como saídas diferentes? Ou podemos assumir que não haverá tal diferença?

MiniEP-02

por Lucas Silva -

Quanto à primeira opção que podemos escolher do miniEP, devo no começo ler do meu programa um arquivo que contenha todos os demais usuários?

Por ex, faria:

users = open("usuarios.txt", "r")

codigo

?

Caso sim, as linhas desse arquivo também devem seguir o padrão abaixo?

    <usuario>:x:<UID>:<GID>:<Nome de usuario>:<home>:<shell>

Ou posso simplesmente ter um arquivo:
<usuario>:<UID>:<Nome de usuario>

que seriam as informações que eu preciso de fato?

 

EP Building System

por Ian Carvalho -

Pessoal,

Fiz um pequeno sistema de build para usar nos EPs.

Ele lê um arquivo de configuração, testa o EP (você tem que desenvolver seu teste) e se der tudo certo ele zipa os arquivos para um zip com o nome adequado

O uso é livre e está aberto para colaboração.

Espero que gostem sorriso

https://github.com/iancarv/EPBuildSystem

Sobre Singletons em Python

por Thiago Okada -

A ideia que eu passei na aula para criar um Singleton não funciona (deu "certo" porque eu retornei o hash da variável _INSTANCIA ao invés do self, ou seja, ele sempre retornava o mesmo número no print mesmo que os objeto sejam diferente).

Existem diversas maneiras diferentes para se fazer isso em Python. Por exemplo, algo similar ao que eu fiz na aula seria esse link, sobre-escrevendo o método __new__() para fazer da maneira correta (que é o método chamado durante a instância do objeto). Mas ele tem alguns problemas. Outras maneiras diversas existem, mas aparentemente o jeito mais comum de usar o padrão de projeto Singleton é simplesmente criar um módulo: https://stackoverflow.com/questions/6255050/python-thinking-of-a-module-and-its-variables-as-a-singleton-clean-approachhttp://lucumr.pocoo.org/2009/7/24/singletons-and-their-problems-in-python/.

E se vocês fizerem uma busca, várias pessoas vão dar uma solução diferente ou vão falar o porque não fazer. Mas se você precisar mesmo, recomendo usando módulos, é o jeito mais simples mesmo.

Segundo merge

por Rafael Miller -

Estou com problemas para dar o segundo merge. Depois de arrumar os conflitos entre o impl1 e o impl2 fiz um checkout para o branch pentagono e fiz o merge com o impl1. Não ocorreram conflitos, então fiz um add no arquivo pentagono.py e tentei dar commit. Ele diz:

$ git commit -m 'Fazendo merge de impl1 com pentagono. Não existem conflitos'
On branch pentagono
Your branch is ahead of 'origin/pentagono' by 4 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean 

É isso que eu tenho que fazer? Preciso criar outro branch pra dar merge em pentagono e em impl1?

 

miniep1 - Merge

por Se Wan de Campos -

Pode fazer todos os merges no master ou é preciso fazer a partir do branch que eles foram criados,  ou seja, preciso fazer merge entre pentagono, perimetro_pent_reg_impl1 e perimetro_pent_reg_impl2, e depois fazer merge entre master e pentagono ou posso fazer merge entre master e pentagono, depois fazer merge entre master e perimetro_pent_reg_impl1, depois entre master e perimetro_pent_reg_impl2, etc.

Links interessantes sobre Python

por Thiago Okada -

Olá pessoal

Quase toda linguagem de programação tem seus padrões de estilo, e Python não é diferente. Escrever código que segue os padrões é importante, pois outros programadores vão entender seu código mais rapidamente. Aqui vão alguns links interessantes para aqueles que quiserem se aprofundar mais nos padrões da linguagem:

  • PEP8: no Python, toda melhoria na linguagem é antes acompanhada por uma discussão usando os PEPs (Python Enhancement Proposal). Existem centenas de PEPs, um para cada nova adição na linguagem, mas um dos PEPs mais importantes é o PEP8, que define os padrões de estilo de código no Python. Ele define diversas coisas: desde a quantidade de espaços a ser usada na indentação até como nomear variáveis. Leitura obrigatória.
  • Python Design Patterns: apresentação por Brandon Rhodes explicando diversos padrões da linguagem. 
  • The Naming of Ducks: Where Dynamic Types Meets Smart Conventions:  do mesmo autor acima, uma apresentação explicando como criar bons nomes de métodos e funções, explorando da melhor maneira o fato de Python ser uma linguagem do tipo duck typing ("quando eu vejo uma ave que anda como um pato, nada como um pato e grasna como um pato, eu chamo essa ave de um pato"). 
  • Writting style: o que fazer e o que não fazer ao escrever código em Python.
  • Idiomatic Python: um pouco antigo já (da época do Python 2 ainda, então algumas coisas não valem mais), porém uma das apresentações mais completas sobre como escrever um código considerado "Pythonico".
  • Anti-patterns in Python programming: o que não fazer em Python, principalmente se você estiver vindo de outras linguagens como C.
  • Moving to Python from Other Languages: mais um texto focado em facilitar programadores de outras linguagens a começarem a escrever código em Python. Leitura rápida e simples, principalmente se você vier de C.
Recomendo muito a todos lerem o PEP8 e as apresentações do Brandon Rhodes, ficam como uma boa introdução de como escrever um bom código em Python.
 
Bônus: para aqueles que gostam de XKCD, usem o seguinte comando no interpretador de comandos do Python:
>>> import antigravity
sorriso
 
Qualquer dúvida só postar.
 
Abraços.

MiniEP - 01

por Bruno Sesso -

No arquivo pentagono.py na classe Regular(Pentagono) o init não deveria ser:

1
2
    super().__init__(tamanho, tamanho, tamanho, tamanho, tamanho) // Esse
    super().__init__(5)                                           // Ao inves desse?
 e o return do perimetro:
1
2
    return self.num_lados() * self.tamanho //Esse
    return self.lados * self.tamanho       //Ao inves desse?

Aplicativos Computação Móvel

por Ian Carvalho -

Não sei se alguém aqui chegou a jogar algum, mas o melhor na opinião foi o Super Mario Breaker.

Melhor jogabilidade, power-ups, fases.

Parabéns a equipe que desenvolveu. Aliás, parabéns a todas as equipes, dado que tiveram um mês para desenvolver e os resultados sairam super legais

Sugestões de Temas para a Aula do prof. Valdemar Setzer

por Diogo Pina -

Olá pessoal,

Se alguém tiver interesse por algum tema específico e queira que o professor Valdemar Setzer fale sobre ele, por favor, escrevam suas sugestões aqui.

Conheça um pouco mais sobre o professor Valdemar Setzer em:

http://www.ime.usp.br/~vwsetzer

 

Espaço para tirar dúvidas em geral

por Alfredo Goldman -

Olá Pessoal,

    Esse é um espaço para discussões e para tirar dúvidas de Lab Prog II. Além dos alunos e do professor, também adicionei vários alunos mais experientes, que podem ajudar com as dificuldades técnicas, são
 eles (Diego, Diogo, Rafael e Thiago).

Abraço,
Alfredo