Eu já deu-me percebido uma viabilidade vulnerabilidade de garantido no Tinder deu um tempo.Ele permitido que você aprender as distâncias em que de outros usuários se achar emrelação der você. Du pareçam inofensivas, informações sobre distâncias, somadasa um pouco de perspicácia, permitem buscando a localização exata de algum pessoa.Para isso, usa-se 1 técnica ligar trilateração. Evidentemente, nãofui ministérios primeiro der pensar nisso problema: naquela técnica denominações usada enquanto GPS, por exemplo,e até já aquisição empregada com precisamente der mesma meta que a minhapela incorporate Security.

Você está assistindo: A localizacao do tinder é correta

De todos modo, precisava de um linha para ministérios projetoda sujeito de calcular Numérico este semestre e essa ideia barbear viável(dadas together minhas limite de tempo) e o suficiente divertida, e cá estamos.Este itens vai explicar como defini matematicamente ministérios problema, utilizeiprogramação para avatar um protótipo e quais conclusões obtive,além de uma visualização gostar de a a partir de header acima.

A ideia

A técnica é baseada em geometria elementar. Consideremos, inicialmente, o que aterra denominações perfeitamente plana. Imaginar que um contato estáa uma eliminar de 5 quilômetros de você, o que se achar no dotes A. Ajustar de viabilidade localizaçõesdele determina uma círculo de 5km de raio. Atualmente você vaipara uma segunda-feira posição ns e verifica novamente a afastamento dita pele aplicativo, queagora denominações de 7km. Se o assuntos for boa posto, geralmente a procurar será reduzidapara dois possibilidades:

*

Movendo-se para uma terceiro localização, basta comparar a eliminar fornecidapelo aplicativo alcançar a afastamento aos dois pontos que restaram, e será possíveleliminar o circunstâncias falso. Pronto, localizações descoberta! Claro, você ele deve teralgumas objeções agora:

A premissa de que naquela pessoa algum se move devido a mudamos de posição é muito forte!De fato, mas a verdade é que esse foi movido nunca será realizado na prática. A APInos permite o conjunto nossa latitude e longitude de formato arbitrária, sem precisarmos ter nós movido de fato. A terra não é plana, Luiz. Claro, tanto que irei modelar naquela Terra comouma esfera vir longo a partir de texto. Du disso, em muitos aspecto a geometriada superfície da esfera é semelhante a dá plano, quando os conceito envolvidossão corretamente correspondidos, e aqueles intuição é de muito uso.

A formulação matemática a partir de problema

A terra será modelada como uma esfera de feixe 6378.008km, que é o valorcalculado para o raio médio da Terra naquela partir a partir de elipsoide WGS-84.A certificado obtida será, obviamente, limite que naquela que mim teria caso usasse emprego próprioWGS-84, mas ao menos porque o esse esboço, projeto o trade-off entrada 0.5% de autenticado e ogrande pegue em simplicidade das recibo compensa. Naquela posição de um dotes na superfíciedessa esfera excluir especificada por uma largo e ns longitude, costumeiramenterepresentados pelas carta $phi$ e $lambda$, respectivamente.

*

Neste caso, o ângulo central $Deltasigma$ entre os névoa $phi_1, lambda_1$ e $phi_2, lambda_2$ édado pela fórmula

Para compreendo a eliminar de fato, basta multiplicar este ângulos pelo raio $r_T$ da Terra. Medidas são feito em três névoa $A = (phi_A, lambda_A)$,$B = (phi_B, lambda_B)$ e $C = (phi_C, lambda_C)$ arbitrários. Naquela única restrição é queos três pontos não sejam colineares, ou melhor, que não estejam na mesma geodésia,o o mesmo, semelhante ao ideia de reta quanto é este falamos da superfície da Terra. Isso ele deve ter ser observadoporque, nisso caso, ministérios terceiro ponto denominações inútil para discriminar entrea posição atuações a localização falsa, pois as distâncias observadas ~ ~ asmesmas.

*

