quinta-feira, 12 de novembro de 2015

Alinhamento após apresentação

Hoje conversamos todos sobre as críticas recebidas após a apresentação do projeto. De fato, ocorreu uma má distribuição de tarefas para a equipe do desenvolvimento, onde deixamos a responsabilidade em cima de um único integrante, e os outros dois atuando como coadjuvantes. 
Sendo assim, os comentários dos professores a respeito do nível em que estava o desenvolvimento do projeto era fundado.
O fato é que conseguimos nos acertar, e as responsabilidades foram passadas da seguinte forma:

  • Yasmin cuidará do layout da página, sob responsabilidade de encontrar um template apresentável para nossa solução.
  • Raphael assumirá a parte de desenvolvimento, para atingirmos mais metas e chegarmos num nível aceitável para levar aos clientes.
  • Alex, Gabriela e Luis à Pretendemos elaborar nova proposta com o que temos e o que possivelmente teremos pronto até a data da entrega final do projeto, apresentar aos orientadores, solicitar sugestões quanto às prioridades e entender o que falta realmente.
    • No demais, foco no documento, elaboração de métricas o mais fidedigno possível à realidade, um modelo melhor representado para justificar a opção por banco de dados orientado à grafos e correção dos erros apontados ao longo do documento.

Por que Neo4j?

Preciso embasar a minha opção por um modelo de banco de dados diferente do usual, em especial no contexto do projeto.

Tenho vários motivos, mas a maioria são de autoria do grupo criador do Neo4j. Estou à procura de trabalhos acadêmicos sobre o tema. E estou indo e vindo no rascunho. Preciso adotar um modelo de construção de argumentação, ou acabarei com uma colcha de retalhos, em vez de uma pesquisa dirigida e referenciada.

O que eu pensei foi no que a plataforma poderá fornecer posteriormente: insights sobre como as pessoas envolvidas no voluntariado se relacionam; que tipos de tarefas,ONGs, locais elas preferem? Há um padrão? Uma vez descoberto um suposto padrão, será possível melhorar os resultados obtidos pelas ONGs? Será possível encontrar padrões que resultem em voluntários aceitarem tarefas em áreas que não foram explicitamente escolhidas por eles?

É claro que o material publicado pelo fabricante favorece seu produto. Parte do meu trabalho será verificar as informações publicadas de maneira científica.

Mehak Gupta parece ter trilhado boa parte do caminho. Ainda não li com calma: http://dspace.thapar.edu:8080/dspace/bitstream/10266/2800/1/801231017_mehak_gupta.pdf

Temos acesso ao IEEE a partir do IFSP?

http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&arnumber=7154801&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D7154801
http://ieeexplore.ieee.org/xpl/articleDetails.jsp?reload=true&tp=&arnumber=6691765&url=http%3A%2F%2Fieeexplore.ieee.org%2Fstamp%2Fstamp.jsp%3Farnumber%3D6691765
 http://search.proquest.com/openview/d2f859b043e1763566aca21bc177c8a7/1?pq-origsite=gscholar
http://dspace.thapar.edu:8080/dspace/handle/10266/2800


E estes são os artigos:

http://neo4j.com/developer/graph-database/
http://neo4j.com/blog/why-graph-databases-are-the-future/
http://neo4j.com/blog/database-model-comparison/
http://neo4j.com/blog/why-nosql-databases/
http://neo4j.com/blog/acid-vs-base-consistency-models-explained/
http://neo4j.com/blog/data-modeling-basics/
http://neo4j.com/developer/guide-data-modeling/ 
http://neo4j.com/blog/data-modeling-pitfalls/

http://neo4j.com/blog/five-signs-to-give-up-relational-database/
http://neo4j.com/blog/rdbms-sabotage-query-performance/
http://neo4j.com/blog/nasa-lesson-learned-database-using-neo4j-linkurious/
http://neo4j.com/blog/the-secret-to-more-efficient-data-science-with-neo4j-and-r/ 
http://neo4j.com/blog/navigating-heart-failure-map-with-neo4j/
http://neo4j.com/blog/history-and-future-of-graph-data/
http://neo4j.com/blog/predict-information-system-incidents-neo4j/
http://graphgist.neo4j.com/?_ga=1.259849293.611163778.1439578342#!/gists
https://strendly.wordpress.com/2015/04/01/graph-database-neo4j-on-aws/
http://www.healthmgttech.com/using-graph-technology-to-fight-cancer

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.