VimeoVimeo
RSSRSS
5.00 / 001

TrackIP - największa dostępna baza IP

Banner

Mam ogromną przyjemność poinformować Was, że nasza baza polskich adresów IP jest obecnie największą i dostępną za darmo tego typu usługą. Na chwilę obecną zasoby prezentują się następująco:

  • OpenGEO - 7.971.912 adresów IP
  • Stat4U - 8.681.305 adresów IP
  • TrackIP - 9.330.536 adresów IP

Jako jedyni udstępniamy również darmowe API umożliwiające  dostęp do statystyk on-line, znajdujące się pod adresem: http://trackip.santyago.pl/api.html

Najświeże bazy TIB można pobrać z adresu: http://trackip.santyago.pl/pobierz.html

Skomentuj

Podziel się tym wpisem: TrackIP - największa dostępna baza IP

5.00 / 001

TrackIP: Publiczne API 0.1 już dostępne

Banner

W telegraficznym skrócie. Postanowiłem udostępnić publiczne API dla usługi geolokalizacji adresów IP na terenie Polski. Jest to wstępna implementacja, jednak pozwala już na zapytania. Zwracane wyniki mogą być w formacie JSON lub XML.

Zaletą korzystania z API jest dostęp do aktualnej bazy danych, na podstawie której generowane są comiesięczne zrzuty CSV/TIB.

Więcej informacji: http://trackip.santyago.pl/api.html

Skomentuj

Podziel się tym wpisem: TrackIP: Publiczne API 0.1 już dostępne

5.00 / 001

TrackIP: Ponad 8.5 miliona adresów IP

Banner

Kolejny miesiąc przyniósł sporą aktualizację bazy geolokalizacji adresów IP. Udało się już zgromadzić ponad 8.5 miliona wpisów. Baza zawiera jeszcze sporo uchybień w trafności wyników, jednak dzięki Wam i waszym wpisom nowych adresów i korekt jest coraz lepiej.

Bez Waszej pomocy nie osiągnęlibyśmy wspólnie takiego wyniku. Do końca października zamierzam również udostępnić specjalne API do sprawdzania lokalizacji on-line.

Serdecznie dziękuję !

http://trackip.santyago.pl/

Skomentuj

Podziel się tym wpisem: TrackIP: Ponad 8.5 miliona adresów IP

5.00 / 001

Sprawiedliwa kolejka odświeżania w PHP

Banner

Kolejki to bardzo fajna rzecz dopóki zasada jej działania opiera się na znanych i przetartych już wcześniej rozwiązaniach. Problem pojawia się, gdy istnieje potrzeba specyficznego jej zastosowania. Takim przykładem może być kolejka sprawiedliwego odświeżania (tak ją sobie roboczo nazwałem).

O co konkretnie chodzi?

Wyobraźmy sobie skrypt działający w tle, który ma za zadanie odświeżać co jakiś czas informacje konkretnego procesu. Musimy również zadbać, aby odświeżanie wszystkich zadań występowało w równych odstępach czasu -  powiedzmy co 15minut, niezależnie od ilości zadań w kolejce.

Sprawa pozornie wydaje się być prosta, ale jak o to zadbać, gdy wykonanie fragmentu programu odpowiedzialnego za aktualizację zadania nie ma ściśle określonego czasu lub kolejka jest na tyle długa bądź krótka, że kolejny cykl odświeżania nastąpi za wcześnie lub za późno. Reasumując, cykl odświezania może nastąpić dla niego po upływie zarówno 7 minut jak i 25 minut.

Przypadek idealny

Najbardziej optymalnym wariantem jest 15 zadań, które wykonują się równo jedną minutę. Wtedy nie ma najmniejszego problemu, gdyż każde z zadań zostanie wykonane co 15 minut.

Za dużo lub za mało zadań

Nie jest jednak nigdzie powiedziane, że zadań musi być dokładnie 15. Nawet zakładając, że każde z nich wykona się dokładnie w jedną minutę, kolejka zacznie powtarzać się za wcześnie lub za późno - nie gwarantując nam 15-minutowego cyklu odświeżania.