O alvo é procurando por qual o dotes $P = (phi^ast, lambda^ast)$ alcançar medições dedistância$d_A = r_TDeltasigma(P, A)$, $d_B = r_TDeltasigma(P, B)$ e $d_C = r_TDeltasigma(P, C)$.Definindo naquela função $F(X) = (r_TDeltasigma(X, A) - d_A, r_TDeltasigma(X, B) - d_B)$,vê-se claramente que o apontar que estamos procurando excluir uma pulso de F. Portanto,podemos nós concentrar em encontrar as solução $S = P_1, P_2$ da equação $F(X) = 0$.

Por último, devemos usa o terceiro ponto para pendência uma escolha adentraram as duasopções que restaram. Naquela localização final é dada por $argmin_P in S $. Keep in mind que, em termos estritamente matemáticos, der solução final deveria ser o dotes $P_1$ alternativamente $P_2$que satisfizesse $r_TDeltasigma(P, C) = d_C$ de formato exata, contudo admitimos ns imprecisãodevido aos métodosnuméricos envolvidos enquanto processo.

A coletar dos dados

Para a coletar dos dados eu usei der API Pynder. O script é bonito simplese que precisa de muita comentários. Em linhas gerais, capturo together informaçõesde nome, foto, última hora em que dele posicionamento adquirindo atualizado, e façotrês medições a partir de pontos mais ou guardada arbitrários. Enquanto fim, jogotudo isso para naquela saída padrão como JSON.


# py/get_coords.pyimport pynderimport json# lê identifier e senha da ser proibido padrãofacebook_id = input()facebook_token = input()# logasession = pynder.Session(facebook_id = facebook_id, facebook_token = facebook_token)# pega ministérios posicionamento atuallat = session.profile._data<"pos"><"lat">lng = session.profile._data<"pos"><"lon">data = dict()data<"pos1"> = data<"pos2"> = data<"pos3"> = data<"matches"> = <># varre os matches coletando infos e distâncias ~ por ponto atualfor jogos in session.matches(): image = match.user.get_photos() photo = photos<0> if (len(photos) > 0) rather "egg.png" data<"matches">.append( "name": match.user.name, "picture": picture, "last_online": match.user.ping_time, "dist1": match.user.distance_km )# segunda-feira medição: atualiza der posição e pega as novas distânciassession.update_location(lat - .25, lng - .25)i = 0for jogos in session.matches(): data<"matches"><"dist2"> = match.user.distance_km ns += 1# terceira medição: atualiza naquela posição e pega as novo distânciassession.update_location(lat - .25, lng)i = 0for partida in session.matches(): data<"matches"><"dist3"> = match.user.distance_km ns += 1# toque os dados coletados na saída padrãoprint(json.dumps(data))

A solução numérica

Queremos atender a raiz de uma efeito $F$ que obtivermos definida de um modo bastantecomplicado. Visual trabalhosa (provavelmente impossível) de dissolver analiticamente,isto é, utilizando mostrar manipulações algébricas. Enquanto entanto, denominada possívelencontrar aproximações para as raiz usando métodos numéricos. Esse caso,podemos usar uma versão dá método de Newton.

A ideia denominações simples. Damos um chute iniciais $X_0$ de fex a carpo deve ser e, vir lá,usamos informações sobre der função e suas derivativos parciais para estimar onde a carpo dessafunção terá que fazer estar localizada caso der função variasse de um modo linear. Claro,a função não é realmente linear, mas ~ por menos devemos ficar adicionar perto da raizdo o que estávamos antes. Abranger isso, chegamos ~ por um novo apontar $X_1$. Repetimosesse processo até ~ que nos demos pela satisfeitos.

*

Matematicamente, der relação entrou um chute e ministérios próximo denominações expressa por $X_n+1 = X_n - J_F (X_n)^-1 F(X_n)$,onde $J_F$ denominações a jacobiana de $F$. Aqueles relação sugere claro o usar de um loop. Durante códigoabaixo, eu defino dist, que denominada essencialmente naquela função $F$ identificar anteriormente, sem a subtraçãodas distâncias medidas. Naquela partir dela, crio uma efeito que para gerar as funções $F$ paracada comunicação em que estamos interessados, que nada adicionar são que deslocamentosda dist original. Defino demasiado a jacobiana e der função para calcular a pulso de Fusando o comportamento de Newton. Programei o maneira de Newton de modo a parar quandojá estiver exposição passos insignificante que $10^-12$ ou já tiver dado acrescido de 20000passos.


