Переменные persistent в Matlab

В Matlab есть одна довольно редко используемая и не очевидная функциональность, заключающаяся в использовании переменных с модификатором persistent. Фактически такие переменные аналогичны статическим переменным в теле метода, например у С++. Одним из наиболее типичных сценариев использования таких переменных является написание функций загрузки большого объема данных либо длительной предварительной обработки. При первом запуске метода, содержащего переменную с модификатором persistent, эта переменная будет пустой. При последующих запусках, если функция не изменялась, значение переменной persistent сохранится. Таким образом можно выполнить длительные вычисления или загрузку данных с диска (десериализация mat-файлов в Matlab работает довольно медленно) только при первом вызове функции.

function DB = LoadDB(DBPath, Reload)
%function DB = LoadDB(DBPath, Reload)
% функция чтения данных по пути DBPath
% Reload — принудительная перезагрузка (по умолчанию — false)

if nargin<2 %если переменная Reload не задана, задаем значение по умолчанию Reload = false; end persistent db; if isempty(db) || Reload %если еще не разу ни запускали чтение или необходимо принудительно повторить загрузку данных % читаем базу в переменную db end Db = db; %копируем в выходную переменную [/sourcecode]

Когда использовать Parallel.ForEach, а когда PLINQ

Мой перевод статьи «When Should I Use Parallel.ForEach? When Should I Use PLINQ?», опубликованный ранее на Хабрахабре.

Введение

Обычно, при оптимизации программы для многоядерных компьютеров первым шагом является выяснение возможности разделения алгоритма на части, выполняющиеся параллельно. Если для решения задачи необходимо параллельно обрабатывать отдельные элементы из большого набора данных, то первыми кандидатами станут новые возможности параллельности в .NET Framework 4: Parallel.ForEach и Parallel LINQ (PLINQ)

Parallel.ForEach

Класс Parallel содержит метод ForEach, представляющий собой многопоточную версию обычного цикла foreach в C#. Подобно обычному foreach, Parallel.ForEach выполняет итерации над перечислимыми данными (enumerable), но с использованием множества потоков. Одна из более часто используемых перегрузок Parallel.ForEach выглядит следующим образом:

public static ParallelLoopResult ForEach<tsource>(
			 IEnumerable</tsource><tsource> source,
			 Action</tsource><tsource> body)

Ienumerable указывает на последовательность, по которой нужно выполнить итерации, а Action body задает делегат, вызываемый для каждого элемента. Полный список перегрузок Parallel.ForEach можно найти здесь.

PLINQ

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

В статье выделяются различия между этими двумя подходами к параллельности. Разбираются сценарии использования, в которых лучше всего использовать Parallel.ForEach вместо PLINQ и наоборот.

Выполнение независимых операций

Читать далее Когда использовать Parallel.ForEach, а когда PLINQ

Восстановление счетчиков производительности Windows 7

По каким-то магическим причинам некоторые части механизма счетчиков производительности могут быть нарушены. Проявлением этого дефекта будет сообщение «Cannot load Counter Name data because an invalid index » was read from the registry.» при попытке чтения счетчиков производительности средствами .NET Framework. Если на форме находится компонент, то исключение сгенерируется прямо в функции InitializeComponent после вызова PostInit на компоненте отображения счетчиков производительности, что можно считать откровенной недоработкой, так как в этом случае скорее нужно было бы просто отображать текст с ошибкой.

Для того, чтобы починить счетчики производительности мне хватило выполнения команды:

 lodctr /R

Если это не помогает, то нужно обновить счетчики производительности .NET, для этого вызвать команду (Путь указан для 64-битной версии .NET 4, придется указать путь, актуальный в конкретной операционной системе.

 lodctr " c:WindowsMicrosoft.NETFramework64v4.0.30319corperfmonsymbols.ini"

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

Cсылки по теме:

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

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

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

via thenetworkadministrator.com

Ошибка "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);
}

Виртуальный 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 к действию остановки/продолжения воспроизведения звука.

Google закроет Code Search

Итак, прискорбнейшее известие — вместе с рядом других продуктов Google закрывает поиск по исходному коду Google Code Search. Первая возникающая мысль — Nooooooooooooooo! Прощай, палочка-выручалочка для любого программиста.

Что же использовать в качестве альтернативы? *Там-та-дам, трейлерная музыка на заднем плане и загробным голосом — 15 января 2012 года, мир изменится, он никогда уже не будет таким простым. Но можно попробовать воспользоваться другими подобными инструментами.

  • Koders.com — незамедлительно радует нас на главной странице новостью о закрытии Google Code Search, рекламируя себя главную альтернативой Гуглу. Экспресс сравнение: сделаем запрос по аббревиатуре MFCC — слово не самое встречаемое, поэтому это должно показать глубину поиска по всем проектам интернета, а не добавленным вручную. Koders.com выдает в результатах 798 совпадений 26 классов и 23 метода, у Google файлов с совпадением более 3000 (!), правда в реальности можно пролистать страницы только с двумя сотнями файлов, что является, видно, реальной цифрой. Результат вполне ожидаем, но неутешителен.
  • Сodase — в настоящий момент поиск почему-то не работает, протестировать не удалось.
  • Krugle Такое ощущение, что поисковик по исходному превратился в демо-версию коммерческого продукта Krugle. Сейчас область поиск стала ограничена несколькими десятками проектов под лицензией Apache.

