Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5 6 7 8      [все]
 Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Здарова други!

Кодеры. Программеры. Арифметики и счетоводы. И сочувтвующие.

Значит есть у меня база. В формате csv. И прогружена в БД для удобства. Диапазоны IPv4 адресов и привязка к странам.

2.92.0.0,2.95.255.255,"RU","48","Moscow","",55.7522,37.6156,,
2.96.0.0,2.96.23.255,"GB","H8","Liverpool","",53.4167,-3.0000,,
2.96.24.0,2.96.27.255,"GB","N1","Saint Helens","",53.4500,-2.7333,,
2.96.28.0,2.96.47.255,"GB","H8","Liverpool","",53.4167,-3.0000,,
2.96.48.0,2.96.51.255,"GB","H2","Skelmersdale","",53.5333,-2.8000,,
2.96.52.0,2.96.55.255,"GB","H8","Liverpool","",53.4167,-3.0000,,
2.96.56.0,2.96.59.255,"GB","H2","Skelmersdale","",53.5333,-2.8000,,
2.96.60.0,2.96.61.255,"GB","N1","Saint Helens","",53.4500,-2.7333,,
2.96.62.0,2.96.63.255,"GB","I2","Manchester","",53.5000,-2.2167,,
2.96.64.0,2.96.65.255,"GB","H2","Ormskirk","",53.5667,-2.9000,,
2.96.66.0,2.96.67.255,"GB","H2","Skelmersdale","",53.5333,-2.8000,,
.....

Тоесть скруль к примеру (89.188.113.172) попадает в диапазон [89.188.106.244 89.188.127.255] - Ru/Moscow.


Задача - визуализировать ВСЕ адреса на картинке. Каждый пиксел - 1 уникальный адрес.
Каждая страна - отдельный цвет.. По сути - получить
мозаику из стран.

Прошу мозговой штурм.

Чо. Как. Трудности. Количественные оценки.
Примеры хард-кода.

Доп. цифры могу предоставить. Сколько адресов. Сколько диапазонов и стран. (Сформирую отчётики)
-----

Спасибо.
13 мар 15, 13:36    [17380387]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9478
А смысл? Может взять какую нибудь карту мира и на ней раскрасить?
13 мар 15, 14:18    [17380660]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Смысл - пятничное обсуждение. Чуть позже дам цифирки.
13 мар 15, 14:31    [17380766]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
Хопа! А вот и цифирки.

Значит так.

Количество диапазонов.
SQL> select count(*) from geoipcity;

  COUNT(*)
----------
   5748952


Всего аллоцировано IPv4 адресов.
SQL> select sum(n_endip-n_startip) from geoipcity;

SUM(N_ENDIP-N_STARTIP)
----------------------
            3155268734

Это чуть меньше адресации 32х бит.

Всего стран.
SQL> select count(*) from (select distinct country from geoipcity);

  COUNT(*)
----------
       239


Топ 10 стран по количеству аллоцированных адресов.
SQL> select * from (select country,sum(n_endip-n_startip) "SUM" from geoipcity group by country order by 2 desc) where rownum<=10;

COUNT        SUM
----- ----------
US    1507673738
CN     267741269
JP     186372005
GB     115678470
DE     111001300
KR      99794924
CA      79731827
FR      71670825
AU      47299268
IT      45215782
13 мар 15, 15:34    [17381336]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
SashaMercury
Member

Откуда: Москва
Сообщений: 2653
Проблема с тем, чтобы понять какие страны граничат друг с другом, и исходя из этого определиться с тем, как их можно раскрашивать.
Если я правильно понял.

Определить это можно только по географическим координатам. Полный перебор очевидно не подходит. Нужно найти подходящий способ определения контура каждой страны. Определить метрику между контурами, и исходя из этого делать выводы об общей границы.

Либо, построить все(либо достаточное количество) точки. Провести триангуляцию области. Сделать выводы о границах, и провести раскраску
13 мар 15, 15:47    [17381420]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
miksoft
Member

Откуда:
Сообщений: 38773
mayton
Задача - визуализировать ВСЕ адреса на картинке.
Так на что должна эта картинка походить? Реальная карта стран? Или тупо прямоугольник 64Кх64К?

В порядке пятничного бреда - а что если попытаться скормить все или часть адресов кластеризации в яндекс.картах ? Они, помнится, где-то писали, что довольно много точек могут прожевать. Правда, вряд ли 5 миллионов смогут.

Кстати, если сделать группировку по координатам, то сколько останется?
13 мар 15, 15:57    [17381487]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
SashaMercury
Member

Откуда: Москва
Сообщений: 2653
miksoft
mayton
Задача - визуализировать ВСЕ адреса на картинке.
Так на что должна эта картинка походить? Реальная карта стран? Или тупо прямоугольник 64Кх64К?

В порядке пятничного бреда - а что если попытаться скормить все или часть адресов кластеризации в яндекс.картах ? Они, помнится, где-то писали, что довольно много точек могут прожевать. Правда, вряд ли 5 миллионов смогут.

Кстати, если сделать группировку по координатам, то сколько останется?


вероятно должна получиться реальная карта стран построенная только на основе IP - адресов. Тут больше 3 миллиардов, где вы тут 5 миллионов увидели не понял:)
13 мар 15, 16:01    [17381510]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
SashaMercury
Проблема с тем, чтобы понять какие страны граничат друг с другом, и исходя из этого определиться с тем, как их можно раскрашивать.
Если я правильно понял.

Определить это можно только по географическим координатам. Полный перебор очевидно не подходит. Нужно найти подходящий способ определения контура каждой страны. Определить метрику между контурами, и исходя из этого делать выводы об общей границы.

Либо, построить все(либо достаточное количество) точки. Провести триангуляцию области. Сделать выводы о границах, и провести раскраску

Нет. Никакой географии пока не нужно. В этой базе нет информации о границах государств.
А сервисы визуализирующие трафик клиентов на сайте с точки зрения гео-локаций уже
существуют. И я не буду их повторять. Мне вообще всегда скушно любое повторение.

А вот отобразить over 3 млрд цветных точек на большом квадрате. Каждая из которых - 1 адрес.
Это мне кажется задачей любопытной. И вовсе не такой однозначной.
13 мар 15, 16:05    [17381542]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
miksoft
mayton
Задача - визуализировать ВСЕ адреса на картинке.
Так на что должна эта картинка походить? Реальная карта стран? Или тупо прямоугольник 64Кх64К?

В порядке пятничного бреда - а что если попытаться скормить все или часть адресов кластеризации в яндекс.картах ? Они, помнится, где-то писали, что довольно много точек могут прожевать. Правда, вряд ли 5 миллионов смогут.

Кстати, если сделать группировку по координатам, то сколько останется?

Думаю - да. Это (предположительно) квадрат со стороной >= 64К пикселов.

Разумно будет с точки зрения дизайна заполнить его нейтральным серым цветом.
Это будет маркировка не использованых или потерянных адресов. Или адресов
локальных сетей.

А over 200 стран(государств) раскрасить в цвета радуги от синего до красного.
13 мар 15, 16:07    [17381554]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
SashaMercury
Member

Откуда: Москва
Сообщений: 2653
mayton
SashaMercury
Проблема с тем, чтобы понять какие страны граничат друг с другом, и исходя из этого определиться с тем, как их можно раскрашивать.
Если я правильно понял.

Определить это можно только по географическим координатам. Полный перебор очевидно не подходит. Нужно найти подходящий способ определения контура каждой страны. Определить метрику между контурами, и исходя из этого делать выводы об общей границы.

Либо, построить все(либо достаточное количество) точки. Провести триангуляцию области. Сделать выводы о границах, и провести раскраску

Нет. Никакой географии пока не нужно. В этой базе нет информации о границах государств.
А сервисы визуализирующие трафик клиентов на сайте с точки зрения гео-локаций уже
существуют. И я не буду их повторять. Мне вообще всегда скушно любое повторение.

А вот отобразить over 3 млрд цветных точек на большом квадрате. Каждая из которых - 1 адрес.
Это мне кажется задачей любопытной. И вовсе не такой однозначной.



А в чём проблема раскрасить каждую точку? Их нужно раскрашивать определенным цветом в зависимости от государства ?
13 мар 15, 16:08    [17381563]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34688
mayton

Задача - визуализировать ВСЕ адреса на картинке. Каждый пиксел - 1 уникальный адрес.


Э...
Может карта Кохонена ?
13 мар 15, 16:09    [17381568]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
По поводу яндекса - я не вкурсе. Наверное речь идёт о каком-то сервисе кластеризации
которого я просто не знаю.

Но в порядке пятничного бреда - даже для пикселов в квадрате мне понадобится какой-то
инструмент для идентификации диапазона.

Например можно сделать приложение. Ты навёл мышкой над цветной областью - и тебе пишут
дескыть [89.188.106.244 - 89.188.127.255] - Ru/Moscow.
13 мар 15, 16:09    [17381571]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34688
mayton
Задача - визуализировать ВСЕ адреса на картинке. Каждый пиксел - 1 уникальный адрес.
Каждая страна - отдельный цвет.. По сути - получить
мозаику из стран.


Так а какова цель визуализации ? Какие параметры нужно визуализировать на картинке?
13 мар 15, 16:11    [17381584]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
SashaMercury
Member

Откуда: Москва
Сообщений: 2653
MasterZiv
mayton
Задача - визуализировать ВСЕ адреса на картинке. Каждый пиксел - 1 уникальный адрес.


Э...
Может карта Кохонена ?


то есть всё-таки с метриками придётся разобраться
13 мар 15, 16:12    [17381588]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34688
MasterZiv
mayton
Задача - визуализировать ВСЕ адреса на картинке. Каждый пиксел - 1 уникальный адрес.


Э...
Может карта Кохонена ?


Ну да, поскольку есть критерий пространственной близости-удалённости (расстояние между коорд., заданными широтой и долготой),
то да, можно построить карту Кохонена.


p.s. если не секрет, где берёте IPGEODATA ? (можно в приват).
13 мар 15, 16:14    [17381607]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
SashaMercury
А в чём проблема раскрасить каждую точку? Их нужно раскрашивать определенным цветом в зависимости от государства ?

Давай порассуждаем. Какого размера картинки ты вообще встречал в природе?

Я знаю что современные зеркалки шлёпают сырые фотки до 16 мегапикселов.
Это (примерно) 4000 на 4000 цветных элементов каждый из которых занимает 24/32
бита в зависимости от способа хранения.

И это далеко не тривиальная задача даже просто создать подобную картинку 64К на 64К.

Это софт - эксклюзивный. Штучный. И думаю что создавать ее придется частями.
Панорамой. Это придает задаче определенный трудный старт.

Кстати я год назад гуглил сервис который хранит гига-пиксельные фотки. Кажется
там было фото Эвереста отснятое большим количеством панорамок.
13 мар 15, 16:14    [17381612]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
miksoft
Member

Откуда:
Сообщений: 38773
mayton
По поводу яндекса - я не вкурсе. Наверное речь идёт о каком-то сервисе кластеризации
которого я просто не знаю.
У них свой сервис в составе API яндекс.карт. Но, если географии не надо, то, наверное, и сервис не подойдет.
13 мар 15, 16:14    [17381616]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
MasterZiv
Так а какова цель визуализации ? Какие параметры нужно визуализировать на картинке?

Это должна быть цветная диаграмма. На которой должны быть видны все 200+ стран. В виде прямоугольничков.
Или полосок. Или просто каких-то сложных областей. Типа многоугольников.

И должно соблюдаться отдельное условие которое я специально сам себе задал. (Только что)

- Два соседних IPv4 адреса должны быть двумя соседними пикселами на картинке.
13 мар 15, 16:17    [17381635]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
miksoft
Member

Откуда:
Сообщений: 38773
Кстати, наверняка есть смысл "причесать" этот список диапазонов - слить соседние одинаковые, разобраться с пересечениями, удалить мелкие диапазоны, входящие в идентичные более крупные и т.п.
13 мар 15, 16:19    [17381664]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
MasterZiv
Ну да, поскольку есть критерий пространственной близости-удалённости (расстояние между коорд., заданными широтой и долготой),
то да, можно построить карту Кохонена.

Э.... здесь я зависну на пару недель. Мне знаком термин карта Кохонена. Кажется в универе мы изучали это на курсе
нейросетей. Не хочу показаться незнающим поэтому пока поскипаем. Чуть позже я попробую осмыслить предложение
и дать ответ.

p.s. если не секрет, где берёте IPGEODATA ? (можно в приват).

Нет не секрет. ПО находится здесь. Там же торгуют базами или сервисом гео-локаций.

https://www.maxmind.com/en/geoip2-services-and-databases

Тестовую базу в разрезе крупных городов можно там скачать (так было года 2 назад. Щас не знаю).

Моя выборка CSV (более полная я так думаю) легко находися на http://rutracker.org по ключевым словам maxmind, geoip, geolocation

Там много бинарей (уже legacy формат) и есть выборка *.csv (файлик размером 400М).

Впрочем если что я могу скинуть.
13 мар 15, 16:25    [17381705]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
miksoft
Member

Откуда:
Сообщений: 38773
mayton
И должно соблюдаться отдельное условие которое я специально сам себе задал. (Только что)

- Два соседних IPv4 адреса должны быть двумя соседними пикселами на картинке.
Если это абсолютное требование - то вариант только один - линейное расположение пикселей, т.е. цепочка. А вот укладывать эту цепочку на плоскости можно разными способами - меандром, по спирали и т.п.

Я бы для начала предложил не мудрить, а построить прямоугольник 3584х4096. В качестве координат - первые 12 разрядов и следующие 12 разрядов ip-адресов. Младший октет игнорировать. Сильно подозреваю, что, за небольшим исключением вкраплений старых крупных диапазонов, это будет абсолютно хаотичная картинка.
13 мар 15, 16:26    [17381715]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
SashaMercury
Member

Откуда: Москва
Сообщений: 2653
Марк, как будут раскрашиваться точки ?
Цвет точек принадлежащих одной стране одинаковый ?
Рядом не должны быть расположены 2 страны с одинаковым цветом ?
13 мар 15, 16:30    [17381746]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
miksoft
Если это абсолютное требование - то вариант только один - линейное расположение пикселей, т.е. цепочка. А вот укладывать эту цепочку на плоскости можно разными способами - меандром, по спирали и т.п.

