Все потоки
Поиск
Написать публикацию
Обновить
1105.49

Программирование *

Искусство создания компьютерных программ

Сначала показывать
Порог рейтинга
Уровень сложности

Можно ли прибраться на компе раз и навсегда?

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

Я, конечно, пытался использовать какие-то методы сортировки помимо файловой системы — т.к. часто хочется упорядочить файлы не по одному критерию, а по нескольким равнозначным, что невозможно сделать в древовидной иерархии — требуется сетевая структура. Но все мои усилия разбивались об интерфейс. Судите сами.
Читать дальше →

Кто я: профессионал или недоучка? Исповедь программиста-непрограммиста

Время на прочтение9 мин
Количество просмотров18K
Мне вот интересно много ли таких людей как я. Тех, кто за свою бытность в IT-сфере написал множество сайтов, пару-тройку веб-сервисов, несколько интернет-магазинов и, не смотря на все это, понимает, что не является профессиональным программистом, а лишь программистом «так себе». Никто не узнал себя в этом описании? Вот, например, я – такой! Это обо мне!
Читать дальше →

Непрерывная интеграция с помощью Jabber. Изобретаем велосипед?

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

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

В нашей компании родилась идея — поддержать мировую тенденцию децентрализации и разделить CI-сервер на несколько машин, связав их между собой универсальным протоколом, доступным и машине, и человеку. Похоже на изобретение велосипеда? Вовсе нет.
Читать дальше →

Qt/Objective-C++11 или сборка Qt-проекта с помощью GCC-4.7 и Clang

Время на прочтение6 мин
Количество просмотров12K
Всем доброго хабрадня!

Сегодня я расскажу уважаемым хабражителям об очередном извращении — о сборке проекта, написанного на Qt, под Mac OS X компилятором GCC-4.7.0 с примесью Clang'а (про шланг — в конце статьи, там станет понятно, зачем ещё и его приплетать будем).

Для чего нам GCC 4.7? Ну, например, чтобы использовать все те крутые фичи из стандарта C++11. Разве этого мало? Кроме поддержки нового стандарта, в нём очень много улучшений по сравнению с идущим в комплекте с Xcode GCC 4.2 (хотя он и оказывается на поверку i686-apple-darwin11-llvm-g++-4.2), так что смысл в переходе на 4.7 явно имеется. Но и проблемы присутствуют, о чём ниже.

Мы можем предположить, что нам потребуются некие фичи из Cocoa, а значит, нам потребуется компилятор Objcetive-C, а ещё лучше — Objective-C++, чтобы, например, интегрировать наше Qt-приложение в окружение Mac OS X.
Начнем!

Как правильно писать статьи о программировании для начинающих

Время на прочтение5 мин
Количество просмотров11K
В последнее время на Хабре стало появляться довольно много статей о тех или иных аспектах программирования, которые позиционируются как статьи для «начинающих». Между тем, как раз для начинающих эти статьи часто являются непонятными: иногда — слишком сложными, иногда — не отвечающими на те вопросы, на которые должны, иногда — тяжелыми для восприятия.

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

Javascript: ООП, прототипы, замыкания, «класс» Timer.js

Время на прочтение19 мин
Количество просмотров97K
Здравствуйте программисты начинающие, законченные, а также все сочувствующие. Как известно, ничто не познается так хорошо, как на собственном опыте. Главное, чтобы опыт был полезный. И в продолжении этой простой мысли я хочу предложить заняться несколькими полезными делами сразу:
  • Побеседовать на тему «ООП с человеческим лицом».
  • Разобраться с прототипами в javascript, коротко и сердито!
  • Вспомнить, что «замыкание» это не только ценный мех… удар током.
  • Написать на javascript класс Timer — этакий планировщик событий для запуска анимаций, событий, любых функций.
  • Весело провести время!

