Русский
Русский
English
Статистика
Реклама

Software

Вебинар Secure SDLC безопасность как фундаментальный аспект разработки

20.07.2020 16:23:27 | Автор: admin


28 июля в 11:00 (МСК) приглашаем на вебинар Digital Security, где рассмотрим процесс Secure SDLC со всех сторон.

Зарегистрироваться без лишних слов

Разработчики ПО, прямо или косвенно, влияют практически на все сферы экономики и порой кардинально меняют представление пользователя о привычном.

Круто быть разработчиком, но и ответственно: хорошая репутация в сообществе и на рынке зависит от ряда факторов. Один из важнейших безопасность выпускаемого ПО. Поэтому всё больше компаний внедряют процесс безопасной разработки и обеспечивают защищённость продукта ещё на этапе написания кода. Об этом и поговорим 28 июля с экспертами Digital Security.

В программе вебинара:

  • Какие бизнес-задачи решает Secure SDLC
  • Как строится Secure SDLC: схема проверки, инструментарий, согласование графика релизов
  • Вот такие баги ловит команда Secure SDLC: кейсы из практики Digital Security
  • Жизнь после SDLC: дальнейшее развитие APP Sec в компании

Для кого:

  • Руководители компаний-разработчиков ПО
  • Руководители отделов разработки
  • Руководители и сотрудники подразделений ИБ компаний-разработчиков

Ну, вот теперь точно зарегистрироваться

Ждём вас и ваши вопросы на вебинаре 28 июля в 11:00 (МСК).
Подробнее..

PyOpenRPA туториал. Управление WEB приложениями

16.08.2020 12:14:15 | Автор: admin

Долгожданный туториал по управлению сторонними WEB приложениями с помощью pyOpenRPA. Во 2-й части мы разберем принципы роботизированного воздействия на HTML/JS. А также своими руками сделаем небольшого, но очень показательного робота.


Этот робот будет полезен тем, для кого актуальна тема покупки/продажи недвижимости.


pyOpenRPA туториал. Управление WEB приложениями


Для тех, кто с нами впервые


pyOpenRPA это open source RPA платформа, которая в полной мере позволяет заменить топовые коммерческие RPA платформы.


Подробнее про то, чем же она полезна, можно почитать здесь.


Навигация по туториалам pyOpenRPA


Туториал сверстан в виде серии статей, в которых будут освещаться ключевые технологии, необходимые для RPA.


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


Перечень статей-туториалов (опубликованные и планируемые):



А теперь перейдем к самому туториалу.


Немного теории и терминов


[Из википедии]


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


Веб приложения стали широко использоваться в конце 1990-х начале 2000-х годов.


Ссылка на источник


Ок, с выдержкой из вики все #КрутоУмно, но от этого не легче (для тех, кто в этой теме дилетант). Продемонстрирую устройство WEB приложения на примере "Что видим мы?"/"Что видит робот?". Для этого отправимся на сайт одной известной WEB площадки по объявлениям по недвижимости


Что видим мы?


Мы видим красиво сверстанный сайт с интуитивно понятным интерфейсом, на котором можно найти интересные объявления о продаже/сдаче в аренду недвижимости.


Как мы видим WEB приложение


Что видит робот?


Робот видит огромную гипертекстовую разметку HTML с примесью алгоритмического кода JS и завернутого в каскадную таблицу стилей CSS. Увлекательно, правда? :)


Как робот видит WEB приложение


Интерпретация


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


Управлять WEB страницей можно с помощью разных технологий адресации: CSS, XPath, id, class, attribute. Мы будем взаимодействовать со страницей с помощью CSS селекторов.


(По шагам) робот своими руками


В этом туториале мы будем заниматься разработкой робота, который оперирует на одном из самых популярных порталов по объявлениям по недвижимости в РФ (тема одна из актуальных для многих).


В качестве примера поставим себе следующую задачу: Разработать робота, который будет извлекать список всех объявлений по ранее преднастроенному фильтру. Все извлеченные объявления сохранить как датасет в файл .json со следующей структурой:


{    "SearchKeyStr": "МСК_Тверской", # Ключевое слово поиска    "SearchTitleStr": "Москва, район Тверской", # Заголовок поиска    "SearchURLStr": "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&offer_type=flat&polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&room1=1&room2=1", # URL of the CIAN search [str]    "SearchDatetimeStr": "2020-08-01 09:33:00.838081", # Дата, на которую была сформирована выгрузка    "SearchItems": { # Перечень извлеченных ценовых объявлений        "https://www.cian.ru/sale/flat/219924574/:": { # URL ссылка на ценовое объявление            "TitleStr": "3-комн. кв., 31,4 м, 5/8 этаж", # Заголовок ценового объявления            "PriceFloat": 10000000.0, # Стоимость общая            "PriceSqmFloat": 133333.0, # Стоимость на 1 кв. м.            "SqMFloat": 31.4, # Кол-во кв. м.            "FloorCurrentInt": 5, # Этаж лота по объявлению            "FloorTotalInt": 8, # Этажей в доме всего            "RoomCountInt": 3 # Кол-во комнат        }    }}

Шаг 0. Подготовим проект для нового робота (развернем pyOpenRPA)


В отличии от подавляющего большинства RPA платформ, в pyOpenRPA реализован принципиально иной подход по подключению к проекту, а именно: если в них структуру проекта определяет сама RPA платформа, то в pyOpenRPA структуру проекта определяете Вы и только Вы. Это дает больше гибкости и возможности по использованию этой RPA технологии в других направлениях (использовать pyOpenRPA как обычную библиотеку Python).


Доступно несколько вариантов загрузки pyOpenRPA:


  • Вариант 1, простой. Скачать преднастроенную портативную версию с GitLab страницы проекта
  • Вариант 2, сложный. Установить pyOpenRPA в свою версию интерпретатора Python 3 (pip install pyOpenRPA)

Я рекомендую воспользоваться простым вариантом (вариант 1). Преднастроенная версия не требуется каких-либо настроек инфраструктуры. Здесь в лучших традициях pyOpenRPA реализован принцип, когда пользователь скачивает репозиторий, и у него уже все настроено из коробки пользователю остается лишь писать скрипт робота. #Enjoy :)


Шаг 1. Создать проект робота


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


Ниже приведу зависимости проекта от сторонних компонентов:


  • Selenium WebDriver
  • Google Chrome или Mozilla Firefox или Internet Explorer
  • Python 3

Если вы пошли по варианту 1 (см. шаг 0), то у Вас все эти компоненты уже будут развернуты и настроены внутри скачанного репозитория pyOpenRPA (#Удобно). Репозиторий pyOpenRPA уже содержит все необходимые portable версии требуемых программ (Google Chrome, Mozilla Firefox, Python3 32|64 и т.д.).


Вы наверняка заметили, что в pyOpenRPA используется Selenium. Этот компонент является одним из лучших отказоустойчивых компонентов по внедрению в WEB. Именно поэтому мы его и будем использовать в pyOpenRPA.


Создадим следующую структуру проекта:


  • Репозиторий pyOpenRPA > Wiki > RUS_Tutorial > WebGUI_Habr:
    • Файл "3. MonitoringCIAN_Run_64.py" скрипт робота, который мониторит WEB площадку
    • Файл "3. MonitoringCIAN_Run_64.cmd" скрипт запуска робота с 1-го клика по аналогии с .exe файлами

Ниже приведу пример "3. MonitoringCIAN_Run_64.cmd" файла:


cd %~dp0..\..\..\Sources..\Resources\WPy64-3720\python-3.7.2.amd64\python.exe "..\Wiki\RUS_Tutorial\WebGUI_Habr\3. MonitoringCIAN_Run_64.py"pause >nul

Для инициализации Selenium WebDriver воспользуемся следующей функцией:


########################### Init the Chrome web driver###########################def WebDriverInit(inWebDriverFullPath, inChromeExeFullPath, inExtensionFullPathList):    # Set full path to exe of the chrome    lWebDriverChromeOptionsInstance = webdriver.ChromeOptions()    lWebDriverChromeOptionsInstance.binary_location = inChromeExeFullPath    # Add extensions    for lExtensionItemFullPath in inExtensionFullPathList:        lWebDriverChromeOptionsInstance.add_extension (lExtensionItemFullPath)    # Run chrome instance    lWebDriverInstance = None    if inWebDriverFullPath:        # Run with specified web driver path        lWebDriverInstance = webdriver.Chrome(executable_path = inWebDriverFullPath, options=lWebDriverChromeOptionsInstance)    else:        lWebDriverInstance = webdriver.Chrome(options = lWebDriverChromeOptionsInstance)    # Return the result    return lWebDriverInstance

Шаг 2. Запустить WEB инструменты разработчика и сформировать CSS селекторы


В нашем случае WEB инструменты разработчика мы будем использовать из Google Chrome, который предустановлен в репозитории pyOpenRPA (вариант 1 из шага 0).


Откроем Google Chrome и инструменты разработчика (pyOpenRPA repo\Resources\GoogleChromePortable\App\Chrome-bin\chrome.exe, после чего Ctrl + Shift + i)
Portable Google Chrome + Dev Tools


Откроем в браузере сайт, который мы будем анализировать. Сформируем область поиска и отобразить обнаруженные ценовые предложения в виде списка.


Пример поискового запроса


Список ценовых предложений по фильтру


Для того, чтобы подобрать CSS селектор нам помогут инструменты разработчика Google Chrome. Подробнее узнать про устройство CSS селекторов можно здесь по ссылке
Для проверки правильности CSS селектора я буду делать следующую проверку в инструментах разработчика на вкладке "Console". На картинке представлен пример того, как проводится проверки правильности CSS селектора для извлечения списка ценовых предложений.


Пример проверки CSS селектора


Подберем CSS селектор для выборки списка ценовых предложений на странице.


При составлении селектора выяснилось, что в список объявлений встроены рекламные баннеры, которые не содержат информацию о ценовом предложении.


И таких видов рекламных баннеров было обнаружено несколько видов:


  • div[data-name="BannerServicePlaceInternal"]
  • div[data-name="getBannerMarkup"]
  • div[data-name="AdFoxBannerTracker"]

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


  • CSS селектор, Список ценовых предложений: div[data-name="Offers"] > div:not([data-name="BannerServicePlaceInternal"]):not([data-name="getBannerMarkup"]):not([data-name="AdFoxBannerTracker"])

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


  • CSS селектор, Заголовок: div[data-name="TopTitle"],div[data-name="Title"]
  • CSS селектор, Стоимость общая: div[data-name="Price"] > div[class="header"],div[data-name="TopPrice"] > div[class="header"]
  • CSS селектор, URL ссылка на карточку: a[class*="--header--"]

Подберем CSS селектор для извлечения кнопки на следующую страницу.


  • CSS селектор, Указатель на следующую страницу: div[data-name="Pagination"] li[class*="active"] + li a

Шаг 3. Обработать/преобразовать получаемые данные


На предыдущем шаге мы успешно подобрали все необходимые CSS селекторы. Теперь нам нужно грамотно извлечь информацию, а потом и обработать ее.


В результате обработки ценового предложения у нас будет сформирована структура следующего вида:


lOfferItemInfo = { # Item URL with https    "TitleStr": "3-комн. кв., 31,4 м, 5/8 этаж", # Offer title [str]    "PriceFloat": 10000000.0, # Price [float]    "PriceSqmFloat": 133333.0, # CALCULATED Price per square meters [float]    "SqMFloat": 31.4, # Square meters in flat [float]    "FloorCurrentInt": 5, # Current floor [int]    "FloorTotalInt": 8, # Current floor [int]    "RoomCountInt": 3  # Room couint [int]}

Для начала получим список элементов ценовых предложений.


lOfferListCSSStr = 'div[data-name="Offers"] > div:not([data-name="BannerServicePlaceInternal"]):not([data-name="getBannerMarkup"]):not([data-name="AdFoxBannerTracker"])'lOfferList = inWebDriver.find_elements_by_css_selector(css_selector=lOfferListCSSStr)

Далее циклическая обработка каждого ценового предложения.


for lOfferItem in lOfferList:

Извлечем параметры из WEB страницы: Заголовок, Стоимость общая, URL на карточку.


lTitleStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name="TopTitle"],div[data-name="Title"]').text # Extract title textlPriceStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name="Price"]  > div[class*="header"],div[data-name="TopPrice"] > div[class*="header"]').text # Extract total pricelURLStr = lOfferItem.find_element_by_css_selector(css_selector='a[class*="--header--"]').get_attribute("href") # Extract offer URLlOfferItemInfo["TitleStr"] = lTitleStr # set the titlelPriceStr = lPriceStr.replace(" ","").replace("","") # Remove some extra symbolslOfferItemInfo["PriceFloat"] = round(float(lPriceStr),2) # Convert price to the float type

Извлечем недостающие параметры алгоритмическим путем.


  • Если в заголовке содержится слово "Апартаменты"


    lREResult = re.search(r".*, (\d*,?\d*) м, (\d*)/(\d*) эта.", lTitleStr)  # run the relOfferItemInfo["RoomCountInt"] = 1 # Room countlSqmStr = lREResult.group(1)lSqmStr= lSqmStr.replace(",",".")lOfferItemInfo["SqMFloat"] = round(float(lSqmStr),2) # sqm countlOfferItemInfo["FloorCurrentInt"] = int(lREResult.group(2)) # Floor currentlOfferItemInfo["FloorTotalInt"] = int(lREResult.group(3)) # Floor totallOfferItemInfo["PriceSqmFloat"] = round(lOfferItemInfo["PriceFloat"] / lOfferItemInfo["SqMFloat"],2) # Sqm per M
    

  • Если в заголовке не содержится слово "Апартаменты"


    lREResult = re.search(r".*(\d)-комн. .*, (\d*,?\d*) м, (\d*)/(\d*) эта.", lTitleStr) # run the relOfferItemInfo["RoomCountInt"] = int(lREResult.group(1)) # Room countlSqmStr = lREResult.group(2)lSqmStr= lSqmStr.replace(",",".")lOfferItemInfo["SqMFloat"] = round(float(lSqmStr),2) # sqm countlOfferItemInfo["FloorCurrentInt"] = int(lREResult.group(3)) # Floor currentlOfferItemInfo["FloorTotalInt"] = int(lREResult.group(4)) # Floor totallOfferItemInfo["PriceSqmFloat"] = round(lOfferItemInfo["PriceFloat"] / lOfferItemInfo["SqMFloat"],2) # Sqm per M
    


В примере выше применяется магия регулярных выражений


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


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


Выше (на шаге 2) мы уже находили CSS селектор указателя на следующую страницу. Нам нужно выполнить действие клика .click() по этому элементу.
Но при тестировании выяснилось, что функция .click от Selenium отрабатывает некорректно для этой страницы (не происходит переключение). В связи с этим у нас есть уникальная возможность использовать функциональность JavaScript на самой странице через Selenium. А уже из JavaScript выяснилось, что функция нажатия по указателю страницы отрабатывает корректно. Для этого выполним следующую команду:


inWebDriver.execute_script("""document.querySelector('div[data-name="Pagination"] li[class*="active"] + li a').click()""")

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


# wait while preloader is activelDoWaitBool = Truewhile lDoWaitBool:    lPreloaderCSS = inWebDriver.find_elements_by_css_selector(css_selector='div[class*="--preloadOverlay--"]') # So hard to catch the element :)    if len(lPreloaderCSS)>0: time.sleep(0.5) # preloader is here - wait    else: lDoWaitBool = False # Stop wait if preloader is dissappear

Итоговую структуру сохраним в .json файл.


# Check dir - create if not existsif not os.path.exists(os.path.join('Datasets',lResult['SearchKeyStr'])):    os.makedirs(os.path.join('Datasets',lResult['SearchKeyStr']))# Save result in filelFile = open(f"{os.path.join('Datasets',lResult['SearchKeyStr'],lDatetimeNowStr.replace(' ','_').replace('-','_').replace(':','_').replace('.','_'))}.json","w",encoding="utf-8")lFile.write(json.dumps(lResult))lFile.close()

Шаг 4. Обработка нештатных ситуаций


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


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

Но роботы не боятся таких проблем (на то они и роботы :) ).


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


  • Зависает ползунок загрузки при переключении на сл. страницу


    # wait while preloader is active. If timeout - retry all joblTimeFromFLoat = time.time() # get current time in float (seconds)lDoWaitBool = Truewhile lDoWaitBool:lPreloaderCSS = inWebDriver.find_elements_by_css_selector(css_selector='div[class*="--preloadOverlay--"]')if len(lPreloaderCSS)>0: time.sleep(0.5) # preloader is here - waitelse: lDoWaitBool = False # Stop wait if preloader is dissappearif (time.time() - lTimeFromFLoat) > 15: # check if timeout is more than 15 seconds    lRetryJobBool = True # Loading error on page - do break, then retry the job    if inLogger: inLogger.warning(f"Ожидание загрузки страницы более {15} с., Робот повторит задание сначала")    break # break the loopif lRetryJobBool == True: # break the loop if RetryJobBool is truebreak
    

  • При переключении на следующую страницу открывается совсем не следующая страница (иногда, но случалось :) )


    lPageNumberInt = int(inWebDriver.find_element_by_css_selector(css_selector='li[class*="--active--"] span').text) # Get the current page int from web and check with iterator (if not equal - retry all job)if lPageNumberInt == lPageCounterInt:... Код робота ...else:lRetryJobBool = Trueif inLogger: inLogger.warning(    f"Следующая страница по списку не была загружена. Была загружена страница: {lPageNumberInt}, Ожидалась страница: {lPageCounterInt}")
    


