quinta-feira, 12 de novembro de 2015

Tarefas

Temos que trabalhar com eficácia, e mostrar ao cliente que estamos trabalhando.

Algumas tarefas que enxerguei:

  • Fazer testes com um repositório dummy de SVN para garantir que sabemos como utilizar a ferramenta. Se só tivermos segurança com um client para Windows, que seja. No excuses.
  • Jogar fora o que está no SVN neste momento e colocar o conteúdo atualizado. Há algumas semanas cometeu-se um erro na operação do SVN que culminou na necessidade de se recriar o sistema em uma nova máquina virtual.
  • Formalizar a justificativa para escolha desse banco de dados não relacional.
  • Formalizar a justificativa para escolha do Ruby on Rails.
  • Criar uma tabela de métricas de código que seja real.
  • Apurar exatamente em que ponto estamos com a produção da aplicação e, se necessário, negociar descartes com o cliente. Realisticamente.
  • Chegar a um acordo com a equipe sobre como controlar as tarefas. Eu sugiro dividirmos as coisas em microtarefas e controlar pelo runrun.it (ou no papel de pão; o que importa é detectar desvios rapidamente).
  • Rever o documento.
  • Repensar a semântica dos nomes dos modelos.
  • Analisar as tarefas e distribuí-las.
  • Controlar o andamento.










Reação

Não se pode mudar o passado. Temos que direcionar esforços para  corrigir a situação e, se necessário, negociar um ajuste de expectativas do cliente.

Alguns riscos se converteram em realidade, e temos que por em prática as reações. Se não as previmos, ou as previmos de maneira errada, teremos que criar novos planos.

Erros podem acontecer a qualquer momento, por diversos motivos. Vamos evitar que os mesmos erros ocorram novamente, e usar a experiência adquirida para evitar outros.

Originalidade do código no projeto

Na apresentação de ontem fui questionado quanto à originalidade do código, com a afirmação de que eu havia copiado e colado o mesmo.

Após o término da apresentação, um dos meus colegas perguntou-me se eu realmente havia copiado o código. Considero que fazer isso seria trapaça e plágio.

Plagiar é definido como "Copiar ou imitar, sem engenho, as obras ou os pensamentos dos outros e apresentá-los como originais." (DICIONÁRIO PRIBERAM DA LÍNGUA PORTUGUESA, 2015).

opiar ou imitar, sem engenho, as obras ou os pensamentos dos outros e apresentá-los como originais.

"plagiar", in Dicionário Priberam da Língua Portuguesa [em linha], 2008-2013, http://www.priberam.pt/dlpo/plagiar [consultado em 12-11-2015].
Copiar ou imitar, sem engenho, as obras ou os pensamentos dos outros e apresentá-los como originais.

"plagiar", in Dicionário Priberam da Língua Portuguesa [em linha], 2008-2013, http://www.priberam.pt/dlpo/plagiar [consultado em 12-11-2015].
Declaro aqui publicamente que o código em questão, do modelo da entidade Task, foi escrito por mim com informações obtidas destes (dentre tantos outros que não resultaram em soluções) sites:

https://dzone.com/articles/neo4jcypher-finding-football,
http://neo4j-contrib.github.io/spatial/,
http://stackoverflow.com/questions/17966722/neo4j-spatial-withindistance-cypher-query-returns-empty-while-rest-call-return,
http://stackoverflow.com/questions/22382390/neo4j-spatial-cypher-query-withindistance-doesnt-return-existing-nodes,
http://www.lyonwj.com/mapping-the-worlds-airports-with-neo4j-spatial-and-openflights-part-1/,
http://maxdemarzi.com/2014/01/31/neo4j-spatial-part-1/.

Reproduzo a seguir o trecho de código no qual a palavra "ajuda", escrita em português, chamou a atenção porque destoava do restante do código, escrito e comentado em inglês.

