Search
Write a publication
Pull to refresh
20
0
Send message

Самообразование: позвольте пригласить вас в путешествие!

Reading time6 min
Views23K
Привет, хабр.

Некоторое время назад я загорелась желанием изучать веб-дизайн и какой-нибудь язык программирования. И, конечно же, у меня возник закономерный вопрос «с чего начать». Более того, положение дел усугублялось тем, что никакого опыта ни в веб-дизайне, ни в программировании у меня не было вообще.
Что же делать? Как учиться самой? Куда двигаться, и за что хвататься?

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

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

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

Ограничение количества запросов — Raterlimiter

Reading time5 min
Views11K
Если вы опасаетесь, что ваш веб-сервис могут заDOSить нерадивые пользователи, или у вас просто слабенький сервер, то вы уже задумывались над ограничением количества запросов от каждого пользователя. По-хорошему — это только один из необходимых эшелонов обороны. Конечно, от серьёзной атаки такое ограничение не убережёт, но с точки зрения цена/качество вполне подходящее

Недавно я начал активно заниматься Эрлангом. Ну и, как обычно, для закрепления материала реализовал несложный веб-сервис на Mochiweb. Mochiweb — вполне достойный фреймворк для создания веб-приложений, но возможности лимитировать количество запросов от одного клиента я не нашёл. Вот и сделал это самостоятельно.

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

Задача

Итак, имеем Erlang/OTP, Mochiweb, rebar. Хочется считать количество запросов от конкретного пользователя и отдавать ему 413 код ошибки, если запросы идут слишком часто. Клиент идентифицируется своим IP адресом. Тем самым, который отдает mochiweb_request:get(peer).

Задача не такая сложная, но, возможно, готовое решение сэкономит кому-то время.
Читать дальше →

Вещи, о которых следует помнить, программируя на Python

Reading time5 min
Views64K

Дзэн Питона



Изучение культуры, которая окружает язык, приближает вас на шаг к лучшим программистам. Если вы всё еще не прочли «Zen of Python», то откройте интерпретатор Python и введите import this. Для каждого элемента в списке вы найдете пример здесь

Однажды моё внимание привлекло:
Читать дальше →

Риалтайм дашборд

Reading time7 min
Views5.7K

Однажды, сидя поздним вечером на работе, захотелось сделать простенький шустренький дашборд, который бы отрисовывал графики ошибок или других варнингов из логов Apache или Ngnix. Термин Realtime слегка льстит, в действительности мы видим обновление на графике каждые 3 секунды. Такого плана дашборд, очень полезен особенно когда идет выкатка новой версии в бой, сидишь и смотришь как она тихонечко расползается по серверам, изменяя направления кривых на графике.
Читать дальше →

Идентификация пользователя по голосу

Reading time12 min
Views61K
Продолжая тему распознавания голоса, хочу поделится своей старой дипломной работой, на которую одно время возлагал надежды по доведению до коммерческого продукта, но потом оставил этот проект, выложив его в сеть на радость другим студентам. Хотя возможно эта тема будет интересна не только в академическом ключе, а и для общего развития.

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

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

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

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

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

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

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

Практическая работа используемого алгоритма

Процесс сравнивания образцов состоит из следующих стадий:
— фильтрация шумов;
— спектральное преобразование сигнала;
— постфильтрация спектра;
— лифтеринг;
— наложение окна Кайзера;
— сравнение.

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


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

где Xi – набор дискретных значений звукового сигнала.
После обработки в сигнале ищется начало и конец записи, а так как шумы уже отфильтрованы, то начало фрагмента будет характеризоваться всплеском сигнала, если искать с Х0. Соответственно если искать с Хn вниз, то всплеск будет характеризовать конец фрагмента. Таким образом получим начала и конца фрагмента в массиве дискретных значений сигнала. В нематематическом виде это означает, что мы нашли слово сказанное пользователем в микрофон, которое нужно усреднить с другими характеристиками голоса.
Помимо высоты тона человек ощущает и другую характеристику звука — громкость. Физические величины, наиболее точно соответствующие громкости, — это шоковое давление (для звуков в воздухе) и амплитуда (для цифрового или электронного представления звука).

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

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