Шаг 5. Консолидировать код в проекте робота


Соберем все блоки воедино.


Получим следующий пакет (открыть на GitLab):


# Init Chrome web driver with extensions (if applicable)# Import sectionfrom selenium import webdriverimport timeimport re # Regexp to extract info from stringimport jsonimport datetimeimport osimport reimport copyimport logging# Store structure (.json)"""{    "SearchKeyStr": "МСК_Тверской",    "SearchTitleStr": "Москва, район Тверской", # Title of the search [str]    "SearchURLStr": "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&offer_type=flat&polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&room1=1&room2=1", # URL of the CIAN search [str]    "SearchDatetimeStr": "2020-08-01 09:33:00.838081", # Date of data extraction,  [str]    "SearchItems": {        "https://www.cian.ru/sale/flat/219924574/:": { # Item URL with https            "TitleStr": "3-комн. кв., 31,4 м, 5/8 этаж", # Offer title [str]            "PriceFloat": 10000000.0, # Price [float]            "PriceSqmFloat": 133333.0, # CALCULATED Price per square meters [float]            "SqMFloat": 31.4, # Square meters in flat [float]            "FloorCurrentInt": 5, # Current floor [int]            "FloorTotalInt": 8, # Current floor [int]            "RoomCountInt": 3 # Room couint [int]        }    }}"""########################### Init the Chrome web driver###########################gChromeExeFullPath = r'..\Resources\GoogleChromePortable\App\Chrome-bin\chrome.exe'gExtensionFullPathList = []gWebDriverFullPath = r'..\Resources\SeleniumWebDrivers\Chrome\chromedriver_win32 v84.0.4147.30\chromedriver.exe'def WebDriverInit(inWebDriverFullPath, inChromeExeFullPath, inExtensionFullPathList):    # Set full path to exe of the chrome    lWebDriverChromeOptionsInstance = webdriver.ChromeOptions()    lWebDriverChromeOptionsInstance.binary_location = inChromeExeFullPath    # Add extensions    for lExtensionItemFullPath in inExtensionFullPathList:        lWebDriverChromeOptionsInstance.add_extension (lExtensionItemFullPath)    # Run chrome instance    lWebDriverInstance = None    if inWebDriverFullPath:        # Run with specified web driver path        lWebDriverInstance = webdriver.Chrome(executable_path = inWebDriverFullPath, options=lWebDriverChromeOptionsInstance)    else:        lWebDriverInstance = webdriver.Chrome(options = lWebDriverChromeOptionsInstance)    # Return the result    return lWebDriverInstancefrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# def to extract list of offers from one jobdef OffersByJobExtractDict(inLogger, inWebDriver, inJob):    # BUG 0 - if timeout - retry the job +    # BUG 1 - do mouse scroll to to emulate user activity - cian can hold the robot    # BUG 2 - check the page to retry job offer if page is not next +    # BUG 3 - RE fall on Апартаменты-студия, 85,6 м, 4/8 этаж +    lRetryJobBool = True # Init flag if some error is raised - retry    while lRetryJobBool:        lRetryJobBool = False  # Set false until some another action will appear        lResult = copy.deepcopy(inJob) # do copy the structure        lFilterURLStr = lResult["SearchURLStr"]        inWebDriver.get(lFilterURLStr) # Open the URL        lDatetimeNowStr = str(datetime.datetime.now())        lResult.update({            "SearchDatetimeStr": lDatetimeNowStr, # Date of data extraction,  [str]            "SearchItems": {} # prepare the result        })        # Get List of the page        lNextPageItemCSS = 'div[data-name="Pagination"] li[class*="active"] + li a'        lNextPageItem = inWebDriver.find_element_by_css_selector(lNextPageItemCSS)        lPageCounterInt = 1 # Init the page counter        while lNextPageItem:            lPageNumberInt = int(inWebDriver.find_element_by_css_selector(css_selector='li[class*="--active--"] span').text) # Get the current page int from web and check with iterator (if not equal - retry all job)            if lPageNumberInt == lPageCounterInt:                lOfferListCSSStr = 'div[data-name="Offers"] > div:not([data-name="BannerServicePlaceInternal"]):not([data-name="getBannerMarkup"]):not([data-name="AdFoxBannerTracker"])'                lOfferList = inWebDriver.find_elements_by_css_selector(css_selector=lOfferListCSSStr)                for lOfferItem in lOfferList: # Processing the item, extract info                    lOfferItemInfo = { # Item URL with https                        "TitleStr": "3-комн. кв., 31,4 м, 5/8 этаж", # Offer title [str]                        "PriceFloat": 10000000.0, # Price [float]                        "PriceSqmFloat": 133333.0, # CALCULATED Price per square meters [float]                        "SqMFloat": 31.4, # Square meters in flat [float]                        "FloorCurrentInt": 5, # Current floor [int]                        "FloorTotalInt": 8, # Current floor [int]                        "RoomCountInt": 3  # Room couint [int]                    }                    lTitleStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name="TopTitle"],div[data-name="Title"]').text # Extract title text                    if inLogger: inLogger.info(f"Старт обработки предложения: {lTitleStr}")                    lPriceStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name="Price"]  > div[class*="header"],div[data-name="TopPrice"] > div[class*="header"]').text # Extract total price                    lURLStr = lOfferItem.find_element_by_css_selector(css_selector='a[class*="--header--"]').get_attribute("href") # Extract offer URL                    lOfferItemInfo["TitleStr"] = lTitleStr # set the title                    lPriceStr = lPriceStr.replace(" ","").replace("","") # Remove some extra symbols                    lOfferItemInfo["PriceFloat"] = round(float(lPriceStr),2) # Convert price to the float type                    #Check if Апартаменты                    if "АПАРТАМЕНТ" in lTitleStr.upper():                        lREResult = re.search(r".*, (\d*,?\d*) м, (\d*)/(\d*) эта.", lTitleStr)  # run the re                        lOfferItemInfo["RoomCountInt"] = 1 # Room count                        lSqmStr = lREResult.group(1)                        lSqmStr= lSqmStr.replace(",",".")                        lOfferItemInfo["SqMFloat"] = round(float(lSqmStr),2) # sqm count                        lOfferItemInfo["FloorCurrentInt"] = int(lREResult.group(2)) # Floor current                        lOfferItemInfo["FloorTotalInt"] = int(lREResult.group(3)) # Floor total                        lOfferItemInfo["PriceSqmFloat"] = round(lOfferItemInfo["PriceFloat"] / lOfferItemInfo["SqMFloat"],2) # Sqm per M                    else:                        lREResult = re.search(r".*(\d)-комн. .*, (\d*,?\d*) м, (\d*)/(\d*) эта.", lTitleStr) # run the re                        lOfferItemInfo["RoomCountInt"] = int(lREResult.group(1)) # Room count                        lSqmStr = lREResult.group(2)                        lSqmStr= lSqmStr.replace(",",".")                        lOfferItemInfo["SqMFloat"] = round(float(lSqmStr),2) # sqm count                        lOfferItemInfo["FloorCurrentInt"] = int(lREResult.group(3)) # Floor current                        lOfferItemInfo["FloorTotalInt"] = int(lREResult.group(4)) # Floor total                        lOfferItemInfo["PriceSqmFloat"] = round(lOfferItemInfo["PriceFloat"] / lOfferItemInfo["SqMFloat"],2) # Sqm per M                    lResult['SearchItems'][lURLStr] = lOfferItemInfo # Set item in result dict                # Click next page item                lNextPageItem = None                lNextPageList = inWebDriver.find_elements_by_css_selector(lNextPageItemCSS)                if len(lNextPageList)>0:                    lNextPageItem = lNextPageList[0]                    try:                        #lNextPageItem = WebDriverWait(lWebDriver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[data-name="Pagination"]')))                        #lNextPageItem.click()                        inWebDriver.execute_script("""document.querySelector('div[data-name="Pagination"] li[class*="active"] + li a').click()""")                    except Exception as e:                        print(e)                    time.sleep(0.5) # some init operations                    # wait while preloader is active. If timeout - retry all job                    lTimeFromFLoat = time.time() # get current time in float (seconds)                    lDoWaitBool = True                    while lDoWaitBool:                        lPreloaderCSS = inWebDriver.find_elements_by_css_selector(css_selector='div[class*="--preloadOverlay--"]')                        if len(lPreloaderCSS)>0: time.sleep(0.5) # preloader is here - wait                        else: lDoWaitBool = False # Stop wait if preloader is dissappear                        if (time.time() - lTimeFromFLoat) > 15: # check if timeout is more than 15 seconds                            lRetryJobBool = True # Loading error on page - do break, then retry the job                            if inLogger: inLogger.warning(f"Ожидание загрузки страницы более {15} с., Робот повторит задание сначала")                            break # break the loop                    if lRetryJobBool == True: # break the loop if RetryJobBool is true                        break                lPageCounterInt = lPageCounterInt + 1 # Increment the page counter            else:                lRetryJobBool = True                if inLogger: inLogger.warning(                    f"Следующая страница по списку не была загружена. Была загружена страница: {lPageNumberInt}, Ожидалась страница: {lPageCounterInt}")        if lRetryJobBool == False:  # break the loop if RetryJobBool is true            # Check dir - create if not exists            if not os.path.exists(os.path.join('Datasets',lResult['SearchKeyStr'])):                os.makedirs(os.path.join('Datasets',lResult['SearchKeyStr']))            # Save result in file            lFile = open(f"{os.path.join('Datasets',lResult['SearchKeyStr'],lDatetimeNowStr.replace(' ','_').replace('-','_').replace(':','_').replace('.','_'))}.json","w",encoding="utf-8")            lFile.write(json.dumps(lResult))            lFile.close()# Инициализировать Google Chrome with selenium web driverlWebDriver = WebDriverInit(inWebDriverFullPath = gWebDriverFullPath, inChromeExeFullPath = gChromeExeFullPath, inExtensionFullPathList = gExtensionFullPathList)lFilterURLStr = "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&offer_type=flat&polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&room1=1&room2=1"lJobItem = {    "SearchKeyStr": "МСК_Тверской",    "SearchTitleStr": "Москва, район Тверской",  # Title of the search [str]    "SearchURLStr": lFilterURLStr,    # URL of the CIAN search [str]}OffersByJobExtractDict(inLogger = logging, inWebDriver = lWebDriver, inJob = lJobItem)

