powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная география
177 сообщений из 177, показаны все 8 страниц
Тяпничная география
    #38903802
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здарова други!

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

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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 уникальный адрес.
Каждая страна - отдельный цвет.. По сути - получить
мозаику из стран.

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

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

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

Спасибо.
...
Рейтинг: 0 / 0
Тяпничная география
    #38903906
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А смысл? Может взять какую нибудь карту мира и на ней раскрасить?
...
Рейтинг: 0 / 0
Тяпничная география
    #38903928
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысл - пятничное обсуждение. Чуть позже дам цифирки.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904062
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хопа! А вот и цифирки.

Значит так.

Количество диапазонов.
Код: plsql
1.
2.
3.
4.
5.
SQL> select count(*) from geoipcity;

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



Всего аллоцировано IPv4 адресов.
Код: plsql
1.
2.
3.
4.
5.
SQL> select sum(n_endip-n_startip) from geoipcity;

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


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

Всего стран.
Код: plsql
1.
2.
3.
4.
5.
SQL> select count(*) from (select distinct country from geoipcity);

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



Топ 10 стран по количеству аллоцированных адресов.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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
...
Рейтинг: 0 / 0
Тяпничная география
    #38904092
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема с тем, чтобы понять какие страны граничат друг с другом, и исходя из этого определиться с тем, как их можно раскрашивать.
Если я правильно понял.

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

Либо, построить все(либо достаточное количество) точки. Провести триангуляцию области. Сделать выводы о границах, и провести раскраску
...
Рейтинг: 0 / 0
Тяпничная география
    #38904111
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗадача - визуализировать ВСЕ адреса на картинке.Так на что должна эта картинка походить? Реальная карта стран? Или тупо прямоугольник 64Кх64К?

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

Кстати, если сделать группировку по координатам, то сколько останется?
...
Рейтинг: 0 / 0
Тяпничная география
    #38904116
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftmaytonЗадача - визуализировать ВСЕ адреса на картинке.Так на что должна эта картинка походить? Реальная карта стран? Или тупо прямоугольник 64Кх64К?

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

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

вероятно должна получиться реальная карта стран построенная только на основе IP - адресов. Тут больше 3 миллиардов, где вы тут 5 миллионов увидели не понял:)
...
Рейтинг: 0 / 0
Тяпничная география
    #38904124
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПроблема с тем, чтобы понять какие страны граничат друг с другом, и исходя из этого определиться с тем, как их можно раскрашивать.
Если я правильно понял.

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

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

А вот отобразить over 3 млрд цветных точек на большом квадрате. Каждая из которых - 1 адрес.
Это мне кажется задачей любопытной. И вовсе не такой однозначной.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904128
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftmaytonЗадача - визуализировать ВСЕ адреса на картинке.Так на что должна эта картинка походить? Реальная карта стран? Или тупо прямоугольник 64Кх64К?

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

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

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

А over 200 стран(государств) раскрасить в цвета радуги от синего до красного.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904129
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryПроблема с тем, чтобы понять какие страны граничат друг с другом, и исходя из этого определиться с тем, как их можно раскрашивать.
Если я правильно понял.

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

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

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


А в чём проблема раскрасить каждую точку? Их нужно раскрашивать определенным цветом в зависимости от государства ?
...
Рейтинг: 0 / 0
Тяпничная география
    #38904130
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Задача - визуализировать ВСЕ адреса на картинке. Каждый пиксел - 1 уникальный адрес.


Э...
Может карта Кохонена ?
...
Рейтинг: 0 / 0
Тяпничная география
    #38904131
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу яндекса - я не вкурсе. Наверное речь идёт о каком-то сервисе кластеризации
которого я просто не знаю.

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

Например можно сделать приложение. Ты навёл мышкой над цветной областью - и тебе пишут
дескыть [89.188.106.244 - 89.188.127.255] - Ru/Moscow.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904134
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗадача - визуализировать ВСЕ адреса на картинке. Каждый пиксел - 1 уникальный адрес.
Каждая страна - отдельный цвет.. По сути - получить
мозаику из стран.


Так а какова цель визуализации ? Какие параметры нужно визуализировать на картинке?
...
Рейтинг: 0 / 0
Тяпничная география
    #38904136
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonЗадача - визуализировать ВСЕ адреса на картинке. Каждый пиксел - 1 уникальный адрес.


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

то есть всё-таки с метриками придётся разобраться
...
Рейтинг: 0 / 0
Тяпничная география
    #38904141
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonЗадача - визуализировать ВСЕ адреса на картинке. Каждый пиксел - 1 уникальный адрес.


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

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


p.s. если не секрет, где берёте IPGEODATA ? (можно в приват).
...
Рейтинг: 0 / 0
Тяпничная география
    #38904142
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА в чём проблема раскрасить каждую точку? Их нужно раскрашивать определенным цветом в зависимости от государства ?
Давай порассуждаем. Какого размера картинки ты вообще встречал в природе?

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

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

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

Кстати я год назад гуглил сервис который хранит гига-пиксельные фотки. Кажется
там было фото Эвереста отснятое большим количеством панорамок.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904143
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПо поводу яндекса - я не вкурсе. Наверное речь идёт о каком-то сервисе кластеризации
которого я просто не знаю.У них свой сервис в составе API яндекс.карт. Но, если географии не надо, то, наверное, и сервис не подойдет.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904148
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТак а какова цель визуализации ? Какие параметры нужно визуализировать на картинке?
Это должна быть цветная диаграмма. На которой должны быть видны все 200+ стран. В виде прямоугольничков.
Или полосок. Или просто каких-то сложных областей. Типа многоугольников.

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

- Два соседних IPv4 адреса должны быть двумя соседними пикселами на картинке.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904158
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, наверняка есть смысл "причесать" этот список диапазонов - слить соседние одинаковые, разобраться с пересечениями, удалить мелкие диапазоны, входящие в идентичные более крупные и т.п.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904168
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу да, поскольку есть критерий пространственной близости-удалённости (расстояние между коорд., заданными широтой и долготой),
то да, можно построить карту Кохонена.

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