Так как моментальная мощность зависит от квадрата моментальной амплитуды, имеет смысл аналогичным образом подобрать похожее соотношение, связывающее среднюю амплитуду и среднюю мощность. Способ, которым это можно сделать, заключается в определении средней амплитуды (СКЗ). Вместо того, чтобы вычислять среднее значение непосредственно амплитуды, мы сначала возводим в квадрат полученные значения, вычисляем среднее значение получившегося множества, а затем извлекаем из него корень. Метод СКЗ применяется в том случае, когда необходимо вычислить среднее для быстро меняющейся величины. Алгебраически это выражается следующим ооразом: пусть у нас N значений и х(i) это амплитуда i-ого дискретного значения. Тогда СКЗ амплитуды =

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

Относительная мощность измеряется в белах, а чаще в децибелах (дБ, децибел, это одна десятая бела). Чтобы сравнить два звука, берется отношение их мощности. Десятичный логарифм этого отношения и есть различие в белах; если множить получившееся число на десять, то получится значение в децибелах. Например, если мощность одного сигнала превосходит мощность другого в два раза, то первый сигнал будет громче на 10lоg10(2) = 3,01 дБ.

Спектральное преобразование сигнала

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

Фазовые изменения часто происходят по причине временных задержек. Например, каждый цикл сигнала в 1000 Гц занимает 1/1000 секунды. Если задержать сигнал на 1/2000 секунды (полупериод), то получится 180-градусный сдвиг но фазе. Заметим, что этот эффект опирается на зависимость между частотой и временной задержкой. Если сигнал в 250 Гц задержать на те же самые 1/2000 секунды, то будет реализован 45-градусный сдвиг по фазе.

Если сложить вместе две синусоидальные волны одинаковой частоты, то получится новая синусоидальная волна той же частоты. Это будет верно даже в том случае, если два исходных сигнала имеют разные амплитуды и фазы. Например, Asin(2 Pi ft) и Bcos(2 Pi ft) две синусоиды с разными амплитудами и фазами, но I c одинаковой частотой.

Для измерения амплитуды одной частоты нужно умножить имеющийся сигнал на синусоиду той же частоты и сложить полученные отсчеты.
Чтобы записать это в символьном виде, предположим, что отсчеты имеют значения s0, s1, …, st, …. Переменная t представляет собой номер отсчета (который заменяет значение времени). Измеряется амплитуду частоты f в первом приближении, при вычислении следующей суммы:

Значения t и f не соответствуют в точности времени и частоте. Более того, f – целое число, а реальная исследуемая частота – это частота дискретизации, умноженная на f/N. Подобным образом, t — это целочисленный номер отсчета. Кроме того, суммирование дает не непосредственное значение амплитуды, а всего лишь число, пропорциональное амплитуде.

Если повторить эти вычисления для различных значений f, то можно измерить амплитуду всех частот в сигнале. Для любого целого f меньшего N легко определяется значение Аf, представляющее амплитуду соответствующей частоты как долю от общего сигнала. Эти значения могут быть вычислены по той же формуле:


Если мы знаем значения Af мы можем восстановить отсчеты. Для восстановления сигнала необходимо сложить все значения для разных частот. Чтобы осуществлять точное обратное преобразование Фурье, помимо амплитуды и частоты необходимо измерять фазу каждой частоты.

Для этого нужны комплексные числа. Можно изменить описанный ранее метод вычислений так, что он будет давать двумерный результат. Простое коми1 лексное число – это двумерное значение, поэтому оно одновременно но представляет и амплитуду, и фазу.
При таком подходе фазовая часть вычисляется неявно. Вместо амплитуды и фазы измеряется две амплитуды, соответствующие разным фазам. Одна из этих фаз представляется косинусом (соs()), другая синусом sin()).
Используя комплексные числа, можно проводить измерения одновременно, умножая синусную часть на -i.