Подведем итоги


Уважаемые роботизаторы.


Мы успешно преодолели вторую серию туториалов по созданию роботов в WEB приложениях с помощью open source pyOpenRPA. Готовый проект робота Вы можете найти в репозитории pyOpenRPA по ссылочке.
В нашем аресенале уже имеются изученные технологии упраления Desktop и WEB приложениями. В следующей статье-туториале мы остановимся на особенностях роботизированного управления мышью и клавиатурой.


Пишите комменты, внедряйте бесплатных роботов, будьте счастливы :)


До скорых публикаций!

Подробнее..

Зона доступа 30 способов, которые позволят разблокировать любой смартфон. Часть 1

21.09.2020 16:09:27 | Автор: admin


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

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


Итак, самым распространенным методом ограничения доступа к пользовательской информации, содержащейся в устройстве, является блокировка экрана мобильного устройства. Когда подобное устройство попадает в криминалистическую лабораторию, работа с ним бывает затруднена, так как для такого устройства невозможно активировать режим отладки по USB (для Android-устройств), невозможно подтвердить разрешение на взаимодействие компьютера эксперта с этим устройством (для мобильных устройств фирмы Apple) и, как следствие, невозможно получить доступ к данным, находящимся в памяти устройства.

Насколько обычная блокировка экрана мобильного устройства препятствует извлечению специалистами данных из него, говорит тот факт, что ФБР США заплатило крупную сумму за разблокировку iPhone террориста Сайеда Фарука, одного из участников теракта в калифорнийском городе Сан-Бернардино [1].

Методы разблокировки экрана мобильного устройства


Как правило, для блокировки экрана мобильного устройства используется:

  1. Символьный пароль
  2. Графический пароль

Также для разблокировки экрана ряда мобильных устройств могут использоваться методы технологии SmartBlock:

  1. Разблокировка по распознаванию отпечатка пальца
  2. Разблокировка по распознаванию лица (технология FaceID)
  3. Разблокировка устройства по распознаванию радужной оболочки глаза

Социальные методы разблокировки мобильного устройства


Кроме чисто технических, существуют и иные способы узнать или преодолеть PIN-код, или графический код (паттерн) блокировки экрана. В отдельных случаях социальные методы могут быть более эффективными, чем технические решения, и помочь в разблокировке устройств, перед которыми пасуют существующие технические разработки.

В данном разделе будут описаны методы разблокировки экрана мобильного устройства, которые не требуют (или требуют лишь ограниченного, частичного) применения технических средств.
Для совершения социальных атак нужно как можно глубже изучить психологию владельца заблокированного устройства, понять, по каким принципам он генерирует и сохраняет пароли или графические паттерны. Также исследователю понадобится капля везения.

При использовании методов, связанных с подбором пароля, следует учитывать, что:

  • при введении десяти неправильных паролей на мобильных устройствах компании Apple данные пользователя могут быть стерты. Это зависит от настроек безопасности, которые установил пользователь;
  • на мобильных устройствах под управлением операционной системы Android может быть использована технология Root of Trust, которая приведет к тому, что после введения 30 неправильных паролей данные пользователя буду либо недоступны, либо стерты.

Способ 1: cпроси пароль


Это покажется странным, но пароль разблокировки можно узнать, просто спросив у владельца устройства. Как показывает статистика, примерно 70% владельцев мобильных устройств охотно сообщают пароль. Особенно, если это сократит время исследования и, соответственно, владелец быстрее получит свое устройство назад. Если нет возможности спросить пароль у владельца (например, владелец устройства умер) или он отказывается его раскрыть пароль можно узнать у его близких родственников. Как правило, родственники знают пароль или могут подсказать возможные варианты.

Рекомендация по защите: Пароль от вашего телефона это универсальный ключ от всех данных, в том числе и платежных. Говорить, передавать, писать его в мессенджерах плохая идея.

Способ 2: подгляди пароль


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

Вариантом данного метода является использование записей камер видеонаблюдения, на которых запечатлен владелец, разблокирующий устройство с помощью графического пароля [2]. Описанный в работе Cracking Android Pattern Lock in Five Attempts [2] алгоритм, путем анализа видеозаписей, позволяет предположить варианты графического пароля и разблокировать устройство за несколько попыток (как правило, для этого нужно сделать не более пяти попыток). Как утверждают авторы, чем сложнее графический пароль, тем проще его подобрать.

Рекомендация по защите: Использование графического ключа не лучшая идея. Цифро-буквенный пароль подглядеть очень сложно.

Способ 3: найди пароль


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


Рекомендация по защите: не надо вести блокнотик с паролями. Это плохая идея, кроме случая, когда все эти пароли заведомо ложные, чтобы уменьшить количество попыток разблокировки.

Способ 4: отпечатки пальцев (Smudge attack)


Этот метод позволяет выявить потожировые следы рук на дисплее устройства. Увидеть их можно, обработав экран устройства светлым дактилоскопическим порошком (вместо специального криминалистического порошка можно использовать детскую присыпку или иной химически неактивный мелкодисперсный порошок белого или светло-серого цвета) или посмотрев на экран устройства в косопадающих лучах света. Анализируя взаиморасположение следов рук и имея дополнительную информацию о владельце устройства (например, зная его год рождения), можно попробовать подобрать текстовый или графический пароль. Так выглядит потожировое наслоение на дисплее смартфона в виде стилизованной буквы Z:


Рекомендация по защите: Как мы и говорили, графический пароль это не лучшая идея, как и стекла с плохим олеофобным покрытием.

Способ 5: искусственный палец


Если устройство может быть разблокировано по отпечатку пальца, а исследователь имеет образцы отпечатков рук владельца устройства, то на 3D-принтере можно изготовить трехмерную копию отпечатка пальца владельца и использовать ее для разблокировки устройства [3]:


Для более полной имитации пальца живого человека например, когда датчик отпечатка пальца смартфона еще детектирует тепло 3D-модель надевается (прислоняется) к пальцу живого человека.

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

Исследователю следует помнить о поколениях сенсоров, примененных в различных моделях мобильных устройств. Старые модели сенсоров могут срабатывать практически на прикосновение любого пальца, не обязательно принадлежащего владельцу устройства. Современные ультразвуковые сенсоры, наоборот, сканируют весьма глубоко и четко. Кроме того, ряд современных подэкранных сенсоров это просто CMOS-фотокамеры, которые не могут сканировать глубину изображения, из-за чего обмануть их намного проще.

Рекомендация по защите: Если палец, то только ультразвуковой сенсор. Но не забывайте, что приложить палец против вашей воли куда проще, чем лицо.

