Примечание переводчика: Представьте, что ваш кондиционер работает отлично, но вдруг перестает включаться из-за поломки простого планшета, который выполняет роль выключателя. Вам предлагают решить проблему, заменив всю систему за $1697.

Заставлять клиентов менять всю систему из-за поломки самого дешевого компонента — возможно, и выгодно, но меня это так взбесило, что я решил разобраться сам. Я понимаю, что мои действия могут оказаться сложными для большинства пользователей Advantage Air, но в ходе моего исследования я выяснил, что причина несовместимости современных планшетов с более старыми системами управления кроется только в программном обеспечении. Если бы они просто добавили в свои приложения функцию выбора "системы", это решило бы проблему для всех, а их кастомный POE-разъем все равно бы заставлял использовать их оборудование.

Контроллер кондиционера

Моя семья купила новый дом в 2019 году. В рамках строительного пакета была установлена большая система кондиционирования воздуха с обратным циклом (тепловой насос) и воздуховодами. Поскольку это было частью всего строительного плана, я не знаю точной стоимости этой системы, но, исходя из других предложений, которые я видел для домов подобного размера, я предполагаю, что она составляет 10-12 тысяч долларов. Система состоит из двух основных частей: собственно кондиционера Daikin и контрольного блока Advantage Air на чердаке, который открывает вентиляционные отверстия в различных зонах. Эта система управления управляется дешевым планшетом на Android с питанием через POE, установленным на стене в гостиной.

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

Потеря управления

В воскресенье 18 августа 2024 года, примерно через 6 месяцев после окончания гарантии, все изменилось. Планшет начал жаловаться, что "Приложение Сервисы Google остановлено". Я закрыл это сообщение и продолжил то, что я хотел сделать, а именно выключил обогреватель. Позже в тот же день я вернулся домой и собирался снова включить обогреватель, но на этот раз приложение e-zone перестало работать и отказывалось запускаться совсем. Я перезагрузил планшет, но он застрял на бесконечном экране загрузки ANDROID.

Так как было воскресенье, я провел несколько часов в поисках решений и попытках снова заставить планшет работать. Я вошел в режимы восстановления как на английском, так и на китайском языках и сбросил все настройки и разделы, которые мог. На устройстве не было видимого USB-интерфейса, поэтому я не мог подключить его к компьютеру. Было очевидно, что что-то не так с операционной системой, "проверка целостности системы" вернула несколько ошибок.

Разочаровывающий сервис

На следующий день я позвонил в службу поддержки Advantage Air и ждал обратного звонка. В конце концов, со мной связался сотрудник поддержки, и я объяснил ему свою проблему. Один из первых вопросов, который мне задали, касался возраста системы. После того как он выяснил, что гарантия закончилась, мне сообщили, что если планшет вышел из строя, мне потребуется новая система управления за $1245. Когда я начал возражать, говоря, что мне нужно заменить только дешевый планшет, я получил что-то вроде хорошо заученного объяснения в духе: "Ну, технологии продолжают развиваться, и системы не совместимы, каждый год выходят новые телефоны". (Примечание переводчика: судя по всему, сотрудник имел в виду, что планшеты, которые сейчас поставляет компания - новых версий и они не совместимы с кондиционером автора). Я был в недоумении, я за умные вещи, но это по сути просто выключатель для моего кондиционера. Чтобы было ясно, кондиционер работал нормально, контрольный блок работал нормально, только планшет на Android вышел из строя. Мы закончили разговор тем, что он предложил отправить мне инструкции о том, как сделать полный сброс планшета.

Меню заводского ресета
Меню заводского ресета

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

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

Хорошо, разберусь сам

Меня охватил праведный гнев. Я не собирался платить этой компании ни копейки и твёрдо решил починить или заменить их планшет, либо установить систему другой компании. Первым делом я сорвал планшет со стены и разобрал его. POE-подключение оказалось нестандартным — на средние пины подавалось 12В и 2В, что мне было незнакомо.

Когда я открыл планшет, то обнаружил скрытый USB-порт! Подключив его к компьютеру, я смог зарядить устройство, но, что бы я ни пробовал — режим fastboot, recovery, adb sideload и другие — компьютер его не распознавал. Сначала я подумал, что это из-за того, что я никогда не включал «Отладку по USB» в интерфейсе Android, но позже понял, что проблема была в POE-разъеме.

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

