Как стать автором
Обновить
26
0

Пользователь

Отправить сообщение

Lock-free структуры данных. Concurrent map: разминка

Время на прочтение9 мин
Количество просмотров57K

Мне оказали честь — пригласили выступить на первой конференции C++ 2015 Russia 27-28 февраля. Я был насколько наглым, что запросил 2 часа на выступление вместо положенного одного и заявил тему, наиболее меня интересующую — конкурентные ассоциативные контейнеры. Это hash set/map и деревья. Организатор sermp пошел навстречу, за что ему большое спасибо.
Как подготовиться ко столь ответственному испытанию выступлению? Первое — нарисовать презентацию, то есть кучу картинок, желательно близко к теме. Но надо ещё и два часа озвучивать картинки, — как все это запомнить? Как избежать глубокомысленных «ээээмммм», «здесь мы видим», «на этом слайде показано», несвязных прыжков повествования и прочих вещей, характеризующих выступающего c не очень хорошей стороны в части владения родным языком (это я про русский, с C++ я разобрался быстро — никакого кода в презентации, только картинки)?
Конечно, надо записать свои мысли, глядя на слайды. А если что-то написано, то не худо бы и опубликовать. А если публиковать, — то на хабре.
Итак, по следам C++ 2015 Russia! Авторское изложение, надеюсь, без авторского косноязычия, без купюр и с отступлениями по теме, написанное до наступления события, в нескольких частях.
Читать дальше →
Всего голосов 55: ↑52 и ↓3+49
Комментарии24

Centrifugo – 3.5 миллиона оборотов в минуту

Время на прочтение9 мин
Количество просмотров40K


Последний раз я писал про Centrifugo чуть больше года назад. Пришло время напомнить о существовании проекта и рассказать, что произошло за этот период времени. Чтобы статья не скатилась в скучное перечисление изменений, я попробую сконцентрировать внимание на некоторых Go библиотеках, которые помогли мне в разработке – возможно, вы почерпнете для себя что-то полезное.
Читать дальше →
Всего голосов 48: ↑47 и ↓1+46
Комментарии25

Отказоустойчивая обработка 10M OAuth-токенов на Tarantool

Время на прочтение13 мин
Количество просмотров9.9K

image


Многие уже наслышаны о производительности СУБД Tarantool, её возможностях и особенностях. Например, у него есть классное дисковое хранилище — Vinyl, кроме того, он умеет работать с JSON-документами. Но в многочисленных публикациях обходят стороной одну важную особенность. Обычно БД рассматривают просто как хранилище, но всё же отличительная черта Tarantool — это возможность писать код внутри и очень эффективно работать с этими данными. Под катом рассказ, как мы строили одну систему почти полностью внутри Tarantool, написанный в соавторстве с Игорем igorcoding Латкиным.

Читать дальше →
Всего голосов 58: ↑55 и ↓3+52
Комментарии2

Вызов функций Go из других языков

Время на прочтение9 мин
Количество просмотров23K

image


С версии 1.5 компилятор Go поддерживает несколько режимов сборки, определяемых флагом buildmode. Их ещё называют режимами исполнения Go (Go Execution Modes). С их помощью go tool может компилировать пакеты Go в нескольких форматах, включая архивы и библиотеки общего пользования Go (shared libraries), архивы и библиотеки общего пользования Си, а с версии 1.8 — и динамические плагины Go.


В статье мы рассмотрим компилирование пакетов Go в библиотеки Си. В этом режиме сборки компилятор генерирует стандартный бинарный файл объекта (shared object) (.so), передавая функции Go в качестве API в стиле Си. Мы поговорим о том, как создавать библиотеки Go, которые можно вызывать из C, Python, Ruby, Node и Java.


Весь код доступен на GitHub.

Читать дальше →
Всего голосов 57: ↑55 и ↓2+53
Комментарии23

Я написал самую быструю хеш-таблицу

Время на прочтение29 мин
Количество просмотров70K

image


В конце концов я должен был к этому прийти. Когда-то я опубликовал статью «Я написал быструю хеш-таблицу», а потом ещё одну — «Я написал ещё более быструю хеш-таблицу». Теперь я завершил работу над самой быстрой хеш-таблицей. И под этим я подразумеваю, что реализовал самый быстрый поиск по сравнению со всеми хеш-таблицами, какие мне только удалось найти. При этом операции вставки и удаления также работают очень быстро (хотя и не быстрее конкурентов).


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


Если вы хотите только попробовать её в работе, то можете скачать отсюда. Либо пролистайте вниз до раздела «Исходный код и использование». Хотите подробностей — читайте дальше.