Способ 6: рывок (Mug attack)


Данный метод описан британскими полицейскими [4]. Он заключается в скрытой слежке за подозреваемым. В момент, когда подозреваемый разблокирует свой телефон, агент в штатском вырывает его из рук владельца и не дает устройству заблокироваться вновь до момента передачи его экспертам.

Рекомендация по защите: Думаю, если против вас собираются применять такие меры, то дело плохо. Но тут нужно понимать, что случайная блокировка обесценивает этот способ. А, например, многократное нажатие кнопки блокировки на iPhone запускает режим SOS, который в дополнение ко всему выключает FaceID и включает требование кода пароля.

Способ 7: ошибки в алгоритмах управления устройством


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

Примером подхода к разблокировке мобильных устройств, выпущенных ранее 2016 года, является разряд батареи. При низком заряде устройство разблокируется и предложит изменить настройки питания. При этом надо быстро перейти на страницу с настройками безопасности и отключить блокировку экрана [5].

Рекомендация по защите: не забывайте своевременно обновлять ОС своего устройства, а если оно уже не поддерживается менять смартфон.

Способ 8: уязвимости в сторонних программах


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

Примером подобной уязвимости может быть похищение данных из iPhone Джеффа Безоса, основного владельца Amazon. Уязвимость в мессенджере WhatsApp, проэксплуатированная неизвестными, привела к краже конфиденциальных данных, находившихся в памяти устройства [6].

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

Рекомендация по защите: Нужно обновлять не только ОС, но и прикладные программы, которыми вы пользуетесь.

Способ 9: корпоративный телефон


Корпоративные мобильные устройства могут быть разблокированы системными администраторами компаний. Так, например, корпоративные устройства Windows Phone привязываются к аккаунту Microsoft Exchange компании и могут быть разблокированы ее администраторами. Для корпоративных устройств Apple существует сервис Mobile Device Management, аналогичный Microsoft Exchange. Его администраторы также могут разблокировать корпоративное iOS-устройство. Кроме того, корпоративные мобильные устройства можно скоммутировать только с определенными компьютерами, указанными администратором в настройках мобильного устройства. Поэтому без взаимодействия с системными администраторами компании такое устройство невозможно подключить к компьютеру исследователя (или программно-аппаратному комплексу для криминалистического извлечения данных).

Рекомендация по защите: MDM это и зло, и добро с точки зрения защиты. MDM-администратор всегда может удаленно сбросить устройство. В любом случае, не стоит хранить чувствительные личные данные на корпоративном устройстве.

Способ 10: информация из сенсоров


Анализируя информацию, получаемую от сенсоров устройства, можно подобрать пароль к устройству с помощью специального алгоритма. Адам Дж. Авив продемонстрировал возможность подобных атак, используя данные, полученные акселерометром смартфона. В ходе исследований ученому удалось правильно определить символьный пароль в 43% случаях, а графический пароль в 73% [7].

Рекомендация по защите: Внимательно следите за тем, каким приложениям вы выдаете разрешение на отслеживание различных сенсоров.

Способ 11: разблокировка по лицу


Как и в случае с отпечатком пальца, успех разблокировки устройства с использованием технологии FaceID зависит от того, какие сенсоры и какой математический аппарат используются в конкретном мобильном устройстве. Так, в работе Gezichtsherkenning op smartphone niet altijd veilig [8] исследователи показали, что часть исследуемых смартфонов удалось разблокировать, просто продемонстрировав камере смартфона фотографию владельца. Это возможно, когда для разблокировки используется лишь одна фронтальная камера, которая не имеет возможности сканировать данные о глубине изображения. Компания Samsung после ряда громких публикаций и роликов в YouTube была вынуждена добавить предупреждение в прошивку своих смартфонов. Face Unlock Samsung:


Более продвинутые модели смартфонов можно разблокировать, используя маску или самообучение устройства. Например, в iPhone X используется специальная технология TrueDepth [9]: проектор устройства, с помощью двух камер и инфракрасного излучателя, проецирует на лицо владельца сетку, состоящую из более чем 30 000 точек. Такое устройство можно разблокировать с помощью маски, контуры которой имитируют контуры лица владельца. Маска для разблокировки iPhone [10]:


Так как подобная система очень сложна и не работает в идеальных условиях (происходит естественное старение владельца, изменение конфигурации лица из-за выражения эмоций, усталости, состояния здоровья и т.п.), она вынуждена постоянно самообучаться. Поэтому если разблокированное устройство подержит перед собой другой человек его лицо будет запомнено как лицо владельца устройства и в дальнейшем он сможет разблокировать смартфон, используя технологию FaceID.

Рекомендация по защите: не используйте разблокировку по фото только системы с полноценными сканерами лица (FaceID у Apple и аналоги на Android-аппаратах).

Основная рекомендация не смотреть в камеру, достаточно отвести взгляд. Если даже зажмурить один глаз шанс разблокировать сильно падает, как и при наличии рук на лице. Кроме того, для разблокировки по лицу (FaceID) дается всего 5 попыток, после чего потребуется ввод кода-пароля.

Способ 12: использование утечек


Базы утекших паролей прекрасный способ понять психологию владельца устройства (при условии, что исследователь располагает информацией об адресах электронной почты владельца устройства). В приведенном примере поиск по адресу электронной почты принес два похожих пароля, которые использовал владелец. Можно предположить, что пароль 21454162 или его производные (например, 2145 или 4162) могли использоваться в качестве кода блокировки мобильного устройства. (Поиск по адресу электронной почты владельца в базах утечек показывает, какие пароли владелец мог использовать, в том числе для блокировки своего мобильного устройства).


Рекомендация по защите: действуйте превентивно, отслеживайте данные об утечках и своевременно меняйте пароли замеченные в утечках!

Способ 13: типовые пароли блокировки устройств


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

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


Как видно на скриншоте части рабочего окна программы UFED Physical Analyzer, устройство заблокировано достаточно необычным PIN-кодом fgkl.

Не стоит пренебрегать иными устройствами пользователя. Например, анализируя пароли, сохраненные в кэше веб-браузера компьютера владельца мобильного устройства, можно понять принципы генерации паролей, которых придерживался владелец. Просмотреть сохраненные пароли на компьютере можно с помощью утилиты компании NirSoft [11].

Также на компьютере (ноутбуке) владельца мобильного устройства могут быть Lockdown-файлы, которые могут помочь получить доступ к заблокированному мобильному устройству фирмы Apple. Об этом методе будет рассказано далее.

Рекомендация по защите: используйте везде разные, уникальные пароли.

Способ 14: типовые PIN-коды


Как было отмечено ранее, пользователи часто используют типовые пароли: номера телефонов, банковских карт, PIN-коды. Подобную информацию можно использовать, чтобы разблокировать предоставленное устройство.

Если ничего не помогает можно воспользоваться следующей информацией: исследователи провели анализ и нашли наиболее популярные PIN-коды (приведенные PIN-коды покрывают 26,83% всех паролей) [12]:

PIN Частота, %
1234 10,713
1111 6,016
0000 1,881
1212 1,197
7777 0,745
1004 0,616
2000 0,613
4444 0,526
2222 0,516
6969 0,512
9999 0,451
3333 0,419
5555 0,395
6666 0,391
1122 0,366
1313 0,304
8888 0,303
4321 0,293
2001 0,290
1010 0,285
Применение данного перечня PIN-кодов к заблокированному устройству позволит разблокировать его с вероятностью ~26%.

Рекомендация по защите: проверьте свой PIN-код по таблице выше и, даже если он не совпал, все равно смените его, потому что 4 цифры это слишком мало по меркам 2020 года.

Способ 15: типовые графические пароли


Как было описано выше, имея данные камер видеонаблюдения, на которых владелец устройства пробует его разблокировать, можно подобрать паттерн разблокировки с пяти попыток. Кроме того, точно так же, как существуют типовые PIN-коды, существуют и типовые паттерны, которые можно использовать для разблокировки заблокированных мобильных устройств [13, 14].

Простые паттерны [14]:


Паттерны средней сложности [14]:


Сложные паттерны [14]:



Список самых популярных графических паттернов по версии исследователя Jeremy Kirby [15].
3>2>5>8>7
1>4>5>6>9
1>4>7>8>9
3>2>1>4>5>6>9>8>7
1>4>7>8>9>6>3
1>2>3>5>7>8>9
3>5>6>8
1>5>4>2
2>6>5>3
4>8>7>5
5>9>8>6
7>4>1>2>3>5>9
1>4>7>5>3>6>9
1>2>3>5>7
3>2>1>4>7>8>9
3>2>1>4>7>8>9>6>5
3>2>1>5>9>8>7
1>4>7>5>9>6>3
7>4>1>5>9>6>3
3>6>9>5>1>4>7
7>4>1>5>3>6>9
5>6>3>2>1>4>7>8>9
5>8>9>6>3>2>1>4>7
7>4>1>2>3>6>9
1>4>8>6>3
1>5>4>6
2>4>1>5
7>4>1>2>3>6>5

На некоторых мобильных устройствах, помимо графического кода, может быть установлен дополнительный PIN-код. В этом случае, если не удается подобрать графический код, исследователь может кликнуть на кнопку Доп.PIN-код (дополнительный PIN-код) после ввода неправильного графического кода и попытаться подобрать дополнительный PIN-код.

Рекомендация по защите: лучше вообще не использовать графические ключи.

Способ 16: буквенно-цифровые пароли


Если на устройстве можно использовать буквенно-цифровой пароль, то в качестве кода блокировки владелец мог использовать следующие популярные пароли [16]:

  • 123456
  • password
  • 123456789
  • 12345678
  • 12345
  • 111111
  • 1234567
  • sunshine
  • qwerty
  • iloveyou
  • princess
  • admin
  • welcome
  • 666666
  • abc123
  • football
  • 123123
  • monkey
  • 654321
  • !@#$%^&*
  • charlie
  • aa123456
  • donald
  • password1
  • qwerty123

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

Способ 17: облачные или локальные хранилища


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

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

В облачных хранилищах Google и Apple могут сохраняться не только данные из устройств, но и сохраненные устройством пароли. Извлечение этих паролей может помочь в подборе кода блокировки мобильного устройства.

Из Keychain, сохраненного в iCloud, можно извлечь пароль на резервную копию устройства, установленный владельцем, который, с высокой степенью вероятности, будет совпадать с PIN-кодом блокировки экрана.

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

Например, после террористического акта в Пенсоконе копии данных, хранящихся в iCloud, были переданы ФБР. Из заявления Apple:

В течение нескольких часов, после первого запроса ФБР, 6 декабря 2019 года, мы представили широкий спектр информации, связанной с расследованием. С 7 по 14 декабря мы получили шесть дополнительных юридических запросов и в ответ предоставили информацию, включая резервные копии iCloud, информацию об аккаунте и транзакциях для нескольких учетных записей.

Мы отвечали на каждый запрос незамедлительно, зачастую в течение нескольких часов, обмениваясь информацией с офисами ФБР в Джексонвилле, Пенсаколе и Нью-Йорке. По запросам следствия было получено много гигабайт информации, которую мы передали следователям. [17, 18, 19]

Рекомендация по защите: все, что вы отдаете в облако в незашифрованном виде, может и будет использовано против вас.

Способ 18: Google-аккаунт


Данный способ подходит для снятия графического пароля, блокирующего экран мобильного устройства под управлением операционной системы Android. Для использования этого метода нужно знать имя пользователя и пароль от Google-аккаунта владельца устройства. Второе условие: устройство должно быть подключено к интернету.

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