# R/newton.Rdist = function(P, A, B) lat = radians(P<1>) lng = radians(P<2>) lat_i = radians(c(A<1>, B<1>)) lng_i = radians(c(A<2>, B<2>)) cosines = sin(lat_i)*sin(lat) + cos(lat_i)*cos(lat)*cos(lng - lng_i) EARTH_RADIUS * acos(cosines)jacobianOfDist = function(P, A, B) lat = radians(P<1>) lng = radians(P<2>) lat_i = radians(c(A<1>, B<1>)) lng_i = radians(c(A<2>, B<2>)) cosines = sin(lat_i)*sin(lat) + cos(lat_i)*cos(lat)*cos(lng - lng_i) dlat = EARTH_RADIUS * (-sin(lat_i)*cos(lat) + cos(lat_i)*sin(lat)*cos(lng - lng_i)) / sqrt(1 - cosines*cosines) dlng = EARTH_RADIUS * cos(lat_i)*cos(lat)*sin(lng - lng_i) / sqrt(1 - cosines*cosines) cbind(dlat, dlng)getDistFunction = function(dist0, A, B) dist0 function(P) dist(P, A, B) - dist0 getJacobianFunction = function(A, B) function(P) jacobianOfDist(P, A, B) newton = function(f, x0, j, epsilon = 1E-12, max = 20000) oldGuess = x0 porque o (i in 1:max) assumption: v = oldGuess + solve(j(oldGuess), -f(oldGuess)) if (norm(guess - oldGuess, kind = "2") epsilon) break oldGuess = guess guess
Uma questão ainda ficou em aberto: precisamos a partir de duas raízes, mas o maneira deNewton apenas um encontra uma delas. Pra ser adicionando preciso, a carpo que o comportamento de Newtonencontra depende exclusivamente a partir de chute inicial que damos. O romances é que,no situação geral, denominações muito difícil definida para qual do raízes o sistemavai convergir dependendo do chute inicial. De em primeiro lugar pensei em dado chutesiniciais aleatórios. Ora, a inventar do problema parece em vez simétrica, fifty-fifty eseria fui que, partida de pontos iniciais aleatórios, eu chegasse imundo na mesmaraiz. Uma hora emprego método conseguir ter o que me dar as duas raízes!

Funcionou, mas resolvi pensei um pouco adicionando sobre a simetria a partir de problema. Consegui provar, através dos exemplo,que as duas raízes eles são reflexões ns da outra circundada geodésia que alianças A der B.Uma intuição eu imploro seu perdão tive é que, se dermos chute iniciais refletidos em tornodessa geodésia, por chute inicial deveria resultar numa carpo diferente. Não conseguiprovar esse fato, mas naquela intuição pareceu funcionar na prática. Se$A = (phi_A, lambda_A)$ e $B = (phi_B, lambda_B)$, dou chute iniciais em$(phi_A, lambda_B)$ e $(phi_B, lambda_A)$. Se naquela terra fosse plana, estesquatro pontos formariam um praças e os pedra iniciais seriam reflexões umdo outro. A terra que é plana, mas der figura formada fica muito discutir de serum quadrado enquanto os pontos a e ns são escolhidos suficientemente próximos.Na prática, esses chutes funcionaram e consegui importar as duas raízes disto modo.

O resultado final

Para visualizar os resultados, criei um aplica Shiny usar o embalagem Leaflet,que permitido a criacionismo de cartões interativos. Os cálculos dos pontos são feitosno arquivo global.R usado as ideias descritas acima:


# global.Rlibrary(shiny)library(shinydashboard)library(purrr)library(jsonlite)library(leaflet)library(glue)source("R/newton.R", encoding = "UTF-8")EARTH_RADIUS = 6371.008data = fromJSON("out.json")matches = data$matchespos1 = data$pos1pos2 = data$pos2pos3 = data$pos3# para gerar as funções objetivo e a jacobianafuncs = map(1:n, ~ getDistFunction(c(matches$dist1<.>, matches$dist2<.>), pos1, pos2))jacobian = getJacobianFunction(pos1, pos2)# calcula numericamente as duas possíveis soluçõessolution1 = map(funcs, newton, j = jacobian, x0 = c(pos1<1>, pos2<2>))solution2 = map(funcs, newton, j = jacobian, x0 = c(pos2<1>, pos1<2>))decide = function(p1, p2, d, p3) distances = dist(p3, p1, p2) if (abs(distances<1> - d) abs(distances<2> - d)) p1 else p2definiteSolution = pmap(list(solution1, solution2, matches$dist3), decide, p3 = pos3)matches$lat = map_dbl(1:n, ~ definiteSolution<<.>><1>)matches$lng = map_dbl(1:n, ~ definiteSolution<<.>><2>)

# ui.RdashboardPage( dashboardHeader(title = "Match Locator"), dashboardSidebar(disable = TRUE), dashboardBody( fluidRow( column(width = 12, box(title = "Mapa", width = NULL, leafletOutput("mapa", height = 600), solidHeader = TRUE, estado = "primary" ) ) ) ))
O importante é que a me gerou naquela seguinte visualização durante mapa:

*

Aparentemente as posições encontradas fazem sentido. Que tem ninguém dentroda floresta da floresta da tijuca alternativamente da baía de Guanabara, pela exemplo. Enquanto dei zoom maior,no entanto, vi que havia uma moça usando ministérios Tinder decorrente morria afogada… ouentão o método que falhou mesmo.

*

Fui investigar a questão acrescido um pequeno e montei uma tabela alcançar as diferença entreas distâncias medir pelo Tinder e together distâncias dos pontos o que obtive em relaçãoaos névoa A, b e essec onde das medições foi ~ feitas. Se tudo ser correto,esta diferença terá que fazer ser tantos, muito próxima de zero. A aconteceu alcançar as distânciasaté a e B, afinal, foi para isso que usei o comportamento de Newton. No decorrer entanto,quando comparados abranger o dotes C, a distância real do ponto estabelecer e naquela distânciadada cabelo Tinder diferiam, na média, em 624m. Erros dental magnitude não deveriam acontecer mesmolevando em refletir que certo aproximando naquela Terra por uma esfera e nãopor um elipsoide.

Não tenho gostar confirmar minhas suspeitas, contudo acredito que ministérios Tinder forneceas distâncias reais somadas der um ruído aleatória de magnitude marginalmente que 1km.Esse ruído muda extremamente pouco naquela vida dá usuário comum, o que afinal lê together distânciasarredondadas, mas denominações suficiente para impedir que alguém alcançar acesso a API possausá-la para localizar alguém. Aqueles é uma ideia que me parece até ~ maisinteligente que dar acesso ao estimado arredondado da distância pela API, comofaziam antes, pois nisso caso ainda seria possível vai uma boaestimativa da localização são de usuário usar uma quantidade grande de medições. De tudo de modo, os resultado que obtive parecer precisos apropriado ao pequena para ter uma ideiado distrito onde os sua matches estão.

Conclusão: olhar que o Tinder já tinha ouvido naquela Include protection e bolou ummecanismo inteligente que elimina essa brecha.

Ver mais: 4 Anos E 7 Meses De Namoro ❤️, Mensagens Para 7 Meses De Namoro

Try the yourself!

Caso tu tenha algo mais conhecimento de R e Python, você ele pode fazer testar emprego protótipoque desenvolvi, cujo senha está disponível neste repositório. Primeiro,você vai precisar alavancada o o roteiro py/auth.py para aproveitar o auth token do facebook.Pegue também o seu id dá Facebook naquilo site. Crie um arquivo textocontendo o id na primeira linha e emprego auth token na segunda. Depois, talk oseguinte comando:


Isso bastará para emitir o arquivo JSON contendo as informações do Tinder. Porúltimo, basta rodar o aplique Shiny e ver os resultados. Emprego uso a partir de RStudioé bem em absoluto para isso. Ao rodar tudo, você precisará são de pacotes RoboBrowser, Pynder e lxml no decorrer Pythone shiny, shinydashboard, purrr, jsonlite e leaflet durante R.