Да я щас думаю над этим. Самое сложное - обеспечить кластеризацию или скопление точек в одном месте.
Не хочется диаграмму превращять в полосатый шум. Всё таки визуализация должна быть наглядной.

Я подумал вот над чем. Если диапазон адресов перевести в коды Грея то между соседними адресами
не будет скачков и если взять 32 битное целое (адрес) и разбить его на 16+16 битов Грея
то эта пара координат в (x,y) будет достаточно плотно лежать с соседями.

Я бы для начала предложил не мудрить, а построить прямоугольник 3584х4096. В качестве координат - первые 12 разрядов и следующие 12 разрядов ip-адресов. Младший октет игнорировать. Сильно подозреваю, что, за небольшим исключением вкраплений старых крупных диапазонов, это будет абсолютно хаотичная картинка.

Мысль инетересная. Думаю что для чернового варианта диаграммы я так и сделаю.

Минут через 15 подкину еще цифр по длинам диапазонов.
13 мар 15, 16:33    [17381759]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
SashaMercury
Марк, как будут раскрашиваться точки ?
Цвет точек принадлежащих одной стране одинаковый ?
Рядом не должны быть расположены 2 страны с одинаковым цветом ?

Ну.... top10 стран ты видел. Надо чтобы хотя-бы эти "толстяки" не пересекались
по HSV палитре.

А на всякие там республики Тувалу или Мауру мне будет пофигу. Пускай цвета похожи.
13 мар 15, 16:36    [17381782]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
miksoft
Member

Откуда:
Сообщений: 38773
mayton
Самое сложное - обеспечить кластеризацию или скопление точек в одном месте.
mayton
- Два соседних IPv4 адреса должны быть двумя соседними пикселами на картинке.
Имхо, эти два требования несовместимы между собой.
13 мар 15, 16:37    [17381786]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
MyNiGoo
Member

Откуда:
Сообщений: 233
взять прямоугольник любого размера, раскрашенный палитрой пропорционально количеству записей для каждой страны и привязать к перемещению курсора всплывающую подсказку с рандомным адресом из той страны, чей цвет сейчас под курсором
13 мар 15, 16:41    [17381817]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34688
mayton
MasterZiv
Ну да, поскольку есть критерий пространственной близости-удалённости (расстояние между коорд., заданными широтой и долготой),
то да, можно построить карту Кохонена.

Э.... здесь я зависну на пару недель. Мне знаком термин карта Кохонена. Кажется в универе мы изучали это на курсе
нейросетей. Не хочу показаться незнающим поэтому пока поскипаем. Чуть позже я попробую осмыслить предложение
и дать ответ.


Не висни слишком долго, я висел месяца два...


Я тебе в помощь там ещё один пятничный топик сделал.
Твоя программка очень похожая будет.

Единственное, что KNNL не поддерживет т.н. пакетное обучение. Я пока ещё не настоящий сварщик, и не знаю, что это такое, но
я знаю, что MATLAB с его поддержкой обучает карты на порядки быстре, а вот KNNL тут проседает. Т.е. медленный он.
13 мар 15, 16:44    [17381827]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34688
mayton
Впрочем если что я могу скинуть.


Не, скидывать не надо, нам нужны официальные и обновляемые данные.
13 мар 15, 16:45    [17381838]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
MasterZiv
Не висни слишком долго, я висел месяца два...


Я тебе в помощь там ещё один пятничный топик сделал.
Твоя программка очень похожая будет.

Единственное, что KNNL не поддерживет т.н. пакетное обучение. Я пока ещё не настоящий сварщик, и не знаю, что это такое, но
я знаю, что MATLAB с его поддержкой обучает карты на порядки быстре, а вот KNNL тут проседает. Т.е. медленный он.

Спасибо Илья. Посмотрю.
13 мар 15, 16:46    [17381848]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
MyNiGoo
взять прямоугольник любого размера, раскрашенный палитрой пропорционально количеству записей для каждой страны и привязать к перемещению курсора всплывающую подсказку с рандомным адресом из той страны, чей цвет сейчас под курсором


O sancta simplicitas! Но как это сделать? (с)
13 мар 15, 16:49    [17381861]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
miksoft
mayton
Самое сложное - обеспечить кластеризацию или скопление точек в одном месте.
mayton
- Два соседних IPv4 адреса должны быть двумя соседними пикселами на картинке.
Имхо, эти два требования несовместимы между собой.