В связи с разнообразием аппаратных решений, операционных систем Android и дополнительных настроек безопасности данный метод применим только для ряда устройств.

Если у исследователя нет пароля к Google-аккаунту владельца устройства его можно попробовать восстановить, используя стандартные методы восстановления паролей от подобных аккаунтов.

Если устройство в момент исследования не подключено к интернету (например, SIM-карта заблокирована или на ней недостаточно денег), то подобное устройство можно подключить к Wi-Fi по следующей инструкции:

  • нажать иконку Экстренный вызов
  • набрать *#*#7378423#*#*
  • выбрать Service Test Wlan
  • осуществить соединение с доступной Wi-Fi-сетью [5]

Рекомендация по защите: не забывайте использовать двухфакторную авторизацию везде где только можно, и в этом случае лучше с привязкой к приложению, а не коду по SMS.

Способ 19: гостевой аккаунт


На мобильных устройствах под управлением операционной системы Android 5 и выше может быть несколько аккаунтов. Для доступа к данным дополнительного аккаунта может отсутствовать блокировка PIN-кодом или графическим кодом. Для переключения нужно кликнуть на иконку аккаунта в правом верхнем углу и выбрать другой аккаунт:


Для дополнительного аккаунта доступ к некоторым данным или приложениям может быть ограничен.

Рекомендация по защите: тут важно обновлять ОС. В современных версиях Android (9 и выше с патчами безопасностями от июля 2020 года) учетная запись гостя, как правило, не дает никаких возможностей.

Способ 20: специализированные сервисы


Компании, занимающиеся разработкой специализированных криминалистических программ, в том числе предлагают услуги по разблокировке мобильных устройств и извлечению данных из них [20, 21]. Возможности подобных сервисов просто фантастические. С помощью них можно разблокировать топовые модели Android- и iOS-устройств, а также устройства, находящиеся в режиме восстановления (в которое устройство переходит после превышения количества попыток неправильного ввода пароля). Недостатком данного метода является высокая стоимость.

Фрагмент веб-страницы сайта компании Cellebrite, где описывается, из каких устройств они могут извлечь данные. Устройство может быть разблокировано в лаборатории разработчика (Cellebrite Advanced Service (CAS)) [20]:


Для подобной услуги устройство должно быть предоставлено в региональный (или головной) офис компании. Возможен выезд специалиста к заказчику. Как правило, взлом кода блокировки экрана занимает одни сутки.

Рекомендация по защите: практически невозможно защититься, кроме использования стойкого цифро-буквенного пароля и ежегодной смены устройств.

P.S. Об этих кейсах, инструментах и многих других полезных фишках в работе компьютерного криминалиста эксперты Лаборатории Group-IB рассказывают в рамках обучающего курса Digital Forensics Analyst. После прохождения 5-дневного или расширенного 7-дневного курсов выпускники смогут эффективнее проводить криминалистические исследования и предовтращать киберинциденты в своих организациях.

P.P.S. Остросюжетный Telegram-канал Group-IB об информационной безопасности, хакерах, APT, кибератаках, мошенниках и пиратах. Расследования по шагам, практические кейсы с применением технологий Group-IB и рекомендации, как не стать жертвой. Подключайтесь!

Источники
  1. ФБР нашло хакера, готового взломать iPhone без помощи Apple
  2. Guixin Yey, Zhanyong Tang, Dingyi Fangy, Xiaojiang Cheny, Kwang Kimz, Ben Taylorx, Zheng Wang. Cracking Android Pattern Lock in Five Attempts
  3. Дактилоскопический датчик Samsung Galaxy S10 удалось обмануть с помощью отпечатка пальца, напечатанного на 3D-принтере
  4. Dominic Casciani, Gaetan Portal. Phone encryption: Police 'mug' suspect to get data
  5. Как разблокировать телефон: 5 способов, которые работают
  6. Дуров назвал причиной взлома смартфона Джеффа Безоса уязвимость в WhatsApp
  7. Датчики и сенсоры современных мобильных устройств
  8. Gezichtsherkenning op smartphone niet altijd veilig
  9. TrueDepth в iPhone X что это, принцип работы
  10. Face ID в iPhone X обманули с помощью 3D-печатной маски
  11. NirLauncher Package
  12. Анатолий Ализар. Популярные и редкие PIN-коды: статистический анализ
  13. Мария Нефедова. Графические ключи так же предсказуемы, как пароли 1234567 и password
  14. Антон Макаров. Обход графического пароля на Android-устройствах www.anti-malware.ru/analytics/Threats_Analysis/bypass-picture-password-Android-devices
  15. Jeremy Kirby. Unlock mobile devices using these popular codes
  16. Андрей Смирнов. 25 самых популярных паролей в 2019 году
  17. Мария Нефедова. Конфликт между властями США и компанией Apple из-за взлома iPhone преступника усугубляется
  18. Apple responds to AG Barr over unlocking Pensacola shooter's phone: No.
  19. Law Enforcement Support Program
  20. Cellebrite Supported Devices (CAS)

Подробнее..

Перевод Используем Chrome DevTools профессионально

25.09.2020 20:20:19 | Автор: admin
И снова здравствуйте. В преддверии старта курса JavaScript Developer. Professional перевели

11 советов для тех, кто использует Chrome в качестве среды разработки.





Итак, по тем или иным причинам вы решили при разработке ориентироваться на Chrome. Вы открываете инструменты разработчика и приступаете к отладке кода.



Иногда вы открываете консоль, чтобы посмотреть вывод своей программы, или вкладку Elements, чтобы проверить CSS-стили элементов DOM.



А действительно ли вы разбираетесь в Chrome DevTools? На самом деле у инструментов разработчика множество мощных функций, которые облегчают жизнь, но о них мало кто знает.
Я расскажу о самых полезных из них.

Для начала рассмотрим командное меню. Командное меню в Chrome это как командная оболочка в Linux. В нем вы можете писать команды для управления Chrome.

Открываем Chrome Developer Tools. Для доступа к командному меню используем горячие клавиши:

  • WindowsCtrl + Shift + P
  • macOSCmd + Shift + P


Открыть его можно и через графический интерфейс, вот так:



В этой области можно увидеть длинный список команд, которые дают доступ ко множеству полезных функций.



Расширенные функции скриншотов


Снимки части экрана приходится делать довольно часто, и я не сомневаюсь, что для этого на вашем компьютере установлены удобные программы. А могут ли они:

  • сделать скриншот всей страницы целиком, в том числе контента, который находится за пределами области просмотра?
  • захватить содержимое отдельного элемента DOM?


Такая необходимость возникает нередко, но большинство системных инструментов для создания снимков экрана не справляются с этими задачами. К счастью, для создания таких скриншотов у нас есть специальные команды Chrome.

Вот они:

  • Screenshot Capture full size screenshot (сделать снимок страницы целиком)
  • Screenshot Capture node screenshot (сделать снимок отдельного узла)


Пример


Откройте любую веб-страницу, например самые популярные статьи о JavaScript на Medium: medium.com/tag/javascript.

Откройте командное меню и выполните команду Screenshot Capture full size screenshot.



Мы сделали снимок всей текущей страницы целиком.


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

Если вы хотите сделать скриншот элемента DOM, можно использовать системные инструменты, но они не смогут идеально точно захватить элемент. В Chrome для этого есть специальная команда Capture node screenshot.

Сначала откройте вкладку Elements и выберите нужный элемент. Затем выполните команду.



Вот результат:



Использование результата последней операции в консоли


Мы часто отлаживаем код в консоли. Допустим, вы хотите узнать, как перевернуть строку в JavaScript. Вы ищете нужную информацию в Интернете, и вам попадается вот такой фрагмент кода.

'abcde'.split('').reverse().join('')




Да, этот код переворачивает строку. Но вам пока непонятно, как работают методы split(), reverse(), join() и какой результат выдает каждый из них. Вы можете выполнить этот код пошагово, записав его как-то так:



Теперь мы знаем, какое значение возвращает каждый метод.
Но зачем так много писать? В такой длинной записи легко допустить ошибку, и ее сложно понять. Открою секрет: в консоли есть волшебная переменная $_, которая хранит результат последней операции.



$_ это специальная переменная, значение которой всегда равно результату последней выполненной в консоли операции. Этот прием сильно облегчает процесс отладки.



Повторная отправка запроса XHR


Во фронтенд-проектах часто приходится использовать XHR для отправки запросов на получение данных с сервера. Что делать, если нужно отправить запрос повторно?

Неопытные разработчики обновляют страницу, но это очень неудобно. В Chrome мы можем отладить код прямо на вкладке Network.



  • Откройте вкладку Network.
  • Нажмите кнопку XHR.
  • Выберите запрос XHR, отправку которого вы хотите повторить.
  • Выберите Replay XHR в контекстном меню, чтобы повторить запрос.


Вот анимированный пример:



Отслеживание статуса загрузки страницы


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

В Chrome DevTools можно делать скриншоты страницы в ходе ее загрузки, поставив галочку напротив Capture Screenshots на вкладке Network.



Выберите скриншот, чтобы посмотреть информацию о соответствующих сетевых запросах. Такая визуализация даст вам лучшее представление о сетевых запросах, которые отправляются на сервер в отдельные моменты времени.



Копирование переменных


Вы знаете, как скопировать значение переменной JavaScript в буфер обмена?
Это кажется невыполнимой задачей, но в Chrome для ее решения предусмотрена специальная функция copy.



ECMAScript не содержит определения функции copy, это функция Chrome. С ее помощью можно скопировать значение переменной JavaScript в буфер обмена.

Копирование изображения как URI с приставкой data:


Есть два способа вставить изображение на страницу: можно дать ссылку на внешний файл или внедрить изображение при помощи data: URL.

Data: URL (URL с приставкой data:) это схема, позволяющая встраивать небольшие файлы в документ в качестве строковых элементов.Раньше она называлась data: URI, но WHATWG отказалась от этого названия.

Встраивание маленьких изображений непосредственно в код по схеме data: URL сокращает количество HTTP-запросов к серверу, благодаря чему страница загружается быстрее.
Как это сделать в Chrome?

Посмотрите анимацию:



Вывод массива объектов в таблицу


Допустим, у нас есть массив объектов:

let users = [{name: 'Jon', age: 22},  {name: 'bitfish', age: 30},  {name: 'Alice', age: 33}]




Воспринимать такую информацию в консоли тяжело. А если массив длиннее и содержит более сложные элементы, то потеряться в нем еще проще.
К счастью, в Chrome есть функция, которая выводит массив объектов в таблицу.



Она вам пригодится, и не раз.

Перетаскивание на вкладке Elements


Иногда нужно переместить некоторые элементы DOM на странице, чтобы протестировать пользовательский интерфейс. На вкладке Elements можно перетащить любой HTML-элемент в любое место в коде:



В этом примере я перетащил элемент на вкладке Elements, и его расположение на веб-странице тоже моментально изменилось.

Обращение к текущему выделенному элементу в консоли


$0 это еще одна волшебная переменная, которая содержит элемент, выделенный на вкладке Elements.



Активация псевдоклассов CSS


Псевдоклассы позволяют задать стиль для элемента не только в зависимости от его расположения в дереве документа, но и в зависимости от внешних факторов, таких как история просмотра (например, :visited), состояние контента (например, :checked в некоторых формах), положение указателя мыши (например, псевдокласс :hover изменяет стиль элемента при наведении на него указателя мыши).

Для одного элемента можно написать несколько псевдоклассов. Чтобы было проще тестировать стили, псевдоклассы можно активировать прямо на вкладке Elements.