внутри планшета
внутри планшета
POE to USB
POE to USB

Ага, три провода, подключены к USB 5V и линиям данных! Первым делом я обрезал эти линии данных, и планшет сразу стал отображаться, когда я запускал команду fastboot devices. Это повлекло за собой еще пару часов, потраченных на безуспешные попытки использовать mtktool для разблокировки загрузчика. Хотя все выглядело многообещающе, процесс всегда останавливался на втором этапе, что, как мне казалось, было связано с аппаратными проблемами.

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

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

Моим первым порывом было купить другой дешевый планшет на Android и подключить его точно так же, как этот. Но я практически ничего не знаю о платах, а пайка мелких компонентов у меня получается ужасно. Поэтому второй идеей было подключить этот POE-разъем к USB-A штекеру, соединить его с компьютером (через хаб, так как я совершенно не доверял своей пайке) и посмотреть, смогу ли я его обнаружить.

Ничего не обнаружилось, и я понял, что, возможно, он работает как хост и может подключаться только к планшетам или телефонам. Мне понадобился Android-планшет или телефон. К счастью, я вспомнил, что у меня был Android-планшет — я выиграл Samsung Galaxy Tab 4 в 2015 году в случайном конкурсе от пивной компании Hahn. Я понятия не имел, где он находится, и потратил еще час, переворачивая дом вверх дном в поисках этого забытого раритета. Жена спросила, что я делаю, и когда я объяснил, она спокойно сказала: "А, белый? Я видела его в шкафу в прачечной, он вообще работает?"

Я не знал, работает ли он, но после пяти минут зарядки увидел экран блокировки и с волнением подключил свой ужасно спаянный разъем.

POE коннектор
POE коннектор
Первая попытка
Первая попытка

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

Изначально планшет eZone работал на Android 6.0, а этот Samsung был все еще на 5.0, но я не думал, что это станет проблемой, поэтому начал с того, чего явно не хватало: необходимых приложений. Все приложения eZone доступны как на сайте Advantage Air, так и на сайте apkpure. О существовании apkpure я узнал из поста, в котором кто-то писал, что ему порекомендовал его технический специалист из AA.

Я установил два приложения. Приложение AAService, которое, как я предположил, отвечает за постоянное фоновое обслуживание системы, и приложение-интерфейс Ezone. С волнением я снова подключил POE-донгл:

"Не на оборудовании AA"
"Не на оборудовании AA"

Ну конечно, я и не ожидал, что все будет так просто, но это стало очередным препятствием. Мне предстояло научиться патчить Android-приложения. Я уже набил руку на Softice в DOS, разбирая гораздо более сложное программное обеспечение ради развлечения, так что меня это не пугало. Но я точно не ожидал, что это будет так чертовски легко.

Патчинг Android-приложений

Благодаря одной статье я узнал, что существует инструмент под названием apktool, который позволяет не только декомпилировать apk-файл в smali (некий вид машинного кода для выполнения на Java), но и вносить изменения, а затем с помощью команды apktool b собрать его обратно в работоспособное приложение! Больше не нужно заменять байты через hex-редактор, чтобы остаться в пределах допустимого… Честно говоря, это кажется магией.

$ apktool d app-aaservice2-release-14.116

Вишенкой на торте оказалось то, что можно использовать декомпилятор JAXE на apk-файле, который постарается преобразовать его обратно в Java-код. Этот код не скомпилируется, но будет иметь точно такую же структуру, как smali-код. Таким образом, можно определить, что нужно изменить в псевдо-Java, а затем внести эти изменения в smali. Я воспользовался потрясающей веб-версией этого инструмента.

Я открыл декомпилированный проект на Java в VSCode, сделал поиск по фразе "AA Hardware" и оказался здесь:

    /* access modifiers changed from: protected */
    public void onResume() {
        super.onResume();
        f2272e.set(true);
        Log.d(f2271d, "onResume");
        if (ServicePleaseReboot.f2283b.get()) {
            setContentView(R.layout.reboot_now);
            e.a((Activity) this);
        } else if (f.a()) {
            a();
        } else {
            Log.d(f2271d, "Not on AA Hardware");
            Toast.makeText(this, R.string.not_on_aa_hardware_error, 1).show();
            finish();
        }
    }