Читать дальше →
Всего голосов 130: ↑123 и ↓7+116
Комментарии25

Новости наших онлайн-курсов: обновлен курс «Web-технологии» и добавлен «Постановка задачи на разработку ПО»

Время на прочтение4 мин
Количество просмотров8.8K

image


Обновленный курс «Web-технологии» на платформе Stepik теперь поддерживает последнюю версию Django и возможность вести разработку как на Python 2, так и на Python 3. Преподаватели курса — Дмитрий Смаль и Динар Сабитов, web-программисты из игрового направления Mail.Ru Group. Второго марта мы перезапускаем «Постановку задачи на разработку ПО» без дедлайнов, чтобы вы смогли пройти курсы в удобное время и получить сертификаты. Преподаватель курса — Дмитрий Безуглый, генеральный директор в компании «Системный подход», бизнес-аналитик и системный аналитик.

Читать дальше →
Всего голосов 32: ↑31 и ↓1+30
Комментарии0

Открытый курс машинного обучения. Тема 1. Первичный анализ данных с Pandas

Уровень сложностиПростой
Время на прочтение15 мин
Количество просмотров1.1M


Открытый курс машинного обучения mlcourse.ai сообщества OpenDataScience – это сбалансированный по теории и практике курс, дающий как знания, так и навыки (необходимые, но не достаточные) машинного обучения уровня Junior Data Scientist. Нечасто встретите и подробное описание математики, стоящей за используемыми алгоритмами, и соревнования Kaggle Inclass, и примеры бизнес-применения машинного обучения в одном курсе. С 2017 по 2019 годы Юрий Кашницкий yorko и большая команда ODS проводили живые запуски курса дважды в год – с домашними заданиями, соревнованиями и общим рейтингом учаcтников (имена героев запечатлены тут). Сейчас курс в режиме самостоятельного прохождения.

Читать дальше →
Всего голосов 44: ↑43 и ↓1+42
Комментарии61

Что такое платформа Tarantool IIoT?

Время на прочтение11 мин
Количество просмотров15K

image


Недавно в пресс-релизе мы рассказали о том, что запустили Tarantool IIoT — платформу для промышленного интернета вещей. Новость облетела многие электронные издания. Но что такое Tarantool IIoT и как он работает — тема оставалась не до конца раскрытой. Мы решили это исправить. Подробности под катом.

Читать дальше →
Всего голосов 39: ↑39 и ↓0+39
Комментарии44

Протокол QUIC: переход Web от TCP к UDP

Время на прочтение9 мин
Количество просмотров89K
Протокол QUIC (название расшифровывается как Quick UDP Internet Connections) — совершенно новый способ передачи информации в интернете, построенный поверх протокола UDP, вместо общепринятого ранее использования TCP. Некоторые люди называют его (в шутку) TCP/2. Переход к UDP — наиболее интересная и мощная особенность протокола, из которой следуют некоторые другие особенности.

Сегодняшний Web построен на протоколе TCP, который был выбран за его надёжность и гарантированность доставки пакетов. Для открытия TCP-соединения используется так называемое «трёхкратное рукопожатие». Это означает дополнительные циклы отправки-приёма сообщений для каждого нового соединения, что увеличивает задержки.

image

Если вы захотите установить защищённое TLS-соединение, придётся переслать ещё больше пакетов.

image

Некоторые инновации, вроде TCP Fast Open, улучшат некоторые аспекты ситуации, но эта технология пока не очень широко распространена.

Протокол UDP, с другой стороны, построен на идее «отправить пакет и забыть о нём». Сообщение, отправленное по UDP, будет доставлено получателю (не гарантированно, с некоторой вероятностью успеха). Яркое преимущество здесь в меньшем времени установки соединения, такой же яркий недостаток — негарантированность доставки или порядка прихода пакетов получателю. Это означает, что для обеспечения надёжности придётся построить некоторый механизм поверх UDP, который гарантирует доставку пакетов.

И здесь на сцену выходит QUIC от Google.
Читать дальше →
Всего голосов 37: ↑35 и ↓2+33
Комментарии23

Переезд на Yandex ClickHouse

Время на прочтение18 мин
Количество просмотров31K


Александр Зайцев отвечает на вопросы относительно переезда на Yandex ClickHouse. Это — расшифровка доклада Highload++ 2016.

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

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

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

Всё это совершенно новый и достаточно специфический опыт, он требует большой работы для того чтобы всё получилось хорошо. Какие-то простые вещи работают сразу, например, логи загрузить. А какие-то не очень простые вещи работают совсем не сразу. В конце концов, я убеждён что у всех всё получится, потому что у нас получилось. Мы прорвались через все препятствия.
Всего голосов 50: ↑47 и ↓3+44
Комментарии4