p.s. если не секрет, где берёте IPGEODATA ? (можно в приват).
Нет не секрет. ПО находится здесь. Там же торгуют базами или сервисом гео-локаций.

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

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

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

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

Впрочем если что я могу скинуть.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904173
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ должно соблюдаться отдельное условие которое я специально сам себе задал. (Только что)

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

Я бы для начала предложил не мудрить, а построить прямоугольник 3584х4096. В качестве координат - первые 12 разрядов и следующие 12 разрядов ip-адресов. Младший октет игнорировать. Сильно подозреваю, что, за небольшим исключением вкраплений старых крупных диапазонов, это будет абсолютно хаотичная картинка.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904181
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, как будут раскрашиваться точки ?
Цвет точек принадлежащих одной стране одинаковый ?
Рядом не должны быть расположены 2 страны с одинаковым цветом ?
...
Рейтинг: 0 / 0
Тяпничная география
    #38904186
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЕсли это абсолютное требование - то вариант только один - линейное расположение пикселей, т.е. цепочка. А вот укладывать эту цепочку на плоскости можно разными способами - меандром, по спирали и т.п.

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

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

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

Минут через 15 подкину еще цифр по длинам диапазонов.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904192
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМарк, как будут раскрашиваться точки ?
Цвет точек принадлежащих одной стране одинаковый ?
Рядом не должны быть расположены 2 страны с одинаковым цветом ?
Ну.... top10 стран ты видел. Надо чтобы хотя-бы эти "толстяки" не пересекались
по HSV палитре.

А на всякие там республики Тувалу или Мауру мне будет пофигу. Пускай цвета похожи.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904195
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСамое сложное - обеспечить кластеризацию или скопление точек в одном месте.mayton- Два соседних IPv4 адреса должны быть двумя соседними пикселами на картинке.Имхо, эти два требования несовместимы между собой.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904204
MyNiGoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
взять прямоугольник любого размера, раскрашенный палитрой пропорционально количеству записей для каждой страны и привязать к перемещению курсора всплывающую подсказку с рандомным адресом из той страны, чей цвет сейчас под курсором
...
Рейтинг: 0 / 0
Тяпничная география
    #38904206
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMasterZivНу да, поскольку есть критерий пространственной близости-удалённости (расстояние между коорд., заданными широтой и долготой),
то да, можно построить карту Кохонена.

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


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


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

Единственное, что KNNL не поддерживет т.н. пакетное обучение. Я пока ещё не настоящий сварщик, и не знаю, что это такое, но
я знаю, что MATLAB с его поддержкой обучает карты на порядки быстре, а вот KNNL тут проседает. Т.е. медленный он.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904210
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВпрочем если что я могу скинуть.

Не, скидывать не надо, нам нужны официальные и обновляемые данные.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904213
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНе висни слишком долго, я висел месяца два...


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

Единственное, что KNNL не поддерживет т.н. пакетное обучение. Я пока ещё не настоящий сварщик, и не знаю, что это такое, но
я знаю, что MATLAB с его поддержкой обучает карты на порядки быстре, а вот KNNL тут проседает. Т.е. медленный он.
Спасибо Илья. Посмотрю.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904218
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MyNiGooвзять прямоугольник любого размера, раскрашенный палитрой пропорционально количеству записей для каждой страны и привязать к перемещению курсора всплывающую подсказку с рандомным адресом из той страны, чей цвет сейчас под курсором

O sancta simplicitas! Но как это сделать? (с)
...
Рейтинг: 0 / 0
Тяпничная география
    #38904246
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftmaytonСамое сложное - обеспечить кластеризацию или скопление точек в одном месте.mayton- Два соседних IPv4 адреса должны быть двумя соседними пикселами на картинке.Имхо, эти два требования несовместимы между собой.
Почему?
...
Рейтинг: 0 / 0
Тяпничная география
    #38904251
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подождите, ещё раз.
У нас такие объекты:

2.92.0.0,2.95.255.255, -- диапазон IP-адресов.

"RU", -- страна

"48", -- регион страны ?

"Moscow", -- город (название региона ?)

55.7522,37.6156 -- геокоординаты центра региона ?

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

Можно же просто нарисовать ленту IP-адресов (от 1 до FFFFFFFF),
и в ней каждую линию поперёк прорисовать в виде цвета страны.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904253
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMyNiGooвзять прямоугольник любого размера, раскрашенный палитрой пропорционально количеству записей для каждой страны и привязать к перемещению курсора всплывающую подсказку с рандомным адресом из той страны, чей цвет сейчас под курсором

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

Да, у меня та же мысль.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904255
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMasterZivНе висни слишком долго, я висел месяца два...


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

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

Я пока и сам не знаю, как это можно сделать и можно ли.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904264
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMyNiGooвзять прямоугольник любого размера, раскрашенный палитрой пропорционально количеству записей для каждой страны и привязать к перемещению курсора всплывающую подсказку с рандомным адресом из той страны, чей цвет сейчас под курсором

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

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

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

Если надо всё сразу, то можно вместо строчки грида рисовать одну линию поперёк грида цветом страны.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904268
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonmiksoftпропущено...
пропущено...
Имхо, эти два требования несовместимы между собой.
Почему?Точнее, совместимы, но только путем сжатия всей картины до одного-двух пикселей, что, очевидно, не то, что нужно.

Потому что даже пять кластеров уже невозможно расположить так, чтобы каждый граничил с каждым.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904270
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonпропущено...


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

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

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

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

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

Один слева -- укрупнённый, по одной линии пикселей поперёк в цвет страны.
Второй справа -- при выделении диапазона в первом гриде мышкой показывает записи уже в виде полноценных записей,
раскрашенные в те же цвета.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904283
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это диаграмма диапазонов. Я ее и так могу получить SQL запросом.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904290
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftmaytonпропущено...

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

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

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

Есть у нее и еще одно свойство. Диапазон точек этой кривой будет практически всегда "свёрнут в клубок".
Причём - любой диапазон.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904312
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант №1
...
Рейтинг: 0 / 0
Тяпничная география
    #38904317
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остальные варианты-примеры осилю чуть позже. Ну вобщем - змейка. Линия слева направо. И кривая.