Какие можно сделать выводы? Похоже, что придется пользоваться проектом Koders.com и не забывать про такие ресурсы как Codeproject, SourceForge, GitHub.

Ссылки по теме:

Скачивание музыки из Вконтакте по альбомам — VKontakte Music Backuper

Vkontakte Music Backuper

Те, кому интересно конечное приложение для скачивания музыки из Вконтакте по альбомам, могут скачать его по ссылке. Для запуска требуется .Net Framework 3.5 — можно скачать с сайта Microsoft.com. Пользоваться очень просто — ввести электронную почту, пароль, авторизоваться. Если нужно, изменить ID пользователя для которого показан список аудио. Далее поставить галочки на альбомах, которые нужно скачать и нажать кнопку «скачать альбомы». Можно качать отдельные композиции. С теми же, кого интересуют буквы и реализация, продолжаем. Пользователи Linux и Mac Os могут воспользоваться приложением с помощью проекта Mono, в Ubuntu мне было достаточно выполнить полную установку Mono командой sudo apt-get install mono-complete. Далее можно запускать программу из консоли командой mono VkontakteMusicBackuper.exe либо обычным двойным кликом. Кроме того,можно воспользоваться сервисом Muzico.biz, чтобы слушать и скачивать и записи прямо с сайта.

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

Конечно же, ссылки на mp3-файлы доступны в исходном коде страницы. Кроме того, есть расширения в виде букмарклетов, такие как savefrom.net, которые отображают ссылку на скачивание прямо при воспроизведении музыки или видео. Существует очень удобное приложение для поиска и скачивания музыки из вконтакте под названием VKMusic. Хоть там и заявлена поддержка альбомов, те альбомы, что создает сам пользователь скачать нельзя.

Поэтому пишем свой велосипед. Знания о том на C# сделать скачивание файлов по http, парсить html  рано или поздно пригодятся. Правильнее было бы использовать Вконтакте API, но там все равно тоже нет возможности получения альбомов.

1. Авторизация

При авторизации пользователя в ответе возвращается ID пользователя, а так же remixsid — ключ, хранящийся в cookies браузера и передаваемый при последующих запросах к сайту. Повторяем авторизацию Вконтакте:

 public class VKUserInfo
  {
    public String SID { get; set; }
    public int UserID { get; set; }
  }

  public static class VKUtils
  {
    /// <summary> Авторизация к Vkontakte.ru с получением id и SID пользователя </summary>
    public static VKUserInfo LoginToVkontakte(String email, String password)
    {
      //создаем запрос
      HttpWebRequest wrGETURL = (HttpWebRequest)WebRequest.Create("http://vkontakte.ru/login.php?m=1&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;email=" + email + ";pass=" + password);

      //Запрещаем редирект
      wrGETURL.AllowAutoRedirect = false;
      //Выставляем таймаут
      wrGETURL.Timeout = 100000;

      //получаем весь ответ
      HttpWebResponse myHttpWebResponse = (HttpWebResponse)wrGETURL.GetResponse();

      //получаем Headers,пришедшие в ответе
      string headers = myHttpWebResponse.Headers.ToString();

      //записываем ответ в поток
      StreamReader myStreamReadermy = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));
      //получаем строку с ответом
      string page = myStreamReadermy.ReadToEnd();

      //это регулярное выражение,которое выдирает из переменной headers(а ее мы получили выше) значение sid
      Regex sidregex = new Regex("sid=([a-z0-9]+); exp");
      Match ssid = sidregex.Match(headers);
      String sid = ssid.Groups[1].Value;

      //Получение ID пользователя
      int id = 0;
      String location = myHttpWebResponse.Headers["Location"];
      if ( (location != null ) &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; (location.Length>3))
      {
        location = location.Substring(3);
        Int32.TryParse(location, out id);
      }

      VKUserInfo info = new VKUserInfo(){ SID =  sid, UserID  = id};
      return info;
    }
}

2.Получение списка аудио-записей

Читать далее Скачивание музыки из Вконтакте по альбомам — VKontakte Music Backuper

Библиотека транслитерации для .Net

Одно из возможных решений для транслитерации в приложении на C# — это  библиотека Unidecode. Единственным недостатком является большой размер библиотеки (660Кб) из-за того, что библиотека позволяет транслитерировать весь юникод(почти весь).

Использовать библиотеку очень просто:

using BinaryAnalysis.UnidecodeSharp;
String translit = "Русский текст".Unidecode();

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

 

 

The invocation of the constructor on type ProjectName.MainWindow1 that matches the specified binding constraints threw an exception

Within Visual Studio 2010 if you get the error «The invocation of the constructor on type <> that matches the specified binding constraints threw an exception» . You may try the following steps to get more information. First you should know, that the error means there was a runtime error parsing the xaml code. To get the real exception you should activatte the catch of all thrown in exceptions in Visual Studio. Open Debug > Exceptions and activate the checkbox in the «thrown» column for «Common Language Runtime Exceptions». Done so, Visual Studio will halt on all exceptions.

(In my case it was because there were no required resources)