E05 IP look up
Leia inicialmente o Creative Exercise 4.4.8 (IP lookup by country) em
https://introcs.cs.princeton.edu/python/44st/
O Creative Exercise 4.4.8 é da versão Python "do livro azul" (IntroCS). Neste exercício, interprete "dict" que aparece naquele enunciado como sendo "ST.java" (nossa tabela de símbolos padrão).
Em vez do arquivo ip-by-country.csv do enunciado acima, você deve usar o arquivo dbip-city-lite-2020-05.IPv4.csv (que tem 3027054 linhas), acessível em
https://www.ime.usp.br/~yoshi/DATA/CSVs/dbip-city-lite-2020-05.IPv4.csv
Este arquivo foi produzido a partir de um arquivo livremente acessível em https://db-ip.com/db/lite.php.
Neste exercício, você escreverá um sistema como segue. Suponha que temos um conjunto de números IP, e que queremos saber onde estão as máquinas correspondentes. Essas informações podem ser lidas do arquivo dbip-city-lite-2020-05.IPv4.csv.
Por exemplo, considere os 10 IPs no arquivo 10IPs.in (dado abaixo). Queremos escrever um programa, chamado IPLookUp.java, que poderia ser usado assim:
$ java-algs4 IPLookUp DATA/dbip-city-lite-2020-05.IPv4.csv < DATA/10IPs.in
Time to produce geolocator: 8.358
Time to produce unordered summary: 0.009
Time to order the summary: 0.038
4: US, Washington, Redmond (47.674, -122.122)
2: US, District of Columbia, Washington D.C. (38.9072, -77.0369)
1: US, Virginia, Ashburn (39.0438, -77.4874)
1: FR, Hauts-de-France, Roubaix (50.6916, 3.20026)
1: DE, Bavaria, Nuremberg (49.452, 11.0767)
1: BR, Pernambuco, Ribeirão (-8.51444, -35.3778)
$
A ideia é que estamos interessados em saber onde estão as máquinas com os IPs em 10IPs.in, e queremos saber quais localizações são mais frequentes. A saída acima está ordenada em ordem decrescente de ocorrências: 4 dos IPs são de Redmond, 2 deles são de Washington D.C., etc. Os números entre parênteses são as coordenadas (latitude e longitude) do local.
Exemplos de uso de IPLookUp.java. O arquivo
https://www.ime.usp.br/~yoshi/DATA/IPs/accessips
contém os IPs das máquinas que visitaram alguma página de www.ime.usp.br, com a informação de data e hora de acesso (este arquivo cobre algo como 5 dias e tem 1511712 linhas). Você pode obter desse arquivo os IPs contidos nas linhas usando o programa Filter.java. O arquivo assim obtido pode ser usado como entrada de IPLookUp.java:
$ java-algs4 Filter < DATA/accessips | java-algs4 IPLookUp DATA/dbip-city-lite-2020-05.IPv4.csv > accesses.out
Time to produce geolocator: 8.751
Time to produce unordered summary: 45.621
Time to order the summary: 0.325
$
O arquivo
https://www.ime.usp.br/~yoshi/DATA/IPs/ssh.log
contém tentativas inválidas de acesso à máquina machine.ime.usp.br (crackers tentando invadir esta máquina). Você pode fazer o seguinte, para saber de onde vêm esses ataques:
$ java-algs4 Filter2 < DATA/ssh.log | java-algs4 IPLookUp DATA/dbip-city-lite-2020-05.IPv4.csv > ssh.out
Time to produce geolocator: 7.373
Time to produce unordered summary: 0.127
Time to order the summary: 0.035
$
O programa IPLookUp.java. O programa IPLookUp.java está disponível abaixo. Ao estudá-lo, você verá que o trabalho principal é feito na construção de um objeto do tipo GeoLocator e nas chamadas do método location(), implementado em GeoLocator.java.
Seu trabalho principal é escrever GeoLocator.java. A API de GeoLocator.java é como segue.
public class GeoLocator
----------------------------------------------------------------------
GeoLocator(String filename) ... constrói um geolocator a partir de filename
Location location(String q) ... devolve a localização do IP q
A classe Location.java é dada abaixo.
Leitura do arquivo dbip-city-lite-2020-05.IPv4.csv. As linhas desse arquivo devem ser lidas uma a uma, e cada linha deve ser "interpretada" (parsed), para se montar o geolocator. Para tanto, você precisará quebrar cada linha nas oito partes que a constituem. Para tanto, você deve escrever uma classe separada, chamada TokenFinder.java. A API de TokenFinder.java é como segue.
public class TokenFinder
----------------------------------------------------------------------
TokenFinder(String line) ... constrói um tokenfinder a partir de line
String nextToken() ... devolve o próximo item
Um exemplo de uso de TokenFinder.java é o programa TFClient.java, dado abaixo. Veja também os arquivos 13.txt e 13.out envolvidos na execução
$ java-algs4 TFClient < DATA/13.txt > 13.out
de TFClient.java. As linhas de 13.txt vêm do arquivo dbip-city-lite-2020-05.IPv4.csv. Note que um "token" na linha
169.232.0.0,169.232.255.255,NA,US,California,"Los Angeles (Westwood, Los Angeles)",34.0675,-118.447
está entre aspas. Assim, TokenFinder.java saberá que a vírgula contida naquele token "deve ser ignorada". Considere agora a linha
197.218.0.0,197.218.24.255,AF,MZ,"Maputo City","Maputo (Alto Maé ""B"")",-25.9648,32.5639
Nessa linha, usa-se uma convenção: duas aspas duplas seguidas representam o caractere '"'.
Para escrever TokenFinder.java, inspire-se em Words.java, dado abaixo. (Veja também E05 leitura de arquivos csv, da disciplina MAC0121 de 2023.)
Programas auxiliares. Alguns programas auxiliares são fornecidos abaixo. Estude-os e use-os livremente.
Desempenho. O tempo de execução de seu programa será comparado com os tempos de execução nos exemplos acima.
Entrega. Note que você deve entregar apenas dois programas: GeoLocator.java e TokenFinder.java. Use, obrigatoriamente, a implementação de tabelas de símbolos ST.java de S&W em GeoLocator.java.
Precisão/acurácia. As informações em dbip-city-lite-2020-05.IPv4.csv têm um certo nível de imprecisão e mesmo erros. Você pode pegar arquivos mais novos ou pagos :-( em https://db-ip.com/db/lite.php, que podem ser melhores.
- 11 abril 2024, 13:56 PM
- 11 abril 2024, 13:56 PM