quinta-feira, 12 de novembro de 2015

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.

Nenhum comentário:

Postar um comentário