class Task
  extend Geocoder::Model::ActiveRecord
  include Neo4j::ActiveNode

  property :name, type: String, index: :exact
  property :start_date, type: Date, index: :exact
  property :end_date, type: Date, index: :exact
  property :description, type: String
  property :postal_address, type: String
  property :lat, type: Float
  property :lon, type: Float
  property :remote_work, type: Boolean
  property :created_at

  alias :latitude :lat     # Because Spatial wants to find lat and long
  alias :longitude :lon    # And geocoder wants to find latitude and longitude
  alias :latitude= :lat=   # We'll need setters also
  alias :longitude= :lon=  # And we'll be able to use the vanilla configurations
 
  validates_presence_of :name, :start_date, :description


  has_many :out, :limitations, type: :LIMIT_BY, model_class: :Restriction
  has_many :out, :restrictions, type: :ACT_ON
  has_one :out, :ngo, type: :CREATOR

#geocode expects a field named "full_street_address". Let's provide it
def full_street_address
  return postal_address
end

  geocoded_by :full_street_address
  after_validation :geocode, if: ->(obj){ obj.postal_address.present? and obj.postal_address_changed? }

def self.search(search)
    tasks = Task.all
  
    if search
      # tasks = tasks.where(name: search)
      tasks = tasks.where('n.name=~' << "'(?i).*#{search}.*'")

    end

end  


def self.geosearch(location , radius)
 
 
  source_address = Geocoder.search(location).first

  near_task_ids = []
  radius = 10.0 if radius.blank?
  radius = radius.to_f

  @neo = Neography::Rest.new
  x=@neo.execute_query("start n = node:ajuda({location}) return n", {:location => "withinDistance:[#{source_address.latitude},#{source_address.longitude},#{radius}]"})
  x["data"].each do |d|
    near_task_ids << d[0]["metadata"]["id"]
  end

  #binding.pry
  Task.all.where(:neo_id => near_task_ids)
end

end


Enquanto escrevia este post notei um erro que conta a meu favor (da originalidade, não do estilo): o padrão Ruby para se atribuir um valor a uma variável se ela for nula é diferente da forma que aparece no código. O trecho está fora do padrão.

  radius = 10.0 if radius.blank?
  radius = radius.to_f


Conforme http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html, esse trecho deveria ser escrito como:

  radius ||= 10.0.to_f

Para ser exato, o código que foi executado no vídeo da apresentação era ligeiramente diferente do que foi mostrado à banca. Antevendo que a banca pediria que eu mostrasse trechos do código, removi alguns comentários cuja publicação considerei desnecessária no contexto.

A letra "h" do meu teclado está com defeito e falha com frequência. Observem o erro na palavra "the" na primeira linha em vermelho a seguir. 


def self.geosearch(location , radius)
 
  # I'm getting only te first right now. Will have to deal with this
  source_address = Geocoder.search(location).first

  near_task_ids = []
  radius = 10.0 if radius.blank? #GAMBIARRA: TRATAR NO FORM TAMBEM
  radius = radius.to_f

  @neo = Neography::Rest.new
  x=@neo.execute_query("start n = node:ajuda({location}) return n", {:location => "withinDistance:[#{source_address.latitude},#{source_address.longitude},#{radius}]"})
  x["data"].each do |d|
    near_task_ids << d[0]["metadata"]["id"]
  end

  #binding.pry
  Task.all.where(:neo_id => near_task_ids)
end

end


 Este trecho - o original - foi recuperado a partir de uma cópia feita no Google Drive, disponível publicamente no link https://drive.google.com/folderview?id=0Bxez7SGeJQd4OUVpZ2dLanhNbUE&usp=sharing. A permissão de acesso foi mudada de privada para pública apenas em 12/11/2015.

No moodle campus há uma tarefa de A5LP1, entregue em 22 de fevereiro 2015, 23:55 onde eu mencionei que um algoritmo utilizado no exercício não havia sido criado por mim (embora por ignorância quanto à regra à época, eu não tenha incluído o crédito, apenas informado que eu não fui o autor). A seguir está a cópia do que foi entregue à Profa. Júlia Botan na ocasião.

algoritmo "primo"
// Função : Determinar se um numero e primo. Retornar "sim" ou "nao"
// Autor : Vedolin, Luis Fernando 1362666
// Data : 2/21/2015
// Seção de Declarações 
var
entrada  : inteiro

funcao ePrimo (numero : inteiro) : caractere
var
   i   : inteiro
   w   : inteiro
   