Предупреждение! Если вы не ждете от статьи ничего веселого… то ошибаетесь. Людям с пониженным чувством юмора читать… еще более рекомендуется! Ну-с, приступим…
Читать дальше →

QScintilla: подсвечиваем синтаксис в приложении

Время на прочтение3 мин
Количество просмотров12K
Привет, $username!

UPD: вторая и третья часть цикла о QScintilla.

Сегодня я хочу рассказать вам про отличный проект — QScintilla, который подсвечивает синтаксис кода в Qt-приложениях. Нередко возникает необходимось что-то подсвечивать. Например: C++, Bash, PHP, Diff… Этот список можно продолжать и продолжать. Но вот решение: порт Scintilla на Qt: QScintilla.

В этом посте я расскажу как установить и пользоваться QScintilla в своих приложениях на примере Ubuntu Linux.
Читать дальше →

Три ключевых принципа ПО, которые вы должны понимать

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

Разрабатывая приложения, мы постоянно сталкиваемся с новыми подходами, языками и концептами. И постоянно мы мечемся в сомнениях «смогу ли я быть на волне, оставаться конкурентоспособным, учитывая все изменения и тренды?». Давайте задумаемся на мгновение, вспомнив фразу из моего любимого фильма «Касабланка» — в любви законов новых нет — так создан свет.

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

Цитаты о языках программирования

Время на прочтение3 мин
Количество просмотров41K
Что учёные, писатели и программисты думают о популярных языках программирования.

Все языки


«Есть два подхода к программированию. Первый — сделать программу настолько простой, чтобы в ней очевидно не было ошибок. А второй — сделать её настолько сложной, чтобы в ней не было очевидных ошибок.»
Tony Hoare. Профессор, занимался реализацией Алгол 60, сейчас исследователь в Microsoft Research.


Algol 60 (позже повлиявший на C)


«Я не мог устоять перед искушением добавить в язык нулевой указатель (null), просто потому, что его так легко было реализовать. Это привело к бессчётному множеству ошибок, уязвимостей и сбоев, которые нанесли ущерб, наверное, в миллиард долларов за последние сорок лет.»
Tony Hoare.
Читать дальше →

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

Время на прочтение12 мин
Количество просмотров61K
Продолжая тему распознавания голоса, хочу поделится своей старой дипломной работой, на которую одно время возлагал надежды по доведению до коммерческого продукта, но потом оставил этот проект, выложив его в сеть на радость другим студентам. Хотя возможно эта тема будет интересна не только в академическом ключе, а и для общего развития.

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

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

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

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

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

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

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

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

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

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


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

где 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 пользователями. Каждый голос сначала сравнивался с эталонным, то есть голосом разработчика, а потом между собой, для того что бы выяснить как поведет себя система на однотипных голосах.
Читать дальше →

Программирование для всех: новый стандарт грамотности

Время на прочтение2 мин
Количество просмотров12K
Любой человек должен уметь читать и писать — когда-то данный тезис был предметом дискуссий, говорили, что это навыки для «высшей касты», но с 16-19 века все согласились, что грамотность действительно необходима каждому человеку.

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

Даже 70-летний мэр Нью-Йорка, миллиардер Майкл Блумберг, недавно записался на курсы Javascript.
Читать дальше →

Реализация разделяемой памяти между драйвером и приложением

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

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

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

Ближайшие события

Возьми Python с собой

Время на прочтение5 мин
Количество просмотров37K
Думали ли вы (в очередной раз подготавливая среду для Python) о том, как было бы здорово, если бы не приходилось настраивать с нуля рабочее окружение (да ещё и под разными операционными системами), а можно было бы сесть и просто начать писать? Я случайно открыл для себя pythonanywhere.com — сервис, позволяющий вести разработку на Python онлайн, прямо в браузере. Под катом — описание сервиса с картинками и видео.
Читать дальше →

Как и зачем мерить FLOPSы