Ну и всё это в масштабе 3 млрд.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904333
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсть такая загогулина. Кривая Гилберта. Она заполняет квадратное пространство абсолютно
плотно и с любой точностью. Причём каждая точка этой кривой отстоит от соседней не более чем на 1 пиксел.

Есть у нее и еще одно свойство. Диапазон точек этой кривой будет практически всегда "свёрнут в клубок".
Причём - любой диапазон."Клубок" там будет весьма приблизительный. Причем эта приблизительность будет разная в разных частях.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904337
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну всё равно старику Гилберту лайк.

Но я еще проверю коды Грея. Они - проще в реализации. Нет рекурсии.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904345
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот. Для полосатой диаграммы без учёта адресов уже есть данные.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
	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

...
Рейтинг: 0 / 0
Тяпничная география
    #38904354
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значить кому интересне БД-шная часть.

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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');
...
Рейтинг: 0 / 0
Тяпничная география
    #38904357
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оракловые функции для трансляции IP-NUM. Выглядят некрасиво но что поделать. Оракл такой.
По сабжу они - боян т.к. несколько лет назад я уже их где-то постил.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
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;
/
...
Рейтинг: 0 / 0
Тяпничная география
    #38904359
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Контрольный файл для SQL*Loader для импорта.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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  
 )
...
Рейтинг: 0 / 0
Тяпничная география
    #38904380
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Опцию 'virtual' из создающего скрипта для таблицы надо убрать нахер.

Экспериментировал неудачно.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904466
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну.... по поводу географии. Всмысле карты. Широта. Долгота. Пожалуй это тоже тема.

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

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

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

maytonВсегда интересно было видеть traceroute
в привязке к реальным точкам на планете.Помнится, даже онлайн-сервис такой был лет 15 назад.
И программы были - hostinfo.ru/articles/184
...
Рейтинг: 0 / 0
Тяпничная география
    #38904611
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whois и who.is и прочие им подобные выдают DNS записи по хостингам.
Но среди них я не нашёл гео-привязки.

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

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

Насчёт США с их Prism и прочими системами - очень даже верю. Но... это
только под силу таким государствам.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904637
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу Country-IP диаграммы. Так я буду называть это.

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

Код: powershell
1.
GeoIP data => sorting => coloring => { linear | zigzag | gray | gilbert iteration} => panoramSplitter => bitmapRenderer



Причём часть из этих утилит возможно есть в линуксе точнее их аналоги такие
как sort, awk/gawk, sqlite, grep, imagemagic.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904803
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pantone Color Tables. Не знаю нахрена она нужна но выглядит красиво.
Пожалуй возьму себе.

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

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

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

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

И еще не забыть системные 8 цветов (самые насыщееные типа 'red','cyan','magenta') добавить в top 8 стран чтоб ярче и заметнее было.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904809
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще можно объединить с HTML color tables.

http://html-color-codes.info/color-names/
...
Рейтинг: 0 / 0
Тяпничная география
    #38904833
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит вот что я придумал.

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

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

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904869
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто 241 Цвет. Нужно еще что-то выкинуть.

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

Буду удалять их до тех пор пока не останется 233.
Возьми 8 последних стран и дай им такие же цвета как 8 предпоследним. Пусть самые маленькие парами выступают :)
...
Рейтинг: 0 / 0
Тяпничная география
    #38904941
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gilbertroute готов. Хехе....

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
$ 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



Терь надо думать над основным алгоритмом.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904944
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дальше нужна какая-нить "деревянна" либа для работы с графикой. Желательно несжатой.
Т.к. возможно я будут многократно в течение сеанса открывать и закрывать сотни битмапов
в режиме update.

Кто-нить знает такую?
...
Рейтинг: 0 / 0
Тяпничная география
    #38904959
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного цЫфирей. Что сосбно упадёт в OUTPUT ?

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

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

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

Код: plaintext
1.
2.
3.
GeoIPCountry-00-00.bmp
......
GeoIPCountry-63-63.bmp


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

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

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

Итого всё хранилище 64 * 64 = 4096 Mб = 4Гб. Что вобщем-то подтверждает расчёт.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904961
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но квадратные картинки некрасиво смотреть на мониках 16 на 9.

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
XVGA       ;320x240
VGA-16     ;640x480
NTSC       ;720x480 
PAL        ;720x576 
SVGA-600   ;800x600
SVGA-768   ;1024x768



Для HD. Для красоты я дал им реальные имена соответвтующие реальным размерам панелей.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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. Буду ориентироваться на этот размерчик
как на самый основной.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904964
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для панжорамы популярного дисплея.

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

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

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

65536 / 768 = 86.

Тоесть панорама 00..47 и 00..85.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904988
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более менее причёсанный вариант одной утилиты.

gilbertroute.c
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
#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;
		}
		
	}

}
...
Рейтинг: 0 / 0
Тяпничная география
    #38904991
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Писать CSV-парсер на "C" - это полная печалька. strtok.... мать его так.

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

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

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

Вобщем чтоб не было офтопика подниму форк в Программировании
там прокашлять все вопросы и вернуться обратно с экзешником.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904993
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonквадратные картинкиА почему именно квадратные?
Например, если брать в качестве координат части ip-адреса (по 8-16 бит в каждую), то получится прямоугольник с соотношением сторон 0,875.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904994
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПисать CSV-парсер на "C" - это полная печалька. strtok.... мать его так.(f)scanf не справляется?maytonЦена вопроса - оперативно конвертить IP => int32.В WinApi есть такой вызов.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904997
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftmaytonквадратные картинкиА почему именно квадратные?
Например, если брать в качестве координат части ip-адреса (по 8-16 бит в каждую), то получится прямоугольник с соотношением сторон 0,875.
Ну... там ниже по тексту я решил что квадратные это удобно для кодинга. Но не юзабельно
для пользователя.

