Геолокация на PHP с помощью сервиса ipgeobase.ru

Типичная задача разработчика сайта – определить местоположение посетителя по его IP-адресу. Очень полезен в данном случае бесплатный сервис IpGeoBase. С задачей определения города по IP-адресу для России и Украины он  справляется лучше, чем аналогичные сервисы.

Для проверки я взял 30000 IP-адресов посетителей сайта (в основном из России и Украины) и определил их местоположение. IpGeoBase для России и Украины определил регион в 98,6% случаев, в то время как GeoIP только в 78,0%, а платный geodb.ru – в 87,4%.

Существующая библиотека для работы с IpGeoBase от faniska при работе обращается к внешнему XML-сервису IpGeoBase. Для меня это является существенным недостатком: проще и быстрее работать с локальной базой. Поэтому я написал свой скрипт. Работать с ним проще простого:

Метод getRecord возвращает массив данных или false.

По умолчанию библиотека ожидает, что в той же папке лежат файлы базы: cidr_optim.txt и cities.txt. Можно передать пути к ним как параметры конструктора.

Т.к. база IP достаточно обширная, простой поиск (строка за строкой с начала файла) здесь не оптимален. Поэтому при поиске библиотека начинает искать IP адрес, начиная с середины файла cidr_optim.txt. Если искомый адрес меньше адреса в середине списка, то мы продолжаем искать в первой половине, иначе – во второй. Далее мы разбиваем оставшуюся область еще на две части и так далее рекурсивно, пока не дойдем до нужной записи. Если требуется высокая производительность, то cidr_optim.txt и cities.txt логично поместить в оперативную память.

Вы можете скачать класс для работы с архивом на GitHub. Распространяется по лицензии GPL.

https://github.com/rossvs/ipgeobase.php (нажмите кнопку “Download ZIP” справа).

Рубрика: PHP | Добавить комментарий

Нет слов

china post delay

10 к 1, что это почта Китая творит безобразие, т.к. посылки из Европы и США приходят вовремя.

Рубрика: хоррор | Добавить комментарий

Soekris 6501 control status LED, error LED on FreeBSD from bash script

Controlling Soekris 6501 LEDs is a little bit tricky.
We need to write 0 or 1 to specific I/O addresses.

There is no standard program or command to do this task. Happily, I’ve goggled a suitable piece of code from Bjorn Karlsson – program named gpdevio (mirror).

First you need to compile source code. After this you can read and write from I/O ports (with root privileges).

For example to set Ready LED to on state:
# gpdevio -p 0x069D -w -v 0x1

Or shut off error LED:
# gpdevio -p 0x069C -w -v 0x0

I use this program to flash LEDs according to state of my NTP server on FreeBSD 9.1 i386. If ntpd is down Error LED is on, otherwise green Status LED is on. But if ntpd is up and stratum is not 1 I turn on both LEDs. I run this bash script with crontab every minute:

You can use this technique to control GPIO pins of Soekris 6501 as well.

Via http://www.mail-archive.com/soekris-tech@lists.soekris.com/msg06738.html

Рубрика: NTP, администрирование | Метки: , , , , | Добавить комментарий

Лошадиная сила — векторная величина, выражающая воздействие сферического коня в вакууме диаметром 1 м и массой 1 кг, движущегося с ускорением 1 м/с² в инерциальной системе отсчета.

Рубрика: юмор | Добавить комментарий

– How do you do? (Как ты это делаешь?)
– Allright!!! (Всё правой!!!)

Рубрика: english, юмор | Добавить комментарий

vsftpd Connection failed. OOPS: child died

Проблема:
при заходе на vsftpd возникает ошибка Connection failed. OOPS: child died или 500 OOPS: cannot change directory.
В обычном случае проблема может быть вызвана недоступностью домашней папки для пользователя.
Однако, если установлен SELinux также требуется разрешить заход на FTP в домашнюю папку:
/usr/sbin/setsebool ftp_home_dir=1

http://blog.razuna.com/tag/centos-5/
http://www.linuxquestions.org/questions/linux-software-2/vsftpd-and-selinux-449313/

Рубрика: администрирование | Добавить комментарий

Отправка письма после выполнения команды в консоли Linux/BSD

Отправка письма после выполнения команды в консоли Linux/BSD:
nohup cmd && echo "Got it!" | mail -s 'Task complete' email@domain.com &

Рубрика: администрирование | Добавить комментарий

Беру!

Рубрика: хоррор | Добавить комментарий

Создание статичного зеркала сайта с помощью wget

Wget предоставляет простой способ сделать зеркало сайта. Опции:
-m рекурсивный обход без ограничения вложенности, учитывать timestamp;
-k переписывать ссылки, так чтобы они работали в сохраненной копии;
-E сохранять HTML и CSS с правильным расширением файла;
-p скачивать ресурсы страницы (изображения и т.п.);

nohup wget -m -k -E -p -R 'exe,com,rar,zip,7z,gz,mpg,mpeg,avi,mp3,pdf,doc,docx' http://www.site.ru/ &

Если вы не хотите перегружать сайт запросами, добавьте опцию -w для включения паузы между запросами (см. wget -h).

После того как зеркало скачалось, можно включить временный редирект на него.

Рубрика: Без рубрики | Добавить комментарий

Оптимизация MySQL

Правильный способ случайной сортировки в MySQL

  1. // what NOT to do:  
  2. $r = mysql_query(“SELECT username FROM user ORDER BY RAND() LIMIT 1”);  
  3.   
  4. // much better:  
  5.   
  6. $r = mysql_query(“SELECT count(*) FROM user”);  
  7. $d = mysql_fetch_row($r);  
  8. $rand = mt_rand(0,$d[0] – 1);  
  9.   
  10. $r = mysql_query(“SELECT username FROM user LIMIT $rand, 1”);

Источник Top 20+ MySQL Best Practices

http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/

Рубрика: MySQL | Добавить комментарий