Отлично, если f.a() возвращает false, то появится ошибка «Not on AA Hardware», и приложение завершится. Следуя по импортам (я не специалист по Java, так что это немного застало меня врасплох), я нашел, что класс f выглядел так:

import b.a.a.a.i;

/* compiled from: GetTabletInfo */
class f {
    static boolean a() {
        return i.c() || i.d() || i.e() || i.g() || i.f() || i.b();
    }
}

Теперь, если перейти в sources/b/a/a/a/i.java, можно увидеть, что каждая из этих функций выполняет проверку на основе Build.MODEL устройства.

Например, i.c():

    public static boolean c() {
        return a().contains("eZone") || a().contains("e-zone") || a().equals("PIC7KS-EZ") || a().equals("PIC7KS6") || a().equals("PIC7KS6-EZ");
    }

Таким образом, функции вроде i.c(), i.d() и другие — это просто флаги, проверяющие имя модели устройства. Функция c() выше, вероятно, называется что-то вроде isEzone(). Другая может называться, например, isMyAir4() или isZone10(), и так далее. У меня было два простых варианта, чтобы заставить это работать с моим контроллером e-Zone. Я мог сделать так, чтобы функция i.c() (isEzone()) всегда возвращала true, или же мог заставить функцию a() всегда возвращать имя устройства моего старого планшета. Оглядываясь назад, думаю, первый вариант тоже бы сработал, но тогда я не был уверен, проверяется ли имя модели еще где-то, поэтому выбрал второй.

Имя модели моего старого планшета было указано на наклейке внутри корпуса, но, судя по коду, я увидел, что к концу строки нужно добавить идентификатор -EZ. Итак, строка, которую я должен был вернуть, выглядела как «PIC7KS6-EZ». Исходная функция на Java выглядела так:

    private static String a() {
        String str = Build.MODEL;
        if (str.equals("SM-T113")) {
            str = "MyAir5";
        }
        .
        . // other if statements overriding Build.MODEL
        .
        if (str.equals("PIC8GS8")) {
            return "MyAir5";
        }
        return str; // 
    }

Перейдя к файлу sources/b/a/a/a/i.smali, я нашел ту же функцию, но уже с кодом smali. Я увидел те же операторы if и ту же строку возврата. Мне нужно было просто изменить возвращаемую строку на “PIC7KS6-EZ”.

    :cond_4
    const-string v1, "PIC8GS8"

    .line 7
    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v1

    if-eqz v1, :cond_5

    goto :goto_0

    :cond_5
    #move-object v2, v0 # <-- this was return str;
    const-string v2, "PIC7KS6-EZ"  # this returning the new string instead

    :goto_0
    return-object v2
.end method

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

$ apktool b app-aaservice2-release-14.116

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

$ keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-android-release

Затем я подписал apk с помощью этой команды.

jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore ../my-release-key.jks -storepass passwordiused dist/app-aaservice2-release-14.116.apk my-android-release

Потом я подключил планшет и попытался установить приложение. Но тут возникла ошибка INSTALL_FAILED_DUPLICATE_PERMISSION. Оказалось, это произошло потому, что я устанавливал приложение aaservice, которое запрашивало те же разрешения, что и приложение ezone. Это нормально, если оба приложения подписаны одним и тем же ключом, но в моем случае они были подписаны разными ключами. Чтобы все заработало, я просто удалил приложение ezone.

На этот раз я запустил приложение aaservice, и оно заработало! Я даже получил приятное уведомление с текстом «Система подключена». Отлично! У меня было рабочее сервисное приложение, теперь оставалось только запустить интерфейсное приложение eZone. Я сделал ту же декомпиляцию с помощью apktool и JAXE, но VSCode не нашел никаких строк с именем устройства или проверок Build.MODEL. Я быстро подписал приложение eZone соответствующим ключом и установил его, надеясь, что больше никаких изменений не потребуется. При открытии оно, казалось, пыталось подключиться, но в итоге вернуло ошибку о неизвестной системе.

Я вернулся к декомпилированному Java-коду и понял, что VSCode просто долго выполнял поиск, поэтому я сузил его до Java-файлов. Вскоре я нашел тот же самый код проверки устройства. Я внес те же изменения в smali/com/air/advantage/w1/k.smali, пересобрал apk, установил его, подключил к POE и…