Łatwo zauważyć, że w przypadku trzynastu zadań pośpieszymy się z cyklem o dwie minuty, natomiast z szesnastoma zadaniami, każde z nich będzie miało jednominutowe opoźnienie.

Coś mnie zatrzymało / pogoniło

Sprawa jeszcze bardziej się komplikuje, gdy zadanie wykona się w czasie krótszym lub dłuższym niż deklarowana minuta. Nie dość, że pełny cykl nie zakończy się w wyznaczonych 15 minutach -  to każde z zadań może wykonać się w pełnym przebiegu wcześniej lub później. Totalny chaos!

Planowane zadania

Pierwsze co musimy zrobić, to wyznaczyć maksymalny czas, potrzebny na wykonanie pojedynczego zadania. Załóżmy, że jest to typowo 30 sekund. Oczywiście może zdarzyć się, że zadanie zostanie wykonane w czasie krótszym lub dłuższym. Dlatego dajmy sobie zapas w postaci kolejnych 30 sekund. Tak więc, dopuszczalny
przedział czasowy na pojedyńcze zadanie wyniesie 60 sekund.

Jeśli chcemy, aby pełny cykl wynosił 15 minut (900sekund), musimy obliczyć ile zadań możemy bezpiecznie wpuścić do naszej kolejki. Obliczając 900:60 wychodzi nam okrągłe 15 zadań w kolejce. Sprawa jest już nieco prostsza - każde zadanie musi zacząć się o pełnej minucie, niezależnie od tego, ile trwało poprzednie zadanie.

Obliczenie czasu do odczekania po wykonaniu zadania jest banalnie proste 60-(czas trwania zadania).  Sprawa nieco komplikuje się, gdy dane zadanie z jakiegoś powodu przekroczy limit jednej minuty. Cykl nie będzie trwał piętnastu minut, a kolejne zadania będą spoźnione względem zaplanowanych przedziałów.

Można temu zaradzić poprzez natychmiastowe wykonanie kolejnego zadania i skrócenie czasu oczekiwania na kolejne zadanie, niezależnie od tego, jak krócej ono trwało względem dopuszcalnych 60 sekund.

Analogicznie postępujemy, gdy krytyczne zadania następują zaraz po sobie, a czasy opóźnień sumują się.

Wszystko jasne - czas wprawić to w ruch

Stworzymy sobie testową, 30-sekundową kolejkę z maksymalnym czasem 5 sekund na pojedyńcze zadanie. Symulacją będzie funkcja randomSleep() zatrzymująca losowo działanie na czas od 1 do 6 sekund, aby sprawdzić ją również w warunkach przekorczenia dopuszczalnego czasu.

  1. <?php
  2.  
  3.     set_time_limit(0);
  4.  
  5.     require_once 'fairRefreshQueue.php';
  6.  
  7.     function randomSleep()
  8.     {
  9.         usleep((rand(1, 5) * 1000000) + (rand(0, 9) * 100000));
  10.     }
  11.  
  12.     // 30 sekundowa kolejka, maksymalny czas na zadanie 5 sekund
  13.     $timeQueue = new FairRefreshQueue(30, 5, true);
  14.    
  15.     for ($i = 1; $i <= $timeQueue->getMaxJobs(); $i++)
  16.     {
  17.         $timeQueue->addTask('randomSleep');
  18.     }
  19.    
  20.     $timeQueue->run();   
  21.  
  22. ?>

Wyniki dwóch przebiegów kolejki:

  • Start: Sekunda rozpoczęcia wykonywania zadania
  • Except: Planowany czas rozpoczęcia wykonywania zadania
  • Delay: Opóźnienie względem planowanego czasu rozpoczęcia wykonywania zadania
  • Work: Czas wykonywania zadania
  • Idle: Czas wolny
  • Exceeded: Czas przekroczony powyżej 5 sekund