Пример


Посмотрите на код страницы:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>body{font-size: 150px;}div:hover{color: red;}div:active{color: blue;}div:focus{color: brown;}</style></head><body><div>hello world</div></body></html>


Открываем страницу в браузере, на вкладке Elements проверяем, как работают псевдоклассы, и при необходимости вносим изменения.



Горячая клавиша для скрытия элементов


Во время отладки CSS-стилей часто возникает необходимость скрыть элемент. В Chrome это делается быстро: достаточно лишь выделить элемент и нажать клавишу H.


Нажмите H на клавиатуре

Эта операция применяет к элементу стиль visibility: hidden !important;.

Сохранение элемента DOM в качестве глобальной временной переменной


Если мы хотим быстро сослаться на элемент DOM в консоли, можно сделать это так:

  • Выбрать элемент.
  • Открыть контекстное меню правой кнопкой мыши.
  • Выбрать Store as a global variable (Сохранить как глобальную переменную).


Подробнее..

SaaS и ALEPIZ мониторинг и управление инфраструктурой

20.05.2021 12:07:50 | Автор: admin

Я системный администратор, более 20 лет занимаюсь управлением и мониторингом критичной в масштабах страны инфраструктуры. Услуги, которые я администрирую, предоставляются по модели SaaS (Software as a Service аренда ПО). Это моя первая публикация, я решил поделиться своими наработками в этой области, возможно кому-то это будет полезно.

ALEPIZ распространяется бесплатно по лицензии GPL v3ALEPIZ распространяется бесплатно по лицензии GPL v3

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

Хочу заметить, что эта статья не является рекламой. Я пишу ее как частное лицо и не представляю какую-либо организацию. Решение доступно вместе с исходным кодом и находится в свободном доступе. Вы можете использовать его совершенно бесплатно по своему усмотрению.

История

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

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

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

Я решил учесть ошибки и разработать новую систему. Большинство продуктов создаются разработчиками ПО, а я системный администратор. Я хуже знаю процесс разработки, но проектирование и реализация системы для системных администраторов в данном случае сделана системным администратором, с учетом нюансов нашей работы. Считаю, что это положительно сказалось на конечном результате

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

ALEPIZ

Новая система получила название ALEPIZ. Я не планировал ее распространять, но создание системы затянулось. Чтобы не платить за средства разработки я выполнил условия для их бесплатного использования: выложил ПО на GitHub под лицензией GPL v3 и создал сайт alepiz.com.

Data Browser служит для отображения собранных исторических данныхData Browser служит для отображения собранных исторических данных

Архитектура системы

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

Тестирование и эксплуатация ведется под ОС Microsoft Windows. Выбор ОС продиктован архитектурой программного обеспечения, которое используется в моей организации.

Для возможности портирования в будущем на другие архитектуры, в качестве платформы были выбраны JavaScript и NodeJS. Это так же позволило унифицировать разработку backend и frontend и использовать асинхронность JavaScript для достижения требуемой производительности. Применение потоков (threads) в NodeJS невозможно из-за отсутствия поддержки во многих модулях, поэтому используется схема с запуском нескольких процессов.

В ALEPIZ встроен Web сервер и сервер БД на основе быстрой и простой SQLITE. При развертывании системы нет необходимости в установке дополнительного ПО: ALEPIZ включает все требуемые компоненты. Для ускорения работы с БД реализована система кэширования, разработанная специально для ALEPIZ.

Есть периодическая очистка старых исторических данных, которая позволяет сделать размер БД близким к постоянному. Реализованы встроенная репликация и резервное копирование БД, система интеллектуального пропуска похожих данных, автоматическая ротация логов, система настройки прав ролевого доступа для пользователей и многое другое.

Сейчас ALEPIZ обслуживает одновременно более 250 000 метрик. Их количество постоянно увеличивается. Сбор данных по метрике происходит примерно раз в 3060 секунд. Исторические данные хранятся три месяца и база данных занимает около 1Тб. Для работы используется сервер с двумя процессорами Intel, по двенадцать ядер в каждом. Суммарная загрузка процессоров около 40% и зависит от количества расчетов, выполняемых ALEPIZ. Потребление памяти 64Gb. В качестве дисковой подсистемы используется RAID10 из 8 HDD 10 000 Rpms. Репликация и резервное копирование БД производится по сети на другой сервер.

Системные требования

Для работы ALEPIZ требуется компьютер архитектуры Intel x64 с установленной ОС Microsoft Windows версии не ниже Windows Server 2012 или Windows 10. После установки ALEPIZ использует 200Mb дискового пространства. Потребление оперативной памяти на сервере с 12 ядрами CPU составляет 1Gb. При меньшем количестве ядер потребление памяти будет уменьшено.

Описание возможностей

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

Кроме сбора данных ALEPIZ позволяет генерировать события. Обычно это какие-то пороговые значения. Например, мало свободной памяти или повышенное использование процессора. Это стандартная функция для большинства систем мониторинга. В случае с ALEPIZ, модуль для обработки событий реализован так, чтобы обеспечить организацию рабочих процессов в подразделениях компании.

Dashboard позволяет обрабатывать произошедшие событияDashboard позволяет обрабатывать произошедшие события

ALEPIZ является не только системой мониторинга, но и системой для управления инфраструктурой. Для этого существуют специальные модули - действия. Например, действием может быть запуск или остановка внешнего сервиса, редактирование файла настроек, выполнения запросов к БД или копирование файлов для обновления ПО. Можно разрабатывать собственные действия.

Действия можно объединять в задачи и запускать их в определенное время, либо в зависимости от различных условий. Например, обновление сервиса должно запускаться только если он остановлен. Таким образом можно автоматизировать управление инфраструктурой.

Описание возможностей системы есть на сайте ALEPIZ и доступно на русском языке.

Сущности системы

Чтобы получить больше информации о принципах работы системы и ее возможностях, немного погрузимся в ALEPIZ.

Коллекторы

Для сбора данных используются модули, которые называются коллекторами (collectors). Например, коллектор PING используется для проверки доступности хостов по протоколу ICMP. Коллектор SNMP необходим для сбора данных по одноименному протоколу. MSSQL служит для выполнения запросов к БД MSSQL и т.п. На момент написания статьи в ALEPIZ реализован 21 коллектор. Можно разработать собственный. Информация о разработке коллектора и средства для разработки встроены в ALEPIZ.

Counter settings служит для настройки каунтераCounter settings служит для настройки каунтера

Каунтеры

Каунтеры (counters) это коллекторы с параметрами, которые определяют, какие данные необходимо собирать. Например, для того чтобы коллектор PING начал собирать информацию, ему в качестве параметра необходимо передать имя хоста, доступность которого требуется проверять. Параметры для коллекторов настраиваются в каунтерах.

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

Активные и пассивные коллекторы. Зависимости в каунтерах

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

Например, каунтер с активным коллектором Timer генерирует данные через определенные интервалы времени. Если от него сделать зависимым каунтер с пассивным коллектором SNMP, то данные по протоколу SNMP будут собираться через определенные каунтером интервалы времени. Если от каунтера с SNMP сделать зависимым каунтер с коллектором Events generator, то в случае превышения установленного порогового значения, в Dashboard появится предупреждение о возможной проблеме.

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

Объекты

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

Object editor необходим для редактирования объектов и их привязки к каунтерамObject editor необходим для редактирования объектов и их привязки к каунтерам

Связь объектов и каунтеров

Каунтеры не могут существовать сами по себе. Каждый каунтер должен быть привязан к одному или нескольким объектам. У объектов можно настроить свойства, которые будут использовать каунтеры для сбора или генерации информации. Например, объект хост может содержать свойство IP адрес, который будет использован каунтером с коллектором PING для проверки доступности этого хоста. Каунтер с коллектором PING можно привязать к нескольким объектам- хостам и он будет собирать данные в зависимости от настроенных свойств (IP адреса) для каждого из объектов.

Действия

Действия (actions) это модули ALEPIZ, которые используются для управления как непосредственно сущностями ALEPIZ, так и внешней инфраструктурой. Например, действием может быть модуль для создания нового объекта или каунтера ALEPIZ, или для запуска и остановки сервиса Windows, или для просмотра собранной исторической информации, или данных по различным событиям и т. п.

Можно разработать собственные действия. Информация и средства для разработки встроены в ALEPIZ.

Задачи

Задачи (tasks) это несколько действий, объединенных в группу. Задачи могут запускаться вручную, или в определенное время. A так же в зависимости от состояния определенных каунтеров и даже непосредственно из каунтеров.

С помощью задач можно автоматизировать управление инфраструктурой и организовать процессы для взаимодействия между различными подразделениями организации.

Tasks maker используется для управления задачамиTasks maker используется для управления задачами

Остальные возможности

Кроме того, в ALEPIZ есть такие модули, как лаунчеры для различных способов запуска действий, средства связи для передачи информации по email, SMS и т.п. Есть встроенный процессор с набором функций для обработки полученных данных, условий в каунтерах и формирования зависимостей на основе этих условий, система обработки произошедших событий с возможностью организации рабочих процессов в организации, средства отладки и т.д. Полное описание возможностей есть на сайте или в справке по ALEPIZ на русском языке.

Заключение

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

Не обязательно использовать сразу все возможности ALEPIZ. Если у Вас небольшая инфраструктура, или в настоящее время нет потребности в автоматическом управлении, можно использовать только часть функций, например, только мониторинг. В дальнейшем у Вас будет возможность расширения и внедрения автоматизации в систему управления инфраструктурой.

Хотел бы еще раз повторить: ALEPIZ распространяется бесплатно по лицензии GPL v3. Вы можете использовать его на свое усмотрение. Я не знаю способов монетизации системы, поэтому принял решение сделать его доступным для всех.

Если Вы решили поставить систему у себя, проще всего скачать и запустить установочный пакет для ОС Microsoft Windows со страницы https://alepiz.com/help/download.pug. В этом случае установка и первичная настройка системы произойдет автоматически. ALEPIZ можно поставить даже на персональный компьютер или ноутбук под управлением Windows 10.

Несмотря на то, что ALEPIZ эксплуатируется, он продолжает разрабатываться и находится в статусе beta тестирования. Если Вы обнаружите дефект или у Вас будут какие-либо пожелания к дальнейшему развитию системы, можете написать мне.

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

Спасибо за прочтение, надеюсь, ALEPIZ поможет Вам и Вашему бизнесу в достижении новых целей.

Подробнее..

Войны лоббистов и развитие BIM. Часть 2 open BIM VS closed BIM. Revit vs ArchiCAD и Европа против остального мира

16.12.2020 10:16:09 | Автор: admin

В первой части мы говорили о возникновения форматов STEP, IFC и создании организации buildingSMART. Также в статье было рассказано про рождение нового инструмента планирования - программы Revit - и про новые функции, данные разработчиками программе, благодаря которым начиная с 2010 года Revit уверенно становится лидером рынка проектирования во всём мире.

Уже после публикации первой части мне позвонил участник истории создания IFC и IAI, который пережил все эти события конца 80-х. Он подтвердил факты, описанные в первой части, и поэтому в следующей части будет более подробно рассказано о немецких корнях формата IFС, о зарождении идеи этого формата, а также почему Nemetschek долгое время отказывался принимать формат IFC, но после пожалел об этом и купил советский стартап Graphisoft.

В этой статье мы рассмотрим, в какую сторону движется рынок BIM CAD программ сегодня. Какие программы BIM CAD выбирают конструкторы в разных странах мира и как кардинально поменялся мир планирования за последние 15 лет.

