20 самых популярных ответов программистов на вопрос, почему их программа не работает

  • 20. Хм, странно…
  • 19. Такого еще никогда не случалось.
  • 18. Как могло так получиться?
  • 17. Все работало вчера.
  • 16. Должно быть, проблема с железом.
  • 15. Что вы сделали, чтобы программа упала?
  • 14. Должно быть, что-то не так с данными, которые вы ввели
  • 13. Я не изменял этот модуль уже несколько недель!
  • 12. Похоже, что у вас неправильная версия программы.
  • 11. Просто неудачное стечение обстоятельств.
  • 10. Я не могу протестировать все.
  • 9. Это не может быть источником такой ошибки.
  • 8. Программа работает, просто она не была протестирована.
  • 7. Похоже, что кто-то изменил мой код.
  • 6. Вы проверили свою систему на вирусы?
  • 5. Хоть программа и не работает, как она вообще?
  • 4. На вашей системе нельзя пользоваться этой версией программы.
  • 3. Почему вы думаете, что это должно работать именно так? (это не баг, это фича)
  • 2. Где вы были, когда программа обрушилась?

И победитель:
1. Программа работает… на моем компьютере.

via thenetworkadministrator.com

Почему MatLab fft выдает разные результаты для строк и столбцов

Небольшое недоумение возникает при попытке сравнения результатов быстрого преобразования Фурье (функция fft) от вещественных столбцов и строк — полученные векторы комплексно-сопряженные. Это связано с тем, что операция транспонирования в Matlab для матриц с комплексными числами не просто транспонирует, а конвертирует все значения в комплексно-сопряженные. Поэтому, чтобы БПФ работало «ожидаемо», нужно пользоваться оператором поэлементного транспонирования .’

isequal(fft(x').',fft(x)) % Возвращает истину

Ошибка "Access to modified closure"

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

 IEnumerable<char> query = "Not what you might expect";

 foreach (char vowel in "aeiou")
    query = query.Where(c => c != vowel);

    Console.WriteLine("Error:");
    foreach (char c in query)
    Console.Write(c); // Not what yo might expect

Казалось бы, все хорошо (если, конечно, не установлен Visual Assist или Resharper, тогда мы увидим предупреждение «Access to modified closure»), однако, после выполнения программы мы получим строчку «Not what yo might expect», удалилась только последняя буква. Чтобы понять, что произошло, нужно вспомнить, во что преобразуется цикл foreach, а преобразуется он в следующее:


IEnumerable<char> vowels = "aeiou";
using (IEnumerator<char> rator = vowels.GetEnumerator())
{
  char vowel;
  while (rator.MoveNext())
  {
    vowel = rator.Current;
    query = query.Where (c => c != vowel);
  }
}

На каждом шаге цикла мы добавляем в качестве условия проверку на неравенство переменной vowel. «Ленивый» оператор where захватывает одну и ту же переменную, поэтому при обращении к последовательности IEnumerable проверка и будет проходить на неравенство только одной переменной, получившей последнее значение. Для того, чтобы получить ожидаемый результат, необходимо добавить внутри цикла локальную переменную — тогда каждый раз будет захватываться новая переменная с новым значением.


foreach (char vowel in "aeiou")
{
  char cur = vowel;
  query = query.Where(c => c != cur);
}

Запись (захват) звука с интернет-радиостанций

Иногда бывает нужно сделать следующее: записать звук, например, проигрываемый интернет-радиостанцией или просто каким-то приложением. Проще всего может оказаться банально записывать то, что выдается на аудио-выход компьютера. Программа freecorder, выполненная в виде расширения к Firefox одним нажатием кнопки позволяет запустить запись того, что воспроизводится в данный момент. Кроме того, программа обладает одной очень удобной функцией — начало записи будет активироваться автоматически только при наличии сигнала, то есть, если на выходе тишина, то лишншие пустые mp3-файлы на диск записываться не будут.

Виртуальный MIDI-кабель

Виртуальный MIDI — кабель может быть полезен, если нужно без лишних затей управлять каким-либо приложением, поддерживающим MIDI-триггеры для выполнения внутренних команд. Представим себе, что у нас есть входной порт MIDI-in, в который можно неким программным образом посылать сигналы. Тогда легко сделать, например, пульт управления через Bluetooth записью звука, скажем в Adobe Audition. Уровень экзотичности вариантов использования зависит только от фантазии разработчика и насущных потребностей.

Небольшое исследование показало, что для Windows 7, пожалуй единственным вариантом является ipMIDI , и бесплатная версия LoopBe1, которой для вышеуказанных целей вполне достаточно — ограничение бесплатной версии в том, что создается только один виртуальный MIDI-порт.

После установки программы в системе появляется один выходной порт MIDI LoopBe Internal и соответствующий ему входной. Используя .NET библиотеку NAudio можно подавать сигналы на выходной порт LoopBe, которые в свою очередь будут переданы на виртуальный порт MIDI-in. Для Adobe Audition MIDI триггеры настраиваются с помощью команды Edit-Keyboard shortcuts and MIDI triggers. На скриншоте ниже показана привязка ноты D3 к действию остановки/продолжения воспроизведения звука.