Job #1, Start: 0.000s, Expect: 0.000s, Delay 0.000s, Work: 1.900s, Idle: 3.100s
Job #2, Start: 5.000s, Expect: 5.000s, Delay 0.000s, Work: 5.300s, Exceeded: 0.300s
Job #3, Start: 10.301s, Expect: 10.000s, Delay 0.301s, Work: 5.500s, Exceeded: 0.500s
Job #4, Start: 15.801s, Expect: 15.000s, Delay 0.801s, Work: 1.400s, Idle: 2.799s
Job #5, Start: 20.000s, Expect: 20.000s, Delay 0.000s, Work: 4.600s, Idle: 0.399s
Job #6, Start: 25.000s, Expect: 25.000s, Delay 0.000s, Work: 3.300s, Idle: 1.700s
Job #1, Start: 30.000s, Expect: 30.000s, Delay 0.000s, Work: 4.400s, Idle: 0.599s
Job #2, Start: 35.000s, Expect: 35.000s, Delay 0.000s, Work: 1.200s, Idle: 3.799s
Job #3, Start: 40.000s, Expect: 40.000s, Delay 0.000s, Work: 2.600s, Idle: 2.399s
Job #4, Start: 45.000s, Expect: 45.000s, Delay 0.000s, Work: 5.700s, Exceeded: 0.700s
Job #5, Start: 50.701s, Expect: 50.000s, Delay 0.701s, Work: 1.900s, Idle: 2.399s
Job #6, Start: 55.000s, Expect: 55.000s, Delay 0.000s, Work: 3.700s, Idle: 1.299s

Jak widać, drugi przebieg cyklu pomimo opóźnień rozpoczął się w planowanym terminie, a wszystkie opóźnienia zostały wyrównane kosztem wolnego czasu pozostałych zadań.

Zobaczmy jeszcze wariant zapchania kolejki, narzucając kolejno czasy:

1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 1, 1, 2 sekundy

Wyniki:

Job #1, Start: 0.000s, Expect: 0.000s, Delay 0.000s, Work: 1.000s, Idle: 4.000s
Job #2, Start: 5.000s, Expect: 5.000s, Delay 0.000s, Work: 2.000s, Idle: 2.999s
Job #3, Start: 10.000s, Expect: 10.000s, Delay 0.000s, Work: 3.000s, Idle: 1.999s
Job #4, Start: 15.000s, Expect: 15.000s, Delay 0.000s, Work: 4.000s, Idle: 0.999s
Job #5, Start: 20.000s, Expect: 20.000s, Delay 0.000s, Work: 5.000s, Exceeded: 0.000s
Job #6, Start: 25.001s, Expect: 25.000s, Delay 0.001s, Work: 6.000s, Exceeded: 1.000s
Job #1, Start: 31.001s, Expect: 30.000s, Delay 1.001s, Work: 7.000s, Exceeded: 2.000s
Job #2, Start: 38.001s, Expect: 35.000s, Delay 3.001s, Work: 8.000s, Exceeded: 3.000s
Job #3, Start: 46.002s, Expect: 40.000s, Delay 6.002s, Work: 7.000s, Exceeded: 2.000s
Job #4, Start: 53.002s, Expect: 45.000s, Delay 8.002s, Work: 6.000s, Exceeded: 1.000s
Job #5, Start: 59.002s, Expect: 50.000s, Delay 9.002s, Work: 5.000s, Exceeded: 0.000s
Job #6, Start: 64.003s, Expect: 55.000s, Delay 9.003s, Work: 4.000s, No idle
Job #1, Start: 68.003s, Expect: 60.000s, Delay 8.003s, Work: 3.000s, No idle
Job #2, Start: 71.003s, Expect: 65.000s, Delay 6.003s, Work: 2.000s, No idle
Job #3, Start: 73.004s, Expect: 70.000s, Delay 3.004s, Work: 1.000s, Idle: 0.996s
Job #4, Start: 75.000s, Expect: 75.000s, Delay 0.000s, Work: 1.000s, Idle: 4.000s
Job #5, Start: 80.000s, Expect: 80.000s, Delay 0.000s, Work: 1.000s, Idle: 4.000s
Job #6, Start: 85.000s, Expect: 85.000s, Delay 0.000s, Work: 2.000s, Idle: 2.999s