Время на прочтение8 мин
Количество просмотров140K
image Как известно, FLOPS – это единица измерения вычислительной мощности компьютеров в (попугаях) операциях с плавающей точкой, которой часто пользуются, чтобы померить у кого больше. Особенно важно померяться FLOPS’ами в мире Top500 суперкомпьютеров, чтобы выяснить, кто же среди них самый-самый. Однако, предмет измерения должен иметь хоть какое-нибудь применение на практике, иначе какой смысл его замерять и сравнивать. Поэтому для выяснения возможностей супер- и просто компьютеров существуют чуть более приближенные к реальным вычислительным задачам бенчмарки, например, SPEC: SPECint и SPECfp. И, тем не менее, FLOPS активно используется в оценках производительности и публикуется в отчетах. Для его измерения давно уже использовали тест Linpack, а сейчас применяют открытый стандартный бенчмарк из LAPACK. Что эти измерения дают разработчикам высокопроизводительных и научных приложений? Можно ли легко оценить производительность реализации своего алгоритма в FLOPSaх? Будут ли измерения и сравнения корректными? Обо всем этом мы поговорим ниже.
Читать дальше →

Выбираем WAMP платформу для разработки сайтов под Windows

Время на прочтение11 мин
Количество просмотров328K
Во времена моей юности в русскоязычном сегменте сети интернет был популярен только один единственный WAMP комплекс. Это, как вы уже догадались, старый добрый Denwer. Он прочно обосновался на моём компьютере еще в далёком 2003 году. Другие альтернативы если и существовали в то время, то были известны в узких кругах и были не столь популярны.

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

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

Test Driven Design — первый опыт внедрения

Время на прочтение5 мин
Количество просмотров9.8K
Многочисленные статьи, посвященные TDD в общем и Unit-тестам в частности, как правило, оперируют довольно искусственными примерами. Например, давайте напишем функцию, которая складывает два числа и напишем для неё тест. Честно говоря, на таких примерах трудно оценить преимущества использования автоматизированных тестов.

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

Погружаемся в глубины C# dynamic

Время на прочтение5 мин
Количество просмотров77K
Одним из наиболее заметных дополнений в C# 4 является dynamic. Об этом рассказано много и не раз. Но всегда выпускается из виду DLR (Dynamic Language Runtime). В данной статье мы рассмотрим внутреннее устройство DLR, работу самого компилятора, а также дадим определение понятиям статически-, динамически- типизированный язык со слабой и сильной типизациями. И, конечно же, не останется без внимания техника PIC (Polymorphic Inline Cache), используемая, например, в Google V8 engine.
Читать дальше →

Entropy — Неточный язык программирования

Время на прочтение2 мин
Количество просмотров4.9K
В комментариях к недавнему посту про неточный процессор, хабраюзер lol2Fast4U привел ссылку на интересный язык программирования — Entropy.

Суть этого языка в том, что в нем отсутствует детерминированность.

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

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

Сами понимаете, что подход к программированию в такой среде должен быть принципиально иным.
Читать дальше →

F# Хвостовая рекурсия. Подводные грабли. Часть 1

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

Винни Пух: Ой, что это случилось с твоим хвостом?
Иа: А что с ним могло случится?
Винни Пух: Его нет.
Иа: Ты не ошибся?
Винни Пух: Хвост или есть или нет совсем! Тут нельзя ошибиться.
Иа: А что же тогда там есть?
Винни Пух: Ничего!


У нас в проекте, в одном из серверных компонентов, после очередного рефакторинга начала течь память. Казалось бы .NET, F#, менеджед код, сборка мусора, все дела, но память, куда-то утекала. Ценой бессонных ночей и попорченных нервов, источник утечки был найден. Оказалось что проблема вызвана куском кода, который был, чуть ли не один к одному скопирован из учебника по F#.

Все дело было в хвостовой рекурсии, вернее, как оказалось в ее отсутствии в неожиданных местах.
Читать дальше →

Вклад авторов