Эвристическая сеть — аналог рекуррентной нейронной сети для программы чат бот

Время на прочтение5 мин
Количество просмотров8.9K
В статье представлен алгоритм эвристической сети по некоторым свойствам аналогичный рекуррентной нейронной сети для программы виртуального собеседника. Алгоритм усовершенствован с использованием толкового словаря русского языка. В эвристическую сеть внедрен генератор новых ответов на базе статистической информации базы знаний.
Читать дальше →
Всего голосов 16: ↑13 и ↓3+10
Комментарии8

Обучение с подкреплением: от Павлова до игровых автоматов

Время на прочтение9 мин
Количество просмотров13K

История обучения с подкреплением в зависимости от того, как считать насчитывает от полутора веков до 60 лет. Последняя волна (которая захлестывает сейчас нас всех) началась вместе с подъемом всего машинного обучения в середине 90-ых годов 20-ого века. Но люди, которые сейчас на гребне этой волны начинали само собой не сейчас, а во время предыдущего всплеска интереса — в 80-ых. В процессе знакомства с историей нам встретятся многие персонажи, который сыграли роль в становлении учения об искусственном интеллекте (которое мы обсуждали в прошлой статье). Само собой, это неудивительно, ведь обучение с подкреплением — его неотъемлемая часть. Хотя обо всем по порядку.


Само название “обучение с подкреплением” взято из работ известного русского физиолога, нобелевского лауреата Ивана Петровича Павлова. В 1923 вышел его труд “Двадцатилетний опыт объективного изучения высшей нервной деятельности (поведения) животных” [1], известный на западе как Conditional Reflexes [2]. Но психологические подходы были известны и ранее.

Читать дальше →
Всего голосов 17: ↑16 и ↓1+15
Комментарии0

Нейронные сети в картинках: от одного нейрона до глубоких архитектур

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

В статье мы пойдём по другому пути. Начнём с самой простой конфигурации — одного нейрона с одним входом и одним выходом, без активации. Далее будем маленькими итерациями усложнять конфигурацию сети и попробуем выжать из каждой из них разумный максимум. Это позволит подёргать сети за ниточки и наработать практическую интуицию в построении архитектур нейросетей, которая на практике оказывается очень ценным активом.
Читать дальше →
Всего голосов 67: ↑62 и ↓5+57
Комментарии53

Tarantool: нагрузочное тестирование

Время на прочтение7 мин
Количество просмотров11K

В статье "Tarantool: Хороший, Плохой, Злой" был описан простой сервис голосования с действующим примером на PHP. Мы увидели, как легко подключить и использовать эту NoSQL базу данных в своих программах. Однако остался без внимания один важный вопрос – зачем это? Какой выигрыш в производительности дает использование NoSQL по сравнению с обычными базами данных?
Читать дальше →
Всего голосов 35: ↑31 и ↓4+27
Комментарии23

Pygest #3. Релизы, статьи, интересные проекты из мира Python [30 января 2017 — 13 февраля 2017]

Время на прочтение2 мин
Количество просмотров9.8K
image Всем привет! Это уже третий выпуск дайджеста на Хабрахабр о новостях из мира Python. В сегодняшнем выпуске вы найдёте интересные материалы, касающиеся машинного обучения, популярных фреймворков, внутреннего устройства языка и много другого. Присылайте свои актуальные материалы, а также любые замечания и предложения, которые будут добавлены в ближайший дайджест.

А теперь к делу!
Перейти к дайджесту
Всего голосов 22: ↑22 и ↓0+22
Комментарии10

Подходы к проектированию RESTful API

Время на прочтение17 мин
Количество просмотров147K

Автор: Вячеслав Михайлов, Solutions Architect.

В этой статье я поделюсь опытом проектирования RESTful API — на конкретных примерах покажу, как делать хотя бы простые сервисы красиво. Также мы поговорим, что такое API и зачем он нужен, поговорим об основах REST — обсудим, на чем его можно реализовывать; коснемся основных веб-практик, которые зависят и не зависят от этой технологии. Также узнаем, как составлять хорошую документацию, затрачивая на это минимум усилий, и посмотрим, какие существуют способы нумерации версий для RESTful API.

Часть 1. Теория


Итак, как мы все знаем, API — application programming interface (интерфейс программирования приложений), набор правил и механизмов, с помощью которых одно приложение или компонент взаимодействует с другими