Каждое значение Af теперь представляется комплексным числом; действительная и мнимая части задают амплитуду двух синусоидальных волн с разным фазами.

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


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

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

Для сравнения двух фрагментов использовался следующий подход:
Предположим что X[1..N] и Y[1..N] массивы чисел, одинакового размера N, содержащие значения спектральной мощности первого и второго фрагментов соответственно. Тогда мера сходства между ними вычисляется по следующей формуле:

где Mx и My математические ожидания для массивов X[] и Y[] соответственно, вычисляющиеся по следующей формуле:

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

Нейросетевое сравнение на основе простых персептронов

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

где n – число входов нейрона, xi – значение i-го входа нейрона, wi – вес i-го синапса
Затем определяется значение аксона нейрона по формуле: Y = f(S) где f – некоторая функция, которая называется активационной. Наиболее часто в качестве активационной функции используется так называемый сигмоид, который имеет следующий вид:

Основное достоинство этой функции в том, что она дифференцируема на всей оси абсцисс и имеет очень простую производную:

При уменьшении параметра α сигмоид становится более пологим, вырождаясь в горизонтальную линию на уровне 0,5 при α=0. При увеличении a сигмоид все больше приближается к функции единичного скачка.

Обучение сети
Для автоматического функционирования системы был выбран метод обучения сети без учителя. Обучение без учителя является намного более правдоподобной моделью обучения в биологической системе. Развитая Кохоненом и многими другими, она не нуждается в целевом векторе для выходов и, следовательно, не требует сравнения с предопределенными идеальными ответами. Обучающее множество состоит лишь из входных векторов. Обучающий алгоритм подстраивает веса сети так, чтобы получались согласованные выходные векторы, т. е. чтобы предъявление достаточно близких входных векторов давало одинаковые выходы.
Персептрон обучают, подавая множество образов по одному на его вход и подстраивая веса до тех пор, пока для всех образов не будет достигнут требуемый выход. Допустим, что входные образы нанесены на демонстрационные карты. Каждая карта разбита на квадраты и от каждого квадрата на персептрон подается вход. Если в квадрате имеется линия, то от него подается единица, в противном случае ноль. Множество квадратов на карте задает, таким образом, множество нулей и единиц, которое и подается на входы персептрона. Цель состоит в том, чтобы научить персептрон включать индикатор при подаче на него множества входов, задающих нечетное число, и не включать в случае четного.
Для обучения сети образ X подается на вход и вычисляется выход У. Если У правилен, то ничего не меняется. Однако если выход неправилен, то веса, присоединенные к входам, усиливающим ошибочный результат, модифицируются, чтобы уменьшить ошибку.
Информативность различных частей спектра неодинакова: в низкочастотной области содержится больше информации, чем в высокочастотной. Поэтому для предотвращения излишнего расходования входов нейросети необходимо уменьшить число элементов, получающих информацию с высокочастотной области, или, что тоже самое, сжать высокочастотную область спектра в пространстве частот.
Наиболее распространенный метод — логарифмическое сжатие

где f — частота в спектре Гц, m — частота в новом сжатом частотном пространстве

Такое преобразование имеет смысл только если число элементов на входе нейросети NI меньше числа элементов спектра NS.
После нормирования и сжатия спектр накладывается на вход нейросети. Вход нейросети — это линейно упорядоченный массив элементов, которым присваиваются уровни соответствующих частот в спектре. Эти элементы не выполняют никаких решающих функций, а только передают сигналы дальше в нейросеть. Выбор числа входов — сложная задача, потому что при малом размере входного вектора возможна потеря важной для распознавания информации, а при большом существенно повышается сложность вычислений ( при моделировании на PC, в реальных нейросетях это неверно, т.к. все элементы работают параллельно ).
При большой разрешающей способности (числе) входов возможно выделение гармонической структуры речи и как следствие определение высоты голоса. При малой разрешающей способности (числе) входов возможно только определение формантной структуры.