Преимущества квадратов есть только для заполняющих областей Гилберта.
Но об этом - чуть позже.
...
Рейтинг: 0 / 0
Тяпничная география
    #38904999
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftmaytonПисать CSV-парсер на "C" - это полная печалька. strtok.... мать его так.(f)scanf не справляется?maytonЦена вопроса - оперативно конвертить IP => int32.В WinApi есть такой вызов.
На WinAPI стараюсь не завязываться. Далее... некоторые штуки с PIPE-s не могут быть изящно реализованы
в Windows.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905077
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЦена вопроса - оперативно конвертить IP => int32
IP у тебя уже в БД, если не путаю, добавь поле intIP, конвертни один раз (без разницы чем и как) и используй его.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905110
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БД вобщем-то была нужна чтобы обеспечить сортированный порядок beginIp-endIp.
Иначе основной алгоритм не сработает.

Хотя.. это мысль. Нужно 1 раз отсортировать и просто работать с csv файлом.
А функцию ip2num(..) я просто портирую в "C".
...
Рейтинг: 0 / 0
Тяпничная география
    #38905113
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати из БД ничего неизвестно о перекрытии диапазонов. Возможно такие есть.

Это надо проверить.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905115
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор(f)scanf не справляется?
Думаю... справится. Изначально я предполагал что fscanf будет узким местом.
Но из того что на 1 запись сsv приходится более чем сотня операций рисования
цветного пиксела - то он не может быть узким местом.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905144
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА функцию ip2num(..) я просто портирую в "C".
Все придумано до нас.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#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);
}


В линуксе также, только хэдеры другие надо.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905174
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, спс.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905176
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осилил Z-кривую.

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
#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;
		}
		
	}

}
...
Рейтинг: 0 / 0
Тяпничная география
    #38905350
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приступил собсно к парсеру СSV.

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

ipv4filter.c

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
#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:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
----- 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  = ''