Почему?
13 мар 15, 17:01    [17381971]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная география  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34688
Подождите, ещё раз.
У нас такие объекты:

  • 2.92.0.0,2.95.255.255, -- диапазон IP-адресов.
  • "RU", -- страна
  • "48", -- регион страны ?
  • "Moscow", -- город (название региона ?)
  • 55.7522,37.6156 -- геокоординаты центра региона ?

    пространственно-соотносимые параметры -- IP-адреса и центры стран.
    Несоотносимые -- всё остальное.

    Можно же просто нарисовать ленту IP-адресов (от 1 до FFFFFFFF),
    и в ней каждую линию поперёк прорисовать в виде цвета страны.
  • 13 мар 15, 17:06    [17382009]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34688
    mayton
    MyNiGoo
    взять прямоугольник любого размера, раскрашенный палитрой пропорционально количеству записей для каждой страны и привязать к перемещению курсора всплывающую подсказку с рандомным адресом из той страны, чей цвет сейчас под курсором


    O sancta simplicitas! Но как это сделать? (с)


    Да, у меня та же мысль.
    13 мар 15, 17:07    [17382017]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34688
    mayton
    MasterZiv
    Не висни слишком долго, я висел месяца два...


    Я тебе в помощь там ещё один пятничный топик сделал.
    Твоя программка очень похожая будет.

    Единственное, что KNNL не поддерживет т.н. пакетное обучение. Я пока ещё не настоящий сварщик, и не знаю, что это такое, но
    я знаю, что MATLAB с его поддержкой обучает карты на порядки быстре, а вот KNNL тут проседает. Т.е. медленный он.

    Спасибо Илья. Посмотрю.


    Я пока и сам не знаю, как это можно сделать и можно ли.
    13 мар 15, 17:08    [17382022]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34688
    mayton
    MyNiGoo
    взять прямоугольник любого размера, раскрашенный палитрой пропорционально количеству записей для каждой страны и привязать к перемещению курсора всплывающую подсказку с рандомным адресом из той страны, чей цвет сейчас под курсором


    O sancta simplicitas! Но как это сделать? (с)


    Так вообще просто.

    Грид.
    Строка -- запись в этой таблице. Нарисована тем цветом, какая страна.
    И крутить его туда-сюда прокруткой.

    Если надо всё сразу, то можно вместо строчки грида рисовать одну линию поперёк грида цветом страны.
    13 мар 15, 17:10    [17382050]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    miksoft
    Member

    Откуда:
    Сообщений: 38773
    mayton
    miksoft
    пропущено...
    пропущено...
    Имхо, эти два требования несовместимы между собой.

    Почему?
    Точнее, совместимы, но только путем сжатия всей картины до одного-двух пикселей, что, очевидно, не то, что нужно.

    Потому что даже пять кластеров уже невозможно расположить так, чтобы каждый граничил с каждым.
    13 мар 15, 17:11    [17382062]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34688
    MasterZiv
    mayton
    пропущено...


    O sancta simplicitas! Но как это сделать? (с)


    Так вообще просто.

    Грид.
    Строка -- запись в этой таблице. Нарисована тем цветом, какая страна.
    И крутить его туда-сюда прокруткой.

    Если надо всё сразу, то можно вместо строчки грида рисовать одну линию поперёк грида цветом страны.


    Ок, диапазонов много, значит делаем два связанных грида.

    Один слева -- укрупнённый, по одной линии пикселей поперёк в цвет страны.
    Второй справа -- при выделении диапазона в первом гриде мышкой показывает записи уже в виде полноценных записей,
    раскрашенные в те же цвета.
    13 мар 15, 17:12    [17382071]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Это диаграмма диапазонов. Я ее и так могу получить SQL запросом.
    13 мар 15, 17:18    [17382126]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    miksoft
    mayton
    пропущено...

    Почему?
    Точнее, совместимы, но только путем сжатия всей картины до одного-двух пикселей, что, очевидно, не то, что нужно.

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

    Есть у меня мысль. Пока еще не уверен что верная.

    Есть такая загогулина. Кривая Гилберта. Она заполняет квадратное пространство абсолютно
    плотно и с любой точностью. Причём каждая точка этой кривой отстоит от соседней не более чем на 1 пиксел.

    Есть у нее и еще одно свойство. Диапазон точек этой кривой будет практически всегда "свёрнут в клубок".
    Причём - любой диапазон.
    13 мар 15, 17:21    [17382159]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Вариант №1

    К сообщению приложен файл. Размер - 854bytes
    13 мар 15, 17:34    [17382243]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Остальные варианты-примеры осилю чуть позже. Ну вобщем - змейка. Линия слева направо. И кривая.

    Ну и всё это в масштабе 3 млрд.
    13 мар 15, 17:35    [17382254]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    miksoft
    Member

    Откуда:
    Сообщений: 38773
    mayton
    Есть такая загогулина. Кривая Гилберта. Она заполняет квадратное пространство абсолютно
    плотно и с любой точностью. Причём каждая точка этой кривой отстоит от соседней не более чем на 1 пиксел.

    Есть у нее и еще одно свойство. Диапазон точек этой кривой будет практически всегда "свёрнут в клубок".
    Причём - любой диапазон.
    "Клубок" там будет весьма приблизительный. Причем эта приблизительность будет разная в разных частях.
    + http://hijos.ru/2014/03/07/krivye-gilberta/
    Картинка с другого сайта.
    13 мар 15, 17:46    [17382303]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Ну всё равно старику Гилберту лайк.

    Но я еще проверю коды Грея. Они - проще в реализации. Нет рекурсии.
    13 мар 15, 17:50    [17382315]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Ну вот. Для полосатой диаграммы без учёта адресов уже есть данные.
    +
    	COUNT   
    ----- ----------
    US    1507673738
    CN     267741269
    JP     186372005
    GB     115678470
    DE     111001300
    KR      99794924
    CA      79731827
    FR      71670825
    AU      47299268
    IT      45215782
    NL      44178158
    BR      38180245
    RU      34957699
    TW      30465859
    MX      27900381
    IN      26304825
    ES      25594126
    SE      25279659
    CH      21335589
    EU      19628720
    ZA      17100156
    PL      16244009
    NO      14717469
    FI      12994850
    VN      12600978
    TR      11990484
    ID      11869502
    DK      11731191
    AT      11024228
    BE      10719201
    RO      10542581
    AR       9969758
    HK       9683012
    UA       7728142
    CZ       7502088
    IL       6878508
    TH       6780118
    NZ       6725268
    CO       6235042
    IE       5973603
    CL       5737059
    MY       5704934
    PT       5462884
    EG       5440360
    GR       5259212
    SG       5018016
    PH       4865629
    HU       4739873
    VE       4600930
    BG       3735633
    SA       3565640
    PK       3054816
    IR       2757786
    TN       2728515
    AE       2556549
    SK       2398410
    PE       2167157
    LT       2152166
    RS       2112352
    SI       1993967
    DZ       1870811
    HR       1759431
    KZ       1716973
    CR       1649135
    LV       1567385
    PA       1439365
    EC       1375337
    LU       1298023
    KW       1196205
    EE       1078211
    PR       1073821
    MA       1067057
    BY       1062473
    UY       1020847
    BD        913170
    GE        785365
    NG        783220
    MD        771719
    IS        765411
    A2        715964
    KE        643502
    CY        573587
    DO        565487
    BA        554576
    MK        541641
    LK        532039
    BO        521527
    MT        520569
    QA        518575
    AP        492976
    GT        486167
    MU        480841
    SY        468602
    TT        447303
    SV        444228
    LB        438722
    JO        415260
    PS        394843
    AM        393956
    BH        345651
    AZ        325996
    PY        318379
    OM        315345
    LY        305527
    SN        288246
    AN        287548
    TZ        274599
    GH        264770
    MO        260977
    NI        259276
    AL        248553
    JM        240479
    UZ        222310
    HN        221292
    RE        216062
    NP        199145
    KH        193021
    BN        190588
    GU        187161
    NA        182434
    GA        181609
    UG        177152
    IQ        175174
    SD        167059
    RW        161220
    MN        157955
    KG        147420
    ZM        146040
    GP        138227
    MQ        135771
    MZ        134505
    BZ        132508
    BS        131274
    ME        127979
    CI        127958
    CM        120334
    VI        120087
    AO        118018
    FJ        114956
    BB        111252
    BM        110159
    CU        108869
    NC        103702
    BW         94775
    HT         79183
    LI         72226
    GN         70456
    GI         68337
    AF         66110
    MW         63349
    ZW         60466
    IM         58900
    AW         56139
    MC         54684
    MV         54098
    TJ         53036
    SR         52976
    KY         50943
    LA         50929
    MG         49642
    A1         49263
    GF         49066
    AX         45665
    AG         45334
    JE         44821
    SZ         42697
    PG         42049
    YE         40771
    PF         39674
    MR         38624
    GY         38518
    FO         37814
    ML         37090
    GG         37027
    AD         34344
    SC         33507
    BJ         32098
    BF         31706
    SM         29122
    VG         26704
    NE         25403
    CD         23016
    BT         22551
    SL         22505
    KN         21853
    LS         17173
    VC         16702
    ET         16697
    WS         16377
    LC         16365
    GD         16018
    TC         15905
    GL         15755
    TG         14964
    LR         14348
    MP         14021
    VA         13827
    GM         13581
    CV         13247
    MM         12793
    DJ         11962
    AS          9783
    TM          9587
    VU          9477
    KP          9250
    PM          8424
    SB          8354
    TV          8191
    CK          8161
    AI          7720
    NR          7197
    FM          7159
    CG          6853
    TO          6645
    DM          6567
    PW          5147
    TD          4957
    CF          4852
    AQ          4538
    ER          4451
    SO          4039
    TL          3832
    GQ          3338
    BI          3217
    KI          3064
    MH          3034
    TK          2147
    MS          2044
    WF          2006
    GW          1626
    FK          1595
    UM          1563
    IO          1054
    NU          1014
    YT           984
    KM           954
    ST           509
    BV           284
    NF           255
    
    13 мар 15, 17:52    [17382330]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Значить кому интересне БД-шная часть.

    Приводу создающие скриптики. Они - самодельные поэтому могут быть некоторые мои ошибки в
    типах данных или отсутствии констрейнтов. Ну вобщем сами понимаете.

    create table geoipcity(
    	startIpNum varchar2(15) not null,
    	endIpNum   varchar2(15) not null,
    	country    varchar2(255) not null,
    	region     varchar2(255),
    	city       varchar2(255),
    	postalCode varchar2(255),
    	lattitude  binary_double,
    	longitude  binary_double,
    	dmaCode    varchar2(255),
    	areaCode   varchar2(255),
    	n_startip  number generated always as (ip2num(startipnum)) virtual,
    	n_endip    number generated always as (ip2num(endipnum))   virtual	
    );
    
    ALTER TABLE geoipcity ADD CONSTRAINT pk_geoip PRIMARY KEY (startIpNum,endIpNum);
                    
    CREATE INDEX N_STARTIP_INDEX ON GEOIPCITY(N_STARTIP);
    
    CREATE INDEX N_ENDIP_INDEX ON GEOIPCITY(N_ENDIP);
    
    exec dbms_stats.gather_schema_stats('GEO');
    
    13 мар 15, 17:59    [17382368]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Оракловые функции для трансляции IP-NUM. Выглядят некрасиво но что поделать. Оракл такой.
    По сабжу они - боян т.к. несколько лет назад я уже их где-то постил.

    create or replace function ip2num(ip varchar2)
    return number deterministic
    is
      w varchar2(3); 
      x varchar2(3);
      y varchar2(3);
      z varchar2(3);  
      p1 pls_integer;
      p2 pls_integer;
    begin
      if length(ip)>15 then 
        return null;
      end if;  
      if length(ip)<7 then 
        return null;
      end if;
      p1:=1;
    
      p2:=INSTR(ip,'.',p1+1);
      w :=substr(ip,p1,p2-p1);
      p1:=p2;
    
      p2:=INSTR(ip,'.',p1+1);
      x :=substr(ip,p1+1,p2-p1-1);
      p1:=p2;  
    
      p2:=INSTR(ip,'.',p1+1);
      y :=substr(ip,p1+1,p2-p1-1);
      p1:=p2;  
    
      z :=substr(ip,p2+1);
    
      return 16777216*to_number(w)+65536*to_number(x)+256*to_number(y)+to_number(z);
    end;
    /
    
    
    create or replace function num2ip(num binary_integer)
    return varchar2 deterministic
    is
      ip varchar2(15);
    begin
      ip:='';
      ip:=ip||to_char(mod(trunc(num/16777216),256));
      ip:=ip||'.';
      ip:=ip||to_char(mod(trunc(num/65536),256));
      ip:=ip||'.';
      ip:=ip||to_char(mod(trunc(num/256),256));
      ip:=ip||'.';
      ip:=ip||to_char(mod(num,256));
      return ip;
    end;
    /
    
    13 мар 15, 18:01    [17382377]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Контрольный файл для SQL*Loader для импорта.

    load data
     infile 'GeoIPCity.csv'
     truncate into table geoipcity
     fields terminated by "," optionally enclosed by '"'		  
     TRAILING NULLCOLS
     ( 
    	startIpNum,
    	endIpNum  ,
    	country   ,
    	region    ,
    	city      ,
    	postalCode,
            lattitude ,
    	longitude ,
    	dmaCode   ,
    	areaCode  
     )
    
    13 мар 15, 18:02    [17382385]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Да. Опцию 'virtual' из создающего скрипта для таблицы надо убрать нахер.

    Экспериментировал неудачно.
    13 мар 15, 18:14    [17382435]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Ну.... по поводу географии. Всмысле карты. Широта. Долгота. Пожалуй это тоже тема.

    Но я ее подниму отдельным топиком. +Всегда интересно было видеть traceroute
    в привязке к реальным точкам на планете.

    P.S. Пошёл читать про географию.

    P.S. Глобусы... развёртки. Широта. Долгота. Аборигены. Кук....
    13 мар 15, 19:43    [17382799]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    miksoft
    Member

    Откуда:
    Сообщений: 38773
    mayton
    Ну.... по поводу географии. Всмысле карты. Широта. Долгота. Пожалуй это тоже тема.
    Таки повторюсь:
    miksoft
    если сделать группировку по координатам, то сколько останется?
    Есть подозрение, что координаты прописаны по центрам городов, т.е. конечных точек будет не так уж и много. Кажется, когда-то я даже на эту тему видел исследование на хабре. И если мне не изменяет память, там более менее детально были только США и немного Европа, остальной мир - в основном крупные регионы или даже страны и мегаполисы.

    mayton
    Всегда интересно было видеть traceroute
    в привязке к реальным точкам на планете.
    Помнится, даже онлайн-сервис такой был лет 15 назад.
    И программы были - hostinfo.ru/articles/184
    13 мар 15, 20:01    [17382842]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    whois и who.is и прочие им подобные выдают DNS записи по хостингам.
    Но среди них я не нашёл гео-привязки.

    Вообще мне кажется что централизованной детальной БД по geoip не существует.
    Ну... или по крайней мере каждый повайдер ведёт свою собственную БД
    сродни техучёта или кабельного хозяйства. И эта БД вряд-ли где-то шарится.

    Поэтому координаты крупных городов это пожалуй наиболее достоверная
    инфа. Дальше - приватная. И децентрализованная.

    Насчёт США с их Prism и прочими системами - очень даже верю. Но... это
    только под силу таким государствам.
    13 мар 15, 23:28    [17383244]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    По поводу Country-IP диаграммы. Так я буду называть это.

    Вобщем я подумал. И решил что делать это удобно через конвейер тулзов.
    Это даёт больше свободы творчества и экспериментов. Я не буду кодить
    конкретно реализацию рисовалки картинок. А сделаю нечто вроде набора
    процессов поставщиков-потребителей.

    GeoIP data => sorting => coloring => { linear | zigzag | gray | gilbert iteration} => panoramSplitter => bitmapRenderer
    


    Причём часть из этих утилит возможно есть в линуксе точнее их аналоги такие
    как sort, awk/gawk, sqlite, grep, imagemagic.
    14 мар 15, 00:06    [17383312]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Pantone Color Tables. Не знаю нахрена она нужна но выглядит красиво.
    Пожалуй возьму себе.

    http://www.novact.info/id40.html

    Там 121 цвет. Надо еще придумать где найти недостающие.

    Есть варианты.

    1) Генерить случайно.
    2) Брать две буквы названия страны (RU,US,CA) и каким-то образом получать RGB тройку.

    И еще не забыть системные 8 цветов (самые насыщееные типа 'red','cyan','magenta') добавить в top 8 стран чтоб ярче и заметнее было.
    14 мар 15, 11:33    [17383813]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Еще можно объединить с HTML color tables.

    http://html-color-codes.info/color-names/
    14 мар 15, 11:37    [17383824]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Значит вот что я придумал.

    Итак 239 стран. Надо раздать им цвета.

    Палитру белых-серых-черных я резервирую для системных нужд.

    Поэтому цвета близкие к FFFFFF, C0C0C0, 000000 будут игнорироваться при маппинге.

    Top 6 стран должны получить наиболее яркие цвета.

    Code  Allocation Color
    ----- ---------- ------
    US    1507673738 'red'
    CN     267741269 'green'
    JP     186372005 'blue'
    GB     115678470 'magenta'
    DE     111001300 'yellow'
    KR      99794924 'cyan'
    


    Поэтому вышеуказанные цвета будут удалены из оставшихся. Будут также удалены все "близкие" к ним цвета.
    По формуле цветового расстояния RGB. С учётом весов.

    Итак 239 - 6 = 233

    Далее у нас есть две палитры. Pantone, HtmlColors. Грубо говоря 121 + 120 (Я удалил градации серых и белых).

    Это 241 Цвет. Нужно еще что-то выкинуть.

    Полагаю в двух палитрах будут цвета дубликаты. Или "близкие" цвета.

    Буду удалять их до тех пор пока не останется 233.
    14 мар 15, 12:25    [17383879]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    Это 241 Цвет. Нужно еще что-то выкинуть.

    Полагаю в двух палитрах будут цвета дубликаты. Или "близкие" цвета.

    Буду удалять их до тех пор пока не останется 233.

    Возьми 8 последних стран и дай им такие же цвета как 8 предпоследним. Пусть самые маленькие парами выступают :)
    14 мар 15, 14:24    [17384046]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Gilbertroute готов. Хехе....

    $ gilbertroute level=2
    0,0
    0,1
    1,1
    1,0
    2,0
    3,0
    3,1
    2,1
    2,2
    3,2
    3,3
    2,3
    1,3
    1,2
    0,2
    0,3
    


    Терь надо думать над основным алгоритмом.
    14 мар 15, 18:38    [17384411]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Дальше нужна какая-нить "деревянна" либа для работы с графикой. Желательно несжатой.
    Т.к. возможно я будут многократно в течение сеанса открывать и закрывать сотни битмапов
    в режиме update.

    Кто-нить знает такую?
    14 мар 15, 18:45    [17384424]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Немного цЫфирей. Что сосбно упадёт в OUTPUT ?

    На выходе я ожидаю виртуальную картинку размера 64k x 64k.

    Или 64 * 1024 на 64 * 1024.

    Или панораму. Множество картинок.

    GeoIPCountry-00-00.bmp
    ......
    GeoIPCountry-63-63.bmp
    

    Размером 1024 на 1024.

    При палитровом режиме bmp там вобщем-то будет (прибл) 1 пиксел равен 1 байту.

    Или грубо говоря каждая картинка по 1 Мб.

    Итого всё хранилище 64 * 64 = 4096 Mб = 4Гб. Что вобщем-то подтверждает расчёт.
    14 мар 15, 19:55    [17384519]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Но квадратные картинки некрасиво смотреть на мониках 16 на 9.

    И я решил заложить в спецификацию "выхода" следующие наборы разрешений.

    Для олд-скульных размеров моников и некоторых планшетов и телефонов.

    XVGA       ;320x240
    VGA-16     ;640x480
    NTSC       ;720x480 
    PAL        ;720x576 
    SVGA-600   ;800x600
    SVGA-768   ;1024x768
    


    Для HD. Для красоты я дал им реальные имена соответвтующие реальным размерам панелей.
    HD-Ready   ;1280x720
    BenQ BL702A;1280x1024
    HP-ProBook ;1366x768 
    Asus VE198S;1440x900 
               ;1600x900 
               ;1680x1050
    Full-HD    ;1920x1080
               ;1920x1200
    LC-34UM65-P;2560x1080
               ;2560x1440
    Dell UltraSharp U3014   ;2560x1600
    Samsung Curved S34E790CN;3440x1440
                            ;3840x2160
    LG 31MU97-B             ;4096x2160
    


    Модель с разрешением 1366 на 768 является самой популярной (со ссылкой на http://www.w3schools.com/browsers/browsers_display.asp).

    Думаю что это связано с тотальным засильем ноутов типа моего HP-ProBook. Буду ориентироваться на этот размерчик
    как на самый основной.
    14 мар 15, 20:02    [17384532]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Для панжорамы популярного дисплея.

    По горизонтали будет

    65536 / 1366 = 48 (с округлением в большую сторону).

    По вертикали.

    65536 / 768 = 86.

    Тоесть панорама 00..47 и 00..85.
    14 мар 15, 20:07    [17384543]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Более менее причёсанный вариант одной утилиты.

    gilbertroute.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>
    #include <io.h>
    
    #ifdef _WIN32
    #include "windows.h"
    #endif
    
    /* 14.03.2015 (Mayton) - In beginning... */
    
    
    const int u=1;  // pixel step
     
    void a(int i) ;
    void b(int i) ;
    void c(int i) ;
    void d(int i) ;
    
    int glx;
    int gly;
    
    // BGI emulation
    void linerel(int x,int y)
    {
    	glx+=x;
    	gly+=y;
    	printf("%d,%d\n",glx,gly);
    }
    
    void moveto(int x,int y)
    {
    	glx=x;
    	gly=y;
    	printf("%d,%d\n",glx,gly);
    }
    
     
    // Elements of curve
    void a(int i)
    {
    	if (i > 0)
    	{
    		d(i-1);
    		linerel(+u,0);
    		a(i-1);
    		linerel(0, u);
    		a(i - 1);
    		linerel(-u, 0);
    		c(i - 1);
    	}
    }
     
    void b(int i)
    {
    	if (i > 0)
    	{
    		c(i - 1);
    		 linerel(-u, 0);
    		 b(i - 1);
    		 linerel(0, -u);
    		 b(i - 1);
    		 linerel(u, 0);
    		d(i - 1);
    	}
    }
     
    void c(int i)
    {
    	if (i > 0)
    	{
    		b(i - 1);
    		linerel(0, -u);
    		c(i - 1);
    		linerel(-u, 0);
    		c(i - 1);
    		linerel(0, u);
    		a(i - 1);
    	}
    }
    
    void d(int i)
    {
    	if (i > 0)
    	{
    		a(i - 1);
    		linerel(0, u);
    		d(i - 1);
    		linerel(u, 0);
    		d(i - 1);
    		linerel(0, -u);
    		b(i - 1);
    	}
    }
     
     
    // Nearest to power of 2
    unsigned int flp2(unsigned int x){
    	x = x | (x>>1);
    	x = x | (x>>2);
    	x = x | (x>>4);
    	x = x | (x>>8);
    	x = x | (x>>16);
    	return x - (x >> 1);
    }
    
    
    
    int main(int argc,char **arg, char **env){
    
    	if (argc==1) {
    		fprintf(stderr,"\nGilbert Route 1.0 (c) Mayton and SQL.RU. Written in 'C' :)\n");
    		fprintf(stderr,"\nUsage: gilbertroute level=N\n");
    		fprintf(stderr,"\nWhere:\n");
    
    		//fprintf(stderr,"\n       size  = { 32 | 64 | 128 | 256 ... etc powers of two} ");
    		fprintf(stderr,"\n       level = 1,2,3...");
    		fprintf(stderr,"\n");
    		return -1;
    	} else {
    		int level=-1;
    		int size=-1;
    		int argLength = strlen(arg[1]);
    		/*if (0==strncmp(arg[i],"size=",5)){
    			level = atoi(arg[1]);	
    			if (level<0){
    				fprintf(stderr,"\nGilbertroute: Error! Argument cannot be negative.\n");
    				return -3;
    			}
    		} else */
    		if (0==strncmp(arg[1],"level=",6)){
    			level = atoi(arg[1]+6);	
    			if (level<0){
    				fprintf(stderr,"\nGilbertroute: Error! Argument cannot be negative.\n");
    				return -3;
    			}
    			//level = flp2(size);
    			//fprintf(stderr,"\nGilbertroute: Warning! The nearest power of 2 for size=%d is %d\n",size,level);
    		}
    		if (level>=0){
    			moveto(0, 0);
    			a(level);			
    			return 0;
    		} else {
    			fprintf(stderr,"\nGilbertroute: Error! Unrecognized argument.\n");
    			return -2;
    		}
    		
    	}
    
    }
    
    14 мар 15, 21:46    [17384728]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Писать CSV-парсер на "C" - это полная печалька. strtok.... мать его так.

    Думаю что не буду этого делать. Поищу другой инструмент.
    Я не спец в Питонах и Go и Rust. Но думаю что смогу накрапать нечто.
    Всё-тки ближе к сути. Я имею в виду к общепринятому подходу
    к разработке утилит.

    А запускать консольные инструменты в java - неудобно. Либо
    очень долго конфигурить environment либо писать алиасы и баш-скрипты.
    Всё это сужает аудиторию пользователей.

    Цена вопроса - оперативно конвертить IP => int32.

    Вобщем чтоб не было офтопика подниму форк в Программировании
    там прокашлять все вопросы и вернуться обратно с экзешником.
    14 мар 15, 21:52    [17384746]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    miksoft
    Member

    Откуда:
    Сообщений: 38773
    mayton
    квадратные картинки
    А почему именно квадратные?
    Например, если брать в качестве координат части ip-адреса (по 8-16 бит в каждую), то получится прямоугольник с соотношением сторон 0,875.
    14 мар 15, 21:59    [17384756]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    miksoft
    Member

    Откуда:
    Сообщений: 38773
    mayton
    Писать CSV-парсер на "C" - это полная печалька. strtok.... мать его так.
    (f)scanf не справляется?
    mayton
    Цена вопроса - оперативно конвертить IP => int32.
    В WinApi есть такой вызов.
    14 мар 15, 22:03    [17384762]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    miksoft
    mayton
    квадратные картинки
    А почему именно квадратные?
    Например, если брать в качестве координат части ip-адреса (по 8-16 бит в каждую), то получится прямоугольник с соотношением сторон 0,875.

    Ну... там ниже по тексту я решил что квадратные это удобно для кодинга. Но не юзабельно
    для пользователя.

    Преимущества квадратов есть только для заполняющих областей Гилберта.
    Но об этом - чуть позже.
    14 мар 15, 22:10    [17384782]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    miksoft
    mayton
    Писать CSV-парсер на "C" - это полная печалька. strtok.... мать его так.
    (f)scanf не справляется?
    mayton
    Цена вопроса - оперативно конвертить IP => int32.
    В WinApi есть такой вызов.

    На WinAPI стараюсь не завязываться. Далее... некоторые штуки с PIPE-s не могут быть изящно реализованы
    в Windows.
    14 мар 15, 22:12    [17384790]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    Цена вопроса - оперативно конвертить IP => int32

    IP у тебя уже в БД, если не путаю, добавь поле intIP, конвертни один раз (без разницы чем и как) и используй его.
    15 мар 15, 09:32    [17385326]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    БД вобщем-то была нужна чтобы обеспечить сортированный порядок beginIp-endIp.
    Иначе основной алгоритм не сработает.

    Хотя.. это мысль. Нужно 1 раз отсортировать и просто работать с csv файлом.
    А функцию ip2num(..) я просто портирую в "C".
    15 мар 15, 11:04    [17385409]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Кстати из БД ничего неизвестно о перекрытии диапазонов. Возможно такие есть.

    Это надо проверить.
    15 мар 15, 11:06    [17385411]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    автор
    (f)scanf не справляется?

    Думаю... справится. Изначально я предполагал что fscanf будет узким местом.
    Но из того что на 1 запись сsv приходится более чем сотня операций рисования
    цветного пиксела - то он не может быть узким местом.
    15 мар 15, 11:08    [17385415]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    А функцию ip2num(..) я просто портирую в "C".

    Все придумано до нас.
    #include <winsock2.h>
    #pragma comment(lib, "Ws2_32.lib")
    #include <stdio.h>
    
    void  main(){
    	unsigned int ip = htonl(inet_addr("123.45.67.89"));
    	printf("%X\n", ip);
    }
    

    В линуксе также, только хэдеры другие надо.
    15 мар 15, 12:16    [17385511]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Dima T, спс.
    15 мар 15, 12:57    [17385625]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Осилил Z-кривую.

    Z-Рекурсия взлетела с 1 раза. В отличие от Гилберта который был частично украден.

    Единственный нюанс - автоматическое округление до степени двойки. Позаимствовано
    у старика Уоррена из книжки.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>         
    #include <io.h>
    
    #ifdef _WIN32
    #include "windows.h"
    #endif
    
    /* 15.03.2015 (Mayton) - In beginning... */
    
    // Nearest to power of 2 less than
    unsigned int flp2(unsigned int x){
    	x = x | (x>>1);
    	x = x | (x>>2);
    	x = x | (x>>4);
    	x = x | (x>>8);
    	x = x | (x>>16);
    	return x - (x >> 1);
    }
    
    // Nearest to power of 2 greather than
    unsigned int clp2(unsigned int x){
    	x = x - 1;
    	x = x | (x>>1);
    	x = x | (x>>2);
    	x = x | (x>>4);
    	x = x | (x>>8);
    	x = x | (x>>16);
    	return x + 1;
    }
    
    
    void routeSquare(int x,int y,int size){
    	if (size>=2){
    		size/=2;
    		routeSquare(x,y,size);
    		routeSquare(x+size,y,size);
    		routeSquare(x,y+size,size);
    		routeSquare(x+size,y+size,size);
    	} else {
    		printf("%d,%d\n",x,y);
    	}
    }
    
    int main(int argc,char **arg, char **env){
    
    	if (argc==1) {
    		fprintf(stderr,"\nZ-Route 1.0 (c) Mayton and SQL.RU. Written in 'C' :)\n");
    		fprintf(stderr,"\nUsage: z-route size=N\n");
    		fprintf(stderr,"\nWhere:\n");
    		fprintf(stderr,"\n       size = 1,2,4,8 ... (size is automatically upper to power of 2)");
    		fprintf(stderr,"\n");
    		return -1;
    	} else {
    		int level=-1;
    		int size=-1;
    		int argLength = strlen(arg[1]);
    		if (0==strncmp(arg[1],"size=",5)){
    			size = atoi(arg[1]+5);	
    			if (size<=0){
    				fprintf(stderr,"\nZ-Route: Error! Argument cannot be zero or negative.\n");
    				return -3;
    			}
    		}
    		if (size>0){
    			routeSquare(0,0,clp2(size));
    			return 0;
    		} else {
    			fprintf(stderr,"\nZ-Route: Error! Unrecognized argument.\n");
    			return -2;
    		}
    		
    	}
    
    }
    
    15 мар 15, 12:59    [17385635]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Приступил собсно к парсеру СSV.

    Хм... небольшая заминка. Как-бы эти запятые поскипать. Кто знаток fscanf ?

    ipv4filter.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>
    #include <stdint.h>
    #include <io.h>
    
    //#include <arpa/inet.h>
    // fatal error: arpa/inet.h: No such file or directory
    
    //#include <byteswap.h>
    // fatal error: byteswap.h: No such file or directory
    
    
    #ifdef _WIN32
    #include "windows.h"
    #endif
    
    
    
    /*
    startIpNum,endIpNum,   country,region,city,postalCode,latitude,longitude,dmaCode,areaCode
    1.0.0.0,   1.7.255.255,"AU",   "",    "",  "",        -27.0000,133.0000,        ,
    1.9.0.0,   1.9.255.255,"MY",   "",    "",  "",        2.5000,  112.5000,        ,
    */
    
    /*   
    unsigned int ip2num(const char *IP)
    {
    	return htonl(inet_addr(IP));
    }
    
    d:\tmp\ccGIwmlS.o:ipv4filter.c:(.text+0xd): undefined reference to `inet_addr@4'
    d:\tmp\ccGIwmlS.o:ipv4filter.c:(.text+0x18): undefined reference to `htonl@4'
    c:/mingw-4.10.0/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: d:\tmp\ccGIwmlS.o: bad reloc address 0x20 in section `.eh_frame'
    c:/mingw-4.10.0/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
    collect2.exe: error: ld returned 1 exit status
    */                                          
    
    
    int main(int argc,char **arg, char **env){
    
    	int cnt = 0;
    	int i;
    	char   startIpNum[256];
    	char   endIpNum[256];
    	char   country[256];
    	char   region[256];
    	char   city[256];
    	char   postalCode[256];
    	char   latitude[20];
    	char   longitude[20];
    	char   dmaCode[256];
    	char   areaCode[256];
    
    	char   comma[256];
    	
    	while(TRUE){
    		startIpNum[0] = '\0';
    		endIpNum[0]   = '\0';
    		country[0]    = '\0';
    		region[0]     = '\0';
    		int res = fscanf(
    			stdin,
    			// http://stackoverflow.com/questions/18737117/reading-values-from-csv-file-into-variables
    			// 
    			"%s,%[^,]%s,%[^,]%s,%[^,]%s",
    			&startIpNum,
    			&comma,
    			&endIpNum,
    			&comma,
    			&country,
    			&comma,
    			&region
    			/*
    			&city,
    			&postalCode,
    			&latitude,
    			&longitude,
    			&dmaCode,
    			&areaCode*/
    		);
    		printf("----- row %d -------\n",cnt);
    		printf("res = %d\n",res);
    		printf("startip = '%s'\n",startIpNum);
    		printf("endip   = '%s'\n",endIpNum);
    		printf("country = '%s'\n",country);
    		printf("region  = '%s'\n",region);
    		cnt++;
    		if (res==0) break;
    	}
    	printf("\a");             
    }
    


    Output:
    ----- row 0 -------
    res = 1
    startip = 'startIpNum,endIpNum,country,region,city,postalCode,latitude,longitude,dmaCode,areaCode'
    endip   = ''
    country = ''
    region  = ''
    ----- row 1 -------
    res = 1
    startip = '1.0.0.0,1.7.255.255,"AU","","","",-27.0000,133.0000,,'
    endip   = ''
    country = ''
    region  = ''
    ----- row 2 -------
    res = 1
    startip = '1.9.0.0,1.9.255.255,"MY","","","",2.5000,112.5000,,'
    endip   = ''
    country = ''
    region  = ''
    ----- row 3 -------
    res = 1
    startip = '1.10.10.0,1.10.10.255,"AU","","","",-27.0000,133.0000,,'
    endip   = ''
    country = ''
    region  = ''
    


    $ сс --version
    cc.exe (GCC) 4.8.1
    Copyright (C) 2013 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    


    Илья. Сова. Dima. Помогайте.
    15 мар 15, 19:50    [17386644]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Приаттачу первые 10 тыс строк базы. Чтоб было на чём тренироваться.

    К сообщению приложен файл (GeoIPCity.0-10000.7z - 104Kb) cкачать
    15 мар 15, 20:12    [17386705]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    scanf`ы готовить не умею.

    + Обычно так делаю
    #include <stdio.h>
    #include <string.h>
    
    // Разбор строки CSV (строка, разделитель, массив указателей, его размер) Кавычки в кавычках не понимает
    bool parse_csv_str(char* str, char delim, char **val, int val_size)
    {
    	for(; val_size > 0; val_size--) {
    		bool quote = (*str == '"');
    		if(quote) str++;
    		*val++ = str;
    		if(quote) {
    			str = strchr(str, '"');
    			if(!str) break;
    			*str++ = 0;
    		}
    		str = strchr(str, delim);
    		if(str) *str++ = 0;
    		if(!str) break;
    	}
    	return val_size == 1 && !str; // заполнили все и строка кончилась
    }
    
    #define COLUMN_COUNT 10
    
    void  main(){
    	FILE *f = fopen("GeoIPCity.0-10000.csv", "r");
    	if(f) {
    		char buf[1024];
    		int line = 0;
    		while(fgets(buf, 1024, f)) {
    			line++;
    			// убираем в конце перевод строки
    			char* end = buf + strlen(buf) - 1;
    			while(end >= buf && (*end == 0xA || *end == 0xD)) *end-- = 0;
    			char* val[COLUMN_COUNT];
    			if(!parse_csv_str(buf, ',', val, COLUMN_COUNT)) {
    				printf("error at line %d\n", line);
    				break;
    			} else {
    				printf("startIpNum = '%s'\n", val[0]);
    				printf("endIpNum = '%s'\n", val[1]);
    				printf("country = '%s'\n", val[2]);
    				printf("region = '%s'\n", val[3]);
    				printf("city = '%s'\n", val[4]);
    				printf("postalCode = '%s'\n", val[5]);
    				printf("latitude = '%s'\n", val[6]);
    				printf("longitude = '%s'\n", val[7]);
    				printf("dmaCode = '%s'\n", val[8]);
    				printf("areaCode = '%s'\n", val[9]);
    				printf("---------------------\n");
    			}
    		}
    		fclose(f);
    	}
    }
    
    16 мар 15, 08:41    [17387547]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    SashaMercury
    Member

    Откуда: Москва
    Сообщений: 2653
    Марк, что нужно с запятыми и scanf, приведите пример пожалуйста для особо одарённых :D
    16 мар 15, 09:14    [17387634]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    SashaMercury
    Member

    Откуда: Москва
    Сообщений: 2653
    mayton
    Значит вот что я придумал.

    Итак 239 стран. Надо раздать им цвета.

    Палитру белых-серых-черных я резервирую для системных нужд.

    Поэтому цвета близкие к FFFFFF, C0C0C0, 000000 будут игнорироваться при маппинге.

    Top 6 стран должны получить наиболее яркие цвета.

    Code  Allocation Color
    ----- ---------- ------
    US    1507673738 'red'
    CN     267741269 'green'
    JP     186372005 'blue'
    GB     115678470 'magenta'
    DE     111001300 'yellow'
    KR      99794924 'cyan'
    


    Поэтому вышеуказанные цвета будут удалены из оставшихся. Будут также удалены все "близкие" к ним цвета.
    По формуле цветового расстояния RGB. С учётом весов.

    Итак 239 - 6 = 233

    Далее у нас есть две палитры. Pantone, HtmlColors. Грубо говоря 121 + 120 (Я удалил градации серых и белых).

    Это 241 Цвет. Нужно еще что-то выкинуть.

    Полагаю в двух палитрах будут цвета дубликаты. Или "близкие" цвета.

    Буду удалять их до тех пор пока не останется 233.


    А как будет происходить работа с остальными странами ? Вдруг у двух близлежащих стран будут схожие цвета
    16 мар 15, 09:17    [17387653]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    SashaMercury
    что нужно с запятыми и scanf

    Разобрать строку с разделителем запятая на отдельные строки
    Например
    1.0.0.0,1.7.255.255,"AU","","","",-27.0000,133.0000,,
    

    Файлик со строками выше.
    16 мар 15, 09:23    [17387674]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Да вот мне miksoft посоветовал fscanf. И я "ринулся".... И как-то оно так вышло.
    16 мар 15, 09:40    [17387763]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    SashaMercury
    А как будет происходить работа с остальными странами ? Вдруг у двух близлежащих стран будут схожие цвета

    В данной таблице я просто привёл распределение адресов по странам. В реальности (смотри сsv файл)
    страны идут в случайном порядке.

    Как быть с очень близкими цветами - я не знаю. Есть варианты.

    1) Раскрашивать страну в один из четырёх цветов полагаясь на теорему о четырех
    красках.

    https://ru.wikipedia.org/wiki/Проблема_четырёх_красок

    Это в случае использования кривой Гилберта которая должна дать для каждого диапазона
    цельную геометрическую фигуру (квадрат, прямоугольних или множество соприкасающихся
    квадратов разного размера).

    Для Z-кривой к сожалению непрерывность областей не обеспечивается.

    2) Красить по первому варианту. Самые популярные страны - в системные цвета. А оставшиеся
    в mapped-порядке брать из таблицы Panton, HTMLColors e.t.c.

    3) Красить в произвольный цвет но на границе областей проводить жирную чёрную линию в 1pix
    толщиной. Последняя задача - аналог фильтра photoshop по выделению границ. И ее можно
    решать отдельно от общей задачи.
    16 мар 15, 09:50    [17387826]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    SashaMercury
    Member

    Откуда: Москва
    Сообщений: 2653
    mayton
    Да вот мне miksoft посоветовал fscanf. И я "ринулся".... И как-то оно так вышло.


    Тут не должно быть проблем, меня скоро выгонят из этого компьютера, но я попробую успеть
    16 мар 15, 10:09    [17387917]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Давай дерзай. Я свой лимит времени на fscanf потратил. Займусь пока чем-то другим
    полезным. К сканфу вернусь чуть позже.
    16 мар 15, 10:12    [17387933]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    SashaMercury
    Member

    Откуда: Москва
    Сообщений: 2653
    Пока так, где-то ошибся, вечером ещё посмотрю

    +
    FILE* in = fopen("Mayton.txt", "r");
    	char startIP[20] = "\0", endIP[20] = "\0";
    	char country[30] = "\0", region[30] = "\0", city[30] = "\0", postalCode[30] = "\0";
    	char latitude[10] = "\0", longitude[10] = "\0";
    	char dmaCode[10] = "\0", areaCode[10] = "\0";
    	char t;
    	for (int i = 0; i < 10; ++i)
    	{
    		fscanf(in, "%[^,],%[^,],%c%[A-Z]%c,%c%[A-Z]%c,%c%[A-Z]%c,%c%[A-Z]%c,%[^,],%[^,],%[^,],%[^\n]", 
    			       startIP,  
    				   endIP, 
    				   &t, country, &t,//в t читаю двойные кавычки
    				   &t, region, &t, 
    				   &t, city, &t,
    				   &t, postalCode, &t, 
    				   latitude, 
    				   longitude, 
    				   dmaCode, 
    				   areaCode);
    		printf("%s %s %s %s %s %s %s %s %s %s\n",
    			startIP,
    			endIP,
    			country,
    			region, 
    			city,
    			postalCode, 
    			latitude,
    			longitude,
    			dmaCode,
    			areaCode);
    		//сделать указатели всех строк на "\0" !
    	}
    
    16 мар 15, 10:31    [17388013]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    ОК. Попробую вечером.

    Если чесно то вариант Димы мне больше нравится. Если взлетит - то возьму его.
    16 мар 15, 11:56    [17388584]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    Если взлетит - то возьму его.

    Не взлетит - пиши на чем споткнется, поправлю. Пока там проигнорирован один момент стандартного CSV: если значение содержало кавычки, то они превращаются в две двойные кавычки, т.е. ООО "АБВ" запишется как "ООО ""АБВ""". У тебя вроде не должно такого быть. С ходу не придумал как по простому это обработать, вечером время будет, еще подумаю как это полечить.
    16 мар 15, 12:14    [17388736]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Конечный автомат-парсер спасёт отца русской демократии меня, но вот какова будет цена
    вопроса на pure "C" . Выше я задумался о Golang/Python/Rust/D для решения данной узкой задачи. Но
    коллеги-сишники меня закидают помидорами.
    16 мар 15, 12:18    [17388765]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    miksoft
    Member

    Откуда:
    Сообщений: 38773
    mayton,

    только сейчас подумалось - зачем парсить вручную, если Оракл сам умеет СSV грузить как минимум двумя способами - через external tables и через SQL*Loader ?
    16 мар 15, 12:42    [17388985]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Я делаю софт без привязки к Oracle. БД я использовал просто чтобы посмотреть
    кое-какие срезы по странам и мини-максные характеристики.

    Кстати вопрос перекрытия диапазонов остался открытым. Я знаю как его решать
    алгоритмически но не знаю как он решается в SQL.

    Подниму-ка топик.
    16 мар 15, 12:49    [17389027]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Хотя.... зачем. Щас попробую.
    16 мар 15, 13:01    [17389101]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    miksoft
    Member

    Откуда:
    Сообщений: 38773
    mayton
    не знаю как он решается в SQL.
    если адреса перевести в числа, то элементарно.
    16 мар 15, 13:22    [17389230]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    Конечный автомат-парсер

    Чего это я сразу про него не вспомнил, с ним проще.

    + Держи версию 2.0
    #include <stdio.h>
    
    int parse_csv_str(char* str, char **val, int val_size)
    {
    	int val_count = 0;
    	bool quote_open = false;
    	bool first = true;
    	bool end_quote = false;
    	bool center_quote = false;
    	bool stop = false;
    	while(!stop) {
    		if(first) {
    			first = false;
    			if(val_count < val_size) *val = str;
    			val_count++;
    		}
    		switch(*str) {
    			case '"':
    				quote_open = !quote_open;
    				if(*val == str) {
    					(*val)++; // пропуск кавычки в начале
    					end_quote = true;
    				} else {
    					center_quote = true;
    				}
    				break;
    
    			case ',':
    				if(!quote_open) {
    					*str = 0;
    					first = true;
    					if(end_quote) { // пропуск завершающей кавычки
    						end_quote = false;
    						*(str - 1) = 0;
    					}
    					if(center_quote) { // удаление двойных кавычек в центре
    						center_quote = false;
    						char* d = *val;
    						char* s = *val;
    						while(*d = *s) {
    							if(*s != '"' || *(s + 1) != '"') d++;
    							s++;
    						}
    					}
    					if(val_count < val_size) val++;
    				}
    				break;
    
    			case 0:
    				stop = true;
    				break;
    
    			case 0xD:
    			case 0xA:
    				*str = 0;
    				stop = true;
    				break;
    
    		}
    		str++;
    	}
    	// заполнение пустыми строками недостающих
    	for(int i = val_count; i < val_size; i++) *(++val) = str;
    	// возврат количества параметров
    	return val_count;
    }
    
    void  main(){
    	FILE *f = fopen("GeoIPCity.0-10000.csv", "r");
    	if(f) {
    		char buf[1024];
    		int line = 0;
    		while(fgets(buf, 1024, f)) {
    			line++;
    			if(line == 1) {
    				int cnt = parse_csv_str(buf, NULL, 0);
    				printf("%d parameters at line\n---------------------\n", cnt);
    				continue;
    			}
    			char* val[10];
    			int cnt = parse_csv_str(buf, val, 10);
    			printf("startIpNum = '%s'\n", val[0]);
    			printf("endIpNum = '%s'\n", val[1]);
    			printf("country = '%s'\n", val[2]);
    			printf("region = '%s'\n", val[3]);
    			printf("city = '%s'\n", val[4]);
    			printf("postalCode = '%s'\n", val[5]);
    			printf("latitude = '%s'\n", val[6]);
    			printf("longitude = '%s'\n", val[7]);
    			printf("dmaCode = '%s'\n", val[8]);
    			printf("areaCode = '%s'\n", val[9]);
    			printf("---------------------\n");
    			if(cnt != 10) {
    				printf("error: %d parameters at line %d\n", cnt, line);
    				break;
    			}
    		}
    		fclose(f);
    	}
    }
    

    Первая корявая получилась. Хотел допилить кавычки и в свою библиотеку прибрать, пригодится, потом подумал обычно надо еще знать сколько всего колонок прежде чем парсить. Получилось проще новую написать :)

    Твой файлик проходит без ошибок.
    16 мар 15, 13:44    [17389367]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Я понял. Мой моск лихорадочно ищет оптимизаций. Задача решается в биткарте или
    в любой структуре которая учитывает флаги.

    Решая эту задачу реляционно я вынужден делать соединение таблицы самой с собой.

    select 
        count(*) 
    from 
        geoipcity g1,geoipcity g2
    where
      ..... // здесь будет несколько предикатов которые проверяют различные варианты 
      // перекрытия отрезков N_STARTIP1...N_ENDID1, N_STARTIP2...N_ENDID2
    


    Грубо... для оптимизатора без использования индекса это будет

    5748952 * 5748952 = 33 050 449 098 304 или 33 триллиона сравнений.

    Вот так вот.

    P.S. 33 коровы.... Ну что. В топике есть SQL-щики оптимизаторы?
    16 мар 15, 13:46    [17389397]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Или.... если-бы таблица была сегментирована к примеру по N_STARTIP то тогда
    возможно Oracle optimizer сделал-бы не квадрат количества rows а "треугольник"
    или "квадратичную" оценку с весовым коэффициентиком меньше единицы.
    16 мар 15, 13:51    [17389447]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    miksoft
    Member

    Откуда:
    Сообщений: 38773
    mayton
    В топике есть SQL-щики оптимизаторы?
    Показывайте DDL таблицы
    16 мар 15, 13:56    [17389482]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    17382368

    Всё в силе. Только "virtual" уберите.
    16 мар 15, 13:57    [17389493]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    miksoft
    mayton
    В топике есть SQL-щики оптимизаторы?
    Показывайте DDL таблицы

    лучше с тестовыми данными, типа такого
    create table XXX (...)
    insert into xxx values (...)
    insert into xxx values (...)
    ...
    

    тут похожая тема была, только с перекрытием квадратов https://www.sql.ru/forum/1120376-1/karty
    16 мар 15, 13:59    [17389505]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Я помню эту тему.
    16 мар 15, 14:02    [17389541]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    Делаешь таблицу points(nIP) и туда пишешь каждый IP из каждого диапазона. Будет около 4 млрд. записей.

    Затем
    select nIP, count(*) as nCnt from points group by nIP having nCnt > 1
    

    :)
    16 мар 15, 14:19    [17389674]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Это та-же биткарта. Но я принципиально не хочу решать задачу в SQL так-же как я и решал бы ее на сях.
    16 мар 15, 14:21    [17389699]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Получил несолько ложных срабатываний. Разобрался. Забыл что отрезки сами с собой пересекаются.
    Убрал само-соединение. Пока пишу... в процессе.
    select 
        count(*) 
    from 
        geoipcity g1,geoipcity g2
    where
      ..... // здесь будет несколько предикатов которые проверяют различные варианты 
      // перекрытия отрезков N_STARTIP1...N_ENDID1, N_STARTIP2...N_ENDID2
      and g1.ROWID!=g2.ROWID;
    
    16 мар 15, 14:35    [17389789]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    Задача не заточена под SQL, подобные проблемы обычно биткартой решают. Например в задачах с диапазонами дат используют вспомогательную таблицу-календарь со всеми датами.

    Пробуй:
    create table #t(id int, n_startip  int, n_endip int)
    -- изучаемый
    insert into #t values (1, 10, 20) 
    -- без перекрытия
    insert into #t values (2, 30, 40)
    -- перекрытие слева
    insert into #t values (3, 5, 15)
    -- перекрытие справа
    insert into #t values (4, 15, 25)
    -- перекрытие сверху
    insert into #t values (5, 5, 25)
    -- перекрытие снизу
    insert into #t values (6, 12, 18)
    
    select A.id, B.id 
    	from #t A, #t B
    	where A.id != B.id and ((A.n_startip <= B.n_startip and A.n_endip >= B.n_startip and A.n_endip <= B.n_endip) or (A.n_startip <= B.n_startip and A.n_endip >= B.n_endip))
    	order by A.id, B.id
    
    
    drop table #t
    


    Возможно 4 вида перекрытия отрезков: справа, слева, сверху и снизу. При сравнении всем со всеми можно упростить до проверки только слева и сверху, т.к.:
    A слева перекрывает B == B справа перекрывает A
    A сверху перекрывает B == B снизу перекрывает A

    заодно дубли уберутся.

    Будут ли использоваться индексы и какие не знаю. Сделай два: (n_startip, n_endip) и (n_endip, n_startip), СУБД сама разберется нужны они или не очень.
    16 мар 15, 14:44    [17389864]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    Чуть упростил:
    select A.id, B.id 
    	from #t A, #t B
    	where A.id != B.id and A.n_startip <= B.n_startip and (A.n_endip >= B.n_startip and A.n_endip <= B.n_endip or A.n_endip >= B.n_endip)
    	order by A.id, B.id
    
    16 мар 15, 15:00    [17389964]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Я надеялся двумя предикатами обойтись. Тоже сидел грыз гранит предикатов max/min и сравнений.

    Пока плюнул. Работа подвалила. Вечером вернусь к географии.
    16 мар 15, 15:08    [17390007]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    SashaMercury
    Member

    Откуда: Москва
    Сообщений: 2653
    Этот код по-моему должен работать, но работает некорректно

    		fscanf(in, "%[^,]  , %[^,], \"%[^\"]\", \"%[^\"]\", [^\"]\", \"%[^\"]\", %[^,]   , %[^,]    , %[^,]  ,  %[^\n]", 
    			       startIP , endIP,   country ,   region  ,    city  , postalCode, latitude, longitude, dmaCode, areaCode);
    


    Может быть я неправильно его использую в своём контексте, попробуйте у себя
    17 мар 15, 02:27    [17392369]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Dima T
    Первая корявая получилась. Хотел допилить кавычки и в свою библиотеку прибрать, пригодится, потом подумал обычно надо еще знать сколько всего колонок прежде чем парсить. Получилось проще новую написать :)

    Твой файлик проходит без ошибок.

    Спс. Закоммитил. С небольшими изменениями. Будет как базовый алгоритм.
    https://sourceforge.net/p/countryipdiagram/code/HEAD/tree/trunk/src/ipv4filter.c
    17 мар 15, 10:34    [17393302]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Dima T
    Чуть упростил:
    select A.id, B.id 
    	from #t A, #t B
    	where A.id != B.id and A.n_startip <= B.n_startip and (A.n_endip >= B.n_startip and A.n_endip <= B.n_endip or A.n_endip >= B.n_endip)
    	order by A.id, B.id
    

    Попробуй нагенерить 5 млн случайных строк. Потому как я на Оракле не могу дождаться завершения
    работы этого курсора.

    Здесь не проблема его написать. А проблема написать оптимально.
    17 мар 15, 13:04    [17394261]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    SashaMercury
    Этот код по-моему должен работать, но работает некорректно

    		fscanf(in, "%[^,]  , %[^,], \"%[^\"]\", \"%[^\"]\", [^\"]\", \"%[^\"]\", %[^,]   , %[^,]    , %[^,]  ,  %[^\n]", 
    			       startIP , endIP,   country ,   region  ,    city  , postalCode, latitude, longitude, dmaCode, areaCode);
    


    Может быть я неправильно его использую в своём контексте, попробуйте у себя

    Посмотрю чуть позже.
    17 мар 15, 13:27    [17394419]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    Попробуй нагенерить 5 млн случайных строк.

    ИМХУ нездоровый тест. Индексы не только сортировка, но и распределение. А также результат: если у тебя пересечений не ожидается, то будет мало, а в рандоме может 100 тыс. пересечься друг с другом и будет 100`000 * 100`000 / 2 = 5`000`000`000 записей ответа.

    mayton
    Потому как я на Оракле не могу дождаться завершения работы этого курсора.

    Ты индексы создал?

    Я выше писал: Сделай два: (n_startip, n_endip) и (n_endip, n_startip), СУБД сама разберется нужны они или не очень. Затем план выполнения запроса смотри, там будет сразу видно использует индексы или нет. Как в оракле смотреть не знаю.

    Кстати есть еще одна особенность диапазонов IP: они всегда отвечают условию: начало (т.е. n_startip) сформировано в двоичном виде как число с 8/16/24 ноликами в конце ( ...1000000000), максимальное (n_endip) в конце 8/16/24 единиц. Надо проверить что у как-то эту особенность использовать. Пока не соображу как.
    17 мар 15, 13:56    [17394583]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Dima T
    Ты индексы создал?

    Чел я же не просто так скрипты привёл. 17382368 Они реальны и работают. По поводу плана исполнения - отпишу чуть позже.
    Я не привык писать с бухты-барахты и обычно проверяю.

    Кстати есть еще одна особенность диапазонов IP: они всегда отвечают условию: начало (т.е. n_startip) сформировано в двоичном виде как число с 8/16/24 ноликами в конце ( ...1000000000), максимальное (n_endip) в конце 8/16/24 единиц. Надо проверить что у как-то эту особенность использовать. Пока не соображу как.

    Ты не поверишь но я над этим думаю. Скорее всего эта БД весьма специфична по сути.
    Например движок MaxMind и Java-имплементация базы (втроенная) занимала размер
    многократ меньше чем CSV-файл.

    Для таких данных обычно юзают префиксное дерево или дерево остатков. Вполне возможно
    что оно там и заюзано.
    17 мар 15, 14:48    [17394894]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    Dima T
    Кстати есть еще одна особенность диапазонов IP: они всегда отвечают условию: начало (т.е. n_startip) сформировано в двоичном виде как число с 8/16/24 ноликами в конце ( ...1000000000), максимальное (n_endip) в конце 8/16/24 единиц. Надо проверить что у как-то эту особенность использовать. Пока не соображу как.

    Придумал: хранить в двоичном текстовом виде выравненном до 32 c обрезанными конечными ноликами. Формула обрезки: (n_endip - n_startip), проверяем на вид 0000011111 (т.е. сначала нули, затем единицы) или тоже самое на соответствие (2^n - 1), n - сколько младших бит обрезать от n_startip.

    Пример на 4 битах
    НачалоКонецХраним
    070
    4701
    45010
    81110
    121511

    дальше сортируем по храним как строки и сравниваем предыдущую с последующей в количестве символов первой - совпало - вторая входит в первую, т.е. "0" == "01" (выкидываем "01"), затем "0" == "010" (выкидываем "010"), затем "0" != "10", затем "10" != "11"

    Одна сортировка, один проход, без биткарты, но опять не заточено под SQL
    17 мар 15, 15:03    [17395000]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    Сделай проверку на валидность:
    select ... where (n_endip - n_startip) not in (1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535)
    

    Дальше подзабыл, если больше 65535 будет то это ряд (2^n - 1)
    17 мар 15, 15:12    [17395047]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    Dima T
    Сделай проверку на валидность:

    можешь не делать, 10% твоего файла не проходит

    mayton
    Dima T
    Ты индексы создал?

    Чел я же не просто так скрипты привёл. 17382368 Они реальны и работают. По поводу плана исполнения - отпишу чуть позже.
    Я не привык писать с бухты-барахты и обычно проверяю.

    Залил твой файлик в MSSQL. Мой запрос без индексов 10 сек, с индексами 16 сек
    17 мар 15, 16:20    [17395495]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    Придумал!

    Выстроить цепочку:
    n_prev_startip = 0
    n_prev_endip = 0
    1. Взять запись с минимальным n_startip больше n_prev_startip
    2. Если n_startip < n_prev_endip значит наложение
    3. n_prev_endip = n_endip, n_prev_startip = n_startip
    4. если не все пройдены перейти к пункту 1.

    Имеем 5 млн. поисков макс. по 24 шага каждый, т.е. ~100 млн операций.
    + код на фоксе
    clear
    set talk off
    set Near On
    if !used('tip')
    	do create_data
    	index on n_startip tag n_startip
    endif
    
    n_prev_startip = -1
    n_prev_endip = -1
    lnSec = seconds()
    do while .T.
    	seek n_prev_startip
    	if eof('tip')
    		exit
    	endif
    	if tip.n_startip < n_prev_endip
    		? 'error at line %d', tip.id
    	endif
    	n_prev_startip = tip.n_startip + 1
    	n_prev_endip = tip.n_endip + 1
    enddo
    ? 'time: ', seconds() - lnSec 
    return
    
    func create_data
    create cursor tip (id i, n_startip n(10), n_endip n(10))
    insert into tip values (2, 16777216, 17301503)
    insert into tip values (3, 17367040, 17432575)
    insert into tip values (4, 17435136, 17435391)
    ...
    

    Твои 10 тыс проверились за 20 мс :)
    17 мар 15, 17:16    [17395797]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Dima T, минутку. Я всё-тки проверю свои 5 млн.

    Подожди.

    P.S. А я всегда хвалил Фокс-Про. И даже поднимал где-то тему по поводу rushmap или как оно там зовётся.
    Интересовало портирование этого алгоритма в другие DBMS.
    17 мар 15, 19:15    [17396342]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Капец. План вообще никчорту!

    SQL> explain plan for select count(*)
      2  from geoipcity where (n_endip - n_startip) not in (
      3  1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535,
      4  power(2,17)-1,
      5  power(2,18)-1,
      6  power(2,17)-1,
      7  power(2,19)-1,
      8  power(2,20)-1,
      9  power(2,21)-1,
     10  power(2,22)-1,
     11  power(2,23)-1,
     12  power(2,24)-1,
     13  power(2,25)-1,
     14  power(2,26)-1,
     15  power(2,27)-1,
     16  power(2,28)-1,
     17  power(2,29)-1,
     18  power(2,30)-1,
     19  power(2,31)-1,
     20  power(2,32)-1,
     21  power(2,17)-1,
     22  power(2,18)-1,
     23  power(2,17)-1,
     24  power(2,19)-1,
     25  power(2,20)-1,
     26  power(2,21)-1,
     27  power(2,22)-1,
     28  power(2,23)-1,
     29  power(2,24)-1);
    
    Explained.
    
    SQL> @?/rdbms/admin/utlxpls;
    
    PLAN_TABLE_OUTPUT
    -----------------------------------------------------------------------------------------
    
    Plan hash value: 2075995129
    
    ----------------------------------------------------------------------------------
    | Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      |          |     1 |    14 | 13738   (8)| 00:02:45 |
    |   1 |  SORT AGGREGATE       |          |     1 |    14 |            |          |
    |*  2 |   INDEX FAST FULL SCAN| PK_GEOIP |     1 |    14 | 13738   (8)| 00:02:45 |
    ----------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("N_ENDIP"-"N_STARTIP"<>1 AND "N_ENDIP"-"N_STARTIP"<>3 AND
                  "N_ENDIP"-"N_STARTIP"<>7 AND "N_ENDIP"-"N_STARTIP"<>15 AND
                  "N_ENDIP"-"N_STARTIP"<>31 AND "N_ENDIP"-"N_STARTIP"<>63 AND
                  "N_ENDIP"-"N_STARTIP"<>127 AND "N_ENDIP"-"N_STARTIP"<>255 AND
                  "N_ENDIP"-"N_STARTIP"<>511 AND "N_ENDIP"-"N_STARTIP"<>1023 AND
                  "N_ENDIP"-"N_STARTIP"<>2047 AND "N_ENDIP"-"N_STARTIP"<>4095 AND
                  "N_ENDIP"-"N_STARTIP"<>8191 AND "N_ENDIP"-"N_STARTIP"<>16383 AND
                  "N_ENDIP"-"N_STARTIP"<>32767 AND "N_ENDIP"-"N_STARTIP"<>65535 AND
                  "N_ENDIP"-"N_STARTIP"<>131071 AND "N_ENDIP"-"N_STARTIP"<>262143 AND
                  "N_ENDIP"-"N_STARTIP"<>524287 AND "N_ENDIP"-"N_STARTIP"<>1048575 AND
                  "N_ENDIP"-"N_STARTIP"<>2097151 AND "N_ENDIP"-"N_STARTIP"<>4194303 AND
                  "N_ENDIP"-"N_STARTIP"<>8388607 AND "N_ENDIP"-"N_STARTIP"<>16777215 AND
                  "N_ENDIP"-"N_STARTIP"<>33554431 AND "N_ENDIP"-"N_STARTIP"<>67108863 AND
                  "N_ENDIP"-"N_STARTIP"<>134217727 AND "N_ENDIP"-"N_STARTIP"<>268435455 AND
                  "N_ENDIP"-"N_STARTIP"<>536870911 AND "N_ENDIP"-"N_STARTIP"<>1073741823
                  AND "N_ENDIP"-"N_STARTIP"<>2147483647 AND
                  "N_ENDIP"-"N_STARTIP"<>4294967295)
    

    Какого осьминога ему тут нужен PRIMARY key???
    17 мар 15, 19:34    [17396420]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    alter index ... invisible помог. Хорошая шняга в одинадцатом жигуле Оракле... Мдя.
    17 мар 15, 19:40    [17396437]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    --------------------------------------------------------------------------------
    | Id  | Operation          | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |           |     1 |    14 | 16854   (7)| 00:03:23 |
    |   1 |  SORT AGGREGATE    |           |     1 |    14 |            |          |
    |*  2 |   TABLE ACCESS FULL| GEOIPCITY |     1 |    14 | 16854   (7)| 00:03:23 |
    --------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("N_ENDIP"-"N_STARTIP"<>1 AND "N_ENDIP"-"N_STARTIP"<>3 AND............
    
    17 мар 15, 19:42    [17396444]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Два мильйона. Это примерно половина всей базы .
      COUNT(*)
    ----------
       2069549
    
    17 мар 15, 19:58    [17396498]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    P.S. А я всегда хвалил Фокс-Про. И даже поднимал где-то тему по поводу rushmap или как оно там зовётся.
    Интересовало портирование этого алгоритма в другие DBMS.

    rushmore
    В данном случае можно ассоциативным массивом обойтись. arr[start_ip] = end_ip. Например <map> в С++

    В SQL он не впишется, т.к. противоречит концепции реляционных БД. Через одно место можно попробовать впихнуть, но оно и будет работать соответственно.
    17 мар 15, 20:01    [17396515]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    Два мильйона. Это примерно половина всей базы .
      COUNT(*)
    ----------
       2069549
    

    Забей на проверку масок, идея не взлетела, я же проверил на твоем файлике, выше писал.
    17 мар 15, 20:03    [17396519]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    Я замудрено придумал, проще так:
    сортируем по n_startip
    идем последовательно
    если текущий n_startip < предыдущий n_endip значит перекрытие

    Одна сортировка, один проход. Лучше не будет.

    это с небольшими извратами можно даже в оракле/мсскул селектом выбрать.
    17 мар 15, 20:12    [17396558]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Dima T, +1.

    Это будет констрейнтом в работе самого приложения. Во врема парсинга будет просто
    происходить проверка двух соседник строк на перекрытие диапазонов.

    Так и сделаем.

    А самую первую (изначальную) сортировку по beginIp можно сделать в оффлайне и пересохранить исходный файл.
    17 мар 15, 20:20    [17396593]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Хм... самопальный IP2num не взлетает.

    // This is stuped IPv4 to number converter. Is it works? I.d.n.t. know! Mua-haha... Did n't tested.
    uint32_t ipv4toNum(char *IPv4){
    	uint32_t ipInt = 0;	
    	char *p = (char*)strtok(IPv4,".");
    	ipInt |= (atoi(p));
    	p = (char*)strtok(NULL,".");
    	ipInt |= (atoi(p) << 8);
    	p = (char*)strtok(NULL,".");
    	ipInt |= (atoi(p) << 16);
    	p = (char*)strtok(NULL,".");
    	ipInt |= (atoi(p) << 24);
    	return ipInt;
    }
    .....
    			printf("startIpNum = '%s'\n", val[0]);
    			printf("endIpNum   = '%s'\n", val[1]);
    			printf("country    = '%s'\n", val[2]);
    			printf("region     = '%s'\n", val[3]);
    			printf("city       = '%s'\n", val[4]);
    			printf("postalCode = '%s'\n", val[5]);
    			printf("latitude   = '%s'\n", val[6]);
    			printf("longitude  = '%s'\n", val[7]);
    			printf("dmaCode    = '%s'\n", val[8]);
    			printf("areaCode   = '%s'\n", val[9]);
    			printf("n_startip  = %d\n", ipv4toNum(val[0]));
    			printf("n_endip    = %d\n", ipv4toNum(val[1]));
    

    Чортовы сишные сдвиги. Наверное где-то разрядная сетка рубится.

    startIpNum = '1.0.0.0'
    endIpNum   = '1.7.255.255'
    country    = 'AU'
    region     = ''
    city       = ''
    postalCode = ''
    latitude   = '-27.0000'
    longitude  = '133.0000'
    dmaCode    = ''
    areaCode   = ''
    n_startip  = 1
    n_endip    = -63743
    ---------------------
    startIpNum = '1.9.0.0'
    endIpNum   = '1.9.255.255'
    country    = 'MY'
    region     = ''
    city       = ''
    postalCode = ''
    latitude   = '2.5000'
    longitude  = '112.5000'
    dmaCode    = ''
    areaCode   = ''
    n_startip  = 2305
    n_endip    = -63231
    
    18 мар 15, 00:43    [17397165]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton, не изобретай велосипед

    			unsigned int n_startip = htonl(inet_addr(val[0]));
    			unsigned int n_endip = htonl(inet_addr(val[1]));
    
    18 мар 15, 06:53    [17397425]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Anatoly Moskovsky
    Member

    Откуда: Odessa
    Сообщений: 6626
    Dima T,

    unsigned int n_startip = htonl(inet_addr(val[0]));
    

    inet_addr возвращает в network order.
    Поэтому htonl после нее формально неверно вызывать.
    На практике, конечно, htonl == ntohl, поэтому все будет работать, т.к. нам надо именно host order.
    Но для порядка надо заменить на ntohl
    18 мар 15, 08:13    [17397519]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Dima T, ищу где в этом чортовом MinGW есть поддержка inet_addr(...)
    18 мар 15, 13:00    [17399021]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    попробуй как в линуксе
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    18 мар 15, 13:09    [17399094]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    По каждой шапке - ошибка
    ipv4filter.c:7:24: fatal error: sys/socket.h: No such file or directory
     #include <sys/socket.h>
                            ^
    compilation terminated.
    
    18 мар 15, 13:22    [17399211]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    Похоже твой MinGW совсем мини :(
    http://stackoverflow.com/questions/1517762/sockets-in-mingw
    http://mingw-users.1079350.n2.nabble.com/sys-socket-h-td3255232.html
    вроде лечится, но придется погуглить

    Поставь MS VC Express
    18 мар 15, 13:33    [17399304]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Вобщем всезнающий анонимос мне подсказал что надо добавить линкеру опцию -lwsock32.

    В шапки подключил

    #include <winsock.h>
    #include <winsock2.h>
    


    Интересно что в МинГВе они существуют в двух экземплярах. С опцией WINSOCK_API_LINKAGE и без нее.
    18 мар 15, 13:34    [17399307]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Dima T
    Похоже твой MinGW совсем мини :(
    http://stackoverflow.com/questions/1517762/sockets-in-mingw
    http://mingw-users.1079350.n2.nabble.com/sys-socket-h-td3255232.html
    вроде лечится, но придется погуглить

    Поставь MS VC Express

    Спс. У меня на MS VS - аллергия. Но если припечёт - обязательно поставлю. Пока вроде собрал.
    18 мар 15, 13:35    [17399322]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Свои каракули я закрыл препроцессором. Пускай будут. Навсякий.

    P.S. А старуха - за корзину. "Я бельё своё не кину" (c) Дядя Стёпа...
    18 мар 15, 13:37    [17399342]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    Спс. У меня на MS VS - аллергия. Но если припечёт - обязательно поставлю. Пока вроде собрал.

    Можешь сделать виртуалку, в ней линукс, а в нем полноценный GCC.
    18 мар 15, 13:51    [17399443]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Ну.. парсер готов. И кстати - приятная новость. Интервалы изначально были отсортированны
    и не перекрываются.

    +
    #include <stdio.h>
    #include <stdbool.h>
    #include <stdint.h>
    
    #include <winsock.h>
    #include <winsock2.h>
    
    //#define INTERNAL_INET_FUNC
    
    /* 17.03.2015 In beginning... (Thnx to Dima) */
    /* 18.03.2015 Added ip4toNum() function.     */
    /* 18.03.2015 Added lwsock32 support (should be compiled with  */
    /*            -lwsock32 option in command line)                */
    /*            Improoved logic. Added constraints. Added retcodes */
     
    
    #define BUF_SIZE    1024
    #define COLUMNS_CNT 10
    
    uint32_t ipv4toNum(char *IPv4){
    	#ifdef INTERNAL_INET_FUNC
    		uint32_t ipInt = 0;	
    		char *p = (char*)strtok(IPv4,".");
    		ipInt |= (atoi(p));
    		p = (char*)strtok(NULL,".");
    		ipInt |= (atoi(p) << 8);
    		p = (char*)strtok(NULL,".");
    		ipInt |= (atoi(p) << 16);
    		p = (char*)strtok(NULL,".");
    		ipInt |= (atoi(p) << 24);
    	return ipInt;
    	#else
    		return htonl(inet_addr(IPv4));
    	#endif
    }
    
    
    // TODO: Complete
    int parse_csv_str(char* str, char **val, int val_size)
    {
    	int val_count = 0;
    	bool quote_open = false;
    	bool first = true;
    	bool end_quote = false;
    	bool center_quote = false;
    	bool stop = false;
    	while(!stop) {
    		if(first) {
    			first = false;
    			if(val_count < val_size) *val = str;
    			val_count++;
    		}
    		switch(*str) {
    			case '"':
    				quote_open = !quote_open;
    				if(*val == str) {
    					(*val)++; // пропуск кавычки в начале
    					end_quote = true;
    				} else {
    					center_quote = true;
    				}
    				break;
    
    			case ',':
    				if(!quote_open) {
    					*str = 0;
    					first = true;
    					if(end_quote) { // пропуск завершающей кавычки
    						end_quote = false;
    						*(str - 1) = 0;
    					}
    					if(center_quote) { // удаление двойных кавычек в центре
    						center_quote = false;
    						char* d = *val;
    						char* s = *val;
    						while(*d = *s) {
    							if(*s != '"' || *(s + 1) != '"') d++;
    							s++;
    						}
    					}
    					if(val_count < val_size) val++;
    				}
    				break;
    
    			case 0:
    				stop = true;
    				break;
    
    			case 0xD:
    			case 0xA:
    				*str = 0;
    				stop = true;
    				break;
    
    		}
    		str++;
    	}
    	// заполнение пустыми строками недостающих
    	int i;
    	for(i = val_count; i < val_size; i++) *(++val) = str;
    	// возврат количества параметров
    	return val_count;
    }
    
    int main(int argc, char **argv, char **env){
    
    	FILE *f = stdin;
    	if(f) {
    		char buf[BUF_SIZE];
    		int line = 0;  
    		int cnt = 0;
    		uint32_t n_prevStartIp=0;
    		uint32_t n_prevEndIp=0;
    		while(fgets(buf, BUF_SIZE, f)) {
    			line++;
    			if(line == 1) {
    				continue;
    			} else {
    				char* val[10];
    				cnt = parse_csv_str(buf, val, 10);
    				if(cnt != COLUMNS_CNT) {
    					fprintf(stderr,"\nIPv4filter: parse error: %d parameters at line %d\n", cnt, line);
    					return -1;
    				}
    				printf("startIpNum = '%s'\n", val[0]);
    				printf("endIpNum   = '%s'\n", val[1]);
    				printf("country    = '%s'\n", val[2]);
    				printf("region     = '%s'\n", val[3]);
    				printf("city       = '%s'\n", val[4]);
    				printf("postalCode = %s\n", val[5]);
    				printf("latitude   = %s\n", val[6]);
    				printf("longitude  = %s\n", val[7]);
    				printf("dmaCode    = '%s'\n", val[8]);
    				printf("areaCode   = '%s'\n", val[9]);
    				uint32_t n_startIp = ipv4toNum(val[0]);
    				uint32_t n_endIp   = ipv4toNum(val[1]);
    				if (n_startIp > n_endIp){
    					fprintf(stderr,"\nIPv4filter: check constraint (END_LESS_THAN_BEGIN) violated at line %d\n", line);
    					return -3;
    				}
    				printf("n_startIp  = %d\n", n_startIp);
    				printf("n_endIp    = %d\n", n_endIp);
    				printf("---------------------\n");
    				if (line>2){
    					if (n_startIp <= n_prevEndIp){
    						fprintf(stderr,"\nIPv4filter: check constraint (OVERLAPPED_INTERVALS) violated at line %d\n", line);
    						return -2;
    					}
    				}
    				n_prevStartIp = n_startIp;
    			}       n_prevEndIp   = n_prevEndIp;
    		}
    		fprintf(stderr,"\nIPv4filter: OK! Lines proceed: %d\n",line);
    	}
    	return 0;
    }
    
    18 мар 15, 14:07    [17399547]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Далее надо обсудить кейсы. Что будет выходом.

    Вариант 1

    Input: 
    
    startIpNum,endIpNum,country,region,city,postalCode,latitude,longitude,dmaCode,areaCode
    1.0.0.0,1.7.255.255,"AU","","","",-27.0000,133.0000,,
    1.9.0.0,1.9.255.255,"MY","","","",2.5000,112.5000,,
    
    Output:
    
    0,16777215,-,Grey
    16777216,17301503,AU,Red
    17301504,17367039,-,Grey
    17367040,17432575,MY,Blue
    


    Вариант 2. То-же самое но не-аллоцированные куски просто скипаем. Изначально подразумеваем
    что софт-получатель знает что их надо красить в нейтрально-серый цвет.

    16777216,17301503,AU,Red
    17367040,17432575,MY,Blue
    


    Коды стран я решил не удалять из потока. Вдруг понадобиться рисовать легенду и отмечать на картинке
    название страны. Или дальше делать привязку к search системам.
    18 мар 15, 15:12    [17400098]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Вобщем ipv4filter и gilbertroute готов. Остались некоторы шероховатости с цветовой раскраской
    стран. Но более чем половина (2.2млрд) покрывается системными цветами. Пока оставлю так.
    Для демо этого достаточно. Остальные страны получат (временно) серый цвет.

    // Trivial decode country into Color(RGB) code
    // A..Z = 0x41..0x5A ( 26 chars )
    // 26 * 26 = 676
    //
    // 
    // Code  Allocation Color
    // ----- ---------- ------
    // US    1507673738 'red'
    // CN     267741269 'green'
    // JP     186372005 'blue'
    // GB     115678470 'magenta'
    // DE     111001300 'yellow'
    // KR      99794924 'cyan'
    // --    ----------
    //    2 288 261 706
    // 
    uint32_t getRGBfromCountryCode(const char *cc){
    	if (cc==NULL) return 0;
    	if (strlen(cc)<2) return 0;
    	if (!stricmp(cc,"US")){
    		return RED;
    	} else if (!stricmp(cc,"CN")){
    		return GREEN;
    	} else if (!stricmp(cc,"JP")){
    		return BLUE;
    	} else if (!stricmp(cc,"GB")){
    		return MAGENTA;
    	} else if (!stricmp(cc,"DE")){
    		return YELLOW;
    	} else if (!stricmp(cc,"KR")){
    		return CYAN;
    	}
    	if (strlen(cc)==2){
    		//uint32_t color = 0x41 - toupper(cc[0]) + 26 * (0x41 - toupper(cc[1]));
    		return GREY;
    	}
    	return 0;	
    }
    
    19 мар 15, 09:42    [17403523]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Далее. Я пока решил не связываться с сложными бинарными форматами картинок.
    Мой софт - тривиален и написан на сях. И не использует пока никаких библиотек.
    Вопрос - в чем сохранять? Я тут посмотрел тулзу 'IrfanView'. Это такой себе
    жлобский просмотрщик картинок. Но у него есть возможность сохранять
    и открывать картинки в псевдо-текстовом формате (ppm).

    Пример: (цветная 25 бит. картинка размером 110x110).

    P3
    # Created by IrfanView
    110 110
    255
    243 167 105 221 185 153 218 174 139 226 178 138 219 173 137 
    231 177 133 221 176 137 223 175 137 231 175 128 231 175 128 
    ...
    
    19 мар 15, 09:48    [17403575]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    Далее. Я пока решил не связываться с сложными бинарными форматами картинок.

    Посмотри BMP, формат не сложный:
    если в TrueColor`е писать: хэдер и дальше точки пошли по три байта {R,G,B}
    Если 256 цветов, то хэдер, палитра и дальше точки по одному байту (ID из палитры). У тебя палитра статична, поэтому может есть смысл ее сгенерить один раз, а потом сразу писать твой ID цвета.
    19 мар 15, 10:03    [17403668]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    Пример генерации BMP на голом С.
    19 мар 15, 10:16    [17403747]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Dima T, ОК. Спс. Лет 12 назад я кодил на Pascal читалку-писалку bmp-картинок.
    И вроде даже поддержал RLE сжатие.

    Попробую восстановить что забыто.

    Но это вобщем-то не в приоритетах.
    19 мар 15, 12:08    [17404450]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Значит вот что добавлю. Конвейер STDOUT->STDIN вполне нормально воспринимает бинарный поток.

    Я еще чуть позже потестирую на краевые моменты. Ситуации с fopen(...,"textmode"), flush, fclose,... и управляющие
    символы (эскейп последовательности) на Windows и CentOS.

    Но думаю что на 99.9% всё будет чики-пики.
    20 мар 15, 13:25    [17409628]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Нашёл образец того что я хотел получить.

    Со ссылкой на http://internetcensus2012.bitbucket.org/paper.html

    Картинка с другого сайта.
    23 сен 15, 23:37    [18187852]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34688
    mayton,

    А почему мыргает ?
    24 сен 15, 18:42    [18191715]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    На сайте пишут

    Hilbert map of 24 hour relative average utilization of IPv4 addresses observed using ICMP ping requests.

    Насколько я понимаю, цветом обозначены хосты доступные для ICMP. Что означает серая и чёрная маркировка - не знаю.
    Возможно это диапазоны локалок и потерянного адресного пространства которое не возможно аллоцировать
    по правилам масок и классов.

    Каков смысл цветовой градации от красного до синего - ХЗ. Надо читать легенду на их сайте. Что то типа utilization in %.

    Вообще в своей постановке я не имел в виду анимацию. Мне-бы хватило статичной картинки.
    24 сен 15, 18:50    [18191747]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    miksoft
    Member

    Откуда:
    Сообщений: 38773
    mayton
    Нашёл образец того что я хотел получить.

    Со ссылкой на http://internetcensus2012.bitbucket.org/paper.html

    Картинка с другого сайта.
    А воплей-то было, что ip-адреса кончаются! А там еще огромные черные куски.
    24 сен 15, 20:08    [18192075]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    miksoft
    А воплей-то было, что ip-адреса кончаются! А там еще огромные черные куски.

    Они куплены/заняты. Другой вопрос как их использует владалец. Например некоторые провайдеры раздают постоянные IP людям которые комп включают раз в месяц, но за интернет платят регулярно.
    24 сен 15, 20:14    [18192091]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    miksoft
    Member

    Откуда:
    Сообщений: 38773
    Dima T
    miksoft
    А воплей-то было, что ip-адреса кончаются! А там еще огромные черные куски.

    Они куплены/заняты. Другой вопрос как их использует владалец. Например некоторые провайдеры раздают постоянные IP людям которые комп включают раз в месяц, но за интернет платят регулярно.
    Блоки с 0 по 32 что-то не похожи на выключенные компы дома.

    Кстати, а что за серые блоки в углах нулевого блока?
    24 сен 15, 20:24    [18192125]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    В продолжение сабж https://www.sql.ru/forum/1174767/botnet
    начал анализировать логи атаки по табличке GeoIpCity от 2010 года.

    Ограничил выборку в 3_500_000 строк из GeoIp.

    В качестве исходных данных - все текстовые логи из топика про Ботнет.

    Предварительно 18192846. Столбец Rate показывает количество атак из подсети.

    Далее вследствие самопального софта и спешки если снять ограничение в 3_500_000
    у меня проблемы с java.lang.OutOfMemoryError: GC overhead limit exceeded.
    25 сен 15, 08:13    [18192992]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    Далее вследствие самопального софта и спешки если снять ограничение в 3_500_000
    у меня проблемы с java.lang.OutOfMemoryError: GC overhead limit exceeded.

    ЕМНИП у тебя GeoIpCity в оракле живет. Тут 18175138 про Spatial индексы было, в MySQL и MSSQL есть. Наверно и в оракле есть, поизучай да заливай лог туда, а дальше select`ом.
    25 сен 15, 08:22    [18193021]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Увы Оракл в дауне. К вечеру подниму. А пока - скриптики и memory.

    Кстати есть мысль - создать форк - Тяпничный анализ ботнета и перенести
    весь анализ туда чтоб не оффтопить.
    25 сен 15, 08:27    [18193043]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    mayton
    И кстати - приятная новость. Интервалы изначально были отсортированны и не перекрываются.

    Если так, то на Spartial можно не заморачиваться. Ищем первый интервал начало которого >= проверяемому IP.
    mayton
    если снять ограничение в 3_500_000

    Сделай массив структур
    int start_ip;
    int end_ip;
    char[4] country;
    

    12 байт на запись, 42 Мб на 3,5 млн.
    mayton
    Кстати есть мысль - создать форк - Тяпничный анализ ботнета и перенести
    весь анализ туда чтоб не оффтопить.

    Правильная мысль
    25 сен 15, 08:41    [18193077]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    В настоящий момент адресная сущность выглядит так

    public final class IpInterval implements Comparable<IpInterval> {
    
        public final long startIpNum;
        public final long endIpNum;
        public final String country;
        public final String region;
        public final String city;
    .....
    


    2) Сегодня подумаю над новым топиком.
    25 сен 15, 08:48    [18193090]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    ИМХУ ораклов не надо. Массивов хватит. Думаю надо сначала с твоей GeoIpCity разобраться: сохранить в максимально компактном виде (можно ужать до 8 байт на запись), API сделать (загрузка из файла, поиск и т.д. и т.п.). В принципе это тема данного топика.
    25 сен 15, 08:51    [18193098]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Вроде обсуждали. Производитель (MaxMind) раньше предоставлял сжатые бинарники в своём
    формате где диапазоны хранились в Radix-Tree в сериализованном виде. Это ИМХО не для экономии
    места а для префисного поиска. Предоставлял также csv для загрузок в БД.

    Сейчас - услуга платная и реально можно достать бинари где-то до 2013 года. Кроме
    того они поменяли формат с GeoLite на GeoLite2 вобщем подкинули головняк. Надо
    еще разбираться где есть что.

    По поводу массивов. Я не против. Где-то мы запускали бенчмарки и решили
    что дихотом-поиск по 1-му адресу рулит.
    25 сен 15, 08:59    [18193113]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 15689
    csv достаточно. Дальше делаем свою структуру хранения, парсим, сортируем как надо, добавляем индексы, сохраняем в бинарник. В итоге получится микро движок СУБД для конкретной задачи. Т.к. данные не меняются, то задача сильно упрощается. Деревья тоже не нужны.
    25 сен 15, 09:05    [18193125]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    IntervalTree жрёт память как обжора. Повысил Xmx до 4Г и закончил отчотик.
    Кому интересно - тут 18193163
    25 сен 15, 09:24    [18193169]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Создал 18194303
    25 сен 15, 13:30    [18194693]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    miksoft
    Dima T
    пропущено...

    Они куплены/заняты. Другой вопрос как их использует владалец. Например некоторые провайдеры раздают постоянные IP людям которые комп включают раз в месяц, но за интернет платят регулярно.
    Блоки с 0 по 32 что-то не похожи на выключенные компы дома.

    Кстати, а что за серые блоки в углах нулевого блока?


    Трудно сказать. Дополню своей старой цитатой.
    SQL> select sum(n_endip-n_startip) from geoipcity;
    
    SUM(N_ENDIP-N_STARTIP)
    ----------------------
                3155268734
    

    Всего аллоцировано адресов 3 155 268 734.

    Квадрат (предположительно) брался из расчёта 64К на 64К пикселов или 2^32 = 4 294 967 296

    В процентном соотношении аллоцировано 3 155 268 734 / 4 294 967 296 = 0.7346

    Тоесть примерно четверть целых чисел формата uint32 в IP адресах не используется.
    25 сен 15, 23:31    [18197812]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    UP. Еще один источник IP-географической инфы.

    http://www.nirsoft.net/countryip/
    27 мар 16, 17:02    [18983843]     Ответить | Цитировать Сообщить модератору
    Между сообщениями интервал более 1 года.
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Еще один кабанчик заинтересован https://habrahabr.ru/post/353986/
    22 апр 18, 11:03    [21357868]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    полудух
    Member

    Откуда: планета орков, г.Зверополис
    Сообщений: 1350
    mayton
    miksoft
    Если это абсолютное требование - то вариант только один - линейное расположение пикселей, т.е. цепочка. А вот укладывать эту цепочку на плоскости можно разными способами - меандром, по спирали и т.п.

    Да я щас думаю над этим. Самое сложное - обеспечить кластеризацию или скопление точек в одном месте.
    Не хочется диаграмму превращять в полосатый шум. Всё таки визуализация должна быть наглядной.

    вообще странам/городам раздаются IP-диапазоны
    а IP-адреса в диапазоны легко складываются через CIDR
    а просто покрасить 3.5 ярда точек это о чём вообще?

    зы: пофиг что старая тема
    6 авг 18, 21:54    [21632211]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Ну вот. Вбросил и зобанился.

    Что за народ!
    7 авг 18, 21:43    [21633508]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    rdb_dev
    Member

    Откуда: с болот
    Сообщений: 3634
    mayton
    Еще один кабанчик заинтересован https://habrahabr.ru/post/353986/
    Мне лишь одно непонятно - занафига нужна эта бесполезная визуализация? Что она нам дает?
    8 авг 18, 09:33    [21633812]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Зачем нужны графики? Диаграммы? Чертежи?

    Не знаю. Я предложил тему. Народ откликнулся.

    Вам эта тема скорее всего не нужна.
    8 авг 18, 11:29    [21634050]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    полудух
    Member

    Откуда: планета орков, г.Зверополис
    Сообщений: 1350
    mayton
    Ну вот. Вбросил и зобанился.

    Что за народ!

    тут я
    11 авг 18, 10:57    [21638580]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    полудух
    mayton
    Ну вот. Вбросил и зобанился.

    Что за народ!

    тут я

    Красавца! :)

    Я планировал разработать такой себе ui-чик. Чтоб мышкой диапазоны сеток выбирать. И правила файрвола.
    11 авг 18, 17:53    [21638813]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    полудух
    Member

    Откуда: планета орков, г.Зверополис
    Сообщений: 1350
    mayton
    Чтоб мышкой диапазоны сеток выбирать. И правила файрвола.

    диапазоны это CIDR
    в правилах он тоже прекрасно живёт
    как узнать, принадлежит ли IP к сетке?
    net & mask == ip & mask
    // ИЛИ посложнее:
    (net ^ ip) & mask == 0
    


    mayton
    2.92.0.0,2.95.255.255,"RU","48","Moscow","",55.7522,37.6156,,

    это: 2.92/14
    кальк

    с первоначальной задачей (я поизучал 1, 6 и 7 страницы) не согласен
    3.5 ярда разноцветных точек на экране никакой практической пользы не имеют и в обнаружении хоть чего-нибудь никак не помогут
    сама покраска - тривиальная задача даже для развития
    сервис, которому можно скормить пул адресов и получить страны - тоже
    CIDR-конвертеров полно в гугле
    11 авг 18, 22:27    [21638902]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    полудух,

    Я ещё окончательно не решил нужна мне эта география или нет. Скорее нет чем да. Топик сдох. Поэтому можешь расслабится.

    Грубо говоря судьба этой задачи меня не парит. Да и пятница...
    11 авг 18, 22:37    [21638910]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    полудух
    Member

    Откуда: планета орков, г.Зверополис
    Сообщений: 1350
    а чего ещё ждать от такой задачи

    зы: вообще суббота
    11 авг 18, 23:43    [21638977]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    полудух, это пятничная тема. По стартовому сообщению.
    12 авг 18, 00:33    [21638991]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    rdb_dev
    Member

    Откуда: с болот
    Сообщений: 3634
    полудух
    net & mask == ip & mask
    // ИЛИ посложнее:
    (net ^ ip) & mask == 0
    
    Всё равно как-то сложно...
    subnet_ip == host_ip & subnet_mask
    
    13 авг 18, 10:31    [21639997]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    Прошу прощения за внезапный UP.

    Полезная ссылка до кучи http://www.ipdeny.com/ipblocks/
    16 дек 18, 00:33    [21765085]     Ответить | Цитировать Сообщить модератору
    Между сообщениями интервал более 1 года.
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    UP. А разве такие маски бывают?

    [ 78.33.196.42 - 78.33.196.63 ] / 27 : GB/Chesterford 
    
    START: 01001110001000011100010000101010
    END  : 01001110001000011100010000111111
    MASK : 11111111111111111111111111101010
    IPv4 mask : 0.0.0.27
    


    С разрывом монотонности внутри? Вроде нет. Тогда как рассматривать диапазон адресов для Честерфорда?
    9 янв 21, 23:52    [22260858]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 51017
    База - все тот-же MaxMind.

    # select * from geoipcity where startipnum = '78.33.196.42';
      startipnum  |   endipnum   | country | region |    city     | postalcode | lattitude | longitude | dmacode | areacode |  startip   |   endip    
    --------------+--------------+---------+--------+-------------+------------+-----------+-----------+---------+----------+------------+------------
     78.33.196.42 | 78.33.196.63 | GB      | E4     | Chesterford |            |   52.0667 |       0.2 |         |          | 1310835754 | 1310835775
    (1 row)
    
    9 янв 21, 23:57    [22260862]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничная география  [new]
    Basil A. Sidorov
    Member

    Откуда:
    Сообщений: 10925
    mayton
    UP. А разве такие маски бывают?
     [ 78.33.196.42 - 78.33.196.63 ] / 27 : GB/Chesterford 
    START: 01001110001000011100010000101010
    END : 01001110001000011100010000111111
    MASK : 11111111111111111111111111101010
    IPv4 mask : 0.0.0.27
    С разрывом монотонности внутри? Вроде нет.
    Не сполшные маски могут быть "внутри" подсети для уменьшения таблицы маршрутов.
    Тогда как рассматривать диапазон адресов для Честерфорда?
    Как /26 или "короче". Насколько я знаю, провайдеру не выделяют меньше /20 (диапозон из 8192 адресов, "выровненный" на степень двойки) и внутри этого блока можно "мутить всякое".

    P.S.
    В размере маски могу "прокинуться" на единичку.

    Сообщение было отредактировано: 10 янв 21, 19:30
    10 янв 21, 19:35    [22261169]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2 3 4 5 6 7 8      [все]
    Все форумы / C++ Ответить