Как показало дальнейшее исследование этой проблемы, для распознавания уже достаточно только информации о формантной структуре. Фактически, человек одинаково распознает нормальную голосовую речь и шепот, хотя в последнем отсутствует голосовой источник. Голосовой источник дает дополнительную информацию в виде интонации (высоты тона на протяжении высказывания ), и эта информация очень важна на высших уровнях обработки речи. Но в первом приближении можно ограничиться только получением формантной структуры, и для этого с учетом сжатия неинформативной части спектра достаточное число входов выбрано в пределах 50~100.
Наложение спектра на каждый входной элемент происходит путем усреднения данных из некоторой окрестности, центром которой является проекция положения этого элемента в векторе входов на вектор спектра. Радиус окрестности выбирается таким, чтобы окрестности соседних элементов перекрывались. Этот прием часто используется при растяжении векторов, предотвращая выпадение данных.

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

Создание регулярных выражений из диапазонов мобильных телефонных номеров

Reading time4 min
Views15K
Привет!

Я много работаю с VoIP-сетями. С коммерческим оборудованием, конечно тоже, но и очень много с OpenSource (статья пишется в контексте использования Asterisk PBX).

В телефонии часто возникает простая задача, разделить маршруты на определённые направления. Ну например, направить вызовы на городские номера в сторону оператора 1, МГ — в сторону оператора 2, МН — в сторону оператора 3.
Задача, в общем-то тривиальная, и реализуется на Asterisk легко:

;Местная городская связь: 7 знаков (в разных регионах РФ от 3-х до 7-ми знаков), и номера экстренных служб.
exten => _0X,1,dial(SIP/itsp1/${EXTEN})
exten => _0XX,1,dial(SIP/itsp1/${EXTEN})
exten => _XXXXXXX,1,dial(SIP/itsp1/${EXTEN})
;Междугородняя и мобильная связь: код выхода на МГ связь (в РФ - "8") + 10 знаков.
exten => _8[348]XXXXXXXXX,1,dial(SIP/itsp2/${EXTEN})
exten => _89XXXXXXXXX,1,dial(SIP/itsp2/${EXTEN})
;Международная связь: код выхода на МН связь (в РФ - "810") + номер телефона в международном формате.
exten => _810X.,1,dial(SIP/itsp3/${EXTEN})


Однако иногда возникает необходимость предоставить абоненту доступ только к мобильным телефонам его области, и здесь простым "_89XXXXXXXXX" не отделаешься.
Читать дальше →

Локализация точки в выпуклом многоугольнике

Reading time4 min
Views47K
Листая страницы хаба «Алгоритмы», наткнулся на топик, посвященный решению задачи локализации точки в многоугольнике: задан многоугольник (замкнутая ломаная линия без самопересечений), требуется определить — находится ли заданная точка A внутри этого многоугольника или нет. В одном из последних комментариев к топику было высказано недоумение, какое отношение такая чисто математическая задача имеет к теории алгоритмов. Имеет-имеет, причем самое непосредственное. Задача локализации является классической задачей вычислительной геометрии (не путать с компьютерной графикой). В качестве разминки предлагается взглянуть на картинку справа, на которой изображен многоугольник типа кривой Пеано (источник [1]), и попытаться ответить на вопрос — красная точка ты видишь суслика? и я не вижу, а он есть! находится внутри или снаружи многоугольника? А ниже мы (исключительно в образовательных целях) рассмотрим простую вариацию данной задачи, когда заданный многоугольник является выпуклым.
Читать дальше →

Консоль для маководов: Beyond the GUI

Reading time6 min
Views221K
Доброго дня, уважаемые хабравчане-маководы!

Сегодня я расскажу как увеличить эффективность работы в Mac OS X за счёт использования консоли.

Лирическое отступление


Думаю, ни для кого не секрет, что Mac OS является Unix-based системой, но переработанной почти до неузнаваемости. Даже консоль засунули куда подальше — не сразу и найдёшь. И вся система нацелена на использование GUI, при дефолтных настройках даже переключение между кнопками по Tab не работает — без мыши никуда. И тем не менее, Мак — это не только окошки, не только док и лаунчер. Мак это ещё и вся мощь shell скриптов и консоли!