Код: plaintext
1.
2.
3.
4.
5.
$ сс --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. Помогайте.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905358
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приаттачу первые 10 тыс строк базы. Чтоб было на чём тренироваться.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905488
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scanf`ы готовить не умею.

Обычно так делаю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
#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);
	}
}

...
Рейтинг: 0 / 0
Тяпничная география
    #38905508
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, что нужно с запятыми и scanf, приведите пример пожалуйста для особо одарённых :D
...
Рейтинг: 0 / 0
Тяпничная география
    #38905514
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗначит вот что я придумал.

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

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

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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.

А как будет происходить работа с остальными странами ? Вдруг у двух близлежащих стран будут схожие цвета
...
Рейтинг: 0 / 0
Тяпничная география
    #38905521
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryчто нужно с запятыми и scanf
Разобрать строку с разделителем запятая на отдельные строки
Например
Код: plaintext
1.
1.0.0.0,1.7.255.255,"AU","","","",-27.0000,133.0000,,


Файлик со строками выше.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905534
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вот мне miksoft посоветовал fscanf. И я "ринулся".... И как-то оно так вышло.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905546
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА как будет происходить работа с остальными странами ? Вдруг у двух близлежащих стран будут схожие цвета
В данной таблице я просто привёл распределение адресов по странам. В реальности (смотри сsv файл)
страны идут в случайном порядке.

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

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

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

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

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

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

3) Красить в произвольный цвет но на границе областей проводить жирную чёрную линию в 1pix
толщиной. Последняя задача - аналог фильтра photoshop по выделению границ. И ее можно
решать отдельно от общей задачи.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905564
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа вот мне miksoft посоветовал fscanf. И я "ринулся".... И как-то оно так вышло.

Тут не должно быть проблем, меня скоро выгонят из этого компьютера, но я попробую успеть
...
Рейтинг: 0 / 0
Тяпничная география
    #38905568
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай дерзай. Я свой лимит времени на fscanf потратил. Займусь пока чем-то другим
полезным. К сканфу вернусь чуть позже.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905586
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока так, где-то ошибся, вечером ещё посмотрю

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
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" !
	}

...
Рейтинг: 0 / 0
Тяпничная география
    #38905701
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК. Попробую вечером.

Если чесно то вариант Димы мне больше нравится. Если взлетит - то возьму его.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905723
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсли взлетит - то возьму его.
Не взлетит - пиши на чем споткнется, поправлю. Пока там проигнорирован один момент стандартного CSV: если значение содержало кавычки, то они превращаются в две двойные кавычки, т.е. ООО "АБВ" запишется как "ООО ""АБВ""". У тебя вроде не должно такого быть. С ходу не придумал как по простому это обработать, вечером время будет, еще подумаю как это полечить.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905734
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечный автомат-парсер спасёт отца русской демократии меня, но вот какова будет цена
вопроса на pure "C" . Выше я задумался о Golang/Python/Rust/D для решения данной узкой задачи. Но
коллеги-сишники меня закидают помидорами.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905783
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

только сейчас подумалось - зачем парсить вручную, если Оракл сам умеет СSV грузить как минимум двумя способами - через external tables и через SQL*Loader ?
...
Рейтинг: 0 / 0
Тяпничная география
    #38905793
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю софт без привязки к Oracle. БД я использовал просто чтобы посмотреть
кое-какие срезы по странам и мини-максные характеристики.

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

Подниму-ка топик.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905805
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя.... зачем. Щас попробую.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905838
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonне знаю как он решается в SQL.если адреса перевести в числа, то элементарно.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905867
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКонечный автомат-парсер
Чего это я сразу про него не вспомнил, с ним проще.

Держи версию 2.0
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
#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);
	}
}


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

Твой файлик проходит без ошибок.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905869
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял. Мой моск лихорадочно ищет оптимизаций. Задача решается в биткарте или
в любой структуре которая учитывает флаги.

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
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-щики оптимизаторы?
...
Рейтинг: 0 / 0
Тяпничная география
    #38905881
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или.... если-бы таблица была сегментирована к примеру по N_STARTIP то тогда
возможно Oracle optimizer сделал-бы не квадрат количества rows а "треугольник"
или "квадратичную" оценку с весовым коэффициентиком меньше единицы.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905886
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ топике есть SQL-щики оптимизаторы?Показывайте DDL таблицы
...
Рейтинг: 0 / 0
Тяпничная география
    #38905888
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17382368

Всё в силе. Только "virtual" уберите.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905893
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftmaytonВ топике есть SQL-щики оптимизаторы?Показывайте DDL таблицы
лучше с тестовыми данными, типа такого
Код: plaintext
1.
2.
3.
4.
create table XXX (...)
insert into xxx values (...)
insert into xxx values (...)
...


тут похожая тема была, только с перекрытием квадратов http://www.sql.ru/forum/1120376-1/karty
...
Рейтинг: 0 / 0
Тяпничная география
    #38905900
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я помню эту тему.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905916
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаешь таблицу points(nIP) и туда пишешь каждый IP из каждого диапазона. Будет около 4 млрд. записей.

Затем
Код: plaintext
1.
select nIP, count(*) as nCnt from points group by nIP having nCnt > 1


:)
...
Рейтинг: 0 / 0
Тяпничная география
    #38905926
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это та-же биткарта. Но я принципиально не хочу решать задачу в SQL так-же как я и решал бы ее на сях.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905938
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получил несолько ложных срабатываний. Разобрался. Забыл что отрезки сами с собой пересекаются.
Убрал само-соединение. Пока пишу... в процессе.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select 
    count(*) 
from 
    geoipcity g1,geoipcity g2
where
  ..... // здесь будет несколько предикатов которые проверяют различные варианты 
  // перекрытия отрезков N_STARTIP1...N_ENDID1, N_STARTIP2...N_ENDID2
  and g1.ROWID!=g2.ROWID;
...
Рейтинг: 0 / 0
Тяпничная география
    #38905950
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача не заточена под SQL, подобные проблемы обычно биткартой решают. Например в задачах с диапазонами дат используют вспомогательную таблицу-календарь со всеми датами.

Пробуй:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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), СУБД сама разберется нужны они или не очень.
...
Рейтинг: 0 / 0
Тяпничная география
    #38905966
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть упростил:
Код: plaintext
1.
2.
3.
4.
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
...
Рейтинг: 0 / 0
Тяпничная география
    #38905981
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я надеялся двумя предикатами обойтись. Тоже сидел грыз гранит предикатов max/min и сравнений.

Пока плюнул. Работа подвалила. Вечером вернусь к географии.
...
Рейтинг: 0 / 0
Тяпничная география
    #38906528
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот код по-моему должен работать, но работает некорректно

Код: plaintext
1.
2.
		fscanf(in, "%[^,]  , %[^,], \"%[^\"]\", \"%[^\"]\", [^\"]\", \"%[^\"]\", %[^,]   , %[^,]    , %[^,]  ,  %[^\n]", 
			       startIP , endIP,   country ,   region  ,    city  , postalCode, latitude, longitude, dmaCode, areaCode);



Может быть я неправильно его использую в своём контексте, попробуйте у себя
...
Рейтинг: 0 / 0
Тяпничная география
    #38906730
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПервая корявая получилась. Хотел допилить кавычки и в свою библиотеку прибрать, пригодится, потом подумал обычно надо еще знать сколько всего колонок прежде чем парсить. Получилось проще новую написать :)

Твой файлик проходит без ошибок.
Спс. Закоммитил. С небольшими изменениями. Будет как базовый алгоритм.
https://sourceforge.net/p/countryipdiagram/code/HEAD/tree/trunk/src/ipv4filter.c
...
Рейтинг: 0 / 0
Тяпничная география
    #38906984
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЧуть упростил:
Код: plaintext
1.
2.
3.
4.
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 млн случайных строк. Потому как я на Оракле не могу дождаться завершения
работы этого курсора.

Здесь не проблема его написать. А проблема написать оптимально.
...
Рейтинг: 0 / 0
Тяпничная география
    #38907026
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЭтот код по-моему должен работать, но работает некорректно

Код: plaintext
1.
2.
		fscanf(in, "%[^,]  , %[^,], \"%[^\"]\", \"%[^\"]\", [^\"]\", \"%[^\"]\", %[^,]   , %[^,]    , %[^,]  ,  %[^\n]", 
			       startIP , endIP,   country ,   region  ,    city  , postalCode, latitude, longitude, dmaCode, areaCode);



Может быть я неправильно его использую в своём контексте, попробуйте у себя
Посмотрю чуть позже.
...
Рейтинг: 0 / 0
Тяпничная география
    #38907080
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 единиц. Надо проверить что у как-то эту особенность использовать. Пока не соображу как.
...
Рейтинг: 0 / 0
Тяпничная география
    #38907175
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТы индексы создал?

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

Кстати есть еще одна особенность диапазонов IP: они всегда отвечают условию: начало (т.е. n_startip) сформировано в двоичном виде как число с 8/16/24 ноликами в конце ( ...1000000000), максимальное (n_endip) в конце 8/16/24 единиц. Надо проверить что у как-то эту особенность использовать. Пока не соображу как.
Ты не поверишь но я над этим думаю. Скорее всего эта БД весьма специфична по сути.
Например движок MaxMind и Java-имплементация базы (втроенная) занимала размер
многократ меньше чем CSV-файл.

Для таких данных обычно юзают префиксное дерево или дерево остатков. Вполне возможно
что оно там и заюзано.
...
Рейтинг: 0 / 0
Тяпничная география
    #38907201
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 битах
НачалоКонецХраним07047014501081110121511
дальше сортируем по храним как строки и сравниваем предыдущую с последующей в количестве символов первой - совпало - вторая входит в первую, т.е. "0" == "01" (выкидываем "01"), затем "0" == "010" (выкидываем "010"), затем "0" != "10", затем "10" != "11"

Одна сортировка, один проход, без биткарты, но опять не заточено под SQL
...
Рейтинг: 0 / 0
Тяпничная география
    #38907211
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай проверку на валидность:
Код: plaintext
1.
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)
...
Рейтинг: 0 / 0
Тяпничная география
    #38907315
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСделай проверку на валидность:
можешь не делать, 10% твоего файла не проходит

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

Чел я же не просто так скрипты привёл. 17382368 Они реальны и работают. По поводу плана исполнения - отпишу чуть позже.
Я не привык писать с бухты-барахты и обычно проверяю.
Залил твой файлик в MSSQL. Мой запрос без индексов 10 сек, с индексами 16 сек
...
Рейтинг: 0 / 0
Тяпничная география
    #38907381
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Придумал!

Выстроить цепочку:
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 млн операций.
код на фоксе
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
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 мс :)
...
Рейтинг: 0 / 0
Тяпничная география
    #38907499
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, минутку. Я всё-тки проверю свои 5 млн.

Подожди.

P.S. А я всегда хвалил Фокс-Про. И даже поднимал где-то тему по поводу rushmap или как оно там зовётся.
Интересовало портирование этого алгоритма в другие DBMS.
...
Рейтинг: 0 / 0
Тяпничная география
    #38907509
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капец. План вообще никчорту!

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
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???
...
Рейтинг: 0 / 0
Тяпничная география
    #38907513
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alter index ... invisible помог. Хорошая шняга в одинадцатом жигуле Оракле... Мдя.
...
Рейтинг: 0 / 0
Тяпничная география
    #38907516
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
--------------------------------------------------------------------------------
| 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............
...
Рейтинг: 0 / 0
Тяпничная география
    #38907523
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Два мильйона. Это примерно половина всей базы .
Код: plsql
1.
2.
3.
  COUNT(*)
----------
   2069549
...
Рейтинг: 0 / 0
Тяпничная география
    #38907525
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonP.S. А я всегда хвалил Фокс-Про. И даже поднимал где-то тему по поводу rushmap или как оно там зовётся.
Интересовало портирование этого алгоритма в другие DBMS.
rushmore
В данном случае можно ассоциативным массивом обойтись. arr[start_ip] = end_ip. Например <map> в С++

В SQL он не впишется, т.к. противоречит концепции реляционных БД. Через одно место можно попробовать впихнуть, но оно и будет работать соответственно.
...
Рейтинг: 0 / 0
Тяпничная география
    #38907527
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДва мильйона. Это примерно половина всей базы .
Код: plsql
1.
2.
3.
  COUNT(*)
----------
   2069549


Забей на проверку масок, идея не взлетела, я же проверил на твоем файлике, выше писал.
...
Рейтинг: 0 / 0
Тяпничная география
    #38907533
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я замудрено придумал, проще так:
сортируем по n_startip
идем последовательно
если текущий n_startip < предыдущий n_endip значит перекрытие

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

это с небольшими извратами можно даже в оракле/мсскул селектом выбрать.
...
Рейтинг: 0 / 0
Тяпничная география
    #38907539
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, +1.

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

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

А самую первую (изначальную) сортировку по beginIp можно сделать в оффлайне и пересохранить исходный файл.
...
Рейтинг: 0 / 0
Тяпничная география
    #38907704
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... самопальный IP2num не взлетает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
// 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]));


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

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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
...
Рейтинг: 0 / 0
Тяпничная география
    #38907773
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, не изобретай велосипед

Код: plaintext
1.
2.
			unsigned int n_startip = htonl(inet_addr(val[0]));
			unsigned int n_endip = htonl(inet_addr(val[1]));
...
Рейтинг: 0 / 0
Тяпничная география
    #38907808
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Код: plaintext
1.
unsigned int n_startip = htonl(inet_addr(val[0]));


inet_addr возвращает в network order.
Поэтому htonl после нее формально неверно вызывать.
На практике, конечно, htonl == ntohl, поэтому все будет работать, т.к. нам надо именно host order.
Но для порядка надо заменить на ntohl
...
Рейтинг: 0 / 0
Тяпничная география
    #38908244
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, ищу где в этом чортовом MinGW есть поддержка inet_addr(...)
...
Рейтинг: 0 / 0
Тяпничная география
    #38908262
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй как в линуксе
Код: plaintext
1.
2.
3.
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
...
Рейтинг: 0 / 0
Тяпничная география
    #38908289
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По каждой шапке - ошибка
Код: plaintext
1.
2.
3.
4.
ipv4filter.c:7:24: fatal error: sys/socket.h: No such file or directory
 #include <sys/socket.h>
                        ^
compilation terminated.
...
Рейтинг: 0 / 0
Тяпничная география
    #38908313
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
...
Рейтинг: 0 / 0
Тяпничная география
    #38908314
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем всезнающий анонимос мне подсказал что надо добавить линкеру опцию -lwsock32.

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

Код: plaintext
1.
2.
#include <winsock.h>
#include <winsock2.h>



Интересно что в МинГВе они существуют в двух экземплярах. С опцией WINSOCK_API_LINKAGE и без нее.
...
Рейтинг: 0 / 0
Тяпничная география
    #38908317
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 - аллергия. Но если припечёт - обязательно поставлю. Пока вроде собрал.
...
Рейтинг: 0 / 0
Тяпничная география
    #38908323
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свои каракули я закрыл препроцессором. Пускай будут. Навсякий.

P.S. А старуха - за корзину. "Я бельё своё не кину" (c) Дядя Стёпа...
...
Рейтинг: 0 / 0
Тяпничная география
    #38908343
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСпс. У меня на MS VS - аллергия. Но если припечёт - обязательно поставлю. Пока вроде собрал.
Можешь сделать виртуалку, в ней линукс, а в нем полноценный GCC.
...
Рейтинг: 0 / 0
Тяпничная география
    #38908387
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну.. парсер готов. И кстати - приятная новость. Интервалы изначально были отсортированны
и не перекрываются.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
#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;
}

...
Рейтинг: 0 / 0
Тяпничная география
    #38908549
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далее надо обсудить кейсы. Что будет выходом.

Вариант 1

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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. То-же самое но не-аллоцированные куски просто скипаем. Изначально подразумеваем
что софт-получатель знает что их надо красить в нейтрально-серый цвет.

Код: plaintext
1.
2.
16777216,17301503,AU,Red
17367040,17432575,MY,Blue



Коды стран я решил не удалять из потока. Вдруг понадобиться рисовать легенду и отмечать на картинке
название страны. Или дальше делать привязку к search системам.
...
Рейтинг: 0 / 0
Тяпничная география
    #38909380
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем ipv4filter и gilbertroute готов. Остались некоторы шероховатости с цветовой раскраской
стран. Но более чем половина (2.2млрд) покрывается системными цветами. Пока оставлю так.
Для демо этого достаточно. Остальные страны получат (временно) серый цвет.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
// 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;	
}
...
Рейтинг: 0 / 0
Тяпничная география
    #38909387
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далее. Я пока решил не связываться с сложными бинарными форматами картинок.
Мой софт - тривиален и написан на сях. И не использует пока никаких библиотек.
Вопрос - в чем сохранять? Я тут посмотрел тулзу 'IrfanView'. Это такой себе
жлобский просмотрщик картинок. Но у него есть возможность сохранять
и открывать картинки в псевдо-текстовом формате (ppm).

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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 
...
...
Рейтинг: 0 / 0
Тяпничная география
    #38909400
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДалее. Я пока решил не связываться с сложными бинарными форматами картинок.
Посмотри BMP, формат не сложный:
если в TrueColor`е писать: хэдер и дальше точки пошли по три байта {R,G,B}
Если 256 цветов, то хэдер, палитра и дальше точки по одному байту (ID из палитры). У тебя палитра статична, поэтому может есть смысл ее сгенерить один раз, а потом сразу писать твой ID цвета.
...
Рейтинг: 0 / 0
Тяпничная география
    #38909426
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тяпничная география
    #38909625
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, ОК. Спс. Лет 12 назад я кодил на Pascal читалку-писалку bmp-картинок.
И вроде даже поддержал RLE сжатие.

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

