• «Ржавая» IP-камера: прошивка на Rust

      До появления ботнета Mirai только особо интересующиеся знали о том, что находится внутри обычных IP камер. В большинстве случаев там стоит обычный линукс, причем частенько с дефолтным рутовым паролем, а то и вообще без него: у нас в офисе стоит такая камера, с прошивкой от декабря 2016 года и беспарольным рутовым телнетом.

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

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

      Мы решили исправить эту ситуацию своей прошивкой, причем сделав ставку на Rust.
      Читать дальше →
    • Пример решения типичной ООП задачи на языке Haskell

      • Tutorial
      Рассмотрим типичную задачу, из тех, что обычно считаются «ООП-эшными». Имеется список данных (объектов) имеющих не одинаковые структуры (по научному, гетерогенный список), при чём, над каждым нужно выполнять одинаковые действия – по простому, каждый можно передать в некую функцию.
      Читать дальше →
      • +22
      • 22,1k
      • 9
    • Haskell: об одном методе реализации функций с переменным числом параметров

      • Tutorial

      – А видела ты Черепаху «Как бы»?
      – Нет, – сказала Алиса. – Я даже не знаю, кто это такой.
      – Как же, – сказала Королева. – Это то, из чего делают «Как бы черепаший суп».

                        Льюис Кэрролл, 
                                 «Алиса в Стране чудес»

      — Судя по твоим речам, ты хорошо знаешь Фангорн? — спросил в ответ Арагорн.
      — Какое там! — отозвался старик. — На это ста жизней не хватит. Но я сюда иной раз захаживаю.

                       Джон Р. Р. Толкиен, 
                                «Властелин Колец» — к слову о моём знании Haskell ;)


      Homines dum docent, discunt. (Объясни другим — сам поймёшь.)
                       народная латинская поговорка


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

      Казалось бы о каком переменном числе параметров может идти речь при таком раскладе? Однако поразмыслив, посмотрев исходники printf или просто почитав wiki.haskell становится очевидным, что как раз ФП даёт ключ к достаточно красивому, хотя и несколько «казуистическому» решению этой задачи.

      В настоящей публикации я рассмотрю один из способов реализации такого механизма на простых примерах, а также предложу некоторое обобщённое решение на базе Template Haskell, для превращения семейства обычных функций с последним параметром типа список в функцию с «как бы с переменным числом параметром» (далее по тексту просто «с переменным числом параметром»).
      Читать дальше →
      • +24
      • 3,8k
      • 4
    • Пиратство и четыре валюты

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


      Известный всем денежный доллар.

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

      Я предлагаю такие обозначения:

      1. ($Д) Денежные доллары
      2. ($В) Временные доллары
      3. ($Г) Доллары головной боли [в оригинале «Pain-in-the-butt-dollars»]
      4. ($Ч) Доллары честности

      Игрок делает выбор купить или спиратить игру на основании того, сколько «стоит» каждая услуга (а не продукт!) в этих четырёх валютах, а также в зависимости от ценности для игрока каждой из них.
      Читать дальше →
    • Подходы к версионированию изменений БД

      Намного лучше дисциплинарные ограничения убирать инструментарным расширением
      Автор статьи


      Введение


      При разработке информационной системы, то есть программы, нацеленной на хранение, работу с данными, обработку, анализ и визуализацию какой-то базы данных, одним из краеугольных камней стоит задача разработки БД. Когда я только начинал задаваться этим вопросом, казалось – что ни сделай, все равно будет криво.


      На протяжении 5 лет разработки нескольких корпоративных ИС, я ставил и пытался решать вопросы, как тот или иной аспект разработки БД сделать удобным. Искал инструменты, помогающие что-то делать с БД, методологии. На удивление в этой области мало наработок. И в каждом подходе сразу видно – вот это нельзя, вот тут будет неудобно, тут слишком много дисциплинарных правил (см эпиграф)… В этой статье я попытался собрать те походы, которые считаю наиболее эффективными, и один, в добавление к собранным, представлю как венец моих исканий, который считаю наиболее «бронебойным».

      Читать дальше →
    • Favicon сегодня: форматы, поддержка, автоматизация

      На сегодняшний день favicon — это не просто значок 16x16 во вкладке браузера. Он является важной составляющей интерфейса, а также играет немаловажную роль в прогрессивных веб-приложениях. Существует немало способов подключения и использования favicon, о которых я расскажу в данной статье.



      Читать дальше →
    • Как я пишу код

      • Перевод
      Мне нравится думать, что я пишу хороший код. Ну или, что я хотя бы пишу больше хорошего кода, чем плохого.

      Моя любимая особенность хорошего кода — это его скука. Предсказуемые выражения, одно за другим. Никаких сюрпризов, никаких трюков, никаких уникальных случаев. Никакого мета-программирования, конечно! Скучный код очень легко отлаживать, читать, объяснять.

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

      Код, использующий неявное поведение, может быть основан на каком-нибудь недокументированном, но уже реализованном функционале. Например, в мире написана целая куча НЕВЕРНОГО кода, который полагается на то, что функция файловой системы, возвращающая список директорий, вернёт их в отсортированном по алфавиту порядке. Это и вправду часто работает именно так, но ровно до того момента, пока не ломается по «непонятным» причинам. А на самом деле просто никто никогда этой сортировки не гарантировал.
      Читать дальше →
    • Лямбда-исчисление на JavaScript

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

        Итак, основная идея: всё есть функция. Поэтому мы ограничим себя очень узким кругом возможностей языка: любое выражение будет либо анонимной функцией с одним аргументом (x => expr), либо вызовом функции (f (x)). То есть весь код будет выглядеть похожим образом:

        id = x => x
        double = f => x => f (f (x))
        

        Поскольку результатом работы функций будут другие функции, нам понадобится способ интерпретировать результат. Это единственное место, в котором пригодятся нетривиальные возможности JavaScript.
        Читать дальше →
      • Алгоритм Джонкера-Волгенанта + t-SNE = супер-сила

        • Перевод
        До:



        После:



        Заинтригованы? Но обо всем по порядку.

        t-SNE


        t-SNE — это очень популярный алгоритм, который позволяет снижать размерность ваших данных, чтобы их было проще визуализировать. Этот алгоритм может свернуть сотни измерений к всего двум, сохраняя при этом важные отношения между данными: чем ближе объекты располагаются в исходном пространстве, тем меньше расстояние между этими объектами в пространстве сокращенной размерности. t-SNE неплохо работает на маленьких и средних реальных наборах данных и не требует большого количества настроек гиперпараметров. Другими словами, если взять 100 000 точек и пропустить их через эту волшебный черный ящик, на выходе мы получим красивый график рассеяния.
        Читать дальше →
        • +63
        • 23,1k
        • 2
      • Обманываем время: о тестировании с «подставным» временем на Linux и Docker

        • Tutorial

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


        Менять системное время глобально ой, как не хотелось. Муторно, плюс у меня в ней столько всего понаставлено, не дай Б-г что-то заглючит (вряд ли, но мало ли). Думал запустить VirtualBox, но уж больно лень было ставить «чистую» Убунту, расшаривать папки, и т. д., тем более что этот вариант жрёт, как троглодит серьёзно потребляет машинные ресурсы.


        Но буквально недавно я начал ковырять Docker. «У него просто обязан быть механизм контроля системного времени внутри контейнера», — подумал я. Рассмотрим, что же в результате вышло.

        Читать дальше →