что такое maper info
Как найти человека по IP-адресу
Лет 10 назад в сети любили пугать фразами вроде: «Да я тебя по IP вычислю». Разбираемся, реально ли это.
Важно: все эксперименты вы повторяете на свой страх и риск. Потому что закон трактует их неоднозначно.
Что такое IP и откуда он берется
IP-адрес (Internet Protocol Address) – это уникальный адрес в определенной сети на базе стека протоколов TCP/IP. Он идентифицирует устройство: ваш домашний компьютер, смартфон или другой узел.
IP-адреса нужен, чтобы информация, отправленная вашему устройству, пришла именно ему, а не другому гаджету в сети. IP может быть статическими и динамическими.
Статический адрес выдается на какое-то более-менее длительное время (и за это провайдер обычно берет дополнительные деньги). Его можно прописать вручную в настройках или получить у провайдера (в зависимости от правил сети). Когда вы платите за статический IP, вы фактически покупаете гарантию того, что никто другой в сети этот адрес использовать не будет.
Динамические адреса маршрутизатор автоматически раздает из доступного ему диапазона. Вы можете получать новый динамический IP каждый раз, когда входите в сеть или перезагружаете маршрутизатор. Через определенное время сеть может сбросить ваш динамический IP и выдать новый адрес.
Сейчас используется два стандарта IP – IPv4 и более новый IPv6. Первый состоит из 4 байт (32 бит) – 4 чисел от 0 до 255 (для удобства их разделяют точками). К примеру, это 127.0.0.1 – localhost, адрес, по которому устройство может обратиться к себе самому.
До определенного момента это работало. Но однажды 4 байт перестало хватать, чтобы каждое подключаемое к интернету устройство имело уникальный адрес. Пришлось извращаться: вводить маски подсети и т.п.
Обычно устройства подключаются к нескольким сетям – например, к интернету и к домашней локальной сети через маршрутизатор. Для каждой сети будет свой IP.
Мы в данном случае будем говорить о внешних IP – адресах в интернете. И предполагая, что анонимайзер, прокси, VPN и т.д. не используются.
Как узнать свой внешний IP
В сети есть специальные сервисы. Но тот же «Яндекс» по запросу «мой айпи» сразу все расскажет:
Есть и другие ресурсы. Например, pr-cy.ru или 2ip.ru.
Как узнать чужой IP без ведома пользователя
Когда вы заходите на сайт, он создает соединение с вашим IP. В журнале сервера сохраняются все IP, которые подключались к сайту, и время визитов.
Соответственно, чтобы узнать IP человека, можно запустить свой сайт, отправить жертве (и только жертве!) ссылку на него и надеяться, что пользователь на сайт зайдет. А затем посмотреть данные в истории через админку. Либо установить на сайт IP-логгер, который будет собирать статистику.
Но поднимать сервер – это как-то непросто и небыстро. Есть и более легкие способы.
Например, 2ip предлагает отправить e-mail адресата, IP которого вы хотите узнать, на ящик [email protected] (в форме нужно указать свой IP). Через несколько секунд после отправки сервис отправит результат вам на почту.
Но можно просто посмотреть оригинал сообщения. В Gmail пункт так и называется “Посмотреть оригинал”, в “Яндексе” – “Свойства письма”. В других сервисах это может быть “Открыть полный заголовок”, “Посмотреть исходный код письма” и т.п.
Еще один сервис – https://speed-tester.info. Заполняете форму на этой странице, указываете сайт, который может быть интересен вашему собеседнику. Потом по сгенерированной ссылке отслеживаете статистику.
Правда, сайтов отслеживается мало: сам speed-tester.info, 64ip.com, likepic.net, top-cs.com, vk.com, news.tut.by, tut.by, charter97.org, kgk.gov.by, 8634city.ru, facebook.com, ok.ru, youtube.com.
Альтернатива – https://iplogger.ru/. Вставляете в форму на главной странице ссылку на сайт, ресурс добавляет к ней уникальное продолжение.
Отдаете ссылку другу, он открывает, вы видите в статистике его IP. Ограничений в плане выбора сайтов здесь нет. Подобных сервисов десятки.
А что говорит закон по этому поводу
С одной стороны, IP-адрес – это просто набор цифр. Он чаще всего выдается случайным образом и характеризует лишь точку доступа в сети.
Вы можете выходить в интернет, к примеру, в кафе или в парке, пользуясь бесплатным Wi-Fi. Можете воспользоваться чужим компьютером или планшетом.
С другой стороны, по IP можно определить, откуда человек выходит в сеть. А если проанализировать трафик с этого адреса, то узнать и гораздо больше.
Проблема в том, что в законе о персональных данных до сих пор нет списка данных, которые являются персональными. В 152-ФЗ Дано лишь общее определение:
Персональные данные – любая информация, относящаяся к прямо или косвенно определенному или определяемому физическому лицу (субъекту персональных данных).
Таким образом, IP теоретически может относиться к конкретному человеку в определенный момент времени. Но роутер может выдать тот же IP другому человеку спустя несколько минут. Или же несколько человек используют разные IP внутри локальной сети и один внешний IP.
В общем, не все так однозначно. К тому же признать вас оператором персональных данных и доказать, что вы нарушили правила обработки информации, довольно сложно. Как и то, что вам обязательно требовалось согласие другого пользователя на получение его IP.
Что может рассказать о человеке любой IP-адрес
IP-адрес позволяет определить примерное местоположение. Почему примерное – потому что, повторимся, почти все адреса рядовых пользователей в сети динамические.
Но все же кое-что сделать можно. Например, уже упомянутый 2ip.ru покажет местонахождение пользователя на карте.
Обратите внимание: адреса на картах отличаются. Это разные районы города. Погрешность – около 20 км. Чтобы караулить у подъезда, точности явно не хватит.
Как узнать еще больше о человеке, получив IP-адрес
Чтобы связать IP и время его использования с конкретным ФИО, нужны логи сервера провайдера. Они позволят найти конкретного абонента, узнать из договора его адрес, телефон и т.д.
Чтобы получить логи сервера провайдера, нужно взломать его. Или устроиться к провайдеру на работу и воспользоваться служебным положением.
Правда, есть проблема: оба варианта описаны в УК РФ: в ст. 272 “Неправомерный доступ к компьютерной информации”. До 2 лет лишения свободы.
Если у вас действительно серьезный повод, чтобы вычислить человека по IP (например, вас шантажируют или вам угрожают), обратитесь в полицию. Это их работа за ваши налоги.
К тому же если это IP роутера или точки доступа в публичном месте (в том числе в подъезде), придется смотреть еще и видео с камер наблюдения. Или сопоставлять MAC-адреса устройств из логов со смартфонами и ПК конкретных пользователей.
Получается, что угрозы найти по IP-адресу ничего не стоят?
По большей части, да.
За хедшот или быкование в игре вас действительно вряд ли кто-то будет караулить у подъезда. Но буллинг и клевета в интернете – повод обратиться в полицию.
Если администрация сайта видит, что вы оскорбляете других пользователей, она вполне может связаться с вашим провайдером, чтобы он провел работу. Если вы заходите с рабочего компьютера, то провайдер может уведомить вашего системного администратора.
Если вы оскорбили злобного хакера, он может взломать сервер провайдера. И найти ваш адрес.
Если вы закрылись анонимайзером, VPN, прокси или чем-то еще, придется взламывать еще и их.
Теоретически это возможно. Вопрос лишь в том, насколько важно получить такие данные и сколько времени, денег и усилий человек готов на это потратить и на какой риск пойти.
Свой mapper или немного про ExpressionTrees
Сегодня мы поговорим про то, как написать свой AutoMapper. Да, мне бы очень хотелось рассказать вам об этом, но я не смогу. Дело в том, что подобные решения очень большие, имеют историю проб и ошибок, а также прошли долгий путь применения. Я лишь могу дать понимание того, как это работает, дать отправную точку для тех, кто хотел бы разобраться с самим механизмом работы «мапперов». Можно даже сказать, что мы напишем свой велосипед.
Отказ от ответственности
Я ещё раз напоминаю: мы напишем примитивный mapper. Если вам вдруг вздумается его доработать и использовать в проде — не делайте этого. Возьмите готовое решение, которое знает стек проблем этой предметной области и уже умеет их решать. Есть несколько более-менее весомых причинам писать и использовать свой вело-mapper:
Что называют словом «mapper»?
Это подсистема, которая отвечает за то, чтобы взять некий объект и преобразовать (скопировать его значения) его в другой. Типичная задача: преобразовать DTO в объект бизнес слоя. Самый примитивный mapper «бежит» по свойствам (property) источника данных и сопоставляет их со свойствами типа данных, который будет на выходе. После сопоставления происходит извлечение значений из источника и их запись в объект, который будет результатом преобразования. Где-то по пути, скорее всего, нужно будет ещё создать этот самый «результат».
Для потребителя mapper — это сервис, который предоставляет следующий интерфейс:
Подчеркиваю: это наиболее примитивный интерфейс, который, с моей точки зрения, удобен для объяснения. В реальности мы, скорее всего, будем иметь дело с более конкретным маппером (IMapper ) или с более общим фасадом (IMapper), который сам подберет конкретный mapper под заданные типы объектов входа-выхода.
Наивная реализация
Ремарка: даже наивная реализация mapper’a требует элементарных знаний в области Reflection и ExpressionTrees. Если вы ещё не прошли по ссылкам или ничего не слышали об этих технологиях — сделайте это, прочтите. Обещаю, мир уже никогда не будет прежним.
Впрочем, мы с вами пишем свой mapper. Для начала давайте получим все свойства (PropertyInfo) того типа данных, который будет на выходе (далее я буду называть его TOut). Это сделать достаточно просто: тип мы знаем, так как пишем имплементацию generic-класса, параметризированного типом TOut. Далее, используя экземпляр класса Type, мы получаем все его свойства.
При получении свойств я опускаю особенности. Например, некоторые из них могут быть без setter-функции, некоторые могут быть помечены аттрибутом как игнорируемые, некоторые могут быть со специальным доступом. Мы рассматриваем самый простой вариант.
Идём далее. Было бы неплохо уметь создавать экземпляр типа TOut, то есть того самого объекта, в который мы «мапим» входящий объект. В C# это можно сделать несколькими способами. Например, мы можем сделать так: System.Activator.CreateInstance(). Или даже просто new TOut(), но для этого вам нужно создать ограничение для TOut, чего в обобщенном интерфейсе делать не хотелось бы. Впрочем, мы с вами что-то знаем об ExpressionTrees, а значит можем сделать вот так:
Почему именно так? Потому что мы знаем, что экземпляр класса Type может дать информацию о том, какие у него есть конструкторы — это весьма удобно для случаев, когда мы решим развить свой mapper настолько, что будем передавать в конструктор какие-либо данные. Также, мы ещё немного узнали про ExpressionTrees, а именно — они позволяют налету создать и скомпилировать код, который потом можно будет многократно использовать. В данном случае это функция, которая на самом деле выглядит как () => new TOut().
Теперь нужно написать основной метод mapper’a, который будет копировать значения. Мы пойдем по самому простому пути: идём по свойствам объекта, который пришёл к нам на вход, и ищем среди свойств исходящего объекта свойство с таким же названием. Если нашли — копируем, если нет — идём дальше.
Таким образом у нас полностью сформировался класс BasicMapper. С его тестами можно ознакомиться вот тут. Обратите внимание, что источником может быть как объект какого-то конкретного типа, так и анонимный объект.
Производительность и boxing
Reflection отличная, но медленная штука. Более того, её частое использование увеличивает memory traffic, а значит нагружает GC, а значит ещё больше замедляет работу приложения. Например, только что мы использовали методы PropertyInfo.SetValue и PropertyInfo.GetValue. Метод GetValue возвращает object, в которой завернуто (boxing) некое значение. Это значит, что мы получили аллокацию на пустом месте.
Mapper’ы обычно находятся там, где нужно превратить один объект в другой… Нет, не один, а множество объектов. Например, когда мы забираем что-то из базы данных. В этом месте хотелось бы видеть нормальную производительность и не терять память на элементарной операции.
Компилируемый mapper
На самом деле, всё относительно просто: мы уже делали new с помощью Expression.New(ConstructorInfo). Наверное вы заметили, что статический метод New называется точно так же, как и оператор. Дело в том, что почти у всего синтаксиса C# есть отражение в виде статических методов класса Expression. Если чего-то нет, то это значит, что вы ищите т.н. «синтаксический сахар».
Вот несколько операций, которые мы будем использовать в нашем mapper’e:
К сожалению, код получается не очень компактный, поэтому предлагаю сразу взглянуть на имплементацию CompiledMapper. Я вынес сюда лишь узловые моменты.
Для начала мы создаем объектное представление параметра нашей функции. Так как она принимает на вход object, то и параметром будет объект типа object.
Далее мы создаем две переменные и список Expression, в который будем последовательно складывать выражения присваивания. Порядок важен, ведь именно так команды будут выполнены, когда мы вызовем скомпилированный метод. Например, мы не можем присвоить значение переменной, которая ещё не объявлена.
Далее мы точно также, как и в случае с наивной имплементацией, идём по списку свойств типов и пытаемся их сопоставить по имени. Однако, вместо того, чтобы немедленно присваивать значения — мы создаем выражения извлечения значений и присваивания значений для каждого сопоставленного свойства.
Важный момент: после того, как мы создали все операции присваивания нам нужно вернуть результат из функции. Для этого последним выражением в списке должно быть Expression, содержащее экземпляр класса, который мы создали. Я оставил комментарий рядом с этой строчкой. Почему поведение, соответствующее ключевому слову return в ExpressionTree выглядит именно так? Боюсь, что это отдельная тема. Сейчас я предлагаю это просто запомнить.
Ну и в самом конце мы должны скомпилировать все выражения, которые мы построили. Что нам тут интересно? Переменная body содержит «тело» функции. У «обычных функций» ведь есть тело, верно? Ну, которое мы заключаем в фигурные скобки. Так вот, Expression.Block — это именно оно. Так как фигурные скобки — это ещё и область видимости, то мы должны передать туда переменные, которые там будут использоваться — в нашем случае sourceInstance и outInstance.
Почему не будет boxing? Потому что скомпилированный ExpressionTree это настоящий IL и для runtime он выглядит также (почти), как и ваш код. Почему «скомпилированный mapper» работает быстрее? Снова: потому что это просто обычный IL. Кстати, скорость мы можем легко подтвердить с помощью библиотеки BenchmarkDotNet, а сам бенчмарк можно посмотреть тут.
Method | Mean | Error | StdDev | Ratio | Allocated |
---|---|---|---|---|---|
AutoMapper | 1,291.6 us | 3.3173 us | 3.1030 us | 1.00 | 312.5 KB |
Velo_BasicMapper | 11,987.0 us | 33.8389 us | 28.2570 us | 9.28 | 3437.5 KB |
Velo_CompiledMapper | 341.3 us | 2.8230 us | 2.6407 us | 0.26 | 312.5 KB |
В колонке Ratio «скомпилированный mapper» (CompiledMapper) показал очень неплохой результат, даже по сравнению с AutoMapper (он baseline, т.е. 1). Впрочем, давайте не будем радоваться: AutoMapper обладает значительно большими возможностями по сравнению с нашим велосипедом. Этой табличкой я лишь хотел показать, что ExpressionTrees значительно быстрее, чем «подход классического Reflection».
Резюме
А что mapper? Mapper — отличный пример, на котором всему этому можно научиться.
maper.info
Оптимизируйте сайт и получите больше трафика
Попробуйте полную версию Анализа сайта: найдите ошибки на главной и внутренних страницах и исправьте их с помощью советов сервиса. Ежедневный аудит и проверка позиций помогут оценить результаты.
Бесплатная версия:
Анализ только главной страницы
10 проверок в инструментах в день
Ограниченная частота проверки
Платная:
Анализ всех страниц сайта
Сравнение с конкурентами
Проверка позиций по запросам
Автоматический анализ сайта
Еженедельные отчеты на почту
Важные события
Чек-лист
Параметры домена
В истории найдено изменений за 3 года 1 месяц. Первая дата: октябрь 2018.
Хотите увидеть весь график?
Доступно на платных тарифах.
Каждый день мы будем обновлять данные о вашем сайте, чтобы вы не пропустили важные события.
Описание:
Индекс качества сайта — это показатель того, насколько полезен ваш сайт для пользователей с точки зрения Яндекса.
При расчете индекса качества учитываются размер аудитории сайта, поведенческие факторы и данные сервисов Яндекса. Значение индекса регулярно обновляется.
Если у сайта есть зеркало, то показатель неглавного зеркала сайта будет равен показателю главного.
Показатель ИКС поддомена сайта, как правило, равен показателю основного домена.
Дополнительная информация:
Статьи по теме:
Данные теста были получены 16.11.2021 19:46
Выбор пользователей 2 из 5
Популярный сайт 2 из 5
Описание:
Рядом с адресом сайта в результатах поиска Яндекса могут появляться знаки, основанные на данных о поведении пользователей. Такие знаки могут свидетельствовать об удовлетворенности пользователей и их доверии к сайту.
Популярный сайт — сайт получает этот знак, если имеет высокую посещаемость и постоянную аудиторию.
Выбор пользователей — знак получают сайты с высокой степенью вовлеченности и лояльности пользователей по данным Яндекса.
Статьи по теме:
Данные теста были получены 16.11.2021 19:46
В истории найдено изменений за 3 года 1 месяц. Первая дата: октябрь 2018.
Хотите увидеть весь график?
Доступно на платных тарифах.
Каждый день мы будем обновлять данные о вашем сайте, чтобы вы не пропустили важные события.
Описание:
Примерное количество проиндексированных страниц в выдаче Яндекса можно посмотреть через оператор site:, что мы и делаем. Он покажет результат поиска по URL сайта, но точную цифру страниц в индексе выдавать не обязан.
Точные данные Яндекс отображает в Яндекс.Вебмастере. График изменений количества находится в разделе «Индексирование сайта» — «Страницы в поиске».
Данные теста были получены 16.11.2021 19:46
В истории найдено изменений за 3 года 1 месяц. Первая дата: октябрь 2018.
Хотите увидеть весь график?
Доступно на платных тарифах.
Каждый день мы будем обновлять данные о вашем сайте, чтобы вы не пропустили важные события.
Описание:
Сколько страниц сайта Google точно проиндексировал, узнать невозможно. Поисковик не ведет базу данных по URL-адресам.
Примерное количество страниц в выдаче покажет оператор site:, на который мы ориентируемся. Число может быть искажено страницами, которые запрещены к индексу в robots.txt, но попали в выдачу из-за внешних ссылок на них.
Чуть более точное количество покажет раздел «Статус индексирования» в Google Search Console, но и эти данные могут быть искажены из-за применения фильтров.
Данные теста были получены 16.11.2021 19:46
Описание:
Примерное количество проиндексированных страниц в выдаче Яндекса можно посмотреть через оператор site:, что мы и делаем. Он покажет результат поиска по URL сайта, но точную цифру страниц в индексе выдавать не обязан.
Точные данные Яндекс отображает в Яндекс.Вебмастере. График изменений количества находится в разделе «Индексирование сайта» — «Страницы в поиске».
Данные теста были получены 16.11.2021 19:46
Описание:
Google сканирует сайты, чтобы находить зараженные ресурсы, фишинговые страницы и другие проблемы, которые ухудшают качество выдачи и пользовательский опыт. Благодаря этой информации поисковая система предупреждает пользователей о небезопасных сайтах. В случае, если сайт будет признан опасным, Google может понизить его в выдаче или удалить.
Дополнительная информация:
Данные теста были получены 16.11.2021 19:46
Описание:
Обычно заражение происходит из-за уязвимости, которая позволяет хакерам получить контроль над сайтом. Он может изменять содержание сайта или создавать новые страницы, обычно для фишинга. Хакеры могут внедрять вредоносный код, например скрипты или фреймы, которые извлекают содержимое с другого сайта для атаки компьютеров, на которых пользователи просматривают зараженный сайт.
Дополнительная информация:
Данные теста были получены 16.11.2021 19:46
С 2009 года Роскомнадзор контролирует распространение информации в интернете. Для этого ведомство в 2012 году создало реестр запрещенных сайтов, который пополняется ежедневно. Первыми под блокировку попадают сайты с запрещенным контентом. Также Роскомнадзор может заблокировать сайт за ФЗ 152 «О персональных данных».
Чтобы снять блокировку, нужно убрать материалы на сайте, из-за которых вы получили блокировку. После этого написать письмо на адрес: zapret-info@rsoc.ru.
Дополнительная информация:
Статьи по теме:
Данные теста были получены 16.11.2021 19:46
Рейтинг домена — 36 / 100
В истории найдено изменений за 1 год 9 месяцев. Первая дата: март 2020.
Хотите увидеть весь график?
Доступно на платных тарифах.
Каждый день мы будем обновлять данные о вашем сайте, чтобы вы не пропустили важные события.
Описание:
Данные теста были получены 17.11.2021 14:16
Думаю ни для кого из вас не секрет, что такое mapper и для чего он нужен. Буквально на каждом шагу в процессе работы мы сталкиваемся с теми или иными примерами маппингов (или трансформаций) данных из одного вида в другой. К ним можно отнести маппинг записей из хранилища в domain model, маппинг response удалённого сервиса в view model и уже затем в domain model и т.д. Зачастую, на границе уровня абстракции существуют входной и выходной форматы данных и именно в моменты взаимодействия абстракций такая вещь, как маппер, может показать себя во всей красе, привнося с собой существенную экономию времени и effort’ов для разработчика и, как следствие, забирая на себя долю от общей производительности системы.
Исходя из этого можно описать и MVP требования:
Что касается первого пункта, то в этом нам поможет BenchmarkDotNet и вдумчивая реализация, не лишённая и оптимизаций. Для второго же я написал простой unit test, который, в некотором роде, выступает документацией API нашего маппера:
Итого, нам потребуется реализовать лишь 2 простых метода:
Регистрация
Если метод Map в любом маппере является основным и именно на него приходится львиная доля времени выполнения, то метод Register наоборот, для каждой пары типов вызывается лишь единожды на этапе конфигурации. Именно поэтому он является отличным кандидатом для совершения всех необходимых «тяжеловесных» манипуляций: генерации оптимального плана выполнения маппинга и как следствие, дальнейшего кеширования полученных результатов.
Таким образом, его реализация должна включать:
План выполнения
В C# нам доступно не так много способов создать и проинициализировать экземпляр типа в runtime и чем выше уровень абстракции того или иного метода, тем менее оптимальным с точки зрения времени выполнения он является. Ранее я уже сталкивался с подобным выбором в другом своём небольшом проекте под названием FsContainer и потому следующие результаты не стали для меня удивительными.
Хотя Delegate, скомпилированный посредством генерации IL code налету, отрабатывает несколько быстрее, он не включает в себя код инициализации экземпляра типа. Более того, лично для меня воспроизведение IL инструкций посредством ilgen.Emit является весьма нетривиальным занятием.
Именно поэтому я остановился на реализации с использованием Expression :
Кеширование
Принимая это во внимание, можно сделать следующие заключения:
Маппинг
Внутренняя реализация метода Map должна быть предельно проста и оптимизирована ввиду того, что именно этот метод будет вызываться в 99.9% случаев. Поэтому всё, что нам необходимо сделать, это максимально быстро найти ссылку на скомпилированный ранее Delegate в кеше и вернуть результат его выполнения:
Результаты
В качестве результатов хотелось бы привести итоги финальных замеров существующих (и находящихся в актуальном состоянии) на данный момент мапперов:
Исходный код проекта доступен на github: https://github.com/FSou1/FsMapper.
Спасибо что дочитали до конца и, надеюсь, эта заметка была вам полезна. Пишите в комментариях, что на ваш взгляд ещё можно было бы оптимизировать.