• Сверхсовременные иммутабельные структуры данных

      Годами эксперты в С++ рассуждают о семантике значений, иммутабельности и разделении ресурсов за счет коммуникации. О новом мире без мьютексов и гонок, без паттернов Command и Observer. На деле все не так просто. Главная проблема по-прежнему в наших структурах данных.



      Иммутабельные структуры данных не меняют своих значений. Чтобы что-то с ними сделать, нужно создавать новые значения. Старые же значения остаются на прежнем месте, поэтому их можно без проблем и блокировок читать из разных потоков. В итоге ресурсы можно совместно использовать более рационально и упорядоченно, ведь старые и новые значения могут использовать общие данные. Благодаря этому их куда быстрей сравнить между собой и компактно хранить историю операций с возможностью отмены. Все это отлично ложится на многопоточные и интерактивные системы: такие структуры данных упрощают архитектуру десктопных приложений и позволяют сервисам лучше масштабироваться. Иммутабельные структуры — секрет успеха Clojure и Scala, и даже сообщество JavaScript теперь пользуется их преимуществами, ведь у них есть библиотека Immutable.js, написанная в недрах компании Facebook.

      Под катом — видео и перевод доклада Juan Puente с конференции C++ Russia 2019 Moscow. Хуан рассказывает про Immer — библиотеку иммутабельных структур для C++. В посте:

      • архитектурные преимущества иммутабельности;
      • создание эффективного персистентного векторного типа на основе RRB-деревьев;
      • разбор архитектуры на примере простого текстового редактора.

      Читать дальше →
    • Стрелочка поворачивается: поговорим об обобщениях, или зачем программисту математика

        Привет, Хабр.


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


        Итак, с обобщённой реализацией паттерна Has мы разобрались. Какой следующий интересный вопрос можно задать? Ну, например, можем ли мы обобщить наше решение, которое, к слову, является обобщением (Has Foo) обобщения (HasFoo) обобщения (MonadReader Foo) обобщения (Reader Foo) понятия параметра функции (Foo ->)? И, оказывается, что да, можем, и аж в двух ортогональных измерениях!


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

        Читать дальше →
        • +17
        • 4,1k
        • 2
      • Теория графов в машинном обучении для самых маленьких

        Сложность представления данных для глубокого обучения растет с каждым днем. Нейронные сети на основе данных в виде графа (Graph Neural Network, GNN) стали одним из прорывов последних лет. Но почему именно графы набирают все большую популярность в машинном обучении?


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

        Читать дальше →
        • +11
        • 6,8k
        • 3
      • Примитивно-рекурсивные функции и функция Аккермана

          Функция Аккермана — одна из самых знаменитых функций в Computer Science. С ней связан как минимум один фундаментальный результат и как минимум один просто важный. Фундаментальный результат, говоря аккуратно и непонятно, таков: существует всюду определённая вычислимая функция, не являющаяся примитивно-рекурсивной. Важный результат заключается в том, что лес непересекающихся множеств (также известный как disjoint set union) работает очень быстро.


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


          Из текста ниже вы узнаете, что такое примитивно-рекурсивные функции и как выяснить, что функция Аккермана к таковым не относится. И, конечно, этот текст убедит вас в том, что это невероятно красивая конструкция и невероятно красивое рассуждение!

          Читать дальше →
          • +43
          • 8,3k
          • 9
        • SSLH: Прячем SSH/HTTPS/OpenVPN/Telegram за единым портом 443

          • Tutorial
          image

          SSH/HTTPS/OpenVPN/Telegram и всё на одном порту?! Что?!
          — Да!
          • Хотите скрыть наличее у вас некоторых сервисов?
          • В публичной wi-fi сети блокируется всё кроме 443 (https) порта?
          • Настроили Telegram Proxy/OpenVPN и не хотите его «светить» ?
          • SSH подключение к своему серверу из стран с цензурой?

          На все эти вопросы ответ один — Мультиплексирование SSL/TLS соединений, или SSLH.

          В посте мы рассмотрим как в 1 команду спрятать кучу сервисов за 1 портом.
          Читать дальше →
        • CRDT: Conflict-free Replicated Data Types


            Как считать хиты страницы google.com? А как хранить счётчик лайков очень популярных пользователей? В этой статье предлагается рассмотреть решение этих задач с помощью CRDT (Conflict-free Replicated Data Types, что по-русски переводится примерно как Бесконфликтные реплицированные типы данных), а в более общем случае — задачи синхронизации реплик в распределённой системе с несколькими ведущими узлами.
            Читать дальше →
          • Воспроизводимые вычисления в R. Как разделить код и данные?

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


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

              Читать дальше →
            • Почём быть Няшей?

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

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

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

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

                Стоит оно того? Или не так: а чего оно стоит?
                Читать дальше →
              • Покорение Emacs-режимов: руководство для самоделкина



                Программисты делятся на две категории:
                1) Те, кто уже использует Vim.
                2) Те, кто уже использует Emacs.
                3) Те, кто ещё не использует.


                Предисловие


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

                Добавление режима


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

                Сначала это всё удобно использовать, но потом начинает чего-то не хватать и приходится думать о добавлении своей функциональности.
                Построение
                • +13
                • 14,7k
                • 7
              • Нет, динамические системы типов по своей сути не более открыты

                • Перевод

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


                Читать дальше →
              • Пытаясь композировать некомпозируемое: поднимаем всё

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

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

                  Будущее не за горами, поэтому приступать нужно уже сейчас.
                  Читать дальше →
                • У меня нулевая текучка

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

                    Из руководителей я был такой один, тем самым привлек к себе внимание. Ну и сам удивился – оказывается, когда от тебя не уходят сотрудники, это странно и необычно.

                    В сумме я работал руководителем лет 7-10 (точно не знаю, какие периоды сюда включать), но нулевая текучка сохранилась. Никто никогда от меня не уходил, никого никогда я не выгонял. Только набирал.

                    Нулевая текучка, как показатель, никогда не была моей самоцелью. Но я стараюсь делать так, чтобы вложенные в людей усилия не пропадали даром. Сейчас расскажу примерно, как я руковожу так, что люди не уходят – вдруг что полезное для себя найдете. На полноту раскрытия темы не претендую, т.к. основываюсь только на личном опыте. Вполне возможно, что я всё делаю неправильно.
                    Читать дальше →
                  • Философия программирования 3 — Чичиков и программиат

                      Где вы нашли философию у Дональда Кнута? Академическое сообщество, это — 20 сумасшедших учёных, 2000 чичиковых, 20000 бюрократов и миллион детишек. Кнут это — Чичиков. На западе, даже сумасшедший учёный — умеет быть медийным, у нас это — «ранимые люди, с ними надо очень бережно, в лучшем смысле слова». Не могут связать двух слов, обижаются на вопросы. Поэтому в нашей науке видны только чичиковы, они раздают и получают награды, становятся директорами, основывают лаборатории, распиливают гранты, пристраивают своих. С прессой общаются, правда, тоже с трудом, — совок. А на западе это — развитой класс, они умеют работать с прессой, позиционироваться, колонизировать, занимать ниши, основывать религии. Найти человека который прочитал «Искусство Программирования» или «Конкретная Математика» практически невозможно, — те, кто считают Кнута за авторитет слишком глупы чтобы прочитать их, а те, что поумнее — читают книжки получше. Видимо, поэтому Кнут платил по 2.56 за каждую найденную опечатку, в надежде, что хотя-бы прочитают. Все его, с позволения сказать, книги — это копипаста алгоритмов из стэнфордских журналов, разбавленная топорным юмором, человек просто вовремя занял тему. А «детишки» от науки читают то, что им дают взрослые дяди — бюрократы и чичиковы. Вот и выходит, у бюрократов нет мозгов, у чичиковых есть мозги, но нет совести, сумасшедшие учёные — ранимые люди, обижаются.

                      Читать дальше →
                    • Как создать децентрализованное приложение, которое масштабируется? Используйте меньше блокчейна

                      • Перевод

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


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



                      Довольно часто в whitepaper'ах приложений, которые построены на блокчейне, можно найти параграф, в котором сказано: "блокчейн дорогой и не способен поддерживать требуемое число транзакций в секунду. К счастью, много умных людей работает над масштабированием блокчейна и к моменту запуска нашего приложения он станет достаточно масштабируем".


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


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


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

                      Читать дальше →
                    • Хуки времени компиляции в Elixir

                        Elixir снабжен сложной, очень хорошо продуманной, инфраструктурой макросов. С легкой руки Криса Маккорда, в сообществе существует негласный закон, который неизбежно озвучивается сразу, как только речь заходит о макросах: «Первое правило использования макросов — вы не должны их использовать». Иногда с малозаметной ремаркой, набранной бледно-серым шрифтом четвертого кегля: «только если вам этого не избежать, и вы очень хорошо понимаете, на что идете, и чем рискуете». Это связано с тем, что макросы имеют доступ ко всему AST модуля, в котором они используются, и, вообще говоря, могут до неузнаваемости изменить получившийся код.


                        Я в принципе согласен, что не следует использовать макросы в процессе ознакомления с языком. Пока вы не можете, будучи разбуженным в три часа ночи с похмелья, ответить на вопрос, выполняется ли этот код на стадии компиляции, или же в рантайме. Elixir — компилируемый язык, и в процессе компиляции происходит выполнение кода «верхнего уровня», полное раскрытие синтаксического дерева до тех пор, пока мы не окажемся в ситуации, когда дальше раскрывать уже нечего, и вот этот результат в конечном итоге и компилируется в BEAM. Когда компилятор встречает вызов макроса в исходном коде, он полностью раскрывает AST для него и впихивает вместо собственно вызова. Понять это невозможно, это можно только запомнить.

                        Не, попробуем разобраться и понять...
                      • Правила прикорма

                          Что будет, если двухмесячного ребенка накормить бигмаком?
                          Что будет, если тяжелоатлету весом 60 кг на первой неделе тренировок поставить на становую тягу 150 кг?
                          Что будет, если в мясорубку засунуть парочку гвоздей на 200?
                          Примерно то же самое, что дать стажеру задачу по доработке PouchDB, чтобы он умел работать с PostgeSQL.

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

                          Если на заводе ты начальник, и тебе не нравится подчиненный, ты можешь сделать так, чтобы он «подавился». Это прям прием такой. Надо дать задачу, с которой человек заведомо не справится в установленные сроки с оговоренными ресурсами.
                          Читать дальше →
                          • +14
                          • 8,4k
                          • 9
                        • «Красная» корпоративная культура — главная проблема российского бизнеса (Часть 3)

                            image

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

                            Может ли «красный» лидер быть эффективным? (Спойлер: Да, если он не красный).

                            В первой части мы говорили о недостатках «красной» культуры, во второй части упомянули физиологический механизм мотивации сотрудников.

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

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

                            Лидер идеального «красного» государства может смело сказать — «государство это я», а в идеальном «синем» государстве совсем нет лидера — жизнь там течет как известном романе Франца Кафки «Процесс». (с) KonkovVladimir

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

                            Однако не всё безнадёжно в «красной» организации. Сегодня мы поговорим о тех руководителях, которые, находясь в «красной» системе, всё же умеют добиваться высоких результатов.
                            Читать дальше →
                          • «Красная» корпоративная культура – главная проблема российского бизнеса (Часть 2)

                              image

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

                              Система 5С Юрского периода


                              Хочу привести случай из своей практики. На одном из предприятий промышленной компании новое руководство с помпой объявило о внедрении Бережливого производства. Много говорилось о том, как этот новый подход выведет предприятие на новый уровень эффективности. И первым инструментом БП для внедрения была выбрана система 5С на пилотном участке производственного склада.

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

                              — Так это мы уже один раз внедряли 5С три года назад! – радостно пояснил начальник участка, увидев немой вопрос в моих глазах. – Просто со временем как-то всё забылось…

                              Я поинтересовался, а нужно ли внедрять этот инструмент, если он всё равно его не применяет.

                              «Ну как же не внедрять? Дело-то хорошее», — ответил он.

                              Читать дальше →
                            • А что, если без Python? Julia для машинного обучения и вообще

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

                                Обычно эта дилемма решается так: сначала пишут прототип на чем-то гибком, например, на Python или R, а потом переписывают на C/C++ или Fortran. Но этот цикл слишком длинный, можно ли обойтись без этого?



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

                                Глеб объяснит, зачем нужны новые языки и почему иногда Python не хватает. Расскажет, что в Julia интересного, о ее сильных и слабых сторонах, сравнит с другими языками, и покажет, какая у языка перспектива в машинном обучении и вычислениях вообще.

                                Дисклеймер. Здесь не будет разбора синтаксиса. Хабражители опытные разработчики, поэтому нет смысла показывать, как написать цикл, например.
                                Читать дальше →
                              • Зависимые типы в Haskell: почему это будущее разработки программного обеспечения

                                • Перевод


                                В Serokell мы занимаемся не только коммерческими проектами, но стараемся изменить мир к лучшему. Например, работаем над улучшением главного инструмента всех хаскелистов – Glasgow Haskell Compiler (GHC). Мы сосредоточились на расширении системы типов под впечатлением от работы Ричарда Айзенберга "Зависимые типы в Haskell: теория и практика".


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

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