Zapychanie kolejki następuje wraz z 6 zadaniem, a opóźnienie nawarstwia się wraz z kolejnymi zadaniami. Kiedy jednak sytuacja się zmienia i pozostaje czas wolny, zostaje on wykorzystany do wyrównania kolejki do pierwotnego stanu.

Podsumowanie

Całkiem możliwe, że wynalazłem koło na nowo. Wychodzę jednak z założenia, że komuś może się ten opis przydać. Ja natomiast miałem wielką frajdę w rozgryzieniu tego problemu samodzielnie :)

Żrodełka do pobrania tutaj: fairrefreshqueue.tar.gz

Skomentuj

Podziel się tym wpisem: Sprawiedliwa kolejka odświeżania w PHP

5.00 / 001

TrackIP startuje!

Banner

Miło mi poinformować, że projekt o którym pisałem już wcześniej na łamach bloga, właśnie został uruchomiony. Postanowiłem bazować na zasobach openGeo z dnia 8 grudnia 2010, ponieważ GeoLite zawierał kupę śmieci i błędnych wpisów.

Baza będzie aktualizowana z początkiem każdego miesiąca i dostępna w formacie CSV oraz TIBF (format wykorzystywany przez klasę PHP TrackIP).

Zapraszam i zachęcam do uzupełniania oraz poprawnia wpisów IP.

http://trackip.santyago.pl

Skomentuj

Podziel się tym wpisem: TrackIP startuje!

Podstrony

Blog Fotografia Czytelnicy Kontakt Changelog Geolokalizacja TrackIP

Z prawej strony

  • 26 kwi 2012Paczki KDE 4.8.2 dla Slackware

    Dostępne są paczki KDE 4.8.2 dla Slackware 13.37. Źródła i binarki można pobarć z tego miejsca.

  • 29 wrz 2011Paczki KDE 4.6.5 dla Slackware

    Dostępne są paczki KDE 4.6.5 dla Slackware 13.37. Źródła i binarki można pobarć z tego miejsca.

  • 29 wrz 2011GNOME 3.2 już dostępny

    Informacje o wydaniu GNOME 3.2

Reklama

Ostatnie komentarze

Gravatar

Ekspertyza sądowa pamięci BS Sport

unfa / 10 maj 2012 / 11:33

7 dni temu.

Kryminał informatyczny - i to z życia wzięty oraz mający miejsce w polskich realiach! Cud miód! :D A poważniej: nie ...

Gravatar

Apple 10 lat za Microsoftem

Paweł / 09 maj 2012 / 19:13

8 dni temu.

Podchodziłbym do tego z rezerwą. Kiedyś cwaniaczki z Lamersky lab chciały nam wmówić, że potrzebujemy ich produktów na Linuksa. Może ...

Gravatar

Rozwój DreamDesktop

lucas / 03 maj 2012 / 18:48

14 dni temu.

@mentorious Jak to sobie wyobrażasz? I które GNOME masz na myśli? GNOME Shell, Unity, Cinamoon, Pantheon, Mate? Chyba lepiej wspierać ...

Gravatar

Rozwój DreamDesktop

mentorious / 30 kwi 2012 / 18:16

17 dni temu.

Pomysł i sam program jest genialny! Będzie to dało radę zastosować używając Gnome bez dociągania połowy zależności KDE?

Popularne wpisy (ostatnie 7 dni)

Kategorie wpisów

Nuta tygodnia

Nuta tygodnia #9

Poprzednie nuty

Facebook

GooglePlus

Lubię odwiedzać

Warte odnotowania

Software monitor

2012-05-12 : Kernel (3.x) 3.3.6 75,3 MB 2012-05-11 : Wine 1.5.4 19,3 MB 2012-04-15 : Apache 2.4.2 3,9 MB 2011-08-04 : Kernel (2.6) 2.6.39.4 72,6 MB

Czytelnicy online

  • Aktualna liczba czytelników : 9