inicio
      se ( (numero = 2) ou (numero = 3) ) entao
         retorne "sim"
      fimSe
      se ( ( (numero mod 2) = 0 ) ou ( (numero mod 3) = 0 ) ) entao
         retorne "nao"
      fimSe

      i <- 5
      w <- 2

      enquanto ( (i * i) <= numero) faca
               se ( (n mod i) = 0) entao
                  retorne "nao"
               i <- i + w
               w <- 6 - w
      fimEnquanto
      retorne "sim"

// Achei isto enquanto procurava um algoritmo eficiente
// Em 2500 anos de Matemática formalizada, ou alguem inventou um metodo
// eficiente, ou alguem provou que ele nao existe...
//It's a variant of the classic O(sqrt(N)) algorithm. It uses the fact that a prime (except 2 and 3) is of form 6k-1 and 6k+1 and looks only at divisors of this form.

// E tambem achei isto:
// Número primo, é um número p cujo conjunto dos divisores não inversíveis não é vazio,
// e todos os seus elementos são produtos de p por números inteiros inversíveis.
// De acordo com esta definição, 0, 1 e -1 não são números primos.

// E larguei mao de pesquisar Matemática...
 

fimFuncao


Referências

PLAGIAR, in: Dicionário Priberam da Língua Portuguesa. Disponível em  <http://www.priberam.pt/dlpo/plagiar>. Acesso em 12 nov. 2015.

domingo, 8 de novembro de 2015

APRESENTAÇÃO

Estamos efetuando as últimas alterações na apresentação, já preparados caso o sorteio de nossa equipe seja para a próxima quarta-feira, 11-11

sábado, 7 de novembro de 2015

Apresentações de 04-11

     Assistindo as apresentações das equipes EcoPlus e Story Power na última quarta-feira, 04-11, percebemos que alguns erros cometidos por nós ao longo do desenvolvimento do projeto se repetiram nestas equipes. Ainda que estivéssemos juntos fisicamente durante as aulas, não tivemos a oportunidade de conversar com as equipes sobre o andamento de seus respectivos projetos, à exceção de nossa equipe cliente, a ‘Seja Amigo’. Conseguimos produzir a documentação em tempo hábil, pois nos adequamos ao calendário. O documento ficou pronto já no domingo, 18-10, véspera da semana de entrega. Após a entrega da documentação, analisamos os textos com mais calma e notamos algumas falhas. Houve frustração por não termos visto a tempo de correção, mas quando ouvimos as críticas dos professores sobre as falhas dessas equipes, surgiu o sentimento de que poderiam ser evitadas.

     De qualquer forma, as correções já estão em andamento pelos responsáveis da documentação e caso surjam novas exigências, a alteração não será tão dispendiosa.

sábado, 24 de outubro de 2015

Reunião 24/10/2015

Horários: das 15:30hs às 17:00hs.


Membros presentes: Alex Assis, Gabriela Ruiz, Luis Vedolin Yasmin Silva

Pauta: Andamento do projeto 'Como Posso Ajudar?'

Conclusão: Nos reunimos via Skype para discutir os avanços do site até esta data. Foram apresentadas algumas funcionalidades do website já em funcionamento, permitindo definir algumas métricas para a documentação do projeto. 

  • Os modelos de dados já estão funcionando, sendo possível efetuar o CRUD para as ONGs e Voluntários;
  • As buscas por voluntários, ONGs e tarefas estão funcionando. Os dados já estão disponibilizados pelas views, porém ainda aguardam uma formatação mais adequada e agradável para o usuário através do javascript e css;
  • A restrição por localização geográfica ainda não está em funcionamento, mas está bem encaminhada, tendo como prazo para entrega a próxima terça, 27-10;
  • Ainda não há tela de login;
  • A inserção das restrições ainda apresentam algumas deficiências, e foi tratado que o Raphael trabalhará nelas;
  • A Yasmin cuidará do desenvolvimento das veiws;
  • Foram encontrados alguns erros na documentação entregue em 21-10. Estes erros já estão sendo tratados para facilitar a correção dos demais que possivelmente serão encontrados pelos professores.
  • As sugestões da professora Aline, entregues no começo dessa semana em relação aos textos, foram acatadas e estamos trabalhando na adequação.


segunda-feira, 19 de outubro de 2015

Documentação

Bom dia,

Hoje iremos terminar de consolidar o documento para conseguir encaminhar ao professor Bernardo via e-mail.
Após isso, poderemos imprimir para a primeira entrega desta quarta-feita.