Если Вы пришли из мира M$, то для начала неплохо бы поучить общие команды shell'а, например, по вот этому учебному пособию. Как минимум, нужно усвоить команды перехода по каталогам и способы запуска программ и скриптов.

Если Вы пришли в мир Mac OS из мира Linux'а и FreeBSD, то, скорее всего, знаете как минимум основы shell-скриптинга. Но и для вас в статье может оказаться кое-что интересное, ведь в маке есть уникальные консольные команды, которые так же полезно знать.

Вот о некоторых особенностях маковской консоли далее и пойдёт речь.
Поехали!

Juniper SRX100, знакомство

Reading time5 min
Views72K
На днях мне привезли долгожданный Juniper SRX100.
До этого времени в основном общался с Cisco и серией роутеров, типа 2800, 800.
На сколько я понял, могу ошибаться, данное оборудование ближе к классу аппаратных файрволлов.
Под катом первичная настройка данной железяки и выход в интернет.
Читать дальше →

Пишем модуль безопасности Linux

Reading time5 min
Views17K
Linux Security Modules (LSM) — фреймворк, добавляющий в Linux поддержку различных моделей безопасности. LSM является частью ядра начиная с Linux версии 2.6. На данный момент в официальном ядре «обитают» модули безопасности SELinux, AppArmor, Tomoyo и Smack.

Работают модули параллельно с «родной» моделью безопасности Linux — избирательным управлением доступом (Discretionary Access Control, DAC). Проверки LSM вызываются на действия, разрешенные DAC.

Применять механизм LSM можно по-разному. В большинстве случаев это добавление мандатного управления доступом (как, например, в случае с SELinux). Кроме того, можно придумать собственную модель безопасности, реализовать ее в виде модуля и легко внедрить, используя фреймворк. Рассмотрим для примера реализацию модуля, который будет давать права на действия в системе при наличии особого USB-устройства.

Поглядим на схему и попытаемся разобраться, как работает хук LSM (на примере системного вызова open).


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

x264 или как кодировать видео

Reading time3 min
Views216K
Проблема с кодированием видео и его сжатием его из гигабайтов в мегабайты, по-моему, всегда была актуальной. Если более менее профессиональные операторы, монтажники и т.д. уже не одну кошку съели на этой теме, то например любители и те, кто записывают видео с экрана своего монитора, порой долго чешут затылок, прежде чем добиться каких либо серьезных результатов. В итоге куча потерянного времени, никому не нужные гигабайты исходящего трафика для загрузки домашнего видео на ютуб. Конечно, можно использовать в какой-то степени готовые решения в лице одной программы, и сжать видео буквально тремя кликами, но это не наш подход, когда абсолютно все шаги можно контролировать и влиять на них. Покопавшись в поиске, Хабр так и не выдал ничего похожего. Хотя возможно, что просто плохо поискал.
Читать дальше →

Кластеризация дубликатов в Яндекс.Картинках

Reading time1 min
Views7.4K
Сегодня в клубе Яндекс.Субботник появилось интересное видео о том, как Яндекс обрабатывает изображения для исключения дубликатов. Рассказывает Александр Крайнов: он с 2000 года занимается проектами, связанными с обработкой медиаданных. В Яндексе отвечает за проекты, в которых задействовано компьютерное «зрение».

О докладе
Легко найти дубликаты среди тысяч картинок. Сложнее – среди миллионов. И совсем трудно – среди миллиардов. Чем выше полнота работы алгоритма, тем больше проблем. Но в то же время полнота кластеризации дубликатов – это основа качества поиска изображений.

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

CISCO ACE — балансировка приложений

Reading time13 min
Views20K
Всем привет!