Но это вобщем-то не в приоритетах.
...
Рейтинг: 0 / 0
Тяпничная география
    #38911059
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит вот что добавлю. Конвейер STDOUT->STDIN вполне нормально воспринимает бинарный поток.

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

Но думаю что на 99.9% всё будет чики-пики.
...
Рейтинг: 0 / 0
Тяпничная география
    #39059916
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл образец того что я хотел получить.

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

...
Рейтинг: 0 / 0
Тяпничная география
    #39060640
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

А почему мыргает ?
...
Рейтинг: 0 / 0
Тяпничная география
    #39060650
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сайте пишут

Hilbert map of 24 hour relative average utilization of IPv4 addresses observed using ICMP ping requests.
Насколько я понимаю, цветом обозначены хосты доступные для ICMP. Что означает серая и чёрная маркировка - не знаю.
Возможно это диапазоны локалок и потерянного адресного пространства которое не возможно аллоцировать
по правилам масок и классов.

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

Вообще в своей постановке я не имел в виду анимацию. Мне-бы хватило статичной картинки.
...
Рейтинг: 0 / 0
Тяпничная география
    #39060696
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНашёл образец того что я хотел получить.

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

А воплей-то было, что ip-адреса кончаются! А там еще огромные черные куски.
...
Рейтинг: 0 / 0
Тяпничная география
    #39060697
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftА воплей-то было, что ip-адреса кончаются! А там еще огромные черные куски.
Они куплены/заняты. Другой вопрос как их использует владалец. Например некоторые провайдеры раздают постоянные IP людям которые комп включают раз в месяц, но за интернет платят регулярно.
...
Рейтинг: 0 / 0
Тяпничная география
    #39060702
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmiksoftА воплей-то было, что ip-адреса кончаются! А там еще огромные черные куски.
Они куплены/заняты. Другой вопрос как их использует владалец. Например некоторые провайдеры раздают постоянные IP людям которые комп включают раз в месяц, но за интернет платят регулярно.Блоки с 0 по 32 что-то не похожи на выключенные компы дома.