Если следить за основными трендами в BIM планировании по всему миру, можно заметить невероятный перекос в развитии BIM технологий в отдельных развитых странах. Чем же объясняется такое различие в технологиях планирования, от которых зависит от 5 до 20% ВВП каждой страны в мире?

Какое BIM software использовать? Обзор инструментов для БИМ планирования.

При помощи поисковых данных от Google посмотрим на развитие популярности основных программ для 3D проектирования во всём мире по годам, с 2004 по 2020. Объективные показатели Google Trends показывают относительную популярность запроса: 100 баллов означают максимальный интерес к теме, а 0 недостаточное количество информации по ней.

Кризис 2008 года дал толчок неэффективной строительной отрасли, которая была вынуждена стать более эффективной: сократив в среднем 30% персонала занятых в отрасли (об этом подробнее в моей статье: Строительный сектор вымирает. Кризис COVID-19, растущие проблемы и новые возможности) и наконец обратив свой взгляд на новые методы и инструменты планирования - BIM, которые позволяют повысить уже сегодня производительность минимум на 10% и рентабельность (ROI) при новых инвестициях при внедрении BIM на 500%.

До 2008 года лидерами 3D планирования были программы Vectorworks и Archicad, разработанные компанией Graphisoft, советского стартапа с главным офисом в Будапеште (Венгрия). В 2007 году немецкая компания Nemetschek выкупает компанию Graphisoft, и видимо с покупкой компании развитие новых инструментов для Vectorworks и Archicad затормозилось. При этом Revit начал активно вырываться вперёд сразу после окончания глобального кризиса 2008 года.

На сегодняшний момент у Revit почти кратное преимущество перед своим следующим соперником Archicad. Откуда такая большая разница, и что такого секретного есть у Revit, чего нет в других программах?

ArchiCAD (Graphisoft) - одно из самых популярных BIM-решений начала 2000-х годов. Graphisoft - венгерский стартап из Советского Союза, который (по ночам, используя институтские компьютеры) в 1982 году разработал ПО для решения проблем с установкой советской атомной электростанции, за что создатели ArchiCAD были награждены $30 000 (на сегодняшний курс - $120 000). На полученный гонорар они смогли написать самое продаваемое программное обеспечением CAD для Mac в то время. Наряду с MiniCAD Diehl Graphisoft позже выпустил Blueprint, программу 2D CAD для Mac, ориентированную на архитекторов.

Всё, что было до этого (RUCAPS) в отношении BIM, - чистая теория, которая реализовывалась до конца 90-х только в 2D. Radar CH от ArchiCAD, выпущенный в 1984 году, стал первым программным обеспечением для моделирования, доступным на персональном компьютере. Первая реализация BIM в компьютерной среде была осуществлена коммунистическим стартапом - Graphisoft - под именем ArchiCAD Virtual Building в 1987.

Как всё это создал советский стартап из Будапешта, который в то время находился за железным занавесом и не имел доступа к западным компьютерам Mac?

Основатель компании Apple, Стив Джобс, на одной из немецких конференций (CeBIT), заметив огромный потенциал инженера Gbor Bojr, решил с помощью его стартапа Graphisoft получить для своей компании Apple, набирающей обороты, новых клиентов: архитекторов и конструкторов всего мира. Для этого Стив Джобс дарит советскому стартапу Graphisoft первые макинтоши, которые основатель стартапа Gbor Bojr полузаконно ввозил в Советский Союз.

Сегодня MiniCAD от Graphisoft известен как Vectorworks, а Diehl Graphisoft - это Nemetschek Vectorworks, уже, к сожалению, не самые ведущие игроки в мире САПР (подробнее про взаимоотношения Graphisoft и Nemetschek будет рассказано в третьей части).

Из названия ArchiCAD понятно, что основная область применения продукта архитектура. Можно ли в ArchiCAD выполнять другие разделы планирования, кроме архитектуры? Теоретически это возможно, но это будет связано с большими трудозатратами: выполнять другие разделы с помощью ArchiCAD это примерно то же, что на бумаге вычерчивать здание в изометрии: минимум автоматизации максимум ручного труда. Для каждого раздела проектирования здесь придётся искать специализированные решения.

Tekla Structures (Trimble) - одно из самых мощных (и дорогих) строительных решений. Разработанная финскими программистами Tekla отлично решает задачи, связанные с любыми стальными и металлическими конструкциями. Но, к сожалению, Текла почти не приспособлена к работе с железобетонными конструкциями и вообще не предназначена для проектирования деревянных конструкций, а нормальная работа в смежных отрасляхневозможна . Как и в случае с ArchiCAD, архитектурную часть в ней выполнять не имеет смысла: минимум автоматизации, максимум ручного труда.

Allplan (Nemetschek) - в самом начале развития компании немецкий инженер Georg Nemetschek был против создания общего языка STEP-IFC в планировании, так как это открывало рынок Германии для других производителей CAD ПО. Зачем отдавать уютный немецкий рынок CAD ПО американским или - ещё хуже - советским стартапам?

Но, как ни парадоксально, сегодня Allplan является одним из главных бенефициаров всей темы с IFC и open BIM. Уже в начале 2000-х годов, испугавшись экспансии Revit, который со скоростью монгольской конной армии покорял мир проектирования, и видя угрозу в распространение Revit в Европе, компания Nemetschek в 2006 году проглотила стартап с коммунистическими корнями - Graphisoft (ArchiCAD), который к тому времени был почти единственной программой, которая была способна работать с форматом IFC без ошибок и костылей.

Поэтому только программы от Graphisoft, и после уже благодоря Graphisoft ПО от Nemetschek сегодня заточены на "почти беспроблемную" работу с IFC данными.

Изначально Allplan был предназначен для проектирования несущих конструкций, но постепенно, путем поглощения смежных решений, Allplan расширил проектирование на всю линейку AEC (архитектура, строительство, инженерия). Allplan сложно назвать хорошим BIM-решением, так как в программном продукте модель базируется на файловой структуре (а не на базе данных, как в Revit), при этом разные участки проекта собираются в модель через внешние ссылки. Этот метод работы скорее в стиле классических вертикальных CAD инструментов. Но компания Nemetschek позиционирует Allplan именно как BIM-решение, поскольку в основе модели лежит интеллектуальное взаимодействие объектов, а не 2D черчение.

Revit (Autodesk) - на сегодняшний день демонстрирует, пожалуй, идеальную концепцию BIM. В Revit между архитектурной, конструкторской и инженерной моделью используется общий формат данных (формат RVT), что даёт возможность без особых усилий собрать единую BIM-модель проекта и визуализировать ее с высокой степенью детализации. Польза от единой модели неоспорима и великолепно иллюстрирует перспективы развития технологии BIM.

Начиная с покупки в 2002 году, Autodesk активно продвигает свой продукт Revit, рекламируя его комплексный подход, основанный на единой модели. Модель, созданная в архитектурной части и сохраненная в формате RVT, может использоваться конструкторами и инженерами без каких-либо существенных конвертаций и преобразований.

Про возникновение Revit подробнее в первой части: Войны лоббистов и развитие BIM. Часть 1: Как ленинградский математик помог Autodesk захватить мировой рынок CAD

Борьба open BIM против сlosed BIM

Сегодня всё BIM планирование можно разделить на два типа:

  • Closed BIM - использования в планировании среды одного производителя программного обеспечения

  • Open BIM - работа с открытым форматом данных (в основном IFC), который (в теории - без потерь) должен автоматически читаться другими программами.

Борьба за рынок CAD идёт сегодня в каждой стране. В каких-то странах видна победа closed BIM, в других странах мы видим применение концепта open BIM.

Посмотрим, какой подход выбирают отдельные страны. Google Trends поможет нам понять тенденции на рынке планирования в каждой из стран G20 (or Group of Twenty)

По этим данным можно сделать следующие выводы:

  • с 2000 по 2010 года на рынке CAD ПО (3D) во всех странах доминировал ArchiCAD и Vectorworks венгерского стартапа Graphisoft

  • После того как Nemetschek поглощает ArchiCAD и Vectorworks, с 2010 (после глобального кризиса) во всех странах наблюдается всплеск интереса к Revit и переориентация планирования на продукт Revit

  • В некоторых странах Revit за несколько лет полностью вытесняет ArchiCAD из планирования

  • Tekla и Allplan, стартовавшие в одном направлении с Revit, не могут похвастаться таким функционалом и маркетингом, который есть у Revit и корпорации Autodesk

  • Revit занимает львиную долю (больше 50-90%) рынка BIM CAD почти в каждой стране мира.

Посмотрим теперь на тенденции за 2020 год на рынке CAD.

Видим тотальное доминирование Revit на мировом рынке. Небольшой каламбур состоит в том, что Америка, Россия и Китай - три геополитических соперника - работают в основном в продуктах Autodesk. При этом Европа, союзник Америки по НАТО, в отличие от всех остальных стран, предпочитает идти своим особенным путем развития технологий BIM, хотя изначально после победы над Советским Союзом Autodesk и немецкие компании мечтали установить свои правила на рынке ПО путем создания мирового формата IFC.

За исключением Германии, все страны из G20 пришли к тому, что на сегодня, к сожалению, нет лучше инструмента для работы с BIM, чем Revit. Если посмотреть по всему миру, то картина распространения основных программ для 3D планирования отличается только в пяти странах мира: Кении, Румынии, Австрии, Швейцарии и Германии.

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

Подробнее про Европу, а точнее, про немецкоговорящие страны и о методах планирования open BIM мы поговорим в следующей части.

В заключение

У успеха Autodesk и Архикада нет особого секрета. Всё, что сделали парни из Autodesk и Nemetschek в 90-е - это, работая с военными конторами и военными форматами в 90-х, вовремя получили поддержку и инвестиции на развитие маркетинга своих продуктов.

У формата RVT от Revit, который был во многом создан благодаря десяти программистам из Советского Союза, сегодня только один конкурент и соперник - военный формат с немецкими корнями - IFC. Оба формата по сути сегодня находятся примерно на одном уровне развития.

Если бы компания Georga Nemetschek c самого начала открылась натовскому формату IFC и вместе с Autodesk разработала новые идеи для применения этого формата, то вполне возможно, что не было бы Revit, не было бы американской buildingSMART, и немецко-венгерские программы корпорации Nemetschek вполне могли бы завоевать весь мир CAD BIM, оставив Autodesk на американском континенте. Время упущено, но борьба между двумя форматами ещё возможна.

Можно надеяться, что за огромный строительный рынок (в $20 триллионов долларов) теперь развернется такая же борьба, как и 30 лет назад за военный космос между Советским Союзом и Америкой, что подарит нам новую продуктивную холодную войну за клиентов среди разработчиков CAD.

Времена главенства Hardware проходят, и наше поколение, ориентированное на создание Software, будет скоро задавать тон всей строительной индустрии. BIM CAD - это, по сути, IDE в среде разработки программного кода. Программисты первыми начали активно заниматься open Source и прозрачностью в своём мире проектирования, начиная с 90-х годов. Мы же начали этот путь только сейчас. Но так как скорость разработки новых инструментов за 30 лет увеличилась в разы, можно надеяться на скорый приход нового open Source-Мессии в строительное планирование в ближайшие годы.

Будем надеяться, что такие инструменты как Dynamo, Rhino.Inside, LibreCAD, Blender будут перерастать в что-то большее, а у таких корпораций, как Autodesk и Nemetschek, нет будущего в мире open Source. Этот новый прозрачный мир создают не привезенные из-за границы программисты и математики (которых стимулируют покупкой недвижимости в силиконовой долине), а мир, где код удалённо создается усилиями тысячи людей со всего мира, способных сегодня самостоятельно монетизировать свой вклад в дело создания нового CAD BIM ПО.