Хочу немного рассказать о семействе оборудования для Центров обработки данных от CISCO – CISCO ACE (Application Control Engine). В этой статье будут затронуты такие вопросы как предназначение устройств, архитектурные особенности, возможности применения, настройка основных функций. Больших тонкостей работы материал не предусматривает, скорее рассчитан на тех, кто думает о внедрении подобных устройств, пытается сделать выбор, хочет понять как такое оборудование поможет оптимизировать сетевую инфраструктуру, повысить доступность и время внедрения сервисов.

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

TCP/IP proxy на Go

Reading time7 min
Views21K
Я снова вернулся к любимой задаче для освоения новых языков. После написания движка для блога на Go, захотелось снова поразмять пальцы, болезный TCP/IP proxy/debugger теперь написан на Go.

Вкратце, TCP/IP proxy — это программа, которая умеет принимать соединения и «пробрасывать» их на указанный адрес. Попутно ведутся логи переданных данных. Это очень удобно при отладке различных самодельных сетевых протоколов.

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

Конечно, все многопоточно. И так как в Go параллельное программирование настолько просто (и безопасно), количество параллельных активностей для каждого соединения даже больше, чем в версии на Эрланге.
Читать дальше →

+1 расширение для Mozilla Firefox

Reading time1 min
Views9.2K
Доброго времени суток!

Несколько дней назад Shaida создал пост под названием +1 расширение для Google Chrome, где каждый мог посоветовать расширение, которое ему когда-либо пригодилось. Пора пользователям огнелиса дать свой ответ. Итак, я начну!
Читать дальше →

Веб-сервисы играют в покер

Reading time7 min
Views12K
imageЗдравствуй, Хабр.

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

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

Изначальная идея проекта принадлежит моему другу (он не с Хабра). Первый раз она прозвучала примерно так:
Я считаю, что нет ничего дурного в том, чтобы боты играли в покер-румах. Хотя, может быть, честнее было бы организовать специальный покерный клуб, где роботы играли бы только друг с другом. Вот я бы с удовольствием написал такого бота. А ты?
Не помню, что я ответил. Мне интереснее было именно сделать такой сервис. Challenge accepted ;)
Читать дальше →

Нейросети для чайников. Начало

Reading time5 min
Views809K


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

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

Заинтересовавшихся прошу под кат.
Читать дальше →

Маршрутизация в Linux: VRF Lite

Reading time6 min
Views59K
Обычно VRF (Virtual Routing and Forwarding, VPN Routing and Forwarding) используется совместно с MPLS, но без оной в терминологии Cisco называется VRF-Lite. Суть этой технологии в том, что маршрутная информация, принадлежащая различным классам (например, маршруты одного клиента) изолируется друг от друга. Считается, что такие возможности есть только у «взрослых» железных решений, но это не совсем так. Благодаря наличию множественных таблиц маршрутизации, гибких политик маршрутизации всё это можно сделать и в Linux. Кому интересно, добро пожаловать под кат.
Читать дальше →

Раскрытие IP-адреса пользователя Skype

Reading time1 min
Views88K


Деанонимизация скайп-пользователя по его skypename через нахождение его реального IP-адреса

1. Качаем отсюда пропатченный скайп версии 5.5:
http://skype-open-source.blogspot.com/2012/03/skype55-deobfuscated-released.html

2. Включаем создание файла с дешифрованным debug логом. Для этого добавляем нескольких ключей в реестр.
https://github.com/skypeopensource/skypeopensource/wiki/skype-3.x-4.x-5.x-enable-logging

3. Выбираем функцию добавить скайп контакт, но не добавляем, а только кликаем на него, чтобы посмотреть vcard. Этого будет достаточно.
Читать дальше →

Рецепты от ПанГурмана

Reading time11 min
Views6.3K
Недавно запустили сервис по бронированию ресторанов ПанГурман. Внутри это более-менее типичный django-сайт. Попробую рассказать, как там что устроено (с картинками). В статье не будет ничего супер-хитрого, но, надеюсь, кому-нибудь пара трюков или идей покажутся полезными и как-то упростят жизнь.
Читать дальше →

Information

Rating
Does not participate
Registered
Activity