Как стать автором
Обновить
864.21
VK
Технологии, которые объединяют
Сначала показывать

Где покупать радиодетали? Часть II: зарубежные магазины

Время на прочтение5 мин
Количество просмотров90K
Продолжение поста про интернет-магазины электронных компонентов, инструментов и прочих ардуин.


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

Что за черт, Javascript

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


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


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

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

Сравнение производительности версий PHP

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

В этой статье мы рассмотрим результаты нескольких бенчмарков, начиная с PHP 5 и вплоть до экспериментальной JIT-ветки (сейчас в разработке). На момент написания не было известно, появится ли до PHP 8 ещё какая-то основная версия, например PHP 7.2. Но логично предположить, что возможности экспериментальной ветки как минимум будут включены в PHP 8.

«Never say never» или Работаем с таймзонами правильно

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

TL;DR: Работа с таймзонами — это боль и унижение. Никогда не работайте с таймзонами!

Итак, все кругом твердят вам, что при получении времени от пользователя нужно сразу же переводить его в UTC, работать со временем нужно только в UTC и хранить время тоже нужно строго в UTC. Совет, на первый взгляд, выглядит разумным, и следование ему делает вашу жизнь проще… Если только ваша программа не предполагает сложной работы с датами. Записать в базу данных дату и время регистрации пользователя на сайте? Сохранить время отправки сообщения или дату создания заказа в интернет-магазине? Вывести сообщение в лог с указанием даты-времени? Используйте UTC и всё будет в порядке, можете даже не читать эту статью дальше. Любое текущее время можно совершенно спокойно конвертировать в UTC и забыть о проблемах. Но что, если мы хотим работать с временем в будущем? Или в прошлом? Например, если мы пишем сервис календаря, или сервис для отложенной отправки сообщений?

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

Как создать орка: краткая инструкция

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


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

На КДПВ — представитель орков – это одна из самых древних рас в «Аллодах Онлайн». Они жуткие, могущественные, выносливые. Объединяются в орды для набегов и редко останавливаются на одном месте, чтобы осесть там навсегда. Чаще они строят временные жилища, которые не жалко бросить. Это самая анархичная и свободолюбивая из созданий игрового мира «Аллодов».

Неудивительно, что наши художники, создавая этих персонажей, потрудились на славу. И, конечно, решили создать реальные скульптуры. За помощью обратились к ребятам из Prosto Toys. Если вы играете в “Аллоды Онлайн”, то знаете, что наш орк не огромный мутант, а скорее мускулистый футбольный болельщик: в меру упитанный и в полном расцвете сил. И поэтому модель для создания фигурки выбирали соответствующую: парня в отличной форме, часто бывающего в спортивном зале. Однако из-за его рельефных мышц он оказался не способен принять нужную импульсивную позу. Мастера взяли его за образец, но немного изменили фигурку. Как видите по фото – поза получилась яркой, спина героя выгнута, а мышцы значительно увеличены.

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

Головоломки TCP

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

Говорят, что нельзя полностью понять систему, пока не поймёшь её сбои. Ещё будучи студентом я ради забавы написал реализацию TCP, а потом несколько лет проработал в IT, но до сих пор продолжаю глубже и глубже изучать работу TCP — и его ошибки. Самое удивительное, что некоторые из этих ошибок проявляются в базовых вещах. И они неочевидны. В этой статье я преподнесу их как головоломки, в стиле Car Talk или старых головоломок Java. Как и любые другие хорошие головоломки, их очень просто воспроизвести, но решения обычно удивляют. И вместо того, чтобы фокусировать наше внимание на загадочных подробностях, эти головоломки помогают изучить некоторые глубинные принципы работы TCP.
Читать дальше →

Проблемы при использовании Math.random()

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

В английском есть такая аббревиатура — TIFU. Привести здесь её точное значение мы не можем, но вы без труда найдёте его в Сети. А после «литературной обработки» TIFU можно перевести как «сегодня я всё испортил». В контексте этого поста данная фраза относится к использованию функции Math.random() в JavaScript-движке V8. Хотя случилось это не сегодня, а пару лет назад. Да и дров я наломал не по своей вине, корень зла таится в самой этой функции.

«Многие генераторы случайных чисел, используемые сегодня, работают не слишком хорошо. Разработчики обычно стараются не вникать, как устроены такие подпрограммы. И часто бывает так, что какой-то старый, неудовлетворительно работающий метод раз за разом слепо перенимается многими программистами, которые зачастую просто не знают о присущих ему недостатках»

Дональд Кнут, «Искусство программирования», том 2.

Надеюсь, что к концу этого поста вы согласитесь с двумя утверждениями:

  • Мы были идиотами, поскольку использовали генератор псевдослучайных чисел в V8, не понимая его ограничений. И если очень лень, то безопаснее использовать криптографически стойкие генераторы псевдослучайных чисел.
  • В V8 необходима новая реализация Math.random(). Работу текущего алгоритма, кочующего от одного программиста к другому, нельзя считать удовлетворительной из-за слабой, неочевидной деградации, часто встречающейся в реальных проектах.

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

Поиск с помощью регулярных выражений может быть простым и быстрым

Время на прочтение21 мин
Количество просмотров49K
В этой статье мы рассмотрим два способа поиска с помощью регулярных выражений. Один широко распространён и используется в стандартных интерпретаторах многих языков. Второй мало где применяется, в основном в реализациях awk и grep. Оба подхода сильно различаются по своей производительности:



В первом случае поиск занимает A?nAn времени, во втором — An.

Степени обозначают повторяемость строк, то есть A?3A3 — это то же самое, что и A?A?A?AAA. Графики отражают время, требуемое для поиска через регулярные выражения.

Обратите внимание, что в Perl для поиска строки из 29 символов требуется более 60 секунд. А при втором методе — 20 микросекунд. Это не ошибка. При поиске 29-символьной строки Thompson NFA работает примерно в миллион раз быстрее. Если нужно найти 100-символьную строку, то Thompson NFA справится менее чем за 200 микросекунд, а Perl понадобится более 1015 лет. Причём он взят лишь для примера, во многих других языках наблюдается та же картина — в Python, PHP, Ruby и т. д. Ниже мы рассмотрим этот вопрос более детально.

Наверняка вам трудно поверить приведённым данным. Если вы работали с Perl, то вряд ли подмечали за ним низкую производительность при работе с регулярными выражениями. Дело в том, что в большинстве случаев Perl обращается с ними достаточно быстро. Однако, как следует из графика, можно столкнуться с так называемыми патологическими регулярными выражениями, на которых Perl начинает буксовать. В то же время у Thompson NFA такой проблемы нет.

Возникает логичный вопрос: а почему бы в Perl не использовать метод Thompson NFA? Это возможно и следует делать, и об этом пойдёт далее речь.
Читать дальше →

Вирусы. Вирусы? Вирусы! Часть 1

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


Поговорим о компьютерных вирусах? Нет, не о том, что вчера поймал ваш антивирус. Не о том, что вы скачали под видом инсталлятора очередного Photoshop. Не о rootkit-e, который стоит на вашем сервере, маскируясь под системный процесс. Не о поисковых барах, downloader-ах и другой малвари. Не о коде, который делает плохие вещи от вашего имени и хочет ваши деньги. Нет, всё это коммерция, никакой романтики…

Мы поговорим о компьютерных вирусах, как о коде, который способен порождать собственные копии, изменяясь от поколения к поколению. Которому, как и его биологическим собратьям, необходим файл-носитель, работоспособный, и остающийся работоспособным, чтобы давать жизнь новым поколениям вируса. Которому для размножения необходима благодатная среда, много вкусных исполняемых файлов, а также, много глупых и активных пользователей, чтобы они их запускали. Так что название «вирус» не просто красивый ярлычок для описания вредоносной программы, компьютерный вирус, в его классическом понимании, является сущностью весьма близкой к его биологическому аналогу. Человечество, как это не раз доказывалось, способно создавать весьма изощренные решения, особенно когда дело касается создания чего-нибудь наносящего вред другим людям.
Читать дальше →

Mail.Ru Group объявляет о старте программы поиска уязвимостей

Время на прочтение4 мин
Количество просмотров31K
Мы уверены, что обратная связь — один из главных способов делать сервисы не только удобнее, но и безопаснее. Если хочешь, чтобы защита была по-настоящему эффективной, — дай проверить ее на прочность исследователям.

Mail.Ru Group объявляет о старте программы поиска уязвимостей: теперь мы будем выплачивать награды за обнаружение проблем в безопасности наших проектов. Программа будет реализовываться вместе с одним из самых авторитетных в мире хакерских коммьюнити HackerOne.



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

Как работает оптимизирующий компилятор

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

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

В этой статье мы рассмотрим некоторые из основных методик приведения (inference techniques) в оптимизирующих компиляторах: как спроектировать программу, с которой компилятору будет легко работать; какие приведения можно сделать в вашей программе и как использовать их для её уменьшения и ускорения.
Читать дальше →

Гнев на код: программисты и негатив

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


Я смотрю на кусок кода. Возможно, это худший код, что мне когда-либо встречался. Чтобы обновить всего одну запись в базе данных, он извлекает все записи в коллекции, а затем отправляет запрос на обновление каждой записи в базе, даже тех, которые обновлять не требуется. Тут есть map-функция, которая просто возвращает переданное ей значение. Есть условные проверки переменных с очевидно одинаковым значением, просто поименованных в разных стилях (firstName и first_name). Для каждого UPDATE’а код отправляет сообщение в другую очередь, которая обрабатывается другой serverless-функцией, но которая выполняет всю работу для другой коллекции в той же базе данных. Я не упомянул, что эта serverless-функция из облачной «сервис-ориентированной архитектуры», содержащей более 100 функций в окружении?

Как вообще можно было такое сделать? Я закрываю лицо и явственно всхлипываю сквозь смех. Мои коллеги спрашивают, что случилось, и я в красках пересказываю Worst Hits Of BulkDataImporter.js 2018. Все сочувственно кивают мне и соглашаются: как они могли так с нами поступить?
Читать дальше →

Новый чемпионат для backend-разработчиков: HighLoad Cup

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

Проведение конкурсов для IT-специалистов сейчас в моде: Kaggle с его задачами по Data Science, сплоченная тусовка олимпиадного программирования, набирающие популярность площадки для конкурсов по искусственному интеллекту, всевозможные хакатоны для мобильных разработчиков, олимпиады для админов, capture the flag для безопасников. Казалось бы, специалисту любой сферы несложно найти себе подходящую движуху, поучаствовать, прокачаться и что-нибудь выиграть.


Обделенными в этом плане остались лишь web-разработчики. Мы в Mail.Ru Group решили исправить это досадное недоразумение и теперь с радостью представляем вам HighLoadCup — конкурсную площадку на стыке backend-разработки и администрирования web-сервисов.


Если считаете себя хорошим web-разработчиком, умеете в deploy и highload — добро пожаловать!

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

Эксперименты с malloc и нейронными сетями

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


Больше года назад, когда я работал антиспамщиком в Mail.Ru Group, на меня накатило, и я написал про эксперименты с malloc. В то время я в свое удовольствие помогал проводить семинары по АКОСу на ФИВТе МФТИ, и шла тема про аллокацию памяти. Тема большая и очень интересная, при этом охватывает как низкий уровень ядра, так и вполне себе алгоритмоемкие структуры. Во всех учебниках написано, что одна из основных проблем динамического распределения памяти — это ее непредсказуемость. Как говорится, знал бы прикуп — жил бы в Сочи. Если бы оракул заранее рассказал весь план по которому будет выделяться и освобождаться память, то можно было составить оптимальную стратегию, минимизирующую фрагментацию кучи, пиковое потребление памяти и т.д. Отсюда пошла возня с ручными аллокаторами. В процессе раздумий я натолкнулся на отсутствие инструментов логирования malloc() и free(). Пришлось их написать! Как раз про это была статья (а ещe я изучал macOS). Были запланированы две части, однако жизнь круто повернулась и стало не до malloc(). Итак, пора восстановить справедливость и реализовать обещанное: ударить глубоким обучением по предсказанию работы с кучей.


Внутри:


  • Совершенствуем libtracemalloc, перехватчик malloc().
  • Строим LSTM на Keras — глубокую рекуррентную сеть.
  • Обучаем модель на примере работы реального приложения (vcmi/vcmi — а вы думали, причем здесь Heroes III?).
  • Удивляемся неожиданно хорошим результатам.
  • Фантазируем про практическое применение технологии.
  • Исходники.

Интересно? Добро пожаловать под кат.


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

Игры, в которых нужно писать код: Grid Garden, Elevator Saga и другие

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

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

50 оттенков Go: ловушки, подводные камни и распространённые ошибки новичков

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


Go — простой и забавный язык. Но в нём, как и в любых других языках, есть свои подводные камни. И во многих из них сам Go не виноват. Одни — это естественное следствие прихода программистов из других языков, другие возникают из-за ложных представлений и нехватки подробностей. Если вы найдёте время и почитаете официальные спецификации, вики, почтовые рассылки, публикации в блогах и исходный код, то многие из подводных камней станут для вас очевидны. Но далеко не каждый так начинает, и это нормально. Если вы новичок в Go, статья поможет сэкономить немало часов, которые вы бы потратили на отладку кода. Мы будем рассматривать версии Go 1.5 и ниже.
Читать дальше →

Что случилось, когда мы устали смотреть на графики 5 000 серверов в мониторинге (и когда серверов стало более 10 000)

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


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

Точнее, не так. Когда в седой древности появился примерно 20-й сервер, стали использовать Big Brother — простейший мониторинг, который просто собирает статистику и показывает её в виде мелких картинок. Всё очень, очень просто. Ни приблизить, ни как-то ввести диапазоны допустимых изменений нельзя. Только смотреть картинки. Вот такие:


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

Поэтому мы сделали новую систему мониторинга — и сейчас на работу с 10 тысячами серверов тратим по 1-2 часа в неделю на обработку алертов. Расскажу, как это устроено.
Читать дальше →

Особенности файловых систем, с которыми мы столкнулись при разработке механизма синхронизации Облака Mail.Ru

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


Одна из основных функций десктопного клиента Облака Mail.Ru — синхронизация данных. Ее целью является приведение папки на ПК и ее представления в Облаке к одинаковому состоянию. При разработке этого механизма мы встретились с некоторыми, с первого взгляда, достаточно очевидными особенностями различных файловых и операционных систем. Однако если о них не знать, можно столкнуться с довольно неприятными последствиями (не получится загрузить или удалить файл). В этой статье мы собрали особенности, знание которых позволит вам правильно работать с данными на дисках и, возможно, убережет от необходимости срочного хотфикса.
Читать дальше →

Ваш ICQ UIN запущен на другом компьютере? Продолжайте общение на этом!

Время на прочтение2 мин
Количество просмотров55K
Когда-то давным-давно, в девяностые годы, компьютеры были большими, трава зеленой, а вода мокрой. В эти сказочные времена, у кого-то был Интернет дома, у кого-то на работе, но почти ни у кого его не было и там, и там. А уж Интернета на телефоне не было и вовсе ни у кого. (И люди жили, между прочим! Не правда ли, сложно в это поверить?)

image

Придумывая ICQ, его авторы естественно смотрели на окружающий мир (а больше смотреть было не на что, других инстант-мессенджеров в то золотое время не было) и решения принимали соответствующие этому миру:
– никто не работает через Интернет, никому не нужны рабочие контакты дома, давайте хранить контакт-лист на клиенте;
— один человек не может сидеть за двумя клавиатурами, не разрешим одному UIN присоединяться параллельно из двух мест.

Но мир, разумеется, менялся. Уже в начале двухтысячных люди стали активно работать из дома (а некоторые редкие экземпляры занялись личными делами на работе, но об этом тссс, не будем их выдавать) и контакт-листы переместились на сервер. А в 2011-ом пришла пора изменить и другое правило девяностых.

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

Собираем и запускаем Linux-0.01 в Minix 1.5, (почти) как это делал Линус Торвальдс

Уровень сложностиСложный
Время на прочтение28 мин
Количество просмотров12K

Я люблю старые программы, мне нравится их изучать и смотреть, как они развивались и во что сейчас превратились, или умерли, так и не дожив до сегодняшнего дня. Ещё мне нравится смотреть разные YouTube-каналы, посвящённые ретро-тематике, на которых рассказывают об истории программ, игр, игровых приставок или старых компьютеров. Хочу сказать всем этим людям «спасибо» за то, что сохраняете частичку истории технологий. И, вдохновившись их трудами, мне захотелось попробовать самому прикоснутся к истории, собрав и запустив что-то относительно старое, но до сих пор живущее и развивающееся. Мой выбор пал на первую версию Linux, а именно версию 0.01.

Те, кто знаком с ранними днями создания Linux, знают, что Линус Торвальдс писал её для компьютеров на основе 386-х процессоров в пропатченной версия Minix 1.5.10. И не смотря на то, что linux-0.01 собирали не раз, в том числе и на современных версиях компилятора, мне хотелось побыть хоть немного в шкуре самого Линуса и самому собрать ядро в родной для этой ОС среде. А именно на максимально близком, хоть и виртуальном аппаратном обеспечении, в настоящей Minix 1.5.10 (точнее, Minix-386) с древней версией GCC 1.37.1

17 сентября ядру Linux исполнится 32 года. Это прекрасный повод вспомнить, как всё начиналось…

Читать далее

Информация

Сайт
team.vk.company
Дата регистрации
Дата основания
Численность
свыше 10 000 человек
Местоположение
Россия
Представитель
Дмитрий Головин