Кстати, а что за серые блоки в углах нулевого блока?
...
Рейтинг: 0 / 0
Тяпничная география
    #39060822
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжение сабж http://www.sql.ru/forum/1174767/botnet
начал анализировать логи атаки по табличке GeoIpCity от 2010 года.

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

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

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

Далее вследствие самопального софта и спешки если снять ограничение в 3_500_000
у меня проблемы с java.lang.OutOfMemoryError: GC overhead limit exceeded.
...
Рейтинг: 0 / 0
Тяпничная география
    #39060827
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДалее вследствие самопального софта и спешки если снять ограничение в 3_500_000
у меня проблемы с java.lang.OutOfMemoryError: GC overhead limit exceeded.
ЕМНИП у тебя GeoIpCity в оракле живет. Тут 18175138 про Spatial индексы было, в MySQL и MSSQL есть. Наверно и в оракле есть, поизучай да заливай лог туда, а дальше select`ом.
...
Рейтинг: 0 / 0
Тяпничная география
    #39060832
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы Оракл в дауне. К вечеру подниму. А пока - скриптики и memory.

Кстати есть мысль - создать форк - Тяпничный анализ ботнета и перенести
весь анализ туда чтоб не оффтопить.
...
Рейтинг: 0 / 0
Тяпничная география
    #39060837
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ кстати - приятная новость. Интервалы изначально были отсортированны и не перекрываются.
Если так, то на Spartial можно не заморачиваться. Ищем первый интервал начало которого >= проверяемому IP.
maytonесли снять ограничение в 3_500_000
Сделай массив структур
Код: plaintext
1.
2.
3.
int start_ip;
int end_ip;
char[4] country;


12 байт на запись, 42 Мб на 3,5 млн.
maytonКстати есть мысль - создать форк - Тяпничный анализ ботнета и перенести
весь анализ туда чтоб не оффтопить.
Правильная мысль
...
Рейтинг: 0 / 0
Тяпничная география
    #39060842
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В настоящий момент адресная сущность выглядит так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
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) Сегодня подумаю над новым топиком.
...
Рейтинг: 0 / 0
Тяпничная география
    #39060846
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХУ ораклов не надо. Массивов хватит. Думаю надо сначала с твоей GeoIpCity разобраться: сохранить в максимально компактном виде (можно ужать до 8 байт на запись), API сделать (загрузка из файла, поиск и т.д. и т.п.). В принципе это тема данного топика.
...
Рейтинг: 0 / 0
Тяпничная география
    #39060854
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде обсуждали. Производитель (MaxMind) раньше предоставлял сжатые бинарники в своём
формате где диапазоны хранились в Radix-Tree в сериализованном виде. Это ИМХО не для экономии
места а для префисного поиска. Предоставлял также csv для загрузок в БД.

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

По поводу массивов. Я не против. Где-то мы запускали бенчмарки и решили
что дихотом-поиск по 1-му адресу рулит.
...
Рейтинг: 0 / 0
Тяпничная география
    #39060860
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
csv достаточно. Дальше делаем свою структуру хранения, парсим, сортируем как надо, добавляем индексы, сохраняем в бинарник. В итоге получится микро движок СУБД для конкретной задачи. Т.к. данные не меняются, то задача сильно упрощается. Деревья тоже не нужны.
...
Рейтинг: 0 / 0
Тяпничная география
    #39060880
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IntervalTree жрёт память как обжора. Повысил Xmx до 4Г и закончил отчотик.
Кому интересно - тут 18193163
...
Рейтинг: 0 / 0
Тяпничная география
    #39061236
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создал 18194303
...
Рейтинг: 0 / 0
Тяпничная география
    #39061735
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftDima Tпропущено...

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

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

Трудно сказать. Дополню своей старой цитатой.
Код: plsql
1.
2.
3.
4.
5.
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 адресах не используется.
...
Рейтинг: 0 / 0
Тяпничная география
    #39201467
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UP. Еще один источник IP-географической инфы.

http://www.nirsoft.net/countryip/
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Тяпничная география
    #39634302
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один кабанчик заинтересован https://habrahabr.ru/post/353986/
...
Рейтинг: 0 / 0
Тяпничная география
    #39683982
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonmiksoftЕсли это абсолютное требование - то вариант только один - линейное расположение пикселей, т.е. цепочка. А вот укладывать эту цепочку на плоскости можно разными способами - меандром, по спирали и т.п.

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

зы: пофиг что старая тема
...
Рейтинг: 0 / 0
Тяпничная география
    #39684516
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот. Вбросил и зобанился.

Что за народ!
...
Рейтинг: 0 / 0
Тяпничная география
    #39684612
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕще один кабанчик заинтересован https://habrahabr.ru/post/353986/ Мне лишь одно непонятно - занафига нужна эта бесполезная визуализация? Что она нам дает?
...
Рейтинг: 0 / 0
Тяпничная география
    #39684694
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем нужны графики? Диаграммы? Чертежи?

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

Вам эта тема скорее всего не нужна.
...
Рейтинг: 0 / 0
Тяпничная география
    #39686364
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу вот. Вбросил и зобанился.

Что за народ!
тут я
...
Рейтинг: 0 / 0
Тяпничная география
    #39686426
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухmaytonНу вот. Вбросил и зобанился.

Что за народ!
тут я
Красавца! :)

Я планировал разработать такой себе ui-чик. Чтоб мышкой диапазоны сеток выбирать. И правила файрвола.
...
Рейтинг: 0 / 0
Тяпничная география
    #39686447
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧтоб мышкой диапазоны сеток выбирать. И правила файрвола.
диапазоны это CIDR
в правилах он тоже прекрасно живёт
как узнать, принадлежит ли IP к сетке?
Код: plaintext
1.
2.
3.
net & mask == ip & mask
// ИЛИ посложнее:
(net ^ ip) & mask == 0



mayton2.92.0.0,2.95.255.255,"RU","48","Moscow","",55.7522,37.6156,,
это: 2.92/14
кальк

с первоначальной задачей (я поизучал 1, 6 и 7 страницы) не согласен
3.5 ярда разноцветных точек на экране никакой практической пользы не имеют и в обнаружении хоть чего-нибудь никак не помогут
сама покраска - тривиальная задача даже для развития
сервис, которому можно скормить пул адресов и получить страны - тоже
CIDR-конвертеров полно в гугле
...
Рейтинг: 0 / 0
Тяпничная география
    #39686448
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,

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

Грубо говоря судьба этой задачи меня не парит. Да и пятница...
...
Рейтинг: 0 / 0
Тяпничная география
    #39686461
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чего ещё ждать от такой задачи

зы: вообще суббота
...
Рейтинг: 0 / 0
Тяпничная география
    #39686465
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух, это пятничная тема. По стартовому сообщению.
...
Рейтинг: 0 / 0
Тяпничная география
    #39686713
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
Код: plaintext
1.
2.
3.
net & mask == ip & mask
// ИЛИ посложнее:
(net ^ ip) & mask == 0

Всё равно как-то сложно...
Код: plaintext
1.
subnet_ip == host_ip & subnet_mask
...
Рейтинг: 0 / 0
Тяпничная география
    #39748532
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения за внезапный UP.

Полезная ссылка до кучи http://www.ipdeny.com/ipblocks/
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Тяпничная география
    #40034518
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UP. А разве такие маски бывают?

Код: plaintext
1.
2.
3.
4.
5.
6.
[ 78.33.196.42 - 78.33.196.63 ] / 27 : GB/Chesterford 

START: 01001110001000011100010000101010
END  : 01001110001000011100010000111111
MASK : 11111111111111111111111111101010
IPv4 mask : 0.0.0.27



С разрывом монотонности внутри? Вроде нет. Тогда как рассматривать диапазон адресов для Честерфорда?
...
Рейтинг: 0 / 0
Тяпничная география
    #40034521
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
База - все тот-же MaxMind.

Код: plaintext
1.
2.
3.
4.
5.
# 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)
...
Рейтинг: 0 / 0
Тяпничная география
    #40034712
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
UP. А разве такие маски бывают?
Код: plaintext
1.
2.
3.
4.
 [ 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.
В размере маски могу "прокинуться" на единичку.
...
Рейтинг: 0 / 0
177 сообщений из 177, показаны все 8 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Тяпничная география
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]