Сегодня нам остаётся только просить всех разработчиков, которые сегодня приходят из банковской и машиностроительной индустрии в наше строительное планирование, заняться наконец темой Open Source и новых форматов для строительства. Кто-то же должен разработать настоящий новый открытый формат и открытые инструменты для работы в строительстве, который не основан на старых стандартах и понятиях.

В следующей части мы узнаем, добровольно или по принуждению местных лоббистов немецкоговорящие страны пошли в сторону диверсификации использования BIM CAD, и - open BIM. Также подробно рассмотрим создания первых эскизов формата IFC, про первые конфликты между главными производителями CAD ПО того времени, и откуда пошло open BIM движение в мир.

Низкий поклон всем, кто создал формат STEP, IFC, Revit, ArchiCAD, AllPlan, Teklа.

Буду рад вашим комментариям, уточнениям и критике.

Для русской версии статьи: Немецкий инженер (случайные инсайдер после первой статьи), который был участником этих событий особенно отмечал, что у Соединённых Штатов на то время были программы только для 2D моделировани, а по работе с геометрией русские и советские инженеры были на порядок выше своих западных конкурентов. Он отмечал, всё что пришло в ArchiCAD и потом позже в IFC и то что касалось геометрии - во многом создали совесткие учёные. Об этом напишу немного подробнее в следующей части.

Подробнее..

Job шаблон проектирования для новичков и опытных Go программистов

16.01.2021 02:07:06 | Автор: admin

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

Итак, я в мире сусликов. А что делает прожженный до мозга костей PHP программист оказавшись там? Правильно он продолжает "пыхтеть" - в силу своей профессиональной деформации но уже на Go, со всеми вытекающими отсюда последствиями.

Признаюсь я никогда не был на собеседовании, устраиваясь на вакансию Go разработчика, но подозреваю, что там не задают вопросов про SOLID, Dependency Injection и различные прелести ООП. Там другой мир, другая парадигма (в целом разумеется не экстраординарная), связанная с параллельным программированием, строгой типизацией и отсутствием полноценного ООП в строгом его смысле - к тому ООП к которому мы привыкли по PHP, С++ или Java.

Поэтому в начале, разумеется, был определенный дискомфорт и ломка шаблонов. Я не понимал как использовать тот же content.Context, зачем он? Мои шаблоны готовы уже были треснуть, но матерого PHP программиста без хрена не съешь. Пора что-то с этим делать и писать свой велосипед! А именно то решение, которое мне, как PHP программисту, казалось достаточно очевидным для решения задача связанных с параллельным программирование, краеугольным камнем Go. Усевшись за рабочий ноутбук я почти месяц корпел над работой. Я хотел не просто сделать реализацию сферического коня в вакууме, а показать на конкретном примере возможность использования данного подхода. Так сказать, proof of concept. Ну и заодно набить руку на Go, чего греха таить.

После того как велосипед был готов, я выкатил его, осмотрел и, выдохнув, сказал сам себе: "ну, блин, вроде неплохо получилось. Нужно срочно рассказать об этом сообществу, пускай оценят". Сказано сделано. На Reddit была опубликована небольшая заметка про новый шаблон проектирования Go и, судя по реакции я понял что люди ничего не поняли. "Зачем? Как это использовать? Так это же over-engineering" - в целом так можно охарактеризовать реакцию. Я не сдавался: "сейчас я вам нафотошоплю свой контраргумент. Ага, добавить это в README.md - пусть знают эти суслики".

Как видят решение программистыКак видят решение программисты

А если без шуток, то это, наверное, тема для отдельной статьи.

В целом о чем я? Много воды - ноль конкретики. Чтобы было реализовано:

  1. Шаблон проектирования Job - это поведенческий шаблон проектирования, который инкапсулирует всю необходимую информацию для параллельного выполнения задач (task).

  2. В качестве примера использования данного шаблона был реализован простой прокси-сервер, выполняющий роль балансировщика уровня L4; клиент, который сканируют указанную директорию на наличие изображений и отправляет все найденные изображения на backend сервер для изменения их размера; backend сервер, который обрабатывает запросы по изменению размера изображений. В основе всех трех приложений лежит компонент Job. Код так же доступен в репозитории на Github.

В целом сам шаблон Job - это аналог хорошо известного Command pattern, но с прицелом на параллельное выполнение. В той же статье есть и конкретный пример его использования и для нашего случая:

Parallel Processing Where the commands are written as tasks to a shared resource and executed by many threads in parallel (possibly on remote machines; this variant is often referred to as the Master/Worker pattern)

Выполнение задач зависит друг от друга, если одна задача прерывает свое выполнение из-за ошибки все остальные задачи останавливаются тоже. Это все это, безусловно, можно реализовать с помощью content.Context, но реализация на более высоком уровне позволяет избавиться от рутинных действий, связанных с организацией параллельного выполнения задач и сконцентрироваться на реализации самой бизнес логики. Ну а сами ошибки очень легко отлавливать вызовами специальных методов вроде task.Assert заменяя ими более емкие конструкции if err != nil { panic(err) }.

Задачи разделают данные и оркестрируют свое выполнение с помощью так называемой ping/pong синхронизации. Я приведу здесь лишь небольшой кускок кода, чтобы дать общее представление полностью библиотека доступна в репозитории на Github по ссылке.

// Saves resized image to the output dirfunc (s *ImageResizer) SaveResizedImageTask(j job.Job) (job.Init, job.Run, job.Finalize) {// Do some initialization hereinit := func(t job.Task) {if _, err := os.Stat(s.inputDir); os.IsNotExist(err) {t.Assert(err)}if _, err := os.Stat(s.outputDir); os.IsNotExist(err) {err := os.Mkdir(s.outputDir, 755)t.Assert(err)}}run := func(task job.Task) {stream := j.GetValue().(netmanager.Stream)select {case finishedTask := <- j.TaskDoneNotify(): // Wait for the scanner task to be doneif finishedTask.GetIndex() == s.scanneridx {s.scandone = true}task.Tick()case frame := <-stream.RecvDataFrame(): // Process response from the backend servertask.AssertNotNil(frame)res := &imgresize.Response{}err := frame.Decode(res)task.Assert(err)baseName := fmt.Sprintf("%s-%dx%d%s",res.OriginalName, res.ResizedWidth, res.ResizedHeight, res.Typ.ToFileExt())filename := s.outputDir + string(os.PathSeparator) + baseNameif ! s.dryRun {ioutil.WriteFile(filename, res.ImgData, 0775)}j.Log(1) <- fmt.Sprintf("file %s has been saved", filename)stream.RecvDataFrameSync() // Tell netmanager.ReadTask that we are done processing the frames.recvx++task.Tick()default:switch {case s.scandone && s.recvx == s.sentx: // Check if all found images were processedtask.FinishJob()default:task.Idle() // Do nothing}}}return init, run, nil}

Это одна из задач клиента, которая обрабатывает приходящий ответ от сервера и сохраняет полученное изображение. Задача оркестирует свое выполнение используя вышеупомянутую технику ping/pong синхронизации - с задачей, которая занимается файловым сканированием. Также она определяет, когда пришел последний ответ от сервера и когда нужно завершить выполнение всей работы (Job).

Насколько это решение over-engineered и насколько его использование вместо content.Context оправдано - пусть это решает читатель, я своё мнение выразил в виде сарказма на изображении выше.

Всем хороших выходных и да прибудет с нами сила пэхэпе в мире сусликов.

Подробнее..
Категории: Php , Go , Software , Design patterns

Boot manager для 486-го компьютера

27.07.2020 22:10:16 | Автор: admin

Введение


Всё началось с того, что меня несколько расстраивало отсутствие возможности загружаться с дисковода на старой плате Socket 3. CD-приводы в то время ещё не были распространены и разработчики BIOS даже не задумывались о предоставлении такой опции. Да и операционные системы распространялись на дискетах. Чуть позднее, когда ОС (в основном конечно Windows) стало удобнее устанавливать с диска, чем с пары десятков дискет, придумали так называемые загрузочные floppy, содержавшие драйвер дисковода и передававшие ему управление непосредственно. Но это на мой взгляд костыль и некрасиво. Я начал искать более изящное решение и даже в какой-то момент собирался купить SCSI-контроллер за много денег и привод к нему, но нашлась альтернатива.



Plop Boot Manager


Этой альтернативой был Plop. На самом деле я даже не задумывался об использовании загрузчиков, но когда мне сказали про Plop, я решил, что это весьма здравая идея. Он умеет загружаться из кучи источников и загружать практически любые устройства, кроме usb-дисководов. Кроме того, он имеет удобный интерфейс и множество настроек. Подробнее почитать о нём можно на официальном сайте.



Оставалось только решить с чего загружать Plop. Самым очевидным вариантом была дискета, но это снова костыль. А больше компьютер (не считая диска, естественно) ни с чего грузиться и не умеет. И вот тут на помощь пришла, как ни странно, сетевая карта.


BootROM и с чем его едят


Да, да, сетевая карта. Дело в том, что некоторые из них имеют функцию сетевой загрузки с некоторого сервера и для этого несут на себе свой собственный BIOS. В моём случае это карта Realtek rtl8139.



Панелька предназначена для микросхемы памяти объёмом до 64 килобайт. Никто не заставляет записывать именно BootROM, это может быть любой код. Содержимое ПЗУ просто исполняется после загрузки основного BIOS. Так вот, Plop умеет загружаться с сетевой карты, но для этого его нужно подготовить.


Непосредственная настройка и установка


Начнём с конфигурации загрузчика. В этом нам поможет готовая программа, которую можно взять здесь. Я использовал GUI-версию. В ней нужно выбрать бинарный файл, предназначенный для записи в OptionROM. В конфигурации я сразу переключил режим вывода на текстовый (потому что графический сильно тормозил), отключил анимации. Для удобства использования лучше поставить галочки INT19 и Startup Hotkey. Теперь Plop будет загружаться только при нажатии комбинации Ctrl+A, практически как Boot Menu в современных компьютерах. По вкусу можно установить таймер и устройство по умолчанию.



Далее требуется нажать кнопку Configure plpbt.bin и образ готов к подготовке к прошивке. Его нужно сконвертировать в ROM-файл. Для этого потребуется ещё один инструмент c сайта загрузчика. К сожалению он консольный. Параметрами программе нужно передать имя образа, сконфигурированного на предыдущем шаге и имя конечного файла. Так же требуется задать идентификаторы вендора и самого устройства. На сайте уже есть готовый пример для rtl8139. Для других карт идентификаторы можно считать из родного BootROM автоматически с помощью ключа -grabid. Необязательный ключ -nodisable. Без него Plop будет каждый раз при включении предлагать отключить ПЗУ сетевой карты, но нам это не нужно, поскольку меню и так будет загружаться только с сочетанием клавиш.



Теперь можно переходить к прошивке. Я использую программатор MiniPro, но подойдёт любой другой, который поддерживает EEPROM и Flash до 64 килобайт. ПЗУ можно взять 27, 28 или 29 серий нужного объёма. Процесс прошивки проходит как обычно. Выбрать микросхему, выбрать образ и нажать на кнопку записи.



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



Если всё сделано правильно, после определения дисков и флоппи появится строка сообщающая, что BootROM успешно загружен и предложение нажать Ctrl+A для загрузки в меню.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru