Pull to refresh
2
0
Дмитрий @dastanaron_dev

Программист

Send message

Нечёткий поиск в тексте и словаре

Reading time13 min
Views265K

Введение


Алгоритмы нечеткого поиска (также известного как поиск по сходству или fuzzy string search) являются основой систем проверки орфографии и полноценных поисковых систем вроде Google или Yandex. Например, такие алгоритмы используются для функций наподобие «Возможно вы имели в виду …» в тех же поисковых системах.

В этой обзорной статье я рассмотрю следующие понятия, методы и алгоритмы:
  • Расстояние Левенштейна
  • Расстояние Дамерау-Левенштейна
  • Алгоритм Bitap с модификациями от Wu и Manber
  • Алгоритм расширения выборки
  • Метод N-грамм
  • Хеширование по сигнатуре
  • BK-деревья
А также проведу сравнительное тестирование качества и производительности алгоритмов.
Читать дальше →
Total votes 171: ↑170 and ↓1+169
Comments33

Нейронные сети на JS. Создавая сеть с нуля

Reading time8 min
Views91K

КПДВ про нейронные сети


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


Но врожденные любознательность и энтузиазм довели меня до того, что я стал одним из разработчиков Synaptic — проекта фреймворка для построения нейронных сетей на JS с 3к+ звезд на GitHub. Сейчас мы с автором фреймворка занимаемся созданием Synaptic 2.0 с ускорением на GPU и WebWorker-ах и с поддержкой почти всех основных фич любого приличного NN-фреймворка.


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

Читать дальше →
Total votes 53: ↑51 and ↓2+49
Comments43

Нейронные сети на Javascript

Reading time7 min
Views167K
image
Идея для написания этой статьи возникла прошлым летом, когда я слушал доклад на конференции BigData по нейронным сетям. Лектор «посыпал» слушателей непривычными словечками «нейрон», «обучающая выборка», «тренировать модель»… «Ничего не понял — пора в менеджеры», — подумал я. Но недавно тема нейронных сетей все же коснулась моей работы и я решил на простом примере показать, как использовать этот инструмент на языке JavaScript.

Мы создадим нейронную сеть, с помощью которой будем распознавать ручное написание цифры от 0 до 9. Рабочий пример займет несколько строк. Код будет понятен даже тем программистам, которые не имели дело с нейронными сетями ранее. Как это все работает, можно будет посмотреть прямо в браузере.
Читать дальше →
Total votes 58: ↑54 and ↓4+50
Comments79

Обход ReCaptcha в Selenium тестах

Reading time4 min
Views62K
ReCaptcha (она же всенародно любимая «капча») — одна из самых болезненных вещей, с которой может столкнуться автоматизатор тестирования на своём пути. В Сети гуляют тысячи разнообразных видео, записанных выходцами из солнечной Индии, касательно того, какими танцами с бубном возможно обмануть этого зверя. Действительно, достаточно сложно пытаться взаимодействовать с помощью запрограммированных скриптов со штукой, основная цель которой — убедиться что «вы не робот».

Очень важный дисклеймер: обмануть капчу невозможно.

Если вы уже столкнулись с этой проблемой, и читаете эту статью, пытаясь нагуглить рецепт панацеи, то знайте, что его не существует. Тем более, в вашей голове уже скорее всего возникли инновационные мысли о том, чтобы сымитировать реалистичное поведение пользователя с помощью WebDriver, путём рандомного mouse overing'а элементов, кликов по инпутам, и бережно расставленных Thread.sleep(). Абсолютно точно известно, что этот подход работать не будет, не тратьте свое время попусту.

image

Получается, выхода нет?
Читать дальше →
Total votes 17: ↑15 and ↓2+13
Comments18

Собеседование здорового человека

Reading time4 min
Views98K
Эта статья написана как ответ на статью «Собеседование в Додо Пиццу» со стороны разработчика с опытом синьора. Я не претендую на истинность суждений, мне хотелось бы выразить довольно популярное среди моих знакомых мнение о процессе найма в частности и жизни разработчика в целом.
Читать дальше →
Total votes 291: ↑277 and ↓14+327
Comments473

Шпаргалка по Redis

Reading time8 min
Views383K
Про Redis (официальный сайт, материалы на Хабре) написано много, но мне до сего дня не хватало материала, который послужил бы шпаргалкой по его практическому использованию, а так же справочником по базовым теоретическим моментам. Постараюсь заполнить этот пробел в богатой базе знаний Хабра.

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

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

Ключи


Redis — хранилище данных в формате «ключ-значение». Факты о ключах:
  • Ключи в Redis — бинарно-безопасные (binary safe) строки.
  • Слишком длинные ключи — плохая идея, не только из-за занимаемой памяти, но так же и в связи с увеличением времени поиска определенного ключа в множестве в связи с дорогостоящим сравнением.
  • Хорошая идея — придерживаться схемы при построении ключей: «object-type:id:field».


Типы данных Redis


  • Строки (strings). Базовый тип данных Redis. Строки в Redis бинарно-безопасны, могут использоваться так же как числа, ограничены размером 512 Мб.
  • Списки (lists). Классические списки строк, упорядоченные в порядке вставки, которая возможна как со стороны головы, так и со стороны хвоста списка. Максимальное количество элементов — 232 — 1.
  • Множества (sets). Множества строк в математическом понимании: не упорядочены, поддерживают операции вставки, проверки вхождения элемента, пересечения и разницы множеств. Максимальное количество элементов — 232 — 1.
  • Хеш-таблицы (hashes). Классические хеш-таблицы или ассоциативные массивы. Максимальное количество пар «ключ-значение» — 232 — 1.
  • Упорядоченные множества (sorted sets). Упорядоченное множество отличается от обычного тем, что его элементы упорядочены по особому параметру «score».

Про типы данных Redis есть отдельная хорошая статья: «Структуры данных, используемые в Redis».
Читать дальше →
Total votes 47: ↑43 and ↓4+39
Comments16

Как настроить Elasticsearch, чтобы не было утечек

Reading time5 min
Views15K
За последний год возникало много утечек из баз Elasticsearch (вот, вот и вот). Во многих случаях в базе хранились персональные данные. Этих утечек можно было избежать, если бы после разворачивания базы администраторы потрудились проверить несколько несложных настроек. Сегодня о них и поговорим.

Сразу оговоримся, что в своей практике используем Elasticsearch для хранения логов и анализа журналов средств защиты информации, ОС и ПО в нашей IaaS-платформе, соответствующей требования 152-ФЗ, Cloud-152. 


Читать дальше →
Total votes 19: ↑15 and ↓4+15
Comments6

Electron: разработка настольных приложений с использованием HTML, CSS и JavaScript

Reading time8 min
Views137K
Можно ли, используя HTML, CSS и JavaScript, создавать настольные приложения? Автор статьи, перевод которой мы сегодня публикуем, даёт утвердительный ответ на этот вопрос. Здесь он расскажет о том, как, применяя веб-технологии и пользуясь возможностями фреймворка Electron, создавать кроссплатформенные приложения для настольных операционных систем.


Читать дальше →
Total votes 45: ↑33 and ↓12+21
Comments87

19 команд ffmpeg для любых нужд

Reading time3 min
Views572K
От переводчика:
Многие знают, что ffmpeg — это сила, но не все знают, какая именно. Он многогранен и безграничен, а его man объёмен и местами малопонятен, лишь немногие постигли дао профессиональной работы с ним. И тем не менее, этот инструмент может быть полезен почти всем, кто хоть иногда работает с видео и звуком, даже на бытовом уровне. О некоторых полезных консольных командах ffmpeg и пойдёт речь в статье. В некоторых местах я взял на себя смелость вставить ссылки на поясняющие статьи.


ffmpeg — это кроссплатформенная open-source библиотека для обработки видео- и аудиофайлов. Я собрал 19 полезных и удивительных команд, покрывающих почти все нужды: конвертация видео, извлечение звуковой дорожки, конвертирование для iPod или PSP, и многое другое.

1. Получение информации о видеофайле

ffmpeg -i video.avi

2. Превратить набор картинок в видео

ffmpeg -f image2 -i image%d.jpg video.mpg

Эта команда преобразует все картинки из текущей директории (названные image1.jpg, image2.jpg и т.д.) в видеофайл video.mpg

(примечание переводчика: мне больше нравится такой формат:
ffmpeg -r 12 -y -i "image_%010d.png" output.mpg

здесь задаётся frame rate (12) для видео, формат «image_%010d.png» означает, что картинки будут искаться в виде image_0000000001.png, image_0000000002.png и тд, то есть, в формате printf)
Читать дальше →
Total votes 222: ↑214 and ↓8+206
Comments107

Защита вашего GraphQL API от уязвимостей

Reading time5 min
Views7.2K

Привет, Хабр! Представляю вашему вниманию перевод статьи Protecting Your GraphQL API From Security Vulnerabilities.


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


image

Читать дальше →
Total votes 11: ↑8 and ↓3+7
Comments0

Пробуем preload (PHP 7.4) и RoadRunner

Reading time14 min
Views32K


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

Мы часто пишем и говорим о производительности PHP: как мы ей занимаемся в целом, как мы сэкономили 1 млн долларов при переходе на PHP 7.0, а также переводим разные материалы на эту тему. Это вызвано тем, что аудитория наших продуктов растёт, а масштабирование PHP-бэкенда при помощи железа сопряжено со значительными затратами — у нас 600 серверов с PHP-FPM. Поэтому инвестирование времени в оптимизацию для нас выгодно.

Прежде мы говорили в основном об обычных и уже устоявшихся способах работы с производительностью. Но сообщество PHP не дремлет! В PHP 8 появится JIT, в PHP 7.4 — preload, а за пределами core-разработки PHP развиваются фреймворки, подразумевающие работу PHP как демона. Пора поэкспериментировать с чем-то новым и посмотреть, что это может нам дать.

Так как до релиза PHP 8 ещё далеко, а асинхронные фреймворки плохо подходят для наших задач (почему — расскажу ниже), сегодня остановимся на preload, который появится в PHP 7.4, и фреймворке для демонизации PHP — RoadRunner.

Это текстовая версия моего доклада с Badoo PHP Meetup #3. Видео всех выступлений мы собрали в этом посте.
Читать дальше →
Total votes 114: ↑111 and ↓3+108
Comments52

Изучаем PHP изнутри. Zval

Reading time10 min
Views52K
Эта статья базируется на главе Zvals книги PHP Internals Book, переводом которой на русский язык я сейчас занимаюсь [1]. Книга ориентирована в первую очередь на C-программистов, желающих писать свои расширения для PHP, но, я уверен, что она окажется полезной и для PHP-разработчиков, так как описывает внутреннюю логику работы интерпретатора. В статье я оставил только базовую теорию, которая должна быть понятна всем разработчикам (даже не знакомым с PHP или C). За более полным изложением материала обратитесь к книге.

Задачка для привлечения внимания. Каким будет результат выполнения следующего кода?
$obj1 = new StdClass();
$obj2 = new StdClass();

$obj1->value = 1;
$obj2->value = 1;

function f1($o) {
  $o = 100;
}

function f2($o) {
  $o->value = 100;
}

f1($obj1);
f2($obj2);

var_dump($obj1);
var_dump($obj2);


Ответ
object(stdClass)#1 (1) { [«value»]=> int(1) }
object(stdClass)#2 (1) { [«value»]=> int(100) }

Если вы точно определили ответ и можете объяснить почему он будет именно таким, то, наверное, вы не узнаете из этой статьи ничего нового, иначе — вам определенно стоит прочитать эту статью, чтобы углубить свои знания.
Читать дальше →
Total votes 54: ↑47 and ↓7+40
Comments37

Соединение компьютер-компьютер через интернет с динамическими IP

Reading time3 min
Views143K
Очень часто мы слышим о том, что установить соединение компьютер-компьютер через интернет с динамическими IP – нереально без внешнего сервера.
А также думал, до определенного времени. Потом у меня закрались подозрения… А после мне стало известно очень многое и тайное.

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

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

Читать дальше →
Total votes 41: ↑22 and ↓19+3
Comments46

Встречайте Space — новый продукт JetBrains

Reading time3 min
Views79K
Привет, Хабр!

На KotlinConf мы представили наш новый продукт Space и открыли программу раннего доступа. В этом посте мы расскажем, что умеет Space, над чем мы работаем сейчас, а также о задачах и проблемах, которые он решает. Посмотреть запись презентации можно в видео ниже.

Total votes 119: ↑113 and ↓6+147
Comments229

SSLH: Прячем SSH/HTTPS/OpenVPN/Telegram за единым портом 443

Reading time3 min
Views122K
image

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

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

В посте мы рассмотрим как в 1 команду спрятать кучу сервисов за 1 портом.
Читать дальше →
Total votes 83: ↑79 and ↓4+75
Comments100

Agile Lite: специально против выгорания

Reading time7 min
Views20K
Гибкая методология разработки — отличная идея, которую слишком усложнили. Agile Lite — попытка упростить ситуацию. Вам не нужны книги или семинары, чтобы объяснить Agile Lite. Нужен только небольшой текст с несколькими пунктами. Вот этот текст.

Agile Lite довольно прост. Его можно применить к любому проекту при условии, что работа разбивается на более мелкие задачи (issue). Как и другие гибкие методологии, он использует короткие циклы разработки  — спринты. Но в отличие от них, Agile Lite явно признает распространённость выгорания в индустрии разработки программного обеспечения и пытается смягчить его напрямую путём внедрения цикла «три недели разработки/одна неделя отдыха.
Читать дальше →
Total votes 29: ↑26 and ↓3+23
Comments13

Встречаем сервис от Cloudflare на адресах 1.1.1.1 и 1.0.0.1, или «полку публичных DNS прибыло!»

Reading time7 min
Views248K

1.1.1.1


Компания Cloudflare представила публичные ДНС на адресах:


  • 1.1.1.1
  • 1.0.0.1
  • 2606:4700:4700::1111
  • 2606:4700:4700::1001

Утверждается, что используется политика "Privacy first", так что пользователи могут быть спокойны за содержание своих запросов.


Сервис интересен тем, что кроме обычного DNS предоставляет возможность использовать технологий DNS-over-TLS и DNS-over-HTTPS, что здорово помешает провайдерам по пути запросов подслушивать ваши запросы — и собирать статистику, следить, управлять рекламой. Cloudflare утверждает, что дата анонса (1 апреля 2018, или 04/01 в американской нотации) была выбрана не случайно: в какой еще день года представить "четыре единицы"?

подробнее
Total votes 39: ↑39 and ↓0+39
Comments130

Так ли плох XMPP, как его малюют? Каким Jabber стал сегодня

Reading time6 min
Views86K


Часто при обсуждении мессенджеров, при упоминании XMPP можно услышать слова:
Привет из двухтысячных! Неужели кто-то еще пользуется устаревшим протоколом? В XMPP до сих пор нет доставки файлов, сообщений, синхронизации, красивых клиентов?

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

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

Предыстория


В двухтысячных годах у большинства интернет-гигантов были развернуты XMPP сервера. С одного сервера можно было написать на другой и вот уже казалось, если технологию немного доделать появится e-mail 2.0, универсальный мессенджер для всего Интернета, но тут что-то пошло не так.
Читать дальше →
Total votes 43: ↑40 and ↓3+37
Comments193

Установка легковесного Jabber сервера Prosody (v0.9 и v0.10beta)

Reading time6 min
Views35K
Это статья о том как настроить jabber сервер Prosody для домашнего, возможно корпоративного, использования. У меня встала задача поднять личный jabber сервер на своем домене, с сохранением истории (возможно синхронизации с клиентом XEP-0136), с поддержкой общения с другими серверами jabber, конференций. В общем всё стандартно и ничего особенного, но при поднятии сервера я столкнулся с двумя проблемами о которых я и планирую сегодня рассказать.

Prosody это легковесный jabber сервер, написаный на языке lua, поддерживающий множество ХЕР(XMPP Extension Protocol) стандартов, все поддерживаемы стандарты вы можете посмотреть на этой странице. На вопрос «почему lua» создатель prosody Matthew Wild говорит что это очень простой язык который имеет быстрый интерпретатор, что и является причиной такого необычного выбора.

В этой статье я буду устанавливать prosody на Debian 7.
Читать дальше →
Total votes 14: ↑10 and ↓4+6
Comments15

Information

Rating
Does not participate
Location
Егорьевск, Москва и Московская обл., Россия
Date of birth
Registered
Activity