E-Zone прекрасно работает на древнем Samsung Galaxy Tab 4.
E-Zone прекрасно работает на древнем Samsung Galaxy Tab 4.

Я был в восторге. После того как я отказался от попыток починить оригинальный планшет, на то, чтобы заставить работать этот, у меня ушло всего несколько часов, и это было чертовски весело. Этому планшету уже больше 10 лет, но он все равно работает гораздо быстрее, чем тот хлам, который шел в комплекте с системой. Если я захочу обновить его на что-то более мощное, например, чтобы управлять своим Home Assistant и другими системами, мне нужно будет просто подключить новое устройство через USB. Но для включения и выключения кондиционера этого более чем достаточно. Сейчас я жду, когда прибудет красивый утопленный разъем, после чего установлю планшет на стену.

На следующий день моя компания по установке кондиционеров (не Advantage Air) любезно прислала мне электронное письмо с предложением купить старый планшет, который один из их установщиков нашел в задней части фургона, за $400. Хотя цена все равно кажется неоправданно высокой для такого устройства, если бы Advantage Air предложили мне это сразу, я бы, возможно, согласился. Зато теперь я доволен, что справился с этим сам.

От автора перевода: меня зовут Евгений Потапов, я инженер последние 20 лет, основатель компании ITSumma и веду личный телеграм канал. Там я пишу заметки о технологиях, высоких нагрузках, менеджменте и тайм менеджменте и, в последнее время - все больше о всяких олдскульных и не очень низкоуровневых вещах (это одно из моих хобби). Буду рад если добавитесь.