Почему хороший API — это важно?

  • Простота использования и поддержки. Хороший API просто использовать и поддерживать.
  • Хорошая конверсия в среде разработчиков. Если всем нравится ваш API, к вам приходят новые клиенты и пользователи.
  • Выше популярность вашего сервиса. Чем больше пользователей API, тем выше популярность вашего сервиса.
  • Лучше изоляция компонентов. Чем лучше структура API, тем лучше изоляция компонентов.
  • Хорошее впечатление о продукте. API — это как бы UI разработчиков; это то, на что разработчики обращают внимание в первую очередь при встрече с продуктом. Если API кривой, вы как технический эксперт не будете рекомендовать компаниям использовать такой продукт, приобретая что-то стороннее.


Теперь посмотрим, какие бывают виды API.

Виды API по способу реализации:
  • Web service APIs
    • XML-RPC and JSON-RPC
    • SOAP
    • REST

  • WebSockets APIs
  • Library-based APIs
    • Java Script

  • Class-based APIs
    • C# API
    • Java



Виды API по категориям применения:

  • OS function and routines
    • Access to file system
    • Access to user interface

  • Object remoting APIs
    • CORBA
    • .Net remoting

  • Hardware APIs
    • Video acceleration (OpenCL…)
    • Hard disk drives
    • PCI bus



Читать дальше →
Всего голосов 26: ↑24 и ↓2+22
Комментарии37

Устранение утечек памяти в приложении на Питоне

Время на прочтение7 мин
Количество просмотров37K
imageНедавно мне довелось разобраться и устранить несколько утечек памяти в популярном фреймворке Торнадо. Не беда, если вы никогда его не использовали, потому что описанное будет мало связано с ним. Рассказать я хочу о методах, которые я использовал для поиска и устранения утечек.

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

Это схема отлично работает до тех пор, пока не появляются объекты, ссылающиеся друг на друга. Самый простой пример — узлы какого-то дерева, хранящие ссылки на свои дочерние и родительский узлы. Узлы продолжат ссылаться друг на друга, даже когда не останется других внешних ссылок ни на один из них. Самое неприятное, что такие узлы могут ссылаться на какие-то другие данные и не давать их освободить. Чтобы устранить такие циклические ссылки, в Питоне существует второй механизм освобождения памяти — сборщик мусора. Он запускается время от времени, ставя выполнение остального кода на паузу, и анализирует все неосвобожденные объекты.

Формально, циклические ссылки нельзя назвать утечками: сборка мусора рано или поздно уничтожит такие объекты. Беда только в том, что Питон не может сам определить, когда еще рано, а когда уже поздно. В моем случае система просто прибивала процесс с Питоном, если сборка мусора не начиналась вовремя.
Читать дальше →
Всего голосов 98: ↑95 и ↓3+92
Комментарии8

Master-master репликация и масштабирование приложений между всеми IoT-устройствами и облаком

Время на прочтение8 мин
Количество просмотров11K

На фото представлены устройства, использованные для прототипирования. Как видно, за основу взята процессор x86 (Intel Edison)

Всем привет. В этой статье я хотел бы поделиться опытом решения одной интересной проблемы, связанной с синхронизацией данных между IoT-устройствами и облачным приложением. Сначала я расскажу об основной идее и целях моего проекта, а затем подробно опишу его техническую сторону и реализацию: речь пойдет об ОС Contiki, базах данных, протоколах и подобных аспектах. В заключение я кратко перечислю технологии, использованные при построении системы.
Читать дальше →
Всего голосов 37: ↑36 и ↓1+35
Комментарии16

Как найти свою первую работу программистом? От резюме до испытательного срока

Время на прочтение9 мин
Количество просмотров233K
image

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

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

Итак, как же новичку получить первую работу?
Читать дальше →
Всего голосов 49: ↑42 и ↓7+35
Комментарии106

Горизонтальное масштабирование. Что, зачем, когда и как?

Время на прочтение17 мин
Количество просмотров123K
Александр Макаров

Александр Макаров ( SamDark )


Здравствуйте! Я Александр Макаров, и вы можете меня знать по фреймворку «Yii» — я один из его разработчиков. У меня также есть full-time работа — и это уже не стартап — Stay.com, который занимается путешествиями.

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

Что такое масштабирование, вообще? Это возможность увеличить производительность проекта за минимальное время путем добавления ресурсов.

Обычно масштабирование подразумевает не переписывание кода, а либо добавление серверов, либо наращивание ресурсов существующего. По этому типу выделяют вертикальное и горизонтальное масштабирование.
Читать дальше →
Всего голосов 52: ↑47 и ↓5+42
Комментарии17

Информация

В рейтинге
Не участвует
Работает в
Зарегистрирован
Активность