{"id":4941,"date":"2015-08-25T20:02:08","date_gmt":"2015-08-25T18:02:08","guid":{"rendered":"http:\/\/www.imacandi.net\/sin\/blog\/?p=4941"},"modified":"2015-08-25T20:42:03","modified_gmt":"2015-08-25T18:42:03","slug":"ip-number","status":"publish","type":"post","link":"https:\/\/www.imacandi.net\/sin\/blog\/2015\/08\/25\/ip-number.html","title":{"rendered":"ip number"},"content":{"rendered":"<p style=\"text-align: justify;\">Well, se pare ca m-am prostit si am descoperit niste roti patrate. Noroc ca #mumu e vigilent si imi zice cand sunt prost. Cred ca trebui sa raman la consultanta, nu la chestii din astea de implementare.<\/p>\n<pre>SELECT city,country FROM geoip_v4 WHERE\r\nip_from &lt;= inet_aton('10.20.30.40')\r\nAND\r\nip_to &gt;= inet_aton('10.20.30.40');<\/pre>\n<p style=\"text-align: justify;\">Dar pentru istorie, ca sa mai rada si altii de ce chestii debitez cateodata, ramane si textul initial, cu mentiunea:<\/p>\n<blockquote><p>&lt;rpetre&gt; ce credeai ca e formula aia magica de ip to number? :)<\/p><\/blockquote>\n<p style=\"text-align: justify;\">Exista niste unii, care se cheama IP2Location de vand informatii de IP GeoLocation, adica pe scurt iti zic in ce oras\/tara este inregistrat un subnet.\u00a0Ei datele astea le dau CSV sa le incarci in ce vrei tu si dupa aia sa faci cautari in ele.<\/p>\n<p style=\"text-align: justify;\">Pentru ca nu toate bazele de date au IP\/subnet ca tip de data, daca te uiti dupa o singura adresa IP si tu tii subnet-uri in DB trebuie sa faci niste programare la mijloc sa afli de al cui sunbnet apartine o adresa IP. Asa ca oamenii astia au inventat ei o chestie de se cheama IP number: adica transformi 1.2.3.4 intr-un numar dupa o formula si dupa aia vezi tu cam intre ce valori se situeaza numarul ala in baza de date si afli cum ii cheama pe aia de-l utilizeaza si unde sunt inregistrati.<\/p>\n<p style=\"text-align: justify;\">In baza de date informatiile sunt tinute sub forma de IP_FROM, IP_TO, CITY, COUNTRY plus alte chestii irelevante pentru post-ul asta. IP_FROM e numarul de la care &#8220;pleaca&#8221; un subnet si IP_TO numarul unde se &#8220;termina&#8221; subnetul.\u00a0Formula dupa care se calculeaza IP number este:<\/p>\n<div class=\"page\" title=\"Page 2\">\n<div class=\"layoutArea\">\n<div class=\"column\">\n<pre>X = A x (256*256*256) + B x (256*256) + C x 256 + D<\/pre>\n<p>In SQL (PostgreSQL* compatibil), un lookup dupa <strong>10.20.30.40<\/strong> se transforma in:<\/p>\n<pre>SELECT city, country FROM geoip_v4\r\n\r\nWHERE ip_from &lt;= \r\n\r\n((split_part('10.20.30.40','.',1)::INT * (256*256*256))\r\n+\r\n(split_part('10.20.30.40','.',2)::INT * (256*256))\r\n+\r\n(split_part('10.20.30.40','.',3)::INT * 256)\r\n+\r\nsplit_part('10.20.30.40','.',4)::INT)\r\n\r\nAND ip_to &gt;=\r\n\r\n((split_part('10.20.30.40','.',1)::INT * (256*256*256))\r\n+\r\n(split_part('10.20.30.40','.',2)::INT * (256*256))\r\n+\r\n(split_part('10.20.30.40','.',3)::INT * 256)\r\n+\r\nsplit_part('10.20.30.40','.',4)::INT)<\/pre>\n<p><strong>&lt;=<\/strong> si <strong>&gt;=<\/strong> ajuta sa faci match pe adresa de retea si pe broadcast daca stii exact unde ma-sa se termina subnet-ul pe care-l cauti si daca chiar vrei asta, altfel e bine doar cu <strong>&lt;<\/strong> si <strong>&gt;<\/strong>.<\/p>\n<p style=\"text-align: justify;\">Cast-ul la INT l-am pus ca baza de date imi facea cast in FLOAT dupa care il compara cu INT si ca sa-l compare mai facea un cast din FLOAT in INT. Am sarit un pas, ca profilerul pentru acelasi query zicea ca dureaza ~500msec sa se uite in 11M de inregistrari (beware of my small data) pentru VARCHAR::INT si vreo 45sec sa se uite tot acolo dupa VARCHAR::FLOAT::INT. E un pic dubios rezultatul de la profiler pentru ca nu cred ca dureaza asa mult sa te faci ca n-ai nimic dupa virgula, dar si faptul ca daca rulezi un query cu cele doua variante diferenta ochiometrica intre ele e de maxim 2 secunde.<\/p>\n<p style=\"text-align: justify;\">Pe de alta parte, nu-s mare fan ideii de &#8220;la mine pe laptop merge&#8221;, mai adaugati voi hardware sa mearga repede si la voi.<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Well, se pare ca m-am prostit si am descoperit niste roti patrate. Noroc ca #mumu e vigilent si imi zice cand sunt prost. Cred ca trebui sa raman la consultanta, nu la chestii din astea de implementare. SELECT city,country FROM geoip_v4 WHERE ip_from &lt;= inet_aton(&#8216;10.20.30.40&#8217;) AND ip_to &gt;= inet_aton(&#8216;10.20.30.40&#8217;); Dar pentru istorie, ca sa mai &hellip; <a href=\"https:\/\/www.imacandi.net\/sin\/blog\/2015\/08\/25\/ip-number.html\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">ip number<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"ngg_post_thumbnail":0,"footnotes":""},"categories":[2],"tags":[7],"class_list":["post-4941","post","type-post","status-publish","format-standard","hentry","category-diverse","tag-computers"],"_links":{"self":[{"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/posts\/4941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/comments?post=4941"}],"version-history":[{"count":7,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/posts\/4941\/revisions"}],"predecessor-version":[{"id":4949,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/posts\/4941\/revisions\/4949"}],"wp:attachment":[{"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/media?parent=4941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/categories?post=4941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.imacandi.net\/sin\/blog\/wp-json\/wp\/v2\/tags?post=4941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}