Комментарии (24)


  1. s60
    29.08.2024 08:50
    +2

    $1697 за выключатель кондиционера: DYI ремонт управляющего планшета

    DIY - Do it Yourself


    1. eapotapov Автор
      29.08.2024 08:50
      +1

      боже)) я проверил текст но не проверил заголовок, спасибо!!)


    1. Pas
      29.08.2024 08:50

      Не DIE и то хорошо )


  1. uhf
    29.08.2024 08:50
    +11

    Теперь юристы компании его засудят за взлом ПО? Оно ведь не предназначено для работы на неоригинальном железе.
    Для чистоты можно было протокол отреверсить и написать свое приложение.


    1. eapotapov Автор
      29.08.2024 08:50
      +5

      зависит от terms of service, но в целом да

      но если запрещено, то написать код, отреверсив протокол - это тоже нарушение terms of service, так что по идее надо было менять hardware id плашета если делать по закону

      а вот если делать свой софт, то единственный способ обойти ограничения - делать как Compaq, когда делал клон IBM PC - писать код на основе знаний полученный в результате знаний после реверс незаконно, это будет "кражей", поэтому они использовали практику "чистой комнаты".

      поэтому
      1. первая команда провела реверс инжиниринг архитектуры IBM PC и BIOS и написала детальное техническое задание
      2. а вторая команда получила техническое задание и по нему уже сделала архитектуру Compaq


  1. Dotarev
    29.08.2024 08:50
    +9

    купила новый дом в 2019 году

    На дворе 2024г.. И установленный девайс выглядит уже древним как мамонт... И запланированное устаревание - это не миф ( По какой-то причине...планшеты у всех выходят из строя примерно в одно и то же время). Ладно, в крайнем случае можно поменять всю систему управления, $1697 - это всего лишь деньги.
    Но сколько таких "планшетов" сейчас в промышленности - не может сказать никто. А при выходе из строя "окирпичивается" система на десятки или сотни миллионов рублей (да-да, я про РФ). Только в роли "планшета" выступает какой-нибудь микроконтроллер, у которого все настройки в ОЗУ (+ батарейка CR2032). Слетели настройки - добро пожаловать в техподдержку фирмы-изготовителя (если с ней остались связи). Или может стоять ПЛК, у которого вся прошивка в MMC или даже CompactFlash. Эти работают долго... Но не бесконечно долго. Слетела память - железо купить ещё возможно, но прошивку не найдешь.. И так на всем шарике. Где-то мы свернули не туда..


    1. Mitya78
      29.08.2024 08:50

      Или может стоять ПЛК, у которого вся прошивка в MMC или даже CompactFlash. Эти работают долго... Но не бесконечно долго. Слетела память - железо купить ещё возможно, но прошивку не найдешь.. 

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

      Ну может это у нормальных фирм.


      1. UFO_01
        29.08.2024 08:50
        +3

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


      1. MaFrance351
        29.08.2024 08:50

        Старенькие Siemens Simatic, например. Данные в NVRAM, забыли поменять батарейку (или поменяли на выключенном устройстве), и прошивка всё. А перезалить её возможность есть не всегда...


      1. dotnetfx40
        29.08.2024 08:50

        Телосчетчики - не ожидано оказалось что при замене батарейки он превращается в тыкву, транспондер - Автодор , такая же история. Это только я столкнулся с ситуацией - нет батарейки и ты тыква. Покупай новое устройство. Пишите кто еще с чем столкнулся


        1. Pas
          29.08.2024 08:50

          Транспондеры Kapsch, превращающиеся в тыкву при смене литий-металлического источника питания — это действительно гениальное инженерное решение австрийских сумрачных гениев. Читал обзоры на перепайку батарейки на лету, чтобы не сбрасывалась NVRAM.

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

          В моей стране года два как полностью переехали на транспондеры Q-Free, у этих такой проблемы вроде уже нет, но выглядят они более дубово, чем капши 4010.


    1. MaFrance351
      29.08.2024 08:50
      +1

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

      Мрёт eMMC. По такой же причине дохнут и "обычные" планшеты и китайские смартфоны. Китайцы совершенно не парятся и ставят самые дешёвые чипы, какие только удаётся найти.


  1. KirpaPuto
    29.08.2024 08:50

    Круто, у чувака есть прачечная!


    1. progressor7
      29.08.2024 08:50
      +5

      В Австралии в любом доме или квартире есть небольшая комнатка, в которой стоят стиральная машина, раковина, и, иногда, сушильная машина. И это место называет laundry (прачечная).


      1. gibson_dev
        29.08.2024 08:50

        В Швеции тоже, только называетс Tvättstuga


  1. Mitya78
    29.08.2024 08:50
    +1

    Я бы попробовал посмотреть что там на самом блоке управления. Может там Modbus RTU торчит.


  1. progressor7
    29.08.2024 08:50
    +2

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


    1. eapotapov Автор
      29.08.2024 08:50

      о, классно, что поможет если надо будет, рад)


    1. MaFrance351
      29.08.2024 08:50
      +1

      Кстати, симптомы, описанные в посте, как раз очень похожи на кончину памяти. eMMC "уходит" ну практически в точности так.


  1. ihouser
    29.08.2024 08:50
    +1

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

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


    1. MaFrance351
      29.08.2024 08:50

      они рассчитывают, что из за такой суммы в суд подавать их не будут

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


    1. AlexM2001
      29.08.2024 08:50
      +1

      Саппорт обязан настаивать на смене всей системы. У него это в обязанностях скорее всего прописано.

      Недавно ремонтировал систему кондиционирования одного японского бренда. Ровно 20 лет системе. Очень поразило надёжность железа 20 летней давности.

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

      Надо статью о системах кондиционирования написать) Есть интересные технические моменты)

      P.S. Автору публикации респект! Весьма информативно и познавательно.


  1. Yamuzakopal
    29.08.2024 08:50

    В гипер маркеты очень много старого железа продано в виде терминалов для самообслуживания. Большой процент устройств на целеронах 20летней давности работают. И стоит комплект монитор с сенсором, ПК в фирменном мини корпусе, программируемой клавиатурой. От 250тыс.руб в настоящий момент! С жёстким диском 60гб и 256гб оперативной памяти. Хоть оно и должно стоить по факту раз в 15-20 дешевле. А в пик развития касс самообслуживания году в 2014-2015 стоило ещё больше.

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

    У себя бы я такой тапок на чипе MTK пустил бы на diy, как минимум кастомный загрузчик и прошивка жила бы на надёжной sd карте. Либо в ведро. Ещё бы автору порекомендовал изучить блок управления. Глядишь может получится управлять им по сети с разных устройств


  1. aegelsky
    29.08.2024 08:50
    +1

    редкая годнота, если есть ещё - был бы рад почитать) это практически всё, ради чего я захожу на хабр)